commit ceec8d07dbd9b148dc5016b1b8b8fba5e12996fa
Author: zhanghao <774378400@qq.com>
Date: Mon May 18 09:14:00 2026 +0800
Initial commit
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..5b1a804
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,21 @@
+# 告诉EditorConfig插件,这是根文件,不用继续往上查找
+root = true
+
+# 匹配全部文件
+[*]
+# 缩进风格,可选space、tab
+indent_style = space
+# 缩进的空格数
+indent_size = 2
+# 设置字符集
+charset = utf-8
+# 结尾换行符,可选lf、cr、crlf
+end_of_line = lf
+# 在文件结尾插入新行
+trim_trailing_whitespace = true
+# 删除一行中的前后空格
+insert_final_newline = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..545c563
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,18 @@
+# 页面标题
+VITE_APP_TITLE = cmvr-wms后台管理系统
+
+# 开发环境配置
+VITE_APP_ENV = 'development'
+
+# 若依管理系统/开发环境
+# VITE_APP_BASE_API = 'http://kucun.ichengle.top/prod-api/'
+VITE_APP_BASE_API = '/dev-api'
+
+# 应用访问路径 例如使用前缀 /admin/
+VITE_APP_CONTEXT_PATH = '/'
+
+# 监控地址
+VITE_APP_MONITRO_ADMIN = 'http://localhost:9090/admin/applications'
+
+# xxl-job 控制台地址
+VITE_APP_XXL_JOB_ADMIN = 'http://localhost:9100/xxl-job-admin'
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..70c5d89
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,20 @@
+# 页面标题
+VITE_APP_TITLE = cmvr-wms后台管理系统
+
+# 生产环境配置
+VITE_APP_ENV = 'production'
+
+# 应用访问路径 例如使用前缀 /admin/
+VITE_APP_CONTEXT_PATH = '/'
+
+# 监控地址
+VITE_APP_MONITRO_ADMIN = '/admin/applications'
+
+# 监控地址
+VITE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
+
+# 若依管理系统/生产环境
+VITE_APP_BASE_API = '/prod-api'
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..78a752d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..44a4dcd
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+# Open Source License
+
+ruoyi-wms is licensed under a modified version of the Apache License 2.0, with the following additional conditions:
+
+1. ruoyi-wms may be utilized commercially, including as a backend service for other applications or as an application development platform for enterprises. Should the conditions below be met, a commercial license must be obtained from the producer:
+
+a. Multi-tenant service: Unless explicitly authorized by ruoyi-wms in writing, you may not use the ruoyi-wms source code to operate a multi-tenant environment.
+
+b. LOGO and copyright information: In the process of using ruoyi-wms's frontend, you may not remove or moruoyi-wms the LOGO or copyright information in the ruoyi-wms console or applications. This restriction is inapplicable to uses of ruoyi-wms that do not involve its frontend.
+ - Frontend Definition: For the purposes of this license, the "frontend" of ruoyi-wms includes all components located in the web/ directory when running ruoyi-wms from the raw source code, or the "web" image when running ruoyi-wms with Docker.
+
+2. As a contributor, you should agree that:
+
+a. The producer can adjust the open-source agreement to be more strict or relaxed as deemed necessary.
+b. Your contributed code may be used for commercial purposes, including but not limited to its cloud business operations.
+
+Apart from the specific conditions mentioned above, all other rights and restrictions follow the Apache License 2.0. Detailed information about the Apache License 2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0.
+
+The interactive design of this product is protected by appearance patent.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8eaab8d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,41 @@
+## 平台简介
+
+* 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
+
+## 在线体验
+- 最近版V2 Lite演示地址:http://cangku.ichengle.top/
+- 最新版V2 Advance演示地址:http://kucun.ichengle.top
+- 旧版V1演示地址:http://wms.ichengle.top
+
+## 不同分支介绍
+`lite` jdk17+vue3,支持多仓库,没有库区概念,操作简单,覆盖大部分库存应用场景。
+
+`advance` jdk17+vue3,支持多仓库、多库区,记录生产日期、过期日期、sn,可适配一物一码,操作相对复杂。
+
+`v1` jdk8+vue2
+
+`master` 同步lite分支
+
+## 后端项目地址
+#### gitee地址
+https://gitee.com/zccbbg/ruoyi-wms
+
+#### github地址
+https://github.com/zccbbg/ruoyi-wms
+
+## 前端运行
+
+```bash
+# 进入项目目录
+cd ruoyi-wms-vue
+
+# 安装依赖
+npm install --registry=https://registry.npmmirror.com
+
+# 启动服务
+npm run dev
+
+# 构建测试环境 yarn build:stage
+# 构建生产环境 yarn build:prod
+# 前端访问地址 http://localhost:80
+```
\ No newline at end of file
diff --git a/bin/build.bat b/bin/build.bat
new file mode 100644
index 0000000..ecbb454
--- /dev/null
+++ b/bin/build.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] Weḅdistļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn build:prod
+
+pause
\ No newline at end of file
diff --git a/bin/package.bat b/bin/package.bat
new file mode 100644
index 0000000..f5b24e0
--- /dev/null
+++ b/bin/package.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] װWeḅnode_modulesļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn --registry=https://registry.npmmirror.com
+
+pause
\ No newline at end of file
diff --git a/bin/run-web.bat b/bin/run-web.bat
new file mode 100644
index 0000000..d2fe397
--- /dev/null
+++ b/bin/run-web.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] ʹ Vite Web ̡
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn dev
+
+pause
\ No newline at end of file
diff --git a/html/ie.html b/html/ie.html
new file mode 100644
index 0000000..052ffcd
--- /dev/null
+++ b/html/ie.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+ 请升级您的浏览器
+
+
+
+
+
+
+请升级您的浏览器,以便我们更好的为您提供服务!
+您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。
+
+请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束
+自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明 。
+
+您可以选择更先进的浏览器
+推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。
+
+
+
+
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..7765302
--- /dev/null
+++ b/index.html
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+ cmvr-wms管理系统
+
+
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..830d27e
--- /dev/null
+++ b/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "cmvr-wms",
+ "version": "4.8.2",
+ "description": "cmvr-wms后台管理系统",
+ "author": "ZCC",
+ "license": "MIT",
+ "scripts": {
+ "dev": "vite",
+ "build:prod": "vite build",
+ "preview": "vite preview"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://gitee.com/zccbbg/ruoyi-wms-vue.git"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "2.0.10",
+ "@vueup/vue-quill": "1.2.0",
+ "@vueuse/core": "9.5.0",
+ "axios": "0.27.2",
+ "echarts": "5.4.0",
+ "element-plus": "2.2.27",
+ "file-saver": "2.0.5",
+ "fuse.js": "6.6.2",
+ "js-cookie": "3.0.1",
+ "jsbarcode": "^3.11.6",
+ "jsencrypt": "3.3.1",
+ "nprogress": "0.2.0",
+ "pinia": "2.0.22",
+ "qrcode": "^1.5.3",
+ "vue": "3.2.45",
+ "vue-cropper": "1.0.3",
+ "vue-plugin-hiprint": "^0.0.56",
+ "vue-router": "4.1.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "3.1.0",
+ "@vue/compiler-sfc": "3.2.45",
+ "sass": "1.56.1",
+ "unplugin-auto-import": "0.11.4",
+ "unplugin-vue-setup-extend-plus": "0.4.9",
+ "vite": "3.2.3",
+ "vite-plugin-compression": "0.5.1",
+ "vite-plugin-svg-icons": "2.0.1"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..0571b2e
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,4118 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@element-plus/icons-vue':
+ specifier: 2.0.10
+ version: 2.0.10(vue@3.2.45)
+ '@vueup/vue-quill':
+ specifier: 1.2.0
+ version: 1.2.0(vue@3.2.45)
+ '@vueuse/core':
+ specifier: 9.5.0
+ version: 9.5.0(vue@3.2.45)
+ axios:
+ specifier: 0.27.2
+ version: 0.27.2
+ echarts:
+ specifier: 5.4.0
+ version: 5.4.0
+ element-plus:
+ specifier: 2.2.27
+ version: 2.2.27(vue@3.2.45)
+ file-saver:
+ specifier: 2.0.5
+ version: 2.0.5
+ fuse.js:
+ specifier: 6.6.2
+ version: 6.6.2
+ js-cookie:
+ specifier: 3.0.1
+ version: 3.0.1
+ jsbarcode:
+ specifier: ^3.11.6
+ version: 3.12.3
+ jsencrypt:
+ specifier: 3.3.1
+ version: 3.3.1
+ nprogress:
+ specifier: 0.2.0
+ version: 0.2.0
+ pinia:
+ specifier: 2.0.22
+ version: 2.0.22(vue@3.2.45)
+ qrcode:
+ specifier: ^1.5.3
+ version: 1.5.4
+ vue:
+ specifier: 3.2.45
+ version: 3.2.45
+ vue-cropper:
+ specifier: 1.0.3
+ version: 1.0.3
+ vue-plugin-hiprint:
+ specifier: ^0.0.56
+ version: 0.0.56
+ vue-router:
+ specifier: 4.1.4
+ version: 4.1.4(vue@3.2.45)
+ devDependencies:
+ '@vitejs/plugin-vue':
+ specifier: 3.1.0
+ version: 3.1.0(vite@3.2.3(@types/node@25.6.2)(sass@1.56.1))(vue@3.2.45)
+ '@vue/compiler-sfc':
+ specifier: 3.2.45
+ version: 3.2.45
+ sass:
+ specifier: 1.56.1
+ version: 1.56.1
+ unplugin-auto-import:
+ specifier: 0.11.4
+ version: 0.11.4(@vueuse/core@9.5.0(vue@3.2.45))(rollup@2.80.0)
+ unplugin-vue-setup-extend-plus:
+ specifier: 0.4.9
+ version: 0.4.9
+ vite:
+ specifier: 3.2.3
+ version: 3.2.3(@types/node@25.6.2)(sass@1.56.1)
+ vite-plugin-compression:
+ specifier: 0.5.1
+ version: 0.5.1(vite@3.2.3(@types/node@25.6.2)(sass@1.56.1))
+ vite-plugin-svg-icons:
+ specifier: 2.0.1
+ version: 2.0.1(vite@3.2.3(@types/node@25.6.2)(sass@1.56.1))
+
+packages:
+
+ '@antfu/utils@0.6.3':
+ resolution: {integrity: sha512-sEYpyyKUPOew9QsXZ8feRVMzW6DWLviwOl+/ap06UQW02A8Srbc95CPHVm4eUbiBzBgD46eyIT+przv//KSSlQ==}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.3':
+ resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/runtime@7.29.2':
+ resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@claviska/jquery-minicolors@2.3.6':
+ resolution: {integrity: sha512-8Ro6D4GCrmOl41+6w4NFhEOpx8vjxwVRI69bulXsFDt49uVRKhLU5TnzEV7AmOJrylkVq+ugnYNMiGHBieeKUQ==}
+ peerDependencies:
+ jquery: '>= 1.7.x'
+
+ '@ctrl/tinycolor@3.6.1':
+ resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+ engines: {node: '>=10'}
+
+ '@element-plus/icons-vue@2.0.10':
+ resolution: {integrity: sha512-ygEZ1mwPjcPo/OulhzLE7mtDrQBWI8vZzEWSNB2W/RNCRjoQGwbaK4N8lV4rid7Ts4qvySU3njMN7YCiSlSaTQ==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ '@esbuild/android-arm@0.15.18':
+ resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/linux-loong64@0.15.18':
+ resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@floating-ui/core@1.7.5':
+ resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==}
+
+ '@floating-ui/dom@1.7.6':
+ resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==}
+
+ '@floating-ui/utils@0.2.11':
+ resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@rollup/pluginutils@5.3.0':
+ resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@socket.io/component-emitter@3.1.2':
+ resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==}
+
+ '@sxzz/popperjs-es@2.11.8':
+ resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ '@types/lodash-es@4.17.12':
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+ '@types/lodash@4.17.24':
+ resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==}
+
+ '@types/node@25.6.2':
+ resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==}
+
+ '@types/raf@3.4.3':
+ resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==}
+
+ '@types/svgo@2.6.4':
+ resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
+
+ '@types/web-bluetooth@0.0.16':
+ resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+
+ '@vitejs/plugin-vue@3.1.0':
+ resolution: {integrity: sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^3.0.0
+ vue: ^3.2.25
+
+ '@vue/compiler-core@3.2.45':
+ resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==}
+
+ '@vue/compiler-dom@3.2.45':
+ resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==}
+
+ '@vue/compiler-sfc@3.2.45':
+ resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==}
+
+ '@vue/compiler-ssr@3.2.45':
+ resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==}
+
+ '@vue/devtools-api@6.6.4':
+ resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+ '@vue/reactivity-transform@3.2.45':
+ resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==}
+
+ '@vue/reactivity@3.2.45':
+ resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==}
+
+ '@vue/runtime-core@3.2.45':
+ resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==}
+
+ '@vue/runtime-dom@3.2.45':
+ resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==}
+
+ '@vue/server-renderer@3.2.45':
+ resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==}
+ peerDependencies:
+ vue: 3.2.45
+
+ '@vue/shared@3.2.45':
+ resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==}
+
+ '@vueup/vue-quill@1.2.0':
+ resolution: {integrity: sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==}
+ peerDependencies:
+ vue: ^3.2.41
+
+ '@vueuse/core@9.5.0':
+ resolution: {integrity: sha512-6GsWBsJHEb3sYw15mbLrcbslAVY45pkzjJYTKYKCXv88z7srAF0VEW0q+oXKsl58tCbqooplInahXFg8Yo1m4w==}
+
+ '@vueuse/metadata@9.5.0':
+ resolution: {integrity: sha512-4M1AyPZmIv41pym+K5+4wup3bKuYebbH8w8BROY1hmT7rIwcyS4tEL+UsGz0Hiu1FCOxcoBrwtAizc0YmBJjyQ==}
+
+ '@vueuse/shared@9.5.0':
+ resolution: {integrity: sha512-HnnCWU1Vg9CVWRCcI8ohDKDRB2Sc4bTgT1XAIaoLSfVHHn+TKbrox6pd3klCSw4UDxkhDfOk8cAdcK+Z5KleCA==}
+
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ansi-regex@2.1.1:
+ resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+ engines: {node: '>=0.10.0'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-styles@2.2.1:
+ resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
+ engines: {node: '>=0.10.0'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ arr-diff@4.0.0:
+ resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
+ engines: {node: '>=0.10.0'}
+
+ arr-flatten@1.1.0:
+ resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
+ engines: {node: '>=0.10.0'}
+
+ arr-union@3.1.0:
+ resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
+ engines: {node: '>=0.10.0'}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-unique@0.3.2:
+ resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
+ engines: {node: '>=0.10.0'}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ assign-symbols@1.0.0:
+ resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
+ engines: {node: '>=0.10.0'}
+
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+
+ async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ atob@2.1.2:
+ resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+ engines: {node: '>= 4.5.0'}
+ hasBin: true
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ axios@0.27.2:
+ resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
+
+ base64-arraybuffer@1.0.2:
+ resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
+ engines: {node: '>= 0.6.0'}
+
+ base@0.11.2:
+ resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
+ engines: {node: '>=0.10.0'}
+
+ big.js@5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ bluebird@3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ braces@2.3.2:
+ resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+ engines: {node: '>=0.10.0'}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ btoa@1.2.1:
+ resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==}
+ engines: {node: '>= 0.4.0'}
+ hasBin: true
+
+ bwip-js@4.10.1:
+ resolution: {integrity: sha512-I/cEPiXsu7dRCp78PpVY4gdIXmbH752n8dMC+DStM77XPkrzeathdYrjnZ/i/vZPIxXTUWc+JxgJ/MvbodqPLA==}
+ hasBin: true
+
+ cache-base@1.0.1:
+ resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
+ engines: {node: '>=0.10.0'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.9:
+ resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
+ canvg@3.0.11:
+ resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==}
+ engines: {node: '>=10.0.0'}
+
+ chalk@1.1.3:
+ resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
+ engines: {node: '>=0.10.0'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ class-utils@0.3.6:
+ resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
+ engines: {node: '>=0.10.0'}
+
+ cliui@6.0.0:
+ resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
+
+ clone@2.1.2:
+ resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+ engines: {node: '>=0.8'}
+
+ collection-visit@1.0.0:
+ resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
+ engines: {node: '>=0.10.0'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ component-emitter@1.3.1:
+ resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ copy-descriptor@0.1.1:
+ resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
+ engines: {node: '>=0.10.0'}
+
+ core-js@3.49.0:
+ resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==}
+
+ cors@2.8.6:
+ resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
+ engines: {node: '>= 0.10'}
+
+ css-line-break@2.1.0:
+ resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==}
+
+ css-select@4.3.0:
+ resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+
+ css-tree@1.1.3:
+ resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+ engines: {node: '>=8.0.0'}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
+ csso@4.2.0:
+ resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
+ engines: {node: '>=8.0.0'}
+
+ csstype@2.6.21:
+ resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ dayjs@1.11.20:
+ resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+
+ decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+
+ deep-equal@1.1.2:
+ resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
+ engines: {node: '>= 0.4'}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ define-property@0.2.5:
+ resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
+ engines: {node: '>=0.10.0'}
+
+ define-property@1.0.0:
+ resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+ engines: {node: '>=0.10.0'}
+
+ define-property@2.0.2:
+ resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+ engines: {node: '>=0.10.0'}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ dijkstrajs@1.0.3:
+ resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
+
+ dom-serializer@0.2.2:
+ resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
+
+ dom-serializer@1.4.1:
+ resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+
+ domelementtype@1.3.1:
+ resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@2.4.2:
+ resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
+
+ domhandler@4.3.1:
+ resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+ engines: {node: '>= 4'}
+
+ dompurify@2.5.9:
+ resolution: {integrity: sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==}
+
+ domutils@1.7.0:
+ resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
+
+ domutils@2.8.0:
+ resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ echarts@5.4.0:
+ resolution: {integrity: sha512-uPsO9VRUIKAdFOoH3B0aNg7NRVdN7aM39/OjovjO9MwmWsAkfGyeXJhK+dbRi51iDrQWliXV60/XwLA7kg3z0w==}
+
+ element-plus@2.2.27:
+ resolution: {integrity: sha512-P04HDOZBYDdvlYuleuCZRULzAc5xJVOBfLDK9xWxVo0vyo8ntdaXS5sTU+/76vrNzuO3FhLn9kvrsbiJEVa1jg==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emojis-list@3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+ engines: {node: '>= 4'}
+
+ engine.io-client@6.6.4:
+ resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==}
+
+ engine.io-parser@5.2.3:
+ resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==}
+ engines: {node: '>=10.0.0'}
+
+ entities@1.1.2:
+ resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
+
+ entities@2.2.0:
+ resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+
+ es-abstract@1.24.2:
+ resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ engines: {node: '>= 0.4'}
+
+ esbuild-android-64@0.15.18:
+ resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ esbuild-android-arm64@0.15.18:
+ resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ esbuild-darwin-64@0.15.18:
+ resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ esbuild-darwin-arm64@0.15.18:
+ resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ esbuild-freebsd-64@0.15.18:
+ resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ esbuild-freebsd-arm64@0.15.18:
+ resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ esbuild-linux-32@0.15.18:
+ resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ esbuild-linux-64@0.15.18:
+ resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ esbuild-linux-arm64@0.15.18:
+ resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ esbuild-linux-arm@0.15.18:
+ resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ esbuild-linux-mips64le@0.15.18:
+ resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ esbuild-linux-ppc64le@0.15.18:
+ resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ esbuild-linux-riscv64@0.15.18:
+ resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ esbuild-linux-s390x@0.15.18:
+ resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ esbuild-netbsd-64@0.15.18:
+ resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ esbuild-openbsd-64@0.15.18:
+ resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ esbuild-sunos-64@0.15.18:
+ resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ esbuild-windows-32@0.15.18:
+ resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ esbuild-windows-64@0.15.18:
+ resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ esbuild-windows-arm64@0.15.18:
+ resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ esbuild@0.15.18:
+ resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ eventemitter3@2.0.3:
+ resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==}
+
+ expand-brackets@2.1.4:
+ resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+ engines: {node: '>=0.10.0'}
+
+ extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+
+ extend-shallow@3.0.2:
+ resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+ engines: {node: '>=0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ extglob@2.0.4:
+ resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+ engines: {node: '>=0.10.0'}
+
+ fast-diff@1.1.2:
+ resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==}
+
+ fast-diff@1.2.0:
+ resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
+ fflate@0.8.2:
+ resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
+
+ file-saver@2.0.5:
+ resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
+
+ fill-range@4.0.0:
+ resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+ engines: {node: '>=0.10.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
+ follow-redirects@1.16.0:
+ resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ for-in@1.0.2:
+ resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+ engines: {node: '>=0.10.0'}
+
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
+ fragment-cache@0.2.1:
+ resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
+ engines: {node: '>=0.10.0'}
+
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ fuse.js@6.6.2:
+ resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==}
+ engines: {node: '>=10'}
+
+ generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+ engines: {node: '>= 0.4'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-value@2.0.6:
+ resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+ engines: {node: '>=0.10.0'}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ has-ansi@2.0.0:
+ resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
+ engines: {node: '>=0.10.0'}
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ has-flag@1.0.0:
+ resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==}
+ engines: {node: '>=0.10.0'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ has-value@0.3.1:
+ resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+ engines: {node: '>=0.10.0'}
+
+ has-value@1.0.0:
+ resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
+ engines: {node: '>=0.10.0'}
+
+ has-values@0.1.4:
+ resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+ engines: {node: '>=0.10.0'}
+
+ has-values@1.0.0:
+ resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
+ engines: {node: '>=0.10.0'}
+
+ hasown@2.0.3:
+ resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
+ engines: {node: '>= 0.4'}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ html2canvas@1.4.1:
+ resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==}
+ engines: {node: '>=8.0.0'}
+
+ htmlparser2@3.10.1:
+ resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
+
+ image-size@0.5.5:
+ resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ immutable@4.3.8:
+ resolution: {integrity: sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ is-accessor-descriptor@1.0.1:
+ resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
+ engines: {node: '>= 0.10'}
+
+ is-arguments@1.2.0:
+ resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+
+ is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.2:
+ resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==}
+ engines: {node: '>= 0.4'}
+
+ is-data-descriptor@1.0.1:
+ resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-descriptor@0.1.7:
+ resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
+ engines: {node: '>= 0.4'}
+
+ is-descriptor@1.0.3:
+ resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
+ engines: {node: '>= 0.4'}
+
+ is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+
+ is-extendable@1.0.1:
+ resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+ engines: {node: '>=0.10.0'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-number@3.0.0:
+ resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+ engines: {node: '>=0.10.0'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-plain-obj@1.1.0:
+ resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+ engines: {node: '>=0.10.0'}
+
+ is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isobject@2.1.0:
+ resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+ engines: {node: '>=0.10.0'}
+
+ isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+
+ jquery@3.7.1:
+ resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
+
+ js-base64@2.6.4:
+ resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
+
+ js-cookie@3.0.1:
+ resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==}
+ engines: {node: '>=12'}
+
+ jsbarcode@3.12.3:
+ resolution: {integrity: sha512-CuHU9hC6dPsHF5oVFMo8NW76uQVjH4L22CsP4hW+dNnGywJHC/B0ThA1CTDVLnxKLrrpYdicBLnd2xsgTfRnvg==}
+
+ jsencrypt@3.3.1:
+ resolution: {integrity: sha512-dVvV54GdFuJgmEKn+oBiaifDMen4p6o6j/lJh0OVMcouME8sST0bJ7bldIgKBQk4za0zyGn0/pm4vOznR25mLw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ jsonfile@6.2.1:
+ resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
+
+ jspdf@2.5.2:
+ resolution: {integrity: sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==}
+
+ kind-of@3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@4.0.0:
+ resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@5.1.0:
+ resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
+ loader-utils@1.4.2:
+ resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
+ engines: {node: '>=4.0.0'}
+
+ local-pkg@0.4.3:
+ resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
+ engines: {node: '>=14'}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
+ lodash-es@4.18.1:
+ resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==}
+
+ lodash-unified@1.0.3:
+ resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+ peerDependencies:
+ '@types/lodash-es': '*'
+ lodash: '*'
+ lodash-es: '*'
+
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+ lodash.isequal@4.5.0:
+ resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
+
+ lodash@4.18.1:
+ resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==}
+
+ magic-string@0.25.9:
+ resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+
+ magic-string@0.26.7:
+ resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
+ engines: {node: '>=12'}
+
+ map-cache@0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+
+ map-visit@1.0.0:
+ resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
+ engines: {node: '>=0.10.0'}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mdn-data@2.0.14:
+ resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+
+ memoize-one@6.0.0:
+ resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
+ merge-options@1.0.1:
+ resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
+ engines: {node: '>=4'}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@3.1.0:
+ resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==}
+ engines: {node: '>=0.10.0'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mixin-deep@1.3.2:
+ resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
+ engines: {node: '>=0.10.0'}
+
+ mlly@1.8.2:
+ resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.12:
+ resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ nanomatch@1.2.13:
+ resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-wheel-es@1.2.0:
+ resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+
+ nprogress@0.2.0:
+ resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ nzh@1.0.14:
+ resolution: {integrity: sha512-wKgaqCSZdrySvB4RWop5g+v6IDv2IErsT6rjq06Bg0yiT9hiHYZO12GMGx/xweGVLcO2lDjX5RqWD0S/Jy9z5Q==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-copy@0.1.0:
+ resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-is@1.1.6:
+ resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object-visit@1.0.1:
+ resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
+ engines: {node: '>=0.10.0'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.pick@1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ parchment@1.1.4:
+ resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==}
+
+ pascalcase@0.1.1:
+ resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
+ engines: {node: '>=0.10.0'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ pathe@0.2.0:
+ resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
+
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ performance-now@2.1.0:
+ resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ engines: {node: '>=12'}
+
+ pinia@2.0.22:
+ resolution: {integrity: sha512-u+b8/BC+tmvo3ACbYO2w5NfxHWFOjvvw9DQnyT0dW8aUMCPRQT5QnfZ5R5W2MzZBMTeZRMQI7V/QFbafmM9QHw==}
+ 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
+
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pngjs@5.0.0:
+ resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
+ engines: {node: '>=10.13.0'}
+
+ posix-character-classes@0.1.1:
+ resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
+ engines: {node: '>=0.10.0'}
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+
+ postcss-prefix-selector@1.16.1:
+ resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
+ peerDependencies:
+ postcss: '>4 <9'
+
+ postcss@5.2.18:
+ resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
+ engines: {node: '>=0.12'}
+
+ postcss@8.5.14:
+ resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ posthtml-parser@0.2.1:
+ resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==}
+
+ posthtml-rename-id@1.0.12:
+ resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==}
+
+ posthtml-render@1.4.0:
+ resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==}
+ engines: {node: '>=10'}
+
+ posthtml-svg-mode@1.0.3:
+ resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==}
+
+ posthtml@0.9.2:
+ resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==}
+ engines: {node: '>=0.10.0'}
+
+ qrcode@1.5.4:
+ resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ query-string@4.3.4:
+ resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==}
+ engines: {node: '>=0.10.0'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ quill-delta@3.6.3:
+ resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==}
+ engines: {node: '>=0.10'}
+
+ quill-delta@4.2.2:
+ resolution: {integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==}
+
+ quill@1.3.7:
+ resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==}
+
+ raf@3.4.1:
+ resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ regenerator-runtime@0.13.11:
+ resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+
+ regex-not@1.0.2:
+ resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
+ engines: {node: '>=0.10.0'}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ repeat-element@1.1.4:
+ resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
+ engines: {node: '>=0.10.0'}
+
+ repeat-string@1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+ engines: {node: '>=0.10'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-main-filename@2.0.0:
+ resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+
+ resolve-url@0.2.1:
+ resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
+ deprecated: https://github.com/lydell/resolve-url#deprecated
+
+ resolve@1.22.12:
+ resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ ret@0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+ engines: {node: '>=0.12'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rgbcolor@1.0.1:
+ resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==}
+ engines: {node: '>= 0.8.15'}
+
+ rollup@2.80.0:
+ resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-array-concat@1.1.4:
+ resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex@1.1.0:
+ resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
+
+ sass@1.56.1:
+ resolution: {integrity: sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==}
+ engines: {node: '>=12.0.0'}
+ hasBin: true
+
+ sax@1.6.0:
+ resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==}
+ engines: {node: '>=11.0.0'}
+
+ scule@1.3.0:
+ resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+ set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ set-value@2.0.1:
+ resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
+ engines: {node: '>=0.10.0'}
+
+ side-channel-list@1.0.1:
+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ snapdragon-node@2.1.1:
+ resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
+ engines: {node: '>=0.10.0'}
+
+ snapdragon-util@3.0.1:
+ resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
+ engines: {node: '>=0.10.0'}
+
+ snapdragon@0.8.2:
+ resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+ engines: {node: '>=0.10.0'}
+
+ socket.io-client@4.8.3:
+ resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==}
+ engines: {node: '>=10.0.0'}
+
+ socket.io-parser@4.2.6:
+ resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==}
+ engines: {node: '>=10.0.0'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-resolve@0.5.3:
+ resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
+ deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+
+ source-map-url@0.4.1:
+ resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
+ deprecated: See https://github.com/lydell/source-map-url#deprecated
+
+ source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ sourcemap-codec@1.4.8:
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+ deprecated: Please use @jridgewell/sourcemap-codec instead
+
+ split-string@3.1.0:
+ resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
+ engines: {node: '>=0.10.0'}
+
+ stable@0.1.8:
+ resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+ deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
+
+ stackblur-canvas@2.7.0:
+ resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==}
+ engines: {node: '>=0.1.14'}
+
+ static-extend@0.1.2:
+ resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
+ engines: {node: '>=0.10.0'}
+
+ stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+
+ strict-uri-encode@1.1.0:
+ resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
+ engines: {node: '>=0.10.0'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@3.0.1:
+ resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+ engines: {node: '>=0.10.0'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-literal@1.3.0:
+ resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==}
+
+ supports-color@2.0.0:
+ resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
+ engines: {node: '>=0.8.0'}
+
+ supports-color@3.2.3:
+ resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==}
+ engines: {node: '>=0.8.0'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svg-baker@1.7.0:
+ resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==}
+
+ svg-pathdata@6.0.3:
+ resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==}
+ engines: {node: '>=12.0.0'}
+
+ svgo@2.8.2:
+ resolution: {integrity: sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ text-segmentation@1.0.3:
+ resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==}
+
+ to-object-path@0.3.0:
+ resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
+ engines: {node: '>=0.10.0'}
+
+ to-regex-range@2.1.1:
+ resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+ engines: {node: '>=0.10.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ to-regex@3.0.2:
+ resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
+ engines: {node: '>=0.10.0'}
+
+ traverse@0.6.11:
+ resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==}
+ engines: {node: '>= 0.4'}
+
+ tslib@2.3.0:
+ resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ engines: {node: '>= 0.4'}
+
+ typedarray.prototype.slice@1.0.5:
+ resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
+ engines: {node: '>= 0.4'}
+
+ ufo@1.6.4:
+ resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ undici-types@7.19.2:
+ resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==}
+
+ unimport@0.7.1:
+ resolution: {integrity: sha512-rn/hRpCtFxVVT3T8a6sG738xiA6yp8eFzzMLVr+ebp2FBU1gF0Qo6SfOGrrXATDmKruskhYAvPN7djhydgHU8A==}
+
+ union-value@1.0.1:
+ resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
+ engines: {node: '>=0.10.0'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unplugin-auto-import@0.11.4:
+ resolution: {integrity: sha512-lh/bRDRYwgnb9Cm5ur8TlTMGxA1GRZvgzCvBIf0vyuVRy7ebWcWefFElpUDpr8vLl+ZRGsPVCOGiYJ8TCR625Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@vueuse/core': '*'
+ peerDependenciesMeta:
+ '@vueuse/core':
+ optional: true
+
+ unplugin-vue-setup-extend-plus@0.4.9:
+ resolution: {integrity: sha512-4a4CvMkoZRuUHLQq1kkcuZ7HG85xM6MPMa+E1pEf5/PX6ovaCXwZ20qVOIQUIGkh3sHVp0VBhJaibHzC8hPtoA==}
+
+ unplugin@0.10.2:
+ resolution: {integrity: sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==}
+
+ unplugin@1.16.1:
+ resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
+ engines: {node: '>=14.0.0'}
+
+ unset-value@1.0.0:
+ resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
+ engines: {node: '>=0.10.0'}
+
+ urix@0.1.0:
+ resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
+ deprecated: Please see https://github.com/lydell/urix#deprecated
+
+ use@3.1.1:
+ resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
+ engines: {node: '>=0.10.0'}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ utrie@1.0.2:
+ resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ vite-plugin-compression@0.5.1:
+ resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
+ peerDependencies:
+ vite: '>=2.0.0'
+
+ vite-plugin-svg-icons@2.0.1:
+ resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
+ peerDependencies:
+ vite: '>=2.0.0'
+
+ vite@3.2.3:
+ resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ 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
+
+ vue-cropper@1.0.3:
+ resolution: {integrity: sha512-yDrZkE4H5vOiMA9WQHE+6rmXrZ1S9TMZasEPAZPKg/2I/nySHL4ECD1lNxt7+ofTPKT+9+2sQkCwagPqEqiqJg==}
+
+ vue-demi@0.14.10:
+ resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+ engines: {node: '>=12'}
+ hasBin: true
+ peerDependencies:
+ '@vue/composition-api': ^1.0.0-rc.1
+ vue: ^3.0.0-0 || ^2.6.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+
+ vue-plugin-hiprint@0.0.56:
+ resolution: {integrity: sha512-YbJHH/MwdwIV1urL8V86ea+E8ixX1RYp/u/8/giPt4vfREUak9s2KYw4JFzM/Z6th9BCCpWTLPC+SOeoggxBbw==}
+
+ vue-router@4.1.4:
+ resolution: {integrity: sha512-UgYen33gOtwT3cOG1+yRen+Brk9py8CSlC9LEa3UjvKZ4EAoSo8NjZPDeDnmNerfazorHIJG1NC7qdi1SuQJnQ==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ vue@3.2.45:
+ resolution: {integrity: sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==}
+
+ webpack-sources@3.4.1:
+ resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==}
+ engines: {node: '>=10.13.0'}
+
+ webpack-virtual-modules@0.4.6:
+ resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==}
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-module@2.0.1:
+ resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+
+ which-typed-array@1.1.20:
+ resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==}
+ engines: {node: '>= 0.4'}
+
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+
+ ws@8.18.3:
+ resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
+ 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
+
+ xmlhttprequest-ssl@2.1.2:
+ resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==}
+ engines: {node: '>=0.4.0'}
+
+ y18n@4.0.3:
+ resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+
+ yargs-parser@18.1.3:
+ resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+ engines: {node: '>=6'}
+
+ yargs@15.4.1:
+ resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+ engines: {node: '>=8'}
+
+ zrender@5.4.0:
+ resolution: {integrity: sha512-rOS09Z2HSVGFs2dn/TuYk5BlCaZcVe8UDLLjj1ySYF828LATKKdxuakSZMvrDz54yiKPDYVfjdKqcX8Jky3BIA==}
+
+snapshots:
+
+ '@antfu/utils@0.6.3': {}
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/parser@7.29.3':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/runtime@7.29.2': {}
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@claviska/jquery-minicolors@2.3.6(jquery@3.7.1)':
+ dependencies:
+ jquery: 3.7.1
+
+ '@ctrl/tinycolor@3.6.1': {}
+
+ '@element-plus/icons-vue@2.0.10(vue@3.2.45)':
+ dependencies:
+ vue: 3.2.45
+
+ '@esbuild/android-arm@0.15.18':
+ optional: true
+
+ '@esbuild/linux-loong64@0.15.18':
+ optional: true
+
+ '@floating-ui/core@1.7.5':
+ dependencies:
+ '@floating-ui/utils': 0.2.11
+
+ '@floating-ui/dom@1.7.6':
+ dependencies:
+ '@floating-ui/core': 1.7.5
+ '@floating-ui/utils': 0.2.11
+
+ '@floating-ui/utils@0.2.11': {}
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.1
+
+ '@rollup/pluginutils@5.3.0(rollup@2.80.0)':
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-walker: 2.0.2
+ picomatch: 4.0.4
+ optionalDependencies:
+ rollup: 2.80.0
+
+ '@socket.io/component-emitter@3.1.2': {}
+
+ '@sxzz/popperjs-es@2.11.8': {}
+
+ '@types/estree@1.0.9': {}
+
+ '@types/lodash-es@4.17.12':
+ dependencies:
+ '@types/lodash': 4.17.24
+
+ '@types/lodash@4.17.24': {}
+
+ '@types/node@25.6.2':
+ dependencies:
+ undici-types: 7.19.2
+
+ '@types/raf@3.4.3': {}
+
+ '@types/svgo@2.6.4':
+ dependencies:
+ '@types/node': 25.6.2
+
+ '@types/web-bluetooth@0.0.16': {}
+
+ '@vitejs/plugin-vue@3.1.0(vite@3.2.3(@types/node@25.6.2)(sass@1.56.1))(vue@3.2.45)':
+ dependencies:
+ vite: 3.2.3(@types/node@25.6.2)(sass@1.56.1)
+ vue: 3.2.45
+
+ '@vue/compiler-core@3.2.45':
+ dependencies:
+ '@babel/parser': 7.29.3
+ '@vue/shared': 3.2.45
+ estree-walker: 2.0.2
+ source-map: 0.6.1
+
+ '@vue/compiler-dom@3.2.45':
+ dependencies:
+ '@vue/compiler-core': 3.2.45
+ '@vue/shared': 3.2.45
+
+ '@vue/compiler-sfc@3.2.45':
+ dependencies:
+ '@babel/parser': 7.29.3
+ '@vue/compiler-core': 3.2.45
+ '@vue/compiler-dom': 3.2.45
+ '@vue/compiler-ssr': 3.2.45
+ '@vue/reactivity-transform': 3.2.45
+ '@vue/shared': 3.2.45
+ estree-walker: 2.0.2
+ magic-string: 0.25.9
+ postcss: 8.5.14
+ source-map: 0.6.1
+
+ '@vue/compiler-ssr@3.2.45':
+ dependencies:
+ '@vue/compiler-dom': 3.2.45
+ '@vue/shared': 3.2.45
+
+ '@vue/devtools-api@6.6.4': {}
+
+ '@vue/reactivity-transform@3.2.45':
+ dependencies:
+ '@babel/parser': 7.29.3
+ '@vue/compiler-core': 3.2.45
+ '@vue/shared': 3.2.45
+ estree-walker: 2.0.2
+ magic-string: 0.25.9
+
+ '@vue/reactivity@3.2.45':
+ dependencies:
+ '@vue/shared': 3.2.45
+
+ '@vue/runtime-core@3.2.45':
+ dependencies:
+ '@vue/reactivity': 3.2.45
+ '@vue/shared': 3.2.45
+
+ '@vue/runtime-dom@3.2.45':
+ dependencies:
+ '@vue/runtime-core': 3.2.45
+ '@vue/shared': 3.2.45
+ csstype: 2.6.21
+
+ '@vue/server-renderer@3.2.45(vue@3.2.45)':
+ dependencies:
+ '@vue/compiler-ssr': 3.2.45
+ '@vue/shared': 3.2.45
+ vue: 3.2.45
+
+ '@vue/shared@3.2.45': {}
+
+ '@vueup/vue-quill@1.2.0(vue@3.2.45)':
+ dependencies:
+ quill: 1.3.7
+ quill-delta: 4.2.2
+ vue: 3.2.45
+
+ '@vueuse/core@9.5.0(vue@3.2.45)':
+ dependencies:
+ '@types/web-bluetooth': 0.0.16
+ '@vueuse/metadata': 9.5.0
+ '@vueuse/shared': 9.5.0(vue@3.2.45)
+ vue-demi: 0.14.10(vue@3.2.45)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ '@vueuse/metadata@9.5.0': {}
+
+ '@vueuse/shared@9.5.0(vue@3.2.45)':
+ dependencies:
+ vue-demi: 0.14.10(vue@3.2.45)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ acorn@8.16.0: {}
+
+ ansi-regex@2.1.1: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-styles@2.2.1: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.2
+
+ arr-diff@4.0.0: {}
+
+ arr-flatten@1.1.0: {}
+
+ arr-union@3.1.0: {}
+
+ array-buffer-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+
+ array-unique@0.3.2: {}
+
+ arraybuffer.prototype.slice@1.0.4:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+
+ assign-symbols@1.0.0: {}
+
+ async-function@1.0.0: {}
+
+ async-validator@4.2.5: {}
+
+ asynckit@0.4.0: {}
+
+ atob@2.1.2: {}
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.1.0
+
+ axios@0.27.2:
+ dependencies:
+ follow-redirects: 1.16.0
+ form-data: 4.0.5
+ transitivePeerDependencies:
+ - debug
+
+ base64-arraybuffer@1.0.2: {}
+
+ base@0.11.2:
+ dependencies:
+ cache-base: 1.0.1
+ class-utils: 0.3.6
+ component-emitter: 1.3.1
+ define-property: 1.0.0
+ isobject: 3.0.1
+ mixin-deep: 1.3.2
+ pascalcase: 0.1.1
+
+ big.js@5.2.2: {}
+
+ binary-extensions@2.3.0: {}
+
+ bluebird@3.7.2: {}
+
+ boolbase@1.0.0: {}
+
+ braces@2.3.2:
+ dependencies:
+ arr-flatten: 1.1.0
+ array-unique: 0.3.2
+ extend-shallow: 2.0.1
+ fill-range: 4.0.0
+ isobject: 3.0.1
+ repeat-element: 1.1.4
+ snapdragon: 0.8.2
+ snapdragon-node: 2.1.1
+ split-string: 3.1.0
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ btoa@1.2.1: {}
+
+ bwip-js@4.10.1: {}
+
+ cache-base@1.0.1:
+ dependencies:
+ collection-visit: 1.0.0
+ component-emitter: 1.3.1
+ get-value: 2.0.6
+ has-value: 1.0.0
+ isobject: 3.0.1
+ set-value: 2.0.1
+ to-object-path: 0.3.0
+ union-value: 1.0.1
+ unset-value: 1.0.0
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.9:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ camelcase@5.3.1: {}
+
+ canvg@3.0.11:
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@types/raf': 3.4.3
+ core-js: 3.49.0
+ raf: 3.4.1
+ regenerator-runtime: 0.13.11
+ rgbcolor: 1.0.1
+ stackblur-canvas: 2.7.0
+ svg-pathdata: 6.0.3
+
+ chalk@1.1.3:
+ dependencies:
+ ansi-styles: 2.2.1
+ escape-string-regexp: 1.0.5
+ has-ansi: 2.0.0
+ strip-ansi: 3.0.1
+ supports-color: 2.0.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ class-utils@0.3.6:
+ dependencies:
+ arr-union: 3.1.0
+ define-property: 0.2.5
+ isobject: 3.0.1
+ static-extend: 0.1.2
+
+ cliui@6.0.0:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+
+ clone@2.1.2: {}
+
+ collection-visit@1.0.0:
+ dependencies:
+ map-visit: 1.0.0
+ object-visit: 1.0.1
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ commander@7.2.0: {}
+
+ component-emitter@1.3.1: {}
+
+ confbox@0.1.8: {}
+
+ copy-descriptor@0.1.1: {}
+
+ core-js@3.49.0: {}
+
+ cors@2.8.6:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ css-line-break@2.1.0:
+ dependencies:
+ utrie: 1.0.2
+
+ css-select@4.3.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ nth-check: 2.1.1
+
+ css-tree@1.1.3:
+ dependencies:
+ mdn-data: 2.0.14
+ source-map: 0.6.1
+
+ css-what@6.2.2: {}
+
+ csso@4.2.0:
+ dependencies:
+ css-tree: 1.1.3
+
+ csstype@2.6.21: {}
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ dayjs@1.11.20: {}
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ decamelize@1.2.0: {}
+
+ decode-uri-component@0.2.2: {}
+
+ deep-equal@1.1.2:
+ dependencies:
+ is-arguments: 1.2.0
+ is-date-object: 1.1.0
+ is-regex: 1.2.1
+ object-is: 1.1.6
+ object-keys: 1.1.1
+ regexp.prototype.flags: 1.5.4
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ define-property@0.2.5:
+ dependencies:
+ is-descriptor: 0.1.7
+
+ define-property@1.0.0:
+ dependencies:
+ is-descriptor: 1.0.3
+
+ define-property@2.0.2:
+ dependencies:
+ is-descriptor: 1.0.3
+ isobject: 3.0.1
+
+ delayed-stream@1.0.0: {}
+
+ dijkstrajs@1.0.3: {}
+
+ dom-serializer@0.2.2:
+ dependencies:
+ domelementtype: 2.3.0
+ entities: 2.2.0
+
+ dom-serializer@1.4.1:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ entities: 2.2.0
+
+ domelementtype@1.3.1: {}
+
+ domelementtype@2.3.0: {}
+
+ domhandler@2.4.2:
+ dependencies:
+ domelementtype: 1.3.1
+
+ domhandler@4.3.1:
+ dependencies:
+ domelementtype: 2.3.0
+
+ dompurify@2.5.9:
+ optional: true
+
+ domutils@1.7.0:
+ dependencies:
+ dom-serializer: 0.2.2
+ domelementtype: 1.3.1
+
+ domutils@2.8.0:
+ dependencies:
+ dom-serializer: 1.4.1
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ echarts@5.4.0:
+ dependencies:
+ tslib: 2.3.0
+ zrender: 5.4.0
+
+ element-plus@2.2.27(vue@3.2.45):
+ dependencies:
+ '@ctrl/tinycolor': 3.6.1
+ '@element-plus/icons-vue': 2.0.10(vue@3.2.45)
+ '@floating-ui/dom': 1.7.6
+ '@popperjs/core': '@sxzz/popperjs-es@2.11.8'
+ '@types/lodash': 4.17.24
+ '@types/lodash-es': 4.17.12
+ '@vueuse/core': 9.5.0(vue@3.2.45)
+ async-validator: 4.2.5
+ dayjs: 1.11.20
+ escape-html: 1.0.3
+ lodash: 4.18.1
+ lodash-es: 4.18.1
+ lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1)
+ memoize-one: 6.0.0
+ normalize-wheel-es: 1.2.0
+ vue: 3.2.45
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+
+ emoji-regex@8.0.0: {}
+
+ emojis-list@3.0.0: {}
+
+ engine.io-client@6.6.4:
+ dependencies:
+ '@socket.io/component-emitter': 3.1.2
+ debug: 4.4.3
+ engine.io-parser: 5.2.3
+ ws: 8.18.3
+ xmlhttprequest-ssl: 2.1.2
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ engine.io-parser@5.2.3: {}
+
+ entities@1.1.2: {}
+
+ entities@2.2.0: {}
+
+ es-abstract@1.24.2:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.3
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.4
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.7
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.20
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.3
+
+ es-to-primitive@1.3.0:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+
+ esbuild-android-64@0.15.18:
+ optional: true
+
+ esbuild-android-arm64@0.15.18:
+ optional: true
+
+ esbuild-darwin-64@0.15.18:
+ optional: true
+
+ esbuild-darwin-arm64@0.15.18:
+ optional: true
+
+ esbuild-freebsd-64@0.15.18:
+ optional: true
+
+ esbuild-freebsd-arm64@0.15.18:
+ optional: true
+
+ esbuild-linux-32@0.15.18:
+ optional: true
+
+ esbuild-linux-64@0.15.18:
+ optional: true
+
+ esbuild-linux-arm64@0.15.18:
+ optional: true
+
+ esbuild-linux-arm@0.15.18:
+ optional: true
+
+ esbuild-linux-mips64le@0.15.18:
+ optional: true
+
+ esbuild-linux-ppc64le@0.15.18:
+ optional: true
+
+ esbuild-linux-riscv64@0.15.18:
+ optional: true
+
+ esbuild-linux-s390x@0.15.18:
+ optional: true
+
+ esbuild-netbsd-64@0.15.18:
+ optional: true
+
+ esbuild-openbsd-64@0.15.18:
+ optional: true
+
+ esbuild-sunos-64@0.15.18:
+ optional: true
+
+ esbuild-windows-32@0.15.18:
+ optional: true
+
+ esbuild-windows-64@0.15.18:
+ optional: true
+
+ esbuild-windows-arm64@0.15.18:
+ optional: true
+
+ esbuild@0.15.18:
+ optionalDependencies:
+ '@esbuild/android-arm': 0.15.18
+ '@esbuild/linux-loong64': 0.15.18
+ esbuild-android-64: 0.15.18
+ esbuild-android-arm64: 0.15.18
+ esbuild-darwin-64: 0.15.18
+ esbuild-darwin-arm64: 0.15.18
+ esbuild-freebsd-64: 0.15.18
+ esbuild-freebsd-arm64: 0.15.18
+ esbuild-linux-32: 0.15.18
+ esbuild-linux-64: 0.15.18
+ esbuild-linux-arm: 0.15.18
+ esbuild-linux-arm64: 0.15.18
+ esbuild-linux-mips64le: 0.15.18
+ esbuild-linux-ppc64le: 0.15.18
+ esbuild-linux-riscv64: 0.15.18
+ esbuild-linux-s390x: 0.15.18
+ esbuild-netbsd-64: 0.15.18
+ esbuild-openbsd-64: 0.15.18
+ esbuild-sunos-64: 0.15.18
+ esbuild-windows-32: 0.15.18
+ esbuild-windows-64: 0.15.18
+ esbuild-windows-arm64: 0.15.18
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ estree-walker@2.0.2: {}
+
+ etag@1.8.1: {}
+
+ eventemitter3@2.0.3: {}
+
+ expand-brackets@2.1.4:
+ dependencies:
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ posix-character-classes: 0.1.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ extend-shallow@2.0.1:
+ dependencies:
+ is-extendable: 0.1.1
+
+ extend-shallow@3.0.2:
+ dependencies:
+ assign-symbols: 1.0.0
+ is-extendable: 1.0.1
+
+ extend@3.0.2: {}
+
+ extglob@2.0.4:
+ dependencies:
+ array-unique: 0.3.2
+ define-property: 1.0.0
+ expand-brackets: 2.1.4
+ extend-shallow: 2.0.1
+ fragment-cache: 0.2.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ fast-diff@1.1.2: {}
+
+ fast-diff@1.2.0: {}
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fastq@1.20.1:
+ dependencies:
+ reusify: 1.1.0
+
+ fflate@0.8.2: {}
+
+ file-saver@2.0.5: {}
+
+ fill-range@4.0.0:
+ dependencies:
+ extend-shallow: 2.0.1
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ to-regex-range: 2.1.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ follow-redirects@1.16.0: {}
+
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
+
+ for-in@1.0.2: {}
+
+ form-data@4.0.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.3
+ mime-types: 2.1.35
+
+ fragment-cache@0.2.1:
+ dependencies:
+ map-cache: 0.2.2
+
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.1
+ universalify: 2.0.1
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.8:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ functions-have-names: 1.2.3
+ hasown: 2.0.3
+ is-callable: 1.2.7
+
+ functions-have-names@1.2.3: {}
+
+ fuse.js@6.6.2: {}
+
+ generator-function@2.0.1: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.3
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-symbol-description@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+
+ get-value@2.0.6: {}
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ has-ansi@2.0.0:
+ dependencies:
+ ansi-regex: 2.1.1
+
+ has-bigints@1.1.0: {}
+
+ has-flag@1.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.1
+
+ has-proto@1.2.0:
+ dependencies:
+ dunder-proto: 1.0.1
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ has-value@0.3.1:
+ dependencies:
+ get-value: 2.0.6
+ has-values: 0.1.4
+ isobject: 2.1.0
+
+ has-value@1.0.0:
+ dependencies:
+ get-value: 2.0.6
+ has-values: 1.0.0
+ isobject: 3.0.1
+
+ has-values@0.1.4: {}
+
+ has-values@1.0.0:
+ dependencies:
+ is-number: 3.0.0
+ kind-of: 4.0.0
+
+ hasown@2.0.3:
+ dependencies:
+ function-bind: 1.1.2
+
+ he@1.2.0: {}
+
+ html2canvas@1.4.1:
+ dependencies:
+ css-line-break: 2.1.0
+ text-segmentation: 1.0.3
+
+ htmlparser2@3.10.1:
+ dependencies:
+ domelementtype: 1.3.1
+ domhandler: 2.4.2
+ domutils: 1.7.0
+ entities: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ image-size@0.5.5: {}
+
+ immutable@4.3.8: {}
+
+ inherits@2.0.4: {}
+
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.3
+ side-channel: 1.1.0
+
+ is-accessor-descriptor@1.0.1:
+ dependencies:
+ hasown: 2.0.3
+
+ is-arguments@1.2.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-async-function@2.1.1:
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-boolean-object@1.2.2:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-buffer@1.1.6: {}
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.2:
+ dependencies:
+ hasown: 2.0.3
+
+ is-data-descriptor@1.0.1:
+ dependencies:
+ hasown: 2.0.3
+
+ is-data-view@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
+
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-descriptor@0.1.7:
+ dependencies:
+ is-accessor-descriptor: 1.0.1
+ is-data-descriptor: 1.0.1
+
+ is-descriptor@1.0.3:
+ dependencies:
+ is-accessor-descriptor: 1.0.1
+ is-data-descriptor: 1.0.1
+
+ is-extendable@0.1.1: {}
+
+ is-extendable@1.0.1:
+ dependencies:
+ is-plain-object: 2.0.4
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-generator-function@1.1.2:
+ dependencies:
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-map@2.0.3: {}
+
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-number@3.0.0:
+ dependencies:
+ kind-of: 3.2.2
+
+ is-number@7.0.0: {}
+
+ is-plain-obj@1.1.0: {}
+
+ is-plain-object@2.0.4:
+ dependencies:
+ isobject: 3.0.1
+
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.3
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.20
+
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-weakset@2.0.4:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-windows@1.0.2: {}
+
+ isarray@1.0.0: {}
+
+ isarray@2.0.5: {}
+
+ isobject@2.1.0:
+ dependencies:
+ isarray: 1.0.0
+
+ isobject@3.0.1: {}
+
+ jquery@3.7.1: {}
+
+ js-base64@2.6.4: {}
+
+ js-cookie@3.0.1: {}
+
+ jsbarcode@3.12.3: {}
+
+ jsencrypt@3.3.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ jsonfile@6.2.1:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jspdf@2.5.2:
+ dependencies:
+ '@babel/runtime': 7.29.2
+ atob: 2.1.2
+ btoa: 1.2.1
+ fflate: 0.8.2
+ optionalDependencies:
+ canvg: 3.0.11
+ core-js: 3.49.0
+ dompurify: 2.5.9
+ html2canvas: 1.4.1
+
+ kind-of@3.2.2:
+ dependencies:
+ is-buffer: 1.1.6
+
+ kind-of@4.0.0:
+ dependencies:
+ is-buffer: 1.1.6
+
+ kind-of@5.1.0: {}
+
+ kind-of@6.0.3: {}
+
+ loader-utils@1.4.2:
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 1.0.2
+
+ local-pkg@0.4.3: {}
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
+ lodash-es@4.18.1: {}
+
+ lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1):
+ dependencies:
+ '@types/lodash-es': 4.17.12
+ lodash: 4.18.1
+ lodash-es: 4.18.1
+
+ lodash.clonedeep@4.5.0: {}
+
+ lodash.isequal@4.5.0: {}
+
+ lodash@4.18.1: {}
+
+ magic-string@0.25.9:
+ dependencies:
+ sourcemap-codec: 1.4.8
+
+ magic-string@0.26.7:
+ dependencies:
+ sourcemap-codec: 1.4.8
+
+ map-cache@0.2.2: {}
+
+ map-visit@1.0.0:
+ dependencies:
+ object-visit: 1.0.1
+
+ math-intrinsics@1.1.0: {}
+
+ mdn-data@2.0.14: {}
+
+ memoize-one@6.0.0: {}
+
+ merge-options@1.0.1:
+ dependencies:
+ is-plain-obj: 1.1.0
+
+ merge2@1.4.1: {}
+
+ micromatch@3.1.0:
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ braces: 2.3.2
+ define-property: 1.0.0
+ extend-shallow: 2.0.1
+ extglob: 2.0.4
+ fragment-cache: 0.2.1
+ kind-of: 5.1.0
+ nanomatch: 1.2.13
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ minimist@1.2.8: {}
+
+ mixin-deep@1.3.2:
+ dependencies:
+ for-in: 1.0.2
+ is-extendable: 1.0.1
+
+ mlly@1.8.2:
+ dependencies:
+ acorn: 8.16.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.4
+
+ ms@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ nanoid@3.3.12: {}
+
+ nanomatch@1.2.13:
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ fragment-cache: 0.2.1
+ is-windows: 1.0.2
+ kind-of: 6.0.3
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ normalize-path@3.0.0: {}
+
+ normalize-wheel-es@1.2.0: {}
+
+ nprogress@0.2.0: {}
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ nzh@1.0.14: {}
+
+ object-assign@4.1.1: {}
+
+ object-copy@0.1.0:
+ dependencies:
+ copy-descriptor: 0.1.1
+ define-property: 0.2.5
+ kind-of: 3.2.2
+
+ object-inspect@1.13.4: {}
+
+ object-is@1.1.6:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+
+ object-keys@1.1.1: {}
+
+ object-visit@1.0.1:
+ dependencies:
+ isobject: 3.0.1
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.pick@1.3.0:
+ dependencies:
+ isobject: 3.0.1
+
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-try@2.2.0: {}
+
+ parchment@1.1.4: {}
+
+ pascalcase@0.1.1: {}
+
+ path-exists@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ pathe@0.2.0: {}
+
+ pathe@1.1.2: {}
+
+ pathe@2.0.3: {}
+
+ performance-now@2.1.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.2: {}
+
+ picomatch@4.0.4: {}
+
+ pinia@2.0.22(vue@3.2.45):
+ dependencies:
+ '@vue/devtools-api': 6.6.4
+ vue: 3.2.45
+ vue-demi: 0.14.10(vue@3.2.45)
+
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.2
+ pathe: 2.0.3
+
+ pngjs@5.0.0: {}
+
+ posix-character-classes@0.1.1: {}
+
+ possible-typed-array-names@1.1.0: {}
+
+ postcss-prefix-selector@1.16.1(postcss@5.2.18):
+ dependencies:
+ postcss: 5.2.18
+
+ postcss@5.2.18:
+ dependencies:
+ chalk: 1.1.3
+ js-base64: 2.6.4
+ source-map: 0.5.7
+ supports-color: 3.2.3
+
+ postcss@8.5.14:
+ dependencies:
+ nanoid: 3.3.12
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ posthtml-parser@0.2.1:
+ dependencies:
+ htmlparser2: 3.10.1
+ isobject: 2.1.0
+
+ posthtml-rename-id@1.0.12:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ posthtml-render@1.4.0: {}
+
+ posthtml-svg-mode@1.0.3:
+ dependencies:
+ merge-options: 1.0.1
+ posthtml: 0.9.2
+ posthtml-parser: 0.2.1
+ posthtml-render: 1.4.0
+
+ posthtml@0.9.2:
+ dependencies:
+ posthtml-parser: 0.2.1
+ posthtml-render: 1.4.0
+
+ qrcode@1.5.4:
+ dependencies:
+ dijkstrajs: 1.0.3
+ pngjs: 5.0.0
+ yargs: 15.4.1
+
+ query-string@4.3.4:
+ dependencies:
+ object-assign: 4.1.1
+ strict-uri-encode: 1.1.0
+
+ queue-microtask@1.2.3: {}
+
+ quill-delta@3.6.3:
+ dependencies:
+ deep-equal: 1.1.2
+ extend: 3.0.2
+ fast-diff: 1.1.2
+
+ quill-delta@4.2.2:
+ dependencies:
+ fast-diff: 1.2.0
+ lodash.clonedeep: 4.5.0
+ lodash.isequal: 4.5.0
+
+ quill@1.3.7:
+ dependencies:
+ clone: 2.1.2
+ deep-equal: 1.1.2
+ eventemitter3: 2.0.3
+ extend: 3.0.2
+ parchment: 1.1.4
+ quill-delta: 3.6.3
+
+ raf@3.4.1:
+ dependencies:
+ performance-now: 2.1.0
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.2
+
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ regenerator-runtime@0.13.11: {}
+
+ regex-not@1.0.2:
+ dependencies:
+ extend-shallow: 3.0.2
+ safe-regex: 1.1.0
+
+ regexp.prototype.flags@1.5.4:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+
+ repeat-element@1.1.4: {}
+
+ repeat-string@1.6.1: {}
+
+ require-directory@2.1.1: {}
+
+ require-main-filename@2.0.0: {}
+
+ resolve-url@0.2.1: {}
+
+ resolve@1.22.12:
+ dependencies:
+ es-errors: 1.3.0
+ is-core-module: 2.16.2
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ ret@0.1.15: {}
+
+ reusify@1.1.0: {}
+
+ rgbcolor@1.0.1: {}
+
+ rollup@2.80.0:
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-array-concat@1.1.4:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+
+ safe-buffer@5.2.1: {}
+
+ safe-push-apply@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
+ safe-regex@1.1.0:
+ dependencies:
+ ret: 0.1.15
+
+ sass@1.56.1:
+ dependencies:
+ chokidar: 3.6.0
+ immutable: 4.3.8
+ source-map-js: 1.2.1
+
+ sax@1.6.0: {}
+
+ scule@1.3.0: {}
+
+ set-blocking@2.0.0: {}
+
+ set-function-length@1.2.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ set-proto@1.0.0:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+
+ set-value@2.0.1:
+ dependencies:
+ extend-shallow: 2.0.1
+ is-extendable: 0.1.1
+ is-plain-object: 2.0.4
+ split-string: 3.1.0
+
+ side-channel-list@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.1
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ snapdragon-node@2.1.1:
+ dependencies:
+ define-property: 1.0.0
+ isobject: 3.0.1
+ snapdragon-util: 3.0.1
+
+ snapdragon-util@3.0.1:
+ dependencies:
+ kind-of: 3.2.2
+
+ snapdragon@0.8.2:
+ dependencies:
+ base: 0.11.2
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ map-cache: 0.2.2
+ source-map: 0.5.7
+ source-map-resolve: 0.5.3
+ use: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ socket.io-client@4.8.3:
+ dependencies:
+ '@socket.io/component-emitter': 3.1.2
+ debug: 4.4.3
+ engine.io-client: 6.6.4
+ socket.io-parser: 4.2.6
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ socket.io-parser@4.2.6:
+ dependencies:
+ '@socket.io/component-emitter': 3.1.2
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ source-map-js@1.2.1: {}
+
+ source-map-resolve@0.5.3:
+ dependencies:
+ atob: 2.1.2
+ decode-uri-component: 0.2.2
+ resolve-url: 0.2.1
+ source-map-url: 0.4.1
+ urix: 0.1.0
+
+ source-map-url@0.4.1: {}
+
+ source-map@0.5.7: {}
+
+ source-map@0.6.1: {}
+
+ sourcemap-codec@1.4.8: {}
+
+ split-string@3.1.0:
+ dependencies:
+ extend-shallow: 3.0.2
+
+ stable@0.1.8: {}
+
+ stackblur-canvas@2.7.0: {}
+
+ static-extend@0.1.2:
+ dependencies:
+ define-property: 0.2.5
+ object-copy: 0.1.0
+
+ stop-iteration-iterator@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+
+ strict-uri-encode@1.1.0: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string.prototype.trim@1.2.10:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.1
+ has-property-descriptors: 1.0.2
+
+ string.prototype.trimend@1.0.9:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@3.0.1:
+ dependencies:
+ ansi-regex: 2.1.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-literal@1.3.0:
+ dependencies:
+ acorn: 8.16.0
+
+ supports-color@2.0.0: {}
+
+ supports-color@3.2.3:
+ dependencies:
+ has-flag: 1.0.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ svg-baker@1.7.0:
+ dependencies:
+ bluebird: 3.7.2
+ clone: 2.1.2
+ he: 1.2.0
+ image-size: 0.5.5
+ loader-utils: 1.4.2
+ merge-options: 1.0.1
+ micromatch: 3.1.0
+ postcss: 5.2.18
+ postcss-prefix-selector: 1.16.1(postcss@5.2.18)
+ posthtml-rename-id: 1.0.12
+ posthtml-svg-mode: 1.0.3
+ query-string: 4.3.4
+ traverse: 0.6.11
+ transitivePeerDependencies:
+ - supports-color
+
+ svg-pathdata@6.0.3: {}
+
+ svgo@2.8.2:
+ dependencies:
+ commander: 7.2.0
+ css-select: 4.3.0
+ css-tree: 1.1.3
+ csso: 4.2.0
+ picocolors: 1.1.1
+ sax: 1.6.0
+ stable: 0.1.8
+
+ text-segmentation@1.0.3:
+ dependencies:
+ utrie: 1.0.2
+
+ to-object-path@0.3.0:
+ dependencies:
+ kind-of: 3.2.2
+
+ to-regex-range@2.1.1:
+ dependencies:
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ to-regex@3.0.2:
+ dependencies:
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ regex-not: 1.0.2
+ safe-regex: 1.1.0
+
+ traverse@0.6.11:
+ dependencies:
+ gopd: 1.2.0
+ typedarray.prototype.slice: 1.0.5
+ which-typed-array: 1.1.20
+
+ tslib@2.3.0: {}
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-length@1.0.3:
+ dependencies:
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-offset@1.0.4:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+
+ typed-array-length@1.0.7:
+ dependencies:
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
+
+ typedarray.prototype.slice@1.0.5:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ math-intrinsics: 1.1.0
+ typed-array-buffer: 1.0.3
+ typed-array-byte-offset: 1.0.4
+
+ ufo@1.6.4: {}
+
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
+ undici-types@7.19.2: {}
+
+ unimport@0.7.1(rollup@2.80.0):
+ dependencies:
+ '@rollup/pluginutils': 5.3.0(rollup@2.80.0)
+ escape-string-regexp: 5.0.0
+ fast-glob: 3.3.3
+ local-pkg: 0.4.3
+ magic-string: 0.26.7
+ mlly: 1.8.2
+ pathe: 1.1.2
+ pkg-types: 1.3.1
+ scule: 1.3.0
+ strip-literal: 1.3.0
+ unplugin: 1.16.1
+ transitivePeerDependencies:
+ - rollup
+
+ union-value@1.0.1:
+ dependencies:
+ arr-union: 3.1.0
+ get-value: 2.0.6
+ is-extendable: 0.1.1
+ set-value: 2.0.1
+
+ universalify@2.0.1: {}
+
+ unplugin-auto-import@0.11.4(@vueuse/core@9.5.0(vue@3.2.45))(rollup@2.80.0):
+ dependencies:
+ '@antfu/utils': 0.6.3
+ '@rollup/pluginutils': 5.3.0(rollup@2.80.0)
+ local-pkg: 0.4.3
+ magic-string: 0.26.7
+ unimport: 0.7.1(rollup@2.80.0)
+ unplugin: 0.10.2
+ optionalDependencies:
+ '@vueuse/core': 9.5.0(vue@3.2.45)
+ transitivePeerDependencies:
+ - rollup
+
+ unplugin-vue-setup-extend-plus@0.4.9:
+ dependencies:
+ '@vue/compiler-sfc': 3.2.45
+ magic-string: 0.26.7
+ unplugin: 1.16.1
+
+ unplugin@0.10.2:
+ dependencies:
+ acorn: 8.16.0
+ chokidar: 3.6.0
+ webpack-sources: 3.4.1
+ webpack-virtual-modules: 0.4.6
+
+ unplugin@1.16.1:
+ dependencies:
+ acorn: 8.16.0
+ webpack-virtual-modules: 0.6.2
+
+ unset-value@1.0.0:
+ dependencies:
+ has-value: 0.3.1
+ isobject: 3.0.1
+
+ urix@0.1.0: {}
+
+ use@3.1.1: {}
+
+ util-deprecate@1.0.2: {}
+
+ utrie@1.0.2:
+ dependencies:
+ base64-arraybuffer: 1.0.2
+
+ vary@1.1.2: {}
+
+ vite-plugin-compression@0.5.1(vite@3.2.3(@types/node@25.6.2)(sass@1.56.1)):
+ dependencies:
+ chalk: 4.1.2
+ debug: 4.4.3
+ fs-extra: 10.1.0
+ vite: 3.2.3(@types/node@25.6.2)(sass@1.56.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ vite-plugin-svg-icons@2.0.1(vite@3.2.3(@types/node@25.6.2)(sass@1.56.1)):
+ dependencies:
+ '@types/svgo': 2.6.4
+ cors: 2.8.6
+ debug: 4.4.3
+ etag: 1.8.1
+ fs-extra: 10.1.0
+ pathe: 0.2.0
+ svg-baker: 1.7.0
+ svgo: 2.8.2
+ vite: 3.2.3(@types/node@25.6.2)(sass@1.56.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ vite@3.2.3(@types/node@25.6.2)(sass@1.56.1):
+ dependencies:
+ esbuild: 0.15.18
+ postcss: 8.5.14
+ resolve: 1.22.12
+ rollup: 2.80.0
+ optionalDependencies:
+ '@types/node': 25.6.2
+ fsevents: 2.3.3
+ sass: 1.56.1
+
+ vue-cropper@1.0.3: {}
+
+ vue-demi@0.14.10(vue@3.2.45):
+ dependencies:
+ vue: 3.2.45
+
+ vue-plugin-hiprint@0.0.56:
+ dependencies:
+ '@claviska/jquery-minicolors': 2.3.6(jquery@3.7.1)
+ bwip-js: 4.10.1
+ canvg: 3.0.11
+ html2canvas: 1.4.1
+ jquery: 3.7.1
+ jsbarcode: 3.12.3
+ jspdf: 2.5.2
+ nzh: 1.0.14
+ socket.io-client: 4.8.3
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ vue-router@4.1.4(vue@3.2.45):
+ dependencies:
+ '@vue/devtools-api': 6.6.4
+ vue: 3.2.45
+
+ vue@3.2.45:
+ dependencies:
+ '@vue/compiler-dom': 3.2.45
+ '@vue/compiler-sfc': 3.2.45
+ '@vue/runtime-dom': 3.2.45
+ '@vue/server-renderer': 3.2.45(vue@3.2.45)
+ '@vue/shared': 3.2.45
+
+ webpack-sources@3.4.1: {}
+
+ webpack-virtual-modules@0.4.6: {}
+
+ webpack-virtual-modules@0.6.2: {}
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.20
+
+ which-collection@1.0.2:
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+
+ which-module@2.0.1: {}
+
+ which-typed-array@1.1.20:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ ws@8.18.3: {}
+
+ xmlhttprequest-ssl@2.1.2: {}
+
+ y18n@4.0.3: {}
+
+ yargs-parser@18.1.3:
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
+
+ yargs@15.4.1:
+ dependencies:
+ cliui: 6.0.0
+ decamelize: 1.2.0
+ find-up: 4.1.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ require-main-filename: 2.0.0
+ set-blocking: 2.0.0
+ string-width: 4.2.3
+ which-module: 2.0.1
+ y18n: 4.0.3
+ yargs-parser: 18.1.3
+
+ zrender@5.4.0:
+ dependencies:
+ tslib: 2.3.0
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..e919b2f
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..31839f2
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/src/api/demo/demo.js b/src/api/demo/demo.js
new file mode 100644
index 0000000..04d4025
--- /dev/null
+++ b/src/api/demo/demo.js
@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 查询测试单表列表
+export function listDemo(query) {
+ return request({
+ url: '/demo/demo/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 自定义分页接口
+export function pageDemo(query) {
+ return request({
+ url: '/demo/demo/page',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询测试单表详细
+export function getDemo(id) {
+ return request({
+ url: '/demo/demo/' + id,
+ method: 'get'
+ })
+}
+
+// 新增测试单表
+export function addDemo(data) {
+ return request({
+ url: '/demo/demo',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改测试单表
+export function updateDemo(data) {
+ return request({
+ url: '/demo/demo',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除测试单表
+export function delDemo(id) {
+ return request({
+ url: '/demo/demo/' + id,
+ method: 'delete'
+ })
+}
+
diff --git a/src/api/demo/tree.js b/src/api/demo/tree.js
new file mode 100644
index 0000000..4c7ebc0
--- /dev/null
+++ b/src/api/demo/tree.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询测试树表列表
+export function listTree(query) {
+ return request({
+ url: '/demo/tree/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询测试树表详细
+export function getTree(id) {
+ return request({
+ url: '/demo/tree/' + id,
+ method: 'get'
+ })
+}
+
+// 新增测试树表
+export function addTree(data) {
+ return request({
+ url: '/demo/tree',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改测试树表
+export function updateTree(data) {
+ return request({
+ url: '/demo/tree',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除测试树表
+export function delTree(id) {
+ return request({
+ url: '/demo/tree/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/login.js b/src/api/login.js
new file mode 100644
index 0000000..649f59c
--- /dev/null
+++ b/src/api/login.js
@@ -0,0 +1,59 @@
+import request from '@/utils/request'
+
+// 登录方法
+export function login(username, password, code, uuid) {
+ const data = {
+ username,
+ password,
+ code,
+ uuid
+ }
+ return request({
+ url: '/login',
+ headers: {
+ isToken: false
+ },
+ method: 'post',
+ data: data
+ })
+}
+
+// 注册方法
+export function register(data) {
+ return request({
+ url: '/register',
+ headers: {
+ isToken: false
+ },
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取用户详细信息
+export function getInfo() {
+ return request({
+ url: '/getInfo',
+ method: 'get'
+ })
+}
+
+// 退出方法
+export function logout() {
+ return request({
+ url: '/logout',
+ method: 'post'
+ })
+}
+
+// 获取验证码
+export function getCodeImg() {
+ return request({
+ url: '/captchaImage',
+ headers: {
+ isToken: false
+ },
+ method: 'get',
+ timeout: 20000
+ })
+}
\ No newline at end of file
diff --git a/src/api/menu.js b/src/api/menu.js
new file mode 100644
index 0000000..faef101
--- /dev/null
+++ b/src/api/menu.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 获取路由
+export const getRouters = () => {
+ return request({
+ url: '/getRouters',
+ method: 'get'
+ })
+}
\ No newline at end of file
diff --git a/src/api/monitor/cache.js b/src/api/monitor/cache.js
new file mode 100644
index 0000000..45a9003
--- /dev/null
+++ b/src/api/monitor/cache.js
@@ -0,0 +1,57 @@
+import request from '@/utils/request'
+
+// 查询缓存详细
+export function getCache() {
+ return request({
+ url: '/monitor/cache',
+ method: 'get'
+ })
+}
+
+// 查询缓存名称列表
+export function listCacheName() {
+ return request({
+ url: '/monitor/cache/getNames',
+ method: 'get'
+ })
+}
+
+// 查询缓存键名列表
+export function listCacheKey(cacheName) {
+ return request({
+ url: '/monitor/cache/getKeys/' + cacheName,
+ method: 'get'
+ })
+}
+
+// 查询缓存内容
+export function getCacheValue(cacheName, cacheKey) {
+ return request({
+ url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey,
+ method: 'get'
+ })
+}
+
+// 清理指定名称缓存
+export function clearCacheName(cacheName) {
+ return request({
+ url: '/monitor/cache/clearCacheName/' + cacheName,
+ method: 'delete'
+ })
+}
+
+// 清理指定键名缓存
+export function clearCacheKey(cacheName, cacheKey) {
+ return request({
+ url: '/monitor/cache/clearCacheKey/' + cacheName + '/' + cacheKey,
+ method: 'delete'
+ })
+}
+
+// 清理全部缓存
+export function clearCacheAll() {
+ return request({
+ url: '/monitor/cache/clearCacheAll',
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/logininfor.js b/src/api/monitor/logininfor.js
new file mode 100644
index 0000000..4d112b7
--- /dev/null
+++ b/src/api/monitor/logininfor.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+// 查询登录日志列表
+export function list(query) {
+ return request({
+ url: '/monitor/logininfor/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 删除登录日志
+export function delLogininfor(infoId) {
+ return request({
+ url: '/monitor/logininfor/' + infoId,
+ method: 'delete'
+ })
+}
+
+// 解锁用户登录状态
+export function unlockLogininfor(userName) {
+ return request({
+ url: '/monitor/logininfor/unlock/' + userName,
+ method: 'get'
+ })
+}
+
+// 清空登录日志
+export function cleanLogininfor() {
+ return request({
+ url: '/monitor/logininfor/clean',
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/online.js b/src/api/monitor/online.js
new file mode 100644
index 0000000..bd22137
--- /dev/null
+++ b/src/api/monitor/online.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 查询在线用户列表
+export function list(query) {
+ return request({
+ url: '/monitor/online/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 强退用户
+export function forceLogout(tokenId) {
+ return request({
+ url: '/monitor/online/' + tokenId,
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/operlog.js b/src/api/monitor/operlog.js
new file mode 100644
index 0000000..a04bca8
--- /dev/null
+++ b/src/api/monitor/operlog.js
@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+
+// 查询操作日志列表
+export function list(query) {
+ return request({
+ url: '/monitor/operlog/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 删除操作日志
+export function delOperlog(operId) {
+ return request({
+ url: '/monitor/operlog/' + operId,
+ method: 'delete'
+ })
+}
+
+// 清空操作日志
+export function cleanOperlog() {
+ return request({
+ url: '/monitor/operlog/clean',
+ method: 'delete'
+ })
+}
diff --git a/src/api/system/config.js b/src/api/system/config.js
new file mode 100644
index 0000000..9b93886
--- /dev/null
+++ b/src/api/system/config.js
@@ -0,0 +1,72 @@
+import request from '@/utils/request'
+
+// 查询参数列表
+export function listConfig(query) {
+ return request({
+ url: '/system/config/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询参数详细
+export function getConfig(configId) {
+ return request({
+ url: '/system/config/' + configId,
+ method: 'get'
+ })
+}
+
+// 根据参数键名查询参数值
+export function getConfigKey(configKey) {
+ return request({
+ url: '/system/config/configKey/' + configKey,
+ method: 'get'
+ })
+}
+
+// 新增参数配置
+export function addConfig(data) {
+ return request({
+ url: '/system/config',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改参数配置
+export function updateConfig(data) {
+ return request({
+ url: '/system/config',
+ method: 'put',
+ data: data
+ })
+}
+
+// 修改参数配置
+export function updateConfigByKey(key, value) {
+ return request({
+ url: '/system/config/updateByKey',
+ method: 'put',
+ data: {
+ configKey: key,
+ configValue: value
+ }
+ })
+}
+
+// 删除参数配置
+export function delConfig(configId) {
+ return request({
+ url: '/system/config/' + configId,
+ method: 'delete'
+ })
+}
+
+// 刷新参数缓存
+export function refreshCache() {
+ return request({
+ url: '/system/config/refreshCache',
+ method: 'delete'
+ })
+}
diff --git a/src/api/system/dept.js b/src/api/system/dept.js
new file mode 100644
index 0000000..fc943cd
--- /dev/null
+++ b/src/api/system/dept.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询部门列表
+export function listDept(query) {
+ return request({
+ url: '/system/dept/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询部门列表(排除节点)
+export function listDeptExcludeChild(deptId) {
+ return request({
+ url: '/system/dept/list/exclude/' + deptId,
+ method: 'get'
+ })
+}
+
+// 查询部门详细
+export function getDept(deptId) {
+ return request({
+ url: '/system/dept/' + deptId,
+ method: 'get'
+ })
+}
+
+// 新增部门
+export function addDept(data) {
+ return request({
+ url: '/system/dept',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改部门
+export function updateDept(data) {
+ return request({
+ url: '/system/dept',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除部门
+export function delDept(deptId) {
+ return request({
+ url: '/system/dept/' + deptId,
+ method: 'delete'
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/dict/data.js b/src/api/system/dict/data.js
new file mode 100644
index 0000000..6c9eb79
--- /dev/null
+++ b/src/api/system/dict/data.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询字典数据列表
+export function listData(query) {
+ return request({
+ url: '/system/dict/data/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询字典数据详细
+export function getData(dictCode) {
+ return request({
+ url: '/system/dict/data/' + dictCode,
+ method: 'get'
+ })
+}
+
+// 根据字典类型查询字典数据信息
+export function getDicts(dictType) {
+ return request({
+ url: '/system/dict/data/type/' + dictType,
+ method: 'get'
+ })
+}
+
+// 新增字典数据
+export function addData(data) {
+ return request({
+ url: '/system/dict/data',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改字典数据
+export function updateData(data) {
+ return request({
+ url: '/system/dict/data',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除字典数据
+export function delData(dictCode) {
+ return request({
+ url: '/system/dict/data/' + dictCode,
+ method: 'delete'
+ })
+}
diff --git a/src/api/system/dict/type.js b/src/api/system/dict/type.js
new file mode 100644
index 0000000..a0254ba
--- /dev/null
+++ b/src/api/system/dict/type.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询字典类型列表
+export function listType(query) {
+ return request({
+ url: '/system/dict/type/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询字典类型详细
+export function getType(dictId) {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'get'
+ })
+}
+
+// 新增字典类型
+export function addType(data) {
+ return request({
+ url: '/system/dict/type',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改字典类型
+export function updateType(data) {
+ return request({
+ url: '/system/dict/type',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除字典类型
+export function delType(dictId) {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'delete'
+ })
+}
+
+// 刷新字典缓存
+export function refreshCache() {
+ return request({
+ url: '/system/dict/type/refreshCache',
+ method: 'delete'
+ })
+}
+
+// 获取字典选择框列表
+export function optionselect() {
+ return request({
+ url: '/system/dict/type/optionselect',
+ method: 'get'
+ })
+}
diff --git a/src/api/system/menu.js b/src/api/system/menu.js
new file mode 100644
index 0000000..f6415c6
--- /dev/null
+++ b/src/api/system/menu.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询菜单列表
+export function listMenu(query) {
+ return request({
+ url: '/system/menu/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询菜单详细
+export function getMenu(menuId) {
+ return request({
+ url: '/system/menu/' + menuId,
+ method: 'get'
+ })
+}
+
+// 查询菜单下拉树结构
+export function treeselect() {
+ return request({
+ url: '/system/menu/treeselect',
+ method: 'get'
+ })
+}
+
+// 根据角色ID查询菜单下拉树结构
+export function roleMenuTreeselect(roleId) {
+ return request({
+ url: '/system/menu/roleMenuTreeselect/' + roleId,
+ method: 'get'
+ })
+}
+
+// 新增菜单
+export function addMenu(data) {
+ return request({
+ url: '/system/menu',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改菜单
+export function updateMenu(data) {
+ return request({
+ url: '/system/menu',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除菜单
+export function delMenu(menuId) {
+ return request({
+ url: '/system/menu/' + menuId,
+ method: 'delete'
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/notice.js b/src/api/system/notice.js
new file mode 100644
index 0000000..c274ea5
--- /dev/null
+++ b/src/api/system/notice.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询公告列表
+export function listNotice(query) {
+ return request({
+ url: '/system/notice/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询公告详细
+export function getNotice(noticeId) {
+ return request({
+ url: '/system/notice/' + noticeId,
+ method: 'get'
+ })
+}
+
+// 新增公告
+export function addNotice(data) {
+ return request({
+ url: '/system/notice',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改公告
+export function updateNotice(data) {
+ return request({
+ url: '/system/notice',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除公告
+export function delNotice(noticeId) {
+ return request({
+ url: '/system/notice/' + noticeId,
+ method: 'delete'
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/oss.js b/src/api/system/oss.js
new file mode 100644
index 0000000..7d80026
--- /dev/null
+++ b/src/api/system/oss.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 查询OSS对象存储列表
+export function listOss(query) {
+ return request({
+ url: '/system/oss/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询OSS对象基于id串
+export function listByIds(ossId) {
+ return request({
+ url: '/system/oss/listByIds/' + ossId,
+ method: 'get'
+ })
+}
+
+// 删除OSS对象存储
+export function delOss(ossId) {
+ return request({
+ url: '/system/oss/' + ossId,
+ method: 'delete'
+ })
+}
+
diff --git a/src/api/system/ossConfig.js b/src/api/system/ossConfig.js
new file mode 100644
index 0000000..f290762
--- /dev/null
+++ b/src/api/system/ossConfig.js
@@ -0,0 +1,58 @@
+import request from '@/utils/request'
+
+// 查询对象存储配置列表
+export function listOssConfig(query) {
+ return request({
+ url: '/system/oss/config/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询对象存储配置详细
+export function getOssConfig(ossConfigId) {
+ return request({
+ url: '/system/oss/config/' + ossConfigId,
+ method: 'get'
+ })
+}
+
+// 新增对象存储配置
+export function addOssConfig(data) {
+ return request({
+ url: '/system/oss/config',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改对象存储配置
+export function updateOssConfig(data) {
+ return request({
+ url: '/system/oss/config',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除对象存储配置
+export function delOssConfig(ossConfigId) {
+ return request({
+ url: '/system/oss/config/' + ossConfigId,
+ method: 'delete'
+ })
+}
+
+// 对象存储状态修改
+export function changeOssConfigStatus(ossConfigId, status, configKey) {
+ const data = {
+ ossConfigId,
+ status,
+ configKey
+ }
+ return request({
+ url: '/system/oss/config/changeStatus',
+ method: 'put',
+ data: data
+ })
+}
diff --git a/src/api/system/post.js b/src/api/system/post.js
new file mode 100644
index 0000000..1a8e9ca
--- /dev/null
+++ b/src/api/system/post.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询岗位列表
+export function listPost(query) {
+ return request({
+ url: '/system/post/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询岗位详细
+export function getPost(postId) {
+ return request({
+ url: '/system/post/' + postId,
+ method: 'get'
+ })
+}
+
+// 新增岗位
+export function addPost(data) {
+ return request({
+ url: '/system/post',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改岗位
+export function updatePost(data) {
+ return request({
+ url: '/system/post',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除岗位
+export function delPost(postId) {
+ return request({
+ url: '/system/post/' + postId,
+ method: 'delete'
+ })
+}
diff --git a/src/api/system/role.js b/src/api/system/role.js
new file mode 100644
index 0000000..f13e6f4
--- /dev/null
+++ b/src/api/system/role.js
@@ -0,0 +1,119 @@
+import request from '@/utils/request'
+
+// 查询角色列表
+export function listRole(query) {
+ return request({
+ url: '/system/role/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询角色详细
+export function getRole(roleId) {
+ return request({
+ url: '/system/role/' + roleId,
+ method: 'get'
+ })
+}
+
+// 新增角色
+export function addRole(data) {
+ return request({
+ url: '/system/role',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改角色
+export function updateRole(data) {
+ return request({
+ url: '/system/role',
+ method: 'put',
+ data: data
+ })
+}
+
+// 角色数据权限
+export function dataScope(data) {
+ return request({
+ url: '/system/role/dataScope',
+ method: 'put',
+ data: data
+ })
+}
+
+// 角色状态修改
+export function changeRoleStatus(roleId, status) {
+ const data = {
+ roleId,
+ status
+ }
+ return request({
+ url: '/system/role/changeStatus',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除角色
+export function delRole(roleId) {
+ return request({
+ url: '/system/role/' + roleId,
+ method: 'delete'
+ })
+}
+
+// 查询角色已授权用户列表
+export function allocatedUserList(query) {
+ return request({
+ url: '/system/role/authUser/allocatedList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询角色未授权用户列表
+export function unallocatedUserList(query) {
+ return request({
+ url: '/system/role/authUser/unallocatedList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 取消用户授权角色
+export function authUserCancel(data) {
+ return request({
+ url: '/system/role/authUser/cancel',
+ method: 'put',
+ data: data
+ })
+}
+
+// 批量取消用户授权角色
+export function authUserCancelAll(data) {
+ return request({
+ url: '/system/role/authUser/cancelAll',
+ method: 'put',
+ params: data
+ })
+}
+
+// 授权用户选择
+export function authUserSelectAll(data) {
+ return request({
+ url: '/system/role/authUser/selectAll',
+ method: 'put',
+ params: data
+ })
+}
+
+// 根据角色ID查询部门树结构
+export function deptTreeSelect(roleId) {
+ return request({
+ url: '/system/role/deptTree/' + roleId,
+ method: 'get'
+ })
+}
diff --git a/src/api/system/user.js b/src/api/system/user.js
new file mode 100644
index 0000000..f2f76ef
--- /dev/null
+++ b/src/api/system/user.js
@@ -0,0 +1,135 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/ruoyi";
+
+// 查询用户列表
+export function listUser(query) {
+ return request({
+ url: '/system/user/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询用户详细
+export function getUser(userId) {
+ return request({
+ url: '/system/user/' + parseStrEmpty(userId),
+ method: 'get'
+ })
+}
+
+// 新增用户
+export function addUser(data) {
+ return request({
+ url: '/system/user',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改用户
+export function updateUser(data) {
+ return request({
+ url: '/system/user',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除用户
+export function delUser(userId) {
+ return request({
+ url: '/system/user/' + userId,
+ method: 'delete'
+ })
+}
+
+// 用户密码重置
+export function resetUserPwd(userId, password) {
+ const data = {
+ userId,
+ password
+ }
+ return request({
+ url: '/system/user/resetPwd',
+ method: 'put',
+ data: data
+ })
+}
+
+// 用户状态修改
+export function changeUserStatus(userId, status) {
+ const data = {
+ userId,
+ status
+ }
+ return request({
+ url: '/system/user/changeStatus',
+ method: 'put',
+ data: data
+ })
+}
+
+// 查询用户个人信息
+export function getUserProfile() {
+ return request({
+ url: '/system/user/profile',
+ method: 'get'
+ })
+}
+
+// 修改用户个人信息
+export function updateUserProfile(data) {
+ return request({
+ url: '/system/user/profile',
+ method: 'put',
+ data: data
+ })
+}
+
+// 用户密码重置
+export function updateUserPwd(oldPassword, newPassword) {
+ const data = {
+ oldPassword,
+ newPassword
+ }
+ return request({
+ url: '/system/user/profile/updatePwd',
+ method: 'put',
+ params: data
+ })
+}
+
+// 用户头像上传
+export function uploadAvatar(data) {
+ return request({
+ url: '/system/user/profile/avatar',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询授权角色
+export function getAuthRole(userId) {
+ return request({
+ url: '/system/user/authRole/' + userId,
+ method: 'get'
+ })
+}
+
+// 保存授权角色
+export function updateAuthRole(data) {
+ return request({
+ url: '/system/user/authRole',
+ method: 'put',
+ params: data
+ })
+}
+
+// 查询部门下拉树结构
+export function deptTreeSelect() {
+ return request({
+ url: '/system/user/deptTree',
+ method: 'get'
+ })
+}
diff --git a/src/api/tool/gen.js b/src/api/tool/gen.js
new file mode 100644
index 0000000..441791c
--- /dev/null
+++ b/src/api/tool/gen.js
@@ -0,0 +1,85 @@
+import request from '@/utils/request'
+
+// 查询生成表数据
+export function listTable(query) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/list',
+ method: 'get',
+ params: query
+ })
+}
+// 查询db数据库列表
+export function listDbTable(query) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/db/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询表详细信息
+export function getGenTable(tableId) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/' + tableId,
+ method: 'get'
+ })
+}
+
+// 修改代码生成信息
+export function updateGenTable(data) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen',
+ method: 'put',
+ data: data
+ })
+}
+
+// 导入表
+export function importTable(data) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/importTable',
+ method: 'post',
+ params: data
+ })
+}
+
+// 预览生成代码
+export function previewTable(tableId) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/preview/' + tableId,
+ method: 'get'
+ })
+}
+
+// 删除表数据
+export function delTable(tableId) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/' + tableId,
+ method: 'delete'
+ })
+}
+
+// 生成代码(自定义路径)
+export function genCode(tableName) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/genCode/' + tableName,
+ method: 'get'
+ })
+}
+
+// 同步数据库
+export function synchDb(tableName) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/synchDb/' + tableName,
+ method: 'get'
+ })
+}
diff --git a/src/api/wms/area.js b/src/api/wms/area.js
new file mode 100644
index 0000000..43f5b6e
--- /dev/null
+++ b/src/api/wms/area.js
@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+
+/**
+ * 查询库区列表
+ * @param query
+ * @returns {*}
+ */
+
+export function listArea(query) {
+ return request({
+ url: '/wms/area/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询库区列表
+ * @param query
+ * @returns {*}
+ */
+
+export function listAreaNoPage(query) {
+ return request({
+ url: '/wms/area/listNoPage',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询库区详细
+ * @param id
+ */
+export function getArea(id) {
+ return request({
+ url: '/wms/area/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增库区
+ * @param data
+ */
+export function addArea(data) {
+ return request({
+ url: '/wms/area',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改库区
+ * @param data
+ */
+export function updateArea(data) {
+ return request({
+ url: '/wms/area',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除库区
+ * @param id
+ */
+export function delArea(id) {
+ return request({
+ url: '/wms/area/' + id,
+ method: 'delete'
+ });
+};
diff --git a/src/api/wms/checkOrder.js b/src/api/wms/checkOrder.js
new file mode 100644
index 0000000..4a4cd8f
--- /dev/null
+++ b/src/api/wms/checkOrder.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询库存盘点单据列表
+export function listCheckOrder(query) {
+ return request({
+ url: '/wms/checkOrder/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询库存盘点单据详细
+export function getCheckOrder(id) {
+ return request({
+ url: '/wms/checkOrder/' + id,
+ method: 'get'
+ })
+}
+
+// 新增库存盘点单据
+export function addCheckOrder(data) {
+ return request({
+ url: '/wms/checkOrder',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改库存盘点单据
+export function updateCheckOrder(data) {
+ return request({
+ url: '/wms/checkOrder',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除库存盘点单据
+export function delCheckOrder(id) {
+ return request({
+ url: '/wms/checkOrder/' + id,
+ method: 'delete'
+ })
+}
+
+// 盘库结束
+export function check(data) {
+ return request({
+ url: '/wms/checkOrder/check',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/src/api/wms/checkOrderDetail.js b/src/api/wms/checkOrderDetail.js
new file mode 100644
index 0000000..b7a9dd7
--- /dev/null
+++ b/src/api/wms/checkOrderDetail.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询库存盘点单据详情列表
+export function listCheckOrderDetail(query) {
+ return request({
+ url: '/wms/checkOrderDetail/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询库存盘点单据详情详细
+export function getCheckOrderDetail(id) {
+ return request({
+ url: '/wms/checkOrderDetail/' + id,
+ method: 'get'
+ })
+}
+
+// 新增库存盘点单据详情
+export function addCheckOrderDetail(data) {
+ return request({
+ url: '/wms/checkOrderDetail',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改库存盘点单据详情
+export function updateCheckOrderDetail(data) {
+ return request({
+ url: '/wms/checkOrderDetail',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除库存盘点单据详情
+export function delCheckOrderDetail(id) {
+ return request({
+ url: '/wms/checkOrderDetail/' + id,
+ method: 'delete'
+ })
+}
+
+// 根据盘库单id查询盘库单详情列表
+export function listByCheckOrderId(checkOrderId) {
+ return request({
+ url: '/wms/checkOrderDetail/list/' + checkOrderId,
+ method: 'get'
+ })
+}
diff --git a/src/api/wms/inventory.js b/src/api/wms/inventory.js
new file mode 100644
index 0000000..5aa94da
--- /dev/null
+++ b/src/api/wms/inventory.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询库存列表
+export function listInventory(query) {
+ return request({
+ url: '/wms/inventory/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询库存看板仓库维度列表
+export function listInventoryBoard(query,type) {
+ return request({
+ url: '/wms/inventory/boardList/'+type,
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询库存详细
+export function getInventory(id) {
+ return request({
+ url: '/wms/inventory/' + id,
+ method: 'get'
+ })
+}
+
+// 新增库存
+export function addInventory(data) {
+ return request({
+ url: '/wms/inventory',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改库存
+export function updateInventory(data) {
+ return request({
+ url: '/wms/inventory',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除库存
+export function delInventory(id) {
+ return request({
+ url: '/wms/inventory/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/wms/inventoryDetail.js b/src/api/wms/inventoryDetail.js
new file mode 100644
index 0000000..22734af
--- /dev/null
+++ b/src/api/wms/inventoryDetail.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 分页查询库存详情列表
+export function listInventoryDetail(query) {
+ return request({
+ url: '/wms/inventoryDetail/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询库存详情列表
+export function listInventoryDetailNoPage(query) {
+ return request({
+ url: '/wms/inventoryDetail/listNoPage',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询库存详情详细
+export function getInventoryDetail(id) {
+ return request({
+ url: '/wms/inventoryDetail/' + id,
+ method: 'get'
+ })
+}
+
+// 新增库存详情
+export function addInventoryDetail(data) {
+ return request({
+ url: '/wms/inventoryDetail',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改库存详情
+export function updateInventoryDetail(data) {
+ return request({
+ url: '/wms/inventoryDetail',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除库存详情
+export function delInventoryDetail(id) {
+ return request({
+ url: '/wms/inventoryDetail/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/wms/inventoryHistory.js b/src/api/wms/inventoryHistory.js
new file mode 100644
index 0000000..a869918
--- /dev/null
+++ b/src/api/wms/inventoryHistory.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询库存记录列表
+export function listInventoryHistory(query) {
+ return request({
+ url: '/wms/inventoryHistory/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询库存记录详细
+export function getInventoryHistory(id) {
+ return request({
+ url: '/wms/inventoryHistory/' + id,
+ method: 'get'
+ })
+}
+
+// 新增库存记录
+export function addInventoryHistory(data) {
+ return request({
+ url: '/wms/inventoryHistory',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改库存记录
+export function updateInventoryHistory(data) {
+ return request({
+ url: '/wms/inventoryHistory',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除库存记录
+export function delInventoryHistory(id) {
+ return request({
+ url: '/wms/inventoryHistory/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/wms/item.js b/src/api/wms/item.js
new file mode 100644
index 0000000..0afe765
--- /dev/null
+++ b/src/api/wms/item.js
@@ -0,0 +1,83 @@
+import request from '@/utils/request';
+
+/**
+ * 查询物料列表
+ * @param query
+ * @returns {*}
+ */
+
+export function listItemPage(query) {
+ return request({
+ url: '/wms/item/list',
+ method: 'get',
+ params: query
+ });
+};
+
+export function listItem(query) {
+ return request({
+ url: '/wms/item/listNoPage',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询物料列表 以sku为维度
+ * @param query
+ * @returns {*}
+ */
+
+export function listItemGroupBySku(query) {
+ return request({
+ url: '/wms/itemSku/selectList',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询物料详细
+ * @param id
+ */
+export function getItem(id) {
+ return request({
+ url: '/wms/item/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增物料
+ * @param data
+ */
+export function addItem(data) {
+ return request({
+ url: '/wms/item',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改物料
+ * @param data
+ */
+export function updateItem(data) {
+ return request({
+ url: '/wms/item',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除物料
+ * @param id
+ */
+export function delItem(id) {
+ return request({
+ url: '/wms/item/' + id,
+ method: 'delete'
+ });
+};
diff --git a/src/api/wms/itemBrand.js b/src/api/wms/itemBrand.js
new file mode 100644
index 0000000..2782c78
--- /dev/null
+++ b/src/api/wms/itemBrand.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询商品品牌列表
+export function listItemBrandPage(query) {
+ return request({
+ url: '/wms/itemBrand/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询商品品牌列表
+export function listItemBrand(query) {
+ return request({
+ url: '/wms/itemBrand/listNoPage',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询商品品牌详细
+export function getItemBrand(id) {
+ return request({
+ url: '/wms/itemBrand/' + id,
+ method: 'get'
+ })
+}
+
+// 新增商品品牌
+export function addItemBrand(data) {
+ return request({
+ url: '/wms/itemBrand',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改商品品牌
+export function updateItemBrand(data) {
+ return request({
+ url: '/wms/itemBrand',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除商品品牌
+export function delItemBrand(id) {
+ return request({
+ url: '/wms/itemBrand/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/wms/itemCategory.js b/src/api/wms/itemCategory.js
new file mode 100644
index 0000000..32c9190
--- /dev/null
+++ b/src/api/wms/itemCategory.js
@@ -0,0 +1,101 @@
+import request from '@/utils/request';
+
+/**
+ * 查询物料类型列表
+ * @param query
+ * @returns {*}
+ */
+
+export function listItemCategoryPage(query) {
+ return request({
+ url: '/wms/itemCategory/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询物料类型列表
+ * @param query
+ * @returns {*}
+ */
+
+export function listItemCategory(query) {
+ return request({
+ url: '/wms/itemCategory/listNoPage',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 获取物料类型下拉树列表
+ * @param query
+ * @returns {*}
+ */
+
+export function treeSelectItemCategory(query) {
+ return request({
+ url: '/wms/itemCategory/treeselect',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询物料类型详细
+ * @param id
+ */
+export function getItemCategory(id) {
+ return request({
+ url: '/wms/itemCategory/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增物料类型
+ * @param data
+ */
+export function addItemCategory(data) {
+ return request({
+ url: '/wms/itemCategory',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改物料类型
+ * @param data
+ */
+export function updateItemCategory(data) {
+ return request({
+ url: '/wms/itemCategory',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除物料类型
+ * @param id
+ */
+export function delItemCategory(id) {
+ return request({
+ url: '/wms/itemCategory/' + id,
+ method: 'delete'
+ });
+};
+
+/**
+ * 删除物料类型
+ * @param data
+ */
+export function updateOrderNum(data) {
+ return request({
+ url: '/wms/itemCategory/update/orderNum',
+ method: 'post',
+ data: data
+ });
+};
diff --git a/src/api/wms/itemSku.js b/src/api/wms/itemSku.js
new file mode 100644
index 0000000..e600e93
--- /dev/null
+++ b/src/api/wms/itemSku.js
@@ -0,0 +1,69 @@
+import request from '@/utils/request';
+
+/**
+ * 查询sku信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export function listItemSkuPage(query) {
+ return request({
+ url: '/wms/itemSku/list',
+ method: 'get',
+ params: query
+ });
+};
+
+export function listItemSku(query) {
+ return request({
+ url: '/wms/itemSku/listNoPage',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询sku信息详细
+ * @param id
+ */
+export function getItemSku(id) {
+ return request({
+ url: '/wms/itemSku/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增sku信息
+ * @param data
+ */
+export function addItemSku(data) {
+ return request({
+ url: '/wms/itemSku',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改sku信息
+ * @param data
+ */
+export function updateItemSku(data) {
+ return request({
+ url: '/wms/itemSku',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除sku信息
+ * @param id
+ */
+export function delItemSku(id) {
+ return request({
+ url: '/wms/itemSku/' + id,
+ method: 'delete'
+ });
+};
diff --git a/src/api/wms/merchant.js b/src/api/wms/merchant.js
new file mode 100644
index 0000000..96cb4d8
--- /dev/null
+++ b/src/api/wms/merchant.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询往来单位列表
+export function listMerchant(query) {
+ return request({
+ url: '/wms/merchant/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询往来单位列表
+export function listMerchantNoPage(query) {
+ return request({
+ url: '/wms/merchant/listNoPage',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询往来单位详细
+export function getMerchant(id) {
+ return request({
+ url: '/wms/merchant/' + id,
+ method: 'get'
+ })
+}
+
+// 新增往来单位
+export function addMerchant(data) {
+ return request({
+ url: '/wms/merchant',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改往来单位
+export function updateMerchant(data) {
+ return request({
+ url: '/wms/merchant',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除往来单位
+export function delMerchant(id) {
+ return request({
+ url: '/wms/merchant/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/wms/movementOrder.js b/src/api/wms/movementOrder.js
new file mode 100644
index 0000000..c204adc
--- /dev/null
+++ b/src/api/wms/movementOrder.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询移库单列表
+export function listMovementOrder(query) {
+ return request({
+ url: '/wms/movementOrder/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询移库单详细
+export function getMovementOrder(id) {
+ return request({
+ url: '/wms/movementOrder/' + id,
+ method: 'get'
+ })
+}
+
+// 新增移库单
+export function addMovementOrder(data) {
+ return request({
+ url: '/wms/movementOrder',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改移库单
+export function updateMovementOrder(data) {
+ return request({
+ url: '/wms/movementOrder',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除移库单
+export function delMovementOrder(id) {
+ return request({
+ url: '/wms/movementOrder/' + id,
+ method: 'delete'
+ })
+}
+
+// 移库
+export function movement(data) {
+ return request({
+ url: '/wms/movementOrder/move',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/src/api/wms/movementOrderDetail.js b/src/api/wms/movementOrderDetail.js
new file mode 100644
index 0000000..07a52a4
--- /dev/null
+++ b/src/api/wms/movementOrderDetail.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询库存移动详情列表
+export function listMovementOrderDetail(query) {
+ return request({
+ url: '/wms/movementOrderDetail/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询库存移动详情详细
+export function getMovementOrderDetail(id) {
+ return request({
+ url: '/wms/movementOrderDetail/' + id,
+ method: 'get'
+ })
+}
+
+// 新增库存移动详情
+export function addMovementOrderDetail(data) {
+ return request({
+ url: '/wms/movementOrderDetail',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改库存移动详情
+export function updateMovementOrderDetail(data) {
+ return request({
+ url: '/wms/movementOrderDetail',
+ method: 'put',
+ data: data
+ })
+}
+
+// 查询移库单详情列表
+export function listByMovementOrderId(movementOrderId) {
+ return request({
+ url: '/wms/movementOrderDetail/list/' + movementOrderId,
+ method: 'get'
+ })
+}
+
+// 删除库存移动详情
+export function delMovementOrderDetail(id) {
+ return request({
+ url: '/wms/movementOrderDetail/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/wms/receiptOrder.js b/src/api/wms/receiptOrder.js
new file mode 100644
index 0000000..ef0e201
--- /dev/null
+++ b/src/api/wms/receiptOrder.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询入库单列表
+export function listReceiptOrder(query) {
+ return request({
+ url: '/wms/receiptOrder/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询入库单详细
+export function getReceiptOrder(id) {
+ return request({
+ url: '/wms/receiptOrder/' + id,
+ method: 'get'
+ })
+}
+
+// 新增入库单
+export function addReceiptOrder(data) {
+ return request({
+ url: '/wms/receiptOrder',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改入库单
+export function updateReceiptOrder(data) {
+ return request({
+ url: '/wms/receiptOrder',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除入库单
+export function delReceiptOrder(id) {
+ return request({
+ url: '/wms/receiptOrder/' + id,
+ method: 'delete'
+ })
+}
+
+// 执行入库
+export function warehousing(data) {
+ return request({
+ url: '/wms/receiptOrder/warehousing',
+ method: 'post',
+ data: data
+ })
+}
+
+// 生成入库单号
+export function generateReceiptOrderNo() {
+ return request({
+ url: '/wms/receiptOrder/generate/no',
+ method: 'get'
+ })
+}
diff --git a/src/api/wms/receiptOrderDetail.js b/src/api/wms/receiptOrderDetail.js
new file mode 100644
index 0000000..8c5d413
--- /dev/null
+++ b/src/api/wms/receiptOrderDetail.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询入库单详情列表
+export function listReceiptOrderDetail(query) {
+ return request({
+ url: '/wms/receiptOrderDetail/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询入库单详情详细
+export function getReceiptOrderDetail(id) {
+ return request({
+ url: '/wms/receiptOrderDetail/' + id,
+ method: 'get'
+ })
+}
+
+// 新增入库单详情
+export function addReceiptOrderDetail(data) {
+ return request({
+ url: '/wms/receiptOrderDetail',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改入库单详情
+export function updateReceiptOrderDetail(data) {
+ return request({
+ url: '/wms/receiptOrderDetail',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除入库单详情
+export function delReceiptOrderDetail(id) {
+ return request({
+ url: '/wms/receiptOrderDetail/' + id,
+ method: 'delete'
+ })
+}
+
+// 查询入库单详情列表
+export function listByReceiptOrderId(receiptOrderId) {
+ return request({
+ url: '/wms/receiptOrderDetail/list/' + receiptOrderId,
+ method: 'get'
+ })
+}
diff --git a/src/api/wms/shipmentOrder.js b/src/api/wms/shipmentOrder.js
new file mode 100644
index 0000000..b2eea33
--- /dev/null
+++ b/src/api/wms/shipmentOrder.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询出库单列表
+export function listShipmentOrder(query) {
+ return request({
+ url: '/wms/shipmentOrder/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询出库单详细
+export function getShipmentOrder(id) {
+ return request({
+ url: '/wms/shipmentOrder/' + id,
+ method: 'get'
+ })
+}
+
+// 新增出库单
+export function addShipmentOrder(data) {
+ return request({
+ url: '/wms/shipmentOrder',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改出库单
+export function updateShipmentOrder(data) {
+ return request({
+ url: '/wms/shipmentOrder',
+ method: 'put',
+ data: data
+ })
+}
+
+// 出库
+export function shipment(data) {
+ return request({
+ url: '/wms/shipmentOrder/shipment',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除出库单
+export function delShipmentOrder(id) {
+ return request({
+ url: '/wms/shipmentOrder/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/wms/shipmentOrderDetail.js b/src/api/wms/shipmentOrderDetail.js
new file mode 100644
index 0000000..aadef66
--- /dev/null
+++ b/src/api/wms/shipmentOrderDetail.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询出库单详情列表
+export function listShipmentOrderDetail(query) {
+ return request({
+ url: '/wms/shipmentOrderDetail/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询出库单详情详细
+export function getShipmentOrderDetail(id) {
+ return request({
+ url: '/wms/shipmentOrderDetail/' + id,
+ method: 'get'
+ })
+}
+
+// 新增出库单详情
+export function addShipmentOrderDetail(data) {
+ return request({
+ url: '/wms/shipmentOrderDetail',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改出库单详情
+export function updateShipmentOrderDetail(data) {
+ return request({
+ url: '/wms/shipmentOrderDetail',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除出库单详情
+export function delShipmentOrderDetail(id) {
+ return request({
+ url: '/wms/shipmentOrderDetail/' + id,
+ method: 'delete'
+ })
+}
+
+// 查询出库单详情列表
+export function listByShipmentOrderId(shipmentOrderId) {
+ return request({
+ url: '/wms/shipmentOrderDetail/list/' + shipmentOrderId,
+ method: 'get'
+ })
+}
diff --git a/src/api/wms/warehouse.js b/src/api/wms/warehouse.js
new file mode 100644
index 0000000..035c009
--- /dev/null
+++ b/src/api/wms/warehouse.js
@@ -0,0 +1,85 @@
+import request from '@/utils/request'
+
+/**
+ * 查询仓库列表
+ * @param query
+ * @returns {*}
+ */
+
+export function listWarehouse(query) {
+ return request({
+ url: '/wms/warehouse/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询仓库列表
+ * @param query
+ * @returns {*}
+ */
+
+export function listWarehouseNoPage(query) {
+ return request({
+ url: '/wms/warehouse/listNoPage',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询仓库详细
+ * @param id
+ */
+export function getWarehouse(id) {
+ return request({
+ url: '/wms/warehouse/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增仓库
+ * @param data
+ */
+export function addWarehouse(data) {
+ return request({
+ url: '/wms/warehouse',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改仓库
+ * @param data
+ */
+export function updateWarehouse(data) {
+ return request({
+ url: '/wms/warehouse',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除仓库
+ * @param id
+ */
+export function delWarehouse(id) {
+ return request({
+ url: '/wms/warehouse/' + id,
+ method: 'delete'
+ });
+};
+
+export function updateOrderNum (data) {
+ return request({
+ url: '/wms/warehouse/update/orderNum',
+ method: 'post',
+ data: data
+ });
+};
+
+
diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif
new file mode 100644
index 0000000..cd6e0d9
Binary files /dev/null and b/src/assets/401_images/401.gif differ
diff --git a/src/assets/404_images/404.png b/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
Binary files /dev/null and b/src/assets/404_images/404.png differ
diff --git a/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
Binary files /dev/null and b/src/assets/404_images/404_cloud.png differ
diff --git a/src/assets/icons/svg/404.svg b/src/assets/icons/svg/404.svg
new file mode 100644
index 0000000..6df5019
--- /dev/null
+++ b/src/assets/icons/svg/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/bug.svg b/src/assets/icons/svg/bug.svg
new file mode 100644
index 0000000..05a150d
--- /dev/null
+++ b/src/assets/icons/svg/bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/build.svg b/src/assets/icons/svg/build.svg
new file mode 100644
index 0000000..97c4688
--- /dev/null
+++ b/src/assets/icons/svg/build.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/button.svg b/src/assets/icons/svg/button.svg
new file mode 100644
index 0000000..904fddc
--- /dev/null
+++ b/src/assets/icons/svg/button.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/cascader.svg b/src/assets/icons/svg/cascader.svg
new file mode 100644
index 0000000..e256024
--- /dev/null
+++ b/src/assets/icons/svg/cascader.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/chart.svg b/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/src/assets/icons/svg/chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/checkbox.svg b/src/assets/icons/svg/checkbox.svg
new file mode 100644
index 0000000..013fd3a
--- /dev/null
+++ b/src/assets/icons/svg/checkbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/clipboard.svg b/src/assets/icons/svg/clipboard.svg
new file mode 100644
index 0000000..90923ff
--- /dev/null
+++ b/src/assets/icons/svg/clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/code.svg b/src/assets/icons/svg/code.svg
new file mode 100644
index 0000000..5f9c5ab
--- /dev/null
+++ b/src/assets/icons/svg/code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/color.svg b/src/assets/icons/svg/color.svg
new file mode 100644
index 0000000..44a81aa
--- /dev/null
+++ b/src/assets/icons/svg/color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/component.svg b/src/assets/icons/svg/component.svg
new file mode 100644
index 0000000..29c3458
--- /dev/null
+++ b/src/assets/icons/svg/component.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/dashboard.svg b/src/assets/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/src/assets/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/date-range.svg b/src/assets/icons/svg/date-range.svg
new file mode 100644
index 0000000..fda571e
--- /dev/null
+++ b/src/assets/icons/svg/date-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/date.svg b/src/assets/icons/svg/date.svg
new file mode 100644
index 0000000..52dc73e
--- /dev/null
+++ b/src/assets/icons/svg/date.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/dict.svg b/src/assets/icons/svg/dict.svg
new file mode 100644
index 0000000..4849377
--- /dev/null
+++ b/src/assets/icons/svg/dict.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/documentation.svg b/src/assets/icons/svg/documentation.svg
new file mode 100644
index 0000000..7043122
--- /dev/null
+++ b/src/assets/icons/svg/documentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/download.svg b/src/assets/icons/svg/download.svg
new file mode 100644
index 0000000..c896951
--- /dev/null
+++ b/src/assets/icons/svg/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/drag.svg b/src/assets/icons/svg/drag.svg
new file mode 100644
index 0000000..4185d3c
--- /dev/null
+++ b/src/assets/icons/svg/drag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/druid.svg b/src/assets/icons/svg/druid.svg
new file mode 100644
index 0000000..a2b4b4e
--- /dev/null
+++ b/src/assets/icons/svg/druid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/edit.svg b/src/assets/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/src/assets/icons/svg/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/education.svg b/src/assets/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/src/assets/icons/svg/education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/email.svg b/src/assets/icons/svg/email.svg
new file mode 100644
index 0000000..74d25e2
--- /dev/null
+++ b/src/assets/icons/svg/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/example.svg b/src/assets/icons/svg/example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/src/assets/icons/svg/example.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/excel.svg b/src/assets/icons/svg/excel.svg
new file mode 100644
index 0000000..74d97b8
--- /dev/null
+++ b/src/assets/icons/svg/excel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/exit-fullscreen.svg b/src/assets/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/src/assets/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/eye-open.svg b/src/assets/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/src/assets/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/eye.svg b/src/assets/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/src/assets/icons/svg/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/form.svg b/src/assets/icons/svg/form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/src/assets/icons/svg/form.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/fullscreen.svg b/src/assets/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/src/assets/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/github.svg b/src/assets/icons/svg/github.svg
new file mode 100644
index 0000000..db0a0d4
--- /dev/null
+++ b/src/assets/icons/svg/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/guide.svg b/src/assets/icons/svg/guide.svg
new file mode 100644
index 0000000..b271001
--- /dev/null
+++ b/src/assets/icons/svg/guide.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/icon.svg b/src/assets/icons/svg/icon.svg
new file mode 100644
index 0000000..82be8ee
--- /dev/null
+++ b/src/assets/icons/svg/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/input.svg b/src/assets/icons/svg/input.svg
new file mode 100644
index 0000000..ab91381
--- /dev/null
+++ b/src/assets/icons/svg/input.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/international.svg b/src/assets/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/src/assets/icons/svg/international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/job.svg b/src/assets/icons/svg/job.svg
new file mode 100644
index 0000000..2a93a25
--- /dev/null
+++ b/src/assets/icons/svg/job.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/language.svg b/src/assets/icons/svg/language.svg
new file mode 100644
index 0000000..0082b57
--- /dev/null
+++ b/src/assets/icons/svg/language.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/link.svg b/src/assets/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/src/assets/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/list.svg b/src/assets/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/src/assets/icons/svg/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/lock.svg b/src/assets/icons/svg/lock.svg
new file mode 100644
index 0000000..74fee54
--- /dev/null
+++ b/src/assets/icons/svg/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/log.svg b/src/assets/icons/svg/log.svg
new file mode 100644
index 0000000..d879d33
--- /dev/null
+++ b/src/assets/icons/svg/log.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/logininfor.svg b/src/assets/icons/svg/logininfor.svg
new file mode 100644
index 0000000..267f844
--- /dev/null
+++ b/src/assets/icons/svg/logininfor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/message.svg b/src/assets/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/src/assets/icons/svg/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/money.svg b/src/assets/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/src/assets/icons/svg/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/monitor.svg b/src/assets/icons/svg/monitor.svg
new file mode 100644
index 0000000..bc308cb
--- /dev/null
+++ b/src/assets/icons/svg/monitor.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/nested.svg b/src/assets/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/src/assets/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/number.svg b/src/assets/icons/svg/number.svg
new file mode 100644
index 0000000..ad5ce9a
--- /dev/null
+++ b/src/assets/icons/svg/number.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/online.svg b/src/assets/icons/svg/online.svg
new file mode 100644
index 0000000..330a202
--- /dev/null
+++ b/src/assets/icons/svg/online.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/password.svg b/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..6c64def
--- /dev/null
+++ b/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/pdf.svg b/src/assets/icons/svg/pdf.svg
new file mode 100644
index 0000000..957aa0c
--- /dev/null
+++ b/src/assets/icons/svg/pdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/people.svg b/src/assets/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/src/assets/icons/svg/people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/peoples.svg b/src/assets/icons/svg/peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/src/assets/icons/svg/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/phone.svg b/src/assets/icons/svg/phone.svg
new file mode 100644
index 0000000..ab8e8c4
--- /dev/null
+++ b/src/assets/icons/svg/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/post.svg b/src/assets/icons/svg/post.svg
new file mode 100644
index 0000000..2922c61
--- /dev/null
+++ b/src/assets/icons/svg/post.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/qq.svg b/src/assets/icons/svg/qq.svg
new file mode 100644
index 0000000..ee13d4e
--- /dev/null
+++ b/src/assets/icons/svg/qq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/question.svg b/src/assets/icons/svg/question.svg
new file mode 100644
index 0000000..cf75bd4
--- /dev/null
+++ b/src/assets/icons/svg/question.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/radio.svg b/src/assets/icons/svg/radio.svg
new file mode 100644
index 0000000..0cde345
--- /dev/null
+++ b/src/assets/icons/svg/radio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/rate.svg b/src/assets/icons/svg/rate.svg
new file mode 100644
index 0000000..aa3b14d
--- /dev/null
+++ b/src/assets/icons/svg/rate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/redis-list.svg b/src/assets/icons/svg/redis-list.svg
new file mode 100644
index 0000000..98a15b2
--- /dev/null
+++ b/src/assets/icons/svg/redis-list.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/redis.svg b/src/assets/icons/svg/redis.svg
new file mode 100644
index 0000000..2f1d62d
--- /dev/null
+++ b/src/assets/icons/svg/redis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/row.svg b/src/assets/icons/svg/row.svg
new file mode 100644
index 0000000..0780992
--- /dev/null
+++ b/src/assets/icons/svg/row.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/search.svg b/src/assets/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/src/assets/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/select.svg b/src/assets/icons/svg/select.svg
new file mode 100644
index 0000000..d628382
--- /dev/null
+++ b/src/assets/icons/svg/select.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/server.svg b/src/assets/icons/svg/server.svg
new file mode 100644
index 0000000..eb287e3
--- /dev/null
+++ b/src/assets/icons/svg/server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/shopping.svg b/src/assets/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/src/assets/icons/svg/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/size.svg b/src/assets/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/src/assets/icons/svg/size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/skill.svg b/src/assets/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/src/assets/icons/svg/skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/slider.svg b/src/assets/icons/svg/slider.svg
new file mode 100644
index 0000000..fbe4f39
--- /dev/null
+++ b/src/assets/icons/svg/slider.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/star.svg b/src/assets/icons/svg/star.svg
new file mode 100644
index 0000000..6cf86e6
--- /dev/null
+++ b/src/assets/icons/svg/star.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/swagger.svg b/src/assets/icons/svg/swagger.svg
new file mode 100644
index 0000000..05d4e7b
--- /dev/null
+++ b/src/assets/icons/svg/swagger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/switch.svg b/src/assets/icons/svg/switch.svg
new file mode 100644
index 0000000..0ba61e3
--- /dev/null
+++ b/src/assets/icons/svg/switch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/system.svg b/src/assets/icons/svg/system.svg
new file mode 100644
index 0000000..5992593
--- /dev/null
+++ b/src/assets/icons/svg/system.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/tab.svg b/src/assets/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/src/assets/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/table.svg b/src/assets/icons/svg/table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/src/assets/icons/svg/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/textarea.svg b/src/assets/icons/svg/textarea.svg
new file mode 100644
index 0000000..2709f29
--- /dev/null
+++ b/src/assets/icons/svg/textarea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/theme.svg b/src/assets/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/src/assets/icons/svg/theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/time-range.svg b/src/assets/icons/svg/time-range.svg
new file mode 100644
index 0000000..13c1202
--- /dev/null
+++ b/src/assets/icons/svg/time-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/time.svg b/src/assets/icons/svg/time.svg
new file mode 100644
index 0000000..b376e32
--- /dev/null
+++ b/src/assets/icons/svg/time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/tool.svg b/src/assets/icons/svg/tool.svg
new file mode 100644
index 0000000..48e0e35
--- /dev/null
+++ b/src/assets/icons/svg/tool.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/tree-table.svg b/src/assets/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/src/assets/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/tree.svg b/src/assets/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/src/assets/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/upload.svg b/src/assets/icons/svg/upload.svg
new file mode 100644
index 0000000..bae49c0
--- /dev/null
+++ b/src/assets/icons/svg/upload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/user.svg b/src/assets/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/src/assets/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/validCode.svg b/src/assets/icons/svg/validCode.svg
new file mode 100644
index 0000000..cfb1021
--- /dev/null
+++ b/src/assets/icons/svg/validCode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/wechat.svg b/src/assets/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/src/assets/icons/svg/wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/zip.svg b/src/assets/icons/svg/zip.svg
new file mode 100644
index 0000000..f806fc4
--- /dev/null
+++ b/src/assets/icons/svg/zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/images/dark.svg b/src/assets/images/dark.svg
new file mode 100644
index 0000000..f646bd7
--- /dev/null
+++ b/src/assets/images/dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/assets/images/light.svg b/src/assets/images/light.svg
new file mode 100644
index 0000000..ab7cc08
--- /dev/null
+++ b/src/assets/images/light.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/assets/images/login-background.jpg b/src/assets/images/login-background.jpg
new file mode 100644
index 0000000..fa6408b
Binary files /dev/null and b/src/assets/images/login-background.jpg differ
diff --git a/src/assets/logo/gzh.jpg b/src/assets/logo/gzh.jpg
new file mode 100644
index 0000000..ac31284
Binary files /dev/null and b/src/assets/logo/gzh.jpg differ
diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png
new file mode 100644
index 0000000..e5127ac
Binary files /dev/null and b/src/assets/logo/logo.png differ
diff --git a/src/assets/styles/btn.scss b/src/assets/styles/btn.scss
new file mode 100644
index 0000000..3590d8d
--- /dev/null
+++ b/src/assets/styles/btn.scss
@@ -0,0 +1,99 @@
+@import './variables.module.scss';
+
+@mixin colorBtn($color) {
+ background: $color;
+
+ &:hover {
+ color: $color;
+
+ &:before,
+ &:after {
+ background: $color;
+ }
+ }
+}
+
+.blue-btn {
+ @include colorBtn($blue)
+}
+
+.light-blue-btn {
+ @include colorBtn($light-blue)
+}
+
+.red-btn {
+ @include colorBtn($red)
+}
+
+.pink-btn {
+ @include colorBtn($pink)
+}
+
+.green-btn {
+ @include colorBtn($green)
+}
+
+.tiffany-btn {
+ @include colorBtn($tiffany)
+}
+
+.yellow-btn {
+ @include colorBtn($yellow)
+}
+
+.pan-btn {
+ font-size: 14px;
+ color: #fff;
+ padding: 14px 36px;
+ border-radius: 8px;
+ border: none;
+ outline: none;
+ transition: 600ms ease all;
+ position: relative;
+ display: inline-block;
+
+ &:hover {
+ background: #fff;
+
+ &:before,
+ &:after {
+ width: 100%;
+ transition: 600ms ease all;
+ }
+ }
+
+ &:before,
+ &:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 2px;
+ width: 0;
+ transition: 400ms ease all;
+ }
+
+ &::after {
+ right: inherit;
+ top: inherit;
+ left: 0;
+ bottom: 0;
+ }
+}
+
+.custom-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ color: #fff;
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ padding: 10px 15px;
+ font-size: 14px;
+ border-radius: 4px;
+}
diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss
new file mode 100644
index 0000000..0f175f2
--- /dev/null
+++ b/src/assets/styles/element-ui.scss
@@ -0,0 +1,96 @@
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+ font-weight: 400 !important;
+}
+
+.el-upload {
+ input[type="file"] {
+ display: none !important;
+ }
+}
+
+.el-upload__input {
+ display: none;
+}
+
+.cell {
+ .el-tag {
+ margin-right: 0px;
+ }
+}
+
+.small-padding {
+ .cell {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+.fixed-width {
+ .el-button--mini {
+ padding: 7px 10px;
+ width: 60px;
+ }
+}
+
+.status-col {
+ .cell {
+ padding: 0 10px;
+ text-align: center;
+
+ .el-tag {
+ margin-right: 0px;
+ }
+ }
+}
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+ transform: none;
+ left: 0;
+ position: relative;
+ margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+ .el-upload {
+ width: 100%;
+
+ .el-upload-dragger {
+ width: 100%;
+ height: 200px;
+ }
+ }
+}
+
+// dropdown
+.el-dropdown-menu {
+ a {
+ display: block
+ }
+}
+
+// fix date-picker ui bug in filter-item
+.el-range-editor.el-input__inner {
+ display: inline-flex !important;
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+ box-sizing: content-box;
+}
+
+.el-menu--collapse
+ > div
+ > .el-submenu
+ > .el-submenu__title
+ .el-submenu__icon-arrow {
+ display: none;
+}
+
+.el-dropdown .el-dropdown-link{
+ color: var(--el-color-primary) !important;
+}
\ No newline at end of file
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
new file mode 100644
index 0000000..2b8dca5
--- /dev/null
+++ b/src/assets/styles/index.scss
@@ -0,0 +1,184 @@
+@import './variables.module.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './btn.scss';
+@import './ruoyi.scss';
+
+body {
+ height: 100%;
+ margin: 0;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+ font-weight: 700;
+}
+
+html {
+ height: 100%;
+ box-sizing: border-box;
+}
+
+#app {
+ height: 100%;
+}
+
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+
+.no-padding {
+ padding: 0px !important;
+}
+
+.padding-content {
+ padding: 4px 0;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+ cursor: pointer;
+ color: inherit;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
+
+.fr {
+ float: right;
+}
+
+.fl {
+ float: left;
+}
+
+.pr-5 {
+ padding-right: 5px;
+}
+
+.pl-5 {
+ padding-left: 5px;
+}
+
+.block {
+ display: block;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.inlineBlock {
+ display: block;
+}
+
+.clearfix {
+ &:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+}
+
+aside {
+ background: #eef1f6;
+ padding: 8px 24px;
+ margin-bottom: 20px;
+ border-radius: 2px;
+ display: block;
+ line-height: 32px;
+ font-size: 16px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+ color: #2c3e50;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ a {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+ }
+}
+
+//main-container全局样式
+.app-container {
+ padding: 20px;
+}
+
+.components-container {
+ margin: 30px 50px;
+ position: relative;
+}
+
+.pagination-container {
+ margin-top: 30px;
+}
+
+.text-center {
+ text-align: center
+}
+
+.sub-navbar {
+ height: 50px;
+ line-height: 50px;
+ position: relative;
+ width: 100%;
+ text-align: right;
+ padding-right: 20px;
+ transition: 600ms ease position;
+ background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+
+ .subtitle {
+ font-size: 20px;
+ color: #fff;
+ }
+
+ &.draft {
+ background: #d0d0d0;
+ }
+
+ &.deleted {
+ background: #d0d0d0;
+ }
+}
+
+.link-type,
+.link-type:focus {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+}
+
+.filter-container {
+ padding-bottom: 10px;
+
+ .filter-item {
+ display: inline-block;
+ vertical-align: middle;
+ margin-bottom: 10px;
+ }
+}
diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss
new file mode 100644
index 0000000..06fa061
--- /dev/null
+++ b/src/assets/styles/mixin.scss
@@ -0,0 +1,66 @@
+@mixin clearfix {
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+@mixin scrollBar {
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+}
+
+@mixin relative {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+@mixin pct($pct) {
+ width: #{$pct};
+ position: relative;
+ margin: 0 auto;
+}
+
+@mixin triangle($width, $height, $color, $direction) {
+ $width: $width/2;
+ $color-border-style: $height solid $color;
+ $transparent-border-style: $width solid transparent;
+ height: 0;
+ width: 0;
+
+ @if $direction==up {
+ border-bottom: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==right {
+ border-left: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+
+ @else if $direction==down {
+ border-top: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==left {
+ border-right: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+}
diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss
new file mode 100644
index 0000000..6deeef1
--- /dev/null
+++ b/src/assets/styles/ruoyi.scss
@@ -0,0 +1,320 @@
+ /**
+ * 通用css样式布局处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+ /** 基础通用 **/
+.pt5 {
+ padding-top: 5px;
+}
+.pr5 {
+ padding-right: 5px;
+}
+.pb5 {
+ padding-bottom: 5px;
+}
+.mt5 {
+ margin-top: 5px;
+}
+.mr5 {
+ margin-right: 5px;
+}
+.mb5 {
+ margin-bottom: 5px;
+}
+.mb8 {
+ margin-bottom: 8px;
+}
+.ml5 {
+ margin-left: 5px;
+}
+.mt10 {
+ margin-top: 10px;
+}
+.mr10 {
+ margin-right: 10px;
+}
+.mb10 {
+ margin-bottom: 10px;
+}
+.ml10 {
+ margin-left: 10px;
+}
+.mt20 {
+ margin-top: 20px;
+}
+.mr20 {
+ margin-right: 20px;
+}
+.mb20 {
+ margin-bottom: 20px;
+}
+.ml20 {
+ margin-left: 20px;
+}
+
+.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+
+.el-form .el-form-item__label {
+ font-weight: 700;
+}
+.el-dialog:not(.is-fullscreen) {
+ margin-top: 6vh !important;
+}
+
+.el-dialog.scrollbar .el-dialog__body {
+ overflow: auto;
+ overflow-x: hidden;
+ max-height: 70vh;
+ padding: 10px 20px 0;
+}
+
+.el-table {
+ .el-table__header-wrapper, .el-table__fixed-header-wrapper {
+ th {
+ word-break: break-word;
+ background-color: #f8f8f9 !important;
+ color: #515a6e;
+ height: 40px !important;
+ font-size: 13px;
+ }
+ }
+ .el-table__body-wrapper {
+ .el-button [class*="el-icon-"] + span {
+ margin-left: 1px;
+ }
+ }
+}
+
+/** 表单布局 **/
+.form-header {
+ font-size:15px;
+ color:#6379bb;
+ border-bottom:1px solid #ddd;
+ margin:8px 10px 25px 10px;
+ padding-bottom:5px
+}
+
+/** 表格布局 **/
+.pagination-container {
+ // position: relative;
+ height: 25px;
+ margin-bottom: 10px;
+ margin-top: 15px;
+ padding: 10px 20px !important;
+}
+
+/* tree border */
+.tree-border {
+ margin-top: 5px;
+ border: 1px solid #e5e6e7;
+ background: #FFFFFF none;
+ border-radius:4px;
+ width: 100%;
+}
+
+.pagination-container .el-pagination {
+ right: 0;
+ position: absolute;
+}
+
+@media ( max-width : 768px) {
+ .pagination-container .el-pagination > .el-pagination__jump {
+ display: none !important;
+ }
+ .pagination-container .el-pagination > .el-pagination__sizes {
+ display: none !important;
+ }
+}
+
+.el-table .fixed-width .el-button--small {
+ padding-left: 0;
+ padding-right: 0;
+ width: inherit;
+}
+
+/** 表格更多操作下拉样式 */
+.el-table .el-dropdown-link {
+ cursor: pointer;
+ color: #409EFF;
+ margin-left: 10px;
+}
+
+.el-table .el-dropdown, .el-icon-arrow-down {
+ font-size: 12px;
+}
+
+.el-tree-node__content > .el-checkbox {
+ margin-right: 8px;
+}
+
+.list-group-striped > .list-group-item {
+ border-left: 0;
+ border-right: 0;
+ border-radius: 0;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.list-group {
+ padding-left: 0px;
+ list-style: none;
+}
+
+.list-group-item {
+ border-bottom: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
+ margin-bottom: -1px;
+ padding: 11px 0px;
+ font-size: 13px;
+}
+
+.pull-right {
+ float: right !important;
+}
+
+.el-card__header {
+ padding: 14px 15px 7px !important;
+ min-height: 40px;
+}
+
+.el-card__body {
+ padding: 15px 20px 20px 20px !important;
+}
+
+.card-box {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-bottom: 10px;
+}
+
+/* button color */
+.el-button--cyan.is-active,
+.el-button--cyan:active {
+ background: #20B2AA;
+ border-color: #20B2AA;
+ color: #FFFFFF;
+}
+
+.el-button--cyan:focus,
+.el-button--cyan:hover {
+ background: #48D1CC;
+ border-color: #48D1CC;
+ color: #FFFFFF;
+}
+
+.el-button--cyan {
+ background-color: #20B2AA;
+ border-color: #20B2AA;
+ color: #FFFFFF;
+}
+
+/* text color */
+.text-navy {
+ color: #1ab394;
+}
+
+.text-primary {
+ color: inherit;
+}
+
+.text-success {
+ color: #1c84c6;
+}
+
+.text-info {
+ color: #23c6c8;
+}
+
+.text-warning {
+ color: #f8ac59;
+}
+
+.text-danger {
+ color: #ed5565;
+}
+
+.text-muted {
+ color: #888888;
+}
+
+/* image */
+.img-circle {
+ border-radius: 50%;
+}
+
+.img-lg {
+ width: 120px;
+ height: 120px;
+}
+
+.avatar-upload-preview {
+ position: absolute;
+ top: 50%;
+ transform: translate(50%, -50%);
+ width: 200px;
+ height: 200px;
+ border-radius: 50%;
+ box-shadow: 0 0 4px #ccc;
+ overflow: hidden;
+}
+
+/* 拖拽列样式 */
+.sortable-ghost{
+ opacity: .8;
+ color: #fff!important;
+ background: #42b983!important;
+}
+
+/* 表格右侧工具栏样式 */
+.top-right-btn {
+ margin-left: auto;
+}
+
+ .add-btn {
+ border: 1px dotted #409EFF!important;
+ width: 98%
+ }
+
+ .footer-global {
+ border-top: 1px solid silver;
+ position: fixed;
+ display: flex;
+ flex-direction: row-reverse;
+ align-items: center;
+ right: 0;
+ bottom: 0;
+ //padding: 12px;
+ box-shadow: -1px 0 12px 0 var(--gray-5);
+ transition: all .28s;
+ background-color: white;
+ z-index: 200;
+ left: 0;
+ height: 50px;
+ margin-bottom: 0 !important;
+ }
+
+ .tc {
+ text-align: center;
+ }
+
+ .flex-center {
+ display: flex;
+ align-items: center;
+ }
+
+ .flex-space-between {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .col4 {
+ width: calc(25% - 1rem) !important;
+ margin-right: 0px !important;
+ }
diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
new file mode 100644
index 0000000..58911cb
--- /dev/null
+++ b/src/assets/styles/sidebar.scss
@@ -0,0 +1,236 @@
+#app {
+
+ .main-container {
+ height: 100%;
+ transition: margin-left .28s;
+ margin-left: $base-sidebar-width;
+ position: relative;
+ }
+
+ .sidebarHide {
+ margin-left: 0!important;
+ }
+
+ .sidebar-container {
+ -webkit-transition: width .28s;
+ transition: width 0.28s;
+ width: $base-sidebar-width !important;
+ background-color: $base-menu-background;
+ height: 100%;
+ position: fixed;
+ font-size: 0px;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1001;
+ overflow: hidden;
+
+ // reset element-ui css
+ .horizontal-collapse-transition {
+ transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+ }
+
+ .scrollbar-wrapper {
+ overflow-x: hidden !important;
+ }
+
+ .el-scrollbar__bar.is-vertical {
+ right: 0px;
+ }
+
+ .el-scrollbar {
+ height: 100%;
+ }
+
+ &.has-logo {
+ .el-scrollbar {
+ height: calc(100% - 50px);
+ }
+ }
+
+ .is-horizontal {
+ display: none;
+ }
+
+ a {
+ display: inline-block;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .svg-icon {
+ margin-right: 16px;
+ }
+
+ .el-menu {
+ border: none;
+ height: 100%;
+ width: 100% !important;
+ }
+
+ .el-menu-item, .menu-title {
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+ }
+
+ .el-menu-item .el-menu-tooltip__trigger {
+ display: inline-block !important;
+ }
+
+ // menu hover
+ .sub-menu-title-noDropdown,
+ .el-sub-menu__title {
+ &:hover {
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ & .theme-dark .is-active > .el-sub-menu__title {
+ color: $base-menu-color-active !important;
+ }
+
+ & .nest-menu .el-sub-menu>.el-sub-menu__title,
+ & .el-sub-menu .el-menu-item {
+ min-width: $base-sidebar-width !important;
+
+ &:hover {
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ & .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title,
+ & .theme-dark .el-sub-menu .el-menu-item {
+ background-color: $base-sub-menu-background !important;
+
+ &:hover {
+ background-color: $base-sub-menu-hover !important;
+ }
+ }
+ }
+
+ .hideSidebar {
+ .sidebar-container {
+ width: 54px !important;
+ }
+
+ .main-container {
+ margin-left: 54px;
+ }
+
+ .sub-menu-title-noDropdown {
+ padding: 0 !important;
+ position: relative;
+
+ .el-tooltip {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+ }
+ }
+
+ .el-sub-menu {
+ overflow: hidden;
+
+ &>.el-sub-menu__title {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+
+ }
+ }
+
+ .el-menu--collapse {
+ .el-sub-menu {
+ &>.el-sub-menu__title {
+ &>span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ &>i {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ }
+ }
+ }
+ }
+
+ .el-menu--collapse .el-menu .el-sub-menu {
+ min-width: $base-sidebar-width !important;
+ }
+
+ // mobile responsive
+ .mobile {
+ .main-container {
+ margin-left: 0px;
+ }
+
+ .sidebar-container {
+ transition: transform .28s;
+ width: $base-sidebar-width !important;
+ }
+
+ &.hideSidebar {
+ .sidebar-container {
+ pointer-events: none;
+ transition-duration: 0.3s;
+ transform: translate3d(-$base-sidebar-width, 0, 0);
+ }
+ }
+ }
+
+ .withoutAnimation {
+
+ .main-container,
+ .sidebar-container {
+ transition: none;
+ }
+ }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+ &>.el-menu {
+ .svg-icon {
+ margin-right: 16px;
+ }
+ }
+
+ .nest-menu .el-sub-menu>.el-sub-menu__title,
+ .el-menu-item {
+ &:hover {
+ // you can use $sub-menuHover
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ // the scroll bar appears when the sub-menu is too long
+ >.el-menu--popup {
+ max-height: 100vh;
+ overflow-y: auto;
+
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+ }
+}
diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss
new file mode 100644
index 0000000..073f8c6
--- /dev/null
+++ b/src/assets/styles/transition.scss
@@ -0,0 +1,49 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+ transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+ opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform--move,
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+ transition: all .5s;
+}
+
+.fade-transform-enter {
+ opacity: 0;
+ transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+ opacity: 0;
+ transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+ transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+ opacity: 0;
+ transform: translateX(20px);
+}
+
+.breadcrumb-move {
+ transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+ position: absolute;
+}
diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss
new file mode 100644
index 0000000..cffecdd
--- /dev/null
+++ b/src/assets/styles/variables.module.scss
@@ -0,0 +1,50 @@
+// base color
+$blue: #324157;
+$light-blue: #3A71A8;
+$red: #C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow: #FEC171;
+$panGreen: #30B08F;
+
+// 默认菜单主题风格
+$base-menu-color: #bfcbd9;
+$base-menu-color-active: #f4f4f5;
+$base-menu-background: #304156;
+$base-logo-title-color: #ffffff;
+
+$base-menu-light-color: rgba(0, 0, 0, 0.7);
+$base-menu-light-background: #F8F9FD;
+$base-logo-light-title-color: #001529;
+
+$base-sub-menu-background: #1f2d3d;
+$base-sub-menu-hover: #001528;
+
+$--color-primary: #409EFF;
+$--color-success: #67C23A;
+$--color-warning: #E6A23C;
+$--color-danger: #F56C6C;
+$--color-info: #909399;
+
+$base-sidebar-width: 200px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ menuColor: $base-menu-color;
+ menuLightColor: $base-menu-light-color;
+ menuColorActive: $base-menu-color-active;
+ menuBackground: $base-menu-background;
+ menuLightBackground: $base-menu-light-background;
+ subMenuBackground: $base-sub-menu-background;
+ subMenuHover: $base-sub-menu-hover;
+ sideBarWidth: $base-sidebar-width;
+ logoTitleColor: $base-logo-title-color;
+ logoLightTitleColor: $base-logo-light-title-color;
+ primaryColor: $--color-primary;
+ successColor: $--color-success;
+ dangerColor: $--color-danger;
+ infoColor: $--color-info;
+ warningColor: $--color-warning;
+}
diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..489cba1
--- /dev/null
+++ b/src/components/Breadcrumb/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+ {{ item.meta.title }}
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/DictTag/index.vue b/src/components/DictTag/index.vue
new file mode 100644
index 0000000..7d0888c
--- /dev/null
+++ b/src/components/DictTag/index.vue
@@ -0,0 +1,82 @@
+
+
+
+
+ {{ item.label + " " }}
+ {{ item.label + " " }}
+
+
+
+ {{ unmatchArray | handleArray }}
+
+
+
+
+
+
+
diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue
new file mode 100644
index 0000000..4b19833
--- /dev/null
+++ b/src/components/Editor/index.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+ $emit('update:modelValue', content)"
+ :options="options"
+ :style="styles"
+ />
+
+
+
+
+
+
+
diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
new file mode 100644
index 0000000..a5c2734
--- /dev/null
+++ b/src/components/FileUpload/index.vue
@@ -0,0 +1,218 @@
+
+
+
+
+ 选取文件
+
+
+
+ 请上传
+ 大小不超过 {{ fileSize }}MB
+ 格式为 {{ fileType.join("/") }}
+ 的文件
+
+
+
+
+
+ {{ getFileName(file.name) }}
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue
new file mode 100644
index 0000000..18c201e
--- /dev/null
+++ b/src/components/Hamburger/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue
new file mode 100644
index 0000000..a1aca22
--- /dev/null
+++ b/src/components/HeaderSearch/index.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue
new file mode 100644
index 0000000..059e889
--- /dev/null
+++ b/src/components/IconSelect/index.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
diff --git a/src/components/IconSelect/requireIcons.js b/src/components/IconSelect/requireIcons.js
new file mode 100644
index 0000000..ac22fd7
--- /dev/null
+++ b/src/components/IconSelect/requireIcons.js
@@ -0,0 +1,8 @@
+let icons = []
+const modules = import.meta.glob('./../../assets/icons/svg/*.svg');
+for (const path in modules) {
+ const p = path.split('assets/icons/svg/')[1].split('.svg')[0];
+ icons.push(p);
+}
+
+export default icons
\ No newline at end of file
diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue
new file mode 100644
index 0000000..1dfe123
--- /dev/null
+++ b/src/components/ImagePreview/index.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue
new file mode 100644
index 0000000..8cad89c
--- /dev/null
+++ b/src/components/ImageUpload/index.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+ 请上传
+
+ 大小不超过 {{ fileSize }}MB
+
+
+ 格式为 {{ fileType.join("/") }}
+
+ 的文件
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue
new file mode 100644
index 0000000..38de953
--- /dev/null
+++ b/src/components/Pagination/index.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/ParentView/index.vue b/src/components/ParentView/index.vue
new file mode 100644
index 0000000..7bf6148
--- /dev/null
+++ b/src/components/ParentView/index.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/components/PrintTemplate/check-panel.js b/src/components/PrintTemplate/check-panel.js
new file mode 100644
index 0000000..fee7c9a
--- /dev/null
+++ b/src/components/PrintTemplate/check-panel.js
@@ -0,0 +1,691 @@
+export default {
+ "panels": [
+ {
+ "index": 0,
+ "name": 1,
+ "height": 297,
+ "width": 210,
+ "paperHeader": 49.5,
+ "paperFooter": 780,
+ "printElements": [
+ {
+ "options": {
+ "left": 402.5,
+ "top": 35,
+ "height": 40,
+ "width": 160,
+ "title": "条形码",
+ "barcodeType": "code128",
+ "testData": "barcode",
+ "textType": "barcode",
+ "fields": [
+ {
+ "text": "移库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ }
+ ],
+ "field": "checkOrderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false
+ },
+ "printElementType": {
+ "title": "条形码",
+ "type": "barcode"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 42.5,
+ "height": 27,
+ "width": 350,
+ "fields": [
+ {
+ "text": "出库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ },
+ {
+ "text": "仓库",
+ "field": "warehouse"
+ },
+ {
+ "text": "库区",
+ "field": "area"
+ }
+ ],
+ "title": "盘库单",
+ "field": "checkOrderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "fontSize": 18,
+ "fontWeight": "600",
+ "lineHeight": 26.25,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 97.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "盘库状态",
+ "field": "checkOrderStatus",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 139.5,
+ "bottom": 108,
+ "vCenter": 79.5,
+ "hCenter": 103.125
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 97.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "盈亏数",
+ "field": "checkOrderTotal",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 122.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "仓库",
+ "field": "warehouseName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 122.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "库区",
+ "field": "areaName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 147.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "创建人",
+ "field": "createBy",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 147.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "创建时间",
+ "field": "createTime",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 172.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "操作人",
+ "field": "updateBy",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 172.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "操作时间",
+ "field": "updateTime",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 197.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "备注",
+ "field": "remark",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 17.5,
+ "top": 222.5,
+ "height": 54,
+ "width": 550,
+ "field": "table",
+ "groupFieldsFormatter": "function(type,options,data){ return [\"name\"] }",
+ "columns": [
+ [
+ {
+ "width": 78.57142857142857,
+ "title": "商品名称",
+ "field": "itemName",
+ "checked": true,
+ "columnId": "itemName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "规格名称",
+ "field": "skuName",
+ "checked": true,
+ "columnId": "skuName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 90,
+ "title": "库区",
+ "field": "areaName",
+ "checked": true,
+ "columnId": "areaName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "批号",
+ "field": "batchNo",
+ "checked": true,
+ "columnId": "batchNo",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "生产日期",
+ "field": "productionDate",
+ "checked": true,
+ "columnId": "productionDate",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "过期日期",
+ "field": "expirationDate",
+ "checked": true,
+ "columnId": "expirationDate",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "入库时间",
+ "field": "receiptTime",
+ "checked": true,
+ "columnId": "receiptTime",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "align": "right",
+ "title": "账面库存",
+ "field": "quantity",
+ "checked": true,
+ "columnId": "quantity",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ "tableSummary": "sum",
+ "tableSummaryAlign": "right",
+ "tableSummaryNumFormat": "0"
+ },
+ {
+ "width": 78.57142857142857,
+ "align": "right",
+ "title": "盈亏数",
+ "field": "profitAndLoss",
+ "checked": true,
+ "columnId": "profitAndLoss",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ "tableSummary": "sum",
+ "tableSummaryAlign": "right",
+ "tableSummaryNumFormat": "0"
+ },
+ {
+ "width": 78.57142857142857,
+ "align": "right",
+ "title": "实际库存",
+ "field": "checkQuantity",
+ "checked": true,
+ "columnId": "checkQuantity",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ "tableSummary": "sum",
+ "tableSummaryAlign": "right",
+ "tableSummaryNumFormat": "0"
+ }
+ ]
+ ]
+ },
+ "printElementType": {
+ "title": "表格",
+ "type": "table",
+ "editable": true,
+ "columnDisplayEditable": true,
+ "columnDisplayIndexEditable": true,
+ "columnTitleEditable": true,
+ "columnResizable": true,
+ "columnAlignEditable": true,
+ "isEnableEditField": true,
+ "isEnableContextMenu": true,
+ "isEnableInsertRow": true,
+ "isEnableDeleteRow": true,
+ "isEnableInsertColumn": true,
+ "isEnableDeleteColumn": true,
+ "isEnableMergeCell": true
+ }
+ }
+ ],
+ "paperNumberLeft": 565.5,
+ "paperNumberTop": 819,
+ "paperNumberContinue": true,
+ "watermarkOptions": {}
+ }
+ ]
+};
diff --git a/src/components/PrintTemplate/movement-panel.js b/src/components/PrintTemplate/movement-panel.js
new file mode 100644
index 0000000..0bcb742
--- /dev/null
+++ b/src/components/PrintTemplate/movement-panel.js
@@ -0,0 +1,761 @@
+export default {
+ "panels": [
+ {
+ "index": 0,
+ "name": 1,
+ "height": 297,
+ "width": 210,
+ "paperHeader": 49.5,
+ "paperFooter": 780,
+ "printElements": [
+ {
+ "options": {
+ "left": 402.5,
+ "top": 35,
+ "height": 40,
+ "width": 160,
+ "title": "条形码",
+ "barcodeType": "code128",
+ "testData": "barcode",
+ "textType": "barcode",
+ "fields": [
+ {
+ "text": "移库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ }
+ ],
+ "field": "movementOrderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false
+ },
+ "printElementType": {
+ "title": "条形码",
+ "type": "barcode"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 42.5,
+ "height": 27,
+ "width": 350,
+ "fields": [
+ {
+ "text": "出库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ },
+ {
+ "text": "仓库",
+ "field": "warehouse"
+ },
+ {
+ "text": "库区",
+ "field": "area"
+ }
+ ],
+ "title": "移库单",
+ "field": "movementOrderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "fontSize": 18,
+ "fontWeight": "600",
+ "lineHeight": 26.25,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 97.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "移库状态",
+ "field": "movementOrderStatus",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 139.5,
+ "bottom": 108,
+ "vCenter": 79.5,
+ "hCenter": 103.125
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 97.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "数量",
+ "field": "totalQuantity",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 122.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "源仓库",
+ "field": "sourceWarehouseName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 122.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "源库区",
+ "field": "sourceAreaName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 147.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "目标仓库",
+ "field": "targetWarehouseName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 147.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "目标库区",
+ "field": "targetAreaName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 172.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "创建人",
+ "field": "createBy",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 172.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "创建时间",
+ "field": "createTime",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 197.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "操作人",
+ "field": "updateBy",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 197.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "操作时间",
+ "field": "updateTime",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 17.5,
+ "top": 247.5,
+ "height": 54,
+ "width": 550,
+ "field": "table",
+ "groupFieldsFormatter": "function(type,options,data){ return [\"name\"] }",
+ "columns": [
+ [
+ {
+ "width": 78.57142857142857,
+ "title": "商品名称",
+ "field": "itemName",
+ "checked": true,
+ "columnId": "itemName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "规格名称",
+ "field": "skuName",
+ "checked": true,
+ "columnId": "skuName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 90,
+ "title": "源库区",
+ "field": "sourceAreaName",
+ "checked": true,
+ "columnId": "sourceAreaName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 90,
+ "title": "目标库区",
+ "field": "targetAreaName",
+ "checked": true,
+ "columnId": "targetAreaName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "批号",
+ "field": "batchNo",
+ "checked": true,
+ "columnId": "batchNo",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "生产日期",
+ "field": "productionDate",
+ "checked": true,
+ "columnId": "productionDate",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "过期日期",
+ "field": "expirationDate",
+ "checked": true,
+ "columnId": "expirationDate",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "align": "right",
+ "title": "数量",
+ "field": "quantity",
+ "checked": true,
+ "columnId": "quantity",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ "tableSummary": "sum",
+ "tableSummaryAlign": "right",
+ "tableSummaryNumFormat": "0"
+ }
+ ]
+ ]
+ },
+ "printElementType": {
+ "title": "表格",
+ "type": "table",
+ "editable": true,
+ "columnDisplayEditable": true,
+ "columnDisplayIndexEditable": true,
+ "columnTitleEditable": true,
+ "columnResizable": true,
+ "columnAlignEditable": true,
+ "isEnableEditField": true,
+ "isEnableContextMenu": true,
+ "isEnableInsertRow": true,
+ "isEnableDeleteRow": true,
+ "isEnableInsertColumn": true,
+ "isEnableDeleteColumn": true,
+ "isEnableMergeCell": true
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 222.5,
+ "height": 9.75,
+ "width": 500,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "movementOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "movementOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "备注",
+ "field": "remark",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 139.5,
+ "bottom": 233.25,
+ "vCenter": 79.5,
+ "hCenter": 228.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ }
+ ],
+ "paperNumberLeft": 565.5,
+ "paperNumberTop": 819,
+ "paperNumberContinue": true,
+ "watermarkOptions": {}
+ }
+ ]
+};
diff --git a/src/components/PrintTemplate/receipt-panel.js b/src/components/PrintTemplate/receipt-panel.js
new file mode 100644
index 0000000..cfa6617
--- /dev/null
+++ b/src/components/PrintTemplate/receipt-panel.js
@@ -0,0 +1,862 @@
+export default {
+ "panels": [
+ {
+ "index": 0,
+ "name": 1,
+ "height": 297,
+ "width": 210,
+ "paperHeader": 49.5,
+ "paperFooter": 780,
+ "printElements": [
+ {
+ "options": {
+ "left": 402.5,
+ "top": 35,
+ "height": 40,
+ "width": 160,
+ "title": "条形码",
+ "barcodeType": "code128",
+ "testData": "barcode",
+ "textType": "barcode",
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ }
+ ],
+ "field": "receiptOrderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false
+ },
+ "printElementType": {
+ "title": "条形码",
+ "type": "barcode"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 42.5,
+ "height": 27,
+ "width": 350,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ },
+ {
+ "text": "仓库",
+ "field": "warehouse"
+ },
+ {
+ "text": "库区",
+ "field": "area"
+ }
+ ],
+ "title": "入库单",
+ "field": "receiptOrderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "fontSize": 18,
+ "fontWeight": "600",
+ "lineHeight": 26.25,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 97.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "入库类型",
+ "field": "receiptOrderType",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 139.5,
+ "bottom": 108,
+ "vCenter": 79.5,
+ "hCenter": 103.125
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 97.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "入库状态",
+ "field": "receiptOrderStatus",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 122.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "供应商",
+ "field": "merchantName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 122.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "订单号",
+ "field": "orderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 147.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "仓库",
+ "field": "warehouseName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 147.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "库区",
+ "field": "areaName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 172.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "数量",
+ "field": "totalQuantity",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 172.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "金额",
+ "field": "payableAmount",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 197.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "创建人",
+ "field": "createBy",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 197.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "创建时间",
+ "field": "createTime",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 222.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "操作人",
+ "field": "updateBy",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 222.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "操作时间",
+ "field": "updateTime",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 17.5,
+ "top": 272.5,
+ "height": 54,
+ "width": 550,
+ "field": "table",
+ "groupFieldsFormatter": "function(type,options,data){ return [\"name\"] }",
+ "columns": [
+ [
+ {
+ "width": 78.57142857142857,
+ "title": "商品名称",
+ "field": "itemName",
+ "checked": true,
+ "columnId": "itemName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "规格名称",
+ "field": "skuName",
+ "checked": true,
+ "columnId": "skuName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 90,
+ "title": "库区",
+ "field": "areaName",
+ "checked": true,
+ "columnId": "areaName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "批号",
+ "field": "batchNo",
+ "checked": true,
+ "columnId": "batchNo",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "生产日期",
+ "field": "productionDate",
+ "checked": true,
+ "columnId": "productionDate",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "过期日期",
+ "field": "expirationDate",
+ "checked": true,
+ "columnId": "expirationDate",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "align": "right",
+ "title": "数量",
+ "field": "quantity",
+ "checked": true,
+ "columnId": "quantity",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ "tableSummary": "sum",
+ "tableSummaryAlign": "right",
+ "tableSummaryNumFormat": "0"
+ },
+ {
+ "width": 78.57142857142857,
+ "align": "right",
+ "title": "价格(元)",
+ "field": "amount",
+ "checked": true,
+ "columnId": "amount",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ "tableSummary": "sum",
+ "tableSummaryAlign": "right"
+ },
+ ]
+ ]
+ },
+ "printElementType": {
+ "title": "表格",
+ "type": "table",
+ "editable": true,
+ "columnDisplayEditable": true,
+ "columnDisplayIndexEditable": true,
+ "columnTitleEditable": true,
+ "columnResizable": true,
+ "columnAlignEditable": true,
+ "isEnableEditField": true,
+ "isEnableContextMenu": true,
+ "isEnableInsertRow": true,
+ "isEnableDeleteRow": true,
+ "isEnableInsertColumn": true,
+ "isEnableDeleteColumn": true,
+ "isEnableMergeCell": true
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 247.5,
+ "height": 9.75,
+ "width": 500,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "receiptOrderNo"
+ },
+ {
+ "text": "供应商",
+ "field": "supplierName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "入库类型",
+ "field": "receiptOrderType"
+ },
+ {
+ "text": "入库状态",
+ "field": "receiptOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "备注",
+ "field": "remark",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 139.5,
+ "bottom": 233.25,
+ "vCenter": 79.5,
+ "hCenter": 228.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ }
+ ],
+ "paperNumberLeft": 565.5,
+ "paperNumberTop": 819,
+ "paperNumberContinue": true,
+ "watermarkOptions": {}
+ }
+ ]
+};
diff --git a/src/components/PrintTemplate/shipment-panel.js b/src/components/PrintTemplate/shipment-panel.js
new file mode 100644
index 0000000..a1574b5
--- /dev/null
+++ b/src/components/PrintTemplate/shipment-panel.js
@@ -0,0 +1,862 @@
+export default {
+ "panels": [
+ {
+ "index": 0,
+ "name": 1,
+ "height": 297,
+ "width": 210,
+ "paperHeader": 49.5,
+ "paperFooter": 780,
+ "printElements": [
+ {
+ "options": {
+ "left": 402.5,
+ "top": 35,
+ "height": 40,
+ "width": 160,
+ "title": "条形码",
+ "barcodeType": "code128",
+ "testData": "barcode",
+ "textType": "barcode",
+ "fields": [
+ {
+ "text": "出库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ }
+ ],
+ "field": "shipmentOrderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false
+ },
+ "printElementType": {
+ "title": "条形码",
+ "type": "barcode"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 42.5,
+ "height": 27,
+ "width": 350,
+ "fields": [
+ {
+ "text": "出库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ },
+ {
+ "text": "仓库",
+ "field": "warehouse"
+ },
+ {
+ "text": "库区",
+ "field": "area"
+ }
+ ],
+ "title": "出库单",
+ "field": "shipmentOrderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "fontSize": 18,
+ "fontWeight": "600",
+ "lineHeight": 26.25,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 97.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "出库类型",
+ "field": "shipmentOrderType",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 139.5,
+ "bottom": 108,
+ "vCenter": 79.5,
+ "hCenter": 103.125
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 97.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "出库状态",
+ "field": "shipmentOrderStatus",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 122.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "客户",
+ "field": "merchantName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 122.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "订单号",
+ "field": "orderNo",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 147.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "仓库",
+ "field": "warehouseName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 147.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "库区",
+ "field": "areaName",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 172.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "数量",
+ "field": "totalQuantity",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 172.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "金额",
+ "field": "receivableAmount",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 197.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "创建人",
+ "field": "createBy",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 197.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "创建时间",
+ "field": "createTime",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 222.5,
+ "height": 9.75,
+ "width": 200,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "操作人",
+ "field": "updateBy",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 340,
+ "top": 222.5,
+ "height": 9.75,
+ "width": 150,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "操作时间",
+ "field": "updateTime",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 489.75,
+ "bottom": 131.25,
+ "vCenter": 414.75,
+ "hCenter": 126.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ },
+ {
+ "options": {
+ "left": 17.5,
+ "top": 272.5,
+ "height": 54,
+ "width": 550,
+ "field": "table",
+ "groupFieldsFormatter": "function(type,options,data){ return [\"name\"] }",
+ "columns": [
+ [
+ {
+ "width": 78.57142857142857,
+ "title": "商品名称",
+ "field": "itemName",
+ "checked": true,
+ "columnId": "itemName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "规格名称",
+ "field": "skuName",
+ "checked": true,
+ "columnId": "skuName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 90,
+ "title": "库区",
+ "field": "areaName",
+ "checked": true,
+ "columnId": "areaName",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "批号",
+ "field": "batchNo",
+ "checked": true,
+ "columnId": "batchNo",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "生产日期",
+ "field": "productionDate",
+ "checked": true,
+ "columnId": "productionDate",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "title": "过期日期",
+ "field": "expirationDate",
+ "checked": true,
+ "columnId": "expirationDate",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ },
+ {
+ "width": 78.57142857142857,
+ "align": "right",
+ "title": "数量",
+ "field": "quantity",
+ "checked": true,
+ "columnId": "quantity",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ "tableSummary": "sum",
+ "tableSummaryAlign": "right",
+ "tableSummaryNumFormat": "0"
+ },
+ {
+ "width": 78.57142857142857,
+ "align": "right",
+ "title": "价格(元)",
+ "field": "amount",
+ "checked": true,
+ "columnId": "amount",
+ "fixed": false,
+ "rowspan": 1,
+ "colspan": 1,
+ "tableSummary": "sum",
+ "tableSummaryAlign": "right"
+ },
+ ]
+ ]
+ },
+ "printElementType": {
+ "title": "表格",
+ "type": "table",
+ "editable": true,
+ "columnDisplayEditable": true,
+ "columnDisplayIndexEditable": true,
+ "columnTitleEditable": true,
+ "columnResizable": true,
+ "columnAlignEditable": true,
+ "isEnableEditField": true,
+ "isEnableContextMenu": true,
+ "isEnableInsertRow": true,
+ "isEnableDeleteRow": true,
+ "isEnableInsertColumn": true,
+ "isEnableDeleteColumn": true,
+ "isEnableMergeCell": true
+ }
+ },
+ {
+ "options": {
+ "left": 20,
+ "top": 247.5,
+ "height": 9.75,
+ "width": 500,
+ "fields": [
+ {
+ "text": "入库单号",
+ "field": "shipmentOrderNo"
+ },
+ {
+ "text": "客户",
+ "field": "merchantName"
+ },
+ {
+ "text": "订单号",
+ "field": "orderNo"
+ },
+ {
+ "text": "出库类型",
+ "field": "shipmentOrderType"
+ },
+ {
+ "text": "出库状态",
+ "field": "shipmentOrderStatus"
+ },
+ {
+ "text": "创建日期",
+ "field": "createTime"
+ },
+ {
+ "text": "备注",
+ "field": "remark"
+ }
+ ],
+ "title": "备注",
+ "field": "remark",
+ "coordinateSync": false,
+ "widthHeightSync": false,
+ "qrCodeLevel": 0,
+ "right": 139.5,
+ "bottom": 233.25,
+ "vCenter": 79.5,
+ "hCenter": 228.375
+ },
+ "printElementType": {
+ "title": "文本",
+ "type": "text"
+ }
+ }
+ ],
+ "paperNumberLeft": 565.5,
+ "paperNumberTop": 819,
+ "paperNumberContinue": true,
+ "watermarkOptions": {}
+ }
+ ]
+};
diff --git a/src/components/RightToolbar/index.vue b/src/components/RightToolbar/index.vue
new file mode 100644
index 0000000..becb12c
--- /dev/null
+++ b/src/components/RightToolbar/index.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/RuoYi/Doc/index.vue b/src/components/RuoYi/Doc/index.vue
new file mode 100644
index 0000000..82ab81e
--- /dev/null
+++ b/src/components/RuoYi/Doc/index.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/src/components/RuoYi/Git/index.vue b/src/components/RuoYi/Git/index.vue
new file mode 100644
index 0000000..57b8ac9
--- /dev/null
+++ b/src/components/RuoYi/Git/index.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue
new file mode 100644
index 0000000..7ad28ea
--- /dev/null
+++ b/src/components/Screenfull/index.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue
new file mode 100644
index 0000000..4c2e7e9
--- /dev/null
+++ b/src/components/SizeSelect/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..8c101f6
--- /dev/null
+++ b/src/components/SvgIcon/index.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/SvgIcon/svgicon.js b/src/components/SvgIcon/svgicon.js
new file mode 100644
index 0000000..4431719
--- /dev/null
+++ b/src/components/SvgIcon/svgicon.js
@@ -0,0 +1,10 @@
+import * as components from '@element-plus/icons-vue'
+
+export default {
+ install: (app) => {
+ for (const key in components) {
+ const componentConfig = components[key];
+ app.component(componentConfig.name, componentConfig);
+ }
+ },
+};
diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue
new file mode 100644
index 0000000..52b40ea
--- /dev/null
+++ b/src/components/TopNav/index.vue
@@ -0,0 +1,214 @@
+
+
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+ 更多菜单
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/TreeSelect/index.vue b/src/components/TreeSelect/index.vue
new file mode 100644
index 0000000..4ff0e76
--- /dev/null
+++ b/src/components/TreeSelect/index.vue
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/iFrame/index.vue b/src/components/iFrame/index.vue
new file mode 100644
index 0000000..091b1a2
--- /dev/null
+++ b/src/components/iFrame/index.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/src/directive/common/copyText.js b/src/directive/common/copyText.js
new file mode 100644
index 0000000..7063df8
--- /dev/null
+++ b/src/directive/common/copyText.js
@@ -0,0 +1,66 @@
+/**
+* v-copyText 复制文本内容
+* Copyright (c) 2022 ruoyi
+*/
+
+export default {
+ beforeMount(el, { value, arg }) {
+ if (arg === "callback") {
+ el.$copyCallback = value;
+ } else {
+ el.$copyValue = value;
+ const handler = () => {
+ copyTextToClipboard(el.$copyValue);
+ if (el.$copyCallback) {
+ el.$copyCallback(el.$copyValue);
+ }
+ };
+ el.addEventListener("click", handler);
+ el.$destroyCopy = () => el.removeEventListener("click", handler);
+ }
+ }
+}
+
+function copyTextToClipboard(input, { target = document.body } = {}) {
+ const element = document.createElement('textarea');
+ const previouslyFocusedElement = document.activeElement;
+
+ element.value = input;
+
+ // Prevent keyboard from showing on mobile
+ element.setAttribute('readonly', '');
+
+ element.style.contain = 'strict';
+ element.style.position = 'absolute';
+ element.style.left = '-9999px';
+ element.style.fontSize = '12pt'; // Prevent zooming on iOS
+
+ const selection = document.getSelection();
+ const originalRange = selection.rangeCount > 0 && selection.getRangeAt(0);
+
+ target.append(element);
+ element.select();
+
+ // Explicit selection workaround for iOS
+ element.selectionStart = 0;
+ element.selectionEnd = input.length;
+
+ let isSuccess = false;
+ try {
+ isSuccess = document.execCommand('copy');
+ } catch { }
+
+ element.remove();
+
+ if (originalRange) {
+ selection.removeAllRanges();
+ selection.addRange(originalRange);
+ }
+
+ // Get the focus back on the previously focused element, if any
+ if (previouslyFocusedElement) {
+ previouslyFocusedElement.focus();
+ }
+
+ return isSuccess;
+}
diff --git a/src/directive/index.js b/src/directive/index.js
new file mode 100644
index 0000000..86b8f88
--- /dev/null
+++ b/src/directive/index.js
@@ -0,0 +1,9 @@
+import hasRole from './permission/hasRole'
+import hasPermi from './permission/hasPermi'
+import copyText from './common/copyText'
+
+export default function directive(app){
+ app.directive('hasRole', hasRole)
+ app.directive('hasPermi', hasPermi)
+ app.directive('copyText', copyText)
+}
\ No newline at end of file
diff --git a/src/directive/permission/hasPermi.js b/src/directive/permission/hasPermi.js
new file mode 100644
index 0000000..44ef3f8
--- /dev/null
+++ b/src/directive/permission/hasPermi.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasPermi 操作权限处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+import useUserStore from '@/store/modules/user'
+
+export default {
+ mounted(el, binding, vnode) {
+ const { value } = binding
+ const all_permission = "*:*:*";
+ const permissions = useUserStore().permissions
+
+ if (value && value instanceof Array && value.length > 0) {
+ const permissionFlag = value
+
+ const hasPermissions = permissions.some(permission => {
+ return all_permission === permission || permissionFlag.includes(permission)
+ })
+
+ if (!hasPermissions) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(`请设置操作权限标签值`)
+ }
+ }
+}
diff --git a/src/directive/permission/hasRole.js b/src/directive/permission/hasRole.js
new file mode 100644
index 0000000..8774bdd
--- /dev/null
+++ b/src/directive/permission/hasRole.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasRole 角色权限处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+import useUserStore from '@/store/modules/user'
+
+export default {
+ mounted(el, binding, vnode) {
+ const { value } = binding
+ const super_admin = "admin";
+ const roles = useUserStore().roles
+
+ if (value && value instanceof Array && value.length > 0) {
+ const roleFlag = value
+
+ const hasRole = roles.some(role => {
+ return super_admin === role || roleFlag.includes(role)
+ })
+
+ if (!hasRole) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(`请设置角色权限标签值`)
+ }
+ }
+}
diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
new file mode 100644
index 0000000..1321104
--- /dev/null
+++ b/src/layout/components/AppMain.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/IframeToggle/index.vue b/src/layout/components/IframeToggle/index.vue
new file mode 100644
index 0000000..2b8269b
--- /dev/null
+++ b/src/layout/components/IframeToggle/index.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/layout/components/InnerLink/index.vue b/src/layout/components/InnerLink/index.vue
new file mode 100644
index 0000000..53a903c
--- /dev/null
+++ b/src/layout/components/InnerLink/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
new file mode 100644
index 0000000..2ec8437
--- /dev/null
+++ b/src/layout/components/Navbar.vue
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue
new file mode 100644
index 0000000..0d551ba
--- /dev/null
+++ b/src/layout/components/Settings/index.vue
@@ -0,0 +1,241 @@
+
+
+
+
主题风格设置
+
+
+
+
+
+
+
+
+
+
+
+
+ 主题颜色
+
+
+
+
+
+
+ 系统布局配置
+
+
+ 开启 TopNav
+
+
+
+
+
+
+ 开启 Tags-Views
+
+
+
+
+
+
+ 固定 Header
+
+
+
+
+
+
+ 显示 Logo
+
+
+
+
+
+
+ 动态标题
+
+
+
+
+
+
+
+ 保存配置
+ 重置配置
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue
new file mode 100644
index 0000000..8011431
--- /dev/null
+++ b/src/layout/components/Sidebar/Link.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000..98c9ef7
--- /dev/null
+++ b/src/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000..c423fb1
--- /dev/null
+++ b/src/layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..9b14dfc
--- /dev/null
+++ b/src/layout/components/Sidebar/index.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000..f6fbfbd
--- /dev/null
+++ b/src/layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue
new file mode 100644
index 0000000..bcfbcd9
--- /dev/null
+++ b/src/layout/components/TagsView/index.vue
@@ -0,0 +1,337 @@
+
+
+
+
+ {{ tag.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/index.js b/src/layout/components/index.js
new file mode 100644
index 0000000..fd57731
--- /dev/null
+++ b/src/layout/components/index.js
@@ -0,0 +1,4 @@
+export { default as AppMain } from './AppMain'
+export { default as Navbar } from './Navbar'
+export { default as Settings } from './Settings'
+export { default as TagsView } from './TagsView/index.vue'
diff --git a/src/layout/index.vue b/src/layout/index.vue
new file mode 100644
index 0000000..c4d654e
--- /dev/null
+++ b/src/layout/index.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..34117b2
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,91 @@
+import { createApp } from 'vue'
+
+import Cookies from 'js-cookie'
+
+import ElementPlus from 'element-plus'
+import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言
+
+import '@/assets/styles/index.scss' // global css
+import App from './App'
+import store from './store'
+import router from './router'
+import directive from './directive' // directive
+
+// 注册指令
+import plugins from './plugins' // plugins
+import { download } from '@/utils/request'
+
+// svg图标
+import 'virtual:svg-icons-register'
+import SvgIcon from '@/components/SvgIcon'
+import elementIcons from '@/components/SvgIcon/svgicon'
+
+import './permission' // permission control
+
+import { useDict } from '@/utils/dict'
+import { getConfigKey, updateConfigByKey } from "@/api/system/config";
+import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi'
+
+// 分页组件
+import Pagination from '@/components/Pagination'
+// 自定义表格工具组件
+import RightToolbar from '@/components/RightToolbar'
+// 富文本组件
+import Editor from "@/components/Editor"
+// 文件上传组件
+import FileUpload from "@/components/FileUpload"
+// 图片上传组件
+import ImageUpload from "@/components/ImageUpload"
+// 图片预览组件
+import ImagePreview from "@/components/ImagePreview"
+// 自定义树选择组件
+import TreeSelect from '@/components/TreeSelect'
+// 字典标签组件
+import DictTag from '@/components/DictTag'
+// 打印插件
+import { hiPrintPlugin } from 'vue-plugin-hiprint';
+
+const app = createApp(App)
+
+// 全局方法挂载
+app.config.globalProperties.useDict = useDict
+app.config.globalProperties.getConfigKey = getConfigKey
+app.config.globalProperties.updateConfigByKey = updateConfigByKey
+app.config.globalProperties.download = download
+app.config.globalProperties.parseTime = parseTime
+app.config.globalProperties.resetForm = resetForm
+app.config.globalProperties.handleTree = handleTree
+app.config.globalProperties.addDateRange = addDateRange
+app.config.globalProperties.selectDictLabel = selectDictLabel
+app.config.globalProperties.selectDictLabels = selectDictLabels
+
+// 全局组件挂载
+app.component('DictTag', DictTag)
+app.component('Pagination', Pagination)
+app.component('TreeSelect', TreeSelect)
+app.component('FileUpload', FileUpload)
+app.component('ImageUpload', ImageUpload)
+app.component('ImagePreview', ImagePreview)
+app.component('RightToolbar', RightToolbar)
+app.component('Editor', Editor)
+
+app.use(router)
+app.use(store)
+app.use(plugins)
+app.use(elementIcons)
+app.use(hiPrintPlugin, '$hiprint', false);
+app.component('svg-icon', SvgIcon)
+
+directive(app)
+
+// 使用element-plus 并且设置全局的大小
+app.use(ElementPlus, {
+ locale: locale,
+ // 支持 large、default、small
+ size: Cookies.get('size') || 'default'
+})
+
+// 修改 el-dialog 默认点击遮照为不关闭
+app._context.components.ElDialog.props.closeOnClickModal.default = false
+
+app.mount('#app')
diff --git a/src/permission.js b/src/permission.js
new file mode 100644
index 0000000..1159ac9
--- /dev/null
+++ b/src/permission.js
@@ -0,0 +1,74 @@
+import router from './router'
+import { ElMessage } from 'element-plus'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import { getToken } from '@/utils/auth'
+import { isHttp } from '@/utils/validate'
+import { isRelogin } from '@/utils/request'
+import useUserStore from '@/store/modules/user'
+import useSettingsStore from '@/store/modules/settings'
+import usePermissionStore from '@/store/modules/permission'
+import {useWmsStore} from '@/store/modules/wms';
+
+NProgress.configure({ showSpinner: false });
+
+const whiteList = ['/login', '/register'];
+
+router.beforeEach((to, from, next) => {
+ NProgress.start()
+ if (getToken()) {
+ to.meta.title && useSettingsStore().setTitle(to.meta.title)
+ /* has token*/
+ if (to.path === '/login') {
+ next({ path: '/' })
+ NProgress.done()
+ } else {
+ if (useUserStore().roles.length === 0) {
+ isRelogin.show = true
+ // 判断当前用户是否已拉取完user_info信息
+ useUserStore().getInfo().then(() => {
+ isRelogin.show = false
+ usePermissionStore().generateRoutes().then(accessRoutes => {
+ // 根据roles权限生成可访问的路由表
+ accessRoutes.forEach(route => {
+ if (!isHttp(route.path)) {
+ router.addRoute(route) // 动态添加可访问路由表
+ }
+ })
+ next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+ })
+ }).catch(err => {
+ useUserStore().logOut().then(() => {
+ ElMessage.error(err)
+ next({ path: '/' })
+ })
+ })
+ initData()
+ } else {
+ next()
+ }
+ }
+ } else {
+ // 没有token
+ if (whiteList.indexOf(to.path) !== -1) {
+ // 在免登录白名单,直接进入
+ next()
+ } else {
+ next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
+ NProgress.done()
+ }
+ }
+})
+
+async function initData() {
+ await useWmsStore().getWarehouseList()
+ await useWmsStore().getAreaList()
+ await useWmsStore().getMerchantList()
+ await useWmsStore().getItemCategoryList()
+ await useWmsStore().getItemCategoryTreeList()
+ await useWmsStore().getItemBrandList()
+}
+
+router.afterEach(() => {
+ NProgress.done()
+})
diff --git a/src/plugins/auth.js b/src/plugins/auth.js
new file mode 100644
index 0000000..5e8c28d
--- /dev/null
+++ b/src/plugins/auth.js
@@ -0,0 +1,60 @@
+import useUserStore from '@/store/modules/user'
+
+function authPermission(permission) {
+ const all_permission = "*:*:*";
+ const permissions = useUserStore().permissions
+ if (permission && permission.length > 0) {
+ return permissions.some(v => {
+ return all_permission === v || v === permission
+ })
+ } else {
+ return false
+ }
+}
+
+function authRole(role) {
+ const super_admin = "admin";
+ const roles = useUserStore().roles
+ if (role && role.length > 0) {
+ return roles.some(v => {
+ return super_admin === v || v === role
+ })
+ } else {
+ return false
+ }
+}
+
+export default {
+ // 验证用户是否具备某权限
+ hasPermi(permission) {
+ return authPermission(permission);
+ },
+ // 验证用户是否含有指定权限,只需包含其中一个
+ hasPermiOr(permissions) {
+ return permissions.some(item => {
+ return authPermission(item)
+ })
+ },
+ // 验证用户是否含有指定权限,必须全部拥有
+ hasPermiAnd(permissions) {
+ return permissions.every(item => {
+ return authPermission(item)
+ })
+ },
+ // 验证用户是否具备某角色
+ hasRole(role) {
+ return authRole(role);
+ },
+ // 验证用户是否含有指定角色,只需包含其中一个
+ hasRoleOr(roles) {
+ return roles.some(item => {
+ return authRole(item)
+ })
+ },
+ // 验证用户是否含有指定角色,必须全部拥有
+ hasRoleAnd(roles) {
+ return roles.every(item => {
+ return authRole(item)
+ })
+ }
+}
diff --git a/src/plugins/cache.js b/src/plugins/cache.js
new file mode 100644
index 0000000..6b5c00b
--- /dev/null
+++ b/src/plugins/cache.js
@@ -0,0 +1,77 @@
+const sessionCache = {
+ set (key, value) {
+ if (!sessionStorage) {
+ return
+ }
+ if (key != null && value != null) {
+ sessionStorage.setItem(key, value)
+ }
+ },
+ get (key) {
+ if (!sessionStorage) {
+ return null
+ }
+ if (key == null) {
+ return null
+ }
+ return sessionStorage.getItem(key)
+ },
+ setJSON (key, jsonValue) {
+ if (jsonValue != null) {
+ this.set(key, JSON.stringify(jsonValue))
+ }
+ },
+ getJSON (key) {
+ const value = this.get(key)
+ if (value != null) {
+ return JSON.parse(value)
+ }
+ },
+ remove (key) {
+ sessionStorage.removeItem(key);
+ }
+}
+const localCache = {
+ set (key, value) {
+ if (!localStorage) {
+ return
+ }
+ if (key != null && value != null) {
+ localStorage.setItem(key, value)
+ }
+ },
+ get (key) {
+ if (!localStorage) {
+ return null
+ }
+ if (key == null) {
+ return null
+ }
+ return localStorage.getItem(key)
+ },
+ setJSON (key, jsonValue) {
+ if (jsonValue != null) {
+ this.set(key, JSON.stringify(jsonValue))
+ }
+ },
+ getJSON (key) {
+ const value = this.get(key)
+ if (value != null) {
+ return JSON.parse(value)
+ }
+ },
+ remove (key) {
+ localStorage.removeItem(key);
+ }
+}
+
+export default {
+ /**
+ * 会话级缓存
+ */
+ session: sessionCache,
+ /**
+ * 本地缓存
+ */
+ local: localCache
+}
diff --git a/src/plugins/download.js b/src/plugins/download.js
new file mode 100644
index 0000000..29dd469
--- /dev/null
+++ b/src/plugins/download.js
@@ -0,0 +1,71 @@
+import axios from 'axios'
+import { ElLoading, ElMessage } from 'element-plus'
+import { saveAs } from 'file-saver'
+import { getToken } from '@/utils/auth'
+import errorCode from '@/utils/errorCode'
+import { blobValidate } from '@/utils/ruoyi'
+
+const baseURL = import.meta.env.VITE_APP_BASE_API
+let downloadLoadingInstance;
+
+export default {
+ oss(ossId) {
+ var url = baseURL + '/system/oss/download/' + ossId
+ downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
+ axios({
+ method: 'get',
+ url: url,
+ responseType: 'blob',
+ headers: { 'Authorization': 'Bearer ' + getToken() }
+ }).then((res) => {
+ const isBlob = blobValidate(res.data);
+ if (isBlob) {
+ const blob = new Blob([res.data], { type: 'application/octet-stream' })
+ this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
+ } else {
+ this.printErrMsg(res.data);
+ }
+ downloadLoadingInstance.close();
+ }).catch((r) => {
+ console.error(r)
+ Message.error('下载文件出现错误,请联系管理员!')
+ downloadLoadingInstance.close();
+ })
+ },
+ zip(url, name) {
+ var url = baseURL + url
+ downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
+ axios({
+ method: 'get',
+ url: url,
+ responseType: 'blob',
+ headers: {
+ 'Authorization': 'Bearer ' + getToken(),
+ 'datasource': localStorage.getItem("dataName")
+ }
+ }).then((res) => {
+ const isBlob = blobValidate(res.data);
+ if (isBlob) {
+ const blob = new Blob([res.data], { type: 'application/zip' })
+ this.saveAs(blob, name)
+ } else {
+ this.printErrMsg(res.data);
+ }
+ downloadLoadingInstance.close();
+ }).catch((r) => {
+ console.error(r)
+ ElMessage.error('下载文件出现错误,请联系管理员!')
+ downloadLoadingInstance.close();
+ })
+ },
+ saveAs(text, name, opts) {
+ saveAs(text, name, opts);
+ },
+ async printErrMsg(data) {
+ const resText = await data.text();
+ const rspObj = JSON.parse(resText);
+ const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
+ ElMessage.error(errMsg);
+ }
+}
+
diff --git a/src/plugins/index.js b/src/plugins/index.js
new file mode 100644
index 0000000..47d1b41
--- /dev/null
+++ b/src/plugins/index.js
@@ -0,0 +1,18 @@
+import tab from './tab'
+import auth from './auth'
+import cache from './cache'
+import modal from './modal'
+import download from './download'
+
+export default function installPlugins(app){
+ // 页签操作
+ app.config.globalProperties.$tab = tab
+ // 认证对象
+ app.config.globalProperties.$auth = auth
+ // 缓存对象
+ app.config.globalProperties.$cache = cache
+ // 模态框对象
+ app.config.globalProperties.$modal = modal
+ // 下载文件
+ app.config.globalProperties.$download = download
+}
diff --git a/src/plugins/modal.js b/src/plugins/modal.js
new file mode 100644
index 0000000..b59e14d
--- /dev/null
+++ b/src/plugins/modal.js
@@ -0,0 +1,82 @@
+import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
+
+let loadingInstance;
+
+export default {
+ // 消息提示
+ msg(content) {
+ ElMessage.info(content)
+ },
+ // 错误消息
+ msgError(content) {
+ ElMessage.error(content)
+ },
+ // 成功消息
+ msgSuccess(content) {
+ ElMessage.success(content)
+ },
+ // 警告消息
+ msgWarning(content) {
+ ElMessage.warning(content)
+ },
+ // 弹出提示
+ alert(content) {
+ ElMessageBox.alert(content, "系统提示")
+ },
+ // 错误提示
+ alertError(content) {
+ ElMessageBox.alert(content, "系统提示", { type: 'error' })
+ },
+ // 成功提示
+ alertSuccess(content) {
+ ElMessageBox.alert(content, "系统提示", { type: 'success' })
+ },
+ // 警告提示
+ alertWarning(content) {
+ ElMessageBox.alert(content, "系统提示", { type: 'warning' })
+ },
+ // 通知提示
+ notify(content) {
+ ElNotification.info(content)
+ },
+ // 错误通知
+ notifyError(content) {
+ ElNotification.error(content);
+ },
+ // 成功通知
+ notifySuccess(content) {
+ ElNotification.success(content)
+ },
+ // 警告通知
+ notifyWarning(content) {
+ ElNotification.warning(content)
+ },
+ // 确认窗体
+ confirm(content) {
+ return ElMessageBox.confirm(content, "系统提示", {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: "warning",
+ })
+ },
+ // 提交内容
+ prompt(content) {
+ return ElMessageBox.prompt(content, "系统提示", {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: "warning",
+ })
+ },
+ // 打开遮罩层
+ loading(content) {
+ loadingInstance = ElLoading.service({
+ lock: true,
+ text: content,
+ background: "rgba(0, 0, 0, 0.7)",
+ })
+ },
+ // 关闭遮罩层
+ closeLoading() {
+ loadingInstance.close();
+ }
+}
diff --git a/src/plugins/tab.js b/src/plugins/tab.js
new file mode 100644
index 0000000..7b51cf5
--- /dev/null
+++ b/src/plugins/tab.js
@@ -0,0 +1,69 @@
+import useTagsViewStore from '@/store/modules/tagsView'
+import router from '@/router'
+
+export default {
+ // 刷新当前tab页签
+ refreshPage(obj) {
+ const { path, query, matched } = router.currentRoute.value;
+ if (obj === undefined) {
+ matched.forEach((m) => {
+ if (m.components && m.components.default && m.components.default.name) {
+ if (!['Layout', 'ParentView'].includes(m.components.default.name)) {
+ obj = { name: m.components.default.name, path: path, query: query };
+ }
+ }
+ });
+ }
+ return useTagsViewStore().delCachedView(obj).then(() => {
+ const { path, query } = obj
+ router.replace({
+ path: '/redirect' + path,
+ query: query
+ })
+ })
+ },
+ // 关闭当前tab页签,打开新页签
+ closeOpenPage(obj) {
+ useTagsViewStore().delView(router.currentRoute.value);
+ if (obj !== undefined) {
+ return router.push(obj);
+ }
+ },
+ // 关闭指定tab页签
+ closePage(obj) {
+ if (obj === undefined) {
+ return useTagsViewStore().delView(router.currentRoute.value).then(({ visitedViews }) => {
+ const latestView = visitedViews.slice(-1)[0]
+ if (latestView) {
+ return router.push(latestView.fullPath)
+ }
+ return router.push('/');
+ });
+ }
+ return useTagsViewStore().delView(obj);
+ },
+ // 关闭所有tab页签
+ closeAllPage() {
+ return useTagsViewStore().delAllViews();
+ },
+ // 关闭左侧tab页签
+ closeLeftPage(obj) {
+ return useTagsViewStore().delLeftTags(obj || router.currentRoute.value);
+ },
+ // 关闭右侧tab页签
+ closeRightPage(obj) {
+ return useTagsViewStore().delRightTags(obj || router.currentRoute.value);
+ },
+ // 关闭其他tab页签
+ closeOtherPage(obj) {
+ return useTagsViewStore().delOthersViews(obj || router.currentRoute.value);
+ },
+ // 打开tab页签
+ openPage(url) {
+ return router.push(url);
+ },
+ // 修改tab页签
+ updatePage(obj) {
+ return useTagsViewStore().updateVisitedView(obj);
+ }
+}
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..2559686
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,175 @@
+import { createWebHistory, createRouter } from 'vue-router'
+/* Layout */
+import Layout from '@/layout'
+
+/**
+ * Note: 路由配置项
+ *
+ * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1
+ * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
+ * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
+ * // 若你想不管路由下面的 children 声明的个数都显示你的根路由
+ * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
+ * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
+ * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题
+ * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数
+ * roles: ['admin', 'common'] // 访问路由的角色权限
+ * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限
+ * meta : {
+ noCache: true // 如果设置为true,则不会被 缓存(默认 false)
+ title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
+ icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg
+ breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示
+ activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。
+ }
+ */
+
+// 公共路由
+export const constantRoutes = [
+ {
+ path: '/redirect',
+ component: Layout,
+ hidden: true,
+ children: [
+ {
+ path: '/redirect/:path(.*)',
+ component: () => import('@/views/redirect/index.vue')
+ }
+ ]
+ },
+ {
+ path: '/login',
+ component: () => import('@/views/login'),
+ hidden: true
+ },
+ {
+ path: '/register',
+ component: () => import('@/views/register'),
+ hidden: true
+ },
+ {
+ path: "/:pathMatch(.*)*",
+ component: () => import('@/views/error/404'),
+ hidden: true
+ },
+ {
+ path: '/401',
+ component: () => import('@/views/error/401'),
+ hidden: true
+ },
+ {
+ path: '',
+ component: Layout,
+ redirect: '/index',
+ children: [
+ {
+ path: '/index',
+ component: () => import('@/views/index'),
+ name: 'Index',
+ meta: { title: '首页', icon: 'dashboard', affix: true }
+ }
+ ]
+ },
+ {
+ path: '/user',
+ component: Layout,
+ hidden: true,
+ redirect: 'noredirect',
+ children: [
+ {
+ path: 'profile',
+ component: () => import('@/views/system/user/profile/index'),
+ name: 'Profile',
+ meta: { title: '个人中心', icon: 'user' }
+ }
+ ]
+ }
+]
+
+// 动态路由,基于用户权限动态去加载
+export const dynamicRoutes = [
+ {
+ path: '/system/user-auth',
+ component: Layout,
+ hidden: true,
+ permissions: ['system:user:edit'],
+ children: [
+ {
+ path: 'role/:userId(\\d+)',
+ component: () => import('@/views/system/user/authRole'),
+ name: 'AuthRole',
+ meta: { title: '分配角色', activeMenu: '/system/user' }
+ }
+ ]
+ },
+ {
+ path: '/system/role-auth',
+ component: Layout,
+ hidden: true,
+ permissions: ['system:role:edit'],
+ children: [
+ {
+ path: 'user/:roleId(\\d+)',
+ component: () => import('@/views/system/role/authUser'),
+ name: 'AuthUser',
+ meta: { title: '分配用户', activeMenu: '/system/role' }
+ }
+ ]
+ },
+ {
+ path: '/system/dict-data',
+ component: Layout,
+ hidden: true,
+ permissions: ['system:dict:list'],
+ children: [
+ {
+ path: 'index/:dictId(\\d+)',
+ component: () => import('@/views/system/dict/data'),
+ name: 'Data',
+ meta: { title: '字典数据', activeMenu: '/system/dict' }
+ }
+ ]
+ },
+ {
+ path: '/system/oss-config',
+ component: Layout,
+ hidden: true,
+ permissions: ['system:oss:list'],
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/system/oss/config'),
+ name: 'OssConfig',
+ meta: { title: '配置管理', activeMenu: '/system/oss'}
+ }
+ ]
+ },
+ {
+ path: '/tool/gen-edit',
+ component: Layout,
+ hidden: true,
+ permissions: ['tool:gen:edit'],
+ children: [
+ {
+ path: 'index/:tableId(\\d+)',
+ component: () => import('@/views/tool/gen/editTable'),
+ name: 'GenEdit',
+ meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
+ }
+ ]
+ }
+]
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.VITE_APP_CONTEXT_PATH),
+ routes: constantRoutes,
+ scrollBehavior(to, from, savedPosition) {
+ if (savedPosition) {
+ return savedPosition
+ } else {
+ return { top: 0 }
+ }
+ },
+});
+
+export default router;
diff --git a/src/settings.js b/src/settings.js
new file mode 100644
index 0000000..722e938
--- /dev/null
+++ b/src/settings.js
@@ -0,0 +1,47 @@
+export default {
+ /**
+ * 网页标题
+ */
+ title: import.meta.env.VITE_APP_TITLE,
+ /**
+ * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
+ */
+ sideTheme: 'theme-light',
+ /**
+ * 是否系统布局配置
+ */
+ showSettings: true,
+
+ /**
+ * 是否显示顶部导航
+ */
+ topNav: false,
+
+ /**
+ * 是否显示 tagsView
+ */
+ tagsView: true,
+
+ /**
+ * 是否固定头部
+ */
+ fixedHeader: false,
+
+ /**
+ * 是否显示logo
+ */
+ sidebarLogo: true,
+
+ /**
+ * 是否显示动态标题
+ */
+ dynamicTitle: false,
+
+ /**
+ * @type {string | array} 'production' | ['production', 'development']
+ * @description Need show err logs component.
+ * The default is only used in the production env
+ * If you want to also use it in dev, you can pass ['production', 'development']
+ */
+ errorLog: 'production'
+}
diff --git a/src/store/index.js b/src/store/index.js
new file mode 100644
index 0000000..f10f389
--- /dev/null
+++ b/src/store/index.js
@@ -0,0 +1,3 @@
+const store = createPinia()
+
+export default store
\ No newline at end of file
diff --git a/src/store/modules/app.js b/src/store/modules/app.js
new file mode 100644
index 0000000..0b57159
--- /dev/null
+++ b/src/store/modules/app.js
@@ -0,0 +1,46 @@
+import Cookies from 'js-cookie'
+
+const useAppStore = defineStore(
+ 'app',
+ {
+ state: () => ({
+ sidebar: {
+ opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+ withoutAnimation: false,
+ hide: false
+ },
+ device: 'desktop',
+ size: Cookies.get('size') || 'default'
+ }),
+ actions: {
+ toggleSideBar(withoutAnimation) {
+ if (this.sidebar.hide) {
+ return false;
+ }
+ this.sidebar.opened = !this.sidebar.opened
+ this.sidebar.withoutAnimation = withoutAnimation
+ if (this.sidebar.opened) {
+ Cookies.set('sidebarStatus', 1)
+ } else {
+ Cookies.set('sidebarStatus', 0)
+ }
+ },
+ closeSideBar({ withoutAnimation }) {
+ Cookies.set('sidebarStatus', 0)
+ this.sidebar.opened = false
+ this.sidebar.withoutAnimation = withoutAnimation
+ },
+ toggleDevice(device) {
+ this.device = device
+ },
+ setSize(size) {
+ this.size = size;
+ Cookies.set('size', size)
+ },
+ toggleSideBarHide(status) {
+ this.sidebar.hide = status
+ }
+ }
+ })
+
+export default useAppStore
diff --git a/src/store/modules/dict.js b/src/store/modules/dict.js
new file mode 100644
index 0000000..27fc308
--- /dev/null
+++ b/src/store/modules/dict.js
@@ -0,0 +1,57 @@
+const useDictStore = defineStore(
+ 'dict',
+ {
+ state: () => ({
+ dict: new Array()
+ }),
+ actions: {
+ // 获取字典
+ getDict(_key) {
+ if (_key == null && _key == "") {
+ return null;
+ }
+ try {
+ for (let i = 0; i < this.dict.length; i++) {
+ if (this.dict[i].key == _key) {
+ return this.dict[i].value;
+ }
+ }
+ } catch (e) {
+ return null;
+ }
+ },
+ // 设置字典
+ setDict(_key, value) {
+ if (_key !== null && _key !== "") {
+ this.dict.push({
+ key: _key,
+ value: value
+ });
+ }
+ },
+ // 删除字典
+ removeDict(_key) {
+ var bln = false;
+ try {
+ for (let i = 0; i < this.dict.length; i++) {
+ if (this.dict[i].key == _key) {
+ this.dict.splice(i, 1);
+ return true;
+ }
+ }
+ } catch (e) {
+ bln = false;
+ }
+ return bln;
+ },
+ // 清空字典
+ cleanDict() {
+ this.dict = new Array();
+ },
+ // 初始字典
+ initDict() {
+ }
+ }
+ })
+
+export default useDictStore
diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js
new file mode 100644
index 0000000..958fe63
--- /dev/null
+++ b/src/store/modules/permission.js
@@ -0,0 +1,142 @@
+import auth from '@/plugins/auth'
+import router, { constantRoutes, dynamicRoutes } from '@/router'
+import { getRouters } from '@/api/menu'
+import Layout from '@/layout/index'
+import ParentView from '@/components/ParentView'
+import InnerLink from '@/layout/components/InnerLink'
+
+// 匹配views里面所有的.vue文件
+const modules = import.meta.glob('./../../views/**/*.vue')
+
+const usePermissionStore = defineStore(
+ 'permission',
+ {
+ state: () => ({
+ routes: [],
+ addRoutes: [],
+ defaultRoutes: [],
+ topbarRouters: [],
+ sidebarRouters: []
+ }),
+ actions: {
+ setRoutes(routes) {
+ this.addRoutes = routes
+ this.routes = constantRoutes.concat(routes)
+ },
+ setDefaultRoutes(routes) {
+ this.defaultRoutes = constantRoutes.concat(routes)
+ },
+ setTopbarRoutes(routes) {
+ this.topbarRouters = routes
+ },
+ setSidebarRouters(routes) {
+ this.sidebarRouters = routes
+ },
+ generateRoutes(roles) {
+ return new Promise(resolve => {
+ // 向后端请求路由数据
+ getRouters().then(res => {
+ const sdata = JSON.parse(JSON.stringify(res.data))
+ const rdata = JSON.parse(JSON.stringify(res.data))
+ const defaultData = JSON.parse(JSON.stringify(res.data))
+ const sidebarRoutes = filterAsyncRouter(sdata)
+ const rewriteRoutes = filterAsyncRouter(rdata, false, true)
+ const defaultRoutes = filterAsyncRouter(defaultData)
+ const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
+ asyncRoutes.forEach(route => { router.addRoute(route) })
+ this.setRoutes(rewriteRoutes)
+ this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
+ this.setDefaultRoutes(sidebarRoutes)
+ this.setTopbarRoutes(defaultRoutes)
+ resolve(rewriteRoutes)
+ })
+ })
+ }
+ }
+ })
+
+// 遍历后台传来的路由字符串,转换为组件对象
+function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
+ return asyncRouterMap.filter(route => {
+ if (type && route.children) {
+ route.children = filterChildren(route.children)
+ }
+ if (route.component) {
+ // Layout ParentView 组件特殊处理
+ if (route.component === 'Layout') {
+ route.component = Layout
+ } else if (route.component === 'ParentView') {
+ route.component = ParentView
+ } else if (route.component === 'InnerLink') {
+ route.component = InnerLink
+ } else {
+ route.component = loadView(route.component)
+ }
+ }
+ if (route.children != null && route.children && route.children.length) {
+ route.children = filterAsyncRouter(route.children, route, type)
+ } else {
+ delete route['children']
+ delete route['redirect']
+ }
+ return true
+ })
+}
+
+function filterChildren(childrenMap, lastRouter = false) {
+ var children = []
+ childrenMap.forEach((el, index) => {
+ if (el.children && el.children.length) {
+ if (el.component === 'ParentView' && !lastRouter) {
+ el.children.forEach(c => {
+ c.path = el.path + '/' + c.path
+ if (c.children && c.children.length) {
+ children = children.concat(filterChildren(c.children, c))
+ return
+ }
+ children.push(c)
+ })
+ return
+ }
+ }
+ if (lastRouter) {
+ el.path = lastRouter.path + '/' + el.path
+ if (el.children && el.children.length) {
+ children = children.concat(filterChildren(el.children, el))
+ return
+ }
+ }
+ children = children.concat(el)
+ })
+ return children
+}
+
+// 动态路由遍历,验证是否具备权限
+export function filterDynamicRoutes(routes) {
+ const res = []
+ routes.forEach(route => {
+ if (route.permissions) {
+ if (auth.hasPermiOr(route.permissions)) {
+ res.push(route)
+ }
+ } else if (route.roles) {
+ if (auth.hasRoleOr(route.roles)) {
+ res.push(route)
+ }
+ }
+ })
+ return res
+}
+
+export const loadView = (view) => {
+ let res;
+ for (const path in modules) {
+ const dir = path.split('views/')[1].split('.vue')[0];
+ if (dir === view) {
+ res = () => modules[path]();
+ }
+ }
+ return res;
+}
+
+export default usePermissionStore
diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js
new file mode 100644
index 0000000..22b7336
--- /dev/null
+++ b/src/store/modules/settings.js
@@ -0,0 +1,38 @@
+import defaultSettings from '@/settings'
+import { useDynamicTitle } from '@/utils/dynamicTitle'
+
+const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings
+
+const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
+
+const useSettingsStore = defineStore(
+ 'settings',
+ {
+ state: () => ({
+ title: '',
+ theme: storageSetting.theme || '#409EFF',
+ sideTheme: storageSetting.sideTheme || sideTheme,
+ showSettings: showSettings,
+ topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
+ tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
+ fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader,
+ sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo,
+ dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle
+ }),
+ actions: {
+ // 修改布局设置
+ changeSetting(data) {
+ const { key, value } = data
+ if (this.hasOwnProperty(key)) {
+ this[key] = value
+ }
+ },
+ // 设置网页标题
+ setTitle(title) {
+ this.title = title
+ useDynamicTitle();
+ }
+ }
+ })
+
+export default useSettingsStore
diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js
new file mode 100644
index 0000000..9d07f33
--- /dev/null
+++ b/src/store/modules/tagsView.js
@@ -0,0 +1,182 @@
+const useTagsViewStore = defineStore(
+ 'tags-view',
+ {
+ state: () => ({
+ visitedViews: [],
+ cachedViews: [],
+ iframeViews: []
+ }),
+ actions: {
+ addView(view) {
+ this.addVisitedView(view)
+ this.addCachedView(view)
+ },
+ addIframeView(view) {
+ if (this.iframeViews.some(v => v.path === view.path)) return
+ this.iframeViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ addVisitedView(view) {
+ if (this.visitedViews.some(v => v.path === view.path)) return
+ this.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ addCachedView(view) {
+ if (this.cachedViews.includes(view.name)) return
+ if (!view.meta.noCache) {
+ this.cachedViews.push(view.name)
+ }
+ },
+ delView(view) {
+ return new Promise(resolve => {
+ this.delVisitedView(view)
+ this.delCachedView(view)
+ resolve({
+ visitedViews: [...this.visitedViews],
+ cachedViews: [...this.cachedViews]
+ })
+ })
+ },
+ delVisitedView(view) {
+ return new Promise(resolve => {
+ for (const [i, v] of this.visitedViews.entries()) {
+ if (v.path === view.path) {
+ this.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ this.iframeViews = this.iframeViews.filter(item => item.path !== view.path)
+ resolve([...this.visitedViews])
+ })
+ },
+ delIframeView(view) {
+ return new Promise(resolve => {
+ this.iframeViews = this.iframeViews.filter(item => item.path !== view.path)
+ resolve([...this.iframeViews])
+ })
+ },
+ delCachedView(view) {
+ return new Promise(resolve => {
+ const index = this.cachedViews.indexOf(view.name)
+ index > -1 && this.cachedViews.splice(index, 1)
+ resolve([...this.cachedViews])
+ })
+ },
+ delOthersViews(view) {
+ return new Promise(resolve => {
+ this.delOthersVisitedViews(view)
+ this.delOthersCachedViews(view)
+ resolve({
+ visitedViews: [...this.visitedViews],
+ cachedViews: [...this.cachedViews]
+ })
+ })
+ },
+ delOthersVisitedViews(view) {
+ return new Promise(resolve => {
+ this.visitedViews = this.visitedViews.filter(v => {
+ return v.meta.affix || v.path === view.path
+ })
+ this.iframeViews = this.iframeViews.filter(item => item.path === view.path)
+ resolve([...this.visitedViews])
+ })
+ },
+ delOthersCachedViews(view) {
+ return new Promise(resolve => {
+ const index = this.cachedViews.indexOf(view.name)
+ if (index > -1) {
+ this.cachedViews = this.cachedViews.slice(index, index + 1)
+ } else {
+ this.cachedViews = []
+ }
+ resolve([...this.cachedViews])
+ })
+ },
+ delAllViews(view) {
+ return new Promise(resolve => {
+ this.delAllVisitedViews(view)
+ this.delAllCachedViews(view)
+ resolve({
+ visitedViews: [...this.visitedViews],
+ cachedViews: [...this.cachedViews]
+ })
+ })
+ },
+ delAllVisitedViews(view) {
+ return new Promise(resolve => {
+ const affixTags = this.visitedViews.filter(tag => tag.meta.affix)
+ this.visitedViews = affixTags
+ this.iframeViews = []
+ resolve([...this.visitedViews])
+ })
+ },
+ delAllCachedViews(view) {
+ return new Promise(resolve => {
+ this.cachedViews = []
+ resolve([...this.cachedViews])
+ })
+ },
+ updateVisitedView(view) {
+ for (let v of this.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ },
+ delRightTags(view) {
+ return new Promise(resolve => {
+ const index = this.visitedViews.findIndex(v => v.path === view.path)
+ if (index === -1) {
+ return
+ }
+ this.visitedViews = this.visitedViews.filter((item, idx) => {
+ if (idx <= index || (item.meta && item.meta.affix)) {
+ return true
+ }
+ const i = this.cachedViews.indexOf(item.name)
+ if (i > -1) {
+ this.cachedViews.splice(i, 1)
+ }
+ if(item.meta.link) {
+ const fi = this.iframeViews.findIndex(v => v.path === item.path)
+ this.iframeViews.splice(fi, 1)
+ }
+ return false
+ })
+ resolve([...this.visitedViews])
+ })
+ },
+ delLeftTags(view) {
+ return new Promise(resolve => {
+ const index = this.visitedViews.findIndex(v => v.path === view.path)
+ if (index === -1) {
+ return
+ }
+ this.visitedViews = this.visitedViews.filter((item, idx) => {
+ if (idx >= index || (item.meta && item.meta.affix)) {
+ return true
+ }
+ const i = this.cachedViews.indexOf(item.name)
+ if (i > -1) {
+ this.cachedViews.splice(i, 1)
+ }
+ if(item.meta.link) {
+ const fi = this.iframeViews.findIndex(v => v.path === item.path)
+ this.iframeViews.splice(fi, 1)
+ }
+ return false
+ })
+ resolve([...this.visitedViews])
+ })
+ }
+ }
+ })
+
+export default useTagsViewStore
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
new file mode 100644
index 0000000..f350ddc
--- /dev/null
+++ b/src/store/modules/user.js
@@ -0,0 +1,72 @@
+import { login, logout, getInfo } from '@/api/login'
+import { getToken, setToken, removeToken } from '@/utils/auth'
+import defAva from '@/assets/logo/logo.png'
+
+const useUserStore = defineStore(
+ 'user',
+ {
+ state: () => ({
+ token: getToken(),
+ id: '',
+ name: '',
+ avatar: '',
+ roles: [],
+ permissions: []
+ }),
+ actions: {
+ // 登录
+ login(userInfo) {
+ const username = userInfo.username.trim()
+ const password = userInfo.password
+ const code = userInfo.code
+ const uuid = userInfo.uuid
+ return new Promise((resolve, reject) => {
+ login(username, password, code, uuid).then(res => {
+ setToken(res.data.token)
+ this.token = res.data.token
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+ // 获取用户信息
+ getInfo() {
+ return new Promise((resolve, reject) => {
+ getInfo().then(res => {
+ const user = res.data.user
+ const avatar = (user.avatar == "" || user.avatar == null) ? defAva : user.avatar;
+
+ if (res.data.roles && res.data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
+ this.roles = res.data.roles
+ this.permissions = res.data.permissions
+ } else {
+ this.roles = ['ROLE_DEFAULT']
+ }
+ this.id = user.userId
+ this.name = user.userName
+ this.avatar = avatar
+ resolve(res)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+ // 退出系统
+ logOut() {
+ return new Promise((resolve, reject) => {
+ logout(this.token).then(() => {
+ this.token = ''
+ this.roles = []
+ this.permissions = []
+ removeToken()
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ }
+ }
+ })
+
+export default useUserStore
diff --git a/src/store/modules/wms.js b/src/store/modules/wms.js
new file mode 100644
index 0000000..5fff216
--- /dev/null
+++ b/src/store/modules/wms.js
@@ -0,0 +1,125 @@
+import { listWarehouseNoPage } from '@/api/wms/warehouse';
+import { listAreaNoPage } from '@/api/wms/area';
+import { listMerchantNoPage } from "@/api/wms/merchant";
+import { listItemCategory, treeSelectItemCategory } from "@/api/wms/itemCategory";
+import { listItemBrand } from "@/api/wms/itemBrand";
+import {defineStore} from "pinia";
+import {ref} from "vue";
+
+export const useWmsStore = defineStore('wms', () => {
+
+ // 仓库管理
+ const warehouseList = ref([]);
+ const warehouseMap = ref(new Map());
+
+ const getWarehouseList = () => {
+ listWarehouseNoPage({}).then((res) => {
+ warehouseList.value = res.data;
+ const map = new Map();
+ warehouseList.value.forEach((supplier) => {
+ map.set(supplier.id, supplier);
+ });
+ warehouseMap.value = map;
+ });
+ };
+ // 库区管理
+ const areaList = ref([]);
+ const areaMap = ref(new Map());
+
+ const getAreaList = () => {
+ listAreaNoPage({}).then((res) => {
+ areaList.value = res.data;
+ const map = new Map();
+ areaList.value.forEach((supplier) => {
+ map.set(supplier.id, supplier);
+ });
+ areaMap.value = map;
+ });
+ };
+
+ // 企业管理
+ const merchantList = ref([]);
+ const merchantMap = ref(new Map());
+
+ const getMerchantList = () => {
+ listMerchantNoPage({}).then((res) => {
+ merchantList.value = res.data;
+ const map = new Map();
+ merchantList.value.forEach((supplier) => {
+ map.set(supplier.id, supplier);
+ });
+ merchantMap.value = map;
+ });
+ }
+
+ // 商品分类管理
+ const itemCategoryList = ref([])
+ const itemCategoryTreeList = ref([])
+ const itemCategoryMap = ref(new Map())
+
+ const getItemCategoryList = () => {
+ return new Promise((resolve, reject) => {
+ listItemCategory({}).then(res => {
+ itemCategoryList.value = res.data;
+ const map = new Map()
+ itemCategoryList.value.forEach(supplier => {
+ map.set(supplier.id, supplier)
+ })
+ itemCategoryMap.value = map
+ resolve()
+ }).catch(() => reject())
+ })
+ }
+
+ const getItemCategoryTreeList = async () => {
+ return new Promise((resolve, reject) => {
+ treeSelectItemCategory().then(res => {
+ itemCategoryTreeList.value = res.data
+ resolve()
+ }).catch(() => reject())
+ })
+ }
+
+ // 商品品牌管理
+ const itemBrandList = ref([])
+ const itemBrandMap = ref(new Map())
+
+ const getItemBrandList = () => {
+ return new Promise((resolve, reject) => {
+ listItemBrand({}).then(res => {
+ itemBrandList.value = res.data
+ const map = new Map()
+ itemBrandList.value.forEach(supplier => {
+ map.set(supplier.id, {...supplier})
+ })
+ itemBrandMap.value = map
+ resolve()
+ }).catch(() => reject())
+ })
+ }
+
+ return {
+ // 仓库管理
+ warehouseList,
+ warehouseMap,
+ getWarehouseList,
+ // 库区管理
+ areaList,
+ areaMap,
+ getAreaList,
+ // 企业管理
+ merchantList,
+ merchantMap,
+ getMerchantList,
+ // 商品分类管理
+ itemCategoryList,
+ itemCategoryTreeList,
+ itemCategoryMap,
+ getItemCategoryList,
+ getItemCategoryTreeList,
+ // 商品品牌管理
+ itemBrandList,
+ itemBrandMap,
+ getItemBrandList
+ };
+});
diff --git a/src/utils/auth.js b/src/utils/auth.js
new file mode 100644
index 0000000..08a43d6
--- /dev/null
+++ b/src/utils/auth.js
@@ -0,0 +1,15 @@
+import Cookies from 'js-cookie'
+
+const TokenKey = 'Admin-Token'
+
+export function getToken() {
+ return Cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+ return Cookies.set(TokenKey, token)
+}
+
+export function removeToken() {
+ return Cookies.remove(TokenKey)
+}
diff --git a/src/utils/dict.js b/src/utils/dict.js
new file mode 100644
index 0000000..9648f14
--- /dev/null
+++ b/src/utils/dict.js
@@ -0,0 +1,24 @@
+import useDictStore from '@/store/modules/dict'
+import { getDicts } from '@/api/system/dict/data'
+
+/**
+ * 获取字典数据
+ */
+export function useDict(...args) {
+ const res = ref({});
+ return (() => {
+ args.forEach((dictType, index) => {
+ res.value[dictType] = [];
+ const dicts = useDictStore().getDict(dictType);
+ if (dicts) {
+ res.value[dictType] = dicts;
+ } else {
+ getDicts(dictType).then(resp => {
+ res.value[dictType] = resp.data.map(p => ({ label: p.dictLabel, value: p.dictValue, elTagType: p.listClass, elTagClass: p.cssClass }))
+ useDictStore().setDict(dictType, res.value[dictType]);
+ })
+ }
+ })
+ return toRefs(res.value);
+ })()
+}
\ No newline at end of file
diff --git a/src/utils/dynamicTitle.js b/src/utils/dynamicTitle.js
new file mode 100644
index 0000000..64404b2
--- /dev/null
+++ b/src/utils/dynamicTitle.js
@@ -0,0 +1,15 @@
+import store from '@/store'
+import defaultSettings from '@/settings'
+import useSettingsStore from '@/store/modules/settings'
+
+/**
+ * 动态修改标题
+ */
+export function useDynamicTitle() {
+ const settingsStore = useSettingsStore();
+ if (settingsStore.dynamicTitle) {
+ document.title = settingsStore.title + ' - ' + defaultSettings.title;
+ } else {
+ document.title = defaultSettings.title;
+ }
+}
\ No newline at end of file
diff --git a/src/utils/errorCode.js b/src/utils/errorCode.js
new file mode 100644
index 0000000..d2111ee
--- /dev/null
+++ b/src/utils/errorCode.js
@@ -0,0 +1,6 @@
+export default {
+ '401': '认证失败,无法访问系统资源',
+ '403': '当前操作没有权限',
+ '404': '访问资源不存在',
+ 'default': '系统未知错误,请反馈给管理员'
+}
diff --git a/src/utils/getRowSpanMethod.js b/src/utils/getRowSpanMethod.js
new file mode 100644
index 0000000..4ed9782
--- /dev/null
+++ b/src/utils/getRowSpanMethod.js
@@ -0,0 +1,44 @@
+/**
+ * 合并相同数据,导出合并列所需的方法(只适合el-table)
+ * @param {Object} data
+ * @param {Object} rowspanArray
+ */
+export function getRowspanMethod(data, rowspanArray) {
+ /**
+ * 要合并列的数据
+ */
+ const rowspanNumObject = {};
+
+ //初始化 rowspanNumObject
+ rowspanArray.map((item) => {
+ rowspanNumObject[item] = new Array(data.length).fill(1, 0, 1).fill(0, 1);
+ rowspanNumObject[`${item}-index`] = 0;
+ });
+ //计算相关的合并信息
+ for (let i = 1; i < data.length; i++) {
+ rowspanArray.map((key) => {
+ const index = rowspanNumObject[`${key}-index`];
+ if (data[i][key] === data[i - 1][key]) {
+ rowspanNumObject[key][index]++;
+ } else {
+ rowspanNumObject[`${key}-index`] = i;
+ rowspanNumObject[key][i] = 1;
+ }
+ });
+ }
+
+ //提供合并的方法并导出
+ // @ts-ignore
+ const spanMethod = function ({ row, column, rowIndex, columnIndex }) {
+ if (rowspanArray.includes(column['property'])) {
+ const rowspan = rowspanNumObject[column['property']][rowIndex];
+ if (rowspan > 0) {
+ return { rowspan: rowspan, colspan: 1 };
+ }
+ return { rowspan: 0, colspan: 0 };
+ }
+ return { rowspan: 1, colspan: 1 };
+ };
+
+ return spanMethod;
+}
diff --git a/src/utils/gogocodeTransfer.js b/src/utils/gogocodeTransfer.js
new file mode 100644
index 0000000..f773d49
--- /dev/null
+++ b/src/utils/gogocodeTransfer.js
@@ -0,0 +1,77 @@
+const eventRegistryMap = new WeakMap();
+function getRegistry(instance) {
+ let events = eventRegistryMap.get(instance);
+ if (!events) {
+ eventRegistryMap.set(instance, (events = Object.create(null)));
+ }
+ return events;
+}
+export function $on(instance, event, fn) {
+ if (Array.isArray(event)) {
+ event.forEach((e) => $on(instance, e, fn));
+ } else {
+ const events = getRegistry(instance);
+ (events[event] || (events[event] = [])).push(fn);
+ }
+ return instance;
+}
+export function $once(instance, event, fn) {
+ const wrapped = (...args) => {
+ $off(instance, event, wrapped);
+ fn.call(instance, ...args);
+ };
+ wrapped.fn = fn;
+ $on(instance, event, wrapped);
+ return instance;
+}
+export function $off(instance, event, fn) {
+ const vm = instance;
+ // all
+ if (!event) {
+ eventRegistryMap.set(instance, Object.create(null));
+ return vm;
+ }
+ // array of events
+ if (Array.isArray(event)) {
+ event.forEach((e) => $off(instance, e, fn));
+ return vm;
+ }
+ // specific event
+ const events = getRegistry(instance);
+ const cbs = events[event];
+ if (!cbs) {
+ return vm;
+ }
+ if (!fn) {
+ events[event] = undefined;
+ return vm;
+ }
+ events[event] = cbs.filter((cb) => !(cb === fn || cb.fn === fn));
+ return vm;
+}
+export function $emit(instance, event, ...args) {
+ instance && instance.$emit && instance.$emit(event, ...args);
+ const cbs = getRegistry(instance)[event];
+ if (cbs) {
+ cbs.map((cb) => cb.apply(instance, args));
+ }
+ return instance;
+}
+export function $children(instance) {
+ function $walk(vnode, children) {
+ if (vnode.component && vnode.component.proxy) {
+ children.push(vnode.component.proxy);
+ } else if (vnode.shapeFlag & (1 << 4)) {
+ const vnodes = vnode.children;
+ for (let i = 0; i < vnodes.length; i++) {
+ $walk(vnodes[i], children);
+ }
+ }
+ }
+ const root = instance.$.subTree;
+ const children = [];
+ if (root) {
+ $walk(root, children);
+ }
+ return children;
+}
diff --git a/src/utils/index.js b/src/utils/index.js
new file mode 100644
index 0000000..4e65504
--- /dev/null
+++ b/src/utils/index.js
@@ -0,0 +1,390 @@
+import { parseTime } from './ruoyi'
+
+/**
+ * 表格时间格式化
+ */
+export function formatDate(cellValue) {
+ if (cellValue == null || cellValue == "") return "";
+ var date = new Date(cellValue)
+ var year = date.getFullYear()
+ var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
+ var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
+ var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
+ var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
+ var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
+ return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+ if (('' + time).length === 10) {
+ time = parseInt(time) * 1000
+ } else {
+ time = +time
+ }
+ const d = new Date(time)
+ const now = Date.now()
+
+ const diff = (now - d) / 1000
+
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ return parseTime(time, option)
+ } else {
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
+ }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+ url = url == null ? window.location.href : url
+ const search = url.substring(url.lastIndexOf('?') + 1)
+ const obj = {}
+ const reg = /([^?&=]+)=([^?&=]*)/g
+ search.replace(reg, (rs, $1, $2) => {
+ const name = decodeURIComponent($1)
+ let val = decodeURIComponent($2)
+ val = String(val)
+ obj[name] = val
+ return rs
+ })
+ return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+ // returns the byte length of an utf8 string
+ let s = str.length
+ for (var i = str.length - 1; i >= 0; i--) {
+ const code = str.charCodeAt(i)
+ if (code > 0x7f && code <= 0x7ff) s++
+ else if (code > 0x7ff && code <= 0xffff) s += 2
+ if (code >= 0xDC00 && code <= 0xDFFF) i--
+ }
+ return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+ const newArray = []
+ for (let i = 0; i < actual.length; i++) {
+ if (actual[i]) {
+ newArray.push(actual[i])
+ }
+ }
+ return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+ if (!json) return ''
+ return cleanArray(
+ Object.keys(json).map(key => {
+ if (json[key] === undefined) return ''
+ return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ })
+ ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+ const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+ if (!search) {
+ return {}
+ }
+ const obj = {}
+ const searchArr = search.split('&')
+ searchArr.forEach(v => {
+ const index = v.indexOf('=')
+ if (index !== -1) {
+ const name = v.substring(0, index)
+ const val = v.substring(index + 1, v.length)
+ obj[name] = val
+ }
+ })
+ return obj
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+ const div = document.createElement('div')
+ div.innerHTML = val
+ return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+ if (typeof target !== 'object') {
+ target = {}
+ }
+ if (Array.isArray(source)) {
+ return source.slice()
+ }
+ Object.keys(source).forEach(property => {
+ const sourceProperty = source[property]
+ if (typeof sourceProperty === 'object') {
+ target[property] = objectMerge(target[property], sourceProperty)
+ } else {
+ target[property] = sourceProperty
+ }
+ })
+ return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+ if (!element || !className) {
+ return
+ }
+ let classString = element.className
+ const nameIndex = classString.indexOf(className)
+ if (nameIndex === -1) {
+ classString += '' + className
+ } else {
+ classString =
+ classString.substr(0, nameIndex) +
+ classString.substr(nameIndex + className.length)
+ }
+ element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+ if (type === 'start') {
+ return new Date().getTime() - 3600 * 1000 * 24 * 90
+ } else {
+ return new Date(new Date().toDateString())
+ }
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+ let timeout, args, context, timestamp, result
+
+ const later = function() {
+ // 据上一次触发时间间隔
+ const last = +new Date() - timestamp
+
+ // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
+ if (last < wait && last > 0) {
+ timeout = setTimeout(later, wait - last)
+ } else {
+ timeout = null
+ // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+ if (!immediate) {
+ result = func.apply(context, args)
+ if (!timeout) context = args = null
+ }
+ }
+ }
+
+ return function(...args) {
+ context = this
+ timestamp = +new Date()
+ const callNow = immediate && !timeout
+ // 如果延时不存在,重新设定延时
+ if (!timeout) timeout = setTimeout(later, wait)
+ if (callNow) {
+ result = func.apply(context, args)
+ context = args = null
+ }
+
+ return result
+ }
+}
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone(source) {
+ if (!source && typeof source !== 'object') {
+ throw new Error('error arguments', 'deepClone')
+ }
+ const targetObj = source.constructor === Array ? [] : {}
+ Object.keys(source).forEach(keys => {
+ if (source[keys] && typeof source[keys] === 'object') {
+ targetObj[keys] = deepClone(source[keys])
+ } else {
+ targetObj[keys] = source[keys]
+ }
+ })
+ return targetObj
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+ return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+ const timestamp = +new Date() + ''
+ const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+ return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+ return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+ if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+ if (hasClass(ele, cls)) {
+ const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+ ele.className = ele.className.replace(reg, ' ')
+ }
+}
+
+export function makeMap(str, expectsLowerCase) {
+ const map = Object.create(null)
+ const list = str.split(',')
+ for (let i = 0; i < list.length; i++) {
+ map[list[i]] = true
+ }
+ return expectsLowerCase
+ ? val => map[val.toLowerCase()]
+ : val => map[val]
+}
+
+export const exportDefault = 'export default '
+
+export const beautifierConf = {
+ html: {
+ indent_size: '2',
+ indent_char: ' ',
+ max_preserve_newlines: '-1',
+ preserve_newlines: false,
+ keep_array_indentation: false,
+ break_chained_methods: false,
+ indent_scripts: 'separate',
+ brace_style: 'end-expand',
+ space_before_conditional: true,
+ unescape_strings: false,
+ jslint_happy: false,
+ end_with_newline: true,
+ wrap_line_length: '110',
+ indent_inner_html: true,
+ comma_first: false,
+ e4x: true,
+ indent_empty_lines: true
+ },
+ js: {
+ indent_size: '2',
+ indent_char: ' ',
+ max_preserve_newlines: '-1',
+ preserve_newlines: false,
+ keep_array_indentation: false,
+ break_chained_methods: false,
+ indent_scripts: 'normal',
+ brace_style: 'end-expand',
+ space_before_conditional: true,
+ unescape_strings: false,
+ jslint_happy: true,
+ end_with_newline: true,
+ wrap_line_length: '110',
+ indent_inner_html: true,
+ comma_first: false,
+ e4x: true,
+ indent_empty_lines: true
+ }
+}
+
+// 首字母大小
+export function titleCase(str) {
+ return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
+}
+
+// 下划转驼峰
+export function camelCase(str) {
+ return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
+}
+
+export function isNumberStr(str) {
+ return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
+}
+
diff --git a/src/utils/jsencrypt.js b/src/utils/jsencrypt.js
new file mode 100644
index 0000000..78d9523
--- /dev/null
+++ b/src/utils/jsencrypt.js
@@ -0,0 +1,30 @@
+import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
+
+// 密钥对生成 http://web.chacuo.net/netrsakeypair
+
+const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
+ 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
+
+const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
+ '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
+ 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
+ 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
+ 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
+ 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
+ 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
+ 'UP8iWi1Qw0Y='
+
+// 加密
+export function encrypt(txt) {
+ const encryptor = new JSEncrypt()
+ encryptor.setPublicKey(publicKey) // 设置公钥
+ return encryptor.encrypt(txt) // 对数据进行加密
+}
+
+// 解密
+export function decrypt(txt) {
+ const encryptor = new JSEncrypt()
+ encryptor.setPrivateKey(privateKey) // 设置私钥
+ return encryptor.decrypt(txt) // 对数据进行解密
+}
+
diff --git a/src/utils/permission.js b/src/utils/permission.js
new file mode 100644
index 0000000..93fee87
--- /dev/null
+++ b/src/utils/permission.js
@@ -0,0 +1,51 @@
+import useUserStore from '@/store/modules/user'
+
+/**
+ * 字符权限校验
+ * @param {Array} value 校验值
+ * @returns {Boolean}
+ */
+export function checkPermi(value) {
+ if (value && value instanceof Array && value.length > 0) {
+ const permissions = useUserStore().permissions
+ const permissionDatas = value
+ const all_permission = "*:*:*";
+
+ const hasPermission = permissions.some(permission => {
+ return all_permission === permission || permissionDatas.includes(permission)
+ })
+
+ if (!hasPermission) {
+ return false
+ }
+ return true
+ } else {
+ console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`)
+ return false
+ }
+}
+
+/**
+ * 角色权限校验
+ * @param {Array} value 校验值
+ * @returns {Boolean}
+ */
+export function checkRole(value) {
+ if (value && value instanceof Array && value.length > 0) {
+ const roles = useUserStore().roles
+ const permissionRoles = value
+ const super_admin = "admin";
+
+ const hasRole = roles.some(role => {
+ return super_admin === role || permissionRoles.includes(role)
+ })
+
+ if (!hasRole) {
+ return false
+ }
+ return true
+ } else {
+ console.error(`need roles! Like checkRole="['admin','editor']"`)
+ return false
+ }
+}
\ No newline at end of file
diff --git a/src/utils/request.js b/src/utils/request.js
new file mode 100644
index 0000000..5cbd3b4
--- /dev/null
+++ b/src/utils/request.js
@@ -0,0 +1,149 @@
+import axios from 'axios'
+import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
+import { getToken } from '@/utils/auth'
+import errorCode from '@/utils/errorCode'
+import { tansParams, blobValidate } from '@/utils/ruoyi'
+import cache from '@/plugins/cache'
+import { saveAs } from 'file-saver'
+import useUserStore from '@/store/modules/user'
+
+let downloadLoadingInstance;
+// 是否显示重新登录
+export let isRelogin = { show: false };
+
+axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+// 对应国际化资源文件后缀
+axios.defaults.headers['Content-Language'] = 'zh_CN'
+// 创建axios实例
+const service = axios.create({
+ // axios中请求配置有baseURL选项,表示请求URL公共部分
+ baseURL: import.meta.env.VITE_APP_BASE_API,
+ // 超时
+ timeout: 10000
+})
+
+// request拦截器
+service.interceptors.request.use(config => {
+ // 是否需要设置 token
+ const isToken = (config.headers || {}).isToken === false
+ // 是否需要防止数据重复提交
+ const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
+ if (getToken() && !isToken) {
+ config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
+ }
+ // get请求映射params参数
+ if (config.method === 'get' && config.params) {
+ let url = config.url + '?' + tansParams(config.params);
+ url = url.slice(0, -1);
+ config.params = {};
+ config.url = url;
+ }
+ if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
+ const requestObj = {
+ url: config.url,
+ data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
+ time: new Date().getTime()
+ }
+ const sessionObj = cache.session.getJSON('sessionObj')
+ if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
+ cache.session.setJSON('sessionObj', requestObj)
+ } else {
+ const s_url = sessionObj.url; // 请求地址
+ const s_data = sessionObj.data; // 请求数据
+ const s_time = sessionObj.time; // 请求时间
+ const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
+ if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
+ const message = '数据正在处理,请勿重复提交';
+ console.warn(`[${s_url}]: ` + message)
+ return Promise.reject(new Error(message))
+ } else {
+ cache.session.setJSON('sessionObj', requestObj)
+ }
+ }
+ }
+ return config
+}, error => {
+ Promise.reject(error)
+})
+
+// 响应拦截器
+service.interceptors.response.use(res => {
+ // 未设置状态码则默认成功状态
+ const code = res.data.code || 200;
+ // 获取错误信息
+ const msg = errorCode[code] || res.data.msg || errorCode['default']
+ // 二进制数据则直接返回
+ if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
+ return res.data
+ }
+ if (code === 401) {
+ if (!isRelogin.show) {
+ isRelogin.show = true;
+ ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
+ isRelogin.show = false;
+ useUserStore().logOut().then(() => {
+ location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
+ })
+ }).catch(() => {
+ isRelogin.show = false;
+ });
+ }
+ return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+ } else if (code === 409) {
+ return Promise.reject(409)
+ } else if (code === 500) {
+ ElMessage({ message: msg, type: 'error' })
+ return Promise.reject(new Error(msg))
+ } else if (code === 601) {
+ ElMessage({ message: msg, type: 'warning' })
+ return Promise.reject(new Error(msg))
+ } else if (code !== 200) {
+ ElNotification.error({ title: msg })
+ return Promise.reject('error')
+ } else {
+ return Promise.resolve(res.data)
+ }
+ },
+ error => {
+ ('err' + error)
+ let { message } = error;
+ if (message == "Network Error") {
+ message = "后端接口连接异常";
+ } else if (message.includes("timeout")) {
+ message = "系统接口请求超时";
+ } else if (message.includes("Request failed with status code")) {
+ message = "系统接口" + message.substr(message.length - 3) + "异常";
+ }
+ ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
+ return Promise.reject(error)
+ }
+)
+
+// 通用下载方法
+export function download(url, params, filename, config) {
+ downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
+ return service.post(url, params, {
+ transformRequest: [(params) => { return tansParams(params) }],
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+ responseType: 'blob',
+ ...config
+ }).then(async (data) => {
+ const isBlob = blobValidate(data);
+ if (isBlob) {
+ const blob = new Blob([data])
+ saveAs(blob, filename)
+ } else {
+ const resText = await data.text();
+ const rspObj = JSON.parse(resText);
+ const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
+ ElMessage.error(errMsg);
+ }
+ downloadLoadingInstance.close();
+ }).catch((r) => {
+ console.error(r)
+ ElMessage.error('下载文件出现错误,请联系管理员!')
+ downloadLoadingInstance.close();
+ })
+}
+
+export default service
diff --git a/src/utils/ruoyi.js b/src/utils/ruoyi.js
new file mode 100644
index 0000000..dddc5df
--- /dev/null
+++ b/src/utils/ruoyi.js
@@ -0,0 +1,276 @@
+
+
+/**
+ * 通用js方法封装处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+// 日期格式化
+export function parseTime(time, pattern) {
+ if (arguments.length === 0 || !time) {
+ return null
+ }
+ const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+ time = parseInt(time)
+ } else if (typeof time === 'string') {
+ time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
+ }
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+ let value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
+ if (result.length > 0 && value < 10) {
+ value = '0' + value
+ }
+ return value || 0
+ })
+ return time_str
+}
+
+// 表单重置
+export function resetForm(refName) {
+ if (this.$refs[refName]) {
+ this.$refs[refName].resetFields();
+ }
+}
+
+// 添加日期范围
+export function addDateRange(params, dateRange, propName) {
+ let search = params;
+ search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
+ dateRange = Array.isArray(dateRange) ? dateRange : [];
+ if (typeof (propName) === 'undefined') {
+ search.params['beginTime'] = dateRange[0];
+ search.params['endTime'] = dateRange[1];
+ } else {
+ search.params['begin' + propName] = dateRange[0];
+ search.params['end' + propName] = dateRange[1];
+ }
+ return search;
+}
+
+// 回显数据字典
+export function selectDictLabel(datas, value) {
+ if (value === undefined) {
+ return "";
+ }
+ var actions = [];
+ Object.keys(datas).some((key) => {
+ if (datas[key].value == ('' + value)) {
+ actions.push(datas[key].label);
+ return true;
+ }
+ })
+ if (actions.length === 0) {
+ actions.push(value);
+ }
+ return actions.join('');
+}
+
+// 回显数据字典(字符串数组)
+export function selectDictLabels(datas, value, separator) {
+ if (value === undefined || value.length ===0) {
+ return "";
+ }
+ if (Array.isArray(value)) {
+ value = value.join(",");
+ }
+ var actions = [];
+ var currentSeparator = undefined === separator ? "," : separator;
+ var temp = value.split(currentSeparator);
+ Object.keys(value.split(currentSeparator)).some((val) => {
+ var match = false;
+ Object.keys(datas).some((key) => {
+ if (datas[key].value == ('' + temp[val])) {
+ actions.push(datas[key].label + currentSeparator);
+ match = true;
+ }
+ })
+ if (!match) {
+ actions.push(temp[val] + currentSeparator);
+ }
+ })
+ return actions.join('').substring(0, actions.join('').length - 1);
+}
+
+// 字符串格式化(%s )
+export function sprintf(str) {
+ var args = arguments, flag = true, i = 1;
+ str = str.replace(/%s/g, function () {
+ var arg = args[i++];
+ if (typeof arg === 'undefined') {
+ flag = false;
+ return '';
+ }
+ return arg;
+ });
+ return flag ? str : '';
+}
+
+// 转换字符串,undefined,null等转化为""
+export function parseStrEmpty(str) {
+ if (!str || str == "undefined" || str == "null") {
+ return "";
+ }
+ return str;
+}
+
+// 数据合并
+export function mergeRecursive(source, target) {
+ for (var p in target) {
+ try {
+ if (target[p].constructor == Object) {
+ source[p] = mergeRecursive(source[p], target[p]);
+ } else {
+ source[p] = target[p];
+ }
+ } catch (e) {
+ source[p] = target[p];
+ }
+ }
+ return source;
+};
+
+/**
+ * 构造树型结构数据
+ * @param {*} data 数据源
+ * @param {*} id id字段 默认 'id'
+ * @param {*} parentId 父节点字段 默认 'parentId'
+ * @param {*} children 孩子节点字段 默认 'children'
+ */
+export function handleTree(data, id, parentId, children) {
+ let config = {
+ id: id || 'id',
+ parentId: parentId || 'parentId',
+ childrenList: children || 'children'
+ };
+
+ var childrenListMap = {};
+ var nodeIds = {};
+ var tree = [];
+
+ for (let d of data) {
+ let parentId = d[config.parentId];
+ if (childrenListMap[parentId] == null) {
+ childrenListMap[parentId] = [];
+ }
+ nodeIds[d[config.id]] = d;
+ childrenListMap[parentId].push(d);
+ }
+
+ for (let d of data) {
+ let parentId = d[config.parentId];
+ if (nodeIds[parentId] == null) {
+ tree.push(d);
+ }
+ }
+
+ for (let t of tree) {
+ adaptToChildrenList(t);
+ }
+
+ function adaptToChildrenList(o) {
+ if (childrenListMap[o[config.id]] !== null) {
+ o[config.childrenList] = childrenListMap[o[config.id]];
+ }
+ if (o[config.childrenList]) {
+ for (let c of o[config.childrenList]) {
+ adaptToChildrenList(c);
+ }
+ }
+ }
+ return tree;
+}
+
+/**
+* 参数处理
+* @param {*} params 参数
+*/
+export function tansParams(params) {
+ let result = ''
+ for (const propName of Object.keys(params)) {
+ const value = params[propName];
+ var part = encodeURIComponent(propName) + "=";
+ if (value !== null && value !== "" && typeof (value) !== "undefined") {
+ if (typeof value === 'object') {
+ for (const key of Object.keys(value)) {
+ if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
+ let params = propName + '[' + key + ']';
+ var subPart = encodeURIComponent(params) + "=";
+ result += subPart + encodeURIComponent(value[key]) + "&";
+ }
+ }
+ } else {
+ result += part + encodeURIComponent(value) + "&";
+ }
+ }
+ }
+ return result
+}
+
+
+// 返回项目路径
+export function getNormalPath(p) {
+ if (p.length === 0 || !p || p == 'undefined') {
+ return p
+ };
+ let res = p.replace('//', '/')
+ if (res[res.length - 1] === '/') {
+ return res.slice(0, res.length - 1)
+ }
+ return res;
+}
+
+// 验证是否为blob格式
+export function blobValidate(data) {
+ return data.type !== 'application/json'
+}
+
+export function numSub(num1, num2) {
+ let baseNum1;
+ let baseNum2;
+ try {
+ baseNum1 = num1.toString().split(".")[1].length;
+ } catch (e) {
+ baseNum1 = 0;
+ }
+ try {
+ baseNum2 = num2.toString().split(".")[1].length;
+ } catch (e) {
+ baseNum2 = 0;
+ }
+ const baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
+ const precision = baseNum1 >= baseNum2 ? baseNum1 : baseNum2;
+ return Number(((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision));
+}
+
+export function generateNo() {
+ // 获取当前日期
+ const now = new Date();
+ // 获取月和日
+ const month = String(now.getMonth() + 1).padStart(2, '0'); // getMonth() 返回的是0-11,所以需要加1
+ const day = String(now.getDate()).padStart(2, '0'); // getDate() 返回的是1-31
+ // 生成 0 到 9999 之间的随机整数
+ const randomNum = Math.floor(Math.random() * 10000);
+ // 返回
+ return month + '' + day + '' + String(randomNum).padStart(4, '0');
+}
diff --git a/src/utils/scroll-to.js b/src/utils/scroll-to.js
new file mode 100644
index 0000000..c5d8e04
--- /dev/null
+++ b/src/utils/scroll-to.js
@@ -0,0 +1,58 @@
+Math.easeInOutQuad = function(t, b, c, d) {
+ t /= d / 2
+ if (t < 1) {
+ return c / 2 * t * t + b
+ }
+ t--
+ return -c / 2 * (t * (t - 2) - 1) + b
+}
+
+// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
+var requestAnimFrame = (function() {
+ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
+})()
+
+/**
+ * Because it's so fucking difficult to detect the scrolling element, just move them all
+ * @param {number} amount
+ */
+function move(amount) {
+ document.documentElement.scrollTop = amount
+ document.body.parentNode.scrollTop = amount
+ document.body.scrollTop = amount
+}
+
+function position() {
+ return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
+}
+
+/**
+ * @param {number} to
+ * @param {number} duration
+ * @param {Function} callback
+ */
+export function scrollTo(to, duration, callback) {
+ const start = position()
+ const change = to - start
+ const increment = 20
+ let currentTime = 0
+ duration = (typeof (duration) === 'undefined') ? 500 : duration
+ var animateScroll = function() {
+ // increment the time
+ currentTime += increment
+ // find the value with the quadratic in-out easing function
+ var val = Math.easeInOutQuad(currentTime, start, change, duration)
+ // move the document.body
+ move(val)
+ // do the animation unless its over
+ if (currentTime < duration) {
+ requestAnimFrame(animateScroll)
+ } else {
+ if (callback && typeof (callback) === 'function') {
+ // the animation is done so lets callback
+ callback()
+ }
+ }
+ }
+ animateScroll()
+}
diff --git a/src/utils/theme.js b/src/utils/theme.js
new file mode 100644
index 0000000..f4badc6
--- /dev/null
+++ b/src/utils/theme.js
@@ -0,0 +1,49 @@
+// 处理主题样式
+export function handleThemeStyle(theme) {
+ document.documentElement.style.setProperty('--el-color-primary', theme)
+ for (let i = 1; i <= 9; i++) {
+ document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(theme, i / 10)}`)
+ }
+ for (let i = 1; i <= 9; i++) {
+ document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, `${getDarkColor(theme, i / 10)}`)
+ }
+}
+
+// hex颜色转rgb颜色
+export function hexToRgb(str) {
+ str = str.replace('#', '')
+ let hexs = str.match(/../g)
+ for (let i = 0; i < 3; i++) {
+ hexs[i] = parseInt(hexs[i], 16)
+ }
+ return hexs
+}
+
+// rgb颜色转Hex颜色
+export function rgbToHex(r, g, b) {
+ let hexs = [r.toString(16), g.toString(16), b.toString(16)]
+ for (let i = 0; i < 3; i++) {
+ if (hexs[i].length == 1) {
+ hexs[i] = `0${hexs[i]}`
+ }
+ }
+ return `#${hexs.join('')}`
+}
+
+// 变浅颜色值
+export function getLightColor(color, level) {
+ let rgb = hexToRgb(color)
+ for (let i = 0; i < 3; i++) {
+ rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
+ }
+ return rgbToHex(rgb[0], rgb[1], rgb[2])
+}
+
+// 变深颜色值
+export function getDarkColor(color, level) {
+ let rgb = hexToRgb(color)
+ for (let i = 0; i < 3; i++) {
+ rgb[i] = Math.floor(rgb[i] * (1 - level))
+ }
+ return rgbToHex(rgb[0], rgb[1], rgb[2])
+}
diff --git a/src/utils/validate.js b/src/utils/validate.js
new file mode 100644
index 0000000..702add4
--- /dev/null
+++ b/src/utils/validate.js
@@ -0,0 +1,93 @@
+/**
+ * 判断url是否是http或https
+ * @param {string} path
+ * @returns {Boolean}
+ */
+ export function isHttp(url) {
+ return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
+}
+
+/**
+ * 判断path是否为外链
+ * @param {string} path
+ * @returns {Boolean}
+ */
+ export function isExternal(path) {
+ return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+ const valid_map = ['admin', 'editor']
+ return valid_map.indexOf(str.trim()) >= 0
+}
+
+/**
+ * @param {string} url
+ * @returns {Boolean}
+ */
+export function validURL(url) {
+ const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+ return reg.test(url)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validLowerCase(str) {
+ const reg = /^[a-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUpperCase(str) {
+ const reg = /^[A-Z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validAlphabets(str) {
+ const reg = /^[A-Za-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} email
+ * @returns {Boolean}
+ */
+export function validEmail(email) {
+ const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+ return reg.test(email)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function isString(str) {
+ if (typeof str === 'string' || str instanceof String) {
+ return true
+ }
+ return false
+}
+
+/**
+ * @param {Array} arg
+ * @returns {Boolean}
+ */
+export function isArray(arg) {
+ if (typeof Array.isArray === 'undefined') {
+ return Object.prototype.toString.call(arg) === '[object Array]'
+ }
+ return Array.isArray(arg)
+}
diff --git a/src/views/components/InventoryDetailSelect.vue b/src/views/components/InventoryDetailSelect.vue
new file mode 100644
index 0000000..7f0894e
--- /dev/null
+++ b/src/views/components/InventoryDetailSelect.vue
@@ -0,0 +1,278 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30天内
+ 60天内
+ 90天内
+ 120天内
+ 180天内
+ 365天内
+
+
+
+ 查询
+
+
+
+
+
+
+
+ {{ row.item.itemName }}
+ 编号:{{ row.item.itemCode }}
+ 品牌:{{ useWmsStore().itemBrandMap.get(row.item.itemBrand).brandName }}
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 编号:{{ row.itemSku.skuCode }}
+ 条码:{{ row.itemSku.barcode }}
+
+
+
+
+
+ 生产日期:{{ parseTime(row.productionDate, '{y}-{m}-{d}') }}
+ 过期日期:{{ parseTime(row.expirationDate, '{y}-{m}-{d}') }}
+
+
+
+
+ {{ parseTime(row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
+
+
+
diff --git a/src/views/components/InventorySelect.vue b/src/views/components/InventorySelect.vue
new file mode 100644
index 0000000..ee5dd73
--- /dev/null
+++ b/src/views/components/InventorySelect.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+
+ {{ row.item.itemName }}
+ 编号:{{ row.item.itemCode }}
+ 品牌:{{ useWmsStore().itemBrandMap.get(row.item.itemBrand).brandName }}
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 编号:{{ row.itemSku.skuCode }}
+ 条码:{{ row.itemSku.barcode }}
+
+
+
+
+
+
成本价:
+
{{ (row.itemSku.costPrice || row.itemSku.costPrice === 0) ? row.itemSku.costPrice : '' }}
+
+
+
销售价:
+
{{
+ (row.itemSku.sellingPrice || row.itemSku.sellingPrice === 0) ? row.itemSku.sellingPrice : ''
+ }}
+
+
+
+
+
+
+
+
净重:
+
{{ (row.itemSku.netWeight || row.itemSku.netWeight === 0) ? row.itemSku.netWeight : '' }}
+
+
+
毛重:
+
{{ (row.itemSku.grossWeight || row.itemSku.grossWeight === 0) ? row.itemSku.grossWeight : '' }}
+
+
+
+
+
+ {{ getVolumeText(row.itemSku) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
+
+
+
diff --git a/src/views/components/SkuSelect.vue b/src/views/components/SkuSelect.vue
new file mode 100644
index 0000000..98acce5
--- /dev/null
+++ b/src/views/components/SkuSelect.vue
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+
+ {{ row.item.itemName }}
+ 编号:{{ row.item.itemCode }}
+ 品牌:{{ useWmsStore().itemBrandMap.get(row.item.itemBrand).brandName }}
+
+
+
+
+ {{ row.skuName }}
+ 编号:{{ row.skuCode }}
+ 条码:{{ row.barcode }}
+
+
+
+
+
+
成本价:
+
{{ (row.costPrice || row.costPrice === 0) ? row.costPrice : '' }}
+
+
+
销售价:
+
{{ (row.sellingPrice || row.sellingPrice === 0) ? row.sellingPrice : '' }}
+
+
+
+
+
+
+
净重:
+
{{ (row.netWeight || row.netWeight === 0) ? row.netWeight : '' }}
+
+
+
毛重:
+
{{ (row.grossWeight || row.grossWeight === 0) ? row.grossWeight : '' }}
+
+
+
+
+
+ {{ getVolumeText(row) }}
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+ 创建商品
+ 刷新
+
+
+ 取消
+ 确认
+
+
+
+
+
+
+
+
diff --git a/src/views/components/WarehouseCascader.vue b/src/views/components/WarehouseCascader.vue
new file mode 100644
index 0000000..4158d72
--- /dev/null
+++ b/src/views/components/WarehouseCascader.vue
@@ -0,0 +1,165 @@
+
+ visibleChange(v,'cascader', 'ship')"
+ >
+
+
+
diff --git a/src/views/demo/demo/index.vue b/src/views/demo/demo/index.vue
new file mode 100644
index 0000000..fe1d8df
--- /dev/null
+++ b/src/views/demo/demo/index.vue
@@ -0,0 +1,403 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 搜索(自定义分页接口)
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导入(校验)
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+ {{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 将文件拖到此处,或点击上传
+
+
+
+
+
+
+
diff --git a/src/views/demo/tree/index.vue b/src/views/demo/tree/index.vue
new file mode 100644
index 0000000..f7cb82c
--- /dev/null
+++ b/src/views/demo/tree/index.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 展开/折叠
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+ 修改
+ 新增
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/error/401.vue b/src/views/error/401.vue
new file mode 100644
index 0000000..1ba3792
--- /dev/null
+++ b/src/views/error/401.vue
@@ -0,0 +1,82 @@
+
+
+
+ 返回
+
+
+
+
+ 401错误!
+
+ 您没有访问权限!
+ 对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/error/404.vue b/src/views/error/404.vue
new file mode 100644
index 0000000..f205303
--- /dev/null
+++ b/src/views/error/404.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+ 404错误!
+
+
+ {{ message }}
+
+
+ 对不起,您正在寻找的页面不存在。尝试检查URL的错误,然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。
+
+
+ 返回首页
+
+
+
+
+
+
+
+
+
diff --git a/src/views/index.vue b/src/views/index.vue
new file mode 100644
index 0000000..f12068d
--- /dev/null
+++ b/src/views/index.vue
@@ -0,0 +1,78 @@
+
+
+ 正在开发
+
+
+
+
+
+
+
diff --git a/src/views/login.vue b/src/views/login.vue
new file mode 100644
index 0000000..fc169af
--- /dev/null
+++ b/src/views/login.vue
@@ -0,0 +1,246 @@
+
+
+
+ cmvr-wms后台管理系统
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 记住密码
+
+
+ 登 录
+ 登 录 中...
+
+
+ 立即注册
+
+
+
+
+
+
关注公众号 回复仓库 获取体验账号
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/admin/index.vue b/src/views/monitor/admin/index.vue
new file mode 100644
index 0000000..1b13d64
--- /dev/null
+++ b/src/views/monitor/admin/index.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/src/views/monitor/cache/index.vue b/src/views/monitor/cache/index.vue
new file mode 100644
index 0000000..ccca20d
--- /dev/null
+++ b/src/views/monitor/cache/index.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+ 基本信息
+
+
+
+
+ Redis版本
+ {{ cache.info.redis_version }}
+ 运行模式
+ {{ cache.info.redis_mode == "standalone" ? "单机" : "集群" }}
+ 端口
+ {{ cache.info.tcp_port }}
+ 客户端数
+ {{ cache.info.connected_clients }}
+
+
+ 运行时间(天)
+ {{ cache.info.uptime_in_days }}
+ 使用内存
+ {{ cache.info.used_memory_human }}
+ 使用CPU
+ {{ parseFloat(cache.info.used_cpu_user_children).toFixed(2) }}
+ 内存配置
+ {{ cache.info.maxmemory_human }}
+
+
+ AOF是否开启
+ {{ cache.info.aof_enabled == "0" ? "否" : "是" }}
+ RDB是否成功
+ {{ cache.info.rdb_last_bgsave_status }}
+ Key数量
+ {{ cache.dbSize }}
+ 网络入口/出口
+ {{ cache.info.instantaneous_input_kbps }}kps/{{cache.info.instantaneous_output_kbps}}kps
+
+
+
+
+
+
+
+
+
+ 命令统计
+
+
+
+
+
+
+ 内存信息
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/cache/list.vue b/src/views/monitor/cache/list.vue
new file mode 100644
index 0000000..0728799
--- /dev/null
+++ b/src/views/monitor/cache/list.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+ 缓存列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 键名列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 缓存内容
+ 清理全部
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue
new file mode 100644
index 0000000..bd58a5d
--- /dev/null
+++ b/src/views/monitor/logininfor/index.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 删除
+
+
+ 清空
+
+
+ 解锁
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.loginTime) }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue
new file mode 100644
index 0000000..eb17ebc
--- /dev/null
+++ b/src/views/monitor/online/index.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ {{ (pageNum - 1) * pageSize + scope.$index + 1 }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.loginTime) }}
+
+
+
+
+ 强退
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue
new file mode 100644
index 0000000..6f13018
--- /dev/null
+++ b/src/views/monitor/operlog/index.vue
@@ -0,0 +1,305 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 删除
+
+
+ 清空
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.operTime) }}
+
+
+
+
+ {{ scope.row.costTime }}毫秒
+
+
+
+
+ 详细
+
+
+
+
+
+
+
+
+
+
+
+ {{ form.operName }} / {{form.deptName}} / {{ form.operIp }} / {{ form.operLocation }}
+
+
+ {{ form.requestMethod }} {{form.operUrl }}
+
+
+ {{ form.title }} / {{ typeFormat(form) }}
+
+
+ {{ form.method }}
+
+
+ {{ form.operParam }}
+
+
+ {{ form.jsonResult }}
+
+
+
+ 正常
+ 失败
+
+
+
+ {{ form.costTime }}毫秒
+
+
+ {{ parseTime(form.operTime) }}
+
+
+ {{ form.errorMsg }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/xxljob/index.vue b/src/views/monitor/xxljob/index.vue
new file mode 100644
index 0000000..9a73f52
--- /dev/null
+++ b/src/views/monitor/xxljob/index.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue
new file mode 100644
index 0000000..a469960
--- /dev/null
+++ b/src/views/redirect/index.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/register.vue b/src/views/register.vue
new file mode 100644
index 0000000..3b4d9d3
--- /dev/null
+++ b/src/views/register.vue
@@ -0,0 +1,219 @@
+
+
+
+ cmvr-wms后台管理系统
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 注 册
+ 注 册 中...
+
+
+ 使用已有账户登录
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue
new file mode 100644
index 0000000..5452f1d
--- /dev/null
+++ b/src/views/system/config/index.vue
@@ -0,0 +1,306 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 刷新缓存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
new file mode 100644
index 0000000..f37a6ba
--- /dev/null
+++ b/src/views/system/dept/index.vue
@@ -0,0 +1,278 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 展开/折叠
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 新增
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/dict/data.vue b/src/views/system/dict/data.vue
new file mode 100644
index 0000000..a616003
--- /dev/null
+++ b/src/views/system/dict/data.vue
@@ -0,0 +1,350 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+ {{ scope.row.dictLabel }}
+ {{ scope.row.dictLabel }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue
new file mode 100644
index 0000000..b52d63d
--- /dev/null
+++ b/src/views/system/dict/index.vue
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 刷新缓存
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.dictType }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
new file mode 100644
index 0000000..96e528f
--- /dev/null
+++ b/src/views/system/menu/index.vue
@@ -0,0 +1,441 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 展开/折叠
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 新增
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 目录
+ 菜单
+ 按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是否外链
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+ 路由地址
+
+
+
+
+
+
+
+
+
+
+
+
+ 组件路径
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 权限字符
+
+
+
+
+
+
+
+
+
+
+
+
+ 路由参数
+
+
+
+
+
+
+
+
+
+
+
+ 是否缓存
+
+
+
+ 缓存
+ 不缓存
+
+
+
+
+
+
+
+
+
+
+ 显示状态
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+ 菜单状态
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue
new file mode 100644
index 0000000..f282a4a
--- /dev/null
+++ b/src/views/system/notice/index.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/oss/config.vue b/src/views/system/oss/config.vue
new file mode 100644
index 0000000..bc23b6e
--- /dev/null
+++ b/src/views/system/oss/config.vue
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ private
+ public
+ custom
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.label}}
+
+
+
+
+ private
+ public
+ custom
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/oss/index.vue b/src/views/system/oss/index.vue
new file mode 100644
index 0000000..ecc045c
--- /dev/null
+++ b/src/views/system/oss/index.vue
@@ -0,0 +1,372 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 上传文件
+
+
+ 上传图片
+
+
+ 删除
+
+
+ 预览开关 : {{previewListResource ? "禁用" : "启用"}}
+
+
+ 配置管理
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+ 下载
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue
new file mode 100644
index 0000000..4b8a156
--- /dev/null
+++ b/src/views/system/post/index.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue
new file mode 100644
index 0000000..66b5f5e
--- /dev/null
+++ b/src/views/system/role/authUser.vue
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 添加用户
+
+
+ 批量取消授权
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 取消授权
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
new file mode 100644
index 0000000..2ecbc7f
--- /dev/null
+++ b/src/views/system/role/index.vue
@@ -0,0 +1,560 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 权限字符
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+ 展开/折叠
+ 全选/全不选
+ 父子联动
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 展开/折叠
+ 全选/全不选
+ 父子联动
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue
new file mode 100644
index 0000000..9be1ec9
--- /dev/null
+++ b/src/views/system/role/selectUser.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue
new file mode 100644
index 0000000..5f1f2fe
--- /dev/null
+++ b/src/views/system/user/authRole.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ (pageNum - 1) * pageSize + scope.$index + 1 }}
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+ 提交
+ 返回
+
+
+
+
+
+
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
new file mode 100644
index 0000000..66b7193
--- /dev/null
+++ b/src/views/system/user/index.vue
@@ -0,0 +1,611 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导入
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 将文件拖到此处,或点击上传
+
+
+
+ 是否更新已经存在的用户数据
+
+
仅允许导入xls、xlsx格式文件。
+
下载模板
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue
new file mode 100644
index 0000000..617057f
--- /dev/null
+++ b/src/views/system/user/profile/index.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+ 个人信息
+
+
+
+
+
+
+
+
+ 用户名称
+ {{ state.user.userName }}
+
+
+ 手机号码
+ {{ state.user.phonenumber }}
+
+
+ 用户邮箱
+ {{ state.user.email }}
+
+
+ 所属部门
+ {{ state.user.dept.deptName }} / {{ state.postGroup }}
+
+
+ 所属角色
+ {{ state.roleGroup }}
+
+
+ 创建日期
+ {{ state.user.createTime }}
+
+
+
+
+
+
+
+
+
+ 基本资料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue
new file mode 100644
index 0000000..dec2d79
--- /dev/null
+++ b/src/views/system/user/profile/resetPwd.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue
new file mode 100644
index 0000000..f576c95
--- /dev/null
+++ b/src/views/system/user/profile/userAvatar.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提 交
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue
new file mode 100644
index 0000000..2d62c84
--- /dev/null
+++ b/src/views/system/user/profile/userInfo.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
diff --git a/src/views/tool/build/index.vue b/src/views/tool/build/index.vue
new file mode 100644
index 0000000..de4862d
--- /dev/null
+++ b/src/views/tool/build/index.vue
@@ -0,0 +1,3 @@
+
+ 表单构建(由于此功能的开源组件不支持 VUE3+TS 故暂时无法使用)
+
diff --git a/src/views/tool/gen/basicInfoForm.vue b/src/views/tool/gen/basicInfoForm.vue
new file mode 100644
index 0000000..39c8515
--- /dev/null
+++ b/src/views/tool/gen/basicInfoForm.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/tool/gen/editTable.vue b/src/views/tool/gen/editTable.vue
new file mode 100644
index 0000000..0aabe3c
--- /dev/null
+++ b/src/views/tool/gen/editTable.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.dictName }}
+ {{ dict.dictType }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 提交
+ 返回
+
+
+
+
+
+
diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue
new file mode 100644
index 0000000..1cd95f9
--- /dev/null
+++ b/src/views/tool/gen/genInfoForm.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+ 生成模板
+
+
+
+
+
+
+
+
+
+
+
+ 生成包路径
+
+
+
+
+
+
+
+
+
+
+
+ 生成模块名
+
+
+
+
+
+
+
+
+
+
+
+ 生成业务名
+
+
+
+
+
+
+
+
+
+
+
+ 生成功能名
+
+
+
+
+
+
+
+
+
+
+
+ 上级菜单
+
+
+
+
+
+
+
+
+
+
+
+ 生成代码方式
+
+
+
+
+ zip压缩包
+ 自定义路径
+
+
+
+
+
+
+ 自定义路径
+
+
+
+
+
+
+
+
+ 最近路径快速选择
+
+
+
+
+ 恢复默认的生成基础路径
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 树编码字段
+
+
+
+
+
+
+
+
+
+
+
+
+ 树父编码字段
+
+
+
+
+
+
+
+
+
+
+
+
+ 树名称字段
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关联子表的表名
+
+
+
+
+
+
+
+
+
+
+
+
+ 子表关联的外键名
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue
new file mode 100644
index 0000000..33b5633
--- /dev/null
+++ b/src/views/tool/gen/importTable.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue
new file mode 100644
index 0000000..fb2fc9e
--- /dev/null
+++ b/src/views/tool/gen/index.vue
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 生成
+
+
+ 导入
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+ {{(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 复制
+ {{ value }}
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/basic/item/index.vue b/src/views/wms/basic/item/index.vue
new file mode 100644
index 0000000..f598400
--- /dev/null
+++ b/src/views/wms/basic/item/index.vue
@@ -0,0 +1,812 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ 商品分类
+ 新增分类
+
+
+
+
+
+ {{ node.label }}
+
+ 新增子分类
+ 删除
+ 修改
+
+
+
+
+
+
+
+ 商品列表
+ 新增商品
+
+
+
+
+ {{ row.item.itemName + (row.item.itemCode ? ('(' + row.item.itemCode + ')') : '') }}
+ {{ row.item.itemBrand ? ('品牌:' + useWmsStore().itemBrandMap.get(row.item.itemBrand)?.brandName) : '' }}
+ {{ row.item.itemCategory ? ('分类:' + useWmsStore().itemCategoryMap.get(row.item.itemCategory)?.categoryName) : '' }}
+
+
+
+
+ {{ row.skuName }}
+ 编号:{{ row.skuCode }}
+ 条码:{{ row.barcode }}
+
+
+
+
+
+
+
+
+
+
+
+
成本价:
+
{{ (row.costPrice || row.costPrice === 0) ? row.costPrice : '' }}
+
+
+
销售价:
+
{{ (row.sellingPrice || row.sellingPrice === 0) ? row.sellingPrice : '' }}
+
+
+
+
+
+
+
净重:
+
+ {{ (row.netWeight || row.netWeight === 0) ? row.netWeight : '' }}
+
+
+
+
毛重:
+
+ {{ (row.grossWeight || row.grossWeight === 0) ? row.grossWeight : '' }}
+
+
+
+
+
+
+ {{ getVolumeText(row) }}
+
+
+
+
+ 删除
+ 修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增分类
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编号
+
+
+
+ 条码
+
+
+
+
+
+
+
+ 长
+
+
+
+ 宽
+
+
+
+ 高
+
+
+
+
+
+
+
+ 净重
+
+
+
+ 毛重
+
+
+
+
+
+
+
+ 成本价
+
+
+
+ 销售价
+
+
+
+
+
+
+ 删除
+
+
+
+
+ 添加商品规格
+
+
+
+
+
+ 添加商品规格
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/basic/itemBrand/index.vue b/src/views/wms/basic/itemBrand/index.vue
new file mode 100644
index 0000000..787e117
--- /dev/null
+++ b/src/views/wms/basic/itemBrand/index.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ 品牌列表
+
+ 新增
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/basic/merchant/index.vue b/src/views/wms/basic/merchant/index.vue
new file mode 100644
index 0000000..808d1c0
--- /dev/null
+++ b/src/views/wms/basic/merchant/index.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ 往来单位
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/basic/warehouse/index.vue b/src/views/wms/basic/warehouse/index.vue
new file mode 100644
index 0000000..06df5d2
--- /dev/null
+++ b/src/views/wms/basic/warehouse/index.vue
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+ 仓库列表
+ 新增仓库
+
+
+
+
+
+ {{ node.data.warehouseName }}{{ node.data.warehouseCode ? ' ( 编号:' + node.data.warehouseCode + ' )' : ''}}
+
+ 删除
+ 修改
+
+
+
+
+
+
+
+ 库区列表
+ 新增库区
+
+
+
+
+
+
+
+ 删除
+ 修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/inventory/detail.vue b/src/views/wms/inventory/detail.vue
new file mode 100644
index 0000000..cef0c15
--- /dev/null
+++ b/src/views/wms/inventory/detail.vue
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+ 仓库库区
+ 商品
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30天内
+ 60天内
+ 90天内
+ 120天内
+ 180天内
+ 365天内
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+ {{ useWmsStore().warehouseMap.get(row.warehouseId)?.warehouseName }}
+
+
+
+
+ {{ useWmsStore().areaMap.get(row.areaId)?.areaName }}
+
+
+
+
+ {{ row.item.itemName }}
+ 商品编号:{{ row.item.itemCode }}
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 规格编号:{{ row.itemSku.skuCode }}
+
+
+
+
+
+
+ {{ row.item.itemName }}
+ 商品编号:{{ row.item.itemCode }}
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 规格编号:{{ row.itemSku.skuCode }}
+
+
+
+
+ {{ useWmsStore().warehouseMap.get(row.warehouseId)?.warehouseName }}
+
+
+
+
+ {{ useWmsStore().areaMap.get(row.areaId)?.areaName }}
+
+
+
+
+
+ {{ parseTime(row.createTime, '{y}-{m}-{d} {h}:{i}') }}
+
+
+
+
+
+
+
+
+
+
+ 生产日期:{{ parseTime(row.productionDate, '{y}-{m}-{d}') }}
+ 过期日期:{{ parseTime(row.expirationDate, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/inventory/history.vue b/src/views/wms/inventory/history.vue
new file mode 100644
index 0000000..e357d9e
--- /dev/null
+++ b/src/views/wms/inventory/history.vue
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+ 全部
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ 库存记录
+
+
+
+
+
+ {{ row.item.itemName }}
+ 商品编号:{{ row.item.itemCode }}
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 规格编号:{{ row.itemSku.skuCode }}
+
+
+
+
+
+
+
+
+
+ 仓库:{{ useWmsStore().warehouseMap.get(row.warehouseId)?.warehouseName }}
+ 库区:{{ useWmsStore().areaMap.get(row.areaId)?.areaName }}
+
+
+
+
+
+
+
+
+
+
+
+ 生产日期:{{ parseTime(row.productionDate, '{y}-{m}-{d}') }}
+ 过期日期:{{ parseTime(row.expirationDate, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/inventory/statistic.vue b/src/views/wms/inventory/statistic.vue
new file mode 100644
index 0000000..5dc41a0
--- /dev/null
+++ b/src/views/wms/inventory/statistic.vue
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+ 仓库
+ 库区
+ 商品
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+ {{ useWmsStore().warehouseMap.get(row.warehouseId)?.warehouseName }}
+
+
+
+
+
+ {{ useWmsStore().areaMap.get(row.areaId)?.areaName }}
+
+
+
+
+
+ {{ row.item.itemName }}
+ 商品编号:{{ row.item.itemCode }}
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 规格编号:{{ row.itemSku.skuCode }}
+
+
+
+
+
+
+ {{ row.item.itemName }}
+ 商品编号:{{ row.item.itemCode }}
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 规格编号:{{ row.itemSku.skuCode }}
+
+
+
+
+ {{ useWmsStore().warehouseMap.get(row.warehouseId)?.warehouseName }}
+
+
+
+
+ {{ useWmsStore().areaMap.get(row.areaId)?.areaName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/check/CheckOrderDetail.vue b/src/views/wms/order/check/CheckOrderDetail.vue
new file mode 100644
index 0000000..4713b16
--- /dev/null
+++ b/src/views/wms/order/check/CheckOrderDetail.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+ {{ row?.itemSku?.item?.itemName }}
+
+
+
+
+ {{ row?.itemSku?.skuName }}
+
+
+
+
+
+
+ 生产日期:{{ parseTime(row.productionDate, '{y}-{m}-{d}') }}
+ 过期日期:{{ parseTime(row.expirationDate, '{y}-{m}-{d}') }}
+
+
+
+
+ {{ parseTime(row.receiptTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/check/edit.vue b/src/views/wms/order/check/edit.vue
new file mode 100644
index 0000000..b3c5e91
--- /dev/null
+++ b/src/views/wms/order/check/edit.vue
@@ -0,0 +1,568 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 开始盘库
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 一物一码/SN模式:
+
+
+
新增库存
+
+
+
+
+
+ {{
+ scope.row.itemSku.item.itemName + (scope.row.itemSku.item.itemCode ? ('(' + scope.row.itemSku.item.itemCode + ')') : '')
+ }}
+
+
+ 品牌:{{ useWmsStore().itemBrandMap.get(scope.row.itemSku.item.itemBrand).brandName }}
+
+
+
+
+
+
+ {{ row.itemSku.skuName + (row.itemSku.barcode ? ('(' + row.itemSku.barcode + ')') : '') }}
+ 请选择商品
+
+
+ {{ row.itemSku.skuName + (row.itemSku.barcode ? ('(' + row.itemSku.barcode + ')') : '') }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.areaName }}
+
+
+
+
+
+
+
+
+
+ {{ row.batchNo }}
+
+
+
+
+
+
+
+ 生产日期:
+
+
+
+ 过期日期:
+
+
+
+
+ 生产日期:{{ row.productionDate.substring(0, 10) }}
+ 过期日期:{{ row.expirationDate.substring(0, 10) }}
+
+
+
+
+
+
+
+
+
+ {{ parseTime(row.receiptTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/check/index.vue b/src/views/wms/order/check/index.vue
new file mode 100644
index 0000000..6363ba0
--- /dev/null
+++ b/src/views/wms/order/check/index.vue
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+ 全部
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ 盘库单
+
+ 新增
+
+
+
+
+
+
+
+ 仓库:{{ useWmsStore().warehouseMap.get(row.warehouseId)?.warehouseName }}
+ 库区:{{ useWmsStore().areaMap.get(row.areaId)?.areaName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 创建:{{ row.createBy }}
+ 操作:{{ row.updateBy }}
+
+
+
+
+ 创建:{{ parseTime(row.createTime, '{mm}-{dd} {hh}:{ii}') }}
+ 操作:{{ parseTime(row.updateTime, '{mm}-{dd} {hh}:{ii}') }}
+
+
+
+
+
+
+
+
+ 修改
+
+
+ 查看
+
+
+
+
+ 删除
+
+
+ 打印
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/movement/edit.vue b/src/views/wms/order/movement/edit.vue
new file mode 100644
index 0000000..9318dc3
--- /dev/null
+++ b/src/views/wms/order/movement/edit.vue
@@ -0,0 +1,530 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 一物一码/SN模式:
+
+
+
+
+ 添加商品
+
+
+
+
+
+
+
+ {{
+ row.itemSku.item.itemName + (row.itemSku.item.itemCode ? ('(' + row.itemSku.item.itemCode + ')') : '')
+ }}
+
+
+ 品牌:{{ useWmsStore().itemBrandMap.get(row.itemSku.item.itemBrand).brandName }}
+
+
+
+
+
+ {{ row.itemSku.skuName}}
+ 条码:{{ row.itemSku.barcode }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.productionDate.substring(0, 10) }}
+
+
+
+
+ {{ row.expirationDate.substring(0, 10) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/movement/index.vue b/src/views/wms/order/movement/index.vue
new file mode 100644
index 0000000..8f50fca
--- /dev/null
+++ b/src/views/wms/order/movement/index.vue
@@ -0,0 +1,403 @@
+
+
+
+
+
+
+
+ 全部
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ 移库单
+
+ 新增
+
+
+
+
+
+
+
+
商品明细
+
+
+
+ {{ row?.itemSku?.item?.itemName }}
+
+
+
+
+ {{ row?.itemSku?.skuName }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(row.productionDate, '{y}-{m}-{d}') }}
+
+
+
+
+ {{ parseTime(row.expirationDate, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+
+ 源仓库:{{ useWmsStore().warehouseMap.get(row.sourceWarehouseId)?.warehouseName }}
+ 源库区:{{ useWmsStore().areaMap.get(row.sourceAreaId)?.areaName }}
+
+
+
+
+ 目标仓库:{{ useWmsStore().warehouseMap.get(row.targetWarehouseId)?.warehouseName }}
+ 目标库区:{{ useWmsStore().areaMap.get(row.targetAreaId)?.areaName }}
+
+
+
+
+
+
+
+
+
+
+ 数量:
+
+
+
+
+
+
+ 创建:{{ row.createBy }}
+ 操作:{{ row.updateBy }}
+
+
+
+
+ 创建:{{ parseTime(row.createTime, '{mm}-{dd} {hh}:{ii}') }}
+ 操作:{{ parseTime(row.updateTime, '{mm}-{dd} {hh}:{ii}') }}
+
+
+
+
+
+
+
+
+ 修改
+
+
+ {{ expandedRowKeys.includes(scope.row.id) ? '收起' : '查看' }}
+
+
+
+
+ 删除
+
+
+ 打印
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/receipt/edit.vue b/src/views/wms/order/receipt/edit.vue
new file mode 100644
index 0000000..67c7fc7
--- /dev/null
+++ b/src/views/wms/order/receipt/edit.vue
@@ -0,0 +1,549 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 自动计算
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.itemSku.item.itemName + (row.itemSku.item.itemCode ? ('(' + row.itemSku.item.itemCode + ')') : '') }}
+ 品牌:{{ useWmsStore().itemBrandMap.get(row.itemSku.item.itemBrand).brandName }}
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 条码:{{row.itemSku.barcode}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 生产日期:
+
+
+
+ 过期日期:
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/receipt/index.vue b/src/views/wms/order/receipt/index.vue
new file mode 100644
index 0000000..10201be
--- /dev/null
+++ b/src/views/wms/order/receipt/index.vue
@@ -0,0 +1,435 @@
+
+
+
+
+
+
+
+ 全部
+
+
+ {{ item.label }}
+
+
+
+
+
+
+ 全部
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ 入库单
+
+ 新增
+
+
+
+
+
+
+
+
商品明细
+
+
+
+ {{ row?.itemSku?.item?.itemName }}
+
+
+
+
+ {{ row?.itemSku?.skuName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(row.productionDate, '{y}-{m}-{d}') }}
+
+
+
+
+ {{ parseTime(row.expirationDate, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+ 单号:{{ row.receiptOrderNo }}
+ 订单号:{{ row.orderNo }}
+
+
+
+
+
+
+
+
+
+ {{ useWmsStore().merchantMap.get(row.merchantId)?.merchantName }}
+
+
+
+
+ 仓库:{{ useWmsStore().warehouseMap.get(row.warehouseId)?.warehouseName }}
+ 库区:{{ useWmsStore().areaMap.get(row.areaId)?.areaName }}
+
+
+
+
+
+
+
+
+
+
+ 数量:
+
+
+
+ 金额:
+
+
+
+
+
+
+ 创建:{{ row.createBy }}
+ 操作:{{ row.updateBy }}
+
+
+
+
+ 创建:{{ parseTime(row.createTime, '{mm}-{dd} {hh}:{ii}') }}
+ 操作:{{ parseTime(row.updateTime, '{mm}-{dd} {hh}:{ii}') }}
+
+
+
+
+
+
+
+
+ 修改
+
+
+ {{ expandedRowKeys.includes(scope.row.id) ? '收起' : '查看' }}
+
+
+
+
+ 删除
+
+
+ 打印
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/shipment/edit.vue b/src/views/wms/order/shipment/edit.vue
new file mode 100644
index 0000000..32f4d12
--- /dev/null
+++ b/src/views/wms/order/shipment/edit.vue
@@ -0,0 +1,547 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 自动计算
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ row.itemSku.item.itemName + (row.itemSku.item.itemCode ? ('(' + row.itemSku.item.itemCode + ')') : '')
+ }}
+
+
+ 品牌:{{ useWmsStore().itemBrandMap.get(row.itemSku.item.itemBrand).brandName }}
+
+
+
+
+
+ {{ row.itemSku.skuName }}
+ 条码:{{row.itemSku.barcode}}
+
+
+
+
+
+
+ {{ row.productionDate.substring(0, 10) }}
+
+
+
+
+ {{ row.expirationDate.substring(0, 10) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wms/order/shipment/index.vue b/src/views/wms/order/shipment/index.vue
new file mode 100644
index 0000000..f04fcec
--- /dev/null
+++ b/src/views/wms/order/shipment/index.vue
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+
+ 全部
+
+
+ {{ item.label }}
+
+
+
+
+
+
+ 全部
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ 出库单
+
+ 新增
+
+
+
+
+
+
+
+
商品明细
+
+
+
+ {{ row?.itemSku?.item?.itemName }}
+
+
+
+
+ {{ row?.itemSku?.skuName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(row.productionDate, '{y}-{m}-{d}') }}
+
+
+
+
+ {{ parseTime(row.expirationDate, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+ 单号:{{ row.shipmentOrderNo }}
+ 订单号:{{ row.orderNo }}
+
+
+
+
+
+
+
+
+
+ {{ useWmsStore().merchantMap.get(row.merchantId)?.merchantName }}
+
+
+
+
+ 仓库:{{ useWmsStore().warehouseMap.get(row.warehouseId)?.warehouseName }}
+ 库区:{{ useWmsStore().areaMap.get(row.areaId)?.areaName }}
+
+
+
+
+
+
+
+
+
+
+ 数量:
+
+
+
+ 金额:
+
+
+
+
+
+
+ 创建:{{ row.createBy }}
+ 操作:{{ row.updateBy }}
+
+
+
+
+ 创建:{{ parseTime(row.createTime, '{mm}-{dd} {hh}:{ii}') }}
+ 操作:{{ parseTime(row.updateTime, '{mm}-{dd} {hh}:{ii}') }}
+
+
+
+
+
+
+
+
+ 修改
+
+
+ {{ expandedRowKeys.includes(scope.row.id) ? '收起' : '查看' }}
+
+
+
+
+ 删除
+
+
+ 打印
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..d260bbc
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,57 @@
+import { defineConfig, loadEnv } from 'vite'
+import path from 'path'
+import createVitePlugins from './vite/plugins'
+
+// https://vitejs.dev/config/
+export default defineConfig(({ mode, command }) => {
+ const env = loadEnv(mode, process.cwd())
+ return {
+ // 部署生产环境和开发环境下的URL。
+ // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
+ // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
+ base: env.VITE_APP_CONTEXT_PATH,
+ plugins: createVitePlugins(env, command === 'build'),
+ resolve: {
+ // https://cn.vitejs.dev/config/#resolve-alias
+ alias: {
+ // 设置路径
+ '~': path.resolve(__dirname, './'),
+ // 设置别名
+ '@': path.resolve(__dirname, './src')
+ },
+ // https://cn.vitejs.dev/config/#resolve-extensions
+ extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
+ },
+ // vite 相关配置
+ server: {
+ port: 80,
+ host: true,
+ open: true,
+ proxy: {
+ // https://cn.vitejs.dev/config/#server-proxy
+ '/dev-api': {
+ target: 'http://localhost:8080',
+ changeOrigin: true,
+ rewrite: (p) => p.replace(/^\/dev-api/, '')
+ }
+ }
+ },
+ //fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file
+ css: {
+ postcss: {
+ plugins: [
+ {
+ postcssPlugin: 'internal:charset-removal',
+ AtRule: {
+ charset: (atRule) => {
+ if (atRule.name === 'charset') {
+ atRule.remove();
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+})
diff --git a/vite/plugins/auto-import.js b/vite/plugins/auto-import.js
new file mode 100644
index 0000000..a5d3576
--- /dev/null
+++ b/vite/plugins/auto-import.js
@@ -0,0 +1,12 @@
+import autoImport from 'unplugin-auto-import/vite'
+
+export default function createAutoImport() {
+ return autoImport({
+ imports: [
+ 'vue',
+ 'vue-router',
+ 'pinia'
+ ],
+ dts: false
+ })
+}
diff --git a/vite/plugins/compression.js b/vite/plugins/compression.js
new file mode 100644
index 0000000..e90aaec
--- /dev/null
+++ b/vite/plugins/compression.js
@@ -0,0 +1,28 @@
+import compression from 'vite-plugin-compression'
+
+export default function createCompression(env) {
+ const { VITE_BUILD_COMPRESS } = env
+ const plugin = []
+ if (VITE_BUILD_COMPRESS) {
+ const compressList = VITE_BUILD_COMPRESS.split(',')
+ if (compressList.includes('gzip')) {
+ // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
+ plugin.push(
+ compression({
+ ext: '.gz',
+ deleteOriginFile: false
+ })
+ )
+ }
+ if (compressList.includes('brotli')) {
+ plugin.push(
+ compression({
+ ext: '.br',
+ algorithm: 'brotliCompress',
+ deleteOriginFile: false
+ })
+ )
+ }
+ }
+ return plugin
+}
diff --git a/vite/plugins/index.js b/vite/plugins/index.js
new file mode 100644
index 0000000..10e17c3
--- /dev/null
+++ b/vite/plugins/index.js
@@ -0,0 +1,15 @@
+import vue from '@vitejs/plugin-vue'
+
+import createAutoImport from './auto-import'
+import createSvgIcon from './svg-icon'
+import createCompression from './compression'
+import createSetupExtend from './setup-extend'
+
+export default function createVitePlugins(viteEnv, isBuild = false) {
+ const vitePlugins = [vue()]
+ vitePlugins.push(createAutoImport())
+ vitePlugins.push(createSetupExtend())
+ vitePlugins.push(createSvgIcon(isBuild))
+ isBuild && vitePlugins.push(...createCompression(viteEnv))
+ return vitePlugins
+}
diff --git a/vite/plugins/setup-extend.js b/vite/plugins/setup-extend.js
new file mode 100644
index 0000000..ed8342e
--- /dev/null
+++ b/vite/plugins/setup-extend.js
@@ -0,0 +1,5 @@
+import setupExtend from 'unplugin-vue-setup-extend-plus/vite'
+
+export default function createSetupExtend() {
+ return setupExtend({})
+}
diff --git a/vite/plugins/svg-icon.js b/vite/plugins/svg-icon.js
new file mode 100644
index 0000000..30a4140
--- /dev/null
+++ b/vite/plugins/svg-icon.js
@@ -0,0 +1,10 @@
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
+import path from 'path'
+
+export default function createSvgIcon(isBuild) {
+ return createSvgIconsPlugin({
+ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
+ symbolId: 'icon-[dir]-[name]',
+ svgoOptions: isBuild
+ })
+}