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']
 | 
					    RouterLink: typeof import('vue-router')['RouterLink']
 | 
				
			||||||
    RouterView: typeof import('vue-router')['RouterView']
 | 
					    RouterView: typeof import('vue-router')['RouterView']
 | 
				
			||||||
    VanButton: typeof import('vant/es')['Button']
 | 
					    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']
 | 
					    VanNavBar: typeof import('vant/es')['NavBar']
 | 
				
			||||||
 | 
					    VanPopup: typeof import('vant/es')['Popup']
 | 
				
			||||||
 | 
					    VanTab: typeof import('vant/es')['Tab']
 | 
				
			||||||
    VanTabbar: typeof import('vant/es')['Tabbar']
 | 
					    VanTabbar: typeof import('vant/es')['Tabbar']
 | 
				
			||||||
    VanTabbarItem: typeof import('vant/es')['TabbarItem']
 | 
					    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",
 | 
					        "@vitejs/plugin-vue": "^6.0.1",
 | 
				
			||||||
        "@vue/tsconfig": "^0.7.0",
 | 
					        "@vue/tsconfig": "^0.7.0",
 | 
				
			||||||
        "npm-run-all2": "^8.0.4",
 | 
					        "npm-run-all2": "^8.0.4",
 | 
				
			||||||
 | 
					        "sass-embedded": "^1.91.0",
 | 
				
			||||||
        "typescript": "~5.8.0",
 | 
					        "typescript": "~5.8.0",
 | 
				
			||||||
        "unplugin-auto-import": "^20.1.0",
 | 
					        "unplugin-auto-import": "^20.1.0",
 | 
				
			||||||
        "unplugin-vue-components": "^29.0.0",
 | 
					        "unplugin-vue-components": "^29.0.0",
 | 
				
			||||||
@ -469,6 +470,13 @@
 | 
				
			|||||||
        "node": ">=6.9.0"
 | 
					        "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": {
 | 
					    "node_modules/@esbuild/aix-ppc64": {
 | 
				
			||||||
      "version": "0.25.9",
 | 
					      "version": "0.25.9",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
 | 
				
			||||||
@ -930,6 +938,316 @@
 | 
				
			|||||||
        "@jridgewell/sourcemap-codec": "^1.4.14"
 | 
					        "@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": {
 | 
					    "node_modules/@polka/url": {
 | 
				
			||||||
      "version": "1.0.0-next.29",
 | 
					      "version": "1.0.0-next.29",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz",
 | 
					      "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": "^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": {
 | 
					    "node_modules/bundle-name": {
 | 
				
			||||||
      "version": "4.1.0",
 | 
					      "version": "4.1.0",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz",
 | 
				
			||||||
@ -1773,6 +2098,13 @@
 | 
				
			|||||||
        "fsevents": "~2.3.2"
 | 
					        "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": {
 | 
					    "node_modules/confbox": {
 | 
				
			||||||
      "version": "0.2.2",
 | 
					      "version": "0.2.2",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz",
 | 
				
			||||||
@ -1903,6 +2235,20 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/sindresorhus"
 | 
					        "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": {
 | 
					    "node_modules/echarts": {
 | 
				
			||||||
      "version": "6.0.0",
 | 
					      "version": "6.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz",
 | 
				
			||||||
@ -2137,6 +2483,16 @@
 | 
				
			|||||||
        "node": ">= 6"
 | 
					        "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": {
 | 
					    "node_modules/he": {
 | 
				
			||||||
      "version": "1.2.0",
 | 
					      "version": "1.2.0",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
 | 
				
			||||||
@ -2160,6 +2516,13 @@
 | 
				
			|||||||
        "node": ">=18.18.0"
 | 
					        "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": {
 | 
					    "node_modules/is-binary-path": {
 | 
				
			||||||
      "version": "2.1.0",
 | 
					      "version": "2.1.0",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
 | 
				
			||||||
@ -2399,6 +2762,35 @@
 | 
				
			|||||||
        "node": ">= 0.10.0"
 | 
					        "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": {
 | 
					    "node_modules/mitt": {
 | 
				
			||||||
      "version": "3.0.1",
 | 
					      "version": "3.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
 | 
					      "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": "^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": {
 | 
					    "node_modules/node-releases": {
 | 
				
			||||||
      "version": "2.0.19",
 | 
					      "version": "2.0.19",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
 | 
				
			||||||
@ -2830,6 +3230,419 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/sindresorhus"
 | 
					        "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": {
 | 
					    "node_modules/scule": {
 | 
				
			||||||
      "version": "1.3.0",
 | 
					      "version": "1.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
 | 
				
			||||||
@ -2964,6 +3777,45 @@
 | 
				
			|||||||
        "node": ">=16"
 | 
					        "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": {
 | 
					    "node_modules/tinyglobby": {
 | 
				
			||||||
      "version": "0.2.14",
 | 
					      "version": "0.2.14",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz",
 | 
				
			||||||
@ -3261,6 +4113,13 @@
 | 
				
			|||||||
        "vue": "^3.0.0"
 | 
					        "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": {
 | 
					    "node_modules/vite": {
 | 
				
			||||||
      "version": "7.1.3",
 | 
					      "version": "7.1.3",
 | 
				
			||||||
      "resolved": "https://registry.npmmirror.com/vite/-/vite-7.1.3.tgz",
 | 
					      "resolved": "https://registry.npmmirror.com/vite/-/vite-7.1.3.tgz",
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,7 @@
 | 
				
			|||||||
    "@vitejs/plugin-vue": "^6.0.1",
 | 
					    "@vitejs/plugin-vue": "^6.0.1",
 | 
				
			||||||
    "@vue/tsconfig": "^0.7.0",
 | 
					    "@vue/tsconfig": "^0.7.0",
 | 
				
			||||||
    "npm-run-all2": "^8.0.4",
 | 
					    "npm-run-all2": "^8.0.4",
 | 
				
			||||||
 | 
					    "sass-embedded": "^1.91.0",
 | 
				
			||||||
    "typescript": "~5.8.0",
 | 
					    "typescript": "~5.8.0",
 | 
				
			||||||
    "unplugin-auto-import": "^20.1.0",
 | 
					    "unplugin-auto-import": "^20.1.0",
 | 
				
			||||||
    "unplugin-vue-components": "^29.0.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 { createApp } from "vue";
 | 
				
			||||||
import { createPinia } from 'pinia'
 | 
					import { createPinia } from "pinia";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import App from './App.vue'
 | 
					import App from "./App.vue";
 | 
				
			||||||
import router from './router'
 | 
					import router from "./router";
 | 
				
			||||||
 | 
					import "vant/es/toast/style"; // 引入Toast样式
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const app = createApp(App)
 | 
					const app = createApp(App);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.use(createPinia())
 | 
					app.use(createPinia());
 | 
				
			||||||
app.use(router)
 | 
					app.use(router);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.mount('#app')
 | 
					app.mount("#app");
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,29 @@ const router = createRouter({
 | 
				
			|||||||
      path: "/demo",
 | 
					      path: "/demo",
 | 
				
			||||||
      component: () => import("@/views/demo.vue"),
 | 
					      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>
 | 
					<template>
 | 
				
			||||||
<script setup></script>
 | 
					  <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