diff --git a/package.json b/package.json index f80b910..6b24583 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,11 @@ "@kjgl77/datav-vue3": "^1.6.1", "@vee-validate/rules": "4.5.8", "@vueuse/core": "9.5.0", + "animate.css": "^4.1.1", "axios": "0.27.2", "bpmn-js": "^11.4.1", + "can-autoplay": "^3.0.2", + "crypto-js": "^4.2.0", "diagram-js": "^11.9.1", "echarts": "5.4.0", "element-plus": "2.2.28", @@ -29,6 +32,7 @@ "highlight.js": "11.7.0", "js-cookie": "3.0.1", "jsencrypt": "3.3.1", + "mitt": "^3.0.1", "nprogress": "0.2.0", "pinia": "2.0.22", "splitpanes": "^3.1.5", @@ -39,6 +43,7 @@ "vue-cropper": "1.0.3", "vue-draggable-plus": "^0.3.0", "vue-router": "4.1.4", + "vue3-seamless-scroll": "^2.0.1", "vuedraggable": "^2.24.3", "vxe-table": "^4.5.14", "vxe-table-plugin-antd": "^3.1.0", @@ -50,9 +55,17 @@ "xe-utils": "^3.5.14" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.19.0", + "@typescript-eslint/parser": "^5.19.0", + "@types/crypto-js": "^4.2.1", + "@vicons/antd": "^0.12.0", + "@vicons/ionicons5": "^0.12.0", + "@vicons/tabler": "^0.12.0", "@vitejs/plugin-vue": "3.1.0", "@vue/compiler-sfc": "3.2.45", + "naive-ui": "^2.34.4", "sass": "1.56.1", + "typescript": "^4.7.4", "unplugin-auto-import": "^0.11.5", "vite": "^3.2.3", "vite-plugin-compression": "0.5.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7f2e064..f8a3365 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,12 +17,21 @@ dependencies: '@vueuse/core': specifier: 9.5.0 version: 9.5.0(vue@3.2.45) + animate.css: + specifier: ^4.1.1 + version: 4.1.1 axios: specifier: 0.27.2 version: 0.27.2 bpmn-js: specifier: ^11.4.1 version: 11.5.0 + can-autoplay: + specifier: ^3.0.2 + version: 3.0.2 + crypto-js: + specifier: ^4.2.0 + version: 4.2.0 diagram-js: specifier: ^11.9.1 version: 11.13.1 @@ -47,12 +56,15 @@ dependencies: jsencrypt: specifier: 3.3.1 version: 3.3.1 + mitt: + specifier: ^3.0.1 + version: 3.0.1 nprogress: specifier: 0.2.0 version: 0.2.0 pinia: specifier: 2.0.22 - version: 2.0.22(vue@3.2.45) + version: 2.0.22(typescript@4.9.5)(vue@3.2.45) splitpanes: specifier: ^3.1.5 version: 3.1.5 @@ -77,44 +89,71 @@ dependencies: vue-router: specifier: 4.1.4 version: 4.1.4(vue@3.2.45) + vue3-seamless-scroll: + specifier: ^2.0.1 + version: 2.0.1 vuedraggable: specifier: ^2.24.3 version: 2.24.3 vxe-table: specifier: ^4.5.14 - version: 4.5.20(vue@3.2.45)(xe-utils@3.5.22) + version: 4.5.21(vue@3.2.45)(xe-utils@3.5.22) vxe-table-plugin-antd: specifier: ^3.1.0 - version: 3.3.0(vxe-table@4.5.20) + version: 3.3.0(vxe-table@4.5.21) vxe-table-plugin-charts: specifier: ^3.1.0 - version: 3.3.1(vxe-table@4.5.20) + version: 3.3.1(vxe-table@4.5.21) vxe-table-plugin-element: specifier: ^3.1.0 - version: 3.3.0(vxe-table@4.5.20) + version: 3.3.0(vxe-table@4.5.21) vxe-table-plugin-menus: specifier: ^3.2.1 - version: 3.3.0(vxe-table@4.5.20) + version: 3.3.0(vxe-table@4.5.21) vxe-table-plugin-renderer: specifier: ^3.1.0 - version: 3.3.0(vxe-table@4.5.20) + version: 3.3.0(vxe-table@4.5.21) vxe-table-plugin-validator: specifier: ^3.0.0 - version: 3.0.0(vxe-table@4.5.20) + version: 3.0.0(vxe-table@4.5.21) xe-utils: specifier: ^3.5.14 version: 3.5.22 devDependencies: + '@types/crypto-js': + specifier: ^4.2.1 + version: 4.2.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.19.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.19.0 + version: 5.62.0(eslint@8.57.0)(typescript@4.9.5) + '@vicons/antd': + specifier: ^0.12.0 + version: 0.12.0 + '@vicons/ionicons5': + specifier: ^0.12.0 + version: 0.12.0 + '@vicons/tabler': + specifier: ^0.12.0 + version: 0.12.0 '@vitejs/plugin-vue': specifier: 3.1.0 version: 3.1.0(vite@3.2.8)(vue@3.2.45) '@vue/compiler-sfc': specifier: 3.2.45 version: 3.2.45 + naive-ui: + specifier: ^2.34.4 + version: 2.38.1(vue@3.2.45) sass: specifier: 1.56.1 version: 1.56.1 + typescript: + specifier: ^4.7.4 + version: 4.9.5 unplugin-auto-import: specifier: ^0.11.5 version: 0.11.5(@vueuse/core@9.5.0) @@ -133,6 +172,11 @@ devDependencies: packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + /@antfu/utils@0.7.7: resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} dev: true @@ -157,7 +201,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - dev: false /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} @@ -174,6 +217,22 @@ packages: preact: 10.19.6 dev: false + /@css-render/plugin-bem@0.15.12(css-render@0.15.12): + resolution: {integrity: sha512-Lq2jSOZn+wYQtsyaFj6QRz2EzAnd3iW5fZeHO1WSXQdVYwvwGX0ZiH3X2JQgtgYLT1yeGtrwrqJdNdMEUD2xTw==} + peerDependencies: + css-render: ~0.15.12 + dependencies: + css-render: 0.15.12 + dev: true + + /@css-render/vue3-ssr@0.15.12(vue@3.2.45): + resolution: {integrity: sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==} + peerDependencies: + vue: ^3.0.11 + dependencies: + vue: 3.2.45 + dev: true + /@ctrl/tinycolor@3.6.1: resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} @@ -187,6 +246,10 @@ packages: vue: 3.2.45 dev: false + /@emotion/hash@0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + dev: true + /@esbuild/android-arm@0.15.18: resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} @@ -205,6 +268,43 @@ packages: dev: true optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@floating-ui/core@1.6.0: resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: @@ -222,6 +322,26 @@ packages: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} dev: false + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true + /@jiaminghi/bezier-curve@0.0.9: resolution: {integrity: sha512-u9xJPOEl6Dri2E9FfmJoGxYQY7vYJkURNX04Vj64tdi535tPrpkuf9Sm0lNr3QTKdHQh0DdNRsaa62FLQNQEEw==} dependencies: @@ -258,6 +378,10 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: true + /@kjgl77/datav-vue3@1.7.2(vue@3.2.45): resolution: {integrity: sha512-Fvllk4rJEdUwLdumvsnPADZNPMKkDdC7u/vJEAPBsMh6UgFQytIT+SVtjj1vy/TXtgcH/te9hlXBPgV8LVSmQw==} dependencies: @@ -314,19 +438,29 @@ packages: engines: {node: '>=10.13.0'} dev: true + /@types/crypto-js@4.2.2: + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} + dev: true + /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/katex@0.16.7: + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + dev: true + /@types/lodash-es@4.17.12: resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} dependencies: '@types/lodash': 4.14.202 - dev: false /@types/lodash@4.14.202: resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - dev: false /@types/node@20.11.25: resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} @@ -334,6 +468,10 @@ packages: undici-types: 5.26.5 dev: true + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + dev: true + /@types/sortablejs@1.15.8: resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==} dev: false @@ -351,10 +489,156 @@ packages: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} dev: false + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.0 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.57.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@4.9.5): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.57.0 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.0 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.9.5): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@vee-validate/rules@4.5.8: resolution: {integrity: sha512-NRK+sdsarBB90Xx7r6NyTPGmc/KoJM5Sp01bkVG3SrnNnPL9z1NvmXOC1cAhwWROkvNMueQlIbuG9+RWaT/S5w==} dev: false + /@vicons/antd@0.12.0: + resolution: {integrity: sha512-C0p6aO1EmGG1QHrqgUWQS1No20934OdWSRQshM5NIDK5H1On6tC26U0hT6Rmp40KfUsvhvX5YW8BoWJdNFifPg==} + dev: true + + /@vicons/ionicons5@0.12.0: + resolution: {integrity: sha512-Iy1EUVRpX0WWxeu1VIReR1zsZLMc4fqpt223czR+Rpnrwu7pt46nbnC2ycO7ItI/uqDLJxnbcMC7FujKs9IfFA==} + dev: true + + /@vicons/tabler@0.12.0: + resolution: {integrity: sha512-3+wUFuxb7e8OzZ8Wryct1pzfA2vyoF4lwW98O9s27ZrfCGaJGNmqG+q8A7vQ92Mf+COCgxpK+rhNPTtTvaU6qw==} + dev: true + /@vitejs/plugin-vue@3.1.0(vite@3.2.8)(vue@3.2.45): resolution: {integrity: sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -490,17 +774,43 @@ packages: - '@vue/composition-api' - vue + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true dev: true + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /animate.css@4.1.1: + resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==} + dev: false + /ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + /ansi-styles@2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} @@ -521,6 +831,10 @@ packages: picomatch: 2.3.1 dev: true + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} @@ -536,6 +850,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + /array-unique@0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} @@ -548,7 +867,6 @@ packages: /async-validator@4.2.5: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} - dev: false /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -569,6 +887,10 @@ packages: - debug dev: false + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} @@ -647,6 +969,13 @@ packages: moddle-xml: 10.1.0 dev: false + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + /braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} @@ -687,6 +1016,15 @@ packages: unset-value: 1.0.0 dev: true + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /can-autoplay@3.0.2: + resolution: {integrity: sha512-Ih6wc7yJB4TylS/mLyAW0Dj5Nh3Gftq/g966TcxgvpNCOzlbqTs85srAq7mwIspo4w8gnLCVVGroyCHfh6l9aA==} + dev: false + /chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -780,6 +1118,10 @@ packages: resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==} dev: false + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} @@ -793,6 +1135,26 @@ packages: vary: 1.1.2 dev: true + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: false + + /css-render@0.15.12: + resolution: {integrity: sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==} + dependencies: + '@emotion/hash': 0.8.0 + csstype: 3.0.11 + dev: true + /css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} dependencies: @@ -826,6 +1188,29 @@ packages: /csstype@2.6.21: resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + /csstype@3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true + + /date-fns-tz@2.0.1(date-fns@2.30.0): + resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==} + peerDependencies: + date-fns: 2.x + dependencies: + date-fns: 2.30.0 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.24.0 + dev: true + /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} dev: false @@ -858,6 +1243,10 @@ packages: engines: {node: '>=0.10'} dev: true + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + /define-property@0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} @@ -914,6 +1303,20 @@ packages: resolution: {integrity: sha512-q2+aj+lnJcUweV7A9pdUrwFr4LHVmRPwTmQLtHPFz4aT7IBoryN6Iy+jmFku+oIzr5ebBkvtBCOb87+dJhb7bg==} dev: false + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + /dom-serializer@0.2.2: resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} dependencies: @@ -1237,19 +1640,134 @@ packages: engines: {node: '>=0.8.0'} dev: true + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} dev: true + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: true + /evtd@0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} + dev: true + /expand-brackets@2.1.4: resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} @@ -1296,6 +1814,10 @@ packages: - supports-color dev: true + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1307,12 +1829,27 @@ packages: micromatch: 4.0.5 dev: true + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 dev: true + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + /file-saver@2.0.5: resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} dev: false @@ -1334,6 +1871,27 @@ packages: to-regex-range: 5.0.1 dev: true + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + /follow-redirects@1.15.5: resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} engines: {node: '>=4.0'} @@ -1374,6 +1932,10 @@ packages: universalify: 2.0.1 dev: true + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1403,10 +1965,51 @@ packages: is-glob: 4.0.3 dev: true + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + /hammerjs@2.0.8: resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} engines: {node: '>=0.8.0'} @@ -1460,8 +2063,8 @@ packages: kind-of: 4.0.0 dev: true - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -1477,6 +2080,11 @@ packages: engines: {node: '>=12.0.0'} dev: false + /highlight.js@11.9.0: + resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} + engines: {node: '>=12.0.0'} + dev: true + /htm@3.1.1: resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} dev: false @@ -1496,6 +2104,11 @@ packages: resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==} dev: false + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + /image-size@0.5.5: resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} @@ -1506,6 +2119,26 @@ packages: resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} dev: true + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + /inherits-browser@0.1.0: resolution: {integrity: sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==} dev: false @@ -1518,7 +2151,7 @@ packages: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} engines: {node: '>= 0.10'} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true /is-binary-path@2.1.0: @@ -1535,14 +2168,14 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true /is-data-descriptor@1.0.1: resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} engines: {node: '>= 0.4'} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true /is-descriptor@0.1.7: @@ -1597,6 +2230,11 @@ packages: engines: {node: '>=0.12.0'} dev: true + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} @@ -1618,6 +2256,10 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + /isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} @@ -1639,10 +2281,29 @@ packages: engines: {node: '>=12'} dev: false + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /jsencrypt@3.3.1: resolution: {integrity: sha512-dVvV54GdFuJgmEKn+oBiaifDMen4p6o6j/lJh0OVMcouME8sST0bJ7bldIgKBQk4za0zyGn0/pm4vOznR25mLw==} dev: false + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -1662,6 +2323,12 @@ packages: graceful-fs: 4.2.11 dev: true + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + /kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} @@ -1686,6 +2353,14 @@ packages: engines: {node: '>=0.10.0'} dev: true + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + /loader-utils@1.4.2: resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} engines: {node: '>=4.0.0'} @@ -1700,9 +2375,15 @@ packages: engines: {node: '>=14'} dev: true + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false /lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} @@ -1716,9 +2397,19 @@ packages: lodash-es: 4.17.21 dev: false + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -1824,10 +2515,20 @@ packages: min-dash: 4.2.1 dev: false + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -1867,6 +2568,33 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true + /naive-ui@2.38.1(vue@3.2.45): + resolution: {integrity: sha512-AnU1FQ7K/CbhguAX++V4kCFjk7h7RvWt4nvZPRjORMpq+fUIlzD+EcQ5Cv1VqDloNF8+eMv4Akc2Ogacc9S+5A==} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@css-render/plugin-bem': 0.15.12(css-render@0.15.12) + '@css-render/vue3-ssr': 0.15.12(vue@3.2.45) + '@types/katex': 0.16.7 + '@types/lodash': 4.14.202 + '@types/lodash-es': 4.17.12 + async-validator: 4.2.5 + css-render: 0.15.12 + csstype: 3.1.3 + date-fns: 2.30.0 + date-fns-tz: 2.0.1(date-fns@2.30.0) + evtd: 0.2.4 + highlight.js: 11.9.0 + lodash: 4.17.21 + lodash-es: 4.17.21 + seemly: 0.3.8 + treemate: 0.3.11 + vdirs: 0.1.8(vue@3.2.45) + vooks: 0.2.12(vue@3.2.45) + vue: 3.2.45 + vueuc: 0.4.58(vue@3.2.45) + dev: true + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1891,6 +2619,14 @@ packages: - supports-color dev: true + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -1942,19 +2678,78 @@ packages: isobject: 3.0.1 dev: true + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + /pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: true + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + /path-intersection@2.2.1: resolution: {integrity: sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==} dev: false + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + /pathe@0.2.0: resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} dev: true @@ -1971,7 +2766,7 @@ packages: engines: {node: '>=8.6'} dev: true - /pinia@2.0.22(vue@3.2.45): + /pinia@2.0.22(typescript@4.9.5)(vue@3.2.45): resolution: {integrity: sha512-u+b8/BC+tmvo3ACbYO2w5NfxHWFOjvvw9DQnyT0dW8aUMCPRQT5QnfZ5R5W2MzZBMTeZRMQI7V/QFbafmM9QHw==} peerDependencies: '@vue/composition-api': ^1.4.0 @@ -1984,6 +2779,7 @@ packages: optional: true dependencies: '@vue/devtools-api': 6.6.1 + typescript: 4.9.5 vue: 3.2.45 vue-demi: 0.14.7(vue@3.2.45) dev: false @@ -2066,6 +2862,16 @@ packages: resolution: {integrity: sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==} dev: false + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + /query-string@4.3.4: resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} engines: {node: '>=0.10.0'} @@ -2096,7 +2902,6 @@ packages: /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} @@ -2116,6 +2921,11 @@ packages: engines: {node: '>=0.10'} dev: true + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + /resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated @@ -2140,6 +2950,13 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} @@ -2182,6 +2999,18 @@ packages: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} dev: true + /seemly@0.3.8: + resolution: {integrity: sha512-MW8Qs6vbzo0pHmDpFSYPna+lwpZ6Zk1ancbajw/7E8TKtHdV+1DfZZD+kKJEhG/cAoB/i+LiT+5msZOqj0DwRA==} + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /set-value@2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} @@ -2192,6 +3021,23 @@ packages: split-string: 3.1.0 dev: true + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} @@ -2303,6 +3149,18 @@ packages: ansi-regex: 2.1.1 dev: true + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + /strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} dependencies: @@ -2367,6 +3225,15 @@ packages: stable: 0.1.8 dev: true + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /throttle-debounce@5.0.0: + resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} + engines: {node: '>=12.22'} + dev: false + /tiny-emitter@2.1.0: resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} dev: false @@ -2416,10 +3283,45 @@ packages: engines: {node: '>= 0.4'} dev: true + /treemate@0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + /tslib@2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} dev: false + /tsutils@3.21.0(typescript@4.9.5): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + /ufo@1.4.0: resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} dev: true @@ -2441,7 +3343,7 @@ packages: pkg-types: 1.0.3 scule: 1.3.0 strip-literal: 1.3.0 - unplugin: 1.8.3 + unplugin: 1.9.0 transitivePeerDependencies: - rollup dev: true @@ -2476,13 +3378,13 @@ packages: local-pkg: 0.4.3 magic-string: 0.26.7 unimport: 1.3.0 - unplugin: 1.8.3 + unplugin: 1.9.0 transitivePeerDependencies: - rollup dev: true - /unplugin@1.8.3: - resolution: {integrity: sha512-ZlLteXGDcyJgsbN2g4sZ3Dw6fpX1O5rjgeaA5MmQhhA2YxnTxsh43f8nDQgFOzcir0iv8GYMjtCV8MtyNnrhEg==} + /unplugin@1.9.0: + resolution: {integrity: sha512-14PslvMY3gNbXnQtNIRB566Q057L5Fe7f5LDEamxVi0QQVxoz5hrveBwwZLcKyHtZ09ysmipxRRj5Lv+BGz2Iw==} engines: {node: '>=14.0.0'} dependencies: acorn: 8.11.3 @@ -2499,6 +3401,12 @@ packages: isobject: 3.0.1 dev: true + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + /urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated @@ -2518,6 +3426,15 @@ packages: engines: {node: '>= 0.8'} dev: true + /vdirs@0.1.8(vue@3.2.45): + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} + peerDependencies: + vue: ^3.0.11 + dependencies: + evtd: 0.2.4 + vue: 3.2.45 + dev: true + /vee-validate@4.5.8(vue@3.2.45): resolution: {integrity: sha512-XZx2J93rlET49CdIIoxG9R6wQNoT3RxUUw9ar3QbIhczpzbtlm4BQ+TpCA9DoYHKFlApcXnE28WU7m4quoPsCA==} peerDependencies: @@ -2606,6 +3523,15 @@ packages: resolution: {integrity: sha512-2ozZEFfmVvQcHWoHLNuiKlUfDKlhh4KGsy54U0UrlLMR1SO+XKAIDqBxtBwHgNrekurlJwE8A9K6L49T78ZQ9Q==} dev: false + /vooks@0.2.12(vue@3.2.45): + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} + peerDependencies: + vue: ^3.0.0 + dependencies: + evtd: 0.2.4 + vue: 3.2.45 + dev: true + /vue-baidu-map-3x@1.0.35(vue@3.2.45): resolution: {integrity: sha512-1FDzxgd+X7MVcG8JbyyxDOSYRDUi96qEuuNICQmwlAE/EDwf4vz1oYRhRz05s/MuDpW7aIBlubF/PlSTpBlUEw==} peerDependencies: @@ -2660,6 +3586,12 @@ packages: vue: 3.2.45 dev: false + /vue3-seamless-scroll@2.0.1: + resolution: {integrity: sha512-mI3BaDU3pjcPUhVSw3/xNKdfPBDABTi/OdZaZqKysx4cSdNfGRbVvGNDzzptBbJ5S7imv5T55l6x/SqgnxKreg==} + dependencies: + throttle-debounce: 5.0.0 + dev: false + /vue@3.2.45: resolution: {integrity: sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==} dependencies: @@ -2675,56 +3607,71 @@ packages: sortablejs: 1.10.2 dev: false - /vxe-table-plugin-antd@3.3.0(vxe-table@4.5.20): + /vueuc@0.4.58(vue@3.2.45): + resolution: {integrity: sha512-Wnj/N8WbPRSxSt+9ji1jtDHPzda5h2OH/0sFBhvdxDRuyCZbjGg3/cKMaKqEoe+dErTexG2R+i6Q8S/Toq1MYg==} + peerDependencies: + vue: ^3.0.11 + dependencies: + '@css-render/vue3-ssr': 0.15.12(vue@3.2.45) + '@juggle/resize-observer': 3.4.0 + css-render: 0.15.12 + evtd: 0.2.4 + seemly: 0.3.8 + vdirs: 0.1.8(vue@3.2.45) + vooks: 0.2.12(vue@3.2.45) + vue: 3.2.45 + dev: true + + /vxe-table-plugin-antd@3.3.0(vxe-table@4.5.21): resolution: {integrity: sha512-6Hnxf6QvQwRO5Yi2U/tzKo2+BHyBi12xWqTQpz/65QYmjsLDN/0fx0ozn9OlWAosXwpOY26pfsD6HtOJSRCPIA==} peerDependencies: vxe-table: ^3.7.0 dependencies: - vxe-table: 4.5.20(vue@3.2.45)(xe-utils@3.5.22) + vxe-table: 4.5.21(vue@3.2.45)(xe-utils@3.5.22) dev: false - /vxe-table-plugin-charts@3.3.1(vxe-table@4.5.20): + /vxe-table-plugin-charts@3.3.1(vxe-table@4.5.21): resolution: {integrity: sha512-4WJ9sLYqLblIDR+zy7PR7l8FnytS79jMW8U6tYOqvymtir+9n3mhAUby78BGnEgN7bQ28kr+Xbhuo11FoMHycw==} peerDependencies: vxe-table: ^3.7.0 dependencies: - vxe-table: 4.5.20(vue@3.2.45)(xe-utils@3.5.22) + vxe-table: 4.5.21(vue@3.2.45)(xe-utils@3.5.22) dev: false - /vxe-table-plugin-element@3.3.0(vxe-table@4.5.20): + /vxe-table-plugin-element@3.3.0(vxe-table@4.5.21): resolution: {integrity: sha512-jfFLNGl28N/2WBM5HxP4EPaZPE7hTb6gTOYOrn+hjGSbNMimw0hu9UXXwzZbJJoz/4bl87cbrXE5dFnG81WKKQ==} peerDependencies: vxe-table: ^3.7.0 dependencies: - vxe-table: 4.5.20(vue@3.2.45)(xe-utils@3.5.22) + vxe-table: 4.5.21(vue@3.2.45)(xe-utils@3.5.22) dev: false - /vxe-table-plugin-menus@3.3.0(vxe-table@4.5.20): + /vxe-table-plugin-menus@3.3.0(vxe-table@4.5.21): resolution: {integrity: sha512-ZCNIpEqZuBB+fVhZgrtEONd7PYtRN8+EePx48H1w1YHH0FjMMb/3ePaldRqB1R7PwKixaKhrcVY42RREYo47Lg==} peerDependencies: vxe-table: ^3.7.0 dependencies: - vxe-table: 4.5.20(vue@3.2.45)(xe-utils@3.5.22) + vxe-table: 4.5.21(vue@3.2.45)(xe-utils@3.5.22) dev: false - /vxe-table-plugin-renderer@3.3.0(vxe-table@4.5.20): + /vxe-table-plugin-renderer@3.3.0(vxe-table@4.5.21): resolution: {integrity: sha512-Vv3JZyuHzJ7S34JigIj/JA/r11oPcUhgCd4AEjxKXCmHVYLn2LROlS68O7cNOgEr7X+eXwUhj5MyccOMb8cnDQ==} peerDependencies: vxe-table: ^3.7.0 dependencies: - vxe-table: 4.5.20(vue@3.2.45)(xe-utils@3.5.22) + vxe-table: 4.5.21(vue@3.2.45)(xe-utils@3.5.22) dev: false - /vxe-table-plugin-validator@3.0.0(vxe-table@4.5.20): + /vxe-table-plugin-validator@3.0.0(vxe-table@4.5.21): resolution: {integrity: sha512-IC7RbtxSyyLN0AAJo5CoinWW+5if7TMqDEBmz0VQ7cqCxTxDm2OEz+Ehz98XG1Bd16X3bhZErVmCd/vI5D2+/Q==} peerDependencies: vxe-table: ^4.5.0 dependencies: - vxe-table: 4.5.20(vue@3.2.45)(xe-utils@3.5.22) + vxe-table: 4.5.21(vue@3.2.45)(xe-utils@3.5.22) dev: false - /vxe-table@4.5.20(vue@3.2.45)(xe-utils@3.5.22): - resolution: {integrity: sha512-UC+z1ED3QE6Be/UN0390hSXMAseXg+com3fkX9q3tjfsCGFx7CjN9tLstuNtecn+ElkPGHqzRGtA3N5FTSv5Vw==} + /vxe-table@4.5.21(vue@3.2.45)(xe-utils@3.5.22): + resolution: {integrity: sha512-yp+BNGCy61lk7ayf0LI3UNcR2fRmipGSiIAh3lNOIdyW1nAobf/GwIx3rXghjzFb0a6NNJeYxv2NM+gwXxtmww==} peerDependencies: vue: ^3.2.28 xe-utils: ^3.5.0 @@ -2743,10 +3690,31 @@ packages: resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} dev: true + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + /xe-utils@3.5.22: resolution: {integrity: sha512-rhWuM2fVXsdrqUtyjRAsYTDLvVzYSSZqg/uCRyDqcw96AweB1AWsnTJZyl9g68ejnP0xhxfSoNBSrIcOeX1yxA==} dev: false + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + /zrender@5.4.0: resolution: {integrity: sha512-rOS09Z2HSVGFs2dn/TuYk5BlCaZcVe8UDLLjj1ySYF828LATKKdxuakSZMvrDz54yiKPDYVfjdKqcX8Jky3BIA==} dependencies: diff --git a/public/favicon.ico b/public/favicon.ico index e263760..ea55dc1 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/static/images/liangfaliangqu.gif b/public/static/images/liangfaliangqu.gif new file mode 100644 index 0000000..82f7746 Binary files /dev/null and b/public/static/images/liangfaliangqu.gif differ diff --git a/public/static/images/liangfaliangquyibeng.gif b/public/static/images/liangfaliangquyibeng.gif new file mode 100644 index 0000000..664ffbf Binary files /dev/null and b/public/static/images/liangfaliangquyibeng.gif differ diff --git a/public/static/images/sanfasanqu.gif b/public/static/images/sanfasanqu.gif new file mode 100644 index 0000000..cd45fe7 Binary files /dev/null and b/public/static/images/sanfasanqu.gif differ diff --git a/public/static/images/sanfasanquyibeng.gif b/public/static/images/sanfasanquyibeng.gif new file mode 100644 index 0000000..3ac1896 Binary files /dev/null and b/public/static/images/sanfasanquyibeng.gif differ diff --git a/public/static/images/yifaliangqu.gif b/public/static/images/yifaliangqu.gif new file mode 100644 index 0000000..328519b Binary files /dev/null and b/public/static/images/yifaliangqu.gif differ diff --git a/public/static/images/yifaliangquyibeng.gif b/public/static/images/yifaliangquyibeng.gif new file mode 100644 index 0000000..89c263a Binary files /dev/null and b/public/static/images/yifaliangquyibeng.gif differ diff --git a/public/static/images/yifasanqu.gif b/public/static/images/yifasanqu.gif new file mode 100644 index 0000000..1fb9251 Binary files /dev/null and b/public/static/images/yifasanqu.gif differ diff --git a/public/static/images/yifayiqu.gif b/public/static/images/yifayiqu.gif new file mode 100644 index 0000000..9745ad2 Binary files /dev/null and b/public/static/images/yifayiqu.gif differ diff --git a/public/static/images/yifayiquyibeng.gif b/public/static/images/yifayiquyibeng.gif new file mode 100644 index 0000000..22c1d9f Binary files /dev/null and b/public/static/images/yifayiquyibeng.gif differ diff --git a/public/static/images/yifaysanquyibeng.gif b/public/static/images/yifaysanquyibeng.gif new file mode 100644 index 0000000..69eee2a Binary files /dev/null and b/public/static/images/yifaysanquyibeng.gif differ diff --git a/src/api/monitoring/static/index.js b/src/api/monitoring/static/index.js new file mode 100644 index 0000000..6fba3c3 --- /dev/null +++ b/src/api/monitoring/static/index.js @@ -0,0 +1,13 @@ +import request from "@/utils/request"; +/** + * 获取报表统计 + * + * @param queryParams + */ +export function dcBusiDayReport(queryParams) { + return request({ + url: "/dc/dcBusiDayReport/list", + method: "get", + params: queryParams, + }); +} diff --git a/src/api/monitoring/visual/index.js b/src/api/monitoring/visual/index.js new file mode 100644 index 0000000..22df4ef --- /dev/null +++ b/src/api/monitoring/visual/index.js @@ -0,0 +1,84 @@ +import request from "@/utils/request"; + +/** + * 获取热源列表 + */ +export function getDeptList(data) { + return request({ + url: "/system/dept/selectList", + method: "post", + data: data, + }); +} +/** + * 获取图表数据 + */ +export function getrealTime(queryParams) { + return request({ + url: "dc/heatSourceScreen/heatSource/realTime/data", + method: "get", + params: queryParams, + }); +} +/** + * 温度曲线 + */ +export function getTempChart(queryParams) { + return request({ + url: "/dc/heatSourceScreen/heatExchangeStation/temperature/history/data", + method: "get", + params: queryParams, + }); +} +/** + * 温度曲线 + */ +export function getTempChartPolling(queryParams) { + return request({ + url: "/dc/heatSourceScreen/heatExchangeStation/temperature/realTime/data", + method: "get", + params: queryParams, + }); +} + +/** + * 压力曲线 + */ +export function getPressChart(queryParams) { + return request({ + url: "/dc/heatSourceScreen/heatExchangeStation/stress/history/data", + method: "get", + params: queryParams, + }); +} +/** + * 压力曲线 + */ +export function getPressChartPolling(queryParams) { + return request({ + url: "/dc/heatSourceScreen/heatExchangeStation/stress/realTime/data", + method: "get", + params: queryParams, + }); +} + +/** + * 获取表格header + */ +export function getTableHeader() { + return request({ + url: "/dc/heatSourceScreen/heatSource/table/header", + method: "get", + }); +} + +/** + * 获取换热站Table列表 + */ +export function getTableData(data) { + return request({ + url: "/dc/heatSourceScreen/heatSource/table/data", + method: "post", + data: data, + }); +} diff --git a/src/api/system/user.js b/src/api/system/user.js index 637acd5..a7cb6f7 100644 --- a/src/api/system/user.js +++ b/src/api/system/user.js @@ -1,145 +1,153 @@ -import request from '@/utils/request' +import request from "@/utils/request"; import { parseStrEmpty } from "@/utils/ruoyi"; // 查询用户列表 export function listUser(query) { return request({ - url: '/system/user/list', - method: 'get', - params: query - }) + url: "/system/user/list", + method: "get", + params: query, + }); } // 查询用户详细 export function getUser(userId) { return request({ - url: '/system/user/' + parseStrEmpty(userId), - method: 'get' - }) + url: "/system/user/" + parseStrEmpty(userId), + method: "get", + }); } // 新增用户 export function addUser(data) { return request({ - url: '/system/user', - method: 'post', - data: data - }) + url: "/system/user", + method: "post", + data: data, + }); } // 修改用户 export function updateUser(data) { return request({ - url: '/system/user', - method: 'put', - data: data - }) + url: "/system/user", + method: "put", + data: data, + }); } // 删除用户 export function delUser(userId) { return request({ - url: '/system/user/' + userId, - method: 'delete' - }) + url: "/system/user/" + userId, + method: "delete", + }); } // 用户密码重置 export function resetUserPwd(userId, password) { const data = { userId, - password - } + password, + }; return request({ - url: '/system/user/resetPwd', - method: 'put', - data: data - }) + url: "/system/user/resetPwd", + method: "put", + data: data, + }); } // 用户状态修改 export function changeUserStatus(userId, status) { const data = { userId, - status - } + status, + }; return request({ - url: '/system/user/changeStatus', - method: 'put', - data: data - }) + url: "/system/user/changeStatus", + method: "put", + data: data, + }); } // 查询用户个人信息 export function getUserProfile() { return request({ - url: '/system/user/profile', - method: 'get' - }) + url: "/system/user/profile", + method: "get", + }); } // 修改用户个人信息 export function updateUserProfile(data) { return request({ - url: '/system/user/profile', - method: 'put', - data: data - }) + url: "/system/user/profile", + method: "put", + data: data, + }); } // 用户密码重置 export function updateUserPwd(oldPassword, newPassword) { const data = { oldPassword, - newPassword - } + newPassword, + }; return request({ - url: '/system/user/profile/updatePwd', - method: 'put', - params: data - }) + url: "/system/user/profile/updatePwd", + method: "put", + params: data, + }); } // 用户头像上传 export function uploadAvatar(data) { return request({ - url: '/system/user/profile/avatar', - method: 'post', - data: data - }) + url: "/system/user/profile/avatar", + method: "post", + data: data, + }); } // 查询授权角色 export function getAuthRole(userId) { return request({ - url: '/system/user/authRole/' + userId, - method: 'get' - }) + url: "/system/user/authRole/" + userId, + method: "get", + }); } // 保存授权角色 export function updateAuthRole(data) { return request({ - url: '/system/user/authRole', - method: 'put', - params: data - }) + url: "/system/user/authRole", + method: "put", + params: data, + }); } // 查询部门下拉树结构 export function deptTreeSelect() { return request({ - url: '/system/user/deptTree', - method: 'get' - }) + url: "/system/user/deptTree", + method: "get", + }); } - // 查询部门下拉树结构 export function deptTreeSelectNew() { return request({ - url: '/system/user/deptTreeNew', - method: 'get' - }) + url: "/system/user/deptTreeNew", + method: "get", + }); } +/** + * 获取天气预报 + */ +export function getWeather() { + return request({ + url: "/model/dcBusiRealWeatherHours/oneLast", + method: "get", + }); +} diff --git a/src/assets/fonts/AlibabaPuHuiTiBold.ttf b/src/assets/fonts/AlibabaPuHuiTiBold.ttf new file mode 100644 index 0000000..7edd4e5 Binary files /dev/null and b/src/assets/fonts/AlibabaPuHuiTiBold.ttf differ diff --git a/src/assets/fonts/AlibabaPuHuiTiRegular.ttf b/src/assets/fonts/AlibabaPuHuiTiRegular.ttf new file mode 100644 index 0000000..a6eaf36 Binary files /dev/null and b/src/assets/fonts/AlibabaPuHuiTiRegular.ttf differ diff --git a/src/assets/fonts/LixukeXingshu.ttf b/src/assets/fonts/LixukeXingshu.ttf new file mode 100644 index 0000000..4ae7277 Binary files /dev/null and b/src/assets/fonts/LixukeXingshu.ttf differ diff --git a/src/assets/fonts/PangMenZhengDaoBiao.ttf b/src/assets/fonts/PangMenZhengDaoBiao.ttf new file mode 100644 index 0000000..cd65b62 Binary files /dev/null and b/src/assets/fonts/PangMenZhengDaoBiao.ttf differ diff --git a/src/assets/fonts/SourceHanSansBold.OTF b/src/assets/fonts/SourceHanSansBold.OTF new file mode 100644 index 0000000..886f82f Binary files /dev/null and b/src/assets/fonts/SourceHanSansBold.OTF differ diff --git a/src/assets/fonts/SourceHanSansBold.ttf b/src/assets/fonts/SourceHanSansBold.ttf new file mode 100644 index 0000000..b1f65f2 Binary files /dev/null and b/src/assets/fonts/SourceHanSansBold.ttf differ diff --git a/src/assets/fonts/YouSheBiaoTiHei.ttf b/src/assets/fonts/YouSheBiaoTiHei.ttf new file mode 100644 index 0000000..3729151 Binary files /dev/null and b/src/assets/fonts/YouSheBiaoTiHei.ttf differ diff --git a/src/assets/fonts/font.css b/src/assets/fonts/font.css new file mode 100644 index 0000000..cf3dae4 --- /dev/null +++ b/src/assets/fonts/font.css @@ -0,0 +1,24 @@ +@font-face { + font-family: 'YouSheBiaoTiHei'; + src: url('YouSheBiaoTiHei.ttf') format('truetype'); +} +@font-face { + font-family: 'AlibabaPuHuiTiRegular'; + src: url('AlibabaPuHuiTiRegular.ttf') format('truetype'); +} +@font-face { + font-family: 'AlibabaPuHuiTiBold'; + src: url('AlibabaPuHuiTiBold.ttf') format('truetype'); +} +@font-face { + font-family: 'LixukeXingshu'; + src: url('LixukeXingshu.ttf') format('truetype'); +} +@font-face { + font-family: 'PangMenZhengDaoBiao'; + src: url('PangMenZhengDaoBiao.ttf') format('truetype'); +} +@font-face { + font-family: 'SourceHanSansBold'; + src: url('SourceHanSansBold.OTF') format('OpenType'); +} diff --git a/src/assets/iconfont/demo.css b/src/assets/iconfont/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/src/assets/iconfont/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/src/assets/iconfont/demo_index.html b/src/assets/iconfont/demo_index.html new file mode 100644 index 0000000..c258ae5 --- /dev/null +++ b/src/assets/iconfont/demo_index.html @@ -0,0 +1,1821 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    堆积面积图
    +
    
    +
  • + +
  • + +
    air_conditioning_filter
    +
    
    +
  • + +
  • + +
    锅炉
    +
    
    +
  • + +
  • + +
    设备
    +
    
    +
  • + +
  • + +
    right-换热站-c
    +
    
    +
  • + +
  • + +
    30D上双箭头
    +
    
    +
  • + +
  • + +
    30C下双箭头
    +
    
    +
  • + +
  • + +
    多云
    +
    
    +
  • + +
  • + +
    报警,警报,报警灯,危险
    +
    
    +
  • + +
  • + +
    分屏,宫格
    +
    
    +
  • + +
  • + +
    单图排列
    +
    
    +
  • + +
  • + +
    homepage
    +
    
    +
  • + +
  • + +
    历史-01
    +
    
    +
  • + +
  • + +
    换热站
    +
    
    +
  • + +
  • + +
    more
    +
    
    +
  • + +
  • + +
    list
    +
    
    +
  • + +
  • + +
    key
    +
    
    +
  • + +
  • + +
    用户管理
    +
    
    +
  • + +
  • + +
    首页
    +
    
    +
  • + +
  • + +
    编辑
    +
    
    +
  • + +
  • + +
    icon_应用管理
    +
    
    +
  • + +
  • + +
    setting
    +
    
    +
  • + +
  • + +
    folder-open
    +
    
    +
  • + +
  • + +
    image
    +
    
    +
  • + +
  • + +
    云端下载
    +
    
    +
  • + +
  • + +
    云端上传
    +
    
    +
  • + +
  • + +
    角色管理
    +
    
    +
  • + +
  • + +
    访问量
    +
    
    +
  • + +
  • + +
    总访问量
    +
    
    +
  • + +
  • + +
    订单成交额
    +
    
    +
  • + +
  • + +
    成交数据-01
    +
    
    +
  • + +
  • + +
    下载数量
    +
    
    +
  • + +
  • + +
    编辑
    +
    
    +
  • + +
  • + +
    customer-fill
    +
    
    +
  • + +
  • + +
    密码
    +
    
    +
  • + +
  • + +
    中英切换
    +
    
    +
  • + +
  • + +
    arrow-down-filling
    +
    
    +
  • + +
  • + +
    close
    +
    
    +
  • + +
  • + +
    filter
    +
    
    +
  • + +
  • + +
    ashbin
    +
    
    +
  • + +
  • + +
    code
    +
    
    +
  • + +
  • + +
    copy
    +
    
    +
  • + +
  • + +
    link
    +
    
    +
  • + +
  • + +
    layers
    +
    
    +
  • + +
  • + +
    fullscreen-expand
    +
    
    +
  • + +
  • + +
    menu
    +
    
    +
  • + +
  • + +
    minus
    +
    
    +
  • + +
  • + +
    refresh
    +
    
    +
  • + +
  • + +
    scanning
    +
    
    +
  • + +
  • + +
    关闭其他-01
    +
    
    +
  • + +
  • + +
    字体大小
    +
    
    +
  • + +
  • + +
    page_first
    +
    
    +
  • + +
  • + +
    scan
    +
    
    +
  • + +
  • + +
    edit
    +
    
    +
  • + +
  • + +
    camera
    +
    
    +
  • + +
  • + +
    qr_code
    +
    
    +
  • + +
  • + +
    delete
    +
    
    +
  • + +
  • + +
    地址
    +
    
    +
  • + +
  • + +
    闹钟
    +
    
    +
  • + +
  • + +
    地址
    +
    
    +
  • + +
  • + +
    icon_设置
    +
    
    +
  • + +
  • + +
    重置
    +
    
    +
  • + +
  • + +
    search
    +
    
    +
  • + +
  • + +
    page_last
    +
    
    +
  • + +
  • + +
    其他
    +
    
    +
  • + +
  • + +
    安全
    +
    
    +
  • + +
  • + +
    网商银行无线端_安全
    +
    
    +
  • + +
  • + +
    up
    +
    
    +
  • + +
  • + +
    angle-double-up
    +
    
    +
  • + +
  • + +
    323向左交换
    +
    
    +
  • + +
  • + +
    324向右交换
    +
    
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1706149491935') format('woff2'),
+       url('iconfont.woff?t=1706149491935') format('woff'),
+       url('iconfont.ttf?t=1706149491935') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + 堆积面积图 +
    +
    .icon-area-chart +
    +
  • + +
  • + +
    + air_conditioning_filter +
    +
    .icon-HP +
    +
  • + +
  • + +
    + 锅炉 +
    +
    .icon-boiler +
    +
  • + +
  • + +
    + 设备 +
    +
    .icon-device +
    +
  • + +
  • + +
    + right-换热站-c +
    +
    .icon-heat-exchange-station +
    +
  • + +
  • + +
    + 30D上双箭头 +
    +
    .icon-yincang +
    +
  • + +
  • + +
    + 30C下双箭头 +
    +
    .icon-xianshi +
    +
  • + +
  • + +
    + 多云 +
    +
    .icon-weather +
    +
  • + +
  • + +
    + 报警,警报,报警灯,危险 +
    +
    .icon-alarm +
    +
  • + +
  • + +
    + 分屏,宫格 +
    +
    .icon-four-screen +
    +
  • + +
  • + +
    + 单图排列 +
    +
    .icon-one-screen +
    +
  • + +
  • + +
    + homepage +
    +
    .icon-nine-screen +
    +
  • + +
  • + +
    + 历史-01 +
    +
    .icon-history +
    +
  • + +
  • + +
    + 换热站 +
    +
    .icon-station +
    +
  • + +
  • + +
    + more +
    +
    .icon-more +
    +
  • + +
  • + +
    + list +
    +
    .icon-list +
    +
  • + +
  • + +
    + key +
    +
    .icon-key +
    +
  • + +
  • + +
    + 用户管理 +
    +
    .icon-user-mgt +
    +
  • + +
  • + +
    + 首页 +
    +
    .icon-home +
    +
  • + +
  • + +
    + 编辑 +
    +
    .icon-set-edit +
    +
  • + +
  • + +
    + icon_应用管理 +
    +
    .icon-app-mgt +
    +
  • + +
  • + +
    + setting +
    +
    .icon-setting +
    +
  • + +
  • + +
    + folder-open +
    +
    .icon-folder-open +
    +
  • + +
  • + +
    + image +
    +
    .icon-image +
    +
  • + +
  • + +
    + 云端下载 +
    +
    .icon-cloud-download +
    +
  • + +
  • + +
    + 云端上传 +
    +
    .icon-cloud-upload +
    +
  • + +
  • + +
    + 角色管理 +
    +
    .icon-role-mgt +
    +
  • + +
  • + +
    + 访问量 +
    +
    .icon-visits-chart +
    +
  • + +
  • + +
    + 总访问量 +
    +
    .icon-user-visits +
    +
  • + +
  • + +
    + 订单成交额 +
    +
    .icon-turnover +
    +
  • + +
  • + +
    + 成交数据-01 +
    +
    .icon-num-transactions +
    +
  • + +
  • + +
    + 下载数量 +
    +
    .icon-num-download +
    +
  • + +
  • + +
    + 编辑 +
    +
    .icon-edit-icon +
    +
  • + +
  • + +
    + customer-fill +
    +
    .icon-user +
    +
  • + +
  • + +
    + 密码 +
    +
    .icon-lock +
    +
  • + +
  • + +
    + 中英切换 +
    +
    .icon-language +
    +
  • + +
  • + +
    + arrow-down-filling +
    +
    .icon-arrow-down +
    +
  • + +
  • + +
    + close +
    +
    .icon-close +
    +
  • + +
  • + +
    + filter +
    +
    .icon-filter +
    +
  • + +
  • + +
    + ashbin +
    +
    .icon-ashbin +
    +
  • + +
  • + +
    + code +
    +
    .icon-code +
    +
  • + +
  • + +
    + copy +
    +
    .icon-copy +
    +
  • + +
  • + +
    + link +
    +
    .icon-link +
    +
  • + +
  • + +
    + layers +
    +
    .icon-layers +
    +
  • + +
  • + +
    + fullscreen-expand +
    +
    .icon-fullscreen +
    +
  • + +
  • + +
    + menu +
    +
    .icon-menu +
    +
  • + +
  • + +
    + minus +
    +
    .icon-minus +
    +
  • + +
  • + +
    + refresh +
    +
    .icon-refresh +
    +
  • + +
  • + +
    + scanning +
    +
    .icon-scanning +
    +
  • + +
  • + +
    + 关闭其他-01 +
    +
    .icon-close-other +
    +
  • + +
  • + +
    + 字体大小 +
    +
    .icon-font-size +
    +
  • + +
  • + +
    + page_first +
    +
    .icon-page-left +
    +
  • + +
  • + +
    + scan +
    +
    .icon-scan +
    +
  • + +
  • + +
    + edit +
    +
    .icon-edit +
    +
  • + +
  • + +
    + camera +
    +
    .icon-camera +
    +
  • + +
  • + +
    + qr_code +
    +
    .icon-qrcode +
    +
  • + +
  • + +
    + delete +
    +
    .icon-delete +
    +
  • + +
  • + +
    + 地址 +
    +
    .icon-address +
    +
  • + +
  • + +
    + 闹钟 +
    +
    .icon-clock +
    +
  • + +
  • + +
    + 地址 +
    +
    .icon-location +
    +
  • + +
  • + +
    + icon_设置 +
    +
    .icon-setup +
    +
  • + +
  • + +
    + 重置 +
    +
    .icon-reset +
    +
  • + +
  • + +
    + search +
    +
    .icon-search +
    +
  • + +
  • + +
    + page_last +
    +
    .icon-page-right +
    +
  • + +
  • + +
    + 其他 +
    +
    .icon-other +
    +
  • + +
  • + +
    + 安全 +
    +
    .icon-safe +
    +
  • + +
  • + +
    + 网商银行无线端_安全 +
    +
    .icon-safe-code +
    +
  • + +
  • + +
    + up +
    +
    .icon-up +
    +
  • + +
  • + +
    + angle-double-up +
    +
    .icon-angle-double +
    +
  • + +
  • + +
    + 323向左交换 +
    +
    .icon-rise +
    +
  • + +
  • + +
    + 324向右交换 +
    +
    .icon-decline +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    堆积面积图
    +
    #icon-area-chart
    +
  • + +
  • + +
    air_conditioning_filter
    +
    #icon-HP
    +
  • + +
  • + +
    锅炉
    +
    #icon-boiler
    +
  • + +
  • + +
    设备
    +
    #icon-device
    +
  • + +
  • + +
    right-换热站-c
    +
    #icon-heat-exchange-station
    +
  • + +
  • + +
    30D上双箭头
    +
    #icon-yincang
    +
  • + +
  • + +
    30C下双箭头
    +
    #icon-xianshi
    +
  • + +
  • + +
    多云
    +
    #icon-weather
    +
  • + +
  • + +
    报警,警报,报警灯,危险
    +
    #icon-alarm
    +
  • + +
  • + +
    分屏,宫格
    +
    #icon-four-screen
    +
  • + +
  • + +
    单图排列
    +
    #icon-one-screen
    +
  • + +
  • + +
    homepage
    +
    #icon-nine-screen
    +
  • + +
  • + +
    历史-01
    +
    #icon-history
    +
  • + +
  • + +
    换热站
    +
    #icon-station
    +
  • + +
  • + +
    more
    +
    #icon-more
    +
  • + +
  • + +
    list
    +
    #icon-list
    +
  • + +
  • + +
    key
    +
    #icon-key
    +
  • + +
  • + +
    用户管理
    +
    #icon-user-mgt
    +
  • + +
  • + +
    首页
    +
    #icon-home
    +
  • + +
  • + +
    编辑
    +
    #icon-set-edit
    +
  • + +
  • + +
    icon_应用管理
    +
    #icon-app-mgt
    +
  • + +
  • + +
    setting
    +
    #icon-setting
    +
  • + +
  • + +
    folder-open
    +
    #icon-folder-open
    +
  • + +
  • + +
    image
    +
    #icon-image
    +
  • + +
  • + +
    云端下载
    +
    #icon-cloud-download
    +
  • + +
  • + +
    云端上传
    +
    #icon-cloud-upload
    +
  • + +
  • + +
    角色管理
    +
    #icon-role-mgt
    +
  • + +
  • + +
    访问量
    +
    #icon-visits-chart
    +
  • + +
  • + +
    总访问量
    +
    #icon-user-visits
    +
  • + +
  • + +
    订单成交额
    +
    #icon-turnover
    +
  • + +
  • + +
    成交数据-01
    +
    #icon-num-transactions
    +
  • + +
  • + +
    下载数量
    +
    #icon-num-download
    +
  • + +
  • + +
    编辑
    +
    #icon-edit-icon
    +
  • + +
  • + +
    customer-fill
    +
    #icon-user
    +
  • + +
  • + +
    密码
    +
    #icon-lock
    +
  • + +
  • + +
    中英切换
    +
    #icon-language
    +
  • + +
  • + +
    arrow-down-filling
    +
    #icon-arrow-down
    +
  • + +
  • + +
    close
    +
    #icon-close
    +
  • + +
  • + +
    filter
    +
    #icon-filter
    +
  • + +
  • + +
    ashbin
    +
    #icon-ashbin
    +
  • + +
  • + +
    code
    +
    #icon-code
    +
  • + +
  • + +
    copy
    +
    #icon-copy
    +
  • + +
  • + +
    link
    +
    #icon-link
    +
  • + +
  • + +
    layers
    +
    #icon-layers
    +
  • + +
  • + +
    fullscreen-expand
    +
    #icon-fullscreen
    +
  • + +
  • + +
    menu
    +
    #icon-menu
    +
  • + +
  • + +
    minus
    +
    #icon-minus
    +
  • + +
  • + +
    refresh
    +
    #icon-refresh
    +
  • + +
  • + +
    scanning
    +
    #icon-scanning
    +
  • + +
  • + +
    关闭其他-01
    +
    #icon-close-other
    +
  • + +
  • + +
    字体大小
    +
    #icon-font-size
    +
  • + +
  • + +
    page_first
    +
    #icon-page-left
    +
  • + +
  • + +
    scan
    +
    #icon-scan
    +
  • + +
  • + +
    edit
    +
    #icon-edit
    +
  • + +
  • + +
    camera
    +
    #icon-camera
    +
  • + +
  • + +
    qr_code
    +
    #icon-qrcode
    +
  • + +
  • + +
    delete
    +
    #icon-delete
    +
  • + +
  • + +
    地址
    +
    #icon-address
    +
  • + +
  • + +
    闹钟
    +
    #icon-clock
    +
  • + +
  • + +
    地址
    +
    #icon-location
    +
  • + +
  • + +
    icon_设置
    +
    #icon-setup
    +
  • + +
  • + +
    重置
    +
    #icon-reset
    +
  • + +
  • + +
    search
    +
    #icon-search
    +
  • + +
  • + +
    page_last
    +
    #icon-page-right
    +
  • + +
  • + +
    其他
    +
    #icon-other
    +
  • + +
  • + +
    安全
    +
    #icon-safe
    +
  • + +
  • + +
    网商银行无线端_安全
    +
    #icon-safe-code
    +
  • + +
  • + +
    up
    +
    #icon-up
    +
  • + +
  • + +
    angle-double-up
    +
    #icon-angle-double
    +
  • + +
  • + +
    323向左交换
    +
    #icon-rise
    +
  • + +
  • + +
    324向右交换
    +
    #icon-decline
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/src/assets/iconfont/iconfont.css b/src/assets/iconfont/iconfont.css new file mode 100644 index 0000000..1bac211 --- /dev/null +++ b/src/assets/iconfont/iconfont.css @@ -0,0 +1,299 @@ +@font-face { + font-family: "iconfont"; /* Project id 4223894 */ + src: url('iconfont.woff2?t=1706149491935') format('woff2'), + url('iconfont.woff?t=1706149491935') format('woff'), + url('iconfont.ttf?t=1706149491935') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-area-chart:before { + content: "\e612"; +} + +.icon-HP:before { + content: "\e7b1"; +} + +.icon-boiler:before { + content: "\e60d"; +} + +.icon-device:before { + content: "\e9fd"; +} + +.icon-heat-exchange-station:before { + content: "\e84a"; +} + +.icon-yincang:before { + content: "\e690"; +} + +.icon-xianshi:before { + content: "\e691"; +} + +.icon-weather:before { + content: "\e601"; +} + +.icon-alarm:before { + content: "\e871"; +} + +.icon-four-screen:before { + content: "\e86a"; +} + +.icon-one-screen:before { + content: "\e600"; +} + +.icon-nine-screen:before { + content: "\e65f"; +} + +.icon-history:before { + content: "\e611"; +} + +.icon-station:before { + content: "\e6c5"; +} + +.icon-more:before { + content: "\e83d"; +} + +.icon-list:before { + content: "\e6be"; +} + +.icon-key:before { + content: "\e775"; +} + +.icon-user-mgt:before { + content: "\e617"; +} + +.icon-home:before { + content: "\e62e"; +} + +.icon-set-edit:before { + content: "\eb61"; +} + +.icon-app-mgt:before { + content: "\eb8f"; +} + +.icon-setting:before { + content: "\e78e"; +} + +.icon-folder-open:before { + content: "\e7d1"; +} + +.icon-image:before { + content: "\e7de"; +} + +.icon-cloud-download:before { + content: "\ec1d"; +} + +.icon-cloud-upload:before { + content: "\ec1e"; +} + +.icon-role-mgt:before { + content: "\e645"; +} + +.icon-visits-chart:before { + content: "\e6a5"; +} + +.icon-user-visits:before { + content: "\e651"; +} + +.icon-turnover:before { + content: "\ec18"; +} + +.icon-num-transactions:before { + content: "\e682"; +} + +.icon-num-download:before { + content: "\e6f8"; +} + +.icon-edit-icon:before { + content: "\e621"; +} + +.icon-user:before { + content: "\e828"; +} + +.icon-lock:before { + content: "\e62a"; +} + +.icon-language:before { + content: "\e739"; +} + +.icon-arrow-down:before { + content: "\e688"; +} + +.icon-close:before { + content: "\e668"; +} + +.icon-filter:before { + content: "\e648"; +} + +.icon-ashbin:before { + content: "\e665"; +} + +.icon-code:before { + content: "\e667"; +} + +.icon-copy:before { + content: "\e66a"; +} + +.icon-link:before { + content: "\e676"; +} + +.icon-layers:before { + content: "\e675"; +} + +.icon-fullscreen:before { + content: "\e677"; +} + +.icon-menu:before { + content: "\e678"; +} + +.icon-minus:before { + content: "\e67a"; +} + +.icon-refresh:before { + content: "\e67b"; +} + +.icon-scanning:before { + content: "\e67d"; +} + +.icon-close-other:before { + content: "\e624"; +} + +.icon-font-size:before { + content: "\e689"; +} + +.icon-page-left:before { + content: "\e659"; +} + +.icon-scan:before { + content: "\e68b"; +} + +.icon-edit:before { + content: "\e6aa"; +} + +.icon-camera:before { + content: "\e666"; +} + +.icon-qrcode:before { + content: "\e6b0"; +} + +.icon-delete:before { + content: "\e6b4"; +} + +.icon-address:before { + content: "\e652"; +} + +.icon-clock:before { + content: "\e890"; +} + +.icon-location:before { + content: "\e63d"; +} + +.icon-setup:before { + content: "\eb8d"; +} + +.icon-reset:before { + content: "\e614"; +} + +.icon-search:before { + content: "\e63c"; +} + +.icon-page-right:before { + content: "\e65b"; +} + +.icon-other:before { + content: "\e60b"; +} + +.icon-safe:before { + content: "\ec4d"; +} + +.icon-safe-code:before { + content: "\e627"; +} + +.icon-up:before { + content: "\e845"; +} + +.icon-angle-double:before { + content: "\e849"; +} + +.icon-rise:before { + content: "\e8f8"; +} + +.icon-decline:before { + content: "\e8f9"; +} + diff --git a/src/assets/iconfont/iconfont.js b/src/assets/iconfont/iconfont.js new file mode 100644 index 0000000..562cc5e --- /dev/null +++ b/src/assets/iconfont/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_4223894='',function(h){var c=(c=document.getElementsByTagName("script"))[c.length-1],l=c.getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var a,i,t,o,s,v=function(c,l){l.parentNode.insertBefore(c,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}a=function(){var c,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4223894,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(c=document.body).firstChild?v(l,c.firstChild):c.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),a()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(t=a,o=h.document,s=!1,m(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,z())})}function z(){s||(s=!0,t())}function m(){try{o.documentElement.doScroll("left")}catch(c){return void setTimeout(m,50)}z()}}(window); \ No newline at end of file diff --git a/src/assets/iconfont/iconfont.json b/src/assets/iconfont/iconfont.json new file mode 100644 index 0000000..0ae11ab --- /dev/null +++ b/src/assets/iconfont/iconfont.json @@ -0,0 +1,506 @@ +{ + "id": "4223894", + "name": "浑南热力", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "4781603", + "name": "堆积面积图", + "font_class": "area-chart", + "unicode": "e612", + "unicode_decimal": 58898 + }, + { + "icon_id": "15731469", + "name": "air_conditioning_filter", + "font_class": "HP", + "unicode": "e7b1", + "unicode_decimal": 59313 + }, + { + "icon_id": "5037507", + "name": "锅炉", + "font_class": "boiler", + "unicode": "e60d", + "unicode_decimal": 58893 + }, + { + "icon_id": "23060488", + "name": "设备", + "font_class": "device", + "unicode": "e9fd", + "unicode_decimal": 59901 + }, + { + "icon_id": "25873889", + "name": "right-换热站-c", + "font_class": "heat-exchange-station", + "unicode": "e84a", + "unicode_decimal": 59466 + }, + { + "icon_id": "29522767", + "name": "30D上双箭头", + "font_class": "yincang", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "29522768", + "name": "30C下双箭头", + "font_class": "xianshi", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "1447", + "name": "多云", + "font_class": "weather", + "unicode": "e601", + "unicode_decimal": 58881 + }, + { + "icon_id": "18164959", + "name": "报警,警报,报警灯,危险", + "font_class": "alarm", + "unicode": "e871", + "unicode_decimal": 59505 + }, + { + "icon_id": "18164825", + "name": "分屏,宫格", + "font_class": "four-screen", + "unicode": "e86a", + "unicode_decimal": 59498 + }, + { + "icon_id": "1278", + "name": "单图排列", + "font_class": "one-screen", + "unicode": "e600", + "unicode_decimal": 58880 + }, + { + "icon_id": "9773647", + "name": "homepage", + "font_class": "nine-screen", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "8821264", + "name": "历史-01", + "font_class": "history", + "unicode": "e611", + "unicode_decimal": 58897 + }, + { + "icon_id": "18911700", + "name": "换热站", + "font_class": "station", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "34453016", + "name": "more", + "font_class": "more", + "unicode": "e83d", + "unicode_decimal": 59453 + }, + { + "icon_id": "8474293", + "name": "list", + "font_class": "list", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "6150969", + "name": "key", + "font_class": "key", + "unicode": "e775", + "unicode_decimal": 59253 + }, + { + "icon_id": "1348257", + "name": "用户管理", + "font_class": "user-mgt", + "unicode": "e617", + "unicode_decimal": 58903 + }, + { + "icon_id": "2675009", + "name": "首页", + "font_class": "home", + "unicode": "e62e", + "unicode_decimal": 58926 + }, + { + "icon_id": "3868263", + "name": "编辑", + "font_class": "set-edit", + "unicode": "eb61", + "unicode_decimal": 60257 + }, + { + "icon_id": "4347582", + "name": "icon_应用管理", + "font_class": "app-mgt", + "unicode": "eb8f", + "unicode_decimal": 60303 + }, + { + "icon_id": "4765891", + "name": "setting", + "font_class": "setting", + "unicode": "e78e", + "unicode_decimal": 59278 + }, + { + "icon_id": "4766847", + "name": "folder-open", + "font_class": "folder-open", + "unicode": "e7d1", + "unicode_decimal": 59345 + }, + { + "icon_id": "4766917", + "name": "image", + "font_class": "image", + "unicode": "e7de", + "unicode_decimal": 59358 + }, + { + "icon_id": "4932635", + "name": "云端下载", + "font_class": "cloud-download", + "unicode": "ec1d", + "unicode_decimal": 60445 + }, + { + "icon_id": "4932636", + "name": "云端上传", + "font_class": "cloud-upload", + "unicode": "ec1e", + "unicode_decimal": 60446 + }, + { + "icon_id": "6447176", + "name": "角色管理", + "font_class": "role-mgt", + "unicode": "e645", + "unicode_decimal": 58949 + }, + { + "icon_id": "6033101", + "name": "访问量", + "font_class": "visits-chart", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "7956168", + "name": "总访问量", + "font_class": "user-visits", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "26442901", + "name": "订单成交额", + "font_class": "turnover", + "unicode": "ec18", + "unicode_decimal": 60440 + }, + { + "icon_id": "26908793", + "name": "成交数据-01", + "font_class": "num-transactions", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "31500093", + "name": "下载数量", + "font_class": "num-download", + "unicode": "e6f8", + "unicode_decimal": 59128 + }, + { + "icon_id": "33987167", + "name": "编辑", + "font_class": "edit-icon", + "unicode": "e621", + "unicode_decimal": 58913 + }, + { + "icon_id": "34452814", + "name": "customer-fill", + "font_class": "user", + "unicode": "e828", + "unicode_decimal": 59432 + }, + { + "icon_id": "611345", + "name": "密码", + "font_class": "lock", + "unicode": "e62a", + "unicode_decimal": 58922 + }, + { + "icon_id": "31061118", + "name": "中英切换", + "font_class": "language", + "unicode": "e739", + "unicode_decimal": 59193 + }, + { + "icon_id": "15838582", + "name": "arrow-down-filling", + "font_class": "arrow-down", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "15838444", + "name": "close", + "font_class": "close", + "unicode": "e668", + "unicode_decimal": 58984 + }, + { + "icon_id": "8777080", + "name": "filter", + "font_class": "filter", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "15838430", + "name": "ashbin", + "font_class": "ashbin", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "15838443", + "name": "code", + "font_class": "code", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "15838456", + "name": "copy", + "font_class": "copy", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "15838493", + "name": "link", + "font_class": "link", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "15838496", + "name": "layers", + "font_class": "layers", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "15838498", + "name": "fullscreen-expand", + "font_class": "fullscreen", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "15838501", + "name": "menu", + "font_class": "menu", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "15838514", + "name": "minus", + "font_class": "minus", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "15838519", + "name": "refresh", + "font_class": "refresh", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "15838527", + "name": "scanning", + "font_class": "scanning", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "33077825", + "name": "关闭其他-01", + "font_class": "close-other", + "unicode": "e624", + "unicode_decimal": 58916 + }, + { + "icon_id": "24502124", + "name": "字体大小", + "font_class": "font-size", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "8777532", + "name": "page_first", + "font_class": "page-left", + "unicode": "e659", + "unicode_decimal": 58969 + }, + { + "icon_id": "16617390", + "name": "scan", + "font_class": "scan", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "16618154", + "name": "edit", + "font_class": "edit", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "30414", + "name": "camera", + "font_class": "camera", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "32472", + "name": "qr_code", + "font_class": "qrcode", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "32477", + "name": "delete", + "font_class": "delete", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "658000", + "name": "地址", + "font_class": "address", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "2076264", + "name": "闹钟", + "font_class": "clock", + "unicode": "e890", + "unicode_decimal": 59536 + }, + { + "icon_id": "9690751", + "name": "地址", + "font_class": "location", + "unicode": "e63d", + "unicode_decimal": 58941 + }, + { + "icon_id": "4347549", + "name": "icon_设置", + "font_class": "setup", + "unicode": "eb8d", + "unicode_decimal": 60301 + }, + { + "icon_id": "27253675", + "name": "重置", + "font_class": "reset", + "unicode": "e614", + "unicode_decimal": 58900 + }, + { + "icon_id": "8776842", + "name": "search", + "font_class": "search", + "unicode": "e63c", + "unicode_decimal": 58940 + }, + { + "icon_id": "8777535", + "name": "page_last", + "font_class": "page-right", + "unicode": "e65b", + "unicode_decimal": 58971 + }, + { + "icon_id": "13106274", + "name": "其他", + "font_class": "other", + "unicode": "e60b", + "unicode_decimal": 58891 + }, + { + "icon_id": "5961299", + "name": "安全", + "font_class": "safe", + "unicode": "ec4d", + "unicode_decimal": 60493 + }, + { + "icon_id": "1599882", + "name": "网商银行无线端_安全", + "font_class": "safe-code", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "34453072", + "name": "up", + "font_class": "up", + "unicode": "e845", + "unicode_decimal": 59461 + }, + { + "icon_id": "6151391", + "name": "angle-double-up", + "font_class": "angle-double", + "unicode": "e849", + "unicode_decimal": 59465 + }, + { + "icon_id": "1727559", + "name": "323向左交换", + "font_class": "rise", + "unicode": "e8f8", + "unicode_decimal": 59640 + }, + { + "icon_id": "1727561", + "name": "324向右交换", + "font_class": "decline", + "unicode": "e8f9", + "unicode_decimal": 59641 + } + ] +} diff --git a/src/assets/iconfont/iconfont.ttf b/src/assets/iconfont/iconfont.ttf new file mode 100644 index 0000000..dd2ced9 Binary files /dev/null and b/src/assets/iconfont/iconfont.ttf differ diff --git a/src/assets/iconfont/iconfont.woff b/src/assets/iconfont/iconfont.woff new file mode 100644 index 0000000..8a81478 Binary files /dev/null and b/src/assets/iconfont/iconfont.woff differ diff --git a/src/assets/iconfont/iconfont.woff2 b/src/assets/iconfont/iconfont.woff2 new file mode 100644 index 0000000..4d7fe0e Binary files /dev/null and b/src/assets/iconfont/iconfont.woff2 differ diff --git a/src/assets/icons/svg/BIlogo.svg b/src/assets/icons/svg/BIlogo.svg new file mode 100644 index 0000000..0188584 --- /dev/null +++ b/src/assets/icons/svg/BIlogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/advert.svg b/src/assets/icons/svg/advert.svg new file mode 100644 index 0000000..5adcf43 --- /dev/null +++ b/src/assets/icons/svg/advert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/alarm.svg b/src/assets/icons/svg/alarm.svg new file mode 100644 index 0000000..7bec76b --- /dev/null +++ b/src/assets/icons/svg/alarm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/api.svg b/src/assets/icons/svg/api.svg new file mode 100644 index 0000000..2753743 --- /dev/null +++ b/src/assets/icons/svg/api.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/svg/baoxue-rijian.svg b/src/assets/icons/svg/baoxue-rijian.svg new file mode 100644 index 0000000..f4b8d48 --- /dev/null +++ b/src/assets/icons/svg/baoxue-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/baoyu-rijian.svg b/src/assets/icons/svg/baoyu-rijian.svg new file mode 100644 index 0000000..3dae155 --- /dev/null +++ b/src/assets/icons/svg/baoyu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/brand.svg b/src/assets/icons/svg/brand.svg new file mode 100644 index 0000000..e4b7cee --- /dev/null +++ b/src/assets/icons/svg/brand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/client.svg b/src/assets/icons/svg/client.svg new file mode 100644 index 0000000..ad4bc15 --- /dev/null +++ b/src/assets/icons/svg/client.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/close.svg b/src/assets/icons/svg/close.svg new file mode 100644 index 0000000..5b5057f --- /dev/null +++ b/src/assets/icons/svg/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/close_all.svg b/src/assets/icons/svg/close_all.svg new file mode 100644 index 0000000..aa13cd7 --- /dev/null +++ b/src/assets/icons/svg/close_all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/close_left.svg b/src/assets/icons/svg/close_left.svg new file mode 100644 index 0000000..e5708ea --- /dev/null +++ b/src/assets/icons/svg/close_left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/close_other.svg b/src/assets/icons/svg/close_other.svg new file mode 100644 index 0000000..212e6c2 --- /dev/null +++ b/src/assets/icons/svg/close_other.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/svg/close_right.svg b/src/assets/icons/svg/close_right.svg new file mode 100644 index 0000000..14d3cf3 --- /dev/null +++ b/src/assets/icons/svg/close_right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/coupon.svg b/src/assets/icons/svg/coupon.svg new file mode 100644 index 0000000..2f952b2 --- /dev/null +++ b/src/assets/icons/svg/coupon.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/svg/dabaoyu-rijian.svg b/src/assets/icons/svg/dabaoyu-rijian.svg new file mode 100644 index 0000000..d1d41e6 --- /dev/null +++ b/src/assets/icons/svg/dabaoyu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/daxue-rijian.svg b/src/assets/icons/svg/daxue-rijian.svg new file mode 100644 index 0000000..dc29cc0 --- /dev/null +++ b/src/assets/icons/svg/daxue-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/dayu-rijian.svg b/src/assets/icons/svg/dayu-rijian.svg new file mode 100644 index 0000000..848044e --- /dev/null +++ b/src/assets/icons/svg/dayu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/dict_item.svg b/src/assets/icons/svg/dict_item.svg new file mode 100644 index 0000000..903109a --- /dev/null +++ b/src/assets/icons/svg/dict_item.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/src/assets/icons/svg/document.svg b/src/assets/icons/svg/document.svg new file mode 100644 index 0000000..918ae33 --- /dev/null +++ b/src/assets/icons/svg/document.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/svg/dongyu-rijian.svg b/src/assets/icons/svg/dongyu-rijian.svg new file mode 100644 index 0000000..494dfb4 --- /dev/null +++ b/src/assets/icons/svg/dongyu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/duoyun-rijian.svg b/src/assets/icons/svg/duoyun-rijian.svg new file mode 100644 index 0000000..e124b37 --- /dev/null +++ b/src/assets/icons/svg/duoyun-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/duoyun-wanjian.svg b/src/assets/icons/svg/duoyun-wanjian.svg new file mode 100644 index 0000000..5ef7278 --- /dev/null +++ b/src/assets/icons/svg/duoyun-wanjian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/fuchen-rijian.svg b/src/assets/icons/svg/fuchen-rijian.svg new file mode 100644 index 0000000..e935c50 --- /dev/null +++ b/src/assets/icons/svg/fuchen-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/goods-list.svg b/src/assets/icons/svg/goods-list.svg new file mode 100644 index 0000000..fcb971e --- /dev/null +++ b/src/assets/icons/svg/goods-list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/goods.svg b/src/assets/icons/svg/goods.svg new file mode 100644 index 0000000..60c1c73 --- /dev/null +++ b/src/assets/icons/svg/goods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/homepage.svg b/src/assets/icons/svg/homepage.svg new file mode 100644 index 0000000..48f4e24 --- /dev/null +++ b/src/assets/icons/svg/homepage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/icon_back.svg b/src/assets/icons/svg/icon_back.svg new file mode 100644 index 0000000..c481bc6 --- /dev/null +++ b/src/assets/icons/svg/icon_back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/icon_curve.svg b/src/assets/icons/svg/icon_curve.svg new file mode 100644 index 0000000..7b65e30 --- /dev/null +++ b/src/assets/icons/svg/icon_curve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/icon_menu.svg b/src/assets/icons/svg/icon_menu.svg new file mode 100644 index 0000000..b68f6f4 --- /dev/null +++ b/src/assets/icons/svg/icon_menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/lab.svg b/src/assets/icons/svg/lab.svg new file mode 100644 index 0000000..d4d60aa --- /dev/null +++ b/src/assets/icons/svg/lab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/leizhenyu-rijian.svg b/src/assets/icons/svg/leizhenyu-rijian.svg new file mode 100644 index 0000000..671fdd7 --- /dev/null +++ b/src/assets/icons/svg/leizhenyu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/leizhenyujiabingbao.svg b/src/assets/icons/svg/leizhenyujiabingbao.svg new file mode 100644 index 0000000..b5520c7 --- /dev/null +++ b/src/assets/icons/svg/leizhenyujiabingbao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/menu.svg b/src/assets/icons/svg/menu.svg new file mode 100644 index 0000000..92c364c --- /dev/null +++ b/src/assets/icons/svg/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/multi_level.svg b/src/assets/icons/svg/multi_level.svg new file mode 100644 index 0000000..a1a2792 --- /dev/null +++ b/src/assets/icons/svg/multi_level.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/svg/order.svg b/src/assets/icons/svg/order.svg new file mode 100644 index 0000000..8f2107e --- /dev/null +++ b/src/assets/icons/svg/order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/perm.svg b/src/assets/icons/svg/perm.svg new file mode 100644 index 0000000..b38d065 --- /dev/null +++ b/src/assets/icons/svg/perm.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/svg/publish.svg b/src/assets/icons/svg/publish.svg new file mode 100644 index 0000000..e9b489c --- /dev/null +++ b/src/assets/icons/svg/publish.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/qiangshachenbao.svg b/src/assets/icons/svg/qiangshachenbao.svg new file mode 100644 index 0000000..bfb84ab --- /dev/null +++ b/src/assets/icons/svg/qiangshachenbao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/qing-rijian.svg b/src/assets/icons/svg/qing-rijian.svg new file mode 100644 index 0000000..5c931e5 --- /dev/null +++ b/src/assets/icons/svg/qing-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/qing-wanjian.svg b/src/assets/icons/svg/qing-wanjian.svg new file mode 100644 index 0000000..3f63689 --- /dev/null +++ b/src/assets/icons/svg/qing-wanjian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/rabbitmq.svg b/src/assets/icons/svg/rabbitmq.svg new file mode 100644 index 0000000..65aa198 --- /dev/null +++ b/src/assets/icons/svg/rabbitmq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/refresh.svg b/src/assets/icons/svg/refresh.svg new file mode 100644 index 0000000..1f549f1 --- /dev/null +++ b/src/assets/icons/svg/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/role.svg b/src/assets/icons/svg/role.svg new file mode 100644 index 0000000..c484b13 --- /dev/null +++ b/src/assets/icons/svg/role.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/security.svg b/src/assets/icons/svg/security.svg new file mode 100644 index 0000000..bcd9d2e --- /dev/null +++ b/src/assets/icons/svg/security.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/shachenbao-rijian.svg b/src/assets/icons/svg/shachenbao-rijian.svg new file mode 100644 index 0000000..8bb8f8b --- /dev/null +++ b/src/assets/icons/svg/shachenbao-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tedabaoyu.svg b/src/assets/icons/svg/tedabaoyu.svg new file mode 100644 index 0000000..212908e --- /dev/null +++ b/src/assets/icons/svg/tedabaoyu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/uv.svg b/src/assets/icons/svg/uv.svg new file mode 100644 index 0000000..ca4c301 --- /dev/null +++ b/src/assets/icons/svg/uv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/valid_code.svg b/src/assets/icons/svg/valid_code.svg new file mode 100644 index 0000000..39bf478 --- /dev/null +++ b/src/assets/icons/svg/valid_code.svg @@ -0,0 +1,9 @@ + + + + diff --git a/src/assets/icons/svg/verify_code.svg b/src/assets/icons/svg/verify_code.svg new file mode 100644 index 0000000..39bf478 --- /dev/null +++ b/src/assets/icons/svg/verify_code.svg @@ -0,0 +1,9 @@ + + + + diff --git a/src/assets/icons/svg/warning_lights.svg b/src/assets/icons/svg/warning_lights.svg new file mode 100644 index 0000000..e8fc9a7 --- /dev/null +++ b/src/assets/icons/svg/warning_lights.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/wu-rijian.svg b/src/assets/icons/svg/wu-rijian.svg new file mode 100644 index 0000000..2f930ee --- /dev/null +++ b/src/assets/icons/svg/wu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/xiaoxue-rijian.svg b/src/assets/icons/svg/xiaoxue-rijian.svg new file mode 100644 index 0000000..21e4e3c --- /dev/null +++ b/src/assets/icons/svg/xiaoxue-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/xiaoyu-rijian.svg b/src/assets/icons/svg/xiaoyu-rijian.svg new file mode 100644 index 0000000..36b9046 --- /dev/null +++ b/src/assets/icons/svg/xiaoyu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/yangsha-rijian.svg b/src/assets/icons/svg/yangsha-rijian.svg new file mode 100644 index 0000000..8723fa8 --- /dev/null +++ b/src/assets/icons/svg/yangsha-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/yin-rijian.svg b/src/assets/icons/svg/yin-rijian.svg new file mode 100644 index 0000000..0e2fa38 --- /dev/null +++ b/src/assets/icons/svg/yin-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/yujiaxue-rijian.svg b/src/assets/icons/svg/yujiaxue-rijian.svg new file mode 100644 index 0000000..12fb413 --- /dev/null +++ b/src/assets/icons/svg/yujiaxue-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zhenxue-rijian.svg b/src/assets/icons/svg/zhenxue-rijian.svg new file mode 100644 index 0000000..8495765 --- /dev/null +++ b/src/assets/icons/svg/zhenxue-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zhenxue-wanjian.svg b/src/assets/icons/svg/zhenxue-wanjian.svg new file mode 100644 index 0000000..000747d --- /dev/null +++ b/src/assets/icons/svg/zhenxue-wanjian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zhenyu-rijian.svg b/src/assets/icons/svg/zhenyu-rijian.svg new file mode 100644 index 0000000..07caf8e --- /dev/null +++ b/src/assets/icons/svg/zhenyu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zhenyu-wanjian.svg b/src/assets/icons/svg/zhenyu-wanjian.svg new file mode 100644 index 0000000..15c9622 --- /dev/null +++ b/src/assets/icons/svg/zhenyu-wanjian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zhongxue-rijian.svg b/src/assets/icons/svg/zhongxue-rijian.svg new file mode 100644 index 0000000..a3b882b --- /dev/null +++ b/src/assets/icons/svg/zhongxue-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zhongyu-rijian.svg b/src/assets/icons/svg/zhongyu-rijian.svg new file mode 100644 index 0000000..af8b553 --- /dev/null +++ b/src/assets/icons/svg/zhongyu-rijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/avatar.png b/src/assets/images/avatar.png new file mode 100644 index 0000000..592d266 Binary files /dev/null and b/src/assets/images/avatar.png differ diff --git a/src/assets/images/col_icon.png b/src/assets/images/col_icon.png new file mode 100644 index 0000000..78ee7a1 Binary files /dev/null and b/src/assets/images/col_icon.png differ diff --git a/src/assets/images/dataVisual/header_bg.png b/src/assets/images/dataVisual/header_bg.png new file mode 100644 index 0000000..42c7c13 Binary files /dev/null and b/src/assets/images/dataVisual/header_bg.png differ diff --git a/src/assets/images/dataVisual/icon_curve.svg b/src/assets/images/dataVisual/icon_curve.svg new file mode 100644 index 0000000..1f856af --- /dev/null +++ b/src/assets/images/dataVisual/icon_curve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/dataVisual/icon_list.svg b/src/assets/images/dataVisual/icon_list.svg new file mode 100644 index 0000000..18f0d95 --- /dev/null +++ b/src/assets/images/dataVisual/icon_list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/dataVisual/icon_search.svg b/src/assets/images/dataVisual/icon_search.svg new file mode 100644 index 0000000..a11b9a9 --- /dev/null +++ b/src/assets/images/dataVisual/icon_search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/dataVisual/title_bg.png b/src/assets/images/dataVisual/title_bg.png new file mode 100644 index 0000000..4c7f9ef Binary files /dev/null and b/src/assets/images/dataVisual/title_bg.png differ diff --git a/src/assets/images/dataVisual/title_bg_l.png b/src/assets/images/dataVisual/title_bg_l.png new file mode 100644 index 0000000..d7e751d Binary files /dev/null and b/src/assets/images/dataVisual/title_bg_l.png differ diff --git a/src/assets/images/data_c/background.png b/src/assets/images/data_c/background.png new file mode 100644 index 0000000..b8396ca Binary files /dev/null and b/src/assets/images/data_c/background.png differ diff --git a/src/assets/images/data_c/background_16.png b/src/assets/images/data_c/background_16.png new file mode 100644 index 0000000..20a63d6 Binary files /dev/null and b/src/assets/images/data_c/background_16.png differ diff --git a/src/assets/images/data_c/background_16_copy.png b/src/assets/images/data_c/background_16_copy.png new file mode 100644 index 0000000..1d89799 Binary files /dev/null and b/src/assets/images/data_c/background_16_copy.png differ diff --git a/src/assets/images/data_c/bg_block.png b/src/assets/images/data_c/bg_block.png new file mode 100644 index 0000000..cbefa49 Binary files /dev/null and b/src/assets/images/data_c/bg_block.png differ diff --git a/src/assets/images/data_c/bg_title.png b/src/assets/images/data_c/bg_title.png new file mode 100644 index 0000000..0bc4c17 Binary files /dev/null and b/src/assets/images/data_c/bg_title.png differ diff --git a/src/assets/images/data_c/content_bg_16.png b/src/assets/images/data_c/content_bg_16.png new file mode 100644 index 0000000..6d3dba6 Binary files /dev/null and b/src/assets/images/data_c/content_bg_16.png differ diff --git a/src/assets/images/data_c/header_bg_16.png b/src/assets/images/data_c/header_bg_16.png new file mode 100644 index 0000000..a8ee5a4 Binary files /dev/null and b/src/assets/images/data_c/header_bg_16.png differ diff --git a/src/assets/images/data_c/rendering.png b/src/assets/images/data_c/rendering.png new file mode 100644 index 0000000..5a71b99 Binary files /dev/null and b/src/assets/images/data_c/rendering.png differ diff --git a/src/assets/images/data_c/title_bg.png b/src/assets/images/data_c/title_bg.png new file mode 100644 index 0000000..465b5df Binary files /dev/null and b/src/assets/images/data_c/title_bg.png differ diff --git a/src/assets/images/data_c/title_bg_l.png b/src/assets/images/data_c/title_bg_l.png new file mode 100644 index 0000000..d3c8772 Binary files /dev/null and b/src/assets/images/data_c/title_bg_l.png differ diff --git a/src/assets/images/data_c/title_short.png b/src/assets/images/data_c/title_short.png new file mode 100644 index 0000000..43d15fb Binary files /dev/null and b/src/assets/images/data_c/title_short.png differ diff --git a/src/assets/images/device/liangfaliangqu.gif b/src/assets/images/device/liangfaliangqu.gif new file mode 100644 index 0000000..82f7746 Binary files /dev/null and b/src/assets/images/device/liangfaliangqu.gif differ diff --git a/src/assets/images/device/liangfaliangquyibeng.gif b/src/assets/images/device/liangfaliangquyibeng.gif new file mode 100644 index 0000000..664ffbf Binary files /dev/null and b/src/assets/images/device/liangfaliangquyibeng.gif differ diff --git a/src/assets/images/device/sanfasanqu.gif b/src/assets/images/device/sanfasanqu.gif new file mode 100644 index 0000000..73d4586 Binary files /dev/null and b/src/assets/images/device/sanfasanqu.gif differ diff --git a/src/assets/images/device/sanfasanquyibeng.gif b/src/assets/images/device/sanfasanquyibeng.gif new file mode 100644 index 0000000..46b18e4 Binary files /dev/null and b/src/assets/images/device/sanfasanquyibeng.gif differ diff --git a/src/assets/images/device/yifaliangqu.gif b/src/assets/images/device/yifaliangqu.gif new file mode 100644 index 0000000..328519b Binary files /dev/null and b/src/assets/images/device/yifaliangqu.gif differ diff --git a/src/assets/images/device/yifaliangquyibeng.gif b/src/assets/images/device/yifaliangquyibeng.gif new file mode 100644 index 0000000..89c263a Binary files /dev/null and b/src/assets/images/device/yifaliangquyibeng.gif differ diff --git a/src/assets/images/device/yifasanqu.gif b/src/assets/images/device/yifasanqu.gif new file mode 100644 index 0000000..1fb9251 Binary files /dev/null and b/src/assets/images/device/yifasanqu.gif differ diff --git a/src/assets/images/device/yifayiqu.gif b/src/assets/images/device/yifayiqu.gif new file mode 100644 index 0000000..9745ad2 Binary files /dev/null and b/src/assets/images/device/yifayiqu.gif differ diff --git a/src/assets/images/device/yifayiquyibeng.gif b/src/assets/images/device/yifayiquyibeng.gif new file mode 100644 index 0000000..22c1d9f Binary files /dev/null and b/src/assets/images/device/yifayiquyibeng.gif differ diff --git a/src/assets/images/device/yifaysanquyibeng.gif b/src/assets/images/device/yifaysanquyibeng.gif new file mode 100644 index 0000000..f2b8b71 Binary files /dev/null and b/src/assets/images/device/yifaysanquyibeng.gif differ diff --git a/src/assets/images/device01.gif b/src/assets/images/device01.gif new file mode 100644 index 0000000..22c1d9f Binary files /dev/null and b/src/assets/images/device01.gif differ diff --git a/src/assets/images/device02.gif b/src/assets/images/device02.gif new file mode 100644 index 0000000..89c263a Binary files /dev/null and b/src/assets/images/device02.gif differ diff --git a/src/assets/images/device03.gif b/src/assets/images/device03.gif new file mode 100644 index 0000000..1fb9251 Binary files /dev/null and b/src/assets/images/device03.gif differ diff --git a/src/assets/images/info_bg.png b/src/assets/images/info_bg.png new file mode 100644 index 0000000..8a27ead Binary files /dev/null and b/src/assets/images/info_bg.png differ diff --git a/src/assets/images/login-bg.mp4 b/src/assets/images/login-bg.mp4 new file mode 100644 index 0000000..ae43f45 Binary files /dev/null and b/src/assets/images/login-bg.mp4 differ diff --git a/src/assets/images/login-bg.png b/src/assets/images/login-bg.png new file mode 100644 index 0000000..187fdf2 Binary files /dev/null and b/src/assets/images/login-bg.png differ diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 0000000..33039f2 Binary files /dev/null and b/src/assets/images/logo.png differ diff --git a/src/assets/images/menu_bg.png b/src/assets/images/menu_bg.png new file mode 100644 index 0000000..f783fcb Binary files /dev/null and b/src/assets/images/menu_bg.png differ diff --git a/src/assets/images/panelBtn_bg.png b/src/assets/images/panelBtn_bg.png new file mode 100644 index 0000000..13ebed1 Binary files /dev/null and b/src/assets/images/panelBtn_bg.png differ diff --git a/src/assets/images/panel_icon.png b/src/assets/images/panel_icon.png new file mode 100644 index 0000000..96c6750 Binary files /dev/null and b/src/assets/images/panel_icon.png differ diff --git a/src/assets/images/screen.png b/src/assets/images/screen.png new file mode 100644 index 0000000..819c22e Binary files /dev/null and b/src/assets/images/screen.png differ diff --git a/src/assets/images/taps.png b/src/assets/images/taps.png new file mode 100644 index 0000000..3e04ada Binary files /dev/null and b/src/assets/images/taps.png differ diff --git a/src/assets/images/title-bg.png b/src/assets/images/title-bg.png new file mode 100644 index 0000000..adf7875 Binary files /dev/null and b/src/assets/images/title-bg.png differ diff --git a/src/assets/images/waring_bg.png b/src/assets/images/waring_bg.png new file mode 100644 index 0000000..73560b3 Binary files /dev/null and b/src/assets/images/waring_bg.png differ diff --git a/src/assets/images/weather/duoyun.png b/src/assets/images/weather/duoyun.png new file mode 100644 index 0000000..079d1e3 Binary files /dev/null and b/src/assets/images/weather/duoyun.png differ diff --git a/src/assets/media/alarm.mp3 b/src/assets/media/alarm.mp3 new file mode 100644 index 0000000..ef00043 Binary files /dev/null and b/src/assets/media/alarm.mp3 differ diff --git a/src/assets/media/alarm1.mp3 b/src/assets/media/alarm1.mp3 new file mode 100644 index 0000000..cbc41a1 Binary files /dev/null and b/src/assets/media/alarm1.mp3 differ diff --git a/src/assets/media/alarm2.mp3 b/src/assets/media/alarm2.mp3 new file mode 100644 index 0000000..c81fcc6 Binary files /dev/null and b/src/assets/media/alarm2.mp3 differ diff --git a/src/main.js b/src/main.js index a9b6818..977bb00 100644 --- a/src/main.js +++ b/src/main.js @@ -1,102 +1,112 @@ -import { createApp } from 'vue' +import { createApp } from "vue"; -import Cookies from 'js-cookie' +import Cookies from "js-cookie"; -import ElementPlus from 'element-plus' -import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言 +import ElementPlus from "element-plus"; +import locale from "element-plus/lib/locale/lang/zh-cn"; // 中文语言 import { useTable } from "./plugins/vxe-table"; -import '@/assets/styles/index.scss' // global css +import "@/assets/styles/index.scss"; // global css import "vxe-table/lib/style.css"; -import App from './App' -import store from './store' -import router from './router' -import directive from './directive' // directive - +import App from "./App"; +import store from "./store"; +import router from "./router"; +import directive from "./directive"; // directive // 注册指令 -import plugins from './plugins' // plugins -import { download,newDownload } from '@/utils/request' +import plugins from "./plugins"; // plugins +import { download, newDownload } from "@/utils/request"; // svg图标 -import 'virtual:svg-icons-register' -import SvgIcon from '@/components/SvgIcon' -import elementIcons from '@/components/SvgIcon/svgicon' +import "virtual:svg-icons-register"; +import SvgIcon from "@/components/SvgIcon"; +import elementIcons from "@/components/SvgIcon/svgicon"; + +import DataVVue3 from "@kjgl77/datav-vue3"; -import DataVVue3 from '@kjgl77/datav-vue3' +import "./utils/rem"; //引入px和rem适配方案 +import "./permission"; // permission control -import './permission' // permission control +import "@/styles/index.scss"; +import "@/assets/iconfont/iconfont.css"; +import "animate.css/animate.min.css"; -import { useDict } from '@/utils/dict' -import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi' +import { useDict } from "@/utils/dict"; +import { + parseTime, + resetForm, + addDateRange, + handleTree, + selectDictLabel, + selectDictLabels, +} from "@/utils/ruoyi"; // 分页组件 -import Pagination from '@/components/Pagination' +import Pagination from "@/components/Pagination"; // 自定义表格工具组件 -import RightToolbar from '@/components/RightToolbar' +import RightToolbar from "@/components/RightToolbar"; // 文件上传组件 -import FileUpload from "@/components/FileUpload" +import FileUpload from "@/components/FileUpload"; // 图片上传组件 -import ImageUpload from "@/components/ImageUpload" +import ImageUpload from "@/components/ImageUpload"; // 图片预览组件 -import ImagePreview from "@/components/ImagePreview" +import ImagePreview from "@/components/ImagePreview"; // 自定义树选择组件 -import TreeSelect from '@/components/TreeSelect' +import TreeSelect from "@/components/TreeSelect"; // 字典标签组件 -import DictTag from '@/components/DictTag' +import DictTag from "@/components/DictTag"; // Vue3表单组件 -import VForm3 from '@/components/vform/designer.umd.js' -import '@/components/vform/designer.style.css' +import VForm3 from "@/components/vform/designer.umd.js"; +import "@/components/vform/designer.style.css"; // 引入百度地图 -import BaiduMap from 'vue-baidu-map-3x' +import BaiduMap from "vue-baidu-map-3x"; -const app = createApp(App) -app.config.warnHandler = () => null +const app = createApp(App); +app.config.warnHandler = () => null; // 全局方法挂载 -app.config.globalProperties.useDict = useDict -app.config.globalProperties.download = download -app.config.globalProperties.newDownload = newDownload -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.config.globalProperties.useDict = useDict; +app.config.globalProperties.download = download; +app.config.globalProperties.newDownload = newDownload; +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.use(router) -app.use(store) -app.use(plugins) -app.use(elementIcons) +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.use(router); +app.use(store); +app.use(plugins); +app.use(elementIcons); // 全局注册VForm3,同时注册了v-form-designer、v-form-render等组件 -app.use(VForm3) -app.component('svg-icon', SvgIcon) -app.use(DataVVue3) +app.use(VForm3); +app.component("svg-icon", SvgIcon); +app.use(DataVVue3); app.use(BaiduMap, { // ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ - ak: 'RLTSC51O7n2UPbwGbXKu2hZK', + ak: "RLTSC51O7n2UPbwGbXKu2hZK", // v:'2.0', // 默认使用3.0 // type: 'WebGL' // ||API 默认API (使用此模式 BMap=BMapGL) -}) +}); -directive(app) +directive(app); // 使用element-plus 并且设置全局的大小 app.use(ElementPlus, { locale: locale, // 支持 large、default、small - size: Cookies.get('size') || 'default' -}) - + size: Cookies.get("size") || "default", +}); app.use(useTable); -app.mount('#app') +app.mount("#app"); diff --git a/src/router/index.js b/src/router/index.js index f6da8b3..26a57db 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,6 +1,6 @@ -import { createWebHistory, createRouter } from 'vue-router' +import { createWebHistory, createRouter } from "vue-router"; /* Layout */ -import Layout from '@/layout' +import Layout from "@/layout"; /** * Note: 路由配置项 @@ -27,230 +27,235 @@ import Layout from '@/layout' // 公共路由 export const constantRoutes = [ { - path: '/redirect', + path: "/redirect", component: Layout, hidden: true, children: [ { - path: '/redirect/:path(.*)', - component: () => import('@/views/redirect/index.vue') - } - ] + path: "/redirect/:path(.*)", + component: () => import("@/views/redirect/index.vue"), + }, + ], }, { - path: '/login', - component: () => import('@/views/login'), - hidden: true + path: "/login", + component: () => import("@/views/login"), + hidden: true, }, { - path: '/register', - component: () => import('@/views/register'), - hidden: true + path: "/register", + component: () => import("@/views/register"), + hidden: true, + }, + { + path: "/monitoring/station", + component: () => import("@/views/monitoring/station/index"), + hidden: true, }, { - path: '/index1', - component: () => import('@/views/index1'), - hidden: true + path: "/index1", + component: () => import("@/views/index1"), + hidden: true, }, { path: "/:pathMatch(.*)*", - component: () => import('@/views/error/404'), - hidden: true + component: () => import("@/views/error/404"), + hidden: true, }, { - path: '/401', - component: () => import('@/views/error/401'), - hidden: true + path: "/401", + component: () => import("@/views/error/401"), + hidden: true, }, { - path: '', + path: "", component: Layout, - redirect: '/index', + redirect: "/index", children: [ { - path: '/index', - component: () => import('@/views/index'), - name: 'Index', - meta: { title: '首页', icon: 'dashboard', affix: true } - } - ] + path: "/index", + component: () => import("@/views/index"), + name: "Index", + meta: { title: "首页", icon: "dashboard", affix: true }, + }, + ], }, { - path: '/user', + path: "/user", component: Layout, hidden: true, - redirect: 'noredirect', + redirect: "noredirect", children: [ { - path: 'profile', - component: () => import('@/views/system/user/profile/index'), - name: 'Profile', - meta: { title: '个人中心', icon: 'user' } - } - ] + path: "profile", + component: () => import("@/views/system/user/profile/index"), + name: "Profile", + meta: { title: "个人中心", icon: "user" }, + }, + ], }, { - path: '/flowable', + path: "/flowable", component: Layout, hidden: true, children: [ { - path: 'definition/model', - component: () => import('@/views/flowable/definition/model'), - name: 'FlowModel', - meta: { title: '流程设计', icon: '' } - } - ] + path: "definition/model", + component: () => import("@/views/flowable/definition/model"), + name: "FlowModel", + meta: { title: "流程设计", icon: "" }, + }, + ], }, { - path: '/flowable', + path: "/flowable", component: Layout, hidden: true, children: [ { - path: 'task/finished/detail/index', - component: () => import('@/views/flowable/task/finished/detail/index'), - name: 'FinishedDetail', - meta: { title: '已办任务', icon: '' } - } - ] + path: "task/finished/detail/index", + component: () => import("@/views/flowable/task/finished/detail/index"), + name: "FinishedDetail", + meta: { title: "已办任务", icon: "" }, + }, + ], }, { - path: '/flowable', + path: "/flowable", component: Layout, hidden: true, children: [ { - path: 'task/myProcess/detail/index', - component: () => import('@/views/flowable/task/myProcess/detail/index'), - name: 'ProcessDetail', - meta: { title: '已发任务', icon: '' } - } - ] + path: "task/myProcess/detail/index", + component: () => import("@/views/flowable/task/myProcess/detail/index"), + name: "ProcessDetail", + meta: { title: "已发任务", icon: "" }, + }, + ], }, { - path: '/flowable', + path: "/flowable", component: Layout, hidden: true, children: [ { - path: 'task/myProcess/send/index', - component: () => import('@/views/flowable/task/myProcess/send/index'), - name: 'ProcessSend', - meta: { title: '流程发起', icon: '' } - } - ] + path: "task/myProcess/send/index", + component: () => import("@/views/flowable/task/myProcess/send/index"), + name: "ProcessSend", + meta: { title: "流程发起", icon: "" }, + }, + ], }, { - path: '/flowable', + path: "/flowable", component: Layout, hidden: true, children: [ { - path: 'task/todo/detail/index', - component: () => import('@/views/flowable/task/todo/detail/index'), - name: 'TodoDetail', - meta: { title: '流程处理', icon: '' } - } - ] + path: "task/todo/detail/index", + component: () => import("@/views/flowable/task/todo/detail/index"), + name: "TodoDetail", + meta: { title: "流程处理", icon: "" }, + }, + ], }, { - path: '/flowable', + path: "/flowable", component: Layout, hidden: true, children: [ { - path: 'task/flowForm/index', - component: () => import('@/views/flowable/task/flowForm/index'), - name: 'FlowForm', - meta: { title: '流程表单', icon: '' } - } - ] + path: "task/flowForm/index", + component: () => import("@/views/flowable/task/flowForm/index"), + name: "FlowForm", + meta: { title: "流程表单", icon: "" }, + }, + ], }, -] +]; // 动态路由,基于用户权限动态去加载 export const dynamicRoutes = [ { - path: '/system/user-auth', + path: "/system/user-auth", component: Layout, hidden: true, - permissions: ['system:user:edit'], + permissions: ["system:user:edit"], children: [ { - path: 'role/:userId(\\d+)', - component: () => import('@/views/system/user/authRole'), - name: 'AuthRole', - meta: { title: '分配角色', activeMenu: '/system/user' } - } - ] + path: "role/:userId(\\d+)", + component: () => import("@/views/system/user/authRole"), + name: "AuthRole", + meta: { title: "分配角色", activeMenu: "/system/user" }, + }, + ], }, { - path: '/system/role-auth', + path: "/system/role-auth", component: Layout, hidden: true, - permissions: ['system:role:edit'], + permissions: ["system:role:edit"], children: [ { - path: 'user/:roleId(\\d+)', - component: () => import('@/views/system/role/authUser'), - name: 'AuthUser', - meta: { title: '分配用户', activeMenu: '/system/role' } - } - ] + path: "user/:roleId(\\d+)", + component: () => import("@/views/system/role/authUser"), + name: "AuthUser", + meta: { title: "分配用户", activeMenu: "/system/role" }, + }, + ], }, { - path: '/system/dict-data', + path: "/system/dict-data", component: Layout, hidden: true, - permissions: ['system:dict:list'], + permissions: ["system:dict:list"], children: [ { - path: 'index/:dictId(\\d+)', - component: () => import('@/views/system/dict/data'), - name: 'Data', - meta: { title: '字典数据', activeMenu: '/system/dict' } - } - ] + path: "index/:dictId(\\d+)", + component: () => import("@/views/system/dict/data"), + name: "Data", + meta: { title: "字典数据", activeMenu: "/system/dict" }, + }, + ], }, { - path: '/monitor/job-log', + path: "/monitor/job-log", component: Layout, hidden: true, - permissions: ['monitor:job:list'], + permissions: ["monitor:job:list"], children: [ { - path: 'index/:jobId(\\d+)', - component: () => import('@/views/monitor/job/log'), - name: 'JobLog', - meta: { title: '调度日志', activeMenu: '/monitor/job' } - } - ] + path: "index/:jobId(\\d+)", + component: () => import("@/views/monitor/job/log"), + name: "JobLog", + meta: { title: "调度日志", activeMenu: "/monitor/job" }, + }, + ], }, { - path: '/tool/gen-edit', + path: "/tool/gen-edit", component: Layout, hidden: true, - permissions: ['tool:gen:edit'], + permissions: ["tool:gen:edit"], children: [ { - path: 'index/:tableId(\\d+)', - component: () => import('@/views/tool/gen/editTable'), - name: 'GenEdit', - meta: { title: '修改生成配置', activeMenu: '/tool/gen' } - } - ] - } -] + path: "index/:tableId(\\d+)", + component: () => import("@/views/tool/gen/editTable"), + name: "GenEdit", + meta: { title: "修改生成配置", activeMenu: "/tool/gen" }, + }, + ], + }, +]; const router = createRouter({ history: createWebHistory(), routes: constantRoutes, scrollBehavior(to, from, savedPosition) { if (savedPosition) { - return savedPosition + return savedPosition; } else { - return { top: 0 } + return { top: 0 }; } }, }); diff --git a/src/store/modules/date.js b/src/store/modules/date.js new file mode 100644 index 0000000..aeb8cdc --- /dev/null +++ b/src/store/modules/date.js @@ -0,0 +1,38 @@ +const useCounter = defineStore("date", { + /** + * 存储全局状态 + */ + state: () => ({ + deptIdStr: "", + dateStr: "", + noticeStr: {}, + orgStr: { + title: "", + assetCode: "", + }, + }), + + /** + * 用来封装计算属性 有缓存功能 类似于computed + */ + getters: {}, + + /** + * 编辑业务逻辑 类似于methods + */ + actions: { + deptStore(val) { + this.deptIdStr = val; + }, + dateStore(val) { + this.dateStr = val; + }, + noticeStore(val) { + this.noticeStr = val; + }, + orgStore(val) { + this.orgStr = val; + }, + }, +}); +export default useCounter; diff --git a/src/store/modules/table.js b/src/store/modules/table.js new file mode 100644 index 0000000..cc43f44 --- /dev/null +++ b/src/store/modules/table.js @@ -0,0 +1,31 @@ +const useTableStore = defineStore("table", { + /** + * 存储全局状态 + */ + state: () => ({ + tableMenuStory: [], + tableDataStore: [], + tableNewDataStore: [], + }), + + /** + * 用来封装计算属性 有缓存功能 类似于computed + */ + getters: {}, + + /** + * 编辑业务逻辑 类似于methods + */ + actions: { + tableMenuAction(val) { + this.tableMenuStory = val; + }, + tableDataAction(val) { + this.tableDataStore = val; + }, + tableNewDataAction(val) { + this.tableNewDataStore = val; + }, + }, +}); +export default useTableStore; diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 6d8c05f..c9719bb 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,70 +1,78 @@ -import { login, logout, getInfo } from '@/api/login' -import { getToken, setToken, removeToken } from '@/utils/auth' -import defAva from '@/assets/images/profile.jpg' +import { login, logout, getInfo } from "@/api/login"; +import { getToken, setToken, removeToken } from "@/utils/auth"; +import defAva from "@/assets/images/avatar.png"; -const useUserStore = defineStore( - 'user', - { - state: () => ({ - token: getToken(), - 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.token) - this.token = res.token - resolve() - }).catch(error => { - reject(error) +const useUserStore = defineStore("user", { + state: () => ({ + token: getToken(), + 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.token); + this.token = res.token; + resolve(); }) - }) - }, - // 获取用户信息 - getInfo() { - return new Promise((resolve, reject) => { - getInfo().then(res => { - const user = res.user - const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar; + .catch((error) => { + reject(error); + }); + }); + }, + // 获取用户信息 + getInfo() { + return new Promise((resolve, reject) => { + getInfo() + .then((res) => { + const user = res.user; + const avatar = + user.avatar == "" || user.avatar == null + ? defAva + : import.meta.env.VITE_APP_BASE_API + user.avatar; - if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 - this.roles = res.roles - this.permissions = res.permissions + if (res.roles && res.roles.length > 0) { + // 验证返回的roles是否是一个非空数组 + this.roles = res.roles; + this.permissions = res.permissions; } else { - this.roles = ['ROLE_DEFAULT'] + this.roles = ["ROLE_DEFAULT"]; } - this.name = user.userName + this.name = user.userName; this.avatar = avatar; - resolve(res) - }).catch(error => { - reject(error) + resolve(res); }) - }) - }, - // 退出系统 - logOut() { - return new Promise((resolve, reject) => { - logout(this.token).then(() => { - this.token = '' - this.roles = [] - this.permissions = [] - removeToken() - resolve() - }).catch(error => { - reject(error) + .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 +export default useUserStore; diff --git a/src/styles/dark.scss b/src/styles/dark.scss new file mode 100644 index 0000000..d198335 --- /dev/null +++ b/src/styles/dark.scss @@ -0,0 +1,26 @@ +html.dark{ + --menuBg:var(--el-bg-color-overlay); + --menuText:#fff; + --menuActiveText:var(--el-menu-active-color); + --menuActiveBg:var(--el-bg-color-overlay); + --menuHover:rgba(0,0,0,.2); + + --subMenuBg: var(--el-menu-bg-color); + --subMenuActiveText:var(--el-menu-active-color); + --subMenuHover: rgba(0,0,0,.2); + + --tableBg:#1d1e1f; + + + .navbar { + background-color: var(--el-bg-color); + color: var(--el-text-color-regular); + } + + .right-panel-btn{ + background-color: var(--el-color-primary-dark); + } + .svg-icon,svg{ + fill: var(--el-text-color-regular); + } +} diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 0000000..354571c --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,228 @@ +@import "./style.scss"; + +.app-container { + padding: 20px; + + .search { + padding: 18px 0 0 10px; + margin-bottom: 10px; + border-radius: 4px; + border: 1px solid var(--el-border-color-light); + box-shadow: var(--el-box-shadow-light); + background-color: var(--el-bg-color-overlay); + } +} + +.n-drawer-container { + .waringDrawer { + // color: #fff; + // background: #0f2856; + // backdrop-filter: blur(10px); + overflow: hidden; + + .n-drawer-header { + // color: #fff; + // border-bottom: 1px solid #1a3960; + + .n-drawer-header__main { + flex: 1; + + .title { + display: flex; + justify-content: space-between; + align-items: center; + cursor: pointer; + + .button { + font-size: 14px; + // color: #b1e3ff; + padding-right: 20px; + } + } + } + + .n-base-close { + color: #fff; + } + } + + .waringList { + padding: 10px; + // background: #08173e; + + .item { + padding-bottom: 10px; + // border-bottom: 1px solid #1a3960; + margin-bottom: 10px; + + .name { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; + .title { + display: flex; + align-items: center; + .svg-icon { + width: 16px !important; + height: 16px !important; + margin-right: 5px; + } + } + + span { + font-size: 16px; + } + + span.time { + font-size: 14px; + // color: #b1e3ff; + } + } + + .info { + display: flex; + justify-content: space-between; + align-items: center; + + // span { + // color: #b1e3ff; + // } + + // .n-button { + // background-color: #022a5a !important; + // border: 1px solid #114073; + // } + } + } + + .item:last-child { + border-bottom: none; + margin-bottom: 0; + } + } + } +} + +.n-modal-container { + .waringModal { + width: 70%; + height: 500px; + background: url(@/assets/images/waring_bg.png) no-repeat; + background-size: 100% 100%; + + .n-card__content { + position: relative; + padding-top: 0; + padding: 80px; + + .waringTable { + --el-table-border-color: none; + background-color: transparent; + border: 1px solid #053872; + + .el-table__inner-wrapper::before { + content: none; + } + + .headerRowClass { + .headerCellClass { + color: #fff; + background-color: #001d40; + border-bottom: none; + } + } + + .rowClass { + background-color: transparent; + + .cellClass { + color: #b1e3ff; + border-bottom: none; + background-color: #01153a; + + .confirm { + background-color: #022a5a !important; + border: 1px solid #114073; + margin-left: 10px; + } + } + } + + .rowClass.el-table__row--striped { + .cellClass { + background-color: #001d40; + } + } + } + + .warClose { + width: 50px; + cursor: pointer; + color: #b1e3ff; + margin: 100px auto 0 auto; + } + } + } +} + +.n-modal-container { + .modalClass { + .n-card-header { + padding: 1.5rem; + } + .n-card__content { + padding: 0 1.5rem; + } + .n-card__footer { + text-align: right; + padding: 1.5rem; + button { + margin-left: 2rem; + } + } + } +} + +.el-overlay { + z-index: 99999 !important; +} + +.el-notification { + border: none !important; + background-color: #0f2856 !important; + .el-notification__content { + color: #eee !important; + } +} +.el-notification.notice { + border: none !important; + background-color: #fff !important; + .el-notification__content { + color: #000 !important; + } +} + +.menuPopover { + border-radius: 10px !important; + background: rgba(255, 255, 255, 0) !important; + backdrop-filter: blur(10px) !important; + border: 2px solid rgba(255, 255, 255, 0.1) !important; + box-shadow: 0 0 80px rgba(0, 0, 0, 0.25) !important; + --el-bg-color-overlay: transparent !important; + --el-border-color-light: #535352 !important; + .menuList { + .el-tree { + background: transparent !important; + --el-tree-node-hover-bg-color: transparent !important; + --el-color-primary-light-9: transparent !important; + --el-tree-text-color: #fff; + --el-tree-expand-icon-color: #fff; + } + .el-tree--highlight-current + .el-tree-node.is-current + > .el-tree-node__content { + color: #b7cffc; + } + } +} diff --git a/src/styles/reset.scss b/src/styles/reset.scss new file mode 100644 index 0000000..cd586c3 --- /dev/null +++ b/src/styles/reset.scss @@ -0,0 +1,81 @@ +*, +::before, +::after { + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: currentColor; +} + +#app { + width: 100%; + height: 100%; +} + +html { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + -moz-tab-size: 4; + tab-size: 4; + width: 100%; + height: 100%; + box-sizing: border-box; +} + +body { + margin: 0; + line-height: inherit; + width: 100%; + height: 100%; + -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; +} + + +a { + color: inherit; + text-decoration: inherit; +} + + +img, +svg + { + display: inline-block; +} +svg { + vertical-align: -0.15em; //因icon大小被设置为和字体大小一致,而span等标签的下边缘会和字体的基线对齐,故需设置一个往下的偏移比例,来纠正视觉上的未对齐效果 +} + + +ul,li{ + margin: 0; + padding: 0; + list-style: none; +} + + +*, +*::before, +*::after { + box-sizing: inherit; +} + +a:focus, +a:active , +div:focus +{ + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss new file mode 100644 index 0000000..ff01684 --- /dev/null +++ b/src/styles/sidebar.scss @@ -0,0 +1,227 @@ +#app { + .mainContainer { + min-height: 100%; + transition: margin-left 0.28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebarContainer { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + box-shadow: 2px 0 8px #1d23290d; + height: 100%; + position: fixed; + 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%; + } + + &.sidebarLogo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + + .svg-icon { + display: inline-flex; + margin-right: 16px; + } + + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + + .menuItem { + .el-menu-item,.el-sub-menu__title { + display: grid; + grid-template-columns: auto 1fr auto; + align-items: center; + + span { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + } + } + } + + // menu hover + .el-sub-menu__title { + &:hover { + background-color: $menuHover !important; + } + } + + .is-active>.el-sub-menu__title { + color: $subMenuActiveText !important; + } + + & .nest-menu .el-sub-menu>.el-sub-menu__title, + & .el-sub-menu .el-menu-item { + min-width: $sideBarWidth !important; + // background-color: $subMenuBg !important; + + &:hover { + background-color: $subMenuHover !important; + } + } + + .el-menu-item.is-active,.el-sub-menu .el-menu-item.is-active { + background-color: $menuActiveBg !important; + } + } + + .hideSidebar { + .sidebarContainer { + width: 54px !important; + + .svg-icon { + margin-right: 0px; + } + } + + .mainContainer { + margin-left: 54px; + } + + .el-sub-menu { + overflow: hidden; + + &>.el-sub-menu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + + .el-sub-menu__icon-arrow { + display: none; + } + } + } + + .el-menu--collapse { + .el-sub-menu { + &>.el-sub-menu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-sub-menu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .mainContainer { + margin-left: 0px; + } + + .sidebarContainer { + transition: transform 0.28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebarContainer { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + + .mainContainer, + .sidebarContainer { + // transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + } + + .nest-menu .el-sub-menu>.el-sub-menu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu 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/styles/style.scss b/src/styles/style.scss new file mode 100644 index 0000000..8155852 --- /dev/null +++ b/src/styles/style.scss @@ -0,0 +1,31 @@ +.flex { + display: flex; +} +.justify-center { + justify-content: center; +} +.justify-between { + justify-content: space-between; +} +.items-center { + align-items: center; +} +.items-end{ + align-items: flex-end; +} +.column { + flex-direction: column; +} +.flex-1 { + flex: 1 1 0%; +} + +.text-center { + text-align: center; +} +.width-100 { + width: 100%; +} +.height-100 { + height: 100%; +} diff --git a/src/styles/variables.module.scss b/src/styles/variables.module.scss new file mode 100644 index 0000000..2aae6fd --- /dev/null +++ b/src/styles/variables.module.scss @@ -0,0 +1,7 @@ +// 导出 variables.module.scss 变量提供给TypeScript使用 +:export { + menuBg: $menuBg; + menuText: $menuText; + menuActiveText: $menuActiveText; + menuActiveBg: $menuActiveBg +} \ No newline at end of file diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000..1f59629 --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,38 @@ +// 全局SCSS变量 + +:root{ + --menuBg:#ffffff; + --menuText:#333639; + --menuActiveText:#409eff; + --menuActiveBg:#eff0ff; + --menuHover:#d9d9d9; + + --subMenuBg: #ffffff; + --subMenuActiveText: #409eff; + --subMenuHover: #d9d9d9; + + --menuDarkBg:#304156; + --menuDarkText:#bfcbd9; + --menuDarkActiveText:#409eff; + --menuDarkActiveBg:rgba(0, 0, 0, 0.12); + --menuDarkHover:#263445; + + --subMenuDarkBg: #1f2d3d; + --subMenuDarkActiveText: #f4f4f5; + --subMenuDarkHover: #001528; + + --tableBg:#020B3E; +} + + +$menuBg: var(--menuBg); +$menuText: var(--menuText); +$menuActiveText: var(--menuActiveText); +$menuActiveBg: var(--menuActiveBg); +$menuHover: var(--menuHover); + +$subMenuBg:var(--subMenuBg); +$subMenuActiveText:var(--subMenuActiveText); +$subMenuHover:var(--subMenuHover); + +$sideBarWidth: 210px; diff --git a/src/styles/variablesDark.scss b/src/styles/variablesDark.scss new file mode 100644 index 0000000..b1f2d9d --- /dev/null +++ b/src/styles/variablesDark.scss @@ -0,0 +1,28 @@ +// 侧边栏深色主题变量 + +.layoutContainer { + .sidebarDark { + --menuBg: var(--menuDarkBg); + --menuText: var(--menuDarkText); + --menuActiveText: var(--menuDarkActiveText); + --menuActiveBg: var(--menuDarkActiveBg); + --menuHover: var(--menuDarkHover); + + --subMenuBg: var(--subMenuDarkBg); + --subMenuActiveText: var(--subMenuDarkActiveText); + --subMenuHover: var(--subMenuDarkHover); + } +} +.dark { + .sidebarDark { + --menuBg: var(--el-bg-color-overlay); + --menuText: #fff; + --menuActiveText: var(--el-menu-active-color); + --menuActiveBg: var(--el-bg-color-overlay); + --menuHover: rgba(0, 0, 0, 0.2); + + --subMenuBg: var(--el-menu-bg-color); + --subMenuActiveText: var(--el-menu-active-color); + --subMenuHover: rgba(0, 0, 0, 0.2); + } +} diff --git a/src/utils/countTo.ts b/src/utils/countTo.ts new file mode 100644 index 0000000..f0a07f4 --- /dev/null +++ b/src/utils/countTo.ts @@ -0,0 +1,192 @@ +import { defineComponent, reactive, computed, onMounted, watch, onUnmounted } from 'vue'; +const props = { + start: { + type: Number, + required: false, + default: 0 + }, + end: { + type: Number, + required: false, + default: 0 + }, + duration: { + type: Number, + required: false, + default: 5000 + }, + autoPlay: { + type: Boolean, + required: false, + default: true + }, + decimals: { + type: Number, + required: false, + default: 0, + validator(value: any) { + return value >= 0; + } + }, + decimal: { + //十进制 + type: String, + required: false, + default: '.' + }, + separator: { + //分割器 + type: String, + required: false, + default: ',' + }, + prefix: { + //前缀 + type: String, + required: false, + default: '' + }, + suffix: { + //后缀 + type: String, + required: false, + default: '' + }, + useEasing: { + //使用缓和 + type: Boolean, + required: false, + default: true + }, + easingFn: { + type: Function, + default(t: any, b: any, c: any, d: any) { + return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b; + } + } +}; +export default defineComponent({ + name: 'CountTo', + props: props, + emits: ['onMountedcallback', 'callback'], + setup(props, { emit }) { + const isNumber = (val: any) => { + return !isNaN(parseFloat(val)); + }; + // 格式化数据,返回想要展示的数据格式 + const formatNumber = (val: any) => { + val = val.toFixed(props.decimals); + val += ''; + const x = val.split('.'); + let x1 = x[0]; + const x2 = x.length > 1 ? props.decimal + x[1] : ''; + const rgx = /(\d+)(\d{3})/; + if (props.separator && !isNumber(props.separator)) { + while (rgx.test(x1)) { + x1 = x1.replace(rgx, '$1' + props.separator + '$2'); + } + } + return props.prefix + x1 + x2 + props.suffix; + }; + const state = reactive<{ + localStart: number; + displayValue: number | string; + printVal: any; + paused: boolean; + localDuration: any; + startTime: any; + timestamp: any; + remaining: any; + rAF: any; + }>({ + localStart: props.start, + displayValue: formatNumber(props.start), + printVal: null, + paused: false, + localDuration: props.duration, + startTime: null, + timestamp: null, + remaining: null, + rAF: null + }); + // 定义一个计算属性,当开始数字大于结束数字时返回true + const stopCount = computed(() => { + return props.start > props.end; + }); + const startCount = () => { + state.localStart = props.start; + state.startTime = null; + state.localDuration = props.duration; + state.paused = false; + state.rAF = requestAnimationFrame(count); + }; + + watch( + () => props.start, + () => { + if (props.autoPlay) { + startCount(); + } + } + ); + + watch( + () => props.end, + () => { + if (props.autoPlay) { + startCount(); + } + } + ); + // dom挂在完成后执行一些操作 + onMounted(() => { + if (props.autoPlay) { + startCount(); + } + emit('onMountedcallback'); + }); + const count = (timestamp: any) => { + if (!state.startTime) state.startTime = timestamp; + state.timestamp = timestamp; + const progress = timestamp - state.startTime; + state.remaining = state.localDuration - progress; + // 是否使用速度变化曲线 + if (props.useEasing) { + if (stopCount.value) { + state.printVal = + state.localStart - props.easingFn(progress, 0, state.localStart - props.end, state.localDuration); + } else { + state.printVal = props.easingFn( + progress, + state.localStart, + props.end - state.localStart, + state.localDuration + ); + } + } else { + if (stopCount.value) { + state.printVal = state.localStart - (state.localStart - props.end) * (progress / state.localDuration); + } else { + state.printVal = state.localStart + (props.end - state.localStart) * (progress / state.localDuration); + } + } + if (stopCount.value) { + state.printVal = state.printVal < props.end ? props.end : state.printVal; + } else { + state.printVal = state.printVal > props.end ? props.end : state.printVal; + } + + state.displayValue = formatNumber(state.printVal); + if (progress < state.localDuration) { + state.rAF = requestAnimationFrame(count); + } else { + emit('callback'); + } + }; + // 组件销毁时取消动画 + onUnmounted(() => { + cancelAnimationFrame(state.rAF); + }); + return () => state.displayValue; + } +}); diff --git a/src/utils/crypto.js b/src/utils/crypto.js new file mode 100644 index 0000000..04bd9b3 --- /dev/null +++ b/src/utils/crypto.js @@ -0,0 +1,20 @@ +import CryptoJS from 'crypto-js'; + +const key = CryptoJS.enc.Utf8.parse('1C1389D55E4522B2'); //十六位十六进制数作为密钥 +const iv = CryptoJS.enc.Utf8.parse('1C1389E43F01C1B2'); //十六位十六进制数作为密钥偏移量 + +//解密方法 +export function decryption(word) { + let encryptedHexStr = CryptoJS.enc.Hex.parse(word); + let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); + let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); + let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); + return decryptedStr.toString(); +} + +//加密方法 +export function encryption(word) { + let srcs = CryptoJS.enc.Utf8.parse(word); + let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); + return encrypted.ciphertext.toString().toUpperCase(); +} diff --git a/src/utils/index.js b/src/utils/index.js index 4e65504..544403d 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -1,18 +1,25 @@ -import { parseTime } from './ruoyi' +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 + 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 + ); } /** @@ -21,40 +28,40 @@ export function formatDate(cellValue) { * @returns {string} */ export function formatTime(time, option) { - if (('' + time).length === 10) { - time = parseInt(time) * 1000 + if (("" + time).length === 10) { + time = parseInt(time) * 1000; } else { - time = +time + time = +time; } - const d = new Date(time) - const now = Date.now() + const d = new Date(time); + const now = Date.now(); - const diff = (now - d) / 1000 + const diff = (now - d) / 1000; if (diff < 30) { - return '刚刚' + return "刚刚"; } else if (diff < 3600) { // less 1 hour - return Math.ceil(diff / 60) + '分钟前' + return Math.ceil(diff / 60) + "分钟前"; } else if (diff < 3600 * 24) { - return Math.ceil(diff / 3600) + '小时前' + return Math.ceil(diff / 3600) + "小时前"; } else if (diff < 3600 * 24 * 2) { - return '1天前' + return "1天前"; } if (option) { - return parseTime(time, option) + return parseTime(time, option); } else { return ( d.getMonth() + 1 + - '月' + + "月" + d.getDate() + - '日' + + "日" + d.getHours() + - '时' + + "时" + d.getMinutes() + - '分' - ) + "分" + ); } } @@ -63,18 +70,18 @@ export function formatTime(time, option) { * @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 + 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 + const name = decodeURIComponent($1); + let val = decodeURIComponent($2); + val = String(val); + obj[name] = val; + return rs; + }); + return obj; } /** @@ -83,14 +90,14 @@ export function getQueryObject(url) { */ export function byteLength(str) { // returns the byte length of an utf8 string - let s = str.length + 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-- + 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 + return s; } /** @@ -98,13 +105,13 @@ export function byteLength(str) { * @returns {Array} */ export function cleanArray(actual) { - const newArray = [] + const newArray = []; for (let i = 0; i < actual.length; i++) { if (actual[i]) { - newArray.push(actual[i]) + newArray.push(actual[i]); } } - return newArray + return newArray; } /** @@ -112,13 +119,13 @@ export function cleanArray(actual) { * @returns {Array} */ export function param(json) { - if (!json) return '' + if (!json) return ""; return cleanArray( - Object.keys(json).map(key => { - if (json[key] === undefined) return '' - return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) + Object.keys(json).map((key) => { + if (json[key] === undefined) return ""; + return encodeURIComponent(key) + "=" + encodeURIComponent(json[key]); }) - ).join('&') + ).join("&"); } /** @@ -126,21 +133,21 @@ export function param(json) { * @returns {Object} */ export function param2Obj(url) { - const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + const search = decodeURIComponent(url.split("?")[1]).replace(/\+/g, " "); if (!search) { - return {} + return {}; } - const obj = {} - const searchArr = search.split('&') - searchArr.forEach(v => { - const index = v.indexOf('=') + 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 + const name = v.substring(0, index); + const val = v.substring(index + 1, v.length); + obj[name] = val; } - }) - return obj + }); + return obj; } /** @@ -148,9 +155,9 @@ export function param2Obj(url) { * @returns {string} */ export function html2Text(val) { - const div = document.createElement('div') - div.innerHTML = val - return div.textContent || div.innerText + const div = document.createElement("div"); + div.innerHTML = val; + return div.textContent || div.innerText; } /** @@ -160,21 +167,21 @@ export function html2Text(val) { * @returns {Object} */ export function objectMerge(target, source) { - if (typeof target !== 'object') { - target = {} + if (typeof target !== "object") { + target = {}; } if (Array.isArray(source)) { - return source.slice() + return source.slice(); } - Object.keys(source).forEach(property => { - const sourceProperty = source[property] - if (typeof sourceProperty === 'object') { - target[property] = objectMerge(target[property], sourceProperty) + Object.keys(source).forEach((property) => { + const sourceProperty = source[property]; + if (typeof sourceProperty === "object") { + target[property] = objectMerge(target[property], sourceProperty); } else { - target[property] = sourceProperty + target[property] = sourceProperty; } - }) - return target + }); + return target; } /** @@ -183,18 +190,18 @@ export function objectMerge(target, source) { */ export function toggleClass(element, className) { if (!element || !className) { - return + return; } - let classString = element.className - const nameIndex = classString.indexOf(className) + let classString = element.className; + const nameIndex = classString.indexOf(className); if (nameIndex === -1) { - classString += '' + className + classString += "" + className; } else { classString = classString.substr(0, nameIndex) + - classString.substr(nameIndex + className.length) + classString.substr(nameIndex + className.length); } - element.className = classString + element.className = classString; } /** @@ -202,10 +209,10 @@ export function toggleClass(element, className) { * @returns {Date} */ export function getTime(type) { - if (type === 'start') { - return new Date().getTime() - 3600 * 1000 * 24 * 90 + if (type === "start") { + return new Date().getTime() - 3600 * 1000 * 24 * 90; } else { - return new Date(new Date().toDateString()) + return new Date(new Date().toDateString()); } } @@ -216,38 +223,38 @@ export function getTime(type) { * @return {*} */ export function debounce(func, wait, immediate) { - let timeout, args, context, timestamp, result + let timeout, args, context, timestamp, result; - const later = function() { + const later = function () { // 据上一次触发时间间隔 - const last = +new Date() - timestamp + const last = +new Date() - timestamp; // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait if (last < wait && last > 0) { - timeout = setTimeout(later, wait - last) + timeout = setTimeout(later, wait - last); } else { - timeout = null + timeout = null; // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 if (!immediate) { - result = func.apply(context, args) - if (!timeout) context = args = null + result = func.apply(context, args); + if (!timeout) context = args = null; } } - } + }; - return function(...args) { - context = this - timestamp = +new Date() - const callNow = immediate && !timeout + return function (...args) { + context = this; + timestamp = +new Date(); + const callNow = immediate && !timeout; // 如果延时不存在,重新设定延时 - if (!timeout) timeout = setTimeout(later, wait) + if (!timeout) timeout = setTimeout(later, wait); if (callNow) { - result = func.apply(context, args) - context = args = null + result = func.apply(context, args); + context = args = null; } - return result - } + return result; + }; } /** @@ -258,18 +265,18 @@ export function debounce(func, wait, immediate) { * @returns {Object} */ export function deepClone(source) { - if (!source && typeof source !== 'object') { - throw new Error('error arguments', 'deepClone') + 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]) + 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] + targetObj[keys] = source[keys]; } - }) - return targetObj + }); + return targetObj; } /** @@ -277,16 +284,16 @@ export function deepClone(source) { * @returns {Array} */ export function uniqueArr(arr) { - return Array.from(new Set(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) + const timestamp = +new Date() + ""; + const randomNum = parseInt((1 + Math.random()) * 65536) + ""; + return (+(randomNum + timestamp)).toString(32); } /** @@ -296,7 +303,7 @@ export function createUniqueString() { * @returns {boolean} */ export function hasClass(ele, cls) { - return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) + return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)")); } /** @@ -305,7 +312,7 @@ export function hasClass(ele, cls) { * @param {string} cls */ export function addClass(ele, cls) { - if (!hasClass(ele, cls)) ele.className += ' ' + cls + if (!hasClass(ele, cls)) ele.className += " " + cls; } /** @@ -315,76 +322,152 @@ export function addClass(ele, cls) { */ export function removeClass(ele, cls) { if (hasClass(ele, cls)) { - const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') - ele.className = ele.className.replace(reg, ' ') + 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(',') + const map = Object.create(null); + const list = str.split(","); for (let i = 0; i < list.length; i++) { - map[list[i]] = true + map[list[i]] = true; } - return expectsLowerCase - ? val => map[val.toLowerCase()] - : val => map[val] + return expectsLowerCase ? (val) => map[val.toLowerCase()] : (val) => map[val]; } - -export const exportDefault = 'export default ' + +export const exportDefault = "export default "; export const beautifierConf = { html: { - indent_size: '2', - indent_char: ' ', - max_preserve_newlines: '-1', + 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', + 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', + wrap_line_length: "110", indent_inner_html: true, comma_first: false, e4x: true, - indent_empty_lines: true + indent_empty_lines: true, }, js: { - indent_size: '2', - indent_char: ' ', - max_preserve_newlines: '-1', + 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', + 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', + wrap_line_length: "110", indent_inner_html: true, comma_first: false, e4x: true, - indent_empty_lines: true - } -} + indent_empty_lines: true, + }, +}; // 首字母大小 export function titleCase(str) { - return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) + return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase()); } // 下划转驼峰 export function camelCase(str) { - return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase()) + return str.replace(/_[a-z]/g, (str1) => str1.substr(-1).toUpperCase()); } export function isNumberStr(str) { - return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) + return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str); +} + +/** + * 防抖 + */ +// export function debounce(handle, delay) { +// var timer = null; +// return function () { +// var _self = this, +// _args = arguments; +// clearTimeout(timer); +// timer = setTimeout(function () { +// handle.apply(_self, _args); +// }, delay); +// }; +// } + +/** + * 节流 + */ +export function throttle(handler, wait) { + var lastTime = 0; + return function (e) { + var nowTime = new Date().getTime(); + if (nowTime - lastTime > wait) { + handler.apply(this, arguments); + lastTime = nowTime; + } + }; +} +/** + * 值之间的过度 + * @param {number} num 需要过度的数值 + * @param {number} duration 过渡时间 + */ +export function transitionNum(num, duration) { + const initial = ref(0); + const initialNum = useTransition(initial, { + duration: duration, + transition: TransitionPresets.easeInOutCubic, + }); + initial.value = num; + return initialNum; +} +/** + * 获取一个随机的颜色值 + */ +export function randomColor() { + return `#${Math.random().toString(16).slice(2, 8).padEnd(6, "0")}`; +} +/** + * 时间段 + * @param hours + * @returns + */ +export function timePeriod(hours) { + if (hours >= 3 && hours < 8) { + return "早安!"; + } else if (hours >= 8 && hours < 11) { + return "上午好!"; + } else if (hours >= 11 && hours < 13) { + return "中午好!"; + } else if (hours >= 13 && hours < 17) { + return "下午好!"; + } else if (hours >= 17 && hours < 23) { + return "晚上好!"; + } else if (hours >= 23 && hours < 3) { + return "晚安!"; + } +} + +/** + * 获取路由 + */ +export function getUrlRouter() { + var sHref = window.location.href; + var args = sHref.split("#"); + var hrefarr = args[1].split("/")[1].split("?"); + return hrefarr; } - diff --git a/src/utils/lunar.js b/src/utils/lunar.js new file mode 100644 index 0000000..d143553 --- /dev/null +++ b/src/utils/lunar.js @@ -0,0 +1,1126 @@ +/** + * Author: Fu Guobin + * Date: 2020/06/28 + * Last Modified by: Fu Guobin + * Last Modified time: 2023/05/26 + * Copyright:Daniel(Fu Guobin) + * Description:农历函数封装 + */ +/** + * @1900-2100区间内的公历、农历互转 + * @charset UTF-8 + * @Author Daniel + * @Time 2022-07-26 + * @Version 1.0.3 + * @公历转农历:calendar.solarToLunar(1987,11,01); //[you can ignore params of prefix 0] + * @农历转公历:calendar.lunarToSolar(1987,09,10); //[you can ignore params of prefix 0] + */ +const calendar = { + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [ + 0x04bd8, + 0x04ae0, + 0x0a570, + 0x054d5, + 0x0d260, + 0x0d950, + 0x16554, + 0x056a0, + 0x09ad0, + 0x055d2, //1900-1909 + 0x04ae0, + 0x0a5b6, + 0x0a4d0, + 0x0d250, + 0x1d255, + 0x0b540, + 0x0d6a0, + 0x0ada2, + 0x095b0, + 0x14977, //1910-1919 + 0x04970, + 0x0a4b0, + 0x0b4b5, + 0x06a50, + 0x06d40, + 0x1ab54, + 0x02b60, + 0x09570, + 0x052f2, + 0x04970, //1920-1929 + 0x06566, + 0x0d4a0, + 0x0ea50, + 0x16a95, + 0x05ad0, + 0x02b60, + 0x186e3, + 0x092e0, + 0x1c8d7, + 0x0c950, //1930-1939 + 0x0d4a0, + 0x1d8a6, + 0x0b550, + 0x056a0, + 0x1a5b4, + 0x025d0, + 0x092d0, + 0x0d2b2, + 0x0a950, + 0x0b557, //1940-1949 + 0x06ca0, + 0x0b550, + 0x15355, + 0x04da0, + 0x0a5b0, + 0x14573, + 0x052b0, + 0x0a9a8, + 0x0e950, + 0x06aa0, //1950-1959 + 0x0aea6, + 0x0ab50, + 0x04b60, + 0x0aae4, + 0x0a570, + 0x05260, + 0x0f263, + 0x0d950, + 0x05b57, + 0x056a0, //1960-1969 + 0x096d0, + 0x04dd5, + 0x04ad0, + 0x0a4d0, + 0x0d4d4, + 0x0d250, + 0x0d558, + 0x0b540, + 0x0b6a0, + 0x195a6, //1970-1979 + 0x095b0, + 0x049b0, + 0x0a974, + 0x0a4b0, + 0x0b27a, + 0x06a50, + 0x06d40, + 0x0af46, + 0x0ab60, + 0x09570, //1980-1989 + 0x04af5, + 0x04970, + 0x064b0, + 0x074a3, + 0x0ea50, + 0x06b58, + 0x05ac0, + 0x0ab60, + 0x096d5, + 0x092e0, //1990-1999 + 0x0c960, + 0x0d954, + 0x0d4a0, + 0x0da50, + 0x07552, + 0x056a0, + 0x0abb7, + 0x025d0, + 0x092d0, + 0x0cab5, //2000-2009 + 0x0a950, + 0x0b4a0, + 0x0baa4, + 0x0ad50, + 0x055d9, + 0x04ba0, + 0x0a5b0, + 0x15176, + 0x052b0, + 0x0a930, //2010-2019 + 0x07954, + 0x06aa0, + 0x0ad50, + 0x05b52, + 0x04b60, + 0x0a6e6, + 0x0a4e0, + 0x0d260, + 0x0ea65, + 0x0d530, //2020-2029 + 0x05aa0, + 0x076a3, + 0x096d0, + 0x04afb, + 0x04ad0, + 0x0a4d0, + 0x1d0b6, + 0x0d250, + 0x0d520, + 0x0dd45, //2030-2039 + 0x0b5a0, + 0x056d0, + 0x055b2, + 0x049b0, + 0x0a577, + 0x0a4b0, + 0x0aa50, + 0x1b255, + 0x06d20, + 0x0ada0, //2040-2049 + /**Add By JJonline@JJonline.Cn**/ + 0x14b63, + 0x09370, + 0x049f8, + 0x04970, + 0x064b0, + 0x168a6, + 0x0ea50, + 0x06b20, + 0x1a6c4, + 0x0aae0, //2050-2059 + 0x092e0, + 0x0d2e3, + 0x0c960, + 0x0d557, + 0x0d4a0, + 0x0da50, + 0x05d55, + 0x056a0, + 0x0a6d0, + 0x055d4, //2060-2069 + 0x052d0, + 0x0a9b8, + 0x0a950, + 0x0b4a0, + 0x0b6a6, + 0x0ad50, + 0x055a0, + 0x0aba4, + 0x0a5b0, + 0x052b0, //2070-2079 + 0x0b273, + 0x06930, + 0x07337, + 0x06aa0, + 0x0ad50, + 0x14b55, + 0x04b60, + 0x0a570, + 0x054e4, + 0x0d160, //2080-2089 + 0x0e968, + 0x0d520, + 0x0daa0, + 0x16aa6, + 0x056d0, + 0x04ae0, + 0x0a9d4, + 0x0a2d0, + 0x0d150, + 0x0f252, //2090-2099 + 0x0d520 + ], //2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: [ + "\u7532", + "\u4e59", + "\u4e19", + "\u4e01", + "\u620a", + "\u5df1", + "\u5e9a", + "\u8f9b", + "\u58ec", + "\u7678" + ], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: [ + "\u5b50", + "\u4e11", + "\u5bc5", + "\u536f", + "\u8fb0", + "\u5df3", + "\u5348", + "\u672a", + "\u7533", + "\u9149", + "\u620c", + "\u4ea5" + ], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: [ + "\u9f20", + "\u725b", + "\u864e", + "\u5154", + "\u9f99", + "\u86c7", + "\u9a6c", + "\u7f8a", + "\u7334", + "\u9e21", + "\u72d7", + "\u732a" + ], + + /** + * 阳历节日 + */ + festival: { + "1-1": { title: "元旦节" }, + "2-14": { title: "情人节" }, + "5-1": { title: "劳动节" }, + "5-4": { title: "青年节" }, + "6-1": { title: "儿童节" }, + "9-10": { title: "教师节" }, + "10-1": { title: "国庆节" }, + "12-25": { title: "圣诞节" }, + + "3-8": { title: "妇女节" }, + "3-12": { title: "植树节" }, + "4-1": { title: "愚人节" }, + "5-12": { title: "护士节" }, + "7-1": { title: "建党节" }, + "8-1": { title: "建军节" }, + "12-24": { title: "平安夜" } + }, + + /** + * 农历节日 + */ + lFestival: { + "12-30": { title: "除夕" }, + "1-1": { title: "春节" }, + "1-15": { title: "元宵节" }, + "2-2": { title: "龙抬头" }, + "5-5": { title: "端午节" }, + "7-7": { title: "七夕节" }, + "7-15": { title: "中元节" }, + "8-15": { title: "中秋节" }, + "9-9": { title: "重阳节" }, + "10-1": { title: "寒衣节" }, + "10-15": { title: "下元节" }, + "12-8": { title: "腊八节" }, + "12-23": { title: "北方小年" }, + "12-24": { title: "南方小年" } + }, + + /** + * 返回默认定义的阳历节日 + */ + getFestival() { + return this.festival; + }, + + /** + * 返回默认定义的内容里节日 + */ + getLunarFestival() { + return this.lFestival; + }, + + /** + * + * @param param {Object} 按照festival的格式输入数据,设置阳历节日 + */ + setFestival(param = {}) { + this.festival = param; + }, + + /** + * + * @param param {Object} 按照lFestival的格式输入数据,设置农历节日 + */ + setLunarFestival(param = {}) { + this.lFestival = param; + }, + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: [ + "\u5c0f\u5bd2", + "\u5927\u5bd2", + "\u7acb\u6625", + "\u96e8\u6c34", + "\u60ca\u86f0", + "\u6625\u5206", + "\u6e05\u660e", + "\u8c37\u96e8", + "\u7acb\u590f", + "\u5c0f\u6ee1", + "\u8292\u79cd", + "\u590f\u81f3", + "\u5c0f\u6691", + "\u5927\u6691", + "\u7acb\u79cb", + "\u5904\u6691", + "\u767d\u9732", + "\u79cb\u5206", + "\u5bd2\u9732", + "\u971c\u964d", + "\u7acb\u51ac", + "\u5c0f\u96ea", + "\u5927\u96ea", + "\u51ac\u81f3" + ], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: [ + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf97c3598082c95f8c965cc920f", + "97bd0b06bdb0722c965ce1cfcc920f", + "b027097bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf97c359801ec95f8c965cc920f", + "97bd0b06bdb0722c965ce1cfcc920f", + "b027097bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf97c359801ec95f8c965cc920f", + "97bd0b06bdb0722c965ce1cfcc920f", + "b027097bd097c36b0b6fc9274c91aa", + "9778397bd19801ec9210c965cc920e", + "97b6b97bd19801ec95f8c965cc920f", + "97bd09801d98082c95f8e1cfcc920f", + "97bd097bd097c36b0b6fc9210c8dc2", + "9778397bd197c36c9210c9274c91aa", + "97b6b97bd19801ec95f8c965cc920e", + "97bd09801d98082c95f8e1cfcc920f", + "97bd097bd097c36b0b6fc9210c8dc2", + "9778397bd097c36c9210c9274c91aa", + "97b6b97bd19801ec95f8c965cc920e", + "97bcf97c3598082c95f8e1cfcc920f", + "97bd097bd097c36b0b6fc9210c8dc2", + "9778397bd097c36c9210c9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf97c3598082c95f8c965cc920f", + "97bd097bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf97c3598082c95f8c965cc920f", + "97bd097bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf97c359801ec95f8c965cc920f", + "97bd097bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf97c359801ec95f8c965cc920f", + "97bd097bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf97c359801ec95f8c965cc920f", + "97bd097bd07f595b0b6fc920fb0722", + "9778397bd097c36b0b6fc9210c8dc2", + "9778397bd19801ec9210c9274c920e", + "97b6b97bd19801ec95f8c965cc920f", + "97bd07f5307f595b0b0bc920fb0722", + "7f0e397bd097c36b0b6fc9210c8dc2", + "9778397bd097c36c9210c9274c920e", + "97b6b97bd19801ec95f8c965cc920f", + "97bd07f5307f595b0b0bc920fb0722", + "7f0e397bd097c36b0b6fc9210c8dc2", + "9778397bd097c36c9210c9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bd07f1487f595b0b0bc920fb0722", + "7f0e397bd097c36b0b6fc9210c8dc2", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf7f1487f595b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf7f1487f595b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf7f1487f531b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", + "97bcf7f1487f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c9274c920e", + "97bcf7f0e47f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "9778397bd097c36b0b6fc9210c91aa", + "97b6b97bd197c36c9210c9274c920e", + "97bcf7f0e47f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "9778397bd097c36b0b6fc9210c8dc2", + "9778397bd097c36c9210c9274c920e", + "97b6b7f0e47f531b0723b0b6fb0722", + "7f0e37f5307f595b0b0bc920fb0722", + "7f0e397bd097c36b0b6fc9210c8dc2", + "9778397bd097c36b0b70c9274c91aa", + "97b6b7f0e47f531b0723b0b6fb0721", + "7f0e37f1487f595b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc9210c8dc2", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f595b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", + "97b6b7f0e47f531b0723b0787b0721", + "7f0e27f0e47f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "9778397bd097c36b0b6fc9210c91aa", + "97b6b7f0e47f149b0723b0787b0721", + "7f0e27f0e47f531b0723b0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "9778397bd097c36b0b6fc9210c8dc2", + "977837f0e37f149b0723b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0722", + "7f0e37f5307f595b0b0bc920fb0722", + "7f0e397bd097c35b0b6fc9210c8dc2", + "977837f0e37f14998082b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e37f1487f595b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc9210c8dc2", + "977837f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", + "977837f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", + "977837f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "977837f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "977837f0e37f14998082b0787b06bd", + "7f07e7f0e47f149b0723b0787b0721", + "7f0e27f0e47f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "977837f0e37f14998082b0723b06bd", + "7f07e7f0e37f149b0723b0787b0721", + "7f0e27f0e47f531b0723b0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", + "977837f0e37f14898082b0723b02d5", + "7ec967f0e37f14998082b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0722", + "7f0e37f1487f595b0b0bb0b6fb0722", + "7f0e37f0e37f14898082b0723b02d5", + "7ec967f0e37f14998082b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0722", + "7f0e37f1487f531b0b0bb0b6fb0722", + "7f0e37f0e37f14898082b0723b02d5", + "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e37f1487f531b0b0bb0b6fb0722", + "7f0e37f0e37f14898082b072297c35", + "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e37f0e37f14898082b072297c35", + "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e37f0e366aa89801eb072297c35", + "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f149b0723b0787b0721", + "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e37f0e366aa89801eb072297c35", + "7ec967f0e37f14998082b0723b06bd", + "7f07e7f0e47f149b0723b0787b0721", + "7f0e27f0e47f531b0723b0b6fb0722", + "7f0e37f0e366aa89801eb072297c35", + "7ec967f0e37f14998082b0723b06bd", + "7f07e7f0e37f14998083b0787b0721", + "7f0e27f0e47f531b0723b0b6fb0722", + "7f0e37f0e366aa89801eb072297c35", + "7ec967f0e37f14898082b0723b02d5", + "7f07e7f0e37f14998082b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0722", + "7f0e36665b66aa89801e9808297c35", + "665f67f0e37f14898082b0723b02d5", + "7ec967f0e37f14998082b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0722", + "7f0e36665b66a449801e9808297c35", + "665f67f0e37f14898082b0723b02d5", + "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e36665b66a449801e9808297c35", + "665f67f0e37f14898082b072297c35", + "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e26665b66a449801e9808297c35", + "665f67f0e37f1489801eb072297c35", + "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722" + ], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: [ + "\u65e5", + "\u4e00", + "\u4e8c", + "\u4e09", + "\u56db", + "\u4e94", + "\u516d", + "\u4e03", + "\u516b", + "\u4e5d", + "\u5341" + ], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ["\u521d", "\u5341", "\u5eff", "\u5345"], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: [ + "\u6b63", + "\u4e8c", + "\u4e09", + "\u56db", + "\u4e94", + "\u516d", + "\u4e03", + "\u516b", + "\u4e5d", + "\u5341", + "\u51ac", + "\u814a" + ], + + /** + * 返回农历y年一整年的总天数 + * @param y lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + let i, + sum = 348; + for (i = 0x8000; i > 0x8; i >>= 1) { + sum += this.lunarInfo[y - 1900] & i ? 1 : 0; + } + return sum + this.leapDays(y); + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param y lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { + //闰字编码 \u95f0 + return this.lunarInfo[y - 1900] & 0xf; + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param y lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return this.lunarInfo[y - 1900] & 0x10000 ? 30 : 29; + } + return 0; + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param y lunar Year + * @param m lunar Month + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { + return -1; + } //月份参数从1至12,参数错误返回-1 + return this.lunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29; + }, + + /** + * 返回公历(!)y年m月的天数 + * @param y solar Year + * @param m solar Month + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { + return -1; + } //若参数错误 返回-1 + const ms = m - 1; + if (ms === 1) { + //2月份的闰平规律测算后确认返回28或29 + return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0 ? 29 : 28; + } else { + return this.solarMonth[ms]; + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + let ganKey = (lYear - 3) % 10; + let zhiKey = (lYear - 3) % 12; + if (ganKey === 0) ganKey = 10; //如果余数为0则为最后一个天干 + if (zhiKey === 0) zhiKey = 12; //如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]; + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + const s = + "\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf"; + const arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]; + return ( + s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + "\u5ea7" + ); //座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12]; + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y y公历年(1900-2100) + * @param n n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100) { + return -1; + } + if (n < 1 || n > 24) { + return -1; + } + const _table = this.sTermInfo[y - 1900]; + const _info = [ + parseInt("0x" + _table.substr(0, 5)).toString(), + parseInt("0x" + _table.substr(5, 5)).toString(), + parseInt("0x" + _table.substr(10, 5)).toString(), + parseInt("0x" + _table.substr(15, 5)).toString(), + parseInt("0x" + _table.substr(20, 5)).toString(), + parseInt("0x" + _table.substr(25, 5)).toString() + ]; + const _calcDay = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ]; + return parseInt(_calcDay[n - 1]); + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param m lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { + // 月 => \u6708 + if (m > 12 || m < 1) { + return -1; + } //若参数错误 返回-1 + let s = this.nStr3[m - 1]; + s += "\u6708"; //加上月字 + return s; + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param d lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { + //日 => \u65e5 + let s; + switch (d) { + case 10: + s = "\u521d\u5341"; + break; + case 20: + s = "\u4e8c\u5341"; + break; + case 30: + s = "\u4e09\u5341"; + break; + default: + s = this.nStr2[Math.floor(d / 10)]; + s += this.nStr1[d % 10]; + } + return s; + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12]; + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * !important! 公历参数区间1900.1.31~2100.12.31 + * @param yPara solar year + * @param mPara solar month + * @param dPara solar day + * @return JSON object + * @eg:console.log(calendar.solarToLunar(1987,11,01)); + */ + solarToLunar: function (yPara, mPara, dPara) { + let y = parseInt(yPara); + let m = parseInt(mPara); + let d = parseInt(dPara); + //年份限定、上限 + if (y < 1900 || y > 2100) { + return -1; // undefined转换为数字变为NaN + } + //公历传参最下限 + if (y === 1900 && m === 1 && d < 31) { + return -1; + } + + //未传参 获得当天 + let objDate; + if (!y) { + objDate = new Date(); + } else { + objDate = new Date(y, parseInt(m.toString()) - 1, d); + } + let i, + leap = 0, + temp = 0; + //修正ymd参数 + y = objDate.getFullYear(); + m = objDate.getMonth() + 1; + d = objDate.getDate(); + let offset = + (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - + Date.UTC(1900, 0, 31)) / + 86400000; + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i); + offset -= temp; + } + if (offset < 0) { + offset += temp; + i--; + } + + //是否今天 + // eslint-disable-next-line prefer-const + let isTodayObj = new Date(), + isToday = false; + if ( + isTodayObj.getFullYear() === y && + isTodayObj.getMonth() + 1 === m && + isTodayObj.getDate() === d + ) { + isToday = true; + } + //星期几 + let nWeek = objDate.getDay(), + // eslint-disable-next-line prefer-const + cWeek = this.nStr1[nWeek]; + //数字表示周几顺应天朝周一开始的惯例 + if (nWeek === 0) { + nWeek = 7; + } + //农历年 + const year = i; + leap = this.leapMonth(i); //闰哪个月 + let isLeap = false; + + //效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + //闰月 + if (leap > 0 && i === leap + 1 && isLeap === false) { + --i; + isLeap = true; + temp = this.leapDays(year); //计算农历闰月天数 + } else { + temp = this.monthDays(year, i); //计算农历普通月天数 + } + //解除闰月 + if (isLeap === true && i === leap + 1) { + isLeap = false; + } + offset -= temp; + } + // 闰月导致数组下标重叠取反 + if (offset === 0 && leap > 0 && i === leap + 1) { + if (isLeap) { + isLeap = false; + } else { + isLeap = true; + --i; + } + } + if (offset < 0) { + offset += temp; + --i; + } + //农历月 + const month = i; + //农历日 + const day = offset + 1; + //天干地支处理 + const sm = m - 1; + const cnY = this.toGanZhiYear(year); + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + const firstNode = this.getTerm(y, m * 2 - 1); //返回当月「节」为几日开始 + const secondNode = this.getTerm(y, m * 2); //返回当月「节」为几日开始 + + // 依据12节气修正干支月 + let cnM = this.toGanZhi((y - 1900) * 12 + m + 11); + if (d >= firstNode) { + cnM = this.toGanZhi((y - 1900) * 12 + m + 12); + } + + //传入的日期的节气与否 + let isTerm = false; + let Term = null; + if (firstNode === d) { + isTerm = true; + Term = this.solarTerm[m * 2 - 2]; + } + if (secondNode === d) { + isTerm = true; + Term = this.solarTerm[m * 2 - 1]; + } + //日柱 当月一日与 1900/1/1 相差天数 + const dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10; + const cnD = this.toGanZhi(dayCyclical + d - 1); + //该日期所属的星座 + const astro = this.toAstro(m, d); + + const solarDate = y + "-" + m + "-" + d; + const lunarDate = year + "-" + month + "-" + day; + + const festival = this.festival; + const lFestival = this.lFestival; + + const festivalDate = m + "-" + d; + const lunarFestivalDate = month + "-" + day; + + return { + date: solarDate, + lunarDate: lunarDate, + festival: festival[festivalDate] ? festival[festivalDate].title : null, + lunarFestival: lFestival[lunarFestivalDate] + ? lFestival[lunarFestivalDate].title + : null, + lYear: year, + lMonth: month, + lDay: day, + Animal: this.getAnimal(year), + IMonthCn: (isLeap ? "\u95f0" : "") + this.toChinaMonth(month), + IDayCn: this.toChinaDay(day), + cYear: y, + cMonth: m, + cDay: d, + cnYear: cnY, + cnMonth: cnM, + cnDay: cnD, + isToday: isToday, + isLeap: isLeap, + nWeek: nWeek, + ncWeek: "\u661f\u671f" + cWeek, + isTerm: isTerm, + Term: Term, + astro: astro + }; + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * !important! 参数区间1900.1.31~2100.12.1 + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunarToSolar(1987,9,10)); + */ + lunarToSolar: function (y, m, d, isLeapMonth) { + y = parseInt(y); + m = parseInt(m); + d = parseInt(d); + isLeapMonth = !!isLeapMonth; + // const leapOffset = 0; + const leapMonth = this.leapMonth(y); + // const leapDay = this.leapDays(y); + if (isLeapMonth && leapMonth !== m) { + return -1; + } //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if ( + (y === 2100 && m === 12 && d > 1) || + (y === 1900 && m === 1 && d < 31) + ) { + return -1; + } //超出了最大极限值 + const day = this.monthDays(y, m); + let _day = day; + //bugFix 2016-9-25 + //if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m); + } + if (y < 1900 || y > 2100 || d > _day) { + return -1; + } //参数合法性效验 + + //计算农历的时间差 + let offset = 0; + let i; + for (i = 1900; i < y; i++) { + offset += this.lYearDays(i); + } + let leap = 0, + isAdd = false; + for (i = 1; i < m; i++) { + leap = this.leapMonth(y); + if (!isAdd) { + //处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); + isAdd = true; + } + } + offset += this.monthDays(y, i); + } + //转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { + offset += day; + } + //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + const strap = Date.UTC(1900, 1, 30, 0, 0, 0); + const calObj = new Date((offset + d - 31) * 86400000 + strap); + const cY = calObj.getUTCFullYear(); + const cM = calObj.getUTCMonth() + 1; + const cD = calObj.getUTCDate(); + + return this.solarToLunar(cY, cM, cD); + } +}; + +export default calendar; \ No newline at end of file diff --git a/src/utils/rem.js b/src/utils/rem.js new file mode 100644 index 0000000..e4871e2 --- /dev/null +++ b/src/utils/rem.js @@ -0,0 +1,21 @@ + +/** + * Author: Fu Guobin + * Date: 2020/06/28 + * Last Modified by: Fu Guobin + * Last Modified time: 2023/08/28 + * Copyright:Daniel(Fu Guobin) + * Description:封装一个根据屏幕尺寸自动改变 html 的 font-size 大小的函数 + */ +const init = function () { + let clientWidth = + document.documentElement.clientWidth || document.body.clientWidth + // 设计图尺寸是 1920px,这样 *10 之后,1rem 就等于 10px; + const fontSize = (clientWidth / 1920 * 10) + document.documentElement.style.fontSize = fontSize + "px" +} + +init() + +window.addEventListener("resize", init) +export default init \ No newline at end of file diff --git a/src/utils/request.js b/src/utils/request.js index 8cca458..0bbf79b 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,110 +1,155 @@ -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' -import router from '@/router' +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"; +import router from "@/router"; let downloadLoadingInstance; // 是否显示重新登录 export let isRelogin = { show: false }; -axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' +axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"; // 创建axios实例 const service = axios.create({ // axios中请求配置有baseURL选项,表示请求URL公共部分 baseURL: import.meta.env.VITE_APP_BASE_API, // 超时 - timeout: 120000 -}) + timeout: 120000, +}); // request拦截器 -service.interceptors.request.use(config => { - config.headers['Referer1'] = router.currentRoute.value.fullPath.split('?')[0] - // 是否需要设置 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() +service.interceptors.request.use( + (config) => { + config.headers["Referer1"] = + router.currentRoute.value.fullPath.split("?")[0]; + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false; + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false; + if (getToken() && !isToken) { + config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改 } - 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)) + // 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 { - cache.session.setJSON('sessionObj', requestObj) + const s_url = sessionObj.url; // 请求地址 + const s_data = sessionObj.data; // 请求数据 + const s_time = sessionObj.time; // 请求时间 + const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交 + console.log( + "s_data:", + s_data === requestObj.data && requestObj.time - s_time + ); + console.log("interval:", interval); + console.log("s_url:", s_url === requestObj.url); + 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) => { + console.log(error); + Promise.reject(error); } - return config -}, error => { - console.log(error) - Promise.reject(error) -}) +); // 响应拦截器 -service.interceptors.response.use(res => { +service.interceptors.response.use( + (res) => { // 未设置状态码则默认成功状态 const code = res.data.code || 200; // 获取错误信息 - const msg = errorCode[code] || res.data.msg || errorCode['default'] + const msg = errorCode[code] || res.data.msg || errorCode["default"]; // 二进制数据则直接返回 - if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { - return res.data + 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 = '/index'; + ElMessageBox.confirm( + "登录状态已过期,您可以继续留在该页面,或者重新登录", + "系统提示", + { + confirmButtonText: "重新登录", + cancelButtonText: "取消", + type: "warning", + } + ) + .then(() => { + isRelogin.show = false; + useUserStore() + .logOut() + .then(() => { + location.href = "/index"; + }); }) - }).catch(() => { - isRelogin.show = false; - }); - } - return Promise.reject('无效的会话,或者会话已过期,请重新登录。') + .catch(() => { + isRelogin.show = false; + }); + } + return Promise.reject("无效的会话,或者会话已过期,请重新登录。"); } else if (code === 500) { - ElMessage({ message: msg, type: 'error' }) - return Promise.reject(new Error(msg)) + 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)) + ElMessage({ message: msg, type: "warning" }); + return Promise.reject(new Error(msg)); } else if (code !== 200) { - ElNotification.error({ title: msg }) - return Promise.reject('error') + ElNotification.error({ title: msg }); + return Promise.reject("error"); } else { - return Promise.resolve(res.data) + return Promise.resolve(res.data); } }, - error => { - console.log('err' + error) + (error) => { + console.log("err" + error); let { message } = error; if (message == "Network Error") { message = "后端接口连接异常"; @@ -113,65 +158,80 @@ service.interceptors.response.use(res => { } 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) + 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(); - }) + 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 function newDownload(url, params, filename, config) { - downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", }) - return service.post(url, JSON.stringify(params), { - headers: { 'Content-Type': 'application/json' }, - 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(); - }) + downloadLoadingInstance = ElLoading.service({ + text: "正在下载数据,请稍候", + background: "rgba(0, 0, 0, 0.7)", + }); + return service + .post(url, JSON.stringify(params), { + headers: { "Content-Type": "application/json" }, + 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 +export default service; diff --git a/src/utils/socket.ts b/src/utils/socket.ts new file mode 100644 index 0000000..82c91cf --- /dev/null +++ b/src/utils/socket.ts @@ -0,0 +1,183 @@ +/** + * Author: Fu Guobin + * Date: 2022/08/02 + * Last Modified by: Fu Guobin + * Last Modified time: 2023/09/21 + * Copyright:Daniel(Fu Guobin) + * Description:websocket方法封装 + */ +import type { Action } from 'element-plus'; +import { useSessionStorage } from '@vueuse/core'; +import mitt from '@/plugins/bus'; +class WebSocketService { + url: string; + websocket: WebSocket | null; + isInitialized: boolean; + isConnected: boolean; + heartTimer: number | null; + heartbeatInterval: number; + reconnectInterval: number; + maxReconnectAttempts: number; + reconnectAttempts: number; + data: any; + + constructor() { + this.url = ''; + this.websocket = null; + this.isInitialized = false; + this.isConnected = false; //连接状态 + this.heartTimer = null; //心跳计时 + this.heartbeatInterval = 30000; // 默认心跳30秒 + this.reconnectInterval = 10000; // 默认重连10秒 + this.maxReconnectAttempts = 5; // 默认尝试重连5次 + this.reconnectAttempts = 0; //重连次数 + this.data = null; + } + + initialize(url: string): void { + //初始化 + console.log('websocket初始化'); + this.url = url; + this.websocket = new WebSocket(url); + console.log('readyState1--', this.websocket?.readyState); + this.websocket.onopen = e => { + console.log('readyState--', this.websocket?.readyState); + console.log('websocket onopen--', e); + }; + this.websocket.onopen = this.onOpen.bind(this); + this.websocket.onclose = this.onClose.bind(this); + this.websocket.onerror = this.onError.bind(this); + this.websocket.onmessage = this.onMessage.bind(this); + this.isInitialized = true; + } + + onOpen(): void { + console.log('readyState2--', this.websocket?.readyState); + console.log('websocket onOpen'); + this.isConnected = true; // 连接状态 + this.reconnectAttempts = 0; // 重置重连次数 + this.startHeartbeat(); + } + + onSend(data: any): void { + //发送消息处理 + console.log('websocketSend:', JSON.stringify(data)); + if (this.isConnected) { + this.websocket?.send(JSON.stringify(data)); + } + } + + onMessage(event: MessageEvent): void { + //获取消息处理 + if (event.data != '连接成功') { + const response = JSON.parse(event.data); + console.log('response:', response); + this.data = response; + // 处理返回的数据 + if (response.code === 'datareal') { + console.log('table'); + mitt.emit('tableMessage', response); + } else if (response.code === 'alertDev') { + console.log('waring'); + mitt.emit('waringMessage', response); + } else if (response.code === 'respMsg') { + if (response.data[0].code === -1 || response.data[0].code === 1) { + this.close(false); + ElMessageBox.alert(response.msg, '提示', { + // if you want to disable its autofocus + // autofocus: false, + confirmButtonText: 'OK', + callback: (action: Action) => { + localStorage.clear(); + window.location.href = '/'; + } + }); + } + console.log(response.msg); + } else if (response.code === 'notice') { + mitt.emit('noticeMessage', response); + } + } + } + + onClose(): void { + // 关闭WebSocket连接的处理逻辑 + console.log('websocket关闭'); + // this.isInitialized = status === false ? false : true; + this.isConnected = false; //关闭连接 + this.stopHeartbeat(); //关闭心跳 + if (this.isInitialized) { + console.log('WebSocke尝试重连1'); + this.tryReconnect(); + } + } + + onError(error: Event): void { + // 错误处理的逻辑 + console.error('WebSocket连接错误:', error); + ElNotification({ + message: 'webSocket连接发生错误,正在尝试重连…', + type: 'error' + }); + this.isConnected = false; //关闭连接 + this.stopHeartbeat(); //关闭心跳 + if (this.isInitialized) { + console.log('WebSocke尝试重连2'); + this.tryReconnect(); + } + } + + tryReconnect() { + //尝试重连 + console.log('WebSocket尝试重连:', this.reconnectAttempts); + if (this.reconnectAttempts < this.maxReconnectAttempts) { + setTimeout(() => { + this.reconnectAttempts++; + this.initialize(this.url); + }, this.reconnectInterval); + } else { + this.close(false); + } + } + + startHeartbeat() { + // 发送心跳 + console.log('websocket发送心跳'); + this.heartTimer = setInterval(() => { + console.log('websocket心跳计时--', this.heartTimer); + if (this.websocket?.readyState === WebSocket.OPEN) { + const userStorageInfo = sessionStorage.getItem('userInfo'); + const userInfo = JSON.parse(userStorageInfo === null ? '' : userStorageInfo); + const hearData = { + code: 'heart', + data: { + username: userInfo.userName + } + }; + console.log(hearData); + this.websocket.send(JSON.stringify(hearData)); //心跳消息 + } + }, this.heartbeatInterval); + } + + stopHeartbeat() { + // 停止心跳 + console.log('websocket停止心跳'); + if (this.heartTimer != null) { + clearInterval(this.heartTimer); + this.heartTimer = null; + } + console.log('websocket停止心跳--', this.heartTimer); + } + + close(status: any): void { + console.log('close--', status); + this.isInitialized = status; + this.websocket?.close(); + console.log('websocket连接已关闭'); + } +} + +const webSocketService = new WebSocketService(); + +export default webSocketService; diff --git a/src/utils/storage.ts b/src/utils/storage.ts new file mode 100644 index 0000000..05f76d6 --- /dev/null +++ b/src/utils/storage.ts @@ -0,0 +1,108 @@ +/** + * * 存储本地会话数据 + * @param k 键名 + * @param v 键值(无需stringiiy) + * @returns RemovableRef + */ +export const setLocalStorage = (k: string, v: T) => { + try { + window.localStorage.setItem(k, JSON.stringify(v)) + } catch (error) { + return false + } +} + +/** + * * 获取本地会话数据 + * @param k 键名 + * @returns any + */ +export const getLocalStorage = (k: string) => { + const item = window.localStorage.getItem(k) + try { + return item ? JSON.parse(item) : item + } catch (err) { + return item + } +} + +/** + * * 清除本地会话数据 + * @param name + */ +export const clearLocalStorage = (name: string) => { + window.localStorage.removeItem(name) +} + +/** + * * 存储临时会话数据 + * @param k 键名 + * @param v 键值 + * @returns RemovableRef + */ +export const setSessionStorage = (k: string, v: T) => { + try { + window.sessionStorage.setItem(k, JSON.stringify(v)) + } catch (error) { + return false + } +} + +/** + * * 获取临时会话数据 + * @returns any + */ +export const getSessionStorage: (k: string) => any = (k: string) => { + const item = window.sessionStorage.getItem(k) + try { + return item ? JSON.parse(item) : item + } catch (err) { + return item + } +} + +/** + * * 清除本地会话数据 + * @param name + */ +export const clearSessioStorage = (name: string) => { + window.sessionStorage.removeItem(name) +} + +/** + * * 设置 cookie + * @param name 键名 + * @param cvalue 键值 + * @param exdays 过期时间 + */ +export const setCookie = (name: string, cvalue: string, exdays: number) => { + const d = new Date(); + d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); + const expires = "expires=" + d.toUTCString(); + document.cookie = name + "=" + cvalue + "; " + expires; +} + +/** + * * 获取 cookie + * @param cname 键名 + * @returns string + */ +export const getCookie = (cname: string) => { + const name = cname + "="; + const ca = document.cookie.split(';'); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) == ' ') c = c.substring(1); + if (c.indexOf(name) != -1) return c.substring(name.length, c.length); + } + return ""; +} + +/** + * * 清除 cookie + * @param name 键名 + * @returns string + */ +export const clearCookie = (name: string) => { + setCookie(name, "", -1); +} \ No newline at end of file diff --git a/src/utils/useStorage.ts b/src/utils/useStorage.ts new file mode 100644 index 0000000..f609033 --- /dev/null +++ b/src/utils/useStorage.ts @@ -0,0 +1,110 @@ +/** + * Author: Fu Guobin + * Date: 2022/08/22 + * Last Modified by: Fu Guobin + * Last Modified time: 2023/08/28 + * Copyright:Daniel(Fu Guobin) + * Description:storage方法封装 + */ + +import { ref, computed } from 'vue'; + +type StorageData = { + key: string; + value: any; +}; + +type StorageType = 'localStorage' | 'sessionStorage'; + +const getItem = (key: string, storageType: StorageType): any => { + try { + const storage = getStorage(storageType); + const item = storage.getItem(key); + if (item) { + return JSON.parse(item); + } + return null; + } catch (error) { + console.error(`Error getting item from ${storageType}: ${error}`); + return null; + } +}; + +const setItem = (key: string, value: any, storageType: StorageType): void => { + try { + const storage = getStorage(storageType); + const stringValue = JSON.stringify(value); + storage.setItem(key, stringValue); + } catch (error) { + console.error(`Error setting item in ${storageType}: ${error}`); + } +}; + +const removeItem = (key: string, storageType: StorageType): void => { + try { + const storage = getStorage(storageType); + storage.removeItem(key); + } catch (error) { + console.error(`Error removing item from ${storageType}: ${error}`); + } +}; + +const clearStorage = (storageType: StorageType): void => { + try { + const storage = getStorage(storageType); + storage.clear(); + } catch (error) { + console.error(`Error clearing ${storageType}: ${error}`); + } +}; + +const getStorage = (storageType: StorageType): Storage => { + return storageType === 'localStorage' ? localStorage : sessionStorage; +}; + +const storageData = ref>([]); + +const initializeStorage = (storageType: StorageType): void => { + const storage = getStorage(storageType); + const keys = Object.keys(storage); + + storageData.value = keys.map(key => ({ + key, + value: getItem(key, storageType) + })); +}; + +const useStorage = (storageType: StorageType) => { + const getUseStorage = (key: string) => { + getItem(key, storageType); + // return computed(() => storageData.value); + }; + + const setUseStorage = (key: string, value: any) => { + setItem(key, value, storageType); + const newData = { key, value }; + storageData.value.push(newData); + }; + + const removeUseStorage = (key: string) => { + removeItem(key, storageType); + const index = storageData.value.findIndex(item => item.key === key); + if (index !== -1) { + storageData.value.splice(index, 1); + } + }; + + const clearUseStorage = () => { + clearStorage(storageType); + storageData.value = []; + }; + + return { + getUseStorage, + setUseStorage, + removeUseStorage, + clearUseStorage + }; +}; + +export default useStorage; diff --git a/src/views/login.vue b/src/views/login.vue index 14af785..0688c7a 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,6 +1,11 @@