更新图表

This commit is contained in:
管理员 2025-09-23 17:56:27 +08:00
parent f23c9210e8
commit e12eca3c5e
59 changed files with 3739 additions and 1876 deletions

View File

@ -1,5 +1,5 @@
# 页面标题
VITE_APP_TITLE = 若依管理系统
VITE_APP_TITLE = 区间测速
# 开发环境配置
VITE_APP_ENV = 'development'

View File

@ -1,5 +1,5 @@
# 页面标题
VITE_APP_TITLE = 若依管理系统
VITE_APP_TITLE = 区间测速
# 生产环境配置
VITE_APP_ENV = 'production'

3
.gitignore vendored
View File

@ -1,6 +1,7 @@
.DS_Store
node_modules/
dist/
.history/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
@ -8,6 +9,7 @@ yarn-error.log*
tests/**/coverage/
tests/e2e/reports
selenium-debug.log
# Editor directories and files
@ -19,5 +21,6 @@ selenium-debug.log
*.sln
*.local
package-lock.json
yarn.lock

View File

@ -7,7 +7,7 @@
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="/favicon.ico">
<title>若依管理系统</title>
<title>区间测速</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,

View File

@ -21,6 +21,7 @@
"@vueuse/core": "13.3.0",
"axios": "1.9.0",
"clipboard": "2.0.11",
"dayjs": "^1.11.18",
"echarts": "5.6.0",
"element-plus": "2.10.7",
"file-saver": "2.0.5",
@ -31,6 +32,8 @@
"nprogress": "0.2.0",
"pinia": "3.0.2",
"splitpanes": "4.0.4",
"video.js": "^8.23.4",
"videojs-contrib-hls": "^5.15.0",
"vue": "3.5.16",
"vue-cropper": "1.1.1",
"vue-router": "4.5.1",

View File

@ -23,6 +23,9 @@ importers:
clipboard:
specifier: 2.0.11
version: 2.0.11
dayjs:
specifier: ^1.11.18
version: 1.11.18
echarts:
specifier: 5.6.0
version: 5.6.0
@ -53,6 +56,12 @@ importers:
splitpanes:
specifier: 4.0.4
version: 4.0.4(vue@3.5.16)
video.js:
specifier: ^8.23.4
version: 8.23.4
videojs-contrib-hls:
specifier: ^5.15.0
version: 5.15.0
vue:
specifier: 3.5.16
version: 3.5.16
@ -106,6 +115,10 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/runtime@7.28.4':
resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
engines: {node: '>=6.9.0'}
'@babel/types@7.28.2':
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
engines: {node: '>=6.9.0'}
@ -461,6 +474,19 @@ packages:
'@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
'@videojs/http-streaming@3.17.2':
resolution: {integrity: sha512-VBQ3W4wnKnVKb/limLdtSD2rAd5cmHN70xoMf4OmuDd0t2kfJX04G+sfw6u2j8oOm2BXYM9E1f4acHruqKnM1g==}
engines: {node: '>=8', npm: '>=5'}
peerDependencies:
video.js: ^8.19.0
'@videojs/vhs-utils@4.1.1':
resolution: {integrity: sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==}
engines: {node: '>=8', npm: '>=5'}
'@videojs/xhr@2.7.0':
resolution: {integrity: sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==}
'@vitejs/plugin-vue@5.2.4':
resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
engines: {node: ^18.0.0 || >=20.0.0}
@ -551,6 +577,10 @@ packages:
'@vueuse/shared@9.13.0':
resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
'@xmldom/xmldom@0.8.11':
resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==}
engines: {node: '>=10.0.0'}
abbrev@2.0.0:
resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@ -560,6 +590,12 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
aes-decrypter@1.0.3:
resolution: {integrity: sha512-rsx8pfx7wJsn+ziYbpJ8XA5c93hKAtBCrfydxJqJCMT+qfjipd/B5wC2xHtBcoxyvlqJcpeAo3K55t0lXOn9yQ==}
aes-decrypter@4.0.2:
resolution: {integrity: sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==}
ansi-regex@2.1.1:
resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
engines: {node: '>=0.10.0'}
@ -634,6 +670,9 @@ packages:
axios@1.9.0:
resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==}
babel-runtime@6.26.0:
resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==}
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@ -748,6 +787,10 @@ packages:
resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
engines: {node: '>=0.10.0'}
core-js@2.6.12:
resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==}
deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
cors@2.8.5:
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
engines: {node: '>= 0.10'}
@ -786,8 +829,8 @@ packages:
resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
engines: {node: '>= 0.4'}
dayjs@1.11.14:
resolution: {integrity: sha512-E8fIdSxUlyqSA8XYGnNa3IkIzxtEmFjI+JU/6ic0P1zmSqyL6HyG5jHnpPjRguDNiaHLpfvHKWFiohNsJLqcJQ==}
dayjs@1.11.18:
resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==}
debug@2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
@ -847,6 +890,9 @@ packages:
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
dom-walk@0.1.2:
resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
domelementtype@1.3.1:
resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
@ -930,6 +976,10 @@ packages:
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
es5-shim@4.6.7:
resolution: {integrity: sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==}
engines: {node: '>=0.4.0'}
esbuild@0.25.9:
resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
engines: {node: '>=18'}
@ -1090,6 +1140,12 @@ packages:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
hasBin: true
global@4.3.2:
resolution: {integrity: sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==}
global@4.4.0:
resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
globalthis@1.0.4:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
@ -1173,6 +1229,9 @@ packages:
immutable@5.1.3:
resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==}
individual@2.0.0:
resolution: {integrity: sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==}
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@ -1254,6 +1313,9 @@ packages:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
is-function@1.0.2:
resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==}
is-generator-function@1.1.0:
resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
engines: {node: '>= 0.4'}
@ -1430,6 +1492,12 @@ packages:
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
m3u8-parser@2.1.0:
resolution: {integrity: sha512-WbEpQ2FUaNGbJ0YanSeyj9D9ruu4FUvz+ZvebIzI2bSME+PUwcPXO1kKXZkjcPUAFruDikoOI5fWQNIA6JCCOQ==}
m3u8-parser@7.2.0:
resolution: {integrity: sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==}
magic-string@0.26.7:
resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
engines: {node: '>=12'}
@ -1479,6 +1547,9 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
min-document@2.19.0:
resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
minimatch@9.0.1:
resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
engines: {node: '>=16 || 14 >=14.17'}
@ -1504,12 +1575,24 @@ packages:
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
mpd-parser@1.3.1:
resolution: {integrity: sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==}
hasBin: true
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
mux.js@4.3.2:
resolution: {integrity: sha512-g0q6DPdvb3yYcoK7ElBGobdSSrhY/RjPt19U7uUc733aqvc5bCS/aCvL9z+448y+IoCZnYDwyZfQBBXMSmGOaQ==}
mux.js@7.1.0:
resolution: {integrity: sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==}
engines: {node: '>=8', npm: '>=5'}
hasBin: true
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -1575,6 +1658,9 @@ packages:
parchment@1.1.4:
resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==}
parse-headers@2.0.6:
resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==}
pascalcase@0.1.1:
resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
engines: {node: '>=0.10.0'}
@ -1616,6 +1702,15 @@ packages:
typescript:
optional: true
pkcs7@0.2.3:
resolution: {integrity: sha512-kJRwmADEQUg+qJyRgWLtpEL9q9cFjZschejTEK3GRjKvnsU9G5WWoe/wKqRgbBoqWdVSeTUKP6vIA3Y72M3rWA==}
engines: {node: ^0.10, npm: ^1.4.6}
hasBin: true
pkcs7@1.0.4:
resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==}
hasBin: true
pkg-types@1.3.1:
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
@ -1660,6 +1755,14 @@ packages:
resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==}
engines: {node: '>=0.10.0'}
process@0.11.10:
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
engines: {node: '>= 0.6.0'}
process@0.5.2:
resolution: {integrity: sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA==}
engines: {node: '>= 0.6.0'}
proto-list@1.2.4:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
@ -1694,6 +1797,9 @@ packages:
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
engines: {node: '>= 0.4'}
regenerator-runtime@0.11.1:
resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==}
regex-not@1.0.2:
resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
engines: {node: '>=0.10.0'}
@ -1733,6 +1839,9 @@ packages:
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
rust-result@1.0.0:
resolution: {integrity: sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==}
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
@ -1743,6 +1852,9 @@ packages:
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
safe-json-parse@4.0.0:
resolution: {integrity: sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==}
safe-push-apply@1.0.0:
resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
engines: {node: '>= 0.4'}
@ -2085,6 +2197,10 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tsml@1.0.1:
resolution: {integrity: sha512-3KmepnH9SUsoOVtg013CRrL7c+AK7ECaquAsJdvu4288EDJuraqBlP4PDXT/rLEJ9YDn4jqLAzRJsnFPx+V6lg==}
deprecated: no longer maintained
typed-array-buffer@1.0.3:
resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
engines: {node: '>= 0.4'}
@ -2153,6 +2269,9 @@ packages:
resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
deprecated: Please see https://github.com/lydell/urix#deprecated
url-toolkit@2.2.5:
resolution: {integrity: sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==}
use@3.1.1:
resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
engines: {node: '>=0.10.0'}
@ -2167,6 +2286,40 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
video.js@6.13.0:
resolution: {integrity: sha512-36/JR/GhPQSZj0o+GNbhcEYv/b0SkV9SQsjlodAnzMQYN0TA7VhmqrKPYMCi1NGRYu7S9W3OaFCFoUxkYfSVlg==}
video.js@8.23.4:
resolution: {integrity: sha512-qI0VTlYmKzEqRsz1Nppdfcaww4RSxZAq77z2oNSl3cNg2h6do5C8Ffl0KqWQ1OpD8desWXsCrde7tKJ9gGTEyQ==}
videojs-contrib-hls@5.15.0:
resolution: {integrity: sha512-18zbMYZ0XRBKTPEayA9bFTWWrqhT9b4G8+zf0czJLD7Epe5PcK1I/3dflTHQeQ5rwlWir+/XnFU3sMg/B2MMcw==}
engines: {node: '>= 0.10.12'}
videojs-contrib-media-sources@4.7.2:
resolution: {integrity: sha512-e6iCHWBFuV05EGo7v+pS9iepObXnJ9joms467gzi8ZjpKVb3ifha9M0Ja24Rd8JfvYpzjltsgDVtGFDvIg4hQQ==}
videojs-contrib-quality-levels@4.1.0:
resolution: {integrity: sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==}
engines: {node: '>=16', npm: '>=8'}
peerDependencies:
video.js: ^8
videojs-font@2.1.0:
resolution: {integrity: sha512-zFqWpLrXf1q8NtYx5qtZhMC6SLUFScDmR6j+UGPogobxR21lvXShhnzcNNMdOxJUuFLiToJ/BPpFUQwX4xhpvA==}
videojs-font@4.2.0:
resolution: {integrity: sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==}
videojs-ie8@1.1.2:
resolution: {integrity: sha512-0Zb2T4MLkpfZbeGMK/Z93b8Lrepr+rLFoHgQV1CoDeFqXvH7b+Vsd/VHoILGxQrgCSHFQ7mAODR6oyMjuiD4/g==}
videojs-vtt.js@0.12.6:
resolution: {integrity: sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==}
videojs-vtt.js@0.15.5:
resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==}
vite-plugin-compression@0.5.1:
resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
peerDependencies:
@ -2252,6 +2405,9 @@ packages:
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
webwackify@0.1.6:
resolution: {integrity: sha512-pGcw1T3HpNnM/UTRQqqRkkkzythSLts05mB+7Gr00B+0VbL0m39dFL5g20rSIEUt9Wrpw+/8k+snxRlUFHhcqA==}
which-boxed-primitive@1.1.1:
resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
engines: {node: '>= 0.4'}
@ -2281,6 +2437,13 @@ packages:
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
engines: {node: '>=12'}
xhr@2.4.0:
resolution: {integrity: sha512-TUbBsdAuJbX8olk9hsDwGK8P1ri1XlV+PdEWkYw+HQQbpkiBR8PLgD1F3kQDPBs9l4Px34hP9rCYAZOCCAENbw==}
xtend@4.0.2:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
zrender@5.6.1:
resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
@ -2296,6 +2459,8 @@ snapshots:
dependencies:
'@babel/types': 7.28.2
'@babel/runtime@7.28.4': {}
'@babel/types@7.28.2':
dependencies:
'@babel/helper-string-parser': 7.27.1
@ -2518,6 +2683,28 @@ snapshots:
'@types/web-bluetooth@0.0.21': {}
'@videojs/http-streaming@3.17.2(video.js@8.23.4)':
dependencies:
'@babel/runtime': 7.28.4
'@videojs/vhs-utils': 4.1.1
aes-decrypter: 4.0.2
global: 4.4.0
m3u8-parser: 7.2.0
mpd-parser: 1.3.1
mux.js: 7.1.0
video.js: 8.23.4
'@videojs/vhs-utils@4.1.1':
dependencies:
'@babel/runtime': 7.28.4
global: 4.4.0
'@videojs/xhr@2.7.0':
dependencies:
'@babel/runtime': 7.28.4
global: 4.4.0
is-function: 1.0.2
'@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@24.3.0)(sass-embedded@1.89.1))(vue@3.5.16)':
dependencies:
vite: 6.3.5(@types/node@24.3.0)(sass-embedded@1.89.1)
@ -2667,10 +2854,23 @@ snapshots:
- '@vue/composition-api'
- vue
'@xmldom/xmldom@0.8.11': {}
abbrev@2.0.0: {}
acorn@8.15.0: {}
aes-decrypter@1.0.3:
dependencies:
pkcs7: 0.2.3
aes-decrypter@4.0.2:
dependencies:
'@babel/runtime': 7.28.4
'@videojs/vhs-utils': 4.1.1
global: 4.4.0
pkcs7: 1.0.4
ansi-regex@2.1.1: {}
ansi-regex@5.0.1: {}
@ -2730,6 +2930,11 @@ snapshots:
transitivePeerDependencies:
- debug
babel-runtime@6.26.0:
dependencies:
core-js: 2.6.12
regenerator-runtime: 0.11.1
balanced-match@1.0.2: {}
base@0.11.2:
@ -2870,6 +3075,8 @@ snapshots:
copy-descriptor@0.1.1: {}
core-js@2.6.12: {}
cors@2.8.5:
dependencies:
object-assign: 4.1.1
@ -2920,7 +3127,7 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.2
dayjs@1.11.14: {}
dayjs@1.11.18: {}
debug@2.6.9:
dependencies:
@ -2981,6 +3188,8 @@ snapshots:
domhandler: 4.3.1
entities: 2.2.0
dom-walk@0.1.2: {}
domelementtype@1.3.1: {}
domelementtype@2.3.0: {}
@ -3034,7 +3243,7 @@ snapshots:
'@types/lodash-es': 4.17.12
'@vueuse/core': 9.13.0(vue@3.5.16)
async-validator: 4.2.5
dayjs: 1.11.14
dayjs: 1.11.18
escape-html: 1.0.3
lodash: 4.17.21
lodash-es: 4.17.21
@ -3135,6 +3344,8 @@ snapshots:
is-date-object: 1.1.0
is-symbol: 1.1.1
es5-shim@4.6.7: {}
esbuild@0.25.9:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.9
@ -3339,6 +3550,16 @@ snapshots:
package-json-from-dist: 1.0.1
path-scurry: 1.11.1
global@4.3.2:
dependencies:
min-document: 2.19.0
process: 0.5.2
global@4.4.0:
dependencies:
min-document: 2.19.0
process: 0.11.10
globalthis@1.0.4:
dependencies:
define-properties: 1.2.1
@ -3416,6 +3637,8 @@ snapshots:
immutable@5.1.3: {}
individual@2.0.0: {}
inherits@2.0.4: {}
ini@1.3.8: {}
@ -3501,6 +3724,8 @@ snapshots:
is-fullwidth-code-point@3.0.0: {}
is-function@1.0.2: {}
is-generator-function@1.1.0:
dependencies:
call-bound: 1.0.4
@ -3664,6 +3889,14 @@ snapshots:
lru-cache@10.4.3: {}
m3u8-parser@2.1.0: {}
m3u8-parser@7.2.0:
dependencies:
'@babel/runtime': 7.28.4
'@videojs/vhs-utils': 4.1.1
global: 4.4.0
magic-string@0.26.7:
dependencies:
sourcemap-codec: 1.4.8
@ -3719,6 +3952,10 @@ snapshots:
dependencies:
mime-db: 1.52.0
min-document@2.19.0:
dependencies:
dom-walk: 0.1.2
minimatch@9.0.1:
dependencies:
brace-expansion: 2.0.2
@ -3745,10 +3982,24 @@ snapshots:
pkg-types: 1.3.1
ufo: 1.6.1
mpd-parser@1.3.1:
dependencies:
'@babel/runtime': 7.28.4
'@videojs/vhs-utils': 4.1.1
'@xmldom/xmldom': 0.8.11
global: 4.4.0
ms@2.0.0: {}
ms@2.1.3: {}
mux.js@4.3.2: {}
mux.js@7.1.0:
dependencies:
'@babel/runtime': 7.28.4
global: 4.4.0
nanoid@3.3.11: {}
nanomatch@1.2.13:
@ -3823,6 +4074,8 @@ snapshots:
parchment@1.1.4: {}
parse-headers@2.0.6: {}
pascalcase@0.1.1: {}
path-key@3.1.1: {}
@ -3849,6 +4102,12 @@ snapshots:
'@vue/devtools-api': 7.7.7
vue: 3.5.16
pkcs7@0.2.3: {}
pkcs7@1.0.4:
dependencies:
'@babel/runtime': 7.28.4
pkg-types@1.3.1:
dependencies:
confbox: 0.1.8
@ -3905,6 +4164,10 @@ snapshots:
posthtml-parser: 0.2.1
posthtml-render: 1.4.0
process@0.11.10: {}
process@0.5.2: {}
proto-list@1.2.4: {}
proxy-from-env@1.1.0: {}
@ -3956,6 +4219,8 @@ snapshots:
get-proto: 1.0.1
which-builtin-type: 1.2.1
regenerator-runtime@0.11.1: {}
regex-not@1.0.2:
dependencies:
extend-shallow: 3.0.2
@ -4012,6 +4277,10 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
rust-result@1.0.0:
dependencies:
individual: 2.0.0
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
@ -4026,6 +4295,10 @@ snapshots:
safe-buffer@5.2.1: {}
safe-json-parse@4.0.0:
dependencies:
rust-result: 1.0.0
safe-push-apply@1.0.0:
dependencies:
es-errors: 1.3.0
@ -4399,6 +4672,8 @@ snapshots:
tslib@2.8.1: {}
tsml@1.0.1: {}
typed-array-buffer@1.0.3:
dependencies:
call-bound: 1.0.4
@ -4515,6 +4790,8 @@ snapshots:
urix@0.1.0: {}
url-toolkit@2.2.5: {}
use@3.1.1: {}
util-deprecate@1.0.2: {}
@ -4523,6 +4800,71 @@ snapshots:
vary@1.1.2: {}
video.js@6.13.0:
dependencies:
babel-runtime: 6.26.0
global: 4.3.2
safe-json-parse: 4.0.0
tsml: 1.0.1
videojs-font: 2.1.0
videojs-ie8: 1.1.2
videojs-vtt.js: 0.12.6
xhr: 2.4.0
video.js@8.23.4:
dependencies:
'@babel/runtime': 7.28.4
'@videojs/http-streaming': 3.17.2(video.js@8.23.4)
'@videojs/vhs-utils': 4.1.1
'@videojs/xhr': 2.7.0
aes-decrypter: 4.0.2
global: 4.4.0
m3u8-parser: 7.2.0
mpd-parser: 1.3.1
mux.js: 7.1.0
videojs-contrib-quality-levels: 4.1.0(video.js@8.23.4)
videojs-font: 4.2.0
videojs-vtt.js: 0.15.5
videojs-contrib-hls@5.15.0:
dependencies:
aes-decrypter: 1.0.3
global: 4.4.0
m3u8-parser: 2.1.0
mux.js: 4.3.2
url-toolkit: 2.2.5
video.js: 6.13.0
videojs-contrib-media-sources: 4.7.2
webwackify: 0.1.6
videojs-contrib-media-sources@4.7.2:
dependencies:
global: 4.4.0
mux.js: 4.3.2
video.js: 6.13.0
webwackify: 0.1.6
videojs-contrib-quality-levels@4.1.0(video.js@8.23.4):
dependencies:
global: 4.4.0
video.js: 8.23.4
videojs-font@2.1.0: {}
videojs-font@4.2.0: {}
videojs-ie8@1.1.2:
dependencies:
es5-shim: 4.6.7
videojs-vtt.js@0.12.6:
dependencies:
global: 4.4.0
videojs-vtt.js@0.15.5:
dependencies:
global: 4.4.0
vite-plugin-compression@0.5.1(vite@6.3.5(@types/node@24.3.0)(sass-embedded@1.89.1)):
dependencies:
chalk: 4.1.2
@ -4585,6 +4927,8 @@ snapshots:
webpack-virtual-modules@0.6.2: {}
webwackify@0.1.6: {}
which-boxed-primitive@1.1.1:
dependencies:
is-bigint: 1.1.0
@ -4642,6 +4986,15 @@ snapshots:
string-width: 5.1.2
strip-ansi: 7.1.0
xhr@2.4.0:
dependencies:
global: 4.3.2
is-function: 1.0.2
parse-headers: 2.0.6
xtend: 4.0.2
xtend@4.0.2: {}
zrender@5.6.1:
dependencies:
tslib: 2.3.0

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询APP版本发布列表
export function listAppVersionRelease(query) {
return request({
url: '/system/AppVersionRelease/list',
method: 'get',
params: query
})
}
// 查询APP版本发布详细
export function getAppVersionRelease(id) {
return request({
url: '/system/AppVersionRelease/' + id,
method: 'get'
})
}
// 新增APP版本发布
export function addAppVersionRelease(data) {
return request({
url: '/system/AppVersionRelease',
method: 'post',
data: data
})
}
// 修改APP版本发布
export function updateAppVersionRelease(data) {
return request({
url: '/system/AppVersionRelease',
method: 'put',
data: data
})
}
// 删除APP版本发布
export function delAppVersionRelease(id) {
return request({
url: '/system/AppVersionRelease/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,29 @@
import request from '@/utils/request'
// 部门查询
export function deptList() {
return request({
url: '/system/statistics/deptList',
method: 'get'
})
}
// 大屏统计
export function dashboard(data) {
return request({
url: '/system/statistics/dashboard',
method: 'get',
data: data,
params: data
})
}
// 大屏统计
export function dailyTable(data) {
return request({
url: '/system/statistics/dailyTable',
method: 'get',
data: data,
params: data
})
}

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 KiB

BIN
src/assets/images/lower.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
src/assets/images/upper.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 10 KiB

BIN
src/assets/logo/logo1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
src/assets/logo/pic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@ -0,0 +1,77 @@
.el-breadcrumb__inner,
.el-breadcrumb__inner a {
font-weight: 400 !important;
}
.el-upload input[type="file"] {
display: none !important;
}
.el-upload__input {
display: none;
}
.cell .el-tag {
margin-right: 0px;
}
.small-padding .cell {
padding-left: 5px;
padding-right: 5px;
}
.fixed-width .el-button--mini {
padding: 7px 10px;
width: 60px;
}
.status-col .cell {
padding: 0 10px;
text-align: center;
}
.status-col .cell .el-tag {
margin-right: 0px;
}
.el-dialog {
transform: none;
left: 0;
position: relative;
margin: 0 auto;
}
.upload-container .el-upload {
width: 100%;
}
.upload-container .el-upload .el-upload-dragger {
width: 100%;
height: 200px;
}
.el-dropdown-menu a {
display: block;
}
.el-range-editor.el-input__inner {
display: inline-flex !important;
}
.el-range-separator {
box-sizing: content-box;
}
.el-menu--collapse
> div
> .el-submenu
> .el-submenu__title
.el-submenu__icon-arrow {
display: none;
}
.el-dropdown .el-dropdown-link {
color: var(--el-color-primary) !important;
}

View File

@ -0,0 +1 @@
{"version":3,"sources":["element-ui.scss","element-ui.css"],"names":[],"mappings":"AACA;EACE,2BAAA;ACAF;;ADKA;;EAEE,2BAAA;ACFF;;ADME;EACE,wBAAA;ACHJ;;ADOA;EACE,aAAA;ACJF;;ADQE;EACE,iBAAA;ACLJ;;ADUE;EACE,iBAAA;EACA,kBAAA;ACPJ;;ADYE;EACE,iBAAA;EACA,WAAA;ACTJ;;ADcE;EACE,eAAA;EACA,kBAAA;ACXJ;ADaI;EACE,iBAAA;ACXN;;ADiBA;EACE,eAAA;EACA,OAAA;EACA,kBAAA;EACA,cAAA;ACdF;;ADmBE;EACE,WAAA;AChBJ;ADkBI;EACE,WAAA;EACA,aAAA;AChBN;;ADuBE;EACE,cAAA;ACpBJ;;ADyBA;EACE,+BAAA;ACtBF;;AD0BA;EACE,uBAAA;ACvBF;;AD0BA;EAKE,aAAA;AC3BF;;AD8BA;EACE,yCAAA;AC3BF","file":"element-ui.css"}

1
src/assets/styles/element-ui.min.css vendored Normal file
View File

@ -0,0 +1 @@
:root{--el-color-primary:#4D7BFF}.el-breadcrumb__inner,.el-breadcrumb__inner a{font-weight:400 !important}.el-upload input[type="file"]{display:none !important}.el-upload__input{display:none}.cell .el-tag{margin-right:0px}.small-padding .cell{padding-left:5px;padding-right:5px}.fixed-width .el-button--mini{padding:7px 10px;width:60px}.status-col .cell{padding:0 10px;text-align:center}.status-col .cell .el-tag{margin-right:0px}.el-dialog{transform:none;left:0;position:relative;margin:0 auto}.upload-container .el-upload{width:100%}.upload-container .el-upload .el-upload-dragger{width:100%;height:200px}.el-dropdown-menu a{display:block}.el-range-editor.el-input__inner{display:inline-flex !important}.el-range-separator{box-sizing:content-box}.el-menu--collapse>div>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-dropdown .el-dropdown-link{color:var(--el-color-primary) !important}

View File

@ -0,0 +1 @@
{"version":3,"sources":["element-ui.scss"],"names":[],"mappings":"AACA,MACE,2BAAA,CAKF,8CAEE,0BAAA,CAIA,4BACE,uBAAA,CAIJ,kBACE,YAAA,CAIA,cACE,gBAAA,CAKF,qBACE,gBAAA,CACA,iBAAA,CAKF,8BACE,gBAAA,CACA,UAAA,CAKF,kBACE,cAAA,CACA,iBAAA,CAEA,0BACE,gBAAA,CAMN,WACE,cAAA,CACA,MAAA,CACA,iBAAA,CACA,aAAA,CAKA,6BACE,UAAA,CAEA,gDACE,UAAA,CACA,YAAA,CAOJ,oBACE,aAAA,CAKJ,iCACE,8BAAA,CAIF,oBACE,sBAAA,CAGF,8EAKE,YAAA,CAGF,+BACE,wCAAA","file":"element-ui.min.css"}

View File

@ -1,4 +1,9 @@
// cover some element-ui styles
:root {
--el-color-primary:#4D7BFF
}
.el-breadcrumb__inner,
.el-breadcrumb__inner a {

1008
src/assets/styles/index.css Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

2
src/assets/styles/index.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -177,3 +177,10 @@ aside {
margin-bottom: 10px;
}
}
:root {
--el-color-primary: #4D7BFF !important;
}

View File

@ -296,4 +296,22 @@
.splitpanes.default-theme .splitpanes__pane {
background-color: var(--splitpanes-default-bg) !important;
}
.el-dialog__header {
background: #F6F6F6;
padding: 10px 15px;
border-radius: 5px;
}
.el-dialog__header .el-dialog__title {
font-size: 16px;
}
.el-dialog {
padding: 0px;
padding-bottom: 15px;
}
.el-dialog__body {
padding: 15px 25px;
}
/*# sourceMappingURL=ruoyi.css.map */

View File

@ -1 +1 @@
{"version":3,"sources":["ruoyi.css","ruoyi.scss"],"names":[],"mappings":"AAAA,gBAAgB;ACAhB;;;EAAA;AAKA,WAAA;AACA;EACE,gBAAA;ADCF;;ACCA;EACE,kBAAA;ADEF;;ACAA;EACE,mBAAA;ADGF;;ACDA;EACE,eAAA;ADIF;;ACFA;EACE,iBAAA;ADKF;;ACHA;EACE,kBAAA;ADMF;;ACJA;EACE,kBAAA;ADOF;;ACLA;EACE,gBAAA;ADQF;;ACNA;EACE,gBAAA;ADSF;;ACPA;EACE,kBAAA;ADUF;;ACRA;EACE,mBAAA;ADWF;;ACTA;EACE,iBAAA;ADYF;;ACVA;EACE,gBAAA;ADaF;;ACXA;EACE,kBAAA;ADcF;;ACZA;EACE,mBAAA;ADeF;;ACbA;EACE,iBAAA;ADgBF;;ACbA;EACE,oBAAA;EACA,gBAAA;EACA,gBAAA;EACA,cAAA;ADgBF;;ACbA;EACE,gBAAA;ADgBF;;ACdA;EACE,0BAAA;ADiBF;;ACfA;EACE,uBAAA;ADkBF;;ACfA;EACE,cAAA;EACA,kBAAA;EACA,gBAAA;EACA,oBAAA;ADkBF;;ACbI;EACE,sBAAA;EACA,oCAAA;EACA,cAAA;EACA,uBAAA;EACA,eAAA;ADgBN;ACZI;EACE,gBAAA;ADcN;;ACTA,WAAA;AACA;EACE,eAAA;EACA,cAAA;EACA,6BAAA;EACA,0BAAA;EACA,mBAAA;ADYF;;ACTA,WAAA;AACA;EACE,aAAA;EACA,yBAAA;EACA,gBAAA;EACA,wCAAA;ADYF;;ACTA,YAAA;AACA;EACE,2BAAA;EACA,kBAAA;EACA,qBAAA;ADYF;ACVE;EACE,gBAAA;ADYJ;;ACRA,UAAA;AACA;EAGM;IACE,wBAAA;EDSN;ECPI;IACE,wBAAA;EDSN;AACF;ACJA,gBAAA;AACA;EACE,eAAA;EACA,uDAAA;EACA,4CAAA;EACA,kBAAA;EACA,WAAA;ADMF;;ACHA;EACE,eAAA;EACA,gBAAA;EACA,cAAA;ADMF;;ACHA,gBAAA;AACA;EACE,eAAA;EACA,cAAA;EACA,iBAAA;ADMF;;ACHA;EACE,eAAA;ADMF;;ACHA;EACE,iBAAA;ADMF;;ACHA;EACE,cAAA;EACA,eAAA;EACA,gBAAA;EACA,eAAA;EACA,gBAAA;ADMF;;ACHA;EACE,iBAAA;EACA,gBAAA;ADMF;;ACHA;EACE,gCAAA;EACA,6BAAA;EACA,mBAAA;EACA,iBAAA;EACA,eAAA;ADMF;;ACHA;EACE,uBAAA;ADMF;;ACHA;EACE,iCAAA;EACA,gBAAA;ADMF;;ACHA;EACE,uCAAA;ADMF;;ACHA;EACE,mBAAA;ADMF;;ACHA,iBAAA;AACA;;EAEE,mBAAA;EACA,qBAAA;EACA,cAAA;ADMF;;ACHA;;EAEE,mBAAA;EACA,qBAAA;EACA,cAAA;ADMF;;ACHA;EACE,yBAAA;EACA,qBAAA;EACA,cAAA;ADMF;;ACHA,eAAA;AACA;EACE,cAAA;ADMF;;ACHA;EACE,cAAA;ADMF;;ACHA;EACE,cAAA;ADMF;;ACHA;EACE,cAAA;ADMF;;ACHA;EACE,cAAA;ADMF;;ACHA;EACE,cAAA;ADMF;;ACHA;EACE,cAAA;ADMF;;ACHA,UAAA;AACA;EACE,kBAAA;ADMF;;ACHA;EACE,YAAA;EACA,aAAA;ADMF;;ACHA;EACE,kBAAA;EACA,QAAA;EACA,+BAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,wBAAA;EACA,gBAAA;ADMF;;ACHA,UAAA;AACA;EACE,YAAA;EACA,sBAAA;EACA,8BAAA;ADMF;;ACHA,cAAA;AACA;EACE,iBAAA;ADMF;;ACHA,WAAA;AACA;EACE,yDAAA;ADMF","file":"ruoyi.css"}
{"version":3,"sources":["ruoyi.css","ruoyi.scss"],"names":[],"mappings":"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","file":"ruoyi.css"}

View File

@ -1,2 +1,2 @@
.pt5{padding-top:5px}.pr5{padding-right:5px}.pb5{padding-bottom:5px}.mt5{margin-top:5px}.mr5{margin-right:5px}.mb5{margin-bottom:5px}.mb8{margin-bottom:8px}.ml5{margin-left:5px}.mt10{margin-top:10px}.mr10{margin-right:10px}.mb10{margin-bottom:10px}.ml10{margin-left:10px}.mt20{margin-top:20px}.mr20{margin-right:20px}.mb20{margin-bottom:20px}.ml20{margin-left:20px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.el-form .el-form-item__label{font-weight:700}.el-dialog:not(.is-fullscreen){margin-top:6vh !important}.el-dialog.is-align-center{margin:auto !important}.el-dialog.scrollbar .el-dialog__body{overflow:auto;overflow-x:hidden;max-height:70vh;padding:10px 20px 0}.el-table .el-table__header-wrapper th,.el-table .el-table__fixed-header-wrapper th{word-break:break-word;background-color:#f8f8f9 !important;color:#515a6e;height:40px !important;font-size:13px}.el-table .el-table__body-wrapper .el-button [class*=el-icon-]+span{margin-left:1px}.form-header{font-size:15px;color:#6379bb;border-bottom:1px solid #ddd;margin:8px 10px 25px 10px;padding-bottom:5px}.pagination-container{display:flex;justify-content:flex-end;margin-top:20px;background-color:rgba(0,0,0,0) !important}.el-dialog .pagination-container{position:static !important;margin:10px 0 0 0;padding:0 !important}.el-dialog .pagination-container .el-pagination{position:static}@media(max-width: 768px){.pagination-container .el-pagination>.el-pagination__jump{display:none !important}.pagination-container .el-pagination>.el-pagination__sizes{display:none !important}}.tree-border{margin-top:5px;border:1px solid var(--el-border-color-light, #e5e6e7);background:var(--el-bg-color, #FFFFFF) none;border-radius:4px;width:100%}.el-table .fixed-width .el-button--small{padding-left:0;padding-right:0;width:inherit}.el-table .el-dropdown-link{cursor:pointer;color:#409eff;margin-left:10px}.el-table .el-dropdown,.el-icon-arrow-down{font-size:12px}.el-tree-node__content>.el-checkbox{margin-right:8px}.list-group-striped>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.list-group{padding-left:0px;list-style:none}.list-group-item{border-bottom:1px solid #e7eaec;border-top:1px solid #e7eaec;margin-bottom:-1px;padding:11px 0px;font-size:13px}.pull-right{float:right !important}.el-card__header{padding:14px 15px 7px !important;min-height:40px}.el-card__body{padding:15px 20px 20px 20px !important}.card-box{margin-bottom:10px}.el-button--cyan.is-active,.el-button--cyan:active{background:#20b2aa;border-color:#20b2aa;color:#fff}.el-button--cyan:focus,.el-button--cyan:hover{background:#48d1cc;border-color:#48d1cc;color:#fff}.el-button--cyan{background-color:#20b2aa;border-color:#20b2aa;color:#fff}.text-navy{color:#1ab394}.text-primary{color:inherit}.text-success{color:#1c84c6}.text-info{color:#23c6c8}.text-warning{color:#f8ac59}.text-danger{color:#ed5565}.text-muted{color:#888}.img-circle{border-radius:50%}.img-lg{width:120px;height:120px}.avatar-upload-preview{position:absolute;top:50%;transform:translate(50%, -50%);width:200px;height:200px;border-radius:50%;box-shadow:0 0 4px #ccc;overflow:hidden}.sortable-ghost{opacity:.8;color:#fff !important;background:#42b983 !important}.top-right-btn{margin-left:auto}.splitpanes.default-theme .splitpanes__pane{background-color:var(--splitpanes-default-bg) !important}
.pt5{padding-top:5px}.pr5{padding-right:5px}.pb5{padding-bottom:5px}.mt5{margin-top:5px}.mr5{margin-right:5px}.mb5{margin-bottom:5px}.mb8{margin-bottom:8px}.ml5{margin-left:5px}.mt10{margin-top:10px}.mr10{margin-right:10px}.mb10{margin-bottom:10px}.ml10{margin-left:10px}.mt20{margin-top:20px}.mr20{margin-right:20px}.mb20{margin-bottom:20px}.ml20{margin-left:20px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.el-form .el-form-item__label{font-weight:700}.el-dialog:not(.is-fullscreen){margin-top:6vh !important}.el-dialog.is-align-center{margin:auto !important}.el-dialog.scrollbar .el-dialog__body{overflow:auto;overflow-x:hidden;max-height:70vh;padding:10px 20px 0}.el-table .el-table__header-wrapper th,.el-table .el-table__fixed-header-wrapper th{word-break:break-word;background-color:#f8f8f9 !important;color:#515a6e;height:40px !important;font-size:13px}.el-table .el-table__body-wrapper .el-button [class*=el-icon-]+span{margin-left:1px}.form-header{font-size:15px;color:#6379bb;border-bottom:1px solid #ddd;margin:8px 10px 25px 10px;padding-bottom:5px}.pagination-container{display:flex;justify-content:flex-end;margin-top:20px;background-color:rgba(0,0,0,0) !important}.el-dialog .pagination-container{position:static !important;margin:10px 0 0 0;padding:0 !important}.el-dialog .pagination-container .el-pagination{position:static}@media(max-width: 768px){.pagination-container .el-pagination>.el-pagination__jump{display:none !important}.pagination-container .el-pagination>.el-pagination__sizes{display:none !important}}.tree-border{margin-top:5px;border:1px solid var(--el-border-color-light, #e5e6e7);background:var(--el-bg-color, #FFFFFF) none;border-radius:4px;width:100%}.el-table .fixed-width .el-button--small{padding-left:0;padding-right:0;width:inherit}.el-table .el-dropdown-link{cursor:pointer;color:#409eff;margin-left:10px}.el-table .el-dropdown,.el-icon-arrow-down{font-size:12px}.el-tree-node__content>.el-checkbox{margin-right:8px}.list-group-striped>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.list-group{padding-left:0px;list-style:none}.list-group-item{border-bottom:1px solid #e7eaec;border-top:1px solid #e7eaec;margin-bottom:-1px;padding:11px 0px;font-size:13px}.pull-right{float:right !important}.el-card__header{padding:14px 15px 7px !important;min-height:40px}.el-card__body{padding:15px 20px 20px 20px !important}.card-box{margin-bottom:10px}.el-button--cyan.is-active,.el-button--cyan:active{background:#20b2aa;border-color:#20b2aa;color:#fff}.el-button--cyan:focus,.el-button--cyan:hover{background:#48d1cc;border-color:#48d1cc;color:#fff}.el-button--cyan{background-color:#20b2aa;border-color:#20b2aa;color:#fff}.text-navy{color:#1ab394}.text-primary{color:inherit}.text-success{color:#1c84c6}.text-info{color:#23c6c8}.text-warning{color:#f8ac59}.text-danger{color:#ed5565}.text-muted{color:#888}.img-circle{border-radius:50%}.img-lg{width:120px;height:120px}.avatar-upload-preview{position:absolute;top:50%;transform:translate(50%, -50%);width:200px;height:200px;border-radius:50%;box-shadow:0 0 4px #ccc;overflow:hidden}.sortable-ghost{opacity:.8;color:#fff !important;background:#42b983 !important}.top-right-btn{margin-left:auto}.splitpanes.default-theme .splitpanes__pane{background-color:var(--splitpanes-default-bg) !important}.el-dialog__header{background:#f6f6f6;padding:10px 15px;border-radius:5px}.el-dialog__header .el-dialog__title{font-size:16px}.el-dialog{padding:0px;padding-bottom:15px}.el-dialog__body{padding:15px 25px}
/*# sourceMappingURL=ruoyi.min.css.map */

View File

@ -1 +1 @@
{"version":3,"sources":["ruoyi.scss"],"names":[],"mappings":"AAMA,KACE,eAAA,CAEF,KACE,iBAAA,CAEF,KACE,kBAAA,CAEF,KACE,cAAA,CAEF,KACE,gBAAA,CAEF,KACE,iBAAA,CAEF,KACE,iBAAA,CAEF,KACE,eAAA,CAEF,MACE,eAAA,CAEF,MACE,iBAAA,CAEF,MACE,kBAAA,CAEF,MACE,gBAAA,CAEF,MACE,eAAA,CAEF,MACE,iBAAA,CAEF,MACE,kBAAA,CAEF,MACE,gBAAA,CAGF,0CACE,mBAAA,CACA,eAAA,CACA,eAAA,CACA,aAAA,CAGF,8BACE,eAAA,CAEF,+BACE,yBAAA,CAEF,2BACE,sBAAA,CAGF,sCACE,aAAA,CACA,iBAAA,CACA,eAAA,CACA,mBAAA,CAKE,oFACE,qBAAA,CACA,mCAAA,CACA,aAAA,CACA,sBAAA,CACA,cAAA,CAIF,oEACE,eAAA,CAMN,aACE,cAAA,CACA,aAAA,CACA,4BAAA,CACA,yBAAA,CACA,kBAAA,CAIF,sBACE,YAAA,CACA,wBAAA,CACA,eAAA,CACA,yCAAA,CAIF,iCACE,0BAAA,CACA,iBAAA,CACA,oBAAA,CAEA,gDACE,eAAA,CAKJ,yBAGM,0DACE,uBAAA,CAEF,2DACE,uBAAA,CAAA,CAOR,aACE,cAAA,CACA,sDAAA,CACA,2CAAA,CACA,iBAAA,CACA,UAAA,CAGF,yCACE,cAAA,CACA,eAAA,CACA,aAAA,CAIF,4BACE,cAAA,CACA,aAAA,CACA,gBAAA,CAGF,2CACE,cAAA,CAGF,oCACE,gBAAA,CAGF,qCACE,aAAA,CACA,cAAA,CACA,eAAA,CACA,cAAA,CACA,eAAA,CAGF,YACE,gBAAA,CACA,eAAA,CAGF,iBACE,+BAAA,CACA,4BAAA,CACA,kBAAA,CACA,gBAAA,CACA,cAAA,CAGF,YACE,sBAAA,CAGF,iBACE,gCAAA,CACA,eAAA,CAGF,eACE,sCAAA,CAGF,UACE,kBAAA,CAIF,mDAEE,kBAAA,CACA,oBAAA,CACA,UAAA,CAGF,8CAEE,kBAAA,CACA,oBAAA,CACA,UAAA,CAGF,iBACE,wBAAA,CACA,oBAAA,CACA,UAAA,CAIF,WACE,aAAA,CAGF,cACE,aAAA,CAGF,cACE,aAAA,CAGF,WACE,aAAA,CAGF,cACE,aAAA,CAGF,aACE,aAAA,CAGF,YACE,UAAA,CAIF,YACE,iBAAA,CAGF,QACE,WAAA,CACA,YAAA,CAGF,uBACE,iBAAA,CACA,OAAA,CACA,8BAAA,CACA,WAAA,CACA,YAAA,CACA,iBAAA,CACA,uBAAA,CACA,eAAA,CAIF,gBACE,UAAA,CACA,qBAAA,CACA,6BAAA,CAIF,eACE,gBAAA,CAIF,4CACE,wDAAA","file":"ruoyi.min.css"}
{"version":3,"sources":["ruoyi.scss"],"names":[],"mappings":"AAMA,KACE,eAAA,CAEF,KACE,iBAAA,CAEF,KACE,kBAAA,CAEF,KACE,cAAA,CAEF,KACE,gBAAA,CAEF,KACE,iBAAA,CAEF,KACE,iBAAA,CAEF,KACE,eAAA,CAEF,MACE,eAAA,CAEF,MACE,iBAAA,CAEF,MACE,kBAAA,CAEF,MACE,gBAAA,CAEF,MACE,eAAA,CAEF,MACE,iBAAA,CAEF,MACE,kBAAA,CAEF,MACE,gBAAA,CAGF,0CACE,mBAAA,CACA,eAAA,CACA,eAAA,CACA,aAAA,CAGF,8BACE,eAAA,CAEF,+BACE,yBAAA,CAEF,2BACE,sBAAA,CAGF,sCACE,aAAA,CACA,iBAAA,CACA,eAAA,CACA,mBAAA,CAKE,oFACE,qBAAA,CACA,mCAAA,CACA,aAAA,CACA,sBAAA,CACA,cAAA,CAIF,oEACE,eAAA,CAMN,aACE,cAAA,CACA,aAAA,CACA,4BAAA,CACA,yBAAA,CACA,kBAAA,CAIF,sBACE,YAAA,CACA,wBAAA,CACA,eAAA,CACA,yCAAA,CAIF,iCACE,0BAAA,CACA,iBAAA,CACA,oBAAA,CAEA,gDACE,eAAA,CAKJ,yBAGM,0DACE,uBAAA,CAEF,2DACE,uBAAA,CAAA,CAOR,aACE,cAAA,CACA,sDAAA,CACA,2CAAA,CACA,iBAAA,CACA,UAAA,CAGF,yCACE,cAAA,CACA,eAAA,CACA,aAAA,CAIF,4BACE,cAAA,CACA,aAAA,CACA,gBAAA,CAGF,2CACE,cAAA,CAGF,oCACE,gBAAA,CAGF,qCACE,aAAA,CACA,cAAA,CACA,eAAA,CACA,cAAA,CACA,eAAA,CAGF,YACE,gBAAA,CACA,eAAA,CAGF,iBACE,+BAAA,CACA,4BAAA,CACA,kBAAA,CACA,gBAAA,CACA,cAAA,CAGF,YACE,sBAAA,CAGF,iBACE,gCAAA,CACA,eAAA,CAGF,eACE,sCAAA,CAGF,UACE,kBAAA,CAIF,mDAEE,kBAAA,CACA,oBAAA,CACA,UAAA,CAGF,8CAEE,kBAAA,CACA,oBAAA,CACA,UAAA,CAGF,iBACE,wBAAA,CACA,oBAAA,CACA,UAAA,CAIF,WACE,aAAA,CAGF,cACE,aAAA,CAGF,cACE,aAAA,CAGF,WACE,aAAA,CAGF,cACE,aAAA,CAGF,aACE,aAAA,CAGF,YACE,UAAA,CAIF,YACE,iBAAA,CAGF,QACE,WAAA,CACA,YAAA,CAGF,uBACE,iBAAA,CACA,OAAA,CACA,8BAAA,CACA,WAAA,CACA,YAAA,CACA,iBAAA,CACA,uBAAA,CACA,eAAA,CAIF,gBACE,UAAA,CACA,qBAAA,CACA,6BAAA,CAIF,eACE,gBAAA,CAIF,4CACE,wDAAA,CAEF,mBACC,kBAAA,CACA,iBAAA,CACA,iBAAA,CACA,qCACC,cAAA,CAGF,WACE,WAAA,CACA,mBAAA,CAEF,iBACE,iBAAA","file":"ruoyi.min.css"}

View File

@ -291,3 +291,18 @@
.splitpanes.default-theme .splitpanes__pane {
background-color: var(--splitpanes-default-bg) !important;
}
.el-dialog__header{
background: #F6F6F6;
padding:10px 15px;
border-radius: 5px;
.el-dialog__title{
font-size: 16px;
}
}
.el-dialog{
padding: 0px;
padding-bottom: 15px;
}
.el-dialog__body{
padding: 15px 25px;
}

View File

@ -0,0 +1,299 @@
@charset "UTF-8";
:export {
menuText: #bfcbd9;
menuActiveText: #409eff;
menuBg: #222653;
menuHover: #222653;
menuLightBg: #ffffff;
menuLightHover: #f0f1f5;
menuLightText: #303133;
menuLightActiveText: #409EFF;
sideBarWidth: 200px;
blue: #324157;
lightBlue: #333c46;
red: #C03639;
pink: #E65D6E;
green: #30B08F;
tiffany: #4AB7BD;
yellow: #FEC171;
panGreen: #30B08F;
colorPrimary: #409EFF;
colorSuccess: #67C23A;
colorWarning: #E6A23C;
colorDanger: #F56C6C;
colorInfo: #909399;
}
:root {
/* 亮色模式变量 */
--sidebar-bg: #222653;
--sidebar-text: #bfcbd9;
--menu-hover: #222653;
--navbar-bg: #ffffff;
--navbar-text: #303133;
/* splitpanes default-theme 变量 */
--splitpanes-default-bg: #ffffff;
}
html.dark {
/* 默认通用 */
--el-bg-color: #141414;
--el-bg-color-overlay: #1d1e1f;
--el-text-color-primary: #ffffff;
--el-text-color-regular: #d0d0d0;
--el-border-color: #434343;
--el-border-color-light: #434343;
/* 侧边栏 */
--sidebar-bg: #141414;
--sidebar-text: #ffffff;
--menu-hover: #2d2d2d;
--menu-active-text: #409eff;
/* 顶部导航栏 */
--navbar-bg: #141414;
--navbar-text: #ffffff;
--navbar-hover: #141414;
/* 标签栏 */
--tags-bg: #141414;
--tags-item-bg: #1d1e1f;
--tags-item-border: #303030;
--tags-item-text: #d0d0d0;
--tags-item-hover: #2d2d2d;
--tags-close-hover: #64666a;
/* splitpanes 组件暗黑模式变量 */
--splitpanes-bg: #141414;
--splitpanes-border: #303030;
--splitpanes-splitter-bg: #1d1e1f;
--splitpanes-splitter-hover-bg: #2d2d2d;
/* blockquote 暗黑模式变量 */
--blockquote-bg: #1d1e1f;
--blockquote-border: #303030;
--blockquote-text: #d0d0d0;
/* Cron 时间表达式 模式变量 */
--cron-border: #303030;
/* splitpanes default-theme 暗黑模式变量 */
--splitpanes-default-bg: #141414;
/* 侧边栏菜单覆盖 */
/* 顶部栏栏菜单覆盖 */
/* 分割窗格覆盖 */
/* 表格样式覆盖 */
/* 树组件高亮样式覆盖 */
/* 下拉菜单样式覆盖 */
/* blockquote样式覆盖 */
/* 时间表达式标题样式覆盖 */
}
html.dark .sidebar-container .el-menu-item, html.dark .sidebar-container .menu-title {
color: var(--el-text-color-regular);
}
html.dark .sidebar-container .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title, html.dark .sidebar-container .theme-dark .el-sub-menu .el-menu-item {
background-color: var(--el-bg-color) !important;
}
html.dark .el-menu--horizontal .el-menu-item:not(.is-disabled):hover, html.dark .el-menu--horizontal .el-menu-item:not(.is-disabled):focus {
background-color: var(--navbar-hover) !important;
}
html.dark .splitpanes {
background-color: var(--splitpanes-bg);
}
html.dark .splitpanes .splitpanes__pane {
background-color: var(--splitpanes-bg);
border-color: var(--splitpanes-border);
}
html.dark .splitpanes .splitpanes__splitter {
background-color: var(--splitpanes-splitter-bg);
border-color: var(--splitpanes-border);
}
html.dark .splitpanes .splitpanes__splitter:hover {
background-color: var(--splitpanes-splitter-hover-bg);
}
html.dark .splitpanes .splitpanes__splitter:before, html.dark .splitpanes .splitpanes__splitter:after {
background-color: var(--splitpanes-border);
}
html.dark .el-table {
--el-table-header-bg-color: var(--el-bg-color-overlay) !important;
--el-table-header-text-color: var(--el-text-color-regular) !important;
--el-table-border-color: var(--el-border-color-light) !important;
--el-table-row-hover-bg-color: var(--el-bg-color-overlay) !important;
}
html.dark .el-table .el-table__header-wrapper th, html.dark .el-table .el-table__fixed-header-wrapper th {
background-color: var(--el-bg-color-overlay, #f8f8f9) !important;
color: var(--el-text-color-regular, #515a6e);
}
html.dark .el-tree .el-tree-node.is-current > .el-tree-node__content {
background-color: var(--el-bg-color-overlay) !important;
color: var(--el-color-primary);
}
html.dark .el-tree .el-tree-node__content:hover {
background-color: var(--el-bg-color-overlay);
}
html.dark .el-dropdown-menu__item:not(.is-disabled):focus, html.dark .el-dropdown-menu__item:not(.is-disabled):hover {
background-color: var(--navbar-hover) !important;
}
html.dark blockquote {
background-color: var(--blockquote-bg) !important;
border-left-color: var(--blockquote-border) !important;
color: var(--blockquote-text) !important;
}
html.dark .popup-result .title {
background: var(--cron-border);
}
#app .main-container {
min-height: 100%;
transition: margin-left 0.28s;
margin-left: 200px;
position: relative;
}
#app .sidebarHide {
margin-left: 0 !important;
}
#app .sidebar-container {
transition: width 0.28s;
width: 200px !important;
height: 100%;
position: fixed;
font-size: 0px;
top: 0;
bottom: 0;
left: 0;
z-index: 1001;
overflow: hidden;
box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1);
}
#app .sidebar-container .horizontal-collapse-transition {
transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
}
#app .sidebar-container .scrollbar-wrapper {
overflow-x: hidden !important;
}
#app .sidebar-container .el-scrollbar__bar.is-vertical {
right: 0px;
}
#app .sidebar-container .el-scrollbar {
height: 100%;
}
#app .sidebar-container.has-logo .el-scrollbar {
height: calc(100% - 50px);
}
#app .sidebar-container .is-horizontal {
display: none;
}
#app .sidebar-container a {
display: inline-block;
width: 100%;
overflow: hidden;
}
#app .sidebar-container .svg-icon {
margin-right: 16px;
}
#app .sidebar-container .el-menu {
border: none;
height: 100%;
width: 100% !important;
}
#app .sidebar-container .el-menu-item, #app .sidebar-container .menu-title {
overflow: hidden !important;
text-overflow: ellipsis !important;
white-space: nowrap !important;
}
#app .sidebar-container .el-menu-item .el-menu-tooltip__trigger {
display: inline-block !important;
}
#app .sidebar-container .sub-menu-title-noDropdown:hover,
#app .sidebar-container .el-sub-menu__title:hover {
background-color: rgba(0, 0, 0, 0.06) !important;
}
#app .sidebar-container .theme-dark .is-active > .el-sub-menu__title {
color: #f4f4f5 !important;
}
#app .sidebar-container .nest-menu .el-sub-menu > .el-sub-menu__title, #app .sidebar-container .el-sub-menu .el-menu-item {
min-width: 200px !important;
}
#app .sidebar-container .nest-menu .el-sub-menu > .el-sub-menu__title:hover, #app .sidebar-container .el-sub-menu .el-menu-item:hover {
background-color: rgba(0, 0, 0, 0.06) !important;
}
#app .sidebar-container .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title, #app .sidebar-container .theme-dark .el-sub-menu .el-menu-item {
background-color: #222653;
}
#app .sidebar-container .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title:hover, #app .sidebar-container .theme-dark .el-sub-menu .el-menu-item:hover {
background-color: #222653 !important;
}
#app .hideSidebar .sidebar-container {
width: 54px !important;
}
#app .hideSidebar .main-container {
margin-left: 54px;
}
#app .hideSidebar .sub-menu-title-noDropdown {
padding: 0 !important;
position: relative;
}
#app .hideSidebar .sub-menu-title-noDropdown .el-tooltip {
padding: 0 !important;
}
#app .hideSidebar .sub-menu-title-noDropdown .el-tooltip .svg-icon {
margin-left: 20px;
}
#app .hideSidebar .el-sub-menu {
overflow: hidden;
}
#app .hideSidebar .el-sub-menu > .el-sub-menu__title {
padding: 0 !important;
}
#app .hideSidebar .el-sub-menu > .el-sub-menu__title .svg-icon {
margin-left: 20px;
}
#app .hideSidebar .el-menu--collapse .el-sub-menu > .el-sub-menu__title > span {
height: 0;
width: 0;
overflow: hidden;
visibility: hidden;
display: inline-block;
}
#app .hideSidebar .el-menu--collapse .el-sub-menu > .el-sub-menu__title > i {
height: 0;
width: 0;
overflow: hidden;
visibility: hidden;
display: inline-block;
}
#app .el-menu--collapse .el-menu .el-sub-menu {
min-width: 200px !important;
}
#app .mobile .main-container {
margin-left: 0px;
}
#app .mobile .sidebar-container {
transition: transform 0.28s;
width: 200px !important;
}
#app .mobile.hideSidebar .sidebar-container {
pointer-events: none;
transition-duration: 0.3s;
transform: translate3d(-200px, 0, 0);
}
#app .withoutAnimation .main-container,
#app .withoutAnimation .sidebar-container {
transition: none;
}
.el-menu--vertical > .el-menu .svg-icon {
margin-right: 16px;
}
.el-menu--vertical .nest-menu .el-sub-menu > .el-sub-menu__title:hover,
.el-menu--vertical .el-menu-item:hover {
background-color: rgba(0, 0, 0, 0.06) !important;
}
.el-menu--vertical > .el-menu--popup {
max-height: 100vh;
overflow-y: auto;
}
.el-menu--vertical > .el-menu--popup::-webkit-scrollbar-track-piece {
background: #d3dce6;
}
.el-menu--vertical > .el-menu--popup::-webkit-scrollbar {
width: 6px;
}
.el-menu--vertical > .el-menu--popup::-webkit-scrollbar-thumb {
background: #99a9bf;
border-radius: 20px;
}
/*# sourceMappingURL=sidebar.css.map */

View File

@ -0,0 +1 @@
{"version":3,"sources":["sidebar.css","variables.module.scss","sidebar.scss"],"names":[],"mappings":"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","file":"sidebar.css"}

2
src/assets/styles/sidebar.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"version":3,"sources":["variables.module.scss","sidebar.scss"],"names":[],"mappings":"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","file":"sidebar.min.css"}

View File

@ -0,0 +1,138 @@
@charset "UTF-8";
:export {
menuText: #bfcbd9;
menuActiveText: #409eff;
menuBg: #222653;
menuHover: #222653;
menuLightBg: #ffffff;
menuLightHover: #f0f1f5;
menuLightText: #303133;
menuLightActiveText: #409EFF;
sideBarWidth: 200px;
blue: #324157;
lightBlue: #333c46;
red: #C03639;
pink: #E65D6E;
green: #30B08F;
tiffany: #4AB7BD;
yellow: #FEC171;
panGreen: #30B08F;
colorPrimary: #409EFF;
colorSuccess: #67C23A;
colorWarning: #E6A23C;
colorDanger: #F56C6C;
colorInfo: #909399;
}
:root {
/* 亮色模式变量 */
--sidebar-bg: #222653;
--sidebar-text: #bfcbd9;
--menu-hover: #222653;
--navbar-bg: #ffffff;
--navbar-text: #303133;
/* splitpanes default-theme 变量 */
--splitpanes-default-bg: #ffffff;
}
html.dark {
/* 默认通用 */
--el-bg-color: #141414;
--el-bg-color-overlay: #1d1e1f;
--el-text-color-primary: #ffffff;
--el-text-color-regular: #d0d0d0;
--el-border-color: #434343;
--el-border-color-light: #434343;
/* 侧边栏 */
--sidebar-bg: #141414;
--sidebar-text: #ffffff;
--menu-hover: #2d2d2d;
--menu-active-text: #409eff;
/* 顶部导航栏 */
--navbar-bg: #141414;
--navbar-text: #ffffff;
--navbar-hover: #141414;
/* 标签栏 */
--tags-bg: #141414;
--tags-item-bg: #1d1e1f;
--tags-item-border: #303030;
--tags-item-text: #d0d0d0;
--tags-item-hover: #2d2d2d;
--tags-close-hover: #64666a;
/* splitpanes 组件暗黑模式变量 */
--splitpanes-bg: #141414;
--splitpanes-border: #303030;
--splitpanes-splitter-bg: #1d1e1f;
--splitpanes-splitter-hover-bg: #2d2d2d;
/* blockquote 暗黑模式变量 */
--blockquote-bg: #1d1e1f;
--blockquote-border: #303030;
--blockquote-text: #d0d0d0;
/* Cron 时间表达式 模式变量 */
--cron-border: #303030;
/* splitpanes default-theme 暗黑模式变量 */
--splitpanes-default-bg: #141414;
/* 侧边栏菜单覆盖 */
/* 顶部栏栏菜单覆盖 */
/* 分割窗格覆盖 */
/* 表格样式覆盖 */
/* 树组件高亮样式覆盖 */
/* 下拉菜单样式覆盖 */
/* blockquote样式覆盖 */
/* 时间表达式标题样式覆盖 */
}
html.dark .sidebar-container .el-menu-item, html.dark .sidebar-container .menu-title {
color: var(--el-text-color-regular);
}
html.dark .sidebar-container .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title, html.dark .sidebar-container .theme-dark .el-sub-menu .el-menu-item {
background-color: var(--el-bg-color) !important;
}
html.dark .el-menu--horizontal .el-menu-item:not(.is-disabled):hover, html.dark .el-menu--horizontal .el-menu-item:not(.is-disabled):focus {
background-color: var(--navbar-hover) !important;
}
html.dark .splitpanes {
background-color: var(--splitpanes-bg);
}
html.dark .splitpanes .splitpanes__pane {
background-color: var(--splitpanes-bg);
border-color: var(--splitpanes-border);
}
html.dark .splitpanes .splitpanes__splitter {
background-color: var(--splitpanes-splitter-bg);
border-color: var(--splitpanes-border);
}
html.dark .splitpanes .splitpanes__splitter:hover {
background-color: var(--splitpanes-splitter-hover-bg);
}
html.dark .splitpanes .splitpanes__splitter:before, html.dark .splitpanes .splitpanes__splitter:after {
background-color: var(--splitpanes-border);
}
html.dark .el-table {
--el-table-header-bg-color: var(--el-bg-color-overlay) !important;
--el-table-header-text-color: var(--el-text-color-regular) !important;
--el-table-border-color: var(--el-border-color-light) !important;
--el-table-row-hover-bg-color: var(--el-bg-color-overlay) !important;
}
html.dark .el-table .el-table__header-wrapper th, html.dark .el-table .el-table__fixed-header-wrapper th {
background-color: var(--el-bg-color-overlay, #f8f8f9) !important;
color: var(--el-text-color-regular, #515a6e);
}
html.dark .el-tree .el-tree-node.is-current > .el-tree-node__content {
background-color: var(--el-bg-color-overlay) !important;
color: var(--el-color-primary);
}
html.dark .el-tree .el-tree-node__content:hover {
background-color: var(--el-bg-color-overlay);
}
html.dark .el-dropdown-menu__item:not(.is-disabled):focus, html.dark .el-dropdown-menu__item:not(.is-disabled):hover {
background-color: var(--navbar-hover) !important;
}
html.dark blockquote {
background-color: var(--blockquote-bg) !important;
border-left-color: var(--blockquote-border) !important;
color: var(--blockquote-text) !important;
}
html.dark .popup-result .title {
background: var(--cron-border);
}
/*# sourceMappingURL=variables.module.css.map */

View File

@ -0,0 +1 @@
{"version":3,"sources":["variables.module.css","variables.module.scss"],"names":[],"mappings":"AAAA,gBAAgB;ACwChB;EACE,iBA9BS;EA+BT,uBA9Be;EA+Bf,eA9BO;EA+BP,kBA9BU;EA+BV,oBA5BY;EA6BZ,uBA5Be;EA6Bf,sBA5Bc;EA6Bd,4BA5BoB;EA6BpB,mBAzBa;EA2Bb,aAlDK;EAmDL,kBAlDW;EAmDX,YAlDI;EAmDJ,aAlDK;EAmDL,cAlDM;EAmDN,gBAlDQ;EAmDR,eAlDO;EAmDP,iBAlDS;EAoDT,qBA1BgB;EA2BhB,qBA1BgB;EA2BhB,qBA1BgB;EA2BhB,oBA1Be;EA2Bf,kBA1Ba;ADdf;;AC4CA;EACE,WAAA;EACA,qBAAA;EACA,uBAAA;EACA,qBAAA;EAEA,oBAAA;EACA,sBAAA;EAEA,gCAAA;EACA,gCAAA;AD3CF;;ACgDA;EACE,SAAA;EACA,sBAAA;EACA,8BAAA;EACA,gCAAA;EACA,gCAAA;EACA,0BAAA;EACA,gCAAA;EAEA,QAAA;EACA,qBAAA;EACA,uBAAA;EACA,qBAAA;EACA,2BAAA;EAEA,UAAA;EACA,oBAAA;EACA,sBAAA;EACA,uBAAA;EAEA,QAAA;EACA,kBAAA;EACA,uBAAA;EACA,2BAAA;EACA,yBAAA;EACA,0BAAA;EACA,2BAAA;EAEA,wBAAA;EACA,wBAAA;EACA,4BAAA;EACA,iCAAA;EACA,uCAAA;EAEA,sBAAA;EACA,wBAAA;EACA,4BAAA;EACA,0BAAA;EAEA,oBAAA;EACA,sBAAA;EAEA,oCAAA;EACA,gCAAA;EAEA,YAAA;EAWA,aAAA;EAYA,WAAA;EAwBA,WAAA;EAeA,cAAA;EAYA,aAAA;EAKA,mBAAA;EAOA,gBAAA;ADpIF;ACgDI;EACE,mCAAA;AD9CN;ACgDI;EAEE,+CAAA;AD/CN;ACuDQ;EAEE,gDAAA;ADtDV;AC6DE;EACE,sCAAA;AD3DJ;AC6DI;EACE,sCAAA;EACA,sCAAA;AD3DN;AC8DI;EACE,+CAAA;EACA,sCAAA;AD5DN;AC8DM;EACE,qDAAA;AD5DR;AC+DM;EAEE,0CAAA;AD9DR;ACoEE;EACE,iEAAA;EACA,qEAAA;EACA,gEAAA;EACA,oEAAA;ADlEJ;ACqEM;EACE,gEAAA;EACA,4CAAA;ADnER;AC0EI;EACE,uDAAA;EACA,8BAAA;ADxEN;AC2EI;EACE,4CAAA;ADzEN;AC8EE;EACE,gDAAA;AD5EJ;ACgFE;EACE,iDAAA;EACA,sDAAA;EACA,wCAAA;AD9EJ;ACkFE;EACE,8BAAA;ADhFJ","file":"variables.module.css"}

View File

@ -0,0 +1,2 @@
:export{menuText:#bfcbd9;menuActiveText:#409eff;menuBg:#222653;menuHover:#222653;menuLightBg:#fff;menuLightHover:#f0f1f5;menuLightText:#303133;menuLightActiveText:#409eff;sideBarWidth:200px;blue:#324157;lightBlue:#333c46;red:#c03639;pink:#e65d6e;green:#30b08f;tiffany:#4ab7bd;yellow:#fec171;panGreen:#30b08f;colorPrimary:#409eff;colorSuccess:#67c23a;colorWarning:#e6a23c;colorDanger:#f56c6c;colorInfo:#909399}:root{--sidebar-bg: #222653;--sidebar-text: #bfcbd9;--menu-hover: #222653;--navbar-bg: #ffffff;--navbar-text: #303133;--splitpanes-default-bg: #ffffff}html.dark{--el-bg-color: #141414;--el-bg-color-overlay: #1d1e1f;--el-text-color-primary: #ffffff;--el-text-color-regular: #d0d0d0;--el-border-color: #434343;--el-border-color-light: #434343;--sidebar-bg: #141414;--sidebar-text: #ffffff;--menu-hover: #2d2d2d;--menu-active-text: #409eff;--navbar-bg: #141414;--navbar-text: #ffffff;--navbar-hover: #141414;--tags-bg: #141414;--tags-item-bg: #1d1e1f;--tags-item-border: #303030;--tags-item-text: #d0d0d0;--tags-item-hover: #2d2d2d;--tags-close-hover: #64666a;--splitpanes-bg: #141414;--splitpanes-border: #303030;--splitpanes-splitter-bg: #1d1e1f;--splitpanes-splitter-hover-bg: #2d2d2d;--blockquote-bg: #1d1e1f;--blockquote-border: #303030;--blockquote-text: #d0d0d0;--cron-border: #303030;--splitpanes-default-bg: #141414}html.dark .sidebar-container .el-menu-item,html.dark .sidebar-container .menu-title{color:var(--el-text-color-regular)}html.dark .sidebar-container .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title,html.dark .sidebar-container .theme-dark .el-sub-menu .el-menu-item{background-color:var(--el-bg-color) !important}html.dark .el-menu--horizontal .el-menu-item:not(.is-disabled):hover,html.dark .el-menu--horizontal .el-menu-item:not(.is-disabled):focus{background-color:var(--navbar-hover) !important}html.dark .splitpanes{background-color:var(--splitpanes-bg)}html.dark .splitpanes .splitpanes__pane{background-color:var(--splitpanes-bg);border-color:var(--splitpanes-border)}html.dark .splitpanes .splitpanes__splitter{background-color:var(--splitpanes-splitter-bg);border-color:var(--splitpanes-border)}html.dark .splitpanes .splitpanes__splitter:hover{background-color:var(--splitpanes-splitter-hover-bg)}html.dark .splitpanes .splitpanes__splitter:before,html.dark .splitpanes .splitpanes__splitter:after{background-color:var(--splitpanes-border)}html.dark .el-table{--el-table-header-bg-color: var(--el-bg-color-overlay) !important;--el-table-header-text-color: var(--el-text-color-regular) !important;--el-table-border-color: var(--el-border-color-light) !important;--el-table-row-hover-bg-color: var(--el-bg-color-overlay) !important}html.dark .el-table .el-table__header-wrapper th,html.dark .el-table .el-table__fixed-header-wrapper th{background-color:var(--el-bg-color-overlay, #f8f8f9) !important;color:var(--el-text-color-regular, #515a6e)}html.dark .el-tree .el-tree-node.is-current>.el-tree-node__content{background-color:var(--el-bg-color-overlay) !important;color:var(--el-color-primary)}html.dark .el-tree .el-tree-node__content:hover{background-color:var(--el-bg-color-overlay)}html.dark .el-dropdown-menu__item:not(.is-disabled):focus,html.dark .el-dropdown-menu__item:not(.is-disabled):hover{background-color:var(--navbar-hover) !important}html.dark blockquote{background-color:var(--blockquote-bg) !important;border-left-color:var(--blockquote-border) !important;color:var(--blockquote-text) !important}html.dark .popup-result .title{background:var(--cron-border)}
/*# sourceMappingURL=variables.module.min.css.map */

View File

@ -0,0 +1 @@
{"version":3,"sources":["variables.module.scss"],"names":[],"mappings":"AAwCA,QACE,gBA9BS,CA+BT,sBA9Be,CA+Bf,cA9BO,CA+BP,iBA9BU,CA+BV,gBA5BY,CA6BZ,sBA5Be,CA6Bf,qBA5Bc,CA6Bd,2BA5BoB,CA6BpB,kBAzBa,CA2Bb,YAlDK,CAmDL,iBAlDW,CAmDX,WAlDI,CAmDJ,YAlDK,CAmDL,aAlDM,CAmDN,eAlDQ,CAmDR,cAlDO,CAmDP,gBAlDS,CAoDT,oBA1BgB,CA2BhB,oBA1BgB,CA2BhB,oBA1BgB,CA2BhB,mBA1Be,CA2Bf,iBA1Ba,CA8Bf,MAEE,qBAAA,CACA,uBAAA,CACA,qBAAA,CAEA,oBAAA,CACA,sBAAA,CAGA,gCAAA,CAKF,UAEE,sBAAA,CACA,8BAAA,CACA,gCAAA,CACA,gCAAA,CACA,0BAAA,CACA,gCAAA,CAGA,qBAAA,CACA,uBAAA,CACA,qBAAA,CACA,2BAAA,CAGA,oBAAA,CACA,sBAAA,CACA,uBAAA,CAGA,kBAAA,CACA,uBAAA,CACA,2BAAA,CACA,yBAAA,CACA,0BAAA,CACA,2BAAA,CAGA,wBAAA,CACA,4BAAA,CACA,iCAAA,CACA,uCAAA,CAGA,wBAAA,CACA,4BAAA,CACA,0BAAA,CAGA,sBAAA,CAGA,gCAAA,CAIE,oFACE,kCAAA,CAEF,yJAEE,8CAAA,CAQE,0IAEE,+CAAA,CAOR,sBACE,qCAAA,CAEA,wCACE,qCAAA,CACA,qCAAA,CAGF,4CACE,8CAAA,CACA,qCAAA,CAEA,kDACE,oDAAA,CAGF,qGAEE,yCAAA,CAMN,oBACE,iEAAA,CACA,qEAAA,CACA,gEAAA,CACA,oEAAA,CAGE,wGACE,+DAAA,CACA,2CAAA,CAOJ,mEACE,sDAAA,CACA,6BAAA,CAGF,gDACE,2CAAA,CAKJ,oHACE,+CAAA,CAIF,qBACE,gDAAA,CACA,qDAAA,CACA,uCAAA,CAIF,+BACE,6BAAA","file":"variables.module.min.css"}

View File

@ -11,8 +11,8 @@ $panGreen: #30B08F;
// 默认主题变量
$menuText: #bfcbd9;
$menuActiveText: #409eff;
$menuBg: #304156;
$menuHover: #263445;
$menuBg: #222653;
$menuHover: #222653;
// 浅色主题theme-light
$menuLightBg: #ffffff;
@ -27,9 +27,9 @@ $sideBarWidth: 200px;
// 菜单暗色变量
$base-menu-color: #bfcbd9;
$base-menu-color-active: #f4f4f5;
$base-menu-background: #304156;
$base-sub-menu-background: #1f2d3d;
$base-sub-menu-hover: #001528;
$base-menu-background: #222653;
$base-sub-menu-background: #222653;
$base-sub-menu-hover: #222653;
// 组件变量
$--color-primary: #409EFF;

View File

@ -34,7 +34,7 @@ function getBreadcrumb() {
}
//
if (!isDashboard(matched[0])) {
matched = [{ path: "/index", meta: { title: "首页" } }].concat(matched)
// matched = [{ path: "/index", meta: { title: "" } }].concat(matched)
}
levelList.value = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
}

View File

@ -2,9 +2,18 @@
<section class="app-main">
<router-view v-slot="{ Component, route }">
<transition name="fade-transform" mode="out-in">
<keep-alive :include="tagsViewStore.cachedViews">
<component v-if="!route.meta.link" :is="Component" :key="route.path"/>
</keep-alive>
<el-scrollbar height="calc(100vh - 50px)" >
<keep-alive
:include="tagsViewStore.cachedViews"
class="appmancontainer"
>
<component
v-if="!route.meta.link"
:is="Component"
:key="route.path"
/>
</keep-alive>
</el-scrollbar>
</transition>
</router-view>
<iframe-toggle />
@ -13,24 +22,24 @@
</template>
<script setup>
import copyright from "./Copyright/index"
import iframeToggle from "./IframeToggle/index"
import useTagsViewStore from '@/store/modules/tagsView'
import copyright from "./Copyright/index";
import iframeToggle from "./IframeToggle/index";
import useTagsViewStore from "@/store/modules/tagsView";
const route = useRoute()
const tagsViewStore = useTagsViewStore()
const route = useRoute();
const tagsViewStore = useTagsViewStore();
onMounted(() => {
addIframe()
})
addIframe();
});
watchEffect(() => {
addIframe()
})
addIframe();
});
function addIframe() {
if (route.meta.link) {
useTagsViewStore().addIframeView(route)
useTagsViewStore().addIframeView(route);
}
}
</script>
@ -38,12 +47,15 @@ function addIframe() {
<style lang="scss" scoped>
.app-main {
/* 50= navbar 50 */
min-height: calc(100vh - 50px);
width: 100%;
position: relative;
overflow: hidden;
}
}
.appmancontainer {
min-width: 1000px;
}
.app-main:has(.copyright) {
padding-bottom: 36px;
}
@ -55,7 +67,7 @@ function addIframe() {
.hasTagsView {
.app-main {
/* 84 = navbar + tags-view = 50 + 34 */
min-height: calc(100vh - 84px);
min-height: calc(100vh - 50px);
}
.fixed-header + .app-main {
@ -86,4 +98,3 @@ function addIframe() {
border-radius: 3px;
}
</style>

View File

@ -1,21 +1,46 @@
<template>
<div class="navbar">
<hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb v-if="!settingsStore.topNav" id="breadcrumb-container" class="breadcrumb-container" />
<top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />
<hamburger
id="hamburger-container"
:is-active="appStore.sidebar.opened"
class="hamburger-container"
@toggleClick="toggleSideBar"
/>
<breadcrumb
v-if="!settingsStore.topNav"
id="breadcrumb-container"
class="breadcrumb-container"
/>
<top-nav
v-if="settingsStore.topNav"
id="topmenu-container"
class="topmenu-container"
/>
<div class="right-menu">
<template v-if="appStore.device !== 'mobile'">
<header-search id="header-search" class="right-menu-item" />
<div class="right">
<div class="user">
<div style="text-align: right;">
<span class="user-nickname"> {{ userStore.nickName }} </span>
<span class="typename">{{ deptName }}</span>
</div>
<img :src="userStore.avatar" class="user-avatar" />
</div>
<div class="signOut" @click="logout">退出登录</div>
</div>
<el-tooltip content="源码地址" effect="dark" placement="bottom">
<!-- <template v-if="appStore.device !== 'mobile'"> -->
<!-- <header-search id="header-search" class="right-menu-item" /> -->
<!-- <el-tooltip content="源码地址" effect="dark" placement="bottom">
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip content="文档地址" effect="dark" placement="bottom">
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
</el-tooltip>
</el-tooltip> -->
<!--
<screenfull id="screenfull" class="right-menu-item hover-effect" />
<el-tooltip content="主题模式" effect="dark" placement="bottom">
@ -27,10 +52,14 @@
<el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip>
</template>
</el-tooltip> -->
<!-- </template> -->
<el-dropdown @command="handleCommand" class="avatar-container right-menu-item hover-effect" trigger="hover">
<!-- <el-dropdown
@command="handleCommand"
class="avatar-container right-menu-item hover-effect"
trigger="hover"
>
<div class="avatar-wrapper">
<img :src="userStore.avatar" class="user-avatar" />
<span class="user-nickname"> {{ userStore.nickName }} </span>
@ -46,71 +75,80 @@
</el-dropdown-menu>
</template>
</el-dropdown>
<div class="right-menu-item hover-effect setting" @click="setLayout" v-if="settingsStore.showSettings">
<div
class="right-menu-item hover-effect setting"
@click="setLayout"
v-if="settingsStore.showSettings"
>
<svg-icon icon-class="more-up" />
</div>
</div> -->
</div>
</div>
</template>
<script setup>
import { ElMessageBox } from 'element-plus'
import Breadcrumb from '@/components/Breadcrumb'
import TopNav from '@/components/TopNav'
import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import HeaderSearch from '@/components/HeaderSearch'
import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc'
import useAppStore from '@/store/modules/app'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
const appStore = useAppStore()
const userStore = useUserStore()
const settingsStore = useSettingsStore()
import { ElMessageBox } from "element-plus";
import Breadcrumb from "@/components/Breadcrumb";
import TopNav from "@/components/TopNav";
import Hamburger from "@/components/Hamburger";
import Screenfull from "@/components/Screenfull";
import SizeSelect from "@/components/SizeSelect";
import HeaderSearch from "@/components/HeaderSearch";
import RuoYiGit from "@/components/RuoYi/Git";
import RuoYiDoc from "@/components/RuoYi/Doc";
import useAppStore from "@/store/modules/app";
import useUserStore from "@/store/modules/user";
import useSettingsStore from "@/store/modules/settings";
const appStore = useAppStore();
const userStore = useUserStore();
const settingsStore = useSettingsStore();
const deptName=ref("")
userStore.getInfo().then(r=>{
deptName.value=r.deptName;
})
function toggleSideBar() {
appStore.toggleSideBar()
appStore.toggleSideBar();
}
function handleCommand(command) {
switch (command) {
case "setLayout":
setLayout()
break
setLayout();
break;
case "logout":
logout()
break
logout();
break;
default:
break
break;
}
}
function logout() {
ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
userStore.logOut().then(() => {
location.href = '/index'
ElMessageBox.confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
userStore.logOut().then(() => {
location.href = "/index";
});
})
}).catch(() => { })
.catch(() => {});
}
const emits = defineEmits(['setLayout'])
const emits = defineEmits(["setLayout"]);
function setLayout() {
emits('setLayout')
emits("setLayout");
}
function toggleTheme() {
settingsStore.toggleTheme()
settingsStore.toggleTheme();
}
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.navbar {
height: 50px;
overflow: hidden;
@ -144,11 +182,47 @@ function toggleTheme() {
display: inline-block;
vertical-align: top;
}
.right {
display: flex;
align-items: center;
height: 100%;
margin-right: 15px;
.signOut {
cursor: pointer;
font-size: 14px;
color:#1C4FAB ;
}
.user {
display: flex;
align-items: center;
border-right: 1px solid rgba(0, 0, 0, 0.1);
margin-right: 15px;
height: 100%;
img {
width: 35px;
height: 35px;
object-fit: cover;
border-radius: 38px;
margin: 0px 15px;
}
div {
color: #163171;
.user-nickname {
font-weight: 800;
font-size: 12px;
display: block;
}
.typename {
font-size: 12px;
opacity: 0.8;
}
}
}
}
.right-menu {
float: right;
height: 100%;
line-height: 50px;
// line-height: 50px;
display: flex;
&:focus {
@ -178,7 +252,7 @@ function toggleTheme() {
svg {
transition: transform 0.3s;
&:hover {
transform: scale(1.15);
}
@ -202,7 +276,7 @@ function toggleTheme() {
border-radius: 50%;
}
.user-nickname{
.user-nickname {
position: relative;
left: 5px;
bottom: 10px;

View File

@ -2,12 +2,12 @@
<div class="sidebar-logo-container" :class="{ 'collapse': collapse }">
<transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 v-else class="sidebar-title">{{ title }}</h1>
<img v-if="logo" :src="logo1" class="sidebar-logo" />
<!-- <h1 v-else class="sidebar-title">{{ title }}</h1> -->
</router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 class="sidebar-title">{{ title }}</h1>
<img v-if="logo" :src="logo" class="sidebar-logo sidebar-logoall" />
<!-- <h1 class="sidebar-title">{{ title }}</h1> -->
</router-link>
</transition>
</div>
@ -15,6 +15,7 @@
<script setup>
import logo from '@/assets/logo/logo.png'
import logo1 from '@/assets/logo/logo1.png'
import useSettingsStore from '@/store/modules/settings'
import variables from '@/assets/styles/variables.module.scss'
@ -59,11 +60,12 @@ const getLogoTextColor = computed(() => {
.sidebar-logo-container {
position: relative;
width: 100%;
height: 50px;
line-height: 50px;
// height: 50px;
background: v-bind(getLogoBackground);
text-align: center;
overflow: hidden;
padding: 25px 0;
& .sidebar-logo-link {
height: 100%;
@ -75,7 +77,10 @@ const getLogoTextColor = computed(() => {
vertical-align: middle;
margin-right: 12px;
}
.sidebar-logoall{
width: auto;
}
& .sidebar-title {
display: inline-block;
margin: 0;
@ -92,6 +97,7 @@ const getLogoTextColor = computed(() => {
.sidebar-logo {
margin-right: 0px;
}
}
}
</style>

View File

@ -70,20 +70,29 @@ const activeMenu = computed(() => {
<style lang="scss" scoped>
.sidebar-container {
background-color: v-bind(getMenuBackground);
background-color: #222653;
.scrollbar-wrapper {
background-color: v-bind(getMenuBackground);
background-color: #222653;
}
.el-menu {
:deep(.el-menu) {
border: none;
height: 100%;
width: 100% !important;
text-align: center;
.el-menu-item, .el-sub-menu__title {
text-align: center;
// justify-content: center;
padding-left: 40px;
height: 40px;
line-height: 40px;
&:hover {
background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important;
background-color: #4D7BFF !important;
}
}
@ -91,8 +100,8 @@ const activeMenu = computed(() => {
color: v-bind(getMenuTextColor);
&.is-active {
color: var(--menu-active-text, #409eff);
background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important;
color: #fff;
background-color: #4D7BFF !important;
}
}

View File

@ -61,6 +61,7 @@ const route = useRoute()
const router = useRouter()
const visitedViews = computed(() => useTagsViewStore().visitedViews)
const routes = computed(() => usePermissionStore().routes)
const theme = computed(() => useSettingsStore().theme)
const tagsIcon = computed(() => useSettingsStore().tagsIcon)

View File

@ -5,7 +5,7 @@
<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
<div :class="{ 'fixed-header': fixedHeader }">
<navbar @setLayout="setLayout" />
<tags-view v-if="needTagsView" />
<!-- <tags-view v-if="needTagsView" /> -->
</div>
<app-main />
<settings ref="settingRef" />
@ -109,4 +109,5 @@ function setLayout() {
.mobile .fixed-header {
width: 100%;
}
</style>

View File

@ -40,7 +40,18 @@ router.beforeEach((to, from, next) => {
router.addRoute(route) // 动态添加可访问路由表
}
})
next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
if(to.path=="/index"){
if(accessRoutes[0].path=="/"){
next({path:accessRoutes[0].path+accessRoutes[0].children[0].path , replace: true })
}else{
next({path:accessRoutes[0].path+"/"+accessRoutes[0].children[0].path , replace: true })
}
}else{
next({ ...to, replace: true }) // 确保addRoutes已完成hack方法
}
})
}).catch(err => {
useUserStore().logOut().then(() => {

View File

@ -26,6 +26,7 @@ import Layout from '@/layout'
// 公共路由
export const constantRoutes = [
{
path: '/redirect',
component: Layout,
@ -71,6 +72,7 @@ export const constantRoutes = [
path: '/index',
component: () => import('@/views/index'),
name: 'Index',
hidden: true,
meta: { title: '首页', icon: 'dashboard', affix: true }
}
]

View File

@ -49,6 +49,9 @@ const usePermissionStore = defineStore(
this.setDefaultRoutes(sidebarRoutes)
this.setTopbarRoutes(defaultRoutes)
resolve(rewriteRoutes)
})
})
}

View File

@ -8,6 +8,7 @@ const useTagsViewStore = defineStore(
}),
actions: {
addView(view) {
console.log(view)
this.addVisitedView(view)
this.addCachedView(view)
},

View File

@ -54,11 +54,11 @@ const useUserStore = defineStore(
this.nickName = user.nickName
this.avatar = avatar
/* 初始密码提示 */
if(res.isDefaultModifyPwd) {
ElMessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
}).catch(() => {})
}
// if(res.isDefaultModifyPwd) {
// ElMessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
// router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
// }).catch(() => {})
// }
/* 过期密码提示 */
if(!res.isDefaultModifyPwd && res.isPasswordExpired) {
ElMessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {

File diff suppressed because it is too large Load Diff

View File

@ -1,67 +1,70 @@
<template>
<div class="login">
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
<div class="title">
<img src="@/assets/images/loginbjtitle.png" />
<p class="desc">欢迎登录很高兴再次见到你</p>
</div>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号"
>
<template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter="handleLogin"
>
<template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled" >
<el-input
v-model="loginForm.code"
size="large"
auto-complete="off"
placeholder="验证码"
style="width: calc(100% - 160px)"
@keyup.enter="handleLogin"
>
<template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img"/>
<div class="appbody">
<div class="login">
<img src="@/assets/images/login.png" class="left" />
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
<div class="title">
<img src="@/assets/images/loginbjtitle.png" />
<p class="desc">欢迎登录很高兴再次见到你</p>
</div>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button
:loading="loading"
size="large"
type="primary"
style="width:100%;"
@click.prevent="handleLogin"
>
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
<div style="float: right;" v-if="register">
<router-link class="link-type" :to="'/register'">立即注册</router-link>
</div>
</el-form-item>
</el-form>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号"
>
<template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter="handleLogin"
>
<template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled" >
<el-input
v-model="loginForm.code"
size="large"
auto-complete="off"
placeholder="验证码"
style="width: calc(100% - 160px)"
@keyup.enter="handleLogin"
>
<template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img"/>
</div>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button
:loading="loading"
size="large"
type="primary"
style="width:100%;"
@click.prevent="handleLogin"
>
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
<div style="float: right;" v-if="register">
<router-link class="link-type" :to="'/register'">立即注册</router-link>
</div>
</el-form-item>
</el-form>
</div>
</div>
</template>
@ -165,11 +168,26 @@ getCookie()
</script>
<style lang='scss' scoped>
.appbody{
background: #F1F5FD;
width: 100vw;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.login {
height: 100%;
background-image: url("../assets/images/loginbj.png");
background-size: 100% 100%;
width: 85%;
display: flex;
justify-content: space-between;
align-items: center;
.left{
width:calc(100% - 600px);
height: 700px;
object-fit: contain;
}
}
.title {
margin: 0px auto 30px auto;
@ -183,10 +201,7 @@ getCookie()
width: 600px;
padding: 60px 100px;
z-index: 1;
position: fixed;
right: 5%;
top: 50%;
transform: translate(-50%,-50%);
.title{
text-align: center;
img{

View File

@ -0,0 +1,338 @@
<template>
<div class="app-container">
<!-- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="版本号(数字用于比大小如10010)" prop="versionCode">
<el-input
v-model="queryParams.versionCode"
placeholder="请输入版本号(数字用于比大小如10010)"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="版本名(展示用如1.0.10)" prop="versionName">
<el-input
v-model="queryParams.versionName"
placeholder="请输入版本名(展示用如1.0.10)"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="是否强制更新0-否 1-是" prop="forceUpdate">
<el-input
v-model="queryParams.forceUpdate"
placeholder="请输入是否强制更新0-否 1-是"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="发布时间" prop="releaseTime">
<el-date-picker clearable
v-model="queryParams.releaseTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择发布时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form> -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['system:AppVersionRelease:add']"
>新增</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:AppVersionRelease:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:AppVersionRelease:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['system:AppVersionRelease:export']"
>导出</el-button>
</el-col> -->
<!-- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> -->
</el-row>
<el-table v-loading="loading" :data="AppVersionReleaseList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键" align="center" prop="id" /> -->
<!-- <el-table-column label="APP类型(android/ios/other)" align="center" prop="appType" /> -->
<!-- <el-table-column label="版本号" align="center" prop="versionCode" /> -->
<el-table-column label="版本名" align="center" prop="versionName" />
<el-table-column label="升级类型" align="center" prop="type" >
<template #default="{row,$index}">
{{ row.type==1?'整包更新':"资源更新" }}
</template>
</el-table-column>
<!-- <el-table-column label="版本更新描述(支持多行)" align="center" prop="description" /> -->
<!-- <el-table-column label="资源地址(下载/拉取地址)" align="center" prop="resourceUrl" /> -->
<!-- <el-table-column label="是否强制更新0-否 1-是" align="center" prop="forceUpdate" /> -->
<!-- <el-table-column label="状态1-已发布 0-未发布/下架" align="center" prop="status" /> -->
<el-table-column label="发布时间" align="center" prop="releaseTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.releaseTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="备注" align="center" prop="remark" /> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:AppVersionRelease:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:AppVersionRelease:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改APP版本发布对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="AppVersionReleaseRef" :model="form" :rules="rules" >
<!-- <el-form-item label="版本号" prop="versionCode">
<el-input v-model="form.versionCode" placeholder="请输入版本号(数字用于比大小如10010)" />
</el-form-item> -->
<el-form-item label="版本名" prop="versionName">
<el-input v-model="form.versionName" :limit="1" placeholder="请输入版本名(展示用如1.0.10)" />
</el-form-item>
<el-form-item label="升级类型" prop="type">
<el-radio-group v-model="form.type" @change="form.resourceUrl=''">
<el-radio :value="1"> APK整包更新</el-radio>
<el-radio :value="2">WGT资源包更新</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="资源地址" prop="resourceUrl" >
<file-upload v-model="form.resourceUrl" :fileSize="50" :fileType="form.type==1?['apk']:['wgt']"/>
</el-form-item>
<el-form-item label="更新内容" prop="description">
<el-input v-model="form.description" type="textarea" placeholder="请输入内容" />
</el-form-item>
<!-- <el-form-item label="是否强制更新0-否 1-是" prop="forceUpdate">
<el-input v-model="form.forceUpdate" placeholder="请输入是否强制更新0-否 1-是" />
</el-form-item> -->
<!-- <el-form-item label="发布时间" prop="releaseTime">
<el-date-picker clearable
v-model="form.releaseTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择发布时间">
</el-date-picker>
</el-form-item> -->
<!-- <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item> -->
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="AppVersionRelease">
import { listAppVersionRelease, getAppVersionRelease, delAppVersionRelease, addAppVersionRelease, updateAppVersionRelease } from "@/api/system/AppVersionRelease"
const { proxy } = getCurrentInstance()
const AppVersionReleaseList = ref([])
const open = ref(false)
const loading = ref(true)
const showSearch = ref(true)
const ids = ref([])
const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
appType: null,
versionCode: null,
// versionName: '1.1.1',
// type: 1,
description: null,
resourceUrl: null,
forceUpdate: null,
status: null,
releaseTime: null,
},
rules: {
appType: [
{ required: true, message: "APP类型(android/ios/other)不能为空", trigger: "change" }
],
// versionCode: [
// { required: true, message: "(10010)", trigger: "blur" }
// ],
versionName: [
{ required: true, message: "版本名(展示用如1.0.10)不能为空", trigger: "blur" }
],
type: [
{ required: true, message: "升级类型1-整包 2-热更新", trigger: "change" }
],
resourceUrl: [
{ required: true, message: "资源地址(下载/拉取地址)不能为空", trigger: "blur" }
],
forceUpdate: [
{ required: true, message: "是否强制更新0-否 1-是不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态1-已发布 0-未发布/下架不能为空", trigger: "change" }
],
}
})
const { queryParams, form, rules } = toRefs(data)
/** 查询APP版本发布列表 */
function getList() {
loading.value = true
listAppVersionRelease(queryParams.value).then(response => {
AppVersionReleaseList.value = response.rows
total.value = response.total
loading.value = false
})
}
//
function cancel() {
open.value = false
reset()
}
//
function reset() {
form.value = {
id: null,
appType: null,
versionCode: "0",
versionName: null,
type: null,
description: null,
resourceUrl: null,
forceUpdate: null,
status: null,
releaseTime: null,
remark: null
}
proxy.resetForm("AppVersionReleaseRef")
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1
getList()
}
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef")
handleQuery()
}
//
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 新增按钮操作 */
function handleAdd() {
reset()
open.value = true
title.value = "添加APP版本发布"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset()
const _id = row.id || ids.value
getAppVersionRelease(_id).then(response => {
form.value = response.data
open.value = true
title.value = "修改APP版本发布"
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["AppVersionReleaseRef"].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateAppVersionRelease(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
open.value = false
getList()
})
} else {
addAppVersionRelease(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
open.value = false
getList()
})
}
}
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value
proxy.$modal.confirm('是否确认删除APP版本发布编号为"' + _ids + '"的数据项?').then(function() {
return delAppVersionRelease(_ids)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('system/AppVersionRelease/export', {
...queryParams.value
}, `AppVersionRelease_${new Date().getTime()}.xlsx`)
}
getList()
</script>

View File

@ -1,219 +1,243 @@
<template>
<div>
<div class="app-container">
<el-card>
<div class="cardbox">
<div class="top">
<div class="l">成员</div>
<div class="r">
<el-input
style="width: 240px"
placeholder="输入姓名/电话"
:suffix-icon="Search"
v-model="queryParams.userName"
@clear="listSearch"
@keydown="listSearch"
clearable
/>
<el-date-picker
v-model="dateRange"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
@clear="listSearch"
@change="listSearch"
show-confirm="true"
/>
<el-button type="primary" @click="handleAdd" :icon="CirclePlus"
>添加成员</el-button
>
</div>
</div>
<splitpanes
:horizontal="appStore.device === 'mobile'"
class="container default-theme"
>
<pane size="16">
<div class="l">
<el-tree
:data="data"
:props="defaultProps"
class="tree"
:check-on-click-leaf="false"
:default-expand-all="true"
>
<template #default="{ node, data }">
<div class="treeitem">
<div
class="icon"
v-if="data.children && data.children.length"
>
<el-icon :size="10" class="iocnPlus"><Plus /></el-icon>
<el-icon :size="10" class="iocnMinus"><Minus /></el-icon>
</div>
<div
class="title"
:class="{
on: queryParams.deptId == data.deptId,
}"
@click.stop="screen(data)"
>
{{ node.label }}
</div>
</div>
</template>
</el-tree>
</div>
</pane>
<pane size="84">
<div class="app-container">
<el-card>
<div class="cardbox">
<div class="top">
<div class="l">成员</div>
<div class="r">
<el-table
:data="tableData"
class="table"
border
v-loading="loading"
style="width: 100%"
>
<el-table-column
type="index"
label="序号"
width="120"
align="center"
>
<template #default="{ row, $index }">
{{
(queryParams.pageNum - 1) * queryParams.pageSize +
$index +
1
}}
</template>
</el-table-column>
<el-table-column
label="用户编号"
align="center"
key="userId"
prop="userId"
/>
<el-table-column
prop="userName"
label="账号"
width="120"
align="center"
/>
<el-table-column prop="nickName" label="姓名" />
<el-table-column prop="dept.deptName" label="部门名称" />
<!-- <el-table-column prop="dept.deptName" label="角色" /> -->
<el-table-column prop="remark" label="备注" />
<el-table-column
prop="createTime"
label="添加时间"
sortable
align="center"
width="180"
/>
<el-table-column
fixed="right"
label="操作"
width="120"
align="center"
>
<template #default="scope">
<el-button
link
type="primary"
size="small"
@click="handleUpdate(scope.row)"
>
编辑
</el-button>
<el-button
link
type="primary"
size="small"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getusertlist"
<el-input
style="width: 240px"
placeholder="输入姓名/电话"
:suffix-icon="Search"
v-model="queryParams.userName"
@clear="listSearch"
@keydown="listSearch"
clearable
/>
<el-date-picker
v-model="dateRange"
type="daterange"
value-format="YYYY-MM-DD"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
@clear="listSearch"
@change="listSearch"
show-confirm="true"
/>
<el-button type="primary" @click="handleAdd" :icon="CirclePlus"
>添加成员</el-button
>
</div>
</pane>
</splitpanes>
</div>
</el-card>
</div>
<!-- 添加弹框 -->
<el-dialog
v-model="dialogVisible"
width="500"
:title="form.id ? '编辑部门' : '添加部门'"
header-class="dialogheader"
:align-center="true"
center
>
<el-form :model="form" ref="formEl" label-width="auto" :rules="rules">
<el-form-item label="成员姓名" prop="nickName">
<el-input v-model="form.nickName" />
</el-form-item>
<el-form-item label="成员账号" prop="userName">
<el-input v-model="form.userName" autocomplete="off" />
</el-form-item>
<el-form-item
v-if="form.userId == undefined"
label="用户密码"
prop="password"
>
<el-input
v-model="form.password"
autocomplete="off"
placeholder="请输入用户密码"
type="password"
maxlength="20"
show-password
/>
</el-form-item>
<el-form-item label="选择部门" prop="deptId">
<el-tree-select
v-model="form.deptId"
:data="data"
:props="{ value: 'deptId', label: 'deptName', children: 'children' }"
value-key="id"
placeholder="请选择归属部门"
clearable
check-strictly
/>
</el-form-item>
<el-form-item label="选择角色" prop="roleIds">
<el-radio-group v-model="form.roleIds">
<el-radio
:key="item.roleId"
:value="item.roleId"
:disabled="item.status == 1"
v-for="item in roleOptions"
>{{ item.roleName }}</el-radio
</div>
<splitpanes
:horizontal="appStore.device === 'mobile'"
class="container default-theme"
>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" />
</el-form-item>
</el-form>
<pane size="16">
<div class="l">
<el-tree
:data="data"
:props="defaultProps"
class="tree"
:check-on-click-leaf="false"
:default-expand-all="true"
>
<template #default="{ node, data }">
<div class="treeitem">
<div
class="icon"
v-if="data.children && data.children.length"
>
<el-icon :size="10" class="iocnPlus"><Plus /></el-icon>
<el-icon :size="10" class="iocnMinus"
><Minus
/></el-icon>
</div>
<div
class="title"
:class="{
on: queryParams.deptId == data.deptId,
}"
@click.stop="screen(data)"
>
{{ node.label }}
</div>
</div>
</template>
</el-tree>
</div>
</pane>
<pane size="84">
<div class="r">
<el-table
:data="tableData"
class="table"
border
v-loading="loading"
style="width: 100%"
>
<el-table-column
type="index"
label="序号"
width="120"
align="center"
>
<template #default="{ row, $index }">
{{
(queryParams.pageNum - 1) * queryParams.pageSize +
$index +
1
}}
</template>
</el-table-column>
<el-table-column
label="用户编号"
align="center"
key="userId"
prop="userId"
/>
<el-table-column
prop="userName"
label="账号"
width="120"
align="center"
/>
<el-table-column prop="nickName" label="姓名" />
<el-table-column prop="dept.deptName" label="部门名称" />
<!-- <el-table-column prop="dept.deptName" label="角色" /> -->
<el-table-column prop="remark" label="备注" />
<el-table-column
prop="createTime"
label="添加时间"
sortable
align="center"
width="180"
/>
<el-table-column
fixed="right"
label="操作"
width="120"
align="center"
>
<template #default="scope">
<el-button
link
type="primary"
size="small"
@click="handleUpdate(scope.row)"
>
编辑
</el-button>
<el-button
link
type="primary"
size="small"
@click="remove(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getusertlist"
/>
</div>
</pane>
</splitpanes>
</div>
</el-card>
</div>
<!-- 添加弹框 -->
<el-dialog
v-model="dialogVisible"
width="664"
:title="form.id ? '编辑部门' : '添加部门'"
header-class="dialogheader"
:align-center="true"
@close="resetForm(formEl)"
center
>
<el-form :model="form" ref="formEl" label-width="auto" :rules="rules">
<el-form-item label="成员姓名" prop="nickName">
<el-input v-model="form.nickName" placeholder="请填写成员姓名" />
</el-form-item>
<el-form-item label="成员账号" prop="userName">
<el-input
v-model="form.userName"
autocomplete="off"
placeholder="请填写成员成员账号"
/>
</el-form-item>
<el-form-item
v-if="form.userId == undefined"
label="用户密码"
prop="password"
>
<el-input
v-model="form.password"
autocomplete="off"
placeholder="请输入用户密码"
type="password"
maxlength="20"
show-password
/>
</el-form-item>
<el-form-item label="选择部门" prop="deptId">
<el-tree-select
v-model="form.deptId"
:data="data"
:props="{
value: 'deptId',
label: 'deptName',
children: 'children',
}"
value-key="id"
placeholder="请选择归属部门"
clearable
check-strictly
/>
</el-form-item>
<el-form-item label="选择角色" prop="roleIds">
<el-radio-group v-model="form.roleIds">
<el-radio
:key="item.roleId"
:value="item.roleId"
:disabled="item.status == 1"
v-for="item in roleOptions"
>{{ item.roleName }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="form.remark"
type="textarea"
placeholder="请填写备注"
/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="resetForm(formEl)">取消</el-button>
<el-button type="primary" @click="submitForm(formEl)"> 确认 </el-button>
</div>
</template>
</el-dialog>
<template #footer>
<div class="dialog-footer">
<el-button @click="resetForm(formEl)" style="width: 100px"
>取消</el-button
>
<el-button
type="primary"
@click="submitForm(formEl)"
style="width: 100px"
>
确认
</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
@ -230,9 +254,8 @@ import {
import { CirclePlus, Search, Plus, Minus } from "@element-plus/icons-vue";
import { ref } from "vue";
import { Splitpanes, Pane } from "splitpanes";
import "splitpanes/dist/splitpanes.css"
import "splitpanes/dist/splitpanes.css";
import { ElMessageBox } from "element-plus";
import useAppStore from "@/store/modules/app";
const appStore = useAppStore();
@ -354,16 +377,16 @@ const submitForm = async (formEl) => {
}
});
};
function remove(item) {
ElMessageBox.confirm("确定删除该部门?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
function remove(row) {
const userIds = row.userId || ids.value;
proxy.$modal
.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?')
.then(function () {
return delUser(userIds);
})
.then(() => {
delDept(item.deptId).then((r) => {
getthreedata(false);
});
getthreedata(false);
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
}
@ -385,8 +408,8 @@ function getusertlist() {
loading.value = true;
listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(
(res) => {
loading.value = false;
tableData.value = res.rows;
total.value = res.total;
}
@ -416,11 +439,10 @@ function filterDisabledDept(deptList) {
});
}
/** 新增按钮操作 */
function handleAdd() {
reset();
getUser().then((response) => {
postOptions.value = response.posts;
roleOptions.value = response.roles;
@ -476,13 +498,9 @@ function handleDelete(row) {
proxy.$modal
.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?')
.then(function () {
return delUser(userIds);
})
.then(() => {
getList();
getusertlist();
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
});
}
onMounted(() => {
getDeptTree();
@ -493,6 +511,12 @@ onMounted(() => {
});
</script>
<style lang="scss" scoped>
.app-container {
background: #f6f6f6;
}
.app-container :deep(.el-card) {
box-shadow: initial !important;
}
.top {
display: flex;
align-items: center;
@ -509,14 +533,13 @@ onMounted(() => {
}
}
.cardbox {
height: calc(100vh - 84px - 30px - 30px - 30px);
height: calc(100vh - 128px);
}
.container {
border-top: 1px solid #eee;
height: calc(100% - 47px);
.l {
width: 100%;
padding: 15px;
@ -527,7 +550,7 @@ onMounted(() => {
--el-tree-node-content-height: 35px;
height: 100%;
overflow: auto;
.el-tree-node.is-current > .el-tree-node__content{
.el-tree-node.is-current > .el-tree-node__content {
color: inherit;
background-color: inherit !important;
}

View File

@ -64,6 +64,7 @@
<el-table
:data="tableData"
class="table"
v-loading="loading"
border
style="width: 100%"
>
@ -134,17 +135,18 @@
<!-- 添加弹框 -->
<el-dialog
v-model="dialogVisible"
width="500"
width="620"
:title="form.id ? '编辑部门' : '添加部门'"
header-class="dialogheader"
:align-center="true"
@close="resetForm(formEl)"
center
>
<el-form :model="form" ref="formEl" label-width="auto" :rules="rules">
<el-form-item label="输入部门" prop="deptName">
<el-input v-model="form.deptName" placeholder="输入部门名称" />
</el-form-item>
<el-form-item label="选择部门类型" prop="deptLevel">
<el-form-item label="选择部门类型" prop="deptLevel" v-if="!form.id">
<el-radio-group v-model="form.deptLevel" @change="elradiogroup">
<el-radio :value="1">总队</el-radio>
<el-radio :value="2">支队</el-radio>
@ -161,6 +163,7 @@
<el-option
:label="item.deptName"
:value="item.deptId"
v-for="item in Options"
/>
</el-select>
@ -175,8 +178,8 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="resetForm(formEl)">取消</el-button>
<el-button type="primary" @click="submitForm(formEl)"> 确认 </el-button>
<el-button @click="resetForm(formEl)" style="width:100px ;">取消</el-button>
<el-button type="primary" @click="submitForm(formEl)" style="width:100px ;"> 确认 </el-button>
</div>
</template>
</el-dialog>
@ -203,9 +206,10 @@ const appStore = useAppStore();
const formEl = ref();
const total = ref(0);
const pageNum = ref(1);
const pageSize = ref(18);
const pageSize = ref(20);
const name = ref("");
const serchKey = ref("");
const loading=ref(false)
const form = ref({
deptId: "",
parentId: "",
@ -244,6 +248,7 @@ function screen(item) {
}
const resetForm = (formEl) => {
if (!formEl) return;
dialogVisible.value = false;
formEl.resetFields();
@ -292,7 +297,7 @@ function remove(item) {
//
function getthreedata(type = true) {
listDepttree().then((res) => {
data.value = res.data;
data.value = res.data;
if (res.data.length && type) {
deptId.value = 0;
name.value = res.data[0].deptName;
@ -304,6 +309,7 @@ getthreedata();
//
function getDeptlist() {
loading.value=true;
getDept(deptId.value, {
pageNum: pageNum.value,
pageSize: pageSize.value,
@ -311,6 +317,7 @@ function getDeptlist() {
}).then((res) => {
tableData.value = res.rows;
total.value = res.total;
loading.value=false;
});
}
//
@ -347,6 +354,13 @@ function listSearch(e) {
}
</script>
<style lang="scss" scoped>
.app-container{
background: #F6F6F6;
}
.app-container :deep(.el-card){
box-shadow: initial !important;
}
.top {
display: flex;
align-items: center;
@ -363,7 +377,7 @@ function listSearch(e) {
}
}
.cardbox {
height: calc(100vh - 84px - 30px - 30px - 30px);
height: calc(100vh - 127px);
}
.container {

View File

@ -1,245 +1,385 @@
<template>
<div class="app-container">
<el-card>
<div class="cardbox">
<div class="top">
<div class="l">设备列表</div>
<div class="r">
<el-input
v-model="name"
style="width: 240px"
placeholder="输入部门名称/ID"
:suffix-icon="Search"
/>
<el-date-picker
v-model="value1"
type="daterange"
range-separator="To"
start-placeholder="Start date"
end-placeholder="End date"
/>
<el-button
type="primary"
@click="dialogVisible = true"
:icon="CirclePlus"
>添加设备</el-button
>
<div>
<div class="app-container">
<el-card>
<div class="cardbox">
<div class="top">
<div class="l">设备列表</div>
<div class="r">
<el-input
v-model="fname"
style="width: 240px"
placeholder="输入部门名称/ID"
:suffix-icon="Search"
clearable
@clear="listSearch"
@keydown="listSearch"
/>
<el-date-picker
v-model="dateRange"
type="daterange"
value-format="YYYY-MM-DD"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
@clear="listSearch"
@change="listSearch"
show-confirm="true"
/>
<el-button type="primary" @click="addequipment" :icon="CirclePlus"
>添加设备</el-button
>
</div>
</div>
</div>
<div class="container">
<el-table
:data="tableData"
class="table"
border
style="width: 100%"
:preserve-expanded-content="true"
>
<el-table-column type="expand" align="center">
<template #default="props">
<div class="expandbox">
<div class="box">
<div class="ul">
<div>布控球ID</div>
<div>状态</div>
<div>在线时长小时</div>
<div>过车次数</div>
</div>
<div class="ul">
<div>001</div>
<div>在线</div>
<div>16</div>
<div>999</div>
</div>
<div class="ul">
<div>001</div>
<div>在线</div>
<div>16</div>
<div>999</div>
<div class="container">
<el-table
:data="tableData"
class="table"
border
v-loading="loading"
style="width: 100%"
:preserve-expanded-content="true"
>
<el-table-column type="expand" align="center">
<template #default="props">
<div class="expandbox">
<div class="box">
<div class="ul">
<div>布控球ID</div>
<div>状态</div>
<div>在线时长小时</div>
<div>过车次数</div>
</div>
<div
class="ul"
v-for="value in props.row.processedDeviceList"
>
<div>{{ value.encoding }}</div>
<div>{{ value.status == 2 ? "在线" : "离线" }}</div>
<div>{{ value.onlivetime || 0 }}</div>
<div>{{ value.number || 0 }}</div>
</div>
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column
prop="name"
sortable
label="序号"
width="120"
align="center"
/>
<el-table-column prop="address" label="关联部门" />
<el-table-column
prop="name"
label="设备数量"
width="120"
align="center"
/>
<el-table-column
prop="name"
label="云音响imei"
width="120"
align="center"
/>
</template>
</el-table-column>
<el-table-column
prop="name"
label="联系人"
align="center"
width="120"
type="index"
label="序号"
width="120"
align="center"
>
<template #default="{ row, $index }">
{{ (pageNum - 1) * pageSize + $index + 1 }}
</template>
</el-table-column>
<el-table-column prop="fname" label="关联部门" />
<el-table-column
prop="numberDevices"
label="设备数量"
width="120"
align="center"
/>
<el-table-column
prop="audio"
label="云音响imei"
align="center"
/>
<el-table-column
prop="contactName"
label="联系人"
align="center"
width="120"
/>
<el-table-column
prop="contactPhone"
label="联系电话"
align="center"
width="120"
/>
<el-table-column
prop="creatData"
label="添加时间"
align="center"
width="140"
/>
<el-table-column
fixed="right"
label="操作"
width="120"
align="center"
>
<template #default="{ row }">
<el-button
link
type="primary"
size="small"
@click="edit(row)"
>
编辑
</el-button>
<el-button
link
type="primary"
size="small"
@click="remove(row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="pageNum"
v-model:limit="pageSize"
/>
<el-table-column
prop="date"
label="添加时间"
align="center"
width="140"
/>
<el-table-column
fixed="right"
label="操作"
width="120"
align="center"
>
<template #default>
<el-button
link
type="primary"
size="small"
@click="handleClick"
>
编辑
</el-button>
<el-button link type="primary" size="small" @click="remove()"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="pageNum"
v-model:limit="pageSize"
/>
</div>
</div>
</div>
</el-card>
</el-card>
</div>
<!-- 添加弹框 -->
<el-dialog
v-model="dialogVisible"
width="620"
:title="form.fid?'编辑设备':'添加设备'"
header-class="dialogheader"
:align-center="true"
@close="resetForm(formEl)"
center
>
<el-form :model="form" ref="formEl" label-width="auto" :rules="rules">
<el-form-item label="关联部门" prop="fid">
<el-tree-select
v-model="form.fid"
:data="data"
:props="{
value: 'deptId',
label: 'deptName',
children: 'children',
}"
value-key="id"
placeholder="选择部门"
clearable
check-strictly
/>
</el-form-item>
<el-form-item label="联系人" prop="contactName" >
<el-input v-model="form.contactName" placeholder="填写联系人" />
</el-form-item>
<el-form-item label="联系电话" prop="contactPhone" >
<el-input v-model="form.contactPhone" placeholder="填写联系电话" />
</el-form-item>
<el-form-item label="布控球1 ID:" prop="startDeviceId" >
<el-input v-model="form.startDeviceId" placeholder="填写布控球1 ID" />
</el-form-item>
<el-form-item label="布控球2 ID:" prop="endDeviceId" >
<el-input v-model="form.endDeviceId" placeholder="填写布控球2 ID" />
</el-form-item>
<el-form-item label="云音响imei:" prop="audio" >
<el-input v-model="form.audio" placeholder="填写云音响imei" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="resetForm(formEl)" style="width:100px ;">取消</el-button>
<el-button type="primary" @click="submitForm(formEl)" style="width:100px ;">
确认
</el-button>
</div>
</template>
</el-dialog>
</div>
<!-- 添加弹框 -->
<el-dialog
v-model="dialogVisible"
width="500"
title="添加部门"
header-class="dialogheader"
:align-center="true"
center
>
<el-form :model="form" ref="formEl" label-width="auto" :rules="rules">
<el-form-item label="关联部门">
<el-select v-model="form.region" placeholder="please select your zone">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
<el-form-item label="联系人" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="联系电话" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="布控球1 ID:" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="布控球2 ID:" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="云音响imei:" prop="name">
<el-input v-model="form.name" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="resetForm(formEl)">取消</el-button>
<el-button type="primary" @click="submitForm(formEl)"> 确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { CirclePlus, Search, Plus, Minus } from "@element-plus/icons-vue";
import { ref } from "vue";
import { listDepttree, delDept } from "@/api/system/SysSpeedingDept.js";
import { ElMessageBox } from "element-plus";
import {
listSpeedingAlertSettings,
addSpeedingAlertSettings,
delSpeedingAlertSettings,
updateSpeedingAlertSettings
} from "@/api/system/SpeedingAlertSettings.js";
const { proxy } = getCurrentInstance();
const formEl = ref();
const total = ref(90);
const pageNum = ref(10);
const pageSize = ref(1);
const total = ref(0);
const pageNum = ref(1);
const pageSize = ref(20);
const fname=ref("")
const name = ref("");
const form = ref({});
const dateRange = ref([]);
const form = ref({
contactName: "",
contactPhone: "",
startDeviceId: "",
endDeviceId: "",
audio: "",
fid: "",
});
const data = ref([]);
const dialogVisible = ref(false);
const tableData = [
{
date: "2016-05-03",
name: "Tom",
address: "No. 189, Grove St, Los Angeles",
},
{
date: "2016-05-02",
name: "Tom",
address: "No. 189, Grove St, Los Angeles",
},
{
date: "2016-05-04",
name: "Tom",
address: "No. 189, Grove St, Los Angeles",
},
{
date: "2016-05-01",
name: "Tom",
address: "No. 189, Grove St, Los Angeles",
},
];
const loading = ref(false);
const tableData = ref([]);
const rules = {
name: {
fid: {
required: true,
message: "Please select Activity zone",
message: "请选择部门",
trigger: "change",
},
contactName: {
required: true,
message: "请填写联系人",
trigger: "change",
},
contactPhone: {
required: true,
message: "请填写联系电话",
trigger: "change",
},
startDeviceId: {
required: true,
message: "请填写布控球1ID",
trigger: "change",
},
endDeviceId: {
required: true,
message: "请填写布控球2ID",
trigger: "change",
},
audio: {
required: true,
message: "请填写云音响imei",
trigger: "change",
},
};
const resetForm = (formEl) => {
if (!formEl) return;
reset()
dialogVisible.value = false;
formEl.resetFields();
};
const submitForm = async (formEl) => {
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
if (form.value.id) {
updateSpeedingAlertSettings(form.value).then((r) => {
dialogVisible.value = false;
reset();
formEl.resetFields();
getusertlist();
});
} else {
addSpeedingAlertSettings(form.value).then((r) => {
dialogVisible.value = false;
fname.value="";
dateRange.value="";
reset();
formEl.resetFields();
getusertlist();
});
}
console.log("submit!");
} else {
console.log("error submit!", fields);
}
});
};
function remove() {
ElMessageBox.confirm("确定删除该部门?", "提示", {
function remove(item) {
ElMessageBox.confirm("确定删除该套设备", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
userStore.logOut().then(() => {
location.href = "/index";
delSpeedingAlertSettings(item.id).then((r) => {
getusertlist();
proxy.$modal.msgSuccess("删除成功");
});
})
.catch(() => {});
}
function reset() {
form.value = {
contactName: "",
contactPhone: "",
startDeviceId: "",
endDeviceId: "",
audio: "",
fid: "",
};
}
//
function getthreedata(type = true) {
listDepttree().then((res) => {
data.value = res.data;
});
}
//
function listSearch(e) {
if ((e && e.keyCode && e.keyCode == 13) || !e || e.length) {
pageNum.value = 1;
getusertlist();
}
}
function edit(item) {
dialogVisible.value = true;
getthreedata();
form.value = {
id: item.id,
contactName: item.contactName,
contactPhone: item.contactPhone,
startDeviceId: item.startDeviceId,
endDeviceId: item.endDeviceId,
audio: item.audio,
fid: item.fid,
};
}
function addequipment() {
dialogVisible.value = true;
getthreedata();
}
/** 查询用户列表 */
function getusertlist() {
loading.value = true;
let _dat={
pageNum:pageNum.value,
pageSize:pageSize.value,
fname:fname.value
}
listSpeedingAlertSettings(proxy.addDateRange(_dat, dateRange.value)).then((res) => {
loading.value = false;
tableData.value = res.rows;
total.value = res.total;
});
}
getusertlist();
</script>
<style lang="scss" scoped>
.app-container{
background: #F6F6F6;
}
.app-container :deep(.el-card){
box-shadow: initial !important;
}
.top {
display: flex;
align-items: center;
@ -256,7 +396,7 @@ function remove() {
}
}
.cardbox {
height: calc(100vh - 84px - 30px - 30px - 30px);
height: calc(100vh - 128px);
}
.container {
@ -275,26 +415,24 @@ function remove() {
height: 17px;
}
.expandbox {
background: #f2f6ff;
margin: -8px 0;
.box{
margin: 0px 120px 0 48px;
border-left: 1px solid #E6E6E6;
border-right: 1px solid #E6E6E6;
.ul{
background: #f2f6ff;
margin: -8px 0;
.box {
// margin: 0px 120px 0 48px;
border-left: 1px solid #e6e6e6;
border-right: 1px solid #e6e6e6;
.ul {
text-align: center;
display: flex;
justify-content: space-between;
padding: 10px 15px;
border-bottom: 1px solid #E6E6E6;
div{
border-bottom: 1px solid #e6e6e6;
div {
flex: 1;
text-align: center;
}
}
}
}
}
}

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="body">
<div class="head">
<div class="left">{{ time }}</div>
<div class="center">
@ -15,9 +15,9 @@
</div>
<div class="right">
<div class="user">
<div>
<div style="text-align: right;">
<span class="user-nickname"> {{ userStore.nickName }} </span>
<span class="typename">{{ userStore.nickName }}</span>
<span class="typename">{{ deptName }}</span>
</div>
<img :src="userStore.avatar" class="user-avatar" />
</div>
@ -28,10 +28,24 @@
</div>
</template>
<script setup>
import { useFullscreen } from '@vueuse/core'
const { isFullscreen, enter, exit, toggle } = useFullscreen()
import statisticalTable from "../statisticalTable/index.vue";
import useUserStore from "@/store/modules/user";
const userStore = useUserStore();
import { ElMessageBox } from "element-plus";
const deptName=ref("")
userStore.getInfo().then(r=>{
deptName.value=r.deptName;
})
// if(!isFullscreen){
// document.querySelector("body").requestFullscreen()
// }
function logout() {
ElMessageBox.confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: "确定",
@ -64,6 +78,11 @@ function formatTime() {
}
</script>
<style lang="scss" scoped>
.body{
background: #F6F6F6;
min-width: 1500px;
overflow: auto;
}
.head {
background: linear-gradient(#4f8aff 0%, #1235ca 100%);
display: flex;
@ -71,12 +90,13 @@ function formatTime() {
padding: 0px 15px;
justify-content: space-between;
height: 60px;
margin-bottom: 50px;
margin-bottom: 10px;
color: #fff;
.center {
position: relative;
& > img {
height: 130px;
height: 100px;
// width: 556px;
}
div {
position: absolute;
@ -86,10 +106,15 @@ function formatTime() {
color: #fff;
display: flex;
align-items: center;
white-space: nowrap;
img{
width: 30px;
}
p {
margin: 0px 15px;
font-weight: 500;
font-size: 28px;
font-size: 29px;
letter-spacing: 4px;
color: #ffffff;
}
}
@ -100,11 +125,13 @@ function formatTime() {
height: 100%;
.signOut {
cursor: pointer;
font-size: 14px;
}
.user {
display: flex;
align-items: center;
border-right: 1px solid #d8d8d8;
border-right: 1px solid rgba(255,255,255,0.4);
margin-right: 15px;
height: 100%;
img {
@ -115,6 +142,7 @@ function formatTime() {
margin: 0px 15px;
}
div {
.user-nickname {
font-weight: 800;
font-size: 12px;

View File

@ -3,52 +3,60 @@
<el-form :model="queryParams" ref="queryRef" :inline="true" class="form">
<div class="left">
<el-form-item label="部门" prop="ipaddr">
<el-select
v-model="queryParams.ipaddr"
placeholder="青选择部门"
style="width: 320px"
>
<el-option
v-for="item in 3"
:key="item"
:label="item"
:value="item"
/>
</el-select>
<el-tree-select
style="width: 250px"
v-model="form.deptId"
:data="departmentlist"
@change="change"
:props="{
value: 'deptId',
label: 'deptName',
children: 'children',
}"
value-key="deptId"
placeholder="请选择归属部门"
clearable
check-strictly
/>
</el-form-item>
<el-form-item label="时间范围" prop="userName">
<el-date-picker
style="width: 320px"
v-model="value2"
type="month"
style="width: 250px"
v-model="form.value"
type="daterange"
value-format="YYYY-MM-DD"
placeholder="请选择时间"
range-separator="⇀"
start-placeholder="开始时间"
end-placeholder="结束时间"
:disabled-date="disabledDate"
:shortcuts="shortcuts"
@change="change"
:size="size"
/>
</el-form-item>
</div>
<div class="right">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"
<el-form-item style="margin-right: 0px">
<el-button type="primary" icon="Search" @click="change"
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</div>
</el-form>
<el-row :gutter="10" class="rowbox">
<el-row :gutter="10" v-loading="loadingecharts" class="rowbox">
<el-col :span="6">
<el-card class="quantity">
<div class="num">32</div>
<div class="title">设备总</div>
<div class="num">{{ datainfo.device?.total || 0 }}</div>
<div class="title">设备总</div>
<div class="ul">
<div class="item">
<p>64</p>
<p>{{ datainfo.device?.online || 0 }}</p>
<span>在线</span>
</div>
<div class="item">
<p>0</p>
<p>{{ datainfo.device?.offline || 0 }}</p>
<span>离线</span>
</div>
</div>
@ -56,15 +64,33 @@
</el-col>
<el-col :span="6">
<el-card class="quantity">
<div class="num">32</div>
<div class="num">{{ datainfo.traffic?.passCount || 0 }}</div>
<div class="title">过车数量</div>
<div class="ul">
<div class="item">
<p>64</p>
<p>
{{ datainfo.device?.yoy || 0 }}
<template v-if="datainfo.device?.yoytype != 0">
<img
v-if="datainfo.device?.yoytype > 0"
src="@/assets/images/upper.png"
/>
<img v-else src="@/assets/images/lower.png" />
</template>
</p>
<span>同比</span>
</div>
<div class="item">
<p>0</p>
<p>
{{ datainfo.device?.mom || 0 }}
<template v-if="datainfo.device?.momtype != 0">
<img
v-if="datainfo.device?.momtype > 0"
src="@/assets/images/upper.png"
/>
<img v-else src="@/assets/images/lower.png" />
</template>
</p>
<span>环比</span>
</div>
</div>
@ -75,14 +101,18 @@
<div class="earlyWarning">
<div class="lfet">
<div class="item">
<h3>1290</h3>
<h3>{{ datainfo.warning?.alertCount || 0 }}</h3>
<p>预警数量</p>
<div>预警比<span>16%</span></div>
<div>
预警比<span>{{ datainfo.warning?.warningRatio || 0 }}</span>
</div>
</div>
<div class="item">
<h3>1290</h3>
<p>预警数量</p>
<div>预警比<span>16%</span></div>
<h3>{{ datainfo.warning?.seizureCount || 0 }}</h3>
<p>查扣车辆</p>
<div>
查扣比<span>{{ datainfo.warning?.seizureRatio || 0 }}</span>
</div>
</div>
</div>
<div id="echarts1" ref="echarts1"></div>
@ -90,10 +120,10 @@
</el-card>
</el-col>
</el-row>
<el-row :gutter="10" class="rowbox">
<el-row :gutter="10" v-loading="loadingecharts" class="rowbox">
<el-col :span="6">
<el-card class="cardtime">
<div class="title">最近7天执法时长统计</div>
<div class="title">执法时长统计</div>
<div id="echarts2" ref="echarts2"></div>
</el-card>
</el-col>
@ -107,19 +137,19 @@
<div class="right">
<div class="item">
<div class="title">超速10%以下</div>
<div class="num">629</div>
<div class="num">{{ datainfo.overspeed?.under10 || 0 }}</div>
</div>
<div class="item">
<div class="title">超速10%-20%</div>
<div class="num">629</div>
<div class="num">{{ datainfo.overspeed?.sto20 || 0 }}</div>
</div>
<div class="item">
<div class="title">超速20%-50%</div>
<div class="num">629</div>
<div class="num">{{ datainfo.overspeed?.eto50 || 0 }}</div>
</div>
<div class="item">
<div class="title">超速50%以上</div>
<div class="num">629</div>
<div class="num">{{ datainfo.overspeed?.over50 || 0 }}</div>
</div>
</div>
</div>
@ -127,7 +157,7 @@
</el-col>
<el-col :span="12">
<el-card class="speeding">
<div class="title">最近7天车辆超速情况统计</div>
<div class="title">车辆超速情况统计</div>
<div id="echarts4" ref="echarts4"></div>
</el-card>
</el-col>
@ -135,111 +165,307 @@
<el-card class="bottomdata">
<div class="top">
<div class="left">
<div class="on">大队设备使用情况</div>
<div>中队设备使用情况</div>
<!-- class="on" -->
<!-- <template v-if="userStore.deptLevel == 0">
<div>支队设备使用情况</div>
<div>大队设备使用情况</div>
<div>中队设备使用情况</div>
</template> -->
<template v-if="user.deptLevel == 1 || user.deptLevel == 0">
<div @click="settype(1)" :class="{ on: form2.deptLevel == 1 }">
支队设备使用情况
</div>
<div @click="settype(2)" :class="{ on: form2.deptLevel == 2 }">
大队设备使用情况
</div>
<div @click="settype(3)" :class="{ on: form2.deptLevel == 3 }">
中队设备使用情况
</div>
</template>
<template v-if="user.deptLevel == 2">
<div @click="settype(2)" :class="{ on: form2.deptLevel == 2 }">
大队设备使用情况
</div>
<div @click="settype(3)" :class="{ on: form2.deptLevel == 3 }">
中队设备使用情况
</div>
</template>
<!-- <template v-if="user.deptLevel == 3">
<div>中队设备使用情况</div>
</template> -->
</div>
<div class="right">
<div class="day">
<div class="title">时间范围</div>
<div class="day">
<div class="title">时间范围</div>
<el-date-picker
style="width: 320px"
v-model="value2"
type="month"
style="width: 250px"
v-model="form2.value"
type="daterange"
placeholder="请选择时间"
value-format="YYYY-MM-DD"
range-separator="⇀"
start-placeholder="开始时间"
end-placeholder="结束时间"
:disabled-date="disabledDate"
:shortcuts="shortcuts"
:size="size"
@change="change2"
/>
</div>
<el-input
v-model="input2"
style="width: 240px"
placeholder="Please Input"
:suffix-icon="Search"
/>
</div>
<el-button type="primary" plain>导出Ecxle表格</el-button>
<div class="day">
<div class="title">部门</div>
<el-tree-select
style="width: 250px"
v-model="form2.deptId"
:data="departmentlist"
@change="change2"
:props="{
value: 'deptId',
label: 'deptName',
children: 'children',
}"
value-key="deptId"
placeholder="请选择归属部门"
clearable
check-strictly
/>
</div>
<el-button type="primary" plain @click="handleExport"
>导出Ecxle表格</el-button
>
<el-button type="primary" @click="change2">查询</el-button>
<el-button plain @click="recharge">重置</el-button>
</div>
</div>
<el-table :data="tableData" border style="width: 100%">
<el-table-column sortable prop="date" label="Date" width="180" />
<el-table-column prop="name" label="Name" width="180" />
<el-table-column prop="address" label="Address" />
<el-table
v-loading="loading"
:data="Tableinfo"
border
style="width: 100%"
>
<el-table-column type="index" label="序号" width="120" align="center">
<template #default="{ row, $index }">
{{ $index + 1 }}
</template>
</el-table-column>
<el-table-column prop="deptName" align="center" label="部门名称" />
<el-table-column
prop="deviceTotal"
align="center"
sortable
label="设备总个数"
/>
<el-table-column
prop="deviceHours"
align="center"
sortable
label="设备使用总时长(小时)"
width="180px"
/>
<el-table-column
prop="passTotal"
align="center"
sortable
label="筛查过车数量"
/>
<el-table-column
prop="alertTotal"
align="center"
sortable
label="预警数量"
/>
<el-table-column
prop="under10"
align="center"
sortable
label="超速10%以下"
/>
<el-table-column
prop="sto20"
align="center"
sortable
label="超速10%-20%"
/>
<el-table-column
prop="eto50"
align="center"
sortable
label="超速20%-50%"
/>
<el-table-column
prop="over50"
align="center"
sortable
label="超速50%以上"
/>
<el-table-column
prop="enforceTotal"
align="center"
label="执法数量"
sortable
/>
</el-table>
</el-card>
</div>
</template>
<script setup>
import useUserStore from "@/store/modules/user";
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
import dayjs from 'dayjs';
import * as echarts from "echarts";
import { Right, Search } from "@element-plus/icons-vue";
import { ref } from "vue";
import { deptList, dashboard, dailyTable } from "@/api/system/largeScreen.js";
const queryParams = ref({
ipaddr: "",
userName: "",
});
const user = ref({});
const loading = ref(false);
const loadingecharts = ref(false);
userStore.getInfo().then((r) => {
console.log(r, 8888);
user.value = r;
});
let drawechar1;
let drawechar2;
let drawechar3;
let drawechar4;
const yesterday = dayjs().subtract(1, 'day').format('YYYY-MM-DD');
const form = ref({
deptId: "",
value: [yesterday,yesterday],
});
const form2 = ref({
deptId: "",
deptLevel: "",
value: [yesterday, yesterday],
});
const echarts1 = ref("");
const echarts2 = ref("");
const echarts3 = ref("");
const echarts4 = ref("");
function resetQuery() {}
function handleQuery() {}
const departmentlist = ref([]);
const datainfo = ref({});
const Tableinfo = ref([]);
function resetQuery() {
form.value = {
deptId: "",
value: [],
};
change();
}
function settype(type) {
if (form2.value.deptLevel != type) {
form2.value.deptLevel = type;
} else {
form2.value.deptLevel = "";
}
change2();
}
/** 导出按钮操作 */
function handleExport() {
let _data = {
deptId: form2.value.deptId,
startDate: form2.value.value[0] || "",
endDate: form2.value.value[1] || "",
deptLevel: form2.value.deptLevel,
};
proxy.download(
"/system/statistics/dailyTable/export",
_data,
`AppVersionRelease_${new Date().getTime()}.xlsx`
);
}
const disabledDate = (time) => {
return time.getTime() > Date.now();
};
const tableData = [
{
date: "2016-05-03",
name: "Tom",
address: "No. 189, Grove St, Los Angeles",
},
{
date: "2016-05-02",
name: "Tom",
address: "No. 189, Grove St, Los Angeles",
},
{
date: "2016-05-04",
name: "Tom",
address: "No. 189, Grove St, Los Angeles",
},
{
date: "2016-05-01",
name: "Tom",
address: "No. 189, Grove St, Los Angeles",
},
];
const shortcuts = [
{
text: "昨天",
value: new Date(),
value: () => {
return [ dayjs().subtract(1, 'day').format('YYYY-MM-DD'), dayjs().subtract(1, 'day').format('YYYY-MM-DD')];
},
},
{
text: "最近7天",
value: () => {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24);
return date;
return [dayjs().subtract(8, 'day').format('YYYY-MM-DD'), dayjs().subtract(1, 'day').format('YYYY-MM-DD')];
},
},
{
text: "最近30天",
value: () => {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
return date;
return [dayjs().subtract(31, 'day').format('YYYY-MM-DD'), dayjs().subtract(1, 'day').format('YYYY-MM-DD')];
},
},
{
text: "最近90天",
value: () => {
return [dayjs().subtract(91, 'day').format('YYYY-MM-DD'), dayjs().subtract(1, 'day').format('YYYY-MM-DD')];
},
},
];
function change() {
getdata();
}
function getdata() {
loadingecharts.value = true;
let _data = {
deptId: form.value.deptId,
startDate: form.value.value[0] || "",
endDate: form.value.value[1] || "",
};
dashboard(_data).then((r) => {
datainfo.value = r.data;
loadingecharts.value = false;
init();
});
}
function recharge() {
form2.value = {
deptId: "",
value: [],
deptLevel: "",
};
change2();
}
function change2() {
gettable();
}
function gettable() {
loading.value = true;
let _data = {
deptId: form2.value.deptId,
startDate: form2.value.value[0] || "",
endDate: form2.value.value[1] || "",
deptLevel: form2.value.deptLevel,
};
dailyTable(_data).then((r) => {
Tableinfo.value = r.data;
loading.value = false;
});
}
// const usedmemoryInstance = echarts.init(usedmemory.value, "macarons");
function init() {
const drawechar1 = echarts.init(echarts1.value, "macarons");
drawechar1 = echarts.init(echarts1.value, "macarons");
drawechar1.setOption({
tooltip: {
trigger: "axis",
@ -269,15 +495,16 @@ function init() {
{
type: "bar",
barWidth: 24,
data: [
{
value: 200,
value: datainfo.value?.warning?.alertCount || 0,
itemStyle: {
color: "#FF8606",
},
},
{
value: 500,
value: datainfo.value?.warning?.seizureCount || 0,
itemStyle: {
color: "#C307B6",
},
@ -287,12 +514,19 @@ function init() {
],
});
const drawechar2 = echarts.init(echarts2.value, "macarons");
drawechar2 = echarts.init(echarts2.value, "macarons");
drawechar2.setOption({
tooltip: {
trigger: "axis",
formatter: "{c}小时 ",
axisPointer: {
type: "shadow",
},
},
color: ["#4D7BFF"],
xAxis: {
type: "category",
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
data: datainfo.value.durationTrend?.map((r) => r.date) || [],
},
yAxis: {
type: "value",
@ -301,36 +535,47 @@ function init() {
show: false,
},
dataZoom: [
{
type: "inside",
},
{
type: "slider",
zoomLock: true,
minValueSpan: datainfo.value.durationTrend[0]?.date || 0,
maxValueSpan: datainfo.value.durationTrend[6]?.date || 0,
brushSelect: false,
show: datainfo.value.durationTrend.length > 6 ? true : false,
height: 15,
bottom: 0,
},
],
grid: {
top: 40,
right: 0,
bottom: 15,
right: 10,
bottom: datainfo.value.durationTrend.length > 6 ? 15 : 0,
left: 0,
containLabel: true,
},
series: [
{
barWidth: 24,
data: [120, 200, 150, 80, 70, 110, 130],
barWidth: 20,
barGap: "50%",
barCategoryGap: "50%",
data: datainfo.value.durationTrend?.map((r) => r.hours) || [],
type: "bar",
},
],
});
const drawechar3 = echarts.init(echarts3.value, "macarons");
drawechar3 = echarts.init(echarts3.value, "macarons");
drawechar3.setOption({
color: ["#4D7BFF", "#FF8606", "#FF2A06", "#C307B6"],
legend: {
show: false,
},
tooltip: {
trigger: "item",
formatter: "{b}: {c} ",
},
grid: {
right: 0,
right: 10,
left: 0,
},
series: [
@ -347,23 +592,21 @@ function init() {
position: "center",
},
data: [
{ value: 1048, name: "Search Engine" },
{ value: 735, name: "Direct" },
{ value: 580, name: "Email" },
{ value: 484, name: "Union Ads" },
{ value: 300, name: "Video Ads" },
{ value: datainfo.value.overspeed.under10, name: "超速10%以下" },
{ value: datainfo.value.overspeed.sto20, name: "超速10%-20%" },
{ value: datainfo.value.overspeed.eto50, name: "超速20%-50%" },
{ value: datainfo.value.overspeed.over50, name: "超速50%以上" },
],
},
],
});
const drawechar4 = echarts.init(echarts4.value, "macarons");
drawechar4 = echarts.init(echarts4.value, "macarons");
drawechar4.setOption({
color: ["#4D7BFF", "#FF8606", "#FF2A06", "#C307B6"],
xAxis: {
type: "category",
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
data: datainfo.value.overspeedTrend.map((r) => r.date),
},
yAxis: {
type: "value",
@ -378,61 +621,86 @@ function init() {
},
},
dataZoom: [
{
type: "inside",
},
{
type: "slider",
zoomLock: true,
minValueSpan: datainfo.value.overspeedTrend[0]?.date || 0,
maxValueSpan: datainfo.value.overspeedTrend[6]?.date || 0,
brushSelect: false,
show: datainfo.value.overspeedTrend.length > 6 ? true : false,
height: 15,
bottom: 0,
},
],
grid: {
top: 40,
right: 0,
bottom: 15,
bottom: datainfo.value.overspeedTrend.length > 6 ? 15 : 0,
left: 0,
containLabel: true,
},
series: [
{
barWidth: 15,
barWidth: 18,
name: "超速10%以下",
data: [120, 200, 150, 80, 70, 110, 130],
data: datainfo.value.overspeedTrend.map((r) => r.under10),
type: "bar",
},
{
name: "超速10%-20%",
barWidth: 15,
data: [120, 200, 150, 80, 70, 110, 130],
barWidth: 18,
data: datainfo.value.overspeedTrend.map((r) => r.sto20),
type: "bar",
},
{
name: "超速20%-50%",
barWidth: 15,
data: [120, 200, 150, 80, 70, 110, 130],
barWidth: 18,
data: datainfo.value.overspeedTrend.map((r) => r.eto50),
type: "bar",
},
{
name: "超速50%以上",
barWidth: 15,
data: [120, 200, 150, 80, 70, 110, 130],
barWidth: 18,
data: datainfo.value.overspeedTrend.map((r) => r.over50),
type: "bar",
},
],
});
}
nextTick(() => {
init();
// init();
change2();
change();
});
function resize() {
// commandstatsIntance.resize()
// usedmemoryInstance.resize()
drawechar1.resize();
drawechar2.resize();
drawechar3.resize();
drawechar4.resize();
}
onMounted(() => {
deptList().then((r) => {
departmentlist.value = r.data;
});
getdata();
});
window.addEventListener("resize", () => {
resize();
// resize();
});
</script>
<style lang="scss" scoped>
.app-container {
background: #f6f6f6;
min-width: 1500px;
}
.app-container :deep(.el-card) {
box-shadow: initial !important;
.el-card__body {
height: 100%;
}
}
.rowbox {
margin-bottom: 10px;
}
@ -465,6 +733,14 @@ window.addEventListener("resize", () => {
font-size: 22px;
margin: 0px;
margin-bottom: 5px;
position: relative;
img {
width: 12px;
height: 16px;
position: absolute;
top: 50%;
transform: translate(50%, -50%);
}
}
span {
font-size: 14px;
@ -519,6 +795,7 @@ window.addEventListener("resize", () => {
}
}
.cardtime {
height: 100%;
.title {
font-weight: 600;
font-size: 16px;
@ -526,7 +803,7 @@ window.addEventListener("resize", () => {
}
#echarts2 {
width: 100%;
height: 300px;
height: calc(100% - 20px);
}
}
.cardtype {
@ -540,7 +817,7 @@ window.addEventListener("resize", () => {
color: #333333;
}
#echarts3 {
height: 290px;
height: calc(100% - 20px);
width: 100%;
}
}
@ -603,6 +880,7 @@ window.addEventListener("resize", () => {
}
.speeding {
position: relative;
height: 100%;
.title {
font-weight: 600;
font-size: 16px;
@ -611,15 +889,19 @@ window.addEventListener("resize", () => {
}
#echarts4 {
width: 100%;
height: 320px;
height: 100%;
}
}
.bottomdata {
.top {
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom: 15px;
:deep(.el-button) {
margin-left: 0px;
}
.left {
display: flex;
align-items: center;
@ -627,7 +909,13 @@ window.addEventListener("resize", () => {
border-radius: 3px;
overflow: hidden;
div {
padding: 10px 15px;
padding: 7px 15px;
font-size: 13px;
border-left: 1px solid #d5d5d5;
cursor: pointer;
&:nth-of-type(1) {
border: none;
}
}
.on {
background: #4d7bff;
@ -638,7 +926,7 @@ window.addEventListener("resize", () => {
display: flex;
gap: 15px;
align-items: center;
.day{
.day {
display: flex;
align-items: center;
}

View File

@ -1,7 +1,7 @@
import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'
const baseUrl = 'http://192.168.1.6:8566' // 后端接口
const baseUrl = 'http://192.168.1.7:9005' // 后端接口
// const baseUrl = 'https://api.huafurenjia.cn'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
@ -41,7 +41,7 @@ export default defineConfig(({ mode, command }) => {
},
// vite 相关配置
server: {
port: 80,
port: 8080,
host: true,
open: true,
proxy: {