标签页面完善

This commit is contained in:
BianLzhaoMin 2024-12-12 15:30:21 +08:00
parent 26823d5cb8
commit f6237bd741
12 changed files with 370 additions and 261 deletions

4
env/.env.dev vendored
View File

@ -8,10 +8,10 @@ VITE_API_URL = '/proxyApi'
# VITE_proxyTarget = 'http://10.40.92.74:8080' #盛旭
# VITE_proxyTarget = 'http://192.168.2.246:28080' # 马帅
# VITE_proxyTarget = 'http://192.168.2.127:28080' # 梁超
VITE_proxyTarget = 'http://192.168.2.127:28080' # 梁超
# VITE_proxyTarget = 'http://36.33.26.201:17788/proxyApi' # 测试服务
# VITE_proxyTarget = 'http://192.168.0.244:28580' # 测试服务
VITE_proxyTarget = 'http://192.168.2.72:28080' # 盛旭
# VITE_proxyTarget = 'http://192.168.2.72:28080' # 盛旭
# VITE_proxyTarget = 'http://10.40.92.185:9206' # 赵福海 ( 设备类型)
# VITE_proxyTarget = 'http://10.40.92.16:9502' # 牛 (个人中心 基础信息企业申请认证)

View File

@ -28,6 +28,7 @@
"vite-plugin-html": "^3.2.0",
"vite-plugin-zip-file": "^2.2.0",
"vue": "^3.3.4",
"vue-qrcode": "^2.2.2",
"vue-router": "^4.2.5"
},
"devDependencies": {

View File

@ -50,6 +50,9 @@ importers:
vue:
specifier: ^3.3.4
version: 3.3.4
vue-qrcode:
specifier: ^2.2.2
version: 2.2.2(qrcode@1.5.4)(vue@3.3.4)
vue-router:
specifier: ^4.2.5
version: 4.2.5(vue@3.3.4)
@ -581,6 +584,10 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
ansi-styles@3.2.1:
resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
engines: {node: '>=4'}
@ -640,6 +647,10 @@ packages:
camel-case@4.1.2:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
camelcase@5.3.1:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
camelcase@6.3.0:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
@ -663,6 +674,9 @@ packages:
resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==}
engines: {node: '>= 10.0'}
cliui@6.0.0:
resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
@ -735,10 +749,17 @@ packages:
supports-color:
optional: true
decamelize@1.2.0:
resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
engines: {node: '>=0.10.0'}
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dijkstrajs@1.0.3:
resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
@ -776,6 +797,9 @@ packages:
peerDependencies:
vue: ^3.2.0
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
@ -822,6 +846,10 @@ packages:
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
engines: {node: '>=8'}
find-up@4.1.0:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
follow-redirects@1.15.3:
resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
engines: {node: '>=4.0'}
@ -851,6 +879,10 @@ packages:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@ -914,6 +946,10 @@ packages:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@ -977,6 +1013,10 @@ packages:
resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
engines: {node: '>=14'}
locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
@ -1093,6 +1133,18 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
engines: {node: '>=6'}
p-locate@4.1.0:
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
engines: {node: '>=8'}
p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
@ -1109,6 +1161,10 @@ packages:
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@ -1159,6 +1215,10 @@ packages:
pkg-types@1.0.3:
resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
pngjs@5.0.0:
resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
engines: {node: '>=10.13.0'}
postcss@8.4.31:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
@ -1169,6 +1229,11 @@ packages:
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
qrcode@1.5.4:
resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
engines: {node: '>=10.13.0'}
hasBin: true
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@ -1187,6 +1252,13 @@ packages:
resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
engines: {node: '>= 0.10'}
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
require-main-filename@2.0.0:
resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
resolve@1.22.8:
resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
hasBin: true
@ -1223,6 +1295,9 @@ packages:
engines: {node: '>=10'}
hasBin: true
set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
setimmediate@1.0.5:
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
@ -1260,9 +1335,17 @@ packages:
spdx-license-ids@3.0.16:
resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==}
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
strip-literal@1.3.0:
resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==}
@ -1418,6 +1501,12 @@ packages:
'@vue/composition-api':
optional: true
vue-qrcode@2.2.2:
resolution: {integrity: sha512-SbrXq/mSb1g2tbDyXPe9gy9KiMYsvxWKRErlpij1BqiFoHwQckheZV63CTw6yRLLUVG2RXAVlX+APkpdCK7SQQ==}
peerDependencies:
qrcode: ^1.0.0
vue: ^2.7.0 || ^3.0.0
vue-router@4.2.5:
resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==}
peerDependencies:
@ -1442,17 +1531,35 @@ packages:
webpack-virtual-modules@0.6.1:
resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==}
which-module@2.0.1:
resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
hasBin: true
wrap-ansi@6.2.0:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
engines: {node: '>=8'}
y18n@4.0.3:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
yargs-parser@18.1.3:
resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
engines: {node: '>=6'}
yargs@15.4.1:
resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
engines: {node: '>=8'}
snapshots:
'@ampproject/remapping@2.2.1':
@ -1983,6 +2090,8 @@ snapshots:
acorn@8.11.2: {}
ansi-regex@5.0.1: {}
ansi-styles@3.2.1:
dependencies:
color-convert: 1.9.3
@ -2045,6 +2154,8 @@ snapshots:
pascal-case: 3.1.2
tslib: 2.6.2
camelcase@5.3.1: {}
camelcase@6.3.0: {}
caniuse-lite@1.0.30001565: {}
@ -2076,6 +2187,12 @@ snapshots:
dependencies:
source-map: 0.6.1
cliui@6.0.0:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 6.2.0
color-convert@1.9.3:
dependencies:
color-name: 1.1.3
@ -2134,8 +2251,12 @@ snapshots:
dependencies:
ms: 2.1.2
decamelize@1.2.0: {}
delayed-stream@1.0.0: {}
dijkstrajs@1.0.3: {}
dom-serializer@1.4.1:
dependencies:
domelementtype: 2.3.0
@ -2190,6 +2311,8 @@ snapshots:
transitivePeerDependencies:
- '@vue/composition-api'
emoji-regex@8.0.0: {}
entities@2.2.0: {}
error-ex@1.3.2:
@ -2253,6 +2376,11 @@ snapshots:
dependencies:
to-regex-range: 5.0.1
find-up@4.1.0:
dependencies:
locate-path: 5.0.0
path-exists: 4.0.0
follow-redirects@1.15.3: {}
form-data@4.0.0:
@ -2274,6 +2402,8 @@ snapshots:
gensync@1.0.0-beta.2: {}
get-caller-file@2.0.5: {}
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
@ -2326,6 +2456,8 @@ snapshots:
is-extglob@2.1.1: {}
is-fullwidth-code-point@3.0.0: {}
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
@ -2381,6 +2513,10 @@ snapshots:
mlly: 1.4.2
pkg-types: 1.0.3
locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
lodash-es@4.17.21: {}
lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
@ -2494,6 +2630,16 @@ snapshots:
dependencies:
boolbase: 1.0.0
p-limit@2.3.0:
dependencies:
p-try: 2.2.0
p-locate@4.1.0:
dependencies:
p-limit: 2.3.0
p-try@2.2.0: {}
pako@1.0.11: {}
param-case@3.0.4:
@ -2516,6 +2662,8 @@ snapshots:
path-browserify@1.0.1: {}
path-exists@4.0.0: {}
path-key@3.1.1: {}
path-parse@1.0.7: {}
@ -2550,6 +2698,8 @@ snapshots:
mlly: 1.4.2
pathe: 1.1.1
pngjs@5.0.0: {}
postcss@8.4.31:
dependencies:
nanoid: 3.3.7
@ -2560,6 +2710,12 @@ snapshots:
proxy-from-env@1.1.0: {}
qrcode@1.5.4:
dependencies:
dijkstrajs: 1.0.3
pngjs: 5.0.0
yargs: 15.4.1
queue-microtask@1.2.3: {}
read-pkg@8.1.0:
@ -2585,6 +2741,10 @@ snapshots:
relateurl@0.2.7: {}
require-directory@2.1.1: {}
require-main-filename@2.0.0: {}
resolve@1.22.8:
dependencies:
is-core-module: 2.13.1
@ -2617,6 +2777,8 @@ snapshots:
dependencies:
lru-cache: 6.0.0
set-blocking@2.0.0: {}
setimmediate@1.0.5: {}
shebang-command@2.0.0:
@ -2650,10 +2812,20 @@ snapshots:
spdx-license-ids@3.0.16: {}
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
string_decoder@1.1.1:
dependencies:
safe-buffer: 5.1.2
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
strip-literal@1.3.0:
dependencies:
acorn: 8.11.2
@ -2804,6 +2976,12 @@ snapshots:
dependencies:
vue: 3.3.4
vue-qrcode@2.2.2(qrcode@1.5.4)(vue@3.3.4):
dependencies:
qrcode: 1.5.4
tslib: 2.6.2
vue: 3.3.4
vue-router@4.2.5(vue@3.3.4):
dependencies:
'@vue/devtools-api': 6.5.1
@ -2833,10 +3011,39 @@ snapshots:
webpack-virtual-modules@0.6.1: {}
which-module@2.0.1: {}
which@2.0.2:
dependencies:
isexe: 2.0.0
wrap-ansi@6.2.0:
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
y18n@4.0.3: {}
yallist@3.1.1: {}
yallist@4.0.0: {}
yargs-parser@18.1.3:
dependencies:
camelcase: 5.3.1
decamelize: 1.2.0
yargs@15.4.1:
dependencies:
cliui: 6.0.0
decamelize: 1.2.0
find-up: 4.1.0
get-caller-file: 2.0.5
require-directory: 2.1.1
require-main-filename: 2.0.0
set-blocking: 2.0.0
string-width: 4.2.3
which-module: 2.0.1
y18n: 4.0.3
yargs-parser: 18.1.3

View File

@ -0,0 +1,22 @@
import { get, post } from '../../index'
// 获取维修列表
export const getRepairListApi = (data: any = {}) => {
return get('/material-mall/ma_rm/list', data)
}
// 新增维修保养数据
export const addRepairDataApi = (data: any = {}) => {
return post('/material-mall/ma_rm/add', data)
}
// 全证书列表
export const getSafeBookByMaIdListApi = (data: any = {}) => {
return get('/material-mall/safeBook/getSafeBookByMaId', data)
}
// 安全证书编辑
export const editSafeBookApi = (data: any = {}) => {
return post('/material-mall/safeBook/editSafeBook', data)
}
// 安全证书列表删除
export const delSafeBookByIdApi = (data: any = {}) => {
return post('/material-mall/safeBook/delSafeBook', data)
}

View File

@ -0,0 +1,22 @@
import { get, post } from '../../index'
// 获取标签列表
export const getTagDevListApi = (data: any = {}) => {
return get('/material-mall/tag/getTagDevList', data)
}
// 新增安全证书
export const addSafeBookApi = (data: any = {}) => {
return post('/material-mall/safeBook/addSafeBook', data)
}
// 全证书列表
export const getSafeBookByMaIdListApi = (data: any = {}) => {
return get('/material-mall/safeBook/getSafeBookByMaId', data)
}
// 安全证书编辑
export const editSafeBookApi = (data: any = {}) => {
return post('/material-mall/safeBook/editSafeBook', data)
}
// 安全证书列表删除
export const delSafeBookByIdApi = (data: any = {}) => {
return post('/material-mall/safeBook/delSafeBook', data)
}

View File

@ -329,7 +329,7 @@ const onJumpUser = () => {
class="left-check-box"
@click="
() => {
searchCheckVisible = true
searchCheckVisible = !searchCheckVisible
}
"
>

View File

@ -3,8 +3,6 @@ import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import { createApp } from 'vue'
// import { createPinia } from 'pinia'
import App from './App.vue'
import pinia from "./store"
import router from './router'
@ -13,6 +11,7 @@ import './style/css/reset.css'
import './assets/font/iconfont.js'
import ElementPlus from 'element-plus'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import VueQrcode from 'vue-qrcode'
import registerDirectives from 'utils/directive'
@ -21,6 +20,7 @@ const app = createApp(App)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
app.component('vue-qr-code', VueQrcode)
}

View File

@ -296,7 +296,18 @@ const routes: Array<RouteRecordRaw> = [
name: 'tag-manage',
component: () => import('views/user/lessor/tag-manage/index.vue'),
meta: {
title: '标签',
title: '标签管理',
keepAlive: true,
AuthFlag: false,
isLogin: true
},
},
{
path: '/repair-manage',
name: 'repair-manage',
component: () => import('views/user/lessor/repair-manage/index.vue'),
meta: {
title: '维修保养管理',
keepAlive: true,
AuthFlag: false,
isLogin: true

View File

@ -30,6 +30,7 @@ const allList = [
{ title: '质检管理', name: 'quality-manage', permission: ['1'] },
{ title: '安全证书管理', name: 'security-certificate', permission: ['1'] },
{ title: '标签管理', name: 'tag-manage', permission: ['1'] },
{ title: '维修保养管理', name: 'repair-manage', permission: ['1'] },
{ title: '需求管理', name: 'sourcingNeed', permission: ['2'] },
{ title: '订单管理', name: 'orderManagement', permission: ['2'] },
{ title: '合同管理', name: 'contract-manage', permission: ['1'] },

View File

@ -26,7 +26,7 @@
inputmode="numeric"
v-model="searchParams.minNum"
style="width: 100%"
placeholder="质检次数"
placeholder="维修保养次数"
/>
</el-form-item>
</el-col>
@ -37,7 +37,7 @@
inputmode="numeric"
v-model.trim="searchParams.maxNum"
style="width: 100%"
placeholder="质检次数"
placeholder="维修保养次数"
/>
</el-form-item>
</el-col>
@ -76,7 +76,7 @@
@click="
() => {
isRepublish = true
dialogTitle = '质检新增'
dialogTitle = '新建维修保养'
addOrEditDialogVisible = true
}
"
@ -191,7 +191,7 @@
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="质检名称" prop="qcName">
<el-form-item label="维修保养名称" prop="qcName">
<el-input
v-model.trim="addOrEditForm.qcName"
placeholder="请输入质检名称"
@ -199,26 +199,16 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="质检员" prop="qcUser">
<el-input
clearable
placeholder="请输入质检员"
v-model="addOrEditForm.qcUser"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="质检日期" prop="qcTime">
<el-form-item label="维修保养日期" prop="rmTime">
<el-date-picker
clearable
type="date"
style="width: 100%"
value-format="YYYY-MM-DD"
v-model="addOrEditForm.qcTime"
v-model="addOrEditForm.rmTime"
placeholder="请选择质检日期"
/>
</el-form-item>
@ -234,7 +224,7 @@
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="质检附件" prop="fileInfoList">
<el-form-item label="维修保养附件" prop="fileInfoList">
<UploadComponentNew
:maxSize="2"
:max-limit="1"
@ -398,6 +388,8 @@ import {
qualityDeleteByIdApi,
getAssociationListApi,
} from 'http/api/quality-manage'
import { getRepairListApi, addRepairDataApi } from 'http/api/repair-manage/index'
import { InfoFilled } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
@ -421,7 +413,7 @@ const uploadUrl = import.meta.env.VITE_API_URL + '/file/upload'
const searchParams = reactive({
deviceCode: '',
qcStartTime: '',
StartTime: '',
qcEndTime: '',
createStartTime: '',
createEndTime: '',
@ -443,9 +435,9 @@ const searchParamsInDialog = reactive({
const addOrEditForm = ref<any>({
maId: '',
qcName: '',
qcUser: '',
qcTime: '',
rmName: '',
rmUser: '',
rmTime: '',
fileInfoList: [],
fileInfoTempList: [],
})
@ -469,9 +461,9 @@ const checkMaxNum = (rule: any, value: any, callback: any) => {
const addOrEditFormRules = reactive({
maId: [{ required: true, message: '请选择关联装备', trigger: 'change' }],
qcName: [{ required: true, message: '请输入质检名称', trigger: 'blur' }],
qcUser: [{ required: true, message: '请输入质检员', trigger: 'change' }],
qcTime: [{ required: true, message: '请选择质检日期', trigger: 'change' }],
rmName: [{ required: true, message: '请输入质检名称', trigger: 'blur' }],
rmUser: [{ required: true, message: '请输入质检员', trigger: 'change' }],
rmTime: [{ required: true, message: '请选择质检日期', trigger: 'change' }],
fileInfoList: [{ required: true, message: '请上传质检附件', trigger: 'blur' }],
})
const searchFormRules = reactive({
@ -509,7 +501,8 @@ const getLeaseListData = async () => {
searchParams.createStartTime = createTime.value[0]
searchParams.createEndTime = createTime.value[1]
}
const { data: res }: any = await getQualityListApi(searchParams)
const { data: res }: any = await getRepairListApi()
console.log(res, '维修列表')
qualityLis.value = res.rows
total.value = res.total
}

View File

@ -0,0 +1,18 @@
<template>
<!-- 标签管理 -->
<div class="qr-code-container">
<h1>装备信息</h1>
<div>装备名称***</div>
<div>装备编号***</div>
<div>装备图片***</div>
</div>
</template>
<script setup lang="ts"></script>
<style lang="scss" scoped>
.qr-code-container {
width: 100vw;
height: 100vh;
}
</style>

View File

@ -21,32 +21,32 @@
</el-col>
<el-col :span="6">
<el-form-item prop="code">
<el-form-item prop="deviceName">
<el-input
clearable
style="width: 100%"
placeholder="请输入装备名称"
v-model.trim="searchParams.code"
v-model.trim="searchParams.deviceName"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="code">
<el-form-item prop="nickName">
<el-input
clearable
style="width: 100%"
placeholder="请输入上传人"
v-model.trim="searchParams.code"
v-model.trim="searchParams.nickName"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="code">
<el-form-item prop="comName">
<el-input
clearable
style="width: 100%"
placeholder="请输入归属公司"
v-model.trim="searchParams.code"
v-model.trim="searchParams.comName"
/>
</el-form-item>
</el-col>
@ -61,11 +61,22 @@
style="width: 100%"
range-separator="-"
value-format="YYYY-MM-DD"
start-placeholder="上传开始日期"
end-placeholder="上传结束日期"
start-placeholder="上传日期"
end-placeholder="上传日期"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-button type="primary" class="primary-lease" @click="getLeaseListData">
查询
</el-button>
<el-button @click="onReset" type="primary" class="primary-lease">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 表格 -->
@ -79,46 +90,22 @@
}"
>
<el-table-column align="center" label="序号" type="index" width="80" />
<el-table-column align="center" prop="deviceCode" label="装备编号" />
<el-table-column align="center" prop="code" label="装备编号" />
<el-table-column align="center" prop="deviceName" label="装备名称" />
<el-table-column align="center" prop="nickName" label="上传人" width="120" />
<el-table-column align="center" prop="createTime" label="归属公司" />
<el-table-column align="center" prop="updateTime" label="装备数量" />
<el-table-column align="center" prop="updateTime" label="上传时间" />
<el-table-column align="center" prop="comName" label="归属公司" />
<el-table-column align="center" prop="deviceCount" label="装备数量" />
<el-table-column align="center" prop="createTime" label="上传时间" />
<el-table-column align="center" label="二维码标签" :width="220">
<template #default="{ row }">
<el-button
size="small"
type="primary"
class="primary-lease"
@click="onViewQualityRecord(row)"
@click="onViewQualityRecord(row.code)"
>
查看
</el-button>
<el-popconfirm
width="220"
:icon="InfoFilled"
icon-color="#626AEF"
title="确定删除该项需求吗?"
@confirm="onDelete(row.maId)"
>
<template #reference>
<el-button size="small" type="danger"> 删除 </el-button>
</template>
<template #actions="{ confirm }">
<el-button type="primary" class="primary-lease" size="small"
>取消</el-button
>
<el-button
class="primary-lease"
type="primary"
size="small"
@click="confirm()"
>
确定
</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
@ -133,172 +120,59 @@
/>
<!-- 新增修改对话框 -->
<el-dialog
width="40%"
width="30%"
align-center
@close="onClose"
destroy-on-close
:title="dialogTitle"
v-model="addOrEditDialogVisible"
>
<el-form
label-width="auto"
label-position="right"
ref="addOrEditFormRef"
:model="addOrEditForm"
:rules="addOrEditFormRules"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="查看标签" style="width: 100%" prop="maId">
<el-select
clearable
style="width: 100%"
placeholder="请选择关联装备"
v-model="addOrEditForm.maId"
@change="onMaIdChange"
:disabled="dialogTitle != '证书新增'"
>
<el-option
:key="item.maId"
:value="item.maId * 1"
:label="item.deviceName"
v-for="item in associationList"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-button class="primary-lease" type="primary"> 下载标签 </el-button>
</el-row>
<!-- <el-row :gutter="20">
<el-col :span="24">
<el-form-item label="1" style="margin-bottom: 0" class="upload-tip">
支持格式.jpg.png 单个文件大小不能超过2M最多可上传1张
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="安全证书附件" prop="fileInfoList">
<div style="flex: 1">
<UploadComponentNew
:maxSize="2"
:max-limit="1"
width="100%"
height="100%"
:multiple="true"
:autoUpload="true"
:minLimit="addOrEditForm.fileInfoList.length"
:actionUrl="uploadUrl"
listType="text"
:justifyContent="`flex-start`"
@onFileChange="onFileChange"
:acceptTypeList="['.jpg', '.png', '.pdf', '.doc']"
>
<template v-slot:default>
<el-button
:icon="UploadFilled"
type="primary"
class="primary-lease"
>上传文件</el-button
>
</template>
</UploadComponentNew>
</div>
</el-form-item>
</el-col>
</el-row> -->
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" class="primary-lease" @click="onCancel"
>取消</el-button
>
<el-button class="primary-lease" type="primary" @click="onSubmit()">
提交
</el-button>
</div>
</template>
<div class="qr-code-container">
<vue-qr-code :value="qrCodeValue" :width="200" id="qrCodeContainer" />
<el-button
style="width: 200px"
class="primary-lease"
type="primary"
@click="onDownLoadQrCode"
>
下载标签
</el-button>
</div>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { getTagDevListApi } from 'http/api/tag-manage/index'
import PagingComponent from 'components/PagingComponent/index.vue'
import UploadComponentNew from 'components/uploadComponentNew/index.vue'
import {
addSafeBookApi,
getSafeBookByMaIdListApi,
editSafeBookApi,
delSafeBookByIdApi,
getAssociationListApi,
} from 'http/api/security-certificate'
import { InfoFilled, UploadFilled } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
const total = ref(0)
const createTime = ref([])
const qualityLis = ref<any>([])
const dialogTitle = ref('')
const qrCodeValue = ref<any>('')
const searchFormRef = ref<any>(null)
const addOrEditFormRef = ref<any>(null)
const dialogTitle = ref('二维码查看')
const addOrEditDialogVisible = ref(false)
const associationList = ref<any>([])
const uploadUrl = import.meta.env.VITE_API_URL + '/file/upload'
const searchParams = reactive({
code: '',
deviceName: '',
nickName: '',
comName: '',
startTime: '',
endTime: '',
pageSize: 10,
pageNum: 1,
})
const addOrEditForm = ref<any>({
maId: '',
fileInfoList: [],
fileInfoTempList: [],
})
const addOrEditFormRules = reactive({
maId: [{ required: true, message: '请选择关联装备', trigger: 'change' }],
fileInfoList: [{ required: true, message: '请上传证书附件', trigger: 'blur' }],
})
//
const getLeaseListData = async () => {
if (createTime.value.length > 0) {
searchParams.startTime = createTime.value[0]
searchParams.endTime = createTime.value[1]
}
const { data: res }: any = await getSafeBookByMaIdListApi(searchParams)
const { data: res }: any = await getTagDevListApi(searchParams)
qualityLis.value = res.rows
total.value = res.total
}
//
const getAssociationListData = async () => {
const res: any = await getAssociationListApi()
associationList.value = res.data
}
const onMaIdChange = (id: any) => {
ElMessage.closeAll()
try {
associationList.value.forEach((e: any) => {
if (e.maId == id && e.isSafeBook === 1) {
ElMessage({
type: 'warning',
message: '当前装备证书已上传,不可重复选择!',
})
addOrEditForm.value.maId = ''
throw new Error()
}
})
} catch (error) {}
}
//
const onReset = () => {
createTime.value = []
@ -309,72 +183,23 @@ const onReset = () => {
searchFormRef.value.resetFields()
getLeaseListData()
}
//
const onDelete = async (maId: any) => {
const res: any = await delSafeBookByIdApi({ maId })
if (res.code === 200) {
ElMessage({
type: 'success',
message: '删除成功',
})
getLeaseListData()
}
}
//
const onSubmit = () => {
addOrEditForm.value.fileInfoList = addOrEditForm.value.fileInfoTempList
addOrEditFormRef.value.validate(async (valid: any) => {
if (valid) {
const SEN_API = dialogTitle.value === '证书修改' ? editSafeBookApi : addSafeBookApi
const res: any = await SEN_API(addOrEditForm.value)
if (res.code === 200) {
ElMessage({
type: 'success',
message: '提交成功',
})
addOrEditDialogVisible.value = false
getLeaseListData()
}
}
})
}
//
const onViewQualityRecord = (row: any) => {
addOrEditForm.value.maId = row.maId
dialogTitle.value = '标签查看'
//
const onViewQualityRecord = (code: any) => {
qrCodeValue.value = 'http://192.168.0.244:17766/login'
addOrEditDialogVisible.value = true
}
//
const onFileChange = (fileList: any) => {
addOrEditForm.value.fileInfoTempList = []
const fileListTemp = fileList.map((e: any) => {
return {
fileName: e.name,
fileUrl: e.url,
}
})
addOrEditForm.value.fileInfoTempList.push(...fileListTemp)
}
//
const onCancel = () => {
addOrEditDialogVisible.value = false
}
const onClose = () => {
addOrEditFormRef.value.resetFields()
addOrEditForm.value.fileInfoTempList = []
addOrEditForm.value.fileInfoList = []
addOrEditForm.value.maId = ''
//
const onDownLoadQrCode = () => {
let qrCodeElement = document.getElementById('qrCodeContainer') as HTMLImageElement
let qrCodeSrc = qrCodeElement.src
const link = document.createElement('a')
link.href = qrCodeSrc
link.download = 'qr-code.png'
link.click()
}
onMounted(() => {
getLeaseListData()
getAssociationListData()
})
</script>
@ -446,11 +271,20 @@ onMounted(() => {
max-height: 100vh !important;
.el-dialog__body {
flex: 1;
padding: 0 10px 20px;
overflow-y: scroll !important;
}
.dialog-content {
padding: 20px;
}
.qr-code-container {
width: 100%;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
}
}
}
</style>