代码提交_10_17_开发后台管理_开发首页

This commit is contained in:
lixiaobang 2024-10-17 15:47:31 +08:00
parent 7ea431d689
commit 706f50d6ec
47 changed files with 3704 additions and 512 deletions

216
package-lock.json generated
View File

@ -8,12 +8,17 @@
"name": "databoard",
"version": "0.0.0",
"dependencies": {
"amfe-flexible": "^2.2.1",
"axios": "^1.6.7",
"echarts": "^5.5.0",
"element-plus": "^2.5.6",
"font-awesome": "^4.7.0",
"jsencrypt": "^3.3.2",
"less": "^4.2.0",
"less-loader": "^12.2.0",
"moment": "^2.30.1",
"pinia": "^2.1.7",
"postcss-pxtorem": "^6.1.0",
"vue": "^3.4.15",
"vue-router": "^4.2.5",
"vue3-seamless-scroll": "^2.0.1"
@ -597,7 +602,7 @@
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
@ -612,7 +617,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=6.0.0"
@ -622,7 +627,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=6.0.0"
@ -632,7 +637,7 @@
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz",
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@ -648,7 +653,7 @@
"version": "0.3.25",
"resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@ -873,7 +878,7 @@
"version": "8.56.5",
"resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.56.5.tgz",
"integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@types/estree": "*",
@ -884,7 +889,7 @@
"version": "3.7.7",
"resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@types/eslint": "*",
@ -895,13 +900,13 @@
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true
"devOptional": true
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true
"devOptional": true
},
"node_modules/@types/json5": {
"version": "0.0.29",
@ -926,7 +931,7 @@
"version": "20.11.26",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-20.11.26.tgz",
"integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"undici-types": "~5.26.4"
@ -1138,7 +1143,7 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz",
"integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/helper-numbers": "1.11.6",
@ -1149,28 +1154,28 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
"integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/@webassemblyjs/helper-api-error": {
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
"integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/@webassemblyjs/helper-buffer": {
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
"integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/@webassemblyjs/helper-numbers": {
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
"integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.11.6",
@ -1182,14 +1187,14 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
"integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
"integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
@ -1202,7 +1207,7 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
"integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
@ -1212,7 +1217,7 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
"integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@xtuc/long": "4.2.2"
@ -1222,14 +1227,14 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
"integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/@webassemblyjs/wasm-edit": {
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
"integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
@ -1246,7 +1251,7 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
"integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
@ -1260,7 +1265,7 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
"integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
@ -1273,7 +1278,7 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
"integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
@ -1288,7 +1293,7 @@
"version": "1.11.6",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
"integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
@ -1299,21 +1304,21 @@
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/acorn": {
"version": "8.11.3",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz",
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"dev": true,
"devOptional": true,
"bin": {
"acorn": "bin/acorn"
},
@ -1325,7 +1330,7 @@
"version": "1.9.0",
"resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
"integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
"dev": true,
"devOptional": true,
"peer": true,
"peerDependencies": {
"acorn": "^8"
@ -1344,7 +1349,7 @@
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"devOptional": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@ -1360,11 +1365,16 @@
"version": "3.5.2",
"resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"devOptional": true,
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/amfe-flexible": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/amfe-flexible/-/amfe-flexible-2.2.1.tgz",
"integrity": "sha512-L2VfvDzoETBjhRptg5u/IUuzHSuxm22JpSRb404p/TBGeRfwWmmNEbB+TFPIP/sS/+pbM18bCFH9QnMojLuPNw=="
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
@ -1639,7 +1649,7 @@
"version": "4.23.0",
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz",
"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
"dev": true,
"devOptional": true,
"funding": [
{
"type": "opencollective",
@ -1672,7 +1682,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/builtin-modules": {
@ -1743,7 +1753,7 @@
"version": "1.0.30001597",
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz",
"integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==",
"dev": true,
"devOptional": true,
"funding": [
{
"type": "opencollective",
@ -1816,7 +1826,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
"integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=6.0"
@ -1855,7 +1865,7 @@
"version": "2.20.3",
"resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/concat-map": {
@ -1868,7 +1878,6 @@
"version": "2.0.6",
"resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz",
"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
"dev": true,
"dependencies": {
"is-what": "^3.14.1"
},
@ -2002,7 +2011,7 @@
"version": "1.4.702",
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.702.tgz",
"integrity": "sha512-LYLXyEUsZ3nNSwiOWjI88N1PJUAMU2QphQSgGLVkFnb3FxZxNui2Vzi2PaKPgPWbsWbZstZnh6BMf/VQJamjiQ==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/element-plus": {
@ -2043,7 +2052,7 @@
"version": "5.16.0",
"resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz",
"integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"graceful-fs": "^4.2.4",
@ -2068,7 +2077,6 @@
"version": "0.1.8",
"resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz",
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
"dev": true,
"optional": true,
"dependencies": {
"prr": "~1.0.1"
@ -2163,7 +2171,7 @@
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
"integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/es-set-tostringtag": {
@ -2248,7 +2256,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz",
"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=6"
@ -2637,7 +2645,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"devOptional": true,
"dependencies": {
"estraverse": "^5.2.0"
},
@ -2649,7 +2657,7 @@
"version": "5.3.0",
"resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"devOptional": true,
"engines": {
"node": ">=4.0"
}
@ -2672,7 +2680,7 @@
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=0.8.x"
@ -2682,13 +2690,13 @@
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
"devOptional": true
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
"devOptional": true
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
@ -2970,7 +2978,7 @@
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/globals": {
@ -3019,7 +3027,7 @@
"version": "4.2.11",
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true
"devOptional": true
},
"node_modules/graphemer": {
"version": "1.4.0",
@ -3040,7 +3048,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"devOptional": true,
"engines": {
"node": ">=8"
}
@ -3112,7 +3120,6 @@
"version": "0.6.3",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"optional": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
@ -3134,7 +3141,6 @@
"version": "0.5.5",
"resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
"dev": true,
"optional": true,
"bin": {
"image-size": "bin/image-size.js"
@ -3465,8 +3471,7 @@
"node_modules/is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
"integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
"dev": true
"integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
},
"node_modules/isarray": {
"version": "2.0.5",
@ -3484,7 +3489,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@types/node": "*",
@ -3499,7 +3504,7 @@
"version": "8.1.1",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"has-flag": "^4.0.0"
@ -3538,14 +3543,14 @@
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
"devOptional": true
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
@ -3578,7 +3583,6 @@
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/less/-/less-4.2.0.tgz",
"integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
"dev": true,
"dependencies": {
"copy-anything": "^2.0.1",
"parse-node-version": "^1.0.1",
@ -3600,6 +3604,31 @@
"source-map": "~0.6.0"
}
},
"node_modules/less-loader": {
"version": "12.2.0",
"resolved": "https://registry.npmmirror.com/less-loader/-/less-loader-12.2.0.tgz",
"integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==",
"engines": {
"node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"@rspack/core": "0.x || 1.x",
"less": "^3.5.0 || ^4.0.0",
"webpack": "^5.0.0"
},
"peerDependenciesMeta": {
"@rspack/core": {
"optional": true
},
"webpack": {
"optional": true
}
}
},
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
@ -3617,7 +3646,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=6.11.5"
@ -3717,7 +3746,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
"dev": true,
"optional": true,
"dependencies": {
"pify": "^4.0.1",
@ -3731,7 +3759,6 @@
"version": "5.7.2",
"resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"optional": true,
"bin": {
"semver": "bin/semver"
@ -3746,14 +3773,13 @@
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
"optional": true,
"bin": {
"mime": "cli.js"
@ -3802,6 +3828,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/moment": {
"version": "2.30.1",
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
"engines": {
"node": "*"
}
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
@ -3835,7 +3869,6 @@
"version": "3.3.1",
"resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz",
"integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
"dev": true,
"optional": true,
"dependencies": {
"iconv-lite": "^0.6.3",
@ -3852,13 +3885,13 @@
"version": "2.6.2",
"resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
"devOptional": true
},
"node_modules/node-releases": {
"version": "2.0.14",
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz",
"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/normalize-path": {
@ -4042,7 +4075,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
"integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
"dev": true,
"engines": {
"node": ">= 0.10"
}
@ -4101,7 +4133,6 @@
"version": "4.0.1",
"resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true,
"optional": true,
"engines": {
"node": ">=6"
@ -4193,6 +4224,14 @@
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postcss-pxtorem": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/postcss-pxtorem/-/postcss-pxtorem-6.1.0.tgz",
"integrity": "sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==",
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.15",
"resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
@ -4224,14 +4263,13 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
"dev": true,
"optional": true
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"devOptional": true,
"engines": {
"node": ">=6"
}
@ -4260,7 +4298,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"safe-buffer": "^5.1.0"
@ -4433,7 +4471,7 @@
"version": "5.2.1",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"devOptional": true,
"funding": [
{
"type": "github",
@ -4471,7 +4509,6 @@
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"optional": true
},
"node_modules/sass": {
@ -4530,14 +4567,13 @@
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
"integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
"dev": true,
"optional": true
},
"node_modules/schema-utils": {
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz",
"integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
"dev": true,
"devOptional": true,
"dependencies": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
@ -4564,7 +4600,7 @@
"version": "6.0.2",
"resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"randombytes": "^2.1.0"
@ -4645,7 +4681,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"devOptional": true,
"engines": {
"node": ">=0.10.0"
}
@ -4662,7 +4698,7 @@
"version": "0.5.21",
"resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
@ -4775,7 +4811,7 @@
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz",
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=6"
@ -4785,7 +4821,7 @@
"version": "5.29.1",
"resolved": "https://registry.npmmirror.com/terser/-/terser-5.29.1.tgz",
"integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@ -4804,7 +4840,7 @@
"version": "5.3.10",
"resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
"integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.20",
@ -5003,14 +5039,14 @@
"version": "5.26.5",
"resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"dev": true,
"devOptional": true,
"peer": true
},
"node_modules/update-browserslist-db": {
"version": "1.0.13",
"resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"dev": true,
"devOptional": true,
"funding": [
{
"type": "opencollective",
@ -5041,7 +5077,7 @@
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"devOptional": true,
"dependencies": {
"punycode": "^2.1.0"
}
@ -5192,7 +5228,7 @@
"version": "2.4.0",
"resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz",
"integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"glob-to-regexp": "^0.4.1",
@ -5206,7 +5242,7 @@
"version": "5.90.3",
"resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.90.3.tgz",
"integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@ -5254,7 +5290,7 @@
"version": "3.2.3",
"resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=10.13.0"
@ -5264,7 +5300,7 @@
"version": "5.1.1",
"resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"devOptional": true,
"peer": true,
"dependencies": {
"esrecurse": "^4.3.0",
@ -5278,7 +5314,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true,
"devOptional": true,
"peer": true,
"engines": {
"node": ">=4.0"

View File

@ -18,7 +18,12 @@
"pinia": "^2.1.7",
"vue": "^3.4.15",
"vue-router": "^4.2.5",
"vue3-seamless-scroll": "^2.0.1"
"vue3-seamless-scroll": "^2.0.1",
"amfe-flexible": "^2.2.1",
"less": "^4.2.0",
"less-loader": "^12.2.0",
"moment": "^2.30.1",
"postcss-pxtorem": "^6.1.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.3",

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -2,7 +2,9 @@
</script>
<template>
<div id="app">
<router-view />
</div>
</template>
<style scoped>

View File

@ -1,15 +1,15 @@
import { get, post, download, uploadFile } from './request'
// 导入业务统计接口
export const ImportBusinessStatistics = (params) => {
return uploadFile('/api/ImportBusinessStatistics', params)
import { get, post, download, upload } from './request'
//上传文件接口
export const UploadTextFile = (url,params) => {
return upload('/api/Upload'+url, params)
}
// 下载业务统计接口
export const DownloadBusinessStatistics = (params) => {
return download('/api/DownloadBusinessStatistics', params)
export const DownloadText = (params) => {
return download('/api/DownloadText', params)
}
// 获取表格分页接口
export const GetBusinessStatisticsList = (params) => {
return get('/api/GetBusinessStatisticsList', params)
export const GetTextList = (params) => {
return get('/api/GetTextList', params)
}
// 地图页获取业务统计接口
export const GetBusinessStatistics = (params) => {
@ -19,3 +19,20 @@ export const GetBusinessStatistics = (params) => {
export const DownloadTemplate = (params) => {
return download('/api/DownloadTemplate', params)
}
//新增文本
export const AddText = (params) => {
return post('/api/AddText', params)
}
//删除文本接口
export const DeleteText = (params) => {
return get('/api/DeleteText', params)
}
//获取单条文本数据
export const GetTextDetails = (params) => {
return get('/api/GetTextDetails', params)
}
//编辑文本
export const EditText = (params) => {
return post('/api/EditText', params)
}

View File

@ -4,3 +4,8 @@ import { get, post, download, uploadFile } from './request'
export const apiLogin = (params) => {
return post('/api/Login', params)
}
//修改密码
export const ChangePassword = (params) => {
return post('/api/ChangePassword', params)
}

View File

@ -0,0 +1,24 @@
import { get, post, download, upload } from './request'
// 获取人员管理分页接口
export const GetPersonnelList = (params) => {
return get('/api/GetPersonnelList', params)
}
//新增人员接口
export const AddPersonnel = (params) => {
return post('/api/AddPersonnel', params)
}
//删除人员接口
export const DeletePersonnel = (params) => {
return get('/api/DeletePersonnel', params)
}
//获取单条数据接口
export const GetPersonnelDetails = (params) => {
return get('/api/GetPersonnelDetails', params)
}
//编辑人员接口
export const EditPersonnel = (params) => {
return post('/api/EditPersonnel', params)
}

View File

@ -1,9 +1,7 @@
import axios from 'axios'
// import { useRouter } from 'vue-router'
import { ElMessageBox, ElMessage } from "element-plus";
// 带cookie请求
axios.defaults.headers.post['Content-Type'] = 'application/json'
const http = axios.create({
// baseURL: 'http://admin.umayle.com'
baseURL: `${import.meta.env.VITE_BASE_URL}`
@ -22,17 +20,27 @@ http.interceptors.request.use(
return err
}
)
// const router = useRouter()
// // response 错误统一处理
http.interceptors.response.use(
res => {
return res.data
},
err => {
console.log('接口访问失败')
if (err.response.status === 401) {
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
window.parent.loginAgain()
localStorage.clear();
}).catch(() => {
});
}
// localStorage.removeItem('token')
// router.push('/Login')
return err
// return err
}
)

34
src/api/schedule.js Normal file
View File

@ -0,0 +1,34 @@
import { get, post, download, upload } from './request'
//查询排班列表接口
export const GetSchedulingList = (params) => {
return get('/api/GetSchedulingList', params)
}
//获取人员数据接口
export const GetPersonnel = (params) => {
return get('/api/GetPersonnel', params)
}
//新增排版列表接口
export const AddScheduling = (params) => {
return post('/api/AddScheduling', params)
}
//删除排班接口
export const DeleteScheduling = (params) => {
return get('/api/DeleteScheduling', params)
}
//获取单条数据
export const GetSchedulingDetails = (params) => {
return get('/api/GetSchedulingDetails', params)
}
//修改排班列表接口
export const EditScheduling = (params) => {
return post('/api/EditScheduling', params)
}
//发布状态
export const ReleaseScheduling = (params) => {
return get('/api/ReleaseScheduling', params)
}

12
src/assets/font.css Normal file
View File

@ -0,0 +1,12 @@
@font-face {
font-family: "庞门正道";
src: url('./font/庞门正道.ttf');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "PingFang SC";
src: url('./font/PingFang Medium_1.ttf');
font-weight: normal;
font-style: normal;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

BIN
src/assets/imgs/alarm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
src/assets/imgs/cpu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
src/assets/imgs/dian.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/assets/imgs/foot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
src/assets/imgs/monitor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
src/assets/imgs/on-line.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
src/assets/imgs/reign.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

BIN
src/assets/imgs/reignBg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

BIN
src/assets/imgs/title.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

BIN
src/assets/imgs/video.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 835 KiB

BIN
src/assets/login/Login1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@ -1,76 +1,74 @@
<template lang="">
<div class="tag-list">
<el-tag v-for="(tag,index) in tagsList" :key="tag.name" closable :class="{'isActive':tagsActiveIndex===index}"
@click="tagClick(tag,index)" @close="tagClose(index)">
<div class="tag-list"> <el-tag v-for="(tag,index) in tagsList" :key="tag.name" closable
:class="{'isActive':tagsActiveIndex===index}" @click="tagClick(tag,index)"
@close="tagClose(index)">
{{ tag.name }}
</el-tag>
</div>
</el-tag> </div>
</template>
<script setup>
import { useRoute, useRouter } from 'vue-router'
import { watch, ref } from 'vue'
const route = useRoute()
const router = useRouter()
const tagsList = ref([])
const tagsActiveIndex = ref(1)
import { useRoute, useRouter } from "vue-router";
import { watch, ref } from "vue";
const route = useRoute();
const router = useRouter();
const tagsList = ref([]);
const tagsActiveIndex = ref(1);
const tagClick = (item, index) => {
router.push(item.path)
tagsActiveIndex.value = index
}
router.push(item.path);
tagsActiveIndex.value = index;
};
const tagClose = (index) => {
const _path = tagsList.value[tagsActiveIndex.value].path
tagsList.value.splice(index, 1)
const _path = tagsList.value[tagsActiveIndex.value].path;
tagsList.value.splice(index, 1);
if (tagsActiveIndex.value === index) {
tagsActiveIndex.value = index > 0 ? index - 1 : 1
router.push(tagsList.value[tagsActiveIndex.value].path)
tagsActiveIndex.value = index > 0 ? index - 1 : 1;
router.push(tagsList.value[tagsActiveIndex.value].path);
} else {
const hasIndex = tagsList.value.findIndex((v) => v.path === _path)
tagsActiveIndex.value = hasIndex
const hasIndex = tagsList.value.findIndex((v) => v.path === _path);
tagsActiveIndex.value = hasIndex;
}
}
};
watch(
() => route,
(newValue, oldValue) => {
const hasIndex = tagsList.value.findIndex((v) => v.path === newValue.path)
if (hasIndex < 0 && newValue.meta.title !== '') {
const hasIndex = tagsList.value.findIndex((v) => v.path === newValue.path);
if (hasIndex < 0 && newValue.meta.title !== "") {
tagsList.value.push({
name: newValue.meta.title,
path: newValue.path
})
tagsActiveIndex.value = tagsList.value.length - 1
path: newValue.path,
});
tagsActiveIndex.value = tagsList.value.length - 1;
} else {
// tagsActiveIndex.value = hasIndex;
}
},
{ immediate: true, deep: true }
)
);
</script>
<style lang="scss" scoped>
.tag-list {
.el-tag{
background: rgba(69, 85, 82, 0.10);
color:rgba(69, 85, 82, 1);
.el-tag {
background: rgba(69, 85, 82, 0.1);
color: rgba(69, 85, 82, 1);
margin-right: 10px;
cursor: pointer;
&.isActive {
background: rgba(69, 85, 82, 0.10);
color:rgba(69, 85, 82, 1);
::v-deep{
.el-icon{
color:rgba(69, 85, 82, 1);
background: rgba(69, 85, 82, 0.1);
color: rgba(69, 85, 82, 1);
::v-deep {
.el-icon {
color: rgba(69, 85, 82, 1);
}
}
}
}
}
:deep(.el-tag__close){
color:rgba(69, 85, 82, 1) !important;
:deep(.el-tag__close) {
color: rgba(69, 85, 82, 1) !important;
}
:deep(.el-tag__close:hover){
:deep(.el-tag__close:hover) {
background-color: transparent !important;
}
</style>

View File

@ -1,34 +1,125 @@
<script setup>
import { ref } from 'vue'
import { ArrowDown } from '@element-plus/icons-vue'
import { ElMessageBox } from 'element-plus'
import mock from '@/router/menu/index.js'
import Tab from './Tab.vue'
import { useRouter } from 'vue-router'
const router = useRouter()
import { ref, computed, reactive, getCurrentInstance, onMounted } from "vue";
import { ArrowDown } from "@element-plus/icons-vue";
import { ElMessageBox, ElMessage } from "element-plus";
import mock from "@/router/menu/index.js";
import Tab from "./Tab.vue";
import { useRouter, useRoute } from "vue-router";
import { ChangePassword } from "@/api/index.js";
import JSEncrypt from "jsencrypt";
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
const activeMenu = computed(() => {
const { meta, path } = route;
// if set path, the sidebar will highlight the path you set
if (meta.sort) {
return meta.sort - 1;
}
return path;
});
// import useUserStore from '@/store/index.js'
// const userStore = useUserStore()
//
const isCollapse = ref(false)
const isCollapse = ref(false);
//
const form = reactive({});
const dialogToLead = ref(false);
const rules = reactive({
LoginName: [
{
required: true,
message: "请输入用户名",
trigger: "change",
},
],
OldPassword: [
{
required: true,
message: "请输入旧密码",
trigger: "change",
},
],
NewPassword: [
{
required: true,
message: "请输入新密码",
trigger: "change",
},
],
});
const encryptor = ref(null);
const handleOpen = (key, keyPath) => {
console.log(key, keyPath)
}
console.log(key, keyPath);
};
const handleClose = (key, keyPath) => {
console.log(key, keyPath)
}
console.log(key, keyPath);
};
// 退
function loginOut () {
ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
function loginOut() {
ElMessageBox.confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
router.push('/Login')
})
localStorage.clear();
router.push("/");
});
}
function loginAgain() {
router.push("/");
}
//
function changePassword() {
(form.LoginName = ""), (form.OldPassword = ""), (form.NewPassword = "");
dialogToLead.value = true;
}
//
function cancel() {
(form.LoginName = ""), (form.OldPassword = ""), (form.NewPassword = "");
dialogToLead.value = false;
}
function submitUpload() {
let paramsData = {
LoginName: form.LoginName,
OldPassword: encryptor.value.encrypt(form.OldPassword),
NewPassword: encryptor.value.encrypt(form.NewPassword),
};
proxy.$refs["formData"].validate((valid) => {
if (valid) {
ChangePassword(paramsData)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
ElMessage({
message: "修改密码成功,请重新登录",
type: "success",
});
router.push("/");
} else {
ElMessage({
message: res.data,
type: "warning",
});
}
})
.catch((err) => {
console.log(err);
});
}
});
}
onMounted(() => {
encryptor.value = new JSEncrypt(); //
const pubKey =
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmIZgs2im/ZaxPeQC1dvLGh8lBpmnknjpcjwk6G9zNVKHaVz/hKkcT+yquZjjcFD5Va8GpyrIBpA+EVSVN6pPwqqtmDNjiY9VTo3PPbhN5H43dyJDgm+h+/lAeoxe2r4NWveYNUNABp+nC0HWqc+cAt8EsjshpEbjI6mS9UubZoHrQWABw1Cm5PM4FaJreI1GduzUsfeFXC6TrsEEEjzWjjAUPh8XkCmlpyzXiCo+A3zbYRX2/Lu14jnsaQM6+y7KjdpH3pDEGpZyat3oFXX/KbSfnr4khUxy4jJH/lkqh6FcQWQbA43QVIgJ41ZSAGsjt2r0TicTYfRtI3HdCBcIVwIDAQAB";
encryptor.value.setPublicKey(pubKey);
window.loginAgain = loginAgain;
});
</script>
<template>
@ -36,8 +127,7 @@ function loginOut () {
<el-container class="layout">
<el-header>
<el-header>
<div class="img">
</div>
<div class="img"></div>
<div class="Administrator">
<el-dropdown trigger="click">
<span class="el-dropdown-link">
@ -46,6 +136,7 @@ function loginOut () {
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="changePassword">修改密码</el-dropdown-item>
<el-dropdown-item @click="loginOut">退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
@ -58,32 +149,41 @@ function loginOut () {
<aside>
<div class="Sidebar">
<el-menu
:default-active="activeMenu.toString()"
class="el-menu-vertical-demo"
:collapse="isCollapse"
@open="handleOpen"
@close="handleClose"
>
<template v-for="(firstItem, firstI) in mock" :key="firstI">
<el-menu-item
:index="String(firstI)"
@click="$router.push(firstItem.path)"
>
<template #title>{{ firstItem.meta.title }}</template>
</el-menu-item>
</template>
</el-menu>
<!-- <el-menu
default-active="0"
class="el-menu-vertical-demo"
:collapse="isCollapse"
@open="handleOpen"
@close="handleClose"
>
<!-- <el-menu-item :index="String(0)" @click="$router.push(mock[0].path)">
<template #title>
<i :class="['iconfont', mock[0].meta.icon]"></i>
<span>{{ mock[0].meta.title }}</span>
</template>
</el-menu-item>
<el-menu-item :index="String(1)" @click="$router.push(mock[1].path)">
<template #title>
<i :class="['iconfont', mock[1].meta.icon]"></i>
<span>{{ mock[1].meta.title }}</span>
</template>
</el-menu-item> -->
</el-menu-item>
<el-menu-item :index="String(0)" @click="$router.push(mock[0].path)">
<template #title>
<i :class="['iconfont', mock[0].meta.icon]"></i>
<span>{{ mock[0].meta.title }}</span>
</template>
</el-menu-item>
</el-menu>
</el-menu> -->
</div>
</aside>
</el-aside>
@ -92,24 +192,41 @@ function loginOut () {
<Tab></Tab>
</div>
<el-main>
<router-view/>
<router-view />
</el-main>
</el-container>
</el-container>
</el-container>
</section>
<el-dialog v-model="dialogToLead" title="修改密码" style="width: 25%; height: 35%">
<el-form :model="form" :rules="rules" label-width="80px" ref="formData">
<el-form-item label="用户名" prop="LoginName">
<el-input v-model="form.LoginName" placeholder="请输入用户名" clearable />
</el-form-item>
<el-form-item label="旧密码" prop="OldPassword">
<el-input v-model="form.OldPassword" placeholder="请输入旧密码" clearable />
</el-form-item>
<el-form-item label="新密码" prop="NewPassword">
<el-input v-model="form.NewPassword" placeholder="请输入新密码" clearable />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitUpload"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<style scoped lang="scss">
.common-layout{
.common-layout {
width: 100vw;
height: 100vh;
overflow: hidden;
}
.layout{
.layout {
width: 100%;
height: 100%;
}
.el-menu{
.el-menu {
border: none;
}
.el-header {
@ -117,62 +234,63 @@ function loginOut () {
height: 60px;
background-color: white;
padding: 0;
// .img {
// width: 126px;
// height: 37px;
// margin-top: 5px;
// margin-left: 10px;
// background: url("../assets/menu/logo.png") no-repeat;
// background-size: 100% 100%;
// }
// .img {
// width: 126px;
// height: 37px;
// margin-top: 5px;
// margin-left: 10px;
// background: url("../assets/menu/logo.png") no-repeat;
// background-size: 100% 100%;
// }
}
.ContainerConent{
.ContainerConent {
width: 100%;
height: calc(100% - 60px);
background-color: rgba(246, 249, 248, 1);
}
.el-aside{
.el-aside {
width: 200px;
height: 100%;
background-color: #fff;
}
.mainContent{
.mainContent {
width: 100%;
height: 100%;
display: block;
padding:17px 20px;
padding: 17px 20px;
}
.Tool{
.Tool {
width: 100%;
height: 24px;
.el-tabs{
.el-tabs {
width: 100%;
height: 24px;
}
:deep(.el-tabs__header){
border:none !important;
:deep(.el-tabs__header) {
border: none !important;
}
:deep(.el-tabs__item ){
:deep(.el-tabs__item) {
width: 88px;
height: 24px;
background-color: rgba(69, 85, 82, 0.10);
background-color: rgba(69, 85, 82, 0.1);
}
}
.el-main{
.el-main {
padding: 0;
height: calc(100% - 34px);
width: 100%;
margin-top:16px ;
margin-top: 16px;
overflow: hidden;
}
.el-menu-item.is-active{
color: #0D867F;
.el-menu-item.is-active {
color: rgb(0,122,252);
background: rgb(236, 245, 255);
}
.iconfont{
.iconfont {
margin-right: 16px;
}
.Administrator{
.Administrator {
float: right;
height: 100%;
display: flex;
@ -181,12 +299,12 @@ function loginOut () {
margin-right: 40px;
cursor: pointer;
}
:deep(.el-dropdown-link){
border: none!important;
}
:deep(.el-dropdown-link){
border: none!important;
}
:deep(.el-dropdown-link) {
border: none !important;
}
:deep(.el-dropdown-link) {
border: none !important;
}
:deep(.example-showcase .el-dropdown-link) {
cursor: pointer;
color: var(--el-color-primary);

View File

@ -8,5 +8,40 @@ import './style/reset.css'
import './assets/fonts/index.css'
import store from '@/store'
import vue3SeamlessScroll from 'vue3-seamless-scroll'
import 'amfe-flexible'; // 引入 lib-flexible
import "./assets/font.css"
// 引入格式化时间工具
import moment from 'moment';
moment.locale('zh-cn');
// // 动态调整根字体大小的函数
const updateRootFontSize = () => {
const baseSize = 16; // 基准字体大小
// const minFontSize = 12; // 最小字体大小
// const maxFontSize = 25; // 最大字体大小
const designHeight = 1080; // 设计稿的宽度基准
const clientHeight = document.documentElement.clientHeight; // 当前窗口的宽度
const scale = clientHeight / designHeight; // 计算当前窗口宽度与设计稿宽度的比例
let newSize = baseSize * scale * 12;
// 限制字体大小在最小和最大范围内
// if (newSize < minFontSize) {
// newSize = minFontSize;
// } else if (newSize > maxFontSize) {
// newSize = maxFontSize;
// }
createApp(App).use(router).use(store).use(vue3SeamlessScroll).use(ElementPlus, { locale: zhCN }).mount('#app')
// 设置根元素的字体大小
document.documentElement.style.fontSize = `${newSize}px`;
};
// 监听窗口大小变化,并动态调整字体大小
window.addEventListener('resize', updateRootFontSize);
// 初始化时立即设置一次字体大小
updateRootFontSize();
const app = createApp(App);
app.config.globalProperties.$moment = moment
app.use(router)
app.use(store)
app.use(vue3SeamlessScroll)
app.use(ElementPlus, { locale: zhCN })
app.mount('#app')
// createApp(App).use(router).use(store).use(vue3SeamlessScroll).use(ElementPlus, { locale: zhCN }).mount('#app')

View File

@ -1,16 +1,22 @@
import { createRouter, createWebHashHistory } from 'vue-router'
import Index from '../views/largeScreen/index.vue'
// 引入其他组件...
const routes = [
{
path: '/',
name: '',
redirect: '/TrainingManage'
redirect: '/login'
},
{
path: '/login',
name: 'Login',
component: () => import('@/views/login/index.vue')
},
{
path: '/index',
name: 'Index',
component: Index
},
{
path: '/TrainingManage',
name: 'TrainingManage',
@ -18,14 +24,30 @@ const routes = [
redirect: '/TrainingManage',
children: [
{
path: '/schedule',
component: () => import('@/views/schedule/index.vue'),
meta: { sort: 1, title: '排班表管理', icon: '' }
},
{
path: '/cameraManagement',
component: () => import('@/views/cameraManagement/index.vue'),
meta: { sort: 2, title: '摄像头管理', icon: '' }
},
{
path: '/TrainingManage',
component: () => import('@/views/TrainingManage/index.vue'),
meta: { sort: 5, title: '文本管理', icon: '' }
}
meta: { sort: 3, title: '文本管理', icon: '' }
},
{
path: '/personnelManagement',
component: () => import('@/views/personnelManagement/index.vue'),
meta: { sort: 4, title: '人员管理', icon: '' }
},
]
}
},
]
const router = createRouter({

View File

@ -1,9 +1,20 @@
// import {ref} from "vue";
export default [
{
path: 'schedule',
meta: { sort: 1, title: '排班表管理', icon: 'icon-chengji' }
},
{
path: 'cameraManagement',
meta: { sort: 2, title: '摄像头管理', icon: 'icon-chengji' }
},
{
path: 'TrainingManage',
meta: { sort: 1, title: '文本管理', icon: 'icon-chengji' }
meta: { sort: 3, title: '文本管理', icon: 'icon-chengji' }
},
{
path: 'personnelManagement',
meta: { sort: 4, title: '人员管理', icon: 'icon-chengji' }
}
]

78
src/style.css Normal file
View File

@ -0,0 +1,78 @@
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
width: 100vw; /* 视口宽度 */
height: 100vh; /* 视口高度 */
overflow: hidden; /* 防止内容溢出 */
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

View File

@ -107,13 +107,16 @@ section {
display: block;
}
body {
line-height: 1;
line-height: 1.5;
font-weight: 400;
width: 100vw;
height: 100vh;
font-family: "Microsoft YaHei", "PingFangSC-Regular", "Helvetica Neue",
"Helvetica", "Hiragino Sans GB", "SimSun", "sans-serif";
font-size: 14px;
overflow: hidden;
display: flex;
place-items: center;
}
ol,
ul {
@ -135,8 +138,21 @@ table {
border-spacing: 0;
}
#app {
width: 100%;
height: 100%;
width: 100vw;
height: 100vh;
overflow: hidden;
}
.dialog-footer{
display: flex;
justify-content: flex-end;
/* padding-top: 80px; */
top: 85%;
position: absolute;
right: 4%;
}
.el-table__body-wrapper{
overflow: auto;
position: relative;
flex: none;
height: 660px !important;
}

View File

@ -3,13 +3,27 @@
<div class="WebToolbar">
<div class="FormComponent">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="时间">
<el-date-picker v-model="form.StatisticsTime" value-format="YYYY-MM-DD" type="date" placeholder="请选择时间" />
<el-form-item label="文本名称">
<el-input
v-model="formInline.TextName"
placeholder="请输入文本名称"
clearable
/>
</el-form-item>
<el-form-item label="上传时间">
<el-date-picker
v-model="formInline.time"
value-format="YYYY-MM-DD"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
</el-form>
</div>
<div class="ButtonAssembly">
<el-button style="color: #fff" @click="queryData()">
<el-button style="color: #fff" @click="queryData">
<img src="../../assets/menu/search.png" alt="" />
<span>查询</span>
</el-button>
@ -23,32 +37,52 @@
<div class="actionBar">
<h1>文本列表</h1>
<div class="Worktop">
<el-button class="BlueBack" @click="dialogToLead = true">
<!-- <img src="../../../assets/menu/toLead.png" alt=""/> -->
<span>新增</span>
</el-button>
</div>
<el-button class="BlueBack" @click="addBtn" :icon="Plus">
新增
</el-button>
</div>
</div>
<div class="ExaminationForm">
<el-table
ref="multipleTableRef"
:data="tableData"
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" />
<el-table-column label="序号" type="index" :index="indexMethod" width="60px"/>
<el-table-column property="StatisticsTime" label="表时间" />
<el-table-column property="CreateTime" label="创建时间" />
<el-table-column property="" label="操作">
<el-table ref="multipleTableRef" :data="tableData" style="width: 100%">
<el-table-column
label="序号"
type="index"
:index="indexMethod"
width="80px"
align="center"
/>
<el-table-column property="TextName" label="文本名称" align="center" />
<el-table-column property="FounderName" label="创建人" align="center" />
<el-table-column property="TextPath" label="文本链接" align="center" />
<el-table-column property="UploadTime" label="上传时间" align="center" />
<el-table-column property="" label="操作" align="center">
<template v-slot="scope">
<el-button @click="handleDown(scope.row)">下载</el-button>
<el-button
@click="handleDown(scope.row)"
:icon="Download"
size="mini"
type="text"
>下载</el-button
>
<el-button
size="mini"
type="text"
:icon="Edit"
@click="handleUpdate(scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="text"
:icon="Delete"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
v-model:current-page="InlineForm.PageIndex"
:current-page="InlineForm.PageIndex"
:page-size="InlineForm.PageSize"
:small="small"
:disabled="disabled"
@ -62,9 +96,14 @@
</div>
</div>
<!-- 新增 -->
<el-dialog v-model="dialogToLead" title="新增" style="width:30%;height:50%" >
<el-form-item label="上传:" prop="SoftwareName">
<!-- 新增 -->
<el-dialog v-model="dialogToLead" :title="title" style="width: 25%; height: 35%">
<el-form :model="form" :rules="rules" label-width="80px" ref="formData">
<el-form-item label="文本名称" prop="TextName">
<!-- <el-input v-model="form.TextName" placeholder="请输入文本名称" clearable /> -->
<el-input v-model="form.TextName" placeholder="请输入文本名称" clearable />
</el-form-item>
<el-form-item label="文本上传" prop="textFile">
<el-upload
ref="uploadRef"
action="#"
@ -74,223 +113,366 @@
:limit="1"
:on-exceed="handleExceed"
:before-remove="handleRemove"
:file-list="uploadFile"
>
<template #trigger>
<el-button type="primary" >选择</el-button>
<el-button type="primary">点击上传</el-button>
</template>
<el-button class="ml-3" type="success" @click="submitUpload"> 上传 </el-button>
<!-- <el-button type="success" @click="submitUpload"> 点击上传 </el-button> -->
</el-upload>
</el-form-item>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitUpload"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script setup>
import { ref, reactive, onMounted, nextTick, getCurrentInstance } from 'vue'
import { ElTable, ElMessageBox, ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'
import { ref, reactive, onMounted, nextTick, getCurrentInstance } from "vue";
import { ElTable, ElMessageBox, ElMessage } from "element-plus";
import { Download, Delete, Edit, Search,Plus } from "@element-plus/icons-vue";
import { useRouter } from "vue-router";
import {
ImportBusinessStatistics,
DownloadBusinessStatistics,
GetBusinessStatisticsList,
DownloadTemplate
} from '@/api/file.js'
UploadTextFile,
DownloadText,
GetTextList,
DownloadTemplate,
AddText,
DeleteText,
GetTextDetails,
EditText,
} from "@/api/file.js";
const formInline = reactive({
// StatisticsId: '',
StatisticsTime: '',
PageIndex: 1,
PageSize: 10
})
PageSize: 10,
TextName: "",
time: [],
});
const resetFormInline = () => {
// formInline.StatisticsId = ''
formInline.StatisticsTime = ''
getTable()
// for (const key in formInline) {
// if ( key !== 'PageIndex' || key !== 'PageIndex' ) formInline[key] = ''
// }
}
(formInline.PageIndex = 1),
(formInline.PageSize = 10),
(formInline.TextName = ""),
(formInline.time = []);
getTable();
};
//
const indexMethod = (index) => {
return index + 1
}
return index + 1;
};
//
const formRef = ref(null)
const dialogFormVisible = ref(false)
function handleCreate () {
dialogFormVisible.value = true
const dialogFormVisible = ref(false);
function handleCreate() {
dialogFormVisible.value = true;
}
const formLabelWidth = '150px'
const value1 = ref('')
const value2 = ref('')
const formLabelWidth = "150px";
const state = reactive({
rules: {},
scenemList: [],
platformAreaList: [],
lineList: []
})
const form = reactive({
EnterpriseName: '',
DistrictCode: '',
EnterpriseCode: '',
ModelName: '',
VersionNumber: '',
MapLongitude: '',
MapLatitude: '',
TrainingSize: '',
ModelResourcesPath: '',
ModelResources: '',
UpdateTime: ''
})
lineList: [],
});
const form = reactive({});
//
onMounted(() => {
getTable()
})
getTable();
});
//
const total = ref(0)
const tableData = ref([])
const total = ref(0);
const tableData = ref([]);
const rules = ref({
TextName: [
{
required: true,
message: "请输入文本名称",
trigger: "change",
},
],
});
const queryData = () => {
formInline.PageIndex = 1
getTable()
}
formInline.PageIndex = 1;
getTable();
};
const getTable = async () => {
let formParams = {
PageIndex: InlineForm.PageIndex,
PageSize: InlineForm.PageSize,
TextName: formInline.TextName,
StartTime: formInline.time != null ? formInline.time[0] : "",
EndTime: formInline.time != null ? formInline.time[1] : "",
};
try {
const { code, data } = await GetBusinessStatisticsList({
...formInline
})
const { code, data } = await GetTextList({
...formParams,
});
if (code === 0) {
console.log('data', data)
total.value = data.total
tableData.value = data.list
total.value = data.total;
tableData.value = data.list;
} else {
total.value = 0
tableData.value = []
total.value = 0;
tableData.value = [];
}
} catch (error) {}
}
//
// const handleDownloadUser = () => {
// DownloadTemplate({ FileName: 'Upload/Excel/.xlsx' }).then(res => {
// // console.log(res, 'res--')
// const b = new Blob([res])
// const url = window.URL.createObjectURL(b)
// const a = document.createElement('a')
// a.href = url
// a.download = '.xlsx'
// document.body.appendChild(a)
// a.click()
// window.URL.revokeObjectURL(url)
// })
// }
};
//
const uploadRef = ref()
const uploadRef = ref();
const handleChange = (file, fileList) => {
// uploadRef.value.clearFiles()
console.log(uploadRef.value)
}
loadSize(file.raw);
};
const handleExceed = (files) => {
uploadRef.value.clearFiles()
nextTick(() => {
uploadRef.value.handleStart(files[0])
})
}
const uploadFile = ref({})
uploadRef.value.clearFiles();
uploadRef.value.handleStart(files[0]);
});
};
const uploadFile = ref([]);
const title = ref("");
const submitUpload = () => {
uploadRef.value.submit()
}
//
const { proxy } = getCurrentInstance()
const handleRemove = (file, fileList) => {}
const toUpload = async (param) => {
// if (!uploadRef.value) return ElMessage.error('')
const formData = new FormData()
uploadFile.value = param.file
console.log(param.file, ' param.file')
formData.append('Files', param.file)
console.log(formData, ' param')
await ImportBusinessStatistics(formData).then((res) => {
if (res.code === 0) {
proxy.$refs["formData"].validate((valid) => {
// uploadRef.value.submit();
if (valid) {
if (title.value == "新增文本") {
let paramsData = {
TextName: form.TextName,
TextPath: form.TextPath,
FounderId:localStorage.getItem('ReviewerId'),
FounderName:localStorage.getItem('Reviewer'),
};
AddText(paramsData)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
ElMessage({
message: '上传成功',
type: 'success'
})
// // DOM
getTable()
setTimeout(() => {
dialogToLead.value = false
proxy.$refs.uploadRef.handleRemove(param.file)
}, 600)
message: "新增成功",
type: "success",
});
getTable();
} else {
ElMessage.error(res?.data || '操作失败')
ElMessage({
message: "新增失败",
type: "warning",
});
}
})
}
const multipleTableRef = ref()
const multipleSelection = ref([])
const handleSelectionChange = (val) => {
if (val.length > 1) {
multipleTableRef.value.clearSelection()
multipleTableRef.value.toggleRowSelection(val.pop())
.catch((err) => {
console.log(err);
});
} else {
// this.currentRow = val.pop();
multipleSelection.value = val
let paramsData = {
TextId: form.TextId,
TextName: form.TextName,
TextPath: form.TextPath,
};
EditText(paramsData)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
getTable();
ElMessage({
message: "修改成功",
type: "success",
});
} else {
ElMessage({
message: "修改失败",
type: "warning",
});
}
}
const textarea = ref('')
const small = ref(false)
const background = ref(false)
const disabled = ref(false)
})
.catch((err) => {
console.log(err);
});
}
}
});
};
const { proxy } = getCurrentInstance();
const handleRemove = (file, fileList) => {};
const toUpload = async (param) => {
console.log(param, "文件参数");
proxy.$refs.uploadRef.handleRemove(param.file);
// if (!uploadRef.value) return ElMessage.error('')
};
const multipleTableRef = ref();
const small = ref(false);
const background = ref(false);
const disabled = ref(false);
//
const InlineForm = reactive({
PageIndex: 1,
PageSize: 10
})
PageSize: 10,
});
const handleSizeChange = (val) => {
// console.log(`${val} items per page`)
formInline.PageSize = val
getTable()
}
const dialogToLead = ref(false)
// console.log(`${val} items per page`)
InlineForm.PageSize = val;
getTable();
};
const dialogToLead = ref(false);
const handleCurrentChange = (val) => {
// console.log(`current page: ${val}`)
formInline.PageIndex = val
getTable()
}
const StatisticsId = ref('')
InlineForm.PageIndex = val;
getTable();
};
//
const handleDown = (row) => {
// fileListFile.value = ref([])
// const fileListFile1 = ref([])
DownloadBusinessStatistics({ StatisticsId: row.StatisticsId }).then(res => {
//
let fileExtension = row.TextPath.split("/").pop().split("~")[0];
DownloadText({ TextId: row.TextId }).then((res) => {
// console.log(res, 'res--')
const bNE = new Blob([res])
const urlNE = window.URL.createObjectURL(bNE)
const aNE = document.createElement('a')
aNE.href = urlNE
aNE.download = '业务统计表.xlsx'
document.body.appendChild(aNE)
aNE.click()
window.URL.revokeObjectURL(urlNE)
})
}
//
const closeDialog = () => {
for (const key in form) {
form[key] = ''
const bNE = new Blob([res]);
const urlNE = window.URL.createObjectURL(bNE);
const aNE = document.createElement("a");
aNE.href = urlNE;
aNE.download = fileExtension;
document.body.appendChild(aNE);
aNE.click();
window.URL.revokeObjectURL(urlNE);
});
};
//
function handleDelete(row) {
let paramsData = {
TextId: row.TextId,
};
ElMessageBox.confirm("确定要删除吗?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
DeleteText(paramsData)
.then((res) => {
if (res.code == 0) {
ElMessage({
message: "删除成功",
type: "success",
});
getTable();
} else {
ElMessage.error(res?.data || "删除失败");
}
StatisticsId.value = ''
dialogFormVisible.value = false
})
.catch((err) => {
console.log(err);
});
});
}
//
function addBtn() {
form.TextName = "";
title.value = "新增文本";
dialogToLead.value = true;
nextTick(() => {
if (proxy.$refs.uploadRef.clearFiles() != undefined ) {
proxy.$refs.uploadRef.clearFiles();
}
});
}
//
function handleUpdate(row) {
uploadFile.value = [];
let paramsData = {
TextId: row.TextId,
};
title.value = "修改文本";
GetTextDetails(paramsData)
.then((res) => {
if (res.code == 0) {
let fileExtension = res.data.TextPath.split("/").pop().split("~")[0];
form.TextName = res.data.TextName;
form.TextId = res.data.TextId;
form.TextPath = res.data.TextPath;
uploadFile.value.push({ name: fileExtension });
dialogToLead.value = true;
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function cancel() {
form.TextName = "";
// uploadFile.value = null;
dialogToLead.value = false;
}
//
const S4 = () => {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
};
const guid = () => {
return S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4();
};
//
const loadSize = (file) => {
const size = file.size; //
const maxZrea = 8; // MB
const bufferSize = maxZrea * (1024 * 1024);
const fileStart = ref(0);
const fileEnd = bufferSize;
//
const fileStartValue = fileStart.value;
const fileEndValue = fileEnd;
console.log(fileStartValue, "fileStart");
const state = reactive({
items: [],
});
const arrFile = ref([]);
if (fileStartValue < size) {
const fileInfo = reactive({
File: file.slice(fileStartValue, fileEndValue),
Start: fileStartValue,
End: fileEndValue,
});
state.items.push(fileInfo);
arrFile.value = state.items;
const fileStart = fileEndValue;
const fileEnd = fileStart + bufferSize;
}
const count = arrFile.value.length;
const filename = file.name + "~" + guid();
// const filename = file.name;
const paramFilename = file.name; // filename
console.log(arrFile.value, "arrFile.value");
getCover(count, filename, bufferSize, arrFile.value, size, paramFilename);
};
const getCover = async (count, filename, bufferSize, arrFile, size, paramFilename) => {
console.log(count, "count");
for (let i = 0; i < count; i++) {
const formData = new FormData();
formData.append("file", arrFile[i].File); // fileformData
const url =
"?Name=" +
filename +
"&Number=" +
i +
"&BufferSize=" +
bufferSize +
"&Count=" +
count +
"&Start=" +
arrFile[i].Start +
"&End=" +
arrFile[i].End +
"&Size=" +
size +
"&FolderName=" +
"File";
await UploadTextFile(url, formData).then((res) => {
form.TextPath = res;
// form.CoverName = paramFilename;
});
}
};
</script>
<style scoped lang="scss">
@ -323,7 +505,7 @@ const closeDialog = () => {
.ButtonAssembly {
.el-button {
width: 84px;
height: 32px;
height: 40px;
border: none;
font-weight: 400;
font-size: 14px;
@ -335,7 +517,7 @@ const closeDialog = () => {
}
}
.el-button:nth-child(1) {
background-color: #0d867f;
background-color: rgb(0,122,252);
}
.el-button:nth-child(2) {
background-color: #f2f3f5;
@ -361,16 +543,16 @@ const closeDialog = () => {
}
.Worktop {
.el-button {
border: 1px solid #0d867f;
border: 1px solid rgb(0,122,252);
font-weight: 400;
font-size: 14px;
color: #0d867f;
color: rgb(0,122,252);
}
.el-button:hover {
background-color: transparent;
}
.BlueBack {
background: #0d867f;
background: rgb(0,122,252);
border-radius: 2px 2px 2px 2px;
font-weight: 400;
font-size: 14px;
@ -383,7 +565,7 @@ const closeDialog = () => {
}
}
.BlueBack:hover {
background-color: #0d867f;
background-color: rgb(0,122,252);
}
.Delete {
background: #f2f3f5;
@ -423,12 +605,12 @@ const closeDialog = () => {
margin-top: 18px;
}
:deep(.el-pager li.is-active) {
background-color: #e7f9f8 !important;
background-color: rgb(181,216,241) !important;
font-weight: 400;
color: #0d867f !important;
color: rgb(0,122,252) !important;
}
:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
background-color: #e7f9f8 !important;
background-color: rgb(181,216,241) !important;
}
:deep(.el-select) {
@ -454,15 +636,16 @@ const closeDialog = () => {
:deep(.el-textarea__inner) {
width: 280px !important;
}
.user-name,.register{
.user-name,
.register {
cursor: pointer;
}
.functionalUnit{
.functionalUnit {
margin-left: 20px;
display: flex;
.el-button {
width: 84px;
height: 32px;
height: 40px;
border: none;
font-weight: 400;
font-size: 14px;
@ -481,51 +664,51 @@ const closeDialog = () => {
background-color: #17c85f;
}
}
.TabularTitle{
.TabularTitle {
font-size: 14px;
color: #747272;
font-weight: bold;
margin-bottom: 10px;
}
.pagination{
.pagination {
width: 100%;
height:30px;
:deep(.el-pagination){
margin-top: 9px!important;
height: 30px;
:deep(.el-pagination) {
margin-top: 9px !important;
}
}
.addSlip{
.el-button{
.addSlip {
.el-button {
border: none;
background-color: #0077aa;
margin-top: 8px;
color: #fff;
}
:deep(.el-pagination){
margin-top: 8px!important;
:deep(.el-pagination) {
margin-top: 8px !important;
}
}
.ml-3{
.ml-3 {
margin-left: 20px;
}
.upload-file-uploader{
.upload-file-uploader {
width: 50%;
}
.el-upload-list .el-upload-list__item{
.el-upload-list .el-upload-list__item {
width: 33% !important;
float: left;
margin-left: -385px;
margin-top: 25px;
margin-left: -385px;
margin-top: 25px;
:deep(.horizontal-list ul .el-upload-list__item) {
width: 33% !important;
float: left; margin-top: 25px;
}
:deep(.el-link__inner ) {
float: left;
margin-top: 25px;
}
:deep(.el-link__inner) {
display: inline-flex;
justify-content: center;
align-items: center;
width: 200px;
}
}
}
</style>

View File

@ -0,0 +1,613 @@
<template>
<div class="PageContent">
<div class="WebToolbar">
<div class="FormComponent">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="摄像头IP">
<el-input
v-model="formInline.PersonnelName"
placeholder="请输入摄像头IP"
clearable
/>
</el-form-item>
<el-form-item label="摄像头分类">
<el-select
v-model="formInline.Department"
placeholder="请选择摄像头分类"
clearable
>
<el-option
:label="v.label"
:value="v.label"
v-for="(v, i) in departmentList"
:key="i"
/>
</el-select>
</el-form-item>
<el-form-item label="摄像头状态">
<el-select
v-model="formInline.Department"
placeholder="请选择摄像头状态"
clearable
>
<el-option
:label="v.label"
:value="v.label"
v-for="(v, i) in departmentList"
:key="i"
/>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="ButtonAssembly">
<el-button style="color: #fff" @click="queryData">
<img src="../../assets/menu/search.png" alt="" />
<span>查询</span>
</el-button>
<el-button style="color: #1d2129" @click="resetFormInline">
<img src="../../assets/menu/reset.png" alt="" />
<span>重置</span>
</el-button>
</div>
</div>
<div class="Tabulation">
<div class="actionBar">
<h1>排班列表</h1>
<div class="Worktop">
<el-button class="BlueBack" @click="addBtn" :icon="Plus"> 新增 </el-button>
</div>
</div>
<div class="ExaminationForm">
<el-table ref="multipleTableRef" :data="tableData" style="width: 100%">
<el-table-column label="序号" type="index" width="80px" align="center" />
<el-table-column property="Department" label="摄像头协议" align="center" />
<el-table-column property="PersonnelName" label="摄像头类型" align="center" />
<el-table-column property="CreateTime" label="摄像头IP" align="center" />
<el-table-column property="CreateTime" label="摄像头端口" align="center" />
<el-table-column property="CreateTime" label="状态" align="center" />
<el-table-column property="CreateTime" label="创建人" align="center" />
<el-table-column property="CreateTime" label="创建时间" align="center" />
<el-table-column property="CreateTime" label="上架时间" align="center" />
<el-table-column property="" label="操作" align="center">
<template v-slot="scope">
<el-button
size="mini"
type="text"
:icon="Upload"
:disabled="scope.row.Status == '已发布'"
@click="handleRelease(scope.row)"
>发布</el-button
>
<el-button
size="mini"
type="text"
:icon="Edit"
@click="handleUpdate(scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="text"
:icon="Delete"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
:current-page="InlineForm.PageIndex"
:page-size="InlineForm.PageSize"
:small="small"
layout="total, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
<!-- 新增 -->
<el-dialog v-model="dialogToLead" :title="title" style="width: 25%; height: 35%">
<el-form :model="form" :rules="rules" label-width="80px" ref="formData">
<el-form-item label="摄像头名称" prop="Department">
<el-input
v-model="formInline.PersonnelName"
placeholder="请输入摄像头名称"
clearable
/>
</el-form-item>
<el-form-item label="摄像头协议" prop="Department">
<el-input
v-model="formInline.PersonnelName"
placeholder="请输入摄像头协议"
clearable
/>
</el-form-item>
<el-form-item label="摄像头类型" prop="PersonnelName">
<el-input
v-model="formInline.PersonnelName"
placeholder="请输入摄像头类型"
clearable
/>
</el-form-item>
<el-form-item label="摄像头IP" prop="PersonnelName">
<el-input
v-model="formInline.PersonnelName"
placeholder="请输入摄像头IP"
clearable
/></el-form-item>
<el-form-item label="摄像头端口" prop="PersonnelName">
<el-input
v-model="formInline.PersonnelName"
placeholder="请输入摄像头端口"
clearable
/></el-form-item>
<el-form-item label="所属合作方" prop="PersonnelName">
<el-input
v-model="formInline.PersonnelName"
placeholder="请输入所属合作方"
clearable
/></el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitUpload"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script setup>
import { ref, onMounted, reactive, getCurrentInstance } from "vue";
import {
GetPersonnelList,
AddPersonnel,
DeletePersonnel,
GetPersonnelDetails,
EditPersonnel,
} from "@/api/personnelManagement.js";
import { ElTable, ElMessageBox, ElMessage } from "element-plus";
import { Download, Delete, Edit, Search, Plus } from "@element-plus/icons-vue";
const { proxy } = getCurrentInstance();
//
const formInline = reactive({});
//
const InlineForm = reactive({
PageIndex: 1,
PageSize: 10,
});
//
const total = ref(0);
//
const departmentList = ref([
{
label: "后勤部",
},
{
label: "人事部",
},
{
label: "财务部",
},
]);
//
const tableData = ref([]);
//
const form = reactive({});
const rules = reactive({
PersonnelName: [
{
required: true,
message: "请输入人员名称",
trigger: "change",
},
],
Department: [
{
required: true,
message: "请选择部门",
trigger: "change",
},
],
});
//
const dialogToLead = ref(false);
//
const title = ref("");
//
function queryData() {
InlineForm.PageIndex = 1;
getList();
}
//
function resetFormInline() {
(formInline.PageIndex = 1),
(formInline.PageSize = 10),
(formInline.Department = ""),
(formInline.PersonnelName = "");
getList();
}
//
const handleSizeChange = (val) => {
InlineForm.PageSize = val;
getList();
};
const handleCurrentChange = (val) => {
InlineForm.PageIndex = val;
getList();
};
//
function getList() {
let formParams = {
PageIndex: InlineForm.PageIndex,
PageSize: InlineForm.PageSize,
PersonnelName: formInline.PersonnelName,
Department: formInline.Department,
};
GetPersonnelList(formParams)
.then((res) => {
if (res.code == 0) {
tableData.value = res.data.list;
total.value = res.data.total;
}
})
.catch((err) => {
console.log(err);
});
}
//
function addBtn() {
(form.PersonnelName = ""), (form.Department = "");
title.value = "添加人员";
dialogToLead.value = true;
}
//
function handleUpdate(row) {
let paramsData = {
PersonnelId: row.PersonnelId,
};
GetPersonnelDetails(paramsData)
.then((res) => {
if (res.code == 0) {
form.PersonnelName = res.data.PersonnelName;
form.Department = res.data.Department;
form.PersonnelId = res.data.PersonnelId;
title.value = "修改人员";
dialogToLead.value = true;
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function handleRelease(row) {
}
//
function submitUpload() {
proxy.$refs["formData"].validate((valid) => {
if (valid) {
if (title.value == "添加人员") {
AddPersonnel(form)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
ElMessage({
message: "新增成功",
type: "success",
});
getList();
} else {
ElMessage({
message: "新增失败",
type: "warning",
});
}
})
.catch((err) => {
console.log(err);
});
} else if (title.value == "修改人员") {
EditPersonnel(form)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
ElMessage({
message: "修改成功",
type: "success",
});
getList();
} else {
ElMessage({
message: "修改失败",
type: "warning",
});
getList();
}
})
.catch((err) => {
console.log(err);
});
}
}
});
}
//
function handleDelete(row) {
let paramsData = {
PersonnelId: row.PersonnelId,
};
ElMessageBox.confirm("确定要删除吗?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
DeletePersonnel(paramsData)
.then((res) => {
if (res.code == 0) {
ElMessage({
message: "删除成功",
type: "success",
});
getList();
} else {
ElMessage.error(res?.data || "删除失败");
}
})
.catch((err) => {
console.log(err);
});
});
}
//
function cancel() {
(form.PersonnelName = ""), (form.Department = "");
dialogToLead.value = false;
}
onMounted(() => {
//
getList();
});
</script>
<style lang="less" scoped>
.PageContent {
width: 100%;
height: 100%;
}
.WebToolbar {
width: 100%;
height: 72px;
background-color: #fff;
padding: 20px;
display: flex;
justify-content: space-between;
:deep(.el-form-item__content) {
width: 256px !important;
height: 32px !important;
}
:deep(.el-input) {
width: 256px !important;
}
:deep(.el-select) {
width: 256px !important;
}
:deep(.el-form-item__label) {
color: #666 !important;
}
}
.ButtonAssembly {
.el-button {
width: 84px;
height: 40px;
border: none;
font-weight: 400;
font-size: 14px;
border-radius: 2px 2px 2px 2px;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.el-button:nth-child(1) {
background-color: rgb(0, 122, 252);
}
.el-button:nth-child(2) {
background-color: #f2f3f5;
}
}
.Tabulation {
width: 100%;
height: calc(100% - 72px);
background-color: #fff;
margin-top: 14px;
padding: 20px;
.actionBar {
display: flex;
justify-content: space-between;
h1 {
font-weight: 500;
font-size: 20px;
color: #1d2129;
line-height: 28px;
font-family: Microsoft YaHei, Microsoft YaHei;
}
}
.Worktop {
.el-button {
border: 1px solid rgb(0, 122, 252);
font-weight: 400;
font-size: 14px;
color: rgb(0, 122, 252);
}
.el-button:hover {
background-color: transparent;
}
.BlueBack {
background: rgb(0, 122, 252);
border-radius: 2px 2px 2px 2px;
font-weight: 400;
font-size: 14px;
color: #ffffff;
line-height: 22px;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.BlueBack:hover {
background-color: rgb(0, 122, 252);
}
.Delete {
background: #f2f3f5;
border-radius: 2px 2px 2px 2px;
font-weight: 400;
font-size: 14px;
color: #1d2129;
line-height: 22px;
border: none;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.Delete:hover {
background-color: #f2f3f5;
}
}
.ExaminationForm {
margin-top: 16px;
background-color: #0077aa;
}
.el-table tr {
height: 41px;
}
.el-table td {
height: 41px;
}
:deep(th) {
background-color: #e5e6eb;
}
}
.el-pagination {
float: right;
background-color: #fff !important;
margin-top: 18px;
}
:deep(.el-pager li.is-active) {
background-color: rgb(181,216,241) !important;
font-weight: 400;
color: rgb(0, 122, 252) !important;
}
:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
background-color: rgb(181,216,241) !important;
}
:deep(.el-select) {
width: 280px !important;
}
:deep(.el-input) {
width: 280px !important;
}
.example {
margin-left: 20px;
color: red;
}
.backInformation {
:deep(.el-input) {
width: 280px !important;
height: 120px !important;
}
}
.dialog-footer {
width: 100%;
text-align: center;
}
:deep(.el-textarea__inner) {
width: 280px !important;
}
.user-name,
.register {
cursor: pointer;
}
.functionalUnit {
margin-left: 20px;
display: flex;
.el-button {
width: 84px;
height: 40px;
border: none;
font-weight: 400;
font-size: 14px;
border-radius: 2px 2px 2px 2px;
color: #fff;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.el-button:nth-child(1) {
background-color: #2192ba;
}
.el-button:nth-child(2) {
background-color: #17c85f;
}
}
.TabularTitle {
font-size: 14px;
color: #747272;
font-weight: bold;
margin-bottom: 10px;
}
.pagination {
width: 100%;
height: 30px;
:deep(.el-pagination) {
margin-top: 9px !important;
}
}
.addSlip {
.el-button {
border: none;
background-color: #0077aa;
margin-top: 8px;
color: #fff;
}
:deep(.el-pagination) {
margin-top: 8px !important;
}
}
.ml-3 {
margin-left: 20px;
}
.upload-file-uploader {
width: 50%;
}
.el-upload-list .el-upload-list__item {
width: 33% !important;
float: left;
margin-left: -385px;
margin-top: 25px;
:deep(.horizontal-list ul .el-upload-list__item) {
width: 33% !important;
float: left;
margin-top: 25px;
}
:deep(.el-link__inner) {
display: inline-flex;
justify-content: center;
align-items: center;
width: 200px;
}
}
</style>

View File

@ -0,0 +1,418 @@
.main {
height: 100%;
width: 100%;
font-size: 20px;
background-color: #082C48;
.top {
width: 100%;
height: 108px;
background: url("@/assets/imgs/title.png") no-repeat;
background-size: 100% 100%;
font-family: 庞门正道;
font-size: 44px;
color: #FFFFFF;
line-height: 53px;
letter-spacing: 2px;
text-shadow: 0px 0px 10px #34D1FF, 0px 3px 0px #24649A;
display: flex;
justify-content: center;
.title {
margin-top: 22px
}
}
.core {
height: calc(100% - 108px - 27px);
width: 100%;
display: flex;
justify-content: space-between;
align-items: flex-end;
padding: 0 42px 27px 42px;
box-sizing: border-box;
.left {
width: 22.42%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
.first {
width: 100%;
height: 38.7%;
display: flex;
flex-direction: column;
justify-content: space-between;
.content {
width: 92.5%;
height: 83%;
background: url(@/assets/imgs/functionInfo.png) no-repeat;
background-size: 100% 100%;
padding: 0 16px;
box-sizing: border-box;
margin-left: 14px;
.second-level-title {
font-family: 庞门正道;
font-size: 20px;
line-height: 24px;
letter-spacing: 1px;
text-align: left;
background: -webkit-linear-gradient(top, #FFFFFF, #BDDCF8);
background: linear-gradient(to bottom, #FFFFFF, #BDDCF8);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
display: flex;
justify-content: center;
margin-top: 24px
}
.functionInfo {
font-family: PingFang SC;
font-size: 16px;
color: #E9F4FF;
height: 61%;
display: flex;
flex-direction: column;
justify-content: space-between;
margin-top: 46px;
width: 100%;
.functionItem {
display: flex;
justify-content: space-between;
padding: 0 10px 0 5px;
}
}
}
}
.second {
height: calc(100% - 41.7%);
width: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
.content> :not(:first-child) {
margin-top: 19px;
}
.content::-webkit-scrollbar {
display: none;
}
.content {
width: 92.5%;
height: 89%;
display: flex;
flex-direction: column;
justify-content: flex-start;
overflow: auto;
margin-left: 14px;
.alarmItem {
background: url("@/assets/imgs/alarm.png") no-repeat;
background-size: 100% 100%;
width: 100%;
height: 108px;
padding: 2.4% 7px 9px 9px;
box-sizing: border-box;
// margin-top: 10px;
.alarmTitle {
margin-left: 12px;
font-size: 16px;
color: #FFFFFF;
display: flex;
height: 27px;
align-items: center;
}
.alarmInfo {
display: flex;
flex-direction: row;
align-items: center;
margin-top: 15px;
margin-left: 5px;
.alarmContent {
display: flex;
// flex-direction: column;
flex-wrap: wrap;
margin-left: 12px;
}
.alarmContent1 {
display: flex;
// flex-direction: column;
flex-wrap: wrap;
}
}
}
}
}
}
.center {
width: 53.1%;
height: 857px;
background: url("@/assets/imgs/topologyDiagram.png") no-repeat;
background-size: 100% 100%;
position: relative;
.cpu {
width: 12.1%;
height: 118px;
background: url("@/assets/imgs/cpu.png") no-repeat;
background-size: 100% 100%;
position: absolute;
top: 23%;
left: 62.8%;
display: flex;
flex-direction: column;
justify-content: space-evenly;
align-items: center;
.cpuItem {
display: flex;
align-items: center;
height: 34px;
.cpuName {
font-family: PingFang SC;
font-weight: 500;
font-size: 12px;
color: #E9F4FF;
}
.cpuValue {
font-family: PingFang SC;
font-weight: 600;
font-size: 24px;
color: #00EDC5;
padding: 5px;
.cpuUnit {
font-family: PingFang SC, PingFang SC;
font-weight: 600;
font-size: 16px;
color: #FFFFFF;
}
}
}
}
.lineCount {
background: url("@/assets/imgs/onlineCount.png") no-repeat;
background-size: 100% 100%;
width: 11.9%;
height: 60px;
position: absolute;
top: 58%;
left: 27.8%;
padding: 8px 28px;
box-sizing: border-box;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
.count {
font-family: PingFang SC;
font-weight: 600;
font-size: 24px;
color: #FFFFFF;
}
.text {
font-family: PingFang SC;
font-weight: 500;
font-size: 12px;
color: #E9F4FF;
white-space: nowrap;
}
}
.equipment {
width: 77%;
height: 0.3125rem;
top: 89%;
left: 18%;
position: absolute;
display: flex;
justify-content: space-between;
.equipment-lineCount {
background: url("@/assets/imgs/onlineCount.png") no-repeat;
background-size: 100% 100%;
height: 100%;
padding: 8px 28px;
box-sizing: border-box;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
.count {
font-family: PingFang SC;
font-weight: 600;
font-size: 24px;
color: #FFFFFF;
}
.text {
font-family: PingFang SC;
font-weight: 500;
font-size: 12px;
color: #E9F4FF;
white-space: nowrap;
}
}
}
}
.right {
width: 22.42%;
height: 100%;
display: flex;
flex-direction: column;
align-items: flex-end;
.monitorBg {
margin-top: 20px;
background: url("@/assets/imgs/monitorBg.png") no-repeat;
background-size: 100% 100%;
height: 240px;
width: 92.5%;
padding: 12px;
box-sizing: border-box;
margin-right: 16px;
}
.monitorStatus {
margin-top: 41px;
width: 92.5%;
display: flex;
justify-content: flex-end;
padding-right: 14px;
.online {
font-size: 12px;
color: #00DCB7;
display: flex;
align-items: center;
}
}
.monitorList::-webkit-scrollbar {
display: none;
}
.monitorList {
width: 92.5%;
margin-right: 16px;
height: 61%;
display: grid;
grid-template-columns: 31.6% 31.6% 31.6%;
gap: 14.7px 10px;
grid-auto-rows: 10%;
margin-top: 14px;
overflow: auto;
.monitorItem {
background: url(@/assets/imgs/reignBg.png) no-repeat;
background-size: 100% 100%;
width: 100%;
height: 60px;
font-family: PingFang SC;
font-size: 12px;
color: #00EDC5;
padding: 21px 17%;
box-sizing: border-box;
display: flex;
justify-content: space-between;
}
}
}
}
.foot {
width: 100%;
height: 27px;
background: url("@/assets/imgs/foot.png") no-repeat;
background-size: 100% 100%;
}
}
.first-level-title {
background: url("@/assets/imgs/firstLevelTitle.png") no-repeat;
background-size: 100% 100%;
width: 100%;
height: 40px;
font-family: 庞门正道;
font-size: 26px;
color: #fff;
span {
margin-left: 56px;
background: -webkit-linear-gradient(top, #FFFFFF, #BDDCF8);
background: linear-gradient(to bottom, #FFFFFF, #BDDCF8);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
display: inline-block;
}
}
.name {
margin-left: 10px;
}
.nameAndImg {
display: flex;
align-items: center;
}
.label {
color: #58AEF7;
font-family: PingFang SC;
font-size: 14px;
margin-left: 6px;
white-space: nowrap;
}
.value {
font-family: PingFang SC;
font-size: 14px;
color: #BDDCF8;
white-space: nowrap;
}
.detail {
display: flex;
align-items: center;
}
.monitorImg {
width: 44px;
height: 44px;
}
.alarmDetail {
width: 40%;
display: flex;
align-items: center;
}
.status {
margin-left: 8px;
}

View File

@ -0,0 +1,318 @@
<template>
<div class="main">
<div class="top">
<span class="title">阜阳变电站大屏</span>
</div>
<div class="core">
<div class="left">
<div class="first">
<div class="first-level-title" style="height: 11.3%">
<span>站所运行信息</span>
</div>
<div class="content">
<span class="second-level-title">交流220kV界首变</span>
<div class="functionInfo">
<div
v-for="(item, index) in functionList"
:key="index"
class="functionItem"
>
<div class="nameAndImg">
<img src="@/assets/imgs/dian.png" />
<span class="name">{{ item.name }}:</span>
</div>
<span :style="{ color: item.name == '安全运行' ? '#00EDC5' : '' }"
>{{ item.value }}
<span v-if="item.name == '安全运行'" style="color: #e9f4ff"></span>
</span>
<!-- <span class="value">{{ item.value }}</span> -->
</div>
</div>
</div>
</div>
<div class="second">
<div class="first-level-title" style="height: 7.6%">
<span>报警列表</span>
</div>
<div class="content">
<div v-for="(item, index) in alarmList" :key="index" class="alarmItem">
<div class="alarmTitle">{{ item.typeName }}</div>
<div class="alarmInfo" v-if="item.typeName == '区域入侵'">
<img src="@/assets/imgs/monitor.png" class="monitorImg" />
<div class="alarmContent">
<span class="detail">
<img src="@/assets/imgs/dian.png" />
<span class="label"
>位置<span class="value">{{ item.position }}</span></span
>
</span>
<span class="detail">
<img src="@/assets/imgs/dian.png" />
<span class="label"
>时间<span class="value">{{ item.time }}</span></span
>
</span>
</div>
</div>
<div v-else class="alarmInfo">
<div class="alarmContent1">
<span class="alarmDetail">
<img src="@/assets/imgs/dian.png" />
<span class="label"
>当前温度<span class="value">{{
item.currentTemperature
}}</span></span
>
</span>
<span class="alarmDetail">
<img src="@/assets/imgs/dian.png" />
<span class="label"
>报警温度<span class="value">{{
item.alarmTemperature
}}</span></span
>
</span>
<span class="alarmDetail">
<img src="@/assets/imgs/dian.png" />
<span class="label"
>位置<span class="value">{{ item.position }}</span></span
>
</span>
<span class="alarmDetail">
<img src="@/assets/imgs/dian.png" />
<span class="label"
>时间<span class="value">{{ item.time }}</span></span
>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="center">
<div class="cpu">
<div v-for="(item, index) in cpuList" :key="index" class="cpuItem">
<span class="cpuName">{{ item.name }}</span>
<span class="cpuValue">{{ item.value }}<span class="cpuUnit">%</span></span>
</div>
</div>
<div class="lineCount">
<span class="count"> <span style="color: #00edc5">0&nbsp;</span>/&nbsp;0 </span>
<span class="text"> 在线&nbsp;/&nbsp; </span>
</div>
<div class="equipment">
<div class="equipment-lineCount" v-for="(item, index) in equipmentList" :key="index">
<span class="count">
<span style="color: #00edc5">{{ item.online }}&nbsp;</span>/&nbsp;{{
item.total
}}
</span>
<span class="text"> 在线&nbsp;/&nbsp; </span>
</div>
</div>
</div>
<div class="right">
<div class="first-level-title" style="height: 4.4%">
<span>红外监控摄像头</span>
</div>
<div class="monitorBg">
<img src="@/assets/imgs/video.png" style="width: 100%; height: 100%" />
</div>
<div class="monitorStatus">
<div class="online">
<img src="@/assets/imgs/on-line.png" />
<span class="status">在线</span>
</div>
</div>
<div class="monitorList">
<div v-for="(item, index) in monitorList" :key="index" class="monitorItem">
<img src="@/assets/imgs/reign.png" style="width: 16px; height: 16px" />
<span>{{ item.name }}</span>
</div>
</div>
</div>
</div>
<div class="foot"></div>
</div>
</template>
<script setup>
import { ref } from "vue";
const functionList = ref([
{
name: "重要程度",
value: "I类变电站",
},
{
name: "投运时间",
value: "2022-06-28",
},
{
name: "运维班组",
value: "阜阳运维3班",
},
{
name: "安全运行",
value: "2789",
},
]);
//
const alarmList = ref([
{
typeName: "区域入侵",
position: "东5区厂房西侧摄像头",
time: "2022-07-18 12:02:56",
},
{
typeName: "温湿度告警",
currentTemperature: "28.5°C",
alarmTemperature: "35°C",
position: "西3区厂房",
time: "2022-07-18 12:02:56",
},
{
typeName: "紧急告警",
currentTemperature: "28.5°C",
alarmTemperature: "35°C",
position: "西3区厂房",
time: "2022-07-18 12:02:56",
},
{
typeName: "紧急告警",
currentTemperature: "28.5°C",
alarmTemperature: "35°C",
position: "西3区厂房",
time: "2022-07-18 12:02:56",
},
{
typeName: "紧急告警",
currentTemperature: "28.5°C",
alarmTemperature: "35°C",
position: "西3区厂房",
time: "2022-07-18 12:02:56",
},
]);
//cpu
const cpuList = ref([
{
name: "CPU占用",
value: "60",
},
{
name: "内存占用",
value: "60",
},
{
name: "硬盘空间",
value: "60",
},
]);
//线
const equipmentList = ref([
{
online: 0,
total: 0,
},
{
online: 0,
total: 0,
},
{
online: 0,
total: 0,
},
{
online: 0,
total: 0,
},
{
online: 0,
total: 0,
},
]);
//
const monitorList = ref([
{
name: "1号摄像头",
},
{
name: "2号摄像头",
},
{
name: "3号摄像头",
},
{
name: "4号摄像头",
},
{
name: "5号摄像头",
},
{
name: "6号摄像头",
},
{
name: "7号摄像头",
},
{
name: "8号摄像头",
},
{
name: "9号摄像头",
},
{
name: "10号摄像头",
},
{
name: "11号摄像头",
},
{
name: "12号摄像头",
},
{
name: "13号摄像头",
},
{
name: "14号摄像头",
},
{
name: "15号摄像头",
},
{
name: "16号摄像头",
},
{
name: "17号摄像头",
},
{
name: "18号摄像头",
},
{
name: "19号摄像头",
},
{
name: "20号摄像头",
},
{
name: "21号摄像头",
},
{
name: "22号摄像头",
},
{
name: "23号摄像头",
},
{
name: "24号摄像头",
},
{
name: "25号摄像头",
},
]);
</script>
<style lang="less" scoped>
@import "./index.less";
</style>

View File

@ -44,71 +44,74 @@
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { User, Lock } from '@element-plus/icons-vue'
import { apiLogin } from '@/api/index.js'
import JSEncrypt from 'jsencrypt'
import { ref, reactive, onMounted } from "vue";
import { useRouter } from "vue-router";
import { User, Lock } from "@element-plus/icons-vue";
import { apiLogin } from "@/api/index.js";
import JSEncrypt from "jsencrypt";
import { ElMessageBox, ElMessage } from "element-plus";
//
const formSize = ref('default')
const ruleFormRef = ref()
const formSize = ref("default");
const ruleFormRef = ref();
const ruleForm = reactive({
login_name: '',
password: ''
})
login_name: "",
password: "",
});
const encryptor = ref(null)
const encryptor = ref(null);
onMounted(() => {
encryptor.value = new JSEncrypt() //
encryptor.value = new JSEncrypt(); //
const pubKey =
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2TEstfATFdDWntbJTCPer9FOdwTRe58Vjy9T238/uUQYyoTHClfQCCKnys4elHCE0D0B7D/k2hK9U+xu1hWv1v4lH+n+t5duNVGq3sa5+pOq8j1ztec3W+wlcFgplYJq78XBYGYDbyfhmu5KeDeImsiccwnq3WvigfZYPbTvGv2YsqXDpTp+/s0hQsrYeATr2MuhiBhQGynLUvKCEcWvd/GNByMxJdJwl0k+IZW+DiCDmNX9Qwj23HF7U+Om7jEZC+Li/j2MHA5C4eEtVzgVC4VZETVOIcLv/UDufnAlneTJK2Exo+4YFEg9S1shpqUz9shSBl8JF9DM2a3KKmxc4wIDAQAB'
encryptor.value.setPublicKey(pubKey)
})
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmIZgs2im/ZaxPeQC1dvLGh8lBpmnknjpcjwk6G9zNVKHaVz/hKkcT+yquZjjcFD5Va8GpyrIBpA+EVSVN6pPwqqtmDNjiY9VTo3PPbhN5H43dyJDgm+h+/lAeoxe2r4NWveYNUNABp+nC0HWqc+cAt8EsjshpEbjI6mS9UubZoHrQWABw1Cm5PM4FaJreI1GduzUsfeFXC6TrsEEEjzWjjAUPh8XkCmlpyzXiCo+A3zbYRX2/Lu14jnsaQM6+y7KjdpH3pDEGpZyat3oFXX/KbSfnr4khUxy4jJH/lkqh6FcQWQbA43QVIgJ41ZSAGsjt2r0TicTYfRtI3HdCBcIVwIDAQAB";
encryptor.value.setPublicKey(pubKey);
});
const router = useRouter()
const router = useRouter();
const handleLogin = async () => {
const rsaPassWord = encryptor.value.encrypt(ruleForm.password) //
const rsaPassWord = encryptor.value.encrypt(ruleForm.password); //
try {
const response = await apiLogin({
login_name: ruleForm.login_name,
password: rsaPassWord
})
password: rsaPassWord,
});
if (response.code === 0) {
console.log(response.data, 'response.data')
ElMessage({
message: "登录成功",
type: "success",
});
console.log(response.data, "response.data");
// token
localStorage.setItem('token', response.data.token)
localStorage.setItem('ReviewerId', response.data.user_id)
localStorage.setItem('Reviewer', response.data.real_name)
await router.push('/ExaminationManagement')
localStorage.setItem("token", response.data.token);
localStorage.setItem("ReviewerId", response.data.user_id);
localStorage.setItem("Reviewer", response.data.real_name);
await router.push("/schedule");
} else {
//
alert('密码错误')
alert("密码错误");
}
} catch (error) {
//
alert('请求失败')
alert("请求失败");
}
}
};
const validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'))
if (value === "") {
callback(new Error("请输入密码"));
} else {
const passLength = value.length
const passLength = value.length;
if (passLength < 5 || passLength > 20) {
callback(new Error('密码长度为5-20'))
callback(new Error("密码长度为5-20"));
} else {
callback()
callback();
}
}
}
};
const rules = reactive({
password: [
{ required: true, trigger: 'blur', message: '请输入密码' },
{ validator: validatePass, trigger: 'blur' }
]
})
{ required: true, trigger: "blur", message: "请输入密码" },
{ validator: validatePass, trigger: "blur" },
],
});
</script>
<style scoped lang="scss">
@ -141,7 +144,7 @@ const rules = reactive({
font-family: DouyinSansBold;
font-weight: 700;
font-size: 38px;
color: #0d867f;
color: rgb(0,122,252);
margin-top: 11px;
letter-spacing: 1px;
}
@ -167,7 +170,7 @@ const rules = reactive({
.el-button {
width: 380px;
height: 50px;
background: #0d867f;
background: rgb(0,122,252);
border: none;
border-radius: 2px 2px 2px 2px;
font-weight: 400;
@ -179,7 +182,7 @@ const rules = reactive({
.login_from {
.el-input {
height: 50px;
border: 1px solid rgba(13, 134, 127, 1);
border: 1px solid rgba(0,122,252);
}
.el-form-item--default {
margin-bottom: 30px;

View File

@ -0,0 +1,554 @@
<template>
<div class="PageContent">
<div class="WebToolbar">
<div class="FormComponent">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="部门">
<el-select v-model="formInline.Department" placeholder="请选择部门" clearable>
<el-option
:label="v.label"
:value="v.label"
v-for="(v, i) in departmentList"
:key="i"
/>
</el-select>
</el-form-item>
<el-form-item label="人员名称">
<el-input
v-model="formInline.PersonnelName"
placeholder="请输入人员名称"
clearable
/>
</el-form-item>
</el-form>
</div>
<div class="ButtonAssembly">
<el-button style="color: #fff" @click="queryData">
<img src="../../assets/menu/search.png" alt="" />
<span>查询</span>
</el-button>
<el-button style="color: #1d2129" @click="resetFormInline">
<img src="../../assets/menu/reset.png" alt="" />
<span>重置</span>
</el-button>
</div>
</div>
<div class="Tabulation">
<div class="actionBar">
<h1>人员列表</h1>
<div class="Worktop">
<el-button class="BlueBack" @click="addBtn" :icon="Plus">
新增
</el-button>
</div>
</div>
<div class="ExaminationForm">
<el-table ref="multipleTableRef" :data="tableData" style="width: 100%">
<el-table-column label="序号" type="index" width="80px" align="center" />
<el-table-column property="Department" label="部门" align="center" />
<el-table-column property="PersonnelName" label="人员名称" align="center" />
<el-table-column property="CreateTime" label="创建时间" align="center" />
<el-table-column property="" label="操作" align="center">
<template v-slot="scope">
<el-button
size="mini"
type="text"
:icon="Edit"
@click="handleUpdate(scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="text"
:icon="Delete"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
:current-page="InlineForm.PageIndex"
:page-size="InlineForm.PageSize"
:small="small"
layout="total, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
<!-- 新增 -->
<el-dialog v-model="dialogToLead" :title="title" style="width: 25%; height: 35%">
<el-form :model="form" :rules="rules" label-width="80px" ref="formData">
<el-form-item label="部门" prop="Department">
<el-select v-model="form.Department" placeholder="请选择部门" clearable>
<el-option
:label="v.label"
:value="v.label"
v-for="(v, i) in departmentList"
:key="i"
/>
</el-select>
</el-form-item>
<el-form-item label="人员名称" prop="PersonnelName">
<el-input v-model="form.PersonnelName" placeholder="请输入人员名称" clearable />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitUpload"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script setup>
import { ref, onMounted, reactive, getCurrentInstance } from "vue";
import {
GetPersonnelList,
AddPersonnel,
DeletePersonnel,
GetPersonnelDetails,
EditPersonnel,
} from "@/api/personnelManagement.js";
import { ElTable, ElMessageBox, ElMessage } from "element-plus";
import { Download, Delete, Edit, Search,Plus } from "@element-plus/icons-vue";
const { proxy } = getCurrentInstance();
//
const formInline = reactive({});
//
const InlineForm = reactive({
PageIndex: 1,
PageSize: 10,
});
//
const total = ref(0);
//
const departmentList = ref([
{
label: "后勤部",
},
{
label: "人事部",
},
{
label: "财务部",
},
]);
//
const tableData = ref([]);
//
const form = reactive({});
const rules = ref({
PersonnelName: [
{
required: true,
message: "请输入人员名称",
trigger: "change",
},
],
Department: [
{
required: true,
message: "请选择部门",
trigger: "change",
},
],
});
//
const dialogToLead = ref(false);
//
const title = ref("");
//
function queryData() {
InlineForm.PageIndex = 1;
getList();
}
//
function resetFormInline() {
(formInline.PageIndex = 1),
(formInline.PageSize = 10),
(formInline.Department = ""),
(formInline.PersonnelName = "");
getList();
}
//
const handleSizeChange = (val) => {
InlineForm.PageSize = val;
getList();
};
const handleCurrentChange = (val) => {
InlineForm.PageIndex = val;
getList();
};
//
function getList() {
let formParams = {
PageIndex: InlineForm.PageIndex,
PageSize: InlineForm.PageSize,
PersonnelName: formInline.PersonnelName,
Department: formInline.Department,
};
GetPersonnelList(formParams)
.then((res) => {
if (res.code == 0) {
tableData.value = res.data.list;
total.value = res.data.total;
}
})
.catch((err) => {
console.log(err);
});
}
//
function addBtn() {
(form.PersonnelName = ""), (form.Department = "");
title.value = "添加人员";
dialogToLead.value = true;
}
//
function handleUpdate(row) {
let paramsData = {
PersonnelId: row.PersonnelId,
};
GetPersonnelDetails(paramsData)
.then((res) => {
if (res.code == 0) {
form.PersonnelName = res.data.PersonnelName;
form.Department = res.data.Department;
form.PersonnelId = res.data.PersonnelId;
title.value = "修改人员";
dialogToLead.value = true;
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function submitUpload() {
proxy.$refs["formData"].validate((valid) => {
if (valid) {
if (title.value == "添加人员") {
AddPersonnel(form)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
ElMessage({
message: "新增成功",
type: "success",
});
getList();
} else {
ElMessage({
message: "新增失败",
type: "warning",
});
getList();
}
})
.catch((err) => {
console.log(err);
});
} else if (title.value == "修改人员") {
EditPersonnel(form)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
ElMessage({
message: "修改成功",
type: "success",
});
getList();
} else {
ElMessage({
message: "修改失败",
type: "warning",
});
}
})
.catch((err) => {
console.log(err);
});
}
}
});
}
//
function handleDelete(row) {
let paramsData = {
PersonnelId: row.PersonnelId,
};
ElMessageBox.confirm("确定要删除吗?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
DeletePersonnel(paramsData)
.then((res) => {
if (res.code == 0) {
ElMessage({
message: "删除成功",
type: "success",
});
getList();
} else {
ElMessage.error(res?.data || "删除失败");
}
})
.catch((err) => {
console.log(err);
});
});
}
//
function cancel() {
(form.PersonnelName = ""), (form.Department = "");
dialogToLead.value = false;
}
onMounted(() => {
//
getList();
});
</script>
<style lang="less" scoped>
.PageContent {
width: 100%;
height: 100%;
}
.WebToolbar {
width: 100%;
height: 72px;
background-color: #fff;
padding: 20px;
display: flex;
justify-content: space-between;
:deep(.el-form-item__content) {
width: 256px !important;
height: 32px !important;
}
:deep(.el-input) {
width: 256px !important;
}
:deep(.el-select) {
width: 256px !important;
}
:deep(.el-form-item__label) {
color: #666 !important;
}
}
.ButtonAssembly {
.el-button {
width: 84px;
height: 40px;
border: none;
font-weight: 400;
font-size: 14px;
border-radius: 2px 2px 2px 2px;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.el-button:nth-child(1) {
background-color: rgb(0,122,252);
}
.el-button:nth-child(2) {
background-color: #f2f3f5;
}
}
.Tabulation {
width: 100%;
height: calc(100% - 72px);
background-color: #fff;
margin-top: 14px;
padding: 20px;
.actionBar {
display: flex;
justify-content: space-between;
h1 {
font-weight: 500;
font-size: 20px;
color: #1d2129;
line-height: 28px;
font-family: Microsoft YaHei, Microsoft YaHei;
}
}
.Worktop {
.el-button {
border: 1px solid rgb(0,122,252);
font-weight: 400;
font-size: 14px;
color: rgb(0,122,252);
}
.el-button:hover {
background-color: transparent;
}
.BlueBack {
background: rgb(0,122,252);
border-radius: 2px 2px 2px 2px;
font-weight: 400;
font-size: 14px;
color: #ffffff;
line-height: 22px;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.BlueBack:hover {
background-color: rgb(0,122,252);
}
.Delete {
background: #f2f3f5;
border-radius: 2px 2px 2px 2px;
font-weight: 400;
font-size: 14px;
color: #1d2129;
line-height: 22px;
border: none;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.Delete:hover {
background-color: #f2f3f5;
}
}
.ExaminationForm {
margin-top: 16px;
background-color: #0077aa;
}
.el-table tr {
height: 41px;
}
.el-table td {
height: 41px;
}
:deep(th) {
background-color: #e5e6eb;
}
}
.el-pagination {
float: right;
background-color: #fff !important;
margin-top: 18px;
}
:deep(.el-pager li.is-active) {
background-color: rgb(181,216,241) !important;
font-weight: 400;
color: rgb(0,122,252) !important;
}
:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
background-color: rgb(181,216,241) !important;
}
:deep(.el-select) {
width: 280px !important;
}
:deep(.el-input) {
width: 280px !important;
}
.example {
margin-left: 20px;
color: red;
}
.backInformation {
:deep(.el-input) {
width: 280px !important;
height: 120px !important;
}
}
.dialog-footer {
width: 100%;
text-align: center;
}
:deep(.el-textarea__inner) {
width: 280px !important;
}
.user-name,
.register {
cursor: pointer;
}
.functionalUnit {
margin-left: 20px;
display: flex;
.el-button {
width: 84px;
height: 40px;
border: none;
font-weight: 400;
font-size: 14px;
border-radius: 2px 2px 2px 2px;
color: #fff;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.el-button:nth-child(1) {
background-color: #2192ba;
}
.el-button:nth-child(2) {
background-color: #17c85f;
}
}
.TabularTitle {
font-size: 14px;
color: #747272;
font-weight: bold;
margin-bottom: 10px;
}
.pagination {
width: 100%;
height: 30px;
:deep(.el-pagination) {
margin-top: 9px !important;
}
}
.addSlip {
.el-button {
border: none;
background-color: #0077aa;
margin-top: 8px;
color: #fff;
}
:deep(.el-pagination) {
margin-top: 8px !important;
}
}
.ml-3 {
margin-left: 20px;
}
.upload-file-uploader {
width: 50%;
}
.el-upload-list .el-upload-list__item {
width: 33% !important;
float: left;
margin-left: -385px;
margin-top: 25px;
:deep(.horizontal-list ul .el-upload-list__item) {
width: 33% !important;
float: left;
margin-top: 25px;
}
:deep(.el-link__inner) {
display: inline-flex;
justify-content: center;
align-items: center;
width: 200px;
}
}
</style>

View File

@ -0,0 +1,657 @@
<template>
<div class="PageContent">
<div class="WebToolbar">
<div class="FormComponent">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="排班日期">
<el-date-picker
v-model="formInline.SchedulingDate"
value-format="YYYY-MM-DD 00:00:00"
type="date"
placeholder="排班日期"
/>
</el-form-item>
<el-form-item label="排班分类">
<el-select
v-model="formInline.SchedulingClass"
placeholder="请选择排班分类"
clearable
>
<el-option
:label="v.label"
:value="v.label"
v-for="(v, i) in schedulingList"
:key="i"
/>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="ButtonAssembly">
<el-button style="color: #fff" @click="queryData">
<img src="../../assets/menu/search.png" alt="" />
<span>查询</span>
</el-button>
<el-button style="color: #1d2129" @click="resetFormInline">
<img src="../../assets/menu/reset.png" alt="" />
<span>重置</span>
</el-button>
</div>
</div>
<div class="Tabulation">
<div class="actionBar">
<h1>排班列表</h1>
<div class="Worktop">
<el-button class="BlueBack" @click="addBtn" :icon="Plus"> 新增 </el-button>
</div>
</div>
<div class="ExaminationForm">
<el-table ref="multipleTableRef" :data="tableData" style="width: 100%">
<el-table-column label="序号" type="index" width="80px" align="center" />
<el-table-column property="SchedulingDate" label="排版日期" align="center" >
<template v-slot="scope">
{{ this.$moment(scope.row.SchedulingDate).format('YYYY-MM-DD') }}
</template>
</el-table-column>
<el-table-column property="SchedulingUserName" label="排班人" align="center" />
<el-table-column property="SchedulingClass" label="排班分类" align="center" />
<el-table-column property="MembersName" label="人员组成" align="center" />
<el-table-column property="Status" label="排版状态" align="center" />
<el-table-column property="CreateTime" label="发布时间" align="center" />
<el-table-column property="" label="操作" align="center">
<template v-slot="scope">
<el-button
size="mini"
type="text"
:icon="Upload"
:disabled="scope.row.Status == '已发布'"
@click="handleRelease(scope.row)"
>发布</el-button
>
<el-button
size="mini"
type="text"
:icon="Edit"
@click="handleUpdate(scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="text"
:icon="Delete"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
:current-page="InlineForm.PageIndex"
:page-size="InlineForm.PageSize"
:small="small"
layout="total, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
<!-- 新增 -->
<el-dialog v-model="dialogToLead" :title="title" style="width: 25%; height: 35%">
<el-form :model="form" :rules="rules" label-width="80px" ref="formData">
<el-form-item label="排班分类" prop="SchedulingClass">
<el-select v-model="form.SchedulingClass" placeholder="请选择排班分类" clearable>
<el-option
:label="v.label"
:value="v.label"
v-for="(v, i) in schedulingList"
:key="i"
/>
</el-select>
</el-form-item>
<el-form-item label="排班日期" prop="SchedulingDate">
<el-date-picker
v-model="form.SchedulingDate"
value-format="YYYY-MM-DD 00:00:00"
type="date"
placeholder="请选择排班日期"
/>
</el-form-item>
<el-form-item label="人员选择" prop="MembersName">
<el-select
v-model="form.MembersInfo"
filterable
placeholder="请选择人员"
clearable
multiple
>
<el-option
:label="v.PersonnelName"
:value="{ value: v.PersonnelId, label: v.PersonnelName }"
v-for="(v, i) in membersNameList"
:key="i"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitUpload"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script setup>
import { ref, onMounted, reactive, getCurrentInstance } from "vue";
import {
GetSchedulingList,
GetPersonnel,
AddScheduling,
DeleteScheduling,
EditScheduling,
GetSchedulingDetails,
ReleaseScheduling,
} from "@/api/schedule.js";
import { ElTable, ElMessageBox, ElMessage } from "element-plus";
import { Download, Delete, Edit, Search, Plus, Upload } from "@element-plus/icons-vue";
const { proxy } = getCurrentInstance();
//
const formInline = reactive({});
//
const InlineForm = reactive({
PageIndex: 1,
PageSize: 10,
});
//
const total = ref(0);
//
const schedulingList = ref([
{
label: "早班",
},
{
label: "中班",
},
{
label: "晚班",
},
]);
//
const membersNameList = ref([]);
//
const tableData = ref([]);
//
const form = reactive({});
const rules = reactive({
PersonnelName: [
{
required: true,
message: "请输入人员名称",
trigger: "change",
},
],
SchedulingClass: [
{
required: true,
message: "请选择部门",
trigger: "change",
},
],
});
//
const dialogToLead = ref(false);
//
const title = ref("");
//
function queryData() {
InlineForm.PageIndex = 1;
getList();
}
//
function resetFormInline() {
(formInline.PageIndex = 1),
(formInline.PageSize = 10),
(formInline.SchedulingDate = ""),
(formInline.SchedulingClass = "");
getList();
}
//
const handleSizeChange = (val) => {
InlineForm.PageSize = val;
getList();
};
const handleCurrentChange = (val) => {
InlineForm.PageIndex = val;
getList();
};
//
function getList() {
let formParams = {
PageIndex: InlineForm.PageIndex,
PageSize: InlineForm.PageSize,
SchedulingDate: formInline.SchedulingDate,
SchedulingClass: formInline.SchedulingClass,
};
GetSchedulingList(formParams)
.then((res) => {
if (res.code == 0) {
tableData.value = res.data.list;
total.value = res.data.total;
getUserInfoList();
}
})
.catch((err) => {
console.log(err);
});
}
//
function getUserInfoList() {
GetPersonnel()
.then((res) => {
if (res.code == 0) {
membersNameList.value = res.data;
}
})
.catch((err) => {
console.log(err);
});
}
//
function addBtn() {
(form.PersonnelName = ""), (form.SchedulingClass = "");
title.value = "添加排班";
dialogToLead.value = true;
}
//
function handleUpdate(row) {
let paramsData = {
SchedulingId: row.SchedulingId,
};
GetSchedulingDetails(paramsData)
.then((res) => {
if (res.code == 0) {
//
let labels = res.data.MembersName.split(",");
let values = res.data.MembersId.split(",");
form.SchedulingId = res.data.SchedulingId;
form.SchedulingClass = res.data.SchedulingClass;
form.SchedulingDate = res.data.SchedulingDate;
form.MembersInfo = labels.map((label, index) => {
return { label: label, value: values[index] };
});
title.value = "修改排班";
dialogToLead.value = true;
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function handleRelease(row) {
let params = {
SchedulingId: row.SchedulingId,
};
ReleaseScheduling(params)
.then((res) => {
if (res.code == 0) {
ElMessage({
message: res.data,
type: "success",
});
getList();
} else {
ElMessage({
message: res.data,
type: "warning",
});
getList();
}
})
.catch((err) => {
console.log(err);
});
}
//
function submitUpload() {
proxy.$refs["formData"].validate((valid) => {
if (valid) {
if (title.value == "添加排班") {
let params = {
SchedulingDate: form.SchedulingDate,
SchedulingUserName: localStorage.getItem("Reviewer"),
SchedulingUserId: localStorage.getItem("ReviewerId"),
SchedulingClass: form.SchedulingClass,
MembersId: form.MembersInfo.map((item) => item.value).join(","),
MembersName: form.MembersInfo.map((item) => item.label).join(","),
};
AddScheduling(params)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
ElMessage({
message: "新增成功",
type: "success",
});
getList();
} else {
ElMessage({
message: "新增失败",
type: "warning",
});
}
})
.catch((err) => {
console.log(err);
});
} else if (title.value == "修改排班") {
let params = {
SchedulingDate: form.SchedulingDate,
SchedulingUserName: localStorage.getItem("Reviewer"),
SchedulingUserId: localStorage.getItem("ReviewerId"),
SchedulingClass: form.SchedulingClass,
MembersId: form.MembersInfo.map((item) => item.value).join(","),
MembersName: form.MembersInfo.map((item) => item.label).join(","),
SchedulingId: form.SchedulingId,
};
EditScheduling(params)
.then((res) => {
if (res.code == 0) {
dialogToLead.value = false;
ElMessage({
message: "修改成功",
type: "success",
});
getList();
} else {
ElMessage({
message: "修改失败",
type: "warning",
});
}
})
.catch((err) => {
console.log(err);
});
}
}
});
}
//
function handleDelete(row) {
let paramsData = {
SchedulingId: row.SchedulingId,
};
ElMessageBox.confirm("确定要删除吗?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
DeleteScheduling(paramsData)
.then((res) => {
if (res.code == 0) {
ElMessage({
message: "删除成功",
type: "success",
});
getList();
} else {
ElMessage.error(res?.data || "删除失败");
}
})
.catch((err) => {
console.log(err);
});
});
}
//
function cancel() {
(form.PersonnelName = ""), (form.SchedulingClass = "");
dialogToLead.value = false;
}
onMounted(() => {
//
getList();
});
</script>
<style lang="less" scoped>
.PageContent {
width: 100%;
height: 100%;
}
.WebToolbar {
width: 100%;
height: 72px;
background-color: #fff;
padding: 20px;
display: flex;
justify-content: space-between;
:deep(.el-form-item__content) {
width: 256px !important;
height: 32px !important;
}
:deep(.el-input) {
width: 256px !important;
}
:deep(.el-select) {
width: 256px !important;
}
:deep(.el-form-item__label) {
color: #666 !important;
}
}
.ButtonAssembly {
.el-button {
width: 84px;
height: 40px;
border: none;
font-weight: 400;
font-size: 14px;
border-radius: 2px 2px 2px 2px;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.el-button:nth-child(1) {
background-color: rgb(0, 122, 252);
}
.el-button:nth-child(2) {
background-color: #f2f3f5;
}
}
.Tabulation {
width: 100%;
height: calc(100% - 72px);
background-color: #fff;
margin-top: 14px;
padding: 20px;
.actionBar {
display: flex;
justify-content: space-between;
h1 {
font-weight: 500;
font-size: 20px;
color: #1d2129;
line-height: 28px;
font-family: Microsoft YaHei, Microsoft YaHei;
}
}
.Worktop {
.el-button {
border: 1px solid rgb(0, 122, 252);
font-weight: 400;
font-size: 14px;
color: rgb(0, 122, 252);
}
.el-button:hover {
background-color: transparent;
}
.BlueBack {
background: rgb(0, 122, 252);
border-radius: 2px 2px 2px 2px;
font-weight: 400;
font-size: 14px;
color: #ffffff;
line-height: 22px;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.BlueBack:hover {
background-color: rgb(0, 122, 252);
}
.Delete {
background: #f2f3f5;
border-radius: 2px 2px 2px 2px;
font-weight: 400;
font-size: 14px;
color: #1d2129;
line-height: 22px;
border: none;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.Delete:hover {
background-color: #f2f3f5;
}
}
.ExaminationForm {
margin-top: 16px;
background-color: #0077aa;
}
.el-table tr {
height: 41px;
}
.el-table td {
height: 41px;
}
:deep(th) {
background-color: #e5e6eb;
}
}
.el-pagination {
float: right;
background-color: #fff !important;
margin-top: 18px;
}
:deep(.el-pager li.is-active) {
background-color: rgb(181, 216, 241) !important;
font-weight: 400;
color: rgb(0, 122, 252) !important;
}
:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
background-color: rgb(181, 216, 241) !important;
}
:deep(.el-select) {
width: 280px !important;
}
:deep(.el-input) {
width: 280px !important;
}
.example {
margin-left: 20px;
color: red;
}
.backInformation {
:deep(.el-input) {
width: 280px !important;
height: 120px !important;
}
}
.dialog-footer {
width: 100%;
text-align: center;
}
:deep(.el-textarea__inner) {
width: 280px !important;
}
.user-name,
.register {
cursor: pointer;
}
.functionalUnit {
margin-left: 20px;
display: flex;
.el-button {
width: 84px;
height: 40px;
border: none;
font-weight: 400;
font-size: 14px;
border-radius: 2px 2px 2px 2px;
color: #fff;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
.el-button:nth-child(1) {
background-color: #2192ba;
}
.el-button:nth-child(2) {
background-color: #17c85f;
}
}
.TabularTitle {
font-size: 14px;
color: #747272;
font-weight: bold;
margin-bottom: 10px;
}
.pagination {
width: 100%;
height: 30px;
:deep(.el-pagination) {
margin-top: 9px !important;
}
}
.addSlip {
.el-button {
border: none;
background-color: #0077aa;
margin-top: 8px;
color: #fff;
}
:deep(.el-pagination) {
margin-top: 8px !important;
}
}
.ml-3 {
margin-left: 20px;
}
.upload-file-uploader {
width: 50%;
}
.el-upload-list .el-upload-list__item {
width: 33% !important;
float: left;
margin-left: -385px;
margin-top: 25px;
:deep(.horizontal-list ul .el-upload-list__item) {
width: 33% !important;
float: left;
margin-top: 25px;
}
:deep(.el-link__inner) {
display: inline-flex;
justify-content: center;
align-items: center;
width: 200px;
}
}
</style>

View File

@ -1,7 +1,7 @@
import { defineConfig } from 'vite'
import { fileURLToPath, URL } from 'node:url'
import vue from '@vitejs/plugin-vue'
import pxtorem from "postcss-pxtorem";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
@ -17,10 +17,35 @@ export default defineConfig({
cors: true,
proxy: {
'/api': {
target: 'http://172.16.1.253:4000',
changeOrigin: true
target: 'http://172.16.1.253:5000',
changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api/, '')
}
}
},
css: {
preprocessorOptions: {
less: {
math: "always", // 括号内才使用数学计算
globalVars: {
// 全局变量
mainColor: "red",
},
},
},
postcss: {
plugins: [
pxtorem({
rootValue: 192, // 这里写设计稿的宽度/10即可例如设计稿宽度是750px就写75
// vant默认是37.5如果是使用了vant的话可以像下面这样写
// rootValue(res) {
// return res.file.indexOf("vant") !== -1 ? 37.5 : 75;
// },
propList: ['*'], // 需要转换的属性,默认转换所有属性
selectorBlackList: [], // CSS选择器黑名单防止部分选择器被转换
exclude: /\/node_modules\//i, // 忽略包文件转换rem
})
]
}
},
})