18 Commity 732cc27be2 ... 13256819ae

Autor SHA1 Wiadomość Data
  孙旺 13256819ae 调整商户管理 1 rok temu
  孙旺 ba1ffd927a app配置 1 rok temu
  孙旺 fd83a6fb4f 删除小程序更新逻辑 1 rok temu
  孙旺 9b1c6fe059 更新vue版本基座 1 rok temu
  孙旺 4ee228af46 添加logo 1 rok temu
  孙旺 1d3c103fef 修正跳转B端bug 1 rok temu
  孙旺 4fcdf76a5d 修正菜单显示bug 1 rok temu
  孙旺 c659d496ed 删除多余文件 1 rok temu
  孙旺 d720e7644e 修正菜单样式 2 lat temu
  孙旺 fcbea5aee4 跳转商家端 2 lat temu
  孙旺 b4a10a0c7f 联调 2 lat temu
  孙旺 adb513daee 调整登陆接口 2 lat temu
  孙旺 494ae99553 引入svg图标 2 lat temu
  孙旺 e9a9e68c0d 引入菜单逻辑 2 lat temu
  孙旺 ea6b5bb68d 删除 2 lat temu
  孙旺 6cdd984800 传值 2 lat temu
  孙旺 eea2d54bdb vue3版本 2 lat temu
  孙旺 4466702c76 vue3版本初始化 2 lat temu
100 zmienionych plików z 11980 dodań i 28051 usunięć
  1. 19 14
      .gitignore
  2. 20 0
      .hbuilderx/launch.json
  3. 0 79
      App.vue
  4. 0 21
      LICENSE
  5. 0 1
      README.md
  6. 0 118
      api/commodity/goods.js
  7. 0 66
      api/commodity/goodsMode.js
  8. 0 50
      api/commodity/mercGoods.js
  9. 0 57
      api/commodity/point.js
  10. 0 88
      api/commoditylist/commoditylist.js
  11. 0 373
      api/device/device.js
  12. 0 9
      api/dict.js
  13. 0 11
      api/download.js
  14. 0 50
      api/login.js
  15. 0 144
      api/order/order.js
  16. 0 50
      api/order/riskorder.js
  17. 0 9
      api/oss.js
  18. 0 38
      api/point/area.js
  19. 0 56
      api/point/line.js
  20. 0 57
      api/point/point.js
  21. 0 156
      api/replenishment/replenishment.js
  22. 0 49
      api/system/employee.js
  23. 0 22
      api/system/menu.js
  24. 0 50
      api/system/user.js
  25. 0 687
      components/classify/index.vue
  26. 0 108
      components/tki-tree/style.css
  27. 0 50
      components/tki-tree/tki-tree.vue
  28. 0 160
      components/xy-button/index.vue
  29. 0 1369
      components/xy-imgResiz/index.vue
  30. 0 114
      components/xy-popup/index.vue
  31. 0 30
      config.js
  32. 24 0
      index.html
  33. 9 0
      jsconfig.json
  34. 0 36
      main.js
  35. 11839 0
      package-lock.json
  36. 69 1
      package.json
  37. 0 392
      pages.json
  38. 0 221
      pages/activeDevice/bindAliAcc.vue
  39. 0 215
      pages/activeDevice/bindAliDev.vue
  40. 0 171
      pages/activeDevice/bindDevice.vue
  41. 0 377
      pages/activeDevice/deviceManage.vue
  42. 0 972
      pages/commodity/addCom.vue
  43. 0 507
      pages/commodity/allGoodsSearch.vue
  44. 0 223
      pages/commodity/application.vue
  45. 0 273
      pages/commodity/auditList.vue
  46. 0 300
      pages/commodity/comEdit.vue
  47. 0 523
      pages/commodity/comListEdit.vue
  48. 0 359
      pages/commodity/commoditylist.vue
  49. 0 163
      pages/commodity/components/imgUpload/index.vue
  50. 0 100
      pages/commodity/components/imgUploadCut/index.vue
  51. 0 310
      pages/commodity/publicCom.vue
  52. 0 455
      pages/commodity/publicSearch.vue
  53. 0 247
      pages/commodity/search.vue
  54. 0 608
      pages/equipment/addCom.vue
  55. 0 296
      pages/equipment/addComList.vue
  56. 0 456
      pages/equipment/comManage.vue
  57. 0 352
      pages/equipment/components/xy-filtedrop/index.vue
  58. 0 341
      pages/equipment/search.vue
  59. 0 691
      pages/equipment/statistics.vue
  60. 0 349
      pages/equipment/statisticsMore.vue
  61. 0 76
      pages/globalPages/agreement.vue
  62. 0 661
      pages/globalPages/components/account.vue
  63. 0 315
      pages/globalPages/components/commodity.vue
  64. 0 362
      pages/globalPages/components/equipment.vue
  65. 0 654
      pages/globalPages/components/home.vue
  66. 0 187
      pages/globalPages/home.vue
  67. 0 919
      pages/globalPages/moreData.vue
  68. 0 121
      pages/globalPages/notice.vue
  69. 0 92
      pages/globalPages/setting.vue
  70. 0 804
      pages/globalPages/statistics.vue
  71. 0 457
      pages/globalPages/statisticsMore.vue
  72. 0 41
      pages/globalPages/test.vue
  73. 0 291
      pages/login.vue
  74. 0 100
      pages/order/components/xvideo.vue
  75. 0 432
      pages/order/orderDel.vue
  76. 0 705
      pages/order/orderDetails.vue
  77. 0 56
      pages/order/orderLogs.vue
  78. 0 888
      pages/order/orderQuery.vue
  79. 0 854
      pages/order/refundList.vue
  80. 0 1010
      pages/order/riskOrder.vue
  81. 0 432
      pages/order/riskOrderDel.vue
  82. 0 184
      pages/order/userInfo.vue
  83. 0 0
      pages/point/components/Winglau14-lotusAddress/Winglau14-lotusAddress.js
  84. 0 360
      pages/point/components/Winglau14-lotusAddress/Winglau14-lotusAddress.vue
  85. 0 361
      pages/point/lineDetail.vue
  86. 0 407
      pages/point/point.vue
  87. 0 394
      pages/replenish/invSearch.vue
  88. 0 182
      pages/replenish/invSearchDetail.vue
  89. 0 343
      pages/replenish/inventoryQueryExport1.vue
  90. 0 1017
      pages/replenish/replenishmentHomePage.vue
  91. 0 572
      pages/replenish/replenishmentManagement.vue
  92. 0 252
      pages/replenish/replenishmentRecord.vue
  93. 0 155
      pages/replenish/replenishmentRecordDetails.vue
  94. 0 251
      pages/system/addEmployee.vue
  95. 0 427
      pages/system/deviceManage.vue
  96. 0 285
      pages/system/empDetail.vue
  97. 0 282
      pages/system/employee.vue
  98. 0 39
      permission.js
  99. 0 17
      plugins/index.js
  100. 0 42
      plugins/xy.js

+ 19 - 14
.gitignore

@@ -1,16 +1,21 @@
-######################################################################
-# Build Tools
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
 
-/unpackage/*
-/node_modules/*
-
-######################################################################
-# Development Tools
-
-/.idea/*
-/.vscode/*
-/.hbuilderx/*
-
-package-lock.json
-yarn.lock
+node_modules
+.DS_Store
+dist
+*.local
 
+# Editor directories and files
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 20 - 0
.hbuilderx/launch.json

@@ -0,0 +1,20 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"app-plus" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 0 - 79
App.vue

@@ -1,79 +0,0 @@
-<script>
-	import config from './config'
-	import {
-		getToken
-	} from '@/utils/auth'
-
-	export default {
-		onLaunch: function() {
-			this.initApp();
-		},
-		onShow() {},
-		methods: {
-			// 初始化应用
-			initApp() {
-				console.log('初始化应用开始~')
-				// 是否有版本更新
-				this.isUpdate()
-				// 初始化应用配置
-				this.initConfig()
-				// 免登录
-				this.checkLogin()
-			},
-
-			initConfig() {
-				this.globalData.config = config
-			},
-			async checkLogin() {
-				console.log('检测是否登录开始!')
-				if (getToken() && uni.getStorageSync('sysId')) {
-					console.log('已登录!')
-					await this.$store.dispatch('GetPermis')
-					//判断用户是否有任一菜单权限
-					if (this.$store.state.permission.permissions_menu && this.$store.state.permission
-						.permissions_menu != '[]') {
-						// 开发模式下取消免登录,直接跳转调试页面,生产免登录跳转主页
-						if (process.env.NODE_ENV == 'production') {
-							this.$tab.reLaunch('/pages/globalPages/home')
-						}
-					} else {
-						this.$modal.msg('该用户无权限~')
-					}
-				} else {
-					console.log('未登录!')
-				}
-			},
-
-			isUpdate() {
-				console.log('检测更新开始~')
-				const updateManager = wx.getUpdateManager()
-				updateManager.onCheckForUpdate(function(res) {
-					// 请求完新版本信息的回调
-					console.log(res.hasUpdate)
-				})
-
-				updateManager.onUpdateReady(function() {
-					wx.showModal({
-						title: '更新提示',
-						content: '新版本已经准备好,是否重启应用?',
-						success(res) {
-							if (res.confirm) {
-								// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
-								updateManager.applyUpdate()
-							}
-						}
-					})
-				})
-
-				updateManager.onUpdateFailed(function() {
-					// 新版本下载失败
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import "@/uni_modules/uview-ui/index.scss";
-	@import '@/static/scss/index.scss'
-</style>

+ 0 - 21
LICENSE

@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 若依
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.

+ 0 - 1
README.md

@@ -1 +0,0 @@
-### 兴元商家管理小程序

+ 0 - 118
api/commodity/goods.js

@@ -1,118 +0,0 @@
-import request from '@/utils/request'
-
-// 商品分页
-export function ownerGoodsList(data) {
-  return request({
-    url: '/goods/merc-mini/goods/page',
-    method: 'post',
-	data:data
-  })
-}
-
-// 商品类目
-export function goodsCategory(data) {
-  return request({
-    url: '/goods/merc-mini/goods/categoryLevel1 ',
-    method: 'post',
-    data:data
-  })
-}
-
-// 列表(内部服务调用) 
-export function listById(data) {
-  return request({
-    url: '/mini/mercLine/listById',
-    method: 'post',
-    data:data
-  })
-}
-
-// 列表
-export function lineListByMerc(data) {
-  return request({
-    url: '/mini/mercLine/listByMerc',
-    method: 'post',
-    data:data
-  })
-}
-
-// 删除
-export function lineDel(data) {
-  return request({
-    url: '/mini/mercLine/del',
-    method: 'post',
-    data:data
-  })
-}
-//设备 分类列表
-export function categoryList(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMerc/categoryList',
-    method: 'post',
-    data:data
-  })
-}
-//设备  商品类别
-export function list(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/list',
-    method: 'post',
-    data:data
-  })
-}
-
-//销售统计汇总
-export function sumCount(data) {
-  return request({
-    url: '/goods/merc-mini/goodsData/sumCount',
-    method: 'post',
-    data:data
-  })
-}
-
-//销售统计列表
-export function sumPage(data) {
-  return request({
-    url: '/goods/merc-mini/goodsData/sumPage',
-    method: 'post',
-    data:data
-  })
-}
-
-//设备商品公库分页
-export function pageByGoods(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/pageByGoods',
-    method: 'post',
-    data:data
-  })
-}
-
-//设备商品私库分页
-export function pageByGoodsMerc(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/pageByGoodsMerc',
-    method: 'post',
-    data:data
-  })
-}
-
-//私库到设备
-export function bindDeviceByMercGoods(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/bindDeviceByMercGoods',
-    method: 'post',
-    data:data
-  })
-}
-
-//公库到设备
-export function bindDeviceByGoods(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/bindDeviceByGoods',
-    method: 'post',
-    data:data
-  })
-}
-
-

+ 0 - 66
api/commodity/goodsMode.js

@@ -1,66 +0,0 @@
-import request from '@/utils/request'
-
-// 新增
-export function save(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMode/save',
-    method: 'post',
-	data:data
-  })
-}
-
-// 修改
-export function update(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMode/update',
-    method: 'post',
-	data:data
-  })
-}
-
-// 对象查询
-export function searchObj(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMode/obj',
-    method: 'post',
-	data:data
-  })
-}
-
-// 分页
-export function goodsPage(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMode/page',
-    method: 'post',
-	data:data
-  })
-}
-
-// 商品类目
-export function categoryTree(data) {
-  return request({
-    url: '/goods/merc-mini/goods/category/tree',
-    method: 'post',
-	data:data
-  })
-}
-
-// 商品规格
-export function listIdName(data) {
-  return request({
-    url: '/goods/merc-mini/goods/unit/listIdName',
-    method: 'post',
-	data:data
-  })
-}
-
-// 设备商品价格修改
-export function changePrice(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/update',
-    method: 'post',
-	data:data
-  })
-}
-
-

+ 0 - 50
api/commodity/mercGoods.js

@@ -1,50 +0,0 @@
-import request from '@/utils/request'
-
-// 商品分页
-export function ownerGoodsList(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMerc/page',
-    method: 'post',
-	data:data
-  })
-}
-
-// 商品类目
-export function goodsCategory(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMerc/categoryList',
-    method: 'post',
-    data:data
-  })
-}
-
-// 对象查询
-export function searchObj(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMerc/obj',
-    method: 'post',
-	data:data
-  })
-}
-
-// 商品添加到私库
-export function bindMerc(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMerc/bindMerc',
-    method: 'post',
-	data:data
-  })
-}
-
-// 商品修改
-export function update(data) {
-  return request({
-    url: '/goods/merc-mini/goodsMerc/update',
-    method: 'post',
-	data:data
-  })
-}
-
-
-
-

+ 0 - 57
api/commodity/point.js

@@ -1,57 +0,0 @@
-import request from '@/utils/request'
-
-// 分页
-export function pointPage(data) {
-  return request({
-    url: '/mini/mercPlace/page',
-    method: 'post',
-	data:data
-  })
-}
-
-// 新增修改点位
-export function pointSave(data) {
-  return request({
-    url: '/mini/mercPlace/save',
-    method: 'post',
-	data:data
-  })
-}
-
-
-
-// 绑定/解绑设备 
-export function bindDevice(data) {
-  return request({
-    url: '/mini/mercPlace/bindDevice',
-    method: 'post',
-    data:data
-  })
-}
-
-// 列表(内部服务调用) 
-export function listById(data) {
-  return request({
-    url: '/mini/mercPlace/listById',
-    method: 'post',
-    data:data
-  })
-}
-
-// 列表
-export function pointListByMerc(data) {
-  return request({
-    url: '/mini/mercPlace/listByMerc',
-    method: 'post',
-    data:data
-  })
-}
-
-// 删除
-export function pointDel(data) {
-  return request({
-    url: '/mini/mercPlace/del',
-    method: 'post',
-    data:data
-  })
-}

+ 0 - 88
api/commoditylist/commoditylist.js

@@ -1,88 +0,0 @@
-import request from '@/utils/request'
-
-// 分页查询
-export function page(data) {
-	return request({
-		url: '/goods/merc-mini/goodsMercModel/page',
-		method: 'post',
-		data: data
-	})
-}
-//清单关联商品列表
-export function refGoods(data) {
-	return request({
-		url: '/goods/merc-mini/goodsMercModel/refGoods',
-		method: 'post',
-		data: data
-	})
-}
-// 新增商品清单 
-export function save(data) {
-	return request({
-		url: '/goods/merc-mini/goodsMercModel/save',
-		method: 'post',
-		data: data
-	})
-}
-// 商品清单应用设备
-export function saveGoodsDevice(data) {
-	return request({
-		url: '/goods/merc-mini/goodsMercModel/saveGoodsDevice',
-		method: 'post',
-		data: data
-	})
-}
-// 修改商品清单 
-export function update(data) {
-	return request({
-		url: '/goods/merc-mini/goodsMercModel/update',
-		method: 'post',
-		data: data
-	})
-}
-// 保存清单商品(每次传全量数据)
-export function saveListingGoods(data) {
-	return request({
-		url: '/goods/merc-mini/goodsMercModel/saveListingGoods',
-		method: 'post',
-		data: data
-	})
-}
-
-//获取区域下设备列表
-export function regionDevices(data) {
-	return request({
-		url: '/merc/mini/mercLine/regionDevices',
-		method: 'post',
-		data: data
-	})
-}
-//获取商户线路列表
-export function mercLineDevices(data) {
-	return request({
-		url: '/goods/merc-mini/goodsMercModel/mercLineDevices',
-		method: 'post',
-		data: data
-	})
-}
-
-//商品清单应用到设备
-export function goodsListApply(data) {
-	return request({
-		url: '/goods/goodsDevice/save',
-		method: 'post',
-		data: data
-	})
-}
-
-//删除清单
-export function del(data) {
-	return request({
-		url: '/goods/goods-merc-model/del ',
-		method: 'post',
-		data: data
-	})
-}
-
-
-

+ 0 - 373
api/device/device.js

@@ -1,373 +0,0 @@
-import request from '@/utils/request'
-// 设备列表
-export function mercHomeList(data) {
-  return request({
-    url: '/merc/mini/device/mercHomeList',
-    method: 'post',
-	data:data
-  })
-}
-
-// 商户设备首页统计
-export function mercHomeStatistical(data) {
-  return request({
-    url: '/device/merc-mini/device/mercHomeStatistical',
-    method: 'post',
-	data:data
-  })
-}
-
-// 增加商品到设备  
-export function bindDevice(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/bindDevice',
-    method: 'post',
-    data:data
-  })
-}
-
-// 设备商品列表
-export function goodsList(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/page',
-    method: 'post',
-    data:data
-  })
-}
-
-// 商户设备列表
-export function searchPage(data) {
-  return request({
-    url: '/device/merc-mini/device/searchPage',
-    method: 'post',
-    data:data
-  })
-}
-
-// 商户设备详情
-export function detail(data) {
-  return request({
-    url: '/device/merc-mini/device/detail',
-    method: 'post',
-    data:data
-  })
-}
-
-// 数据统计
-export function dataCount(data) {
-  return request({
-    url: '/device/merc-mini/device/dataCount',
-    method: 'post',
-    data:data
-  })
-}
-
-// 设备操作记录
-export function indexDeviceRecords(data) {
-  return request({
-    url: '/device/merc-mini/deviceRecords/indexDeviceRecords',
-    method: 'post',
-    data:data
-  })
-}
-
-// 设备联网记录
-export function indexDeviceNetRecords(data) {
-  return request({
-    url: '/device/merc-mini/deviceRecords/indexDeviceNetRecords',
-    method: 'post',
-    data:data
-  })
-}
-
-// 设备故障情况
-export function indexDeviceError(data) {
-  return request({
-    url: '/device/merc-mini/deviceRecords/indexDeviceError',
-    method: 'post',
-    data:data
-  })
-}
-
-// 设备温度记录
-export function indexDeviceTempRecords(data) {
-  return request({
-    url: '/device/merc-mini/deviceRecords/indexDeviceTempRecords ',
-    method: 'post',
-    data:data
-  })
-}
-
-// 设备激活
-export function deviceActive(data) {
-  return request({
-    url: '/device/merc-mini/device/active',
-    method: 'post',
-    data:data
-  })
-}
-
-// 设备详情
-export function deviceDetail(data) {
-  return request({
-    url: '/device/device-info/obj',
-    method: 'post',
-    data:data
-  })
-}
-
-// 运营状态修改
-export function modifyBusyStage(data) {
-  return request({
-    url: '/device/merc-mini/device/modifyBusyStage',
-    method: 'post',
-    data:data
-  })
-}
-
-// 首页统计数据
-export function allCount(data) {
-  return request({
-    url: '/order/order-merc-sales-count-more/count',
-    method: 'post',
-    data:data
-  })
-}
-
-// 设备商品分类
-export function categoryList(data) {
-  return request({
-    url: '/goods/merc-mini/goodsDevice/categoryList',
-    method: 'post',
-    data:data
-  })
-}
-
-// 修改设备信息
-export function updateInfo(data) {
-  return request({
-    url: '/device/merc-mini/device/updateInfo',
-    method: 'post',
-    data:data
-  })
-}
-
-export function sendCommand(data) {
-  return request({
-    url: '/device/mqtt/senCommand',
-    method: 'post',
-    data:data
-  })
-}
-//查询指令操作结果
-export function queryCommandResult(data) {
-  return request({
-    url: '/device/mqtt/snByCmdAndResult',
-    method: 'post',
-    data:data
-  })
-}
-
-//销售统计汇总
-export function sumCount(data) {
-  return request({
-    url: '/device/merc-mini/deviceData/sumCount',
-    method: 'post',
-    data:data
-  })
-}
-
-//销售统计列表
-export function sumPage(data) {
-  return request({
-    url: '/device/merc-mini/deviceData/sumPage',
-    method: 'post',
-    data:data
-  })
-}
-
-//设备激活情况
-export function getActiveInfo(data) {
-  return request({
-    url: '/device/merc-mini/device/getActiveInfo',
-    method: 'post',
-    data:data
-  })
-}
-
-//设备是否属于商户
-export function isMerc(data) {
-  return request({
-    url: '/device/merc-mini/device/isMerc',
-    method: 'post',
-    data:data
-  })
-}
-
-
-//设备二维码
-export function getQrCode(data) {
-  return request({
-    url: '/device/device-quality/getQrCode',
-    method: 'post',
-    data:data
-  })
-}
-
-//导出设备二维码
-export function exportQrCode(data) {
-  return request({
-    url: '/device/device-create-ids/exportQrCode',
-    method: 'post',
-    data:data
-  })
-}
-
-//清除故障
-export function abort(data) {
-  return request({
-    url: '/order/activity-info/abort',
-    method: 'post',
-    data:data
-  })
-}
-
-//统计数据图表
-export function salesData(data) {
-  return request({
-    url: '/merc/mini/data/salesData',
-    method: 'post',
-    data:data
-  })
-}
-
-//支付宝设备激活分页
-export function aliDeviceActivePage(data) {
-  return request({
-    url: '/merc/mini/device/aliDeviceActivePage',
-    method: 'post',
-    data:data
-  })
-}
-
-//获取商家信息
-export function userInfoBySelf(data) {
-  return request({
-    url: '/merc/mini/mercUser/userInfoBySelf',
-    method: 'post',
-    data:data
-  })
-}
-
-//绑定支付宝
-export function updateByAli(data) {
-  return request({
-    url: '/merc/mini/mercUser/updateByAli',
-    method: 'post',
-    data:data
-  })
-}
-
-//支付宝设备详情查询
-export function aliDeviceObj(data) {
-  return request({
-    url: '/merc//mini/device/aliDeviceObj',
-    method: 'post',
-    data:data
-  })
-}
-
-
-//商品销售统计汇总
-export function goodSumCount(data) {
-  return request({
-    url: '/goods/goodsDeviceData/sumCount',
-    method: 'post',
-    data:data
-  })
-}
-
-//商品销售统计列表
-export function goodSumPage(data) {
-  return request({
-    url: '/goods/goodsDeviceData/sumPage',
-    method: 'post',
-    data:data
-  })
-}
-
-export function mercDeviceList(data) {
-  return request({
-    url: '/merc/mini/mercUserDevice/mercDeviceList',
-    method: 'post',
-    data:data
-  })
-}
-
-export function addDevice(data) {
-  return request({
-    url: '/merc/mini/mercUserDevice/add',
-    method: 'post',
-    data:data
-  })
-}
-
-export function userDeviceList(data) {
-  return request({
-    url: '/merc/mini/mercUserDevice/userDeviceList',
-    method: 'post',
-    data:data
-  })
-}
-
-export function delDevice(data) {
-  return request({
-    url: '/merc/mini/mercUserDevice/del',
-    method: 'post',
-    data:data
-  })
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 0 - 9
api/dict.js

@@ -1,9 +0,0 @@
-import request from '@/utils/request'
-//数据字典
-export function list2(data) {
-	return request({
-		url: '/sys/sys-dict/list2',
-		method: 'post',
-		data: data
-	})
-}

+ 0 - 11
api/download.js

@@ -1,11 +0,0 @@
-import {
-	downLoadReq
-} from '@/utils/request'
-
-export function exportQrCode(data) {
-	return downLoadReq({
-		url: '/device/device-create-ids/exportQrCode',
-		method: 'post',
-		data: data
-	})
-}

+ 0 - 50
api/login.js

@@ -1,50 +0,0 @@
-import request from '@/utils/request'
-
-// 登录方法
-export function login(loginName, password, code, clientType,pointJson) {
-  const data = {
-    loginName,
-    password,
-    code,
-    clientType,
-	pointJson
-  }
-  return request({
-    'url': '/merc/mini/login',
-    headers: {
-      isToken: false
-    },
-    'method': 'post',
-    'data': data
-  })
-}
-
-// 获取用户详细信息
-export function getInfo() {
-  return request({
-    'url': '/getInfo',
-    'method': 'get'
-  })
-}
-
-// 退出方法
-export function logout() {
-  return request({
-    'url': '/authorize/sysWorkUser/logout',
-    'method': 'post'
-  })
-}
-
-// 获取验证码
-export function getCodeImg() {
-  return request({
-    'url': '/captchaImage',
-    headers: {
-      isToken: false
-    },
-    method: 'get',
-    timeout: 20000
-  })
-}
-
-

+ 0 - 144
api/order/order.js

@@ -1,144 +0,0 @@
-import request from '@/utils/request'
-
-//商户订单查询 
-export function page(data) {
-	return request({
-		url: '/merc/mini/orders/page',
-		method: 'post',
-		data: data
-	})
-}
-
-
-
-
-//订单详情
-export function byId(data) {
-	return request({
-		url: '/order/order-merc-mini/byId',
-		method: 'post',
-		data: data
-	})
-}
-
-//退款列表
-export function refundList(data) {
-	return request({
-		url: '/order/order-refund-merc-mini/page',
-		method: 'post',
-		data: data
-	})
-}
-
-//订单列表
-export function orderPage(data) {
-	return request({
-		url: '/order/orders/mini/page',
-		method: 'post',
-		data: data
-	})
-}
-
-//订单列表-统计 
-export function orderPageCount(data) {
-	return request({
-		url: '/device/merc-mini/device/order/count',
-		method: 'post',
-		data: data
-	})
-}
-
-//退款处理
-export function hendel(data) {
-	return request({
-		url: '/order/order-refund-merc-mini/hendel',
-		method: 'post',
-		data: data
-	})
-}
-
-//退款情况
-export function refundDetail(data) {
-	return request({
-		url: '/order/order-refund-merc-mini/detail',
-		method: 'post',
-		data: data
-	})
-}
-
-//订单日志
-export function orderLogs(data) {
-	return request({
-		url: '/order/activity-info-og/list',
-		method: 'post',
-		data: data
-	})
-}
-
-//拉黑
-export function setBlacklist(data) {
-	return request({
-		url: '/merc/mini/member/setBlacklist',
-		method: 'post',
-		data: data
-	})
-}
-
-//拉黑解除
-export function removeBlackList(data) {
-	return request({
-		url: '/merc/mini/member/blackListRemove ',
-		method: 'post',
-		data: data
-	})
-}
-
-//订单用户信息
-export function userInfo(data) {
-	return request({
-		url: '/merc/mini/member/obj',
-		method: 'post',
-		data: data
-	})
-}
-
-//首页角标
-export function tipsCount(data) {
-	return request({
-		url: '/order/order-merc-homepage-mini/tipsCount',
-		method: 'post',
-		data: data
-	})
-}
-
-//首页(本月销售)统计
-export function countByMonth(data) {
-	return request({
-		url: '/order/order-merc-sales-count-more/countByMonth',
-		method: 'post',
-		data: data
-	})
-}
-
-//首页(今日销售)统计
-export function countByDay(data) {
-	return request({
-		url: '/order/order-merc-sales-count-more/dayCountDetail',
-		method: 'post',
-		data: data
-	})
-}
-
-//订单主动退款
-export function refundByMerc(data) {
-	return request({
-		url: '/order/order-refund-merc-mini/refundByMerc',
-		method: 'post',
-		data: data
-	})
-}
-
-
-
-
-

+ 0 - 50
api/order/riskorder.js

@@ -1,50 +0,0 @@
-import request from '@/utils/request'
-
-// 异常单补扣申请 
-export function apply(data) {
-	return request({
-		url: '/order/order-riskCut-merc-mini/apply',
-		method: 'post',
-		data: data
-	})
-}
-
-//风险订单-分页 
-export function page(data) {
-	return request({
-		url: '/order/order-riskCut-merc-mini/page',
-		method: 'post',
-		data: data
-	})
-}
-
-//所有待处理异常单
-export function todoNum(data) {
-	return request({
-		url: '/order/order-riskCut-merc-mini/todoNum',
-		method: 'post',
-		data: data
-	})
-}
-
-//风险订单结束
-export function cancelOrder(data) {
-	return request({
-		url: '/order/order-pay-mini/riskOrder/cancel',
-		method: 'post',
-		data: data
-	})
-}
-
-//风险订单补扣申请撤回
-export function rollback(data) {
-	return request({
-		url: '/order/order-riskCut-merc-mini/rollback ',
-		method: 'post',
-		data: data
-	})
-}
-
-
-
-

+ 0 - 9
api/oss.js

@@ -1,9 +0,0 @@
-import request from '@/utils/request'
-
-// 获取用户详细信息
-export function ossInfo() {
-  return request({
-    'url': '/sys/oss/aliOSS/policy',
-    'method': 'get'
-  })
-}

+ 0 - 38
api/point/area.js

@@ -1,38 +0,0 @@
-import request from '@/utils/request'
-
-// 新增区域
-export function areaSave(data) {
-  return request({
-    url: '/merc/mini/mercRegion/save',
-    method: 'post',
-	data:data
-  })
-}
-
-// 区域树
-export function areaTree() {
-  return request({
-    'url': '/merc/mini/mercRegion/tree',
-    'method': 'post'
-  })
-}
-
-// 区域删除
-export function areaDel(data) {
-  return request({
-    url: '/merc/mini/mercRegion/del',
-    method: 'post',
-    data:data
-  })
-}
-
-// 新区域线路接口
-export function allLineWithRegion(data) {
-  return request({
-    url: '/merc/mini/mercLine/allLineWithRegion',
-    method: 'post',
-    data:data
-  })
-}
-
-

+ 0 - 56
api/point/line.js

@@ -1,56 +0,0 @@
-import request from '@/utils/request'
-// 新增修改线路
-export function lineSave(data) {
-  return request({
-    url: '/merc/mini/mercLine/save',
-    method: 'post',
-	data:data
-  })
-}
-
-// 分页
-export function linePage(data) {
-  return request({
-    url: '/merc/mini/mercLine/page',
-    method: 'post',
-	data:data
-  })
-}
-
-// 绑定/解绑设备 
-export function bindDevice(data) {
-  return request({
-    url: '/merc/mini/mercLine/bindDevice',
-    method: 'post',
-    data:data
-  })
-}
-
-// 列表(内部服务调用) 
-export function listById(data) {
-  return request({
-    url: '/merc/mini/mercLine/listById',
-    method: 'post',
-    data:data
-  })
-}
-
-// 列表
-export function lineListByMerc(data) {
-  return request({
-    url: '/merc/mini/mercLine/listByMerc',
-    method: 'post',
-    data:data
-  })
-}
-
-// 删除
-export function lineDel(data) {
-  return request({
-    url: '/merc/mini/mercLine/del',
-    method: 'post',
-    data:data
-  })
-}
-
-

+ 0 - 57
api/point/point.js

@@ -1,57 +0,0 @@
-import request from '@/utils/request'
-
-// 分页
-export function pointPage(data) {
-  return request({
-    url: '/merc/mini/mercPlace/page',
-    method: 'post',
-	data:data
-  })
-}
-
-// 新增修改点位
-export function pointSave(data) {
-  return request({
-    url: '/merc/mini/mercPlace/save',
-    method: 'post',
-	data:data
-  })
-}
-
-
-
-// 绑定/解绑设备 
-export function bindDevice(data) {
-  return request({
-    url: '/merc/mini/mercPlace/bindDevice',
-    method: 'post',
-    data:data
-  })
-}
-
-// 列表(内部服务调用) 
-export function listById(data) {
-  return request({
-    url: '/merc/mini/mercPlace/listById',
-    method: 'post',
-    data:data
-  })
-}
-
-// 列表
-export function pointListByMerc(data) {
-  return request({
-    url: '/merc/mini/mercPlace/listByMerc',
-    method: 'post',
-    data:data
-  })
-}
-
-// 删除
-export function pointDel(data) {
-  return request({
-    url: '/merc/mini/mercPlace/del',
-    method: 'post',
-    data:data
-  })
-}

+ 0 - 156
api/replenishment/replenishment.js

@@ -1,156 +0,0 @@
-import request from '@/utils/request'
-
-// 补货首页
-export function supplyPage(data) {
-	return request({
-		url: '/goods/merc-mini/goodsDevice/supplyPage',
-		method: 'post',
-		data: data
-	})
-}
-
-//补货删除
-export function delGoods(data) {
-	return request({
-		url: '/goods/merc-mini/goodsDevice/delGoods',
-		method: 'post',
-		data: data
-	})
-}
-// 补货保存
-export function save(data) {
-	return request({
-		url: '/merc/mini/mercSupply/save',
-		method: 'post',
-		data: data
-	})
-}
-// 一键开柜
-export function saveByOpenDoor(data) {
-	return request({
-		url: '/merc/mini/mercSupply/saveByOpenDoor',
-		method: 'post',
-		data: data
-	})
-}
-
-//补货记录分页查询
-export function page(data) {
-	return request({
-		url: '/merc/mini/mercSupply/page',
-		method: 'post',
-		data: data
-	})
-}
-//补货记录对象查询
-export function obj(data) {
-	return request({
-		url: '/merc/mini/mercSupply/obj',
-		method: 'post',
-		data: data
-	})
-}
-
-// 效验
-export function check(data) {
-	return request({
-		'url': '/order/activity-info/check',
-		'method': 'post',
-		'data': data
-	})
-}
-// 按线路+商品分组 
-export function stockByLineAndGoods(data) {
-	return request({
-		'url': '/goods/merc-mini/stockData/stockByLineAndGoods',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 按设备+商品分组 
-export function stockByDeviceAndGoods(data) {
-	return request({
-		'url': '/goods/merc-mini/stockData/stockByDeviceAndGoods',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 按设备分组 
-export function stockByDevice(data) {
-	return request({
-		'url': '/goods/merc-mini/stockData/stockByDevice',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 按商品分组 
-export function stockByGoods(data) {
-	return request({
-		'url': '/goods/merc-mini/stockData/stockByGoods',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 按线路分组 
-export function stockByLine(data) {
-	return request({
-		'url': '/goods/merc-mini/stockData/StockByLine',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 补货首页全部列表
-export function deviceStockList(data) {
-	return request({
-		'url': '/goods/merc-mini/goodsDevice/deviceStockList',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 补货首页缺货列表
-export function deviceStockOutList(data) {
-	return request({
-		'url': '/goods/merc-mini/goodsDevice/deviceStockOutList',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 补货首页缺货列表
-export function create(data) {
-	return request({
-		'url': '/order/activity-info/create',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 库存详情设备
-export function stockByDeviceDetail(data) {
-	return request({
-		'url': '/goods/merc-mini/stockData/stockByDeviceDetail',
-		'method': 'post',
-		'data': data
-	})
-}
-
-// 库存详情商品
-export function stockByGoodsDetail(data) {
-	return request({
-		'url': '/goods/merc-mini/stockData/stockByGoodsDetail',
-		'method': 'post',
-		'data': data
-	})
-}
-
-
-
-
-
-

+ 0 - 49
api/system/employee.js

@@ -1,49 +0,0 @@
-import request from '@/utils/request'
-
-// 获取用户菜单
-export function save(data) {
-  return request({
-    url: '/merc/mini/mercUser/save',
-    method: 'post',
-	data:data
-  })
-}
-
-// 获取用户列表
-export function list(data) {
-  return request({
-    url: '/merc/mini/mercUser/list',
-    method: 'post',
-	data:data
-  })
-}
-
-// 角色列表
-export function roleList(data) {
-  return request({
-    url: '/authorize/sysRole/page',
-    method: 'post',
-	data:data
-  })
-}
-
-// 用户详情
-export function objByUserId(data) {
-  return request({
-    url: '/merc/mini/mercUser/objByUserId',
-    method: 'post',
-	data:data
-  })
-}
-
-// 更新用户
-export function update(data) {
-  return request({
-    url: '/merc/mini/mercUser/update',
-    method: 'post',
-	data:data
-  })
-}
-
-
-

+ 0 - 22
api/system/menu.js

@@ -1,22 +0,0 @@
-import upload from '@/utils/upload'
-import request from '@/utils/request'
-
-// 获取系统权限菜单
-export function workMenuList(data) {
-  return request({
-    url: '/authorize/sys-menu/workMenuList',
-    method: 'post',
-    data: data
-  })
-}
-
-// 获取系统集合
-export function sysList(data) {
-  return request({
-    url: '/authorize/sys-system/list',
-    method: 'post',
-    data: data
-  })
-}
-
-

+ 0 - 50
api/system/user.js

@@ -1,50 +0,0 @@
-import request from '@/utils/request'
-
-// 获取用户菜单
-export function workMenuList() {
-  return request({
-    url: '/authorize/sys-menu/workMenuList',
-    method: 'post'
-  })
-}
-
-// 获取用户信息
-export function userInfo() {
-  return request({
-    url: '/merc/mini/orders/my',
-    method: 'post'
-  })
-}
-
-// 协议
-export function agreement(data) {
-  return request({
-    url: '/sys/sys-agreement/obj',
-    method: 'post',
-	data:data
-  })
-}
-
-// 协议列表
-export function agreementPage(data) {
-  return request({
-    url: '/sys/sys-agreement/page',
-    method: 'post',
-	data:data
-  })
-}
-
-// 修改用户密码等信息
-export function updateUserInfo(data) {
-  return request({
-    url: '/merc/mini/orders/updateUserInfo',
-    method: 'post',
-	data:data
-  })
-}
-
-
-
-
-
-

+ 0 - 687
components/classify/index.vue

@@ -1,687 +0,0 @@
-<template>
-	<view class="wrap">
-		<view class="u-menu-wrap">
-			<scroll-view :style="{height:height}" scroll-y scroll-with-animation class="u-tab-view menu-scroll-view"
-				:scroll-top="scrollTop" v-if="leftShow">
-				<view v-for="(item,index) in newTabList" :key="index" class="u-tab-item"
-					:class="[current==index ? 'u-tab-item-active' : '']" :data-current="index"
-					@tap.stop="swichMenu(index,item)">
-					<text class="u-line-1">{{item.categoryName}}</text>
-					<view class="u-tab-num">
-						({{item.num}})
-					</view>
-					<u-badge type="error" max="99" :value="item.selectNum" :absolute="true" :offset="[4,4]"></u-badge>
-				</view>
-			</scroll-view>
-
-			<scroll-view lower-threshold="150" :style="{height:height}" scroll-y class="right-box"
-				@scrolltolower="lowerBottom">
-				<view class="page-view">
-					<view class="class-item" v-if="newCommList.length>0">
-						<view class="item-container">
-							<view class="thumb-box" v-for="(item, index) in newCommList" :key="index"
-								@click.stop="commItemClick(item)">
-								<view v-if="selectShow">
-									<image class="select-img"
-										src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/no_selected.png"
-										mode="widthFix" v-show="item.noSelect"></image>
-									<image class="select-img"
-										src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-										mode="widthFix" v-show="!item.noSelect&&item.checked"></image>
-									<image class="select-img"
-										src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-										mode="widthFix" v-show="!item.noSelect&&!item.checked"></image>
-								</view>
-
-								<view class="check-content">
-									<view class="comm-img">
-										<u--image radius="4" width="130rpx" height="130rpx" :src="item.cover"
-											mode="aspectFit" :lazy-lord="true"></u--image>
-									</view>
-									<view class="comm-main">
-										<view>
-											{{item.name}}
-										</view>
-										<view>
-											条形码:{{item.barcode}}
-										</view>
-										<!-- <view>
-											商品类型:{{item.categoryName}}
-										</view> -->
-										<view v-if="item.price!=null">
-											价格:<text>¥{{item.price}}</text>
-										</view>
-									</view>
-								</view>
-							</view>
-							<u-loadmore :status="status" v-if="newCommList.length>=1" />
-						</view>
-					</view>
-					<view class="empty" v-else>
-						<u-empty></u-empty>
-					</view>
-				</view>
-
-			</scroll-view>
-
-			<view class="cart" v-if="selectShow" @click="cartShow=true">
-				<image class="cart-img"
-					src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/buy.png"
-					mode="widthFix"></image>
-				<u-badge type="error" max="99" :value="selectList.length" :absolute="true" :offset="[4,4]"></u-badge>
-			</view>
-		</view>
-
-		<xpopup :show="cartShow" @close="close" :showBtn="false">
-			<view class="pop-top" slot="title">
-				<view class="left">
-					已选商品
-				</view>
-				<xbutton size="mini" class="clear" @click="clearCart">清空</xbutton>
-			</view>
-			<view class="pop-content">
-				<u-list height="440rpx">
-					<u-list-item v-for="(item, index) in selectList" :key="item.id">
-						<view class="list-item">
-							<view class="comm-item">
-								<view class="comm-img">
-									<u--image radius="4" width="110rpx" height="110rpx" :src="item.cover"
-										mode="aspectFit" :lazy-lord="true"></u--image>
-								</view>
-								<view class="item-content">
-									<view>
-										{{item.name}}
-									</view>
-									<view>
-										条形码:{{item.barcode}}
-									</view>
-									<view>
-										商品类型:{{item.categoryName}}
-									</view>
-									<view v-if="item.price">
-										价格:<text>¥{{item.price}}</text>
-									</view>
-								</view>
-							</view>
-							<xbutton color="red" size="mini" bgColor="#fff" borderColor="red" @click="delCom(item)">删除
-							</xbutton>
-						</view>
-					</u-list-item>
-					<view class="empty" v-if="selectList.length==0">
-						<u-empty mode="car" text="没有商品!"></u-empty>
-					</view>
-				</u-list>
-			</view>
-		</xpopup>
-
-		<xpopup :show="delPopShow" :showBtn="true" @confirm="delSure" @close="delClose">
-			<view class="del-content">
-				是否确定要{{delTitle}}?
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				scrollTop: 0, //tab标题的滚动条位置
-				current: 0, // 预设当前项的值
-				menuHeight: 0, // 左边菜单的高度
-				menuItemHeight: 0, // 左边菜单item的高度
-				keyword: '',
-				checkedList: [], //当前类目选中商品
-				cartShow: false, //购物车
-
-				delPopShow: false, //删除弹框
-				delTitle: undefined, //删除或清空提示
-				selectList: [], //已选中商品
-			}
-		},
-		props: {
-			value: {
-				type: Array,
-				required: false
-			},
-			selectShow: {
-				type: Boolean,
-				default: false,
-				require: false
-			},
-			leftShow: {
-				type: Boolean,
-				default: true,
-				require: false
-			},
-			height: {
-				type: String,
-				require: false,
-				default: 'auto'
-			},
-
-			tabList: {
-				type: Array,
-				require: true,
-				default () {
-					return []
-				}
-			},
-
-			commList: {
-				type: Array,
-				require: true,
-				default () {
-					return []
-				}
-			},
-
-			status: {
-				type: String,
-				require: false,
-				default: 'loadmore'
-			},
-
-			storeName: {
-				type: String,
-				require: false,
-				default: 'commStor'
-			},
-			
-			isModal:{
-				type: Boolean,
-				require: false,
-				default: false
-			},
-		},
-
-		computed: {
-			newTabList() {
-				if (this.tabList.length > 0) {
-					let newTabList = JSON.parse(JSON.stringify(this.tabList));
-					if (this.selectShow) {
-						const idMapping = newTabList.reduce((acc, el, i) => {
-							el.selectNum = 0;
-							acc[el.categoryCode] = i;
-							return acc;
-						}, {});
-						this.selectList.forEach(i => {
-							if (i.categoryCode == null) {
-								i.categoryCode = '0'
-							}
-							newTabList[idMapping[i.categoryCode]].selectNum++
-						})
-						return newTabList
-					} else {
-						return newTabList
-					}
-				} else {
-					return []
-				}
-			},
-
-			newCommList() {
-				let newCommList = [];
-				if (this.selectList && this.selectList.length > 0) {
-					let selectList = this.selectList
-					const idMapping = selectList.reduce((acc, el, i) => {
-						acc[el.id] = i;
-						return acc;
-					}, {});
-					this.commList.forEach(i => {
-						if (idMapping[i.id] != undefined) { //重复值
-							i.checked = true
-						} else {
-							i.checked = false
-						}
-						newCommList.push(i)
-					})
-				} else {
-					newCommList = this.commList.map(i => {
-						i.checked = false;
-						return i
-					})
-				}
-				return newCommList
-			}
-		},
-
-		watch: {
-			commList: {
-				handler(newVal, oldVal) {
-
-				},
-				immediate: true,
-				deep: true,
-			},
-		},
-
-		created() {
-			this.onshow()
-		},
-
-		methods: {
-			//搜索页来回跳转,刷新已选商品数据
-			onshow() {
-				if (uni.getStorageSync(this.storeName) && JSON.parse(uni.getStorageSync(
-						this.storeName)).length > 0) {
-					let commStor = JSON.parse(uni.getStorageSync(this.storeName))
-					this.selectList = commStor;
-				}
-			},
-
-			// 商品点击
-			commItemClick(e) {
-				if (e.noSelect) {
-					this.$modal.msg('当前商品已存在!')
-					return
-				}
-				if (this.selectShow) { //有选中框
-					if (this.isModal) { //私库中新建模商品,需要设置价格
-						if (e.price == null || e.price == undefined) {
-							this.$emit('comClick', e)
-							return
-						}
-					}
-
-					if (!e.checked && this.selectList && this.selectList.length >= 10) {
-						this.$modal.msg('一次最多添加10个商品!')
-						return
-					}
-
-					e.checked = !e.checked
-					//选中商品存储到内存中,以便取用
-					let commStor = []
-					if (e.checked) { //选中添加到存储中
-						if (uni.getStorageSync(this.storeName)) {
-							commStor = JSON.parse(uni.getStorageSync(this.storeName));
-						}
-						commStor.push(e);
-					} else { //取消选中删除,并且从存储中删除
-						commStor = JSON.parse(uni.getStorageSync(this.storeName));
-						for (let i = 0; i < commStor.length; i++) {
-							let item = commStor[i]
-							if (item.id == e.id) {
-								commStor.splice(i, 1);
-								break
-							}
-						}
-					}
-					//收集选中商品,更新存储
-					this.selectList = commStor;
-					commStor.length > 0 ? uni.setStorageSync(this.storeName, JSON.stringify(commStor)) : uni
-						.setStorageSync(
-							this.storeName, '')
-					if (commStor.length > 0) {
-						console.log('commStor', commStor)
-						uni.setStorageSync(this.storeName, JSON.stringify(commStor))
-					}
-				} else { //无选中框
-					this.$emit('comClick', e)
-				}
-			},
-
-			lowerBottom() {
-				this.$emit('lowerBottom')
-			},
-
-			// 点击左边的栏目切换
-			async swichMenu(index, item) {
-				if (index == this.current) return;
-				this.current = index;
-				this.$emit('switchMenu', item)
-				// 如果为0,意味着尚未初始化
-				if (this.menuHeight == 0 || this.menuItemHeight == 0) {
-					await this.getElRect('menu-scroll-view', 'menuHeight');
-					await this.getElRect('u-tab-item', 'menuItemHeight');
-				}
-				// 将菜单菜单活动item垂直居中
-				this.scrollTop = index * this.menuItemHeight + this.menuItemHeight / 2 - this.menuHeight / 2;
-			},
-			// 获取一个目标元素的高度
-			getElRect(elClass, dataVal) {
-				new Promise((resolve, reject) => {
-					const query = uni.createSelectorQuery().in(this);
-					query.select('.' + elClass).fields({
-						size: true
-					}, res => {
-						// 如果节点尚未生成,res值为null,循环调用执行
-						if (!res) {
-							setTimeout(() => {
-								this.getElRect(elClass);
-							}, 10);
-							return;
-						}
-						this[dataVal] = res.height;
-					}).exec();
-				})
-			},
-
-			// 关闭购物车
-			close() {
-				this.cartShow = false
-			},
-
-			// 删除当前商品
-			delCom(item) {
-				//删除选中商品,更新存储
-				let commStor = JSON.parse(uni.getStorageSync(this.storeName));
-				for (let i = 0; i < commStor.length; i++) {
-					let stor = commStor[i];
-					if (stor.id == item.id) {
-						commStor.splice(i, 1);
-						break
-					}
-				}
-				this.selectList = commStor;
-				uni.setStorageSync(this.storeName, JSON.stringify(commStor));
-				this.$modal.msg('删除成功~');
-			},
-
-			//清空购物车
-			clearCart() {
-				if (this.selectList.length > 0) {
-					this.delPopShow = true
-					this.delTitle = '清空已选商品'
-				} else {
-					this.$modal.msg('您没有选择任何商品!');
-				}
-			},
-
-			delSure() {
-				this.delPopShow = false
-				this.selectList = [];
-				uni.setStorageSync(this.storeName, '')
-				this.close()
-				this.$modal.msg('清空成功~');
-			},
-
-			delClose() {
-				this.delPopShow = false
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.u-menu-wrap {
-		flex: 1;
-		display: flex;
-		overflow: hidden;
-	}
-
-	.u-tab-view {
-		width: 200rpx;
-		height: 100%;
-	}
-
-	.u-tab-item {
-		height: 110rpx;
-		background: #f6f6f6;
-		box-sizing: border-box;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-		font-size: 26rpx;
-		color: #444;
-		font-weight: 400;
-		line-height: 1;
-		position: relative;
-
-		&::after {
-			content: '';
-			height: 1rpx;
-			width: 100%;
-			background-color: #fafafa;
-			position: absolute;
-			left: 0;
-			bottom: 0;
-		}
-
-		.u-tab-num {
-			font-size: 20rpx;
-			margin-top: 6rpx;
-		}
-	}
-
-	.u-tab-item-active {
-		position: relative;
-		background: #fff;
-		color: #000;
-		font-weight: bold;
-	}
-
-	.u-tab-item-active::before {
-		content: "";
-		position: absolute;
-		border-left: 4px solid $uni-color-primary;
-		height: 32rpx;
-		left: 0;
-		top: 39rpx;
-	}
-
-	.u-tab-view {
-		height: 100%;
-	}
-
-	.right-box {
-		background-color: rgb(250, 250, 250);
-		padding-bottom: 20rpx;
-		position: relative;
-	}
-
-	.page-view {
-		padding: 16rpx 16rpx 0;
-	}
-
-	.class-item {
-		background-color: #fff;
-		padding: 16rpx;
-		border-radius: 8rpx;
-	}
-
-	.item-title {
-		font-size: 30rpx;
-		color: $u-main-color;
-		font-weight: bold;
-		margin: 10rpx 0;
-	}
-
-	.item-menu-name {
-		font-weight: normal;
-		font-size: 24rpx;
-		color: $u-main-color;
-	}
-
-	.item-container {
-		display: flex;
-		flex-direction: column;
-		flex-wrap: wrap;
-	}
-
-	.empty {
-		position: absolute;
-		left: 50%;
-		top: 50%;
-		transform: translate(-50%, -50%);
-	}
-
-	.item-menu-image {
-		width: 120rpx;
-		height: 120rpx;
-		border-radius: 100rpx;
-	}
-
-	.thumb-box {
-		display: flex;
-		flex-flow: row nowrap;
-		padding: 12rpx 0;
-		align-items: center;
-
-		&:not(:last-child) {
-			border-bottom: 1rpx solid #f4f4f4;
-			margin-bottom: 10rpx;
-		}
-	}
-
-	.select-img {
-		width: 40rpx;
-		height: 40rpx;
-	}
-
-	.check-content {
-		display: flex;
-		flex-direction: row;
-		align-items: center;
-		padding-left: 12rpx;
-
-		.comm-img {
-			width: 130rpx;
-			height: 130rpx;
-			display: flex;
-			flex-direction: row;
-			align-items: center;
-			justify-content: space-around;
-
-			image {
-				width: 100%;
-			}
-		}
-
-		.comm-main {
-			box-sizing: border-box;
-			padding-left: 18rpx;
-			color: #999;
-
-			>view {
-				padding: 4rpx 0;
-			}
-
-			>view:nth-child(1) {
-				font-size: 28rpx;
-				font-weight: bold;
-				color: #333;
-			}
-
-			>view:nth-child(2) {
-				font-size: 24rpx;
-				max-width: 380rpx;
-			}
-
-			>view:nth-child(3) {
-				font-size: 24rpx;
-			}
-
-			>view:nth-child(4) {
-				font-size: 24rpx;
-
-				text {
-					font-weight: bold;
-					color: red;
-				}
-			}
-		}
-	}
-
-	.cart {
-		width: 120rpx;
-		height: 120rpx;
-		display: flex;
-		flex-direction: row;
-		justify-content: center;
-		align-items: center;
-		border-radius: 120rpx;
-		position: fixed;
-		right: 24rpx;
-		bottom: 250rpx;
-
-		.cart-img {
-			width: 80rpx;
-			height: 80rpx;
-		}
-	}
-
-	.pop-top {
-		padding: 24rpx;
-		position: relative;
-
-		.left {
-			font-size: 28rpx;
-			font-weight: bold;
-		}
-
-		.clear {
-			position: absolute;
-			right: 24rpx;
-			top: 24rpx;
-		}
-	}
-
-	.pop-content {
-		// height: 200rpx;
-		padding: 0 24rpx;
-	}
-
-	.list-item {
-		display: flex;
-		flex-flow: row nowrap;
-		justify-content: space-between;
-		align-items: center;
-		width: 100%;
-	}
-
-	.comm-item {
-		display: flex;
-		flex-direction: row;
-		justify-content: flex-start;
-		align-items: center;
-		background-color: #fff;
-		margin-bottom: 12rpx;
-		border-radius: 12rpx;
-		box-sizing: border-box;
-		padding: 12rpx;
-
-		.comm-img {
-			width: 110rpx;
-		}
-
-		.item-content {
-			width: 480rpx;
-			padding-left: 24rpx;
-			color: #999;
-
-			>view:nth-child(1) {
-				font-size: 28rpx;
-				font-weight: bold;
-				color: #333;
-			}
-
-			>view:nth-child(2) {
-				font-size: 24rpx;
-				margin-top: 12rpx;
-			}
-
-			>view:nth-child(3) {
-				font-size: 24rpx;
-				margin-top: 12rpx;
-			}
-
-			>view:nth-child(4) {
-				font-size: 24rpx;
-				margin-top: 12rpx;
-
-				text {
-					font-weight: bold;
-					color: red;
-				}
-			}
-		}
-	}
-
-	.del-content {
-		padding: 48rpx;
-		font-size: 32rpx;
-		text-align: center;
-	}
-</style>

+ 0 - 108
components/tki-tree/style.css

@@ -1,108 +0,0 @@
-.tki-tree-mask {
-  position: fixed;
-  top: 0rpx;
-  right: 0rpx;
-  bottom: 0rpx;
-  left: 0rpx;
-  z-index: 9998;
-  background-color: rgba(0, 0, 0, 0.6);
-  opacity: 0;
-  transition: all 0.3s ease;
-  visibility: hidden;
-}
-.tki-tree-mask.show {
-  visibility: visible;
-  opacity: 1;
-}
-.tki-tree-cnt {
-  position: fixed;
-  top: 0rpx;
-  right: 0rpx;
-  bottom: 0rpx;
-  left: 0rpx;
-  z-index: 9999;
-  top: 160rpx;
-  transition: all 0.3s ease;
-  transform: translateY(100%);
-}
-.tki-tree-cnt.show {
-  transform: translateY(0);
-}
-.tki-tree-bar {
-  background-color: #fff;
-  height: 72rpx;
-  padding-left: 20rpx;
-  padding-right: 20rpx;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  box-sizing: border-box;
-  border-bottom-width: 1rpx !important;
-  border-bottom-style: solid;
-  border-bottom-color: #f5f5f5;
-  font-size: 32rpx;
-  color: #757575;
-  line-height: 1;
-}
-.tki-tree-bar-confirm {
-  color: #07bb07;
-}
-.tki-tree-view {
-  position: absolute;
-  top: 0rpx;
-  right: 0rpx;
-  bottom: 0rpx;
-  left: 0rpx;
-  top: 72rpx;
-  background-color: #fff;
-  padding-top: 20rpx;
-  padding-right: 20rpx;
-  padding-bottom: 20rpx;
-  padding-left: 20rpx;
-}
-.tki-tree-view-sc {
-  height: 100%;
-  overflow: hidden;
-}
-.tki-tree-item {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  font-size: 26rpx;
-  color: #757575;
-  line-height: 1;
-  height: 0;
-  opacity: 0;
-  transition: 0.2s;
-  position: relative;
-  overflow: hidden;
-}
-.tki-tree-item.show {
-  height: 80rpx;
-  opacity: 1;
-}
-.tki-tree-item.showchild:before {
-  transform: rotate(90deg);
-}
-.tki-tree-item.last:before {
-  opacity: 0;
-}
-.tki-tree-icon {
-  width: 26rpx;
-  height: 26rpx;
-  margin-right: 8rpx;
-}
-.tki-tree-label {
-  flex: 1;
-  display: flex;
-  align-items: center;
-  height: 100%;
-  line-height: 1.2;
-}
-.tki-tree-check {
-  width: 40px;
-  height: 40px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}

Plik diff jest za duży
+ 0 - 50
components/tki-tree/tki-tree.vue


+ 0 - 160
components/xy-button/index.vue

@@ -1,160 +0,0 @@
-<template>
-	<button @click="btnClick" :class="['cu-btn',size,icon?'has-icon':'']"
-		:style="{backgroundColor:bgColor,padding:padding,color:color,borderRadius:round,width:delWidth,border:delBorder}">
-		<slot></slot>
-		<view class="image" v-if="icon">
-			<u--image width="32rpx" height="32rpx" :src="icon" mode="widthFix"
-				:lazy-load="true">
-			</u--image>
-		</view>
-	</button>
-</template>
-
-<script>
-	import {
-		debounce
-	} from '@/utils/common.js'
-	export default {
-		data() {
-			return {
-				bflag: false,
-				timer: null,
-			}
-		},
-		props: {
-			text: {
-				type: String,
-				require: true,
-				default: ''
-			},
-			color: {
-				type: String,
-				require: true,
-				default: '#fff'
-			},
-			bgColor: {
-				type: String,
-				require: true,
-				default: '#2C6FF3'
-			},
-			padding: {
-				type: String
-			},
-			round: {
-				type: [Number, String],
-				default: 'none'
-			},
-			size: {
-				type: String,
-				require: true,
-				default: 'normal'
-			},
-			width: {
-				type: String
-			},
-			borderColor: {
-				type: String
-			},
-			delay: {
-				type: [Number, String],
-				require: false,
-				default: 0
-			},
-			icon:{
-				type: String,
-				require: false
-			}
-		},
-
-		computed: {
-			delWidth() {
-				let width = this.width;
-				if (this.size == 'mini' && !this.width) {
-					width = "auto"
-				}
-				if (this.size != 'mini' && !this.width) {
-					width = "100%"
-				}
-				return width
-			},
-			delBorder() {
-				let border = this.borderColor;
-				if (!this.borderColor) {
-					border = '0'
-				} else {
-					border = `1rpx solid ${border}`
-				}
-				return border
-			}
-		},
-
-		methods: {
-			btnClick() {
-				if(this.bflag) return
-				console.log('确定提交')
-				this.$emit('click')
-				this.bflag=true;
-				this.timer=setTimeout(()=>{
-					this.bflag=false;
-				},this.delay)
-			}
-		},
-		
-		destroyed() {
-			if(this.timer){
-				clearTimeout(this.timer)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.mini {
-		font-size: 24rpx;
-		border-radius: 6rpx;
-		padding: 0 12rpx;
-		height: 40rpx;
-		line-height: 38rpx;
-		display: inline-block;
-		width: 100rpx;
-	}
-	.medium {
-		font-size: 24rpx;
-		border-radius: 8rpx;
-		padding: 0 12rpx;
-		height: 50rpx;
-		line-height: 48rpx;
-		display: inline-block;
-		width: 100rpx;
-	}
-	.normal {
-		padding: 0 14rpx;
-		font-size: 26rpx;
-		height: 60rpx;
-		line-height: 58rpx;
-		border-radius: 8rpx;
-	}
-
-	.large {
-		border-radius: 12rpx;
-		height:80rpx;
-		line-height: 80rpx;
-		font-size: 28rpx;
-	}
-	
-	.cu-btn{
-		&.has-icon{
-			padding-left: 54rpx;
-			padding-right: 22rpx;
-			position: relative;
-			.image{
-				width:32rpx;
-				height:32rpx;
-				position: absolute;
-				left:13rpx;
-				top:50%;
-				transform: translateY(-50%);
-			}
-		}
-	}
-</style>

+ 0 - 1369
components/xy-imgResiz/index.vue

@@ -1,1369 +0,0 @@
-<template name="xy-imgResiz">
-	<view>
-		<canvas canvas-id="avatar-canvas" id="avatar-canvas" class="my-canvas" :style="{top: sT, height: csH}"
-			disable-scroll="false"></canvas>
-		<canvas canvas-id="oper-canvas" id="oper-canvas" class="oper-canvas" :style="{top: sT, height: csH}"
-			disable-scroll="false" @touchstart="fStart" @touchmove="fMove" @touchend="fEnd"></canvas>
-		<canvas canvas-id="prv-canvas" id="prv-canvas" class="prv-canvas" disable-scroll="false" @touchstart="fHideImg"
-			:style="{ height: csH, top: pT }"></canvas>
-		<view class="oper-wrapper" :style="{display: sD, top:tp}">
-			<view class="oper">
-				<view class="btn-wrapper" v-if="sO">
-					<view @click="fSelect" hover-class="hover" :style="{width: bW}"><text>重选</text></view>
-					<view @click="fClose" hover-class="hover" :style="{width: bW}"><text>关闭</text></view>
-					<view @click="fRotate" hover-class="hover" :style="{width: bW, display: bD}"><text>旋转</text></view>
-					<view @click="fPreview" hover-class="hover" :style="{width: bW}"><text>预览</text></view>
-					<view @click="fUpload" hover-class="hover" :style="{width: bW}"><text>上传</text></view>
-				</view>
-				<view class="clr-wrapper" v-else>
-					<slider class="my-slider" @change="fColorChange" block-size="25" value="0" min="-100" max="100"
-						activeColor="red" backgroundColor="green" block-color="grey" show-value></slider>
-					<view @click="fPrvUpload" hover-class="hover" :style="{width: bW}"><text>上传</text></view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	"use strict";
-	const tH = 50;
-	export default {
-		name: "xy-imgResiz",
-		data() {
-			return {
-				csH: '0px',
-				sD: 'none',
-				sT: '-10000px',
-				pT: '-10000px',
-				iS: {},
-				sS: {},
-				sO: true,
-				bW: '19%',
-				bD: 'flex',
-				tp: 0,
-				imgSrc: {
-					imgSrc: ''
-				},
-			};
-		},
-		watch: {
-			avatarSrc() {
-				this.imgSrc.imgSrc = this.avatarSrc;
-			}
-		},
-		props: {
-			avatarSrc: '',
-			avatarStyle: '',
-			selWidth: '',
-			selHeight: '',
-			expWidth: '',
-			expHeight: '',
-			minScale: '',
-			maxScale: '',
-			canScale: '',
-			canRotate: '',
-			lockWidth: '',
-			lockHeight: '',
-			stretch: '',
-			lock: '',
-			fileType: '',
-			noTab: '',
-			inner: '',
-			quality: '',
-			index: '',
-			bgImage: '',
-		},
-		created() {
-			this.cc = uni.createCanvasContext('avatar-canvas', this);
-			this.cco = uni.createCanvasContext('oper-canvas', this);
-			this.ccp = uni.createCanvasContext('prv-canvas', this);
-			this.qlty = parseFloat(this.quality) || 1;
-			this.imgSrc.imgSrc = this.avatarSrc;
-			this.letRotate = (this.canRotate === false || this.inner === true || this.inner === 'true' || this
-				.canRotate === 'false') ? 0 : 1;
-			this.letScale = (this.canScale === false || this.canScale === 'false') ? 0 : 1;
-			this.isin = (this.inner === true || this.inner === 'true') ? 1 : 0;
-			this.indx = this.index || undefined;
-			this.mnScale = parseFloat(this.minScale) || 0.3;
-			this.mxScale = parseFloat(this.maxScale) || 4;
-			this.noBar = (this.noTab === true || this.noTab === 'true') ? 1 : 0;
-			this.stc = this.stretch;
-			this.lck = this.lock;
-			this.fType = this.fileType === 'jpg' ? 'jpg' : 'png';
-			if (this.isin || !this.letRotate) {
-				this.bW = '24%';
-				this.bD = 'none';
-			} else {
-				this.bW = '19%';
-				this.bD = 'flex';
-			}
-
-			if (this.noBar) {
-				this.fWindowResize();
-			} else {
-				uni.showTabBar({
-					fail: () => {
-						this.noBar = 1;
-					},
-					success: () => {
-						this.noBar = 0;
-					},
-					complete: (res) => {
-						this.fWindowResize();
-					}
-				});
-			}
-		},
-		methods: {
-			fWindowResize() {
-				let sysInfo = uni.getSystemInfoSync();
-				this.platform = sysInfo.platform;
-				this.wW = sysInfo.windowWidth;
-
-				// #ifdef H5
-				this.drawTop = sysInfo.windowTop;
-				// #endif
-				// #ifndef H5
-				this.drawTop = 0;
-				// #endif
-
-				// #ifdef MP-ALIPAY
-				this.wH = sysInfo.screenHeight - sysInfo.statusBarHeight - sysInfo.titleBarHeight;
-				this.csH = this.wH - tH + 'px';
-				// #endif
-
-				// #ifndef MP-ALIPAY
-				this.wH = sysInfo.windowHeight;
-				if (!this.noBar) this.wH += tH;
-				this.csH = this.wH - tH + 'px';
-				// #endif
-
-				this.tp = this.csH;
-				// #ifdef H5
-				this.tp = sysInfo.windowTop + parseInt(this.csH) + 'px';
-				// #endif
-
-				this.pxRatio = this.wW / 750;
-
-				let style = this.avatarStyle;
-				if (style && style !== true && (style = style.trim())) {
-					style = style.split(';');
-					let obj = {};
-					for (let v of style) {
-						if (!v) continue;
-						v = v.trim().split(':');
-						if (v[1].toString().indexOf('upx') >= 0) {
-							let arr = v[1].trim().split(' ');
-							for (let k in arr) {
-								if (!arr[k]) continue;
-								if (arr[k].toString().indexOf('upx') >= 0) {
-									arr[k] = parseFloat(arr[k]) * this.pxRatio + 'px';
-								}
-							}
-							v[1] = arr.join(' ');
-						}
-						obj[v[0].trim()] = v[1].trim();
-					}
-					this.iS = obj;
-				}
-
-				this.expWidth && (this.eW = this.expWidth.toString().indexOf('upx') >= 0 ? parseInt(this.expWidth) * this
-					.pxRatio :
-					parseInt(this.expWidth));
-				this.expHeight && (this.eH = this.expHeight.toString().indexOf('upx') >= 0 ? parseInt(this.expHeight) *
-					this.pxRatio :
-					parseInt(this.expHeight));
-
-				if (this.sD === 'flex') {
-					this.fDrawInit(true);
-				}
-				this.fHideImg();
-			},
-			fSelect() {
-				if (this.fSelecting) return;
-				this.fSelecting = true;
-				setTimeout(() => {
-					this.fSelecting = false;
-				}, 500);
-
-				uni.chooseImage({
-					count: 1,
-					sizeType: ['original', 'compressed'],
-					sourceType: ['album', 'camera'],
-					success: (r) => {
-						// #ifdef MP-ALIPAY
-						uni.showLoading();
-						// #endif
-						// #ifndef MP-ALIPAY
-						uni.showLoading({
-							title: '加载中...',
-							mask: true
-						});
-						// #endif
-
-						let path = this.imgPath = r.tempFilePaths[0];
-						uni.getImageInfo({
-							src: path,
-							success: r => {
-								this.imgWidth = r.width;
-								this.imgHeight = r.height;
-								this.path = path;
-								if (!this.hasSel) {
-									let style = this.sS || {};
-									if (this.selWidth && this.selHeight) {
-										let sW = this.selWidth.toString().indexOf('upx') >= 0 ?
-											parseInt(this.selWidth) * this.pxRatio : parseInt(
-												this.selWidth),
-											sH = this.selHeight.toString().indexOf('upx') >= 0 ?
-											parseInt(this.selHeight) * this.pxRatio : parseInt(
-												this.selHeight);
-										style.width = sW + 'px';
-										style.height = sH + 'px';
-										style.top = ((this.wH - sH - tH) | 0) / 2 + 'px';
-										style.left = ((this.wW - sW) | 0) / 2 + 'px';
-									} else {
-										uni.showModal({
-											title: '裁剪框的宽或高没有设置',
-											showCancel: false
-										})
-										return;
-									}
-									this.sS = style;
-								}
-
-								if (this.noBar) {
-									this.fDrawInit(true);
-								} else {
-									uni.hideTabBar({
-										complete: () => {
-											this.fDrawInit(true);
-										}
-									});
-								}
-							},
-							fail: () => {
-								uni.showToast({
-									title: "请选择正确图片",
-									duration: 2000,
-								})
-							},
-							complete() {
-								uni.hideLoading();
-							}
-						});
-
-					}
-				})
-			},
-			fUpload() {
-				if (this.fUploading) return;
-				this.fUploading = true;
-				setTimeout(() => {
-					this.fUploading = false;
-				}, 1000)
-
-				let style = this.sS,
-					x = parseInt(style.left),
-					y = parseInt(style.top),
-					width = parseInt(style.width),
-					height = parseInt(style.height),
-					expWidth = this.eW || (width * this.pixelRatio),
-					expHeight = this.eH || (height * this.pixelRatio);
-
-				// #ifdef MP-ALIPAY
-				uni.showLoading();
-				// #endif
-				// #ifndef MP-ALIPAY
-				uni.showLoading({
-					title: '加载中...',
-					mask: true
-				});
-				// #endif
-
-				this.sD = 'none';
-				this.sT = '-10000px';
-				this.hasSel = false;
-				this.fHideImg();
-				// #ifdef MP-ALIPAY
-				this.cc.toTempFilePath({
-					x: x,
-					y: y,
-					width: width,
-					height: height,
-					destWidth: expWidth,
-					destHeight: expHeight,
-					fileType: this.fType,
-					quality: this.qlty,
-					success: (r) => {
-						r = r.apFilePath;
-						this.$emit("upload", {
-							avatar: this.imgSrc,
-							path: r,
-							index: this.indx,
-							data: this.rtn,
-							base64: this.base64 || null
-						});
-					},
-					fail: (res) => {
-						uni.showToast({
-							title: "error1",
-							duration: 2000,
-						})
-					},
-					complete: () => {
-						uni.hideLoading();
-						this.noBar || uni.showTabBar();
-						this.$emit("end");
-					}
-				});
-				// #endif
-				// #ifndef MP-ALIPAY
-				uni.canvasToTempFilePath({
-					x: x,
-					y: y,
-					width: width,
-					height: height,
-					destWidth: expWidth,
-					destHeight: expHeight,
-					canvasId: 'avatar-canvas',
-					fileType: this.fType,
-					quality: this.qlty,
-					success: (r) => {
-						r = r.tempFilePath;
-						// #ifdef H5
-						this.btop(r).then((r) => {
-							this.$emit("upload", {
-								avatar: this.imgSrc,
-								path: r,
-								index: this.indx,
-								data: this.rtn,
-								base64: this.base64 || null
-							});
-							return;
-						})
-						// #endif
-						// #ifndef H5
-						this.$emit("upload", {
-							avatar: this.imgSrc,
-							path: r,
-							index: this.indx,
-							data: this.rtn,
-							base64: this.base64 || null
-						});
-						// #endif
-					},
-					fail: (res) => {
-						uni.showToast({
-							title: "error1",
-							duration: 2000,
-						})
-					},
-					complete: () => {
-						uni.hideLoading();
-						this.noBar || uni.showTabBar();
-						this.$emit("end");
-					}
-				}, this);
-				// #endif
-			},
-			fPrvUpload() {
-				if (this.fPrvUploading) return;
-				this.fPrvUploading = true;
-				setTimeout(() => {
-					this.fPrvUploading = false;
-				}, 1000)
-
-				let style = this.sS,
-					destWidth = parseInt(style.width),
-					destHeight = parseInt(style.height),
-					prvX = this.prvX,
-					prvY = this.prvY,
-					prvWidth = this.prvWidth,
-					prvHeight = this.prvHeight,
-					expWidth = this.eW || (parseInt(style.width) * this.pixelRatio),
-					expHeight = this.eH || (parseInt(style.height) * this.pixelRatio);
-
-				// #ifdef MP-ALIPAY
-				uni.showLoading();
-				// #endif
-				// #ifndef MP-ALIPAY
-				uni.showLoading({
-					title: '加载中...',
-					mask: true
-				});
-				// #endif
-
-				this.sD = 'none';
-				this.sT = '-10000px';
-				this.hasSel = false;
-				this.fHideImg();
-				// #ifdef MP-ALIPAY
-				this.ccp.toTempFilePath({
-					x: prvX,
-					y: prvY,
-					width: prvWidth,
-					height: prvHeight,
-					destWidth: expWidth,
-					destHeight: expHeight,
-					fileType: this.fType,
-					quality: this.qlty,
-					success: (r) => {
-						r = r.apFilePath;
-						this.$emit("upload", {
-							avatar: this.imgSrc,
-							path: r,
-							index: this.indx,
-							data: this.rtn,
-							base64: this.base64 || null
-						});
-					},
-					fail: () => {
-						uni.showToast({
-							title: "error_prv",
-							duration: 2000,
-						})
-					},
-					complete: () => {
-						uni.hideLoading();
-						this.noBar || uni.showTabBar();
-						this.$emit("end");
-					}
-				});
-				// #endif
-				// #ifndef MP-ALIPAY
-				uni.canvasToTempFilePath({
-					x: prvX,
-					y: prvY,
-					width: prvWidth,
-					height: prvHeight,
-					destWidth: expWidth,
-					destHeight: expHeight,
-					canvasId: 'prv-canvas',
-					fileType: this.fType,
-					quality: this.qlty,
-					success: (r) => {
-						r = r.tempFilePath;
-						// #ifdef H5
-						this.btop(r).then((r) => {
-							this.$emit("upload", {
-								avatar: this.imgSrc,
-								path: r,
-								index: this.indx,
-								data: this.rtn,
-								base64: this.base64 || null
-							});
-						})
-						// #endif
-						// #ifndef H5
-						this.$emit("upload", {
-							avatar: this.imgSrc,
-							path: r,
-							index: this.indx,
-							data: this.rtn,
-							base64: this.base64 || null
-						});
-						// #endif
-					},
-					fail: () => {
-						uni.showToast({
-							title: "error_prv",
-							duration: 2000,
-						})
-					},
-					complete: () => {
-						uni.hideLoading();
-						this.noBar || uni.showTabBar();
-						this.$emit("end");
-					}
-				}, this);
-				// #endif
-			},
-			fDrawInit(ini = false) {
-				let allWidth = this.wW,
-					allHeight = this.wH,
-					imgWidth = this.imgWidth,
-					imgHeight = this.imgHeight,
-					imgRadio = imgWidth / imgHeight,
-					useWidth = allWidth - 40,
-					useHeight = allHeight - tH - 80,
-					useRadio = useWidth / useHeight,
-					sW = parseInt(this.sS.width),
-					sH = parseInt(this.sS.height);
-
-				this.fixWidth = 0;
-				this.fixHeight = 0;
-				this.lckWidth = 0;
-				this.lckHeight = 0;
-				switch (this.stc) {
-					case 'x':
-						this.fixWidth = 1;
-						break;
-					case 'y':
-						this.fixHeight = 1;
-						break;
-					case 'long':
-						if (imgRadio > 1) this.fixWidth = 1;
-						else this.fixHeight = 1;
-						break;
-					case 'short':
-						if (imgRadio > 1) this.fixHeight = 1;
-						else this.fixWidth = 1;
-						break;
-					case 'longSel':
-						if (sW > sH) this.fixWidth = 1;
-						else this.fixHeight = 1;
-						break;
-					case 'shortSel':
-						if (sW > sH) this.fixHeight = 1;
-						else this.fixWidth = 1;
-						break;
-				}
-				switch (this.lck) {
-					case 'x':
-						this.lckWidth = 1;
-						break;
-					case 'y':
-						this.lckHeight = 1;
-						break;
-					case 'long':
-						if (imgRadio > 1) this.lckWidth = 1;
-						else this.lckHeight = 1;
-						break;
-					case 'short':
-						if (imgRadio > 1) this.lckHeight = 1;
-						else this.lckWidth = 1;
-						break;
-					case 'longSel':
-						if (sW > sH) this.lckWidth = 1;
-						else this.lckHeight = 1;
-						break;
-					case 'shortSel':
-						if (sW > sH) this.lckHeight = 1;
-						else this.lckWidth = 1;
-						break;
-				}
-				if (this.fixWidth) {
-					useWidth = sW;
-					useHeight = useWidth / imgRadio;
-				} else if (this.fixHeight) {
-					useHeight = sH;
-					useWidth = useHeight * imgRadio;
-				} else if (imgRadio < useRadio) {
-					if (imgHeight < useHeight) {
-						useWidth = imgWidth;
-						useHeight = imgHeight;
-					} else {
-						useWidth = useHeight * imgRadio;
-					}
-				} else {
-					if (imgWidth < useWidth) {
-						useWidth = imgWidth;
-						useHeight = imgHeight;
-					} else {
-						useHeight = useWidth / imgRadio;
-					}
-				}
-				if (this.isin) {
-					if (useWidth < sW) {
-						useWidth = sW;
-						useHeight = useWidth / imgRadio;
-						this.lckHeight = 0;
-					}
-					if (useHeight < sH) {
-						useHeight = sH;
-						useWidth = useHeight * imgRadio;
-						this.lckWidth = 0;
-					}
-				}
-
-				this.scaleSize = 1;
-				this.rotateDeg = 0;
-				this.posWidth = (allWidth - useWidth) / 2 | 0;
-				this.posHeight = (allHeight - useHeight - tH) / 2 | 0;
-				this.useWidth = useWidth | 0;
-				this.useHeight = useHeight | 0;
-				this.centerX = this.posWidth + useWidth / 2;
-				this.centerY = this.posHeight + useHeight / 2;
-				this.focusX = 0;
-				this.focusY = 0;
-
-				let style = this.sS,
-					left = parseInt(style.left),
-					top = parseInt(style.top),
-					width = parseInt(style.width),
-					height = parseInt(style.height),
-					canvas = this.canvas,
-					canvasOper = this.canvasOper,
-					cc = this.cc,
-					cco = this.cco;
-
-				cco.beginPath();
-				cco.setLineWidth(3);
-				cco.setGlobalAlpha(1);
-				cco.setStrokeStyle('white');
-				cco.strokeRect(left, top, width, height);
-
-				cco.setFillStyle('black');
-				cco.setGlobalAlpha(0.5);
-				cco.fillRect(0, 0, this.wW, top);
-				cco.fillRect(0, top, left, height);
-				cco.fillRect(0, top + height, this.wW, this.wH - height - top - tH);
-				cco.fillRect(left + width, top, this.wW - width - left, height);
-
-				cco.setGlobalAlpha(1);
-				cco.setStrokeStyle('red');
-				cco.moveTo(left + 15, top);
-				cco.lineTo(left, top);
-				cco.lineTo(left, top + 15);
-				cco.moveTo(left + width - 15, top);
-				cco.lineTo(left + width, top);
-				cco.lineTo(left + width, top + 15);
-				cco.moveTo(left + 15, top + height);
-				cco.lineTo(left, top + height);
-				cco.lineTo(left, top + height - 15);
-				cco.moveTo(left + width - 15, top + height);
-				cco.lineTo(left + width, top + height);
-				cco.lineTo(left + width, top + height - 15);
-				cco.stroke();
-
-				cco.draw(false, () => {
-					if (ini) {
-						this.sD = 'flex';
-						this.sT = this.drawTop + 'px';
-						this.fDrawImage(true);
-					}
-				});
-				this.$emit("init");
-			},
-			fDrawImage(ini = false) {
-				let tm_now = Date.now();
-				if (tm_now - this.drawTm < 20) return;
-				this.drawTm = tm_now;
-
-				let cc = this.cc,
-					imgWidth = this.useWidth * this.scaleSize,
-					imgHeight = this.useHeight * this.scaleSize;
-
-				// #ifdef MP-ALIPAY	
-				cc.save();
-				// #endif
-
-				if (this.bgImage) {
-					// #ifdef MP-ALIPAY
-					cc.clearRect(0, 0, this.wW, this.wH - tH);
-					// #endif
-					// #ifndef MP-ALIPAY
-					cc.drawImage(this.bgImage, 0, 0, this.wW, this.wH - tH);
-					// #endif
-				} else {
-					cc.fillRect(0, 0, this.wW, this.wH - tH);
-				}
-
-				if (this.isin) {
-					let cx = this.focusX * (this.scaleSize - 1),
-						cy = this.focusY * (this.scaleSize - 1);
-
-					cc.translate(this.centerX, this.centerY);
-					cc.rotate(this.rotateDeg * Math.PI / 180);
-					cc.drawImage(this.imgPath, this.posWidth - this.centerX - cx, this.posHeight - this.centerY - cy,
-						imgWidth, imgHeight);
-
-				} else {
-					cc.translate(this.posWidth + imgWidth / 2, this.posHeight + imgHeight / 2);
-					cc.rotate(this.rotateDeg * Math.PI / 180);
-					cc.drawImage(this.imgPath, -imgWidth / 2, -imgHeight / 2, imgWidth, imgHeight);
-				}
-
-				cc.draw(false);
-
-				// #ifdef MP-ALIPAY
-				cc.restore();
-				// #endif
-			},
-			fPreview() {
-				if (this.fPreviewing) return;
-				this.fPreviewing = true;
-				setTimeout(() => {
-					this.fPreviewing = false;
-				}, 1000);
-
-				let style = this.sS,
-					x = parseInt(style.left),
-					y = parseInt(style.top),
-					width = parseInt(style.width),
-					height = parseInt(style.height);
-
-				// #ifdef MP-ALIPAY
-				uni.showLoading();
-				// #endif
-				// #ifndef MP-ALIPAY
-				uni.showLoading({
-					title: '加载中...',
-					mask: true
-				});
-				// #endif
-
-				// #ifdef MP-ALIPAY
-				this.cc.toTempFilePath({
-					x: x,
-					y: y,
-					width: width,
-					height: height,
-					expWidth: width * this.pixelRatio,
-					expHeight: height * this.pixelRatio,
-					fileType: this.fType,
-					quality: this.qlty,
-					success: (r) => {
-						this.prvImgTmp = r = r.apFilePath;
-						let ccp = this.ccp,
-							prvX = this.wW,
-							prvY = parseInt(this.csH),
-							prvWidth = parseInt(this.sS.width),
-							prvHeight = parseInt(this.sS.height),
-							useWidth = prvX - 40,
-							useHeight = prvY - 80,
-							radio = useWidth / prvWidth,
-							rHeight = prvHeight * radio;
-						if (rHeight < useHeight) {
-							prvWidth = useWidth;
-							prvHeight = rHeight;
-						} else {
-							radio = useHeight / prvHeight;
-							prvWidth *= radio;
-							prvHeight = useHeight;
-						}
-						ccp.fillRect(0, 0, prvX, prvY);
-						this.prvX = prvX = ((prvX - prvWidth) / 2) | 0;
-						this.prvY = prvY = ((prvY - prvHeight) / 2) | 0;
-						this.prvWidth = prvWidth = prvWidth | 0;
-						this.prvHeight = prvHeight = prvHeight | 0;
-						ccp.drawImage(r, prvX, prvY, prvWidth, prvHeight);
-						ccp.draw(false);
-
-						this.sO = false;
-						this.pT = '0';
-					},
-					fail: () => {
-						uni.showToast({
-							title: "error2",
-							duration: 2000,
-						})
-					},
-					complete: () => {
-						uni.hideLoading();
-					}
-				});
-				// #endif
-
-				// #ifndef MP-ALIPAY
-				uni.canvasToTempFilePath({
-					x: x,
-					y: y,
-					width: width,
-					height: height,
-					expWidth: width * this.pixelRatio,
-					expHeight: height * this.pixelRatio,
-					canvasId: 'avatar-canvas',
-					fileType: this.fType,
-					quality: this.qlty,
-					success: (r) => {
-						this.prvImgTmp = r = r.tempFilePath;
-
-						let ccp = this.ccp,
-							prvX = this.wW,
-							prvY = parseInt(this.csH);
-
-						// #ifndef H5||MP-WEIXIN||APP-PLUS
-						prvY += tH;
-						// #endif
-						// #ifdef APP-PLUS
-						if (this.platform === 'android') {
-							prvY += tH;
-						}
-						// #endif
-
-						let prvWidth = parseInt(this.sS.width),
-							prvHeight = parseInt(this.sS.height),
-							useWidth = prvX - 40,
-							useHeight = prvY - 80,
-							radio = useWidth / prvWidth,
-							rHeight = prvHeight * radio;
-						if (rHeight < useHeight) {
-							prvWidth = useWidth;
-							prvHeight = rHeight;
-						} else {
-							radio = useHeight / prvHeight;
-							prvWidth *= radio;
-							prvHeight = useHeight;
-						}
-
-						ccp.fillRect(0, 0, prvX, prvY);
-						this.prvX = prvX = ((prvX - prvWidth) / 2) | 0;
-						this.prvY = prvY = ((prvY - prvHeight) / 2) | 0;
-						this.prvWidth = prvWidth = prvWidth | 0;
-						this.prvHeight = prvHeight = prvHeight | 0;
-						ccp.drawImage(r, prvX, prvY, prvWidth, prvHeight);
-						ccp.draw(false);
-
-						// #ifdef H5
-						this.btop(r).then((r) => {
-							this.sO = false;
-							this.pT = this.drawTop + 'px';
-						})
-						// #endif
-
-						this.sO = false;
-						// if (this.platform === 'android') this.sO = false;
-						this.pT = this.drawTop + 'px';
-					},
-					fail: () => {
-						uni.showToast({
-							title: "error2",
-							duration: 2000,
-						})
-					},
-					complete: () => {
-						uni.hideLoading();
-					}
-				}, this);
-				// #endif
-			},
-			fChooseImg(params = undefined, data = undefined, index = undefined, ) {
-				if (params) {
-					let sW = params.selWidth,
-						sH = params.selHeight,
-						expWidth = params.expWidth,
-						expHeight = params.expHeight,
-						quality = params.quality,
-						canRotate = params.canRotate,
-						canScale = params.canScale,
-						minScale = params.minScale,
-						maxScale = params.maxScale,
-						stretch = params.stretch,
-						fileType = params.fileType,
-						inner = params.inner,
-						lock = params.lock;
-
-					expWidth && (this.eW = expWidth.toString().indexOf('upx') >= 0 ? parseInt(expWidth) * this.pxRatio :
-						parseInt(
-							expWidth));
-					expHeight && (this.eH = expHeight.toString().indexOf('upx') >= 0 ? parseInt(expHeight) * this.pxRatio :
-						parseInt(
-							expHeight));
-					this.letRotate = (canRotate === false || inner === true || inner === 'true' || canRotate === 'false') ?
-						0 : 1;
-					this.letScale = (canScale === false || canScale === 'false') ? 0 : 1;
-					this.qlty = parseFloat(quality) || 1;
-					this.mnScale = parseFloat(minScale) || 0.3;
-					this.mxScale = parseFloat(maxScale) || 4;
-					this.stc = stretch;
-					this.isin = (inner === true || inner === 'true') ? 1 : 0;
-					this.fType = fileType === 'jpg' ? 'jpg' : 'png';
-					this.lck = lock;
-					if (this.isin || !this.letRotate) {
-						this.bW = '24%';
-						this.bD = 'none';
-					} else {
-						this.bW = '19%';
-						this.bD = 'flex';
-					}
-
-					if (sW && sH) {
-						sW = sW.toString().indexOf('upx') >= 0 ? parseInt(sW) * this.pxRatio : parseInt(sW);
-						sH = sH.toString().indexOf('upx') >= 0 ? parseInt(sH) * this.pxRatio : parseInt(sH);
-						this.sS.width = sW + 'px';
-						this.sS.height = sH + 'px';
-						this.sS.top = ((this.wH - sH - tH) | 0) / 2 + 'px';
-						this.sS.left = ((this.wW - sW) | 0) / 2 + 'px';
-						this.hasSel = true;
-					}
-				}
-				this.rtn = data;
-				this.indx = index;
-				this.fSelect();
-			},
-			fRotate() {
-				this.rotateDeg += 90 - this.rotateDeg % 90;
-				this.fDrawImage();
-			},
-			fStart(e) {
-				let touches = e.touches,
-					touch0 = touches[0],
-					touch1 = touches[1];
-
-				this.touch0 = touch0;
-				this.touch1 = touch1;
-
-				if (touch1) {
-					let x = touch1.x - touch0.x,
-						y = touch1.y - touch0.y;
-					this.fgDistance = Math.sqrt(x * x + y * y);
-				}
-			},
-			fMove(e) {
-				let touches = e.touches,
-					touch0 = touches[0],
-					touch1 = touches[1];
-
-				if (touch1) {
-					let x = touch1.x - touch0.x,
-						y = touch1.y - touch0.y,
-						fgDistance = Math.sqrt(x * x + y * y),
-						scaleSize = 0.005 * (fgDistance - this.fgDistance),
-						beScaleSize = this.scaleSize + scaleSize;
-
-					do {
-						if (!this.letScale) break;
-						if (beScaleSize < this.mnScale) break;
-						if (beScaleSize > this.mxScale) break;
-
-						let growX = this.useWidth * scaleSize / 2,
-							growY = this.useHeight * scaleSize / 2;
-						if (this.isin) {
-							let imgWidth = this.useWidth * beScaleSize,
-								imgHeight = this.useHeight * beScaleSize,
-								l = this.posWidth - growX,
-								t = this.posHeight - growY,
-								r = l + imgWidth,
-								b = t + imgHeight,
-								left = parseInt(this.sS.left),
-								top = parseInt(this.sS.top),
-								width = parseInt(this.sS.width),
-								height = parseInt(this.sS.height),
-								right = left + width,
-								bottom = top + height,
-								cx, cy;
-
-							if (imgWidth <= width || imgHeight <= height) break;
-							this.cx = cx = this.focusX * beScaleSize - this.focusX,
-								this.cy = cy = this.focusY * beScaleSize - this.focusY;
-							this.posWidth -= growX;
-							this.posHeight -= growY;
-							if (this.posWidth - cx > left) {
-								this.posWidth = left + cx;
-							}
-							if (this.posWidth + imgWidth - cx < right) {
-								this.posWidth = right - imgWidth + cx;
-							}
-							if (this.posHeight - cy > top) {
-								this.posHeight = top + cy;
-							}
-							if (this.posHeight + imgHeight - cy < bottom) {
-								this.posHeight = bottom - imgHeight + cy;
-							}
-						} else {
-							this.posWidth -= growX;
-							this.posHeight -= growY;
-						}
-
-						this.scaleSize = beScaleSize;
-					} while (0);
-					this.fgDistance = fgDistance;
-					if (touch1.x !== touch0.x && this.letRotate) {
-						x = (this.touch1.y - this.touch0.y) / (this.touch1.x - this.touch0.x);
-						y = (touch1.y - touch0.y) / (touch1.x - touch0.x);
-						this.rotateDeg += Math.atan((y - x) / (1 + x * y)) * 180 / Math.PI;
-						this.touch0 = touch0;
-						this.touch1 = touch1;
-					}
-
-					this.fDrawImage();
-				} else if (this.touch0) {
-					let x = touch0.x - this.touch0.x,
-						y = touch0.y - this.touch0.y,
-						beX = this.posWidth + x,
-						beY = this.posHeight + y;
-					if (this.isin) {
-						let imgWidth = this.useWidth * this.scaleSize,
-							imgHeight = this.useHeight * this.scaleSize,
-							l = beX,
-							t = beY,
-							r = l + imgWidth,
-							b = t + imgHeight,
-							left = parseInt(this.sS.left),
-							top = parseInt(this.sS.top),
-							right = left + parseInt(this.sS.width),
-							bottom = top + parseInt(this.sS.height),
-							cx, cy;
-
-						this.cx = cx = this.focusX * this.scaleSize - this.focusX;
-						this.cy = cy = this.focusY * this.scaleSize - this.focusY;
-
-						if (!this.lckWidth && Math.abs(x) < 100) {
-							if (left < l - cx) {
-								this.posWidth = left + cx;
-							} else if (right > r - cx) {
-								this.posWidth = right - imgWidth + cx;
-							} else {
-								this.posWidth = beX;
-								this.focusX -= x;
-							}
-						}
-						if (!this.lckHeight && Math.abs(y) < 100) {
-							if (top < t - cy) {
-								this.focusY -= (top + cy - this.posHeight);
-								this.posHeight = top + cy;
-							} else if (bottom > b - cy) {
-								this.focusY -= (bottom + cy - (this.posHeight + imgHeight));
-								this.posHeight = bottom - imgHeight + cy;
-							} else {
-								this.posHeight = beY;
-								this.focusY -= y;
-							}
-						}
-					} else {
-						if (Math.abs(x) < 100 && !this.lckWidth) this.posWidth = beX;
-						if (Math.abs(y) < 100 && !this.lckHeight) this.posHeight = beY;
-						this.focusX -= x;
-						this.focusY -= y;
-					}
-
-					this.touch0 = touch0;
-					this.fDrawImage();
-				}
-			},
-			fEnd(e) {
-				let touches = e.touches,
-					touch0 = touches && touches[0],
-					touch1 = touches && touches[1];
-				if (touch0) {
-					this.touch0 = touch0;
-				} else {
-					this.touch0 = null;
-					this.touch1 = null;
-				}
-			},
-			fHideImg() {
-				this.prvImg = '';
-				this.pT = '-10000px';
-				this.sO = true;
-				this.prvImgData = null;
-				this.target = null;
-			},
-			fClose() {
-				this.sD = 'none';
-				this.sT = '-10000px';
-				this.hasSel = false;
-				this.fHideImg();
-				this.noBar || uni.showTabBar();
-				this.$emit("end");
-			},
-			fGetImgData() {
-				return new Promise((resolve, reject) => {
-					let prvX = this.prvX,
-						prvY = this.prvY,
-						prvWidth = this.prvWidth,
-						prvHeight = this.prvHeight;
-					// #ifdef MP-ALIPAY
-					this.ccp.getImageData({
-						x: prvX,
-						y: prvY,
-						width: prvWidth,
-						height: prvHeight,
-						success(res) {
-							resolve(res.data);
-						},
-						fail(err) {
-							reject(err);
-						}
-					}, this);
-					// #endif
-					// #ifndef MP-ALIPAY
-					uni.canvasGetImageData({
-						canvasId: 'prv-canvas',
-						x: prvX,
-						y: prvY,
-						width: prvWidth,
-						height: prvHeight,
-						success(res) {
-							resolve(res.data);
-						},
-						fail(err) {
-							reject(err);
-						}
-					}, this);
-					// #endif
-				});
-			},
-			async fColorChange(e) {
-				let tm_now = Date.now();
-				if (tm_now - this.prvTm < 100) return;
-				this.prvTm = tm_now;
-
-				// #ifdef MP-ALIPAY
-				uni.showLoading();
-				// #endif
-				// #ifndef MP-ALIPAY
-				uni.showLoading({
-					title: '加载中...',
-					mask: true
-				});
-				// #endif
-
-				if (!this.prvImgData) {
-					if (!(this.prvImgData = await this.fGetImgData().catch(() => {
-							uni.showToast({
-								title: "error_read",
-								duration: 2000,
-							})
-						}))) return;
-
-					this.target = new Uint8ClampedArray(this.prvImgData.length);
-				}
-
-				let data = this.prvImgData,
-					target = this.target,
-					i = e.detail.value,
-					r, g, b, a, h, s, l, d, p, q, t, min, max, hK, tR, tG, tB;
-
-				if (i === 0) {
-					target = data;
-				} else {
-					i = (i + 100) / 200;
-					if (i < 0.005) i = 0;
-					if (i > 0.995) i = 1;
-					for (let n = data.length - 1; n >= 0; n -= 4) {
-						r = data[n - 3] / 255;
-						g = data[n - 2] / 255;
-						b = data[n - 1] / 255;
-						max = Math.max(r, g, b);
-						min = Math.min(r, g, b);
-						d = max - min;
-						if (max === min) {
-							h = 0;
-						} else if (max === r && g >= b) {
-							h = 60 * ((g - b) / d);
-						} else if (max === r && g < b) {
-							h = 60 * ((g - b) / d) + 360;
-						} else if (max === g) {
-							h = 60 * ((b - r) / d) + 120;
-						} else if (max === b) {
-							h = 60 * ((r - g) / d) + 240;
-						}
-						l = (max + min) / 2;
-						if (l === 0 || max === min) {
-							s = 0;
-						} else if (0 < l && l <= 0.5) {
-							s = d / (2 * l);
-						} else if (l > 0.5) {
-							s = d / (2 - 2 * l);
-						}
-						data[n] && (a = data[n]);
-
-						if (i < 0.5) {
-							s = s * i / 0.5;
-						} else if (i > 0.5) {
-							s = 2 * s + 2 * i - (s * i / 0.5) - 1;
-						}
-
-						if (s === 0) {
-							r = g = b = Math.round(l * 255);
-						} else {
-							if (l < 0.5) {
-								q = l * (1 + s);
-							} else if (l >= 0.5) {
-								q = l + s - (l * s);
-							}
-							p = 2 * l - q;
-							hK = h / 360;
-							tR = hK + 1 / 3;
-							tG = hK;
-							tB = hK - 1 / 3;
-							let correctRGB = (t) => {
-								if (t < 0) {
-									return t + 1.0;
-								}
-								if (t > 1) {
-									return t - 1.0;
-								}
-								return t;
-							};
-							let createRGB = (t) => {
-								if (t < (1 / 6)) {
-									return p + ((q - p) * 6 * t);
-								} else if (t >= (1 / 6) && t < (1 / 2)) {
-									return q;
-								} else if (t >= (1 / 2) && t < (2 / 3)) {
-									return p + ((q - p) * 6 * ((2 / 3) - t));
-								}
-								return p;
-							};
-							r = tR = Math.round(createRGB(correctRGB(tR)) * 255);
-							g = tG = Math.round(createRGB(correctRGB(tG)) * 255);
-							b = tB = Math.round(createRGB(correctRGB(tB)) * 255);
-						}
-						a && (target[n] = a);
-						target[n - 3] = r;
-						target[n - 2] = g;
-						target[n - 1] = b;
-					}
-				}
-
-				let prvX = this.prvX,
-					prvY = this.prvY,
-					prvWidth = this.prvWidth,
-					prvHeight = this.prvHeight;
-
-				// #ifdef MP-ALIPAY
-				this.ccp.putImageData({
-					x: prvX,
-					y: prvY,
-					width: prvWidth,
-					height: prvHeight,
-					data: target,
-					fail() {
-						uni.showToast({
-							title: 'error_put',
-							duration: 2000
-						})
-					},
-					complete() {
-						uni.hideLoading();
-					}
-				}, this);
-				// #endif
-
-				// #ifndef MP-ALIPAY
-				uni.canvasPutImageData({
-					canvasId: 'prv-canvas',
-					x: prvX,
-					y: prvY,
-					width: prvWidth,
-					height: prvHeight,
-					data: target,
-					fail() {
-						uni.showToast({
-							title: 'error_put',
-							duration: 2000
-						})
-					},
-					complete() {
-						uni.hideLoading();
-					}
-				}, this);
-				// #endif
-			},
-			btop(base64) {
-				this.base64 = base64;
-				return new Promise(function(resolve, reject) {
-					var arr = base64.split(','),
-						mime = arr[0].match(/:(.*?);/)[1],
-						bstr = atob(arr[1]),
-						n = bstr.length,
-						u8arr = new Uint8Array(n);
-					while (n--) {
-						u8arr[n] = bstr.charCodeAt(n);
-					}
-					return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([u8arr], {
-						type: mime
-					})));
-				});
-			},
-		}
-	}
-</script>
-
-<style>
-	.my-canvas {
-		display: flex;
-		position: fixed !important;
-		background: #000000;
-		left: 0;
-		z-index: 100000;
-		width: 100%;
-	}
-
-	.my-avatar {
-		width: 160rpx;
-		height: 160rpx;
-	}
-
-	.oper-canvas {
-		display: flex;
-		position: fixed !important;
-		left: 0;
-		z-index: 100001;
-		width: 100%;
-	}
-
-	.prv-canvas {
-		display: flex;
-		position: fixed !important;
-		background: #000000;
-		left: 0;
-		z-index: 200000;
-		width: 100%;
-	}
-
-	.oper-wrapper {
-		height: 50px;
-		position: fixed !important;
-		box-sizing: border-box;
-		border: 1px solid #F1F1F1;
-		background: #ffffff;
-		width: 100%;
-		left: 0;
-		bottom: 0;
-		z-index: 100009;
-		flex-direction: row;
-	}
-
-	.oper {
-		display: flex;
-		flex-direction: column;
-		justify-content: center;
-		padding: 10upx 20upx;
-		width: 100%;
-		height: 100%;
-		box-sizing: border-box;
-		align-self: center;
-	}
-
-	.btn-wrapper {
-		display: flex;
-		flex-direction: row;
-		/* #ifndef H5 */
-		flex-grow: 1;
-		/* #endif */
-		/* #ifdef H5 */
-		height: 50px;
-		/* #endif */
-		justify-content: space-between;
-	}
-
-	.btn-wrapper view {
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		font-size: 16px;
-		color: #333;
-		border: 1px solid #f1f1f1;
-		border-radius: 6%;
-	}
-
-	.hover {
-		background: #f1f1f1;
-		border-radius: 6%;
-	}
-
-	.clr-wrapper {
-		display: flex;
-		flex-direction: row;
-		flex-grow: 1;
-	}
-
-	.clr-wrapper view {
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		font-size: 16px;
-		color: #333;
-		border: 1px solid #f1f1f1;
-		border-radius: 6%;
-	}
-
-	.my-slider {
-		flex-grow: 1;
-	}
-</style>

+ 0 - 114
components/xy-popup/index.vue

@@ -1,114 +0,0 @@
-<template>
-	<u-popup :show="show" @close="close" :safeAreaInsetBottom="safeAreaInsetBottom&&mode=='bottom'" @open="open" :mode="mode">
-		<view class="pop-content">
-			<slot name="title">
-				<view class="popup-title" v-if="title">
-					{{title}}
-				</view>
-			</slot>
-			<slot />
-			<slot name="botton">
-				<view class="popup-btn" v-if="showBtn">
-					<xbutton width="200rpx" size="large" bgColor="#fff" color="#2C6FF3" borderColor="#2C6FF3" @click="close">取消</xbutton>
-					<xbutton delay="1500" width="200rpx" size="large" @click="submit">确定</xbutton>
-				</view>
-			</slot>
-		</view>
-	</u-popup>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-
-			}
-		},
-		props: {
-			mode: {
-				type: String,
-				require: false,
-				default: 'bottom'
-			},
-			show: {
-				type: Boolean,
-				require: true,
-				default: false
-			},
-			showBtn: {
-				type: Boolean,
-				require: true,
-				default: true
-			},
-			title: {
-				type: String,
-				require: true,
-				default: ''
-			},
-			safeAreaInsetBottom:{
-				type: Boolean,
-				require: false,
-				default: true
-			}
-		},
-
-		model: {
-			prop: 'value',
-			event: 'change'
-		},
-
-		watch: {
-			value: {
-				handler(newVal, oldVal) {
-					this.fileList = newVal
-				},
-				immediate: true,
-				deep: true
-			}
-		},
-
-		methods: {
-			close() {
-				this.$emit('close', false)
-			},
-			open() {
-				this.$emit('open', true)
-			},
-			
-			submit(){
-				this.$emit('confirm')
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.pop-content{
-		box-shadow: 0 2rpx 10rpx 0 rgba(0,0,0,0.1);
-	}
-	
-	.popup-title {
-		font-size: 32rpx;
-		font-weight: bold;
-		padding: 24rpx;
-	}
-
-	.popup-btn {
-		display: flex;
-		flex-flow: row nowrap;
-		justify-content: space-around;
-		width: 100%;
-		padding:50rpx 24rpx 24rpx;
-
-		.cu-btn {
-			background-color: #2C6FF3;
-			color: #fff;
-			width: 200rpx;
-		}
-
-		.cu-btn1 {
-			background-color: green;
-		}
-
-	}
-</style>

+ 0 - 30
config.js

@@ -1,30 +0,0 @@
-// 应用全局配置
-module.exports = {
-	baseUrl: process.env.NODE_ENV=='production'?'https://api.mxrvending.com:9050':'https://ai.tanbin.vip', 
-	// baseUrl: 'https://api.mxrvending.com:9050',
-	//mock数据
-	// baseUrl: 'http://119.96.213.127:9010/mock',
-	// 应用信息
-	appInfo: {
-		// 应用名称
-		name: "MXR-app",
-		// 应用版本
-		version: "1.0.0",
-		// 应用logo
-		logo: "/static/logo.png",
-		// 官方网站
-		site_url: "http://www.xyvending.com/",
-		// 政策协议
-		agreements: [
-			{
-				title: "隐私政策",
-				url: "https://ruoyi.vip/protocol.html"
-			},
-			
-			{
-				title: "用户服务协议",
-				url: "https://ruoyi.vip/protocol.html"
-			}
-		]
-	}
-}

+ 24 - 0
index.html

@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport =
+        'CSS' in window &&
+        typeof CSS.supports === 'function' &&
+        (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+          (coverSupport ? ', viewport-fit=cover' : '') +
+          '" />'
+      )
+    </script>
+    <title>喵星人平台管理系统小程序</title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 9 - 0
jsconfig.json

@@ -0,0 +1,9 @@
+{
+  "compilerOptions": {
+    "types": [
+      "@dcloudio/types",
+      "miniprogram-api-typings",
+      "mini-types"
+    ]
+  }
+}

+ 0 - 36
main.js

@@ -1,36 +0,0 @@
-import Vue from 'vue'
-import App from './App'
-import store from './store' // store
-import plugins from './plugins' // plugins
-import './permission' // permission
-import xbutton from '@/components/xy-button' //自定义按钮组件
-import xpopup from '@/components/xy-popup' //自定义弹框组件
-import {
-	checkPermi
-} from '@/utils/permission.js'
-
-import getdict from './utils/getDict.js'
-Vue.use(plugins)
-
-// 引入:uView-UI
-import uView from '@/uni_modules/uview-ui';
-Vue.use(uView);
-
-import share from './utils/share.js'
-Vue.mixin(share)
-
-Vue.component('xbutton', xbutton)
-Vue.component('xpopup', xpopup)
-Vue.prototype.getDict = getdict;
-Vue.prototype.$store = store
-Vue.prototype.checkPermi = checkPermi
-
-Vue.config.productionTip = false
-
-App.mpType = 'app'
-
-const app = new Vue({
-	...App
-})
-
-app.$mount()

+ 11839 - 0
package-lock.json

@@ -0,0 +1,11839 @@
+{
+  "name": "uni-preset-vue",
+  "version": "0.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "uni-preset-vue",
+      "version": "0.0.0",
+      "dependencies": {
+        "@dcloudio/uni-app": "3.0.0-3090920231225001",
+        "@dcloudio/uni-app-plus": "3.0.0-3090920231225001",
+        "@dcloudio/uni-components": "3.0.0-3090920231225001",
+        "@dcloudio/uni-h5": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-alipay": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-baidu": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-jd": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-kuaishou": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-lark": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-qq": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-toutiao": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-weixin": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-xhs": "3.0.0-3090920231225001",
+        "@dcloudio/uni-quickapp-webview": "3.0.0-3090920231225001",
+        "clipboard": "^2.0.11",
+        "dayjs": "^1.11.7",
+        "pinia": "^2.0.36",
+        "uview-plus": "^3.1.45",
+        "vue": "3.2.47",
+        "vue-i18n": "9.10.1"
+      },
+      "devDependencies": {
+        "@dcloudio/types": "3.4.8",
+        "@dcloudio/uni-automator": "3.0.0-3090920231225001",
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-stacktracey": "3.0.0-3090920231225001",
+        "@dcloudio/vite-plugin-uni": "3.0.0-3090920231225001",
+        "@vue/runtime-core": "3.4.21",
+        "sass": "^1.62.1",
+        "sass-loader": "^10.4.1",
+        "vite": "4.0.3"
+      }
+    },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz",
+      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@antfu/utils": {
+      "version": "0.7.7",
+      "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.7.tgz",
+      "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.21.4",
+      "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.21.4.tgz",
+      "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
+      "dependencies": {
+        "@babel/highlight": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.3.tgz",
+      "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.22.1.tgz",
+      "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==",
+      "dependencies": {
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.21.4",
+        "@babel/generator": "^7.22.0",
+        "@babel/helper-compilation-targets": "^7.22.1",
+        "@babel/helper-module-transforms": "^7.22.1",
+        "@babel/helpers": "^7.22.0",
+        "@babel/parser": "^7.22.0",
+        "@babel/template": "^7.21.9",
+        "@babel/traverse": "^7.22.1",
+        "@babel/types": "^7.22.0",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.2",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.22.3.tgz",
+      "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==",
+      "dependencies": {
+        "@babel/types": "^7.22.3",
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jsesc": "^2.5.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+      "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz",
+      "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.22.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz",
+      "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==",
+      "dependencies": {
+        "@babel/compat-data": "^7.22.0",
+        "@babel/helper-validator-option": "^7.21.0",
+        "browserslist": "^4.21.3",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz",
+      "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-environment-visitor": "^7.22.1",
+        "@babel/helper-function-name": "^7.21.0",
+        "@babel/helper-member-expression-to-functions": "^7.22.0",
+        "@babel/helper-optimise-call-expression": "^7.18.6",
+        "@babel/helper-replace-supers": "^7.22.1",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/helper-split-export-declaration": "^7.18.6",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-regexp-features-plugin": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz",
+      "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "regexpu-core": "^5.3.1",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-define-polyfill-provider": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz",
+      "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.17.7",
+        "@babel/helper-plugin-utils": "^7.16.7",
+        "debug": "^4.1.1",
+        "lodash.debounce": "^4.0.8",
+        "resolve": "^1.14.2",
+        "semver": "^6.1.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0-0"
+      }
+    },
+    "node_modules/@babel/helper-environment-visitor": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz",
+      "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-function-name": {
+      "version": "7.21.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
+      "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+      "dependencies": {
+        "@babel/template": "^7.20.7",
+        "@babel/types": "^7.21.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-hoist-variables": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+      "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+      "dependencies": {
+        "@babel/types": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz",
+      "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.22.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.21.4",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz",
+      "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==",
+      "dependencies": {
+        "@babel/types": "^7.21.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz",
+      "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==",
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.22.1",
+        "@babel/helper-module-imports": "^7.21.4",
+        "@babel/helper-simple-access": "^7.21.5",
+        "@babel/helper-split-export-declaration": "^7.18.6",
+        "@babel/helper-validator-identifier": "^7.19.1",
+        "@babel/template": "^7.21.9",
+        "@babel/traverse": "^7.22.1",
+        "@babel/types": "^7.22.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+      "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz",
+      "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-remap-async-to-generator": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
+      "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-wrap-function": "^7.18.9",
+        "@babel/types": "^7.18.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-replace-supers": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz",
+      "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.22.1",
+        "@babel/helper-member-expression-to-functions": "^7.22.0",
+        "@babel/helper-optimise-call-expression": "^7.18.6",
+        "@babel/template": "^7.21.9",
+        "@babel/traverse": "^7.22.1",
+        "@babel/types": "^7.22.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-simple-access": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz",
+      "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==",
+      "dependencies": {
+        "@babel/types": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.20.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+      "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.20.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-split-export-declaration": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+      "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+      "dependencies": {
+        "@babel/types": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz",
+      "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.19.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+      "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.21.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
+      "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-wrap-function": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+      "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-function-name": "^7.19.0",
+        "@babel/template": "^7.18.10",
+        "@babel/traverse": "^7.20.5",
+        "@babel/types": "^7.20.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.22.3.tgz",
+      "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==",
+      "dependencies": {
+        "@babel/template": "^7.21.9",
+        "@babel/traverse": "^7.22.1",
+        "@babel/types": "^7.22.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz",
+      "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.18.6",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.3.tgz",
+      "integrity": "sha512-vrukxyW/ep8UD1UDzOYpTKQ6abgjFoeG6L+4ar9+c5TN9QnlqiOi6QK7LSR5ewm/ERyGkT/Ai6VboNrxhbr9Uw==",
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz",
+      "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz",
+      "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/plugin-transform-optional-chaining": "^7.22.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.21.0",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz",
+      "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-create-class-features-plugin": "^7.21.0",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
+      "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-bigint": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-class-static-block": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-assertions": {
+      "version": "7.20.0",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz",
+      "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.19.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz",
+      "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.21.4",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz",
+      "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.20.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-private-property-in-object": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-top-level-await": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.21.4",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz",
+      "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.20.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+      "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-arrow-functions": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz",
+      "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-generator-functions": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz",
+      "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/helper-remap-async-to-generator": "^7.18.9",
+        "@babel/plugin-syntax-async-generators": "^7.8.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-to-generator": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+      "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-remap-async-to-generator": "^7.18.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz",
+      "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoping": {
+      "version": "7.21.0",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz",
+      "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.20.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-class-properties": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz",
+      "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-class-static-block": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz",
+      "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.12.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-classes": {
+      "version": "7.21.0",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz",
+      "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-function-name": "^7.21.0",
+        "@babel/helper-optimise-call-expression": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-replace-supers": "^7.20.7",
+        "@babel/helper-split-export-declaration": "^7.18.6",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-computed-properties": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz",
+      "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/template": "^7.20.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-destructuring": {
+      "version": "7.21.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz",
+      "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.20.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dotall-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz",
+      "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-duplicate-keys": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
+      "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dynamic-import": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz",
+      "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz",
+      "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-export-namespace-from": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz",
+      "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-for-of": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz",
+      "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-function-name": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
+      "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.18.9",
+        "@babel/helper-function-name": "^7.18.9",
+        "@babel/helper-plugin-utils": "^7.18.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-json-strings": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz",
+      "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-literals": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
+      "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz",
+      "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-member-expression-literals": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz",
+      "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-amd": {
+      "version": "7.20.11",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+      "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helper-plugin-utils": "^7.20.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-commonjs": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz",
+      "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.21.5",
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/helper-simple-access": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-systemjs": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz",
+      "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-hoist-variables": "^7.18.6",
+        "@babel/helper-module-transforms": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/helper-validator-identifier": "^7.19.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-umd": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz",
+      "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz",
+      "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-new-target": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz",
+      "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz",
+      "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-numeric-separator": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz",
+      "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-rest-spread": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz",
+      "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.22.3",
+        "@babel/helper-compilation-targets": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.22.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-super": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz",
+      "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/helper-replace-supers": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-optional-catch-binding": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz",
+      "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-optional-chaining": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz",
+      "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-parameters": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz",
+      "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-private-methods": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz",
+      "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-private-property-in-object": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz",
+      "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-create-class-features-plugin": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-property-literals": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz",
+      "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-regenerator": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz",
+      "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "regenerator-transform": "^0.15.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-reserved-words": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz",
+      "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-shorthand-properties": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz",
+      "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-spread": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+      "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-sticky-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz",
+      "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-template-literals": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
+      "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typeof-symbol": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
+      "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typescript": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz",
+      "integrity": "sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-create-class-features-plugin": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/plugin-syntax-typescript": "^7.21.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-escapes": {
+      "version": "7.21.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz",
+      "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-property-regex": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz",
+      "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz",
+      "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz",
+      "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/preset-env": {
+      "version": "7.22.2",
+      "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.22.2.tgz",
+      "integrity": "sha512-UPNK9pgphMULvA2EMKIWHU90C47PKyuvQ8pE1MzH7l9PgFcRabdrHhlePpBuWxYZQ+TziP2nycKoI5C1Yhdm9Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.22.0",
+        "@babel/helper-compilation-targets": "^7.22.1",
+        "@babel/helper-plugin-utils": "^7.21.5",
+        "@babel/helper-validator-option": "^7.21.0",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.0",
+        "@babel/plugin-proposal-private-property-in-object": "^7.21.0",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-import-assertions": "^7.20.0",
+        "@babel/plugin-syntax-import-attributes": "^7.22.0",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+        "@babel/plugin-syntax-top-level-await": "^7.14.5",
+        "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+        "@babel/plugin-transform-arrow-functions": "^7.21.5",
+        "@babel/plugin-transform-async-generator-functions": "^7.22.0",
+        "@babel/plugin-transform-async-to-generator": "^7.20.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
+        "@babel/plugin-transform-block-scoping": "^7.21.0",
+        "@babel/plugin-transform-class-properties": "^7.22.0",
+        "@babel/plugin-transform-class-static-block": "^7.22.0",
+        "@babel/plugin-transform-classes": "^7.21.0",
+        "@babel/plugin-transform-computed-properties": "^7.21.5",
+        "@babel/plugin-transform-destructuring": "^7.21.3",
+        "@babel/plugin-transform-dotall-regex": "^7.18.6",
+        "@babel/plugin-transform-duplicate-keys": "^7.18.9",
+        "@babel/plugin-transform-dynamic-import": "^7.22.1",
+        "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
+        "@babel/plugin-transform-export-namespace-from": "^7.22.0",
+        "@babel/plugin-transform-for-of": "^7.21.5",
+        "@babel/plugin-transform-function-name": "^7.18.9",
+        "@babel/plugin-transform-json-strings": "^7.22.0",
+        "@babel/plugin-transform-literals": "^7.18.9",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.22.0",
+        "@babel/plugin-transform-member-expression-literals": "^7.18.6",
+        "@babel/plugin-transform-modules-amd": "^7.20.11",
+        "@babel/plugin-transform-modules-commonjs": "^7.21.5",
+        "@babel/plugin-transform-modules-systemjs": "^7.22.0",
+        "@babel/plugin-transform-modules-umd": "^7.18.6",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.0",
+        "@babel/plugin-transform-new-target": "^7.22.0",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.0",
+        "@babel/plugin-transform-numeric-separator": "^7.22.0",
+        "@babel/plugin-transform-object-rest-spread": "^7.22.0",
+        "@babel/plugin-transform-object-super": "^7.18.6",
+        "@babel/plugin-transform-optional-catch-binding": "^7.22.0",
+        "@babel/plugin-transform-optional-chaining": "^7.22.0",
+        "@babel/plugin-transform-parameters": "^7.22.0",
+        "@babel/plugin-transform-private-methods": "^7.22.0",
+        "@babel/plugin-transform-private-property-in-object": "^7.22.0",
+        "@babel/plugin-transform-property-literals": "^7.18.6",
+        "@babel/plugin-transform-regenerator": "^7.21.5",
+        "@babel/plugin-transform-reserved-words": "^7.18.6",
+        "@babel/plugin-transform-shorthand-properties": "^7.18.6",
+        "@babel/plugin-transform-spread": "^7.20.7",
+        "@babel/plugin-transform-sticky-regex": "^7.18.6",
+        "@babel/plugin-transform-template-literals": "^7.18.9",
+        "@babel/plugin-transform-typeof-symbol": "^7.18.9",
+        "@babel/plugin-transform-unicode-escapes": "^7.21.5",
+        "@babel/plugin-transform-unicode-property-regex": "^7.22.0",
+        "@babel/plugin-transform-unicode-regex": "^7.18.6",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.22.0",
+        "@babel/preset-modules": "^0.1.5",
+        "@babel/types": "^7.22.0",
+        "babel-plugin-polyfill-corejs2": "^0.4.2",
+        "babel-plugin-polyfill-corejs3": "^0.8.1",
+        "babel-plugin-polyfill-regenerator": "^0.5.0",
+        "core-js-compat": "^3.30.2",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-modules": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+      "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+        "@babel/plugin-transform-dotall-regex": "^7.4.4",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/regjsgen": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+      "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+      "dev": true
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.3.tgz",
+      "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==",
+      "dependencies": {
+        "regenerator-runtime": "^0.13.11"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.21.9",
+      "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.21.9.tgz",
+      "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==",
+      "dependencies": {
+        "@babel/code-frame": "^7.21.4",
+        "@babel/parser": "^7.21.9",
+        "@babel/types": "^7.21.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.22.1",
+      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.1.tgz",
+      "integrity": "sha512-lAWkdCoUFnmwLBhIRLciFntGYsIIoC6vIbN8zrLPqBnJmPu7Z6nzqnKd7FsxQUNAvZfVZ0x6KdNvNp8zWIOHSQ==",
+      "dependencies": {
+        "@babel/code-frame": "^7.21.4",
+        "@babel/generator": "^7.22.0",
+        "@babel/helper-environment-visitor": "^7.22.1",
+        "@babel/helper-function-name": "^7.21.0",
+        "@babel/helper-hoist-variables": "^7.18.6",
+        "@babel/helper-split-export-declaration": "^7.18.6",
+        "@babel/parser": "^7.22.0",
+        "@babel/types": "^7.22.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.22.3",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.22.3.tgz",
+      "integrity": "sha512-P3na3xIQHTKY4L0YOG7pM8M8uoUIB910WQaSiiMCZUC2Cy8XFEQONGABFnHWBa2gpGKODTAJcNhi5Zk0sLRrzg==",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.21.5",
+        "@babel/helper-validator-identifier": "^7.19.1",
+        "to-fast-properties": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@bcoe/v8-coverage": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@dcloudio/types": {
+      "version": "3.4.8",
+      "resolved": "https://registry.npmjs.org/@dcloudio/types/-/types-3.4.8.tgz",
+      "integrity": "sha512-IPXuoghLv7qNPOnRuP7vC5++MdRHhE0U7EMw9ia//uOh69fFXZiRTfoHd51+nzciD6R50gqYhbrCCZIxnxhM9Q=="
+    },
+    "node_modules/@dcloudio/uni-app": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-app/-/uni-app-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-NsGrGjNmHc2zH1c5eqnHwSxuMNse+RknCQWIIWnnz+Q8lqHc1I9zf2mzxYXyNBHy4VhGRY2zblhkUyWLtGRaaA==",
+      "dependencies": {
+        "@dcloudio/uni-cloud": "3.0.0-3090920231225001",
+        "@dcloudio/uni-components": "3.0.0-3090920231225001",
+        "@dcloudio/uni-i18n": "3.0.0-3090920231225001",
+        "@dcloudio/uni-push": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-stat": "3.0.0-3090920231225001",
+        "@vue/shared": "3.2.47"
+      },
+      "peerDependencies": {
+        "@dcloudio/types": "^3.3.2"
+      }
+    },
+    "node_modules/@dcloudio/uni-app-plus": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-plus/-/uni-app-plus-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-TCzWHbwuheEBSzpTqpHh/imhj4Rkwdg48m9C7ZLqun5runI056TEUdrpfuLBVuwsttk5NSpqm11ywS7GSSM7Mg==",
+      "dependencies": {
+        "@dcloudio/uni-app-uts": "3.0.0-3090920231225001",
+        "@dcloudio/uni-app-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-app-vue": "3.0.0-3090920231225001",
+        "debug": "^4.3.3",
+        "fs-extra": "^10.0.0",
+        "licia": "^1.29.0",
+        "postcss-selector-parser": "^6.0.6"
+      }
+    },
+    "node_modules/@dcloudio/uni-app-uts": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-uts/-/uni-app-uts-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-61At6ZKh9SpHMuewxtZEOuDS1hkwFs5AecqavFAZWovVQR30it2e5zSN4kwq/ZM1An/HFs0TLXV3YBnx9Q07oA==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@babel/types": "^7.20.7",
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-i18n": "3.0.0-3090920231225001",
+        "@dcloudio/uni-nvue-styler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@jridgewell/gen-mapping": "^0.3.3",
+        "@jridgewell/trace-mapping": "^0.3.19",
+        "@rollup/pluginutils": "^4.2.0",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/compiler-sfc": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "debug": "^4.3.3",
+        "es-module-lexer": "^1.2.1",
+        "estree-walker": "^2.0.2",
+        "fs-extra": "^10.0.0",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2",
+        "unplugin-auto-import": "^0.16.7"
+      }
+    },
+    "node_modules/@dcloudio/uni-app-vite": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-vite/-/uni-app-vite-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-MkmI3qzsGYrT787lRMyhb/DdIF9mE/BbhrExwM/RBshnVzl6rjQIKx5lIG94t58WIaP7Jcl/pJw+IPAe1FTQyQ==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-i18n": "3.0.0-3090920231225001",
+        "@dcloudio/uni-nvue-styler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@rollup/pluginutils": "^4.2.0",
+        "@vitejs/plugin-vue": "^4.2.1",
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/compiler-sfc": "3.2.47",
+        "debug": "^4.3.3",
+        "fs-extra": "^10.0.0",
+        "picocolors": "^1.0.0"
+      }
+    },
+    "node_modules/@dcloudio/uni-app-vue": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-vue/-/uni-app-vue-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-D7I4jGSnpBihSXXeckRSD152Da2N2vKDtGF1sbNe2m1R04W36AkVUtzFGpSOml4MNIedCGtzGWXKaX7rIU+mFA=="
+    },
+    "node_modules/@dcloudio/uni-automator": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-automator/-/uni-automator-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-6PKcEJK6VAARpEtsFUypFEu6DeAminijHJb63x6oK1lIt0VlJFGjXuCTBbFQTf6uLFSsUGMV4wcCmh2NswXxmg==",
+      "dev": true,
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "address": "^1.1.2",
+        "cross-env": "^7.0.3",
+        "debug": "^4.3.3",
+        "default-gateway": "^6.0.3",
+        "fs-extra": "^10.0.0",
+        "jsonc-parser": "^3.2.0",
+        "licia": "^1.29.0",
+        "merge": "^2.1.1",
+        "qrcode-reader": "^1.0.4",
+        "qrcode-terminal": "^0.12.0",
+        "ws": "^8.4.2"
+      },
+      "peerDependencies": {
+        "jest": "27.0.4",
+        "jest-environment-node": "27.5.1"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-6Pt2nCRI57OwIoqBNctPTQ05oJPTZGlocylmrbpUy8Q5Z2eyQNlnA/jTm9L5tM6nnfJKzBE/yOBMOgJDsVWNYw==",
+      "dependencies": {
+        "@ampproject/remapping": "^2.1.2",
+        "@babel/core": "^7.21.3",
+        "@babel/parser": "^7.16.4",
+        "@babel/types": "^7.20.7",
+        "@dcloudio/uni-i18n": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@intlify/core-base": "9.1.9",
+        "@intlify/shared": "9.1.9",
+        "@intlify/vue-devtools": "9.1.9",
+        "@rollup/pluginutils": "^4.2.0",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/compiler-sfc": "3.2.47",
+        "@vue/server-renderer": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "autoprefixer": "^10.4.14",
+        "base64url": "^3.0.1",
+        "chokidar": "^3.5.3",
+        "compare-versions": "^3.6.0",
+        "debug": "^4.3.3",
+        "es-module-lexer": "^1.2.1",
+        "esbuild": "^0.17.5",
+        "estree-walker": "^2.0.2",
+        "fast-glob": "^3.2.11",
+        "fs-extra": "^10.0.0",
+        "hash-sum": "^2.0.0",
+        "jsonc-parser": "^3.0.0",
+        "magic-string": "^0.30.0",
+        "merge": "^2.1.1",
+        "mime": "^3.0.0",
+        "module-alias": "^2.2.2",
+        "os-locale-s-fix": "^1.0.8-fix-1",
+        "picocolors": "^1.0.0",
+        "postcss-import": "^14.0.2",
+        "postcss-load-config": "^3.1.1",
+        "postcss-modules": "^4.3.0",
+        "postcss-selector-parser": "^6.0.6",
+        "resolve": "^1.22.1",
+        "tapable": "^2.2.0",
+        "xregexp": "3.1.0"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/android-arm": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
+      "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/android-arm64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
+      "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/android-x64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
+      "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/darwin-arm64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
+      "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/darwin-x64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
+      "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
+      "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/freebsd-x64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
+      "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-arm": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
+      "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-arm64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
+      "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-ia32": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
+      "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-loong64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
+      "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-mips64el": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
+      "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
+      "cpu": [
+        "mips64el"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-ppc64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
+      "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
+      "cpu": [
+        "ppc64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-riscv64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
+      "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-s390x": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
+      "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
+      "cpu": [
+        "s390x"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/linux-x64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
+      "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/netbsd-x64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
+      "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/openbsd-x64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
+      "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/sunos-x64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
+      "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/win32-arm64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
+      "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/win32-ia32": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
+      "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/@esbuild/win32-x64": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
+      "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@dcloudio/uni-cli-shared/node_modules/esbuild": {
+      "version": "0.17.19",
+      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.17.19.tgz",
+      "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/android-arm": "0.17.19",
+        "@esbuild/android-arm64": "0.17.19",
+        "@esbuild/android-x64": "0.17.19",
+        "@esbuild/darwin-arm64": "0.17.19",
+        "@esbuild/darwin-x64": "0.17.19",
+        "@esbuild/freebsd-arm64": "0.17.19",
+        "@esbuild/freebsd-x64": "0.17.19",
+        "@esbuild/linux-arm": "0.17.19",
+        "@esbuild/linux-arm64": "0.17.19",
+        "@esbuild/linux-ia32": "0.17.19",
+        "@esbuild/linux-loong64": "0.17.19",
+        "@esbuild/linux-mips64el": "0.17.19",
+        "@esbuild/linux-ppc64": "0.17.19",
+        "@esbuild/linux-riscv64": "0.17.19",
+        "@esbuild/linux-s390x": "0.17.19",
+        "@esbuild/linux-x64": "0.17.19",
+        "@esbuild/netbsd-x64": "0.17.19",
+        "@esbuild/openbsd-x64": "0.17.19",
+        "@esbuild/sunos-x64": "0.17.19",
+        "@esbuild/win32-arm64": "0.17.19",
+        "@esbuild/win32-ia32": "0.17.19",
+        "@esbuild/win32-x64": "0.17.19"
+      }
+    },
+    "node_modules/@dcloudio/uni-cloud": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-+k8cnrQZlBYbY01Li9rR5PBcxxvn/i8sHpj+i3rbzJioks4nneR64ZP14Zisu07v5VwLcjuZNdI8Ato7KZjyUA==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-i18n": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/shared": "3.2.47",
+        "fast-glob": "^3.2.11"
+      }
+    },
+    "node_modules/@dcloudio/uni-components": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-components/-/uni-components-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-fyqPOzmEjgfhwrElZH+yTBjqbCzefgZTkbZrgPaQkvXRT8sJpsTpcjF8wNPLo0dB+9XppkNAJDy+c9EkDJGeKQ==",
+      "dependencies": {
+        "@dcloudio/uni-cloud": "3.0.0-3090920231225001",
+        "@dcloudio/uni-h5": "3.0.0-3090920231225001",
+        "@dcloudio/uni-i18n": "3.0.0-3090920231225001"
+      }
+    },
+    "node_modules/@dcloudio/uni-h5": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5/-/uni-h5-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-q3YR+wESXb9JdFOJdoX8I7ER2TTOvY23fHFMMq1wZW49WLufMMu/BKM7FUeHtX9uteqMIVJDrzrjknwLgNUJiw==",
+      "dependencies": {
+        "@dcloudio/uni-h5-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-h5-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-i18n": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/server-renderer": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "debug": "^4.3.3",
+        "localstorage-polyfill": "^1.0.1",
+        "postcss-selector-parser": "^6.0.6",
+        "safe-area-insets": "^1.4.1",
+        "vue-router": "^4.1.6",
+        "xmlhttprequest": "^1.8.0"
+      }
+    },
+    "node_modules/@dcloudio/uni-h5-vite": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5-vite/-/uni-h5-vite-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-gyhFfI77gL2saPef0+3nQ9+mi//Vk/N7PeZCSxq6oRpHIUE3TkpB3xvQrPkciJPG8ivHX5BGcqcOdZt36qgBtA==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@rollup/pluginutils": "^4.2.0",
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/compiler-sfc": "3.2.47",
+        "@vue/server-renderer": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "debug": "^4.3.3",
+        "fs-extra": "^10.0.0",
+        "mime": "^3.0.0",
+        "module-alias": "^2.2.2"
+      }
+    },
+    "node_modules/@dcloudio/uni-h5-vue": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-v19rnmf+V+2G07ABjViyaLqDcVJReBVuAb0xuSzNiLIezQ3GRFJAf4XEjbk56BrrRfdDRaNJ+6lrWP5j1KI8nw==",
+      "dependencies": {
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/server-renderer": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-i18n": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-GUiyXxeLvunToD2LC1FybqtrLw/cbKmtO/Q3mwue0rEurhaTrabiVoOntP4n1t4QMaL+dFsex06cRbZgafqlIw=="
+    },
+    "node_modules/@dcloudio/uni-mp-alipay": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-alipay/-/uni-mp-alipay-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-zHcwqmFi9NtzW3cW9kAAjdfTbJ1YPrE8LKAbjHyp5XiytSRcTiuSqipBs4HgtVBijur8FPxrZtIYcGIQZQskBw==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-baidu": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-baidu/-/uni-mp-baidu-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-zhS+I+KL7ecmni2lwy6KL5gpCqPQ/7gygkqBqdNIOq9eDB7c4rlPF6w+j7WmeBWeZPZpccYaQnsn9W7swpnmRA==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-compiler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-weixin": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "jimp": "^0.10.1",
+        "licia": "^1.29.0",
+        "qrcode-reader": "^1.0.4",
+        "qrcode-terminal": "^0.12.0",
+        "ws": "^8.4.2"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-compiler": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-compiler/-/uni-mp-compiler-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-q9pgXG1gtN9VMaEQj4jlmHBkKAwFsKTCsZu4FsH4kpFoQoSgdEFH8VAHTWKA9reaUVLJGInO0Nsd+t9rZJi3EA==",
+      "dependencies": {
+        "@babel/generator": "^7.20.5",
+        "@babel/parser": "^7.16.4",
+        "@babel/types": "^7.20.7",
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "estree-walker": "^2.0.2"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-jd": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-jd/-/uni-mp-jd-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-n+zDI+dRyVgSnp8vcLnflxs7usMEy/sfx2FWB77XswPHiMOi8Wz7SK/CQln/ScKD0pRWDPiXcLh4WXS1u3H0Hg==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-compiler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-kuaishou": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-kuaishou/-/uni-mp-kuaishou-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-Z3VFtDNDUEGkHOs5hzB+HiOuJWxGsLh6jQYlGLwXFNmWJFYWGaEBsAA+NztWOB4fRB2JeYSoTu78Al3MWFRwzQ==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-compiler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-weixin": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-lark": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-lark/-/uni-mp-lark-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-LuXWe7vf2fncf1Hj0PpxKYCRWYwqhcz3kKkauNa9nVNjEwiD83UthW5oDxVWMCklIFjKw91mhe+zqq2Oc8bl1w==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-compiler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-toutiao": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-qq": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-qq/-/uni-mp-qq-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-f114i9LhYxfgHUFpSKcOHWL5ZqOttwbzNeK7vMRaqUSWX8VKxzXhqJ5OOKB2HeKyMZGJ50wxvyYNYiR01dBg+A==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/shared": "3.2.47",
+        "fs-extra": "^10.0.0"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-toutiao": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-toutiao/-/uni-mp-toutiao-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-g6fpZeUS2mBDIalhQEKXnkMAKUP+xGz4poJrjABMRu6L2ayXjOCYHFC0uZEIoagcD5zb3UN4ZrPaQvFtcErqRA==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-compiler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-vite": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-vite/-/uni-mp-vite-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-kcw5gPzIjMonakkT1PJtBwfr3PA6YKNxB+hJw2+gEnUFHCAVASXAOO1i7AmtWSqJsRI2FigIDDw1rjeMwY/BHg==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-i18n": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-compiler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/compiler-sfc": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "debug": "^4.3.3"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-vue": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-vue/-/uni-mp-vue-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-oSlZ9lynhc6f8q7GRQMecZIzUrxnh0pIByDS9zOaYyXfT8oemA7ai2FSpX+McpSQ43VhJfPHzeJbeK2V7F0Csg==",
+      "dependencies": {
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-weixin": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-weixin/-/uni-mp-weixin-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-XV43ox/P19pTjvjXrDeIrjmbH8VUeV/iUm7ufK77gCwSAEff2yZOd/FlmikQncQItJP1M7Sxv8DnilEbPeLoBA==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/shared": "3.2.47",
+        "jimp": "^0.10.1",
+        "licia": "^1.29.0",
+        "qrcode-reader": "^1.0.4",
+        "qrcode-terminal": "^0.12.0",
+        "ws": "^8.4.2"
+      }
+    },
+    "node_modules/@dcloudio/uni-mp-xhs": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-xhs/-/uni-mp-xhs-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-pY/OCLGNLChmTShAG41sb0AGxqJCqsioNu4fIEKcC2dj8JFOUdcFBYS7ZvhrVrVYCErM0H3GcmLla0cJZfUCjQ==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-compiler": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-nvue-styler": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-rUO12CpVcMV1pMof7w9cs6FpCKuLPhA3fU7Tfl19XVJXv0IY//rX2aucZW0kOpw45RVJyAHbPBFuQKz7kEiGlA==",
+      "dependencies": {
+        "@vue/shared": "3.2.47",
+        "parse-css-font": "^4.0.0",
+        "postcss": "^8.4.23"
+      }
+    },
+    "node_modules/@dcloudio/uni-push": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-push/-/uni-push-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-aqUWb1DeF9y9en3fx03eQTZzKLjUCvakJZtmQQFbj69lV2Zh/v/EWKWkF0iOOezPGBTHXJvVDQMWGkdj1ez19Q==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001"
+      }
+    },
+    "node_modules/@dcloudio/uni-quickapp-webview": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-quickapp-webview/-/uni-quickapp-webview-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-sFKH4WboIKvkVNEmxkhLvzE/Wya5YwFXdL/AoM8rxQO7DXP+eNOtMhapWz2NEKXN8XGM3WIVTjwyMINgg5+Ctw==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vite": "3.0.0-3090920231225001",
+        "@dcloudio/uni-mp-vue": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-shared": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-shared/-/uni-shared-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-OXx/KBMuxAGayThVNshnZ17qZJrxjcdFeGwWJrDeTHmCpg+/Yr5yK+ubCQjN2kc4jttwq2fIkqqNs2xe4QFlSQ==",
+      "dependencies": {
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@dcloudio/uni-stacktracey": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-stacktracey/-/uni-stacktracey-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-UN0qPDt6uTo2M9HxD4WgJHJIrCWLpUkseBOoOseZ2QVqfFCTQvLcH3ZVr7fx4gkoc5FDCp1YI2uiiS2AnjqZtA==",
+      "dev": true
+    },
+    "node_modules/@dcloudio/uni-stat": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-stat/-/uni-stat-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-gac3rONnRtLCSTXn2QhnwjsZJTfVA8uHRFyp5Uf03rQbu82MuNVOzi7p7Q3Y/0uiCHSldZ47hhmwbqtb/qdKOQ==",
+      "dependencies": {
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "debug": "^4.3.3"
+      }
+    },
+    "node_modules/@dcloudio/vite-plugin-uni": {
+      "version": "3.0.0-3090920231225001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-3090920231225001.tgz",
+      "integrity": "sha512-kV/J7yl5ojsd1NZZ1eMziRDrz+MPbjDMm6rWG3fyW1u8Kzj06jUzzi7HRlkaWiPJHAmeRWGDf/6RFoSd+8fYCg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/core": "^7.21.3",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-transform-typescript": "^7.20.7",
+        "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+        "@dcloudio/uni-shared": "3.0.0-3090920231225001",
+        "@rollup/pluginutils": "^4.2.0",
+        "@vitejs/plugin-legacy": "^4.0.3",
+        "@vitejs/plugin-vue": "^4.2.1",
+        "@vitejs/plugin-vue-jsx": "^3.0.1",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/compiler-sfc": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "cac": "6.7.9",
+        "debug": "^4.3.3",
+        "estree-walker": "^2.0.2",
+        "express": "^4.17.1",
+        "fast-glob": "^3.2.11",
+        "fs-extra": "^10.0.0",
+        "hash-sum": "^2.0.0",
+        "jsonc-parser": "^3.0.0",
+        "magic-string": "^0.30.0",
+        "picocolors": "^1.0.0",
+        "terser": "^5.4.0",
+        "unplugin-auto-import": "^0.16.7"
+      },
+      "bin": {
+        "uni": "bin/uni.js"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^4.0.0"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
+      "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
+      "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
+      "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
+      "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
+      "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
+      "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
+      "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
+      "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
+      "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
+      "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
+      "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
+      "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
+      "cpu": [
+        "mips64el"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
+      "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
+      "cpu": [
+        "ppc64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
+      "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
+      "cpu": [
+        "riscv64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
+      "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
+      "cpu": [
+        "s390x"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
+      "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
+      "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
+      "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
+      "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
+      "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
+      "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
+      "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@intlify/core-base": {
+      "version": "9.1.9",
+      "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.1.9.tgz",
+      "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==",
+      "dependencies": {
+        "@intlify/devtools-if": "9.1.9",
+        "@intlify/message-compiler": "9.1.9",
+        "@intlify/message-resolver": "9.1.9",
+        "@intlify/runtime": "9.1.9",
+        "@intlify/shared": "9.1.9",
+        "@intlify/vue-devtools": "9.1.9"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@intlify/devtools-if": {
+      "version": "9.1.9",
+      "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.1.9.tgz",
+      "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==",
+      "dependencies": {
+        "@intlify/shared": "9.1.9"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@intlify/message-compiler": {
+      "version": "9.1.9",
+      "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.1.9.tgz",
+      "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==",
+      "dependencies": {
+        "@intlify/message-resolver": "9.1.9",
+        "@intlify/shared": "9.1.9",
+        "source-map": "0.6.1"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@intlify/message-resolver": {
+      "version": "9.1.9",
+      "resolved": "https://registry.npmmirror.com/@intlify/message-resolver/-/message-resolver-9.1.9.tgz",
+      "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@intlify/runtime": {
+      "version": "9.1.9",
+      "resolved": "https://registry.npmmirror.com/@intlify/runtime/-/runtime-9.1.9.tgz",
+      "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==",
+      "dependencies": {
+        "@intlify/message-compiler": "9.1.9",
+        "@intlify/message-resolver": "9.1.9",
+        "@intlify/shared": "9.1.9"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@intlify/shared": {
+      "version": "9.1.9",
+      "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.1.9.tgz",
+      "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@intlify/vue-devtools": {
+      "version": "9.1.9",
+      "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz",
+      "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==",
+      "dependencies": {
+        "@intlify/message-resolver": "9.1.9",
+        "@intlify/runtime": "9.1.9",
+        "@intlify/shared": "9.1.9"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "get-package-type": "^0.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@istanbuljs/schema": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz",
+      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/console": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/console/-/console-27.5.1.tgz",
+      "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "jest-message-util": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/console/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/console/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@jest/console/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/@jest/console/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@jest/console/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/console/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/core": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/core/-/core-27.5.1.tgz",
+      "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/console": "^27.5.1",
+        "@jest/reporters": "^27.5.1",
+        "@jest/test-result": "^27.5.1",
+        "@jest/transform": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "emittery": "^0.8.1",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.9",
+        "jest-changed-files": "^27.5.1",
+        "jest-config": "^27.5.1",
+        "jest-haste-map": "^27.5.1",
+        "jest-message-util": "^27.5.1",
+        "jest-regex-util": "^27.5.1",
+        "jest-resolve": "^27.5.1",
+        "jest-resolve-dependencies": "^27.5.1",
+        "jest-runner": "^27.5.1",
+        "jest-runtime": "^27.5.1",
+        "jest-snapshot": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "jest-validate": "^27.5.1",
+        "jest-watcher": "^27.5.1",
+        "micromatch": "^4.0.4",
+        "rimraf": "^3.0.0",
+        "slash": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@jest/core/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/core/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@jest/core/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/@jest/core/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@jest/core/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/core/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/environment": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-27.5.1.tgz",
+      "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/fake-timers": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "jest-mock": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/fake-timers": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+      "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "@sinonjs/fake-timers": "^8.0.1",
+        "@types/node": "*",
+        "jest-message-util": "^27.5.1",
+        "jest-mock": "^27.5.1",
+        "jest-util": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/globals": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/globals/-/globals-27.5.1.tgz",
+      "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/environment": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "expect": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/reporters": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/reporters/-/reporters-27.5.1.tgz",
+      "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@bcoe/v8-coverage": "^0.2.3",
+        "@jest/console": "^27.5.1",
+        "@jest/test-result": "^27.5.1",
+        "@jest/transform": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.2",
+        "graceful-fs": "^4.2.9",
+        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-instrument": "^5.1.0",
+        "istanbul-lib-report": "^3.0.0",
+        "istanbul-lib-source-maps": "^4.0.0",
+        "istanbul-reports": "^3.1.3",
+        "jest-haste-map": "^27.5.1",
+        "jest-resolve": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "jest-worker": "^27.5.1",
+        "slash": "^3.0.0",
+        "source-map": "^0.6.0",
+        "string-length": "^4.0.1",
+        "terminal-link": "^2.0.0",
+        "v8-to-istanbul": "^8.1.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@jest/reporters/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/reporters/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@jest/reporters/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/@jest/reporters/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@jest/reporters/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/reporters/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/source-map": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/source-map/-/source-map-27.5.1.tgz",
+      "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "callsites": "^3.0.0",
+        "graceful-fs": "^4.2.9",
+        "source-map": "^0.6.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/test-result": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/test-result/-/test-result-27.5.1.tgz",
+      "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/console": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "collect-v8-coverage": "^1.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/test-sequencer": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+      "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/test-result": "^27.5.1",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^27.5.1",
+        "jest-runtime": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/transform": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/transform/-/transform-27.5.1.tgz",
+      "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.1.0",
+        "@jest/types": "^27.5.1",
+        "babel-plugin-istanbul": "^6.1.1",
+        "chalk": "^4.0.0",
+        "convert-source-map": "^1.4.0",
+        "fast-json-stable-stringify": "^2.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^27.5.1",
+        "jest-regex-util": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "micromatch": "^4.0.4",
+        "pirates": "^4.0.4",
+        "slash": "^3.0.0",
+        "source-map": "^0.6.1",
+        "write-file-atomic": "^3.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/transform/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/transform/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@jest/transform/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/@jest/transform/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@jest/transform/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/transform/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/types": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/@jest/types/-/types-27.5.1.tgz",
+      "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^3.0.0",
+        "@types/node": "*",
+        "@types/yargs": "^16.0.0",
+        "chalk": "^4.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/@jest/types/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/types/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@jest/types/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/@jest/types/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@jest/types/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jest/types/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@jimp/bmp": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/bmp/-/bmp-0.10.3.tgz",
+      "integrity": "sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "bmp-js": "^0.1.0",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/core": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/core/-/core-0.10.3.tgz",
+      "integrity": "sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "any-base": "^1.1.0",
+        "buffer": "^5.2.0",
+        "core-js": "^3.4.1",
+        "exif-parser": "^0.1.12",
+        "file-type": "^9.0.0",
+        "load-bmfont": "^1.3.1",
+        "mkdirp": "^0.5.1",
+        "phin": "^2.9.1",
+        "pixelmatch": "^4.0.2",
+        "tinycolor2": "^1.4.1"
+      }
+    },
+    "node_modules/@jimp/custom": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/custom/-/custom-0.10.3.tgz",
+      "integrity": "sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/core": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "node_modules/@jimp/gif": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/gif/-/gif-0.10.3.tgz",
+      "integrity": "sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "omggif": "^1.0.9"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/jpeg": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/jpeg/-/jpeg-0.10.3.tgz",
+      "integrity": "sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "jpeg-js": "^0.3.4"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-blit": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-blit/-/plugin-blit-0.10.3.tgz",
+      "integrity": "sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-blur": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-blur/-/plugin-blur-0.10.3.tgz",
+      "integrity": "sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-circle": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-circle/-/plugin-circle-0.10.3.tgz",
+      "integrity": "sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-color": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-color/-/plugin-color-0.10.3.tgz",
+      "integrity": "sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "tinycolor2": "^1.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-contain": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-contain/-/plugin-contain-0.10.3.tgz",
+      "integrity": "sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5",
+        "@jimp/plugin-blit": ">=0.3.5",
+        "@jimp/plugin-resize": ">=0.3.5",
+        "@jimp/plugin-scale": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-cover": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-cover/-/plugin-cover-0.10.3.tgz",
+      "integrity": "sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5",
+        "@jimp/plugin-crop": ">=0.3.5",
+        "@jimp/plugin-resize": ">=0.3.5",
+        "@jimp/plugin-scale": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-crop": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-crop/-/plugin-crop-0.10.3.tgz",
+      "integrity": "sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-displace": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-displace/-/plugin-displace-0.10.3.tgz",
+      "integrity": "sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-dither": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-dither/-/plugin-dither-0.10.3.tgz",
+      "integrity": "sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-fisheye": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.10.3.tgz",
+      "integrity": "sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-flip": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-flip/-/plugin-flip-0.10.3.tgz",
+      "integrity": "sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5",
+        "@jimp/plugin-rotate": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-gaussian": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.10.3.tgz",
+      "integrity": "sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-invert": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-invert/-/plugin-invert-0.10.3.tgz",
+      "integrity": "sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-mask": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-mask/-/plugin-mask-0.10.3.tgz",
+      "integrity": "sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-normalize": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-normalize/-/plugin-normalize-0.10.3.tgz",
+      "integrity": "sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-print": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-print/-/plugin-print-0.10.3.tgz",
+      "integrity": "sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "load-bmfont": "^1.4.0"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5",
+        "@jimp/plugin-blit": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-resize": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-resize/-/plugin-resize-0.10.3.tgz",
+      "integrity": "sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-rotate": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-rotate/-/plugin-rotate-0.10.3.tgz",
+      "integrity": "sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5",
+        "@jimp/plugin-blit": ">=0.3.5",
+        "@jimp/plugin-crop": ">=0.3.5",
+        "@jimp/plugin-resize": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-scale": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-scale/-/plugin-scale-0.10.3.tgz",
+      "integrity": "sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5",
+        "@jimp/plugin-resize": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-shadow": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-shadow/-/plugin-shadow-0.10.3.tgz",
+      "integrity": "sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5",
+        "@jimp/plugin-blur": ">=0.3.5",
+        "@jimp/plugin-resize": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/plugin-threshold": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugin-threshold/-/plugin-threshold-0.10.3.tgz",
+      "integrity": "sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5",
+        "@jimp/plugin-color": ">=0.8.0",
+        "@jimp/plugin-resize": ">=0.8.0"
+      }
+    },
+    "node_modules/@jimp/plugins": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/plugins/-/plugins-0.10.3.tgz",
+      "integrity": "sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/plugin-blit": "^0.10.3",
+        "@jimp/plugin-blur": "^0.10.3",
+        "@jimp/plugin-circle": "^0.10.3",
+        "@jimp/plugin-color": "^0.10.3",
+        "@jimp/plugin-contain": "^0.10.3",
+        "@jimp/plugin-cover": "^0.10.3",
+        "@jimp/plugin-crop": "^0.10.3",
+        "@jimp/plugin-displace": "^0.10.3",
+        "@jimp/plugin-dither": "^0.10.3",
+        "@jimp/plugin-fisheye": "^0.10.3",
+        "@jimp/plugin-flip": "^0.10.3",
+        "@jimp/plugin-gaussian": "^0.10.3",
+        "@jimp/plugin-invert": "^0.10.3",
+        "@jimp/plugin-mask": "^0.10.3",
+        "@jimp/plugin-normalize": "^0.10.3",
+        "@jimp/plugin-print": "^0.10.3",
+        "@jimp/plugin-resize": "^0.10.3",
+        "@jimp/plugin-rotate": "^0.10.3",
+        "@jimp/plugin-scale": "^0.10.3",
+        "@jimp/plugin-shadow": "^0.10.3",
+        "@jimp/plugin-threshold": "^0.10.3",
+        "core-js": "^3.4.1",
+        "timm": "^1.6.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/png": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/png/-/png-0.10.3.tgz",
+      "integrity": "sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "pngjs": "^3.3.3"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/tiff": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/tiff/-/tiff-0.10.3.tgz",
+      "integrity": "sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "core-js": "^3.4.1",
+        "utif": "^2.0.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/types": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/types/-/types-0.10.3.tgz",
+      "integrity": "sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/bmp": "^0.10.3",
+        "@jimp/gif": "^0.10.3",
+        "@jimp/jpeg": "^0.10.3",
+        "@jimp/png": "^0.10.3",
+        "@jimp/tiff": "^0.10.3",
+        "core-js": "^3.4.1",
+        "timm": "^1.6.1"
+      },
+      "peerDependencies": {
+        "@jimp/custom": ">=0.3.5"
+      }
+    },
+    "node_modules/@jimp/utils": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/@jimp/utils/-/utils-0.10.3.tgz",
+      "integrity": "sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "core-js": "^3.4.1",
+        "regenerator-runtime": "^0.13.3"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.3.tgz",
+      "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==",
+      "devOptional": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@rollup/pluginutils": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+      "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+      "dependencies": {
+        "estree-walker": "^2.0.1",
+        "picomatch": "^2.2.2"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      }
+    },
+    "node_modules/@sinonjs/commons": {
+      "version": "1.8.6",
+      "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.6.tgz",
+      "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "type-detect": "4.0.8"
+      }
+    },
+    "node_modules/@sinonjs/fake-timers": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+      "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@sinonjs/commons": "^1.7.0"
+      }
+    },
+    "node_modules/@tootallnate/once": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz",
+      "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/@types/babel__core": {
+      "version": "7.20.1",
+      "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.1.tgz",
+      "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "node_modules/@types/babel__generator": {
+      "version": "7.6.4",
+      "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz",
+      "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__template": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz",
+      "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__traverse": {
+      "version": "7.20.0",
+      "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.0.tgz",
+      "integrity": "sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "node_modules/@types/eslint": {
+      "version": "8.40.0",
+      "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.40.0.tgz",
+      "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/estree": "*",
+        "@types/json-schema": "*"
+      }
+    },
+    "node_modules/@types/eslint-scope": {
+      "version": "3.7.4",
+      "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
+      "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/eslint": "*",
+        "@types/estree": "*"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz",
+      "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA=="
+    },
+    "node_modules/@types/graceful-fs": {
+      "version": "4.1.6",
+      "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+      "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/istanbul-lib-coverage": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@types/istanbul-lib-report": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/istanbul-lib-coverage": "*"
+      }
+    },
+    "node_modules/@types/istanbul-reports": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+      "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/istanbul-lib-report": "*"
+      }
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.12",
+      "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz",
+      "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==",
+      "dev": true
+    },
+    "node_modules/@types/node": {
+      "version": "20.2.5",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.2.5.tgz",
+      "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==",
+      "devOptional": true,
+      "peer": true
+    },
+    "node_modules/@types/prettier": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.2.tgz",
+      "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@types/stack-utils": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz",
+      "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@types/yargs": {
+      "version": "16.0.5",
+      "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-16.0.5.tgz",
+      "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/yargs-parser": "*"
+      }
+    },
+    "node_modules/@types/yargs-parser": {
+      "version": "21.0.0",
+      "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+      "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@vitejs/plugin-legacy": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-4.0.4.tgz",
+      "integrity": "sha512-UwVfkMfUEszbQ2vs3RDfiDxxvYnIjmtIrGxTnxRev5Sh8ZoDpieV2dwvTUB7zXKJpfRsOgimM6MxQ65VDHJeQw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/core": "^7.21.4",
+        "@babel/preset-env": "^7.21.4",
+        "browserslist": "^4.21.5",
+        "core-js": "^3.30.1",
+        "magic-string": "^0.30.0",
+        "regenerator-runtime": "^0.13.11",
+        "systemjs": "^6.14.1"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "terser": "^5.4.0",
+        "vite": "^4.0.0"
+      }
+    },
+    "node_modules/@vitejs/plugin-vue": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz",
+      "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==",
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^4.0.0",
+        "vue": "^3.2.25"
+      }
+    },
+    "node_modules/@vitejs/plugin-vue-jsx": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.1.tgz",
+      "integrity": "sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/core": "^7.20.7",
+        "@babel/plugin-transform-typescript": "^7.20.7",
+        "@vue/babel-plugin-jsx": "^1.1.1"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^4.0.0",
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/@vue/babel-helper-vue-transform-on": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz",
+      "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==",
+      "dev": true
+    },
+    "node_modules/@vue/babel-plugin-jsx": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz",
+      "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.0.0",
+        "@babel/template": "^7.0.0",
+        "@babel/traverse": "^7.0.0",
+        "@babel/types": "^7.0.0",
+        "@vue/babel-helper-vue-transform-on": "^1.0.2",
+        "camelcase": "^6.0.0",
+        "html-tags": "^3.1.0",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
+      "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/shared": "3.2.47",
+        "estree-walker": "^2.0.2",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
+      "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
+      "dependencies": {
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
+      "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/compiler-ssr": "3.2.47",
+        "@vue/reactivity-transform": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7",
+        "postcss": "^8.1.10",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/@vue/compiler-sfc/node_modules/magic-string": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
+      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "dependencies": {
+        "sourcemap-codec": "^1.4.8"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
+      "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
+      "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz",
+      "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+      "dev": true,
+      "dependencies": {
+        "@vue/shared": "3.4.21"
+      }
+    },
+    "node_modules/@vue/reactivity-transform": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
+      "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7"
+      }
+    },
+    "node_modules/@vue/reactivity-transform/node_modules/magic-string": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
+      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "dependencies": {
+        "sourcemap-codec": "^1.4.8"
+      }
+    },
+    "node_modules/@vue/reactivity/node_modules/@vue/shared": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz",
+      "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==",
+      "dev": true
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+      "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+      "dev": true,
+      "dependencies": {
+        "@vue/reactivity": "3.4.21",
+        "@vue/shared": "3.4.21"
+      }
+    },
+    "node_modules/@vue/runtime-core/node_modules/@vue/shared": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz",
+      "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==",
+      "dev": true
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz",
+      "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==",
+      "dependencies": {
+        "@vue/runtime-core": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "csstype": "^2.6.8"
+      }
+    },
+    "node_modules/@vue/runtime-dom/node_modules/@vue/reactivity": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz",
+      "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==",
+      "dependencies": {
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@vue/runtime-dom/node_modules/@vue/runtime-core": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz",
+      "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==",
+      "dependencies": {
+        "@vue/reactivity": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz",
+      "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.2.47",
+        "@vue/shared": "3.2.47"
+      },
+      "peerDependencies": {
+        "vue": "3.2.47"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.47.tgz",
+      "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ=="
+    },
+    "node_modules/@webassemblyjs/ast": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+      "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/helper-numbers": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+      }
+    },
+    "node_modules/@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-api-error": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-buffer": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+      "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-numbers": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+      "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+        "@webassemblyjs/helper-api-error": "1.11.6",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/helper-wasm-section": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+      "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6"
+      }
+    },
+    "node_modules/@webassemblyjs/ieee754": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+      "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "node_modules/@webassemblyjs/leb128": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+      "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/utf8": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@webassemblyjs/wasm-edit": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+      "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/helper-wasm-section": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6",
+        "@webassemblyjs/wasm-opt": "1.11.6",
+        "@webassemblyjs/wasm-parser": "1.11.6",
+        "@webassemblyjs/wast-printer": "1.11.6"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-gen": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+      "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/ieee754": "1.11.6",
+        "@webassemblyjs/leb128": "1.11.6",
+        "@webassemblyjs/utf8": "1.11.6"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-opt": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+      "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6",
+        "@webassemblyjs/wasm-parser": "1.11.6"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-parser": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+      "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-api-error": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/ieee754": "1.11.6",
+        "@webassemblyjs/leb128": "1.11.6",
+        "@webassemblyjs/utf8": "1.11.6"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-printer": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+      "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.6",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/abab": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz",
+      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "dev": true,
+      "dependencies": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.11.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-globals": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-6.0.0.tgz",
+      "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "acorn": "^7.1.1",
+        "acorn-walk": "^7.1.1"
+      }
+    },
+    "node_modules/acorn-globals/node_modules/acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+      "dev": true,
+      "peer": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-import-assertions": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+      "dev": true,
+      "peer": true,
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
+    "node_modules/acorn-walk": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/address": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz",
+      "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/agent-base": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6.0.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "dev": true,
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "type-fest": "^0.21.3"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/any-base": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/any-base/-/any-base-1.1.0.tgz",
+      "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+      "dev": true
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/autoprefixer": {
+      "version": "10.4.14",
+      "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.14.tgz",
+      "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
+      "dependencies": {
+        "browserslist": "^4.21.5",
+        "caniuse-lite": "^1.0.30001464",
+        "fraction.js": "^4.2.0",
+        "normalize-range": "^0.1.2",
+        "picocolors": "^1.0.0",
+        "postcss-value-parser": "^4.2.0"
+      },
+      "bin": {
+        "autoprefixer": "bin/autoprefixer"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/babel-jest": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/babel-jest/-/babel-jest-27.5.1.tgz",
+      "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/transform": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/babel__core": "^7.1.14",
+        "babel-plugin-istanbul": "^6.1.1",
+        "babel-preset-jest": "^27.5.1",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.8.0"
+      }
+    },
+    "node_modules/babel-jest/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/babel-jest/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/babel-jest/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/babel-jest/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/babel-jest/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/babel-jest/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/babel-plugin-istanbul": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@istanbuljs/load-nyc-config": "^1.0.0",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-instrument": "^5.0.4",
+        "test-exclude": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/babel-plugin-jest-hoist": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+      "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/template": "^7.3.3",
+        "@babel/types": "^7.3.3",
+        "@types/babel__core": "^7.0.0",
+        "@types/babel__traverse": "^7.0.6"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs2": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz",
+      "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.17.7",
+        "@babel/helper-define-polyfill-provider": "^0.4.0",
+        "semver": "^6.1.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs3": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz",
+      "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.4.0",
+        "core-js-compat": "^3.30.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-regenerator": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz",
+      "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.4.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/babel-preset-current-node-syntax": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-bigint": "^7.8.3",
+        "@babel/plugin-syntax-class-properties": "^7.8.3",
+        "@babel/plugin-syntax-import-meta": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-top-level-await": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/babel-preset-jest": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+      "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "babel-plugin-jest-hoist": "^27.5.1",
+        "babel-preset-current-node-syntax": "^1.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+    },
+    "node_modules/base64url": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/base64url/-/base64url-3.0.1.tgz",
+      "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true,
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/bmp-js": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/bmp-js/-/bmp-js-0.1.0.tgz",
+      "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw=="
+    },
+    "node_modules/body-parser": {
+      "version": "1.20.1",
+      "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz",
+      "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+      "dev": true,
+      "dependencies": {
+        "bytes": "3.1.2",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "on-finished": "2.4.1",
+        "qs": "6.11.0",
+        "raw-body": "2.5.1",
+        "type-is": "~1.6.18",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/body-parser/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/browser-process-hrtime": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/browserslist": {
+      "version": "4.21.7",
+      "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.7.tgz",
+      "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==",
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001489",
+        "electron-to-chromium": "^1.4.411",
+        "node-releases": "^2.0.12",
+        "update-browserslist-db": "^1.0.11"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/bser": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz",
+      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "node-int64": "^0.4.0"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/buffer-equal": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-0.0.1.tgz",
+      "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "devOptional": true
+    },
+    "node_modules/bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/cac": {
+      "version": "6.7.9",
+      "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.9.tgz",
+      "integrity": "sha512-XN5qEpfNQCJ8jRaZgitSkkukjMRCGio+X3Ks5KUbGGlPbV+pSem1l9VuzooCBXOiMFshUZgyYqg6rgN8rjkb/w==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/camelcase": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001489",
+      "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz",
+      "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ=="
+    },
+    "node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/char-regex": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz",
+      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/chrome-trace-event": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/ci-info": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.8.0.tgz",
+      "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cjs-module-lexer": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
+      "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "dependencies": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
+    "node_modules/cliui": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
+      }
+    },
+    "node_modules/co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz",
+      "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "iojs": ">= 1.0.0",
+        "node": ">= 0.12.0"
+      }
+    },
+    "node_modules/collect-v8-coverage": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "devOptional": true
+    },
+    "node_modules/compare-versions": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/compare-versions/-/compare-versions-3.6.0.tgz",
+      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/content-disposition": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
+      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/convert-source-map": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz",
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+    },
+    "node_modules/cookie": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz",
+      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+      "dev": true
+    },
+    "node_modules/core-js": {
+      "version": "3.30.2",
+      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.30.2.tgz",
+      "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==",
+      "hasInstallScript": true
+    },
+    "node_modules/core-js-compat": {
+      "version": "3.30.2",
+      "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.30.2.tgz",
+      "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==",
+      "dev": true,
+      "dependencies": {
+        "browserslist": "^4.21.5"
+      }
+    },
+    "node_modules/cross-env": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz",
+      "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.1"
+      },
+      "bin": {
+        "cross-env": "src/bin/cross-env.js",
+        "cross-env-shell": "src/bin/cross-env-shell.js"
+      },
+      "engines": {
+        "node": ">=10.14",
+        "npm": ">=6",
+        "yarn": ">=1"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/css-font-size-keywords": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz",
+      "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q=="
+    },
+    "node_modules/css-font-stretch-keywords": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz",
+      "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg=="
+    },
+    "node_modules/css-font-style-keywords": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz",
+      "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg=="
+    },
+    "node_modules/css-font-weight-keywords": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz",
+      "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA=="
+    },
+    "node_modules/css-list-helpers": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/css-list-helpers/-/css-list-helpers-2.0.0.tgz",
+      "integrity": "sha512-9Bj8tZ0jWbAM3u/U6m/boAzAwLPwtjzFvwivr2piSvyVa3K3rChJzQy4RIHkNkKiZCHrEMWDJWtTR8UyVhdDnQ=="
+    },
+    "node_modules/css-system-font-keywords": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz",
+      "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA=="
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/cssom": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.4.4.tgz",
+      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/cssstyle": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz",
+      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "cssom": "~0.3.6"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cssstyle/node_modules/cssom": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz",
+      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/csstype": {
+      "version": "2.6.21",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
+      "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
+    },
+    "node_modules/data-urls": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-2.0.0.tgz",
+      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "abab": "^2.0.3",
+        "whatwg-mimetype": "^2.3.0",
+        "whatwg-url": "^8.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.7",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz",
+      "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/decimal.js": {
+      "version": "10.4.3",
+      "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/dedent": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz",
+      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/deepmerge": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/default-gateway": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz",
+      "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+      "dev": true,
+      "dependencies": {
+        "execa": "^5.0.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/detect-newline": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz",
+      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/diff-sequences": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-27.5.1.tgz",
+      "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/dom-walk": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz",
+      "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+    },
+    "node_modules/domexception": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/domexception/-/domexception-2.0.1.tgz",
+      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "webidl-conversions": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/domexception/node_modules/webidl-conversions": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+      "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+      "dev": true
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.411",
+      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.411.tgz",
+      "integrity": "sha512-5VXLW4Qw89vM2WTICHua/y8v7fKGDRVa2VPOtBB9IpLvW316B+xd8yD1wTmLPY2ot/00P/qt87xdolj4aG/Lzg=="
+    },
+    "node_modules/emittery": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmmirror.com/emittery/-/emittery-0.8.1.tgz",
+      "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "5.14.1",
+      "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz",
+      "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/es-module-lexer": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
+      "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w=="
+    },
+    "node_modules/esbuild": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.16.17.tgz",
+      "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/android-arm": "0.16.17",
+        "@esbuild/android-arm64": "0.16.17",
+        "@esbuild/android-x64": "0.16.17",
+        "@esbuild/darwin-arm64": "0.16.17",
+        "@esbuild/darwin-x64": "0.16.17",
+        "@esbuild/freebsd-arm64": "0.16.17",
+        "@esbuild/freebsd-x64": "0.16.17",
+        "@esbuild/linux-arm": "0.16.17",
+        "@esbuild/linux-arm64": "0.16.17",
+        "@esbuild/linux-ia32": "0.16.17",
+        "@esbuild/linux-loong64": "0.16.17",
+        "@esbuild/linux-mips64el": "0.16.17",
+        "@esbuild/linux-ppc64": "0.16.17",
+        "@esbuild/linux-riscv64": "0.16.17",
+        "@esbuild/linux-s390x": "0.16.17",
+        "@esbuild/linux-x64": "0.16.17",
+        "@esbuild/netbsd-x64": "0.16.17",
+        "@esbuild/openbsd-x64": "0.16.17",
+        "@esbuild/sunos-x64": "0.16.17",
+        "@esbuild/win32-arm64": "0.16.17",
+        "@esbuild/win32-ia32": "0.16.17",
+        "@esbuild/win32-x64": "0.16.17"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "dev": true
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/escodegen": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.0.0.tgz",
+      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "esprima": "^4.0.1",
+        "estraverse": "^5.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1"
+      },
+      "bin": {
+        "escodegen": "bin/escodegen.js",
+        "esgenerate": "bin/esgenerate.js"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "optionalDependencies": {
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/eslint-scope/node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true,
+      "peer": true,
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/exif-parser": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmmirror.com/exif-parser/-/exif-parser-0.1.12.tgz",
+      "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
+    },
+    "node_modules/exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/expect": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/expect/-/expect-27.5.1.tgz",
+      "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "jest-get-type": "^27.5.1",
+        "jest-matcher-utils": "^27.5.1",
+        "jest-message-util": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/express": {
+      "version": "4.18.2",
+      "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz",
+      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+      "dev": true,
+      "dependencies": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.1",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.5.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.2.0",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.11.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.18.0",
+        "serve-static": "1.15.0",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/express/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/express/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/fastq": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz",
+      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/fb-watchman": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz",
+      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "bser": "2.1.1"
+      }
+    },
+    "node_modules/file-type": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmmirror.com/file-type/-/file-type-9.0.0.tgz",
+      "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
+      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+      "dev": true,
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/finalhandler/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/form-data": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz",
+      "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fraction.js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz",
+      "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fs-extra": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
+      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "node_modules/generic-names": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/generic-names/-/generic-names-4.0.0.tgz",
+      "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==",
+      "dependencies": {
+        "loader-utils": "^3.2.0"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3"
+      }
+    },
+    "node_modules/get-package-type": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz",
+      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/glob-to-regexp": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/global": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz",
+      "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+      "dependencies": {
+        "min-document": "^2.19.0",
+        "process": "^0.11.10"
+      }
+    },
+    "node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+      "dependencies": {
+        "delegate": "^3.1.2"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/hash-sum": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
+      "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg=="
+    },
+    "node_modules/html-encoding-sniffer": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+      "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "whatwg-encoding": "^1.0.5"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/html-escaper": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz",
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/html-tags": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz",
+      "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+      "dev": true,
+      "dependencies": {
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/http-proxy-agent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+      "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@tootallnate/once": "1",
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/https-proxy-agent": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10.17.0"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/icss-replace-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+      "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg=="
+    },
+    "node_modules/icss-utils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz",
+      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+    },
+    "node_modules/immutable": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.0.tgz",
+      "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==",
+      "devOptional": true
+    },
+    "node_modules/import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      },
+      "bin": {
+        "import-local-fixture": "fixtures/cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "node_modules/invert-kv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
+      "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.12.1",
+      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.12.1.tgz",
+      "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+      "dependencies": {
+        "has": "^1.0.3"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-function": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz",
+      "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
+    },
+    "node_modules/is-generator-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-potential-custom-element-name": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "node_modules/istanbul-lib-coverage": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+      "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istanbul-lib-instrument": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.12.3",
+        "@babel/parser": "^7.14.7",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.2.0",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istanbul-lib-report": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^3.0.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istanbul-lib-report/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istanbul-lib-report/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istanbul-lib-source-maps": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^3.0.0",
+        "source-map": "^0.6.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/istanbul-reports": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+      "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest": {
+      "version": "27.0.4",
+      "resolved": "https://registry.npmmirror.com/jest/-/jest-27.0.4.tgz",
+      "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/core": "^27.0.4",
+        "import-local": "^3.0.2",
+        "jest-cli": "^27.0.4"
+      },
+      "bin": {
+        "jest": "bin/jest.js"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jest-changed-files": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+      "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "execa": "^5.0.0",
+        "throat": "^6.0.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-circus": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-circus/-/jest-circus-27.5.1.tgz",
+      "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/environment": "^27.5.1",
+        "@jest/test-result": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "co": "^4.6.0",
+        "dedent": "^0.7.0",
+        "expect": "^27.5.1",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^27.5.1",
+        "jest-matcher-utils": "^27.5.1",
+        "jest-message-util": "^27.5.1",
+        "jest-runtime": "^27.5.1",
+        "jest-snapshot": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "pretty-format": "^27.5.1",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3",
+        "throat": "^6.0.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-circus/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-circus/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-circus/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-circus/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-circus/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-circus/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-cli": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-cli/-/jest-cli-27.5.1.tgz",
+      "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/core": "^27.5.1",
+        "@jest/test-result": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "chalk": "^4.0.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.9",
+        "import-local": "^3.0.2",
+        "jest-config": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "jest-validate": "^27.5.1",
+        "prompts": "^2.0.1",
+        "yargs": "^16.2.0"
+      },
+      "bin": {
+        "jest": "bin/jest.js"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jest-cli/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-cli/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-cli/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-cli/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-cli/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-cli/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-config": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-27.5.1.tgz",
+      "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.8.0",
+        "@jest/test-sequencer": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "babel-jest": "^27.5.1",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "deepmerge": "^4.2.2",
+        "glob": "^7.1.1",
+        "graceful-fs": "^4.2.9",
+        "jest-circus": "^27.5.1",
+        "jest-environment-jsdom": "^27.5.1",
+        "jest-environment-node": "^27.5.1",
+        "jest-get-type": "^27.5.1",
+        "jest-jasmine2": "^27.5.1",
+        "jest-regex-util": "^27.5.1",
+        "jest-resolve": "^27.5.1",
+        "jest-runner": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "jest-validate": "^27.5.1",
+        "micromatch": "^4.0.4",
+        "parse-json": "^5.2.0",
+        "pretty-format": "^27.5.1",
+        "slash": "^3.0.0",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      },
+      "peerDependencies": {
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "ts-node": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jest-config/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-config/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-config/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-config/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-config/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-config/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-diff": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-diff/-/jest-diff-27.5.1.tgz",
+      "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "diff-sequences": "^27.5.1",
+        "jest-get-type": "^27.5.1",
+        "pretty-format": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-diff/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-diff/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-diff/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-diff/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-diff/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-diff/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-docblock": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-27.5.1.tgz",
+      "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "detect-newline": "^3.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-each": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-each/-/jest-each-27.5.1.tgz",
+      "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "pretty-format": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-each/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-each/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-each/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-each/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-each/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-each/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-environment-jsdom": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+      "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/environment": "^27.5.1",
+        "@jest/fake-timers": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "jest-mock": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "jsdom": "^16.6.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-environment-node": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+      "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/environment": "^27.5.1",
+        "@jest/fake-timers": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "jest-mock": "^27.5.1",
+        "jest-util": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-get-type": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-27.5.1.tgz",
+      "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-haste-map": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+      "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "@types/graceful-fs": "^4.1.2",
+        "@types/node": "*",
+        "anymatch": "^3.0.3",
+        "fb-watchman": "^2.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-regex-util": "^27.5.1",
+        "jest-serializer": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "jest-worker": "^27.5.1",
+        "micromatch": "^4.0.4",
+        "walker": "^1.0.7"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "^2.3.2"
+      }
+    },
+    "node_modules/jest-jasmine2": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+      "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/environment": "^27.5.1",
+        "@jest/source-map": "^27.5.1",
+        "@jest/test-result": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "co": "^4.6.0",
+        "expect": "^27.5.1",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^27.5.1",
+        "jest-matcher-utils": "^27.5.1",
+        "jest-message-util": "^27.5.1",
+        "jest-runtime": "^27.5.1",
+        "jest-snapshot": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "pretty-format": "^27.5.1",
+        "throat": "^6.0.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-jasmine2/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-jasmine2/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-jasmine2/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-jasmine2/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-jasmine2/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-jasmine2/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-leak-detector": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+      "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "jest-get-type": "^27.5.1",
+        "pretty-format": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-matcher-utils": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+      "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "jest-diff": "^27.5.1",
+        "jest-get-type": "^27.5.1",
+        "pretty-format": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-matcher-utils/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-matcher-utils/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-matcher-utils/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-matcher-utils/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-matcher-utils/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-message-util": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-27.5.1.tgz",
+      "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.12.13",
+        "@jest/types": "^27.5.1",
+        "@types/stack-utils": "^2.0.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "micromatch": "^4.0.4",
+        "pretty-format": "^27.5.1",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-message-util/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-message-util/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-message-util/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-message-util/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-message-util/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-message-util/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-mock": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-27.5.1.tgz",
+      "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "@types/node": "*"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-pnp-resolver": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      },
+      "peerDependencies": {
+        "jest-resolve": "*"
+      },
+      "peerDependenciesMeta": {
+        "jest-resolve": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jest-regex-util": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+      "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-resolve": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-27.5.1.tgz",
+      "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^27.5.1",
+        "jest-pnp-resolver": "^1.2.2",
+        "jest-util": "^27.5.1",
+        "jest-validate": "^27.5.1",
+        "resolve": "^1.20.0",
+        "resolve.exports": "^1.1.0",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-resolve-dependencies": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+      "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "jest-regex-util": "^27.5.1",
+        "jest-snapshot": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-resolve/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-resolve/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-resolve/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-resolve/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-resolve/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-resolve/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-runner": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-runner/-/jest-runner-27.5.1.tgz",
+      "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/console": "^27.5.1",
+        "@jest/environment": "^27.5.1",
+        "@jest/test-result": "^27.5.1",
+        "@jest/transform": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "emittery": "^0.8.1",
+        "graceful-fs": "^4.2.9",
+        "jest-docblock": "^27.5.1",
+        "jest-environment-jsdom": "^27.5.1",
+        "jest-environment-node": "^27.5.1",
+        "jest-haste-map": "^27.5.1",
+        "jest-leak-detector": "^27.5.1",
+        "jest-message-util": "^27.5.1",
+        "jest-resolve": "^27.5.1",
+        "jest-runtime": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "jest-worker": "^27.5.1",
+        "source-map-support": "^0.5.6",
+        "throat": "^6.0.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-runner/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-runner/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-runner/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-runner/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-runner/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-runner/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-runtime": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-27.5.1.tgz",
+      "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/environment": "^27.5.1",
+        "@jest/fake-timers": "^27.5.1",
+        "@jest/globals": "^27.5.1",
+        "@jest/source-map": "^27.5.1",
+        "@jest/test-result": "^27.5.1",
+        "@jest/transform": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "chalk": "^4.0.0",
+        "cjs-module-lexer": "^1.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "execa": "^5.0.0",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^27.5.1",
+        "jest-message-util": "^27.5.1",
+        "jest-mock": "^27.5.1",
+        "jest-regex-util": "^27.5.1",
+        "jest-resolve": "^27.5.1",
+        "jest-snapshot": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "slash": "^3.0.0",
+        "strip-bom": "^4.0.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-runtime/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-runtime/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-runtime/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-runtime/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-runtime/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-runtime/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-serializer": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-serializer/-/jest-serializer-27.5.1.tgz",
+      "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/node": "*",
+        "graceful-fs": "^4.2.9"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-snapshot": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+      "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.7.2",
+        "@babel/generator": "^7.7.2",
+        "@babel/plugin-syntax-typescript": "^7.7.2",
+        "@babel/traverse": "^7.7.2",
+        "@babel/types": "^7.0.0",
+        "@jest/transform": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/babel__traverse": "^7.0.4",
+        "@types/prettier": "^2.1.5",
+        "babel-preset-current-node-syntax": "^1.0.0",
+        "chalk": "^4.0.0",
+        "expect": "^27.5.1",
+        "graceful-fs": "^4.2.9",
+        "jest-diff": "^27.5.1",
+        "jest-get-type": "^27.5.1",
+        "jest-haste-map": "^27.5.1",
+        "jest-matcher-utils": "^27.5.1",
+        "jest-message-util": "^27.5.1",
+        "jest-util": "^27.5.1",
+        "natural-compare": "^1.4.0",
+        "pretty-format": "^27.5.1",
+        "semver": "^7.3.2"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-snapshot/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-util": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-27.5.1.tgz",
+      "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "graceful-fs": "^4.2.9",
+        "picomatch": "^2.2.3"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-util/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-util/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-util/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-util/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-util/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-util/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-validate": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-27.5.1.tgz",
+      "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^27.5.1",
+        "camelcase": "^6.2.0",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^27.5.1",
+        "leven": "^3.1.0",
+        "pretty-format": "^27.5.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-validate/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-validate/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-validate/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-validate/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-validate/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-validate/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-watcher": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-27.5.1.tgz",
+      "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jest/test-result": "^27.5.1",
+        "@jest/types": "^27.5.1",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "jest-util": "^27.5.1",
+        "string-length": "^4.0.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/jest-watcher/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-watcher/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-watcher/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/jest-watcher/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/jest-watcher/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-watcher/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/jest-worker/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-worker/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jimp": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmmirror.com/jimp/-/jimp-0.10.3.tgz",
+      "integrity": "sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/custom": "^0.10.3",
+        "@jimp/plugins": "^0.10.3",
+        "@jimp/types": "^0.10.3",
+        "core-js": "^3.4.1",
+        "regenerator-runtime": "^0.13.3"
+      }
+    },
+    "node_modules/jpeg-js": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmmirror.com/jpeg-js/-/jpeg-js-0.3.7.tgz",
+      "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ=="
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/jsdom": {
+      "version": "16.7.0",
+      "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-16.7.0.tgz",
+      "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "abab": "^2.0.5",
+        "acorn": "^8.2.4",
+        "acorn-globals": "^6.0.0",
+        "cssom": "^0.4.4",
+        "cssstyle": "^2.3.0",
+        "data-urls": "^2.0.0",
+        "decimal.js": "^10.2.1",
+        "domexception": "^2.0.1",
+        "escodegen": "^2.0.0",
+        "form-data": "^3.0.0",
+        "html-encoding-sniffer": "^2.0.1",
+        "http-proxy-agent": "^4.0.1",
+        "https-proxy-agent": "^5.0.0",
+        "is-potential-custom-element-name": "^1.0.1",
+        "nwsapi": "^2.2.0",
+        "parse5": "6.0.1",
+        "saxes": "^5.0.1",
+        "symbol-tree": "^3.2.4",
+        "tough-cookie": "^4.0.0",
+        "w3c-hr-time": "^1.0.2",
+        "w3c-xmlserializer": "^2.0.0",
+        "webidl-conversions": "^6.1.0",
+        "whatwg-encoding": "^1.0.5",
+        "whatwg-mimetype": "^2.3.0",
+        "whatwg-url": "^8.5.0",
+        "ws": "^7.4.6",
+        "xml-name-validator": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "canvas": "^2.5.0"
+      },
+      "peerDependenciesMeta": {
+        "canvas": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jsdom/node_modules/ws": {
+      "version": "7.5.9",
+      "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz",
+      "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8.3.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/jsonc-parser": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+      "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="
+    },
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/klona": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz",
+      "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/lcid": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
+      "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+      "dependencies": {
+        "invert-kv": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/licia": {
+      "version": "1.38.1",
+      "resolved": "https://registry.npmmirror.com/licia/-/licia-1.38.1.tgz",
+      "integrity": "sha512-2CRiNVqkI48Om+eA4cvYn1+bxxHUYlt3XCR1RtuBK/y0Uu7OiWYSgKKHX2KGIaBxuSZjLSqp7zTNBXJgxuSpzg=="
+    },
+    "node_modules/lilconfig": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz",
+      "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/load-bmfont": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/load-bmfont/-/load-bmfont-1.4.1.tgz",
+      "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==",
+      "dependencies": {
+        "buffer-equal": "0.0.1",
+        "mime": "^1.3.4",
+        "parse-bmfont-ascii": "^1.0.3",
+        "parse-bmfont-binary": "^1.0.5",
+        "parse-bmfont-xml": "^1.1.4",
+        "phin": "^2.9.1",
+        "xhr": "^2.0.1",
+        "xtend": "^4.0.0"
+      }
+    },
+    "node_modules/load-bmfont/node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/loader-runner": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
+      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6.11.5"
+      }
+    },
+    "node_modules/loader-utils": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.2.1.tgz",
+      "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
+      "engines": {
+        "node": ">= 12.13.0"
+      }
+    },
+    "node_modules/local-pkg": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz",
+      "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
+      "dependencies": {
+        "mlly": "^1.4.2",
+        "pkg-types": "^1.0.3"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/localstorage-polyfill": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/localstorage-polyfill/-/localstorage-polyfill-1.0.1.tgz",
+      "integrity": "sha512-m4iHVZxFH5734oQcPKU08025gIz2+4bjWR9lulP8ZYxEJR0BpA0w32oJmkzh8y3UI9ci7xCBehQDc3oA1X+VHw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/lodash.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+    },
+    "node_modules/lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+      "dev": true
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.8",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
+      "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.4.15"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/makeerror": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz",
+      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "tmpl": "1.0.5"
+      }
+    },
+    "node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/merge": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz",
+      "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w=="
+    },
+    "node_modules/merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
+      "dev": true
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "dependencies": {
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/mime": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz",
+      "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dev": true,
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/min-document": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmmirror.com/min-document/-/min-document-2.19.0.tgz",
+      "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+      "dependencies": {
+        "dom-walk": "^0.1.0"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+    },
+    "node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/mlly": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz",
+      "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==",
+      "dependencies": {
+        "acorn": "^8.11.3",
+        "pathe": "^1.1.2",
+        "pkg-types": "^1.0.3",
+        "ufo": "^1.3.2"
+      }
+    },
+    "node_modules/module-alias": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.2.tgz",
+      "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q=="
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz",
+      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "node_modules/node-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.12",
+      "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.12.tgz",
+      "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ=="
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/nwsapi": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.5.tgz",
+      "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/object-inspect": {
+      "version": "1.12.3",
+      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz",
+      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+      "dev": true
+    },
+    "node_modules/omggif": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/omggif/-/omggif-1.0.10.tgz",
+      "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
+    },
+    "node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "dev": true,
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/os-locale-s-fix": {
+      "version": "1.0.8-fix-1",
+      "resolved": "https://registry.npmmirror.com/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz",
+      "integrity": "sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==",
+      "dependencies": {
+        "lcid": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10",
+        "yarn": "^1.22.4"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+    },
+    "node_modules/parse-bmfont-ascii": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
+      "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="
+    },
+    "node_modules/parse-bmfont-binary": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
+      "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="
+    },
+    "node_modules/parse-bmfont-xml": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz",
+      "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==",
+      "dependencies": {
+        "xml-parse-from-string": "^1.0.0",
+        "xml2js": "^0.4.5"
+      }
+    },
+    "node_modules/parse-css-font": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/parse-css-font/-/parse-css-font-4.0.0.tgz",
+      "integrity": "sha512-lnY7dTUfjRXsSo5G5C639L8RaBBaVSgL+5hacIFKsNHzeCJQ5SFSZv1DZmc7+wZv/22PFGOq2YbaEHLdaCS/mQ==",
+      "dependencies": {
+        "css-font-size-keywords": "^1.0.0",
+        "css-font-stretch-keywords": "^1.0.1",
+        "css-font-style-keywords": "^1.0.1",
+        "css-font-weight-keywords": "^1.0.0",
+        "css-list-helpers": "^2.0.0",
+        "css-system-font-keywords": "^1.0.0",
+        "unquote": "^1.1.1"
+      }
+    },
+    "node_modules/parse-headers": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz",
+      "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+    },
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/parse5": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+      "dev": true
+    },
+    "node_modules/pathe": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
+    },
+    "node_modules/phin": {
+      "version": "2.9.3",
+      "resolved": "https://registry.npmmirror.com/phin/-/phin-2.9.3.tgz",
+      "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA=="
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pinia": {
+      "version": "2.0.36",
+      "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.0.36.tgz",
+      "integrity": "sha512-4UKApwjlmJH+VuHKgA+zQMddcCb3ezYnyewQ9NVrsDqZ/j9dMv5+rh+1r48whKNdpFkZAWVxhBp5ewYaYX9JcQ==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.5.0",
+        "vue-demi": "*"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.4.0",
+        "typescript": ">=4.4.4",
+        "vue": "^2.6.14 || ^3.2.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pirates": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz",
+      "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/pixelmatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/pixelmatch/-/pixelmatch-4.0.2.tgz",
+      "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
+      "dependencies": {
+        "pngjs": "^3.0.0"
+      },
+      "bin": {
+        "pixelmatch": "bin/pixelmatch"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "find-up": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pkg-types": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
+      "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
+      "dependencies": {
+        "jsonc-parser": "^3.2.0",
+        "mlly": "^1.2.0",
+        "pathe": "^1.1.0"
+      }
+    },
+    "node_modules/pngjs": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-3.4.0.tgz",
+      "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.24",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.24.tgz",
+      "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==",
+      "dependencies": {
+        "nanoid": "^3.3.6",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-import": {
+      "version": "14.1.0",
+      "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-14.1.0.tgz",
+      "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+      "dependencies": {
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.0.0"
+      }
+    },
+    "node_modules/postcss-load-config": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+      "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+      "dependencies": {
+        "lilconfig": "^2.0.5",
+        "yaml": "^1.10.2"
+      },
+      "engines": {
+        "node": ">= 10"
+      },
+      "peerDependencies": {
+        "postcss": ">=8.0.9",
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "postcss": {
+          "optional": true
+        },
+        "ts-node": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/postcss-modules": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/postcss-modules/-/postcss-modules-4.3.1.tgz",
+      "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==",
+      "dependencies": {
+        "generic-names": "^4.0.0",
+        "icss-replace-symbols": "^1.1.0",
+        "lodash.camelcase": "^4.3.0",
+        "postcss-modules-extract-imports": "^3.0.0",
+        "postcss-modules-local-by-default": "^4.0.0",
+        "postcss-modules-scope": "^3.0.0",
+        "postcss-modules-values": "^4.0.0",
+        "string-hash": "^1.1.1"
+      },
+      "peerDependencies": {
+        "postcss": "^8.0.0"
+      }
+    },
+    "node_modules/postcss-modules-extract-imports": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-local-by-default": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
+      "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
+      "dependencies": {
+        "icss-utils": "^5.0.0",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-scope": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+      "dependencies": {
+        "postcss-selector-parser": "^6.0.4"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+      "dependencies": {
+        "icss-utils": "^5.0.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "6.0.13",
+      "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+      "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/pretty-format": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-27.5.1.tgz",
+      "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^17.0.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/pretty-format/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/prompts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz",
+      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "dev": true,
+      "dependencies": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/psl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz",
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/punycode": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz",
+      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qrcode-reader": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/qrcode-reader/-/qrcode-reader-1.0.4.tgz",
+      "integrity": "sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ=="
+    },
+    "node_modules/qrcode-terminal": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmmirror.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
+      "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
+      "bin": {
+        "qrcode-terminal": "bin/qrcode-terminal.js"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.11.0",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
+      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "dev": true,
+      "dependencies": {
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
+      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+      "dev": true,
+      "dependencies": {
+        "bytes": "3.1.2",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/react-is": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz",
+      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+      "dependencies": {
+        "pify": "^2.3.0"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+      "dev": true
+    },
+    "node_modules/regenerate-unicode-properties": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+      "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
+      "dev": true,
+      "dependencies": {
+        "regenerate": "^1.4.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.13.11",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+    },
+    "node_modules/regenerator-transform": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+      "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "node_modules/regexpu-core": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz",
+      "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/regjsgen": "^0.8.0",
+        "regenerate": "^1.4.2",
+        "regenerate-unicode-properties": "^10.1.0",
+        "regjsparser": "^0.9.1",
+        "unicode-match-property-ecmascript": "^2.0.0",
+        "unicode-match-property-value-ecmascript": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regjsparser": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz",
+      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+      "dev": true,
+      "dependencies": {
+        "jsesc": "~0.5.0"
+      },
+      "bin": {
+        "regjsparser": "bin/parser"
+      }
+    },
+    "node_modules/regjsparser/node_modules/jsesc": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz",
+      "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+      "dev": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      }
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/resolve": {
+      "version": "1.22.2",
+      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.2.tgz",
+      "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+      "dependencies": {
+        "is-core-module": "^2.11.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      }
+    },
+    "node_modules/resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "resolve-from": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/resolve.exports": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.1.tgz",
+      "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "3.23.0",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.23.0.tgz",
+      "integrity": "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==",
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=14.18.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/safe-area-insets": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/safe-area-insets/-/safe-area-insets-1.4.1.tgz",
+      "integrity": "sha512-r/nRWTjFGhhm3w1Z6Kd/jY11srN+lHt2mNl1E/emQGW8ic7n3Avu4noibklfSM+Y34peNphHD/BSZecav0sXYQ=="
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "dev": true
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "node_modules/sass": {
+      "version": "1.62.1",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.62.1.tgz",
+      "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==",
+      "devOptional": true,
+      "dependencies": {
+        "chokidar": ">=3.0.0 <4.0.0",
+        "immutable": "^4.0.0",
+        "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "bin": {
+        "sass": "sass.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-loader": {
+      "version": "10.4.1",
+      "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.4.1.tgz",
+      "integrity": "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==",
+      "dev": true,
+      "dependencies": {
+        "klona": "^2.0.4",
+        "loader-utils": "^2.0.0",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.0.0",
+        "semver": "^7.3.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "peerDependencies": {
+        "fibers": ">= 3.1.0",
+        "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+        "sass": "^1.3.0",
+        "webpack": "^4.36.0 || ^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "fibers": {
+          "optional": true
+        },
+        "node-sass": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/sass-loader/node_modules/loader-utils": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+      "dev": true,
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/sass-loader/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/sass-loader/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/sass-loader/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "node_modules/sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+    },
+    "node_modules/saxes": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz",
+      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "xmlchars": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/schema-utils": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.2.tgz",
+      "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==",
+      "dev": true,
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/scule": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
+      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="
+    },
+    "node_modules/select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
+    "node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
+      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+      "dev": true,
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/send/node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true
+    },
+    "node_modules/serialize-javascript": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+      "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+      "dev": true,
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.18.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "dev": true
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "node_modules/sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "devOptional": true,
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+      "deprecated": "Please use @jridgewell/sourcemap-codec instead"
+    },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/stack-utils": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz",
+      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "escape-string-regexp": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/stack-utils/node_modules/escape-string-regexp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/string-hash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/string-hash/-/string-hash-1.1.3.tgz",
+      "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A=="
+    },
+    "node_modules/string-length": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz",
+      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "char-regex": "^1.0.2",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-bom": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz",
+      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-literal": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz",
+      "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==",
+      "dependencies": {
+        "acorn": "^8.10.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/supports-hyperlinks": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+      "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-hyperlinks/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-hyperlinks/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/svg-tags": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz",
+      "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+      "dev": true
+    },
+    "node_modules/symbol-tree": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz",
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/systemjs": {
+      "version": "6.14.1",
+      "resolved": "https://registry.npmmirror.com/systemjs/-/systemjs-6.14.1.tgz",
+      "integrity": "sha512-8ftwWd+XnQtZ/aGbatrN4QFNGrKJzmbtixW+ODpci7pyoTajg4sonPP8aFLESAcuVxaC1FyDESt+SpfFCH9rZQ==",
+      "dev": true
+    },
+    "node_modules/tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/terminal-link": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz",
+      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-escapes": "^4.2.1",
+        "supports-hyperlinks": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/terser": {
+      "version": "5.17.6",
+      "resolved": "https://registry.npmmirror.com/terser/-/terser-5.17.6.tgz",
+      "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==",
+      "devOptional": true,
+      "dependencies": {
+        "@jridgewell/source-map": "^0.3.2",
+        "acorn": "^8.5.0",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser-webpack-plugin": {
+      "version": "5.3.9",
+      "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+      "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.1",
+        "terser": "^5.16.8"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "peerDependencies": {
+        "webpack": "^5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "@swc/core": {
+          "optional": true
+        },
+        "esbuild": {
+          "optional": true
+        },
+        "uglify-js": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/test-exclude": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz",
+      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/throat": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/throat/-/throat-6.0.2.tgz",
+      "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/timm": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmmirror.com/timm/-/timm-1.7.1.tgz",
+      "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw=="
+    },
+    "node_modules/tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
+    "node_modules/tinycolor2": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz",
+      "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
+    },
+    "node_modules/tmpl": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz",
+      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tough-cookie": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.2.tgz",
+      "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "psl": "^1.1.33",
+        "punycode": "^2.1.1",
+        "universalify": "^0.2.0",
+        "url-parse": "^1.5.3"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/tough-cookie/node_modules/universalify": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz",
+      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/tr46": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/tr46/-/tr46-2.1.0.tgz",
+      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "prelude-ls": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "0.21.3",
+      "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dev": true,
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "node_modules/ufo": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz",
+      "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ=="
+    },
+    "node_modules/unicode-canonical-property-names-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+      "dev": true,
+      "dependencies": {
+        "unicode-canonical-property-names-ecmascript": "^2.0.0",
+        "unicode-property-aliases-ecmascript": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-value-ecmascript": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-property-aliases-ecmascript": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unimport": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.7.1.tgz",
+      "integrity": "sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==",
+      "dependencies": {
+        "@rollup/pluginutils": "^5.1.0",
+        "acorn": "^8.11.2",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.0",
+        "magic-string": "^0.30.5",
+        "mlly": "^1.4.2",
+        "pathe": "^1.1.1",
+        "pkg-types": "^1.0.3",
+        "scule": "^1.1.1",
+        "strip-literal": "^1.3.0",
+        "unplugin": "^1.5.1"
+      }
+    },
+    "node_modules/unimport/node_modules/@rollup/pluginutils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+      "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unimport/node_modules/@rollup/pluginutils/node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "node_modules/unimport/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/unimport/node_modules/estree-walker": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+      "dependencies": {
+        "@types/estree": "^1.0.0"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/unplugin": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.8.1.tgz",
+      "integrity": "sha512-NDAvOEnZmeSRRmjfD0FoLzfve2/9lqceO5bR4J/2V72zphnFdq7UYo3fg6F1y1HfZEaSHa+7bZgbEN+z5x8ZDQ==",
+      "dependencies": {
+        "acorn": "^8.11.3",
+        "chokidar": "^3.6.0",
+        "webpack-sources": "^3.2.3",
+        "webpack-virtual-modules": "^0.6.1"
+      }
+    },
+    "node_modules/unplugin-auto-import": {
+      "version": "0.16.7",
+      "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.16.7.tgz",
+      "integrity": "sha512-w7XmnRlchq6YUFJVFGSvG1T/6j8GrdYN6Em9Wf0Ye+HXgD/22kont+WnuCAA0UaUoxtuvRR1u/mXKy63g/hfqQ==",
+      "dependencies": {
+        "@antfu/utils": "^0.7.6",
+        "@rollup/pluginutils": "^5.0.5",
+        "fast-glob": "^3.3.1",
+        "local-pkg": "^0.5.0",
+        "magic-string": "^0.30.5",
+        "minimatch": "^9.0.3",
+        "unimport": "^3.4.0",
+        "unplugin": "^1.5.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@nuxt/kit": "^3.2.2",
+        "@vueuse/core": "*"
+      },
+      "peerDependenciesMeta": {
+        "@nuxt/kit": {
+          "optional": true
+        },
+        "@vueuse/core": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unplugin-auto-import/node_modules/@rollup/pluginutils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+      "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unplugin-auto-import/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/unplugin-auto-import/node_modules/minimatch": {
+      "version": "9.0.3",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+      "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+      "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg=="
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+      "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+      "dependencies": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/url-parse": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz",
+      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "node_modules/utif": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/utif/-/utif-2.0.1.tgz",
+      "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
+      "dependencies": {
+        "pako": "^1.0.5"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/uview-plus": {
+      "version": "3.1.45",
+      "resolved": "https://registry.npmjs.org/uview-plus/-/uview-plus-3.1.45.tgz",
+      "integrity": "sha512-JHgLp2heaMciLdGimO/v4tMM8iwb2vTEOk6sXqn5X198AHjM5A/IGzH84GZPvUISFTEJbxGEHiGPxpv2K26AGw==",
+      "dependencies": {
+        "clipboard": "^2.0.11",
+        "dayjs": "^1.11.3"
+      },
+      "engines": {
+        "HBuilderX": "^3.1.0"
+      }
+    },
+    "node_modules/v8-to-istanbul": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+      "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/istanbul-lib-coverage": "^2.0.1",
+        "convert-source-map": "^1.6.0",
+        "source-map": "^0.7.3"
+      },
+      "engines": {
+        "node": ">=10.12.0"
+      }
+    },
+    "node_modules/v8-to-istanbul/node_modules/source-map": {
+      "version": "0.7.4",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz",
+      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/vite": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.3.tgz",
+      "integrity": "sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==",
+      "dependencies": {
+        "esbuild": "^0.16.3",
+        "postcss": "^8.4.20",
+        "resolve": "^1.22.1",
+        "rollup": "^3.7.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      },
+      "peerDependencies": {
+        "@types/node": ">= 14",
+        "less": "*",
+        "sass": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz",
+      "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/compiler-sfc": "3.2.47",
+        "@vue/runtime-dom": "3.2.47",
+        "@vue/server-renderer": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "node_modules/vue-demi": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz",
+      "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-i18n": {
+      "version": "9.10.1",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.10.1.tgz",
+      "integrity": "sha512-37HVJQZ/pZaRXGzFmmMomM1u1k7kndv3xCBPYHKEVfv5W3UVK67U/TpBug71ILYLNmjHLHdvTUPRF81pFT5fFg==",
+      "dependencies": {
+        "@intlify/core-base": "9.10.1",
+        "@intlify/shared": "9.10.1",
+        "@vue/devtools-api": "^6.5.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/vue-i18n/node_modules/@intlify/core-base": {
+      "version": "9.10.1",
+      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.10.1.tgz",
+      "integrity": "sha512-0+Wtjj04GIyglh5KKiNjRwgjpHrhqqGZhaKY/QVjjogWKZq5WHROrTi84pNVsRN18QynyPmjtsVUWqFKPQ45xQ==",
+      "dependencies": {
+        "@intlify/message-compiler": "9.10.1",
+        "@intlify/shared": "9.10.1"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/vue-i18n/node_modules/@intlify/message-compiler": {
+      "version": "9.10.1",
+      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.10.1.tgz",
+      "integrity": "sha512-b68UTmRhgZfswJZI7VAgW6BXZK5JOpoi5swMLGr4j6ss2XbFY13kiw+Hu+xYAfulMPSapcHzdWHnq21VGnMCnA==",
+      "dependencies": {
+        "@intlify/shared": "9.10.1",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/vue-i18n/node_modules/@intlify/shared": {
+      "version": "9.10.1",
+      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.10.1.tgz",
+      "integrity": "sha512-liyH3UMoglHBUn70iCYcy9CQlInx/lp50W2aeSxqqrvmG+LDj/Jj7tBJhBoQL4fECkldGhbmW0g2ommHfL6Wmw==",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.2.tgz",
+      "integrity": "sha512-cChBPPmAflgBGmy3tBsjeoe3f3VOSG6naKyY5pjtrqLGbNEXdzCigFUHgBvp9e3ysAtFtEx7OLqcSDh/1Cq2TQ==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.5.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/w3c-hr-time": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+      "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "browser-process-hrtime": "^1.0.0"
+      }
+    },
+    "node_modules/w3c-xmlserializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "xml-name-validator": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/walker": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz",
+      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "makeerror": "1.0.12"
+      }
+    },
+    "node_modules/watchpack": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz",
+      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.1.2"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/webidl-conversions": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=10.4"
+      }
+    },
+    "node_modules/webpack": {
+      "version": "5.84.1",
+      "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.84.1.tgz",
+      "integrity": "sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@types/eslint-scope": "^3.7.3",
+        "@types/estree": "^1.0.0",
+        "@webassemblyjs/ast": "^1.11.5",
+        "@webassemblyjs/wasm-edit": "^1.11.5",
+        "@webassemblyjs/wasm-parser": "^1.11.5",
+        "acorn": "^8.7.1",
+        "acorn-import-assertions": "^1.9.0",
+        "browserslist": "^4.14.5",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.14.1",
+        "es-module-lexer": "^1.2.1",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.9",
+        "json-parse-even-better-errors": "^2.3.1",
+        "loader-runner": "^4.2.0",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.1.2",
+        "tapable": "^2.1.1",
+        "terser-webpack-plugin": "^5.3.7",
+        "watchpack": "^2.4.0",
+        "webpack-sources": "^3.2.3"
+      },
+      "bin": {
+        "webpack": "bin/webpack.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "peerDependenciesMeta": {
+        "webpack-cli": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-sources": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/webpack-virtual-modules": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz",
+      "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg=="
+    },
+    "node_modules/whatwg-encoding": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "iconv-lite": "0.4.24"
+      }
+    },
+    "node_modules/whatwg-mimetype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/whatwg-url": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-8.7.0.tgz",
+      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "lodash": "^4.7.0",
+        "tr46": "^2.1.0",
+        "webidl-conversions": "^6.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "node_modules/ws": {
+      "version": "8.13.0",
+      "resolved": "https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz",
+      "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/xhr": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmmirror.com/xhr/-/xhr-2.6.0.tgz",
+      "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+      "dependencies": {
+        "global": "~4.4.0",
+        "is-function": "^1.0.1",
+        "parse-headers": "^2.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "node_modules/xml-name-validator": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/xml-parse-from-string": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
+      "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="
+    },
+    "node_modules/xml2js": {
+      "version": "0.4.23",
+      "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.4.23.tgz",
+      "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+      "dependencies": {
+        "sax": ">=0.6.0",
+        "xmlbuilder": "~11.0.0"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/xmlbuilder": {
+      "version": "11.0.1",
+      "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/xmlhttprequest": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+      "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/xregexp": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/xregexp/-/xregexp-3.1.0.tgz",
+      "integrity": "sha512-4Y1x6DyB8xRoxosooa6PlGWqmmSKatbzhrftZ7Purmm4B8R4qIEJG1A2hZsdz5DhmIqS0msC0I7KEq93GphEVg=="
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+    },
+    "node_modules/yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/yargs": {
+      "version": "16.2.0",
+      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "20.2.9",
+      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz",
+      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    }
+  }
+}

+ 69 - 1
package.json

@@ -1,5 +1,73 @@
 {
+  "name": "uni-preset-vue",
+  "version": "0.0.0",
+  "scripts": {
+    "dev:app": "uni -p app",
+    "dev:app-android": "uni -p app-android",
+    "dev:app-ios": "uni -p app-ios",
+    "dev:custom": "uni -p",
+    "dev:h5": "uni",
+    "dev:h5:ssr": "uni --ssr",
+    "dev:mp-alipay": "uni -p mp-alipay",
+    "dev:mp-baidu": "uni -p mp-baidu",
+    "dev:mp-jd": "uni -p mp-jd",
+    "dev:mp-kuaishou": "uni -p mp-kuaishou",
+    "dev:mp-lark": "uni -p mp-lark",
+    "dev:mp-qq": "uni -p mp-qq",
+    "dev:mp-toutiao": "uni -p mp-toutiao",
+    "dev": "uni -p mp-weixin",
+    "dev:quickapp-webview": "uni -p quickapp-webview",
+    "dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
+    "dev:quickapp-webview-union": "uni -p quickapp-webview-union",
+    "build:app": "uni build -p app",
+    "build:app-android": "uni build -p app-android",
+    "build:app-ios": "uni build -p app-ios",
+    "build:custom": "uni build -p",
+    "build:h5": "uni build",
+    "build:h5:ssr": "uni build --ssr",
+    "build:mp-alipay": "uni build -p mp-alipay",
+    "build:mp-baidu": "uni build -p mp-baidu",
+    "build:mp-jd": "uni build -p mp-jd",
+    "build:mp-kuaishou": "uni build -p mp-kuaishou",
+    "build:mp-lark": "uni build -p mp-lark",
+    "build:mp-qq": "uni build -p mp-qq",
+    "build:mp-toutiao": "uni build -p mp-toutiao",
+    "build": "uni build -p mp-weixin",
+    "build:quickapp-webview": "uni build -p quickapp-webview",
+    "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
+    "build:quickapp-webview-union": "uni build -p quickapp-webview-union"
+  },
   "dependencies": {
-    "crypto-js": "^4.1.1"
+    "@dcloudio/uni-app": "3.0.0-3090920231225001",
+    "@dcloudio/uni-app-plus": "3.0.0-3090920231225001",
+    "@dcloudio/uni-components": "3.0.0-3090920231225001",
+    "@dcloudio/uni-h5": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-alipay": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-baidu": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-jd": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-kuaishou": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-lark": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-qq": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-toutiao": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-weixin": "3.0.0-3090920231225001",
+    "@dcloudio/uni-mp-xhs": "3.0.0-3090920231225001",
+    "@dcloudio/uni-quickapp-webview": "3.0.0-3090920231225001",
+    "clipboard": "^2.0.11",
+    "dayjs": "^1.11.7",
+    "pinia": "^2.0.36",
+    "uview-plus": "^3.1.45",
+    "vue": "3.2.47",
+    "vue-i18n": "9.10.1"
+  },
+  "devDependencies": {
+    "@dcloudio/types": "3.4.8",
+    "@dcloudio/uni-automator": "3.0.0-3090920231225001",
+    "@dcloudio/uni-cli-shared": "3.0.0-3090920231225001",
+    "@dcloudio/uni-stacktracey": "3.0.0-3090920231225001",
+    "@dcloudio/vite-plugin-uni": "3.0.0-3090920231225001",
+    "@vue/runtime-core": "3.4.21",
+    "sass": "^1.62.1",
+    "sass-loader": "^10.4.1",
+    "vite": "4.0.3"
   }
 }

+ 0 - 392
pages.json

@@ -1,392 +0,0 @@
-{
-	"easycom": {
-		"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
-	},
-	"pages": [{
-		"path": "pages/login",
-		"style": {
-			"navigationBarTitleText": "登录",
-			"navigationStyle": "custom"
-		}
-	}],
-
-	"subPackages": [ //分包
-		{
-			"root": "pages/globalPages", //首页
-			"pages": [{
-				"path": "home",
-				"style": {
-					"navigationBarTitleText": "首页",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "statistics",
-				"style": {
-					"navigationBarTitleText": "销售统计",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "statisticsMore",
-				"style": {
-					"navigationBarTitleText": "销售统计",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "moreData",
-				"style": {
-					"navigationBarTitleText": "更多数据",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "logs",
-				"style": {
-					"navigationBarTitleText": "日志",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "errCode",
-				"style": {
-					"navigationBarTitleText": "常见错误码",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "notice",
-				"style": {
-					"navigationBarTitleText": "通知",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "agreement",
-				"style": {
-					"navigationBarTitleText": "协议",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "setting",
-				"style": {
-					"navigationBarTitleText": "设置",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "test",
-				"style": {
-					"navigationBarTitleText": "测试",
-					"navigationStyle": "custom"
-				}
-			}]
-		},
-		{
-			"root": "pages/equipment", //设备
-			"pages": [{
-				"path": "search",
-				"style": {
-					"navigationBarTitleText": "设备搜索",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "detail",
-				"style": {
-					"navigationBarTitleText": "设备详情",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "comManage",
-				"style": {
-					"navigationBarTitleText": "商品管理",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "addCom",
-				"style": {
-					"navigationBarTitleText": "添加商品",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "addComList",
-				"style": {
-					"navigationBarTitleText": "添加商品",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "statistics",
-				"style": {
-					"navigationBarTitleText": "设备销售统计",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "statisticsMore",
-				"style": {
-					"navigationBarTitleText": "商品销售统计",
-					"navigationStyle": "custom"
-				}
-			}]
-		},
-		{
-			"root": "pages/commodity", //商品
-			"pages": [{
-					"path": "comEdit",
-					"style": {
-						"navigationBarTitleText": "商品编辑",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "search",
-					"style": {
-						"navigationBarTitleText": "商品搜索",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "publicCom",
-					"style": {
-						"navigationBarTitleText": "商品公库",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "addCom",
-					"style": {
-						"navigationBarTitleText": "新品建模",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "auditList",
-					"style": {
-						"navigationBarTitleText": "审核列表",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "publicSearch",
-					"style": {
-						"navigationBarTitleText": "公库搜索",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "commoditylist",
-					"style": {
-						"navigationBarTitleText": "商品清单",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "comListEdit",
-					"style": {
-						"navigationBarTitleText": "关联商品",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "application",
-					"style": {
-						"navigationBarTitleText": "应用",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "allGoodsSearch",
-					"style": {
-						"navigationBarTitleText": "所有商品列表",
-						"navigationStyle": "custom"
-					}
-				}
-			]
-		},
-		{
-			"root": "pages/order", //订单
-			"pages": [{
-					"path": "userInfo",
-					"style": {
-						"navigationBarTitleText": "用户信息",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "orderQuery",
-					"style": {
-						"navigationBarTitleText": "订单查询",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "refundList",
-					"style": {
-						"navigationBarTitleText": "退款列表",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "orderDetails",
-					"style": {
-						"navigationBarTitleText": "订单详情",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "riskOrder",
-					"style": {
-						"navigationBarTitleText": "风险订单",
-						"navigationStyle": "custom"
-					}
-				}, {
-					"path": "riskOrderDel",
-					"style": {
-						"navigationBarTitleText": "风险订单补扣",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "orderLogs",
-					"style": {
-						"navigationBarTitleText": "交易日志",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "orderDel",
-					"style": {
-						"navigationBarTitleText": "订单补扣",
-						"navigationStyle": "custom"
-					}
-				}
-			]
-		},
-		{
-			"root": "pages/replenish", //补货
-			"pages": [
-				{
-					"path": "replenishmentManagement",
-					"style": {
-						"navigationBarTitleText": "补货管理首页",
-						"navigationStyle": "custom",
-						"enablePullDownRefresh": true
-					}
-				},
-				{
-					"path": "replenishmentHomePage",
-					"style": {
-						"navigationBarTitleText": "补货首页",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "replenishmentRecordDetails",
-					"style": {
-						"navigationBarTitleText": "补货记录详情",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "replenishmentRecord",
-					"style": {
-						"navigationBarTitleText": "补货记录",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "invSearch",
-					"style": {
-						"navigationBarTitleText": "库存管理",
-						"navigationStyle": "custom"
-					}
-				},
-				{
-					"path": "invSearchDetail",
-					"style": {
-						"navigationBarTitleText": "库存管理详情",
-						"navigationStyle": "custom"
-					}
-				}
-			]
-		},
-		{
-			"root": "pages/point", //区域点位线路
-			"pages": [{
-				"path": "point",
-				"style": {
-					"navigationBarTitleText": "",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "lineDetail",
-				"style": {
-					"navigationBarTitleText": "",
-					"navigationStyle": "custom"
-				}
-			}]
-		},
-		{
-			"root": "pages/system", //人员系统配置
-			"pages": [{
-				"path": "employee",
-				"style": {
-					"navigationBarTitleText": "",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "addEmployee",
-				"style": {
-					"navigationBarTitleText": "",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "empDetail",
-				"style": {
-					"navigationBarTitleText": "",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "deviceManage",
-				"style": {
-					"navigationBarTitleText": "",
-					"navigationStyle": "custom"
-				}
-			}]
-		},
-		{
-			"root": "pages/activeDevice", //设备激活
-			"pages": [{
-				"path": "bindDevice",
-				"style": {
-					"navigationBarTitleText": "设备激活",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "deviceManage",
-				"style": {
-					"navigationBarTitleText": "设备管理",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "bindAliAcc",
-				"style": {
-					"navigationBarTitleText": "绑定支付宝",
-					"navigationStyle": "custom"
-				}
-			}, {
-				"path": "bindAliDev",
-				"style": {
-					"navigationBarTitleText": "设备激活",
-					"navigationStyle": "custom"
-				}
-			}]
-		}
-	],
-	"preloadRule": {
-		"pages/equipment/comManage": {
-			"network": "wifi",
-			"packages": ["pages/commodity"]
-		}
-	},
-	"condition": { //模式配置,仅开发期间生效
-		"current": 0, //当前激活的模式(list 的索引项)
-		"list": [{
-			"name": "", //模式名称
-			"path": "", //启动页面,必选
-			"query": "" //启动参数,在页面的onLoad函数里面得到
-		}]
-	}
-}

+ 0 - 221
pages/activeDevice/bindAliAcc.vue

@@ -1,221 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="账号绑定">
-		</u-navbar>
-
-		<view class="content flex flex-direction justify-between" :style="{height:fullHeight}">
-			<view class="top flex flex-direction align-center">
-				<view class="img">
-					<u-image width="400rpx" height="400rpx"
-						src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/alipayUid.png"
-						mode="widthFix" :lazy-load="true">
-					</u-image>
-				</view>
-				<view class="btn flex justify-between">
-					<view @click="save">保存二维码到手机相册</view>
-					<view>帮助</view>
-				</view>
-
-				<view class="input flex">
-					<input type="text" placeholder="请输入" placeholder-class="place-class" v-model="aliAcc" />
-					<view class="bind" @click="bind">
-						绑定
-					</view>
-				</view>
-			</view>
-
-			<view class="tips">
-				支付宝刷脸AI柜,需要绑定操作员的支付宝账号,操作员刷脸操作货柜时,系统将对操作员的支付宝账号进行授权。
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		updateByAli
-	} from "@/api/device/device.js"
-	import {
-		update
-	} from "@/api/system/employee.js"
-
-	import {
-		imgDownLoad
-	} from '@/utils/download.js'
-
-	export default {
-		data() {
-			return {
-				fullHeight: 0,
-				aliAcc: null,
-				userId: null,
-			}
-		},
-		onLoad(o) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".content").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						console.log(res.windowHeight, data.top)
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 54 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top - 20 + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			if (o.userId) {
-				this.userId = o.userId
-			}
-		},
-		methods: {
-			async bind() {
-				if (!this.aliAcc) {
-					this.$modal.msg('请输入支付宝用户id')
-					return
-				}
-				if (!this.userId) {
-					//商户绑定
-					await this.mercUpdate()
-				} else {
-					//员工绑定
-					await this.partnerUpdate()
-				}
-				console.log('成功')
-				this.$modal.msg('绑定成功~')
-				setTimeout(() => {
-					this.$tab.navigateBack()
-				}, 1000)
-			},
-
-			mercUpdate() {
-				return new Promise((resolve, reject) => {
-					updateByAli({
-						aliUserId: this.aliAcc,
-					}).then(res => {
-						resolve(res)
-					}).catch(err => {
-						reject(res)
-					})
-				})
-			},
-
-			partnerUpdate() {
-				return new Promise((resolve, reject) => {
-					update({
-						aliUserId: this.aliAcc,
-						userId: this.userId
-					}).then(res => {
-						resolve(res)
-					}).catch(err => {
-						reject(res)
-					})
-				})
-			},
-
-			save() {
-				let imgUrl = 'https://ossfile.mxrvending.com/assets/xy_merc_mini/images/alipayUid.png'
-				imgDownLoad(imgUrl).then(res=>{
-					uni.showToast({
-						title: '保存成功~',
-					})
-				}).catch(err=>{
-					uni.showToast({
-						title: '保存失败,请重试!',
-					})
-				})
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		position: relative;
-
-		.content {
-			background-color: #fff;
-			width: 724rpx;
-			margin: 20rpx 13rpx 0;
-			overflow: hidden;
-			border-radius: 12rpx;
-
-			.top {
-				.btn {
-					width: 400rpx;
-					color: #3876f3;
-					text-decoration: underline;
-					margin-top: 50rpx;
-
-				}
-
-				.input {
-					width: 460rpx;
-					line-height: 80rpx;
-					height: 80rpx;
-					margin-top: 70rpx;
-
-					>input {
-						line-height: 80rpx;
-						height: 80rpx;
-						width: 76%;
-						background-color: #f6f8fb;
-						padding: 0 30rpx;
-						border-top-left-radius: 18rpx;
-						border-bottom-left-radius: 18rpx;
-					}
-
-					>view {
-						width: 24%;
-						text-align: center;
-						border-top-right-radius: 18rpx;
-						border-bottom-right-radius: 18rpx;
-						background-color: #3876f3;
-						color: #fff;
-					}
-				}
-
-				.place-class {
-					color: #dcdcdc;
-				}
-			}
-
-			.tips {
-				background-color: #ebf2ff;
-				padding: 16rpx 20rpx;
-				color: #3876f3;
-				font-size: 26rpx;
-				line-height: 40rpx;
-			}
-		}
-
-		.img {
-			width: 400rpx;
-			height: 400rpx;
-			margin-top: 70rpx;
-		}
-
-		.canvas-box {
-			position: absolute;
-			left: -1000rpx;
-		}
-	}
-</style>

+ 0 - 215
pages/activeDevice/bindAliDev.vue

@@ -1,215 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="设备激活">
-		</u-navbar>
-
-		<view class="device-img flex flex-direction">
-			<view class="tips flex justify-between align-center" v-if="!isBindAli">
-				<view class="bind-tip">
-					您还没绑定支付宝
-				</view>
-				<xbutton round="50rpx" width="160rpx" @click="bindAliAcc">立即绑定</xbutton>
-			</view>
-			<view class="img">
-				<u-image width="147rpx" src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/device.png"
-					mode="widthFix" :lazy-load="true">
-				</u-image>
-			</view>
-		</view>
-
-		<view class="device-msg">
-			<view class="msg-item">
-				<view class="">
-					激活状态
-				</view>
-				<view class="">
-					{{device.activeState==1?'已激活':'未激活'}}
-				</view>
-			</view>
-			<view class="msg-item">
-				<view class="">
-					工控SN
-				</view>
-				<view class="">
-					{{device.deviceSn}}
-				</view>
-			</view>
-			<view class="msg-item">
-				<view class="">
-					商户前缀
-				</view>
-				<view class="">
-					{{device.mercPrefix}}
-				</view>
-			</view>
-			<view class="msg-item">
-				<view class="">
-					设备编号
-				</view>
-				<view class="">
-					{{device.deviceId}}
-				</view>
-			</view>
-
-		</view>
-
-		<view class="btn flex justify-between safe-bottom">
-			<view style="width:48%">
-				<xbutton size="large" round="82rpx" @click="refesh">刷新状态</xbutton>
-			</view>
-			<view style="width:48%">
-				<xbutton size="large" round="82rpx" @click="help">激活帮助</xbutton>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		userInfoBySelf,
-		aliDeviceObj
-	} from "@/api/device/device.js"
-	export default {
-		data() {
-			return {
-				isBindAli: true,
-				deviceId: null,
-				device: {
-
-				}
-			}
-		},
-		onLoad(o) {
-			this.deviceId = o.id;
-		},
-
-		onShow() {
-			this.getUserMsg()
-			this.getDeviceMsg()
-		},
-
-		methods: {
-			getDeviceMsg() {
-				aliDeviceObj({
-					deviceId: this.deviceId
-				}).then(res => {
-					this.device = res.data
-				}).catch(err => {
-
-				})
-			},
-
-			getUserMsg() {
-				userInfoBySelf().then(res => {
-					let data = res.data
-					this.isBindAli = data.aliUserId ? true : false;
-				})
-			},
-
-			refesh() {
-				this.getDeviceMsg()
-			},
-
-			help() {
-
-			},
-
-			bindAliAcc() {
-				this.$tab.navigateTo('/pages/activeDevice/bindAliAcc')
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		position: relative;
-		text-align: center;
-
-
-
-		.device-img {
-			width: 724rpx;
-			margin-left: 13rpx;
-			background-color: #F5F5F5;
-			border-radius: 14rpx;
-			margin-top: 20rpx;
-			padding-bottom: 40rpx;
-
-			.tips {
-				border-top-left-radius: 14rpx;
-				border-top-right-radius: 14rpx;
-				line-height: 80rpx;
-				font-size: 26rpx;
-				height: 80rpx;
-				padding: 0 40rpx;
-				background: linear-gradient(180deg, #DEE9FF, rgba(217,231,255,1));
-			}
-
-			.img {
-				width: 147rpx;
-				height: 281rpx;
-				margin-top: 75rpx;
-				margin-left: 292rpx;
-			}
-		}
-
-		.device-msg {
-			width: 724rpx;
-			margin-left: 13rpx;
-			margin-top: 20rpx;
-			background-color: #F5F5F5;
-			border-radius: 14rpx;
-			padding: 0 37rpx;
-
-			.msg-item {
-				line-height: 92rpx;
-				font-size: 28rpx;
-				color: #333;
-				display: flex;
-				justify-content: space-between;
-
-				&+.msg-item {
-					border-top: 1rpx solid #E2E2E2;
-				}
-
-				>view:nth-child(1) {}
-
-				>view:nth-child(2) {
-					color: #777777;
-				}
-			}
-		}
-
-		.device-code {
-			font-size: 54rpx;
-			font-weight: bold;
-			margin-top: 46%;
-			color: #333;
-		}
-
-		.device-tips {
-			font-size: 28rpx;
-			margin-top: 30rpx;
-		}
-
-		.device-err {
-			font-size: 22rpx;
-			color: red;
-			margin-top: 40rpx;
-		}
-
-		.scan {
-			margin-top: 36rpx;
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			bottom: 24rpx;
-			padding: 0 24rpx;
-		}
-	}
-</style>

+ 0 - 171
pages/activeDevice/bindDevice.vue

@@ -1,171 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="设备激活">
-		</u-navbar>
-
-		<view class="img">
-			<u-image width="147rpx" src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/device.png"
-				mode="widthFix" :lazy-load="true">
-			</u-image>
-		</view>
-
-		<view class="device-msg">
-			<view class="msg-item">
-				<view class="">
-					设备编号
-				</view>
-				<view class="">
-					{{deviceId}}
-				</view>
-			</view>
-			<view class="msg-item">
-				<view class="">
-					机器状态
-				</view>
-				<view class="" style="color: #2C6FF3;">
-					{{err}}
-				</view>
-			</view>
-		</view>
-
-		<view class="btn safe-bottom" v-if="!isActive">
-			<xbutton size="large" @click="activeDeviceNow">激活货柜</xbutton>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		deviceActive,
-		getActiveInfo
-	} from "@/api/device/device.js"
-	export default {
-		data() {
-			return {
-				deviceId: '请扫描二维码',
-				err: '未激活',
-				isActive: false //true已激活false未激活
-			}
-		},
-		onLoad(o) {
-			this.deviceId = o.id;
-			this.getDeviceStatus()
-		},
-		methods: {
-			getDeviceStatus() {
-				getActiveInfo({
-					deviceId: this.deviceId
-				}).then(res => {
-					this.isActive = false
-					this.err = '未激活'
-				}).catch(err => {
-					this.isActive = true
-					if(err.length>10){
-						this.err = '请重新扫码~'
-					}else{
-						this.err = err
-					}
-				})
-			},
-
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						console.log('条码内容:' + res.result);
-						let deviceId = res.result.split('=')[1]
-						this.deviceId = deviceId
-					}
-				});
-			},
-
-			activeDeviceNow() {
-				deviceActive({
-					deviceId: this.deviceId
-				}).then(res => {
-					this.$modal.msg('激活成功~')
-					setTimeout(() => {
-						this.$tab.redirectTo(`/pages/equipment/detail?id=${this.deviceId}`)
-					}, 1500)
-				}).catch(err => {
-					if (err.indeOf('com.netflix') == -1) {
-						this.err = err
-					} else {
-						this.err = '获取失败'
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		position: relative;
-		text-align: center;
-
-		.img {
-			width: 147rpx;
-			height: 281rpx;
-			margin-top: 75rpx;
-			margin-left: 292rpx;
-		}
-
-		.device-msg {
-			width: 724rpx;
-			margin-left: 13rpx;
-			margin-top: 115rpx;
-			background-color: #F5F5F5;
-			border-radius: 14rpx;
-			padding: 0 37rpx;
-
-			.msg-item {
-				line-height: 92rpx;
-				font-size: 28rpx;
-				color: #333;
-				display: flex;
-				justify-content: space-between;
-
-				&+.msg-item {
-					border-top: 1rpx solid #E2E2E2;
-				}
-
-				>view:nth-child(1) {}
-
-				>view:nth-child(2) {
-					color: #777777;
-				}
-			}
-		}
-
-		.device-code {
-			font-size: 54rpx;
-			font-weight: bold;
-			margin-top: 46%;
-			color: #333;
-		}
-
-		.device-tips {
-			font-size: 28rpx;
-			margin-top: 30rpx;
-		}
-
-		.device-err {
-			font-size: 22rpx;
-			color: red;
-			margin-top: 40rpx;
-		}
-
-		.scan {
-			margin-top: 36rpx;
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			bottom: 24rpx;
-			padding: 0 24rpx;
-		}
-	}
-</style>

+ 0 - 377
pages/activeDevice/deviceManage.vue

@@ -1,377 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="设备管理"></u-navbar>
-		<view class="content">
-			<view class="search">
-				<u-search animation placeholder="搜索设备" :clearabled="false" v-model="keyword" :showAction="false"
-					@search="search"></u-search>
-				<view class="scan-icon" @click="scan">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-			</view>
-			<view class="tab-wrap">
-				<view class="tab">
-					<u-tabs :list="tabList" :activeStyle="{color: '#333',fontWeight: 'bold',fontSize:'36rpx'}"
-						:inactiveStyle="{fontSize:'32rpx'}" :scrollable="false" :current="current" @click="tabClick"
-						lineColor="#2C6FF3">
-					</u-tabs>
-				
-				</view>
-			</view>
-
-			<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100"
-				@scrolltolower="scrolltolower" :style="{height:fullHeight}">
-
-				<view class="list" v-if="list&&list.length>0">
-					<block v-for="(item, index) in list" :key="index">
-						<view class="thumb-box" @click="detail(item)">
-							<!-- <view>
-								<image class="select-img"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/no_selected.png"
-									mode="widthFix" v-show="item.noSelect"></image>
-								<image class="select-img"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-									mode="widthFix" v-show="!item.noSelect&&item.checked"></image>
-								<image class="select-img"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-									mode="widthFix" v-show="!item.noSelect&&!item.checked"></image>
-							</view> -->
-							<view class="check-content">
-								<!-- <view class="comm-img">
-									<u--image width="130rpx" height="130rpx" :src="item.cover" mode="widthFix"
-										:lazy-lord="true"></u--image>
-								</view> -->
-								<view class="comm-main">
-									<view>
-										{{item.deviceName||'/'}}
-									</view>
-									<view v-if="item.activeState==2">
-										商户前缀:{{item.mercPrefix}} 
-										<!-- <text class="under-line-text" @click.stop="copy(item.mercPrefix)">复制</text> -->
-									</view>
-									<view>
-										设备id:{{item.deviceId}} 
-										<!-- <text class="under-line-text"
-											@click.stop="copy(item.deviceId)">复制</text> -->
-									</view>
-									<view>
-										设备sn:{{item.deviceSn}} 
-									<!-- 	<text class="under-line-text"
-											@click.stop="copy(item.deviceSn)">复制</text> -->
-									</view>
-									<view v-if="item.activeState==1">
-										激活时间:{{item.activeTime}}
-									</view>
-								</view>
-							</view>
-						</view>
-					</block>
-					<view class="more" style="overflow: hidden;">
-						<u-loadmore :status="status" v-if="list.length>=1" />
-					</view>
-				</view>
-				<view class="empty" v-if="list.length==0">
-					<u-empty mode="list" text="没有设备!"></u-empty>
-				</view>
-			</scroll-view>
-		</view>
-
-		<!--<view class="btn">
-			<xbutton size="large" @click="submit">{{btnName}}({{selectList.length}})</xbutton>
-		</view> -->
-	</view>
-</template>
-
-<script>
-	import {
-		aliDeviceActivePage
-	} from "@/api/device/device.js"
-	export default {
-		data() {
-			return {
-				page: 1, //商品分页
-				size: 10,
-
-				status: 'loadmore', //加载更多
-
-				tabList: [{
-						name: '未激活'
-					},
-					{
-						name: '已激活'
-					}
-				],
-				current: 0,
-				fullHeight: 0,
-
-				list: []
-			}
-		},
-
-		computed: {
-			activeState() {
-				let val = 1;
-				if (this.current == 0) {
-					val = 2
-				} else {
-					val = 1
-				}
-				return val
-			}
-		},
-
-		onLoad(o) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			this.getList()
-		},
-		methods: {
-			search(val) {
-				this.reset();
-				this.getList()
-			},
-
-			tabClick(e) {
-				console.log(e.index)
-				this.current = e.index
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.getList()
-					}
-				});
-			},
-
-			//根据类目获取商品列表
-			getList(id) {
-				aliDeviceActivePage({
-					page: {
-						current: this.page,
-						size: this.size
-					},
-					activeState: this.activeState
-				}).then(res => {
-					let newData = res.data.records;
-					if (newData.length < 10) {
-						this.status = "nomore"
-					} else {
-						this.status = "loadmore"
-					}
-					this.list = this.list.concat(newData)
-				})
-			},
-
-			//触底加载更多
-			scrolltolower() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getList()
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.list = [];
-			},
-
-			copy(text) {
-				uni.setClipboardData({
-					data: toString(text),
-					success: (data) => {
-						uni.showToast({
-							title: '复制成功'
-						})
-					},
-					fail: function(err) {
-						console.log(err)
-					},
-					complete: function(res) {
-						console.log(res)
-					}
-				})
-			},
-
-			submit() {
-
-			},
-			
-			detail(item){
-				this.$tab.navigateTo(`/pages/activeDevice/bindAliDev?id=${item.deviceId}`)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-
-			.search {
-				padding: 24rpx 24rpx 12rpx;
-				background-color: #fff;
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					right: 36rpx;
-					top: 38rpx;
-					z-index: 2;
-				}
-
-				.search-history {
-
-					.history-item {
-						margin-right: 24rpx;
-						padding: 0 12rpx;
-						background-color: #f2f2f2;
-						color: #333;
-						font-size: 24rpx;
-						line-height: 40rpx;
-						border-radius: 40rpx;
-						margin-top: 24rpx;
-					}
-				}
-			}
-
-			.tab-wrap {
-				background-color: #fff;
-				.tab{
-					width:50%;
-				}
-			}
-
-			.list {
-				width: 100%;
-				padding: 0rpx 13rpx 12rpx;
-				padding-bottom: calc(110rpx + env(safe-area-inset-bottom) / 2);
-				overflow: hidden;
-
-				.thumb-box {
-					border-bottom: 1rpx solid #f4f4f4;
-					display: flex;
-					flex-flow: row nowrap;
-					padding: 20rpx 30rpx;
-					align-items: center;
-					background-color: #fff;
-					border-radius: 12rpx;
-					margin-top: 12rpx;
-				}
-
-				.select-img {
-					width: 40rpx;
-					height: 40rpx;
-				}
-
-				.check-content {
-					display: flex;
-					flex-direction: row;
-					align-items: center;
-
-					.comm-img {
-						width: 130rpx;
-						height: 130rpx;
-						display: flex;
-						flex-direction: row;
-						align-items: center;
-						justify-content: space-around;
-
-						image {
-							width: 100%;
-						}
-					}
-
-					.comm-main {
-						box-sizing: border-box;
-						color: #333;
-						font-size: 28rpx;
-
-						.under-line-text {
-							font-size: 26rpx !important;
-							font-weight: 500;
-							font-style: italic;
-							text-decoration: underline;
-							color: #2C6FF3 !important;
-							margin-left: 24rpx;
-							background-color: #fff !important;
-						}
-
-						>view {
-							padding: 4rpx 0;
-							line-height: 50rpx;
-						}
-
-						>view:nth-child(1) {
-							font-size: 30rpx;
-							font-weight: bold;
-							color: #333;
-						}
-
-						>view:nth-child(2) {
-							// font-size: 28rpx;
-						}
-
-						>view:nth-child(3) {
-							// font-size: 28rpx;
-						}
-
-						>view:nth-child(4) {
-							// font-size: 28rpx;
-
-							text {
-								font-weight: bold;
-								color: red;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			padding: 0 24rpx;
-		}
-
-		.empty {
-			position: absolute;
-			left: 50%;
-			top: 50%;
-			transform: translate(-50%, -50%);
-		}
-	}
-</style>

+ 0 - 972
pages/commodity/addCom.vue

@@ -1,972 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="商品建模"></u-navbar>
-		<view class="content">
-			<u--form labelPosition="left" :model="form" :rules="rules" ref="form" errorType="toast">
-				<!-- <u-form-item label="类型" borderBottom ref="item2">
-					<u-radio-group v-model="form.type">
-						<u-radio :customStyle="{marginRight: '16rpx'}" label="标准商品" name="1">
-						</u-radio>
-						<u-radio :customStyle="{marginRight: '16rpx'}" label="非标商品" name="2">
-						</u-radio>
-					</u-radio-group>
-				</u-form-item> -->
-				<u-form-item required label="名称" prop="goodsName" borderBottom ref="item1">
-					<u--input v-model="form.goodsName" placeholder="请输入商品名称" border="none"></u--input>
-				</u-form-item>
-				<view class="bar-code">
-					<u-form-item required label="条码" prop="barcode" borderBottom ref="item1">
-						<u--input v-model="form.barcode" placeholder="请输入条码" border="none"></u--input>
-					</u-form-item>
-					<view class="scan-icon" @click.stop="scan">
-						<u-icon name="scan" size="22" color="#909399"></u-icon>
-					</view>
-				</view>
-				<u-form-item required label="类目" prop="categoryName" borderBottom @click="chooseCategoty" ref="item1">
-					<u--input v-model="form.categoryName" disabled placeholder="请选择商品类目" disabledColor="#ffffff"
-						border="none"></u--input>
-					<u-icon slot="right" name="arrow-right"></u-icon>
-				</u-form-item>
-				<u-form-item required label="品牌" prop="brandName" borderBottom ref="item1">
-					<u--input v-model="form.brandName" placeholder="请输入商品品牌" border="none"></u--input>
-				</u-form-item>
-				<!-- 	<u-form-item required label="规格" prop="unitName" borderBottom ref="item1">
-					<u--input v-model="form.unitName" placeholder="请输入计量单位" border="none"></u--input>
-				</u-form-item> -->
-				<u-form-item required label="规格" borderBottom @click="showSelect('unitName')" ref="item1">
-					<u--input v-model="form.unitName" disabled placeholder="请选择商品规格" disabledColor="#ffffff"
-						border="none">
-					</u--input>
-					<u-icon slot="right" name="arrow-right"></u-icon>
-				</u-form-item>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="69码示例">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/barcode.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/barcode.png"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<view class="form-item">
-							<u-form-item required labelPosition="top" prop="imgBarcode" labelWidth="350" label="商品69码">
-								<view class="img-upload">
-									<u--image radius="4" width="160rpx" height="160rpx"
-										:src="form.imgs.imgBarcode||imgBg" mode="aspectFit" :lazy-lord="true"
-										@click="imgClick('imgBarcode')"></u--image>
-								</view>
-							</u-form-item>
-						</view>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="封面示例">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgPositive.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgPositive.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<view class="form-item">
-							<u-form-item required labelPosition="top" prop="cover" labelWidth="350" label="封面图片"
-								ref="item1">
-								<view class="img-upload">
-									<u--image radius="4" width="160rpx" height="160rpx" :src="form.cover||imgBg"
-										mode="aspectFit" :lazy-lord="true" @click="imgClick('cover')"></u--image>
-								</view>
-							</u-form-item>
-							<view class="tips">
-								小程序商品陈列展示用
-							</view>
-						</view>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgPositive.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgPositive.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgPositive" labelWidth="80" label="正面图片"
-							ref="item1">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx" :src="form.imgs.imgPositive||imgBg"
-									mode="aspectFit" :lazy-lord="true" @click="imgClick('imgPositive')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgBack.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgBack.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgBack" labelWidth="80" label="背面图片">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx" :src="form.imgs.imgBack||imgBg"
-									mode="aspectFit" :lazy-lord="true" @click="imgClick('imgBack')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgLeft.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgLeft.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgLeft" labelWidth="80" label="左面图片">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx" :src="form.imgs.imgLeft||imgBg"
-									mode="aspectFit" :lazy-lord="true" @click="imgClick('imgLeft')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgRight.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgRight.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgRight" labelWidth="80" label="右面图片">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx" :src="form.imgs.imgRight||imgBg"
-									mode="aspectFit" :lazy-lord="true" @click="imgClick('imgRight')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgTop.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgTop.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgTop" labelWidth="80" label="顶部图片">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx" :src="form.imgs.imgTop||imgBg"
-									mode="aspectFit" :lazy-lord="true" @click="imgClick('imgTop')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgBottom.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgBottom.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgBottom" labelWidth="80" label="底部图片">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx" :src="form.imgs.imgBottom||imgBg"
-									mode="aspectFit" :lazy-lord="true" @click="imgClick('imgBottom')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgPositiveBias.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgPositiveBias.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgPositiveBias" labelWidth="80" label="正斜图片">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx"
-									:src="form.imgs.imgPositiveBias||imgBg" mode="aspectFit" :lazy-lord="true"
-									@click="imgClick('imgPositiveBias')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgLeftBias.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgLeftBias.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgLeftBias" labelWidth="80" label="左斜图片">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx" :src="form.imgs.imgLeftBias||imgBg"
-									mode="aspectFit" :lazy-lord="true" @click="imgClick('imgLeftBias')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgRightBias.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgRightBias.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item required labelPosition="top" prop="imgRightBias" labelWidth="80" label="右斜图片">
-							<view class="img-upload">
-								<u--image radius="4" width="160rpx" height="160rpx" :src="form.imgs.imgRightBias||imgBg"
-									mode="aspectFit" :lazy-lord="true" @click="imgClick('imgRightBias')"></u--image>
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-				<u-row customStyle="margin-top: 20px;">
-					<u-col span="5">
-						<u-form-item labelPosition="top" labelWidth="120" label="商品图片(示例)">
-							<view class="example-img">
-								<image @click="preview"
-									data-src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgRight.png"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/imgRight.png?x-oss-process=image/resize,m_fill,h_300,w_300"
-									mode="widthFix"></image>
-							</view>
-						</u-form-item>
-					</u-col>
-					<u-col span="7">
-						<u-form-item labelPosition="top" labelWidth="80" label="其他图片">
-							<view class="img-upload">
-								<ImgUpload :maxCount="4" v-model="form.imgs.others" />
-							</view>
-						</u-form-item>
-					</u-col>
-				</u-row>
-
-
-			</u--form>
-			<u-picker :show="show" :columns="actions" :closeOnClickOverlay="true" keyName="name" @close="show=false"
-				@confirm="actionSelect" @cancel="show = false">
-			</u-picker>
-		</view>
-
-		<view class="btn safe-bottom" v-if="checkStatus=='1'">
-			<xbutton bgColor="#5ac725" size="large">审核通过</xbutton>
-		</view>
-		<view class="btn safe-bottom" v-else-if="checkStatus=='-1'">
-			<xbutton delay="1500" size="large" @click="submit" throttleTime="1500">重新提交</xbutton>
-		</view>
-		<view class="btn safe-bottom" v-else-if="checkStatus=='0'">
-			<xbutton bgColor="#f9ae3d" delay="1500" size="large" throttleTime="1500">审核中</xbutton>
-		</view>
-		<view class="btn safe-bottom" v-else>
-			<xbutton delay="1500" size="large" @click="submit" throttleTime="1500">提交审核</xbutton>
-		</view>
-
-		<!-- 弹框 -->
-		<xpopup :show="popShow" @close="popClose" :showBtn="false" title="选择类目">
-			<!-- 类目选择 -->
-			<scroll-view style="height: 600rpx;" scroll-y scroll-with-animation>
-				<view class="popup-content">
-					<tki-tree style="width:100%;" :range="categoryOptions" :foldAll="false" rangeKey="name"
-						idKey="categoryCode" buttonName="选中" @btnClick="categorySubmit">
-					</tki-tree>
-				</view>
-			</scroll-view>
-		</xpopup>
-
-		<ImgUploadCut @success="imgSuccess" ref="uploadImg" />
-	</view>
-</template>
-
-<script>
-	import ImgUploadCut from "./components/imgUploadCut"
-	import ImgUpload from "./components/imgUpload"
-	import tkiTree from "@/components/tki-tree/tki-tree.vue";
-	import {
-		save,
-		update,
-		searchObj,
-		categoryTree,
-		listIdName
-	} from '@/api/commodity/goodsMode.js'
-	import {
-		goodsCategory
-	} from '@/api/commodity/goods.js'
-	//验证规则
-	let rulesObj = {
-		type: 'string',
-		required: true,
-		message: '必填项',
-		trigger: ['change']
-	}
-
-	export default {
-		components: {
-			ImgUpload,
-			ImgUploadCut,
-			tkiTree
-		},
-		data() {
-			return {
-				form: {
-					goodsName: undefined, //商品名称
-					barcode: undefined, //条形码
-					brandName: undefined, //品牌
-					categoryName: undefined, //分类
-					unitName: undefined, //规格
-					cover: undefined, //封面图片
-					imgs: {
-						imgBarcode: undefined, //69码图片
-						imgPositive: undefined, //正面
-						imgBack: undefined, //背面
-						imgLeft: undefined, //左边
-						imgRight: undefined, //右边
-						imgTop: undefined, //顶部
-						imgBottom: undefined, //底部图片
-						imgPositiveBias: undefined, //正斜图片
-						imgLeftBias: undefined, //左斜图片
-						imgRightBias: undefined, //右斜图片
-						others: []
-					}
-
-				},
-				rules: {
-					'unitName': {
-						type: 'string',
-						required: true,
-						message: '请选择商品规格~',
-						trigger: ['change']
-					},
-					'goodsName': {
-						type: 'string',
-						required: true,
-						message: '请填入商品名称~',
-						trigger: ['change']
-					},
-					'barcode': {
-						type: 'string',
-						required: true,
-						message: '请填入商品条码~',
-						trigger: ['change']
-					},
-					'brandName': {
-						type: 'string',
-						required: true,
-						message: '请填入商品品牌~',
-						trigger: ['change']
-					},
-					'categoryName': {
-						type: 'string',
-						required: true,
-						message: '请选择商品类目~',
-						trigger: ['change']
-					},
-					'cover': {
-						validator: (rule, value, callback) => {
-							if (!this.form.cover || this.form.cover.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传封面图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgBarcode': {
-						validator: (rule, value, callback) => {
-							if (!this.form.cover || this.form.cover.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传69码图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgPositive': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgPositive || this.form.imgs.imgPositive.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传正面图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgBack': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgBack || this.form.imgs.imgBack.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传背面图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgLeft': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgLeft || this.form.imgs.imgLeft.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传左面图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgRight': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgRight || this.form.imgs.imgRight.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传右面图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgTop': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgTop || this.form.imgs.imgTop.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传顶部图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgBottom': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgBottom || this.form.imgs.imgBottom.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传底部图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgPositiveBias': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgPositiveBias || this.form.imgs.imgPositiveBias.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传正斜图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgLeftBias': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgLeftBias || this.form.imgs.imgLeftBias.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传左斜图片~',
-						trigger: ['change', 'blur']
-					},
-					'imgRightBias': {
-						validator: (rule, value, callback) => {
-							if (!this.form.imgs.imgRightBias || this.form.imgs.imgRightBias.length == 0) {
-								return false
-							} else {
-								return true
-							}
-						},
-						message: '请上传右斜图片~',
-						trigger: ['change', 'blur']
-					}
-				},
-				imgBg: 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/upload-bg.png',
-				show: false,
-				selectType: 'categoryCode',
-				actions: [{
-						name: '全部',
-					},
-					{
-						name: '饮料',
-					},
-					{
-						name: '槟榔',
-					},
-				],
-
-				radio: '',
-				switchVal: false,
-
-				categoryOptions: [], //类目options
-				unitOptions: [], //规格options
-				title: null, //picker标题
-
-				popShow: false,
-				type: 'add', //add添加、edit编辑
-				checkStatus: null,
-				imgType: null,
-			};
-		},
-
-		onLoad(o) {
-			this.getCategory()
-			this.getUnit()
-			if (o.id) { //编辑
-				this.type = 'edit'
-				this.getDetail(o.id)
-			} else { //新增暂存数据反显
-				if (uni.getStorageSync('goodsAddModal')) {
-					this.form = JSON.parse(uni.getStorageSync('goodsAddModal'))
-				}
-			}
-		},
-
-		watch: {
-			form: {
-				handler(newVal, oldVal) {
-					console.log('暂存建模内容',newVal)
-					if (this.type != 'edit') {
-						uni.setStorageSync('goodsAddModal', JSON.stringify(newVal))
-					}
-				},
-				deep: true
-			}
-		},
-
-		methods: {
-			//获取详情
-			getDetail(id) {
-				searchObj({
-					id: id
-				}).then(res => {
-					let data = res.data;
-					if (data) {
-						this.checkStatus = data.status; //审核状态
-						// 组装反显参数
-						let newData = {
-							id: data.id,
-							goodsName: data.goodsName, //商品名称
-							barcode: data.barcode, //条形码
-							brandName: data.brandName, //品牌
-							categoryCode: data.categoryCode, //分类
-							categoryName: data.categoryName, //分类名称
-							unitName: data.unitName, //规格
-							cover: [data.cover], //封面图片
-							imgs: {
-								imgBarcode: undefined, //69码图片
-								imgPositive: undefined, //正面
-								imgBack: undefined, //背面
-								imgLeft: undefined, //左边
-								imgRight: undefined, //右边
-								imgTop: undefined, //顶部
-								imgBottom: undefined, //底部图片
-								imgPositiveBias: undefined, //正斜图片
-								imgLeftBias: undefined, //左斜图片
-								imgRightBias: undefined, //右斜图片
-								others: []
-							}
-						}
-
-						data.imgs.forEach(i => {
-							if (i.type == 'barcode') {
-								newData.imgs.imgBarcode = i.imgUrl
-							}
-							if (i.type == 'top') {
-								newData.imgs.imgTop = i.imgUrl
-							}
-							if (i.type == 'back') {
-								newData.imgs.imgBack = i.imgUrl
-							}
-							if (i.type == 'left') {
-								newData.imgs.imgLeft = i.imgUrl
-							}
-							if (i.type == 'positive') {
-								newData.imgs.imgPositive = i.imgUrl
-							}
-							if (i.type == 'right') {
-								newData.imgs.imgRight = i.imgUrl
-							}
-							if (i.type == 'bottom') {
-								newData.imgs.imgBottom = i.imgUrl
-							}
-							if (i.type == 'positive_bias') {
-								newData.imgs.imgPositiveBias = i.imgUrl
-							}
-							if (i.type == 'left_bias') {
-								newData.imgs.imgLeftBias = i.imgUrl
-							}
-							if (i.type == 'right_bias') {
-								newData.imgs.imgRightBias = i.imgUrl
-							}
-							if (i.type == 'others') {
-								newData.imgs.others.push(i.imgUrl)
-							}
-
-						})
-
-						this.form = JSON.parse(JSON.stringify(newData))
-					}
-				})
-			},
-
-			fixImgSize(url) {
-				return url + '?x-oss-process=image/resize,m_fill,h_300,w_300'
-			},
-
-			imgClick(type) {
-				this.imgType = type;
-				let obj={
-					selWidth: '500upx',
-					selHeight: '800upx',
-					inner: true
-				}
-				
-				switch (type){
-					case 'cover':
-						obj={
-							selWidth: '500upx',
-							selHeight: '526upx',
-							inner: true
-						}
-						break;
-					default:
-						break;
-				}
-				this.$refs.uploadImg.fChooseImg(obj)
-			},
-
-			imgSuccess(url) {
-				console.log('图片路径',url)
-				switch (this.imgType) {
-					case 'imgBarcode':
-						this.form.imgs.imgBarcode = url
-						break;
-					case 'cover':
-						this.form.cover = url
-						break;
-					case 'imgPositive':
-						this.form.imgs.imgPositive = url
-						break;
-					case 'imgBack':
-						this.form.imgs.imgBack = url
-						break;
-					case 'imgLeft':
-						this.form.imgs.imgLeft = url
-						break;
-					case 'imgRight':
-						this.form.imgs.imgRight = url
-						break;
-					case 'imgTop':
-						this.form.imgs.imgTop = url
-						break;
-					case 'imgBottom':
-						this.form.imgs.imgBottom = url
-						break;
-					case 'imgPositiveBias':
-						this.form.imgs.imgPositiveBias = url
-						break;
-					case 'imgLeftBias':
-						this.form.imgs.imgLeftBias = url
-						break;
-					case 'imgRightBias':
-						this.form.imgs.imgRightBias = url
-						break;
-					default:
-						break;
-				}
-				this.form=JSON.parse(JSON.stringify(this.form))
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.form.barcode = res.result;
-					}
-				});
-			},
-
-			// 获取商品类目
-			getCategory() {
-				categoryTree({}).then(res => {
-					this.categoryOptions = res.data;
-				})
-			},
-
-			chooseCategoty() {
-				this.popShow = true
-			},
-
-			popClose() {
-				this.popShow = false
-			},
-
-			categorySubmit(item) {
-				this.form.categoryCode = item.id;
-				this.form.categoryName = item.name;
-				this.popClose()
-			},
-
-			//获取规格
-			getUnit() {
-				listIdName().then(res => {
-					let data = res.data;
-					let newData = data.map(i => {
-						return {
-							id: i.id,
-							name: i.unitName
-						}
-					})
-					this.unitOptions = newData;
-				})
-			},
-
-			// 显示下拉框
-			showSelect(type) {
-				this.selectType = type;
-				if (type == 'categoryCode') {
-					this.title = '请选择类目';
-					this.actions = [this.categoryOptions];
-				} else {
-					this.title = '请选择规格';
-					this.actions = [this.unitOptions];
-				}
-				this.show = true;
-			},
-
-			// 下拉选择
-			actionSelect(e) {
-				console.log(e)
-				if (this.selectType === 'categoryCode') { // 分类
-					this.form.categoryCode = e.value[0].name;
-					this.$refs.form.validateField('categoryCode');
-				} else { //规格
-					this.form.unitName = e.value[0].name;
-					this.$refs.form.validateField('unitName');
-				}
-				this.show = false
-			},
-
-			//表单提交
-			submit() {
-				console.log(this.form)
-				this.$refs.form.validate().then(res => {
-					let params = {
-						barcode: this.form.barcode,
-						brandName: this.form.brandName,
-						categoryCode: this.form.categoryCode,
-						goodsName: this.form.goodsName,
-						type: this.form.type,
-						unitName: this.form.unitName,
-						cover: this.form.cover,
-						imgs: {
-							imgBarcode: this.form.imgs.imgBarcode,
-							imgPositive: this.form.imgs.imgPositive, //正面
-							imgBack: this.form.imgs.imgBack, //背面
-							imgLeft: this.form.imgs.imgLeft, //左边
-							imgRight: this.form.imgs.imgRight, //右边
-							imgTop: this.form.imgs.imgTop, //顶部
-							imgBottom: this.form.imgs.imgBottom, //底部图片
-							imgPositiveBias: this.form.imgs.imgPositiveBias, //正斜图片
-							imgLeftBias: this.form.imgs.imgLeftBias, //左斜图片
-							imgRightBias: this.form.imgs.imgRightBias, //右斜图片
-							others: this.form.imgs.others
-						}
-					}
-					if (this.form.id) {
-						params.id = this.form.id
-						update(params).then(res => {
-							this.$modal.msg('修改成功~')
-							setTimeout(() => {
-								this.$tab.navigateTo('/pages/commodity/auditList')
-							}, 1000)
-						}).catch(err => {
-
-						})
-					} else {
-						save(params).then(res => {
-							uni.setStorageSync('goodsAddModal', '') //清空临时存储
-							this.$modal.msg('新建成功~')
-							setTimeout(() => {
-								this.$tab.navigateTo('/pages/commodity/auditList')
-							}, 1000)
-						}).catch(err => {
-
-						})
-					}
-				}).catch(errors => {
-					console.log(errors)
-				})
-			},
-
-			// 预览图片
-			preview(event) {
-				console.log(event)
-				let currentUrl = event.target.dataset.src
-				uni.previewImage({
-					current: currentUrl, // 当前显示图片的http链接
-					urls: [currentUrl] // 需要预览的图片http链接列表
-				})
-			}
-		},
-		onReady() {
-			this.$refs.form.setRules(this.rules)
-		},
-	};
-</script>
-
-<style scoped lang="scss">
-	.container {
-		height: 100vh;
-		background-color: #fff;
-
-		.content {
-			padding: 24rpx 36rpx 260rpx;
-			background-color: #fff;
-
-			.fail-msg {
-				color: red;
-				font-size: 28rpx;
-				line-height: 32rpx;
-				margin-top: 12rpx;
-				margin-bottom: 24rpx;
-				width: 726rpx;
-				margin-left: -24rpx;
-				background-color: skyblue;
-				padding: 24rpx 12rpx;
-				box-sizing: border-box;
-				border-radius: 12rpx;
-			}
-
-			.example-img {
-				height: 212rpx;
-				padding: 24rpx 0 12rpx;
-				display: flex;
-				flex-flow: row nowrap;
-				justify-content: flex-start;
-
-				>image {
-					width: 160rpx;
-					margin-right: 66rpx;
-					border-radius: 4rpx;
-				}
-			}
-
-			.img-upload {
-				height: 212rpx;
-				padding: 24rpx 0 12rpx;
-			}
-
-			.bar-code {
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					right: 0;
-					top: 50%;
-					transform: translateY(-50%);
-					z-index: 9999;
-				}
-			}
-
-			.form-item {
-				position: relative;
-
-				.tips {
-					position: absolute;
-					right: 24rpx;
-					top: 24rpx;
-					color: red;
-					font-size: 24rpx;
-				}
-			}
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			bottom: 24rpx;
-			padding: 0 24rpx;
-			z-index: 999;
-
-			.cu-btn {
-				width: 100%;
-				background-color: #2C6FF3;
-				color: #fff;
-			}
-		}
-
-		.popup-content {
-			padding: 36rpx 24rpx;
-			display: flex;
-			flex-flow: row nowrap;
-			justify-content: flex-start;
-			align-items: center;
-		}
-	}
-</style>

+ 0 - 507
pages/commodity/allGoodsSearch.vue

@@ -1,507 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="title"></u-navbar>
-		<view class="content">
-			<view class="search">
-				<u-search animation placeholder="商品搜索" :clearabled="false" v-model="keyword" :showAction="false"
-					@search="search"></u-search>
-				<view class="scan-icon" @click="scan">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-
-				<view class="search-history flex flex-wrap flex-start">
-					<view class="history-item" v-for="(item,index) in historyList" :key="index"
-						@click="searchFast(item)">
-						{{item}}
-					</view>
-				</view>
-			</view>
-
-			<view class="xy-card tab-list" style="padding:0 0 24rpx;">
-				<view class="tab-left">
-					<u-tabs :list="tabList" :scrollable="false" :current="current" @click="tabClick"
-						lineColor="#2C6FF3">
-					</u-tabs>
-				</view>
-				<!-- 	<view class="use-list" @click="$tab.navigateTo('/pages/commodity/commoditylist')">
-					常用商品清单
-				</view> -->
-			</view>
-
-			<view class="list" v-if="newCommList&&newCommList.length>0">
-				<view class="thumb-box" v-for="(item, index) in newCommList" :key="index"
-					@click.stop="commItemSelect(item)">
-					<view>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/no_selected.png"
-							mode="widthFix" v-show="item.noSelect"></image>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-							mode="widthFix" v-show="!item.noSelect&&item.checked"></image>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-							mode="widthFix" v-show="!item.noSelect&&!item.checked"></image>
-					</view>
-					<view class="check-content">
-						<view class="comm-img">
-							<u--image width="130rpx" height="130rpx" :src="item.cover" mode="widthFix"
-								:lazy-lord="true"></u--image>
-						</view>
-						<view class="comm-main">
-							<view>
-								{{item.name}}
-							</view>
-							<view>
-								条形码:{{item.barcode}}
-							</view>
-							<view>
-								商品类型:{{item.categoryName}}
-							</view>
-							<view v-if="type==1">
-								价格:<text>¥{{item.price}}</text>
-							</view>
-						</view>
-					</view>
-				</view>
-				<u-loadmore :status="status" v-if="newCommList.length>=1" />
-			</view>
-
-			<view class="empty" v-if="newCommList.length==0">
-				<u-empty mode="car" text="没有商品!"></u-empty>
-			</view>
-		</view>
-
-		<view class="btn safe-bottom">
-			<xbutton size="large" @click="submit">添加到设备({{selectList.length}})</xbutton>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		ownerGoodsList as perOwnerGoodsList
-	} from "@/api/commodity/mercGoods.js"
-	import {
-		ownerGoodsList as pubOwnerGoodsList,
-		pageByGoods,
-		pageByGoodsMerc,
-		bindDeviceByMercGoods
-	} from "@/api/commodity/goods.js"
-	export default {
-		data() {
-			return {
-				keyword: '',
-				commList: [], //商品列表
-
-				page: 1, //商品分页
-				size: 10,
-
-				status: 'loadmore', //加载更多
-				type: null,
-				storeName: null,
-				title: '私有商品库',
-				selectList: [],
-				id: null,
-				historyList: [],
-
-				tabList: [{
-						name: '私有商品库'
-					},
-					{
-						name: '官方商品库'
-					}
-				],
-				current: 0,
-			}
-		},
-
-		computed: {
-			newCommList() {
-				let newCommList = [];
-				if (this.selectList && this.selectList.length > 0) {
-					let selectList = this.selectList
-					const idMapping = selectList.reduce((acc, el, i) => {
-						acc[el.id] = i;
-						return acc;
-					}, {});
-					this.commList.forEach(i => {
-						if (idMapping[i.id] != undefined) { //重复值
-							i.checked = true
-						} else {
-							i.checked = false
-						}
-						newCommList.push(i)
-					})
-				} else {
-					newCommList = this.commList.map(i => {
-						i.checked = false;
-						return i
-					})
-				}
-				console.log('newCommList', newCommList)
-				return newCommList
-			},
-		},
-
-		onLoad(o) {
-			if (uni.getStorageSync('goods')) {
-				this.historyList = JSON.parse(uni.getStorageSync('goods'))
-			}
-			this.id = o.id;
-			this.switchType(o.type) //current:0私库 、1公库
-			// this.getCommList();
-		},
-		
-		onShow() {
-			this.reset();
-			this.getCommList();
-		},
-		
-		methods: {
-			search(val) {
-				this.saveKeyWord('goods', this.keyword)
-				this.reset();
-				this.getCommList()
-			},
-
-			tabClick(e) {
-				this.switchType(e.index)
-				this.search()
-			},
-
-			switchType(type) {
-				this.current = type; //0私库、1公库
-				this.title = type == 0 ? '私有商品库' : '官方商品库';
-				this.storeName = type == 0 ? 'perStor' : 'pubStor';
-				if (uni.getStorageSync(this.storeName) && JSON.parse(uni.getStorageSync(
-						this.storeName)).length > 0) {
-					let commStor = JSON.parse(uni.getStorageSync(this.storeName))
-					console.log('commStor', commStor)
-					this.selectList = commStor;
-				} else {
-					this.selectList = [];
-				}
-			},
-
-			saveKeyWord(type, val) {
-				if (val) {
-					let arr = []
-					if (uni.getStorageSync(type)) {
-						let arr = JSON.parse(uni.getStorageSync(type))
-						if (arr.indexOf(val) != -1) {
-							console.log('arr.indexOf(val)', arr.indexOf(val))
-							arr.splice(arr.indexOf(val), 1)
-						}
-						arr.unshift(val)
-						if (arr.length > 6) {
-							arr.pop()
-						}
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					} else {
-						arr.unshift(val)
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					}
-				} else {
-					return
-				}
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.getCommList()
-					}
-				});
-			},
-
-			//根据类目获取商品列表
-			getCommList(id) {
-				if (this.current == 0) { //私库到设备
-					pageByGoodsMerc({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword,
-						deviceId: this.id
-					}).then(res => {
-						let data = res.data.records;
-						if (data && data.length > 0) {
-							data = data.map(i => {
-								i.noSelect = i.isBind;
-								i.name = i.goodsName;
-								i.barcode = i.goodsBarcode;
-								i.cover = i.goodsCover;
-								i.price = Number(i.price) / 100;
-								i.categoryName = i.capacity == null ? '未分类' : i.capacity;
-								return i
-							})
-						}
-						if (data.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.commList = this.commList.concat(data)
-					})
-				}
-
-				if (this.current == 1) { //公库设备
-					pageByGoods({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword,
-						deviceId: this.id
-					}).then(res => {
-						let data = res.data.records;
-						let newData = data.map(i => {
-							i.noSelect = i.isBind;
-							i.categoryCode = i.categoryCodeLevel1;
-							return i
-						})
-						if (newData.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.commList = this.commList.concat(newData)
-					})
-				}
-			},
-
-			//触底加载更多
-			onReachBottom() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getCommList()
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-
-			// 商品选中状态改变
-			commItemSelect(e) {
-				if (e.noSelect) {
-					this.$modal.msg('当前商品已存在!')
-					return
-				}
-
-				if (this.type == 0) { //私库需要判断是否新建模商品
-					if (e.price == null || e.price == undefined) {
-						uni.showModal({
-							title: '提示',
-							content: '当前商品为新商品需先设置商品价格,是否前往设置?',
-							success: res => {
-								if (res.confirm) {
-									this.$tab.navigateTo('/pages/commodity/comEdit?id=' + e.id)
-								} else if (res.cancel) {
-									console.log('用户点击取消');
-								}
-							}
-						});
-						return
-					}
-				}
-
-				e.checked = !e.checked
-				//选中商品存储到内存中,以便取用
-				let commStor = []
-				if (e.checked) { //选中添加到存储中
-					if (uni.getStorageSync(this.storeName)) {
-						commStor = JSON.parse(uni.getStorageSync(this.storeName));
-					}
-					commStor.push(e);
-				} else { //取消选中删除,并且从存储中删除
-					commStor = JSON.parse(uni.getStorageSync(this.storeName));
-					for (let i = 0; i < commStor.length; i++) {
-						let item = commStor[i]
-						if (item.id == e.id) {
-							commStor.splice(i, 1);
-							break
-						}
-					}
-				}
-				//收集选中商品,更新存储
-				this.selectList = commStor;
-				commStor.length > 0 ? uni.setStorageSync(this.storeName, JSON.stringify(commStor)) : uni
-					.setStorageSync(
-						this.storeName, '')
-				if (commStor.length > 0) {
-					uni.setStorageSync(this.storeName, JSON.stringify(commStor))
-				}
-			},
-
-			submit() {
-				if (uni.getStorageSync(this.storeName) && JSON.parse(uni.getStorageSync(this.storeName)).length > 0) {
-					if (this.current == 0) { //私库到设备
-						let commList = JSON.parse(uni.getStorageSync(this.storeName))
-						let goodsIdList = commList.map(i => {
-							return i.goodsId
-						})
-						bindDeviceByMercGoods({
-							deviceIds: [this.id],
-							goodsIdList: goodsIdList
-						}).then(res => {
-							if (res.code == 200) {
-								this.$modal.msg('添加成功~')
-								uni.setStorageSync(this.storeName, '') //清空购物车
-								setTimeout(() => {
-									// this.$tab.redirectTo(`/pages/equipment/comManage?id=${this.id}`)
-									uni.navigateBack({
-										delta: 2
-									})
-								}, 1000)
-							}
-						})
-					} else {
-						this.$tab.navigateTo(
-							`/pages/equipment/addComList?storeName=${this.storeName}&type=2&id=${this.id}`)
-					}
-				} else {
-					uni.$u.toast('请先选择商品!')
-				}
-
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			padding-bottom: 88rpx;
-
-			.search {
-				padding: 24rpx 24rpx 12rpx;
-				background-color: #fff;
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					right: 36rpx;
-					top: 38rpx;
-					z-index: 2;
-				}
-
-				.search-history {
-
-					.history-item {
-						margin-right: 24rpx;
-						padding: 0 12rpx;
-						background-color: #f2f2f2;
-						color: #333;
-						font-size: 24rpx;
-						line-height: 40rpx;
-						border-radius: 40rpx;
-						margin-top: 24rpx;
-					}
-				}
-			}
-
-			.list {
-				width: 100%;
-				padding: 12rpx 24rpx;
-
-				.thumb-box {
-					margin-bottom: 12rpx;
-					border-bottom: 1rpx solid #f4f4f4;
-					display: flex;
-					flex-flow: row nowrap;
-					padding: 12rpx 12rpx;
-					align-items: center;
-					background-color: #fff;
-					border-radius: 12rpx;
-				}
-
-				.select-img {
-					width: 40rpx;
-					height: 40rpx;
-				}
-
-				.check-content {
-					display: flex;
-					flex-direction: row;
-					align-items: center;
-					padding-left: 12rpx;
-
-					.comm-img {
-						width: 130rpx;
-						height: 130rpx;
-						display: flex;
-						flex-direction: row;
-						align-items: center;
-						justify-content: space-around;
-
-						image {
-							width: 100%;
-						}
-					}
-
-					.comm-main {
-						box-sizing: border-box;
-						padding-left: 18rpx;
-						color: #999;
-
-						>view {
-							padding: 4rpx 0;
-						}
-
-						>view:nth-child(1) {
-							font-size: 28rpx;
-							font-weight: bold;
-							color: #333;
-						}
-
-						>view:nth-child(2) {
-							font-size: 26rpx;
-						}
-
-						>view:nth-child(3) {
-							font-size: 26rpx;
-						}
-
-						>view:nth-child(4) {
-							font-size: 26rpx;
-
-							text {
-								font-weight: bold;
-								color: red;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			bottom: 24rpx;
-			padding: 0 24rpx;
-		}
-
-		.empty {
-			position: absolute;
-			left: 50%;
-			top: 50%;
-			transform: translate(-50%, -50%);
-		}
-	}
-</style>

+ 0 - 223
pages/commodity/application.vue

@@ -1,223 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="modeName"></u-navbar>
-		<view class="content">
-			<view class="search">
-				<u-search :animation="true" searchIcon="search" placeholder="输入设备名称" v-model="keyword"
-					:showAction="false" @search="search"></u-search>
-			</view>
-			<view class="list" v-if="deviceList&&deviceList.length>0">
-				<view class="thumb-box" v-for="(item, index) in deviceList" :key="item.deviceId"
-					@click.stop="commItemSelect(item)">
-					<view>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-							mode="widthFix" v-show="item.checked"></image>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-							mode="widthFix" v-show="!item.checked"></image>
-					</view>
-					<view class="check-content">
-						<!-- <view class="comm-img">
-							<u--image width="130rpx" height="130rpx" :src="item.cover" mode="widthFix"
-								:lazy-load="true"></u--image>
-						</view> -->
-						<view class="comm-main">
-							<view>
-								{{item.deviceName}}
-							</view>
-							<view>
-								状态:{{item.deviceStateLName}}
-							</view>
-							<view>
-								状态:{{item.deviceStateLName}}
-							</view>
-						</view>
-					</view>
-				</view>
-
-				<u-loadmore :status="status" v-if="deviceList.length>=1" />
-			</view>
-
-			<view class="empty" v-else>
-				<u-empty></u-empty>
-			</view>
-		</view>
-
-		<view class='btn safe-bottom'>
-			<xbutton size='large' width='100%' @tap='applyToDevice'>确定应用到设备</xbutton>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		searchPage
-	} from '@/api/device/device.js'
-	
-	import {
-		saveGoodsDevice,
-	} from "@/api/commoditylist/commoditylist.js"
-
-	export default {
-		data() {
-			return {
-				keyword: '',
-				deviceList: [],
-				page: 1,
-				size: 10,
-				modelId:null,
-				modeName:null
-			}
-		},
-		onLoad(o) {
-			if (o.modelId) {
-				this.modelId=modelId
-				this.modeName=modeName
-			}
-		},
-
-		onShow() {
-			this.getList()
-		},
-
-		methods: {
-			search(val) {
-				this.reset()
-				this.getList()
-			},
-			// 商品选中状态改变
-			commItemSelect(e) {
-				e.checked = !e.checked;
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.deviceList = [];
-			},
-
-			getList() {
-				searchPage({
-					page: {
-						current: this.page,
-						size: this.size
-					},
-					keywords: this.keyword,
-				}).then(res => {
-					let data = res.data.records;
-					for (let i = 0; i < data.length; i++) {
-						let item = data[i];
-						item.checked = false;
-					}
-					if (data.length < 10) {
-						this.status = "nomore"
-					} else {
-						this.status = "loadmore"
-					}
-					this.deviceList = this.deviceList.concat(data)
-				})
-			},
-
-			onReachBottom() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getList()
-			},
-
-			applyToDevice() {
-				saveGoodsDevice({
-					"deviceIds": [], //设备信息id
-					"mercId": 0, //商户ID
-					"modelId": 0 //商品清单ID
-				}).then(res => {})
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			padding-bottom: 88rpx;
-
-			.search {
-				padding: 24rpx 24rpx;
-				background-color: #fff;
-			}
-
-			.list {
-				width: 100%;
-				padding: 12rpx 24rpx;
-
-				.thumb-box {
-					margin-bottom: 12rpx;
-					border-bottom: 1rpx solid #f4f4f4;
-					display: flex;
-					flex-flow: row nowrap;
-					padding: 12rpx 12rpx;
-					align-items: center;
-					background-color: #fff;
-					border-radius: 12rpx;
-				}
-
-				.select-img {
-					width: 40rpx;
-					height: 40rpx;
-				}
-
-				.check-content {
-					width: 100%;
-					display: flex;
-					flex-direction: row;
-					align-items: center;
-					padding-left: 12rpx;
-					position: relative;
-
-					.comm-img {
-						width: 130rpx;
-						height: 130rpx;
-						display: flex;
-						flex-direction: row;
-						align-items: center;
-						justify-content: space-around;
-
-						image {
-							width: 100%;
-						}
-					}
-
-					.comm-main {
-						box-sizing: border-box;
-						padding-left: 18rpx;
-						color: #999;
-
-						>view {
-							padding: 8rpx 0;
-							width: 330rpx;
-							font-size: 28rpx;
-						}
-
-					}
-				}
-			}
-		}
-
-		.empty {
-			position: absolute;
-			left: 50%;
-			top: 50%;
-			transform: translate(-50%, -50%);
-		}
-
-		.btn {
-			width: 724rpx;
-			position: fixed;
-			left: 13rpx;
-			bottom: calc(24rpx + env(safe-area-inset-bottom) / 2);
-			border-radius: 88rpx;
-			overflow: hidden;
-		}
-	}
-</style>

+ 0 - 273
pages/commodity/auditList.vue

@@ -1,273 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="商品建模"></u-navbar>
-		<view class="content">
-			<view class="search">
-				<u-search animation placeholder="商品搜索" :clearabled="false" v-model="keyword" :showAction="false"
-					@search="search"></u-search>
-				<view class="scan-icon" @click="scan">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-			</view>
-			<view class="tab-list">
-				<u-tabs :list="tabList" :scrollable="false" :current="pos" @click="tabClick" lineColor="#2C6FF3">
-				</u-tabs>
-			</view>
-			<view class="list">
-				<u-list @scrolltolower="scrolltolower" :height="fullHeight" v-if="commList.length>0">
-					<u-list-item class="list-item" v-for="(item, index) in commList" :key="item.id"
-						@click.native="goDetail(item)">
-						<view class="comm-item">
-							<view class="image">
-								<u--image width="130rpx" height="130rpx" :src="item.cover" mode="widthFix"
-									:lazy-load="true"></u--image>
-							</view>
-							<view class="item-content">
-								<view>
-									{{item.goodsName}}
-								</view>
-								<view>
-									{{item.brandName}}
-								</view>
-								<view>
-									{{item.createTime}}
-								</view>
-								<view class="failedMsg" v-if="item.status==-1">
-									驳回原因:{{item.failedMsg}}
-								</view>
-							</view>
-							<view class="tag">
-								<u-tag text="已通过" plain size="mini" type="success" v-if="item.status==1"></u-tag>
-								<u-tag text="已驳回" plain size="mini" type="error" v-if="item.status==-1"></u-tag>
-								<u-tag text="审核中" plain size="mini" type="warning" v-if="item.status==0"></u-tag>
-							</view>
-						</view>
-
-					</u-list-item>
-					<u-loadmore :status="status" v-if="commList.length>=1" />
-				</u-list>
-				<view class="empty" v-else>
-					<u-empty></u-empty>
-				</view>
-			</view>
-		</view>
-		<view class="btn safe-bottom">
-			<xbutton size="large" @click="$tab.navigateTo('/pages/commodity/addCom')">新品建模</xbutton>
-		</view>
-
-	</view>
-</template>
-
-<script>
-	import {
-		goodsPage
-	} from "@/api/commodity/goodsMode.js"
-	export default {
-		data() {
-			return {
-				keyword: '',
-				tabList: [{
-						name: '已通过',
-						id: 1
-					},
-					{
-						name: '审核中',
-						id: 0
-					},
-					{
-						name: '已驳回',
-						id: -1
-					}
-				],
-
-				page: 1,
-				size: 10,
-				keywords: '',
-
-				pos: 1,
-				current: 0,
-				status: 'loadmore',
-				commList: [],
-				fullHeight: 0
-			}
-		},
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".list").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						_this.fullHeight = res.windowHeight-218 + 'px';
-					},
-				});
-			}).exec();
-			this.getList()
-		},
-		methods: {
-			tabClick(e) {
-				console.log(e)
-				this.pos = e.index;
-				this.current = e.id;
-				this.reset();
-				this.getList();
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-
-			getList() {
-				goodsPage({
-					page: {
-						current: this.page,
-						size: this.size
-					},
-					keywords: this.keyword,
-					status: this.current
-				}).then(res => {
-					let data = res.data.records;
-					if (data.length < 10) {
-						this.status = "nomore"
-					} else {
-						this.status = "loadmore"
-					}
-					this.commList = this.commList.concat(data)
-				})
-			},
-
-			scrolltolower() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getList()
-			},
-
-			search(val) {
-				this.reset()
-				this.getList()
-			},
-
-			scan() {
-				uni.scanCode({
-					success: function(res) {
-						console.log('条码类型:' + res.scanType);
-						console.log('条码内容:' + res.result);
-					}
-				});
-			},
-
-			// 详情
-			goDetail(e) {
-				this.$tab.navigateTo('/pages/commodity/addCom?id=' + e.id)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	page {
-		height: 100% !important;
-	}
-
-	.container {
-		height: 100% !important;
-
-		.content {
-			// padding-bottom: 88rpx;
-
-			.search {
-				padding: 24rpx 24rpx;
-				background-color: #fff;
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					right: 36rpx;
-					top: 50%;
-					transform: translateY(-50%);
-					z-index: 2;
-				}
-			}
-
-			.tab-list {
-				width: 100%;
-				padding: 0 24rpx;
-				background-color: #fff;
-				margin-bottosearchm: 12rpx;
-			}
-
-			.empty {
-				margin: 40% auto 0;
-			}
-
-			.list {
-				width: 100%;
-				padding: 0 24rpx;
-				margin-top: 16rpx;
-
-				.comm-item {
-					display: flex;
-					flex-direction: row;
-					justify-content: flex-start;
-					align-items: center;
-					background-color: #fff;
-					margin-bottom: 12rpx;
-					border-radius: 12rpx;
-					box-sizing: border-box;
-					padding: 12rpx;
-					position: relative;
-
-					.image {
-						width: 130rpx;
-						height: 130rpx;
-					}
-
-					.item-content {
-						padding-left: 24rpx;
-						color: #999;
-
-						>view:nth-child(1) {
-							font-size: 28rpx;
-							font-weight: bold;
-							color: #333;
-
-						}
-
-						>view:nth-child(2) {
-							font-size: 24rpx;
-							padding: 12rpx 0;
-						}
-
-						>view:nth-child(3) {
-							font-size: 24rpx;
-						}
-						
-						.failedMsg{
-							color: red;
-							font-size: 24rpx;
-							line-height: 30rpx;
-							margin-top: 10rpx;
-						}
-					}
-
-					.tag {
-						position: absolute;
-						right: 12rpx;
-						top: 12rpx;
-					}
-				}
-			}
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			bottom: 24rpx;
-			padding: 0 24rpx;
-		}
-	}
-</style>

+ 0 - 300
pages/commodity/comEdit.vue

@@ -1,300 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="商品编辑"></u-navbar>
-
-		<swiper class="card-swiper round-dot" previous-margin="1rpx" :indicator-dots="false" :circular="true"
-			:autoplay="true" interval="5000" duration="500" @change="cardSwiper" indicator-color="#ffffff"
-			indicator-active-color="#ffffff" style="margin-top: 24rpx;">
-			<swiper-item v-for="(item,index) in swiperList" :key="index" :class="cardCur == index ? 'cur':''">
-				<view class="swiper-item shadow-shop" style="border-radius: 20rpx 20rpx 22rpx 22rpx;">
-					<image :src="item" mode="aspectFill"></image>
-				</view>
-			</swiper-item>
-		</swiper>
-		<view class="content">
-			<view class="xy-card">
-				<view class="xy-list-item">
-					<view>商品名称</view>
-					<view>{{comDetail.goodsName}}</view>
-				</view>
-				<!-- <view class="xy-list-item">
-					<view>可用机型</view>
-					<view>{{comDetail.name}}</view>
-				</view> -->
-				<view class="xy-list-item">
-					<view>商品条码</view>
-					<view>{{comDetail.goodsBarcode}}</view>
-				</view>
-				<view class="xy-list-item">
-					<view>商品尺寸</view>
-					<view>{{comDetail.capacity}}</view>
-				</view>
-				<view class="xy-list-item">
-					<view>所属分类</view>
-					<view>{{comDetail.categoryCodeName||'其他'}}</view>
-				</view>
-			</view>
-			<view class="xy-card">
-				<u--form labelPosition="left" :model="form" :rules="rules" ref="form" errorType="toast">
-					<u-form-item required labelWidth="90" label="进货价(元)" prop="priceCost" borderBottom ref="item1">
-						<u--input type="digit" v-model="form.priceCost" border="none"></u--input>
-					</u-form-item>
-					<u-form-item required labelWidth="90" label="零售价(元)" prop="price" borderBottom ref="item1">
-						<u--input type="digit" v-model="form.price" border="none"></u--input>
-					</u-form-item>
-					<!-- <u-form-item required labelWidth="90" label="单机容量" prop="capacity" borderBottom ref="item1">
-						<u--input type="number" v-model="form.capacity" border="none"></u--input>
-					</u-form-item> -->
-					<u-form-item required labelWidth="90" label="库存预警" prop="warning" borderBottom ref="item1">
-						<u--input type="number" v-model="form.warning" border="none"></u--input>
-					</u-form-item>
-					<u-form-item required labelWidth="90" label="上架状态" prop="warning" borderBottom ref="item1">
-						<u-switch v-model="form.status"></u-switch>
-					</u-form-item>
-				</u--form>
-			</view>
-		</view>
-
-		<view class="btn safe-bottom">
-			<xbutton delay="1500" size="large" @click='submit'>保存</xbutton>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		searchObj,
-		update
-	} from "@/api/commodity/mercGoods.js"
-	export default {
-		data() {
-			return {
-				cardCur: 0,
-				form: {
-					price: undefined,
-					warning: undefined,
-					capacity: undefined,
-					priceCost: undefined,
-					status: true //上架状态
-				},
-				rules: {
-					'price': {
-						type: 'number',
-						required: true,
-						message: '请输入商品价格~',
-						trigger: ['blur', 'change']
-					},
-					'warning': {
-						type: 'number',
-						required: true,
-						message: '请输入预警值~',
-						trigger: ['blur', 'change']
-					},
-					// 'capacity': {
-					// 	type: 'number',
-					// 	required: true,
-					// 	message: '请输入容量~',
-					// 	trigger: ['blur', 'change']
-					// },
-					'priceCost': {
-						type: 'number',
-						required: true,
-						message: '请输入商品进货价~',
-						trigger: ['blur', 'change']
-					},
-				},
-				show: false,
-				actions: [{
-						name: '全部',
-					},
-					{
-						name: '饮料',
-					},
-					{
-						name: '槟榔',
-					},
-				],
-
-				radio: '',
-				switchVal: false,
-
-				comDetail: null, //商品详情
-				id: null,
-
-
-			};
-		},
-
-		computed: {
-			swiperList() {
-				let imgArr = []
-				if (this.comDetail) {
-					imgArr = this.comDetail.imgUrls.split('|')
-				}
-				return imgArr
-			}
-		},
-
-		onLoad(o) {
-			this.id = o.id;
-			this.getDetail(o.id)
-		},
-
-		methods: {
-			getDetail(id) {
-				searchObj({
-					id: id
-				}).then(res => {
-					this.comDetail = res.data
-					this.form = {
-						"price": Number(res.data.price) / 100,
-						"warning": res.data.warning,
-						"capacity": res.data.capacity,
-						"priceCost": Number(res.data.priceCost) / 100,
-						"status": res.data.status == '1' ? true : false
-					}
-				})
-			},
-
-			cardSwiper(e) {
-				this.cardCur = e.detail.current
-			},
-			// 下拉框点击事件
-			showSelect(type) {
-				if (type == 'class') {
-					this.actions = [{
-							name: '全部',
-						},
-						{
-							name: '饮料',
-						},
-						{
-							name: '槟榔',
-						}
-					]
-				} else {
-					this.actions = [{
-							name: '大瓶',
-						},
-						{
-							name: '中瓶',
-						},
-						{
-							name: '小瓶',
-						}
-					]
-				}
-				this.show = true;
-			},
-
-			//表单提交
-			submit() {
-				this.$refs.form.validate().then(res => {
-					this.form.id = this.id;
-					let params = {
-						id: this.id,
-						price: this.form.price * 100,
-						warning: this.form.warning,
-						capacity: this.form.capacity,
-						priceCost: this.form.priceCost * 100,
-						status: this.form.status ? '1' : '0'
-					}
-					update(params).then(res => {
-						this.$modal.msg('保存成功~')
-						setTimeout(() => {
-							this.$tab.navigateBack()
-						}, 1000)
-					})
-				}).catch(errors => {})
-			}
-		},
-		onReady() {
-			setTimeout(() => {
-				this.$refs.form.setRules(this.rules)
-			}, 500)
-		},
-	};
-</script>
-
-<style scoped lang="scss">
-	.container {
-
-		.card-swiper {
-			height: 350rpx !important;
-		}
-
-		.card-swiper swiper-item {
-			width: 260upx !important;
-			left: 245upx;
-			box-sizing: border-box;
-			padding: 0upx 15upx 50upx 15upx;
-			overflow: initial;
-			/* margin: 100rpx 0; */
-		}
-
-		.card-swiper swiper-item .swiper-item {
-			width: 100%;
-			display: block;
-			height: 100%;
-			border-radius: 6upx;
-			transform: scale(0.7);
-			transition: all 0.2s ease-in 0s;
-			overflow: hidden;
-		}
-
-		.card-swiper swiper-item.cur .swiper-item {
-			transform: none;
-			transition: all 0.2s ease-in 0s;
-		}
-
-		.content {
-			padding: 24rpx 24rpx 100rpx;
-
-			.example-img {
-				padding: 24rpx 24rpx 12rpx;
-				display: flex;
-				flex-flow: row nowrap;
-				justify-content: space-between;
-
-				>image {
-					width: 100rpx;
-				}
-			}
-
-			.img-upload {
-				padding: 24rpx 24rpx 12rpx;
-			}
-
-			.xy-card {
-				margin-bottom: 24rpx;
-			}
-
-			.xy-list-item {
-				display: flex;
-				flex-flow: row nowrap;
-				justify-content: flex-start;
-				border-bottom: 1upx solid #eee;
-				line-height: 80rpx;
-
-				>view:nth-child(1) {
-					width: 180rpx;
-				}
-
-				>view:nth-child(2) {
-					color: #666;
-					font-size: 24rpx;
-				}
-			}
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			bottom: 24rpx;
-			padding: 0 24rpx;
-			z-index: 999;
-		}
-	}
-</style>

+ 0 - 523
pages/commodity/comListEdit.vue

@@ -1,523 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="title"></u-navbar>
-		<view class="flex align-center justify-around margintop">
-			<view class="">共关联({{comList.length}})件商品 </view>
-			<view class="color">点击图片可以移除</view>
-			<view class="">
-				<xbutton size="size" @tap='save'>保存</xbutton>
-			</view>
-		</view>
-		<view class="margintop">
-			<view style="height: 230rpx;overflow: hidden;" v-if="comList&&comList.length>0">
-				<u-scroll-list :indicator="indicator" indicatorColor="#fff0f0" indicatorActiveColor="#f56c6c">
-					<view class="flex justify-around">
-						<view class="" v-for="(item,index) in comList" :key="item.id">
-							<view class="flex flex-direction align-center justify-center image-dele-container"
-								@tap="clean(item)">
-								<view class="image">
-									<u--image radius="4" width="120rpx" height="120rpx" :src="item.img"
-										mode="aspectFit" :lazy-lord="true"></u--image>
-								</view>
-								<view class="">{{item.name}}</view>
-							</view>
-						</view>
-					</view>
-				</u-scroll-list>
-			</view>
-			<view class="no-com" v-else  style="height: 230rpx;overflow: hidden;">
-				请添加商品
-			</view>
-		</view>
-		<view class="search" @click="searchComm">
-			<view class="search-input">
-				<u-search placeholder="商品搜索" actionText="取消" :actionStyle="{color:'#2C6FF3'}" :showAction="!leftShow"
-					:clearabled="false" v-model="keyword" @search="search" @custom="cancle"></u-search>
-				<view @click="scan" :class="[leftShow?'scan-icon scan-left-show':'scan-icon scan-left-hidden']">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-			</view>
-
-			<view class="search-history flex flex-wrap flex-start" v-if="!leftShow">
-				<view class="history-item" v-for="(item,index) in historyList" :key="index" @click="searchFast(item)">
-					{{item}}
-				</view>
-			</view>
-		</view>
-		<view class="content">
-			<view class="swiperitem-content">
-				<view class="classify-wrap">
-					<Classify :tabList="perTabList" :status="perStatus"
-						:commList="perCommList" @switchMenu="perSwitchMenu" @lowerBottom="perLowerBottom"
-						:isModal="true" :height="fullHeight" @comClick="comClick" :leftShow="leftShow" />
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import Classify from "@/components/classify/index.vue"
-	import {
-		goodsCategory as perGoodsCategory,
-		ownerGoodsList as pageByGoodsMerc
-	} from "@/api/commodity/mercGoods.js"
-	import {
-		goodsCategory as pubGoodsCategory,
-		ownerGoodsList as pageByGoods
-	} from "@/api/commodity/goods.js"
-	import {
-		saveListingGoods,
-		refGoods
-	} from "@/api/commoditylist/commoditylist.js"
-	export default {
-		components: {
-			Classify
-		},
-		data() {
-			return {
-				modelId: '', //清单id
-
-				goodsId: [], //商品id列表
-
-				fullHeight: "0",
-
-				// 私库
-				perTabList: [], //商品类目
-				perCommList: [], //商品列表
-				perPage: 1, //商品分页
-				perSize: 10,
-				perStatus: 'loadmore', //加载更多
-
-				id: null, //设备id
-				categoryCode: null,
-
-				leftShow: true,
-				historyList: [],
-				keyword: '',
-				
-				oldList:[],
-				newList:[],
-				
-				title:null,
-				deviceId:null,
-			}
-		},
-		async onLoad(o) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".classify-wrap").boundingClientRect((data) => {
-				_this.top = data.top;
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - _this.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - _this.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			this.title = o.title
-			this.modelId = o.modelId
-			this.deviceId=o.deviceId
-			if (uni.getStorageSync('goods')) {
-				this.historyList = JSON.parse(uni.getStorageSync('goods'))
-			}
-
-			await this.getrefGoods()
-			this.getPerCategory()
-		},
-
-		async onShow() {
-			this.perReset()
-			await this.getPerCommList()
-		},
-		
-		computed:{
-			comList(){
-				let list=[]
-				list=[...this.oldList,...this.newList]
-				return list
-			},
-		},
-
-		methods: {
-			searchComm() {
-				this.leftShow = false
-			},
-
-			search(val) {
-				this.saveKeyWord('goods', this.keyword)
-				this.perReset();
-				this.getPerCommList()
-			},
-
-			cancle(val) {
-				this.keyword = ''
-				this.leftShow = true
-				this.search()
-			},
-
-			saveKeyWord(type, val) {
-				if (val) {
-					let arr = []
-					if (uni.getStorageSync(type)) {
-						let arr = JSON.parse(uni.getStorageSync(type))
-						if (arr.indexOf(val) != -1) {
-							console.log('arr.indexOf(val)', arr.indexOf(val))
-							arr.splice(arr.indexOf(val), 1)
-						}
-						arr.unshift(val)
-						if (arr.length > 6) {
-							arr.pop()
-						}
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					} else {
-						arr.unshift(val)
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					}
-				} else {
-					return
-				}
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.search()
-					}
-				});
-			},
-
-			//获取类目列表
-			getPerCategory() {
-				return new Promise((resolve, reject) => {
-					perGoodsCategory().then(res => {
-						if (res.data && res.data.length > 0) {
-							this.perTabList = res.data.map(i => {
-								if (i.categoryCode == null) {
-									i.categoryName = '未定义'
-									return i
-								} else {
-									return i
-								}
-							});
-							if (this.perTabList && this.perTabList.length > 0) {
-								this.categoryCode = this.perTabList[0].categoryCode
-							}
-						}
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			//商品类目切换
-			perSwitchMenu(item) {
-				this.categoryCode = item.categoryCode
-				this.perReset()
-				this.getPerCommList()
-			},
-
-			//根据类目获取商品列表
-			getPerCommList() {
-				let params = {}
-				if (this.leftShow) { //搜索
-					params = {
-						categoryCode: this.categoryCode,
-						page: {
-							current: this.perPage,
-							size: this.perSize
-						},
-					}
-				} else { //非搜索
-					params = {
-						page: {
-							current: this.perPage,
-							size: this.perSize
-						},
-						keyword: this.keyword
-					}
-				}
-				return new Promise((resolve, reject) => {
-					pageByGoodsMerc(params).then(res => {
-						let data = res.data.records;
-						if (data && data.length > 0) {
-							data = data.map(i => {
-								i.name = i.goodsName;
-								i.barcode = i.goodsBarcode;
-								i.cover = i.goodsCover;
-								i.price = i.price != null ? Number(i.price) / 100 : null;
-								i.categoryName = i.categoryCodeName;
-								i.noSelect = i.isBind;
-								return i
-							})
-						}
-						if (data.length < 10) {
-							this.perStatus = "nomore"
-						} else {
-							this.perStatus = "loadmore"
-						}
-						this.perCommList = this.perCommList.concat(data)
-
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			//触底加载更多
-			perLowerBottom() {
-				if (this.perStatus == 'nomore') return
-				this.perPage++
-				this.getPerCommList()
-			},
-
-			//重置
-			perReset() {
-				this.perStatus == 'loadmore'
-				this.perPage = 1;
-				this.perSize = 10;
-				this.perCommList = [];
-			},
-			
-			//反显清单图片
-			getrefGoods() {
-				return new Promise((resolve, reject) => {
-					refGoods({
-						modelId: this.modelId
-					}).then(res => {
-						res.data.forEach(item => {
-							this.oldList.push({
-								name: item.goodsName,
-								id: item.goodsId,
-								img:item.goodsImgUrl
-							})
-						})
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-			
-			//点击商品
-			comClick(e) {
-				if(e.price==null){
-					uni.showModal({
-						title: '提示',
-						content: '当前商品为新商品需先设置商品价格,是否前往设置?',
-						success: res => {
-							if (res.confirm) {
-								this.$tab.navigateTo('/pages/commodity/comEdit?id=' + e.id)
-							} else if (res.cancel) {
-								console.log('用户点击取消');
-							}
-						}
-					});
-				}else{
-					this.addToList(e)
-				}
-			},
-			
-			//添加商品至关联
-			addToList(e){
-				if(this.comList.some(i=>i.id==e.goodsId)){
-					this.$modal.msg('该商品已存在~')
-					return
-				}
-				this.newList.push({
-					name: e.goodsName,
-					id: e.goodsId,
-					img:e.imgUrls
-				})
-			},
-			
-			clean(e){
-				if(e.name=='未知商品'||e.name=='非友好购物商品'){
-					this.$modal.msg('预设商品不能删除!!!')
-					return
-				}
-				
-				for (let i = 0; i < this.oldList.length; i++) {
-					let item=this.oldList[i]
-					if(item.id==e.id){
-						this.oldList.splice(i,1)
-						return
-					}
-				}
-				
-				for (let i = 0; i < this.newList.length; i++) {
-					let item=this.newList[i]
-					if(item.id==e.id){
-						this.newList.splice(i,1)
-						return
-					}
-				}
-				
-			},
-			
-			save() {
-				if (!this.comList.length) {
-					uni.$u.toast('请选择商品')
-					return;
-				}
-				var comList = []
-				this.comList.forEach(item => {
-					comList.push(item.id)
-				})
-				saveListingGoods({
-					modelId: this.modelId, //清单ID
-					goodsId: comList //关联的商品id,不传则表示清空
-				}).then(res => {
-					if (res.code == 200) {
-						uni.$u.toast(res.msg)
-						setTimeout(() => {
-							this.$tab.navigateBack()
-						}, 1000)
-					}
-				})
-			},
-		}
-	}
-</script>
-<style lang="scss" scoped>
-	.container {
-		.margin {
-			margin: 10rpx 20rpx;
-		}
-
-		.margintop {
-			margin-top: 10rpx;
-		}
-
-		.marginleft {
-			margin-left: 10rpx;
-		}
-
-		.active {
-			background-color: #ffffff;
-		}
-
-		.un-active {
-			background-color: #e5e5e5;
-		}
-
-		.color {
-			color: red;
-		}
-
-		.image-dele-container {
-			position: relative;
-			width: 200rpx;
-			height: 200rpx;
-			margin-left: 10rpx;
-			background-color: #f6f6f6;
-			border-radius: 15rpx;
-
-			view {
-				text-overflow: ellipsis;
-				overflow: hidden;
-				white-space: nowrap;
-				width: 120rpx;
-			}
-
-			.image {
-				width: 120rpx;
-				height: 120rpx;
-			}
-		}
-
-		.image-container {
-			width: 150rpx;
-			height: 200rpx;
-			background-color: #d9d9d9;
-
-			image {
-				width: 90rpx;
-				height: 100rpx;
-			}
-		}
-		
-		.no-com{
-			height:228rpx;
-			text-align: center;
-			line-height: 228rpx;
-		}
-
-		.search {
-			padding: 24rpx 24rpx;
-			background-color: #fff;
-
-			.search-input {
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					top: 50%;
-					transform: translateY(-50%);
-					z-index: 2;
-
-					&.scan-left-show {
-						right: 36rpx;
-					}
-
-					&.scan-left-hidden {
-						right: 100rpx;
-					}
-				}
-			}
-
-			.search-history {
-
-				.history-item {
-					margin-right: 24rpx;
-					padding: 0 12rpx;
-					background-color: #f2f2f2;
-					color: #333;
-					font-size: 24rpx;
-					line-height: 40rpx;
-					border-radius: 40rpx;
-					margin-top: 24rpx;
-				}
-			}
-		}
-
-		.btn {
-			width: 724rpx;
-			position: fixed;
-			left: 13rpx;
-			bottom: calc(24rpx + env(safe-area-inset-bottom) / 2);
-			border-radius: 88rpx;
-			overflow: hidden;
-		}
-	}
-</style>

+ 0 - 359
pages/commodity/commoditylist.vue

@@ -1,359 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="deviceName"></u-navbar>
-		<view class="title">常用商品清单</view>
-		<scroll-view class="scrollview" scroll-y="true" scroll-with-animation="true" lower-threshold="100"
-			@scrolltolower="loadMore" :style="{height:fullHeight}">
-			<view class="scroll-content" v-if="commodityList&&commodityList.length>0">
-				<block v-for="(item,index) in commodityList" :key="item.modelId">
-					<view class="commoditylist-container xy-card">
-						<view class="commoditylist-content flex flex-direction justify-between">
-							<view class="flex-sub">清单名称:{{item.name}}</view>
-							<view class="flex-sub">设备类型:{{item.deviceTypeName}}</view>
-							<view class="flex-sub">关联商品:{{item.goodsNum}}件</view>
-						</view>
-						<view class="flex align-center justify-end btn-box martop">
-							<view class='marleft'>
-								<xbutton size="medium" bgColor="red" round='25rpx' padding='0rpx 20rpx' @click='deleted(item)'>删除</xbutton>
-							</view>
-							<view class='marleft'>
-								<xbutton size="medium" round='25rpx' padding='0rpx 20rpx' @click='modify(item)'>修改</xbutton>
-							</view>
-							<view class='marleft'>
-								<xbutton size="medium" round='25rpx' padding='0rpx 20rpx' @click="relatedgoods(item)">关联商品
-								</xbutton>
-							</view>
-							<view class='marleft'>
-								<xbutton size="medium" round='25rpx' padding='0rpx 20rpx' @click="application(item)">应用到设备</xbutton>
-							</view>
-						</view>
-					</view>
-				</block>
-				<u-loadmore :status="loadmoreStatus" />
-			</view>
-
-			<view style="margin-top: 120rpx;" v-else>
-				<u-empty mode="data" text="数据为空"></u-empty>
-			</view>
-		</scroll-view>
-
-		<view class="btn safe-bottom">
-			<xbutton size='large' width='100%' @click="addcommoditylist">新增商品清单</xbutton>
-		</view>
-
-		<xpopup :show="addcommoditylistShow" @open="open" @close="cancel" @confirm="submit" :title="popTitle">
-			<view class="addcommoditylist-container">
-
-			<!-- 	<u--input class='martop' clearable suffixIcon="arrow-down" v-model="equipmentTypename"
-					suffixIconStyle="color: #909399" placeholder="设备类型" border="surround" @focus="actionSheetShow=true">
-				</u--input> -->
-				<view class='martop'>
-					<u--input placeholder="请输入商品清单名称" v-model="name" border="surround"></u--input>
-				</view>
-			</view>
-		</xpopup>
-
-		<!-- <u-action-sheet :show="actionSheetShow" :actions="equipmentTypeList" title="请选择设备类型"
-			@close="actionSheetShow = false" @select="actionsheetSelect($event)"></u-action-sheet> -->
-	</view>
-</template>
-
-<script>
-	import request from '@/utils/request'
-	import {
-		page,
-		save,
-		update,
-		saveGoodsDevice,
-		del
-	} from "@/api/commoditylist/commoditylist.js"
-	import {
-		detail
-	} from "@/api/device/device.js"
-	export default {
-		data() {
-			return {
-				fullHeight: 0,
-				commodityList: [], //商品清单
-				name: '',
-				loadmoreStatus: 'loadmore',
-				popTitle: '新增清单',
-				type: '',
-				equipmentTypename: '',
-				page: 1, //当前分页
-				size: 10, //分页数据条数
-				deviceType: '',
-				actionSheetShow: false,
-				addcommoditylistShow: false,
-				
-				deviceId:null,
-				deviceName:null,
-				
-				equipmentTypeList:[]
-			}
-		},
-
-		onLoad(o) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = ["iPhone X", 'iPhone XR', "iPhone XS", "iPhone XS MAX",
-							"iPhone XS Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						console.log(res.windowHeight, data.top)
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 40 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-			this.deviceId=o.id
-		},
-
-		async onShow() {
-			await this.getDeviceType()
-			this.reset()
-			this.getpage()
-		},
-		methods: {
-			getDeviceType(){
-				return new Promise((resolve,reject)=>{
-					detail({
-						deviceId: this.deviceId,
-						isSysinfo: false,
-						isStatus: false,
-						isRegister: false
-					}).then(res => {
-						this.deviceType = res.data.deviceType
-						this.deviceName=res.data.deviceName
-						resolve(res)
-					}).catch(err=>{
-						resolve(err)
-					})
-				})
-			},
-			
-			//分页查询
-			getpage() {
-				page({
-					page: {
-						current: this.page,
-						size: this.size,
-					},
-					deviceType:this.deviceType
-				}).then(res => {
-					let dicts=res.data.dicts[0]
-					for (let key in dicts) {
-						let item=dicts[key]
-						this.equipmentTypeList.push(item)
-					}
-					let newList=res.data.records
-					newList.forEach(i=>{
-						this.equipmentTypeList.forEach(j=>{
-							if(i.deviceType==j.value){
-								i.deviceTypeName=j.msg
-							}
-						})
-					})
-					
-					this.commodityList = this.commodityList.concat(newList)
-					console.log(this.commodityList)
-					if (newList.length<10) {
-						this.loadmoreStatus = 'nomore'
-					} else {
-						this.loadmoreStatus = 'loadmore'
-					}
-				})
-			},
-			
-			reset(){
-				this.page=1
-				this.commodityList=[]
-			},
-			
-			loadMore(e) {
-				if (this.loadmoreStatus == 'nomore') return
-				this.page++
-				this.getpage()
-			},
-
-
-			open() {
-				this.addcommoditylistShow = true
-			},
-			
-			//新增商品清单
-			addcommoditylist() {
-				this.popTitle = '新增清单'
-				this.addcommoditylistShow = true
-			},
-			
-			actionsheetSelect(e) {
-				this.equipmentTypename = e.name
-				this.deviceType = e.deviceType
-			},
-			cancel() {
-				this.addcommoditylistShow = false
-			},
-			deleted(item) {
-				uni.showModal({
-					title: '提示',
-					content: '是否确认删除',
-					success: res=> {
-						if (res.confirm) {
-							del({
-								ids: [item.modelId]
-							}).then(res => {
-								if (res.code == 200) {
-									this.addcommoditylistShow = false
-									this.reset()
-									this.getpage()
-									setTimeout(()=>{
-										this.$modal.msg('删除成功~')
-									},500)
-								}
-							})
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			},
-			
-			modify(item) {
-				this.popTitle = '修改清单'
-				this.name = item.name
-				this.modelId=item.modelId
-				this.addcommoditylistShow = true
-			},
-			
-			// 新增商品清单
-			submit() {
-				if (!this.name) {
-					uni.$u.toast('请填写清单名称')
-					return;
-				}
-				if (this.popTitle == '新增清单') {
-					save({
-						name: this.name, //清单名称
-						deviceType: this.deviceType, //设备类型
-					}).then(res => {
-						if (res.code == 200) {
-							this.addcommoditylistShow = false
-							this.reset()
-							this.getpage()
-							setTimeout(()=>{
-								this.$modal.msg('新增成功~')
-							},500)
-						}
-					})
-				}
-				if (this.popTitle == '修改清单') {
-					update({
-						modelId: this.modelId, //id
-						name: this.name, //清单名称
-						deviceType: this.deviceType //设备类型
-					}).then(res => {
-						if (res.code == 200) {
-							this.addcommoditylistShow = false
-							this.reset()
-							this.getpage()
-							setTimeout(()=>{
-								this.$modal.msg('修改成功~')
-							},500)
-						}
-					})
-				}
-			
-			},
-			
-			//清单关联商品
-			relatedgoods(item) {
-				this.$tab.navigateTo(`comListEdit?modelId=${item.modelId}&title=${item.name}`)
-			},
-			
-			//清单应用到设备
-			application(item) {
-				uni.showModal({
-					title: '提示',
-					content: `是否确认应用清单至设备${this.deviceName}`,
-					success: res=> {
-						if (res.confirm) {
-							saveGoodsDevice({
-								deviceIds: [this.deviceId], //设备信息id
-								modelId: item.modelId //商品清单ID
-							}).then(res => {
-								this.$tab.navigateBack()
-							})
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-				// this.$tab.navigateTo(`application?modelId=${item.modelId}&title=${item.name}`)
-			},
-
-			
-		}
-	}
-</script>
-<style lang="scss" scoped>
-	.container {
-		.martop {
-			margin-top: 20rpx;
-		}
-
-		.marleft {
-			margin-left: 20rpx;
-		}
-
-		.title {
-			margin: 20rpx;
-		}
-		
-		.scroll-content{
-			overflow: hidden;
-			padding-bottom: calc(120rpx + env(safe-area-inset-bottom) / 2);
-		}
-
-		.commoditylist-container {
-			margin: 0 13rpx;
-			&+.commoditylist-container{
-				margin-top: 20rpx;
-			}
-
-			.commoditylist-content {
-				padding: 20rpx;
-				>view{
-					line-height: 50rpx;
-				}
-			}
-			
-			.btn-box{
-				
-			}
-		}
-
-		.btn {
-			width: 724rpx;
-			position: fixed;
-			left: 13rpx;
-			bottom: calc(24rpx + env(safe-area-inset-bottom) / 2);
-			border-radius: 88rpx;
-			overflow: hidden;
-		}
-
-		.addcommoditylist-container {
-			padding: 20rpx 30rpx 40rpx;
-		}
-	}
-</style>

+ 0 - 163
pages/commodity/components/imgUpload/index.vue

@@ -1,163 +0,0 @@
-<template>
-	<u-upload sizeType="original" :fileList="fileList" :previewFullImage="true" @afterRead="afterRead" @delete="deletePic" multiple
-		accept="image" :maxCount="maxCount">
-		<view class="upload-fix flex justify-around align-center">
-			<view class="flex">
-				<u-icon name="camera" color="#cacaca" size="24"></u-icon>
-			</view>
-		</view>
-	</u-upload>
-</template>
-
-<script>
-	import {
-		ossInfo
-	} from '@/api/oss.js'
-	import {
-		getRandomNum
-	} from '@/utils/common.js'
-	import imgUpload from '@/utils/upload.js'
-	export default {
-		data() {
-			return {
-				uploadData: { //oss返回数据
-					policy: undefined,
-					Signature: undefined,
-					OSSAccessKeyId: undefined,
-					uploadImgUrl: undefined,
-					dir: undefined,
-					key: undefined
-				},
-				fileList: []
-			}
-		},
-		props: {
-			value: {
-				type: Array,
-				require: true,
-				default () {
-					return []
-				}
-			},
-
-			maxCount: {
-				type: Number,
-				require: false,
-				default: 4
-			},
-		},
-
-		watch: {
-			value: {
-				handler(newVal, oldVal) {
-					let newList = newVal.map(i => {
-						return {
-							url: i
-						}
-					})
-					this.fileList = newList
-				},
-				immediate: true,
-				deep: true
-			}
-		},
-
-		methods: {
-			oss() {
-				return new Promise((resolve, reject) => {
-					ossInfo().then(response => {
-						this.uploadData.policy = response.data.policy;
-						this.uploadData.Signature = response.data.signature;
-						this.uploadData.OSSAccessKeyId = response.data.accessid;
-						this.uploadData.uploadImgUrl = response.data.domain;
-						this.uploadData.dir = response.data.dir;
-						resolve(response)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-			// 删除图片
-			deletePic(event) {
-				this.fileList.splice(event.index, 1);
-				let newList = this.fileList.map(i => {
-					return i.url
-				})
-				this.$emit('input', newList)
-			},
-			
-			// 新增图片
-			async afterRead(event) {
-				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
-				let lists = [].concat(event.file)
-				let fileListLen = this.fileList.length
-				lists.map((item) => {
-					this.fileList.push({
-						...item,
-						status: 'uploading',
-						message: '上传中'
-					})
-				})
-
-				await this.oss() //获取oss数据
-
-				for (let i = 0; i < lists.length; i++) {
-					const result = await this.uploadFilePromise(lists[i])
-					let item = this.fileList[fileListLen]
-					this.fileList.splice(fileListLen, 1, Object.assign(item, {
-						status: 'success',
-						message: '成功',
-						url: result
-					}))
-					fileListLen++
-				}
-
-				let newList = this.fileList.map(i => {
-					return i.url
-				})
-				this.$emit('input', newList)
-			},
-			uploadFilePromise(file) {
-				//组装上传数据
-				let timestamp = new Date().getTime()
-				let randomNum = getRandomNum(10000, 99999)
-				let imgType = file.url.substr(file.url.indexOf('.'))
-				this.uploadData.key = `${this.uploadData.dir}${timestamp}${randomNum}${imgType}`
-				let params = {
-					policy: this.uploadData.policy,
-					Signature: this.uploadData.Signature,
-					OSSAccessKeyId: this.uploadData.OSSAccessKeyId,
-					key: this.uploadData.key
-				}
-
-				return new Promise((resolve, reject) => {
-					imgUpload({
-						url: this.uploadData.uploadImgUrl,
-						header: {
-							isToken: true
-						},
-						formData: params,
-						filePath: file.url
-					}).then((res) => {
-						console.log('res',res)
-						let url = this.uploadData.uploadImgUrl + '/' + this.uploadData
-							.key //图片路径需要前端组装
-						console.log('图片路径', url)
-						resolve(url)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-.upload-fix{
-	width:160rpx;
-	height:160rpx;
-	border: 1rpx dashed #dddddd;
-	border-radius: 12rpx;
-}
-</style>

+ 0 - 100
pages/commodity/components/imgUploadCut/index.vue

@@ -1,100 +0,0 @@
-<template>
-	<ximgresiz @upload="doUpload" :avatarSrc="value" quality="1" ref="avatar" />
-</template>
-
-<script>
-	import {
-		ossInfo
-	} from '@/api/oss.js'
-	import {
-		getRandomNum
-	} from '@/utils/common.js'
-	import imgUpload from '@/utils/upload.js'
-	import ximgresiz from '@/components/xy-imgResiz/index.vue'
-	export default {
-		components: {
-			ximgresiz
-		},
-		data() {
-			return {
-				uploadData: { //oss返回数据
-					policy: undefined,
-					Signature: undefined,
-					OSSAccessKeyId: undefined,
-					uploadImgUrl: undefined,
-					dir: undefined,
-					key: undefined
-				},
-			}
-		},
-		props: {
-			value: {
-				type: String,
-				default () {
-					return ''
-				}
-			},
-		},
-
-
-		methods: {
-			fChooseImg(obj) {
-				this.$refs.avatar.fChooseImg(obj);
-			},
-
-			oss() {
-				return new Promise((resolve, reject) => {
-					ossInfo().then(response => {
-						this.uploadData.policy = response.data.policy;
-						this.uploadData.Signature = response.data.signature;
-						this.uploadData.OSSAccessKeyId = response.data.accessid;
-						this.uploadData.uploadImgUrl = response.data.domain;
-						this.uploadData.dir = response.data.dir;
-						resolve(response)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			async doUpload(rsp) {
-				await this.oss() //获取oss数据
-				await this.uploadFilePromise(rsp.path).then(res => {
-					this.$emit('success', res)
-				})
-			},
-
-			uploadFilePromise(url) {
-				//组装上传数据
-				let timestamp = new Date().getTime()
-				let randomNum = getRandomNum(10000, 99999)
-				let imgType = url.substr(url.indexOf('.'))
-				this.uploadData.key = `${this.uploadData.dir}${timestamp}${randomNum}${imgType}`
-				let params = {
-					policy: this.uploadData.policy,
-					Signature: this.uploadData.Signature,
-					OSSAccessKeyId: this.uploadData.OSSAccessKeyId,
-					key: this.uploadData.key
-				}
-
-				return new Promise((resolve, reject) => {
-					imgUpload({
-						url: this.uploadData.uploadImgUrl,
-						header: {
-							isToken: true
-						},
-						formData: params,
-						filePath: url
-					}).then((res) => {
-						console.log('res', res)
-						let url = this.uploadData.uploadImgUrl + '/' + this.uploadData
-							.key //图片路径需要前端组装
-						resolve(url)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-		}
-	}
-</script>

+ 0 - 310
pages/commodity/publicCom.vue

@@ -1,310 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="官方商品库"></u-navbar>
-		<!-- <view class="u-search-box" @click="searchComm">
-			<view class="u-search-inner">
-				<u-icon name="search" color="#909399" :size="28"></u-icon>
-				<text class="u-search-text">搜索商品</text>
-			</view>
-		</view> -->
-		<view class="search" @click="searchComm">
-			<view class="search-input">
-				<u-search placeholder="商品搜索" actionText="取消" :actionStyle="{color:'#2C6FF3'}" :showAction="!leftShow"
-					:clearabled="false" v-model="keyword" @search="search" @custom="cancle"></u-search>
-				<view @click="scan" :class="[leftShow?'scan-icon scan-left-show':'scan-icon scan-left-hidden']">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-			</view>
-
-			<view class="search-history flex flex-wrap flex-start" v-if="!leftShow">
-				<view class="history-item" v-for="(item,index) in historyList" :key="index" @click="searchFast(item)">
-					{{item}}
-				</view>
-			</view>
-		</view>
-
-		<view class="classify-wrap">
-			<Classify ref="classify" :storeName="storeName" :selectShow="true" :tabList="tabList" :status="status"
-				:commList="commList" @switchMenu="switchMenu" @comClick='detail' @lowerBottom="lowerBottom"
-				:height="fullHeight" :leftShow="leftShow" />
-		</view>
-		<view class="btn safe-bottom">
-			<xbutton delay="1500" size="large" @click="addToPer">添加到商品私库</xbutton>
-		</view>
-	</view>
-</template>
-
-<script>
-	import Classify from "@/components/classify/index.vue"
-
-	import {
-		goodsCategory,
-		ownerGoodsList
-	} from "@/api/commodity/goods.js"
-	export default {
-		components: {
-			Classify
-		},
-		data() {
-			return {
-				fullHeight: '0',
-				tabList: [], //商品类目
-				commList: [], //商品列表
-
-				page: 1, //商品分页
-				size: 10,
-
-				status: 'loadmore', //加载更多
-				storeName: 'pubToPerStor', //存储名称
-
-				keyword: '', //搜索
-
-				leftShow: true,
-
-				historyList: []
-			}
-		},
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".classify-wrap").boundingClientRect((data) => {
-				_this.top = data.top;
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - _this.top - 84 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - _this.top - 50 + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			if (uni.getStorageSync('goods')) {
-				this.historyList = JSON.parse(uni.getStorageSync('goods'))
-			}
-			this.getCategory()
-		},
-
-		onShow() {
-			//搜索页来回跳转,刷新已选商品数据
-			this.$refs.classify.onshow()
-		},
-
-		methods: {
-			// 搜索商品
-			// searchComm() {
-			// 	this.$tab.navigateTo('/pages/commodity/publicSearch?type=0&storeName=' + this.storeName)
-			// },
-			search(val) {
-				this.saveKeyWord('goods', this.keyword)
-				this.reset();
-				this.getCommList()
-			},
-
-			cancle(val) {
-				this.keyword = ''
-				this.leftShow = true
-				this.search()
-			},
-
-			saveKeyWord(type, val) {
-				if (val) {
-					let arr = []
-					if (uni.getStorageSync(type)) {
-						let arr = JSON.parse(uni.getStorageSync(type))
-						if (arr.indexOf(val) != -1) {
-							console.log('arr.indexOf(val)', arr.indexOf(val))
-							arr.splice(arr.indexOf(val), 1)
-						}
-						arr.unshift(val)
-						if (arr.length > 6) {
-							arr.pop()
-						}
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					} else {
-						arr.unshift(val)
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					}
-				} else {
-					return
-				}
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.search()
-					}
-				});
-			},
-
-			searchComm() {
-				this.leftShow = false
-			},
-
-			//获取类目列表
-			getCategory() {
-				goodsCategory({
-					deviceId:''
-				}).then(res => {
-					this.tabList = res.data
-					if (this.tabList && this.tabList.length > 0) {
-						this.switchMenu(this.tabList[0])
-					}
-				})
-			},
-
-			//商品类目切换
-			switchMenu(item) {
-				this.reset()
-				this.getCommList(item.categoryCode)
-			},
-
-			//根据类目获取商品列表
-			getCommList(id) {
-				let params = {}
-				if (this.leftShow) { //搜索
-					params = {
-						categoryCode: id,
-						page: {
-							current: this.page,
-							size: this.size
-						}
-					}
-				} else { //非搜索
-					params = {
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword
-					}
-				}
-				ownerGoodsList(params).then(res => {
-					let data = res.data.records;
-					let newData = data.map(i => {
-						i.noSelect = i.mercGoodsId != null ? true : false;
-						i.categoryCode = i.categoryCodeLevel1;
-						return i
-					})
-					if (newData.length < 10) {
-						this.status = "nomore"
-					} else {
-						this.status = "loadmore"
-					}
-					this.commList = this.commList.concat(newData)
-				})
-			},
-
-			//触底加载更多
-			lowerBottom() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getCommList()
-			},
-
-			//添加商品到私库
-			addToPer() {
-				if (uni.getStorageSync(this.storeName) && JSON.parse(uni.getStorageSync(
-						this.storeName)).length > 0) {
-					this.$tab.navigateTo(`/pages/equipment/addComList?storeName=${this.storeName}&type=0`)
-				} else {
-					uni.$u.toast('请先选择商品!')
-				}
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		height: calc(100vh);
-		/* #ifdef H5 */
-		height: calc(100vh - var(--window-top));
-		/* #endif */
-		display: flex;
-		flex-direction: column;
-
-		.search {
-			padding: 24rpx 24rpx;
-			background-color: #fff;
-
-			.search-input {
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					top: 50%;
-					transform: translateY(-50%);
-					z-index: 2;
-
-					&.scan-left-show {
-						right: 36rpx;
-					}
-
-					&.scan-left-hidden {
-						right: 100rpx;
-					}
-				}
-			}
-
-			.search-history {
-
-				.history-item {
-					margin-right: 24rpx;
-					padding: 0 12rpx;
-					background-color: #f2f2f2;
-					color: #333;
-					font-size: 24rpx;
-					line-height: 40rpx;
-					border-radius: 40rpx;
-					margin-top: 24rpx;
-				}
-			}
-		}
-	}
-
-	.classify-wrap {
-		// padding-bottom: 200rpx;
-	}
-
-	.btn {
-		width: 100%;
-		position: fixed;
-		left: 0;
-		bottom: 24rpx;
-		padding: 0 24rpx;
-	}
-</style>

+ 0 - 455
pages/commodity/publicSearch.vue

@@ -1,455 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="title"></u-navbar>
-		<view class="content">
-			<view class="search">
-				<u-search animation placeholder="商品搜索" :clearabled="false" v-model="keyword" :showAction="false"
-					@search="search"></u-search>
-				<view class="scan-icon" @click="scan">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-
-				<view class="search-history flex flex-wrap flex-start">
-					<view class="history-item" v-for="(item,index) in historyList" :key="index"
-						@click="searchFast(item)">
-						{{item}}
-					</view>
-				</view>
-			</view>
-			<view class="list" v-if="newCommList&&newCommList.length>0">
-				<view class="thumb-box" v-for="(item, index) in newCommList" :key="index"
-					@click.stop="commItemSelect(item)">
-					<view>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/no_selected.png"
-							mode="widthFix" v-show="item.noSelect"></image>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-							mode="widthFix" v-show="!item.noSelect&&item.checked"></image>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-							mode="widthFix" v-show="!item.noSelect&&!item.checked"></image>
-					</view>
-					<view class="check-content">
-						<view class="comm-img">
-							<u--image width="130rpx" height="130rpx" :src="item.cover" mode="widthFix"
-								:lazy-lord="true"></u--image>
-						</view>
-						<view class="comm-main">
-							<view>
-								{{item.name}}
-							</view>
-							<view>
-								条形码:{{item.barcode}}
-							</view>
-							<view>
-								商品类型:{{item.categoryName}}
-							</view>
-							<view v-if="type==1">
-								价格:<text>¥{{item.price}}</text>
-							</view>
-						</view>
-					</view>
-				</view>
-				<u-loadmore :status="status" v-if="newCommList.length>=1" />
-			</view>
-
-			<view class="empty" v-if="newCommList.length==0">
-				<u-empty mode="car" text="没有商品!"></u-empty>
-			</view>
-		</view>
-
-		<view class="btn safe-bottom">
-			<xbutton size="large" @click="submit">{{btnName}}({{selectList.length}})</xbutton>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		ownerGoodsList as perOwnerGoodsList
-	} from "@/api/commodity/mercGoods.js"
-	import {
-		ownerGoodsList as pubOwnerGoodsList,
-		pageByGoods,
-		pageByGoodsMerc
-	} from "@/api/commodity/goods.js"
-	export default {
-		data() {
-			return {
-				keyword: '',
-				commList: [], //商品列表
-
-				page: 1, //商品分页
-				size: 10,
-
-				status: 'loadmore', //加载更多
-				type: null,
-				storeName: null,
-				title: '私有商品库',
-				btnName: '添加到商品私库',
-				selectList: [],
-				id: null,
-				historyList: []
-			}
-		},
-
-		computed: {
-			newCommList() {
-				let newCommList = [];
-				if (this.selectList && this.selectList.length > 0) {
-					let selectList = this.selectList
-					const idMapping = selectList.reduce((acc, el, i) => {
-						acc[el.id] = i;
-						return acc;
-					}, {});
-					this.commList.forEach(i => {
-						if (idMapping[i.id] != undefined) { //重复值
-							i.checked = true
-						} else {
-							i.checked = false
-						}
-						newCommList.push(i)
-					})
-				} else {
-					newCommList = this.commList.map(i => {
-						i.checked = false;
-						return i
-					})
-				}
-				console.log('newCommList', newCommList)
-				return newCommList
-			},
-		},
-
-		onLoad(o) {
-			if (uni.getStorageSync('goods')) {
-				this.historyList = JSON.parse(uni.getStorageSync('goods'))
-			}
-			if (o.type) {
-				this.id = o.type != 0 ? o.id : null;
-				this.type = o.type; //0公库到私库、1私库到设备、2公库到设备
-				this.title = o.type == 1 ? '私有商品库' : '官方商品库';
-				this.btnName = o.storeName == 'pubToPerStor' ? '添加到商品私库' : '添加到设备';
-				this.storeName = o.storeName;
-
-				if (uni.getStorageSync(this.storeName) && JSON.parse(uni.getStorageSync(
-						this.storeName)).length > 0) {
-					let commStor = JSON.parse(uni.getStorageSync(this.storeName))
-					this.selectList = commStor;
-				}
-
-				this.getCommList();
-			}
-		},
-		methods: {
-			search(val) {
-				this.saveKeyWord('goods', this.keyword)
-				this.reset();
-				this.getCommList()
-			},
-
-			saveKeyWord(type, val) {
-				if (val) {
-					let arr = []
-					if (uni.getStorageSync(type)) {
-						let arr = JSON.parse(uni.getStorageSync(type))
-						if (arr.indexOf(val) != -1) {
-							console.log('arr.indexOf(val)', arr.indexOf(val))
-							arr.splice(arr.indexOf(val), 1)
-						}
-						arr.unshift(val)
-						if (arr.length > 6) {
-							arr.pop()
-						}
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					} else {
-						arr.unshift(val)
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					}
-				} else {
-					return
-				}
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.getCommList()
-					}
-				});
-			},
-
-			//根据类目获取商品列表
-			getCommList(id) {
-				if (this.type == 0) { //公库到私库
-					pubOwnerGoodsList({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword
-					}).then(res => {
-						let data = res.data.records;
-						let newData = data.map(i => {
-							i.noSelect = i.mercGoodsId != null ? true : false;
-							i.categoryCode = i.categoryCodeLevel1;
-							return i
-						})
-						if (newData.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.commList = this.commList.concat(newData)
-					})
-				}
-				if (this.type == 1) { //私库到设备
-					pageByGoodsMerc({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword,
-						deviceId: this.id
-					}).then(res => {
-						let data = res.data.records;
-						if (data && data.length > 0) {
-							data = data.map(i => {
-								i.noSelect = i.isBind;
-								i.name = i.goodsName;
-								i.barcode = i.goodsBarcode;
-								i.cover = i.goodsCover;
-								i.price = Number(i.price) / 100;
-								i.categoryName = i.capacity == null ? '未分类' : i.capacity;
-								return i
-							})
-						}
-						if (data.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.commList = this.commList.concat(data)
-					})
-				}
-
-				if (this.type == 2) { //公库设备
-					pageByGoods({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword,
-						deviceId: this.id
-					}).then(res => {
-						let data = res.data.records;
-						let newData = data.map(i => {
-							i.noSelect = i.isBind;
-							i.categoryCode = i.categoryCodeLevel1;
-							return i
-						})
-						if (newData.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.commList = this.commList.concat(newData)
-					})
-				}
-			},
-
-			//触底加载更多
-			onReachBottom() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getCommList()
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-
-			// 商品选中状态改变
-			commItemSelect(e) {
-				if (e.noSelect) {
-					this.$modal.msg('当前商品已存在!')
-					return
-				}
-				e.checked = !e.checked
-				//选中商品存储到内存中,以便取用
-				let commStor = []
-				if (e.checked) { //选中添加到存储中
-					if (uni.getStorageSync(this.storeName)) {
-						commStor = JSON.parse(uni.getStorageSync(this.storeName));
-					}
-					commStor.push(e);
-				} else { //取消选中删除,并且从存储中删除
-					commStor = JSON.parse(uni.getStorageSync(this.storeName));
-					for (let i = 0; i < commStor.length; i++) {
-						let item = commStor[i]
-						if (item.id == e.id) {
-							commStor.splice(i, 1);
-							break
-						}
-					}
-				}
-				//收集选中商品,更新存储
-				this.selectList = commStor;
-				commStor.length > 0 ? uni.setStorageSync(this.storeName, JSON.stringify(commStor)) : uni
-					.setStorageSync(
-						this.storeName, '')
-				if (commStor.length > 0) {
-					uni.setStorageSync(this.storeName, JSON.stringify(commStor))
-				}
-			},
-
-			submit() {
-				if (uni.getStorageSync(this.storeName) && JSON.parse(uni.getStorageSync(this.storeName)).length > 0) {
-					this.$tab.navigateTo(
-						`/pages/equipment/addComList?storeName=${this.storeName}&type=${this.type}&id=${this.id}`)
-
-				} else {
-					uni.$u.toast('请先选择商品!')
-				}
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			padding-bottom: 88rpx;
-
-			.search {
-				padding: 24rpx 24rpx 12rpx;
-				background-color: #fff;
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					right: 36rpx;
-					top: 38rpx;
-					z-index: 2;
-				}
-
-				.search-history {
-
-					.history-item {
-						margin-right: 24rpx;
-						padding: 0 12rpx;
-						background-color: #f2f2f2;
-						color: #333;
-						font-size: 24rpx;
-						line-height: 40rpx;
-						border-radius: 40rpx;
-						margin-top: 24rpx;
-					}
-				}
-			}
-
-			.list {
-				width: 100%;
-				padding: 12rpx 24rpx;
-
-				.thumb-box {
-					margin-bottom: 12rpx;
-					border-bottom: 1rpx solid #f4f4f4;
-					display: flex;
-					flex-flow: row nowrap;
-					padding: 12rpx 12rpx;
-					align-items: center;
-					background-color: #fff;
-					border-radius: 12rpx;
-				}
-
-				.select-img {
-					width: 40rpx;
-					height: 40rpx;
-				}
-
-				.check-content {
-					display: flex;
-					flex-direction: row;
-					align-items: center;
-					padding-left: 12rpx;
-
-					.comm-img {
-						width: 130rpx;
-						height: 130rpx;
-						display: flex;
-						flex-direction: row;
-						align-items: center;
-						justify-content: space-around;
-
-						image {
-							width: 100%;
-						}
-					}
-
-					.comm-main {
-						box-sizing: border-box;
-						padding-left: 18rpx;
-						color: #999;
-
-						>view {
-							padding: 4rpx 0;
-						}
-
-						>view:nth-child(1) {
-							font-size: 28rpx;
-							font-weight: bold;
-							color: #333;
-						}
-
-						>view:nth-child(2) {
-							font-size: 26rpx;
-						}
-
-						>view:nth-child(3) {
-							font-size: 26rpx;
-						}
-
-						>view:nth-child(4) {
-							font-size: 26rpx;
-
-							text {
-								font-weight: bold;
-								color: red;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			bottom: 24rpx;
-			padding: 0 24rpx;
-		}
-
-		.empty {
-			position: absolute;
-			left: 50%;
-			top: 50%;
-			transform: translate(-50%, -50%);
-		}
-	}
-</style>

+ 0 - 247
pages/commodity/search.vue

@@ -1,247 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="商品私库"></u-navbar>
-		<view class="content">
-			<view class="search">
-				<u-search animation placeholder="商品搜索" :clearabled="false" v-model="keyword" :showAction="false"
-					@search="search"></u-search>
-				<view class="scan-icon" @click="scan">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-
-				<view class="search-history flex flex-wrap flex-start">
-					<view class="history-item" v-for="(item,index) in historyList" :key="index"
-						@click="searchFast(item)">
-						{{item}}
-					</view>
-				</view>
-			</view>
-			<view class="list">
-				<u-list @scrolltolower="scrolltolower" :height="fullHeight">
-					<u-list-item class="list-item" v-for="(item, index) in commList" :key="index">
-						<view class="comm-item" @click="$tab.navigateTo('/pages/commodity/comEdit?id='+item.id)">
-							<u--image radius="4" width="110rpx" height="110rpx" :src="item.goodsCover" mode="widthFix"
-								:lazy-lord="true"></u--image>
-							<view class="item-content">
-								<view>
-									{{item.goodsName}}
-								</view>
-								<view>
-									69码:{{item.goodsBarcode}}
-								</view>
-								<view>
-									商品类型:{{item.categoryCode}}
-								</view>
-							</view>
-							<view class="status">
-								<u-tag text="已上架" type="success" plain v-if="item.status=='1'"> </u-tag>
-								<u-tag text="已下架" type="error" plain v-else></u-tag>
-							</view>
-						</view>
-					</u-list-item>
-					<u-loadmore :status="status" v-if="commList.length>0" />
-				</u-list>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		ownerGoodsList
-	} from "@/api/commodity/mercGoods.js"
-	import {
-		saveKeyWord
-	} from '@/utils/common.js'
-	export default {
-		data() {
-			return {
-				keyword: '',
-				page: 1, //商品分页
-				size: 10,
-
-				status: 'loadmore', //加载更多
-				commList: [], //商品列表
-				fullHeight: 0,
-				historyList: []
-			}
-		},
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".list").boundingClientRect((data) => {
-				_this.top = data.top;
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X", 
-							'iPhone XR', 
-							"iPhone XS", 
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - _this.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - _this.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			if (uni.getStorageSync('goods')) {
-				this.historyList = JSON.parse(uni.getStorageSync('goods'))
-			}
-		},
-
-		onShow() {
-			this.search()
-		},
-
-		methods: {
-			search(val) {
-				if(val){
-					this.historyList = saveKeyWord('goods', this.keyword)
-				}
-				this.reset();
-				this.getCommList()
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.getCommList()
-					}
-				});
-			},
-
-			//根据类目获取商品列表
-			getCommList(id) {
-				ownerGoodsList({
-					page: {
-						current: this.page,
-						size: this.size
-					},
-					keyword: this.keyword
-				}).then(res => {
-					let data = res.data.records;
-					if (data.length < 10) {
-						this.status = "nomore"
-					} else {
-						this.status = "loadmore"
-					}
-					this.commList = this.commList.concat(data)
-				})
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-
-			scrolltolower() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getCommList()
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			.search {
-				padding: 24rpx 24rpx 12rpx;
-				background-color: #fff;
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					right: 36rpx;
-					top: 38rpx;
-					z-index: 2;
-				}
-
-				.search-history {
-
-					.history-item {
-						margin-right: 12rpx;
-						padding: 0 12rpx;
-						background-color: #f2f2f2;
-						color: #333;
-						font-size: 24rpx;
-						line-height: 40rpx;
-						border-radius: 40rpx;
-						margin-top: 12rpx;
-					}
-				}
-			}
-
-			.list {
-				width: 100%;
-				padding: 12rpx 24rpx;
-
-				.comm-item {
-					display: flex;
-					flex-direction: row;
-					justify-content: flex-start;
-					align-items: center;
-					background-color: #fff;
-					margin-bottom: 12rpx;
-					border-radius: 12rpx;
-					box-sizing: border-box;
-					padding: 12rpx;
-					position: relative;
-
-					.status {
-						position: absolute;
-						right: 12rpx;
-						top: 12rpx;
-					}
-
-					.image {
-						width: 110rpx;
-					}
-
-					.item-content {
-						padding-left: 24rpx;
-						color: #999;
-
-						>view:nth-child(1) {
-							font-size: 28rpx;
-							font-weight: bold;
-							color: #333;
-						}
-
-						>view:nth-child(2) {
-							font-size: 26rpx;
-							padding: 12rpx 0;
-						}
-
-						>view:nth-child(3) {
-							font-size: 26rpx;
-						}
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 608
pages/equipment/addCom.vue

@@ -1,608 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="增加商品"></u-navbar>
-		<!-- <view class="search" @click.native="searchClick">
-			<u-search animation placeholder="商品搜索" disabled v-model="keyword" :showAction="false" search="search">
-			</u-search>
-		</view> -->
-
-		<view class="search" @click="searchComm">
-			<view class="search-input">
-				<u-search placeholder="商品搜索" actionText="取消" :actionStyle="{color:'#2C6FF3'}" :showAction="!leftShow"
-					:clearabled="false" v-model="keyword" @search="search" @custom="cancle"></u-search>
-				<view @click="scan" :class="[leftShow?'scan-icon scan-left-show':'scan-icon scan-left-hidden']">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-			</view>
-
-			<view class="search-history flex flex-wrap flex-start" v-if="!leftShow">
-				<view class="history-item" v-for="(item,index) in historyList" :key="index" @click="searchFast(item)">
-					{{item}}
-				</view>
-			</view>
-		</view>
-
-		<view class="xy-card tab-list" style="padding:0 0 24rpx;">
-			<view class="tab-left">
-				<u-tabs :list="tabList" :scrollable="false" :current="current" @click="tabClick" lineColor="#2C6FF3">
-				</u-tabs>
-			</view>
-			<view class="use-list" @click="$tab.navigateTo(`/pages/commodity/commoditylist?id=${id}`)">
-				常用商品清单
-			</view>
-		</view>
-		<view class="content">
-			<view class="swiperitem-content" v-if="current==0">
-				<view class="classify-wrap">
-					<Classify storeName="perStor" :selectShow="true" :tabList="perTabList" :status="perStatus"
-						:commList="perCommList" @switchMenu="perSwitchMenu" @lowerBottom="perLowerBottom"
-						:isModal="true" :height="fullHeight" @comClick="comClick" :leftShow="leftShow" />
-				</view>
-				<view class="btn safe-bottom">
-					<xbutton size="large" @click="addCom">添加到设备</xbutton>
-				</view>
-			</view>
-			<view class="swiperitem-content" v-if="current==1">
-				<view class="classify-wrap">
-					<Classify storeName="pubStor" :selectShow="true" :tabList="pubTabList" :status="pubStatus"
-						:commList="pubCommList" @switchMenu="pubSwitchMenu" @lowerBottom="pubLowerBottom"
-						:height="fullHeight" :leftShow="leftShow" />
-				</view>
-				<view class="btn">
-					<xbutton size="large" @click="addCom">添加到设备</xbutton>
-				</view>
-			</view>
-			<!-- 选项卡内容轮播滑动显示,current为当前第几个swiper子项 -->
-			<!-- <swiper @change="change" :current="current" class="swiper-content" :style="{height:height}">
-				<swiper-item class="swiperitem-content">
-					<view class="search">
-						<u-search animation placeholder="商品搜索" v-model="keyword" :showAction="false" search="search">
-						</u-search>
-					</view>
-					<view class="classify-wrap">
-						<Classify storeName="perStor1" :height="fullHeight" :selectShow="true"
-							v-model="commodityList" />
-
-					</view>
-					<view class="btn">
-						<xbutton size="large" @click="addCom">已选中(21)样商品</xbutton>
-					</view>
-				</swiper-item>
-				<swiper-item class="swiperitem-content">
-					<view class="search">
-						<u-search animation placeholder="商品搜索" v-model="keyword" :showAction="false" search="search">
-						</u-search>
-					</view>
-					<view class="classify-wrap">
-						<Classify storeName="perStor2" :height="fullHeight" :selectShow="true"
-							v-model="commodityList" />
-					</view>
-					<view class="btn">
-						<xbutton size="large" @click="addCom">已选中(21)样商品</xbutton>
-					</view>
-				</swiper-item>
-			</swiper> -->
-		</view>
-	</view>
-</template>
-
-<script>
-	import Classify from "@/components/classify/index.vue"
-	import {
-		goodsCategory as perGoodsCategory,
-	} from "@/api/commodity/mercGoods.js"
-	import {
-		goodsCategory as pubGoodsCategory,
-		pageByGoods,
-		pageByGoodsMerc,
-		bindDeviceByMercGoods
-	} from "@/api/commodity/goods.js"
-	export default {
-		components: {
-			Classify
-		},
-		data() {
-			return {
-				tabList: [{
-						name: '私有商品库'
-					},
-					{
-						name: '官方商品库'
-					}
-				],
-				current: 0,
-				fullHeight: "0",
-
-				// 私库
-				perTabList: [], //商品类目
-				perCommList: [], //商品列表
-				perPage: 1, //商品分页
-				perSize: 10,
-				perStatus: 'loadmore', //加载更多
-
-				// 公库
-				pubTabList: [], //商品类目
-				pubCommList: [], //商品列表
-				pubPage: 1, //商品分页
-				pubSize: 10,
-				pubStatus: 'loadmore', //加载更多
-
-				id: null, //设备id
-				categoryCode: null,
-
-				leftShow: true,
-				historyList: [],
-				keyword: ''
-			}
-		},
-
-		onLoad(o) {
-			if (o.id) {
-				this.id = o.id;
-			}
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".classify-wrap").boundingClientRect((data) => {
-				_this.top = data.top;
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - _this.top - 84 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - _this.top - 54 + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			if (uni.getStorageSync('goods')) {
-				this.historyList = JSON.parse(uni.getStorageSync('goods'))
-			}
-			this.getPerCategory()
-			this.getPubCategory()
-		},
-
-		async onShow() {
-			this.perReset()
-			this.pubReset()
-			await this.getPerCommList()
-			await this.getPubCommList()
-		},
-
-		methods: {
-			searchComm() {
-				this.leftShow = false
-			},
-
-			search(val) {
-				this.saveKeyWord('goods', this.keyword)
-				if (this.current == 0) { //私库
-					this.perReset();
-					this.getPerCommList()
-				} else { //公库
-					this.pubReset();
-					this.getPubCommList()
-				}
-			},
-
-			cancle(val) {
-				this.keyword = ''
-				this.leftShow = true
-				this.search()
-			},
-
-			saveKeyWord(type, val) {
-				if (val) {
-					let arr = []
-					if (uni.getStorageSync(type)) {
-						let arr = JSON.parse(uni.getStorageSync(type))
-						if (arr.indexOf(val) != -1) {
-							console.log('arr.indexOf(val)', arr.indexOf(val))
-							arr.splice(arr.indexOf(val), 1)
-						}
-						arr.unshift(val)
-						if (arr.length > 6) {
-							arr.pop()
-						}
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					} else {
-						arr.unshift(val)
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					}
-				} else {
-					return
-				}
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.search()
-					}
-				});
-			},
-
-			/************************ 私库方法 ********************************/
-			// 搜索商品
-			searchClick() {
-				let storeName = this.current == 0 ? 'perStor' : 'pubStor'
-				this.$tab.navigateTo('/pages/commodity/allGoodsSearch?type=' + this.current + '&storeName=' + storeName +
-					'&id=' +
-					this.id)
-			},
-
-			//获取类目列表
-			getPerCategory() {
-				return new Promise((resolve, reject) => {
-					perGoodsCategory().then(res => {
-						if (res.data && res.data.length > 0) {
-							this.perTabList = res.data.map(i => {
-								if (i.categoryCode == null) {
-									i.categoryName = '未定义'
-									return i
-								} else {
-									return i
-								}
-							});
-							if (this.perTabList && this.perTabList.length > 0) {
-								this.categoryCode = this.perTabList[0].categoryCode
-							}
-						}
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			//商品类目切换
-			perSwitchMenu(item) {
-				this.categoryCode = item.categoryCode
-				this.perReset()
-				this.getPerCommList()
-			},
-
-			//根据类目获取商品列表
-			getPerCommList() {
-				let params = {}
-				if (this.leftShow) { //搜索
-					params = {
-						categoryCode: this.categoryCode,
-						page: {
-							current: this.perPage,
-							size: this.perSize
-						},
-						deviceId: this.id
-					}
-				} else { //非搜索
-					params = {
-						page: {
-							current: this.perPage,
-							size: this.perSize
-						},
-						deviceId: this.id,
-						keyword: this.keyword
-					}
-				}
-				return new Promise((resolve, reject) => {
-					pageByGoodsMerc(params).then(res => {
-						let data = res.data.records;
-						if (data && data.length > 0) {
-							data = data.map(i => {
-								i.name = i.goodsName;
-								i.barcode = i.goodsBarcode;
-								i.cover = i.goodsCover;
-								i.price = i.price != null ? Number(i.price) / 100 : null;
-								i.categoryName = i.categoryCodeName;
-								i.noSelect = i.isBind;
-								return i
-							})
-						}
-						if (data.length < 10) {
-							this.perStatus = "nomore"
-						} else {
-							this.perStatus = "loadmore"
-						}
-						this.perCommList = this.perCommList.concat(data)
-
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			//触底加载更多
-			perLowerBottom() {
-				if (this.perStatus == 'nomore') return
-				this.perPage++
-				this.getPerCommList()
-			},
-
-			//重置
-			perReset() {
-				this.perStatus == 'loadmore'
-				this.perPage = 1;
-				this.perSize = 10;
-				this.perCommList = [];
-			},
-
-			//新建模块商品先需要设置价格
-			comClick(e) {
-				uni.showModal({
-					title: '提示',
-					content: '当前商品为新商品需先设置商品价格,是否前往设置?',
-					success: res => {
-						if (res.confirm) {
-							this.$tab.navigateTo('/pages/commodity/comEdit?id=' + e.id)
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			},
-
-
-			/********************** 公库方法 *************************/
-			//获取类目列表
-			getPubCategory() {
-				return new Promise((resolve, reject) => {
-					pubGoodsCategory({
-						deviceId:this.id
-					}).then(res => {
-						if (res.data && res.data.length > 0) {
-							this.pubTabList = res.data.map(i => {
-								if (i.categoryCode == null) {
-									i.categoryName = '未定义'
-									return i
-								} else {
-									return i
-								}
-							});
-							if (this.pubTabList && this.pubTabList.length > 0) {
-								this.categoryCode = this.pubTabList[0].categoryCode
-							}
-						}
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			//商品类目切换
-			pubSwitchMenu(item) {
-				this.categoryCode = item.categoryCode
-				this.pubReset()
-				this.getPubCommList()
-			},
-
-			//根据类目获取商品列表
-			getPubCommList() {
-				let params = {}
-				if (this.leftShow) { //搜索
-					params = {
-						categoryCodeLevel1: this.categoryCode,
-						page: {
-							current: this.pubPage,
-							size: this.pubSize
-						},
-						deviceId: this.id
-					}
-				} else { //非搜索
-					params = {
-						page: {
-							current: this.pubPage,
-							size: this.pubSize
-						},
-						deviceId: this.id,
-						keyword: this.keyword
-					}
-				}
-				return new Promise((resolve, reject) => {
-					pageByGoods(params).then(res => {
-						let data = res.data.records;
-						let newData = data.map(i => {
-							i.categoryCode = i.categoryCodeLevel1;
-							i.noSelect = i.isBind;
-							return i
-						})
-						if (data.length < 10) {
-							this.pubStatus = "nomore"
-						} else {
-							this.pubStatus = "loadmore"
-						}
-						this.pubCommList = this.pubCommList.concat(newData)
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			//触底加载更多
-			pubLowerBottom() {
-				if (this.pubStatus == 'nomore') return
-				this.pubPage++
-				this.getPubCommList()
-			},
-
-			//重置
-			pubReset() {
-				this.pubStatus == 'loadmore'
-				this.pubPage = 1;
-				this.pubSize = 10;
-				this.pubCommList = [];
-			},
-
-			tabClick(e) {
-				this.current = e.index
-				this.search()
-			},
-
-			change(e) {
-				this.current = e.detail.current
-			},
-
-			/**
-			 * 添加商品
-			 * 私库添加到设备,不需要设置参数
-			 */
-			addCom() {
-				let storeName = this.current == 0 ? 'perStor' : 'pubStor';
-				if (uni.getStorageSync(storeName) && JSON.parse(uni.getStorageSync(
-						storeName)).length > 0) {
-					if (this.current == 0) { //私库
-						let commList = JSON.parse(uni.getStorageSync(storeName))
-						let goodsIdList = commList.map(i => {
-							return i.goodsId
-						})
-						bindDeviceByMercGoods({
-							deviceIds: [this.id],
-							goodsIdList: goodsIdList
-						}).then(res => {
-							if (res.code == 200) {
-								this.$modal.msg('添加成功~')
-								uni.setStorageSync(storeName, '') //清空购物车
-								setTimeout(() => {
-									// this.$tab.redirectTo(`/pages/equipment/comManage?id=${this.id}`)
-									uni.navigateBack({
-										delta: 1
-									})
-								}, 1000)
-							}
-						})
-					}
-					if (this.current == 1) { //公库
-						let url = '';
-						let type = this.current == 0 ? 1 : 2;
-						url = `/pages/equipment/addComList?type=${type}&storeName=${storeName}&id=${this.id}`
-						this.$tab.navigateTo(url)
-					}
-				} else {
-					uni.$u.toast('请先选择商品!')
-					return
-				}
-			},
-
-			//私库添加至设备
-			perToDev() {
-				uni.showModal({
-					title: '提示',
-					content: '是否确认添加商品',
-					success: res => {
-						if (res.confirm) {
-
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		height: calc(100vh);
-		/* #ifdef H5 */
-		height: calc(100vh - var(--window-top));
-		/* #endif */
-		display: flex;
-		flex-direction: column;
-
-		.search {
-			padding: 24rpx 24rpx;
-			background-color: #fff;
-
-			.search-input {
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					top: 50%;
-					transform: translateY(-50%);
-					z-index: 2;
-
-					&.scan-left-show {
-						right: 36rpx;
-					}
-
-					&.scan-left-hidden {
-						right: 100rpx;
-					}
-				}
-			}
-
-			.search-history {
-
-				.history-item {
-					margin-right: 24rpx;
-					padding: 0 12rpx;
-					background-color: #f2f2f2;
-					color: #333;
-					font-size: 24rpx;
-					line-height: 40rpx;
-					border-radius: 40rpx;
-					margin-top: 24rpx;
-				}
-			}
-		}
-
-		.tab-list {
-			display: flex;
-			flex-flow: row nowrap;
-			justify-content: space-around;
-
-			.tab-left {
-				width: 60%;
-			}
-
-			.use-list {
-				font-size: 30rpx;
-				color: #606266;
-				line-height: 88rpx;
-				padding-right: 24rpx;
-			}
-		}
-
-		.content {}
-	}
-
-	.swiperitem-content {
-		// position: relative;
-	}
-
-	.btn {
-		width: 100%;
-		position: fixed;
-		left: 0;
-		bottom: 24rpx;
-		padding: 0 24rpx;
-	}
-</style>

+ 0 - 296
pages/equipment/addComList.vue

@@ -1,296 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="增加商品"></u-navbar>
-		<view class="content">
-			<view class="xy-card" v-for="(item,index) in commList" :key="item.id">
-				<view class="comm-item">
-					<view class="image">
-						<u--image radius="4" width="130rpx" height="130rpx" :src="item.cover" mode="widthFix"
-							:lazy-load="true">
-						</u--image>
-					</view>
-					<view class="item-content">
-						<view class="item-top">
-							<view>
-								{{item.name}}
-							</view>
-							
-						</view>
-						<view class="item-input-wrap">
-							<view class="item-input" v-if="type!=1">
-								<view class="input-label require">
-									条形码:
-								</view>
-								<view class="input-box">
-									<text>{{item.barcode}}</text>
-								</view>
-							</view>
-							
-							<view class="item-input" v-if="type!=1">
-								<view class="input-label require">
-									成本价
-								</view>
-								<view class="input-box">
-									<input type="digit" class="input" placeholder="请输入" border="surround" v-model="item.priceCost" />
-								</view>
-							</view>
-							<view class="item-input require">
-								<view class="input-label">
-									零售价
-								</view>
-								<view class="input-box">
-									<input type="digit" class="input" placeholder="请输入" border="surround" v-model="item.price" />
-								</view>
-							</view>
-							<!-- <view class="item-input">
-								<view class="input-label">
-									商品容量
-								</view>
-								<view class="input-box">
-									<input type="number" class="input" placeholder="请输入" border="surround" v-model="item.capacity" />
-								</view>
-							</view> -->
-							<view class="item-input">
-								<view class="input-label">
-									库存预警
-								</view>
-								<view class="input-box">
-									<input type="number" class="input" placeholder="请输入" border="surround" v-model="item.warning" />
-								</view>
-							</view>
-						</view>
-					</view>
-				</view>
-			</view>
-		</view>
-		<view class="btn safe-bottom">
-			<xbutton delay="1500" size="large" @click="sure">完成</xbutton>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		bindMerc
-	} from "@/api/commodity/mercGoods.js"
-	import {
-		bindDeviceByGoods
-	} from "@/api/commodity/goods.js"
-	export default {
-		data() {
-			return {
-				commList: [],
-				type: null,
-				storeName: null,
-				id: null
-			}
-		},
-		onLoad(o) {
-			if (o.type == 0) { //公库添加到私库
-				this.type = 0
-			} else if (o.type == 1) { //私库添加到设备
-				this.type = 1;
-				this.id = o.id;
-			} else if (o.type == 2) { //公库添加到设备
-				this.type = 2;
-				this.id = o.id;
-			}
-			this.storeName = o.storeName;
-			let commStor = JSON.parse(uni.getStorageSync(o.storeName))
-			this.commList = commStor.map(i => {
-				i.capacity = 100
-				i.warning = 5
-				return i
-			})
-		},
-		methods: {
-			sure() {
-				if (this.type == 0) { //添加到私库
-					let params = this.delParams()
-					if (!params) return
-					bindMerc(params).then(res => {
-						if (res.code == 200) {
-							this.$modal.msg('添加成功~')
-							uni.setStorageSync(this.storeName, '') //清空购物车
-							this.$tab.reLaunch('/pages/globalPages/home?tabName=商品')
-						}
-					})
-				} else { //添加到设备
-					let params = this.delParams()
-					if (!params) return
-					let assignParams = {
-						deviceIds: [this.id],
-						goodsList: params,
-					}
-					bindDeviceByGoods(assignParams).then(res => {
-						if (res.code == 200) {
-							this.$modal.msg('添加成功~')
-							uni.setStorageSync(this.storeName, '') //清空购物车
-							setTimeout(() => {
-								// this.$tab.redirectTo(`/pages/equipment/comManage?id=${this.id}`)
-								let pageList=getCurrentPages()
-								let delta=2
-								pageList.forEach(i=>{
-									if(i.route=='pages/globalPages/allGoodsSearch'){
-										delta=3
-									}
-								})
-								uni.navigateBack({
-									delta: delta
-								})
-							}, 1000)
-						}
-					})
-				}
-			},
-
-			delParams() {
-				let params = [];
-				for (let i = 0; i < this.commList.length; i++) {
-					let item = this.commList[i];
-					let obj = {};
-					obj.goodsId = this.type == 1 ? item.goodsId : item.id;
-					if (this.type != 1) { //非私库添加需要输入成本价格
-						if (item.priceCost != undefined && item.priceCost != null) {
-							obj.priceCost = item.priceCost * 100;
-						} else {
-							this.$modal.msg('请输入成本价!')
-							return false
-						}
-					}
-
-					if (item.price != undefined && item.price != null) {
-						obj.price = item.price * 100;
-					} else {
-						this.$modal.msg('请输入零售价格!')
-						return false
-					}
-
-					if (item.price != undefined && item.price != null && item.priceCost != undefined && item.priceCost !=
-						null) {
-						obj.price = item.price * 100;
-						if (obj.price < obj.priceCost) {
-							this.$modal.msg('零售价不能低于成本价!')
-							return false
-						}
-					}
-
-					if (item.capacity != undefined && item.capacity != null) {
-						obj.capacity = item.capacity;
-					} else {
-						// this.$modal.msg('请输入商品容量!')
-						// return false
-					}
-					if (item.warning != undefined && item.warning != null) {
-						obj.warning = item.warning;
-					} else {
-						// this.$modal.msg('请输入预警值!')
-						// return false
-					}
-					params.push(obj)
-				}
-				return params
-			},
-
-
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		position: relative;
-
-		.content {
-			padding: 12rpx 24rpx 108rpx;
-
-			.xy-card+.xy-card {
-				margin-top: 18rpx;
-			}
-
-			.tag {
-				position: absolute;
-				right: 12rpx;
-				top: 12rpx;
-			}
-
-			.comm-item {
-				display: flex;
-				flex-direction: row;
-				justify-content: flex-start;
-				align-items: center;
-				background-color: #fff;
-				border-radius: 12rpx;
-				box-sizing: border-box;
-				padding: 12rpx;
-
-				.image {
-					width: 130rpx;
-				}
-
-				.item-content {
-					padding-left: 24rpx;
-					color: #666;
-					width: 530rpx;
-
-					.item-top {
-						>view:nth-child(1) {
-							font-size: 30rpx;
-							font-weight: bold;
-							color: #333;
-						}
-
-						>view:nth-child(2) {
-							font-size: 28rpx;
-							margin-top: 12rpx;
-						}
-
-					}
-
-					.item-input-wrap {
-						display: flex;
-						flex-flow: row wrap;
-						justify-content: space-between;
-
-						.item-input {
-							width: 100%;
-							display: flex;
-							flex-flow: row nowrap;
-							align-items: center;
-							justify-content: flex-start;
-							margin-top: 12rpx;
-
-							.input-label {
-								width: 160rpx;
-								font-size: 30rpx;
-								line-height: 40rpx;
-							}
-
-							.input-box {
-								width: 320rpx;
-								height: 70rpx;
-								line-height: 70rpx;
-
-								.input {
-									height: 70rpx;
-									border: 1rpx solid #eee;
-									box-sizing: border-box;
-									padding: 0 12rpx;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		.btn {
-			position: fixed;
-			width: 100%;
-			padding: 24rpx;
-			left: 0;
-			bottom: 0;
-		}
-	}
-</style>

+ 0 - 456
pages/equipment/comManage.vue

@@ -1,456 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="title"></u-navbar>
-		<view class="content">
-			<!-- <view class="search">
-				<u-search animation placeholder="商品搜索" v-model="keyword" :showAction="false" search="search"></u-search>
-			</view> -->
-			<view class="list" v-if="commList&&commList.length>0">
-				<view class="thumb-box" v-for="(item, index) in commList" :key="item.id"
-					@click.stop="commItemSelect(item)">
-					<view>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-							mode="widthFix" v-show="item.checked"></image>
-						<image class="select-img"
-							src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-							mode="widthFix" v-show="!item.checked"></image>
-					</view>
-					<view class="check-content">
-						<view class="comm-img">
-							<u--image width="130rpx" height="130rpx" :src="item.cover" mode="aspectFit"
-								:lazy-load="true"></u--image>
-						</view>
-						<view class="comm-main">
-							<view>
-								{{item.name}}
-							</view>
-							<view>
-								条形码:{{item.barcode}}
-							</view>
-							<view>
-								商品ID:{{item.id}}
-							</view>
-							<view>
-								商品SKUID:{{item.skuId}}
-							</view>
-							<!-- <view class="c-cx">
-								促销活动:
-							</view> -->
-							<view class="c-pri">
-								价格:<text>¥{{$xy.delMoney(item.price)}}</text>
-								<view @click.stop="edit(item)">修改</view>
-							</view>
-						</view>
-
-						<view class="status" v-if="item.name">
-							<view class="s-name">
-								在售/补后
-							</view>
-							<view class="s-num">
-								{{item.stock}}/{{item.fillCount}}
-							</view>
-						</view>
-
-						<view class="status" v-else>
-							补货时请移除
-						</view>
-
-						<!-- <view class="sale" v-if="item.name">
-							<view>
-								今日销售额
-							</view>
-							<view>
-								¥<text>{{item.todaySalesMoney||0}}</text>
-							</view>
-						</view>
-
-						<view class="sale" v-else>
-							已删除商品
-						</view> -->
-					</view>
-				</view>
-
-				<u-loadmore :status="status" v-if="commList.length>=1" />
-			</view>
-
-			<view class="empty" v-else>
-				<u-empty></u-empty>
-			</view>
-		</view>
-
-		<view class="refresh" @click="search">
-			刷新
-		</view>
-
-		<view class="btn safe-bottom">
-			<xbutton width="340rpx" size="large" @click="del">删除商品</xbutton>
-			<xbutton width="340rpx" size="large" @click="add">增加商品</xbutton>
-		</view>
-
-		<xpopup :show="editPriceShow" @close="editPriceClose" @confirm="submit" :showBtn="true" title="修改价格">
-			<view class="pop-content">
-				<u--input placeholder="请输入内容" type="digit" border="surround" v-model="price"></u--input>
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		goodsList
-	} from '@/api/device/device.js'
-	import {
-		delGoods
-	} from "@/api/replenishment/replenishment.js"
-	import {
-		changePrice
-	} from '@/api/commodity/goodsMode.js'
-
-	export default {
-		data() {
-			return {
-				keyword: '',
-				commList: [],
-				id: null, //设备id
-				page: 1,
-				size: 10,
-				editPriceShow: false,
-				price: 0,
-				goodsId: null,
-				deviceName: null,
-				title: null
-			}
-		},
-		onLoad(o) {
-			if (o.id) {
-				this.id = o.id;
-				this.deviceName = o.deviceName;
-				this.title = '商品列表-' + this.deviceName
-
-			}
-		},
-
-		onShow() {
-			this.reset()
-			this.getList()
-		},
-
-		methods: {
-			search(val) {
-				this.reset()
-				this.getList()
-			},
-			// 商品选中状态改变
-			commItemSelect(e) {
-				if (e.name == '未知商品' || e.name == '非友好购物商品') {
-					this.$modal.msg('预设商品不能删除!!!')
-					return
-				}
-				e.checked = !e.checked;
-			},
-
-			edit(item) {
-				this.goodsId = item.id;
-				this.editPriceShow = true;
-				this.price = (Number(item.price) / 100).toFixed(2)
-			},
-
-			//删除商品
-			del() {
-				let delComList = [];
-				this.commList.forEach(i => {
-					if (i.checked) {
-						delComList.push(i.goodsId)
-					}
-				})
-
-				if (delComList.length == 0) {
-					this.$modal.msg('请选择需要删除的商品~')
-					return
-				}
-				uni.showModal({
-					title: '提示',
-					content: '是否确认删除',
-					success: res => {
-						if (res.confirm) {
-							delGoods({
-								deviceId: this.id,
-								goodsIds: delComList
-							}).then(res => {
-								this.$modal.confirm('删除成功,请拿走货架上当前商品。').then(resolve => {
-									console.log('确认拿走~')
-								})
-								this.reset()
-								this.getList()
-							})
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			},
-
-			add() {
-				this.$tab.navigateTo(`/pages/equipment/addCom?id=${this.id}`)
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.commList = [];
-			},
-
-			getList() {
-				goodsList({
-					page: {
-						current: this.page,
-						size: this.size
-					},
-					deviceId: this.id
-				}).then(res => {
-					let data = res.data.records;
-					for (let i = 0; i < data.length; i++) {
-						let item = data[i];
-						item.checked = false;
-					}
-					if (data.length < 10) {
-						this.status = "nomore"
-					} else {
-						this.status = "loadmore"
-					}
-					this.commList = this.commList.concat(data)
-				})
-			},
-
-			onReachBottom() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getList()
-			},
-
-			editPriceClose() {
-				this.editPriceShow = false;
-			},
-
-			submit() {
-				if (this.price) {
-					changePrice({
-						id: this.goodsId,
-						price: Number(this.price) * 100
-					}).then(res => {
-						if (res.code == 200) {
-							this.$modal.msg('修改成功~')
-							this.reset()
-							this.getList()
-						}
-					}).catch(err => {})
-				} else {
-					this.$modal.msg('商品价格不能为空!')
-				}
-				this.editPriceClose()
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			padding-bottom: 88rpx;
-
-			.search {
-				padding: 24rpx 24rpx;
-				background-color: #fff;
-			}
-
-			.list {
-				width: 100%;
-				padding: 12rpx 24rpx;
-
-				.thumb-box {
-					margin-bottom: 12rpx;
-					border-bottom: 1rpx solid #f4f4f4;
-					display: flex;
-					flex-flow: row nowrap;
-					padding: 12rpx 12rpx;
-					align-items: center;
-					background-color: #fff;
-					border-radius: 12rpx;
-				}
-
-				.select-img {
-					width: 40rpx;
-					height: 40rpx;
-				}
-
-				.check-content {
-					width: 100%;
-					display: flex;
-					flex-direction: row;
-					align-items: center;
-					padding-left: 12rpx;
-					position: relative;
-
-					.comm-img {
-						width: 130rpx;
-						height: 130rpx;
-						display: flex;
-						flex-direction: row;
-						align-items: center;
-						justify-content: space-around;
-
-						image {
-							width: 100%;
-						}
-					}
-
-					.comm-main {
-						box-sizing: border-box;
-						padding-left: 18rpx;
-						color: #999;
-
-						>view {
-							padding: 8rpx 0;
-							width: 330rpx;
-						}
-
-						>view:nth-child(1) {
-							font-size: 28rpx;
-							font-weight: bold;
-							color: #333;
-							padding: 12rpx 0 8rpx 0;
-						}
-
-						>view:nth-child(2) {
-							width: 450rpx;
-							font-size: 26rpx;
-						}
-
-						>view:nth-child(3) {
-							width: 450rpx;
-							font-size: 26rpx;
-						}
-
-						>view:nth-child(4) {
-							width: 450rpx;
-							font-size: 26rpx;
-							padding: 0;
-							line-height: 40rpx;
-						}
-
-						>.c-cx {
-							font-size: 26rpx;
-						}
-
-						>.c-pri {
-							font-size: 26rpx;
-
-							text {
-								font-weight: bold;
-								color: red;
-								font-size: 30rpx;
-							}
-
-							>view {
-								display: inline-block;
-								font-size: 26rpx;
-								color: #2C6FF3;
-								text-decoration: underline;
-								margin-left: 12rpx;
-							}
-						}
-					}
-
-					.status {
-						width: 120rpx;
-						height: 120rpx;
-						box-sizing: border-box;
-						border-radius: 120rpx;
-						// border: 6rpx solid #2C6FF3;
-						text-align: center;
-						display: flex;
-						flex-flow: column;
-						justify-content: space-around;
-						align-items: center;
-						position: absolute;
-						right: 12rpx;
-						top: -12rpx;
-
-						.s-name {
-							font-size: 24rpx;
-							padding-top: 16rpx;
-							font-weight: bold;
-						}
-
-						.s-num {
-							font-size: 28rpx;
-							padding-bottom: 20rpx;
-						}
-					}
-
-					.sale {
-						position: absolute;
-						right: 12rpx;
-						bottom: 12rpx;
-						text-align: center;
-						color: #999;
-
-						>view:nth-child(1) {
-							font-size: 24rpx;
-						}
-
-						>view:nth-child(2) {
-							font-size: 32rpx;
-							color: #2C6FF3;
-							font-weight: bold;
-						}
-					}
-				}
-			}
-		}
-
-		.empty {
-			position: absolute;
-			left: 50%;
-			top: 50%;
-			transform: translate(-50%, -50%);
-		}
-
-		.refresh {
-			width: 80rpx;
-			height: 80rpx;
-			border-radius: 80rpx;
-			text-align: center;
-			line-height: 80rpx;
-			position: fixed;
-			right: 24rpx;
-			bottom: 230rpx;
-			background-color: #999;
-			color: #fff;
-			opacity: .8;
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			bottom: 24rpx;
-			left: 0;
-			display: flex;
-			flex-flow: row nowrap;
-			justify-content: space-between;
-			padding: 0 24rpx;
-
-			.cu-btn {
-				background-color: #2C6FF3;
-				color: #fff;
-				width: 48%;
-			}
-		}
-
-		.pop-content {
-			padding: 24rpx;
-		}
-	}
-</style>

+ 0 - 352
pages/equipment/components/xy-filtedrop/index.vue

@@ -1,352 +0,0 @@
-<template>
-	<view>
-		<view class="HMfilterDropdown" :class="{'setDropdownBottom':maskVisibility}" :style="{'top':menuTop+'rpx'}"
-			@touchmove.stop.prevent="discard" @tap.stop="discard">
-			<!-- 顶部菜单 -->
-			<view class="nav">
-				<block v-for="(item,index) in menu" :key="index">
-					<view class="first-menu" :class="{'on':showPage==index}" @tap="togglePage(index)">
-						<text class="name">{{item}}</text>
-						<text class="iconfont triangle" :style="'transform:rotate('+getDeg(index)+'deg);'"></text>
-					</view>
-				</block>
-			</view>
-		</view>
-		<!-- 弹框 -->
-		<xpopup :show="popShow" @close="close" @confirm="submit" :showBtn="false" :title="'请选择区域'">
-			<!-- 区域选择 -->
-			<scroll-view style="height: 600rpx;" scroll-y scroll-with-animation>
-				<view class="popup-content">
-					<tki-tree v-if="areaList&&areaList.length>0" style="width:100%;" :range="areaList" :foldAll="false"
-						rangeKey="name" idKey="name" buttonName="选中" @btnClick="areaSubmit">
-					</tki-tree>
-					<view class="empty" v-else>
-						<u-empty mode="data" text="您还未规划区域~"></u-empty>
-					</view>
-				</view>
-			</scroll-view>
-		</xpopup>
-
-		<!-- 线路/标签 -->
-		<u-picker :show="pickerShow" @confirm="pickerConfirm" :closeOnClickOverlay="true" :columns="columns"
-			keyName="label" @close="pickerClose" @cancel="pickerClose"></u-picker>
-	</view>
-</template>
-<script>
-	import tkiTree from "@/components/tki-tree/tki-tree.vue";
-
-	import {
-		areaTree
-	} from "@/api/point/area"
-
-	import {
-		linePage
-	} from "@/api/point/line"
-
-	export default {
-		name: 'FilterDrop',
-		components: {
-			tkiTree
-		},
-		data() {
-			return {
-				menu: ['类型', '缺货状态', '区域', '线路'], //顶部菜单数据
-				showPage: -1, //菜单页面显示/隐藏动画控制
-				popShow: false,
-				areaList: [], //区域
-				areaId: undefined, //区域id
-				regionName: undefined, //区域名称
-				lineId: undefined, //线路id
-				columns: [], //options
-				pickerShow: false,
-
-				confirmData: ['', '', '', '']
-			}
-		},
-		props: {
-			menuTop: {
-				type: Number,
-				require: false,
-				default: 0
-			}
-		},
-		created() {
-			//获取区域树
-			this.getTree()
-		},
-		methods: {
-			//获取区域树
-			getTree() {
-				areaTree().then(res => {
-					this.areaList = res.data
-				})
-			},
-			//菜单开关
-			togglePage(index) {
-				this.showPage = this.showPage == index ? -1 : index;
-				switch (index) {
-					case 0:
-						this.pickerShow = true;
-						this.columns = [
-							[{
-									name: '',
-									label: '全部'
-								},
-								{
-									name: 1,
-									label: '开门柜'
-								},
-								{
-									name: 2,
-									label: '重力柜'
-								}
-							]
-						]
-						break
-					case 1:
-						this.columns = [
-							[{
-									name: '',
-									label: '全部'
-								},
-								{
-									name: 1,
-									label: '缺货'
-								},
-								{
-									name: 2,
-									label: '不缺'
-								}
-							]
-						]
-						this.pickerShow = true;
-						break
-					case 2:
-						this.popShow = true;
-						break
-					case 3:
-						if (this.areaId) {
-							this.pickerShow = true;
-						} else {
-							this.showPage = -1;
-							this.$modal.msg('请先选择线路~')
-						}
-						break
-					default:
-				}
-			},
-
-			//获取三角形角度
-			getDeg(index) {
-				let deg = 0;
-				deg = this.showPage == index ? 180 : 0;
-				return deg
-			},
-
-			//区域选择提交
-			areaSubmit(res) {
-				this.menu[this.showPage] = res.name;
-				this.regionName = res.name;
-				this.areaId = res.key; //id
-				this.confirmData[2] = res.key;
-				this.popShow = false;
-				this.showPage = -1;
-				this.columns = [];
-				this.menu[3] = '线路';
-				this.getLineOption()
-				this.confirm()
-			},
-
-			//获取线路options
-			getLineOption() {
-				linePage({
-					page: {
-						current: 1,
-						size: 1000,
-					},
-					regionName: this.regionName
-				}).then(res => {
-					let data = res.data.records;
-					let newData = data.map(i => {
-						return {
-							id: i.id,
-							label: i.lineName
-						}
-					})
-					this.columns = [newData];
-				})
-			},
-
-			//弹框关闭
-			close() {
-				this.popShow = false;
-				this.showPage = -1;
-			},
-
-			//picker弹框确认
-			pickerConfirm(e) {
-				console.log('eeeeeeeeeeeee', e)
-				this.menu[this.showPage] = e.value[0].label;
-				this.confirmData[this.showPage] = e.value[0].name;
-				if (this.showPage == 3) {
-					this.menu[this.showPage] = e.value[0].label;
-					this.confirmData[this.showPage] = e.value[0].id;
-				}
-				this.pickerShow = false;
-				this.showPage = -1;
-				this.confirm()
-			},
-
-			//picker关闭
-			pickerClose() {
-				this.pickerShow = false;
-				this.showPage = -1;
-			},
-
-			confirm() {
-				// 输出
-				this.$emit('confirm', this.confirmData);
-			},
-
-			discard() {
-
-			}
-		}
-	}
-</script>
-<style lang="scss">
-	.HMfilterDropdown {
-		flex-shrink: 0;
-		width: 100%;
-		position: fixed;
-		// position: sticky;
-		z-index: 997;
-		flex-wrap: nowrap;
-		display: flex;
-		flex-direction: row;
-		top: var(--window-top);
-		left: 0;
-		// top:100px;
-		overflow-y: hidden;
-
-		&.setDropdownBottom {
-			// height: 345px;
-			bottom: 0;
-		}
-
-		view {
-			display: flex;
-			flex-wrap: nowrap;
-		}
-	}
-
-	.region {
-		flex: 1;
-		height: 44px;
-	}
-
-	.nav {
-		width: 100%;
-		height: 44px;
-		border-bottom: solid 1rpx #eee;
-		z-index: 12;
-		background-color: #ffffff;
-		flex-direction: row;
-
-		.first-menu {
-			width: 100%;
-			font-size: 13px;
-			color: #757575;
-			flex-direction: row;
-			align-items: center;
-			justify-content: center;
-			transition: color .2s linear;
-
-			&.on {
-				color: #2C6FF3;
-
-				.iconfont {
-					color: #2C6FF3;
-				}
-			}
-
-			.name {
-				height: 20px;
-				text-align: center;
-				text-overflow: clip;
-				overflow: hidden;
-			}
-
-			.iconfont {
-				width: 13px;
-				height: 13px;
-				align-items: center;
-				justify-content: center;
-				transition: transform .2s linear, color .2s linear;
-			}
-		}
-	}
-
-	@font-face {
-		font-family: "HM-FD-font";
-		src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAALAAAsAAAAABpQAAAJzAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDBgp4gQIBNgIkAwwLCAAEIAWEbQc5G8sFERWMIbIfCbbzqA4hp7InSBibVsYGb4J42o82b3e/nJlHMw/NHbGOlwKJRCRpwzPtpAECCOZubdqxjYpQLMlVg+70/08edrgQOtx2ukpVyApZn+dyehPoQObHo3O85rYx9vOjXoBxQIHugW2yIkqIW2QXcScu4jwE8CSWbKSmrqUHFwOaJoCsLM5P4haSGIxRcRHshrUGucLCVcfqI3AZfV/+USguKCwNmtsxVztDxU/n55C+3W0Z4QQpEOTNFqCBbMCAjDUWB9CIwWk87aa70cYgqLkyd3dEmm+18R8eKATEBrV7A5CulBT8dKiWOYZk412XNcDdKSEKSGODnyKIDl+dmVt9/Dx4pu/xyeutkMlHISGPTsPCnoTNP9nOT6wTtDdlO6dPr47efvj942lkYuQzrhMKEjq9N6y98P3340gmlJ/RStUD6F31CAEEPtUW94/7rf+7XgaAz57X0ZHXAGsFFwVgw38yALuMb0IBbVyNamFYEw4oKMDTj3AHRQP5Pt4dci9VwSVkRNQh5r7CLskZadhsWHhRDBsXczk8ZYk3ewnCxmQeQKa3BOHvA8XXO2j+vqRhf7CE+sPmn4anvoL29JLa4qqaUQkmoK+QG2osCckq7txi2leK86aIPyJ3eQZ8xytXYmyQ51jQndJAxIJlqiGSLsOqImiZCjTiZCJt6Lq26U2OoXqwUo0hRaAE0K5AziANy/uLVeXzWyjVqyjcoeupjxDr5MMDn8MDkLG9Aenu5ZrOSSoghAUsRmogkkahSoWAtnlUARnCkY3It0Iu7mWhdmd9Z/19BwBP6GidEi0G56opckXTGZVSPxgAAAA=');
-	}
-
-	.iconfont {
-		font-family: "HM-FD-font" !important;
-		font-size: 13px;
-		font-style: normal;
-		color: #757575;
-
-		&.triangle {
-			&:before {
-				content: "\e65a";
-			}
-		}
-
-		&.selected {
-			&:before {
-				content: "\e607";
-			}
-		}
-	}
-
-	.popup-content {
-		padding: 36rpx 24rpx;
-		display: flex;
-		flex-flow: row nowrap;
-		justify-content: flex-start;
-		align-items: center;
-		position: relative;
-
-		input {
-			border: 1rpx solid #999;
-			border-radius: 6rpx;
-			width: 530rpx;
-			padding: 0 24rpx;
-		}
-
-		&.edit-point {
-			flex-direction: column;
-
-			>view {
-				display: flex;
-				flex-flow: row nowrap;
-				justify-content: flex-start;
-				align-items: center;
-
-				&+view {
-					margin-top: 12rpx;
-				}
-
-				>view {
-					width: 170rpx;
-				}
-			}
-		}
-
-		.empty {
-			margin: 0 auto;
-		}
-	}
-</style>

+ 0 - 341
pages/equipment/search.vue

@@ -1,341 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar bgColor="#2C6FF3" :autoBack="true" :placeholder="true" leftIconColor="#fff">
-			<view slot="center" class="nav-center">
-				<u-search :animation="true" bgColor="#fff" height="56rpx" placeholder="输入设备名称搜索" v-model="keyword"
-					:showAction="false" @search="search"></u-search>
-			</view>
-		</u-navbar>
-		<FilterDrop menuTop="148" @confirm="confirm" />
-		<view class="tab-list">
-			<!-- <u-subsection bgColor="#fff" activeColor="#2C6FF3" :list="tabList" :current="current" @change="tabChange"></u-subsection> -->
-			<u-tabs :list="tabList" @click="tabChange" :current="current" :scrollable="false" bgColor="#fff"
-				lineColor="#2C6FF3" ></u-tabs>
-		</view>
-
-		<view class="content">
-			<view class="xy-card" v-for="(item,index) in list" :key="item.id" @click="$tab.navigateTo(`/pages/equipment/detail?id=${item.deviceId}`)">
-				<view class="title">
-					{{item.deviceName}}
-					<view>
-						<u-tag text="运营中" type="success" plain v-if="item.busyState==1"> </u-tag>
-						<u-tag text="已停运" type="info" plain v-else> </u-tag>
-					</view>
-				</view>
-				<view class="total">
-					<view class="t-left">
-						<view>
-							<view>{{item.daySalesPrice}}</view>
-							<text>今日销售(元)</text>
-						</view>
-						<view>
-							<view>{{item.dayOrderNum}}</view>
-							<text>今日订单</text>
-						</view>
-						<view>
-							<view><text>{{item.deviceStatus.stock}}</text>/{{item.deviceStatus.afterFillStock}}</view>
-							<text>库存/补后</text>
-						</view>
-					</view>
-<!-- 					<view class="t-right">
-						机器详情
-					</view> -->
-				</view>
-				<view class="t-content">
-					<view class="c-item-t">
-						<view class="c-item">
-							<view>编号:</view>
-							<view>{{item.mercDeviceCode}}</view>
-						</view>
-						<view class="c-item">
-							<view>商户:</view>
-							<view>{{item.mercName}}</view>
-						</view>
-					</view>
-					<view class="c-item-t">
-						<view class="c-item">
-							<view>温度:</view>
-							<view>{{item.deviceStatus.tempValue}}</view>
-						</view>
-						<view class="c-item">
-							<view>信号强度:</view>
-							<view>{{item.deviceStatus.netDbm}}</view>
-						</view>
-					</view>
-					
-					<view class="c-item">
-						<view>软件版本:</view>
-						<view>{{item.deviceSysinfo.appUpmVersion}}</view>
-					</view>
-					<view class="c-item">
-						<view>最后更新时间:</view>
-						<view>{{item.updateTime}}</view>
-					</view>
-					<!-- <view class="c-item" v-if="current==3">
-						<view>故障原因:</view>
-						<view style="color: red;">锁不能正常开启</view>
-					</view> -->
-				</view>
-				<view class="btn">
-					<button class="cu-btn" style="width:180rpx;">故障日志</button>
-					<button class="cu-btn" style="width: 180rpx;margin: 0 12rpx;">流量卡</button>
-					<button class="cu-btn" style="width: 180rpx;">温度曲线</button>
-				</view>
-			</view>
-
-			<u-loadmore :status="status" v-if="list.length>=1" />
-		</view>
-		<view class="empty" v-if="list.length==0">
-			<u-empty text="没有设备!"></u-empty>
-		</view>
-	</view>
-</template>
-
-<script>
-	import FilterDrop from './components/xy-filtedrop/index.vue'
-	import {
-		searchPage
-	} from "@/api/device/device.js"
-	import {
-		areaTree
-	} from "@/api/point/area"
-
-	export default {
-		components: {
-			FilterDrop
-		},
-		data() {
-			return {
-				keyword: '',
-				tabList: [{
-						name: '在线'
-					},
-					{
-						name: '离线'
-					},
-					{
-						name: '停运'
-					},
-					{
-						name: '故障'
-					}
-				],
-				current: 0,
-
-				status: 'loadmore',
-
-				list: [],
-
-				page: 1,
-				size: 10,
-				
-				searchParams:{},//筛选条件
-			}
-		},
-
-		onLoad() {
-			this.getList()
-		},
-
-		methods: {
-			search(){
-				this.reset()
-				this.getList()
-			},
-			//接收菜单结果
-			confirm(e) {
-				this.searchParams=e;
-				this.reset()
-				this.getList()
-			},
-
-			tabChange(e) {
-				this.current = e.index
-				this.reset()
-				this.getList()
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.list = [];
-			},
-
-			getList() {
-				searchPage({
-					page: {
-						current: this.page,
-						size: this.size
-					},
-					keywords: this.keyword,
-					fault: this.current==3?true:'',
-					netState:this.current==0?1:this.current==1?2:'',
-					busyState: this.current==2?2:'',
-					deviceType:this.searchParams[0],
-					stockStatus:this.searchParams[1],
-					districtId:this.searchParams[2],
-					placeLineId:this.searchParams[3],
-				}).then(res => {
-					let data = res.data.records;
-					if (data.length < 10) {
-						this.status = "nomore"
-					} else {
-						this.status = "loadmore"
-					}
-					this.list = this.list.concat(data)
-				})
-			},
-
-			scrolltolower() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getList()
-			},
-			
-			detail(id){
-				this.$tab.navigateTo(`/pages/equipment/detail?id=${id}`)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		position: relative;
-
-		.nav-center {
-			width: 450rpx;
-			margin-left: -120rpx;
-		}
-
-		.tab-list {
-			position: fixed;
-			top: 230rpx;
-			left: 0;
-			width: 100%;
-			background-color: #fff;
-			z-index: 999;
-
-			/deep/ .u-subsection--button__bar {
-				background-color: #f3f3f3;
-			}
-		}
-
-		.content {
-			margin-top: 180rpx;
-			padding: 12rpx 24rpx 24rpx;
-
-			.xy-card+.xy-card {
-				margin-top: 18rpx;
-			}
-
-			.title {
-				font-size: 28rpx;
-				font-weight: bold;
-				color: #333;
-				position: relative;
-
-				>view{
-					position: absolute;
-					right:0;
-					top:-12rpx;
-				}
-			}
-
-			.total {
-				margin-top: 28rpx;
-
-				.t-left {
-					font-size: 26rpx;
-					display: flex;
-					flex-flow: row nowrap;
-					justify-content: space-between;
-					text-align: center;
-
-					>view {
-						>view {
-							color: red;
-							font-weight: bold;
-							font-size: 28rpx;
-
-							>text {
-								color: #333;
-							}
-						}
-
-						>text {
-							margin-top: 12rpx;
-						}
-					}
-				}
-
-				.t-right {
-					display: inline-block;
-					line-height: 34rpx;
-					font-size: 26rpx;
-					background-color: #2C6FF3;
-					color: #fff;
-					border-radius: 8rpx;
-					padding: 0rpx 12rpx;
-					position: absolute;
-					right: 0;
-					bottom: 0;
-				}
-			}
-
-			.t-content {
-				border-radius: 8rpx;
-				background-color: rgb(245, 248, 251);
-				box-sizing: border-box;
-				padding: 24rpx 12rpx;
-				margin-top: 24rpx;
-				font-size: 26rpx;
-
-				.c-item {
-					display: flex;
-					flex-direction: row;
-					margin-bottom: 12rpx;
-					align-items: center;
-
-					>view:nth-child(1) {
-						color: #666;
-						width: 200rpx;
-					}
-
-					>view:nth-child(2) {
-						color: #333;
-					}
-				}
-
-				.c-item-t {
-					display: flex;
-					flex-flow: row nowrap;
-
-					.c-item {
-						width: 50%;
-					}
-				}
-
-			}
-
-			.btn {
-				display: flex;
-				flex-flow: row nowrap;
-				justify-content: flex-end;
-				margin-top: 24rpx;
-
-				.cu-btn {
-					background-color: #2C6FF3;
-					color: #fff;
-				}
-			}
-		}
-
-		.empty {
-			position: fixed;
-			left: 50%;
-			top: 50%;
-			transform: translate(-50%, -50%);
-		}
-	}
-</style>

+ 0 - 691
pages/equipment/statistics.vue

@@ -1,691 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="navTitle"></u-navbar>
-		<view class="content">
-			<view class="card">
-				<view class="select">
-					<view class="time-tab flex justify-between">
-						<block v-for="(item,index) in timeList" :key="item.id">
-							<view class="time-tab-item" :class="[timeTabCurrent==item.id?'time-tab-show':'']"
-								@click="timeTabClick(item.id)">
-								{{item.name}}
-							</view>
-						</block>
-					</view>
-					<view class="time-select flex justify-around">
-						<view class="flex  align-center">
-							<view @click="timePickerShow('start')">
-								{{timeStart?timeStart:'开始时间'}}
-							</view>
-							<view>
-								一
-							</view>
-							<view @click="timePickerShow('end')">
-								{{timeEnd?timeEnd:'结束时间'}}
-							</view>
-						</view>
-					</view>
-				</view>
-				<view class="total flex justify-around">
-					<view class="flex flex-direction align-center">
-						<view class="total-name">
-							总销售额(元)
-						</view>
-						<view class="total-num" style="color: #2C6FF3;">
-							{{$xy.delMoney(total.salesMoney)}}
-						</view>
-					</view>
-					<view class="flex flex-direction align-center">
-						<view class="total-name">
-							商品销售数量(个)
-						</view>
-						<view class="total-num" style="color: #F9B237;">
-							{{total.salesCount||0}}
-						</view>
-					</view>
-					<view class="flex flex-direction align-center">
-						<view class="total-name">
-							平均商品价(元)
-						</view>
-						<view class="total-num" v-if="total.salesCount>0" style="color: #E94F4F;">
-							{{($xy.delMoney(total.salesMoney)/total.salesCount).toFixed(2)||0}}
-						</view>
-						<view class="total-num" v-else style="color:#E94F4F;">
-							0
-						</view>
-					</view>
-				</view>
-
-				<view class="chart" style="height: 600rpx;">
-					<qiun-data-charts type="qy-line-gradual" :opts="opts" :chartData="chartData"
-						:errorMessage="errorMessage" />
-				</view>
-			</view>
-
-			<view class="goods-table card">
-				<view class="table">
-					<view class="table-title flex justify-between align-center">
-						<view class="title">
-							商品销售排行
-						</view>
-						<view class="sort-type flex">
-							<view :class="[goodsSortType==0?'sort-type-item sort-type-show':'sort-type-item']"
-								@click="goodsSort(0)">
-								销售额
-							</view>
-							<view :class="[goodsSortType==1?'sort-type-item sort-type-show':'sort-type-item']"
-								@click="goodsSort(1)">
-								销量
-							</view>
-						</view>
-					</view>
-					<uni-table :border="false" :stripe="false" emptyText="暂无更多数据">
-						<!-- 表头行 -->
-						<uni-tr>
-							<uni-th align="center" width="52">排名</uni-th>
-							<uni-th align="center" width="110">上榜商品</uni-th>
-							<uni-th align="center" width="92">销售额</uni-th>
-							<uni-th align="center" width="92">销量</uni-th>
-						</uni-tr>
-						<!-- 表格数据行 -->
-						<uni-tr v-for="(item,index) in list2" :key="item.goodsId">
-							<uni-td v-if="index==0">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/first-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==1">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/second-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==2">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/third-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else>
-								<view class="table-td">
-									{{index+1}}
-								</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td table-td-name">{{item.goodsName}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">¥{{$xy.delMoney(item.salesMoney)}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">{{item.salesCount}}件</view>
-							</uni-td>
-						</uni-tr>
-					</uni-table>
-				</view>
-				<view class="more" @click="more('goods')" v-if="list2.length==5">
-					查看更多<view><u-icon name="arrow-right" color="#2C6FF3"></u-icon></view>
-				</view>
-			</view>
-		</view>
-
-		<u-datetime-picker :show="timeShow" :mode="timeMode" v-model="time" @confirm="confirm"
-			:closeOnClickOverlay="true" @close="close" @cancel="close"></u-datetime-picker>
-		<u-picker :show="pickerShow" :columns="columns" @confirm="pickerComfirm" :closeOnClickOverlay="true"
-			@close="pickerClose" @cancel="pickerClose"></u-picker>
-	</view>
-</template>
-
-<script>
-	import {
-		salesData,
-		goodSumCount,
-		goodSumPage
-	} from "@/api/device/device.js"
-
-	export default {
-		data() {
-			return {
-				timeType: ['日', '月', '年'],
-				timeCurrent: 0,
-				timeStart: '',
-				timeEnd: '',
-				deviceSortType: 0,
-				goodsSortType: 0,
-				timeShow: false,
-				timeMode: 'date',
-				startOrEnd: '',
-				time: new Date(),
-				pickerType: 'year',
-
-				pickerShow: false,
-				// typeColumns: [
-				// 	['销售额从高到低', '销售额从低到高', '销售数量从高到低', '销售数量从低到高']
-				// ],
-
-				typeColumns: [
-					['销售额', '订单笔数']
-				],
-
-				page: 1, //商品分页
-				size: 10,
-
-				status: 'loadmore', //加载更多
-				list1: [], //设备列表
-				list2: [], //商品列表
-				fullHeight: 0,
-
-				total: {
-					goodsCount: 0,
-					salesMoney: 0
-				},
-
-
-				tabCurrent: 0,
-				timeList: [{
-						id: 0,
-						name: '昨天'
-					},
-					{
-						id: 1,
-						name: '今天'
-					},
-					{
-						id: 2,
-						name: '近7日'
-					},
-					{
-						id: 3,
-						name: '近30日'
-					},
-					{
-						id: 4,
-						name: '本月'
-					},
-				],
-				timeTabCurrent: 1,
-				title: '设备销售额排行',
-
-				opts: {
-					enableScroll: false,
-					legend: {
-						position: 'top',
-						float: 'right',
-						padding: 20,
-						itemGap: 20
-					},
-					xAxis: {
-						disableGrid: true,
-						labelCount: 6,
-					},
-					yAxis: {
-						gridType: "solid",
-						dashLength: 2,
-						showTitle: true,
-						axisLineColor: '#fff',
-						data: [{
-								position: "left",
-								title: "/元"
-							},
-							{
-								position: "right",
-								title: "/单",
-								textAlign: "left"
-							},
-						]
-					},
-					extra: {
-						area: {
-							type: "curve",
-							opacity: 0.2,
-							addLine: true,
-							width: 2,
-							gradient: true,
-							activeType: "hollow"
-						}
-					}
-				},
-
-				errorMessage: '无数据',
-				chartData: {
-					categories: [],
-					series: []
-				},
-				navTitle: ''
-			}
-		},
-
-		onLoad(o) {
-			this.navTitle = o.title;
-			this.id = o.id
-		},
-
-		onShow() {
-			let timeObj = this.setResetTime(this.timeTabCurrent)
-			this.timeStart = timeObj.start
-			this.timeEnd = timeObj.end
-			this.getData()
-		},
-		methods: {
-			getData() {
-				this.getList2(this.goodsSortType)
-				this.getDeviceTotal(this.deviceSortType)
-				this.getCountData()
-			},
-
-			timeTabClick(e) {
-				this.timeTabCurrent = e
-				let timeObj = this.setResetTime(this.timeTabCurrent)
-				this.timeStart = timeObj.start
-				this.timeEnd = timeObj.end
-				this.getData()
-			},
-
-
-			setResetTime(type) {
-				let date = new Date()
-				let time = {
-					start: uni.$u.timeFormat(date, 'yyyy-mm-dd'),
-					end: uni.$u.timeFormat(date, 'yyyy-mm-dd')
-				}
-				switch (type) {
-					case 0: //昨天
-						time = {
-							start: uni.$u.timeFormat(date - 24 * 60 * 60 * 1000, 'yyyy-mm-dd'),
-							end: uni.$u.timeFormat(date - 24 * 60 * 60 * 1000, 'yyyy-mm-dd')
-						}
-						break;
-					case 1: //今天
-						time = {
-							start: uni.$u.timeFormat(date, 'yyyy-mm-dd'),
-							end: uni.$u.timeFormat(date, 'yyyy-mm-dd')
-						}
-						break;
-					case 2: //近7日
-						time = {
-							start: uni.$u.timeFormat(date - 7 * 24 * 60 * 60 * 1000, 'yyyy-mm-dd'),
-							end: uni.$u.timeFormat(date, 'yyyy-mm-dd')
-						}
-						break;
-					case 3: //近30日
-						time = {
-							start: uni.$u.timeFrom(date - 30 * 24 * 60 * 60 * 1000, 'yyyy-mm-dd'),
-							end: uni.$u.timeFrom(date, 'yyyy-mm-dd')
-						}
-						break;
-					case 4: //本月
-						let start = uni.$u.timeFrom(date, 'yyyy-mm-dd')
-						time = {
-							start: start.substr(0, 8) + '01',
-							end: uni.$u.timeFrom(date, 'yyyy-mm-dd')
-						}
-						break;
-					default:
-						break;
-				}
-				return time
-			},
-
-			timePickerShow(type) {
-				this.pickerType = 'year';
-				this.startOrEnd = type
-				if (this.timeCurrent == 2) {
-					this.columns = yearList
-					this.pickerShow = true
-				} else {
-					this.timeShow = true;
-				}
-			},
-
-			goodsSort(type) {
-				this.goodsSortType = type
-				this.getList2(type)
-			},
-
-			close() {
-				this.timeShow = false
-			},
-
-			confirm(e) {
-				let time = '';
-				time = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-
-				if (this.startOrEnd == 'start') {
-					this.timeStart = time
-				}
-				if (this.startOrEnd == 'end') {
-					this.timeEnd = time
-				}
-				this.getData()
-				this.timeShow = false;
-			},
-
-			pickerClose() {
-				this.pickerShow = false
-			},
-
-			//获取统计数据
-			getCountData(type) {
-				salesData({
-					type: "day",
-					beginDate: this.timeStart,
-					endDate: this.timeEnd,
-					deviceId: this.id
-				}).then(res => {
-					let data = res.data;
-					let tempChartData = {};
-					this.delData(data);
-					tempChartData.series = data.series ? data.series : [];
-					tempChartData.categories = data.categories ? data.categories : [];
-					this.chartData = JSON.parse(JSON.stringify(tempChartData));
-				}).catch(err => {
-
-				})
-			},
-
-			// 处理统计图表数据
-			delData(data) {
-				let arr = data.categories.map(item => {
-					if (item.length < 3) {
-						item = item + '点'
-					} else {
-						item = item.substr(4, 2) + '月' + item.substr(6, 2) + '日'
-					}
-					return item
-				})
-
-				data.categories = arr
-			},
-
-			getParams(type) {
-				let orderByKey = "";
-				let orderBy = "";
-				switch (type) {
-					case '销售额':
-						orderBy = 'desc';
-						orderByKey = 'sales_money';
-						break;
-					case '订单笔数':
-						orderBy = 'desc';
-						orderByKey = 'sales_count';
-						break;
-					case '销量':
-						orderBy = 'desc';
-						orderByKey = 'sales_count';
-						break;
-					default:
-						break;
-				}
-
-				let params = {
-					type: 'day',
-					orderByKey: orderByKey,
-					orderBy: orderBy,
-					beginDate: this.timeStart,
-					endDate: this.timeEnd,
-					deviceId: this.id
-				}
-				return params
-			},
-
-			//设备统计总数居
-			getDeviceTotal(type) {
-				let params = this.getParams(type)
-				goodSumCount(params).then(res => {
-					this.total = res.data
-				})
-			},
-
-			//获取商品排行
-			getList2(e) {
-				let type = e == 0 ? '销售额' : '销量';
-				let dataParams = this.getParams(type)
-				let pageParams = {
-					page: {
-						current: 1,
-						size: 5
-					}
-				}
-				let params = Object.assign(dataParams, pageParams)
-				goodSumPage(params).then(res => {
-					if (res.data) {
-						this.list2 = res.data.records;
-					} else {
-						this.list2 = []
-					}
-				})
-			},
-
-			more(type) {
-				let sortType = this.goodsSortType
-				this.$tab.navigateTo(
-					`/pages/equipment/statisticsMore?timeStart=${this.timeStart}&&timeEnd=${this.timeEnd}&&sortType=${sortType}&&id=${this.id}`
-				)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			padding-bottom: 24rpx;
-
-			.card {
-				width: 724rpx;
-				margin-left: 13rpx;
-				background-color: #fff;
-				margin-top: 20rpx;
-				box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-				border-radius: 14rpx;
-			}
-
-			.tab {
-				padding: 24rpx;
-				// background-color: #fff;
-			}
-
-			.select {
-				padding-top: 34rpx;
-
-				.time-tab {
-					padding: 0 36rpx;
-
-					.time-tab-item {
-						width: 20%;
-						border: 1rpx solid #CCCCCC;
-						border-left: none;
-						text-align: center;
-						font-size: 26rpx;
-						line-height: 58rpx;
-						color: #777777;
-
-						&:first-of-type {
-							border-left: 1rpx solid #CCCCCC;
-							border-radius: 6rpx 0px 0px 6rpx;
-						}
-
-						&:last-of-type {
-							border-radius: 0px 6rpx 6rpx 0px;
-						}
-
-						&.time-tab-show {
-							background: #F4F8FF;
-							color: #2C6FF3;
-						}
-					}
-				}
-
-				.time-select {
-					padding: 34rpx 36rpx;
-					color: rgb(144, 144, 144);
-					font-size: 28rpx;
-
-					>view {
-						>view:nth-child(1) {
-							width: 160rpx;
-							text-align: right;
-						}
-
-						>view:nth-child(2) {
-							width: 80rpx;
-							padding: 0 24rpx;
-						}
-					}
-				}
-			}
-
-			.total {
-				padding: 12rpx 0;
-				background-color: #fff;
-
-				.total-name {
-					color: #333;
-					font-size: 28rpx;
-					line-height: 28rpx;
-					margin-top: 48rpx;
-				}
-
-				.total-num {
-					color: #eab09a;
-					font-size: 42rpx;
-					font-weight: bold;
-					line-height: 41rpx;
-					margin-top: 24rpx;
-				}
-			}
-
-			.search {
-				padding: 24rpx 24rpx;
-				background-color: #fff;
-				position: relative;
-				font-size: 26rpx;
-
-				.time-type {
-					width: 180rpx;
-				}
-
-				.time-select {
-					width: 340rpx;
-					line-height: 64rpx;
-					background-color: #eeeeef;
-					border-radius: 6rpx;
-				}
-
-
-			}
-
-			.chart {
-				background-color: #fff;
-			}
-
-			.table {
-				width: 724rpx;
-				background-color: #fff;
-				margin-top: 18rpx;
-				color: #333;
-
-				.table-title {
-					font-size: 32rpx;
-					line-height: 50rpx;
-					padding: 24rpx;
-					font-weight: 800;
-					color: #333333;
-					border-bottom: 1rpx solid #ebeef5;
-				}
-
-				.table-td {
-					width: 100%;
-					text-align: center;
-
-
-					&.table-td-name {
-						width: 230rpx;
-						white-space: wrap;
-					}
-				}
-
-				.table-img {
-					width: 40rpx;
-					height: 40rpx;
-					position: relative;
-				}
-
-				.sort-type {
-					width: 250rpx;
-					height: 50rpx;
-					line-height: 48rpx;
-					text-align: center;
-					font-weight: normal;
-
-					.sort-type-item {
-						width: 50%;
-						font-size: 26rpx;
-						color: #555555;
-						background-color: #fff;
-
-						&.sort-type-item:nth-child(1) {
-							border-top-left-radius: 6rpx;
-							border-bottom-left-radius: 6rpx;
-							border-top: 1rpx solid #CCCCCC;
-							border-left: 1rpx solid #CCCCCC;
-							border-bottom: 1rpx solid #CCCCCC;
-
-							&.sort-type-show {
-								color: #fff;
-								border-top: 1rpx solid #2C6FF3;
-								border-left: 1rpx solid #2C6FF3;
-								border-bottom: 1rpx solid #2C6FF3;
-								background-color: #2C6FF3;
-							}
-						}
-
-						&.sort-type-item:nth-child(2) {
-							border-top-right-radius: 6rpx;
-							border-bottom-right-radius: 6rpx;
-							border-top: 1rpx solid #CCCCCC;
-							border-right: 1rpx solid #CCCCCC;
-							border-bottom: 1rpx solid #CCCCCC;
-
-							&.sort-type-show {
-								color: #fff;
-								border-top: 1rpx solid #2C6FF3;
-								border-right: 1rpx solid #2C6FF3;
-								border-bottom: 1rpx solid #2C6FF3;
-								background-color: #2C6FF3;
-							}
-						}
-					}
-
-				}
-
-				/deep/.uni-table-th {
-					color: #333;
-					font-weight: normal;
-				}
-
-				/deep/.uni-table-td {
-					vertical-align: middle;
-				}
-			}
-
-			.more {
-				text-align: right;
-				padding-right: 40rpx;
-				position: relative;
-				color: #2C6FF3;
-				line-height: 80rpx;
-				background-color: #fff;
-
-				>view {
-					position: absolute;
-					right: 12rpx;
-					top: 50%;
-					transform: translateY(-50%);
-				}
-			}
-		}
-	}
-</style>

+ 0 - 349
pages/equipment/statisticsMore.vue

@@ -1,349 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="销售统计"></u-navbar>
-		<view class="content">
-			<view class="goods-table">
-				<view class="table">
-					<view class="table-title flex justify-between align-center">
-						<view class="title">
-							商品销售排行
-						</view>
-						<view class="sort-type flex">
-							<view :class="[goodsSortType==0?'sort-type-item sort-type-show':'sort-type-item']"
-								@click="goodsSort(0)">
-								销售额
-							</view>
-							<view :class="[goodsSortType==1?'sort-type-item sort-type-show':'sort-type-item']"
-								@click="goodsSort(1)">
-								销量
-							</view>
-						</view>
-					</view>
-					<uni-table :border="false" :stripe="false" emptyText="暂无更多数据">
-						<!-- 表头行 -->
-						<uni-tr>
-							<uni-th align="center" width="52">排名</uni-th>
-							<uni-th align="center" width="110">上榜商品</uni-th>
-							<uni-th align="center" width="92">销售额</uni-th>
-							<uni-th align="center" width="92">销量</uni-th>
-						</uni-tr>
-						<!-- 表格数据行 -->
-						<uni-tr v-for="(item,index) in list2" :key="item.goodsId">
-							<uni-td v-if="index==0">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/first-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==1">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/second-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==2">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/third-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else>
-								<view class="table-td">
-									{{index+1}}
-								</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td table-td-name">{{item.goodsName}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">¥{{$xy.delMoney(item.salesMoney)}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">{{item.salesCount}}件</view>
-							</uni-td>
-						</uni-tr>
-					</uni-table>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		goodSumPage
-	} from "@/api/device/device.js"
-
-	export default {
-		data() {
-			return {
-				timeStart: '',
-				timeEnd: '',
-
-				typeColumns: [
-					['销售额', '订单笔数']
-				],
-				status: 'loadmore', //加载更多
-				list1: [], //设备列表
-				list2: [], //商品列表
-				deviceSortType: 0,
-				goodsSortType: 0,
-				id: null
-			}
-		},
-
-		onLoad(o) {
-			this.id = o.id
-			this.timeStart = o.timeStart
-			this.timeEnd = o.timeEnd
-			this.goodsSortType = o.sortType
-		},
-
-		onShow() {
-			this.getData()
-		},
-
-
-
-		methods: {
-			getData() {
-				this.getList(this.goodsSortType)
-			},
-
-			goodsSort(type) {
-				this.goodsSortType = type
-				this.getList(type)
-			},
-
-			getParams(type) {
-				let orderByKey = "";
-				let orderBy = "";
-				switch (type) {
-					case '销售额':
-						orderBy = 'desc';
-						orderByKey = 'sales_money';
-						break;
-					case '销量':
-						orderBy = 'desc';
-						orderByKey = 'sales_count';
-						break;
-					default:
-						break;
-				}
-
-				let params = {
-					type: 'day',
-					orderByKey: orderByKey,
-					orderBy: orderBy,
-					beginDate: this.timeStart,
-					endDate: this.timeEnd,
-					deviceId: this.id
-				}
-				return params
-			},
-
-			//获取商品排行
-			getList(e) {
-				let type = e == 0 ? '销售额' : '销量';
-				let dataParams = this.getParams(type)
-				let pageParams = {
-					page: {
-						current: 1,
-						size: 1000
-					}
-				}
-				let params = Object.assign(dataParams, pageParams)
-				goodSumPage(params).then(res => {
-					if (res.data) {
-						this.list2 = res.data.records;
-					} else {
-						this.list2 = []
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			.select {
-				.time-tab {
-					padding: 0 36rpx;
-
-					.time-tab-item {
-						padding: 0 24rpx;
-						background-color: #fff;
-						border: 1rpx solid #e0b4a2;
-						text-align: center;
-						line-height: 50rpx;
-						color: #e0b4a2;
-						border-radius: 40rpx;
-
-						&.time-tab-show {
-							background-color: #eab09a;
-							color: #d98a6d;
-						}
-					}
-				}
-
-				.time-select {
-					padding: 24rpx 36rpx;
-					color: rgb(144, 144, 144);
-					font-size: 28rpx;
-
-					>view:nth-child(2) {
-						width: 160rpx;
-						text-align: right;
-					}
-
-					>view:nth-child(3) {
-						width: 80rpx;
-						padding: 0 24rpx;
-					}
-				}
-			}
-
-			.total {
-				padding: 12rpx 0;
-				background-color: #fff;
-
-				.total-name {
-					color: #333;
-					font-size: 28rpx;
-					line-height: 50rpx;
-				}
-
-				.total-num {
-					color: #eab09a;
-					font-size: 32rpx;
-					font-weight: bold;
-					line-height: 50rpx;
-				}
-			}
-
-			.search {
-				padding: 24rpx 24rpx;
-				background-color: #fff;
-				position: relative;
-				font-size: 26rpx;
-
-				.time-type {
-					width: 180rpx;
-				}
-
-				.time-select {
-					width: 340rpx;
-					line-height: 64rpx;
-					background-color: #eeeeef;
-					border-radius: 6rpx;
-				}
-
-
-			}
-
-			.table {
-				width: 100%;
-				background-color: #fff;
-				color: #333;
-
-				.table-title {
-					line-height: 50rpx;
-					padding: 24rpx;
-					border-bottom: 1rpx solid #ebeef5;
-				}
-
-				.table-td {
-					width: 100%;
-					text-align: center;
-
-					&.table-td-name {
-						width: 270rpx;
-						white-space: wrap;
-					}
-				}
-
-				.table-img {
-					width: 40rpx;
-					height: 40rpx;
-					position: relative;
-				}
-
-				.sort-type {
-					width: 250rpx;
-					height: 50rpx;
-					line-height: 48rpx;
-					text-align: center;
-					font-weight: normal;
-
-					.sort-type-item {
-						width: 50%;
-						font-size: 26rpx;
-						color: #555555;
-						background-color: #fff;
-
-						&.sort-type-item:nth-child(1) {
-							border-top-left-radius: 6rpx;
-							border-bottom-left-radius: 6rpx;
-							border-top: 1rpx solid #CCCCCC;
-							border-left: 1rpx solid #CCCCCC;
-							border-bottom: 1rpx solid #CCCCCC;
-
-							&.sort-type-show {
-								color: #fff;
-								border-top: 1rpx solid #2C6FF3;
-								border-left: 1rpx solid #2C6FF3;
-								border-bottom: 1rpx solid #2C6FF3;
-								background-color: #2C6FF3;
-							}
-						}
-
-						&.sort-type-item:nth-child(2) {
-							border-top-right-radius: 6rpx;
-							border-bottom-right-radius: 6rpx;
-							border-top: 1rpx solid #CCCCCC;
-							border-right: 1rpx solid #CCCCCC;
-							border-bottom: 1rpx solid #CCCCCC;
-
-							&.sort-type-show {
-								color: #fff;
-								border-top: 1rpx solid #2C6FF3;
-								border-right: 1rpx solid #2C6FF3;
-								border-bottom: 1rpx solid #2C6FF3;
-								background-color: #2C6FF3;
-							}
-						}
-					}
-
-				}
-
-				/deep/.uni-table-th {
-					color: #333;
-					font-weight: normal;
-				}
-
-				/deep/.uni-table-td {
-					vertical-align: middle;
-				}
-			}
-
-			.more {
-				text-align: right;
-				padding-right: 40rpx;
-				position: relative;
-				color: #333;
-				line-height: 80rpx;
-				background-color: #fff;
-
-				>view {
-					position: absolute;
-					right: 12rpx;
-					top: 50%;
-					transform: translateY(-50%);
-				}
-			}
-		}
-	}
-</style>

+ 0 - 76
pages/globalPages/agreement.vue

@@ -1,76 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="入驻协议"></u-navbar>
-		<view class="content safe-bottom">
-			<pre v-html="content" v-if="content!=''">
-			</pre>
-			<view class="empty" v-else>
-				<u-empty mode="list" text="没有任何内容!"></u-empty>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		agreement,
-		agreementPage
-	} from "@/api/system/user.js"
-	export default {
-		data() {
-			return {
-				content: ''
-			}
-		},
-
-		onLoad() {
-			this.detail()
-		},
-
-		methods: {
-			agreementList() {
-				agreement({
-					page: {
-						current: 1,
-						size: 100
-					},
-					orders: [{
-						asc: false,
-						column: "create_time"
-					}]
-				}).then(res => {
-					if (res.data && res.data.content) {
-						this.content = res.data.content
-					} else {
-						this.content = ''
-					}
-				})
-			},
-
-			detail() {
-				agreement({
-					type: 3
-				}).then(res => {
-					this.content = res.data.content
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		overflow: hidden;
-		background-color: #fff;
-
-		.content {
-			padding: 30rpx;
-			min-height: 100vh;
-
-			.empty {
-				margin-top: 40%;
-			}
-		}
-	}
-</style>

+ 0 - 661
pages/globalPages/components/account.vue

@@ -1,661 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 个人信息 -->
-		<view class="user">
-			<view class="nav-bar">
-				<u-navbar bgColor="rgba(0,0,0,0)" :autoBack="false" :placeholder="true">
-					<view slot="left" style="color:#fff;font-size: 36rpx;">
-						我的
-					</view>
-				</u-navbar>
-			</view>
-			<view class="user-content flex align-center flex-start">
-				<view class="head-img" @click="userDetail">
-					<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/head-exam.png"
-						mode="widthFix">
-					</image>
-				</view>
-				<view class="user-name" @click="searchLog(2)">
-					{{info.name}}
-				</view>
-
-				<view class="share" @share="share">
-					<view class="share-image">
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/fx.png"
-							mode="widthFix">
-						</image>
-					</view>
-					<button open-type="share"></button>
-				</view>
-
-				<view class="login-out" @click="setting">
-					设置
-				</view>
-			</view>
-		</view>
-
-		<!-- 用户信息 -->
-		<view class="menu menu-userinfo">
-			<!-- 			<view class="menu-title">
-				用户信息
-			</view> -->
-			<view class="u-content">
-				<view class="u-item flex align-center flex-direction" @click="searchLog(1)">
-					<view class="u-name">
-						{{info.mercName}}
-					</view>
-					<view class="u-val">
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/sh.png"
-							mode="widthFix"></image>
-						商户
-					</view>
-				</view>
-				<view class="u-item">
-					<view class="u-name">
-						{{info.roleNames}}
-					</view>
-					<view class="u-val">
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/js.png"
-							mode="widthFix"></image>
-						角色
-					</view>
-				</view>
-				<view class="u-item">
-					<view class="u-name">
-						{{info.tel}}
-					</view>
-					<view class="u-val">
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/dh.png"
-							mode="widthFix"></image>
-						电话
-					</view>
-				</view>
-			</view>
-
-			<!-- <xbutton class="edit" size="mini" @click="btnClick('编辑')">修改</xbutton> -->
-		</view>
-
-		<!-- <view class="menu">
-			<view class="menu-title">
-				系统参数设置
-			</view>
-			<view class="s-content">
-				<view class="s-item">
-					自动处理未上架订单:<text>是</text>
-				</view>
-				<view class="s-item">
-					开启预定模式:<text>是</text>
-				</view>
-				<view class="s-item">
-					是否强制盘点:<text>是</text>
-				</view>
-			</view>
-
-			<xbutton class="edit" size="mini" @click="btnClick('编辑')">修改</xbutton>
-		</view> -->
-
-		<!--团队角色管理 -->
-		<view class="menu convenient" v-if="roleManageMenu.length>0">
-			<!--<view class="menu-title">
-				团队角色管理
-			</view> -->
-			<view v-if="roleManageMenu.length>0" class="flex flex-wrap justify-start">
-				<view class="menu-item" v-for="(item,index) in roleManageMenu" :key="item.id" @click="menuClick(item)">
-					<view class="image">
-						<u-image width="74rpx" height="74rpx" :src="iconList[item.name]" mode="widthFix"
-							:lazy-load="true"></u-image>
-					</view>
-					<view>{{item.name}}</view>
-				</view>
-			</view>
-			<view class="empty" v-else>
-				<u-empty mode="permission"></u-empty>
-			</view>
-		</view>
-
-		<!--应用管理 -->
-		<view class="menu convenient" v-if="costManageMenu.length>0">
-			<!-- 	<view class="menu-title">
-				费用/提现管理
-			</view> -->
-			<view v-if="costManageMenu.length>0" class="flex flex-wrap justify-start">
-				<view class="menu-item" v-for="(item,index) in costManageMenu" :key="item.id" @click="menuClick(item)">
-					<view class="image">
-						<u-image width="74rpx" height="74rpx" :src="iconList[item.name]" mode="widthFix"
-							:lazy-load="true"></u-image>
-					</view>
-					<view>{{item.name}}</view>
-				</view>
-			</view>
-			<view class="empty" v-else>
-				<u-empty mode="permission"></u-empty>
-			</view>
-		</view>
-
-		<!-- <view class="chang-password" @click="changePwd">
-			修改密码
-		</view> -->
-
-		<xpopup :show="qrcodeShow" mode="center" @close="qrcodeClose" :showBtn="false">
-			<view class="qrcode-content flex flex-direction align-center">
-				<view class="qrcode-img">
-					<u-image width="400rpx" height="400rpx"
-						src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/miniQrcode.jpg"
-						mode="widthFix" :lazy-load="true">
-					</u-image>
-				</view>
-				<view class="save-qrcode" slot="botton">
-					<xbutton @click="save">保存二维码</xbutton>
-				</view>
-			</view>
-		</xpopup>
-
-		<xpopup :show="pwdShow" @close="pwdClose" @confirm="pwdSubmit" :showBtn="true" title="修改密码">
-			<view class="pwd-popup-content flex align-center">
-				<view>新密码:</view>
-				<view>
-					<u--input placeholder="请输入新密码" type="password" border="surround" v-model="newpassword"></u--input>
-				</view>
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		removeToken
-	} from '@/utils/auth'
-	// import Xypopup from '@/components/xy-popup'
-	import {
-		userInfo,
-		updateUserInfo
-	} from "@/api/system/user.js"
-
-	export default {
-		// components: {
-		// 	Xypopup
-		// },
-		data() {
-			return {
-				tabArr: [{
-						name: '今日',
-						id: 0
-					},
-					{
-						name: '本月',
-						id: 1
-					}
-				],
-				current: 0,
-
-				//菜单对应图片路径
-				iconList: {
-					'退款审核': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/refund.png',
-					'风险订单': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/risk.png',
-					'客诉处理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/cc.png',
-					'补货管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/replenishment.png',
-					'增加设备': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (9).png',
-					'增加点位': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (8).png',
-					'团队管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/tdgl.png',
-					'加盟商': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/jms.png',
-					'流量卡管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (5).png',
-					'会员管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/hygl.png',
-					'运营仓': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (7).png',
-					'黑名单': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/hmd.png',
-					'营销管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (6).png',
-					'费用账单': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (10).png',
-					'小程序二维码': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/xcxewm.png',
-					'通知': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/tz.png',
-					'客服': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/kf.png',
-					'入驻协议': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/rzxy.png',
-				},
-
-				info: {
-					mercName: "",
-					name: "sunny",
-					roleNames: "",
-					tel: ""
-				},
-				timer: null,
-				logNum: 0,
-
-				qrcodeShow: false,
-
-				newpassword: '',
-				pwdShow: false,
-			}
-		},
-
-		computed: {
-			//团队角色管理
-			roleManageMenu() {
-				return this.getMenu('我的', '团队角色管理')
-			},
-			//应用管理
-			costManageMenu() {
-				return this.getMenu('我的', '应用管理')
-			},
-
-			//用户名
-			name() {
-				return this.$store.state.user.name
-			},
-		},
-
-		onShareAppMessage() {
-			return {
-				title: '喵星人商家助手',
-				path: '/pages/login',
-				imageUrl: 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/merc_qrcode.jpg',
-				success: function(res) {
-					// 转发成功之后的回调
-					if (res.errMsg == 'shareAppMessage:ok') {
-
-					}
-				},
-				fail: function() {
-					// 转发失败之后的回调
-					if (res.errMsg == 'shareAppMessage:fail cancel') {
-						// 用户取消转发
-					} else if (res.errMsg == 'shareAppMessage:fail') {
-						// 转发失败,其中 detail message 为详细失败信息
-					}
-				},
-			}
-		},
-
-		created() {
-			this.getUserInfo()
-		},
-
-		methods: {
-			searchLog(type) {
-				this.logNum++
-				if (this.timer) {
-					if (this.logNum > 6) {
-						this.logNum = 0
-						clearTimeout(this.timer)
-						this.timer = null
-						let url=type==1?'/pages/globalPages/logs':'/pages/globalPages/test'
-						this.$tab.navigateTo(url)
-					}
-				} else {
-					this.timer = setTimeout(() => {
-						this.logNum = 0
-						clearTimeout(this.timer)
-						this.timer = null
-					}, 2000)
-				}
-
-			},
-
-			getUserInfo() {
-				userInfo().then(res => {
-					if (res.code == 200) {
-						this.info = res.data
-					} else {
-						this.info = null
-					}
-				})
-			},
-
-			getMenu(menu1, menu2) {
-				let menu = []
-				if (this.$store.state.permission.permissions_menu && this.$store.state.permission.permissions_menu !=
-					'[]') {
-					let allMenu = JSON.parse(this.$store.state.permission.permissions_menu);
-					if (allMenu.find(i => i.name == menu1) && allMenu.find(i => i.name == menu1).children) {
-						let homeMenu = allMenu.find(i => i.name == menu1).children;
-						if (homeMenu.find(i => i.name == menu2)) {
-							if (homeMenu.find(i => i.name == menu2).children) {
-								menu = homeMenu.find(i => i.name == menu2).children
-							}
-						}
-					}
-				}
-				return menu
-			},
-
-			btnClick(e) {
-
-			},
-
-			menuClick(e) {
-				if (e.name == '团队管理') {
-					this.$tab.navigateTo('/pages/system/employee')
-					return
-				}
-				if (e.name == '小程序二维码') {
-					this.qrcodeShow = true;
-					return
-				}
-				if (e.name == '通知') {
-					this.$tab.navigateTo('/pages/globalPages/notice')
-					return
-				}
-				if (e.name == '客服') {
-					this.phone('88888888')
-					return
-				}
-				if (e.name == '入驻协议') {
-					this.$tab.navigateTo('/pages/globalPages/agreement')
-					return
-				}
-
-				this.$modal.msg('功能开发中,尽请期待~')
-			},
-
-			loginOut() {
-				this.$store.dispatch('LogOut').then(res => {
-					this.$tab.reLaunch('/pages/login')
-				})
-			},
-
-			qrcodeClose() {
-				this.qrcodeShow = false;
-			},
-
-			save() {
-				let imgUrl = 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/miniQrcode.jpg'
-				wx.getSetting({
-					success: function(res) {
-						if (!res.authSetting['scope.writePhotosAlbum']) { //判断是否开启相册权限
-							uni.authorize({
-								scope: 'scope.writePhotosAlbum',
-								success: function(res) {
-									uni.downloadFile({
-										url: imgUrl,
-										success: function(res) {
-											uni.saveImageToPhotosAlbum({
-												filePath: res.tempFilePath,
-												success: function(res) {
-													wx.showToast({
-														title: '保存成功',
-													})
-												}
-											})
-										}
-									})
-								},
-								fail(res) {
-									uni.showModal({
-										title: '提示',
-										content: '您未开启保存图片到相册的权限,请点击确定去开启权限!',
-										success(res) {
-											if (res.confirm) {
-												uni.openSetting()
-											}
-										}
-									})
-								}
-							})
-						} else {
-							uni.downloadFile({
-								url: imgUrl,
-								success: function(res) {
-									uni.saveImageToPhotosAlbum({
-										filePath: res.tempFilePath,
-										success: function(res) {
-											wx.showToast({
-												title: '保存成功',
-											})
-										}
-									})
-								}
-							})
-
-						}
-					},
-					fail(res) {}
-				})
-			},
-
-			//拨打电话
-			phone(tel) {
-				uni.makePhoneCall({
-					phoneNumber: tel
-				})
-			},
-			
-			setting(){
-				this.$tab.navigateTo('/pages/globalPages/setting')
-			},
-
-			changePwd() {
-				this.pwdShow = true
-			},
-
-			pwdSubmit() {
-				if (this.newpassword) {
-					updateUserInfo({
-						password: this.newpassword
-					}).then(res => {
-						this.$modal.showToast('修改成功~')
-					})
-					this.pwdClose()
-				} else {
-					this.$modal.msg('请输入新密码!')
-				}
-			},
-
-			pwdClose() {
-				this.pwdShow = false
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		padding-bottom: 100rpx;
-
-		// 个人信息
-		.user {
-			background: #2C6FF3 url('https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/globalPages/user-bg.png') no-repeat left top;
-			background-size: 100%;
-			padding-bottom: 145rpx;
-			position: relative;
-			width: 100%;
-
-			.user-content {
-				margin-top: 34rpx;
-				width: 100%;
-
-				.head-img {
-					width: 100rpx;
-					height: 100rpx;
-					border-radius: 100rpx;
-					margin-left: 26rpx;
-				}
-
-				.user-name {
-					font-size: 28rpx;
-					color: #fff;
-					margin-left: 33rpx;
-				}
-
-				.share {
-					width: 30rpx;
-					height: 30rpx;
-					position: relative;
-					margin-left: 20rpx;
-
-					.share-image {
-						width: 30rpx;
-						height: 30rpx;
-						position: absolute;
-						left: 0;
-						top: 0;
-
-						>image {
-							width: 30rpx;
-							height: 30rpx;
-						}
-					}
-
-					button {
-						width: 40rpx;
-						height: 40rpx;
-						position: absolute;
-						left: 0;
-						top: 0;
-						opacity: 0;
-					}
-				}
-
-				.login-out {
-					width: 140rpx;
-					line-height: 52rpx;
-					height: 52rpx;
-					text-align: center;
-					font-size: 24rpx;
-					color: #2C6FF3;
-					background-color: #fff;
-					position: absolute;
-					right: 0;
-					top: 185rpx;
-					z-index: 99;
-					border-top-left-radius: 52rpx;
-					border-bottom-left-radius: 52rpx;
-				}
-			}
-		}
-
-
-		// 常用菜单
-		.menu {
-			width: 724rpx;
-			margin-left: 14rpx;
-			background: #FFFFFF;
-			box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-			border-radius: 14rpx;
-			margin-top: 24rpx;
-			position: relative;
-			padding: 20rpx 36rpx 42rpx;
-
-			&.menu-userinfo {
-				padding: 36rpx;
-				margin-top: -102rpx;
-			}
-
-			.menu-title {
-				font-size: 30rpx;
-				font-weight: 800;
-				color: #000000;
-				position: absolute;
-				left: 28rpx;
-				top: 28rpx;
-			}
-
-			.u-content {
-				display: flex;
-				flex-flow: row nowrap;
-				justify-content: space-around;
-				text-align: center;
-
-				.u-item {
-					line-height: 50rpx;
-
-					.u-name {
-						font-weight: bold;
-						font-size: 30rpx;
-					}
-
-					.u-val {
-						font-size: 28rpx;
-						color: #666;
-						position: relative;
-						padding-left: 30rpx;
-						display: inline-block;
-
-						>image {
-							width: 21rpx;
-							height: 21rpx;
-							position: absolute;
-							left: 0;
-							top: 50%;
-							transform: translateY(-50%);
-						}
-					}
-				}
-			}
-
-			.cu-btn {
-				padding: 0 12rpx;
-				font-size: 22rpx;
-				height: 40rpx;
-				line-height: 40rpx;
-				background-color: #2C6FF3;
-				color: #fff;
-
-			}
-
-			.edit {
-				position: absolute;
-				right: 28rpx;
-				top: 28rpx;
-			}
-
-			.s-content {
-				.s-item {
-					line-height: 50rpx;
-
-					>text {
-						color: red;
-					}
-				}
-			}
-
-			.menu-item {
-				display: flex;
-				flex-direction: column;
-				align-items: center;
-				width: 25%;
-
-				>.image {
-					width: 74rpx;
-					height: 74rpx;
-				}
-
-				>view {
-					color: #333333;
-					font-size: 26rpx;
-					line-height: 26rpx;
-					margin-top: 16rpx;
-				}
-			}
-		}
-
-		.qrcode-content {
-			padding: 24rpx;
-
-			.qrcode-img {
-				width: 400rpx;
-				height: 400rpx;
-			}
-
-			.save-qrcode {
-				margin-top: 24rpx;
-			}
-		}
-
-		.chang-password {
-			text-align: center;
-			line-height: 60rpx;
-			color: #2C6FF3;
-			text-decoration: underline;
-		}
-
-		.pwd-popup-content {
-			padding: 24rpx;
-
-			>view:nth-child(1) {
-				width: 160rpx;
-			}
-
-			>view:nth-child(2) {
-				width: 100%;
-			}
-		}
-	}
-</style>

+ 0 - 315
pages/globalPages/components/commodity.vue

@@ -1,315 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar bgColor="#2C6FF3" :placeholder="true" :autoBack="false">
-			<view slot="left" style="color:#fff;font-size: 36rpx;">
-				商品私库
-			</view>
-		</u-navbar>
-		<view class="content">
-			<view class="btn-wrap flex justify-between">
-				<xbutton bgColor="#F7F7F7" color="#777777" @click="$tab.navigateTo('/pages/commodity/search')">商品上下架
-				</xbutton>
-				<xbutton bgColor="#F7F7F7" color="#777777" @click="$tab.navigateTo('/pages/commodity/addCom')">新品建模
-				</xbutton>
-				<xbutton bgColor="#F7F7F7" color="#777777" @click="$tab.navigateTo('/pages/commodity/publicCom')">官方商品库
-				</xbutton>
-			</view>
-			<view class="search" @click="searchComm">
-				<view class="search-input">
-					<u-search placeholder="商品搜索" actionText="取消" :actionStyle="{color:'#2C6FF3'}"
-						:showAction="!leftShow" :clearabled="false" v-model="keyword" @search="search"
-						@custom="cancle"></u-search>
-					<view @click="scan" :class="[leftShow?'scan-icon scan-left-show':'scan-icon scan-left-hidden']">
-						<u-icon name="scan" size="22" color="#909399"></u-icon>
-					</view>
-				</view>
-
-				<view class="search-history flex flex-wrap flex-start" v-if="!leftShow">
-					<view class="history-item" v-for="(item,index) in historyList" :key="index"
-						@click="searchFast(item)">
-						{{item}}
-					</view>
-				</view>
-			</view>
-			<view class="classify-wrap">
-				<Classify storeName="perStor" :tabList="tabList" :status="status" :commList="commList"
-					@switchMenu="switchMenu" @comClick='detail' @lowerBottom="lowerBottom" :height="fullHeight"
-					:leftShow="leftShow" />
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import Classify from "@/components/classify/index.vue"
-
-	import {
-		goodsCategory,
-		ownerGoodsList
-	} from "@/api/commodity/mercGoods.js"
-	export default {
-		components: {
-			Classify
-		},
-		data() {
-			return {
-				fullHeight: '0',
-				tabList: [], //商品类目
-				commList: [], //商品列表
-
-				page: 1, //商品分页
-				size: 10,
-				categoryCode: null,
-
-				status: 'loadmore', //加载更多
-
-				leftShow: true,
-				keyword: '',
-				historyList: []
-			}
-		},
-		created() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".classify-wrap").boundingClientRect((data) => {
-				_this.top = data.top;
-
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X", 
-							'iPhone XR', 
-							"iPhone XS", 
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - _this.top - 84 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - _this.top - 50 + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			if (uni.getStorageSync('goods')) {
-				this.historyList = JSON.parse(uni.getStorageSync('goods'))
-			}
-			this.getCategory()
-		},
-
-		methods: {
-			onshow() {
-				this.reset()
-				this.getCommList()
-			},
-
-			search(val) {
-				this.saveKeyWord('goods', this.keyword)
-				this.reset();
-				this.getCommList()
-			},
-
-			cancle(val) {
-				this.keyword = ''
-				this.leftShow = true
-				this.search()
-			},
-
-			saveKeyWord(type, val) {
-				if (val) {
-					let arr = []
-					if (uni.getStorageSync(type)) {
-						let arr = JSON.parse(uni.getStorageSync(type))
-						if (arr.indexOf(val) != -1) {
-							console.log('arr.indexOf(val)', arr.indexOf(val))
-							arr.splice(arr.indexOf(val), 1)
-						}
-						arr.unshift(val)
-						if (arr.length > 6) {
-							arr.pop()
-						}
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					} else {
-						arr.unshift(val)
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					}
-				} else {
-					return
-				}
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.search()
-					}
-				});
-			},
-
-			searchComm() {
-				this.leftShow = false
-			},
-
-			//获取类目列表
-			getCategory() {
-				goodsCategory().then(res => {
-					this.tabList = res.data
-					if (this.tabList && this.tabList.length > 0) {
-						this.switchMenu(this.tabList[0])
-					} else {
-						this.reset()
-					}
-				})
-			},
-
-			//商品类目切换
-			switchMenu(item) {
-				this.categoryCode = item.categoryCode
-				this.reset()
-				this.getCommList()
-			},
-
-			//根据类目获取商品列表
-			getCommList() {
-				let params = {}
-				if (this.leftShow) { //搜索
-					params = {
-						categoryCode: this.categoryCode,
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						status: '1' //0下架1上架
-					}
-				} else { //非搜索
-					params = {
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						status: '1', //0下架1上架
-						keyword: this.keyword
-					}
-				}
-				ownerGoodsList(params).then(res => {
-					let data = res.data.records;
-					if (data && data.length > 0) {
-						data = data.map(i => {
-							i.name = i.goodsName;
-							i.barcode = i.goodsBarcode;
-							i.cover = i.goodsCover;
-							i.price = i.price / 100;
-							i.categoryName = i.capacity == null ? '未分类' : i.capacity;
-							return i
-						})
-					}
-					if (data.length < 10) {
-						this.status = "nomore"
-					} else {
-						this.status = "loadmore"
-					}
-					this.commList = this.commList.concat(data)
-				})
-			},
-
-			//触底加载更多
-			lowerBottom() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getCommList()
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-
-			detail(e) {
-				this.$tab.navigateTo('/pages/commodity/comEdit?id=' + e.id)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.btn-wrap {
-		padding: 24rpx;
-		background-color: #fff;
-	}
-
-	.search {
-		padding: 0 24rpx 24rpx;
-		background-color: #fff;
-
-		.search-input {
-			position: relative;
-
-			.scan-icon {
-				position: absolute;
-				top: 50%;
-				transform: translateY(-50%);
-				z-index: 2;
-
-				&.scan-left-show {
-					right: 36rpx;
-				}
-
-				&.scan-left-hidden {
-					right: 100rpx;
-				}
-			}
-		}
-
-		.search-history {
-
-			.history-item {
-				margin-right: 24rpx;
-				padding: 0 12rpx;
-				background-color: #f2f2f2;
-				color: #333;
-				font-size: 24rpx;
-				line-height: 40rpx;
-				border-radius: 40rpx;
-				margin-top: 24rpx;
-			}
-		}
-	}
-
-	.classify-wrap {
-		// padding-bottom: 200rpx;
-	}
-
-	.btn {
-		width: 100%;
-		position: fixed;
-		bottom: 120rpx;
-		left: 0;
-		display: flex;
-		flex-flow: row nowrap;
-		justify-content: space-between;
-		padding: 0 24rpx;
-
-		&.safa-btn {
-			bottom: 180rpx;
-		}
-	}
-</style>

+ 0 - 362
pages/globalPages/components/equipment.vue

@@ -1,362 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar bgColor="#2C6FF3" :placeholder="true" :autoBack="false">
-			<view slot="left" style="color:#fff;font-size: 36rpx;">
-				设备管理
-			</view>
-		</u-navbar>
-		<view class="total">
-			<view class="total-item">
-				<view class="num">
-					{{totalData.onlineNum}}/{{totalData.offlineNum}}
-				</view>
-				<view class="name">
-					在线/离线
-				</view>
-			</view>
-			<view class="total-item">
-				<view class="num">
-					{{totalData.operatingNum}}/{{totalData.closedNum}}
-				</view>
-				<view class="name">
-					运营/停业
-				</view>
-			</view>
-			<view class="total-item" @click="$tab.navigateTo('/pages/replenish/replenishmentManagement')">
-				<view class="num">
-					{{totalData.needToFillNum}}
-				</view>
-				<view class="name">
-					待补货
-				</view>
-			</view>
-		</view>
-		<view class="search">
-			<!-- <u-search animation placeholder="请输入设备名称/编号搜索" :showAction="false"
-				disabled @click.native="$tab.navigateTo('/pages/equipment/search')">
-			</u-search> -->
-			<u-search animation placeholder="请输入设备名称/编号搜索" :showAction="false"
-				 @change="search">
-			</u-search>
-		</view>
-		<view class="content">
-			<view class="xy-card" v-for="(item,index) in list" :key="item.placeLineId">
-				<view class="eq-line-title">
-					{{item.placeLineName}}({{item.deviceNum}}台)
-					<view class="arrow-right">
-						<u-icon name="arrow-right" size="14"></u-icon>
-					</view>
-				</view>
-				<view class="eq-item" @click="$tab.navigateTo(`/pages/equipment/detail?id=${item1.deviceId}`)"
-					v-for="(item1,index1) in item.deviceInfos" :key="item1.deviceId">
-					<view class="eq-content">
-						<view class="eq-wrap">
-							<view class="eq-name flex justify-between">
-								<view class="eq-title" v-if="item1.deviceName">{{item1.deviceName}}<text style="color: #666;">({{item1.deviceId}})</text></view>
-								<view class="eq-title" v-else>{{item1.deviceId}}</view>
-								<view class="eq-status-box flex align-center">
-									<view class="eq-status" :class="[item1.netState==1?'online':'']"><text></text>{{item1.netStateName}}
-									</view>
-									<view class="eq-status" :class="[item1.busyState==1?'online':'']"><text></text>{{item1.busyStateName}}
-									</view>
-								</view>
-							</view>
-							<view class="eqeq-type">
-								<view>
-									设备类型:
-								</view>
-								<view>
-									{{item1.deviceTypeName}}
-								</view>
-							</view>
-							<view class="eqeq-type">
-								<view>
-									资产编号:
-								</view>
-								<view>
-									{{item1.mercDeviceCode||'无'}}
-								</view>
-							</view>
-							<view class="eqeq-type">
-								<view>
-									今日交易笔数:
-								</view>
-								<view>
-									{{item1.dayOrderNum}}
-								</view>
-							</view>
-							<view class="eqeq-type">
-								<view>
-									今日销售额:
-								</view>
-								<view>
-									¥{{$xy.delMoney(item1.daySalesPrice)}}
-								</view>
-							</view>
-						</view>
-
-						<view class="status">
-							<view class="s-name">
-								在售/补货
-							</view>
-							<view class="s-num">
-								{{item1.onSaleNum||0}}/{{item1.fillNum||0}}
-							</view>
-						</view>
-					</view>
-				</view>
-				<!-- <view class="more" @click="$tab.navigateTo('/pages/equipment/search')">
-					查看全部
-				</view> -->
-			</view>
-
-			<view class="empty" v-if="list.length==0">
-				<u-empty></u-empty>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mercHomeList,
-		mercHomeStatistical,
-	} from "@/api/device/device.js"
-	export default {
-		components: {},
-		data() {
-			return {
-				online: true,
-				list: [],
-				totalData: {
-					closedNum: 0,
-					needToFillNum: 0,
-					offlineNum: 0,
-					onlineNum: 0,
-					operatingNum: 0,
-					keyWords:''
-				},
-			}
-		},
-
-		created() {
-			this.getTotalData('')
-			this.getList('')
-		},
-
-		methods: {
-			onshow(){
-				this.getList('')
-			},
-			
-			search(e) {
-				console.log(e)
-				this.keyWords=e
-				this.getTotalData(this.keyWords)
-				this.getList(this.keyWords)
-			},
-
-			getTotalData(deviceId) {
-				mercHomeStatistical({
-					deviceName: '',
-					deviceId: deviceId
-				}).then(res => {
-					this.totalData = res.data;
-				})
-			},
-
-			getList(deviceId) {
-				mercHomeList({
-					deviceName: '',
-					deviceId: deviceId
-				}).then(res => {
-					this.list = res.data;
-				})
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-	.container {
-		.nav-style {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #fff;
-		}
-
-		.search {
-			padding: 24rpx 24rpx;
-			background-color: #fff;
-		}
-
-		.total {
-			display: flex;
-			flex-flow: row nowrap;
-			justify-content: space-around;
-			align-items: center;
-			text-align: center;
-			color: #fff;
-			background-color: #2C6FF3;
-			padding: 40rpx 24rpx ;
-
-			.total-item {
-				.num {
-					font-weight: bold;
-					font-size: 52rpx;
-				}
-
-				.name {
-					font-size: 26rpx;
-				}
-			}
-		}
-
-		.content {
-			padding: 24rpx;
-			padding-bottom:calc(124rpx + env(safe-area-inset-bottom) / 2);
-
-			.xy-card {
-				margin-bottom: 24rpx;
-			}
-
-			.eq-line-title {
-				font-size: 32rpx;
-				padding-bottom: 24rpx;
-				position: relative;
-
-				.arrow-right {
-					position: absolute;
-					right: 0;
-					top: 0;
-				}
-			}
-
-			.eq-item {
-				position: relative;
-
-				&+.eq-item {
-					padding-top: 12rpx;
-				}
-
-				.eq-content {
-
-					.eq-wrap {
-						border-radius: 8rpx;
-						background-color: rgb(245, 248, 251);
-						box-sizing: border-box;
-						padding: 24rpx 12rpx;
-						font-size: 26rpx;
-
-						.eq-name {
-							font-size: 32rpx;
-							font-weight: bold;
-							margin-bottom: 24rpx;
-							position: relative;
-							
-							>.eq-title{
-								width: 420rpx;
-								>text{
-									font-size: 30rpx;
-									color: #666;
-									font-weight: normal;
-								}
-							}
-							
-							.eq-status-box{
-								float: right;
-								position: absolute;
-								right:0;
-								top:0;
-							}
-
-							.eq-status {
-								font-size: 28rpx;
-								color: #666;
-								font-weight: normal;
-								margin-left: 12rpx;
-
-								>text {
-									display: inline-block;
-									background-color: #666;
-									width: 16rpx;
-									height: 16rpx;
-									border-radius: 16rpx;
-									margin-right: 12rpx;
-
-								}
-
-								&.online {
-									color: #f56c6c;
-
-									>text {
-										background-color: green;
-									}
-								}
-							}
-						}
-					}
-
-					.eqeq-type {
-						display: flex;
-						flex-direction: row;
-						align-items: center;
-						font-size: 28rpx;
-
-						>view:nth-child(1) {
-							color: #000;
-							width: 200rpx;
-						}
-
-						>view:nth-child(2) {
-							color: #666;
-							padding-left: 6rpx;
-						}
-					}
-					
-					.eqeq-type+.eqeq-type{
-						margin-top: 16rpx;
-					}
-
-					.status {
-						width: 130rpx;
-						height: 120rpx;
-						box-sizing: border-box;
-						border-radius: 120rpx;
-						// border: 6rpx solid #2C6FF3;
-						text-align: center;
-						display: flex;
-						flex-flow: column;
-						justify-content: space-around;
-						align-items: center;
-						position: absolute;
-						right: 12rpx;
-						bottom: 24rpx;
-
-						.s-name {
-							font-size: 28rpx;
-							padding-top: 20rpx;
-							font-weight: bold;
-						}
-
-						.s-num {
-							font-size: 32rpx;
-							padding-bottom: 20rpx;
-						}
-					}
-				}
-			}
-
-			.more {
-				text-align: center;
-				font-size: 28rpx;
-				color: #2C6FF3;
-				line-height: 80rpx;
-			}
-		}
-
-		.empty {
-			margin: 40% auto 0;
-		}
-	}
-</style>

+ 0 - 654
pages/globalPages/components/home.vue

@@ -1,654 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar bgColor="#fff" :placeholder="true" @leftClick="scan">
-			<view slot="left">
-				<u-icon name="scan" color="#333" size="32"></u-icon>
-			</view>
-			<view slot="center" style="color:#333;font-size: 36rpx;">
-				开门柜管理
-			</view>
-		</u-navbar>
-
-		<!-- 统计信息 -->
-		<view class="total">
-			<view class="total-sale flex flex-start ">
-				<view class="sale-item">
-					<view class="sale-name">
-						今日总收益(元)
-					</view>
-					<view class="sale-num">
-						{{$xy.delMoney(total.day.salesPrice)}}
-					</view>
-				</view>
-				<view class="sale-item">
-					<view class="sale-name">
-						本月总收益(元)
-					</view>
-					<view class="sale-num">
-						{{$xy.delMoney(total.month.salesPrice)}}
-					</view>
-				</view>
-
-				<view class="sale-more" @click="$tab.navigateTo('/pages/globalPages/moreData')">
-					更多数据
-					<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/white-more.png"
-						mode="widthFix"></image>
-				</view>
-
-				<view @click="update" :class="[load?'update load':'update']">
-					<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/update.png"
-						mode="heightFix"></image>
-				</view>
-			</view>
-			<view class="refund-order flex flex-start">
-				<view class="refund-item" @click="$tab.navigateTo('/pages/order/refundList')">
-					<view class="refund-num">
-						¥{{$xy.delMoney(total.day.refundMoney)}}
-					</view>
-					<view class="refund-name">
-						今日退款
-					</view>
-				</view>
-				<view class="refund-item" @click="$tab.navigateTo('/pages/order/orderQuery')">
-					<view class="refund-num">
-						{{total.day.orderNum}}
-					</view>
-					<view class="refund-name">
-						今日订单数
-					</view>
-				</view>
-			</view>
-			<view class="notice" @click="goRisk">
-				<view>
-					<u-notice-bar :text="notice" color="#CB7506" bgColor="#fff" speed="80" mode="link"
-						@close="noticeClose">
-					</u-notice-bar>
-				</view>
-				<!-- <view class="notice-tips flex justify-around align-center" v-if="tipsCount.riskOrderNum>0">
-					<view>
-						{{tipsCount.riskOrderNum}}
-					</view>
-				</view> -->
-
-				<view class="notice-tips flex justify-around align-center" v-if="tipsCount.riskOrderNum>0">
-					<u-badge numberType="overflow" bgColor="#E60012" max="99" :value="tipsCount.riskOrderNum"></u-badge>
-				</view>
-			</view>
-		</view>
-
-		<!-- 常用菜单 -->
-		<view class="useful-menu" v-if="operMenu.length>0">
-			<view  class="flex justify-between flex-wrap">
-				<view class="useful-menu-item flex justify-between align-center" v-for="(item,index) in operMenu"
-					:key="item.id" @click="menuClick(item)">
-					<view class="image">
-						<u-image width="75rpx" height="75rpx" :src="iconList[item.name]" mode="widthFix"
-							:lazy-load="true">
-						</u-image>
-					</view>
-					<view class="menu-name">{{item.name}}</view>
-					<!-- <view class="tips flex justify-around align-center" v-if="tips(item.name)>0">
-						<view>
-							{{tips(item.name)}}
-						</view>
-					</view> -->
-					<u-badge absolute :offset="[-2,-2]" is-dot bgColor="#E60012" v-if="tips(item.name)>0"></u-badge>
-					<!-- <u-badge numberType="overflow" :absolute="true" :offset="[-4,-4]" bgColor="#E60012" max="99" :value="tips(item.name)"></u-badge> -->
-				</view>
-			</view>
-		</view>
-
-		<!--便捷功能 -->
-		<view class="menu"  v-if="usefMenu.length>0">
-			<view class="menu-title">
-				便捷功能
-			</view>
-			<view class="menu-content flex justify-start">
-				<view class="menu-item" v-for="(item,index) in usefMenu" :key="item.id" @click="menuClick(item)">
-					<view class="image">
-						<u-image width="57rpx" height="57rpx" :src="iconList[item.name]" mode="widthFix"
-							:lazy-load="true">
-						</u-image>
-					</view>
-					<view>{{item.name}}</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		allCount
-	} from "@/api/device/device.js"
-
-	import {
-		tipsCount
-	} from "@/api/order/order.js"
-	tipsCount
-
-	export default {
-		data() {
-			return {
-				tabArr: [{
-						name: '今日',
-						id: 0
-					},
-					{
-						name: '本月',
-						id: 1
-					}
-				],
-				current: 0,
-
-				//菜单对应图片路径
-				iconList: {
-					'退款审核': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/refund.png',
-					'异常订单': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/risk.png',
-					'客诉处理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/cc.png',
-					'补货管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/replenishment.png',
-					'增加设备': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (9).png',
-					'增加点位': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (8).png',
-					'团队管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (4).png',
-					'加盟商': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (2).png',
-					'流量卡管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (5).png',
-					'会员管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (1).png',
-					'运营仓': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (7).png',
-					'黑名单管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (3).png',
-					'营销管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (6).png',
-					'费用账单': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (10).png',
-					'商品建模': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/goods-model.png',
-					'订单管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/order-man.png',
-					// '商品统计': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/goods-total.png',
-					'销售统计': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/device-total.png',
-					
-					//暂时使用
-					'激活管理': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (6).png',
-					'商品清单': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (7).png',
-					'常见错误码': 'https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/menu-icon (3).png',
-				},
-
-				tempTotal: {},
-
-				total: {
-					day: {
-						orderNum: 0,
-						refundMoney: 0,
-						salesPrice: 0
-					},
-					month: {
-						orderNum: 0,
-						refundMoney: 0,
-						salesPrice: 0
-					}
-				},
-
-				riskNum: 0,
-				noticeShow: false,
-				load: false,
-				timer: null,
-				tipsCount: {
-					refundNum: 0,
-					complaintsNum: 0,
-					outOfStockNum: 0,
-					riskOrderNum: 0
-				}
-			}
-		},
-
-		computed: {
-			//运营任务菜单
-			operMenu() {
-				return this.getMenu('首页', '运营任务')
-			},
-			//便捷菜单
-			usefMenu() {
-				return this.getMenu('首页', '便捷功能')
-			},
-			//消息
-			notice() {
-				let msg = '您有新的消息~'
-				if (this.tipsCount.riskOrderNum > 0) {
-					msg = `您有${this.tipsCount.riskOrderNum}个待办订单需处理!`
-				} else {
-					msg = '无待办事项~'
-				}
-				return msg
-			}
-		},
-
-		created() {
-			this.getTotalData() //顶部统计数据
-			this.getNum() //常用菜单角标
-		},
-
-		methods: {
-			//更新统计数据
-			update() {
-				if (this.timer) {
-					clearTimeout(this.timer)
-				}
-				this.load = true;
-				this.timer = setTimeout(() => {
-					this.load = false;
-				}, 1000)
-				this.getTotalData()
-				this.getNum() //常用菜单角标
-			},
-
-			onshow() {
-				this.getTotalData()
-				this.getNum()
-			},
-			//统计数据
-			getTotalData() {
-				allCount().then(res => {
-					this.total = res.data
-				})
-			},
-
-			tips(name) {
-				let num = 0;
-				switch (name) {
-					case '退款审核':
-						num = this.tipsCount.refundNum
-						break;
-					case '异常订单':
-						num = this.tipsCount.riskOrderNum
-						break;
-					case '客诉处理':
-						num = this.tipsCount.complaintsNum
-						break;
-					case '补货管理':
-						num = this.tipsCount.outOfStockNum
-						break;
-					default:
-						break;
-				}
-				return num
-			},
-
-			//常用功能角标数据
-			getNum() {
-				tipsCount().then(res => {
-					this.tipsCount = res.data
-				}).catch(err => {
-					this.tipsCount = {
-						refundNum: 0,
-						complaintsNum: 0,
-						outOfStockNum: 0,
-						riskOrderNum: 0
-					}
-				})
-			},
-
-			getMenu(menu1, menu2) {
-				let menu = []
-				if (this.$store.state.permission.permissions_menu && this.$store.state.permission.permissions_menu != '[]') {
-					let allMenu = JSON.parse(this.$store.state.permission.permissions_menu);
-					if (allMenu.find(i => i.name == menu1) && allMenu.find(i => i.name == menu1).children) {
-						let homeMenu = allMenu.find(i => i.name == menu1).children;
-						if (homeMenu.find(i => i.name == menu2) && homeMenu.find(i => i.name == menu2).children) {
-							menu = homeMenu.find(i => i.name == menu2).children
-						}
-					}
-				}
-				return menu
-			},
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						let deviceId = res.result.split('=')[1]
-						if (deviceId) {
-							this.$tab.navigateTo(`/pages/activeDevice/bindDevice?id=${deviceId}`)
-						} else {
-							this.$modal.msg('该二维码无效~')
-						}
-					}
-				});
-			},
-			tabChange(e) {
-				this.current = e.id
-				this.switchTotal(this.current)
-			},
-			menuClick(e) {
-				if (e.name == '补货管理') {
-					this.$tab.navigateTo('/pages/replenish/replenishmentManagement')
-					return
-				}
-				if (e.name == '退款审核') {
-					this.$tab.navigateTo('/pages/order/refundList')
-					return
-				}
-				if (e.name == '异常订单') {
-					this.$tab.navigateTo('/pages/order/riskOrder')
-					return
-				}
-				if (e.name == '增加点位') {
-					this.$tab.navigateTo('/pages/point/point')
-					return
-				}
-				if (e.name == '商品建模') {
-					this.$tab.navigateTo('/pages/commodity/auditList')
-					return
-				}
-				if (e.name == '订单管理') {
-					this.$tab.navigateTo('/pages/order/orderQuery')
-					return
-				}
-				if (e.name == '销售统计') {
-					this.$tab.navigateTo('/pages/globalPages/statistics')
-					return
-				}
-				if (e.name == '设备统计') {
-					this.$tab.navigateTo('/pages/globalPages/deviceStatistics')
-					return
-				}
-				if (e.name == '激活管理') {
-					this.$tab.navigateTo('/pages/activeDevice/deviceManage')
-					return
-				}
-				if (e.name == '商品清单') {
-					this.$tab.navigateTo('/pages/commodity/commoditylist')
-					return
-				}
-				if (e.name == '常见错误码') {
-					this.$tab.navigateTo('/pages/globalPages/errCode')
-					return
-				}
-				this.$modal.msg('功能开发中,尽请期待~')
-			},
-
-			clearStor() {
-				try {
-					uni.clearStorageSync();
-				} catch (e) {
-					console.log(e)
-				}
-			},
-
-			noticeClose() {
-				this.noticeShow = false
-			},
-
-			goRisk() {
-				if (this.tipsCount.riskOrderNum > 0) {
-					this.$tab.navigateTo('/pages/order/riskOrder')
-				}
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	@keyframes rotate {
-		from {
-			transform: rotate(0deg);
-		}
-
-		to {
-			transform: rotate(359deg);
-		}
-	}
-
-	/deep/.u-notice-bar {
-		padding: 9px 12rpx !important;
-	}
-
-	.container {
-		padding-bottom: 88rpx;
-		position: relative;
-
-		.nav-style {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #fff;
-		}
-
-		// 统计信息
-		.total {
-			width: 724rpx;
-			margin-left: 14rpx;
-			overflow: hidden;
-			border-radius: 14rpx;
-			background-color: #fff;
-			margin-top: 10rpx;
-
-			.total-sale {
-				width: 724rpx;
-				height: 205rpx;
-				background: url('https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/home/home-bg.png') no-repeat left top;
-				background-size: 100% 100%;
-				position: relative;
-
-				.sale-item {
-					margin-top: 46rpx;
-					padding-left: 30rpx;
-
-					.sale-name {
-						font-size: 26rpx;
-						font-weight: 500;
-						color: #EEEDFF;
-						line-height: 26rpx;
-					}
-
-					.sale-num {
-						line-height: 50rpx;
-						font-size: 50rpx;
-						font-weight: 800;
-						color: #FFFFFF;
-						margin-top: 55rpx;
-					}
-				}
-
-				.sale-more {
-					font-size: 26rpx;
-					font-weight: 500;
-					color: #FFFFFF;
-					padding-right: 18rpx;
-					position: absolute;
-					right: 12rpx;
-					top: 22rpx;
-					line-height: 26rpx;
-
-					image {
-						width: 24rpx;
-						height: 24rpx;
-						position: absolute;
-						right: 0;
-						top: 0;
-					}
-				}
-
-				.update {
-					width: 50rpx;
-					height: 50rpx;
-					position: absolute;
-					right: 16rpx;
-					bottom: 16rpx;
-
-					&.load {
-						animation: rotate 1s linear;
-						animation-iteration-count: 3;
-					}
-
-					image {
-						width: 50rpx;
-						height: 50rpx;
-					}
-				}
-			}
-
-			.refund-order {
-				padding-left: 34rpx;
-				overflow: hidden;
-				padding-bottom: 26rpx;
-
-				.refund-item {
-					text-align: center;
-					color: #2E2E2E;
-					margin-top: 68rpx;
-
-					&:nth-child(1) {
-						margin-right: 70rpx;
-					}
-
-					.refund-num {
-						font-size: 36rpx;
-						font-weight: 800;
-						line-height: 32rpx;
-					}
-
-					.refund-name {
-						font-size: 28rpx;
-						font-weight: 500;
-						line-height: 28rpx;
-						margin-top: 27rpx;
-					}
-				}
-			}
-
-			.notice {
-				width: 100%;
-				position: relative;
-
-				// .notice-tips {
-				// 	padding: 10rpx;
-				// 	color: #fff;
-				// 	font-size: 24rpx;
-				// 	text-align: center;
-				// 	position: absolute;
-				// 	right: 56rpx;
-				// 	top: 50%;
-				// 	transform: translateY(-50%);
-				// 	z-index: 999;
-				// 	background-color: #fff;
-
-				// 	>view {
-				// 		width: 36rpx;
-				// 		height: 36rpx;
-				// 		background-color: #E60012;
-				// 		border-radius: 36rpx;
-				// 		line-height: 36rpx;
-				// 	}
-				// }
-
-				.notice-tips {
-					padding: 10rpx;
-					text-align: center;
-					position: absolute;
-					right: 40rpx;
-					top: 50%;
-					transform: translateY(-54%);
-					z-index: 999;
-					background-color: #fff;
-				}
-			}
-		}
-
-		//常用菜单
-		.useful-menu {
-			width: 724rpx;
-			margin-left: 14rpx;
-
-			.useful-menu-item {
-				margin-top: 20rpx;
-				width: 352rpx;
-				height: 168rpx;
-				background: #FFFFFF;
-				box-shadow: 0px 0px 10px 0px rgba(174, 201, 255, 0.2);
-				border-radius: 14rpx;
-				padding: 0 66rpx 0 46rpx;
-				position: relative;
-
-				>.image {
-					width: 75rpx;
-					height: 75rpx;
-				}
-
-				>.menu-name {
-					font-size: 32rpx;
-					font-weight: 500;
-					color: #333333;
-				}
-
-				.tips {
-					// width: 40rpx;
-					// height: 40rpx;
-					// background-color: #E60012;
-					// color: #fff;
-					// font-size: 24rpx;
-					// text-align: center;
-					// line-height: 28rpx;
-					// border-radius: 40rpx;
-					// position: absolute;
-					// right: -8rpx;
-					// top: -8rpx;
-					// padding: 6rpx;
-
-					width: 40rpx;
-					height: 40rpx;
-					position: absolute;
-					right: -8rpx;
-					top: -8rpx;
-					padding: 6rpx;
-				}
-			}
-		}
-
-		// 便捷功能
-		.menu {
-			width: 724rpx;
-			margin-left: 14rpx;
-			background: #FFFFFF;
-			box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-			border-radius: 14rpx;
-			display: flex;
-			flex-flow: row nowrap;
-			justify-content: space-around;
-			margin-top: 20rpx;
-			position: relative;
-			padding: 101rpx 36rpx 0rpx;
-
-			.menu-title {
-				font-size: 28rpx;
-				font-weight: 800;
-				color: #000;
-				position: absolute;
-				left: 28rpx;
-				top: 28rpx;
-			}
-
-			.menu-item {
-				margin-bottom: 48rpx;
-			}
-
-			.menu-content {
-				width: 100%;
-				flex-flow: row wrap;
-			}
-
-			.menu-item {
-				text-align: center;
-				width: 25%;
-				display: flex;
-				flex-direction: column;
-				align-items: center;
-
-				>.image {
-					width: 57rpx;
-					height: 57rpx;
-				}
-
-				>view {
-					color: #333;
-					font-size: 24rpx;
-					line-height: 24rpx;
-					font-size: 28rpx;
-					line-height: 28rpx;
-					margin-top: 16rpx;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 187
pages/globalPages/home.vue

@@ -1,187 +0,0 @@
-<template>
-	<view class="container">
-		<view class="pages">
-			<Home ref="home" v-if="tabName=='首页'" />
-			<Equipment ref="equipment" v-if="tabName=='设备'" />
-			<Commodity ref="commodity" v-if="tabName=='商品'" />
-			<Account v-if="tabName=='我的'" />
-		</view>
-
-		<u-tabbar v-if="menu&&menu.length>0" :value="current" @change="tabChange" :fixed="true" :placeholder="false"
-			:safeAreaInsetBottom="true">
-			<u-tabbar-item :text="item.name" v-for="(item,index) in menu" :key="item.id" @click="tabClick(item)">
-				<image class="u-page__item__slot-icon" slot="inactive-icon" :src="tabIcon[item.name][0]"></image>
-				<image class="u-page__item__slot-icon" slot="active-icon" :src="tabIcon[item.name][1]"></image>
-			</u-tabbar-item>
-		</u-tabbar>
-	</view>
-</template>
-
-<script>
-	import Home from './components/home.vue'
-	import Equipment from './components/equipment.vue'
-	import Commodity from './components/commodity.vue'
-	import Account from './components/account.vue'
-	let mqtt = require('../../static/js/mqtt.min.js')
-
-	export default {
-		components: {
-			Home,
-			Equipment,
-			Commodity,
-			Account
-		},
-
-		data() {
-			return {
-				current: 0,
-				tabIcon: {
-					'首页': [require('../../static/images/tabbar/home.png'), require(
-						'../../static/images/tabbar/home_.png')],
-					'设备': [require('../../static/images/tabbar/equipment.png'), require(
-						'../../static/images/tabbar/equipment_.png')],
-					'商品': [require('../../static/images/tabbar/commodity.png'), require(
-						'../../static/images/tabbar/commodity_.png')],
-					'我的': [require('../../static/images/tabbar/mine.png'), require(
-						'../../static/images/tabbar/mine_.png')],
-				},
-				client: null,
-				tabName: null
-			}
-		},
-		onShow() {
-			// 版本自动更新代码
-			const updateManager = wx.getUpdateManager()
-			updateManager.onUpdateReady(function() {
-				wx.showModal({
-					title: '更新检测',
-					content: '检测到新版本,是否重启小程序?',
-					success: function(res) {
-						if (res.confirm) {
-							// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
-							updateManager.applyUpdate()
-						}
-					}
-				})
-			})
-			updateManager.onUpdateFailed(function() {
-				// 新的版本下载失败
-				wx.showModal({
-					title: '已有新版本咯',
-					content: '请您删除当前小程序,重新打开呦~',
-					showCancel: false
-				})
-			})
-
-			//onshow刷新设备状态
-			if(this.current==0){
-				this.$refs.home.onshow()
-			}
-			if (this.current == 1) {
-				this.$refs.equipment.onshow()
-			}
-			if(this.current==2){
-				this.$refs.commodity.onshow()
-			}
-		},
-
-		computed: {
-			menu() {
-				return JSON.parse(this.$store.state.permission.permissions_menu)
-			},
-		},
-
-		watch: {
-			menu: {
-				handler(newVal, oldVal) {
-					if (newVal.length > 0) {
-						this.tabName = newVal[0].name
-					} else {
-						this.tabName = null
-					}
-				},
-				deep: true,
-				immediate: true
-			}
-		},
-
-		onLoad(o) {
-			if (o.tabName) { //公库添加商品到私库完毕,显示商品界面
-				this.tabName = o.tabName;
-				if (this.menu && this.menu.length > 0) {
-					this.menu.forEach((item, index) => {
-						if (item.name == o.tabName) {
-							this.current = index
-						}
-					})
-				}
-
-			}
-			// this.mqttConnect()
-		},
-
-		methods: {
-			mqttConnect() {
-				let _this = this;
-
-				//测试用,生产通过接口(/sys/user-info/webUserMqtt)获取options
-				const options = {
-					clean: true, // true: 清除会话, false: 保留会话
-					connectTimeout: 4000, // 超时时间
-					// 认证信息
-					clientId: 'web-user-wxc-1',
-					username: 'webuser',
-					password: 'xy20220101',
-				}
-				// 连接字符串, 通过协议指定使用的连接方式
-				// ws 未加密 WebSocket 连接
-				// wss 加密 WebSocket 连接
-				// mqtt 未加密 TCP 连接
-				// mqtts 加密 TCP 连接
-				// wxs 微信小程序连接
-				// alis 支付宝小程序连接
-				const connectUrl = 'wxs://mqtt.mxrvending.com:8084/mqtt'
-				this.client = mqtt.connect(connectUrl, options)
-				this.client.on('connect', function() {
-					//订阅消息
-					_this.client.subscribe('web-user-wxc-1', function(err) {
-						if (!err) {
-							console.log('订阅成功', err)
-						} else {
-							console.log('订阅失败', err)
-						}
-					})
-				}).on('reconnect', function() {
-					console.log('正在重连')
-				}).on('error', function() {
-					console.log('错误')
-				}).on('end', function() {
-					console.log('连接结束')
-				}).on('message', function(topic, message) {
-					console.log('接收到的消息==========>>>>>>>>', message.toString())
-				})
-			},
-
-			tabChange(e) {
-				this.current = e
-			},
-
-			tabClick(e) {
-				this.tabName = e.name
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.container {
-		.pages {
-			height: 100%;
-		}
-
-		.u-page__item__slot-icon {
-			width: 44rpx;
-			height: 44rpx;
-		}
-	}
-</style>

+ 0 - 919
pages/globalPages/moreData.vue

@@ -1,919 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar titleStyle="color:#333;fontSize:36rpx;" :autoBack="true" bgColor="#fff" :placeholder="true"
-			title="更多数据"></u-navbar>
-		<view class="content">
-			<view class="tab-wrap">
-				<view class="tab">
-					<u-tabs :list="tabList" :activeStyle="{color: '#333',fontWeight: 'bold',fontSize:'36rpx'}"
-						:inactiveStyle="{fontSize:'32rpx'}" :scrollable="false" :current="current" @click="tabClick"
-						lineColor="#2C6FF3">
-					</u-tabs>
-				</view>
-			</view>
-
-			<view class="total-content today" v-if="current==0">
-				<view class="time-tab flex align-center justify-between">
-					<!-- <view class="time-item" :class="[dayTimeCurrent==0?'time-item time-show':'time-item']"
-						@click="dayTimeClick(0)">
-						今日
-					</view> -->
-					<!-- <view class="time-item" :class="[dayTimeCurrent==1?'time-item time-show':'time-item']" -->
-					<view class="time-item time-show" @click="dayTimeClick(0)">
-						{{date}}
-					</view>
-
-					<view class="flex">
-						<view class="change-day" @tap="changeDay(0)">
-							<xbutton>今日</xbutton>
-						</view>
-						<view class="change-day" @tap="changeDay(-1)">
-							<xbutton>前一天</xbutton>
-						</view>
-						<view class="change-day" @tap="changeDay(1)">
-							<xbutton>后一天</xbutton>
-						</view>
-					</view>
-				</view>
-
-				<u-datetime-picker :show="timeShow" mode="date" v-model="datePicker" @confirm="confirm"
-					:closeOnClickOverlay="true" @close="close" @cancel="close"></u-datetime-picker>
-
-				<view class="today-receive">
-					<view>今日总收益</view>
-					<view>
-						¥<view>{{$xy.delMoney(dayData.dayTotalRevenue)}}</view>
-					</view>
-					<view>
-						今日销售+今日补收
-					</view>
-				</view>
-
-				<view class="sale-refund card">
-					<view class="sr-title">
-						<image src="../../static/images/global/total-before.png" mode="widthFix"></image>
-						订单销售
-					</view>
-					<view class="sr-head">
-						<view>
-							¥<view>{{$xy.delMoney(dayData.dayOrderRealMoney)}}</view>
-						</view>
-						<view>
-							到账金额
-						</view>
-					</view>
-					<view class="sr-total flex justify-between">
-						<view class="sr-item">
-							<view class="sr-num" style="color:#2C6FF3;">
-								¥<text>{{$xy.delMoney(dayData.dayOrderTotalMoney)}}</text>
-							</view>
-							<view class="sr-name">
-								订单金额
-							</view>
-
-						</view>
-						<view class="sr-item" style="color: #FF0000;">
-							<view class="sr-num">
-								¥<text>{{$xy.delMoney(dayData.dayRefundMoney)}}</text>
-							</view>
-							<view class="sr-name">
-								退款金额
-							</view>
-
-						</view>
-						<view class="sr-item">
-							<view class="sr-num">
-								¥<text>{{$xy.delMoney(dayData.dayPayFailedMoney)}}</text>
-							</view>
-							<view class="sr-name">
-								挂账金额
-							</view>
-
-						</view>
-						<view class="sr-item">
-							<view class="sr-num">
-								<text>{{dayData.dayToBeConfirmedNum||0}}</text>笔
-							</view>
-							<view class="sr-name">
-								待确认
-							</view>
-						</view>
-					</view>
-
-					<view class="sr-total flex justify-between">
-						<view class="sr-item">
-							<view class="sr-num">
-								<text>{{dayData.dayOrderNum||0}}</text>笔
-							</view>
-							<view class="sr-name">
-								订单数量
-							</view>
-						</view>
-						<view class="sr-item">
-							<view class="sr-num">
-								<text>{{dayData.dayRefundNum||0}}</text>笔
-							</view>
-							<view class="sr-name">
-								退款数量
-							</view>
-
-						</view>
-						<view class="sr-item">
-							<view class="sr-num">
-								<text>{{dayData.dayPayFailedNum||0}}</text>
-							</view>
-							<view class="sr-name">
-								挂账数量
-							</view>
-
-						</view>
-						<view class="sr-item">
-							<view class="sr-num">
-								<text>{{dayData.dayAbnormalOrderNum||0}}</text>笔
-							</view>
-							<view class="sr-name">
-								异常数量
-							</view>
-
-						</view>
-					</view>
-				</view>
-
-				<view class="sale-refund card" style="padding:30rpx 20rpx;">
-					<view class="sr-title" style="margin-left: 14rpx;">
-						<image src="../../static/images/global/total-before.png" mode="widthFix"></image>
-						历史订单补退和补收
-					</view>
-					<view class="sr-head">
-						<view>
-							¥<view>{{$xy.delMoney(dayData.dayHisFillMoney-dayData.dayHisRefundMoney)}}</view>
-						</view>
-						<view>
-							补收合计
-						</view>
-					</view>
-					<view class="sr-content flex justify-between">
-						<view class="sr-content-item sr-content-left">
-							<view class="sc-top">
-								今日补收
-							</view>
-							<view class="sc-bot flex">
-								<view class="sc-item">
-									<view class="sc-num">
-										¥<text>{{$xy.delMoney(dayData.dayHisFillMoney)}}</text>
-									</view>
-									<view class="sc-name">
-										金额
-									</view>
-								</view>
-								<view class="sc-item">
-									<view class="sc-num">
-										<text>{{dayData.dayHisFillNum||0}}</text>笔
-									</view>
-									<view class="sc-name">
-										订单数量
-									</view>
-								</view>
-							</view>
-						</view>
-						<view class="sr-content-item sr-content-right">
-							<view class="sc-top">
-								今日补退
-							</view>
-							<view class="sc-bot flex">
-								<view class="sc-item">
-									<view class="sc-num">
-										¥<text>{{$xy.delMoney(dayData.dayHisRefundMoney)}}</text>
-									</view>
-									<view class="sc-name">
-										金额
-									</view>
-								</view>
-								<view class="sc-item">
-									<view class="sc-num">
-										<text>{{dayData.dayHisRefundNum||0}}</text>笔
-									</view>
-									<view class="sc-name">
-										订单数量
-									</view>
-								</view>
-							</view>
-						</view>
-					</view>
-				</view>
-
-				<view class="sale-refund card" style="padding:30rpx 20rpx;">
-					<view class="sr-title" style="margin-left: 14rpx;">
-						<image src="../../static/images/global/total-before.png" mode="widthFix"></image>
-						风险订单
-					</view>
-					<view class="sr-head" @click="$tab.navigateTo('/pages/order/riskOrder')">
-						<view style="color: #FF0000;">
-							<view style="padding-right:12rpx;">{{dayData.toDoRiskCount}}</view>笔
-						</view>
-						<view>
-							待处理风险订单
-						</view>
-					</view>
-					<view class="sr-content flex justify-between">
-						<view class="sr-content-item sr-content-left1">
-							<view class="sc-top">
-								今日新增
-							</view>
-							<view class="sc-val">
-								{{dayData.dayRiskAddCount}}
-							</view>
-						</view>
-						<view class="sr-content-item sr-content-right1">
-							<view class="sc-top">
-								今日处理
-							</view>
-							<view class="sc-val">
-								{{dayData.dayRiskHandleCount}}
-							</view>
-						</view>
-					</view>
-				</view>
-			</view>
-
-			<view class="total-content month" v-else>
-				<view class="time-tab flex align-center justify-between">
-					<view class="time-item time-show" @click="dayTimeClick(0)">
-						{{month}}
-					</view>
-
-					<view class="flex">
-						<view class="change-day" @tap="changeMonth(0)">
-							<xbutton>本月</xbutton>
-						</view>
-						<view class="change-day" @tap="changeMonth(-1)">
-							<xbutton>上一月</xbutton>
-						</view>
-						<view class="change-day" @tap="changeMonth(1)">
-							<xbutton>下一月</xbutton>
-						</view>
-					</view>
-				</view>
-
-				<u-datetime-picker :show="monthShow" mode="month" v-model="monthPicker" @confirm="monthConfirm"
-					:closeOnClickOverlay="true" @close="monthClose" @cancel="monthClose"></u-datetime-picker>
-
-				<view class="today-receive">
-					<view>本月总收益</view>
-					<view>
-						¥<view>{{$xy.delMoney(monthData.monthTotalRevenue)}}</view>
-					</view>
-				</view>
-
-				<view class="chart card">
-					<view class="chart-title">
-						日收益明细
-					</view>
-					<view class="chart-content">
-						<block v-for="(item,index) in monthData.revenueList" :key="item.date">
-							<view class="chart-item flex align-center" @click="detail(item.date)">
-								<view class="chart-time">
-									{{item.date}}
-								</view>
-								<view class="chart-bar-box flex justify-between align-center">
-									<view class="chart-bar" :style="{width:item.width}"></view>
-									<view class="chart-num">
-										¥{{$xy.delMoney(item.dayTotalRevenue)}}
-									</view>
-								</view>
-							</view>
-						</block>
-					</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		countByMonth,
-		countByDay
-	} from "@/api/order/order.js"
-
-	export default {
-		data() {
-			return {
-				tabList: [{
-						name: '今日统计'
-					},
-					{
-						name: '本月统计'
-					}
-				],
-				current: 0,
-
-				dayData: {
-					"dayTotalRevenue": 0,
-					"dayOrderRealMoney": 0,
-					"dayOrderTotalMoney": 0,
-					"dayOrderNum": 0,
-					"dayRefundMoney": 0,
-					"dayRefundNum": 0,
-					"dayPayFailedMoney": 0,
-					"dayPayFailedNum": 0,
-					"dayToBeConfirmedNum": 0,
-					"dayAbnormalOrderNum": 0,
-					"dayHisFillMoney": 0,
-					"dayHisFillNum": 0,
-					"dayHisRefundMoney": 0,
-					"dayHisRefundNum": 0,
-					"toDoRiskCount": 0,
-					"dayRiskHandleCount": 0,
-					"dayRiskAddCount": 0
-				},
-				monthData: {
-					"monthTotalRevenue": 0,
-					"revenueList": []
-				},
-				monthTimeCurrent: 0,
-				timeShow: false,
-				date: null,
-				datePicker: null,
-				dateDx: 0,
-
-				monthDx: 0,
-				month: null,
-				monthShow: false,
-				monthPicker: null,
-			}
-		},
-
-		onLoad(o) {
-			this.datePicker = new Date()
-			this.date = uni.$u.timeFormat(this.datePicker, 'yyyy-mm-dd')
-			this.month = uni.$u.timeFormat(this.datePicker, 'yyyy-mm')
-			this.tabList[0].name = `今日统计`
-			this.tabList[1].name = `本月统计`
-		},
-
-		onShow() {
-			this.getData()
-		},
-
-
-		methods: {
-			tabClick(e) {
-				this.current = e.index
-				this.getData()
-			},
-
-			getData() {
-				if (this.current == 0) {
-					this.getDayData()
-				} else {
-					this.getMonthData()
-				}
-			},
-
-			dayTimeClick(e) {
-				this.timeShow = true
-			},
-
-			confirm(e) {
-				this.date = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-				this.isToday()
-				this.getData()
-				this.timeShow = false;
-			},
-
-			close() {
-				this.timeShow = false
-			},
-
-			// 是否今日
-			isToday(day) {
-				let nowDate = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
-				if (this.date == nowDate) {
-					this.tabList[0].name = `今日统计`
-				} else {
-					this.tabList[0].name = `按日统计`
-				}
-			},
-
-			isNowMonth(month) {
-				let nowMonth = uni.$u.timeFormat(new Date(), 'yyyy-mm')
-				if (this.month == nowMonth) {
-					this.tabList[1].name = `本月统计`
-				} else {
-					this.tabList[1].name = `按月统计`
-				}
-			},
-
-			changeDay(add) {
-				if (add == 0) {
-					this.dateDx = 0;
-				} else {
-					//处理超过当前时间的情况
-					if (add > 0) { 
-						if (this.dateDx == 0) {
-							this.$modal.msg('别点了,没有数据啦~')
-							return
-						}
-					}
-					this.dateDx += add;
-				}
-
-				let date = new Date().getTime();
-				let newDate = date + this.dateDx * (24 * 60 * 60 * 1000);
-				this.date = uni.$u.timeFormat(newDate, 'yyyy-mm-dd')
-				this.isToday()
-				this.getData()
-			},
-
-			changeMonth(add) {
-				if (add == 0) {
-					this.monthDx = 0;
-				} else {
-					//处理超过当前时间的情况
-					if (add > 0) {
-						if (this.monthDx == 0) {
-							this.$modal.msg('别点了,没有数据啦~')
-							return
-						}
-					}
-					this.monthDx += add;
-				}
-
-				let today = new Date();
-				let month = new Date(today.getFullYear(), today.getMonth() + this.monthDx, today.getDate());
-				this.month = uni.$u.timeFormat(month, 'yyyy-mm')
-				this.isNowMonth()
-				this.getData()
-			},
-
-			monthTimeClick(e) {
-				this.monthTimeCurrent = e
-			},
-
-			getMonthData() {
-				countByMonth({
-					date: this.month + '-01'
-				}).then(res => {
-					let data = res.data;
-					let max = 0;
-					let revenueList = data.revenueList
-					for (let i = 0; i < revenueList.length; i++) {
-						let item = revenueList[i];
-						if (item.dayTotalRevenue > max) {
-							max = item.dayTotalRevenue
-						}
-					}
-					for (let i = 0; i < revenueList.length; i++) {
-						let item = revenueList[i];
-						if (item.dayTotalRevenue > 0) {
-							item.width = (item.dayTotalRevenue / (max / 0.78)) * 100 + '%'
-						} else {
-							item.width = '0%'
-						}
-					}
-					this.monthData = data
-					console.log(this.monthData)
-				})
-			},
-
-			getDayData() {
-				countByDay({
-					date: this.date
-				}).then(res => {
-					if (res.data) {
-						this.dayData = res.data
-					} else {
-						this.dayData = {
-							"dayTotalRevenue": 0,
-							"dayOrderRealMoney": 0,
-							"dayOrderTotalMoney": 0,
-							"dayOrderNum": 0,
-							"dayRefundMoney": 0,
-							"dayRefundNum": 0,
-							"dayPayFailedMoney": 0,
-							"dayPayFailedNum": 0,
-							"dayToBeConfirmedNum": 0,
-							"dayAbnormalOrderNum": 0,
-							"dayHisFillMoney": 0,
-							"dayHisFillNum": 0,
-							"dayHisRefundMoney": 0,
-							"dayHisRefundNum": 0,
-							"toDoRiskCount": 0,
-							"dayRiskHandleCount": 0,
-							"dayRiskAddCount": 0
-						}
-					}
-				})
-			},
-
-			detail(time) {
-				this.current = 0;
-				this.date = time;
-				this.tabList[0].name = `按日统计`
-				this.getData()
-			},
-
-			monthConfirm(e) {
-				this.month = uni.$u.timeFormat(e.value, 'yyyy-mm')
-				// this.isToday()
-				// this.getData()
-				this.monthShow = false;
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		min-height: 100vh;
-		background-color: #fff !important;
-
-		.content {
-			color: #333;
-
-			.tab-wrap {
-				background-color: #fff;
-
-				.tab {
-					width: 90%;
-					margin-left: -12rpx;
-				}
-			}
-
-			.time-tab {
-				margin-top: 24rpx;
-				padding: 0 13rpx;
-
-				.time-item {
-					padding: 0 64rpx;
-					height: 62rpx;
-					background: #F7F7F7;
-					border-radius: 10rpx;
-					font-size: 28rpx;
-					font-weight: 500;
-					color: #777777;
-					margin-right: 20rpx;
-					line-height: 62rpx;
-
-					&.time-show {
-						background: #F4F8FF;
-						color: #2C6FF3;
-					}
-				}
-
-				.change-day {
-					margin-left: 12rpx;
-				}
-			}
-
-			.total-content {
-
-				.today-receive {
-					width: 724rpx;
-					margin-left: 13rpx;
-					background: #2C6FF3;
-					box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-					border-radius: 14rpx;
-					color: #fff;
-					padding: 28rpx 18rpx;
-					margin-top: 20rpx;
-
-					>view:nth-child(1) {
-						font-size: 30rpx;
-						line-height: 30rpx;
-						font-weight: 500;
-					}
-
-					>view:nth-child(2) {
-						font-size: 32rpx;
-						line-height: 64rpx;
-						margin-top: 32rpx;
-						text-align: center;
-
-						>view {
-							font-size: 64rpx;
-							padding-left: 12rpx;
-							display: inline-block;
-							font-weight: bold;
-						}
-					}
-
-					>view:nth-child(3) {
-						font-size: 26rpx;
-						line-height: 26rpx;
-						font-weight: 500;
-						margin-top: 28rpx;
-						text-align: center;
-					}
-				}
-
-				.risk-order {
-					padding: 0 12rpx;
-
-					.risk-item {
-						width: 230rpx;
-						height: 120rpx;
-						background: #F1F6FF;
-						border-radius: 14rpx;
-						padding: 24rpx 10rpx 18rpx 12rpx;
-
-						.risk-name {
-							font-size: 26rpx;
-							padding-left: 16rpx;
-							position: relative;
-							line-height: 26rpx;
-
-
-							&::before {
-								content: '';
-								width: 6rpx;
-								height: 20rpx;
-								position: absolute;
-								left: 0;
-								top: 2rpx;
-								background-color: #2C6FF3;
-							}
-
-							&.risk-name2::before {
-								background-color: #FB360F;
-							}
-
-							&.risk-name3::before {
-								background-color: #5804E2;
-							}
-
-						}
-
-						.risk-num {
-							font-size: 32rpx;
-							text-align: center;
-							margin-top: 26rpx;
-							line-height: 32rpx;
-							font-weight: bold;
-						}
-
-						&.to-month {
-							width: 354rpx;
-							height: 149rpx;
-							background: #F1F6FF;
-							border-radius: 14rpx;
-
-							.risk-num {
-								font-size: 24rpx;
-								margin-top: 40rpx;
-								line-height: 32rpx;
-								text-align: left;
-								padding-left: 12rpx;
-
-								>text {
-									font-size: 32rpx;
-									font-weight: bold;
-								}
-							}
-						}
-					}
-				}
-
-				.card {
-					box-shadow: 0px 0px 10px 0px rgba(174, 201, 255, 0.2);
-					border-radius: 14rpx;
-				}
-
-				.sale-refund {
-					width: 724rpx;
-					background: #FFFFFF;
-					margin-left: 12rpx;
-					margin-top: 30rpx;
-					padding: 34rpx 34rpx 47rpx;
-
-					.sr-title {
-						font-size: 30rpx;
-						font-weight: 800;
-						line-height: 30rpx;
-						position: relative;
-						padding-left: 24rpx;
-
-						>image {
-							width: 14rpx;
-							height: 25rpx;
-							position: absolute;
-							left: 0;
-							top: 2rpx;
-						}
-					}
-
-					.sr-head {
-						color: #333;
-
-						>view:nth-child(1) {
-							font-size: 24rpx;
-							line-height: 44rpx;
-							margin-top: 43rpx;
-							font-weight: bold;
-							text-align: center;
-
-							>view {
-								font-size: 44rpx;
-								display: inline-block;
-								padding-left: 12rpx;
-							}
-						}
-
-						>view:nth-child(2) {
-							font-size: 26rpx;
-							line-height: 26rpx;
-							margin-top: 22rpx;
-							text-align: center;
-						}
-					}
-
-					.sr-content {
-						margin-top: 20rpx;
-
-						.sr-content-item {
-							width: 334rpx;
-							background: #F1F6FF;
-							border-radius: 14rpx;
-							padding: 24rpx 18rpx;
-
-							&.sr-content-right {
-								background-color: #FFF7F7;
-							}
-
-							&.sr-content-left1 {
-								background-color: #FFF7F7;
-								padding-bottom: 58rpx;
-							}
-
-							&.sr-content-right1 {
-								background-color: #F9F9F9;
-								padding-bottom: 58rpx;
-							}
-
-							.sc-top {
-								font-size: 28rpx;
-								line-height: 28rpx;
-								font-weight: 800;
-							}
-
-							.sc-bot {
-								.sc-item {
-									width: 228rpx;
-									text-align: center;
-									margin-top: 40rpx;
-
-									.sc-name {
-										font-size: 26rpx;
-										color: #555555;
-										line-height: 26rpx;
-										margin-top: 24rpx;
-									}
-
-									.sc-num {
-										font-size: 24rpx;
-										font-weight: 800;
-										line-height: 32rpx;
-
-										>text {
-											font-size: 32rpx;
-										}
-									}
-								}
-							}
-
-							.sc-val {
-								font-size: 32rpx;
-								line-height: 32rpx;
-								margin-top: 45rpx;
-								font-weight: 800;
-								color: #333333;
-								text-align: center;
-							}
-						}
-					}
-
-					.sr-total {
-						margin-top: 42rpx;
-
-						.sr-item {
-							width: 25%;
-							text-align: center;
-
-							.sr-name {
-								font-size: 26rpx;
-								color: #555555;
-								line-height: 26rpx;
-								margin-top: 24rpx;
-							}
-
-							.sr-num {
-								font-size: 24rpx;
-								font-weight: 800;
-								line-height: 32rpx;
-
-								>text {
-									font-size: 32rpx;
-								}
-							}
-						}
-					}
-				}
-
-				.sub-rec-ref {
-					width: 724rpx;
-					margin-left: 13rpx;
-					margin-top: 30rpx;
-
-					.card {
-						width: 354rpx;
-						padding: 26rpx 22rpx;
-
-						&.srr-rec {
-							background-color: #2C6FF3;
-							color: #fff;
-						}
-
-						.srr-title {
-							font-size: 30rpx;
-							line-height: 30rpx;
-						}
-
-						.srr-total {
-							margin-top: 36rpx;
-
-							.srr-item {
-								width: 182rpx;
-
-								.srr-name {
-									font-size: 26rpx;
-									line-height: 26rpx;
-								}
-
-								.srr-num {
-									font-size: 24rpx;
-									font-weight: 800;
-									line-height: 32rpx;
-									margin-top: 24rpx;
-
-									>text {
-										font-size: 32rpx;
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-
-			.month {
-				.chart {
-					width: 724rpx;
-					margin-left: 13rpx;
-					margin-top: 12rpx;
-					padding-bottom: 24rpx;
-
-					.chart-title {
-						font-size: 28rpx;
-						font-weight: 500;
-						color: #333333;
-						padding: 30rpx 25rpx 20rpx;
-					}
-
-					.chart-content {
-						padding: 0 15rpx;
-
-						.chart-item {
-							height: 54rpx;
-							margin-top: 10rpx;
-
-							.chart-time {
-								margin-right: 10rpx;
-								width: 190rpx;
-							}
-
-							.chart-bar-box {
-								background: #F6F6F6;
-								border-radius: 8rpx 27rpx 27rpx 8rpx;
-								width: 620rpx;
-
-								.chart-bar {
-									height: 54rpx;
-									border-radius: 8rpx 27rpx 27rpx 8rpx;
-									background-color: #98C0FC;
-									transition: all 1s linear;
-								}
-
-								.chart-num {
-									color: #df6b73;
-									margin-right: 12rpx;
-									font-size: 26rpx;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 121
pages/globalPages/notice.vue

@@ -1,121 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="通知"></u-navbar>
-		<view class="content">
-
-			<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100"
-				:style="{height:fullHeight}">
-				<view class="list" v-if="list&&list.length>0">
-					<block v-for="(item, index) in list" :key="index">
-						<view class="comm-main flex justify-between">
-							
-						</view>
-					</block>
-					<view class="more" style="overflow: hidden;">
-						<u-loadmore :status="status" v-if="list.length>=1" />
-					</view>
-				</view>
-				<view class="empty" v-if="list.length==0">
-					<u-empty mode="list" text="没有任何通知!"></u-empty>
-				</view>
-			</scroll-view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		list,
-		update
-	} from "@/api/system/employee.js"
-	export default {
-		data() {
-			return {
-				list: [], //列表
-				fullHeight: 0,
-			}
-		},
-
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-		},
-
-		methods: {
-			
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		overflow: hidden;
-
-		.content {
-
-			.list {
-				width: 100%;
-				padding: 0rpx 13rpx 12rpx;
-				padding-bottom: calc(110rpx + env(safe-area-inset-bottom) / 2);
-				overflow: hidden;
-
-				.comm-img {
-					width: 130rpx;
-					height: 130rpx;
-					display: flex;
-					flex-direction: row;
-					align-items: center;
-					justify-content: space-around;
-
-					image {
-						width: 130rpx;
-						height: 130rpx;
-					}
-				}
-
-				.comm-main {
-					padding: 20rpx 30rpx;
-					background-color: #fff;
-					border-radius: 12rpx;
-					margin-top: 12rpx;
-					box-sizing: border-box;
-					color: #999;
-					line-height: 60rpx;
-					position: relative;
-					
-					
-				}
-			}
-		}
-	}
-
-	.empty {
-		margin-top: 40%;
-	}
-</style>

+ 0 - 92
pages/globalPages/setting.vue

@@ -1,92 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar titleStyle="color:#333;fontSize:36rpx;" :autoBack="true" bgColor="#fff" :placeholder="true"
-			title="设置"></u-navbar>
-		<view class="content">
-			<u-cell-group :border="false">
-				<u-cell title="修改密码" :isLink="true" @click="pwdShow=true">
-				</u-cell>
-				<u-cell title="退出登录" :isLink="true" @click="loginOut">
-				</u-cell>
-			</u-cell-group>
-		</view>
-
-		<xpopup :show="pwdShow" @close="pwdClose" @confirm="pwdSubmit" :showBtn="true" title="修改密码">
-			<view class="pwd-popup-content flex align-center">
-				<view>新密码:</view>
-				<view>
-					<u--input placeholder="请输入新密码" type="password" border="surround" v-model="newpassword"></u--input>
-				</view>
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		updateUserInfo
-	} from "@/api/system/user.js"
-	export default {
-		data() {
-			return {
-				newpassword: '',
-				pwdShow: false,
-			}
-		},
-		methods: {
-			changePwd() {
-				this.pwdShow = true
-			},
-
-			pwdSubmit() {
-				if (this.newpassword) {
-					updateUserInfo({
-						password: this.newpassword
-					}).then(res => {
-						this.$modal.showToast('修改成功~')
-					})
-					this.pwdClose()
-				} else {
-					this.$modal.msg('请输入新密码!')
-				}
-			},
-			
-			pwdClose() {
-				this.pwdShow = false
-			},
-
-			loginOut() {
-				this.$store.dispatch('LogOut').then(res => {
-					this.$tab.reLaunch('/pages/login')
-				})
-			},
-		},
-	}
-</script>
-
-<style scoped lang="scss">
-	.container {
-
-		.content {
-			min-height: 100vh;
-			background-color: #fff;
-			padding:24rpx;
-
-			/deep/ .u-cell__body {
-				padding: 30rpx 6rpx;
-			}
-		}
-		
-		.pwd-popup-content {
-			padding: 24rpx;
-		
-			>view:nth-child(1) {
-				width: 160rpx;
-			}
-		
-			>view:nth-child(2) {
-				width: 100%;
-			}
-		}
-	}
-</style>

+ 0 - 804
pages/globalPages/statistics.vue

@@ -1,804 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="销售统计"></u-navbar>
-		<view class="content">
-			<view class="card">
-				<view class="select">
-					<view class="time-tab flex justify-between">
-						<block v-for="(item,index) in timeList" :key="item.id">
-							<view class="time-tab-item" :class="[timeTabCurrent==item.id?'time-tab-show':'']"
-								@click="timeTabClick(item.id)">
-								{{item.name}}
-							</view>
-						</block>
-					</view>
-					<view class="time-select flex justify-around">
-						<view class="flex  align-center">
-							<view @click="timePickerShow('start')">
-								{{timeStart?timeStart:'开始时间'}}
-							</view>
-							<view>
-								一
-							</view>
-							<view @click="timePickerShow('end')">
-								{{timeEnd?timeEnd:'结束时间'}}
-							</view>
-						</view>
-					</view>
-				</view>
-				<view class="total flex justify-around">
-					<view class="flex flex-direction align-center">
-						<view class="total-name">
-							总销售额(元)
-						</view>
-						<view class="total-num" style="color: #2C6FF3;">
-							{{$xy.delMoney(total.salesMoney)}}
-						</view>
-					</view>
-					<view class="flex flex-direction align-center">
-						<view class="total-name">
-							订单量(笔)
-						</view>
-						<view class="total-num" style="color: #F9B237;">
-							{{total.salesCount||0}}
-						</view>
-					</view>
-					<view class="flex flex-direction align-center">
-						<view class="total-name">
-							客单价(元)
-						</view>
-						<view class="total-num" v-if="total.salesCount>0" style="color: #E94F4F;">
-							{{($xy.delMoney(total.salesMoney)/total.salesCount).toFixed(2)||0}}
-						</view>
-						<view class="total-num" v-else style="color:#E94F4F;">
-							0
-						</view>
-					</view>
-				</view>
-
-				<view class="chart" style="height: 600rpx;">
-					<qiun-data-charts type="qy-line-gradual" :opts="opts" :chartData="chartData"
-						:errorMessage="errorMessage" />
-				</view>
-			</view>
-
-			<view class="device-table card">
-				<view class="table">
-					<view class="table-title flex justify-between align-center">
-						<view class="title">
-							设备销售排行
-						</view>
-						<view class="sort-type flex">
-							<view :class="[deviceSortType==0?'sort-type-item sort-type-show':'sort-type-item']"
-								@click="deviceSort(0)">
-								销售额
-							</view>
-							<view :class="[deviceSortType==1?'sort-type-item sort-type-show':'sort-type-item']"
-								@click="deviceSort(1)">
-								订单笔数
-							</view>
-						</view>
-					</view>
-					<uni-table :border="false" :stripe="false" emptyText="暂无更多数据">
-						<!-- 表头行 -->
-						<uni-tr>
-							<uni-th align="center" width="52">排名</uni-th>
-							<uni-th align="center" width="110">上榜设备</uni-th>
-							<uni-th align="center" width="92">销售额</uni-th>
-							<uni-th align="center" width="92">订单笔数</uni-th>
-						</uni-tr>
-						<!-- 表格数据行 -->
-						<uni-tr v-for="(item,index) in list1" :key="item.deviceId">
-							<uni-td v-if="index==0">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/first-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==1">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/second-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==2">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/third-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else>
-								<view class="table-td">
-									{{index+1}}
-								</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td table-td-name">{{item.deviceName||item.deviceId}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">¥{{$xy.delMoney(item.salesMoney)}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">{{item.salesCount}}笔</view>
-							</uni-td>
-						</uni-tr>
-					</uni-table>
-				</view>
-				<view class="more" @click="more('device')" v-if="list1.length==5">
-					查看更多<view><u-icon name="arrow-right" color="#2C6FF3"></u-icon></view>
-				</view>
-			</view>
-
-			<view class="goods-table card">
-				<view class="table">
-					<view class="table-title flex justify-between align-center">
-						<view class="title">
-							商品销售排行
-						</view>
-						<view class="sort-type flex">
-							<view :class="[goodsSortType==0?'sort-type-item sort-type-show':'sort-type-item']"
-								@click="goodsSort(0)">
-								销售额
-							</view>
-							<view :class="[goodsSortType==1?'sort-type-item sort-type-show':'sort-type-item']"
-								@click="goodsSort(1)">
-								销量
-							</view>
-						</view>
-					</view>
-					<uni-table :border="false" :stripe="false" emptyText="暂无更多数据">
-						<!-- 表头行 -->
-						<uni-tr>
-							<uni-th align="center" width="52">排名</uni-th>
-							<uni-th align="center" width="110">上榜商品</uni-th>
-							<uni-th align="center" width="92">销售额</uni-th>
-							<uni-th align="center" width="92">销量</uni-th>
-						</uni-tr>
-						<!-- 表格数据行 -->
-						<uni-tr v-for="(item,index) in list2" :key="item.goodsId">
-							<uni-td v-if="index==0">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/first-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==1">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/second-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==2">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/third-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else>
-								<view class="table-td">
-									{{index+1}}
-								</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td table-td-name">{{item.goodsName}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">¥{{$xy.delMoney(item.salesMoney)}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">{{item.goodsCount}}件</view>
-							</uni-td>
-						</uni-tr>
-					</uni-table>
-				</view>
-				<view class="more" @click="more('goods')" v-if="list2.length==5">
-					查看更多<view><u-icon name="arrow-right" color="#2C6FF3"></u-icon></view>
-				</view>
-			</view>
-		</view>
-
-		<u-datetime-picker :show="timeShow" :mode="timeMode" v-model="time" @confirm="confirm"
-			:closeOnClickOverlay="true" @close="close" @cancel="close"></u-datetime-picker>
-		<u-picker :show="pickerShow" :columns="columns" @confirm="pickerComfirm" :closeOnClickOverlay="true"
-			@close="pickerClose" @cancel="pickerClose"></u-picker>
-	</view>
-</template>
-
-<script>
-	import {
-		sumCount,
-		sumPage
-	} from "@/api/commodity/goods.js"
-
-	import {
-		sumCount as deviceSumCount,
-		sumPage as deviceSumPage,
-		salesData
-	} from "@/api/device/device.js"
-
-	export default {
-		data() {
-			return {
-				timeType: ['日', '月', '年'],
-				timeCurrent: 0,
-				timeStart: '',
-				timeEnd: '',
-				deviceSortType: 0,
-				goodsSortType: 0,
-				timeShow: false,
-				timeMode: 'date',
-				startOrEnd: '',
-				time: new Date(),
-				pickerType: 'year',
-
-				pickerShow: false,
-				// typeColumns: [
-				// 	['销售额从高到低', '销售额从低到高', '销售数量从高到低', '销售数量从低到高']
-				// ],
-
-				typeColumns: [
-					['销售额', '订单笔数']
-				],
-
-				page: 1, //商品分页
-				size: 10,
-
-				status: 'loadmore', //加载更多
-				list1: [], //设备列表
-				list2: [], //商品列表
-				fullHeight: 0,
-
-				total: {
-					goodsCount: 0,
-					salesMoney: 0
-				},
-
-
-				tabCurrent: 0,
-				timeList: [{
-						id: 0,
-						name: '昨天'
-					},
-					{
-						id: 1,
-						name: '今天'
-					},
-					{
-						id: 2,
-						name: '近7日'
-					},
-					{
-						id: 3,
-						name: '近30日'
-					},
-					{
-						id: 4,
-						name: '本月'
-					},
-				],
-				timeTabCurrent: 1,
-				title: '设备销售额排行',
-
-				opts: {
-					enableScroll: false,
-					legend: {
-						position: 'top',
-						float: 'right',
-						padding: 20,
-						itemGap: 20
-					},
-					xAxis: {
-						disableGrid: true,
-						labelCount: 6,
-					},
-					yAxis: {
-						gridType: "solid",
-						dashLength: 2,
-						showTitle: true,
-						axisLineColor: '#fff',
-						data: [{
-								position: "left",
-								title: "/元"
-							},
-							{
-								position: "right",
-								title: "/单",
-								textAlign: "left"
-							},
-						]
-					},
-					extra: {
-						area: {
-							type: "curve",
-							opacity: 0.2,
-							addLine: true,
-							width: 2,
-							gradient: true,
-							activeType: "hollow"
-						}
-					}
-				},
-
-				errorMessage: '无数据',
-				chartData: {
-					categories: [],
-					series: []
-				},
-			}
-		},
-
-		watch: {
-			// tabCurrent: {
-			// 	handler(newVal, oldVal) {
-			// 		if (newVal == 0) {
-			// 			this.title = '设备销售额排行'
-			// 		}
-			// 		if (newVal == 1) {
-			// 			this.title = '商品销售额排行'
-			// 		}
-
-			// 	},
-			// 	deep: true
-			// }
-		},
-
-		onShow() {
-			let timeObj = this.setResetTime(this.timeTabCurrent)
-			this.timeStart = timeObj.start
-			this.timeEnd = timeObj.end
-			this.getData()
-		},
-		methods: {
-			getData() {
-				this.getList1(this.deviceSortType)
-				this.getList2(this.goodsSortType)
-				this.getDeviceTotal(this.deviceSortType)
-				this.getCountData()
-			},
-
-			timeTabClick(e) {
-				this.timeTabCurrent = e
-				let timeObj = this.setResetTime(this.timeTabCurrent)
-				this.timeStart = timeObj.start
-				this.timeEnd = timeObj.end
-				this.getData()
-			},
-
-
-			setResetTime(type) {
-				let date = new Date()
-				let time = {
-					start: uni.$u.timeFormat(date, 'yyyy-mm-dd'),
-					end: uni.$u.timeFormat(date, 'yyyy-mm-dd')
-				}
-				switch (type) {
-					case 0: //昨天
-						time = {
-							start: uni.$u.timeFormat(date - 24 * 60 * 60 * 1000, 'yyyy-mm-dd'),
-							end: uni.$u.timeFormat(date - 24 * 60 * 60 * 1000, 'yyyy-mm-dd')
-						}
-						break;
-					case 1: //今天
-						time = {
-							start: uni.$u.timeFormat(date, 'yyyy-mm-dd'),
-							end: uni.$u.timeFormat(date, 'yyyy-mm-dd')
-						}
-						break;
-					case 2: //近7日
-						time = {
-							start: uni.$u.timeFormat(date - 7 * 24 * 60 * 60 * 1000, 'yyyy-mm-dd'),
-							end: uni.$u.timeFormat(date, 'yyyy-mm-dd')
-						}
-						break;
-					case 3: //近30日
-						time = {
-							start: uni.$u.timeFrom(date - 30 * 24 * 60 * 60 * 1000, 'yyyy-mm-dd'),
-							end: uni.$u.timeFrom(date, 'yyyy-mm-dd')
-						}
-						break;
-					case 4: //本月
-						let start = uni.$u.timeFrom(date, 'yyyy-mm-dd')
-						time = {
-							start: start.substr(0, 8) + '01',
-							end: uni.$u.timeFrom(date, 'yyyy-mm-dd')
-						}
-						break;
-					default:
-						break;
-				}
-				return time
-			},
-
-			timePickerShow(type) {
-				this.pickerType = 'year';
-				this.startOrEnd = type
-				if (this.timeCurrent == 2) {
-					this.columns = yearList
-					this.pickerShow = true
-				} else {
-					this.timeShow = true;
-				}
-			},
-
-			deviceSort(type) {
-				this.deviceSortType = type
-				this.getList1(type)
-			},
-
-			goodsSort(type) {
-				this.goodsSortType = type
-				this.getList2(type)
-			},
-
-			close() {
-				this.timeShow = false
-			},
-
-			confirm(e) {
-				let time = '';
-				time = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-
-				if (this.startOrEnd == 'start') {
-					this.timeStart = time
-				}
-				if (this.startOrEnd == 'end') {
-					this.timeEnd = time
-				}
-				this.getData()
-				this.timeShow = false;
-			},
-
-			pickerClose() {
-				this.pickerShow = false
-			},
-
-			//获取统计数据
-			getCountData(type) {
-				salesData({
-					type: "day",
-					beginDate: this.timeStart,
-					endDate: this.timeEnd
-				}).then(res => {
-					let data = res.data;
-					let tempChartData = {};
-					this.delData(data);
-					tempChartData.series = data.series ? data.series : [];
-					tempChartData.categories = data.categories ? data.categories : [];
-					this.chartData = JSON.parse(JSON.stringify(tempChartData));
-				}).catch(err => {
-
-				})
-			},
-
-			// 处理统计图表数据
-			delData(data) {
-				let arr = data.categories.map(item => {
-					if (item.length < 3) {
-						item = item + '点'
-					} else {
-						item = item.substr(4, 2) + '月' + item.substr(6, 2) + '日'
-					}
-					return item
-				})
-
-				data.categories = arr
-			},
-
-			getParams(type) {
-				let orderByKey = "";
-				let orderBy = "";
-				switch (type) {
-					case '销售额':
-						orderBy = 'desc';
-						orderByKey = 'sales_money';
-						break;
-					case '订单笔数':
-						orderBy = 'desc';
-						orderByKey = 'sales_count';
-						break;
-					case '销量':
-						orderBy = 'desc';
-						orderByKey = 'goods_count';
-						break;
-					default:
-						break;
-				}
-
-				let params = {
-					type: 'day',
-					orderByKey: orderByKey,
-					orderBy: orderBy,
-					beginDate: this.timeStart,
-					endDate: this.timeEnd
-				}
-				return params
-			},
-
-			//商品统计总数居
-			getGoodsTotal() {
-				let params = this.getParams()
-				sumCount(params).then(res => {
-					this.total = res.data
-				})
-			},
-
-			//设备统计总数居
-			getDeviceTotal(type) {
-				let params = this.getParams(type)
-				deviceSumCount(params).then(res => {
-					this.total = res.data
-				})
-			},
-
-			//获取设备排行
-			getList1(e) {
-				let type = e == 0 ? '销售额' : '订单笔数';
-				let dataParams = this.getParams(type)
-				let pageParams = {
-					page: {
-						current: 1,
-						size: 5
-					}
-				}
-				let params = Object.assign(dataParams, pageParams)
-				deviceSumPage(params).then(res => {
-					if (res.data) {
-						this.list1 = res.data.records;
-					} else {
-						this.list1 = []
-					}
-				})
-			},
-
-			//获取商品排行
-			getList2(e) {
-				let type = e == 0 ? '销售额' : '销量';
-				let dataParams = this.getParams(type)
-				let pageParams = {
-					page: {
-						current: 1,
-						size: 5
-					}
-				}
-				let params = Object.assign(dataParams, pageParams)
-				sumPage(params).then(res => {
-					if (res.data) {
-						this.list2 = res.data.records;
-					} else {
-						this.list2 = []
-					}
-				})
-			},
-
-			more(type) {
-				let sortType = type == 'device' ? this.deviceSortType : this.goodsSortType
-				this.$tab.navigateTo(
-					`/pages/globalPages/statisticsMore?type=${type}&&timeStart=${this.timeStart}&&timeEnd=${this.timeEnd}&&sortType=${sortType}`
-				)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			padding-bottom: 24rpx;
-
-			.card {
-				width: 724rpx;
-				margin-left: 13rpx;
-				background-color: #fff;
-				margin-top: 20rpx;
-				box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-				border-radius: 14rpx;
-			}
-
-			.tab {
-				padding: 24rpx;
-				// background-color: #fff;
-			}
-
-			.select {
-				padding-top: 34rpx;
-
-				.time-tab {
-					padding: 0 36rpx;
-
-					.time-tab-item {
-						width: 20%;
-						border: 1rpx solid #CCCCCC;
-						border-left: none;
-						text-align: center;
-						font-size: 26rpx;
-						line-height: 58rpx;
-						color: #777777;
-
-						&:first-of-type {
-							border-left: 1rpx solid #CCCCCC;
-							border-radius: 6rpx 0px 0px 6rpx;
-						}
-
-						&:last-of-type {
-							border-radius: 0px 6rpx 6rpx 0px;
-						}
-
-						&.time-tab-show {
-							background: #F4F8FF;
-							color: #2C6FF3;
-						}
-					}
-				}
-
-				.time-select {
-					padding: 34rpx 36rpx;
-					color: rgb(144, 144, 144);
-					font-size: 28rpx;
-
-					>view {
-						>view:nth-child(1) {
-							width: 160rpx;
-							text-align: right;
-						}
-
-						>view:nth-child(2) {
-							width: 80rpx;
-							padding: 0 24rpx;
-						}
-					}
-				}
-			}
-
-			.total {
-				padding: 12rpx 0;
-				background-color: #fff;
-
-				.total-name {
-					color: #333;
-					font-size: 28rpx;
-					line-height: 28rpx;
-					margin-top: 48rpx;
-				}
-
-				.total-num {
-					color: #eab09a;
-					font-size: 42rpx;
-					font-weight: bold;
-					line-height: 41rpx;
-					margin-top: 24rpx;
-				}
-			}
-
-			.search {
-				padding: 24rpx 24rpx;
-				background-color: #fff;
-				position: relative;
-				font-size: 26rpx;
-
-				.time-type {
-					width: 180rpx;
-				}
-
-				.time-select {
-					width: 340rpx;
-					line-height: 64rpx;
-					background-color: #eeeeef;
-					border-radius: 6rpx;
-				}
-
-
-			}
-
-			.chart {
-				background-color: #fff;
-			}
-
-			.table {
-				width: 724rpx;
-				background-color: #fff;
-				margin-top: 18rpx;
-				color: #333;
-
-				.table-title {
-					font-size: 32rpx;
-					line-height: 50rpx;
-					padding: 24rpx;
-					font-weight: 800;
-					color: #333333;
-					border-bottom: 1rpx solid #ebeef5;
-				}
-
-				.table-td {
-					width: 100%;
-					text-align: center;
-
-
-					&.table-td-name {
-						width: 230rpx;
-						white-space: wrap;
-					}
-				}
-
-				.table-img {
-					width: 40rpx;
-					height: 40rpx;
-					position: relative;
-				}
-
-				.sort-type {
-					width: 250rpx;
-					height: 50rpx;
-					line-height: 48rpx;
-					text-align: center;
-					font-weight: normal;
-
-					.sort-type-item {
-						width: 50%;
-						font-size: 26rpx;
-						color: #555555;
-						background-color: #fff;
-
-						&.sort-type-item:nth-child(1) {
-							border-top-left-radius: 6rpx;
-							border-bottom-left-radius: 6rpx;
-							border-top: 1rpx solid #CCCCCC;
-							border-left: 1rpx solid #CCCCCC;
-							border-bottom: 1rpx solid #CCCCCC;
-
-							&.sort-type-show {
-								color: #fff;
-								border-top: 1rpx solid #2C6FF3;
-								border-left: 1rpx solid #2C6FF3;
-								border-bottom: 1rpx solid #2C6FF3;
-								background-color: #2C6FF3;
-							}
-						}
-
-						&.sort-type-item:nth-child(2) {
-							border-top-right-radius: 6rpx;
-							border-bottom-right-radius: 6rpx;
-							border-top: 1rpx solid #CCCCCC;
-							border-right: 1rpx solid #CCCCCC;
-							border-bottom: 1rpx solid #CCCCCC;
-
-							&.sort-type-show {
-								color: #fff;
-								border-top: 1rpx solid #2C6FF3;
-								border-right: 1rpx solid #2C6FF3;
-								border-bottom: 1rpx solid #2C6FF3;
-								background-color: #2C6FF3;
-							}
-						}
-					}
-
-				}
-
-				/deep/.uni-table-th {
-					color: #333;
-					font-weight: normal;
-				}
-
-				/deep/.uni-table-td {
-					vertical-align: middle;
-				}
-			}
-
-			.more {
-				text-align: right;
-				padding-right: 40rpx;
-				position: relative;
-				color: #2C6FF3;
-				line-height: 80rpx;
-				background-color: #fff;
-
-				>view {
-					position: absolute;
-					right: 12rpx;
-					top: 50%;
-					transform: translateY(-50%);
-				}
-			}
-		}
-	}
-</style>

+ 0 - 457
pages/globalPages/statisticsMore.vue

@@ -1,457 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="销售统计"></u-navbar>
-		<view class="content">
-			<view class="device-table" v-if="type=='device'">
-				<view class="table">
-					<view class="table-title flex justify-between align-center">
-						<view class="title">
-							设备销售排行
-						</view>
-						<view class="sort-type flex">
-							<view :class="[deviceSortType==0?'sort-type-item sort-type-show':'sort-type-item']"  @click="deviceSort(0)">
-								销售额
-							</view>
-							<view :class="[deviceSortType==1?'sort-type-item sort-type-show':'sort-type-item']"  @click="deviceSort(1)">
-								订单笔数
-							</view>
-						</view>
-					</view>
-					<uni-table :border="false" :stripe="false" emptyText="暂无更多数据">
-						<!-- 表头行 -->
-						<uni-tr>
-							<uni-th align="center" width="52">排名</uni-th>
-							<uni-th align="center" width="110">上榜设备</uni-th>
-							<uni-th align="center" width="92">销售额</uni-th>
-							<uni-th align="center" width="96">订单笔数</uni-th>
-						</uni-tr>
-						<!-- 表格数据行 -->
-						<uni-tr v-for="(item,index) in list1" :key="item.deviceId">
-							<uni-td v-if="index==0">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/first-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==1">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/second-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==2">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/third-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else>
-								<view class="table-td">
-									{{index+1}}
-								</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td table-td-name">{{item.deviceName||item.deviceId}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">¥{{$xy.delMoney(item.salesMoney)}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">{{item.salesCount}}笔</view>
-							</uni-td>
-						</uni-tr>
-					</uni-table>
-				</view>
-			</view>
-			
-			<view class="goods-table" v-else>
-				<view class="table">
-					<view class="table-title flex justify-between align-center">
-						<view class="title">
-							商品销售排行
-						</view>
-						<view class="sort-type flex">
-							<view :class="[goodsSortType==0?'sort-type-item sort-type-show':'sort-type-item']"  @click="goodsSort(0)">
-								销售额
-							</view>
-							<view :class="[goodsSortType==1?'sort-type-item sort-type-show':'sort-type-item']"  @click="goodsSort(1)">
-								销量
-							</view>
-						</view>
-					</view>
-					<uni-table :border="false" :stripe="false" emptyText="暂无更多数据">
-						<!-- 表头行 -->
-						<uni-tr>
-							<uni-th align="center" width="52">排名</uni-th>
-							<uni-th align="center" width="110">上榜商品</uni-th>
-							<uni-th align="center" width="92">销售额</uni-th>
-							<uni-th align="center" width="92">销量</uni-th>
-						</uni-tr>
-						<!-- 表格数据行 -->
-						<uni-tr v-for="(item,index) in list2" :key="item.goodsId">
-							<uni-td v-if="index==0">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/first-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==1">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/second-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else-if="index==2">
-								<view class="table-td">
-									<image class="table-img" src="../../static/images/global/third-class.png"
-										mode="widthFix"></image>
-								</view>
-							</uni-td>
-							<uni-td v-else>
-								<view class="table-td">
-									{{index+1}}
-								</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td table-td-name">{{item.goodsName}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">¥{{$xy.delMoney(item.salesMoney)}}</view>
-							</uni-td>
-							<uni-td>
-								<view class="table-td">{{item.goodsCount}}件</view>
-							</uni-td>
-						</uni-tr>
-					</uni-table>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		sumPage
-	} from "@/api/commodity/goods.js"
-
-	import {
-		sumPage as deviceSumPage
-	} from "@/api/device/device.js"
-
-	export default {
-		data() {
-			return {
-				timeStart: '',
-				timeEnd: '',
-
-				typeColumns: [
-					['销售额', '订单笔数']
-				],
-				status: 'loadmore', //加载更多
-				list1: [], //设备列表
-				list2: [], //商品列表
-				type:'device',
-				deviceSortType: 0,
-				goodsSortType: 0,
-			}
-		},
-
-		onLoad(o) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".list").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						_this.fullHeight = 2 * (res.windowHeight - data.top - 24) + 'rpx';
-					},
-				});
-			}).exec();
-			this.type=o.type
-			this.timeStart=o.timeStart
-			this.timeEnd=o.timeEnd
-			if(this.type=='device'){
-				this.deviceSortType=o.sortType
-			}else{
-				this.goodsSortType=o.sortType
-			}
-		},
-
-		onShow() {
-			this.getData()
-		},
-
-
-
-		methods: {
-			getData() {
-				if(this.type=='device'){
-					this.getList1(this.deviceSortType)
-				}else{
-					this.getList2(this.goodsSortType)
-				}
-			},
-
-			deviceSort(type){
-				this.deviceSortType=type
-				this.getList1(type)
-			},
-			
-			goodsSort(type){
-				this.goodsSortType=type
-				this.getList2(type)
-			},
-
-			getParams(type) {
-				let orderByKey = "";
-				let orderBy = "";
-				switch (type) {
-					case '销售额':
-						orderBy = 'desc';
-						orderByKey = 'sales_money';
-						break;
-					case '订单笔数':
-						orderBy = 'desc';
-						orderByKey = 'sales_count';
-						break;
-					case '销量':
-						orderBy = 'desc';
-						orderByKey = 'goods_count';
-						break;
-					default:
-						break;
-				}
-
-				let params = {
-					type: 'day',
-					orderByKey: orderByKey,
-					orderBy: orderBy,
-					beginDate: this.timeStart,
-					endDate: this.timeEnd
-				}
-				return params
-			},
-
-			//获取设备排行
-			getList1(e) {
-				let type=e==0?'销售额':'订单笔数';
-				let dataParams = this.getParams(type)
-				let pageParams = {
-					page: {
-						current: 1,
-						size: 1000
-					}
-				}
-				let params = Object.assign(dataParams, pageParams)
-				deviceSumPage(params).then(res => {
-					if (res.data) {
-						this.list1 = res.data.records;
-					} else {
-						this.list1 = []
-					}
-				})
-			},
-
-			//获取商品排行
-			getList2(e) {
-				let type=e==0?'销售额':'销量';
-				let dataParams = this.getParams(type)
-				let pageParams = {
-					page: {
-						current: 1,
-						size: 1000
-					}
-				}
-				let params = Object.assign(dataParams, pageParams)
-				sumPage(params).then(res => {
-					if (res.data) {
-						this.list2 = res.data.records;
-					} else {
-						this.list2 = []
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			.select {
-				.time-tab {
-					padding: 0 36rpx;
-
-					.time-tab-item {
-						padding: 0 24rpx;
-						background-color: #fff;
-						border: 1rpx solid #e0b4a2;
-						text-align: center;
-						line-height: 50rpx;
-						color: #e0b4a2;
-						border-radius: 40rpx;
-
-						&.time-tab-show {
-							background-color: #eab09a;
-							color: #d98a6d;
-						}
-					}
-				}
-
-				.time-select {
-					padding: 24rpx 36rpx;
-					color: rgb(144, 144, 144);
-					font-size: 28rpx;
-
-					>view:nth-child(2) {
-						width: 160rpx;
-						text-align: right;
-					}
-
-					>view:nth-child(3) {
-						width: 80rpx;
-						padding: 0 24rpx;
-					}
-				}
-			}
-
-			.total {
-				padding: 12rpx 0;
-				background-color: #fff;
-
-				.total-name {
-					color: #333;
-					font-size: 28rpx;
-					line-height: 50rpx;
-				}
-
-				.total-num {
-					color: #eab09a;
-					font-size: 32rpx;
-					font-weight: bold;
-					line-height: 50rpx;
-				}
-			}
-
-			.search {
-				padding: 24rpx 24rpx;
-				background-color: #fff;
-				position: relative;
-				font-size: 26rpx;
-
-				.time-type {
-					width: 180rpx;
-				}
-
-				.time-select {
-					width: 340rpx;
-					line-height: 64rpx;
-					background-color: #eeeeef;
-					border-radius: 6rpx;
-				}
-
-
-			}
-
-			.table {
-				width: 100%;
-				background-color: #fff;
-				color:#333;
-
-				.table-title {
-					line-height: 50rpx;
-					padding: 24rpx;
-					border-bottom: 1rpx solid #ebeef5;
-				}
-
-				.table-td {
-					width: 100%;
-					text-align: center;
-					
-					&.table-td-name{
-						width:270rpx;
-						white-space: wrap;
-					}
-				}
-
-				.table-img {
-					width: 40rpx;
-					height: 40rpx;
-					position: relative;
-				}
-
-				.sort-type {
-					width: 250rpx;
-					height: 50rpx;
-					line-height: 48rpx;
-					text-align: center;
-					font-weight: normal;
-				
-					.sort-type-item {
-						width: 50%;
-						font-size: 26rpx;
-						color: #555555;
-						background-color: #fff;
-				
-						&.sort-type-item:nth-child(1) {
-							border-top-left-radius: 6rpx;
-							border-bottom-left-radius: 6rpx;
-							border-top: 1rpx solid #CCCCCC;
-							border-left: 1rpx solid #CCCCCC;
-							border-bottom: 1rpx solid #CCCCCC;
-				
-							&.sort-type-show {
-								color: #fff;
-								border-top: 1rpx solid #2C6FF3;
-								border-left: 1rpx solid #2C6FF3;
-								border-bottom: 1rpx solid #2C6FF3;
-								background-color: #2C6FF3;
-							}
-						}
-				
-						&.sort-type-item:nth-child(2) {
-							border-top-right-radius: 6rpx;
-							border-bottom-right-radius: 6rpx;
-							border-top: 1rpx solid #CCCCCC;
-							border-right: 1rpx solid #CCCCCC;
-							border-bottom: 1rpx solid #CCCCCC;
-				
-							&.sort-type-show {
-								color: #fff;
-								border-top: 1rpx solid #2C6FF3;
-								border-right: 1rpx solid #2C6FF3;
-								border-bottom: 1rpx solid #2C6FF3;
-								background-color: #2C6FF3;
-							}
-						}
-					}
-				
-				}
-				
-				/deep/.uni-table-th {
-					color: #333;
-					font-weight: normal;
-				}
-				
-				/deep/.uni-table-td{
-					vertical-align: middle;
-				}
-			}
-			
-			.more{
-				text-align: right;
-				padding-right: 40rpx;
-				position: relative;
-				color:#333;
-				line-height: 80rpx;
-				background-color: #fff;
-				>view{
-					position: absolute;
-					right:12rpx;
-					top:50%;
-					transform: translateY(-50%);
-				}
-			}
-		}
-	}
-</style>

+ 0 - 41
pages/globalPages/test.vue

@@ -1,41 +0,0 @@
-<template>
-	<view class="container">
-		<button style="margin-top: 40%;" @click="downLoad">下载测试</button>
-	</view>
-</template>
-
-<script>
-	import {
-		exportQrCode
-	} from '@/api/download.js'
-	import config from '@/config'
-	export default {
-		data() {
-			return {
-				logs: []
-			}
-		},
-		onLoad(o) {
-
-		},
-		methods: {
-			downLoad() {
-				exportQrCode({
-					"isWhere": false,
-					"deviceIds": [2305000127]
-				}).then(res => {
-					console.log(res)
-				})
-			}
-		},
-	}
-</script>
-
-<style scoped lang="scss">
-	.container {
-		padding: 24rpx;
-		line-height: 50rpx;
-
-
-	}
-</style>

+ 0 - 291
pages/login.vue

@@ -1,291 +0,0 @@
-<!-- 蓝色登录页面2 -->
-<template>
-	<view style="height:100vh;background: #fff;">
-		<view class="img-a">
-			<view class="t-b">
-				您好,
-				<br />
-				欢迎使用,喵星人智能货柜管理平台
-			</view>
-		</view>
-		<view class="login-view" style="">
-			<view class="t-login">
-				<form class="cl">
-					<view class="t-a">
-						<text class="txt">手机号</text>
-						<input placeholder="请输入账号" v-model="loginForm.username" name="input" />
-					</view>
-					<view class="t-a">
-						<text class="txt">密码</text>
-						<input v-model="loginForm.password" type="password" placeholder="请输入密码" name="input"></input>
-					</view>
-
-					<view class="remember">
-						<u-checkbox-group v-model="isRemember" @change="remember">
-							<u-checkbox size="16" labelSize="12" labelColor="#666" name="1" label="记住密码"></u-checkbox>
-						</u-checkbox-group>
-					</view>
-
-					<button @click="handleLogin">登 录</button>
-					<!-- <view class="reg" @tap="reg()">注 册</view> -->
-				</form>
-				<!-- <view class="t-f"><text>—————— 第三方账号登录 ——————</text></view>
-				<view class="t-e cl">
-					<view class="t-g" @tap="wxLogin()">
-						<image src="https://zhoukaiwen.com/img/loginImg/wx.png"></image>
-					</view>
-					<view class="t-g" @tap="zfbLogin()">
-						<image src="https://zhoukaiwen.com/img/loginImg/qq.png"></image>
-					</view>
-				</view> -->
-			</view>
-		</view>
-	</view>
-</template>
-<script>
-	import {
-		sysList
-	} from '@/api/system/menu.js'
-	export default {
-		data() {
-			return {
-				loginForm: {
-					username: "",
-					password: "",
-					code: "",
-					uuid: ''
-				},
-				isRemember: []
-			};
-		},
-		onLoad() {
-			if (uni.getStorageSync('account')) {
-				this.isRemember = ['1']
-				let account = JSON.parse(uni.getStorageSync('account'))
-				this.loginForm.username = account.username
-				this.loginForm.password = account.password
-			}
-		},
-		methods: {
-			remember(e) {
-				this.isRemember = e
-			},
-
-			// 登录方法
-			async handleLogin() {
-				if (!this.loginForm.username) {
-					this.$modal.msg('请输入账号~')
-					return
-				}
-				if (!this.loginForm.password) {
-					this.$modal.msg('请输入密码~')
-					return
-				}
-				this.pwdLogin()
-			},
-
-			// 密码登录
-			async pwdLogin(params) {
-				await this.$store.dispatch('Login', this.loginForm).then(() => {
-					if (this.isRemember.length > 0 && this.isRemember[0]) { //记住密码
-						let account = {
-							username: this.loginForm.username,
-							password: this.loginForm.password
-						}
-						uni.setStorageSync('account', JSON.stringify(account))
-					} else {
-						uni.setStorageSync('account', '')
-					}
-				})
-
-				await this.getSysId()
-
-				await this.$store.dispatch('GetPermis')
-				//判断用户是否有任一菜单权限
-
-				if (this.$store.state.permission.permissions_menu && this.$store.state.permission.permissions_menu !=
-					'[]') {
-					this.$tab.reLaunch('/pages/globalPages/home')
-				} else {
-					this.$modal.msg('该用户无权限~')
-				}
-
-			},
-
-			// 获取系统id
-			getSysId() {
-				return new Promise((resolve, reject) => {
-					sysList({}).then(res => {
-						let data = res.data;
-						let sysId = 381638941857029; //默认系统id
-						for (var i = 0; i < data.length; i++) {
-							let item = data[i];
-							if (item.code == 'xy_merc_mini') {
-								sysId = item.id
-								console.log('系统id:', sysId)
-							}
-						}
-						uni.setStorageSync('sysId', sysId)
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			//注册按钮点击
-			reg() {
-				// uni.showToast({ title: '注册跳转', icon: 'none' });
-			},
-			//等三方微信登录
-			wxLogin() {
-				// uni.showToast({ title: '微信登录', icon: 'none' });
-			},
-			//第三方支付宝登录
-			zfbLogin() {
-				// uni.showToast({ title: '支付宝登录', icon: 'none' });
-			}
-		}
-	};
-</script>
-<style>
-	.txt {
-		font-size: 32rpx;
-		font-weight: bold;
-		color: #333333;
-	}
-
-	.img-a {
-		width: 100%;
-		height: 450rpx;
-		background-image: url(https://cdn.ossfile.mxrvending.com/assets/xy_mana_mini/images/global/opendoor-manage-mini.png);
-		background-size: 100%;
-	}
-
-	.reg {
-		font-size: 28rpx;
-		color: #fff;
-		height: 90rpx;
-		line-height: 90rpx;
-		border-radius: 50rpx;
-		font-weight: bold;
-		background: #f5f6fa;
-		color: #000000;
-		text-align: center;
-		margin-top: 30rpx;
-	}
-
-	.login-view {
-		width: 100%;
-		position: relative;
-		margin-top: -120rpx;
-		background-color: #ffffff;
-		border-radius: 8% 8% 0% 0;
-	}
-
-	.t-login {
-		width: 600rpx;
-		margin: 0 auto;
-		font-size: 28rpx;
-		padding-top: 80rpx;
-	}
-
-	.t-login button {
-		font-size: 28rpx;
-		background: #2796f2;
-		color: #fff;
-		height: 90rpx;
-		line-height: 90rpx;
-		border-radius: 50rpx;
-		font-weight: bold;
-	}
-
-	.t-login input {
-		height: 90rpx;
-		line-height: 90rpx;
-		margin-bottom: 50rpx;
-		border-bottom: 1px solid #e9e9e9;
-		font-size: 28rpx;
-	}
-
-	.t-login .t-a {
-		position: relative;
-	}
-
-	.t-b {
-		text-align: left;
-		font-size: 42rpx;
-		color: #ffffff;
-		padding: 130rpx 0 0 70rpx;
-		font-weight: bold;
-		line-height: 70rpx;
-	}
-
-	.t-login .t-c {
-		position: absolute;
-		right: 22rpx;
-		top: 22rpx;
-		background: #5677fc;
-		color: #fff;
-		font-size: 24rpx;
-		border-radius: 50rpx;
-		height: 50rpx;
-		line-height: 50rpx;
-		padding: 0 25rpx;
-	}
-
-	.t-login .t-d {
-		text-align: center;
-		color: #999;
-		margin: 80rpx 0;
-	}
-
-	.t-login .t-e {
-		text-align: center;
-		width: 250rpx;
-		margin: 80rpx auto 0;
-	}
-
-	.t-login .t-g {
-		float: left;
-		width: 50%;
-	}
-
-	.t-login .t-e image {
-		width: 50rpx;
-		height: 50rpx;
-	}
-
-	.t-login .t-f {
-		text-align: center;
-		margin: 150rpx 0 0 0;
-		color: #666;
-	}
-
-	.t-login .t-f text {
-		margin-left: 20rpx;
-		color: #aaaaaa;
-		font-size: 27rpx;
-	}
-
-	.t-login .uni-input-placeholder {
-		color: #aeaeae;
-	}
-
-	.cl {
-		zoom: 1;
-	}
-
-	.cl:after {
-		clear: both;
-		display: block;
-		visibility: hidden;
-		height: 0;
-		content: '\20';
-	}
-	
-	.remember {
-		margin-top: 24rpx;
-		margin-bottom: 40rpx;
-	}
-</style>

+ 0 - 100
pages/order/components/xvideo.vue

@@ -1,100 +0,0 @@
-<template>
-	<view class="video_content">
-		<view v-if="show" class="popup_content">
-			<view class="flex">
-				<video id="myVideo" :src="videoUrl" style="width:100%;height: 372rpx; margin: 10rpx 10rpx;"></video>
-			</view>
-			<view class="flex" style="margin-top: 10rpx;" v-if="showBtn">
-				<view>
-					<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' bgColor='#2C6FF3' @tap="playVideo(0)">主视频
-					</xbutton>
-				</view>
-				<view style="margin-left: 24rpx;">
-					<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' bgColor='#2C6FF3' @tap="playVideo(1)">副视频
-					</xbutton>
-				</view>
-			</view>
-		</view>
-		<view class="popup_overlay" v-if="show" @click="closeVideoView()"></view>
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				show: false,
-				videoUrl: null,
-			}
-		},
-		props: {
-			showBtn: {
-				type: Boolean,
-				require: true,
-				default: false
-			},
-			list: {
-				type: [Array,String],
-				require: true,
-				default () {
-					return ''
-				}
-			},
-		},
-		
-		watch:{
-			 list:{
-				handler(newVal,oldVal){
-					if(newVal!=null){
-						if(typeof(newVal)=='object'){
-							this.videoUrl=newVal[0]
-						}else{
-							this.videoUrl=newVal
-						}
-					}
-				},
-				deep:true,
-				immediate:true
-			}
-		},
-
-		methods: {
-			closeVideoView() {
-				this.show = false
-			},
-			
-			playVideo(type){
-				this.videoUrl=this.list[type]
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.popup_content {
-		position: fixed;
-		top: 50%;
-		left: 50%;
-		width: 700rpx;
-		height: 500rpx;
-		margin-left: -350rpx;
-		margin-top: -250rpx;
-		border: 10px solid white;
-		background-color: white;
-		z-index: 1002;
-		overflow: auto;
-	}
-	
-	.popup_overlay {
-		position: fixed;
-		top: 0%;
-		left: 0%;
-		width: 100%;
-		height: 100%;
-		background-color: black;
-		z-index: 1001;
-		-moz-opacity: 0.8;
-		opacity: .80;
-		filter: alpha(opacity=88);
-	}
-</style>

+ 0 - 432
pages/order/orderDel.vue

@@ -1,432 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="手动扣款"></u-navbar>
-		<view class="video-container">
-			<video :src="videoUrl" style="width: 100%;"></video>
-			<view class="flex align-center justify-between" style="padding:0 24rpx;">
-				<view class="video-tab">
-					<u-subsection :list="videoType" activeColor="#2C6FF3" :current="videoCurrent"
-						@change="sectionChange">
-					</u-subsection>
-				</view>
-				<view class="flex">
-					<view>
-						<xbutton size="mini" padding="0 20rpx" @tap='addCom(deviceId)'>添加商品</xbutton>
-					</view>
-					<view style="margin-left: 24rpx;">
-						<xbutton size="mini" width='180rpx' @tap='submit'>提交补扣申请</xbutton>
-					</view>
-				</view>
-			</view>
-		</view>
-		<view class="goods-select" v-if="goodsList.length>0">
-			<u-scroll-list :indicator="indicator" indicatorColor="#fff0f0" indicatorActiveColor="#f56c6c">
-				<view class="flex justify-around">
-					<view class="goods-item" v-for="(item,index) in goodsList" :key="index">
-						<view class="flex flex-direction align-center justify-center image-dele-container goodContainer"
-							@tap="clean(index,item)">
-							<!-- <view class="flex align-center justify-center numberContainer">
-								{{value}}
-							</view> -->
-							<view class="image">
-								<u--image radius="4" width="100rpx" height="100rpx" :src="item.goodsImg" mode="aspectFit"
-									:lazy-lord="true"></u--image>
-							</view>
-							<view class="goods-select-name">{{item.name}}</view>
-						</view>
-						<view class="flex align-center justify-center" style="margin-top: 8rpx;">
-							<view class="flex align-center justify-center">
-								<view class="minus" @tap="reduce(item,index)">
-									<u-icon name="minus" size="12"></u-icon>
-								</view>
-								<text style="width: 50rpx;text-align: center;" class="input">{{item.number}}</text>
-								<view class="plus" @tap="add(item)">
-									<u-icon name="plus" color="#FFFFFF" size="12"></u-icon>
-								</view>
-							</view>
-						</view>
-					</view>
-				</view>
-			</u-scroll-list>
-		</view>
-
-		<view class="goods-select-empty" v-else>
-			添加需要补扣的商品~
-		</view>
-
-		<view class="classify-wrap">
-			<Classify :status="status" :commList="commList"
-				@comClick='detail' :height="fullHeight" :leftShow="false" />
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		ownerGoodsList,
-		list
-	} from "@/api/commodity/goods.js"
-	import {
-		apply
-	} from "@/api/order/riskorder.js"
-	import {
-		categoryList
-	} from "@/api/device/device.js"
-	import Classify from "@/components/classify/index.vue"
-	export default {
-		components: {
-			Classify
-		},
-		data() {
-			return {
-				scrollintoview: '',
-				fullHeight: '0',
-				tabList: [], //商品类目
-				commList: [], //商品列表
-				goodsList: [], //商品id列表
-				status: 'nomore', //加载更多
-				riskId: '',
-				deviceId: '',
-				video: {
-					url1: '',
-					url2: ''
-				},
-				videoUrl: null,
-				videoType: ['主视频', '副视频'],
-				videoCurrent: 0,
-				statGoodsList: [], //平台识别补扣商品
-			}
-		},
-
-		onLoad(e) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".classify-wrap").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X", 
-							'iPhone XR', 
-							"iPhone XS", 
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top  + 'px';
-						}
-					},
-				});
-			}).exec();
-			// uni.getSystemInfo({
-			// 	success(res) {
-			// 		_this.fullHeight = 2 * (res.windowHeight - res.statusBarHeight - 44 - 143) + 'rpx';
-			// 	},
-			// });
-			this.riskId = e.id
-			this.deviceId = e.deviceId
-			this.initOrder()
-		},
-		
-		onShow() {
-			this.getCommList()
-		},
-
-		methods: {
-			//初始化页面信息
-			initOrder() {
-				let orderDetail = JSON.parse(uni.getStorageSync('riskOrder'));
-				if (orderDetail.video) {
-					this.video = {
-						url1: orderDetail.video.split(',')[0],
-						url2: orderDetail.video.split(',')[1]
-					}
-					this.videoUrl = this.video.url1
-				} else {
-					this.video = {
-						url1: '',
-						url2: ''
-					}
-				}
-
-
-				let tempGoodsList = orderDetail.orderGoods.map(i => {
-					return {
-						goodsImg: i.goodsImgUrl,
-						spid: i.goodsId,
-						name: i.goodsName,
-						price: Number(i.totalMoney) / 100,
-						number: Number(i.totalNumber),
-						initNum: Number(i.totalNumber)
-					}
-				})
-
-				this.statGoodsList = JSON.parse(JSON.stringify(tempGoodsList))
-				this.goodsList = JSON.parse(JSON.stringify(tempGoodsList))
-			},
-
-			sectionChange(e) {
-				this.videoCurrent = e;
-				if (e == 0) {
-					this.videoUrl = this.video.url1
-				} else {
-					this.videoUrl = this.video.url2
-				}
-			},
-
-			//根据类目获取商品列表
-			getCommList() {
-				list({
-					deviceId: this.deviceId,
-				}).then(res => {
-					let data = res.data;
-					let newData = data.map(i => {
-						i.price = (Number(i.price) / 100).toFixed(2)
-						return i
-					})
-					this.commList = newData
-				})
-			},
-
-			statGoodsTips() {
-				this.$modal.msg('该商品为平台算法识别异常商品,为防止您的无辜损失,无法再删减!')
-			},
-
-			clean(e, item) { //点击移除商品
-				//校验是否算法识别商品
-				if (this.isStatGoods(item)) {
-					this.statGoodsTips()
-					return
-				}
-				this.goodsList.splice(e, 1)
-			},
-
-			// 校验是否算法识别商品
-			isStatGoods(e) {
-				console.log(e)
-				console.log(this.statGoodsList)
-				for (let i = 0; i < this.statGoodsList.length; i++) {
-					let item = this.statGoodsList[i];
-					if (item.spid == e.spid) {
-						return true
-					}
-				}
-				return false
-			},
-
-			//校验是否减少了算法识别商品
-			isDelStatGoods(e) {
-				for (let i = 0; i < this.statGoodsList.length; i++) {
-					let item = this.statGoodsList[i];
-					if (item.spid == e.spid && item.number == e.number) {
-						return true
-					}
-				}
-				return false
-			},
-
-			detail(e) {
-				this.goodsList.forEach(item => {
-					if (e.goodsId == item.spid) {
-						this.add(item)
-					}
-				})
-
-				for (var i = 0; i < this.goodsList.length; i++) {
-					if (this.goodsList[i].spid == e.goodsId) {
-						return;
-					}
-				}
-
-				this.goodsList.push({
-					goodsImg: e.cover,
-					spid: e.goodsId,
-					name: e.name,
-					price: e.price,
-					number: 1,
-					initNum: 0
-				})
-
-			},
-			//新增
-			add(e) {
-				e.number++
-			},
-			//减少
-			reduce(e, index) {
-				if (this.isDelStatGoods(e)) { //校验是否减少了算法识别商品
-					this.statGoodsTips()
-					return
-				}
-				e.number--
-				if (e.number == 0) {
-					this.goodsList.splice(index, 1)
-				}
-			},
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-			
-			// 添加商品至机器
-			addCom(deviceId){
-				this.$tab.navigateTo('/pages/equipment/addCom?id='+deviceId)
-			},
-			
-			//提交补扣申请
-			submit() {
-				if (!this.goodsList.length) {
-					uni.$u.toast('请选择商品')
-					return;
-				}
-
-				var goodsId = []
-				this.goodsList.forEach(item => {
-					if (item.number - item.initNum > 0) { //除去算法识别商品
-						goodsId.push({
-							goodsId: item.spid,
-							goodsName: item.name,
-							price: (Number(item.price)) * 100,
-							totalNumber: item.number - item.initNum
-						})
-					}
-				})
-				apply({
-					"cutGoods": goodsId,
-					"riskId": this.riskId
-				}).then(res => {
-					this.$modal.msg('提交申请成功~')
-					setTimeout(() => {
-						this.$tab.navigateBack()
-					}, 800)
-				})
-			}
-		},
-
-		onUnload() {
-			uni.setStorage('riskOrder', '')
-		},
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.martop {
-			margin-top: 20rpx;
-		}
-
-		.margin {
-			margin: 10rpx 20rpx;
-		}
-
-		.margintop {
-			margin-top: 10rpx;
-		}
-
-		.video-container {
-			.video-tab {
-				width: 300rpx;
-			}
-		}
-
-		.box {
-			padding: 20rpx 24rpx;
-		}
-
-		.goods-item+.goods-item {
-			margin-left: 12rpx;
-		}
-
-		.image-dele-container {
-			position: relative;
-			width: 140rpx;
-			height: 140rpx;
-			background-color: #f6f6f6;
-			border-radius: 15rpx;
-			padding: 12rpx;
-
-			view {
-				text-overflow: ellipsis;
-				overflow: hidden;
-				white-space: nowrap;
-				width: 100rpx;
-			}
-
-			.image {
-				width: 100rpx;
-				height: 100rpx;
-			}
-
-			.goods-select-name {
-				font-size: 24rpx;
-			}
-		}
-
-		.goods-select {
-			margin: 0 24rpx;
-			height: 218rpx;
-			padding-top: 10rpx;
-		}
-
-		.goods-select-empty {
-			height: 218rpx;
-			text-align: center;
-			line-height: 218rpx;
-		}
-
-		.goodContainer {
-			position: relative;
-
-			.numberContainer {
-				width: 35rpx;
-				height: 35rpx;
-				border-radius: 100%;
-				color: #fff;
-				background-color: red;
-				position: absolute;
-				right: -5rpx;
-				top: -5rpx;
-			}
-		}
-
-		.minus {
-			width: 22px;
-			height: 22px;
-			border-width: 1px;
-			border-color: #E6E6E6;
-			border-style: solid;
-			border-top-left-radius: 100px;
-			border-top-right-radius: 100px;
-			border-bottom-left-radius: 100px;
-			border-bottom-right-radius: 100px;
-			@include flex;
-			justify-content: center;
-			align-items: center;
-		}
-
-
-
-		.plus {
-			width: 18px;
-			height: 18px;
-			background-color: #FF0000;
-			border-radius: 50%;
-			/* #ifndef APP-NVUE */
-			display: flex;
-			/* #endif */
-			justify-content: center;
-			align-items: center;
-		}
-	}
-</style>

+ 0 - 705
pages/order/orderDetails.vue

@@ -1,705 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="订单详情"></u-navbar>
-
-		<view class="content">
-			<view v-if="detail.orderGoods&&detail.orderGoods.length>0" class="box">
-				<view class="title">商品信息</view>
-				<view class="goods-container martop">
-					<view class="goods-item" v-for="(item,index) in detail.orderGoods" :key="item.id">
-						<view class="flex align-center">
-							<view class="spxx-image">
-								<u--image radius="4" width="130rpx" height="130rpx" :src="item.goodsImgUrl"
-									mode="aspectFit" :lazy-lord="true"></u--image>
-							</view>
-							<view class="flex flex-direction justify-between goods-msg" style="width:600rpx;">
-								<view class="flex justify-between">
-									<view style="width:360rpx;" class="goods-name">{{item.goodsName}}
-										*{{item.totalNumber}}</view>
-									<view class="text" style="color: red;" v-if="item.refundMoney&&item.refundMoney>0">
-										已退款:¥{{$xy.delMoney(item.refundMoney)}}
-									</view>
-								</view>
-								<view class="flex align-center justify-between">
-									<view class="goods-price">
-										单价:¥{{(Number(item.totalMoney)/Number(item.totalNumber))/100}}</view>
-									<!--<view class="">应收:¥2.00</view>
-											<view class="">实收:¥2.00</view> -->
-								</view>
-								<!-- <view class="">优惠活动:暂无</view> -->
-							</view>
-						</view>
-					</view>
-				</view>
-			</view>
-
-			<view class="box">
-				<view class="title">订单信息</view>
-				<view class="orderinformation-container martop">
-					<view class="flex align-center">
-						<view class="">
-							<view class="oc-name">订单编号:</view>{{detail.id||'/'}}<text class="under-line-text"
-								@tap="copy(detail.id)">复制</text>
-						</view>
-					</view>
-					<view class="flex align-center">
-						<view class="">
-							<view class="oc-name">商户单号:</view>{{detail.payQueryOrderId||'/'}}<text
-								class="under-line-text" @tap="copy(detail.payQueryOrderId)">复制</text>
-						</view>
-					</view>
-					<view class="flex align-center">
-						<view class="oc-name">设备:</view>{{detail.deviceId||'/'}}
-					</view>
-					<view class="flex align-center">
-						<view class="oc-name">交易时间:</view>{{detail.payTime||'/'}}
-					</view>
-					<view class="flex align-center justify-between">
-						<view class="phone">
-							<view class="oc-name">手机号:</view>{{detail.memberTel||'/'}}<text class="under-line-text"
-								@click="$tab.navigateTo(`/pages/order/userInfo?id=${detail.memberId}`)">会员信息</text><text
-								v-if="detail.memberIsBlacklist&&detail.memberTel">已拉黑</text>
-						</view>
-						<view class="block" v-if="detail.memberTel&&!detail.memberIsBlacklist" @click="block">
-							拉黑
-						</view>
-					</view>
-					<view class="flex align-center">
-						<view class="oc-name">订单状态:</view>{{detail.statusName||'/'}}
-					</view>
-					<view class="flex align-center">
-						<view class="oc-name">商品总价:</view>¥{{$xy.delMoney(detail.orderTotalMoney)}}
-					</view>
-					<view class="">
-						<view class="oc-name">优惠金额:</view>¥{{$xy.delMoney(detail.discountMoney)}}
-					</view>
-					<view class="">
-						<view class="oc-name">订单总金额:</view>¥{{$xy.delMoney(detail.orderTotalMoney)}}
-					</view>
-					<view class="flex align-center justify-end" style="margin-top: 26rpx;">
-						<view class="marleft">
-							<xbutton bgColor="#F4F8FF" color="#2C6FF3" @tap="showlogs">交易日志</xbutton>
-						</view>
-						<view class="marleft">
-							<xbutton bgColor="#F4F8FF" color="#2C6FF3">通知付款</xbutton>
-						</view>
-						<view class="marleft" v-if="detail.status==4">
-							<xbutton bgColor="#F4F8FF" color="#2C6FF3" @tap="open">发起退款</xbutton>
-						</view>
-						<view class="marleft">
-							<xbutton bgColor="#F4F8FF" color="#2C6FF3" @tap="showVideoView">查看交易视频</xbutton>
-						</view>
-					</view>
-				</view>
-			</view>
-
-			<view class="box">
-				<view class="title">支付信息</view>
-				<view class="payments-container martop">
-					<view class="flex align-center">
-						<view class="oc-name">支付时间:</view>{{detail.payTime||'/'}}
-					</view>
-					<view class="">
-						<view class="oc-name">支付方式:</view>{{$xy.getPayType(detail.payType)}}
-					</view>
-					<view class="">
-						<view class="oc-name">支付金额:</view>¥{{$xy.delMoney(detail.payMoney)}}
-					</view>
-					<view class="flex align-center">
-						<view class="">
-							<view class="oc-name">支付订单号:</view>{{detail.payOrderId||'/'}}<text class="under-line-text"
-								@tap="copy(detail.payOrderId)">复制</text>
-						</view>
-					</view>
-					<view class="">
-						<view class="oc-name">支付状态:</view>{{detail.payStatusName||'/'}}
-					</view>
-				</view>
-			</view>
-
-			<view class="box" v-if="refundDetail.id">
-				<view class="title">用户退款记录</view>
-				<view class="userrefundrecord-container martop">
-					<view class="title1 martop">客户申请</view>
-					<view class="">
-						<view class="oc-name">申请时间:</view>{{refundDetail.createTime||'/'}}
-					</view>
-					<!-- <view class="">退款金额:¥{{refundDetail.createTime}}</view> -->
-					<view class="">
-						<view class="oc-name">用户备注:</view>{{refundDetail.remark||'/'}}
-					</view>
-					<view class="">
-						<view class="oc-name">退款原因:</view>{{refundDetail.reason||'/'}}
-					</view>
-					<view class="title1 martop">退款产品</view>
-					<block v-for="(item,index) in refundDetail.goodsList" :key="item.id">
-						<u--image radius="4" width="130rpx" height="110rpx" :src="item.goodsImgUrl" mode="widthFix"
-							:lazy-lord="true"></u--image>
-						<view class="">{{item.goodsName}} *{{item.totalNumber}}</view>
-						<!-- 	<view class="flex align-center justify-between">
-							<view class="">商品原价:¥{{item.totalNumber}}</view>
-							<view class="">商品卖价:¥{{item.sellPrice}}</view>
-							<view class="">商品总价:¥{{item.totalMoney}}</view>
-						</view> -->
-					</block>
-					<view class="">
-						<view class="oc-name">优惠活动:</view>无
-					</view>
-					<view class="title1 martop">商家处理</view>
-					<view class="">
-						<view class="oc-name">处理结果:</view>{{refundDetail.refundStatusDesc||'/'}}
-					</view>
-				</view>
-			</view>
-		</view>
-
-		<view :hidden="hiddenOrderVideos" class="popup_content">
-			<view class="flex">
-				<video id="myVideo" :src="videoUrl" style="width:100%;height: 372rpx; margin: 10rpx 10rpx;"></video>
-			</view>
-			<view class="flex" style="margin-top: 10rpx;">
-				<view class="marleft">
-					<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' bgColor='#2C6FF3' @tap="playVideo(0)">主视频
-					</xbutton>
-				</view>
-				<view class="marleft">
-					<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' bgColor='#2C6FF3' @tap="playVideo(1)">副视频
-					</xbutton>
-				</view>
-			</view>
-		</view>
-		<view class="popup_overlay" :hidden="hiddenOrderVideos" @click="closeVideoView()"></view>
-
-		<xpopup :show="show" @close="close" @confirm="submit" :showBtn="true" title="拉黑">
-			<!-- 拉黑 -->
-			<view class="pop-content">
-				是否确定拉黑该用户?
-			</view>
-		</xpopup>
-
-		<u-popup :show="refundShow" mode="center" :safeAreaInsetBottom="false" @close="refundShow=false">
-			<view class="refund-container">
-				<u-radio-group placement="row" v-model="radioType" @change="radioChange">
-					<u-radio :customStyle="{marginRight: '24rpx'}" activeColor="#2C6FF3" label="商品退款" name="2">
-					</u-radio>
-					<u-radio activeColor="#2C6FF3" label="金额退款" name="1"></u-radio>
-				</u-radio-group>
-				<view v-if="radioType=='2'">
-					<view class="martop" v-for="(item,index) in orderGoods" :key="item.id">
-						<view class="flex align-center" @tap="checked(item)">
-							<view class="checked">
-								<image v-if="item.checked"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-									mode="widthFix">
-								</image>
-								<image v-else
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-									mode="widthFix"></image>
-							</view>
-							<view class="">{{item.goodsName}}</view>
-						</view>
-						<view class="flex align-center" style="margin-top: 24rpx;">
-							<u-number-box button-size="30" v-model="item.totalNumber" class='martop'></u-number-box>
-							<view style="margin-left: 30rpx;">
-								¥{{item.totalNumber*item.price}}
-								<!-- 	<u--input placeholder="退款金额" @blur="refundGoodsChange" type="digit" disabled
-									v-model="item.totalMoney" border="surround">
-								</u--input> -->
-							</view>
-						</view>
-					</view>
-				</view>
-				<view class="flex align-center" style="margin-top: 24rpx;" v-else>
-					<view style="width:200rpx">
-						退款金额
-					</view>
-					<view class='marleft' style="width: 100%;">
-						<u--input placeholder="退款金额" @blur="refundGoodsChange" type="digit" v-model="refundMoney"
-							border="surround">
-						</u--input>
-					</view>
-				</view>
-				<view class='' style="margin-top: 24rpx;" @click="actionsheetChange">
-					<u--input clearable readonly suffixIcon="arrow-down" v-model="refundReasonName" border="surround"
-						suffixIconStyle="color: #909399" placeholder="退款理由">
-					</u--input>
-				</view>
-				<view class='' style="margin-top: 24rpx;">
-					<u--textarea v-model="description" placeholder="备注"></u--textarea>
-				</view>
-				<view class="" style="margin-top: 24rpx;" v-if="radioType=='2'">总退款金额:¥{{refundTotalMoney}}</view>
-				<view class="flex align-center justify-end" style="margin-top: 24rpx;">
-					<view class="">
-						<xbutton width='200rpx' @click='refundShow=false'>取消</xbutton>
-					</view>
-					<view class='marleft'>
-						<xbutton width='200rpx' @click="refundSure">确定</xbutton>
-					</view>
-				</view>
-			</view>
-		</u-popup>
-
-		<u-action-sheet :show="actionSheetShow" :actions="actions" :title="title" @close="actionSheetShow = false"
-			@select="actionsheetSelect($event)"></u-action-sheet>
-	</view>
-</template>
-
-<script>
-	import {
-		byId,
-		refundDetail,
-		setBlacklist,
-		refundByMerc
-	} from "@/api/order/order.js"
-	import getDict from "@/utils/getDict.js"
-	export default {
-		data() {
-			return {
-				id: null,
-				hiddenOrderVideos: true,
-				selOrder: undefined,
-				videoUrl: '',
-				detail: {},
-				refundDetail: {},
-				show: false,
-
-				refundShow: false,
-				radioType: '2',
-				remark: '',
-
-				orderGoods: null,
-				createTime: null,
-				description: null,
-				refundReason: null,
-				refundReasonName: null,
-				actions: [],
-				actionSheetShow: false,
-				refundMoney: ''
-			}
-		},
-
-		computed: {
-			refundTotalMoney() {
-				let num = 0;
-				if (this.orderGoods) {
-					this.orderGoods.forEach(i => {
-						if (i.checked) {
-							num += Number(i.totalNumber) * i.price
-						}
-					})
-				}
-				return num
-			}
-		},
-
-		onLoad(o) {
-			this.id = o.id;
-			this.createTime = o.createTime
-		},
-
-		onShow() {
-			this.getbyId()
-			this.getRefundDetail()
-		},
-
-		methods: {
-			copy(text) {
-				uni.setClipboardData({
-					data: text,
-					success: (data) => {
-						uni.showToast({
-							title: '复制成功'
-						})
-					},
-					fail: function(err) {
-
-					},
-					complete: function(res) {
-
-					}
-				})
-			},
-			getbyId() {
-				byId({
-					id: this.id
-				}).then(res => {
-					if (res.code == 200) {
-						this.detail = res.data
-					}
-				})
-			},
-
-			getRefundDetail() {
-				refundDetail({
-					orderId: this.id
-				}).then(res => {
-					if (res.code == 200) {
-						this.refundDetail = res.data
-					}
-				})
-			},
-			showVideoView() {
-
-				this.hiddenOrderVideos = false;
-				var urls = this.detail.video.split(',');
-				this.detail.url0 = urls[0];
-				this.detail.url1 = urls[1];
-				this.playVideo(0);
-			},
-			playVideo(o) {
-				if (0 == o) {
-					this.videoUrl = this.detail.url0;
-				} else {
-					this.videoUrl = this.detail.url1;
-				}
-			},
-			closeVideoView() {
-				this.videoUrl = '';
-				this.hiddenOrderVideos = true;
-			},
-
-			block() {
-				this.show = true
-			},
-
-			// 关闭弹框
-			close(e) {
-				this.show = false
-			},
-
-			// 弹框确定
-			submit() {
-				setBlacklist({
-					memberId: this.detail.memberId
-				}).then(res => {
-					this.$modal.msg('拉黑成功~')
-					this.getbyId()
-				}).catch(err => {
-
-				})
-				this.close()
-			},
-
-			showlogs() {
-				this.$tab.navigateTo('/pages/order/orderLogs?id=' + this.detail.activityId);
-			},
-
-			manualPayment() {
-				this.$tab.navigateTo('/pages/order/orderDel?id=' + this.detail.id + '&deviceId=' + this.detail
-					.deviceId)
-			},
-
-			open() {
-				this.refundShow = true
-				getDict('order_refund_refund_reason').then(res => {
-					let actions = res.map(i => {
-						return {
-							type: i.value,
-							name: i.msg
-						}
-					})
-					this.actions = actions
-				}).catch(err => {
-
-				})
-
-				this.orderGoods = JSON.parse(JSON.stringify(this.detail.orderGoods))
-				this.orderGoods.forEach(i => {
-					i.price = this.$xy.delMoney(i.totalMoney) / i.totalNumber
-					i.totalMoney = this.$xy.delMoney(i.totalMoney)
-				})
-			},
-
-			//退款选项
-			radioChange(e) {},
-
-			//选中商品
-			checked(item) {
-				this.orderGoods.forEach(i => {
-					if (i.id == item.id) {
-						i.checked = !i.checked
-					}
-				})
-				this.orderGoods = JSON.parse(JSON.stringify(this.orderGoods))
-			},
-
-			refundGoodsChange(e) {
-				if (!this.$xy.testPrice(e)) {
-					this.$modal.msg('输入价格最低为分!')
-				}
-			},
-
-			// 退款处理确认按钮
-			refundSure() {
-				let params = {}
-				if (this.radioType == 2) { //订单商品退款
-					let ordersGoods = [];
-					for (var i = 0; i < this.orderGoods.length; i++) {
-						let item = this.orderGoods[i]
-						if (item.checked) {
-							if (!this.$xy.testPrice(item.totalMoney)) {
-								this.$modal.msg('输入价格最低为分!')
-								return
-							}
-							ordersGoods.push({
-								orderGoodsId: item.id,
-								goodsNum: item.totalNumber,
-								price: (item.totalMoney / Number(item.totalNumber)) * 100
-							})
-						}
-					}
-					if (ordersGoods && ordersGoods.length == 0) {
-						this.$modal.msg('请选择退款商品!')
-						return
-					}
-					params = {
-						refundWay: this.radioType,
-						orderId: this.id,
-						createTime: this.createTime,
-						refundGoods: ordersGoods,
-						description: this.description,
-						reason: this.refundReason
-					}
-
-					console.log('params', params)
-
-				} else { //金额退款
-					if (!this.refundMoney) {
-						this.$modal.msg('请选择输入退款金额!')
-						return
-					}
-					params = {
-						refundWay: this.radioType,
-						orderId: this.id,
-						createTime: this.createTime,
-						description: this.description,
-						reason: this.refundReason,
-						refundMoney: this.refundMoney * 100
-					}
-				}
-
-				refundByMerc(params).then(res => {
-					if (res.code == 200) {
-						this.getbyId()
-						this.getRefundDetail()
-						setTimeout(() => {
-							this.$modal.showToast('订单处理成功~')
-						}, 1000)
-					} else {
-						this.$modal.showToast('订单处理失败~')
-					}
-					this.orderGoods = null;
-					this.refundShow = false;
-				})
-			},
-
-			actionsheetChange() {
-				console.log(123)
-				this.actionSheetShow = true;
-			},
-
-			actionsheetSelect(e) {
-				this.refundReason = e.type
-				this.refundReasonName = e.name
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.container {
-		padding: 24rpx;
-		line-height: 50rpx;
-
-		.content {
-			overflow: hidden;
-		}
-
-		.text {
-			color: #2C6FF3;
-		}
-
-		.martop {
-			margin-top: 12rpx;
-		}
-
-		.marleft {
-			margin-left: 10rpx;
-		}
-
-
-
-		.xian {
-			border-bottom: 1px solid #5b5b5b;
-			margin: 20rpx 0;
-		}
-
-		.title {
-			font-size: 32rpx;
-			line-height: 32rpx;
-			font-weight: 800;
-			color: #333;
-		}
-
-		.title1 {
-			font-size: 28rpx;
-			font-weight: 700;
-			color: #333;
-			line-height: 50rpx;
-			position: relative;
-			padding-left: 16rpx;
-
-			&::before {
-				content: '';
-				width: 5rpx;
-				height: 24rpx;
-				background: #2C6FF3;
-				position: absolute;
-				left: 4rpx;
-				top: 50%;
-				transform: translateY(-60%);
-			}
-		}
-
-		.under-line-text {
-			font-size: 26rpx !important;
-
-			font-weight: 500;
-			font-style: italic;
-			text-decoration: underline;
-			color: #2C6FF3 !important;
-			margin-left: 24rpx;
-			background-color: #fff !important;
-		}
-
-		.oc-name {
-			display: inline-block;
-			width: 170rpx;
-		}
-
-		.payments-container,
-		.userrefundrecord-container,
-		.orderinformation-container {
-			background-color: #fff;
-			color: #777777;
-			padding: 20rpx 0;
-			border-radius: 15rpx;
-		}
-
-		.orderinformation-container {
-			.phone {
-				>text {
-					display: inline-block;
-					background-color: #5b5b5b;
-					color: #fff;
-					font-size: 22rpx;
-					padding: 0 12rpx;
-					border-radius: 6rpx;
-					margin-left: 12rpx;
-					line-height: 36rpx;
-				}
-			}
-
-			.block {
-				width: 92rpx;
-				height: 38rpx;
-				background: #F4F8FF;
-				border-radius: 8rpx;
-				font-size: 26rpx;
-				line-height: 38rpx;
-				font-weight: 500;
-				color: #2C6FF3;
-				text-align: center;
-			}
-		}
-
-		.box {
-			background-color: #fff;
-			padding: 28rpx 25rpx;
-			border-radius: 14rpx;
-			margin-top: 20rpx;
-
-			.goods-container {
-				background-color: #fff;
-				border-radius: 15rpx;
-				margin-top: 35rpx;
-
-				.goods-item {
-					background: #F6F7FA;
-					border-radius: 14rpx;
-					padding: 8rpx;
-					margin-top: 20rpx;
-
-					.goods-msg {
-						margin-left: 27rpx;
-
-						.goods-name {
-							font-size: 26rpx;
-							font-weight: 800;
-							color: #333333;
-						}
-
-						.goods-price {
-							font-size: 24rpx;
-							font-weight: 500;
-							color: #555555;
-						}
-					}
-				}
-
-				.spxx-image {
-					height: 130rpx;
-				}
-			}
-		}
-	}
-
-	.popup_overlay {
-		position: fixed;
-		top: 0%;
-		left: 0%;
-		width: 100%;
-		height: 100%;
-		background-color: black;
-		z-index: 1001;
-		-moz-opacity: 0.8;
-		opacity: .80;
-		filter: alpha(opacity=88);
-	}
-
-	.popup_content {
-		position: fixed;
-		top: 50%;
-		left: 50%;
-		width: 700rpx;
-		height: 500rpx;
-		margin-left: -350rpx;
-		margin-top: -250rpx;
-		border: 10px solid white;
-		background-color: white;
-		z-index: 1002;
-		overflow: auto;
-	}
-
-	.pop-content {
-		padding: 24rpx;
-	}
-
-	.refund-container {
-		background-color: #fff;
-		width: 600rpx;
-		padding: 20rpx 30rpx;
-
-		.checked {
-			width: 36rpx;
-			height: 36rpx;
-			margin-right: 12rpx;
-
-			image {
-				width: 36rpx;
-				height: 36rpx;
-			}
-		}
-	}
-</style>

+ 0 - 56
pages/order/orderLogs.vue

@@ -1,56 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="交易日志"></u-navbar>
-		<scroll-view   scroll-y="true" scroll-with-animation="true"
-			lower-threshold="100" @scrolltolower="loadMore">
-			<view class="" v-for="(item,index) in logList" :key="item.id">
-				<view class="flex">
-					<view class="" style="min-width: 200rpx;color: gray;">{{ item.activityTime.substring(5)}}</view>
-					<view class="">{{item.msg}}</view>			
-				</view>
-
-			</view>
-		</scroll-view>
-	</view>
-</template>
-
-<script>
-	import {
-		byId,
-		orderLogs,
-		refundDetail
-	} from "@/api/order/order.js"
-	export default {
-		data() {
-			return {
-				activityId: null,
-				logList:[]
-			}
-		},
-		onLoad(o) {
-			this.activityId = o.id;
-			this.queryLogs()
-		},
-		methods: {
-			queryLogs(){
-				orderLogs({
-					activityId:this.activityId
-				}).then(res => {
-					this.logList = res.data;
-				})
-			}
-		},
-	}
-</script>
-
-<style scoped lang="scss">
-	.container {
-		padding: 24rpx;
-		line-height: 50rpx;
-		.text {
-			color: #2C6FF3;
-		}
-	}
-</style>
-

+ 0 - 888
pages/order/orderQuery.vue

@@ -1,888 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="订单查询"></u-navbar>
-		<view class="time-choose">
-			<view class="flex align-center justify-between top">
-				<view class="con-btn" @tap="thedaybefore()">
-					前一天 </view>
-				<view class="flex align-center justify-between date" @tap="timeShow=true">
-					<view class="">{{searchQuery.orderDate}}</view>
-					<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/date.png" mode="widthFix">
-					</image>
-				</view>
-				<view class="con-btn" @tap="thenextday()">后一天</view>
-			</view>
-		</view>
-		<view class="search">
-			<u-search placeholder='输入机器编号或名称搜索' v-model="searchQuery.deviceSearch" :showAction="false" @search="search">
-			</u-search>
-		</view>
-		
-		<view class="flex align-center justify-between screen-container">
-					<view>{{Number(orderCount.orderNum)}}个订单,合计:¥{{Number(orderCount.orderTotalAmount/100)}}</view>
-					<view class="flex align-center">
-						<view class="show-zero flex justify-end align-center">
-							<view>零元单:</view>
-							<view>
-								<u-switch activeColor="#2C6FF3" size="14" v-model="searchQuery.showZero" @change="showZeroChange"></u-switch>
-							</view>
-						</view>
-						<view class="flex align-center justify-center" @tap="screen">
-							<view class="" style="font-size: 28rpx;font-weight: 500;color: #333333;">筛选</view>
-							<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/screen.png"
-								style="width: 32rpx;height: 32rpx;margin-left: 12rpx;" mode="widthFix"></image>
-						</view>
-					</view>
-				</view>
-		
-		
-
-		<view class="tab-wrap">
-			<view class="tab">
-				<u-tabs :list="tabList" :activeStyle="{color: '#333',fontWeight: 'bold',fontSize:'36rpx'}"
-					:inactiveStyle="{fontSize:'32rpx'}" :scrollable="false" :current="current" @click="tabClick"
-					lineColor="#2C6FF3">
-				</u-tabs>
-			</view>
-		</view>
-
-		<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100"
-			@scrolltolower="scrolltolower" :style="{height:fullHeight}">
-			<view v-if="orderList.length>0">
-				<block v-for="(item,index) in orderList" :key="item.id">
-					<view class="equipment-container" @tap="details(item)">
-						<view class="flex align-center justify-between">
-							<view class="title" v-if="item.deviceName">
-								{{item.deviceName}}<text>({{item.deviceId}})</text>
-							</view>
-							<view class="title" v-else>{{item.deviceId}}</view>
-							<view>
-								<u-icon name="arrow-right" size="14"></u-icon>
-							</view>
-						</view>
-
-						<view class="order-detail-item">
-							<view>订单号:</view>{{item.id}}
-						</view>
-
-						<view class="order-detail-item">
-							<view>支付方式:</view>{{$xy.getPayType(item.payType)}}
-						</view>
-
-						<view class="order-detail-item">
-							<view>设备类型:</view>{{item.deviceType||'/'}}
-						</view>
-
-						<view class="order-detail-item">
-							<view>时间:</view>{{item.createTime}}
-						</view>
-						
-						<view class="order-detail-item" v-if="$xy.delMoney(item.payMoney)==0">
-							<view>零元单提示:</view><view style="color: red;">未拿商品</view>
-						</view>
-
-						<view class="goods-container sb-box" v-for="(item1,index1) in item.orderGoods" :key="item1.id">
-							<view class="flex align-center justify-center image-container">
-								<u--image radius="4" width="130rpx" height="130rpx" :src="item1.goodsImgUrl"
-									mode="aspectFit" :lazy-lord="true"></u--image>
-							</view>
-							<view class="details-container">
-								<view class="flex align-center goods-name-num justify-between">
-									<view class="goods-name">{{item1.goodsName}}</view>
-									<view class="goods-num">×{{item1.totalNumber}}</view>
-								</view>
-								<view class="gp-item">
-									单价:¥{{(Number(item1.totalMoney)/Number(item1.totalNumber))/100}}
-								</view>
-								<view class="gp-item" v-if="item1.refundMoney||item1.refundMoney!=0">
-									已退款:¥{{$xy.delMoney(item1.refundMoney)}}
-								</view>
-								<view class="goods-price flex">
-									<!-- <view class="gp-item">
-										应收:¥{{(Number(item1.totalMoney)-Number(item1.discountMoney))/100}}
-									</view> -->
-									<!-- <view class="gp-item">
-										实收:¥{{item1.totalMoney-item1.discountMoney}}
-									</view> -->
-								</view>
-								<!-- <view class="good-act">优惠活动:无</view> -->
-							</view>
-						</view>
-						<view class="martop" style="text-align: right;">共计{{Number(item.goodsNumber)}}件,实付款<text
-								style="color: red;font-weight: bold;">¥{{$xy.delMoney(item.orderTotalMoney)}}</text></view>
-					</view>
-				</block>
-				<view class="load-more" style="padding:24rpx;">
-					<u-loadmore v-if="orderList.length>0" :status="loadmoreStatus" />
-				</view>
-			</view>
-			<view v-else class='empty'>
-				<u-empty mode="data" text="数据为空"></u-empty>
-			</view>
-		</scroll-view>
-
-		<xpopup :show="screenShow" @close="close" @confirm="sure" :showBtn="true" title="筛选">
-			<view class="popup-container">
-				<view class='martop'>
-					<u--input placeholder="订单编号" v-model="searchQuery.id" border="surround"></u--input>
-				</view>
-				<view class='martop'>
-					<u--input placeholder="手机号码" v-model="searchQuery.phone" border="surround"></u--input>
-				</view>
-				<view class='martop'>
-					<u--input placeholder="支付订单号" v-model="searchQuery.payOrderNo" border="surround"></u--input>
-				</view>
-				<view class='martop' @click="actionsheetChange('sblx')">
-					<u--input clearable readonly suffixIcon="arrow-down" v-model="showQuery.deviceType"
-						suffixIconStyle="color: #909399" placeholder="设备类型" border="surround"></u--input>
-				</view>
-				<view class='martop' @click="actionsheetChange('xzqy')">
-					<u--input clearable readonly suffixIcon="arrow-down" v-model="searchQuery.regionName"
-						border="surround" suffixIconStyle="color: #909399" placeholder="行政区域">
-					</u--input>
-				</view>
-				<view class='martop' @click="actionsheetChange('lx')">
-					<u--input clearable readonly suffixIcon="arrow-down" v-model="showQuery.merLineId" border="surround"
-						suffixIconStyle="color: #909399" placeholder="路线"></u--input>
-				</view>
-				<!-- 	<view class='martop' @click="actionsheetChange('ddzt')">
-					<u--input clearable readonly suffixIcon="arrow-down" v-model="showQuery.payStatus" border="surround"
-						suffixIconStyle="color: #909399" placeholder="订单状态">
-					</u--input>
-				</view> -->
-				<view class='martop' @click="actionsheetChange('yczt')">
-					<u--input clearable readonly suffixIcon="arrow-down" v-model="showQuery.riskType" border="surround"
-						suffixIconStyle="color: #909399" placeholder="异常状态">
-					</u--input>
-				</view>
-				<!-- <view class='martop'>
-
-					<u--input clearable suffixIcon="arrow-down" v-model="searchQuery.regionName" border="surround"
-						suffixIconStyle="color: #909399" placeholder="拉黑操作" @focus="actionsheetChange('lhcz')">
-					</u--input>
-				</view>
-				<view class='martop'>
-					<u--input clearable suffixIcon="arrow-down" v-model="searchQuery.regionName" border="surround"
-						suffixIconStyle="color: #909399" placeholder="促销活动" @focus="actionsheetChange('cxhd')">
-					</u--input>
-				</view> -->
-			</view>
-		</xpopup>
-		<u-action-sheet :show="actionSheetShow" :actions="actions" :title="title" @close="actionSheetShow = false"
-			@select="actionsheetSelect($event)"></u-action-sheet>
-
-		<!-- 区域选择弹框 -->
-		<xpopup :show="areaShow" @close="areaClose" :showBtn="false" title="选择区域">
-			<!-- 类目选择 -->
-			<scroll-view style="height: 600rpx;" scroll-y scroll-with-animation>
-				<view class="popup-content">
-					<tki-tree style="width:100%;" :range="areaList" :foldAll="false" rangeKey="name" idKey="name"
-						buttonName="选中" @btnClick="areaSubmit">
-					</tki-tree>
-				</view>
-			</scroll-view>
-		</xpopup>
-
-		<!-- 时间选择 -->
-		<u-datetime-picker :show="timeShow" :closeOnClickOverlay="true" @close="timeShow=false" @confirm="timeSubmit"
-			@cancel="timeShow=false" v-model="timeStamp" mode="date"></u-datetime-picker>
-	</view>
-</template>
-
-<script>
-	import {
-		orderPage,
-		orderPageCount,
-		page
-	} from "@/api/order/order.js"
-	import {
-		areaTree
-	} from "@/api/point/area"
-	import {
-		linePage,
-	} from "@/api/point/line"
-
-	export default {
-		data() {
-			return {
-				keyword: '',
-				orderListlength: '',
-				orderList: [],
-				orderCount: {},
-				loadmoreStatus: 'loadmore',
-				isEmpty: false,
-				page: 1, //当前分页
-				size: 10, //分页数据条数
-				mode: 'single',
-				screenShow: false,
-				actionSheetShow: false,
-				currentDate: '',
-				nextDate: '',
-				preDate: '',
-				date: '',
-				actions: [],
-				title: '',
-				zeroOrderName: true,
-				zeroOrderList: [{
-					type: false,
-					name: '否'
-				}, {
-					type: true,
-					name: '是'
-				}],
-				equipmentTypename: '',
-				equipmentTypeList: [{
-					type: '',
-					name: '全部'
-				}, {
-					type: 1,
-					name: '开门柜'
-				}, {
-					type: 2,
-					name: '重力柜'
-				}],
-				administrativeDivisionname: '',
-				administrativeDivisionList: [{
-					type: 'xzqy',
-					name: '全部'
-				}, {
-					type: 'xzqy',
-					name: '省市区三级联动'
-				}],
-				routename: '',
-				routeList: [{
-					type: 'lx',
-					name: '全部'
-				}, {
-					type: 'lx',
-					name: '路线1'
-				}, {
-					type: 'lx',
-					name: '路线2'
-				}],
-				orderStatusname: '',
-				orderStatusList: [{
-						type: '',
-						name: '全部'
-					}, {
-						type: 1,
-						name: '交易中'
-					}, {
-						type: 2,
-						name: '交易异常'
-					},
-					{
-						type: 3,
-						name: '交易取消'
-					},
-					{
-						type: 4,
-						name: '交易完成'
-					},
-					{
-						type: 5,
-						name: '交易关闭'
-					},
-					{
-						type: 6,
-						name: '下次补单'
-					},
-					{
-						type: 7,
-						name: '支付中'
-					}
-				],
-				abnormalStatename: '',
-				abnormalStateList: [{
-						type: '',
-						name: '全部'
-					}, {
-						type: 2,
-						name: '发起识别失败'
-					}, {
-						type: 3,
-						name: '未拿商品'
-					}, {
-						type: 4,
-						name: '无法识别'
-					},
-					{
-						type: 5,
-						name: '故意遮挡'
-					}, {
-						type: 6,
-						name: '柜中无此sku'
-					}, {
-						type: 9,
-						name: '异物拿放'
-					}, {
-						type: 10,
-						name: '疑似设备故障'
-					},
-					{
-						type: 11,
-						name: '支付失败'
-					}, {
-						type: 12,
-						name: '超时'
-					},
-					{
-						type: 8,
-						name: '其他告警'
-					}
-				],
-				pullBlackOperationname: '',
-				pullBlackOperationList: [{
-					type: 'lhcz',
-					name: '全部'
-				}, {
-					type: 'lhcz',
-					name: '是'
-				}, {
-					type: 'lhcz',
-					name: '否'
-				}],
-				salesPromotionname: '',
-				salesPromotionList: [{
-					type: 'cxhd',
-					name: '全部'
-				}, {
-					type: 'cxhd',
-					name: '双十一活动'
-				}],
-
-				searchQuery: {
-					orderDate: '', //日期
-					deviceSearch: '', //搜索关键字
-					id: '', //订单编号
-					phone: '', //手机号码
-					payOrderNo: '', //支付单号
-					deviceType: '', //设备类型
-					regionName: '', //区域
-					merLineId: '', //线路
-					payStatus: '', //订单状态
-					riskType: '', //异常订单类型
-					showZero: false, //零元单
-				},
-
-				showQuery: {
-					deviceType: '',
-					merLineId: '',
-					payStatus: '',
-					riskType: '',
-					showZero: '',
-				},
-
-				pickerType: null,
-				minDate: null,
-
-				// 编辑弹框
-				areaShow: false,
-				areaList: [], //区域数据
-
-				timeShow: false, //时间选择弹框
-				timeStamp: new Date(), //时间picker显示时间
-
-				noLine: false, //是否有线路
-				dayNum: 0, //日期
-
-				fullHeight: 0,
-
-				tabList: [{
-						name: '全部'
-					},
-					{
-						name: '未支付'
-					}
-				],
-				current: 0,
-			}
-		},
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						console.log(res.windowHeight, data.top)
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 40 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			this.currentDate = new Date();
-			this.minDate = '2023-03-10'
-			this.searchQuery.orderDate = uni.$u.timeFormat(this.currentDate, 'yyyy-mm-dd')
-			this.getpage()
-			//改为分页接口获取 this.getCountData()
-		},
-		methods: {
-			// 时间选择
-			timeSubmit(e) {
-				this.searchQuery.orderDate = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-				this.timeShow = false
-				this.reset()
-				this.getpage()
-				//改为分页接口获取 this.getCountData()
-			},
-
-			tabClick(e) {
-				this.current = e.index
-				if (this.current == 0) {
-					this.searchQuery.payStatus = ''
-				} else {
-					this.searchQuery.payStatus = 1
-				}
-				this.reset()
-				this.getpage()
-			},
-
-			//获取区域树
-			getAreaTree() {
-				areaTree().then(res => {
-					this.areaList = res.data
-				})
-			},
-
-			areaClose() {
-				this.areaShow = false
-			},
-
-			//区域选择提交
-			areaSubmit(res) {
-				this.searchQuery.regionName = res.name;
-				this.searchQuery.merLineId = null;
-				this.showQuery.merLineId = null;
-				this.getLineOption(res.name)
-				this.areaClose()
-			},
-
-			//获取线路options
-			getLineOption(regionName) {
-				linePage({
-					page: {
-						current: 1,
-						size: 1000,
-					},
-					regionName: regionName
-				}).then(res => {
-					let data = res.data.records;
-					if (data.length > 0) {
-						this.noLine = false;
-						let newData = data.map(i => {
-							return {
-								type: i.id,
-								name: i.lineName
-							}
-						})
-						this.actions = newData;
-					} else {
-						this.noLine = true; //没有线路
-						this.actions = [];
-					}
-				})
-			},
-
-			actionsheetChange(type) {
-				this.pickerType = type;
-				if (type == 'sblx') {
-					this.actions = this.equipmentTypeList
-					this.title = '请选择设备类型'
-					this.actionSheetShow = true
-				}
-				if (type == 'xzqy') {
-					this.areaShow = true;
-				}
-				if (type == 'lx') {
-					if (this.searchQuery.regionName) {
-						if (!this.noLine) {
-							this.title = '请选择路线'
-							this.actionSheetShow = true
-						} else {
-							this.$modal.msg('当前区域未建立线路~')
-						}
-					} else {
-						this.$modal.msg('请先选择区域~')
-					}
-				}
-				if (type == 'ddzt') {
-					this.actions = this.orderStatusList
-					this.title = '请选择订单状态'
-					this.actionSheetShow = true
-				}
-				if (type == 'yczt') {
-					this.actions = this.abnormalStateList
-					this.title = '请选择异常状态'
-					this.actionSheetShow = true
-				}
-				if (type == 'lhcz') {
-					this.actions = this.pullBlackOperationList
-					this.title = '请选择拉黑操作'
-					this.actionSheetShow = true
-				}
-				if (type == 'cxhd') {
-					this.actions = this.salesPromotionList
-					this.title = '请选择促销活动'
-					this.actionSheetShow = true
-				}
-			},
-			details(item) {
-				this.$tab.navigateTo(`/pages/order/orderDetails?id=${item.id}&createTime=${item.createTime}`)
-			},
-			actionsheetSelect(e) {
-				switch (this.pickerType) {
-					case 'sblx':
-						this.searchQuery.deviceType = e.type
-						this.showQuery.deviceType = e.name
-						break;
-					case 'xzqy':
-						this.searchQuery.regionName = e.name
-						break;
-					case 'lx':
-						this.searchQuery.merLineId = e.type
-						this.showQuery.merLineId = e.name
-						break;
-					case 'ddzt':
-						this.searchQuery.payStatus = e.type
-						this.showQuery.payStatus = e.name
-						break;
-					case 'yczt':
-						this.searchQuery.riskType = e.type
-						this.showQuery.riskType = e.name
-						break;
-						// case 'lhcz':
-						// 	this.pullBlackOperationname = e.name
-						// 	break;
-						// case 'cxhd':
-						// 	this.salesPromotionname = e.name
-						// 	break;
-					default:
-						break;
-				}
-			},
-			close() {
-				this.screenShow = false
-			},
-			confirm(e) {
-				this.searchQuery.orderDate = e[0]
-				this.show = false
-				this.search()
-				//改为分页接口获取 this.getCountData()
-			},
-			
-			//是否展示零元单
-			showZeroChange(){
-				this.search()
-			},
-			
-			thedaybefore() {
-				this.dayNum--
-				this.preDate = new Date(this.currentDate.getTime() + this.dayNum * (24 * 60 * 60 * 1000)); //前一天
-				this.searchQuery.orderDate = uni.$u.timeFormat(this.preDate, 'yyyy-mm-dd')
-				//改为分页接口获取 this.getCountData()
-				this.search()
-			},
-			thenextday() {
-				this.dayNum++
-				this.nextDate = new Date(this.currentDate.getTime() + this.dayNum * (24 * 60 * 60 * 1000)); //后一天
-				this.searchQuery.orderDate = uni.$u.timeFormat(this.nextDate, 'yyyy-mm-dd')
-				//改为分页接口获取 this.getCountData()
-				this.search()
-			},
-
-			//点击筛选
-			screen() {
-				this.screenShow = true
-				this.getAreaTree()
-
-			},
-			//统计数据
-			// getCountData() {
-			// 	let params = {
-			// 		orderDate: this.searchQuery.orderDate
-			// 	}
-			// 	Object.assign(params)
-			// 	orderPageCount(params).then(res => {
-			// 		let data = res.data;
-			//
-			// 		this.orderCount = data
-			// 	})
-			// },
-			//获取订单列表
-			getpage() {
-				let params = {
-					page: {
-						current: this.page,
-						size: this.size
-					}
-				}
-				if (this.current == 0) {
-					Object.assign(params, this.searchQuery)
-				} else {
-					let obj = JSON.parse(JSON.stringify(this.searchQuery))
-					obj.orderDate = ''
-
-					Object.assign(params, obj)
-				}
-				page(params).then(res => {
-					let data = res.data.records;
-					if (data.length < 10) {
-						this.loadmoreStatus = "nomore"
-					} else {
-						this.loadmoreStatus = "loadmore"
-					}
-					this.orderCount.orderNum = res.data.orderNum;
-					this.orderCount.orderTotalAmount = res.data.orderTotalAmount;
-					this.orderList = this.orderList.concat(data)
-				})
-			},
-
-			// 搜索
-			search() {
-				this.reset()
-				this.getpage()
-			},
-
-			// 重置数据
-			reset() {
-				this.loadmoreStatus == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.orderList = [];
-			},
-
-			// 触底加载
-			scrolltolower() {
-				if (this.loadmoreStatus == 'nomore') return
-				this.page++
-				this.getpage()
-			},
-
-			sure() {
-				this.reset()
-				this.getpage()
-				this.screenShow = false;
-			}
-		}
-	}
-</script>
-<style scoped lang="scss">
-	.container {
-		.empty {
-			margin-top: 40%;
-		}
-
-		.martop {
-			margin-top: 20rpx;
-		}
-
-		.search {
-			padding: 24rpx 13rpx;
-			background-color: #fff;
-		}
-		
-		.show-zero{
-			background-color: #fff;
-			color: #777;
-			margin-right: 18rpx;
-		}
-
-		.tab-wrap {
-			background-color: #fff;
-
-			.tab {
-				// width: 40%;
-			}
-		}
-
-		.marleft {
-			margin-left: 10rpx;
-		}
-
-		.scrollview {
-			overflow: hidden;
-		}
-
-		.time-choose {
-			background-color: #fff;
-
-			.top {
-				height: 80rpx;
-				color: #fff;
-				padding: 0 20rpx;
-				background-color: #2C6FF3;
-				border-radius: 0px 0px 50rpx 50rpx;
-
-				.con-btn {
-					padding: 0 36rpx;
-				}
-
-				.date {
-					height: 50rpx;
-					width: 300rpx;
-					border-radius: 10rpx;
-					background-color: #fff;
-					color: #000;
-					padding: 0 20rpx;
-
-					image {
-						width: 30rpx;
-						height: 30rpx;
-					}
-				}
-
-
-			}
-		}
-
-		.screen-container {
-			background-color: #fff;
-			padding: 0 13rpx;
-
-			>view:nth-child(1) {
-				font-size: 28rpx;
-				font-weight: 500;
-				color: #777777;
-			}
-		}
-
-		.equipment-container {
-			margin: 13rpx 13rpx 0;
-			padding: 12rpx 20rpx 24rpx;
-			border-radius: 14rpx;
-			background-color: #fff;
-			box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-
-			.sb-box {
-				padding: 24rpx 18rpx;
-				background-color: #f5f8fb;
-				border-radius: 8rpx;
-				margin-top: 12rpx;
-			}
-
-			.title {
-				height: 60rpx;
-				line-height: 60rpx;
-				font-size: 32rpx;
-				font-weight: bold;
-				color: #333;
-
-				>text {
-					font-size: 24rpx;
-					color: #333;
-				}
-			}
-
-			.goods-container {
-				height: 154rpx;
-				margin-top: 14rpx;
-				padding: 12rpx 12rpx 12rpx 164rpx;
-				box-sizing: border-box;
-				position: relative;
-
-				.image-container {
-					height: 130rpx;
-					width: 130rpx;
-					position: absolute;
-					left: 12rpx;
-					top: 50%;
-					transform: translateY(-50%);
-				}
-
-				.details-container {
-					position: relative;
-					padding: 12rpx;
-
-					.goods-name-num {
-						.goods-name {
-							font-size: 26rpx;
-							color: #333;
-							font-weight: bold;
-						}
-
-						.goods-num {
-							font-size: 26rpx;
-							color: red;
-							margin-right: 40rpx;
-							font-weight: bold;
-						}
-					}
-
-					.goods-price {
-						font-size: 28rpx;
-					}
-
-					.good-act {
-						margin-top: 12rpx;
-					}
-
-					.gp-item {
-						width: 50%;
-						margin-top: 12rpx;
-					}
-
-					.goodf-act {
-						font-size: 28rpx;
-						color: #333;
-						margin-top: 12rpx;
-					}
-
-					.goods-btn {
-						margin-top: 12rpx;
-					}
-
-					.refund {
-						position: absolute;
-						right: 0;
-						top: 0;
-						background-color: red;
-						color: #fff;
-						border-radius: 4rpx;
-						padding: 0 12rpx;
-						line-height: 40rpx;
-						font-size: 24rpx;
-					}
-				}
-
-			}
-
-			.order-detail-item {
-				font-size: 28rpx;
-				margin-top: 12rpx;
-				color: #777;
-
-				>view {
-					display: inline-block;
-					width: 170rpx;
-				}
-			}
-		}
-
-		.popup-container {
-			padding: 20rpx;
-		}
-
-		.popup-content {
-			padding: 0 24rpx;
-		}
-	}
-</style>

+ 0 - 854
pages/order/refundList.vue

@@ -1,854 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="退款列表"></u-navbar>
-		<view class="header-container">
-			<view class="search">
-				<u-search animation placeholder="请输入订单编号,设备号,用户手机号" :clearabled="false" v-model="keyword"
-					:showAction="false" @search="search"></u-search>
-				<view class="scan-icon" @click="scan">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-			</view>
-
-			<view class="flex align-center justify-between" style="margin-top: 28rpx;">
-				<view class="exceptiontype-container" @tap="actionSheetShow=true">
-					{{orderStatus.name?orderStatus.name:'选择状态'}}
-				</view>
-
-				<view class="flex align-center  date-container">
-					<view class="" style="margin-right: 10rpx;" @tap="dateSelect('start')">
-						{{dateStart?dateStart:'开始日期'}}
-					</view>
-					<view class="" style="margin-right: 10rpx;">至</view>
-					<view class="" @tap="dateSelect('end')">{{dateend?dateend:'结束日期'}}</view>
-				</view>
-
-				<view>
-					<view class="change-month" @tap="changeMonth(-1)">
-						上一月
-					</view>
-					<view class="change-month" style="margin-left: 20rpx;" @tap="changeMonth(1)">
-						下一月
-					</view>
-				</view>
-			</view>
-		</view>
-		<scroll-view @scrolltolower="loadMore" class="scrollview" :scroll-with-animation="true" scroll-y
-			lower-threshold="100" :style="{height:fullHeight}">
-			<view class="order-content" v-if="list&&list.length>0">
-				<block v-for="(item,index) in list" :key="item.id">
-					<view class="scrollview-container">
-						<view class="flex align-center order-top">
-							<view class="">订单编号:{{item.orderId}}</view>
-							<view class="refund-status">
-								<view class="com-status" style="color: #FF1E1E;" v-if="item.refundStatus==1">待处理</view>
-								<view class="com-status" style="color: #aaff00;" v-if="item.refundStatus==2">退款中</view>
-								<view class="com-status" style="color: #bdbdbd;" v-if="item.refundStatus==3">已拒绝</view>
-								<view class="com-status" style="color: #22ca08;" v-if="item.refundStatus==4">已退款</view>
-								<view class="com-status" style="color: #ff5500;" v-if="item.refundStatus==5">退款失败</view>
-							</view>
-						</view>
-						<view class="ddxx-box">
-							<!-- <view class="flex align-center justify-between">
-								<view class="flex align-center">
-									<view class="flex align-end" v-for="(item1,index1) in item.orderRefundGoods"
-										:key="item1.id">
-										<u--image radius="4" width="130rpx" height="130rpx" :src="item1.cover" mode="widthFix"
-											:lazy-lord="true"></u--image>
-										<view class="">×{{item1.totalNumber}}</view>
-									</view>
-								</view>
-							</view> -->
-							<view class="flex align-center con-item">
-								<view class="oc-name">设备id:</view>{{item.deviceId}}
-							</view>
-							<view class="flex align-center con-item martop12">
-								<view class="oc-name">申请时间:</view>{{item.createTime}}
-							</view>
-							<view class="flex align-center con-item martop12">
-								<view class="oc-name">退款原因:</view>{{item.reason}}
-							</view>
-							<view class="flex align-center con-item martop12">
-								<view class="oc-name">商品及说明:</view>{{item.description||'/'}}
-							</view>
-							<view class="flex align-center martop12">
-								<view class="oc-name">联系电话:</view>{{item.memberTel}}
-								<view class="phone"
-									@click="$tab.navigateTo(`/pages/order/userInfo?id=${item.memberTel}`)">
-									会员信息
-								</view>
-							</view>
-
-							<!-- 	<view class="flex align-center con-item">
-								线路:{{item.placeName}}
-							</view> -->
-							<view class="flex align-center justify-between con-item martop12">
-								<view class="flex align-center ">
-									<view class="oc-name">订单金额:</view>¥{{(Number(item.refundTotal)/100).toFixed(2)}}
-								</view>
-
-								<view class="refundamount-text marleft"
-									v-if="item.refundStatus==2||item.refundStatus==4||item.refundStatus==5">
-									退款金额:¥{{(Number(item.refundMoney)/100).toFixed(2)}}
-								</view>
-							</view>
-							<!-- <view class="flex align-end martop">
-								<view class="image-box" v-for="(item2,index2) in item.imgUrls" :key="index2">
-									<u--image radius="4" width="160rpx" height="160rpx" :src="item2" mode="widthFix"
-										:lazy-lord="true"></u--image>
-								</view>
-							</view> -->
-
-							<view class="goods-container" v-for="(item1,index1) in item.orderRefundGoods"
-								:key="item1.id">
-								<view class="flex align-center justify-center image-container">
-									<u--image radius="4" width="130rpx" height="130rpx" :src="item1.cover"
-										mode="aspectFit" :lazy-lord="true"></u--image>
-								</view>
-								<view class="details-container">
-									<view class="flex align-center goods-name-num justify-between">
-										<view class="goods-name">{{item1.goodsName}}</view>
-										<view class="goods-num">×{{item1.totalNumber}}</view>
-									</view>
-									<view class="gp-item">
-										单价:¥{{(Number(item1.totalMoney)/Number(item1.totalNumber))/100}}
-									</view>
-								</view>
-							</view>
-						</view>
-						<view class="flex  align-center justify-end" style="padding-top:12rpx;">
-							<view class="">
-								<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' bgColor='#43cf7c'
-									width='140rpx' @tap="showVideoView(item)">查看视频</xbutton>
-							</view>
-							<view style="margin-left: 24rpx;"
-								v-if="item.refundStatus==1||item.refundStatus==3||item.refundStatus==5">
-								<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' width="150rpx"
-									@click='refund(item)'>
-									退款</xbutton>
-							</view>
-						</view>
-
-					</view>
-				</block>
-				<u-loadmore :status="loadmoreStatus" />
-			</view>
-
-			<view v-else class='empty'>
-				<u-empty mode="data" text="数据为空"></u-empty>
-			</view>
-		</scroll-view>
-
-		<u-popup :show="refundShow" mode="center" :safeAreaInsetBottom="false" @close="refundShow=false" @open="open">
-			<view class="refund-container">
-				<u-radio-group placement="row" v-model="radioType" @change="radioChange">
-					<u-radio :customStyle="{marginRight: '24rpx'}" activeColor="#2C6FF3" label="系统退款" name="2">
-					</u-radio>
-					<u-radio activeColor="#2C6FF3" label="拒绝退款" name="3"></u-radio>
-				</u-radio-group>
-				<view v-if="radioType=='2'">
-					<view class="martop" v-for="(item,index) in orderGoods" :key="item.id">
-						<view class="flex align-center" @tap="checked(item)">
-							<view class="checked">
-								<image v-if="item.checked"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-									mode="widthFix">
-								</image>
-								<image v-else
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-									mode="widthFix"></image>
-							</view>
-							<view class="">{{item.goodsName}}*{{item.totalNumber}}</view>
-						</view>
-						<view class="flex align-center" style="margin-top: 24rpx;">
-							<u-number-box button-size="30" v-model="item.refundNum" class='martop'></u-number-box>
-							<view class='marleft'>
-								<u--input placeholder="退款金额" @blur="refundGoodsChange" type="digit"
-									v-model="item.totalMoney" border="surround">
-								</u--input>
-							</view>
-						</view>
-					</view>
-				</view>
-				<view class='martop'>
-					<u--textarea v-model="remark" placeholder="备注"></u--textarea>
-				</view>
-				<view class="martop" v-if="radioType=='2'">总退款金额:¥{{refundTotalMoney}}</view>
-				<view class="flex align-center justify-end martop">
-					<view class="">
-						<xbutton width='200rpx' @click='refundShow=false'>取消</xbutton>
-					</view>
-					<view class='marleft'>
-						<xbutton width='200rpx' @click="refundSure">确定</xbutton>
-					</view>
-				</view>
-			</view>
-		</u-popup>
-		<u-datetime-picker :show="show" mode="date" v-model="nowDate" @confirm="confirm" :closeOnClickOverlay="true"
-			@close="close" @cancel="close"></u-datetime-picker>
-		<u-action-sheet :show="actionSheetShow" :actions="actions" title="请选择订单状态" @close="actionSheetShow = false"
-			@select="actionsheetSelect($event)"></u-action-sheet>
-		<xvideo :list="videoList" ref="video" showBtn></xvideo>
-	</view>
-</template>
-
-<script>
-	import {
-		refundList,
-		hendel
-	} from "@/api/order/order.js"
-
-	import xvideo from "./components/xvideo.vue"
-	export default {
-		components: {
-			xvideo
-		},
-		data() {
-			return {
-				refundList: [],
-				refundListlenght: '',
-				isEmpty: false,
-
-				refundShow: false,
-				show: false,
-				actionSheetShow: false,
-				mode: 'single',
-
-				index: 1,
-				unchecked: false,
-
-
-				actions: [{
-					name: "全部",
-					label: ""
-				}, {
-					name: "待处理",
-					label: 1
-				}, {
-					name: '已退款',
-					label: 2
-				}, {
-					name: '已拒绝',
-					label: 3
-				}],
-				orderStatus: {
-					name: '全部',
-					label: ''
-				}, //退款状态
-				date: '', //创建时间
-
-				list: [], //订单列表
-				page: 1, //当前分页
-				size: 10, //分页数据条数
-				loadmoreStatus: 'loadmore', //加载更多
-
-				type: '',
-				dateStart: '',
-				dateend: '',
-
-				keyword: '',
-
-				orderGoods: null,
-				radioType: '2',
-
-				remark: '',
-				id: null, //退款订单id
-
-				nowDate: Number(new Date()),
-
-				// refundTotalMoney: 0,
-				refundReason: [],
-				videoList: null,
-				fullHeight: 0,
-				dateDx:0
-			}
-		},
-
-		async onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X", 
-							'iPhone XR', 
-							"iPhone XS", 
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						console.log(res.windowHeight, data.top)
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			await this.getRefundReason()
-			await this.getList()
-		},
-
-		computed: {
-			refundTotalMoney() {
-				let num = 0;
-				if (this.orderGoods) {
-					this.orderGoods.forEach(i => {
-						if (i.checked) {
-							num += Number(i.totalMoney)
-						}
-					})
-				}
-				return num
-			}
-		},
-
-		// watch: {
-		// 	orderGoods: {
-		// 		handler(newVal, oldVal) {
-		// 			let num = 0;
-		// 			if (newVal) {
-		// 				newVal.forEach(i => {
-		// 					if (i.checked) {
-		// 						num += Number(i.totalMoney)
-		// 					}
-		// 				})
-		// 			}
-		// 			this.refundTotalMoney = num
-		// 		},
-		// 		deep: true,
-		// 		immediate: true
-		// 	}
-		// },
-
-		methods: {
-			getRefundReason() {
-				return new Promise((resolve, reject) => {
-					this.getDict('order_refund_refund_reason').then(res => {
-						let newData = []
-						res.forEach(item => {
-							newData.push({
-								name: item.msg,
-								code: item.code
-							})
-						})
-						this.refundReason = newData;
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			changeMonth(add) {
-				this.dateDx += add;
-				var date = new Date();
-				var year = date.getFullYear(); //当前年:四位数字
-				var month = date.getMonth() + 1 + this.dateDx; //当前月:0-11
-				var yeardx = Math.ceil(month / 12) - 1
-				month %= 12;
-				if (month <= 0) month += 12;
-				year += yeardx;
-				month = month < 10 ? ('0' + month) : month;
-
-				this.dateStart = year + '-' + month + '-01';
-
-				var day = 28;
-				if (2 == month) {
-					if (year % 4 == 0) {
-						day = 29;
-					}
-				} else {
-					if (month < 8) {
-						if (1 == month % 2) {
-							day = 31;
-						} else {
-							day = 30;
-						}
-					} else {
-						if (1 == month % 2) {
-							day = 30;
-						} else {
-							day = 31;
-						}
-					}
-				}
-				this.dateend = year + '-' + month + '-' + (day < 10 ? ('0' + day) : day);
-				this.search();
-			},
-
-			dateSelect(type) {
-				if (type == 'start') {
-					this.type = type
-				}
-				if (type == 'end') {
-					this.type = type
-				}
-				this.show = true
-			},
-			confirm(e) {
-				this.show = false
-				if (this.type == 'start') {
-					this.dateStart = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-				}
-				if (this.type == 'end') {
-					this.dateend = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-				}
-				this.reset()
-				this.getList()
-			},
-
-			close() {
-				this.show = false
-			},
-
-			search() {
-				this.reset()
-				this.getList()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.search()
-					}
-				});
-			},
-
-			open() {
-				this.refundShow = true
-			},
-
-			//获取数据列表
-			getList() {
-				refundList({
-					page: {
-						current: this.page,
-						size: this.size,
-					},
-					refundStatus: this.orderStatus.label, //退款状态
-					beginCreateTime: this.dateStart, //时间
-					endCreateTime: this.dateend
-				}).then(res => {
-					let data = res.data.records;
-					let newData = [];
-					console.log('res', data)
-					data.forEach(i => {
-						if (i.imgUrls) {
-							i.imgUrls = i.imgUrls.split(',')
-						}
-						let refundTotal = 0;
-						if (i.orderRefundGoods) { //处理无数据情况
-							i.orderRefundGoods.forEach(j => {
-								refundTotal += j.totalMoney
-							})
-						}
-						if (this.refundReason.length > 0) {
-							this.refundReason.forEach(j => {
-								if (i.reason == j.code) {
-									i.reason = j.name
-								}
-							})
-						}
-
-						i.refundTotal = refundTotal
-						newData.push(i)
-					})
-					if (newData.length < 10) {
-						this.loadmoreStatus = "nomore"
-					} else {
-						this.loadmoreStatus = "loadmore"
-					}
-					this.list = this.list.concat(newData)
-				})
-			},
-
-			//重置数据
-			reset() {
-				this.loadmoreStatus == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.list = [];
-			},
-
-			//上拉加载
-			loadMore(e) {
-				if (this.loadmoreStatus == 'nomore') return
-				this.page++
-				this.getList()
-			},
-
-			//退款按钮
-			refund(e) {
-				this.id = e.id;
-				let orderRefundGoods = JSON.parse(JSON.stringify(e.orderRefundGoods));
-				let arr = []
-				if (orderRefundGoods && orderRefundGoods.length > 0) {
-					arr = orderRefundGoods.map(i => {
-						i.checked = false;
-						i.refundNum = 1;
-						i.totalMoney = Number(i.totalMoney) / 100
-						return i
-					});
-				} else {
-					arr = []
-				}
-				this.orderGoods = JSON.parse(JSON.stringify(arr))
-				this.refundShow = true
-			},
-
-			//退款状态选择
-			actionsheetSelect(e) {
-				this.orderStatus = e
-				this.search()
-			},
-
-			//退款选项
-			radioChange(e) {},
-
-			//选中商品
-			checked(item) {
-				this.orderGoods.forEach(i => {
-					if (i.id == item.id) {
-						i.checked = !i.checked
-					}
-				})
-				this.orderGoods = JSON.parse(JSON.stringify(this.orderGoods))
-			},
-
-			refundGoodsChange(e) {
-				if (!this.$xy.testPrice(e)) {
-					this.$modal.msg('输入价格最低为分!')
-				}
-			},
-
-			// 退款处理确认按钮
-			refundSure() {
-				let ordersGoods = [];
-				if (this.radioType == 2) {
-					for (var i = 0; i < this.orderGoods.length; i++) {
-						let item = this.orderGoods[i]
-						if (item.checked) {
-							if (!this.$xy.testPrice(item.totalMoney)) {
-								this.$modal.msg('输入价格最低为分!')
-								return
-							}
-							ordersGoods.push({
-								goodsId: item.goodsId,
-								totalNumber: item.refundNum,
-								refundMoney: item.totalMoney * 100
-							})
-						}
-					}
-					if (ordersGoods && ordersGoods.length == 0) {
-						this.$modal.msg('请选择退款商品!')
-						return
-					}
-				}
-
-				let params = {
-					id: this.id,
-					refundStatus: Number(this.radioType),
-					ordersGoods: ordersGoods,
-					remark: this.remark
-				}
-
-				console.log('params', params)
-				hendel(params).then(res => {
-					if (res.code == 200) {
-						this.$modal.msg('订单处理成功~')
-						this.search()
-					} else {
-						this.$modal.msg('订单处理失败~')
-					}
-					this.orderGoods = null;
-					this.refundShow = false;
-				})
-			},
-
-			showVideoView(item) {
-				this.$refs.video.show = true
-				this.videoList = [
-					item.urlVideo0,
-					item.urlVideo1
-				]
-			},
-
-			playVideo(o) {
-				if (0 == o) {
-					this.videoUrl = this.selOrder.url0;
-				} else {
-					this.videoUrl = this.selOrder.url1;
-				}
-			},
-
-			closeVideoView() {
-				this.videoUrl = '';
-				this.hiddenOrderVideos = true;
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.martop {
-			margin-top: 30rpx;
-		}
-
-		.empty {
-			margin-top: 40%;
-		}
-
-		.marleft {
-			margin-left: 20rpx;
-		}
-
-		.scrollview {
-			width: 724rpx;
-			margin-left: 13rpx;
-		}
-
-		.header-container {
-			padding: 20rpx 13rpx;
-			background-color: #fff;
-
-			.search {
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					right: 24rpx;
-					top: 50%;
-					transform: translateY(-50%);
-					z-index: 2;
-				}
-			}
-
-			.params-list {
-				.date-container {
-					background-color: #fff;
-					padding: 12rpx 24rpx;
-					border-radius: 15rpx;
-				}
-			}
-
-			.picker-container {
-				width: 150rpx;
-				padding: 12rpx 24rpx;
-				border-radius: 15rpx;
-				background-color: #fff;
-			}
-
-			.exceptiontype-container {
-				background-color: #fff;
-				border-radius: 10rpx;
-				padding: 0 10rpx;
-				width: 140rpx;
-				overflow: hidden;
-				text-overflow: ellipsis;
-				white-space: nowrap;
-				line-height: 50rpx;
-			}
-
-			.change-month {
-				display: inline-block;
-				width: 100rpx;
-				height: 45rpx;
-				border: 1px solid #CCCCCC;
-				border-radius: 6rpx;
-				line-height: 43rpx;
-				text-align: center;
-				border-radius: 10rpx;
-				text-align: center;
-				font-size: 22rpx;
-				color: #777777;
-			}
-		}
-
-		.order-content {
-			overflow: hidden;
-		}
-
-		.scrollview-container {
-			background-color: #fff;
-			margin-top: 20rpx;
-			padding: 20rpx;
-			border-radius: 15rpx;
-			box-shadow: 0 5rpx 4rpx rgba(179, 179, 179, 0.3);
-
-			.order-top {
-				position: relative;
-				font-size: 28rpx;
-				color: #333;
-				font-weight: bold;
-
-				.refund-status {
-					position: absolute;
-					right: 0;
-					top: 0;
-				}
-			}
-
-			.ddxx-box {
-				padding: 20rpx 13rpx;
-				border-radius: 12rpx;
-				font-size: 28rpx;
-				color: #777;
-
-				.martop12 {
-					margin-top: 12rpx;
-				}
-
-				.goods-container {
-					height: 154rpx;
-					padding: 12rpx 12rpx 12rpx 164rpx;
-					box-sizing: border-box;
-					position: relative;
-					border-radius: 8rpx;
-					background-color: #f5f8fb;
-					margin-top: 13rpx;
-
-					.image-container {
-						height: 130rpx;
-						width: 130rpx;
-						position: absolute;
-						left: 12rpx;
-						top: 50%;
-						transform: translateY(-50%);
-					}
-
-					.details-container {
-						position: relative;
-						padding: 12rpx;
-
-						.goods-name-num {
-							.goods-name {
-								font-size: 26rpx;
-								color: #333;
-								font-weight: bold;
-							}
-
-							.goods-num {
-								font-size: 26rpx;
-								color: red;
-								margin-right: 40rpx;
-								font-weight: bold;
-							}
-						}
-
-						.goods-price {
-							font-size: 28rpx;
-						}
-
-						.good-act {
-							margin-top: 12rpx;
-						}
-
-						.gp-item {
-							width: 50%;
-							margin-top: 12rpx;
-						}
-
-						.goodf-act {
-							font-size: 28rpx;
-							color: #333;
-							margin-top: 12rpx;
-						}
-
-						.goods-btn {
-							margin-top: 12rpx;
-						}
-
-						.refund {
-							position: absolute;
-							right: 0;
-							top: 0;
-							background-color: red;
-							color: #fff;
-							border-radius: 4rpx;
-							padding: 0 12rpx;
-							line-height: 40rpx;
-							font-size: 24rpx;
-						}
-					}
-				}
-
-				.oc-name {
-					display: inline-block;
-					width: 170rpx;
-				}
-
-				.phone {
-					display: inline-block;
-					font-size: 26rpx;
-					font-family: PingFang SC;
-					font-weight: 500;
-					color: #2C6FF3;
-					padding: 0 16rpx;
-					line-height: 38rpx;
-					background: #F4F8FF;
-					border-radius: 8rpx;
-					margin-left: 24rpx;
-				}
-			}
-
-			.con-item {
-				margin-top: 12rpx;
-			}
-
-
-
-			.untreated-btn {
-				color: red;
-
-			}
-
-			.refunded-text {
-				margin-left: 10rpx;
-				color: #5e90d9;
-			}
-
-			.refundamount-text {
-				color: red;
-			}
-
-			.image-box+.image-box {
-				margin-left: 12rpx;
-			}
-		}
-
-		.btn {
-			margin-top: 12rpx;
-		}
-
-		.refund-container {
-			background-color: #fff;
-			width: 600rpx;
-			padding: 20rpx 30rpx;
-
-			.checked {
-				width: 36rpx;
-				height: 36rpx;
-				margin-right: 12rpx;
-
-				image {
-					width: 36rpx;
-					height: 36rpx;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 1010
pages/order/riskOrder.vue

@@ -1,1010 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="异常订单"></u-navbar>
-
-		<!-- <view class="time-choose">
-			<view class="flex align-center justify-between top">
-				<view class="con-btn" @tap="changeMonth(-1)">
-					上一月</view>
-				<view class="flex align-center justify-around date-container">
-					<view class="" style="margin-right: 10rpx;" @tap="dateSelect('start')">
-						{{dateStart?dateStart:'开始日期'}}
-					</view>
-					<view class="" style="margin-right: 10rpx;">至</view>
-					<view class="" @tap="dateSelect('end')">{{dateEnd?dateEnd:'结束日期'}}</view>
-				</view>
-				<view class="con-btn" @tap="changeMonth(1)">下一月</view>
-			</view>
-		</view> -->
-
-		<view class="header-container">
-			<view class="header-text flex align-center">
-				<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/order/risk-num.png"
-					mode="widthFix"></image>您有待处理异常订单:<text style="font-weight: bold;">{{orderNum}}</text>笔
-			</view>
-			<view class="search">
-				<u-search animation placeholder="可输入订单编号,设备号,用户手机号" :clearabled="false" v-model="keyword"
-					:showAction="false" @search="search"></u-search>
-			</view>
-
-			<view class="flex align-center justify-between" style="margin-top: 28rpx;">
-				<view class="exceptiontype-container" @tap="actionSheetShow=true">
-					{{status?status:'选择状态'}}
-				</view>
-
-				<view class="flex align-center  date-container">
-					<view class="" style="margin-right: 10rpx;" @tap="dateSelect('start')">
-						{{dateStart?dateStart:'开始日期'}}
-					</view>
-					<view class="" style="margin-right: 10rpx;">至</view>
-					<view class="" @tap="dateSelect('end')">{{dateEnd?dateEnd:'结束日期'}}</view>
-				</view>
-
-				<view>
-					<view class="change-month" @tap="changeMonth(-1)">
-						上一月
-					</view>
-					<view class="change-month" style="margin-left: 20rpx;" @tap="changeMonth(1)">
-						下一月
-					</view>
-				</view>
-			</view>
-			<!-- <view class='martop'>
-				<u-subsection :list="list" activeColor="#2C6FF3" :current="current"
-					@change="sectionChange"></u-subsection>
-			</view> -->
-			<view class="tab-wrap">
-				<view class="tab">
-					<u-tabs :list="list" :activeStyle="{color: '#333',fontWeight: 'bold',fontSize:'28rpx'}"
-						:inactiveStyle="{fontSize:'28rpx'}" :scrollable="false" :current="current"
-						@click="sectionChange" lineColor="#2C6FF3">
-					</u-tabs>
-				</view>
-			</view>
-		</view>
-		<scroll-view class="scrollview" scroll-y="true" scroll-with-animation="true" lower-threshold="100"
-			@scrolltolower="loadMore" :style="{height:fullHeight}">
-			<view class="scroll-content" v-if="commList&&commList.length>0">
-				<block v-for="(item,index) in commList" :key="item.id">
-					<view class="abnormal-container">
-						<view class="flex align-center justify-between">
-							<!-- 				<view class="flex align-center image-container">
-								<view style="margin-right: 16rpx;" v-for="(item1,index1) in item.orderGoods" :key="item1.id">
-									<u--image width="110rpx" :src="item1.goodslmgUrl" mode="widthFix" :lazy-lord="true">
-									</u--image>
-								</view>
-							</view> -->
-							<view class="flex align-center error-type">
-								<image
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/order/risk-tip.png"
-									mode="widthFix"></image>{{item.riskTypeDesc}}
-							</view>
-							<view class="com-status" style="color: #FF1E1E;" v-if="item.status==1">待处理</view>
-							<view class="com-status" style="color: #22ca08;" v-if="item.status==2">已审核</view>
-							<view class="com-status" style="color: #ffaa00;" v-if="item.status==3">审核中</view>
-							<view class="com-status" style="color: #bdbdbd;" v-if="item.status==4">已结束</view>
-						</view>
-						<view class="fx-box">
-							<view class="device-name" v-if="item.deviceName">
-								{{item.deviceName}}<text>({{item.deviceId}})</text>
-							</view>
-							<view class="device-name" v-else>{{item.deviceId}}</view>
-							<view class="flex align-center martop12">
-								<view class="">
-									<view class="oc-name">订单编号:</view>{{item.orderId||'/'}}<text class="under-line-text"
-										@tap="copy(item.orderId)">复制</text>
-								</view>
-							</view>
-							
-							<view class="flex align-center martop12">
-								<view class="oc-name">支付类型:</view>{{item.payStatus||'/'}}
-							</view>
-							
-							<view class="order-detail-item martop12">
-								<view class="oc-name">设备类型:</view>{{item.deviceType||'/'}}
-							</view>
-
-							<view class="flex align-center martop12">
-								<view class="oc-name">订单状态:</view><text style="color: red;">{{item.orderStatusDesc||'/'}}</text>
-							</view>
-
-							<view class="flex align-center martop12">
-								<view class="oc-name">补扣金额:</view>¥{{$xy.delMoney(item.cutMoney)}}
-							</view>
-
-							<view class="flex align-center martop12">
-								<view class="oc-name">联系电话:</view>{{item.memberPhone}}
-								<view class="phone" @click="call(item.memberPhone)">
-									<image
-										src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/order/phone.png"
-										mode="widthFix"></image>拨打
-								</view>
-							</view>
-
-							<view class="flex align-center martop12">
-								<view class="oc-name">创建时间:</view>{{item.createTime}}
-							</view>
-
-							<view class="goods-container" v-for="(item1,index1) in item.orderGoods" :key="item1.id">
-								<view class="flex align-center justify-center image-container">
-									<u--image radius="4" width="130rpx" height="130rpx" :src="item1.goodsImgUrl"
-										mode="aspectFit" :lazy-lord="true"></u--image>
-								</view>
-								<view class="details-container">
-									<view class="flex align-center goods-name-num justify-between">
-										<view class="goods-name">{{item1.goodsName}}</view>
-										<view class="goods-num">×{{item1.totalNumber}}</view>
-									</view>
-									<view class="gp-item">
-										单价:¥{{(Number(item1.totalMoney)/Number(item1.totalNumber))/100}}
-									</view>
-									<view class="gp-item" v-if="item1.refundMoney||item1.refundMoney!=0">
-										已退款:¥{{$xy.delMoney(item1.refundMoney)}}
-									</view>
-									<view class="goods-price flex">
-									</view>
-								</view>
-							</view>
-
-							<!-- <view class="flex align-center justify-end" v-if="item.cutGoodsNumber!=null">
-								共计<text style="color: red;font-weight: bold;">{{item.cutGoodsNumber}}</text>件
-							</view> -->
-						</view>
-						
-						<view class="flex align-center martop12 re-back" v-if="item.status!=2&&item.status!=4">
-							<view class="oc-name">驳回原因:</view>{{item.orderStatusDesc||'/'}}
-						</view>
-
-						<view class="martop">
-							<view class="flex justify-start">
-								<view class="">
-									<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' bgColor='#43cf7c'
-										width='140rpx' @tap="showlogs(item.activityId)">交易日志</xbutton>
-								</view>
-							<!-- 	<view class="marleft24">
-									<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' width='200rpx'
-										bgColor='#43cf7c'>查看处理记录
-									</xbutton>
-								</view> -->
-								<view class="marleft24">
-									<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' width='200rpx'
-										bgColor='#43cf7c' @tap="deviceCom(item)">查看设备商品
-									</xbutton>
-								</view>
-							</view>
-							<view class="flex justify-end martop">
-								<view class="marleft24">
-									<xbutton size='medium' round='25rpx' padding='0rpx 20rpx'
-										@click="block(item.memberId)">拉黑</xbutton>
-								</view>
-								<view v-if="item.status=='1'" class="marleft24">
-									<xbutton size='medium' round='25rpx' padding='0rpx 20rpx'
-										@tap='showFinishOrderView(item)'>结束</xbutton>
-								</view>
-								<view class="marleft24" v-if="item.status=='3'">
-									<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' @tap='backApply(item)'>撤回
-									</xbutton>
-								</view>
-								<view class="marleft24">
-									<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' width='140rpx'
-										@tap="showVideoView(item)">查看视频</xbutton>
-								</view>
-								<view class="marleft24" v-if="item.status=='1'">
-									<xbutton size='medium' round='25rpx' padding='0rpx 20rpx'
-										@tap='supplementaryDeduction(item)'>申请立即扣款</xbutton>
-								</view>
-							</view>
-						</view>
-					</view>
-				</block>
-				<view class="load-more" v-if="commList.length>0">
-					<u-loadmore :status="loadmoreStatus" />
-				</view>
-			</view>
-			<view v-else class='empty'>
-				<u-empty mode="data" text="数据为空"></u-empty>
-			</view>
-		</scroll-view>
-		<u-action-sheet :show="actionSheetShow" :actions="exceptionTypeList" title="请选择状态"
-			@close="actionSheetShow = false" @select="actionsheetSelect($event)"></u-action-sheet>
-		<!-- :minDate="minDate" :maxDate="maxDate" -->
-		<u-datetime-picker :show="show" v-model="timeStamp" mode="date" @confirm="confirm" @cancel="close">
-		</u-datetime-picker>
-		<view :hidden="hiddenOrderVideos" class="popup_content">
-			<view class="flex">
-				<video id="myVideo" :src="videoUrl" style="width:100%;height: 372rpx; margin: 10rpx 10rpx;"></video>
-			</view>
-			<view class="flex" style="margin-top: 10rpx;">
-				<view class="marleft">
-					<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' bgColor='#2C6FF3' @tap="playVideo(0)">主视频
-					</xbutton>
-				</view>
-				<view class="marleft">
-					<xbutton size='medium' round='25rpx' padding='0rpx 20rpx' bgColor='#2C6FF3' @tap="playVideo(1)">副视频
-					</xbutton>
-				</view>
-			</view>
-		</view>
-		<view class="popup_overlay" :hidden="hiddenOrderVideos" @click="closeVideoView()"></view>
-		<xpopup :show="blockShow" @close="blockClose" @confirm="submit" :showBtn="true" :title="popTitle">
-			<!-- 拉黑 -->
-			<view class="pop-content restart" v-if="popTitle=='拉黑'">
-				是否确定拉黑该用户?
-			</view>
-			<!-- 撤回 -->
-			<view class="pop-content restart" v-if="popTitle=='撤回'">
-				是否确定撤回该申请?
-			</view>
-		</xpopup>
-		<xpopup :show="finishOrderDetail.show" @close="blockClose" @confirm="finshOrder" :showBtn="true" title="结束订单">
-			<view class="pop-content">
-				<view class="text-notice">
-					警告:订单结束后,将不能再进行补扣
-				</view>
-				<view class="input">
-					<u--textarea placeholder="请输入结束原因" border="surround" v-model="finishOrderDetail.reason" count
-						maxlength="140"></u--textarea>
-				</view>
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		cancelOrder,
-		page,
-		todoNum,
-		rollback
-	} from "@/api/order/riskorder.js"
-	import {
-		divide
-	} from "../../uni_modules/uview-ui/libs/function/digit";
-	import {
-		setBlacklist
-	} from "@/api/order/order.js"
-	export default {
-		data() {
-			return {
-				hiddenOrderVideos: true,
-				selOrder: undefined,
-				videoUrl: '',
-				minDate: '',
-				maxDate: '',
-				isEmpty: false,
-				page: 1, //当前分页
-				size: 10, //分页数据条数
-				actionSheetShow: false,
-				riskOrderList: [],
-				loadmoreStatus: 'loadmore',
-				exceptionTypeList: [],
-				show: false,
-				dateStart: '',
-				dateEnd: '',
-				dateDx: 0,
-				// beginTime: '',
-				// endTime: '',
-				type: '',
-				current: 0,
-				status: '',
-				list: [{
-					name: '待处理'
-				}, {
-					name: '审核中'
-				}, {
-					name: '已审核'
-				}, {
-					name: '已结束'
-				}],
-				commList: [],
-				orderNum: 0, //异常订单数量
-				code: '',
-				deviceId: '',
-				timeStamp: new Date(), //时间picker显示时间
-				memberId: null, //用户id
-				goodId: null, //商品id
-				finishOrderDetail: {
-					show: false,
-					reason: "未拿取商品",
-					id: undefined
-				},
-				blockShow: false, //拉黑弹框
-				keyword: '',
-				fullHeight: 0,
-				popTitle: '拉黑',
-
-			}
-		},
-
-		computed: {
-			orderStatus() {
-				let status = 1
-				switch (this.current) {
-					case 0:
-						status = 1
-						break;
-					case 1:
-						status = 3
-						break;
-					case 2:
-						status = 2
-						break;
-					case 3:
-						status = 4
-						break;
-					default:
-						break;
-				}
-				return status
-			}
-		},
-
-		onShow() {
-			this.getOrderNum()
-			this.search()
-		},
-
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						console.log(res.windowHeight, data.top)
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			this.getDict('order_risk_type').then(res => {
-				let newData = []
-				res.forEach(item => {
-					newData.push({
-						name: item.msg,
-						code: item.code
-					})
-				})
-				this.exceptionTypeList = newData;
-			})
-		},
-
-		methods: {
-
-			// function getLastMonth() {
-			//     var date = new Date();
-			//     var year = date.getFullYear();   //当前年:四位数字
-			//     var month = date.getMonth();     //当前月:0-11
-
-			//     if (month == 0) {   //如果是0,则说明是1月份,上一个月就是去年的12月
-			//         year -= 1;
-			//         month = 12;
-			//     }
-
-			//     month = month < 10 ? ('0' + month) : month;   //月份格式化:月份小于10则追加个0
-
-			//     let lastYearMonth = year + '-' + month;
-
-			//     return lastYearMonth;
-			// },
-			changeMonth(add) {
-				this.dateDx += add;
-				var date = new Date();
-				var year = date.getFullYear(); //当前年:四位数字
-				var month = date.getMonth() + 1 + this.dateDx; //当前月:0-11
-				var yeardx = Math.ceil(month / 12) - 1
-				month %= 12;
-				if (month <= 0) month += 12;
-				year += yeardx;
-				month = month < 10 ? ('0' + month) : month;
-
-				this.dateStart = year + '-' + month + '-01';
-
-				var day = 28;
-				if (2 == month) {
-					if (year % 4 == 0) {
-						day = 29;
-					}
-				} else {
-					if (month < 8) {
-						if (1 == month % 2) {
-							day = 31;
-						} else {
-							day = 30;
-						}
-					} else {
-						if (1 == month % 2) {
-							day = 30;
-						} else {
-							day = 31;
-						}
-					}
-				}
-				this.dateEnd = year + '-' + month + '-' + (day < 10 ? ('0' + day) : day);
-				this.search()
-			},
-			getOrderNum() {
-				todoNum().then(res => {
-					let orderNum = res.data
-					if (res.code == 200) {
-						this.orderNum = res.data
-					} else {
-						this.orderNum = 0
-					}
-				})
-			},
-
-			loadMore(e) {
-				if (this.loadmoreStatus == 'nomore') return
-				this.page++
-				this.getpage()
-			},
-			sectionChange(e) {
-				this.current = e.index
-				this.search()
-			},
-
-			// 搜索列表
-			search() {
-				this.reset();
-				this.getpage()
-			},
-
-			call(tell) {
-				uni.makePhoneCall({
-					phoneNumber: tell
-				})
-			},
-			actionsheetSelect(e) {
-				this.status = e.name
-				this.code = e.code
-				this.search()
-			},
-			copy(text) {
-				uni.setClipboardData({
-					data: text,
-					success: (data) => {
-						uni.showToast({
-							title: '复制成功'
-						})
-					},
-					fail: function(err) {
-
-					},
-					complete: function(res) {
-
-					}
-				})
-			},
-			dateSelect(type) {
-				if (type == 'start') {
-					this.type = type
-				}
-				if (type == 'end') {
-					this.type = type
-				}
-				this.show = true
-			},
-			confirm(e) {
-				console.log(e)
-				if (this.type == 'start') {
-					this.dateStart = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-				}
-				if (this.type == 'end') {
-					this.dateEnd = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-
-				}
-				if (this.dateStart && this.dateEnd) {
-					if (this.dateStart > this.dateEnd) {
-						uni.$u.toast('开始日期不能大于结束日期')
-						return;
-					}
-				}
-
-				this.search()
-				this.show = false
-			},
-			close() {
-				this.show = false
-			},
-			supplementaryDeduction(item) {
-				uni.setStorageSync('riskOrder', JSON.stringify(item)) //存储订单信息
-				this.$tab.navigateTo('/pages/order/riskOrderDel?id=' + item.id + '&deviceId=' + item
-					.deviceId)
-			},
-			getpage() {
-				page({
-					page: {
-						current: this.page,
-						size: this.size,
-					},
-					search: this.keyword,
-					riskType: this.code, //异常类型
-					status: this.orderStatus, //状态
-					beginDate: this.dateStart,
-					endDate: this.dateEnd
-				}).then(res => {
-					let data = res.data.records;
-					if (data.length < 10) {
-						this.loadmoreStatus = "nomore"
-					} else {
-						this.loadmoreStatus = "loadmore"
-					}
-					this.commList = this.commList.concat(data)
-					console.log()
-				})
-			},
-
-			reset() {
-				this.loadmoreStatus == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-			showlogs(activtyId) {
-				this.$tab.navigateTo('/pages/order/orderLogs?id=' + activtyId);
-			},
-			showVideoView(item) {
-				console.log(item);
-				this.hiddenOrderVideos = false;
-				this.selOrder = item;
-				var urls = item.video.split(',');
-				this.selOrder.url0 = urls[0];
-				this.selOrder.url1 = urls[1];
-				this.playVideo(0);
-			},
-			playVideo(o) {
-				if (0 == o) {
-					this.videoUrl = this.selOrder.url0;
-				} else {
-					this.videoUrl = this.selOrder.url1;
-				}
-			},
-			closeVideoView() {
-				this.videoUrl = '';
-				this.hiddenOrderVideos = true;
-			},
-
-			block(e) {
-				this.popTitle = '拉黑'
-				this.memberId = e
-				this.blockShow = true;
-			},
-
-			// 关闭弹框
-			blockClose(e) {
-				this.blockShow = false;
-				this.finishOrderDetail.show = false;
-			},
-
-			// 弹框确定
-			submit() {
-				if (this.popTitle == '拉黑') {
-					setBlacklist({
-						memberId: this.memberId
-					}).then(res => {
-						this.$modal.msg('拉黑成功~')
-					}).catch(err => {
-
-					})
-				} else {
-					rollback({
-						riskId: this.goodId
-					}).then(res => {
-						this.$modal.msg('撤回成功~')
-						this.search();
-					})
-				}
-
-				this.blockClose()
-			},
-			showFinishOrderView(v) {
-				this.finishOrderDetail.id = v.id;
-				this.finishOrderDetail.reason = "未拿商品";
-				this.finishOrderDetail.show = true;
-			},
-			finshOrder() {
-				if (!uni.$u.test.rangeLength(this.finishOrderDetail.reason, [4, 140])) {
-					this.$modal.msg('请输入结束原因')
-					return;
-				}
-				cancelOrder({
-					"id": this.finishOrderDetail.id,
-					"reason": this.finishOrderDetail.reason
-				}).then(res => {
-					this.$modal.msg('提交申请成功~')
-					this.finishOrderDetail.show = false;
-					this.getOrderNum();
-					this.search();
-				})
-			},
-
-			// 撤回
-			backApply(item) {
-				this.popTitle = '撤回'
-				this.goodId = item.id
-				this.blockShow = true;
-			},
-			
-			// 设备商品查看
-			deviceCom(item){
-				this.$tab.navigateTo(`/pages/equipment/comManage?id=${item.deviceId}&deviceName=${item.deviceName}`)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-
-		.marleft24 {
-			margin-left: 24rpx;
-		}
-
-		.martop {
-			margin-top: 20rpx;
-		}
-
-		.xian {
-			border-bottom: 1px solid #5b5b5b;
-			margin: 20rpx 0;
-		}
-
-		.marleft {
-			margin-left: 12rpx;
-		}
-
-		// .time-choose {
-		// 	background-color: #fff;
-
-		// 	.top {
-		// 		height: 80rpx;
-		// 		color: #fff;
-		// 		padding: 0 20rpx;
-		// 		background-color: #2C6FF3;
-		// 		border-radius: 0px 0px 50rpx 50rpx;
-
-		// 		.con-btn {
-		// 			padding: 0 36rpx;
-		// 		}
-
-		// 		.date-container {
-		// 			min-width:380rpx;
-		// 			height: 50rpx;
-		// 			background-color: #fff;
-		// 			padding: 0 20rpx;
-		// 			border-radius: 10rpx;
-		// 			line-height: 50rpx;
-		// 			color: #000;
-		// 		}
-
-		// 	}
-		// }
-
-		.header-container {
-			padding: 27rpx 13rpx 0;
-			background-color: #fff;
-
-			.header-text {
-				width: 716;
-				margin-left: 21rpx;
-				height: 52rpx;
-				font-size: 28rpx;
-				color: #333;
-				background: linear-gradient(90deg, #FEE2E2, #FFFFFF);
-
-				>image {
-					width: 52rpx;
-					height: 52rpx;
-					margin-right: 13rpx;
-					margin-left: -21rpx;
-				}
-
-				text {
-					color: #FF0000;
-					font-size: 36rpx;
-					padding: 0 12rpx;
-				}
-			}
-
-			.search {
-				margin-top: 37rpx;
-			}
-
-			.exceptiontype-container {
-				background-color: #fff;
-				border-radius: 10rpx;
-				padding: 0 10rpx;
-				width: 140rpx;
-				overflow: hidden;
-				text-overflow: ellipsis;
-				white-space: nowrap;
-				line-height: 50rpx;
-			}
-
-			.change-month {
-				display: inline-block;
-				width: 100rpx;
-				height: 45rpx;
-				border: 1px solid #CCCCCC;
-				border-radius: 6rpx;
-				line-height: 43rpx;
-				text-align: center;
-				border-radius: 10rpx;
-				text-align: center;
-				font-size: 22rpx;
-				color: #777777;
-			}
-
-			.tab-wrap {
-				margin-top: 20rpx;
-			}
-		}
-
-		.scrollview {
-			.scroll-content {
-				width: 724rpx;
-				margin-left: 13rpx;
-				overflow: hidden;
-			}
-
-			.load-more {
-				padding-bottom: 24rpx;
-			}
-
-			.empty {
-				margin-top: 40%;
-			}
-		}
-
-
-		.abnormal-container {
-			margin-top: 20rpx;
-			padding: 30rpx 32rpx;
-			border-radius: 15rpx;
-			background-color: #fff;
-			box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-
-			.error-type {
-				font-size: 32rpx;
-				font-weight: 800;
-				color: #333333;
-
-				>image {
-					width: 40rpx;
-					height: 40rpx;
-					margin-right: 22rpx;
-				}
-			}
-
-			.fx-box {
-				margin-top: 24rpx;
-				padding-left: 8rpx;
-				font-size: 28rpx;
-				color: #777;
-
-				.device-name {
-					font-size: 28rpx;
-					font-weight: bold;
-					color: #333;
-					margin-bottom: 12rpx;
-
-					>text {
-						font-size: 24rpx;
-					}
-				}
-
-				.under-line-text {
-					font-size: 26rpx !important;
-					font-weight: 500;
-					font-style: italic;
-					text-decoration: underline;
-					color: #2C6FF3 !important;
-					margin-left: 24rpx;
-					background-color: #fff !important;
-				}
-
-				.oc-name {
-					display: inline-block;
-					width: 170rpx;
-				}
-
-				.phone {
-					display: inline-block;
-					font-size: 26rpx;
-					font-family: PingFang SC;
-					font-weight: 500;
-					color: #2C6FF3;
-					padding: 0 16rpx;
-					line-height: 38rpx;
-					background: #F4F8FF;
-					border-radius: 8rpx;
-					margin-left: 24rpx;
-
-					>image {
-						width: 20rpx;
-						height: 20rpx;
-						margin-right: 13rpx;
-					}
-				}
-
-				.goods-container {
-					height: 154rpx;
-					margin-top: 14rpx;
-					padding: 12rpx 12rpx 12rpx 164rpx;
-					box-sizing: border-box;
-					position: relative;
-					border-radius: 8rpx;
-					background-color: #f5f8fb;
-
-					.image-container {
-						height: 130rpx;
-						width: 130rpx;
-						position: absolute;
-						left: 12rpx;
-						top: 50%;
-						transform: translateY(-50%);
-					}
-
-					.details-container {
-						position: relative;
-						padding: 12rpx;
-
-						.goods-name-num {
-							.goods-name {
-								font-size: 26rpx;
-								color: #333;
-								font-weight: bold;
-							}
-
-							.goods-num {
-								font-size: 26rpx;
-								color: red;
-								margin-right: 40rpx;
-								font-weight: bold;
-							}
-						}
-
-						.goods-price {
-							font-size: 28rpx;
-						}
-
-						.good-act {
-							margin-top: 12rpx;
-						}
-
-						.gp-item {
-							width: 50%;
-							margin-top: 12rpx;
-						}
-
-						.goodf-act {
-							font-size: 28rpx;
-							color: #333;
-							margin-top: 12rpx;
-						}
-
-						.goods-btn {
-							margin-top: 12rpx;
-						}
-
-						.refund {
-							position: absolute;
-							right: 0;
-							top: 0;
-							background-color: red;
-							color: #fff;
-							border-radius: 4rpx;
-							padding: 0 12rpx;
-							line-height: 40rpx;
-							font-size: 24rpx;
-						}
-					}
-
-				}
-			}
-
-			.image-container {
-				view {
-					width: 100rpx;
-					height: 100rpx;
-					background-color: #ccc;
-				}
-			}
-
-			.orderstatus {
-				padding: 20rpx;
-				background-color: #43cf7c;
-				border-radius: 80rpx;
-				color: #fff;
-			}
-		}
-		
-		.re-back{
-			background-color: #FFF7F7;
-			padding:10rpx 10rpx 36rpx;
-			line-height: 36rpx;
-			font-size: 28rpx;
-			border-radius: 14rpx;
-			
-			.oc-name {
-				display: inline-block;
-				width: 170rpx;
-			}
-		}
-	}
-
-	.popup_overlay {
-		position: fixed;
-		top: 0%;
-		left: 0%;
-		width: 100%;
-		height: 100%;
-		background-color: black;
-		z-index: 1001;
-		-moz-opacity: 0.8;
-		opacity: .80;
-		filter: alpha(opacity=88);
-	}
-
-	.popup_content {
-		position: fixed;
-		top: 50%;
-		left: 50%;
-		width: 700rpx;
-		height: 500rpx;
-		margin-left: -350rpx;
-		margin-top: -250rpx;
-		border: 10px solid white;
-		background-color: white;
-		z-index: 1002;
-		overflow: auto;
-	}
-
-	.pop-content {
-		padding: 24rpx;
-	}
-
-	.text-notice {
-		color: red;
-		font-size: 28rpx;
-		height: 40rpx;
-		line-height: 40rpx;
-	}
-
-	.input {
-		margin-top: 20rpx;
-		height: 200rpx;
-		width: 100%;
-		// border-style: solid;
-		// border-width: 1rpx;
-		// border-color: #2C6FF3;
-		// border-radius: 10rpx;
-	}
-
-	.marginTop {
-		margin-top: 24rpx;
-	}
-
-	.martop12 {
-		margin-top: 12rpx;
-	}
-</style>

+ 0 - 432
pages/order/riskOrderDel.vue

@@ -1,432 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="风险订单补扣"></u-navbar>
-		<view class="video-container">
-			<video :src="videoUrl" style="width: 100%;"></video>
-			<view class="flex align-center justify-between" style="padding:0 24rpx;">
-				<view class="video-tab">
-					<u-subsection :list="videoType" activeColor="#2C6FF3" :current="videoCurrent"
-						@change="sectionChange">
-					</u-subsection>
-				</view>
-				<view class="flex">
-					<view>
-						<xbutton size="mini" padding="0 20rpx" @tap='addCom(deviceId)'>添加商品</xbutton>
-					</view>
-					<view style="margin-left: 24rpx;">
-						<xbutton size="mini" width='180rpx' @tap='submit'>提交补扣申请</xbutton>
-					</view>
-				</view>
-			</view>
-		</view>
-		<view class="goods-select" v-if="goodsList.length>0">
-			<u-scroll-list :indicator="indicator" indicatorColor="#fff0f0" indicatorActiveColor="#f56c6c">
-				<view class="flex justify-around">
-					<view class="goods-item" v-for="(item,index) in goodsList" :key="index">
-						<view class="flex flex-direction align-center justify-center image-dele-container goodContainer"
-							@tap="clean(index,item)">
-							<!-- <view class="flex align-center justify-center numberContainer">
-								{{value}}
-							</view> -->
-							<view class="image">
-								<u--image radius="4" width="100rpx" height="100rpx" :src="item.goodsImg" mode="aspectFit"
-									:lazy-lord="true"></u--image>
-							</view>
-							<view class="goods-select-name">{{item.name}}</view>
-						</view>
-						<view class="flex align-center justify-center" style="margin-top: 8rpx;">
-							<view class="flex align-center justify-center">
-								<view class="minus" @tap="reduce(item,index)">
-									<u-icon name="minus" size="12"></u-icon>
-								</view>
-								<text style="width: 50rpx;text-align: center;" class="input">{{item.number}}</text>
-								<view class="plus" @tap="add(item)">
-									<u-icon name="plus" color="#FFFFFF" size="12"></u-icon>
-								</view>
-							</view>
-						</view>
-					</view>
-				</view>
-			</u-scroll-list>
-		</view>
-
-		<view class="goods-select-empty" v-else>
-			添加需要补扣的商品~
-		</view>
-
-		<view class="classify-wrap">
-			<Classify :status="status" :commList="commList"
-				@comClick='detail' :height="fullHeight" :leftShow="false" />
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		ownerGoodsList,
-		list
-	} from "@/api/commodity/goods.js"
-	import {
-		apply
-	} from "@/api/order/riskorder.js"
-	import {
-		categoryList
-	} from "@/api/device/device.js"
-	import Classify from "@/components/classify/index.vue"
-	export default {
-		components: {
-			Classify
-		},
-		data() {
-			return {
-				scrollintoview: '',
-				fullHeight: '0',
-				tabList: [], //商品类目
-				commList: [], //商品列表
-				goodsList: [], //商品id列表
-				status: 'nomore', //加载更多
-				riskId: '',
-				deviceId: '',
-				video: {
-					url1: '',
-					url2: ''
-				},
-				videoUrl: null,
-				videoType: ['主视频', '副视频'],
-				videoCurrent: 0,
-				statGoodsList: [], //平台识别补扣商品
-			}
-		},
-
-		onLoad(e) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".classify-wrap").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X", 
-							'iPhone XR', 
-							"iPhone XS", 
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top  + 'px';
-						}
-					},
-				});
-			}).exec();
-			// uni.getSystemInfo({
-			// 	success(res) {
-			// 		_this.fullHeight = 2 * (res.windowHeight - res.statusBarHeight - 44 - 143) + 'rpx';
-			// 	},
-			// });
-			this.riskId = e.id
-			this.deviceId = e.deviceId
-			this.initOrder()
-		},
-		
-		onShow() {
-			this.getCommList()
-		},
-
-		methods: {
-			//初始化页面信息
-			initOrder() {
-				let orderDetail = JSON.parse(uni.getStorageSync('riskOrder'));
-				if (orderDetail.video) {
-					this.video = {
-						url1: orderDetail.video.split(',')[0],
-						url2: orderDetail.video.split(',')[1]
-					}
-					this.videoUrl = this.video.url1
-				} else {
-					this.video = {
-						url1: '',
-						url2: ''
-					}
-				}
-
-
-				let tempGoodsList = orderDetail.orderGoods.map(i => {
-					return {
-						goodsImg: i.goodsImgUrl,
-						spid: i.goodsId,
-						name: i.goodsName,
-						price: Number(i.totalMoney) / 100,
-						number: Number(i.totalNumber),
-						initNum: Number(i.totalNumber)
-					}
-				})
-
-				this.statGoodsList = JSON.parse(JSON.stringify(tempGoodsList))
-				this.goodsList = JSON.parse(JSON.stringify(tempGoodsList))
-			},
-
-			sectionChange(e) {
-				this.videoCurrent = e;
-				if (e == 0) {
-					this.videoUrl = this.video.url1
-				} else {
-					this.videoUrl = this.video.url2
-				}
-			},
-
-			//根据类目获取商品列表
-			getCommList() {
-				list({
-					deviceId: this.deviceId,
-				}).then(res => {
-					let data = res.data;
-					let newData = data.map(i => {
-						i.price = (Number(i.price) / 100).toFixed(2)
-						return i
-					})
-					this.commList = newData
-				})
-			},
-
-			statGoodsTips() {
-				this.$modal.msg('该商品为平台算法识别异常商品,为防止您的无辜损失,无法再删减!')
-			},
-
-			clean(e, item) { //点击移除商品
-				//校验是否算法识别商品
-				if (this.isStatGoods(item)) {
-					this.statGoodsTips()
-					return
-				}
-				this.goodsList.splice(e, 1)
-			},
-
-			// 校验是否算法识别商品
-			isStatGoods(e) {
-				console.log(e)
-				console.log(this.statGoodsList)
-				for (let i = 0; i < this.statGoodsList.length; i++) {
-					let item = this.statGoodsList[i];
-					if (item.spid == e.spid) {
-						return true
-					}
-				}
-				return false
-			},
-
-			//校验是否减少了算法识别商品
-			isDelStatGoods(e) {
-				for (let i = 0; i < this.statGoodsList.length; i++) {
-					let item = this.statGoodsList[i];
-					if (item.spid == e.spid && item.number == e.number) {
-						return true
-					}
-				}
-				return false
-			},
-
-			detail(e) {
-				this.goodsList.forEach(item => {
-					if (e.goodsId == item.spid) {
-						this.add(item)
-					}
-				})
-
-				for (var i = 0; i < this.goodsList.length; i++) {
-					if (this.goodsList[i].spid == e.goodsId) {
-						return;
-					}
-				}
-
-				this.goodsList.push({
-					goodsImg: e.cover,
-					spid: e.goodsId,
-					name: e.name,
-					price: e.price,
-					number: 1,
-					initNum: 0
-				})
-
-			},
-			//新增
-			add(e) {
-				e.number++
-			},
-			//减少
-			reduce(e, index) {
-				if (this.isDelStatGoods(e)) { //校验是否减少了算法识别商品
-					this.statGoodsTips()
-					return
-				}
-				e.number--
-				if (e.number == 0) {
-					this.goodsList.splice(index, 1)
-				}
-			},
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.commList = [];
-			},
-			
-			// 添加商品至机器
-			addCom(deviceId){
-				this.$tab.navigateTo('/pages/equipment/addCom?id='+deviceId)
-			},
-			
-			//提交补扣申请
-			submit() {
-				if (!this.goodsList.length) {
-					uni.$u.toast('请选择商品')
-					return;
-				}
-
-				var goodsId = []
-				this.goodsList.forEach(item => {
-					if (item.number - item.initNum > 0) { //除去算法识别商品
-						goodsId.push({
-							goodsId: item.spid,
-							goodsName: item.name,
-							price: (Number(item.price)) * 100,
-							totalNumber: item.number - item.initNum
-						})
-					}
-				})
-				apply({
-					"cutGoods": goodsId,
-					"riskId": this.riskId
-				}).then(res => {
-					this.$modal.msg('提交申请成功~')
-					setTimeout(() => {
-						this.$tab.navigateBack()
-					}, 800)
-				})
-			}
-		},
-
-		onUnload() {
-			uni.setStorage('riskOrder', '')
-		},
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.martop {
-			margin-top: 20rpx;
-		}
-
-		.margin {
-			margin: 10rpx 20rpx;
-		}
-
-		.margintop {
-			margin-top: 10rpx;
-		}
-
-		.video-container {
-			.video-tab {
-				width: 300rpx;
-			}
-		}
-
-		.box {
-			padding: 20rpx 24rpx;
-		}
-
-		.goods-item+.goods-item {
-			margin-left: 12rpx;
-		}
-
-		.image-dele-container {
-			position: relative;
-			width: 140rpx;
-			height: 140rpx;
-			background-color: #f6f6f6;
-			border-radius: 15rpx;
-			padding: 12rpx;
-
-			view {
-				text-overflow: ellipsis;
-				overflow: hidden;
-				white-space: nowrap;
-				width: 100rpx;
-			}
-
-			.image {
-				width: 100rpx;
-				height: 100rpx;
-			}
-
-			.goods-select-name {
-				font-size: 24rpx;
-			}
-		}
-
-		.goods-select {
-			margin: 0 24rpx;
-			height: 218rpx;
-			padding-top: 10rpx;
-		}
-
-		.goods-select-empty {
-			height: 218rpx;
-			text-align: center;
-			line-height: 218rpx;
-		}
-
-		.goodContainer {
-			position: relative;
-
-			.numberContainer {
-				width: 35rpx;
-				height: 35rpx;
-				border-radius: 100%;
-				color: #fff;
-				background-color: red;
-				position: absolute;
-				right: -5rpx;
-				top: -5rpx;
-			}
-		}
-
-		.minus {
-			width: 22px;
-			height: 22px;
-			border-width: 1px;
-			border-color: #E6E6E6;
-			border-style: solid;
-			border-top-left-radius: 100px;
-			border-top-right-radius: 100px;
-			border-bottom-left-radius: 100px;
-			border-bottom-right-radius: 100px;
-			@include flex;
-			justify-content: center;
-			align-items: center;
-		}
-
-
-
-		.plus {
-			width: 18px;
-			height: 18px;
-			background-color: #FF0000;
-			border-radius: 50%;
-			/* #ifndef APP-NVUE */
-			display: flex;
-			/* #endif */
-			justify-content: center;
-			align-items: center;
-		}
-	}
-</style>

+ 0 - 184
pages/order/userInfo.vue

@@ -1,184 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="会员信息"></u-navbar>
-		<view class="content">
-			<view class="xy-card info-box">
-				<view class="flex justify-start">
-					<view class="flex justify-start">
-						<view class="name">会员id:</view>
-						<view>{{info.memberId}}</view>
-					</view>
-					<view style="margin-left: 24rpx;">
-						<xbutton size="mini" @tap="copy(info.memberId)">复制</xbutton>
-					</view>
-				</view>
-				<view class="flex justify-start">
-					<view class="name">昵称:</view>
-					<view>{{info.member.wechatNickname||info.member.alipayNickname||'/'}}</view>
-				</view>
-				<view class="flex justify-start phone">
-					<view class="flex justify-start">
-						<view class="name">手机:</view>
-						<view>{{info.member.tel}}</view>
-					</view>
-					<view style="margin-left: 24rpx;">
-						<xbutton size="mini" @click="block"  v-if="info.isBlacklist">解除黑名单</xbutton>
-						<xbutton size="mini" @click="block" v-else>拉黑</xbutton>
-					</view>
-				</view>
-			</view>
-		</view>
-		<xpopup :show="show" @close="close" @confirm="submit" :showBtn="true" title="黑名单">
-			<!-- 拉黑 -->
-			<view class="pop-content restart">
-				是否确定拉黑该用户?
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		userInfo,
-		setBlacklist,
-		removeBlackList
-	} from '@/api/order/order.js'
-	export default {
-		data() {
-			return {
-				id: null,
-				info: {},
-				show: false,
-			}
-		},
-
-		onLoad(o) {
-			this.id = o.id;
-			this.getInfo()
-		},
-
-		methods: {
-			getInfo() {
-				userInfo({
-					memberId: this.id
-				}).then(res => {
-					this.info = res.data
-				})
-			},
-
-			copy(text) {
-				uni.setClipboardData({
-					data: text,
-					success: (data) => {
-						uni.showToast({
-							title: '复制成功'
-						})
-					},
-					fail: function(err) {
-
-					},
-					complete: function(res) {
-
-					}
-				})
-			},
-
-			block() {
-				// this.show = true
-				if(this.info.isBlacklist){ //已拉黑,解除
-					removeBlackList({
-						memberId: this.id
-					}).then(res => {
-						this.getInfo()
-						this.close()
-						this.$modal.showToast('解除成功~')
-					}).catch(err => {
-						this.close()
-					})
-				}else{ //拉黑
-					setBlacklist({
-						memberId: this.id
-					}).then(res => {
-						this.getInfo()
-						this.close()
-						this.$modal.showToast('拉黑成功~')
-					}).catch(err => {
-						this.close()
-					})
-				}
-			},
-
-			// 关闭弹框
-			close(e) {
-				this.show = false
-			},
-
-			// 弹框确定
-			submit() {
-				if(this.info.isBlacklist){ //已拉黑,解除
-					removeBlackList({
-						memberId: this.id
-					}).then(res => {
-						this.$modal.msg('解除成功~')
-						this.getInfo()
-						this.close()
-					}).catch(err => {
-						this.close()
-					})
-				}else{ //拉黑
-					setBlacklist({
-						memberId: this.id
-					}).then(res => {
-						this.$modal.msg('拉黑成功~')
-						this.getInfo()
-						this.close()
-					}).catch(err => {
-						this.close()
-					})
-				}
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-	.container {
-		.content {
-			padding: 0 24rpx;
-			overflow: hidden;
-
-			.info-box {
-				margin-top: 24rpx;
-
-				>view {
-					line-height: 60rpx;
-				}
-
-				.name {
-					width: 120rpx;
-					font-size: 28rpx;
-					font-weight: bold;
-					color: #333;
-				}
-			}
-
-			.phone {
-				text {
-					display: inline-block;
-					background-color: #5b5b5b;
-					color: #fff;
-					font-size: 22rpx;
-					padding: 0 12rpx;
-					border-radius: 6rpx;
-					margin-left: 12rpx;
-					line-height: 36rpx;
-				}
-			}
-		}
-
-		.pop-content {
-			padding: 24rpx;
-		}
-	}
-</style>

Plik diff jest za duży
+ 0 - 0
pages/point/components/Winglau14-lotusAddress/Winglau14-lotusAddress.js


+ 0 - 360
pages/point/components/Winglau14-lotusAddress/Winglau14-lotusAddress.vue

@@ -1,360 +0,0 @@
-<template>
-	<!--地址picker-->
-	<view>
-		<view :status="checkStatus" v-if="lotusAddressData.visible" class="lotus-address-mask" @tap="cancelPicker"></view>
-		<view v-if="lotusAddressData.visible"
-			:class="lotusAddressData.visible?'lotus-address-box':'lotus-address-box lotus-address-box-out'">
-			<view class="lotus-address-action">
-				<text @tap="cancelPicker" class="lotus-address-action-cancel">取消</text>
-				<text @tap="chosedVal" class="lotus-address-action-affirm">确认</text>
-			</view>
-			<view class="lotus-address-picker-box">
-				<!--省-->
-				<scroll-view scroll-y :scroll-into-view="'pid'+pChoseIndex" class="lotus-address-picker-box-item">
-					<view @tap="clickPicker(0,pIndex,pItem);" :id="'pid'+pIndex"
-						:class="pIndex === pChoseIndex?'lotus-address-picker lotus-address-picker2':'lotus-address-picker'"
-						v-for="(pItem,pIndex) in province" :key="pIndex">{{pItem}}</view>
-				</scroll-view>
-				<!--市-->
-				<scroll-view scroll-y :scroll-into-view="'cid'+cChoseIndex" class="lotus-address-picker-box-item">
-					<view @tap="clickPicker(1,cIndex,cItem);" :id="'cid'+cIndex"
-						:class="cIndex === cChoseIndex?'lotus-address-picker lotus-address-picker2':'lotus-address-picker'"
-						v-for="(cItem,cIndex) in city" :key="cIndex">{{cItem}}</view>
-				</scroll-view>
-				<!--区-->
-				<scroll-view scroll-y :scroll-into-view="'tid'+tChoseIndex" class="lotus-address-picker-box-item">
-					<view @tap="clickPicker(2,tIndex,tItem);" :id="'tid'+tIndex"
-						:class="tIndex === tChoseIndex?'lotus-address-picker lotus-address-picker2':'lotus-address-picker'"
-						v-for="(tItem,tIndex) in town" :key="tIndex">{{tItem}}</view>
-				</scroll-view>
-				<!--区END-->
-			</view>
-		</view>
-	</view>
-
-	<!--地址picker END-->
-</template>
-
-<script>
-	import {
-		lotusAddressJson
-	} from "./Winglau14-lotusAddress.js";
-	export default {
-		props: ['lotusAddressData'],
-		data() {
-			return {
-				visible: false,
-				province: [],
-				city: [],
-				town: [],
-				provinceName: '',
-				cityName: '',
-				townName: '',
-				type: 0, //0新增1编辑
-				pChoseIndex: -1,
-				cChoseIndex: -1,
-				tChoseIndex: -1
-			};
-		},
-		methods: {
-			//取消
-			cancelPicker() {
-				this.$emit('close')
-			},
-			//获取最后选择的省市区的值
-			chosedVal() {
-				this.type = 1;
-				const provinceCode = this.getTarId(this.provinceName);
-				const cityCode = this.getTarId(this.cityName);
-				const townCode = this.getTarId(this.townName);
-				this.visible = false;
-				let id = null;
-				//省市区已选最末一项id
-				if (this.provinceName && this.cityName && this.townName) {
-					id = townCode
-				} else if (this.provinceName && this.cityName && !this.townName) {
-					id = cityCode
-				} else if (this.provinceName && !this.cityName && !this.townName) {
-					id = provinceCode
-				}
-				this.$emit("choseVal", {
-					province: this.provinceName,
-					provinceCode,
-					city: this.cityName,
-					cityCode,
-					town: this.townName,
-					townCode,
-					id,
-					visible: false
-				});
-			},
-			//获取省市区value
-			getTarId(name, type) {
-				let id = 0;
-				lotusAddressJson.map((item, index) => {
-					if (item.name === name) {
-						id = item.value;
-					}
-				});
-				return id;
-			},
-			//获取市数据
-			getCityArr(parentId) {
-				let city = [];
-				lotusAddressJson.map((item, index) => {
-					if (item.parent === parentId) {
-						city.push(item.name);
-					}
-				});
-				return city;
-			},
-			//获取区数据
-			getTownArr(parentId) {
-				let town = [];
-				lotusAddressJson.map((item, index) => {
-					if (index > 34 && item.parent === parentId) {
-						town.push(item.name);
-					}
-				});
-				return town;
-			},
-			//初始化数据
-			initFn() {
-				if (!this.province.length) {
-					lotusAddressJson.map((item, index) => {
-						if (item.parent <= 34) {
-							this.province.push(item.name);
-						}
-					});
-				}
-				//已选择省市区,高亮显示对应选择省市区
-				const p = this._props.lotusAddressData.provinceName;
-				const c = this._props.lotusAddressData.cityName;
-				const t = this._props.lotusAddressData.townName;
-				//已选省
-				if (p) {
-					this.pChoseIndex = this.getTarIndex(this.province, p);
-				}
-				//已选市
-				if (p && c) {
-					const pid = this.getTarId(p);
-					this.city = this.getCityArr(pid);
-					this.cChoseIndex = this.getTarIndex(this.city, c);
-				}
-				//已选区
-				if (p && c && t) {
-					const cid = this.getTarId(c);
-					this.town = this.getTownArr(cid);
-					this.tChoseIndex = this.getTarIndex(this.town, t);
-				}
-				//未选省市区
-				if (!p && !c && !t) {
-					this.pChoseIndex = -1;
-					this.cChoseIndex = -1;
-					this.tChoseIndex = -1;
-					this.city = [];
-					this.town = [];
-				}
-			},
-			//获取已选省市区
-			getChosedData() {
-				const pid = this.getTarId(this.provinceName, 'province');
-				this.city = this.getCityArr(pid);
-				const cid = this.getTarId(this.cityName, 'city');
-				this.town = this.getTownArr(cid);
-				//已选省市区获取对应index
-				if (this.provinceName) {
-					this.pChoseIndex = this.getTarIndex(this.province, this.provinceName);
-				}
-				if (this.cityName) {
-					this.cChoseIndex = this.getTarIndex(this.city, this.cityName);
-				}
-				if (this.townName) {
-					this.tChoseIndex = this.getTarIndex(this.town, this.townName);
-				}
-			},
-			//选择省市区交互
-			clickPicker(type, index, name) {
-				//省
-				if (type === 0) {
-					// this.pChoseIndex = this.pChoseIndex >= 0 ? -1 : index
-					// this.provinceName = this.pChoseIndex >= 0 ? name : "";
-					if (this.pChoseIndex === index) {
-						this.pChoseIndex = -1;
-						this.provinceName = "";
-					} else {
-						this.pChoseIndex = index;
-						this.provinceName = name;
-					}
-					this.cChoseIndex = -1;
-					this.tChoseIndex = -1;
-					this.cityName = '';
-					this.townName = '';
-				}
-				//市
-				if (type === 1) {
-					if (this.cChoseIndex === index) {
-						this.cChoseIndex = -1;
-						this.cityName = "";
-					} else {
-						this.cChoseIndex = index;
-						this.cityName = name;
-					}
-					this.tChoseIndex = -1;
-					this.townName = '';
-				}
-				//区
-				if (type === 2) {
-					if (this.tChoseIndex === index) {
-						this.tChoseIndex = -1;
-						this.townName = "";
-					} else {
-						this.tChoseIndex = index;
-						this.townName = name;
-					}
-				}
-				//获取省市区数据
-				this.getChosedData();
-			},
-			//获取已选省市区index
-			getTarIndex(arr, tarName) {
-				let cIndex = 0;
-				arr.map((item, index) => {
-					if (item === tarName) {
-						cIndex = index;
-					}
-				});
-				return cIndex;
-			}
-		},
-		computed: {
-			checkStatus() {
-				let t = null;
-				const _this = this;
-				if (!_this.visible) {
-					_this.visible = _this._props.lotusAddressData.visible;
-					//获取省市区
-					_this.provinceName = _this._props.lotusAddressData.provinceName;
-					_this.cityName = _this._props.lotusAddressData.cityName;
-					_this.townName = _this._props.lotusAddressData.townName;
-					//生成初始化数据
-					_this.initFn();
-					t = _this.visible;
-				}
-				return t;
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.lotus-address-picker {
-	  font-size: 26rpx;
-	  padding-top: 30rpx;
-	  overflow: hidden;
-	  text-overflow: ellipsis;
-	  display: -webkit-box;
-	  -webkit-line-clamp: 1;
-	  -webkit-box-orient: vertical;
-	  line-height: normal;
-	  padding-right: 30rpx;
-	  box-sizing: border-box;
-	}
-	.lotus-address-picker-box {
-	  /*display: -webkit-box;
-	  display: -webkit-flex;*/
-	  display: flex;
-	  align-items: center;
-	  justify-content: center;
-	  justify-content: flex-start;
-	  padding-top: 10rpx;
-	  padding-bottom: 10rpx;
-	}
-	.lotus-address-picker-box-item {
-	  height: 600upx;
-	  overflow-y: auto;
-	  width: 33.333%;
-	  padding-left: 20rpx;
-	  padding-right: 20rpx;
-	  box-sizing: border-box;
-	}
-	.lotus-address-picker2 {
-	  color: #2C6FF3;
-	  position: relative;
-	}
-	.lotus-address-picker2:after {
-	  content: '';
-	  position: absolute;
-	  right: 0;
-	  top: 65%;
-	  transform: translateY(-35%) rotate(-45deg);
-	  width: 20rpx;
-	  height: 10rpx;
-	  border-left-width: 4rpx;
-	  border-bottom-width: 4rpx;
-	  border-left-style: solid;
-	  border-bottom-style: solid;
-	  border-left-color: #2C6FF3;
-	  border-bottom-color: #2C6FF3;
-	}
-	.lotus-address-mask {
-	  position: fixed;
-	  left: 0;
-	  top: 0;
-	  width: 100%;
-	  height: 100%;
-	  z-index: 999;
-	  background: rgba(0, 0, 0, 0.5);
-	}
-	.lotus-address-box {
-	  background: #fff;
-	  position: fixed;
-	  left: 0;
-	  bottom: 0;
-	  width: 100%;
-	  height: auto;
-	  z-index: 10000;
-	}
-	.lotus-address-action {
-	  font-size: 30rpx;
-	  /*display: -webkit-box;
-	  display: -webkit-flex;*/
-	  display: flex;
-	  align-items: center;
-	  justify-content: center;
-	  justify-content: space-between;
-	  padding: 25rpx 30rpx;
-	  position: relative;
-	}
-	.lotus-address-action:after {
-	  content: " ";
-	  position: absolute;
-	  left: 0;
-	  top: 0;
-	  right: 0;
-	  height: 1px;
-	  border-top: 1px solid #eee;
-	  color: #eee;
-	  transform-origin: 0 0;
-	  transform: scaleY(0.5);
-	}
-	.lotus-address-action:before {
-	  content: " ";
-	  position: absolute;
-	  left: 0;
-	  bottom: 0;
-	  right: 0;
-	  height: 1px;
-	  border-bottom: 1px solid #eee;
-	  color: #eee;
-	  transform-origin: 0 100%;
-	  transform: scaleY(0.5);
-	}
-	.lotus-address-action-cancel {
-	  color: #969696;
-	}
-	.lotus-address-action-affirm {
-	  color: #2C6FF3;
-	}
-	
-</style>

+ 0 - 361
pages/point/lineDetail.vue

@@ -1,361 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="lineName"></u-navbar>
-		<view class="content">
-			<view class="point">
-				<!-- <view class="area-pix">
-					<view class="point-name">
-						{{tagNamePicker}}
-					</view>
-					<xbutton width="140rpx" @click="chooseTag">选择标签</xbutton>
-				</view> -->
-				<view class="xy-card point-item" v-for="(item,index) in pointList" :key="item.id">
-					<view class="area-line">
-						{{item.placeName}}
-						<view>{{item.lineName}}</view>
-					</view>
-					<view class="point-content">
-						<view class="point-item-a">
-							<view>标签:</view>
-							<view>{{item.tagNames}}</view>
-						</view>
-						<view class="point-item-a">
-							<view>场景:</view>
-							<view>{{item.sceneNames}}</view>
-						</view>
-					</view>
-					<view class="point-btn">
-						<xbutton width="140rpx" bgColor="red" color="#fff" @click="delPoint(item)">删除
-						</xbutton>
-						<xbutton width="140rpx" style="margin-left:12rpx;" @click="add('editPoint',item)">编辑
-						</xbutton>
-						<!-- <xbutton width="140rpx">上传坐标</xbutton> -->
-					</view>
-				</view>
-				<view class="empty">
-					<u-empty v-if="pointList.length==0"></u-empty>
-				</view>
-				<u-loadmore :status="status" v-if="pointList.length>=1" />
-				<view class="btn">
-					<xbutton size="large" @click="add('addPoint')">新增点位</xbutton>
-				</view>
-			</view>
-
-			<!-- 弹框 -->
-			<xpopup :show="popShow" @close="close" @confirm="submit" showBtn :title="title">
-				<!-- 删除区域/线路/点位 -->
-				<view class="del-popup-content" v-if="title=='删除点位'">
-					确认删除?
-				</view>
-				<!-- 点位新增 -->
-				<!-- 	<view class="popup-content" v-if="title=='新增点位'">
-					<view>点位名称:</view>
-					<input type="text" v-model="pointName" />
-				</view> -->
-				<!-- 编辑点位 -->
-				<view class="popup-content edit-point" v-if="title=='新增点位'||title=='编辑点位'">
-					<view class="edit-point-item">
-						<view>场景:</view>
-						<u--input type="text" placeholder="多个场景逗号隔开" border="surround"
-							v-model="pointForm.sceneNames"></u--input>
-					</view>
-					<view class="edit-point-item">
-						<view>自定义标签:</view>
-						<u--input type="text" placeholder="多个标签逗号隔开" border="surround"
-							v-model="pointForm.tagNames"></u--input>
-					</view>
-					<view class="edit-point-item">
-						<view>点位名称:</view>
-						<u--input type="text" placeholder="请输入点位名称" border="surround"
-							v-model="pointForm.placeName"></u--input>
-					</view>
-				</view>
-
-			</xpopup>
-		</view>
-	</view>
-</template>
-
-<script>
-	import lotusAddress from "./components/Winglau14-lotusAddress/Winglau14-lotusAddress.vue";
-	import tkiTree from "@/components/tki-tree/tki-tree.vue";
-	import {
-		pointPage,
-		pointSave,
-		pointDel
-	} from "@/api/point/point"
-	export default {
-		components: {
-			lotusAddress,
-			tkiTree
-		},
-		data() {
-			return {
-				tabList: [{
-						name: '区域'
-					},
-					{
-						name: '线路'
-					},
-					{
-						name: '点位'
-					}
-				],
-				height: "0",
-
-				flod: false, //折叠/打开
-				list: [],
-
-				popShow: false, //新增线路弹框
-
-				pointName: '', //点位名称
-				id: null, //点选节点id
-
-				page: 1, //当前分页
-				size: 10, //分页数据条数
-				pointList: [], //点位列表
-				noMore: false, //没有更多数据
-				status: 'loadmore', //加载更多
-
-				lineNamePicker: '请选择线路', //线路选择
-				tagNamePicker: '请选择标签', //标签选择
-				lineOptions: [], //线路options
-				tagOptions: [],
-				columns: [], //picker选项
-
-
-				lineIdPicker: undefined, //picker选中线路id
-				tagIdPicker: undefined, //picker选中tag id
-				pickerType: undefined, //picker选择器类型
-
-				pointForm: { //新增点位
-					placeName: undefined,
-					sceneNames: undefined,
-					tagNames: undefined,
-				},
-				
-				lineId:null,
-				lineName:null,
-				title:'',
-			}
-		},
-
-		onLoad(o) {
-			this.lineId=o.id;
-			this.lineName=o.lineName;
-			this.getPointList()
-		},
-
-		methods: {
-			//重置点位分页请求参数
-			reset() {
-				this.page = 1;
-				this.pointList = [];
-				this.noMore = false;
-				this.status = "loadmore";
-			},
-
-			//获取点位分页
-			getPointList() {
-				pointPage({
-					page: {
-						current: this.page,
-						size: this.size,
-					},
-					lineId: this.lineId
-				}).then(res => {
-					let data = res.data.records;
-					this.pointList = this.pointList.concat(data)
-					if (data && data.length < 10) {
-						this.status = "nomore";
-						this.noMore = true;
-					} else {
-						this.status = "loading";
-					}
-				})
-			},
-
-			//滚动到底加载更多
-			onReachBottom() {
-				if (this.noMore) return
-				this.page++
-				this.getPointList()
-			},
-
-			//新增点位
-			add(type, item) {
-				if (type == 'addPoint') { //新增点位
-					this.title = '新增点位'
-				} else if (type == 'editPoint') { //新增点位
-					this.title = '编辑点位'
-					this.pointForm = JSON.parse(JSON.stringify(item))
-				}
-				this.popShow = true
-			},
-			
-			//删除点位
-			delPoint(item) {
-				this.title = "删除点位"
-				this.id = item.id
-				this.popShow = true
-			},
-
-			//弹框关闭
-			close() {
-				this.popShow = false
-			},
-
-			//弹框提交
-			submit() {
-				if (this.title == '删除点位') {
-					pointDel({
-						id: this.id
-					}).then(res => {
-						this.$modal.msg('删除成功~')
-						this.reset()
-						this.getPointList()
-					})
-				}else{
-					this.addOrEditPoint()
-				}
-				this.close()
-				this.id = null
-			},
-
-			// 新增编辑点位
-			addOrEditPoint() {
-				if (!this.pointForm.sceneNames) {
-					this.$modal.msg('请填写场景!')
-					return
-				}
-				if (!this.pointForm.tagNames) {
-					this.$modal.msg('请填写标签!')
-					return
-				}
-				if (!this.pointForm.placeName) {
-					this.$modal.msg('请填入点位名称!')
-					return
-				}
-				let params = {
-					...this.pointForm,
-					lineId: this.lineId
-				}
-				pointSave(params).then(res => {
-					this.$modal.msg('成功~')
-					this.pointForm = {
-						placeName: undefined,
-						sceneNames: undefined,
-						tagNames: undefined,
-					}
-					this.reset();
-					this.getPointList();
-				})
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.tab-wrap {
-			padding: 0 24rpx;
-			background-color: #fff;
-		}
-
-		.content {
-			// 点位
-			.point {
-				padding: 24rpx 24rpx 88rpx;
-			
-				.point-item {
-					margin-bottom: 24rpx;
-			
-					.area-line {
-						display: flex;
-						flex-flow: row nowrap;
-						justify-content: space-between;
-					}
-			
-					.point-content {
-						border-radius: 8rpx;
-						background-color: rgb(245, 248, 251);
-						box-sizing: border-box;
-						padding: 24rpx 12rpx;
-						font-size: 26rpx;
-						margin-top: 18rpx;
-						display: flex;
-						flex-flow: row wrap;
-			
-						.point-item-a {
-							width: 80%;
-							display: flex;
-							flex-flow: row nowrap;
-							line-height: 50rpx;
-						}
-					}
-			
-					.point-btn {
-						display: flex;
-						flex-direction: row;
-						justify-content: flex-end;
-						margin-top: 12rpx;
-					}
-				}
-			}
-		}
-	}
-
-	.empty {
-		margin-top: 40%;
-	}
-
-	.btn {
-		width: 100%;
-		position: fixed;
-		left: 0;
-		bottom: 24rpx;
-		padding: 0 24rpx;
-	}
-
-	.popup-content {
-		padding: 36rpx 24rpx;
-		display: flex;
-		flex-flow: row nowrap;
-		justify-content: flex-start;
-		align-items: center; 
-
-		input {
-			border: 1rpx solid #999;
-			border-radius: 6rpx;
-			width: 530rpx;
-			padding: 0 24rpx;
-		}
-
-		&.edit-point {
-			flex-direction: column;
-			align-items: flex-start;
-
-			.edit-point-item{
-				width: 100%;
-				padding-left: 170rpx;
-				position: relative;
-				&+.edit-point-item{
-					margin-top: 12rpx;
-				}
-				>view:nth-child(1){
-					position: absolute;
-					left:0;
-					top:50%;
-					transform: translateY(-50%);
-				}
-			}
-		}
-	}
-
-	.del-popup-content {
-		padding: 36rpx 24rpx;
-		text-align: center;
-		font-size: 32rpx;
-	}
-</style>

+ 0 - 407
pages/point/point.vue

@@ -1,407 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="点位管理"></u-navbar>
-		<view class="total">
-			<view class="total-item">
-				<view class="num">
-					{{total.regionNum||'0'}}
-				</view>
-				<view class="name">
-					区域总数
-				</view>
-			</view>
-			<view class="total-item">
-				<view class="num">
-					{{total.lineNum||'0'}}
-				</view>
-				<view class="name">
-					线路总数
-				</view>
-			</view>
-			<view class="total-item">
-				<view class="num">
-					{{total.placeNum||'0'}}
-				</view>
-				<view class="name">
-					点位总数
-				</view>
-			</view>
-		</view>
-		<!-- 		<view class="search">
-			<u-search animation placeholder="请输入区域/线路搜索" :showAction="false">
-			</u-search>
-		</view> -->
-		<view class="content">
-			<view class="xy-card" v-for="(item,index) in list" :key="item.mercRegionId">
-				<view class="flex justify-between">
-					<view class="eq-line-title">
-						{{item.mergename}}
-					</view>
-					<xbutton size="mini" @click="addLine(item.name)">新增线路</xbutton>
-				</view>
-				<view v-if="item.lineList&&item.lineList.length>0">
-					<block v-for="(item1,index1) in item.lineList" :key="item1.id">
-						<view class="eq-wrap eq-item"
-							@click="$tab.navigateTo(`/pages/point/lineDetail?id=${item1.id}&lineName=${item1.lineName}`)">
-							<view class="eq-name flex justify-between">
-								<view class="eq-title" v-if="item1.lineName">{{item1.lineName}}<text
-										style="color: #666;">({{item1.id}})</text></view>
-								<view class="eq-title" v-else>{{item1.lineName}}</view>
-							</view>
-							<view class="eqeq-type">
-								<view>
-									线路管理员:
-								</view>
-								<view>
-									{{item1.userInfoName||'/'}}
-								</view>
-							</view>
-
-							<view class="arrow-right">
-								<u-icon name="arrow-right" size="14"></u-icon>
-							</view>
-						</view>
-					</block>
-				</view>
-				<view class="none" v-else>
-					<u-empty text="当前区域没有线路" mode="search"></u-empty>
-				</view>
-				<!-- <view class="more" @click="$tab.navigateTo('/pages/equipment/search')">
-					查看全部
-				</view> -->
-			</view>
-
-			<view class="empty" v-if="list.length==0">
-				<u-empty></u-empty>
-			</view>
-		</view>
-
-		<view class="btn safe-bottom">
-			<xbutton size="large" @click="lotusAddressData.visible=true">新增区域</xbutton>
-		</view>
-
-		<!-- 级联地址 -->
-		<lotus-address v-on:choseVal="addressConfirm" @close="addressClose" :lotusAddressData="lotusAddressData">
-		</lotus-address>
-
-		<!-- 弹框 -->
-		<xpopup :show="popShow" @close="close" @confirm="submit" showBtn title="新增线路">
-			<!-- 线路新增 -->
-			<view class="popup-content">
-				<view>线路名称:</view>
-				<view>
-					<u--input placeholder="请输入内容" border="surround" v-model="lineName"></u--input>
-				</view>
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		allLineWithRegion,
-		areaSave
-	} from "@/api/point/area.js"
-	import {
-		lineSave,
-	} from "@/api/point/line"
-	import lotusAddress from "./components/Winglau14-lotusAddress/Winglau14-lotusAddress.vue";
-	export default {
-		components: {
-			lotusAddress
-		},
-		data() {
-			return {
-				list: [],
-				total: {
-					lineNum: 0,
-					placeNum: 0,
-					regionNum: 0,
-				},
-
-				lotusAddressData: {
-					visible: false,
-					provinceName: '',
-					cityName: '',
-					townName: '',
-				},
-
-				popShow: false,
-				lineName: '',
-				regionName: ''
-			}
-		},
-
-		created() {
-			// this.getTotalData()
-			this.getList()
-		},
-
-		methods: {
-			onshow() {
-				this.getList()
-			},
-
-			search() {
-
-			},
-
-			getList() {
-				allLineWithRegion({}).then(res => {
-					this.list = res.data.data;
-					this.total = {
-						lineNum: res.data.lineNum,
-						placeNum: res.data.placeNum,
-						regionNum: res.data.regionNum,
-					}
-				})
-			},
-
-			//级联地址选择确认
-			addressConfirm(res) {
-				if (res.id === null) {
-					this.$modal.msg('请选择区域!');
-					return
-				}
-				this.addArea(res.id)
-				this.addressClose() //关闭弹框
-			},
-
-			// 级联地址取消
-			addressClose() {
-				this.lotusAddressData.visible = false;
-			},
-
-			//新增区域
-			addArea(id) {
-				areaSave({
-					ids: [id]
-				}).then(res => {
-					this.$modal.msg('新增成功~')
-					this.getList()
-				})
-			},
-
-			addLine(e) {
-				this.regionName = e
-				this.popShow = true
-			},
-
-			//弹框关闭
-			close() {
-				this.popShow = false
-			},
-
-			//弹框提交
-			submit() {
-				lineSave({
-					regionName: this.regionName,
-					lineName: this.lineName
-				}).then(res => {
-					this.$modal.msg('新增成功~')
-					this.lineName = '';
-					this.getList();
-				})
-				this.close()
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-	.container {
-		.nav-style {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #fff;
-		}
-
-		.search {
-			padding: 24rpx 24rpx;
-			background-color: #fff;
-		}
-
-		.total {
-			display: flex;
-			flex-flow: row nowrap;
-			justify-content: space-around;
-			align-items: center;
-			text-align: center;
-			color: #fff;
-			background-color: #2C6FF3;
-			padding: 40rpx 24rpx;
-
-			.total-item {
-				.num {
-					font-weight: bold;
-					font-size: 52rpx;
-				}
-
-				.name {
-					font-size: 26rpx;
-				}
-			}
-		}
-
-		.content {
-			padding: 24rpx;
-			padding-bottom: calc(106rpx + env(safe-area-inset-bottom) / 2);
-
-			.xy-card {
-				margin-bottom: 24rpx;
-			}
-
-			.eq-line-title {
-				font-size: 32rpx;
-				padding-bottom: 24rpx;
-				position: relative;
-			}
-
-			.eq-item {
-				&+.eq-item {
-					margin-top: 12rpx;
-				}
-			}
-
-			.eq-wrap {
-				border-radius: 8rpx;
-				background-color: rgb(245, 248, 251);
-				box-sizing: border-box;
-				padding: 24rpx 12rpx;
-				font-size: 26rpx;
-				position: relative;
-
-				.arrow-right {
-					position: absolute;
-					right: 12rpx;
-					top: 24rpx;
-				}
-
-
-				.eq-name {
-					font-size: 32rpx;
-					font-weight: bold;
-					margin-bottom: 24rpx;
-					position: relative;
-
-					>.eq-title {
-						width: 420rpx;
-
-						>text {
-							font-size: 30rpx;
-							color: #666;
-							font-weight: normal;
-						}
-					}
-
-					.eq-status-box {
-						float: right;
-						position: absolute;
-						right: 0;
-						top: 0;
-					}
-
-					.eq-status {
-						font-size: 28rpx;
-						color: #666;
-						font-weight: normal;
-						margin-left: 12rpx;
-
-						>text {
-							display: inline-block;
-							background-color: #666;
-							width: 16rpx;
-							height: 16rpx;
-							border-radius: 16rpx;
-							margin-right: 12rpx;
-
-						}
-
-						&.online {
-							color: #f56c6c;
-
-							>text {
-								background-color: green;
-							}
-						}
-					}
-				}
-			}
-
-			.eqeq-type {
-				display: flex;
-				flex-direction: row;
-				align-items: center;
-				font-size: 28rpx;
-
-				>view:nth-child(1) {
-					color: #000;
-					width: 200rpx;
-				}
-
-				>view:nth-child(2) {
-					color: #666;
-					padding-left: 6rpx;
-				}
-			}
-
-			.eqeq-type+.eqeq-type {
-				margin-top: 16rpx;
-			}
-
-			.status {
-				width: 130rpx;
-				height: 120rpx;
-				box-sizing: border-box;
-				border-radius: 120rpx;
-				// border: 6rpx solid #2C6FF3;
-				text-align: center;
-				display: flex;
-				flex-flow: column;
-				justify-content: space-around;
-				align-items: center;
-				position: absolute;
-				right: 12rpx;
-				bottom: 24rpx;
-
-				.s-name {
-					font-size: 28rpx;
-					padding-top: 20rpx;
-					font-weight: bold;
-				}
-
-				.s-num {
-					font-size: 32rpx;
-					padding-bottom: 20rpx;
-				}
-			}
-		}
-
-		.empty {
-			margin: 40% auto 0;
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			bottom: 24rpx;
-			padding: 0 24rpx;
-		}
-
-		.popup-content {
-			padding: 36rpx 24rpx;
-			display: flex;
-			flex-flow: row nowrap;
-			justify-content: flex-start;
-			align-items: center;
-			>view:nth-child(1){
-				width:150rpx;
-			}
-			>view:nth-child(2){
-				width: 600rpx;
-			}
-		}
-	}
-</style>

+ 0 - 394
pages/replenish/invSearch.vue

@@ -1,394 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="库存管理"></u-navbar>
-
-		<view class="tab-wrap">
-			<view class="tab">
-				<u-tabs :list="tabList" :activeStyle="{color: '#333',fontWeight: 'bold',fontSize:'36rpx'}"
-					:inactiveStyle="{fontSize:'32rpx'}" :scrollable="false" :current="current" @click="tabClick"
-					lineColor="#2C6FF3">
-				</u-tabs>
-			</view>
-		</view>
-
-		<view class="flex align-center justify-end screen-container">
-			<view style="margin-right: 24rpx;" @click="sortClick">{{sortName}}</view>
-			<view class="flex align-center justify-center" @tap="screen">
-				<view class="" style="font-size: 28rpx;font-weight: 500;color: #333333;">筛选</view>
-				<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/screen.png"
-					style="width: 32rpx;height: 32rpx;margin-left: 12rpx;" mode="widthFix"></image>
-			</view>
-		</view>
-
-
-
-		<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100"
-			@scrolltolower="scrolltolower" :style="{height:fullHeight}">
-			<view v-if="list.length>0">
-				<block v-for="(item,index) in list" :key="index">
-					<view class="equipment-container" @click="details(item)">
-						<view class="flex align-center justify-between">
-							<view class="title" v-if="current==1">
-								<view v-if="item.deviceName">{{item.deviceName}}<text>({{item.deviceId}})</text></view>
-								<view v-else>{{item.deviceId}}</view>
-							</view>
-							<view class="title" v-else>{{item.goodsName}}</view>
-							<view>
-								<u-icon name="arrow-right" size="14"></u-icon>
-							</view>
-						</view>
-
-						<view class="order-detail-item">
-							<view>缺货:</view>{{item.lackSum}}
-						</view>
-
-						<view class="order-detail-item">
-							<view>库存:</view>{{item.stockSum}}
-						</view>
-
-						<view class="order-detail-item">
-							<view>容量:</view>{{item.capacitySum}}
-						</view>
-
-						<view class="order-detail-item percent">
-							<view>缺货占比:</view>{{item.percent}}%
-						</view>
-					</view>
-				</block>
-			</view>
-			<view v-else class='empty'>
-				<u-empty mode="data" text="数据为空"></u-empty>
-			</view>
-		</scroll-view>
-
-		<xpopup :show="screenShow" @close="close" @confirm="sure" :showBtn="true" title="筛选">
-			<view class="popup-container">
-				<view class="pop-item-name">
-					机器名称/机器编号:
-				</view>
-				<view class='martop'>
-					<u-checkbox-group v-model="searchQuery.deviceIdList" placement="row" @change="checkboxChange">
-						<u-checkbox :customStyle="{marginBottom: '8px',marginRight: '12px'}"
-							v-for="(item, index) in checkboxList" :key="item.id" :label="item.name" :name="item.id">
-						</u-checkbox>
-					</u-checkbox-group>
-				</view>
-				<view class="pop-item-name" style="margin-top: 30rpx;">
-					商品名称:
-				</view>
-				<view class='martop'>
-					<u--input placeholder="商品名称" v-model="searchQuery.goodsName" border="surround"></u--input>
-				</view>
-			</view>
-		</xpopup>
-		<u-action-sheet :show="actionSheetShow" :actions="actions" :title="title" @close="actionSheetShow = false"
-			@select="actionsheetSelect($event)"></u-action-sheet>
-	</view>
-</template>
-
-<script>
-	import {
-		stockByDevice, //按设备分组
-		stockByGoods, // 按商品分组
-	} from '@/api/replenishment/replenishment.js'
-
-	export default {
-		data() {
-			return {
-				sortName: '缺货率从多到少',
-				searchQuery: {
-					deviceIdList: [],
-					goodsName: null
-				},
-				screenShow: false,
-				list: [],
-				loadmoreStatus: 'loadmore',
-				fullHeight: 0,
-				tabList: [{
-						name: '商品'
-					},
-					{
-						name: '机器'
-					}
-				],
-				current: 0,
-
-				actionSheetShow: false,
-				actions: [{
-						type: '1',
-						name: '缺货率从多到少'
-					},
-					{
-						type: '2',
-						name: '缺货率从少到多'
-					},
-					{
-						type: '3',
-						name: '缺货数从多到少'
-					},
-					{
-						type: '4',
-						name: '缺货数从少到多'
-					}
-				],
-
-				checkboxList: [],
-			}
-		},
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						console.log(res.windowHeight, data.top)
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 40 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			this.search()
-			this.getDeviceList()
-		},
-		methods: {
-			search() {
-				let params = {
-					"deviceIdList": this.searchQuery.deviceIdList,
-					"goodsName": this.searchQuery.goodsName,
-					"orderBy": '',
-					"orderByKey": '',
-				}
-				switch (this.sortName) {
-					case '缺货率从多到少':
-						params.orderBy = 'desc';
-						params.orderByKey = 'percent'
-						break;
-					case '缺货率从少到多':
-						params.orderBy = 'asc';
-						params.orderByKey = 'percent'
-						break;
-					case '缺货数从多到少':
-						params.orderBy = 'desc';
-						params.orderByKey = 'lackSum'
-						break;
-					case '缺货数从少到多':
-						params.orderBy = 'asc';
-						params.orderByKey = 'lackSum'
-						break;
-					default:
-						break;
-				}
-
-				if (this.current == 0) { //商品
-					this.getListA(params)
-				} else { //机器
-					this.getListB(params)
-				}
-			},
-			
-			getDeviceList(){
-				deviceList().then(res => {
-					this.checkboxList=res.data
-				})
-			},
-
-			//按商品分组
-			getListA(params) {
-				stockByGoods(params).then(res => {
-					if (res.code == 200) {
-						if (res.data && res.data.length > 0) {
-							this.list = res.data
-						} else {
-							this.list = []
-						}
-					} else {
-						this.list = []
-					}
-				})
-			},
-
-			//按设备分组 
-			getListB(params) {
-				stockByDevice(params).then(res => {
-					if (res.code == 200) {
-						if (res.data && res.data.length > 0) {
-							this.list = res.data
-						} else {
-							this.list = []
-						}
-					} else {
-						this.list = []
-					}
-				})
-			},
-
-			//点击筛选
-			screen() {
-				this.screenShow = true
-			},
-
-			close() {
-				this.screenShow = false
-			},
-
-			confirm(e) {
-				this.show = false
-				this.search()
-			},
-
-			sortClick() {
-				this.actionSheetShow = true;
-			},
-
-			actionsheetSelect(e) {
-				this.sortName = e.name
-			},
-
-			checkboxChange(e) {
-				this.searchQuery.deviceIdList = e
-			},
-
-			sure() {
-				this.close()
-				this.search()
-			},
-
-			// 时间选择
-			timeSubmit(e) {
-				this.searchQuery.orderDate = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-				this.timeShow = false
-				this.reset()
-				this.getpage()
-				//改为分页接口获取 this.getCountData()
-			},
-
-			tabClick(e) {
-				this.current = e.index
-				this.search()
-			},
-
-			details(item) {
-				let id = this.current == 0 ? item.goodsId : item.deviceId;
-				let title = this.current == 0 ? item.goodsName : item.deviceName ? item.deviceName : item.deviceId;
-				this.$tab.navigateTo(`/pages/replenish/invSearchDetail?type=${this.current}&id=${id}&title=${title}`)
-			},
-		}
-	}
-</script>
-<style scoped lang="scss">
-	.container {
-		.empty {
-			margin-top: 40%;
-		}
-
-		.martop {
-			margin-top: 20rpx;
-		}
-
-		.search {
-			padding: 24rpx 13rpx;
-			background-color: #fff;
-		}
-
-		.tab-wrap {
-			background-color: #fff;
-
-			.tab {
-				// width: 40%;
-			}
-		}
-
-		.marleft {
-			margin-left: 10rpx;
-		}
-
-		.scrollview {
-			overflow: hidden;
-		}
-
-		.screen-container {
-			background-color: #fff;
-			padding: 30rpx 13rpx;
-
-			>view:nth-child(1) {
-				font-size: 28rpx;
-				font-weight: 500;
-			}
-		}
-
-		.equipment-container {
-			margin: 13rpx 13rpx 0;
-			padding: 12rpx 20rpx 24rpx;
-			border-radius: 14rpx;
-			background-color: #fff;
-			box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-			position: relative;
-
-			.sb-box {
-				padding: 24rpx 18rpx;
-				background-color: #f5f8fb;
-				border-radius: 8rpx;
-				margin-top: 12rpx;
-			}
-
-			.title {
-				height: 60rpx;
-				line-height: 60rpx;
-				font-size: 32rpx;
-				font-weight: bold;
-				color: #333;
-
-				>text {
-					font-size: 24rpx;
-					color: #333;
-				}
-			}
-
-			.order-detail-item {
-				font-size: 28rpx;
-				margin-top: 12rpx;
-				color: #777;
-
-				>view {
-					display: inline-block;
-					width: 170rpx;
-				}
-			}
-
-			.percent {
-				position: absolute;
-				right: 40rpx;
-				bottom: 20rpx;
-				line-height: 140rpx;
-				color: red;
-
-				>view {
-					color: #777;
-				}
-			}
-		}
-
-		.popup-container {
-			padding: 20rpx;
-		}
-	}
-</style>

+ 0 - 182
pages/replenish/invSearchDetail.vue

@@ -1,182 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="title"></u-navbar>
-		<view class="content">
-			<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100"
-				@scrolltolower="scrolltolower" :style="{height:fullHeight}">
-				<view v-if="list.length>0">
-					<block v-for="(item,index) in list" :key="index">
-						<view class="equipment-container" @click="details(item)">
-							<view class="flex align-center justify-between">
-								<view class="title" v-if="type==0">
-									{{item.deviceName}}<text>{{item.deviceId}}</text>
-								</view>
-								<view class="title" v-else>{{item.goodsName}}</view>
-							</view>
-							
-							<view class="flex align-center">
-								<view class="" v-if="type==1" style="margin-right: 30rpx;margin-top: 20rpx;">
-									<u--image width="110rpx" height="110rpx" :src="item.cover" mode="widthFix" :lazy-lord="true">
-									</u--image>
-								</view>
-								<view class="">
-									<view class="order-detail-item">
-										<view>缺货:</view>{{item.lackSum}}
-									</view>
-														
-									<view class="order-detail-item">
-										<view>库存:</view>{{item.stockSum}}
-									</view>
-														
-									<view class="order-detail-item">
-										<view>容量:</view>{{item.capacitySum}}
-									</view>
-														
-									<view class="order-detail-item percent">
-										<view>缺货占比:</view>{{item.percent}}%
-									</view>
-								</view>
-							</view>
-						</view>
-					</block>
-				</view>
-				<view v-else class='empty'>
-					<u-empty mode="data" text="数据为空"></u-empty>
-				</view>
-			</scroll-view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		stockByGoodsDetail,
-		stockByDeviceDetail
-	} from '@/api/replenishment/replenishment.js'
-
-	export default {
-		data() {
-			return {
-				fullHeight: 0,
-				id: null,
-				type: null,
-				list: {},
-				title:null
-			}
-		},
-		onLoad(o) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						console.log(res.windowHeight, data.top)
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 40 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			this.id = o.id
-			this.type = o.type
-			this.title=o.title
-			if (this.type == 0) {
-				this.getDetailByGoods()
-			} else {
-				this.getDetailByDev()
-			}
-		},
-		methods: {
-			getDetailByGoods() {
-				stockByGoodsDetail({
-					goodsId: this.id
-				}).then(res => {
-					this.list = res.data
-				})
-			},
-			getDetailByDev() {
-				stockByDeviceDetail({
-					deviceId: this.id
-				}).then(res => {
-					this.list = res.data
-				})
-			}
-		}
-	}
-</script>
-<style scoped lang="scss">
-	.container {
-		.content {
-			.equipment-container {
-				margin: 13rpx 13rpx 0;
-				padding: 12rpx 20rpx 24rpx;
-				border-radius: 14rpx;
-				background-color: #fff;
-				box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-				position: relative;
-			
-				.sb-box {
-					padding: 24rpx 18rpx;
-					background-color: #f5f8fb;
-					border-radius: 8rpx;
-					margin-top: 12rpx;
-				}
-			
-				.title {
-					height: 60rpx;
-					line-height: 60rpx;
-					font-size: 32rpx;
-					font-weight: bold;
-					color: #333;
-			
-					>text {
-						font-size: 24rpx;
-						color: #333;
-					}
-				}
-			
-				.order-detail-item {
-					font-size: 28rpx;
-					margin-top: 12rpx;
-					color: #777;
-			
-					>view {
-						display: inline-block;
-						width: 170rpx;
-					}
-				}
-			
-				.percent {
-					position: absolute;
-					right: 40rpx;
-					bottom: 20rpx;
-					line-height: 140rpx;
-					color: red;
-			
-					>view {
-						color: #777;
-						width: 150rpx;
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 343
pages/replenish/inventoryQueryExport1.vue

@@ -1,343 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="库存查询"></u-navbar>
-		<view class="content">
-			<!-- <view class="radio-container">
-				<u-tabs :list="typeList" @click="tabChange" lineColor="#2C6FF3" :scrollable="true"></u-tabs>
-			</view> -->
-			<!-- <view class="flex  justify-end radio-container">
-				<view class="flex-sub"></view>
-				<view class="">
-					<xbutton  size="large">查询</xbutton>
-				</view>
-			</view> -->
-			<view class="tab-list flex flex-wrap">
-				<block v-for="(item,index) in typeList" :key="item.name">
-					<view :class="[type==item.name?'tab-item tab-show':'tab-item']" @click="tabClick(item.name)">
-						{{item.name}}
-					</view>
-				</block>
-			</view>
-			<view class="title">按<text style="color: #2C6FF3;">{{type}}</text>盘点<text style="color:red;font-size: 24rpx;">(左右滑动查看更多数据)</text></view>
-
-			<view class="table card">
-				<uni-table border stripe emptyText="暂无更多数据" v-if="type=='商品'">
-					<!-- 表头行 -->
-					<uni-tr>
-						<uni-th align="left">商品名称</uni-th>
-						<uni-th align="center">库存数量</uni-th>
-						<uni-th align="center">缺货数量</uni-th>
-						<uni-th align="center">库存容量</uni-th>
-						<uni-th align="center">缺货占比</uni-th>
-					</uni-tr>
-					<!-- 表格数据行 -->
-					<uni-tr v-for="(item,index) in listA" :key="item.goodsId">
-						<uni-td>{{item.goodsName}}</uni-td>
-						<uni-td align="center">{{item.stockSum}}</uni-td>
-						<uni-td align="center">{{item.lackSum}}</uni-td>
-						<uni-td align="center">{{item.capacitySum}}</uni-td>
-						<uni-td align="center">{{item.percentText}}</uni-td>
-					</uni-tr>
-				</uni-table>
-
-				<uni-table border stripe emptyText="暂无更多数据" v-if="type=='设备'">
-					<!-- 表头行 -->
-					<uni-tr>
-						<uni-th align="left">设备名称</uni-th>
-						<uni-th align="center">库存数量</uni-th>
-						<uni-th align="center">缺货数量</uni-th>
-						<uni-th align="center">库存容量</uni-th>
-						<uni-th align="center">缺货占比</uni-th>
-					</uni-tr>
-					<!-- 表格数据行 -->
-					<uni-tr v-for="(item,index) in listB" :key="item.deviceId">
-						<uni-td>{{item.deviceName?item.deviceName:item.deviceId}}</uni-td>
-						<uni-td align="center">{{item.stockSum}}</uni-td>
-						<uni-td align="center">{{item.lackSum}}</uni-td>
-						<uni-td align="center">{{item.capacitySum}}</uni-td>
-						<uni-td align="center">{{item.percentText}}</uni-td>
-					</uni-tr>
-				</uni-table>
-
-				<uni-table border stripe emptyText="暂无更多数据" v-if="type=='线路'">
-					<!-- 表头行 -->
-					<uni-tr>
-						<uni-th align="left">线路名称</uni-th>
-						<uni-th align="left">库存数量</uni-th>
-						<uni-th align="left">缺货数量</uni-th>
-						<uni-th align="left">库存容量</uni-th>
-					</uni-tr>
-					<!-- 表格数据行 -->
-					<uni-tr v-for="(item,index) in listC" :key="item.placeLineId">
-						<uni-td>{{item.placeLineName&&item.placeLineName!=null?item.placeLineName:item.placeLineId}}</uni-td>
-						<uni-td>{{item.stockSum}}</uni-td>
-						<uni-td>{{item.lackSum}}</uni-td>
-						<uni-td>{{item.capacitySum}}</uni-td>
-					</uni-tr>
-				</uni-table>
-
-				<uni-table border stripe emptyText="暂无更多数据" v-if="type=='设备+商品'">
-					<!-- 表头行 -->
-					<uni-tr>
-						<uni-th align="left">设备名称</uni-th>
-						<uni-th align="left">商品名称</uni-th>
-						<uni-th align="left">库存数量</uni-th>
-						<uni-th align="left">缺货数量</uni-th>
-						<uni-th align="left">库存容量</uni-th>
-					</uni-tr>
-					<!-- 表格数据行 -->
-					<uni-tr v-for="(item,index) in listD" :key="item.goodsId">
-						<uni-td>{{item.deviceName?item.deviceName:item.deviceId}}</uni-td>
-						<uni-td>{{item.goodsName}}</uni-td>
-						<uni-td>{{item.stockSum}}</uni-td>
-						<uni-td>{{item.lackSum}}</uni-td>
-						<uni-td>{{item.capacitySum}}</uni-td>
-					</uni-tr>
-				</uni-table>
-
-				<uni-table border stripe emptyText="暂无更多数据" v-if="type=='线路+商品'">
-					<!-- 表头行 -->
-					<uni-tr>
-						<uni-th align="left">线路名称</uni-th>
-						<uni-th align="left">商品名称</uni-th>
-						<uni-th align="left">库存数量</uni-th>
-						<uni-th align="left">缺货数量</uni-th>
-						<uni-th align="left">库存容量</uni-th>
-					</uni-tr>
-					<!-- 表格数据行 -->
-					<uni-tr v-for="(item,index) in listE" :key="item.goodsId">
-						<uni-td>{{item.placeLineName&&item.placeLineName!=null?item.placeLineName:item.placeLineId}}</uni-td>
-						<uni-td>{{item.goodsName}}</uni-td>
-						<uni-td>{{item.stockSum}}</uni-td>
-						<uni-td>{{item.lackSum}}</uni-td>
-						<uni-td>{{item.capacitySum}}</uni-td>
-					</uni-tr>
-				</uni-table>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		stockByLineAndGoods, //按线路+商品分组 
-		stockByDeviceAndGoods, // 按设备+商品分组 
-		stockByDevice, //按设备分组
-		stockByGoods, // 按商品分组
-		stockByLine, //按线路分组
-	} from '@/api/replenishment/replenishment.js'
-	export default {
-		data() {
-			return {
-				// 基本案列数据
-				typeList: [{
-						name: '商品'
-					},
-					{
-						name: '设备'
-					},
-					// {
-					// 	name: '线路'
-					// }, {
-					// 	name: '设备+商品'
-					// }, {
-					// 	name: '线路+商品'
-					// }
-				],
-				type: '商品',
-
-				listA: [],
-				listB: [],
-				listC: [],
-				listD: [],
-				listE: [],
-			}
-		},
-
-		onShow() {
-			this.getData()
-		},
-
-		methods: {
-			tabClick(name) {
-				this.type = name;
-				this.getData()
-			},
-
-			getData() {
-				switch (this.type) {
-					case '商品':
-						this.getListA()
-						break;
-					case '设备':
-						this.getListB()
-						break;
-					case '线路':
-						this.getListC()
-						break;
-					case '设备+商品':
-						this.getListD()
-						break;
-					case '线路+商品':
-						this.getListE()
-						break;
-					default:
-						break;
-				}
-			},
-
-			//按商品分组
-			getListA() {
-				stockByGoods({
-					orderBy:'',
-					orderByKey:''
-				}).then(res => {
-					if (res.code == 200) {
-						if (res.data && res.data.length > 0) {
-							this.listA = res.data
-						} else {
-							this.listA = []
-						}
-					} else {
-						this.listA = []
-					}
-				})
-			},
-
-			//按设备分组 
-			getListB() {
-				stockByDevice({
-					orderBy:'',
-					orderByKey:''
-				}).then(res => {
-					if (res.code == 200) {
-						if (res.data && res.data.length > 0) {
-							this.listB = res.data
-						} else {
-							this.listB = []
-						}
-					} else {
-						this.listB = []
-					}
-				})
-			},
-
-			//按线路分组
-			getListC() {
-				stockByLine().then(res => {
-					if (res.code == 200) {
-						if (res.data && res.data.length > 0) {
-							this.listC = res.data
-						} else {
-							this.listC = []
-						}
-					} else {
-						this.listC = []
-					}
-				})
-			},
-
-			//按设备+商品分组
-			getListD() {
-				stockByDeviceAndGoods().then(res => {
-					if (res.code == 200) {
-						if (res.data && res.data.length > 0) {
-							this.listD = res.data
-						} else {
-							this.listD = []
-						}
-					} else {
-						this.listD = []
-					}
-				})
-			},
-
-			//按线路+商品分组
-			getListE() {
-				stockByLineAndGoods().then(res => {
-					if (res.code == 200) {
-						if (res.data && res.data.length > 0) {
-							this.listE = res.data
-							this.isEmpty = false
-						} else {
-							this.listE = []
-							this.isEmpty = false
-						}
-					} else {
-						this.listE = []
-						this.isEmpty = true
-					}
-				})
-			},
-
-		}
-	}
-</script>
-<style scoped lang="scss">
-	.container {
-		min-height: 100vh;
-		background-color: #fff;
-		padding-bottom: 24rpx;
-
-		// padding-top: 120rpx;
-		.tab-list {
-			width: 100%;
-			background-color: #fff;
-			padding: 12rpx;
-
-			.tab-item {
-				padding: 0 64rpx;
-				height: 62rpx;
-				background: #F7F7F7;
-				border-radius: 10rpx;
-				font-size: 28rpx;
-				font-weight: 500;
-				color: #777777;
-				margin-right: 20rpx;
-				line-height: 62rpx;
-				margin-bottom: 14rpx;
-
-				&.tab-show {
-					background: #F4F8FF;
-					color: #2C6FF3;
-				}
-			}
-		}
-
-		.title {
-			font-size: 32rpx;
-			line-height: 32rpx;
-			font-weight: bold;
-			padding: 12rpx 24rpx 12rpx 36rpx;
-			margin-top: 24rpx;
-		}
-
-		.card {
-			width: 724rpx;
-			margin-left: 13rpx;
-			margin-top: 28rpx;
-			background-color: #fff;
-			margin-top: 20rpx;
-			box-shadow: 0px 0px 10rpx 0px rgba(174, 201, 255, 0.2);
-			border-radius: 14rpx;
-		}
-
-		/deep/.uni-table-th {
-			font-size: 30rpx;
-			color: #555;
-		}
-
-		/deep/.uni-table-td {
-			color: #555;
-		}
-
-		/deep/.uni-table-scroll {
-			border: none;
-		}
-
-		/deep/.table--border {
-			border-right: none;
-		}
-	}
-</style>

+ 0 - 1017
pages/replenish/replenishmentHomePage.vue

@@ -1,1017 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="补货首页"></u-navbar>
-		<view class="machine-box">
-			机器编号:{{deviceId}}
-		</view>
-
-		<view class="top-wrap">
-			<view class="tab-wrap">
-				<view class="tab">
-					<u-tabs :list="tabList" :activeStyle="{color: '#333',fontWeight: 'bold',fontSize:'36rpx'}"
-						:inactiveStyle="{fontSize:'32rpx'}" :scrollable="false" :current="tabsIndex" @click="tabschange"
-						lineColor="#2C6FF3">
-					</u-tabs>
-				</view>
-			</view>
-			<view class="search-container">
-				<u-search animation placeholder="商品搜索" :clearabled="false" v-model="keyword" :showAction="false"
-					@search="search"></u-search>
-				<!-- 	<view class="scan-icon" @click="scan">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view> -->
-
-				<view class="search-history flex flex-wrap flex-start" v-if="historyList.length>0">
-					<view class="history-tips">最近搜索</view>
-					<view class="history-item" v-for="(item,index) in historyList" :key="index"
-						@click="searchFast(item)">
-						{{item}}
-					</view>
-				</view>
-			</view>
-
-			<view class="btns flex justify-between">
-				<view class="btn-left flex">
-					<view class="icon-btn" style="margin-right: 12rpx;">
-						<xbutton width="184rpx" round="14rpx" @click="addgoods"
-							icon="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_add.png">
-							新增商品</xbutton>
-					</view>
-					<view class="icon-btn" style="margin-right: 12rpx;">
-						<xbutton width="184rpx" round="14rpx" @click="addlist"
-							icon="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_add.png">
-							商品清单</xbutton>
-					</view>
-					<!-- <view class="add-btn">
-						<xbutton width="184rpx" round="14rpx"
-							icon="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_full.png">
-							一键满货</xbutton>
-					</view> -->
-				</view>
-				<view class="btn-right">
-					<xbutton width="144rpx" round="14rpx" @click="keep">提交</xbutton>
-				</view>
-			</view>
-		</view>
-
-		<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y :style="{'height':fullHeight}"
-			lower-threshold="100">
-			<view v-if="goodsList&&goodsList.length>0" class="scroll-content">
-				<view class="goods-box" v-for="(item,index) in goodsList" :key="item.id">
-					<view class="flex flex-sub align-center">
-						<view class="image">
-							<u--image radius='14rpx' width="120rpx" height="120rpx"
-								:src="item.cover?item.cover:'https://static.xynetweb.com/sysFile/defaultgoods.png'"
-								mode="aspectFit" :lazy-load="true">
-							</u--image>
-						</view>
-						<view class="flex flex-sub flex-direction justify-around goods-content">
-							<view class="goods-name-price flex justify-between align-start">
-								<view class="goods-name">
-									{{item.name}}
-								</view>
-								<view class="goods-price" v-if="item.newPrice==null">
-									¥{{$xy.delMoney(item.price)}}
-								</view>
-								<view class="goods-price flex" v-else>
-									<view style="color: #666;text-decoration: line-through;">
-										¥{{$xy.delMoney(item.price)}}
-									</view>
-									<view>
-										¥{{$xy.delMoney(item.newPrice)}}
-									</view>
-								</view>
-							</view>
-							
-							<view class="goods-stock flex">
-								<view>商品ID:{{item.id}}</view>
-							</view>
-							
-							<view class="goods-stock flex">
-								<view>商品SKUID:{{item.skuId}}</view>
-							</view>
-							
-							<view class="goods-stock flex">
-								<view>容量:{{item.capacity}}</view>
-								<view style="margin-left: 24rpx;" v-if="item.newCapacity">
-									新容量:{{item.newCapacity}}</view>
-							</view>
-							
-							<view class="goods-stock flex">
-								<view>库存:{{item.stock}}</view>
-								<view style="margin-left: 24rpx;" v-if="item.newStock!=0">
-									新库存:{{Number(item.stock)+Number(item.newStock)}}</view>
-							</view>
-							<view class="btn-input flex align-center flex-start" v-if="deviceInfo.deviceType!=5">
-								<view class="btn-input-left">补货:</view>
-								<view class="btn-input-right flex align-center">
-									<image
-										src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_sub.png"
-										mode="widthFix" @click="sub(item)"></image>
-									<input type="doit" v-model="item.newStock">
-									<image
-										src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_sup.png"
-										mode="widthFix" @click="sup(item)"></image>
-								</view>
-							</view>
-							<view style="height:20rpx;" v-if="deviceInfo.deviceType==5"></view>
-							<image class="edit-goods" @click.stop="editGoods(item,index)"
-								src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_edit.png"
-								mode="widthFix"></image>
-						</view>
-					</view>
-
-					<view class="edit-box" v-if="item.show">
-						<view @click.stop="changePrice(item)">改价</view>
-						<view @click.stop="changeCapacity(item)">容量</view>
-						<view @click.stop="del(item)">删除</view>
-						<!-- <view>满货</view> -->
-					</view>
-					<view class="bg" v-if="editIndex!=null" @click.stop="editHidden"></view>
-				</view>
-			</view>
-			<view v-else class='empty'>
-				<u-empty mode="data" text="数据为空"></u-empty>
-			</view>
-			<!-- <u-loadmore v-if="isEmpty===false" :status="loadmoreStatus" /> -->
-		</scroll-view>
-
-		<view class="flex align-center justify-around bottom-btn">
-			<view class="bottom-view" @tap="gethomePage">
-				<image class="bottom-image"
-					src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_upd.png"
-					mode="widthFix"></image>
-				<view class="bottom-text">刷新</view>
-			</view>
-			<view class="bottom-view" @tap="openCabinet">
-				<image class="bottom-image"
-					src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_open.png"
-					mode="widthFix"></image>
-				<view class="bottom-text">一键开柜</view>
-			</view>
-			<view class="bottom-view" @tap="cper">
-				<image class="bottom-image"
-					src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep_home_rec.png"
-					mode="widthFix">
-				</image>
-				<view class="bottom-text">补货记录</view>
-			</view>
-		</view>
-
-		<xpopup :show="editPriceShow" @close="editPriceClose" @confirm="priceSet" :showBtn="true" :title="editTitle">
-			<view class="pop-content">
-				<u--input placeholder="请输入内容" type="digit" border="surround" v-model="editPrice" v-if="editTitle=='修改价格'"></u--input>
-				<u--input placeholder="请输入内容" type="digit" border="surround" v-model="editCapacity" v-else></u--input>
-			</view>
-		</xpopup>
-
-		<xpopup :show="backShow" @close="backClose" :safeAreaInsetBottom="false" :showBtn="false" @open="backOpen"
-			mode="center">
-			<view class="back-pop-content">
-				<block v-for="(item,index) in changeList" :key="item.goodsName">
-					<view class="back-price flex align-center" v-if="item.type=='price'">
-						<view>{{item.goodsName}}</view>
-						<view>价格:</view>
-						<view>{{$xy.delMoney(item.oldPrice)}}</view>
-						<view>更改为</view>
-						<view>{{$xy.delMoney(item.newPrice)}}</view>
-					</view>
-					<view class="back-stock flex align-center" v-if="item.type=='stock'">
-						<view>{{item.goodsName}}</view>
-						<view>库存:</view>
-						<view>{{item.oldStock}}</view>
-						<view>更改为</view>
-						<view>{{item.newStock}}</view>
-					</view>
-					<view class="back-capacity flex align-center"  v-if="item.type=='capacity'">
-						<view>{{item.goodsName}}</view>
-						<view>容量:</view>
-						<view>{{item.oldCapacity}}</view>
-						<view>更改为</view>
-						<view>{{item.newCapacity}}</view>
-					</view>
-				</block>
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		supplyPage,
-		delGoods,
-		save,
-		saveByOpenDoor,
-		check,
-		create
-	} from "@/api/replenishment/replenishment.js"
-
-	import {
-		saveKeyWord
-	} from '@/utils/common.js'
-	export default {
-		data() {
-			return {
-				goodsList: [],
-				page: 1, //当前分页
-				size: 10, //分页数据条数
-				tabsIndex: 0,
-				addGoodsShow: false,
-				active: '',
-				deviceId: null,
-				deviceName: null,
-				name: '', //商品名称/条形码
-
-				workNo: '',
-				fullHeight: 0,
-				historyList: [],
-				keyword: '',
-
-				tabList: [{
-						name: '全部'
-					},
-					{
-						name: '缺货'
-					},
-					{
-						name: '售罄'
-					}
-				],
-
-				editIndex: null,
-				editPriceShow: false,
-				editPrice: null,
-				editGoodsIndex: null,
-				changeList: [], //提交反显信息
-
-				backShow: false,
-				deviceInfo: {},
-				editTitle:'修改价格',
-				editCapacity:null
-			}
-		},
-		onLoad(o) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 50 - 34 + 'px';
-						} else {
-							_this.fullHeight =res.windowHeight - data.top - 50 + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			if (uni.getStorageSync('goods')) {
-				this.historyList = JSON.parse(uni.getStorageSync('goods'))
-			}
-			this.deviceId = o.id;
-			this.deviceName = o.deviceName;
-		},
-
-		onShow() {
-			this.gethomePage()
-		},
-
-		methods: {
-			search(val) {
-				if (val) {
-					this.historyList = saveKeyWord('goods', this.keyword)
-				}
-				this.gethomePage()
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-
-			scanQRCode() {
-				uni.scanCode({
-					needResult: 1, //默认为0,扫描结果由微信处理,1则直接返回扫描结果,
-					scanType: ["qrCode", "barCode"], //// 可以指定扫二维码还是一维码,默认二者都有
-					success: (res) => {
-						var result = res.resultStr; //当needResult 为 1 时,扫码返回的结果  获取扫码信息
-						this.name = result
-						this.gethomePage()
-					},
-				});
-			},
-
-			tabschange(e) {
-				this.tabsIndex = e.index
-				this.gethomePage()
-			},
-
-			addgoods() {
-				this.$tab.navigateTo('/pages/equipment/addCom?id=' + this.deviceId)
-			},
-
-			addlist() {
-				this.$tab.navigateTo('/pages/commodity/commoditylist?id=' + this.deviceId)
-			},
-
-			//补货记录
-			cper() {
-				this.$tab.navigateTo('replenishmentRecord?id=' + this.deviceId)
-			},
-
-			//一键满货
-			allFull() {
-				uni.showModal({
-					title: '提示',
-					content: '是否确认一键满货',
-					success: res => {
-						if (res.confirm) {
-							for (var i = 0; i < this.goodsList.length; i++) {
-								this.goodsList[i].stock = this.goodsList[i].capacity
-								this.goodsList[i].newkcrl = true
-							}
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			},
-
-			// 一键开柜
-			openCabinet() {
-				uni.showModal({
-					title: '提示',
-					content: '是否确认一键开柜',
-					success: res => {
-						if (res.confirm) {
-							saveByOpenDoor({
-									"deviceId": this.deviceId
-								})
-								.then(res => {
-									this.workNo = res.data
-
-									this.checkWx()
-								})
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			},
-			//效验活动
-			checkWx() {
-				check({
-						"deviceId": this.deviceId,
-						"deviceType": 1,
-						"door": 0,
-						"isRestock": true
-					})
-					.then(res => {
-						this.createOrder(res.data)
-					})
-			},
-			//创建活动
-			createOrder(e) {
-				create({
-					"deviceId": this.deviceId,
-					"deviceType": 1,
-					"door": 0,
-					"payQueryOrderId": "",
-					"payType": '',
-					"sysType": 1,
-					"workNo": this.workNo,
-					"workType": 2
-				}).then(res => {
-					uni.showLoading({
-						title: '开门中...'
-					});
-
-					setTimeout(function() {
-						uni.showToast({
-							title: '开门成功',
-							duration: 2000
-						});
-						uni.hideLoading();
-					}, 2000);
-				}).catch(err => {
-					uni.showToast({
-						title: JSON.stringify(res),
-						duration: 10000
-					});
-				})
-			},
-
-			// 满货
-			fullCargo(val) {
-				uni.showModal({
-					title: '提示',
-					content: '是否确认满货',
-					success: res => {
-						if (res.confirm) {
-							for (var i = 0; i < this.goodsList.length; i++) {
-								if (this.goodsList[i].goodsId === val.goodsId) {
-									this.goodsList[i].stock = val.capacity
-									this.goodsList[i].newkcrl = true
-								}
-							}
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			},
-			//保存
-			keep() {
-				var goods = [] //收集提交改动商品参数
-				var changeList = [] //收集提交改动商品清单,做提醒结果用
-				this.goodsList.forEach(item => {
-					if (item.newPrice != null || item.newStock != 0||item.newCapacity!=null) {
-						goods.push({
-							"deviceGoodsId": item.id,
-							"oldStock": item.stock,
-							"newStock": Number(item.newStock) + Number(item.stock),
-							"oldPrice": item.price,
-							"newPrice": item.newPrice,
-							"oldCapacity": item.oldCapacity,
-							"newCapacity": item.newCapacity,
-							"oldWarning": item.warning,
-							"newWarning": item.warning,
-							"goodsId": item.goodsId,
-							"goodsName": item.name
-						})
-
-						if (item.newPrice != null) { //改价商品
-							changeList.push({
-								goodsName: item.name,
-								type: 'price',
-								oldPrice: item.price,
-								newPrice: item.newPrice
-							})
-						}
-						if (item.newStock != 0) { //改库存商品
-							changeList.push({
-								goodsName: item.name,
-								type: 'stock',
-								oldStock: item.stock,
-								newStock: Number(item.newStock) + Number(item.stock)
-							})
-						}
-						if (item.newCapacity != null) { //改容量商品
-							changeList.push({
-								goodsName: item.name,
-								type: 'capacity',
-								oldCapacity: item.capacity,
-								newCapacity: item.newCapacity
-							})
-						}
-					}
-				})
-
-				this.changeList = JSON.parse(JSON.stringify(changeList))
-
-				if (goods.length == 0) {
-					this.$modal.msg('您未对商品做任何改动~')
-					return
-				}
-				uni.showModal({
-					title: '提示',
-					content: '是否确认保存',
-					success: res => {
-						if (res.confirm) {
-							save({
-								id: this.workNo ? this.workNo : '',
-								deviceId: this.deviceId,
-								goods: goods
-							}).then(res => {
-								this.showChanged()
-								this.clearStorage()
-								this.gethomePage()
-							}).catch(err => {
-								uni.showModal({
-									title: '提示',
-									content: err,
-									success: res => {
-										if (res.confirm) {
-											console.log('确定')
-										}
-									}
-								})
-							})
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			},
-
-			//保存成功,显示改动结果
-			showChanged() {
-				this.backOpen()
-			},
-
-			// 保存成功,清空缓存
-			clearStorage() {
-				uni.setStorageSync(`replenish:${this.deviceId}`, '')
-			},
-
-			backClose() {
-				this.backShow = false
-			},
-
-			backOpen() {
-				this.backShow = true
-			},
-
-			//删除
-			del(val) {
-				this.editHidden()
-				let _this = this
-				uni.showModal({
-					title: '提示',
-					content: '是否确认删除',
-					success: function(res) {
-						if (res.confirm) {
-							delGoods({
-								"deviceId": _this.deviceId,
-								"goodsIds": [val.goodsId]
-							}).then(res => {
-								_this.gethomePage()
-							})
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-
-			},
-			gethomePage() {
-				supplyPage({
-					page: {
-						size: -1
-					},
-					search: this.keyword,
-					deviceId: this.deviceId,
-					type: this.tabsIndex + 1, //类型
-					isRefresh: true
-				}).then(res => {
-					let deviceInfo = res.data.deviceInfo
-					let data = res.data.page.records
-					let sto = uni.getStorageSync(`replenish:${this.deviceId}`)
-					for (var i = 0; i < data.length; i++) {
-						data[i].oldCapacity = data[i].capacity
-						data[i].show = false
-						data[i].newPrice = null
-						data[i].newStock = 0
-
-						// 暂存补货数据
-						if (sto && sto != '') {
-							let replenishList = JSON.parse(sto);
-							replenishList.forEach(j => {
-								if (data[i].goodsId === j.goodsId) {
-									data[i].newPrice = j.newPrice
-									data[i].newStock = j.newStock
-								}
-							})
-						}
-					}
-					this.deviceInfo = deviceInfo
-					this.goodsList = data;
-				})
-			},
-
-			editGoods(item, index) {
-				item.show = true
-				this.editIndex = index
-				this.editGoodsIndex = index
-			},
-
-			editHidden() {
-				if (this.editIndex != null) {
-					this.goodsList[this.editIndex].show = false
-					this.editIndex = null
-				}
-			},
-
-			sub(item) {
-				if (Number(item.stock) + Number(item.newStock) == 0) {
-					this.$modal.msg('这个商品没库存啦~')
-					return
-				}
-				item.newStock--
-				this.goodsChange()
-			},
-
-			sup(item) {
-				item.newStock++
-				this.goodsChange()
-			},
-
-			// 库存调整,设置缓存
-			goodsChange(item) {
-				//设置缓存
-				let newListSto = []
-				this.goodsList.forEach(i => {
-					if (i.newPrice != null || i.newStock != 0) {
-						let obj = {
-							goodsId: i.goodsId,
-							newPrice: i.newPrice,
-							newStock: i.newStock
-						}
-						newListSto.push(obj)
-					}
-				})
-
-				uni.setStorageSync(`replenish:${this.deviceId}`, JSON.stringify(newListSto))
-			},
-
-			changePrice(item) {
-				this.editTitle='修改价格'
-				this.editPriceShow = true;
-				this.editHidden()
-			},
-			
-			changeCapacity(){
-				this.editTitle='修改容量'
-				this.editPriceShow = true;
-				this.editHidden()
-			},
-
-			editPriceClose() {
-				this.editPriceShow = false;
-			},
-
-			priceSet() {
-				if(this.editTitle=='修改价格'){
-					if (this.editPrice == null) {
-						this.$modal.msg('商品价格不能为空!')
-						return
-					}
-					let reg = /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
-					if (!reg.test(this.editPrice)) {
-						uni.showToast({
-							icon: 'none',
-							title: '价格最多保留两位小数!'
-						})
-						return;
-					}
-					this.editPriceClose()
-					this.goodsList[this.editGoodsIndex].newPrice = this.editPrice * 100
-					this.goodsChange() //设置缓存
-					
-					this.editPrice = null
-					this.editGoodsIndex = null
-				}else{ //修改容量
-					if (this.editCapacity == null) {
-						this.$modal.msg('商品容量不能为空!')
-						return
-					}
-					let reg = /^([0-9]*)$/
-					if (!reg.test(this.editCapacity)) {
-						uni.showToast({
-							icon: 'none',
-							title: '容量必须为整数!'
-						})
-						return;
-					}
-					this.editPriceClose()
-					this.goodsList[this.editGoodsIndex].newCapacity = this.editCapacity
-					this.goodsChange() //设置缓存
-					
-					this.newCapacity = null
-					this.editGoodsIndex = null
-				}
-			}
-		}
-	}
-</script>
-<style>
-	page {
-		background-color: #eee;
-	}
-</style>
-<style scoped lang="scss">
-	.container {
-		height: 100vh;
-		background-color: #F4F4F4;
-		position: static;
-
-		.machine-box {
-			width: 750rpx;
-			height: 74rpx;
-			font-size: 32rpx;
-			line-height: 58rpx;
-			text-align: center;
-			background: #2C6FF3;
-			color: #fff;
-			border-radius: 0px 0px 50rpx 50rpx;
-		}
-
-		.top-wrap {
-			background: linear-gradient(0deg, #D7D7D7, #FFFFFF);
-		}
-
-		.tab-wrap {
-			background-color: #fff;
-			padding-left: 30rpx;
-
-			.tab {
-				width: 60%;
-			}
-		}
-
-		.search-container {
-			padding: 26rpx 13rpx 26rpx;
-			background-color: #fff;
-			position: relative;
-
-			.scan-icon {
-				position: absolute;
-				right: 36rpx;
-				top: 38rpx;
-				z-index: 2;
-			}
-
-			.search-history {
-				.history-tips {
-					font-size: 24rpx;
-					color: #333333;
-					line-height: 40rpx;
-					margin-right: 10rpx;
-					margin-top: 24rpx;
-				}
-
-				.history-item {
-					margin-right: 10rpx;
-					padding: 0 13rpx;
-					background: #F6F8FB;
-					color: #333;
-					font-size: 24rpx;
-					line-height: 40rpx;
-					border-radius: 40rpx;
-					margin-top: 24rpx;
-				}
-			}
-		}
-
-		.btns {
-			background-color: #fff;
-			padding: 20rpx 13rpx 20rpx;
-		}
-
-		.empty {
-			margin-top: 120rpx
-		}
-
-		.active {
-			background-color: #2C6FF3;
-			color: #fff;
-		}
-
-		.marleft {
-			margin-left: 10rpx;
-		}
-
-		.martop {
-			margin-top: 20rpx;
-		}
-
-		.scrollview {
-			padding-top: 10rpx;
-		}
-
-		.goods-box {
-			width: 724rpx;
-			margin-left: 13rpx;
-			background-color: #fff;
-			box-shadow: 0px 0px 10px 0px rgba(174, 201, 255, 0.2);
-			border-radius: 14rpx;
-			padding: 28rpx 12rpx 22rpx;
-			position: relative;
-
-			.edit-box {
-				width: 180rpx;
-				background-color: #fff;
-				font-size: 30rpx;
-				text-align: center;
-				line-height: 60rpx;
-				padding: 10rpx 0;
-				box-shadow: 0px 0px 10px 0px rgba(174, 201, 255, 0.2);
-				position: absolute;
-				right: 20rpx;
-				bottom: -120rpx;
-				z-index: 99999;
-			}
-
-			&+.goods-box {
-				margin-top: 10rpx;
-			}
-
-			.image {
-				margin-right: 35rpx;
-				height: 120rpx;
-				width: 120rpx;
-			}
-
-			.goods-content {
-				position: relative;
-
-				.goods-name-price {
-					.goods-name {
-						font-size: 28rpx;
-						font-weight: 800;
-						color: #333333;
-						line-height: 34rpx;
-					}
-
-					.goods-price {
-						font-size: 32rpx;
-						line-height: 32rpx;
-						font-weight: 800;
-						color: #FF0000;
-						margin-right: 10rpx;
-					}
-				}
-
-				.goods-stock {
-					font-size: 26rpx;
-					font-weight: 500;
-					color: #555555;
-					line-height: 26rpx;
-					margin-top: 30rpx;
-				}
-
-				.btn-input {
-					margin-top: 18rpx;
-
-					.btn-input-left {
-						font-size: 26rpx;
-					}
-
-					.btn-input-right {
-						justify-content: flex-end;
-						margin-left: 50rpx;
-
-						>image {
-							width: 56rpx;
-							height: 56rpx;
-						}
-
-						>input {
-							width: 100rpx;
-							height: 56rpx;
-							line-height: 56rpx;
-							border: 2rpx solid #2C6FF3;
-							border-radius: 10rpx;
-							text-align: center;
-							margin: 0 50rpx;
-						}
-					}
-				}
-
-				.edit-goods {
-					width: 56rpx;
-					height: 56rpx;
-					position: absolute;
-					right: 10rpx;
-					bottom: 0;
-				}
-			}
-		}
-
-		.pop-content {
-			padding: 24rpx;
-		}
-
-		.bottom-btn {
-			width: 100%;
-			position: fixed;
-			bottom: 0;
-			right: 0;
-			left: 0;
-			background-color: #fff;
-			height: calc(98rpx + env(safe-area-inset-bottom) / 2);
-			padding-bottom: calc(env(safe-area-inset-bottom) / 2);
-			box-shadow: 0px -2px 10px 0px rgba(174, 201, 255, 0.2);
-			z-index: 999;
-		}
-
-		.scroll-content {
-			padding-bottom: calc(160rpx + env(safe-area-inset-bottom) / 2);
-		}
-
-		.bottom-view {
-			display: flex;
-			flex-direction: column;
-			flex: 1;
-			text-align: center;
-			align-items: center;
-		}
-
-		.bottom-image {
-			height: 48rpx;
-			width: 48rpx;
-		}
-
-		.bottom-text {
-			font-size: 22rpx;
-			line-height: 22rpx;
-			margin-top: 8rpx;
-		}
-
-		.save {
-			position: fixed;
-			right: 15rpx;
-			bottom: 120rpx;
-			width: 140rpx;
-			height: 140rpx;
-			border-radius: 50%;
-			background-color: #f6d232;
-
-			image {
-				width: 80rpx;
-			}
-		}
-
-		.bg {
-			position: fixed;
-			width: 100%;
-			height: 100vh;
-			z-index: 99998;
-			left: 0;
-			top: 0;
-		}
-
-		.back-pop-content {
-			width: 700rpx;
-			padding: 24rpx;
-			line-height: 50rpx;
-
-			>view {
-				font-size: 30rpx;
-
-				>view {
-					display: inline-block;
-				}
-
-				>view:nth-child(1) {
-					width: 270rpx;
-					white-space: nowrap;
-					overflow: hidden;
-					text-overflow: ellipsis;
-				}
-
-				>view:nth-child(2) {
-					margin-left: 24rpx;
-				}
-
-				>view:nth-child(3) {
-					color: #38fb58;
-					margin-left: 24rpx;
-					margin-right: 24rpx;
-					width: 50rpx;
-				}
-
-				>view:nth-child(5) {
-					color: #ef9840;
-					margin-left: 24rpx;
-					width: 50rpx;
-				}
-			}
-
-			.back-price {
-
-				>view:nth-child(2) {
-					color: #2C6FF3;
-				}
-			}
-
-			.back-stock {
-				>view:nth-child(2) {
-					color: #ff67bd;
-				}
-			}
-			
-			.back-capacity{
-				>view:nth-child(2) {
-					color: #ff5500;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 572
pages/replenish/replenishmentManagement.vue

@@ -1,572 +0,0 @@
-<template>
-	<view>
-		<view class="container">
-			<u-navbar titleStyle="fontSize:36rpx;" :autoBack="true" bgColor="#fff" :placeholder="true"
-				title="补货管理"></u-navbar>
-			<view style="background-color: #fff;">
-				<view class="flex align-center  box">
-					<!-- <view class="flex flex-direction align-center" @tap="startReplenishment()">
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/bh.png" mode="widthFix"></image>
-						<view class="">开始补货</view>
-					</view> -->
-					<!-- <view class="flex flex-direction align-center"  @tap="commodityList()">
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/qd.png" mode="widthFix"></image>
-						<view class="">商品清单</view>
-					</view> -->
-					<view class="flex justify-between align-center" @tap="replenishmentRecord()">
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/jl.png"
-							mode="widthFix"></image>
-						<!-- <image src="../../static/favicon.ico" mode=""></image> -->
-						<view class="menu-name">补货记录</view>
-					</view>
-					<view class="flex justify-between align-center" @tap='inventoryManagement()'>
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/kc.png"
-							mode="widthFix"></image>
-						<!-- <image src="../../static/favicon.ico" mode=""></image> -->
-						<view class="menu-name">库存管理</view>
-					</view>
-				</view>
-
-				<!-- <view class="tips">
-					补货说明补货说明补货说明
-				</view> -->
-
-				<!-- 设备列表 -->
-				<view class="search">
-					<u-search animation placeholder="请输入设备名称" bgColor="#F6F8FB" :clearabled="true" v-model="keyword"
-						:showAction="false" @search="search"></u-search>
-				</view>
-
-				<!-- 	<view class="tab-list">
-					<u-tabs :list="tabList" @click="tabChange" :current="current" :scrollable="false" bgColor="#fff"
-						lineColor="#2C6FF3"></u-tabs>
-				</view> -->
-
-				<view class="tab-wrap">
-					<view class="tab">
-						<u-tabs :list="tabList" :activeStyle="{color: '#333',fontWeight: 'bold',fontSize:'36rpx'}"
-							:inactiveStyle="{fontSize:'32rpx'}" :scrollable="false" :current="current"
-							@click="tabChange" lineColor="#2C6FF3">
-						</u-tabs>
-					</view>
-				</view>
-			</view>
-
-			<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100"
-				@scrolltolower="scrolltolower" :style="{height:fullHeight}">
-				<view class="content">
-					<view class="xy-card" v-for="(item,index) in list" :key="item.deviceId"
-						@click="replenish(item.deviceId,item.deviceName)">
-						<view class="title flex justify-between">
-							<view class="flex">
-								<view>
-									<view class="device-name" v-if="item.deviceName">
-										{{item.deviceName}}<text>({{item.deviceId}})</text>
-									</view>
-									<view class="device-name" v-else>
-										{{item.deviceId}}
-									</view>
-								</view>
-								<view style="margin-left: 22rpx; margin-top: 8rpx;" v-if="item.deviceTypeName">
-									<view class="busy-state on">{{item.deviceTypeName}}</view>
-								</view>
-								<view style="margin-left: 22rpx; margin-top: 8rpx;">
-									<view v-if="item.busyState==1" class="busy-state on">运营中</view>
-									<view v-else class="busy-state off">已停运</view>
-								</view>
-							</view>
-
-							<view class="flex status">
-								<view style="margin-left: 24rpx;color: #FF0000;" v-if="item.goodsIdStockOutCount>0">
-									缺货
-								</view>
-								<view style="margin-left: 24rpx;color: green;" v-else>
-									正常
-								</view>
-							</view>
-						</view>
-
-						<view class="t-content flex flex-direction" v-if="current==0">
-							<view class="c-item-t">
-								<view class="c-item">
-									<view>剩余库存:</view>
-									<view>{{item.stockSum||0}}</view>
-								</view>
-								<view class="c-item">
-									<view>补后库存:</view>
-									<view>{{item.fillCountSum||0}}</view>
-								</view>
-							</view>
-							<view class="c-item-t">
-								<view class="c-item">
-									<view>在售商品种类:</view>
-									<view>{{item.goodsIdCount||0}}</view>
-								</view>
-								<view class="c-item" v-if="item.goodsIdStockOutCount>0">
-									<view>缺货商品种类:</view>
-									<view style="color: red;font-weight: bold;">{{item.goodsIdStockOutCount||0}}</view>
-								</view>
-							</view>
-						</view>
-
-						<view class="t-content flex flex-direction" v-else>
-							<view class="c-item-t">
-								<view class="c-item">
-									<view>剩余库存:</view>
-									<view>{{item.stockSum||0}}</view>
-								</view>
-								<view class="c-item">
-									<view>补后库存:</view>
-									<view>{{item.fillCountSum||0}}</view>
-								</view>
-							</view>
-							<view class="c-item-t">
-								<view class="c-item">
-									<view>缺货商品种类:</view>
-									<view style="color: red;font-weight: bold;">{{item.goodsIdStockOutCount||0}}</view>
-								</view>
-							</view>
-						</view>
-					</view>
-
-					<u-loadmore :status="status" v-if="list.length>=1" />
-				</view>
-				<view class="empty" v-if="list.length==0">
-					<u-empty text="没有设备!"></u-empty>
-				</view>
-			</scroll-view>
-
-			<!-- <view class="scan" @click="startReplenishment">
-				<view class="scan-icon-bot">
-					<u-icon name="scan" color="#2C6FF3" size="60"></u-icon>
-				</view>
-				<view>扫码补货</view>
-			</view> -->
-
-			<view class="btn">
-				<xbutton size="large" @click="startReplenishment">
-					<view class="btn-wrap flex align-center">
-						<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/replenish/rep-scan.png" mode=""></image>
-						扫码补货
-					</view>
-				</xbutton>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		deviceDetail,
-		searchPage,
-		isMerc
-	} from '@/api/device/device.js'
-
-	import {
-		deviceStockList,
-		deviceStockOutList
-	} from '@/api/replenishment/replenishment.js'
-	export default {
-		data() {
-			return {
-				page: 1,
-				size: 10,
-
-				status: 'loadmore',
-
-				current: 0,
-				tabList: [{
-						name: '全部',
-						value: ''
-					},
-					{
-						name: '缺货',
-						value: 1
-					}
-				],
-
-				list: [],
-
-				keyword: '',
-				
-				fullHeight:0
-			}
-		},
-
-		onPullDownRefresh() {
-			this.reset()
-			if (this.current == 0) {
-				this.getList1().then(res => {
-					uni.stopPullDownRefresh();
-				})
-			} else {
-				this.getList2().then(res => {
-					uni.stopPullDownRefresh();
-				})
-			}
-
-		},
-
-		onShow() {
-			this.search()
-		},
-		
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						console.log(res.windowHeight, data.top)
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 40 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-		},
-
-		methods: {
-			startReplenishment() {
-				uni.scanCode({
-					success: (res) => {
-						let deviceId = res.result.split('=')[1];
-						if (deviceId) {
-							this.hasDevice(deviceId).then(res => {
-								this.$tab.navigateTo(
-									`/pages/replenish/replenishmentHomePage?id=${deviceId}`)
-							}).catch(err => {
-								if (err.indeOf('com.netflix') == -1) {
-									this.$modal.msg('err')
-								} else {
-									this.$modal.msg('网络繁忙,请重试!')
-								}
-							})
-						} else {
-							this.$modal.msg('该二维码无效~')
-						}
-					}
-				});
-			},
-
-			hasDevice(id) {
-				return new Promise((resolve, reject) => {
-					isMerc({
-						deviceId: id
-					}).then(res => {
-						console.log(res)
-						resolve(res)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			commodityList() {
-				this.$tab.navigateTo('../commodity/commoditylist')
-			},
-			replenishmentRecord() {
-				this.$tab.navigateTo('replenishmentRecord')
-			},
-			inventoryManagement() {
-				this.$tab.navigateTo('/pages/replenish/invSearch')
-			},
-
-			tabChange(e) {
-				this.current = e.index
-				this.reset()
-				this.getList()
-			},
-
-			getList() {
-				if (this.current == 0) {
-					this.getList1()
-				} else {
-					this.getList2()
-				}
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.list = [];
-			},
-
-			getList1() {
-				return new Promise((resolve, reject) => {
-					deviceStockList({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword,
-					}).then(res => {
-						let data = res.data.records;
-						if (data.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.list = this.list.concat(data)
-						resolve(data)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			getList2() {
-				return new Promise((resolve, reject) => {
-					deviceStockOutList({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword,
-					}).then(res => {
-						let data = res.data.records;
-						if (data.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.list = this.list.concat(data)
-						resolve(data)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			search() {
-				this.reset()
-				this.getList()
-			},
-
-			scanDevice() {
-				uni.scanCode({
-					success: (res) => {
-						let deviceId = res.result.split('=')[1];
-						if (deviceId) {
-							this.keyword = deviceId;
-							this.getList()
-						} else {
-							this.$modal.msg('该二维码无效~')
-						}
-					}
-				});
-			},
-
-			replenish(id, name) {
-				this.$tab.navigateTo(`/pages/replenish/replenishmentHomePage?id=${id}&&deviceName=${name}`)
-			},
-
-			//触底加载更多
-			scrolltolower() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getList()
-			},
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.container {
-
-		// padding-top: 120rpx;
-		image {
-			width: 50rpx;
-			height: 50rpx;
-		}
-
-		.box {
-			padding: 38rpx 12rpx 14rpx;
-			background: #fff;
-			font-size: 28rpx;
-			font-weight: 500;
-			color: #777777;
-			line-height: 62rpx;
-
-			>view {
-				background: #F7F7F7;
-				border-radius: 10rpx;
-				margin-right: 20rpx;
-				padding: 0 12rpx;
-			}
-
-			image {
-				width: 34rpx;
-				height: 34rpx;
-				margin-right: 15rpx;
-			}
-		}
-
-		.tips {
-			width: 724rpx;
-			padding: 10rpx 24rpx;
-			font-size: 28rpx;
-			line-height: 40rpx;
-			font-weight: 500;
-			color: #333333;
-			background: #F0FFFC;
-			border: 2rpx dashed #61D8BE;
-			border-radius: 14rpx;
-			margin-left: 13rpx;
-		}
-
-		.search {
-			padding: 0rpx 13rpx 24rpx;
-			background-color: #fff;
-			position: relative;
-			margin-top: 14rpx;
-
-			.scan-icon {
-				position: absolute;
-				right: 36rpx;
-				top: 50%;
-				transform: translateY(-50%);
-				z-index: 2;
-			}
-		}
-
-		.scan {
-			width: 100%;
-			position: fixed;
-			bottom: 0;
-			display: flex;
-			flex-direction: column;
-			justify-content: center;
-			align-items: center;
-			background-color: #fff;
-			box-shadow: 0 2rpx 10rpx 0 rgba(0, 0, 0, 0.1);
-
-			.scan-icon-bot {
-				width: 60px;
-			}
-
-			>view:nth-child(2) {
-				font-size: 24rpx;
-				color: #999;
-			}
-		}
-
-		.tab-wrap {
-			background-color: #fff;
-
-			.tab {
-				width: 40%;
-				margin-left: -12rpx;
-			}
-		}
-
-		.content {
-			margin: 0 13rpx;
-			padding-bottom: 60rpx;
-			overflow: hidden;
-
-			.xy-card {
-				margin-top: 20rpx;
-				padding: 32rpx;
-			}
-		}
-
-		.title {
-			font-size: 28rpx;
-			font-weight: bold;
-			line-height: 50rpx;
-
-			.device-name {
-				font-size: 28rpx;
-				font-weight: bold;
-				color: #333;
-				max-width: 180rpx;
-
-				>text {
-					font-size: 24rpx;
-					color: #666;
-					font-weight: normal;
-				}
-			}
-		}
-
-		.t-content {
-			margin-top: 12rpx;
-
-			.c-item-t {
-				display: flex;
-				justify-content: flex-start;
-				margin-top: 12rpx;
-
-				.c-item {
-					width: 50%;
-					display: flex;
-					justify-content: flex-start;
-					align-items: flex-end;
-				}
-			}
-		}
-
-		.busy-state {
-			font-size: 24rpx;
-			height: 38rpx;
-			padding: 0 16rpx;
-			line-height: 38rpx;
-			background: #F4F8FF;
-			border-radius: 8rpx;
-			text-align: center;
-			font-weight: normal;
-
-			&.on {
-				color: #2C6FF3;
-			}
-
-			&.off {
-				color: #666;
-			}
-		}
-
-		.status {
-			font-weight: normal;
-		}
-
-		.empty {
-			margin-top: 50rpx;
-		}
-		
-		.btn{
-			width:724rpx;
-			position: fixed;
-			left: 13rpx;
-			bottom:calc(24rpx + env(safe-area-inset-bottom) / 2);
-			border-radius: 88rpx;
-			overflow: hidden;
-			.btn-wrap{
-				text-align: center;
-				font-size: 36rpx;
-				font-weight: 500;
-				>image{
-					width:42rpx;
-					height: 42rpx;
-					margin-right: 20rpx;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 252
pages/replenish/replenishmentRecord.vue

@@ -1,252 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="补货记录"></u-navbar>
-		<view class="search">
-			<u-search :clearabled="true" v-model="page.deviceId" placeholder='输入设备ID进行搜索' :showAction="true"
-				actionText="搜索" @custom='custom'></u-search>
-		</view>
-		<view class="flex align-center justify-between margin">
-			<view class="flex align-center">
-				<view class="flex align-center time">
-					<view class="" @tap="replenishmentdate('start')">{{dateStart?dateStart:'创建时间开始'}}</view>
-					<view class="">至</view>
-					<view class="" @tap="replenishmentdate('end')">{{dateend?dateend:'创建时间结束'}}</view>
-				</view>
-				<image class="date-image" src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/date.png" mode="widthFix"></image>
-			</view>
-			<view class="flex align-center" @tap="pickershow=true">
-				<view class="" style="font-size: 26rpx;">{{isopen?isopen:'是否开门'}}</view>
-				<image src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/selectIcon.png" mode="aspectFit"
-					style="width:24rpx;height: 24rpx;margin-left: 8rpx;"></image>
-
-				<!-- <view class="filter">筛选</view> -->
-			</view>
-		</view>
-		<scroll-view v-if="isEmpty===false" class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100" :style="{'height':fullHeight}">
-			<view class="replenishmentrecord-container" v-for="item in replenishmentList" :key="item.id"  @tap="details(item)">
-				<view class="flex align-center justify-between">
-					<view class="">商户ID:{{item.mercId}}</view>
-					
-					<view class="">
-						<u-tag v-if="!item.isOpenDoor" text="补货" type="error"></u-tag>
-						<u-tag v-else text="开门补货"></u-tag>
-					</view>
-				</view>
-				<view class="flex">设备ID:{{item.deviceId}}</view>
-				<view class="flex" v-if="item.urlVideo0">视频路径:{{item.urlVideo0}}</view>
-				<view class="flex" v-if="item.urlVideo1">视频路径:{{item.urlVideo1}}</view>
-				<view class="flex">创建人姓名:{{item.createUserName}}</view>
-				<view class="flex">创建时间:{{item.createTime}}</view>
-			</view>
-		</scroll-view>
-		<view v-if="isEmpty===true" class='empty'>
-			<u-empty mode="data" text="数据为空"></u-empty>
-		</view>
-
-
-		<u-picker title='是否开门' :show="pickershow" :columns="isOpenDoor" keyName="value" @confirm="pickerconfirm"
-			@cancel='pickerclose'></u-picker>
-
-
-		<u-datetime-picker :show="show" :closeOnClickOverlay="true" mode="date" @confirm="confirm" @cancel="close" v-model="timeStamp"></u-datetime-picker>
-	</view>
-</template>
-
-<script>
-	import {
-		page
-	} from "@/api/replenishment/replenishment.js"
-	export default {
-		data() {
-			return {
-				page: {
-					deviceId: '',
-					isOpenDoor: '',
-					beginCreateTime: '',
-					endCreateTime: ''
-				},
-				dateStart: '',
-				dateend: '',
-				type: '',
-				replenishmentList: [],
-				mode: 'range',
-				show: false,
-				pickershow: false,
-				date: [],
-				index: 1,
-				isopen: '',
-				isEmpty: false,
-				isOpenDoor: [
-					[{
-							type: '',
-							value: '全部'
-						},
-						{
-							type: true,
-							value: '是'
-						}, {
-							type: false,
-							value: '否'
-						}
-					],
-				],
-				timeStamp: new Date(), //时间picker显示时间
-			}
-		},
-		onLoad(o) {
-			if(o.id){
-				this.page.deviceId=o.id
-			}
-			this.currentDate = new Date();
-			this.currentDate = new Date();
-			this.dateStart = uni.$u.timeFormat(this.currentDate, 'yyyy-mm-dd')
-			this.dateend = uni.$u.timeFormat(this.currentDate, 'yyyy-mm-dd')
-
-			this.page.beginCreateTime = this.dateStart + ' 00:00:00'
-			this.page.endCreateTime = this.dateend + ' 23:59:59'
-			this.getPage()
-		},
-		methods: {
-			franchiseePickerChange(e) {
-				this.index = e.detail.value
-			},
-			replenishmentdate(type) {
-				if (type == 'start') {
-					this.type = type
-				}
-				if (type == 'end') {
-					this.type = type
-				}
-				this.show = true
-			},
-			close() {
-				this.show = false
-			},
-			confirm(e) {
-				if (this.type == 'start') {
-					this.dateStart = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-					this.page.beginCreateTime = this.dateStart + ' 00:00:00'
-				}
-				if (this.type == 'end') {
-					this.dateend = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
-					this.page.endCreateTime = this.dateend+ ' 23:59:59'
-				}
-				
-				if(this.dateStart>this.dateend){
-					uni.$u.toast('开始日期不能大于结束日期')
-					return;
-				}
-				
-				this.getPage()
-				this.show = false
-			},
-			custom() {
-				this.getPage()
-			},
-			pickerconfirm(e) {
-				this.isopen = e.value[0].value
-
-				this.page.isOpenDoor = e.value[0].type
-
-				this.getPage()
-				this.pickershow = false
-			},
-			pickerclose() {
-				this.pickershow = false
-			},
-			// 补货详情
-			details(val) {
-				this.$tab.navigateTo('replenishmentRecordDetails?id=' + val.id)
-			},
-			getPage() {
-				page({
-					page: {
-						size: -1,
-					},
-					"deviceId": this.page.deviceId,
-					"isOpenDoor": this.page.isOpenDoor,
-					"beginCreateTime": this.page.beginCreateTime,
-					"endCreateTime": this.page.endCreateTime
-				}).then(res => {
-					if (res.data.page == null) {
-						this.isEmpty = true
-					}
-					this.replenishmentList = res.data.records;
-					this.isEmpty = this.replenishmentList.length == 0;
-
-				})
-			}
-		}
-	}
-</script>
-<style>
-	page {
-		background-color: #f7f7f7;
-	}
-</style>
-<style lang="scss" scoped>
-	.container {
-		.margintop {
-			margin-top: 20rpx;
-		}
-
-		.marleft {
-			margin-left: 10rpx;
-		}
-
-		.scrollview {
-		
-		}
-
-		.empty {
-			margin-top: 120rpx
-		}
-
-		.search {
-			padding: 24rpx 24rpx;
-			background-color: #fff;
-		}
-
-		.time {
-			font-size: 26rpx;
-			font-weight: 400;
-			color: #333440;
-
-
-		}
-
-		.date-image {
-			width: 30rpx;
-			margin-left: 10rpx;
-		}
-
-		.filter {
-			font-size: 26rpx;
-			font-weight: 400;
-			color: #000000;
-			margin-left: 22rpx;
-		}
-
-
-
-		.date {
-			margin-left: 10rpx;
-			padding: 15rpx;
-			border-radius: 15rpx;
-			background-color: #fff;
-		}
-
-		.magin {
-			margin: 10rpx 20rpx;
-		}
-
-		.replenishmentrecord-container {
-			background-color: #fff;
-			padding: 20rpx;
-			border-radius: 15rpx;
-			margin:0 20rpx 20rpx 20rpx;
-			box-shadow: 0 5rpx 4rpx rgba(179, 179, 179, 0.3);
-		}
-	}
-</style>

+ 0 - 155
pages/replenish/replenishmentRecordDetails.vue

@@ -1,155 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="补货记录详情"></u-navbar>
-
-		<view class="topTip">总共补了{{replenishmentList.length}}种商品<!--  数量是{{total}} --></view>
-
-		<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100" :style="{'height':fullHeight}">
-			<view class="replenishmentrecord-container" v-for="(item,index) in replenishmentList" :key="item.id">
-				<view class="">
-					设备商品:{{item.goodsName}}
-				</view>
-				<view class="" style="margin-top: 20rpx;">
-					设备商品Id:{{item.deviceGoodsId}}
-				</view>
-
-				<view class="flex align-center"
-					style="margin-top: 15rpx;background-color: #f5f8fb;padding: 10rpx;border-radius: 15rpx;">
-					<view class="">
-						<u--image radius='15rpx' :showLoading="true" :src="item.cover" width="80px" height="80px"
-							@click="click"></u--image>
-					</view>
-
-					<view class="flex flex-direction align-start" style="margin-left: 35rpx;">
-						<view class="flex align-center justify-around" v-if="item.oldStock!=item.newStock">
-							<view class="flex flex-sub width">原库存:{{item.oldStock}}</view>
-							<view class="flex">新库存:{{item.newStock}}</view>
-						</view>
-						<view class="flex align-center justify-around" v-if="item.oldStock!=item.newStock">
-							<view class="flex flex-sub" style="color: red;">补货数量:{{item.newStock-item.oldStock}}</view>
-						</view>
-						<view class="flex align-center justify-around" v-if="item.oldCapacity!=item.newCapacity">
-							<view class="flex flex-sub width">原容量:{{item.oldCapacity}}</view>
-							<view class="flex">新容量:{{item.newCapacity}}</view>
-						</view>
-						<view class="flex align-center justify-around" v-if="item.newPrice!=null&&item.oldPrice!=item.newPrice">
-							<view class="flex flex-sub width">原价格:¥{{(Number(item.oldPrice)/100).toFixed(2)}}</view>
-							<view class="flex">新价格:¥{{(Number(item.newPrice)/100).toFixed(2)}}</view>
-						</view>
-						<view class="flex align-center justify-around" v-if="item.oldWarning!=item.newWarning">
-							<view class="flex flex-sub width">原预警值:{{item.oldWarning}}</view>
-							<view class="flex">新预警值:{{item.newWarning}}</view>
-						</view>
-
-					</view>
-
-
-				</view>
-
-
-
-
-
-
-			</view>
-		</scroll-view>
-	</view>
-</template>
-
-<script>
-	import {
-		obj
-	} from "@/api/replenishment/replenishment.js"
-	export default {
-		data() {
-			return {
-				replenishmentList: [],
-				isEmpty: false,
-				id: '',
-				total: 0,
-				fullHeight:0,
-			}
-		},
-		onLoad(e) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						_this.fullHeight = 2 * (res.windowHeight - data.top) + 'rpx';
-					},
-				});
-			}).exec();
-
-			this.id = e.id
-			this.getObj()
-		},
-		methods: {
-			getObj() {
-				obj({
-					"id": this.id,
-					"activityId": 0
-				}).then(res => {
-					if (res.data.goods == null) {
-						this.isEmpty = true
-					}
-					this.replenishmentList = res.data.goods;
-					this.replenishmentList.forEach(item => {
-						this.total = 0
-						this.total += item.newStock - item.oldStock
-					})
-
-					this.isEmpty = this.replenishmentList.length == 0;
-
-				})
-			}
-		}
-	}
-</script>
-<style>
-	page {
-		background-color: #f7f7f7;
-	}
-</style>
-<style lang="scss" scoped>
-	.container {
-		.margintop {
-			margin-top: 20rpx;
-		}
-
-		.marleft {
-			margin-left: 10rpx;
-		}
-
-		.scrollview {}
-
-		.topTip {
-			padding: 15rpx;
-			text-align: center;
-			background-color: #fdf6ec;
-			color: #faba5a;
-		}
-
-		.empty {
-			margin-top: 120rpx
-		}
-
-		.width {
-			width: 220rpx;
-		}
-
-
-		.magin {
-			margin: 10rpx 20rpx;
-		}
-
-		.replenishmentrecord-container {
-			background-color: #fff;
-			padding: 20rpx;
-			border-radius: 15rpx;
-			margin: 0 20rpx 20rpx 20rpx;
-			box-shadow: 0 5rpx 4rpx rgba(179, 179, 179, 0.3);
-		}
-	}
-</style>

+ 0 - 251
pages/system/addEmployee.vue

@@ -1,251 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="人员管理"></u-navbar>
-		<view class="content">
-			<view class="list">
-				<u-cell-group :border="false">
-					<u-cell title="登录名">
-						<input slot="value" placeholder="请输入登录名" type="text" v-model="params.account"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="姓名">
-						<input slot="value" placeholder="请输入姓名" type="text" v-model="params.name"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="手机号">
-						<input slot="value" placeholder="请输入手机号" type="number" v-model="params.tel"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="邮箱">
-						<input slot="value" placeholder="请输入邮箱" type="" v-model="params.mail"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="密码">
-						<input slot="value" placeholder="请输入密码" type="password" v-model="params.password"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="角色" :isLink="true" @click="popShow=true">
-						<text slot="value">{{roleName}}</text>
-					</u-cell>
-					<u-cell title="备注" :border="false">
-						<input slot="value" placeholder="请输入备注" type="" v-model="params.remark"
-							class="u-slot-value"></input>
-					</u-cell>
-				</u-cell-group>
-			</view>
-			<view style="color: red;line-height: 60rpx;text-align: right;padding-right: 20rpx;">
-				{{err}}
-			</view>
-			<view class="btn safe-bottom">
-				<xbutton round="82rpx" size="large" @click="submit">创建</xbutton>
-			</view>
-		</view>
-
-		<xpopup :show="popShow" @close="popClose" @confirm="popSubmit" :showBtn="true" title="选择角色">
-			<view class="pop-content flex">
-				<!-- 多选 -->
-				<view class="u-page__tag-item" v-for="(item, index) in roleList" :key="item.name">
-					<u-tag :text="item.name" :plain="!item.checked" type="warning" :name="index" @click="checkboxClick">
-					</u-tag>
-				</view>
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		save,
-		roleList
-	} from "@/api/system/employee.js"
-	export default {
-		data() {
-			return {
-				params: {
-					"name": "",
-					"tel": "",
-					"mail": "",
-					"password": "",
-					"roleIds": "",
-					"account": "",
-					"remark":""
-				},
-				roleName: '',
-				popShow: false,
-				roleList: [],
-				err: ''
-			}
-		},
-
-		onLoad(o) {
-			this.getRoleList()
-		},
-
-		methods: {
-			getRoleList() {
-				roleList({
-					page: {
-						current: 1,
-						size: 10000
-					},
-					sysId: uni.getStorageSync('sysId')
-				}).then(res => {
-					let data = res.data.records;
-					if (data.length > 0) {
-						let newData = data.map(i => {
-							return {
-								id: i.id,
-								name: i.name,
-								checked: false
-							}
-						})
-						this.roleList = newData;
-					} else {
-						this.roleList = [];
-					}
-				})
-			},
-
-			//弹框提交
-			submit() {
-				save(this.params).then(res => {
-					this.$modal.msg('保存成功')
-					this.$tab.navigateBack()
-					this.err = ''
-				}).catch(err => {
-					if (err.length > 15) {
-						this.err = '请重试!'
-					} else {
-						this.err = err.substr(0, 12)
-					}
-				})
-			},
-
-			//滚动到底加载更多
-			onReachBottom() {
-				if (this.noMore) return
-				this.page++
-				this.getPointList()
-			},
-
-			//禁用
-			stop() {
-				this.popShow = true
-			},
-
-			//弹框关闭
-			popClose() {
-				this.popShow = false
-			},
-
-			//弹框提交
-			popSubmit() {
-				this.popClose()
-				let nameVal = []
-				let idVal = []
-				this.roleList.forEach(i => {
-					if (i.checked) {
-						nameVal.push(i.name)
-						idVal.push(i.id)
-					}
-				})
-				this.roleName = nameVal.join(',')
-				this.params.roleIds = idVal
-			},
-
-			checkboxClick(name) {
-				this.roleList[name].checked = !this.roleList[name].checked
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		overflow: hidden;
-
-		.content {
-			padding: 0rpx 13rpx 12rpx;
-			overflow: hidden;
-
-			.list {
-				width: 100%;
-				margin-top: 24rpx;
-				background-color: #fff;
-				padding: 0rpx 30rpx;
-				border-radius: 12rpx;
-
-				input {
-					text-align: right;
-				}
-
-				/deep/ .u-cell__body {
-					padding: 30rpx 6rpx;
-				}
-			}
-		}
-	}
-
-	.empty {
-		margin-top: 40%;
-	}
-
-	.btn {
-		width: 100%;
-		position: fixed;
-		left: 0;
-		padding: 0 24rpx;
-	}
-
-	.popup-content {
-		padding: 36rpx 24rpx;
-		display: flex;
-		flex-flow: row nowrap;
-		justify-content: flex-start;
-		align-items: center;
-
-		input {
-			border: 1rpx solid #999;
-			border-radius: 6rpx;
-			width: 530rpx;
-			padding: 0 24rpx;
-		}
-
-		&.edit-point {
-			flex-direction: column;
-			align-items: flex-start;
-
-			.edit-point-item {
-				width: 100%;
-				padding-left: 170rpx;
-				position: relative;
-
-				&+.edit-point-item {
-					margin-top: 12rpx;
-				}
-
-				>view:nth-child(1) {
-					position: absolute;
-					left: 0;
-					top: 50%;
-					transform: translateY(-50%);
-				}
-			}
-		}
-	}
-
-	.del-popup-content {
-		padding: 36rpx 24rpx;
-		text-align: center;
-		font-size: 32rpx;
-	}
-
-	.pop-content {
-		padding: 24rpx;
-
-		.u-page__tag-item {
-			margin-right: 24rpx;
-		}
-	}
-</style>

+ 0 - 427
pages/system/deviceManage.vue

@@ -1,427 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="团队成员设备授权"></u-navbar>
-		<view class="content">
-			<view class="search">
-				<u-search animation placeholder="搜索设备" :clearabled="false" v-model="keyword" :showAction="false"
-					@search="search"></u-search>
-				<view class="scan-icon" @click="scan">
-					<u-icon name="scan" size="22" color="#909399"></u-icon>
-				</view>
-
-				<view class="search-history flex flex-wrap flex-start">
-					<view class="history-item" v-for="(item,index) in historyList" :key="index"
-						@click="searchFast(item)">
-						{{item}}
-					</view>
-				</view>
-			</view>
-			<view class="tab-wrap">
-				<view class="tab">
-					<u-tabs :list="tabList" :activeStyle="{color: '#333',fontWeight: 'bold',fontSize:'36rpx'}"
-						:inactiveStyle="{fontSize:'32rpx'}" :scrollable="false" :current="current" @click="tabClick"
-						lineColor="#2C6FF3">
-					</u-tabs>
-				</view>
-			</view>
-
-			<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100"
-				@scrolltolower="scrolltolower" :style="{height:fullHeight}">
-
-				<view class="list" v-if="list&&list.length>0">
-					<block v-for="(item, index) in list" :key="index">
-						<view class="thumb-box" @click.stop="commItemSelect(item)">
-							<view>
-								<image class="select-img"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/no_selected.png"
-									mode="widthFix" v-show="item.noSelect"></image>
-								<image class="select-img"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/selected.png"
-									mode="widthFix" v-show="!item.noSelect&&item.checked"></image>
-								<image class="select-img"
-									src="https://cdn.ossfile.mxrvending.com/assets/xy_merc_mini/images/commodity/select.png"
-									mode="widthFix" v-show="!item.noSelect&&!item.checked"></image>
-							</view>
-							<view class="check-content">
-								<view class="comm-main">
-									<view>
-										{{item.deviceName}}
-									</view>
-									<view>
-										设备id:{{item.deviceId}}
-									</view>
-								</view>
-							</view>
-						</view>
-					</block>
-					<view class="more" style="overflow: hidden;">
-						<u-loadmore :status="status" v-if="list.length>=1" />
-					</view>
-				</view>
-				<view class="empty" v-if="list.length==0">
-					<u-empty mode="list" text="没有设备!"></u-empty>
-				</view>
-			</scroll-view>
-		</view>
-
-		<view class="btn safe-bottom">
-			<xbutton size="large" round="82rpx" @click="submit">{{current==0?'解绑':'绑定'}}</xbutton>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mercDeviceList,
-		addDevice,
-		userDeviceList,
-		delDevice
-	} from "@/api/device/device.js"
-
-	export default {
-		data() {
-			return {
-				keyword: '',
-				list: [], //商品列表
-
-				page: 1, //商品分页
-				size: 10,
-
-				status: 'loadmore', //加载更多
-				type: null,
-				storeName: null,
-				title: '私有商品库',
-				btnName: '添加到商品私库',
-				selectList: [],
-				id: null,
-				historyList: [],
-
-				tabList: [{
-						name: '已授权'
-					},
-					{
-						name: '未授权'
-					}
-				],
-				current: 0,
-				fullHeight: 0,
-				userId: null,
-			}
-		},
-
-		onLoad(o) {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-
-			this.userId = o.id;
-
-			this.getList()
-		},
-
-		computed: {
-			deviceIdList() {
-				let list = [];
-				this.list.forEach(i => {
-					if (i.checked) {
-						list.push(i.deviceId)
-					}
-				})
-				return list
-			}
-		},
-		methods: {
-			search(val) {
-				this.saveKeyWord('goods', this.keyword)
-				this.reset();
-				this.getList()
-			},
-
-			tabClick(e) {
-				this.current = e.index
-				this.search()
-			},
-
-			saveKeyWord(type, val) {
-				if (val) {
-					let arr = []
-					if (uni.getStorageSync(type)) {
-						let arr = JSON.parse(uni.getStorageSync(type))
-						if (arr.indexOf(val) != -1) {
-							arr.splice(arr.indexOf(val), 1)
-						}
-						arr.unshift(val)
-						if (arr.length > 6) {
-							arr.pop()
-						}
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					} else {
-						arr.unshift(val)
-						this.historyList = JSON.parse(JSON.stringify(arr))
-						uni.setStorageSync(type, JSON.stringify(arr))
-					}
-				} else {
-					return
-				}
-			},
-
-			searchFast(e) {
-				this.keyword = e
-				this.search()
-			},
-
-			//扫码
-			scan() {
-				uni.scanCode({
-					success: (res) => {
-						this.keyword = res.result;
-						this.getList()
-					}
-				});
-			},
-
-			//根据类目获取商品列表
-			getList(id) {
-				if (this.current == 0) {
-					userDeviceList({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword,
-						userInfoId: this.userId,
-					}).then(res => {
-						let newData = res.data.records;
-						newData.forEach(i => {
-							i.checked = false
-						})
-						if (newData.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.list = this.list.concat(newData)
-						console.log(this.list)
-					})
-				}
-				if (this.current == 1) {
-					mercDeviceList({
-						page: {
-							current: this.page,
-							size: this.size
-						},
-						keyword: this.keyword,
-						userInfoId: this.userId,
-					}).then(res => {
-						let newData = res.data;
-						newData.forEach(i => {
-							i.checked = false
-						})
-						if (newData.length < 10) {
-							this.status = "nomore"
-						} else {
-							this.status = "loadmore"
-						}
-						this.list = this.list.concat(newData)
-					})
-				}
-			},
-
-			//触底加载更多
-			scrolltolower() {
-				if (this.status == 'nomore') return
-				this.page++
-				this.getList()
-			},
-
-			reset() {
-				this.status == 'loadmore'
-				this.page = 1;
-				this.size = 10;
-				this.list = [];
-			},
-
-			// 商品选中状态改变
-			commItemSelect(e) {
-				e.checked = !e.checked
-			},
-
-			submit() {
-
-				uni.showModal({
-					title: '提示',
-					content: `是否确认${this.current==0?'解绑':'绑定'}`,
-					success: res => {
-						if (res.confirm) {
-							if (this.current == 0) {
-								delDevice({
-									"userInfoId": this.userId,
-									"deviceIdList": this.deviceIdList
-								}).then(res => {
-									this.$modal.msg('解绑成功')
-									this.search()
-								})
-							} else {
-								addDevice({
-									"userInfoId": this.userId,
-									"deviceIdList": this.deviceIdList
-								}).then(res => {
-									this.$modal.msg('绑定成功')
-									this.search()
-								})
-							}
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		.content {
-			padding-bottom: 88rpx;
-
-			.search {
-				padding: 24rpx 24rpx 12rpx;
-				background-color: #fff;
-				position: relative;
-
-				.scan-icon {
-					position: absolute;
-					right: 36rpx;
-					top: 38rpx;
-					z-index: 2;
-				}
-
-				.search-history {
-
-					.history-item {
-						margin-right: 24rpx;
-						padding: 0 12rpx;
-						background-color: #f2f2f2;
-						color: #333;
-						font-size: 24rpx;
-						line-height: 40rpx;
-						border-radius: 40rpx;
-						margin-top: 24rpx;
-					}
-				}
-			}
-
-			.tab-wrap {
-				background-color: #fff;
-				.tab{
-					width:50%;
-				}
-			}
-
-			.list {
-				width: 100%;
-				padding: 0rpx 13rpx 12rpx;
-				padding-bottom: calc(110rpx + env(safe-area-inset-bottom) / 2);
-				overflow: hidden;
-
-				.thumb-box {
-					border-bottom: 1rpx solid #f4f4f4;
-					display: flex;
-					flex-flow: row nowrap;
-					padding: 20rpx;
-					background-color: #fff;
-					border-radius: 12rpx;
-					margin-top: 12rpx;
-				}
-
-				.select-img {
-					width: 40rpx;
-					height: 40rpx;
-					margin-top: 14rpx;
-				}
-
-				.check-content {
-					display: flex;
-					flex-direction: row;
-					align-items: center;
-					padding-left: 12rpx;
-
-					.comm-img {
-						width: 130rpx;
-						height: 130rpx;
-						display: flex;
-						flex-direction: row;
-						align-items: center;
-						justify-content: space-around;
-
-						image {
-							width: 100%;
-						}
-					}
-
-					.comm-main {
-						box-sizing: border-box;
-						padding-left: 18rpx;
-						color: #999;
-						line-height: 60rpx;
-
-						>view {
-							padding: 4rpx 0;
-						}
-
-						>view:nth-child(1) {
-							font-size: 30rpx;
-							font-weight: bold;
-							color: #333;
-						}
-
-						>view:nth-child(2) {
-							font-size: 28rpx;
-						}
-					}
-				}
-			}
-		}
-
-		.btn {
-			width: 100%;
-			position: fixed;
-			left: 0;
-			padding: 0 24rpx;
-		}
-
-		.empty {
-			position: absolute;
-			left: 50%;
-			top: 50%;
-			transform: translate(-50%, -50%);
-		}
-	}
-</style>

+ 0 - 285
pages/system/empDetail.vue

@@ -1,285 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" :title="title"></u-navbar>
-		<view class="content">
-			<view class="list">
-				<u-cell-group :border="false">
-					<u-cell title="登录名">
-						<input slot="value" placeholder="请输入登录名" type="text" v-model="params.account"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="姓名">
-						<input slot="value" placeholder="请输入姓名" type="text" v-model="params.name"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="密码">
-						<input slot="value" placeholder="请输入密码" type="password" v-model="params.password"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="手机号">
-						<input slot="value" placeholder="请输入手机号" type="number" v-model="params.tel"
-							class="u-slot-value"></input>
-					</u-cell>
-					<!-- <u-cell title="邮箱">
-						<input slot="value" placeholder="请输入邮箱" type="number" v-model="params.mail"
-							class="u-slot-value"></input>
-					</u-cell> -->
-					<u-cell title="角色" :isLink="true" @click="popShow=true">
-						<text slot="value">{{roleName}}</text>
-					</u-cell>
-					<u-cell title="备注">
-						<input slot="value" placeholder="请输入备注" type="" v-model="params.remark"
-							class="u-slot-value"></input>
-					</u-cell>
-					<u-cell title="可管理设备" :isLink="true" :url="`/pages/system/deviceManage?id=${params.userId}`">
-					</u-cell>
-					<u-cell title="支付宝" :isLink="true" @click="bindAli">
-						<text slot="value">{{params.aliUserId?'已绑定':'未绑定'}}</text>
-					</u-cell>
-					<u-cell title="状态" :border="false">
-						<view slot="value" @click="stop">
-							{{params.status?'启用':'禁用'}}
-						</view>
-					</u-cell>
-
-				</u-cell-group>
-			</view>
-			<view style="color: red;line-height: 60rpx;text-align: right;padding-right: 26rpx;">
-				{{err}}
-			</view>
-			<view class="btn safe-bottom">
-				<xbutton round="82rpx" size="large" @click="sure">保存</xbutton>
-			</view>
-		</view>
-
-		<xpopup :show="popShow" @close="popClose" @confirm="popSubmit" :showBtn="true" title="选择角色">
-			<view class="pop-content flex">
-				<!-- 多选 -->
-				<view class="u-page__tag-item" v-for="(item, index) in roleList" :key="item.name">
-					<u-tag :text="item.name" :plain="!item.checked" type="warning" :name="index" @click="checkboxClick">
-					</u-tag>
-				</view>
-			</view>
-		</xpopup>
-	</view>
-</template>
-
-<script>
-	import {
-		roleList,
-		objByUserId,
-		update
-	} from "@/api/system/employee.js"
-	import {
-		showConfirm
-	} from '@/utils/common'
-	export default {
-
-		data() {
-			return {
-				id: '',
-				title: '',
-
-				params: {
-					name: "",
-					tel: "",
-					// "mail": "",
-					password: "",
-					roleIds: "",
-					account: "",
-					status: true,
-					remark:""
-				},
-				popShow: false,
-				roleList: [],
-				err: ''
-			}
-		},
-
-		computed: {
-			roleName() {
-				let val = []
-				this.roleList.forEach(i => {
-					if (i.checked) {
-						val.push(i.name)
-					}
-				})
-				return val.join(',')
-			},
-			roleIds() {
-				let val = []
-				this.roleList.forEach(i => {
-					if (i.checked) {
-						val.push(i.id)
-					}
-				})
-				return val
-			}
-		},
-
-		onLoad(o) {
-			this.title = o.title;
-			this.id = o.id;
-		},
-
-		async onShow() {
-			await this.getRoleList()
-			if (this.id) {
-				await this.getDetail();
-			}
-		},
-
-		methods: {
-			getRoleList() {
-				return new Promise((resolve, reject) => {
-					roleList({
-						page: {
-							current: 1,
-							size: 10000
-						},
-						sysId: uni.getStorageSync('sysId')
-					}).then(res => {
-						let data = res.data.records;
-						if (data.length > 0) {
-							let newData = data.map(i => {
-								return {
-									id: i.id,
-									name: i.name,
-									checked: false
-								}
-							})
-							this.roleList = newData;
-						} else {
-							this.roleList = [];
-						}
-						resolve(data)
-					}).catch(err => {
-						reject(err)
-					})
-				})
-			},
-
-			getDetail(id) {
-				objByUserId({
-					userId: this.id
-				}).then(res => {
-					this.params = res.data;
-					//反显角色
-					this.roleList.forEach(i => {
-						res.data.roleNames.forEach(j => {
-							if (j == i.name) {
-								i.checked = true
-							}
-						})
-					})
-				})
-			},
-
-			//禁用
-			stop() {
-				this.params.status = !this.params.status
-			},
-
-			//弹框关闭
-			popClose() {
-				this.popShow = false
-			},
-
-			//弹框提交
-			popSubmit() {
-				update({
-					userId: this.params.userId,
-					roleIds: this.roleIds
-				}).then(res => {
-					this.popClose()
-				})
-				setTimeout(() => {
-					this.getDetail()
-				}, 500)
-			},
-
-			checkboxClick(name) {
-				this.roleList[name].checked = !this.roleList[name].checked
-			},
-
-			bindAli() {
-				this.$tab.navigateTo('/pages/activeDevice/bindAliAcc?userId=' + this.id)
-			},
-
-			sure() {
-				let params = {
-					userId: this.params.userInfoId,
-					name: this.params.name,
-					tel: this.params.tel,
-					account: this.params.account,
-					roleIds: this.roleIds,
-					status: this.params.status,
-					remark:this.params.remark
-				}
-				update(params).then(res => {
-					this.$modal.msg('保存成功')
-					this.$tab.navigateBack()
-				}).catch(err => {
-					if (err.length > 15) {
-						this.err = '请重试!'
-					} else {
-						this.err = err.substr(0, 12)
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		overflow: hidden;
-
-		.content {
-			padding: 0rpx 13rpx 12rpx;
-			overflow: hidden;
-
-			.list {
-				width: 100%;
-				margin-top: 24rpx;
-				background-color: #fff;
-				padding: 0rpx 30rpx;
-				border-radius: 12rpx;
-
-				input {
-					text-align: right;
-				}
-
-				/deep/ .u-cell__body {
-					padding: 30rpx 6rpx;
-				}
-			}
-		}
-	}
-
-	.empty {
-		margin-top: 40%;
-	}
-
-	.btn {
-		width: 100%;
-		position: fixed;
-		left: 0;
-		padding: 0 24rpx;
-	}
-
-	.del-popup-content {
-		padding: 36rpx 24rpx;
-		text-align: center;
-		font-size: 32rpx;
-	}
-
-	.pop-content {
-		padding: 24rpx;
-
-		.u-page__tag-item {
-			margin-right: 24rpx;
-		}
-	}
-</style>

+ 0 - 282
pages/system/employee.vue

@@ -1,282 +0,0 @@
-<template>
-	<view class="container">
-		<u-navbar leftIconColor="#fff" titleStyle="color:#fff;fontSize:36rpx;" :autoBack="true" bgColor="#2C6FF3"
-			:placeholder="true" title="人员管理"></u-navbar>
-		<view class="content">
-
-			<scroll-view class="scrollview" :scroll-with-animation="true" scroll-y lower-threshold="100"
-				:style="{height:fullHeight}">
-				<view class="list" v-if="list&&list.length>0">
-					<block v-for="(item, index) in list" :key="index">
-						<view class="comm-main flex justify-between">
-							<view @click.stop="detail(item)">
-								<view class="flex align-center">
-									<view>
-										{{item.name}}
-									</view>
-									<view>
-										{{item.roleNames[0]||'无'}}
-									</view>
-								</view>
-								<view class="phone-user flex align-center" @click.stop="phone(item.tel)">
-									<image class="image" src="https://ossfile.mxrvending.com/assets/xy_merc_mini/images/system/tel.png" mode="widthFix"></image>
-									<view class="tel">
-										{{item.tel}}
-									</view>
-								</view>
-							</view>
-
-							<view class="stop">
-								<u-switch activeColor="#2C6FF3" size="20" v-model="item.status"
-									@change="stop(item)"></u-switch>
-							</view>
-						</view>
-					</block>
-				</view>
-				<view class="empty" v-if="list.length==0">
-					<u-empty mode="list" text="没有用户!"></u-empty>
-				</view>
-			</scroll-view>
-
-
-			<view class="btn safe-bottom">
-				<xbutton size="large" round="82rpx" @click="add">添加人员</xbutton>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		list,
-		update
-	} from "@/api/system/employee.js"
-	export default {
-		data() {
-			return {
-				list: [], //列表
-				fullHeight: 0,
-			}
-		},
-
-		onLoad() {
-			let _this = this;
-			const query = uni.createSelectorQuery().in(this);
-			query.select(".scrollview").boundingClientRect((data) => {
-				uni.getSystemInfo({
-					success(res) {
-						// 针对iPhone X等机型底部安全距离做适配
-						const model = res.model;
-						const modelInclude = [
-							"iPhone X",
-							'iPhone XR',
-							"iPhone XS",
-							"iPhone XS MAX",
-							"iPhone 12/13 mini",
-							"iPhone 12/13 (Pro)",
-							"iPhone 12/13 Pro Max",
-							"iPhone 14 Pro Max"
-						];
-						let safeDistance = modelInclude.includes(model)
-						//动态设置商品区域高度
-						if (safeDistance) {
-							_this.fullHeight = res.windowHeight - data.top - 34 + 'px';
-						} else {
-							_this.fullHeight = res.windowHeight - data.top + 'px';
-						}
-					},
-				});
-			}).exec();
-		},
-
-		onShow() {
-			this.getList()
-		},
-
-		methods: {
-			//获取分页
-			getList() {
-				list({}).then(res => {
-					this.list = res.data
-				})
-			},
-
-			detail(item) {
-				this.$tab.navigateTo(`/pages/system/empDetail?title=${item.name}&id=${item.userId}`)
-			},
-
-			stop(item) {
-				let msg = item.status ? '启用' : '禁用'
-				uni.showModal({
-					title: '提示',
-					content: `是否确认${msg}`,
-					success: res=> {
-						if (res.confirm) {
-							update({
-								userId: item.userInfoId,
-								status: item.status
-							}).then(res => {
-								this.getList()
-								setTimeout(()=>{
-									this.$modal.showToast(`${msg}成功~`)
-								},500)
-							}).catch(err => {
-								
-							})
-						} else if (res.cancel) {
-							item.status=!item.status
-						}
-					}
-				});
-			},
-
-			//添加人员
-			add() {
-				this.$tab.navigateTo('/pages/system/addEmployee')
-			},
-			
-			//拨打电话
-			phone(tel){
-				uni.makePhoneCall({
-					phoneNumber: tel
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.container {
-		overflow: hidden;
-
-		.content {
-
-			.list {
-				width: 100%;
-				padding: 0rpx 13rpx 12rpx;
-				padding-bottom: calc(110rpx + env(safe-area-inset-bottom) / 2);
-				overflow: hidden;
-
-				.comm-img {
-					width: 130rpx;
-					height: 130rpx;
-					display: flex;
-					flex-direction: row;
-					align-items: center;
-					justify-content: space-around;
-
-					image {
-						width: 130rpx;
-						height: 130rpx;
-					}
-				}
-
-				.comm-main {
-					padding: 20rpx 30rpx;
-					background-color: #fff;
-					border-radius: 12rpx;
-					margin-top: 12rpx;
-					box-sizing: border-box;
-					color: #999;
-					line-height: 60rpx;
-					position: relative;
-					
-					.image{
-						width:23rpx;
-						height:23rpx;
-						margin-right: 12rpx;
-					}
-
-					>view:nth-child(1){
-						width:580rpx;
-						>view {
-							padding: 4rpx 0;
-						}
-						
-						>view:nth-child(1) {
-						
-							>view:nth-child(1) {
-								font-size: 30rpx;
-								font-weight: bold;
-								color: #333;
-							}
-						
-							>view:nth-child(2) {
-								font-size: 28rpx;
-								margin-left: 24rpx;
-							}
-						}
-						
-						>view:nth-child(2) {
-							font-size: 28rpx;
-						}
-					}
-					
-					.phone-user{
-						width:250rpx;
-					}
-
-					.stop {
-						// position: absolute;
-						// right: 30rpx;
-						// top: 26rpx;
-					}
-				}
-			}
-		}
-	}
-
-	.empty {
-		margin-top: 40%;
-	}
-
-	.btn {
-		width: 100%;
-		position: fixed;
-		left: 0;
-		padding: 0 24rpx;
-	}
-
-	.popup-content {
-		padding: 36rpx 24rpx;
-		display: flex;
-		flex-flow: row nowrap;
-		justify-content: flex-start;
-		align-items: center;
-
-		input {
-			border: 1rpx solid #999;
-			border-radius: 6rpx;
-			width: 530rpx;
-			padding: 0 24rpx;
-		}
-
-		&.edit-point {
-			flex-direction: column;
-			align-items: flex-start;
-
-			.edit-point-item {
-				width: 100%;
-				padding-left: 170rpx;
-				position: relative;
-
-				&+.edit-point-item {
-					margin-top: 12rpx;
-				}
-
-				>view:nth-child(1) {
-					position: absolute;
-					left: 0;
-					top: 50%;
-					transform: translateY(-50%);
-				}
-			}
-		}
-	}
-
-	.del-popup-content {
-		padding: 36rpx 24rpx;
-		text-align: center;
-		font-size: 32rpx;
-	}
-</style>

+ 0 - 39
permission.js

@@ -1,39 +0,0 @@
-import { getToken } from '@/utils/auth'
-
-// 登录页面
-const loginPage = "/pages/login"
-  
-// 页面白名单
-const whiteList = [
-  '/pages/login'
-]
-
-// 检查地址白名单
-function checkWhite(url) {
-  const path = url.split('?')[0]
-  return whiteList.indexOf(path) !== -1
-}
-
-// 页面跳转验证拦截器
-let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]
-list.forEach(item => {
-  uni.addInterceptor(item, {
-    invoke(to) {
-      if (getToken()) {
-        if (to.path === loginPage) {
-          uni.reLaunch({ url: "/" })
-        }
-        return true
-      } else {
-        if (checkWhite(to.url)) {
-          return true
-        }
-        uni.reLaunch({ url: loginPage })
-        return false
-      }
-    },
-    fail(err) {
-      console.log(err)
-    }
-  })
-})

+ 0 - 17
plugins/index.js

@@ -1,17 +0,0 @@
-import tab from './tab'
-import auth from './auth'
-import modal from './modal'
-import xy from './xy'
-
-export default {
-  install(Vue) {
-    // 页签操作
-    Vue.prototype.$tab = tab
-    // 认证对象
-    Vue.prototype.$auth = auth
-    // 模态框对象
-    Vue.prototype.$modal = modal
-	// 处理数据
-	Vue.prototype.$xy = xy
-  }
-}

+ 0 - 42
plugins/xy.js

@@ -1,42 +0,0 @@
-export default {
-	//金额分转换为元
-	delMoney(money) {
-		let newMoney = '';
-		if (money) {
-			if (typeof(money) == Number) {
-				newMoney = (money / 100).toFixed(2)
-			} else {
-				newMoney = ((Number(money) / 100)).toFixed(2)
-			}
-		} else {
-			newMoney = 0
-		}
-		return newMoney
-	},
-
-	//支付方式反显
-	getPayType(type) {
-		let value = '微信支付'
-		switch (type) {
-			case 3:
-				value = '微信支付'
-				break;
-			case 2:
-				value = '支付宝支付'
-				break;
-			case 10:
-				value = '取货'
-				break;
-			case 11:
-				value = '会员卡'
-				break;
-			default:
-				break;
-		}
-		return value
-	},
-	testPrice(val) {
-		let reg = /^\d+(\.([0-9]|\d[0-9]))?$/
-		return reg.test(val)
-	}
-}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików