2
This commit is contained in:
7
components.d.ts
vendored
7
components.d.ts
vendored
@ -11,8 +11,15 @@ declare module 'vue' {
|
||||
RouterLink: typeof import('vue-router')['RouterLink']
|
||||
RouterView: typeof import('vue-router')['RouterView']
|
||||
VanButton: typeof import('vant/es')['Button']
|
||||
VanCell: typeof import('vant/es')['Cell']
|
||||
VanCheckbox: typeof import('vant/es')['Checkbox']
|
||||
VanCheckboxGroup: typeof import('vant/es')['CheckboxGroup']
|
||||
VanIcon: typeof import('vant/es')['Icon']
|
||||
VanNavBar: typeof import('vant/es')['NavBar']
|
||||
VanPopup: typeof import('vant/es')['Popup']
|
||||
VanTab: typeof import('vant/es')['Tab']
|
||||
VanTabbar: typeof import('vant/es')['Tabbar']
|
||||
VanTabbarItem: typeof import('vant/es')['TabbarItem']
|
||||
VanTabs: typeof import('vant/es')['Tabs']
|
||||
}
|
||||
}
|
||||
|
859
package-lock.json
generated
859
package-lock.json
generated
@ -20,6 +20,7 @@
|
||||
"@vitejs/plugin-vue": "^6.0.1",
|
||||
"@vue/tsconfig": "^0.7.0",
|
||||
"npm-run-all2": "^8.0.4",
|
||||
"sass-embedded": "^1.91.0",
|
||||
"typescript": "~5.8.0",
|
||||
"unplugin-auto-import": "^20.1.0",
|
||||
"unplugin-vue-components": "^29.0.0",
|
||||
@ -469,6 +470,13 @@
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@bufbuild/protobuf": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.7.0.tgz",
|
||||
"integrity": "sha512-qn6tAIZEw5i/wiESBF4nQxZkl86aY4KoO0IkUa2Lh+rya64oTOdJQFlZuMwI1Qz9VBJQrQC4QlSA2DNek5gCOA==",
|
||||
"dev": true,
|
||||
"license": "(Apache-2.0 AND BSD-3-Clause)"
|
||||
},
|
||||
"node_modules/@esbuild/aix-ppc64": {
|
||||
"version": "0.25.9",
|
||||
"resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
|
||||
@ -930,6 +938,316 @@
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz",
|
||||
"integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"detect-libc": "^1.0.3",
|
||||
"is-glob": "^4.0.3",
|
||||
"micromatch": "^4.0.5",
|
||||
"node-addon-api": "^7.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@parcel/watcher-android-arm64": "2.5.1",
|
||||
"@parcel/watcher-darwin-arm64": "2.5.1",
|
||||
"@parcel/watcher-darwin-x64": "2.5.1",
|
||||
"@parcel/watcher-freebsd-x64": "2.5.1",
|
||||
"@parcel/watcher-linux-arm-glibc": "2.5.1",
|
||||
"@parcel/watcher-linux-arm-musl": "2.5.1",
|
||||
"@parcel/watcher-linux-arm64-glibc": "2.5.1",
|
||||
"@parcel/watcher-linux-arm64-musl": "2.5.1",
|
||||
"@parcel/watcher-linux-x64-glibc": "2.5.1",
|
||||
"@parcel/watcher-linux-x64-musl": "2.5.1",
|
||||
"@parcel/watcher-win32-arm64": "2.5.1",
|
||||
"@parcel/watcher-win32-ia32": "2.5.1",
|
||||
"@parcel/watcher-win32-x64": "2.5.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-android-arm64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
|
||||
"integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-darwin-arm64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
|
||||
"integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-darwin-x64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
|
||||
"integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-freebsd-x64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
|
||||
"integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm-glibc": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
|
||||
"integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm-musl": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
|
||||
"integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm64-glibc": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
|
||||
"integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm64-musl": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
|
||||
"integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-x64-glibc": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
|
||||
"integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-x64-musl": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
|
||||
"integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-arm64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
|
||||
"integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-ia32": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
|
||||
"integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-x64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
|
||||
"integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@polka/url": {
|
||||
"version": "1.0.0-next.29",
|
||||
"resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz",
|
||||
@ -1713,6 +2031,13 @@
|
||||
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer-builder": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmmirror.com/buffer-builder/-/buffer-builder-0.2.0.tgz",
|
||||
"integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==",
|
||||
"dev": true,
|
||||
"license": "MIT/X11"
|
||||
},
|
||||
"node_modules/bundle-name": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz",
|
||||
@ -1773,6 +2098,13 @@
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/colorjs.io": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz",
|
||||
"integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/confbox": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz",
|
||||
@ -1903,6 +2235,20 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/detect-libc": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz",
|
||||
"integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"bin": {
|
||||
"detect-libc": "bin/detect-libc.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/echarts": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz",
|
||||
@ -2137,6 +2483,16 @@
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/he": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
|
||||
@ -2160,6 +2516,13 @@
|
||||
"node": ">=18.18.0"
|
||||
}
|
||||
},
|
||||
"node_modules/immutable": {
|
||||
"version": "5.1.3",
|
||||
"resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz",
|
||||
"integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/is-binary-path": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
|
||||
@ -2399,6 +2762,35 @@
|
||||
"node": ">= 0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"braces": "^3.0.3",
|
||||
"picomatch": "^2.3.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
}
|
||||
},
|
||||
"node_modules/micromatch/node_modules/picomatch": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
|
||||
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/mitt": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
|
||||
@ -2474,6 +2866,14 @@
|
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/node-addon-api": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
|
||||
"integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/node-releases": {
|
||||
"version": "2.0.19",
|
||||
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
|
||||
@ -2830,6 +3230,419 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/rxjs": {
|
||||
"version": "7.8.2",
|
||||
"resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz",
|
||||
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"tslib": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.91.0.tgz",
|
||||
"integrity": "sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"chokidar": "^4.0.0",
|
||||
"immutable": "^5.0.2",
|
||||
"source-map-js": ">=0.6.2 <2.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"sass": "sass.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@parcel/watcher": "^2.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.91.0.tgz",
|
||||
"integrity": "sha512-VTckYcH1AglrZ3VpPETilTo3Ef472XKwP13lrNfbOHSR6Eo5p27XTkIi+6lrCbuhBFFGAmy+4BRoLaeFUgn+eg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@bufbuild/protobuf": "^2.5.0",
|
||||
"buffer-builder": "^0.2.0",
|
||||
"colorjs.io": "^0.5.0",
|
||||
"immutable": "^5.0.2",
|
||||
"rxjs": "^7.4.0",
|
||||
"supports-color": "^8.1.1",
|
||||
"sync-child-process": "^1.0.2",
|
||||
"varint": "^6.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"sass": "dist/bin/sass.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"sass-embedded-all-unknown": "1.91.0",
|
||||
"sass-embedded-android-arm": "1.91.0",
|
||||
"sass-embedded-android-arm64": "1.91.0",
|
||||
"sass-embedded-android-riscv64": "1.91.0",
|
||||
"sass-embedded-android-x64": "1.91.0",
|
||||
"sass-embedded-darwin-arm64": "1.91.0",
|
||||
"sass-embedded-darwin-x64": "1.91.0",
|
||||
"sass-embedded-linux-arm": "1.91.0",
|
||||
"sass-embedded-linux-arm64": "1.91.0",
|
||||
"sass-embedded-linux-musl-arm": "1.91.0",
|
||||
"sass-embedded-linux-musl-arm64": "1.91.0",
|
||||
"sass-embedded-linux-musl-riscv64": "1.91.0",
|
||||
"sass-embedded-linux-musl-x64": "1.91.0",
|
||||
"sass-embedded-linux-riscv64": "1.91.0",
|
||||
"sass-embedded-linux-x64": "1.91.0",
|
||||
"sass-embedded-unknown-all": "1.91.0",
|
||||
"sass-embedded-win32-arm64": "1.91.0",
|
||||
"sass-embedded-win32-x64": "1.91.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-all-unknown": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.91.0.tgz",
|
||||
"integrity": "sha512-AXC1oPqDfLnLtcoxM+XwSnbhcQs0TxAiA5JDEstl6+tt6fhFLKxdyl1Hla39SFtxvMfB2QDUYE3Dmx49O59vYg==",
|
||||
"cpu": [
|
||||
"!arm",
|
||||
"!arm64",
|
||||
"!riscv64",
|
||||
"!x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"sass": "1.91.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-arm": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.91.0.tgz",
|
||||
"integrity": "sha512-DSh1V8TlLIcpklAbn4NINEFs3yD2OzVTbawEXK93IH990upoGNFVNRTstFQ/gcvlbWph3Y3FjAJvo37zUO485A==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-arm64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.91.0.tgz",
|
||||
"integrity": "sha512-I8Eeg2CeVcZIhXcQLNEY6ZBRF0m7jc818/fypwMwvIdbxGWBekTzc3aKHTLhdBpFzGnDIyR4s7oB0/OjIpzD1A==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-riscv64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.91.0.tgz",
|
||||
"integrity": "sha512-qmsl1a7IIJL0fCOwzmRB+6nxeJK5m9/W8LReXUrdgyJNH5RyxChDg+wwQPVATFffOuztmWMnlJ5CV2sCLZrXcQ==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-x64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.91.0.tgz",
|
||||
"integrity": "sha512-/wN0HBLATOVSeN3Tzg0yxxNTo1IQvOxxxwFv7Ki/1/UCg2AqZPxTpNoZj/mn8tUPtiVogMGbC8qclYMq1aRZsQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-darwin-arm64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.91.0.tgz",
|
||||
"integrity": "sha512-gQ6ScInxAN+BDUXy426BSYLRawkmGYlHpQ9i6iOxorr64dtIb3l6eb9YaBV8lPlroUnugylmwN2B3FU9BuPfhA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-darwin-x64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.91.0.tgz",
|
||||
"integrity": "sha512-DSvFMtECL2blYVTFMO5fLeNr5bX437Lrz8R47fdo5438TRyOkSgwKTkECkfh3YbnrL86yJIN2QQlmBMF17Z/iw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-arm": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.91.0.tgz",
|
||||
"integrity": "sha512-ppAZLp3eZ9oTjYdQDf4nM7EehDpkxq5H1hE8FOrx8LpY7pxn6QF+SRpAbRjdfFChRw0K7vh+IiCnQEMp7uLNAg==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-arm64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.91.0.tgz",
|
||||
"integrity": "sha512-OnKCabD7f420ZEC/6YI9WhCVGMZF+ybZ5NbAB9SsG1xlxrKbWQ1s7CIl0w/6RDALtJ+Fjn8+mrxsxqakoAkeuA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-arm": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.91.0.tgz",
|
||||
"integrity": "sha512-znEsNC2FurPF9+XwQQ6e/fVoic3e5D3/kMB41t/bE8byJVRdaPhkdsszt3pZUE56nNGYoCuieSXUkk7VvyPHsw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-arm64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.91.0.tgz",
|
||||
"integrity": "sha512-VfbPpID1C5TT7rukob6CKgefx/TsLE+XZieMNd00hvfJ8XhqPr5DGvSMCNpXlwaedzTirbJu357m+n2PJI9TFQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-riscv64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.91.0.tgz",
|
||||
"integrity": "sha512-ZfLGldKEEeZjuljKks835LTq7jDRI3gXsKKXXgZGzN6Yymd4UpBOGWiDQlWsWTvw5UwDU2xfFh0wSXbLGHTjVA==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-x64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.91.0.tgz",
|
||||
"integrity": "sha512-4kSiSGPKFMbLvTRbP/ibyiKheOA3fwsJKWU0SOuekSPmybMdrhNkTm0REp6+nehZRE60kC3lXmEV4a7w8Jrwyg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-riscv64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.91.0.tgz",
|
||||
"integrity": "sha512-Y3Fj94SYYvMX9yo49T78yBgBWXtG3EyYUT5K05XyCYkcdl1mVXJSrEmqmRfe4vQGUCaSe/6s7MmsA9Q+mQez7Q==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-x64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.91.0.tgz",
|
||||
"integrity": "sha512-XwIUaE7pQP/ezS5te80hlyheYiUlo0FolQ0HBtxohpavM+DVX2fjwFm5LOUJHrLAqP+TLBtChfFeLj1Ie4Aenw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-unknown-all": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.91.0.tgz",
|
||||
"integrity": "sha512-Bj6v7ScQp/HtO91QBy6ood9AArSIN7/RNcT4E7P9QoY3o+e6621Vd28lV81vdepPrt6u6PgJoVKmLNODqB6Q+A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"!android",
|
||||
"!darwin",
|
||||
"!linux",
|
||||
"!win32"
|
||||
],
|
||||
"dependencies": {
|
||||
"sass": "1.91.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-win32-arm64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.91.0.tgz",
|
||||
"integrity": "sha512-yDCwTiPRex03i1yo7LwiAl1YQ21UyfOxPobD7UjI8AE8ZcB0mQ28VVX66lsZ+qm91jfLslNFOFCD4v79xCG9hA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-win32-x64": {
|
||||
"version": "1.91.0",
|
||||
"resolved": "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.91.0.tgz",
|
||||
"integrity": "sha512-wiuMz/cx4vsk6rYCnNyoGE5pd73aDJ/zF3qJDose3ZLT1/vV943doJE5pICnS/v5DrUqzV6a1CNq4fN+xeSgFQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass/node_modules/chokidar": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz",
|
||||
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"readdirp": "^4.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 14.16.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/sass/node_modules/readdirp": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz",
|
||||
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">= 14.18.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "individual",
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/scule": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
|
||||
@ -2964,6 +3777,45 @@
|
||||
"node": ">=16"
|
||||
}
|
||||
},
|
||||
"node_modules/supports-color": {
|
||||
"version": "8.1.1",
|
||||
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
|
||||
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"has-flag": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/supports-color?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/sync-child-process": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmmirror.com/sync-child-process/-/sync-child-process-1.0.2.tgz",
|
||||
"integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"sync-message-port": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sync-message-port": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmmirror.com/sync-message-port/-/sync-message-port-1.1.3.tgz",
|
||||
"integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tinyglobby": {
|
||||
"version": "0.2.14",
|
||||
"resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz",
|
||||
@ -3261,6 +4113,13 @@
|
||||
"vue": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/varint": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmmirror.com/varint/-/varint-6.0.0.tgz",
|
||||
"integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "7.1.3",
|
||||
"resolved": "https://registry.npmmirror.com/vite/-/vite-7.1.3.tgz",
|
||||
|
@ -26,6 +26,7 @@
|
||||
"@vitejs/plugin-vue": "^6.0.1",
|
||||
"@vue/tsconfig": "^0.7.0",
|
||||
"npm-run-all2": "^8.0.4",
|
||||
"sass-embedded": "^1.91.0",
|
||||
"typescript": "~5.8.0",
|
||||
"unplugin-auto-import": "^20.1.0",
|
||||
"unplugin-vue-components": "^29.0.0",
|
||||
|
BIN
public/assets/ats.png
Normal file
BIN
public/assets/ats.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
BIN
public/assets/back1.png
Normal file
BIN
public/assets/back1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/kt.png
Normal file
BIN
public/assets/kt.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
BIN
public/assets/menjin.png
Normal file
BIN
public/assets/menjin.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
public/assets/pdx.png
Normal file
BIN
public/assets/pdx.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
BIN
public/assets/ups.png
Normal file
BIN
public/assets/ups.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
17
src/main.ts
17
src/main.ts
@ -1,12 +1,13 @@
|
||||
import { createApp } from 'vue'
|
||||
import { createPinia } from 'pinia'
|
||||
import { createApp } from "vue";
|
||||
import { createPinia } from "pinia";
|
||||
|
||||
import App from './App.vue'
|
||||
import router from './router'
|
||||
import App from "./App.vue";
|
||||
import router from "./router";
|
||||
import "vant/es/toast/style"; // 引入Toast样式
|
||||
|
||||
const app = createApp(App)
|
||||
const app = createApp(App);
|
||||
|
||||
app.use(createPinia())
|
||||
app.use(router)
|
||||
app.use(createPinia());
|
||||
app.use(router);
|
||||
|
||||
app.mount('#app')
|
||||
app.mount("#app");
|
||||
|
@ -26,6 +26,29 @@ const router = createRouter({
|
||||
path: "/demo",
|
||||
component: () => import("@/views/demo.vue"),
|
||||
},
|
||||
{
|
||||
path: "/menjinliebiao",
|
||||
component: () => import("@/views/menjinliebiao.vue"),
|
||||
},
|
||||
{
|
||||
name: "mjlbopen",
|
||||
path: "/mjlbopen/:name",
|
||||
component: () => import("@/views/mjlbopen.vue"),
|
||||
},
|
||||
{
|
||||
name: "jmpdx",
|
||||
path: "/jmpdx",
|
||||
component: () => import("@/views/jmpdx.vue"),
|
||||
},
|
||||
{
|
||||
path: "/ktlb",
|
||||
component: () => import("@/views/ktlb.vue"),
|
||||
},
|
||||
{
|
||||
name: "ktxx",
|
||||
path: "/ktxx/:title",
|
||||
component: () => import("@/views/ktxx.vue"),
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
|
227
src/views/jmpdx.vue
Normal file
227
src/views/jmpdx.vue
Normal file
@ -0,0 +1,227 @@
|
||||
<template>
|
||||
<van-nav-bar
|
||||
title="精密配电箱列表"
|
||||
left-arrow
|
||||
@click-left="back"
|
||||
placeholder
|
||||
/>
|
||||
|
||||
<div class="container">
|
||||
<h2 class="page-title">精密配电柜信息列表</h2>
|
||||
<div class="cabinet-list">
|
||||
<!-- 循环展示10条配柜信息 -->
|
||||
<div
|
||||
v-for="(cabinet, index) in cabinetData"
|
||||
:key="index"
|
||||
class="cabinet-item"
|
||||
>
|
||||
<!-- 左侧信息区域 -->
|
||||
<div class="cabinet-left">
|
||||
<div class="cabinet-title">
|
||||
<span class="cabinet-tag">{{ cabinet.title }}</span>
|
||||
</div>
|
||||
<div class="cabinet-details">
|
||||
<p><span class="label">位置:</span>{{ cabinet.position }}</p>
|
||||
<p>
|
||||
<span class="label">设备型号:</span>{{ cabinet.deviceModel }}
|
||||
</p>
|
||||
<p><span class="label">设备编码:</span>{{ cabinet.deviceCode }}</p>
|
||||
<p>
|
||||
<span class="label">所属厂家:</span>{{ cabinet.manufacturer }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧温湿度区域 -->
|
||||
<div class="cabinet-right">
|
||||
<div class="temp-humidity-title">温湿度监测</div>
|
||||
<div class="temp-humidity-values">
|
||||
<p v-for="(item, i) in cabinet.temperatures" :key="i">
|
||||
传感器{{ i + 1 }}: {{ item.temp }}℃ / {{ item.humidity }}%
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧箭头 -->
|
||||
<div class="cabinet-arrow">
|
||||
<i class="arrow-icon">→</i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
const router = useRouter();
|
||||
const back = () => {
|
||||
router.back();
|
||||
};
|
||||
// 生成随机温度数据 (20-35℃)
|
||||
const getRandomTemp = () => {
|
||||
return (Math.random() * 15 + 20).toFixed(1);
|
||||
};
|
||||
|
||||
// 生成随机湿度数据 (30-60%)
|
||||
const getRandomHumidity = () => {
|
||||
return Math.floor(Math.random() * 30 + 30);
|
||||
};
|
||||
|
||||
// 生成随机位置信息
|
||||
const getRandomPosition = () => {
|
||||
const areas = ["东区", "西区", "南区", "北区", "中区"];
|
||||
const rooms = ["A", "B", "C", "D", "E"];
|
||||
const floors = [1, 2, 3, 4, 5];
|
||||
|
||||
const area = areas[Math.floor(Math.random() * areas.length)];
|
||||
const room = rooms[Math.floor(Math.random() * rooms.length)];
|
||||
const floor = floors[Math.floor(Math.random() * floors.length)];
|
||||
|
||||
return `${area}${room}机房 ${floor}楼`;
|
||||
};
|
||||
|
||||
// 设备型号列表
|
||||
const deviceModels = [
|
||||
"PDU-800A",
|
||||
"PDU-800B",
|
||||
"PDU-900A",
|
||||
"PDU-900B",
|
||||
"SPM-1000",
|
||||
"SPM-1200",
|
||||
];
|
||||
|
||||
// 生成10条随机数据
|
||||
const cabinetData = ref([]);
|
||||
for (let i = 1; i <= 10; i++) {
|
||||
// 生成3组温湿度数据
|
||||
const temps = Array.from({ length: 3 }, () => ({
|
||||
temp: getRandomTemp(),
|
||||
humidity: getRandomHumidity(),
|
||||
}));
|
||||
|
||||
cabinetData.value.push({
|
||||
title: `精密配电柜 ${i}`,
|
||||
position: getRandomPosition(),
|
||||
deviceModel: deviceModels[Math.floor(Math.random() * deviceModels.length)],
|
||||
deviceCode: `PDU-${Math.floor(Math.random() * 10000)
|
||||
.toString()
|
||||
.padStart(4, "0")}`,
|
||||
manufacturer: "四川省自贡电网",
|
||||
temperatures: temps,
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
||||
}
|
||||
|
||||
.page-title {
|
||||
color: #333;
|
||||
border-bottom: 2px solid #165dff;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.cabinet-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.cabinet-item {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
transition: box-shadow 0.3s ease;
|
||||
}
|
||||
|
||||
.cabinet-item:hover {
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.cabinet-left {
|
||||
flex: 2;
|
||||
padding: 15px;
|
||||
border-right: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.cabinet-title {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.cabinet-tag {
|
||||
display: inline-block;
|
||||
background-color: #165dff;
|
||||
color: white;
|
||||
padding: 4px 12px;
|
||||
border-radius: 4px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.cabinet-details {
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.cabinet-details p {
|
||||
margin: 8px 0;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.label {
|
||||
color: #888;
|
||||
display: inline-block;
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.cabinet-right {
|
||||
flex: 1;
|
||||
padding: 15px;
|
||||
background-color: #f9f9f9;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.temp-humidity-title {
|
||||
font-weight: 500;
|
||||
margin-bottom: 10px;
|
||||
color: #333;
|
||||
border-bottom: 1px dashed #ddd;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.temp-humidity-values {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.cabinet-arrow {
|
||||
width: 50px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-left: 1px solid #f0f0f0;
|
||||
background-color: #f5f5f5;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.cabinet-arrow:hover {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
.arrow-icon {
|
||||
color: #999;
|
||||
font-size: 20px;
|
||||
}
|
||||
</style>
|
138
src/views/ktlb.vue
Normal file
138
src/views/ktlb.vue
Normal file
@ -0,0 +1,138 @@
|
||||
<template>
|
||||
<van-nav-bar title="空调列表" left-arrow @click-left="back" placeholder />
|
||||
<div class="air-conditioner-container">
|
||||
<div
|
||||
v-for="(airCon, index) in airConditionerData"
|
||||
:key="index"
|
||||
class="air-conditioner-item"
|
||||
@click="handleClick(airCon)"
|
||||
>
|
||||
<div class="content">
|
||||
<div class="title">{{ airCon.title }}</div>
|
||||
<div class="info">所在区域: {{ airCon.region }}</div>
|
||||
<div class="info">设备型号: {{ airCon.model }}</div>
|
||||
<div class="info">设备编码: {{ airCon.code }}</div>
|
||||
<div class="info">所属厂家: {{ airCon.manufacturer }}</div>
|
||||
<div class="info">
|
||||
温度报警上下限: 上限{{ airCon.tempUpper }}℃ 下限{{
|
||||
airCon.tempLower
|
||||
}}℃
|
||||
</div>
|
||||
<div class="info">
|
||||
湿度报警上下限: 上限{{ airCon.humidityUpper }}% 下限{{
|
||||
airCon.humidityLower
|
||||
}}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="arrow">
|
||||
<van-icon name="arrow" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
import { Icon } from "vant";
|
||||
const router = useRouter();
|
||||
const back = () => {
|
||||
router.back();
|
||||
};
|
||||
// 生成随机数据的工具函数
|
||||
const generateRandomData = (count) => {
|
||||
const data = [];
|
||||
const manufacturers = ["重庆"];
|
||||
const models = ["Pco3", "Pco4", "Pco5", "Pco6", "Pco7"];
|
||||
for (let i = 1; i <= count; i++) {
|
||||
const title = `二楼机房${i}号空调`;
|
||||
const region = "0";
|
||||
const model = models[Math.floor(Math.random() * models.length)];
|
||||
const code = Math.floor(Math.random() * 1000000)
|
||||
.toString()
|
||||
.padStart(6, "0");
|
||||
const manufacturer =
|
||||
manufacturers[Math.floor(Math.random() * manufacturers.length)];
|
||||
const tempUpper = 40 + Math.floor(Math.random() * 20);
|
||||
const tempLower = 20 + Math.floor(Math.random() * 20);
|
||||
const humidityUpper = 50 + Math.floor(Math.random() * 20);
|
||||
const humidityLower = 20 + Math.floor(Math.random() * 20);
|
||||
data.push({
|
||||
title,
|
||||
region,
|
||||
model,
|
||||
code,
|
||||
manufacturer,
|
||||
tempUpper,
|
||||
tempLower,
|
||||
humidityUpper,
|
||||
humidityLower,
|
||||
});
|
||||
}
|
||||
return data;
|
||||
};
|
||||
|
||||
// 生成15条随机数据
|
||||
const airConditionerData = ref(generateRandomData(15));
|
||||
|
||||
// 点击事件处理方法
|
||||
const handleClick = (item) => {
|
||||
console.log("点击了", item.title, ",准备跳转详细页", item);
|
||||
router.push({ name: "ktxx", params: { title: item.title } });
|
||||
// 实际跳转逻辑可在这里实现
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.air-conditioner-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
padding: 20px;
|
||||
max-width: 1000px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.air-conditioner-item {
|
||||
background-color: #ffffff;
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.air-conditioner-item:hover {
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
||||
border-color: #d0d0d0;
|
||||
}
|
||||
|
||||
.content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 10px;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
.info {
|
||||
margin-bottom: 6px;
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.arrow {
|
||||
color: #b0b0b0;
|
||||
margin-left: 20px;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
.air-conditioner-item:hover .arrow {
|
||||
color: #3498db;
|
||||
}
|
||||
</style>
|
250
src/views/ktxx.vue
Normal file
250
src/views/ktxx.vue
Normal file
@ -0,0 +1,250 @@
|
||||
<template>
|
||||
<van-nav-bar title="空调详情" left-arrow @click-left="back" placeholder />
|
||||
|
||||
<div class="air-conditioner-detail">
|
||||
<!-- 标题区域 -->
|
||||
<div class="title">
|
||||
{{ title }}
|
||||
</div>
|
||||
|
||||
<!-- 信息展示区域 -->
|
||||
<div class="info-container">
|
||||
<div class="info-item">
|
||||
<span class="label">所在区域:</span>
|
||||
<span class="value">{{ detailData.region }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">设备型号:</span>
|
||||
<span class="value">{{ detailData.model }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">设备编码:</span>
|
||||
<span class="value">{{ detailData.code }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">所属厂家:</span>
|
||||
<span class="value">{{ detailData.manufacturer }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">温度上限:</span>
|
||||
<span class="value temp-upper">{{ detailData.tempUpper }}℃</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">温度下限:</span>
|
||||
<span class="value temp-lower">{{ detailData.tempLower }}℃</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">湿度上限:</span>
|
||||
<span class="value humidity-upper"
|
||||
>{{ detailData.humidityUpper }}%</span
|
||||
>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">湿度下限:</span>
|
||||
<span class="value humidity-lower"
|
||||
>{{ detailData.humidityLower }}%</span
|
||||
>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">回风温度:</span>
|
||||
<span class="value">{{ detailData.returnAirTemp }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">送风温度:</span>
|
||||
<span class="value">{{ detailData.supplyAirTemp }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">系统运行时间:</span>
|
||||
<span class="value">{{ detailData.runTime }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 监控信息区域 -->
|
||||
<div class="monitor-title">监控信息</div>
|
||||
<div class="info-container">
|
||||
<div class="info-item">
|
||||
<span class="label">压缩机1排气压力:</span>
|
||||
<span class="value">{{ detailData.compressor1Pressure }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">压缩机2排气压力:</span>
|
||||
<span class="value">{{ detailData.compressor2Pressure }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">加湿电流:</span>
|
||||
<span class="value">{{ detailData.humidificationCurrent }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">送风机保护:</span>
|
||||
<span class="value warning">{{ detailData.fanProtection }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">过滤网状态:</span>
|
||||
<span class="value">{{ detailData.filterClogged }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">漏水报警:</span>
|
||||
<span class="value">{{ detailData.floorLeakAlarm }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
|
||||
// 获取路由实例
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const back = () => {
|
||||
router.back();
|
||||
};
|
||||
// 存储当前设备标题和详情数据
|
||||
const title = ref("");
|
||||
const detailData = ref({});
|
||||
|
||||
// 生成随机数据的工具函数
|
||||
const generateRandomData = () => {
|
||||
// 基础数据池
|
||||
const regions = ["0"];
|
||||
const models = [
|
||||
"Pco3",
|
||||
"Pco4",
|
||||
"Pco5",
|
||||
"Pco6",
|
||||
"Pco7",
|
||||
"KFR-35GW",
|
||||
"KFR-50LW",
|
||||
];
|
||||
const manufacturers = ["重庆"];
|
||||
const statusOptions = ["正常", "开启", "关闭", "报警", "解除"];
|
||||
const yesNoOptions = ["是", "否", "已堵塞", "未堵塞"];
|
||||
|
||||
// 生成随机数的辅助函数
|
||||
const randomNum = (min, max, decimalPlaces = 0) => {
|
||||
const num = Math.random() * (max - min) + min;
|
||||
return decimalPlaces > 0 ? num.toFixed(decimalPlaces) : Math.floor(num);
|
||||
};
|
||||
|
||||
return {
|
||||
region: regions[Math.floor(Math.random() * regions.length)],
|
||||
model: models[Math.floor(Math.random() * models.length)],
|
||||
code: Math.floor(Math.random() * 1000000)
|
||||
.toString()
|
||||
.padStart(6, "0"),
|
||||
manufacturer:
|
||||
manufacturers[Math.floor(Math.random() * manufacturers.length)],
|
||||
tempUpper: randomNum(40, 60),
|
||||
tempLower: randomNum(10, 30),
|
||||
humidityUpper: randomNum(50, 70),
|
||||
humidityLower: randomNum(20, 40),
|
||||
returnAirTemp: `${randomNum(20, 30, 1)}℃`,
|
||||
supplyAirTemp: `${randomNum(18, 28, 1)}℃`,
|
||||
runTime: `${randomNum(10, 100)}H`,
|
||||
coolMode: statusOptions[Math.floor(Math.random() * 2)], // 只取开启/关闭
|
||||
dehumidifyMode: statusOptions[Math.floor(Math.random() * 2)],
|
||||
highWaterLevelSwitch: statusOptions[Math.floor(Math.random() * 2)],
|
||||
remoteSwitch: statusOptions[Math.floor(Math.random() * 2)],
|
||||
airPressureSwitch: statusOptions[Math.floor(Math.random() * 2)],
|
||||
returnAirHumidity: `${randomNum(30, 60, 1)}%`,
|
||||
compressor1Pressure: `${randomNum(14, 16, 4)}MPa`,
|
||||
compressor2Pressure: `${randomNum(14, 16, 4)}MPa`,
|
||||
humidificationCurrent: `${randomNum(0, 5, 1)}A`,
|
||||
fanProtection:
|
||||
statusOptions[Math.floor(Math.random() * statusOptions.length)],
|
||||
filterClogged:
|
||||
yesNoOptions[Math.floor(Math.random() * yesNoOptions.length)],
|
||||
floorLeakAlarm:
|
||||
statusOptions[Math.floor(Math.random() * 2)] === "开启" ? "报警" : "正常",
|
||||
};
|
||||
};
|
||||
|
||||
// 根据路由参数获取标题并生成随机数据
|
||||
const generateData = () => {
|
||||
// 从路由参数中获取title
|
||||
const currentTitle = route.params.title;
|
||||
title.value = currentTitle || "未知空调设备";
|
||||
|
||||
// 生成随机数据
|
||||
detailData.value = generateRandomData();
|
||||
};
|
||||
|
||||
// 初始化时生成数据
|
||||
onMounted(generateData);
|
||||
|
||||
// 监听路由参数变化,当从其他详情页跳转过来时重新生成数据
|
||||
watch(
|
||||
() => route.params.title,
|
||||
() => {
|
||||
generateData();
|
||||
}
|
||||
);
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.air-conditioner-detail {
|
||||
padding: 16px;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.title,
|
||||
.monitor-title {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
background-color: #007bff;
|
||||
padding: 10px 16px;
|
||||
border-radius: 4px;
|
||||
margin: 0 0 16px 0;
|
||||
}
|
||||
|
||||
.monitor-title {
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.info-container {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.info-container {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.info-item {
|
||||
padding: 10px;
|
||||
background-color: #f9f9f9;
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.label {
|
||||
color: #666;
|
||||
width: 120px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.value {
|
||||
color: #333;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.temp-upper,
|
||||
.humidity-upper {
|
||||
color: #00bfff;
|
||||
}
|
||||
|
||||
.temp-lower,
|
||||
.humidity-lower {
|
||||
color: #ff4500;
|
||||
}
|
||||
|
||||
.warning {
|
||||
color: #ff9800;
|
||||
}
|
||||
</style>
|
@ -1,2 +1,404 @@
|
||||
<template>动环管理</template>
|
||||
<script setup></script>
|
||||
<template>
|
||||
<van-nav-bar title="动环管理" placeholder />
|
||||
<van-tabs v-model:active="active" type="card">
|
||||
<van-tab title="动环统计">
|
||||
<div class="environment-dashboard">
|
||||
<!-- 页面标题 -->
|
||||
<h2 class="dashboard-title">环境监控数据</h2>
|
||||
|
||||
<!-- 环形图表区域 -->
|
||||
<div class="ring-charts-container">
|
||||
<div
|
||||
class="chart-card"
|
||||
v-for="(item, index) in ringChartData"
|
||||
:key="index"
|
||||
>
|
||||
<div class="chart-header">{{ item.title }}</div>
|
||||
<div class="chart-wrapper">
|
||||
<div ref="chartRefs" class="chart"></div>
|
||||
<div class="chart-value">
|
||||
{{ item.value }}
|
||||
<span class="chart-unit" v-if="item.unit">{{ item.unit }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 设备列表区域 -->
|
||||
<div class="device-list-container">
|
||||
<h3 class="list-title">设备统计</h3>
|
||||
<div class="device-grid">
|
||||
<div
|
||||
class="device-item"
|
||||
v-for="(device, index) in deviceList"
|
||||
:key="index"
|
||||
>
|
||||
<img src="/assets/back1.png" style="width: 30px; height: 30px" />
|
||||
<span class="device-name">{{ device.name }}</span>
|
||||
<span class="device-count">{{ device.count }} 台</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</van-tab>
|
||||
<van-tab title="设备查看">
|
||||
<div class="device-list">
|
||||
<!-- 遍历设备数据渲染列表 -->
|
||||
<div
|
||||
v-for="(item, index) in deviceLista"
|
||||
:key="index"
|
||||
class="device-item"
|
||||
@click="handleView(item)"
|
||||
>
|
||||
<!-- 图片占位,可后续替换为实际图片逻辑 -->
|
||||
<div class="icon-placeholder">
|
||||
<img :src="item.src" alt="" style="width: 30px; height: 30px" />
|
||||
</div>
|
||||
<span class="device-name">{{ item.name }}</span>
|
||||
<span class="view-btn" @click="go(item.path)"
|
||||
>查看 <van-icon name="arrow"
|
||||
/></span>
|
||||
</div>
|
||||
</div>
|
||||
</van-tab>
|
||||
</van-tabs>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
// 全局组件样式覆盖(van-tabs 卡片式导航)
|
||||
:deep(.van-tabs__nav--card) {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
// 页面主容器
|
||||
.environment-dashboard {
|
||||
padding: 20px;
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
// 页面标题
|
||||
.dashboard-title {
|
||||
color: #1f2329;
|
||||
font-size: 24px;
|
||||
margin-bottom: 30px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
// 环形图表容器(核心:强制一行显示 + 横向滚动)
|
||||
.ring-charts-container {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
margin-bottom: 40px;
|
||||
flex-wrap: nowrap; // 禁止换行,强制一行
|
||||
overflow-x: auto; // 超出部分横向滚动
|
||||
padding-bottom: 10px; // 给滚动条预留间距,避免遮挡
|
||||
justify-content: flex-start; // 从左侧开始排列,不居中
|
||||
}
|
||||
|
||||
// 优化横向滚动条样式(提升视觉体验)
|
||||
.ring-charts-container::-webkit-scrollbar {
|
||||
height: 6px; // 滚动条高度
|
||||
}
|
||||
.ring-charts-container::-webkit-scrollbar-thumb {
|
||||
background-color: #e5e7eb; // 滚动条滑块颜色
|
||||
border-radius: 3px; // 滑块圆角
|
||||
}
|
||||
.ring-charts-container::-webkit-scrollbar-thumb:hover {
|
||||
background-color: #d1d5db; // 滑块 hover 时颜色
|
||||
}
|
||||
|
||||
// 单个图表卡片
|
||||
.chart-card {
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
||||
padding: 20px;
|
||||
width: 180px; // 卡片宽度(可根据需求调整,越小一行显示越多)
|
||||
flex-shrink: 0; // 禁止卡片被压缩,保证大小统一
|
||||
transition: transform 0.3s ease; // hover 上浮动画
|
||||
}
|
||||
|
||||
// 图表卡片 hover 效果
|
||||
.chart-card:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
// 图表标题(如“空调数量”“当前温度”)
|
||||
.chart-header {
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
color: #4e5969;
|
||||
margin-bottom: 15px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
// 图表包裹容器(定位用)
|
||||
.chart-wrapper {
|
||||
position: relative;
|
||||
height: 160px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
// 环形图表容器(echarts 渲染区域)
|
||||
.chart {
|
||||
width: 100%;
|
||||
height: 140px;
|
||||
}
|
||||
|
||||
// 图表中心数值(如“7”“26.7”)
|
||||
.chart-value {
|
||||
position: absolute;
|
||||
font-size: 22px;
|
||||
font-weight: 600;
|
||||
color: #1f2329;
|
||||
}
|
||||
|
||||
// 数值单位(如“台”“℃”“%”)
|
||||
.chart-unit {
|
||||
font-size: 16px;
|
||||
margin-left: 4px;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
// 设备列表容器
|
||||
.device-list-container {
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
// 设备列表标题
|
||||
.list-title {
|
||||
color: #1f2329;
|
||||
font-size: 18px;
|
||||
margin-bottom: 20px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
// 设备网格布局
|
||||
.device-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); // 自动适配列数
|
||||
gap: 15px; // 网格间距
|
||||
}
|
||||
|
||||
// 单个设备项(如“交流柜:10台”)
|
||||
.device-item {
|
||||
padding: 12px 15px;
|
||||
background: #f9fafb;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
transition: background 0.2s ease; // hover 背景变化动画
|
||||
}
|
||||
|
||||
// 设备项 hover 效果
|
||||
.device-item:hover {
|
||||
background: #f0f2f5;
|
||||
}
|
||||
|
||||
// 设备名称(如“交流柜”“UPS”)
|
||||
.device-name {
|
||||
color: #4e5969;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
// 设备数量(如“10台”“8台”)
|
||||
.device-count {
|
||||
color: #1f2329;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
// 响应式适配(中屏:平板/大屏手机)
|
||||
@media (max-width: 768px) {
|
||||
.chart-card {
|
||||
width: 160px; // 缩小卡片宽度,减少滚动需求
|
||||
}
|
||||
|
||||
.device-grid {
|
||||
grid-template-columns: repeat(2, 1fr); // 设备列表强制2列
|
||||
}
|
||||
}
|
||||
|
||||
// 响应式适配(小屏:手机竖屏)
|
||||
@media (max-width: 375px) {
|
||||
.ring-charts-container {
|
||||
flex-wrap: wrap; // 允许换行,避免滚动条过长
|
||||
justify-content: center; // 换行后居中排列
|
||||
}
|
||||
|
||||
.chart-card {
|
||||
width: 140px; // 进一步缩小卡片,适配小屏
|
||||
max-width: none;
|
||||
}
|
||||
}
|
||||
.device-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px; /* 项之间的间距 */
|
||||
}
|
||||
|
||||
.device-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 12px;
|
||||
border: 1px solid #eee;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.device-item:hover {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
|
||||
.icon-placeholder {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
background-color: #ddd; /* 占位背景色,后续替换为图片 */
|
||||
border-radius: 4px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.device-name {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.view-btn {
|
||||
color: #409eff; /* 示例颜色,可自定义 */
|
||||
font-size: 14px;
|
||||
}
|
||||
</style>
|
||||
<script setup>
|
||||
const router = useRouter();
|
||||
import * as echarts from "echarts";
|
||||
const deviceLista = [
|
||||
{ name: "门禁", src: "/assets/menjin.png", path: "/menjinliebiao" },
|
||||
{ name: "机密配电箱", src: "/assets/pdx.png", path: "/jmpdx" },
|
||||
{ name: "空调", src: "/assets/kt.png", path: "/ktlb" },
|
||||
{ name: "UPS", src: "/assets/ups.png" },
|
||||
{ name: "ATS", src: "/assets/ats.png" },
|
||||
];
|
||||
const back = () => {
|
||||
router.back();
|
||||
};
|
||||
const go = (src) => {
|
||||
router.push(src);
|
||||
};
|
||||
// 环形图数据
|
||||
const ringChartData = ref([
|
||||
{ title: "空调数量", value: 7, unit: "台", color: "#42b983" },
|
||||
{ title: "当前温度", value: 26.7, unit: "℃", color: "#ff4d4f" },
|
||||
{ title: "当前湿度", value: 56, unit: "%", color: "#1890ff" },
|
||||
]);
|
||||
|
||||
// 设备列表数据
|
||||
const deviceList = ref([
|
||||
{ name: "交流柜", count: 10 },
|
||||
{ name: "UPS", count: 8 },
|
||||
{ name: "ATS", count: 4 },
|
||||
{ name: "漏水设备", count: 12 },
|
||||
{ name: "蓄电池", count: 24 },
|
||||
{ name: "温湿度设备", count: 16 },
|
||||
{ name: "列头柜", count: 6 },
|
||||
{ name: "安防设备", count: 9 },
|
||||
]);
|
||||
|
||||
// 图表引用
|
||||
const chartRefs = ref([]);
|
||||
|
||||
// 初始化图表
|
||||
const initCharts = () => {
|
||||
// 确保DOM已渲染
|
||||
if (chartRefs.value.length === 0) return;
|
||||
|
||||
// 为每个图表初始化
|
||||
chartRefs.value.forEach((el, index) => {
|
||||
if (!el) return;
|
||||
|
||||
const chartInstance = echarts.init(el);
|
||||
const chartData = ringChartData.value[index];
|
||||
|
||||
// 图表配置
|
||||
const option = {
|
||||
// 添加图表边距,减少外部空间占用
|
||||
grid: {
|
||||
top: 5,
|
||||
right: 5,
|
||||
bottom: 5,
|
||||
left: 5,
|
||||
containLabel: true,
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: "pie",
|
||||
// 缩小圆环半径比例,使图表更紧凑
|
||||
radius: ["60%", "85%"],
|
||||
center: ["50%", "50%"], // 确保图表居中
|
||||
avoidLabelOverlap: false,
|
||||
itemStyle: {
|
||||
borderRadius: 8, // 略微减小圆角,适应小尺寸
|
||||
borderColor: "#fff",
|
||||
borderWidth: 1.5, // 减小边框宽度
|
||||
},
|
||||
label: {
|
||||
show: false,
|
||||
position: "center",
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: false,
|
||||
},
|
||||
},
|
||||
labelLine: {
|
||||
show: false,
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: chartData.value,
|
||||
name: chartData.title,
|
||||
itemStyle: { color: chartData.color },
|
||||
},
|
||||
{
|
||||
value: 100 - chartData.value,
|
||||
itemStyle: { color: "#f0f2f5" },
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
chartInstance.setOption(option);
|
||||
|
||||
// 响应窗口大小变化
|
||||
const handleResize = () => {
|
||||
chartInstance.resize();
|
||||
};
|
||||
|
||||
window.addEventListener("resize", handleResize);
|
||||
|
||||
// 组件卸载时清理
|
||||
return () => {
|
||||
window.removeEventListener("resize", handleResize);
|
||||
chartInstance.dispose();
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
// 监听数据变化,重新渲染图表
|
||||
watchEffect(() => {
|
||||
initCharts();
|
||||
});
|
||||
|
||||
// 组件挂载时初始化图表
|
||||
onMounted(() => {
|
||||
initCharts();
|
||||
});
|
||||
</script>
|
||||
|
79
src/views/menjinliebiao.vue
Normal file
79
src/views/menjinliebiao.vue
Normal file
@ -0,0 +1,79 @@
|
||||
<template>
|
||||
<van-nav-bar title="门禁列表" left-arrow @click-left="back" placeholder />
|
||||
<div class="door-access-list">
|
||||
<!-- 遍历门禁数据进行渲染 -->
|
||||
<div
|
||||
v-for="(item, index) in doorAccessData"
|
||||
:key="index"
|
||||
class="door-access-item"
|
||||
>
|
||||
<div class="info">
|
||||
<p>门禁名称:{{ item.name }}</p>
|
||||
<p>所在机房:{{ item.room }}</p>
|
||||
<p>所在楼层:{{ item.floor }}</p>
|
||||
</div>
|
||||
<button class="open-btn" @click="handleOpen(item)">开门</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
const router = useRouter();
|
||||
const back = () => {
|
||||
router.back();
|
||||
};
|
||||
const doorAccessData = [
|
||||
{ name: "A01", room: "0", floor: "二楼机房1号空调" },
|
||||
{ name: "A02", room: "0", floor: "二楼机房2号空调" },
|
||||
{ name: "A03", room: "0", floor: "二楼机房3号空调" },
|
||||
{ name: "A04", room: "0", floor: "二楼机房4号空调" },
|
||||
{ name: "A05", room: "0", floor: "二楼机房5号空调" },
|
||||
{ name: "A06", room: "0", floor: "二楼机房6号空调" },
|
||||
];
|
||||
const handleOpen = (item) => {
|
||||
console.log(`尝试打开门禁 ${item.name}`);
|
||||
router.push({ name: "mjlbopen", params: { name: item.name } });
|
||||
|
||||
// 示例:若有接口,可使用 axios 等发起请求
|
||||
// axios.post('/api/openDoor', { doorName: item.name }).then(res => {
|
||||
// console.log('开门请求结果:', res);
|
||||
// }).catch(err => {
|
||||
// console.error('开门失败:', err);
|
||||
// });
|
||||
};
|
||||
</script>
|
||||
<style scoped>
|
||||
.door-access-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.door-access-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
padding: 12px;
|
||||
border: 1px solid #eee;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.info p {
|
||||
margin: 0 0 4px 0;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.open-btn {
|
||||
background-color: #409eff;
|
||||
color: #fff;
|
||||
border: none;
|
||||
padding: 8px 16px;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.open-btn:hover {
|
||||
background-color: #66b1ff;
|
||||
}
|
||||
</style>
|
415
src/views/mjlbopen.vue
Normal file
415
src/views/mjlbopen.vue
Normal file
@ -0,0 +1,415 @@
|
||||
<template>
|
||||
<van-nav-bar title="门禁列表" left-arrow @click-left="back" placeholder />
|
||||
|
||||
<div class="door-access-detail">
|
||||
<!-- 门禁基本信息 -->
|
||||
<div class="basic-info-container">
|
||||
<div>
|
||||
<p>门禁名称:{{ doorName }}</p>
|
||||
<p>所在机房:0</p>
|
||||
<p>所在楼层:二楼机房{{ doorName.slice(-1) }}号空调</p>
|
||||
<p>
|
||||
授权人:
|
||||
<span v-if="selectedAuthors.length > 0">
|
||||
{{ selectedAuthors.join(",") }}
|
||||
</span>
|
||||
<span v-else class="placeholder-text">未设置</span>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<button class="open-btn" @click="handleOpen">开门</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="authorized-persons">
|
||||
<div class="authorize-dots">
|
||||
<div
|
||||
v-for="(person, index) in displayedAuthors"
|
||||
:key="index"
|
||||
style="display: flex; flex-direction: column; position: relative"
|
||||
>
|
||||
<span class="dot"> </span>
|
||||
<span class="person-name">{{ person }}</span>
|
||||
</div>
|
||||
<!-- 显示剩余数量 -->
|
||||
<div v-if="selectedAuthors.length > 6" class="remaining-count">
|
||||
+{{ selectedAuthors.length - 6 }}
|
||||
</div>
|
||||
<!-- + 按钮,点击打开弹窗 -->
|
||||
<span class="add-btn" @click="showPopup = true">+</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 开关门记录 -->
|
||||
<div class="record-section">
|
||||
<p class="record-title">开关门记录:</p>
|
||||
<table class="record-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>门禁</th>
|
||||
<th>时间</th>
|
||||
<th>状态</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(record, index) in doorRecords" :key="index">
|
||||
<td>{{ doorName }}</td>
|
||||
<td>{{ record.time }}</td>
|
||||
<td
|
||||
:class="record.status === '开门' ? 'status-open' : 'status-close'"
|
||||
>
|
||||
{{ record.status }}
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- 授权人选择弹窗(从中间弹出) -->
|
||||
<van-popup
|
||||
v-model:show="showPopup"
|
||||
position="center"
|
||||
round
|
||||
:style="{ width: '85%', maxWidth: '400px' }"
|
||||
>
|
||||
<div class="myPoput">
|
||||
<div class="popup-content">
|
||||
<div class="popup-title">选择授权人</div>
|
||||
|
||||
<div class="checkbox-container">
|
||||
<van-checkbox-group v-model="selectedAuthors">
|
||||
<van-checkbox
|
||||
v-for="(author, index) in authorList"
|
||||
:key="index"
|
||||
:name="author"
|
||||
class="author-item"
|
||||
>
|
||||
{{ author }}
|
||||
</van-checkbox>
|
||||
</van-checkbox-group>
|
||||
</div>
|
||||
|
||||
<div class="popup-actions">
|
||||
<van-button
|
||||
type="info"
|
||||
plain
|
||||
@click="showPopup = false"
|
||||
class="cancel-btn"
|
||||
>
|
||||
取消
|
||||
</van-button>
|
||||
<van-button
|
||||
type="primary"
|
||||
@click="confirmSelection"
|
||||
class="confirm-btn"
|
||||
>
|
||||
确认
|
||||
</van-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</van-popup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, computed } from "vue";
|
||||
import { showToast, showSuccessToast, showFailToast } from "vant";
|
||||
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
|
||||
// 返回上一页
|
||||
const back = () => {
|
||||
router.back();
|
||||
};
|
||||
|
||||
// 接收路由传递的门禁名称
|
||||
const doorName = route.params.name as string;
|
||||
|
||||
// 开关门记录数据
|
||||
const doorRecords = [
|
||||
{ name: "A01", time: "2023-10-07 20:50", status: "关门" },
|
||||
{ name: "A01", time: "2023-10-07 19:30", status: "开门" },
|
||||
{ name: "A01", time: "2023-10-06 17:10", status: "关门" },
|
||||
{ name: "A01", time: "2023-10-06 12:06", status: "开门" },
|
||||
{ name: "A01", time: "2023-10-05 11:20", status: "关门" },
|
||||
{ name: "A01", time: "2023-10-05 10:20", status: "开门" },
|
||||
];
|
||||
|
||||
// 授权人列表数据
|
||||
const authorList = ref([
|
||||
"张三",
|
||||
"李四",
|
||||
"王五",
|
||||
"小明",
|
||||
"韩信",
|
||||
"赵云",
|
||||
"李白",
|
||||
"小红",
|
||||
"孙尚香",
|
||||
"诸葛亮",
|
||||
"大乔",
|
||||
"小乔",
|
||||
"周瑜",
|
||||
"吕布",
|
||||
"貂蝉",
|
||||
]);
|
||||
|
||||
// 选中的授权人
|
||||
const selectedAuthors = ref<string[]>([]);
|
||||
|
||||
// 弹窗显示控制
|
||||
const showPopup = ref(false);
|
||||
|
||||
// 计算显示的授权人(最多显示6个)
|
||||
const displayedAuthors = computed(() => {
|
||||
return selectedAuthors.value.slice(0, 6);
|
||||
});
|
||||
|
||||
// 从localStorage加载授权人数据
|
||||
const loadAuthorizations = () => {
|
||||
try {
|
||||
const storedData = localStorage.getItem("doorAuthorizations");
|
||||
if (storedData) {
|
||||
const doorAuthorizations = JSON.parse(storedData);
|
||||
// 加载当前门的授权人
|
||||
if (doorAuthorizations[doorName]) {
|
||||
selectedAuthors.value = doorAuthorizations[doorName];
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("加载授权人数据失败:", error);
|
||||
showFailToast("加载授权信息失败");
|
||||
}
|
||||
};
|
||||
|
||||
// 保存授权人数据到localStorage
|
||||
const saveAuthorizations = () => {
|
||||
try {
|
||||
let doorAuthorizations = {};
|
||||
const storedData = localStorage.getItem("doorAuthorizations");
|
||||
|
||||
if (storedData) {
|
||||
doorAuthorizations = JSON.parse(storedData);
|
||||
}
|
||||
|
||||
// 保存当前门的授权人
|
||||
doorAuthorizations[doorName] = selectedAuthors.value;
|
||||
localStorage.setItem(
|
||||
"doorAuthorizations",
|
||||
JSON.stringify(doorAuthorizations)
|
||||
);
|
||||
|
||||
showSuccessToast("授权信息已保存");
|
||||
} catch (error) {
|
||||
console.error("保存授权人数据失败:", error);
|
||||
showFailToast("保存授权信息失败");
|
||||
}
|
||||
};
|
||||
|
||||
// 页面加载时加载数据
|
||||
onMounted(() => {
|
||||
loadAuthorizations();
|
||||
});
|
||||
|
||||
// 处理开门逻辑
|
||||
const handleOpen = () => {
|
||||
console.log(`尝试打开 ${doorName} 门禁`);
|
||||
showToast(`正在尝试打开 ${doorName} 门禁`);
|
||||
// 实际项目中可对接接口
|
||||
};
|
||||
|
||||
// 确认选择授权人
|
||||
const confirmSelection = () => {
|
||||
console.log("选中的授权人:", selectedAuthors.value);
|
||||
saveAuthorizations(); // 保存到本地存储
|
||||
showPopup.value = false; // 关闭弹窗
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
/* 样式保持不变 */
|
||||
.door-access-detail {
|
||||
padding: 16px;
|
||||
background-color: #fff;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.basic-info-container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
margin-bottom: 24px;
|
||||
padding-bottom: 16px;
|
||||
border-bottom: 1px solid #f5f5f5;
|
||||
}
|
||||
|
||||
.basic-info-container p {
|
||||
margin: 8px 0;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.placeholder-text {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.authorized-persons {
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.authorize-dots {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.dot {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-color: #409eff;
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.person-name {
|
||||
position: absolute;
|
||||
bottom: -20px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.remaining-count {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-color: #e6f7ff;
|
||||
color: #1890ff;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.add-btn {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-color: #f5f5f5;
|
||||
color: #666;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 24px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.add-btn:hover {
|
||||
background-color: #e8e8e8;
|
||||
}
|
||||
|
||||
.open-btn {
|
||||
background-color: #409eff;
|
||||
color: #fff;
|
||||
border: none;
|
||||
padding: 8px 16px;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
margin: 16px 0;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.open-btn:hover {
|
||||
background-color: #1890ff;
|
||||
}
|
||||
|
||||
.record-section {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.record-title {
|
||||
font-weight: bold;
|
||||
margin-bottom: 12px;
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.record-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
background-color: #fff;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
.record-table th,
|
||||
.record-table td {
|
||||
border-bottom: 1px solid #f5f5f5;
|
||||
padding: 12px 8px;
|
||||
text-align: left;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.record-table th {
|
||||
background-color: #fafafa;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.status-open {
|
||||
color: #52c41a;
|
||||
}
|
||||
|
||||
.status-close {
|
||||
color: #f5222d;
|
||||
}
|
||||
|
||||
/* 弹窗样式 */
|
||||
.myPoput {
|
||||
.popup-content {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.popup-title {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 16px;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.checkbox-container {
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
margin-bottom: 24px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
|
||||
.author-item {
|
||||
display: block;
|
||||
margin-bottom: 12px;
|
||||
padding: 8px;
|
||||
border-radius: 4px;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.author-item:hover {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.popup-actions {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.cancel-btn,
|
||||
.confirm-btn {
|
||||
flex: 1;
|
||||
}
|
||||
</style>
|
Reference in New Issue
Block a user