From 5a7814a305ae2e210ec74b05864dbed5b88d405f Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期一, 13 一月 2025 12:59:36 +0800
Subject: [PATCH] init

---
 tsconfig.app.json             |    8 
 .gitignore                    |   24 
 package-lock.json             | 2833 ++++++++++++++++++++++++++
 public/vite.svg               |    1 
 .vscode/extensions.json       |    3 
 vite.config.ts                |   15 
 src/components/img/TQS88.png  |    0 
 src/views/deviceWindows.vue   |  913 ++++++++
 index.html                    |   13 
 src/vite-env.d.ts             |    1 
 src/components/deviceView.vue |  750 +++++++
 src/router/index.ts           |   34 
 src/utils/formatTime.ts       |  310 ++
 src/img/maibo.png             |    0 
 src/img/xueya.png             |    0 
 README.md                     |    5 
 src/assets/vue.svg            |    1 
 src/main.ts                   |    8 
 src/img/TQS88.png             |    0 
 tsconfig.node.json            |    7 
 tsconfig.json                 |   16 
 src/style.css                 |   41 
 package.json                  |   26 
 src/views/Home.vue            | 1293 ++++++++++++
 src/App.vue                   |   12 
 25 files changed, 6,312 insertions(+), 2 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..a7cea0b
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+  "recommendations": ["Vue.volar"]
+}
diff --git a/README.md b/README.md
index 9129cf1..33895ab 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
-## Single_application
+# Vue 3 + TypeScript + Vite
 
-单应用项目,可以创建很多独立工具类页面 ,不用登录 初始化的页面
+This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
 
+Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..07bd4ff
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>胜透床旁监测</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..86aeeb4
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2833 @@
+{
+  "name": "my-project",
+  "version": "0.0.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "my-project",
+      "version": "0.0.0",
+      "dependencies": {
+        "echarts": "^5.6.0",
+        "element-plus": "^2.9.2",
+        "vue": "^3.5.13",
+        "vue-router": "^4.0.13"
+      },
+      "devDependencies": {
+        "@vitejs/plugin-vue": "^5.2.1",
+        "@vue/compiler-sfc": "^3.5.13",
+        "@vue/tsconfig": "^0.7.0",
+        "less": "^4.2.1",
+        "typescript": "~5.6.2",
+        "vite": "^6.0.5",
+        "vue-tsc": "^2.2.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.26.3",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.3.tgz",
+      "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
+      "dependencies": {
+        "@babel/types": "^7.26.3"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.26.3",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.3.tgz",
+      "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@ctrl/tinycolor": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@element-plus/icons-vue": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
+      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
+      "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
+      "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
+      "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
+      "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
+      "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
+      "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
+      "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
+      "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
+      "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
+      "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
+      "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
+      "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
+      "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
+      "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
+      "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
+      "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
+      "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
+      "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
+      "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
+      "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
+      "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
+      "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
+      "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
+      "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
+      "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@floating-ui/core": {
+      "version": "1.6.9",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.9.tgz",
+      "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.6.13",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.13.tgz",
+      "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/core": "^1.6.0",
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.9.tgz",
+      "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+    },
+    "node_modules/@popperjs/core": {
+      "name": "@sxzz/popperjs-es",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz",
+      "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz",
+      "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz",
+      "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz",
+      "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz",
+      "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz",
+      "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz",
+      "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz",
+      "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz",
+      "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz",
+      "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz",
+      "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz",
+      "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz",
+      "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz",
+      "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz",
+      "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz",
+      "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz",
+      "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz",
+      "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz",
+      "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "dev": true
+    },
+    "node_modules/@types/lodash": {
+      "version": "4.17.14",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.14.tgz",
+      "integrity": "sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==",
+      "license": "MIT"
+    },
+    "node_modules/@types/lodash-es": {
+      "version": "4.17.12",
+      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/lodash": "*"
+      }
+    },
+    "node_modules/@types/web-bluetooth": {
+      "version": "0.0.16",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
+      "license": "MIT"
+    },
+    "node_modules/@vitejs/plugin-vue": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
+      "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
+      "dev": true,
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^5.0.0 || ^6.0.0",
+        "vue": "^3.2.25"
+      }
+    },
+    "node_modules/@volar/language-core": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.11.tgz",
+      "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==",
+      "dev": true,
+      "dependencies": {
+        "@volar/source-map": "2.4.11"
+      }
+    },
+    "node_modules/@volar/source-map": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.11.tgz",
+      "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==",
+      "dev": true
+    },
+    "node_modules/@volar/typescript": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.11.tgz",
+      "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==",
+      "dev": true,
+      "dependencies": {
+        "@volar/language-core": "2.4.11",
+        "path-browserify": "^1.0.1",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+      "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/shared": "3.5.13",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+      "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+      "dependencies": {
+        "@vue/compiler-core": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+      "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/compiler-core": "3.5.13",
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.11",
+        "postcss": "^8.4.48",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+      "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/compiler-vue2": {
+      "version": "2.7.16",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
+      "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
+      "dev": true,
+      "dependencies": {
+        "de-indent": "^1.0.2",
+        "he": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "license": "MIT"
+    },
+    "node_modules/@vue/language-core": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.0.tgz",
+      "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==",
+      "dev": true,
+      "dependencies": {
+        "@volar/language-core": "~2.4.11",
+        "@vue/compiler-dom": "^3.5.0",
+        "@vue/compiler-vue2": "^2.7.16",
+        "@vue/shared": "^3.5.0",
+        "alien-signals": "^0.4.9",
+        "minimatch": "^9.0.3",
+        "muggle-string": "^0.4.1",
+        "path-browserify": "^1.0.1"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
+      "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+      "dependencies": {
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+      "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+      "dependencies": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+      "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+      "dependencies": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/runtime-core": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "csstype": "^3.1.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+      "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13"
+      },
+      "peerDependencies": {
+        "vue": "3.5.13"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
+      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+    },
+    "node_modules/@vue/tsconfig": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz",
+      "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==",
+      "dev": true,
+      "peerDependencies": {
+        "typescript": "5.x",
+        "vue": "^3.4.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        },
+        "vue": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/core": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/metadata": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "license": "MIT",
+      "dependencies": {
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/alien-signals": {
+      "version": "0.4.14",
+      "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-0.4.14.tgz",
+      "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==",
+      "dev": true
+    },
+    "node_modules/async-validator": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+      "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
+      "license": "MIT"
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/copy-anything": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz",
+      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-what": "^3.14.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.13",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+      "license": "MIT"
+    },
+    "node_modules/de-indent": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
+      "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+      "dev": true
+    },
+    "node_modules/echarts": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz",
+      "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "2.3.0",
+        "zrender": "5.6.1"
+      }
+    },
+    "node_modules/element-plus": {
+      "version": "2.9.2",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.2.tgz",
+      "integrity": "sha512-HS+Cc5mmy70DixJuoN3cMxPPoNWXkjHzUw2PcGmysk6NHQzzUtwi2Vc+dlmbmRxj3eNqgC1xpPQV5Nf9uDtQRg==",
+      "license": "MIT",
+      "dependencies": {
+        "@ctrl/tinycolor": "^3.4.1",
+        "@element-plus/icons-vue": "^2.3.1",
+        "@floating-ui/dom": "^1.0.1",
+        "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+        "@types/lodash": "^4.14.182",
+        "@types/lodash-es": "^4.17.6",
+        "@vueuse/core": "^9.1.0",
+        "async-validator": "^4.2.5",
+        "dayjs": "^1.11.13",
+        "escape-html": "^1.0.3",
+        "lodash": "^4.17.21",
+        "lodash-es": "^4.17.21",
+        "lodash-unified": "^1.0.2",
+        "memoize-one": "^6.0.0",
+        "normalize-wheel-es": "^1.2.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "prr": "~1.0.1"
+      },
+      "bin": {
+        "errno": "cli.js"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.2.tgz",
+      "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
+      "dev": true,
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.24.2",
+        "@esbuild/android-arm": "0.24.2",
+        "@esbuild/android-arm64": "0.24.2",
+        "@esbuild/android-x64": "0.24.2",
+        "@esbuild/darwin-arm64": "0.24.2",
+        "@esbuild/darwin-x64": "0.24.2",
+        "@esbuild/freebsd-arm64": "0.24.2",
+        "@esbuild/freebsd-x64": "0.24.2",
+        "@esbuild/linux-arm": "0.24.2",
+        "@esbuild/linux-arm64": "0.24.2",
+        "@esbuild/linux-ia32": "0.24.2",
+        "@esbuild/linux-loong64": "0.24.2",
+        "@esbuild/linux-mips64el": "0.24.2",
+        "@esbuild/linux-ppc64": "0.24.2",
+        "@esbuild/linux-riscv64": "0.24.2",
+        "@esbuild/linux-s390x": "0.24.2",
+        "@esbuild/linux-x64": "0.24.2",
+        "@esbuild/netbsd-arm64": "0.24.2",
+        "@esbuild/netbsd-x64": "0.24.2",
+        "@esbuild/openbsd-arm64": "0.24.2",
+        "@esbuild/openbsd-x64": "0.24.2",
+        "@esbuild/sunos-x64": "0.24.2",
+        "@esbuild/win32-arm64": "0.24.2",
+        "@esbuild/win32-ia32": "0.24.2",
+        "@esbuild/win32-x64": "0.24.2"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "license": "MIT"
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true,
+      "license": "ISC",
+      "optional": true
+    },
+    "node_modules/he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true,
+      "bin": {
+        "he": "bin/he"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "bin": {
+        "image-size": "bin/image-size.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-what": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
+      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/less": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/less/-/less-4.2.1.tgz",
+      "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "copy-anything": "^2.0.1",
+        "parse-node-version": "^1.0.1",
+        "tslib": "^2.3.0"
+      },
+      "bin": {
+        "lessc": "bin/lessc"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "optionalDependencies": {
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "needle": "^3.1.0",
+        "source-map": "~0.6.0"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "license": "MIT"
+    },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+      "license": "MIT"
+    },
+    "node_modules/lodash-unified": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/lodash-es": "*",
+        "lodash": "*",
+        "lodash-es": "*"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.17",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz",
+      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "node_modules/make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
+      "license": "MIT"
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/muggle-string": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz",
+      "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+      "dev": true
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.8",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz",
+      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/needle": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz",
+      "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "iconv-lite": "^0.6.3",
+        "sax": "^1.2.4"
+      },
+      "bin": {
+        "needle": "bin/needle"
+      },
+      "engines": {
+        "node": ">= 4.4.x"
+      }
+    },
+    "node_modules/normalize-wheel-es": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+    },
+    "node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.49",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz",
+      "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/rollup": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.30.1.tgz",
+      "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "1.0.6"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.30.1",
+        "@rollup/rollup-android-arm64": "4.30.1",
+        "@rollup/rollup-darwin-arm64": "4.30.1",
+        "@rollup/rollup-darwin-x64": "4.30.1",
+        "@rollup/rollup-freebsd-arm64": "4.30.1",
+        "@rollup/rollup-freebsd-x64": "4.30.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.30.1",
+        "@rollup/rollup-linux-arm-musleabihf": "4.30.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.30.1",
+        "@rollup/rollup-linux-arm64-musl": "4.30.1",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.30.1",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.30.1",
+        "@rollup/rollup-linux-s390x-gnu": "4.30.1",
+        "@rollup/rollup-linux-x64-gnu": "4.30.1",
+        "@rollup/rollup-linux-x64-musl": "4.30.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.30.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.30.1",
+        "@rollup/rollup-win32-x64-msvc": "4.30.1",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/sax": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
+      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+      "dev": true,
+      "license": "ISC",
+      "optional": true
+    },
+    "node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "dev": true,
+      "license": "ISC",
+      "optional": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "optional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+      "license": "0BSD"
+    },
+    "node_modules/typescript": {
+      "version": "5.6.3",
+      "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.6.3.tgz",
+      "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+      "devOptional": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/vite": {
+      "version": "6.0.7",
+      "resolved": "https://registry.npmmirror.com/vite/-/vite-6.0.7.tgz",
+      "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==",
+      "dev": true,
+      "dependencies": {
+        "esbuild": "^0.24.2",
+        "postcss": "^8.4.49",
+        "rollup": "^4.23.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+        "jiti": ">=1.21.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.16.0",
+        "tsx": "^4.8.1",
+        "yaml": "^2.4.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vscode-uri": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.8.tgz",
+      "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
+      "dev": true
+    },
+    "node_modules/vue": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
+      "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-sfc": "3.5.13",
+        "@vue/runtime-dom": "3.5.13",
+        "@vue/server-renderer": "3.5.13",
+        "@vue/shared": "3.5.13"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.0.13",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.0.13.tgz",
+      "integrity": "sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^6.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/vue-tsc": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.0.tgz",
+      "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==",
+      "dev": true,
+      "dependencies": {
+        "@volar/typescript": "~2.4.11",
+        "@vue/language-core": "2.2.0"
+      },
+      "bin": {
+        "vue-tsc": "bin/vue-tsc.js"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.0"
+      }
+    },
+    "node_modules/zrender": {
+      "version": "5.6.1",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz",
+      "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "tslib": "2.3.0"
+      }
+    }
+  },
+  "dependencies": {
+    "@babel/helper-string-parser": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
+    },
+    "@babel/parser": {
+      "version": "7.26.3",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.3.tgz",
+      "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
+      "requires": {
+        "@babel/types": "^7.26.3"
+      }
+    },
+    "@babel/types": {
+      "version": "7.26.3",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.3.tgz",
+      "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+      "requires": {
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
+      }
+    },
+    "@ctrl/tinycolor": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA=="
+    },
+    "@element-plus/icons-vue": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
+      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "requires": {}
+    },
+    "@esbuild/aix-ppc64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
+      "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
+      "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
+      "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
+      "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
+      "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
+      "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
+      "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
+      "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
+      "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
+      "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ia32": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
+      "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-loong64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
+      "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-mips64el": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
+      "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ppc64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
+      "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-riscv64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
+      "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-s390x": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
+      "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
+      "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/netbsd-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
+      "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/netbsd-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
+      "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
+      "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
+      "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/sunos-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
+      "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-arm64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
+      "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-ia32": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
+      "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-x64": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
+      "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
+      "dev": true,
+      "optional": true
+    },
+    "@floating-ui/core": {
+      "version": "1.6.9",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.9.tgz",
+      "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
+      "requires": {
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "@floating-ui/dom": {
+      "version": "1.6.13",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.13.tgz",
+      "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
+      "requires": {
+        "@floating-ui/core": "^1.6.0",
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "@floating-ui/utils": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.9.tgz",
+      "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+    },
+    "@popperjs/core": {
+      "version": "npm:@sxzz/popperjs-es@2.11.7",
+      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
+    },
+    "@rollup/rollup-android-arm-eabi": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz",
+      "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-android-arm64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz",
+      "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-darwin-arm64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz",
+      "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-darwin-x64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz",
+      "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-freebsd-arm64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz",
+      "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-freebsd-x64": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz",
+      "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz",
+      "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz",
+      "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz",
+      "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm64-musl": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz",
+      "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-loongarch64-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz",
+      "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz",
+      "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz",
+      "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz",
+      "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-x64-gnu": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz",
+      "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-x64-musl": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz",
+      "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz",
+      "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz",
+      "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-win32-x64-msvc": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz",
+      "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==",
+      "dev": true,
+      "optional": true
+    },
+    "@types/estree": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "dev": true
+    },
+    "@types/lodash": {
+      "version": "4.17.14",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.14.tgz",
+      "integrity": "sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A=="
+    },
+    "@types/lodash-es": {
+      "version": "4.17.12",
+      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+      "requires": {
+        "@types/lodash": "*"
+      }
+    },
+    "@types/web-bluetooth": {
+      "version": "0.0.16",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
+    },
+    "@vitejs/plugin-vue": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
+      "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
+      "dev": true,
+      "requires": {}
+    },
+    "@volar/language-core": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.11.tgz",
+      "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==",
+      "dev": true,
+      "requires": {
+        "@volar/source-map": "2.4.11"
+      }
+    },
+    "@volar/source-map": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.11.tgz",
+      "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==",
+      "dev": true
+    },
+    "@volar/typescript": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.11.tgz",
+      "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==",
+      "dev": true,
+      "requires": {
+        "@volar/language-core": "2.4.11",
+        "path-browserify": "^1.0.1",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "@vue/compiler-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+      "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+      "requires": {
+        "@babel/parser": "^7.25.3",
+        "@vue/shared": "3.5.13",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "@vue/compiler-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+      "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+      "requires": {
+        "@vue/compiler-core": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "@vue/compiler-sfc": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+      "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+      "requires": {
+        "@babel/parser": "^7.25.3",
+        "@vue/compiler-core": "3.5.13",
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.11",
+        "postcss": "^8.4.48",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "@vue/compiler-ssr": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+      "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+      "requires": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "@vue/compiler-vue2": {
+      "version": "2.7.16",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
+      "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
+      "dev": true,
+      "requires": {
+        "de-indent": "^1.0.2",
+        "he": "^1.2.0"
+      }
+    },
+    "@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+    },
+    "@vue/language-core": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.0.tgz",
+      "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==",
+      "dev": true,
+      "requires": {
+        "@volar/language-core": "~2.4.11",
+        "@vue/compiler-dom": "^3.5.0",
+        "@vue/compiler-vue2": "^2.7.16",
+        "@vue/shared": "^3.5.0",
+        "alien-signals": "^0.4.9",
+        "minimatch": "^9.0.3",
+        "muggle-string": "^0.4.1",
+        "path-browserify": "^1.0.1"
+      }
+    },
+    "@vue/reactivity": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
+      "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+      "requires": {
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "@vue/runtime-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+      "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+      "requires": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "@vue/runtime-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+      "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+      "requires": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/runtime-core": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "csstype": "^3.1.3"
+      }
+    },
+    "@vue/server-renderer": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+      "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+      "requires": {
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "@vue/shared": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
+      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+    },
+    "@vue/tsconfig": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz",
+      "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==",
+      "dev": true,
+      "requires": {}
+    },
+    "@vueuse/core": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+      "requires": {
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
+        "vue-demi": "*"
+      },
+      "dependencies": {
+        "vue-demi": {
+          "version": "0.14.10",
+          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+          "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+          "requires": {}
+        }
+      }
+    },
+    "@vueuse/metadata": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
+    },
+    "@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "requires": {
+        "vue-demi": "*"
+      },
+      "dependencies": {
+        "vue-demi": {
+          "version": "0.14.10",
+          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+          "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+          "requires": {}
+        }
+      }
+    },
+    "alien-signals": {
+      "version": "0.4.14",
+      "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-0.4.14.tgz",
+      "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==",
+      "dev": true
+    },
+    "async-validator": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+      "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
+    },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "copy-anything": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz",
+      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+      "dev": true,
+      "requires": {
+        "is-what": "^3.14.1"
+      }
+    },
+    "csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
+    "dayjs": {
+      "version": "1.11.13",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+    },
+    "de-indent": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
+      "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+      "dev": true
+    },
+    "echarts": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz",
+      "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
+      "requires": {
+        "tslib": "2.3.0",
+        "zrender": "5.6.1"
+      }
+    },
+    "element-plus": {
+      "version": "2.9.2",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.2.tgz",
+      "integrity": "sha512-HS+Cc5mmy70DixJuoN3cMxPPoNWXkjHzUw2PcGmysk6NHQzzUtwi2Vc+dlmbmRxj3eNqgC1xpPQV5Nf9uDtQRg==",
+      "requires": {
+        "@ctrl/tinycolor": "^3.4.1",
+        "@element-plus/icons-vue": "^2.3.1",
+        "@floating-ui/dom": "^1.0.1",
+        "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+        "@types/lodash": "^4.14.182",
+        "@types/lodash-es": "^4.17.6",
+        "@vueuse/core": "^9.1.0",
+        "async-validator": "^4.2.5",
+        "dayjs": "^1.11.13",
+        "escape-html": "^1.0.3",
+        "lodash": "^4.17.21",
+        "lodash-es": "^4.17.21",
+        "lodash-unified": "^1.0.2",
+        "memoize-one": "^6.0.0",
+        "normalize-wheel-es": "^1.2.0"
+      }
+    },
+    "entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+    },
+    "errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "esbuild": {
+      "version": "0.24.2",
+      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.2.tgz",
+      "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
+      "dev": true,
+      "requires": {
+        "@esbuild/aix-ppc64": "0.24.2",
+        "@esbuild/android-arm": "0.24.2",
+        "@esbuild/android-arm64": "0.24.2",
+        "@esbuild/android-x64": "0.24.2",
+        "@esbuild/darwin-arm64": "0.24.2",
+        "@esbuild/darwin-x64": "0.24.2",
+        "@esbuild/freebsd-arm64": "0.24.2",
+        "@esbuild/freebsd-x64": "0.24.2",
+        "@esbuild/linux-arm": "0.24.2",
+        "@esbuild/linux-arm64": "0.24.2",
+        "@esbuild/linux-ia32": "0.24.2",
+        "@esbuild/linux-loong64": "0.24.2",
+        "@esbuild/linux-mips64el": "0.24.2",
+        "@esbuild/linux-ppc64": "0.24.2",
+        "@esbuild/linux-riscv64": "0.24.2",
+        "@esbuild/linux-s390x": "0.24.2",
+        "@esbuild/linux-x64": "0.24.2",
+        "@esbuild/netbsd-arm64": "0.24.2",
+        "@esbuild/netbsd-x64": "0.24.2",
+        "@esbuild/openbsd-arm64": "0.24.2",
+        "@esbuild/openbsd-x64": "0.24.2",
+        "@esbuild/sunos-x64": "0.24.2",
+        "@esbuild/win32-arm64": "0.24.2",
+        "@esbuild/win32-ia32": "0.24.2",
+        "@esbuild/win32-x64": "0.24.2"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+    },
+    "estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "optional": true
+    },
+    "graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true,
+      "optional": true
+    },
+    "he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      }
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "dev": true,
+      "optional": true
+    },
+    "is-what": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
+      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+      "dev": true
+    },
+    "less": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/less/-/less-4.2.1.tgz",
+      "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==",
+      "dev": true,
+      "requires": {
+        "copy-anything": "^2.0.1",
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "needle": "^3.1.0",
+        "parse-node-version": "^1.0.1",
+        "source-map": "~0.6.0",
+        "tslib": "^2.3.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
+    "lodash-unified": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+      "requires": {}
+    },
+    "magic-string": {
+      "version": "0.30.17",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz",
+      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+      "requires": {
+        "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      }
+    },
+    "memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+    },
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "optional": true
+    },
+    "minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^2.0.1"
+      }
+    },
+    "muggle-string": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz",
+      "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+      "dev": true
+    },
+    "nanoid": {
+      "version": "3.3.8",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz",
+      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="
+    },
+    "needle": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz",
+      "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "iconv-lite": "^0.6.3",
+        "sax": "^1.2.4"
+      }
+    },
+    "normalize-wheel-es": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
+    },
+    "parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true
+    },
+    "picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+    },
+    "pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "dev": true,
+      "optional": true
+    },
+    "postcss": {
+      "version": "8.4.49",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz",
+      "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+      "requires": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "dev": true,
+      "optional": true
+    },
+    "rollup": {
+      "version": "4.30.1",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.30.1.tgz",
+      "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==",
+      "dev": true,
+      "requires": {
+        "@rollup/rollup-android-arm-eabi": "4.30.1",
+        "@rollup/rollup-android-arm64": "4.30.1",
+        "@rollup/rollup-darwin-arm64": "4.30.1",
+        "@rollup/rollup-darwin-x64": "4.30.1",
+        "@rollup/rollup-freebsd-arm64": "4.30.1",
+        "@rollup/rollup-freebsd-x64": "4.30.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.30.1",
+        "@rollup/rollup-linux-arm-musleabihf": "4.30.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.30.1",
+        "@rollup/rollup-linux-arm64-musl": "4.30.1",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.30.1",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.30.1",
+        "@rollup/rollup-linux-s390x-gnu": "4.30.1",
+        "@rollup/rollup-linux-x64-gnu": "4.30.1",
+        "@rollup/rollup-linux-x64-musl": "4.30.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.30.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.30.1",
+        "@rollup/rollup-win32-x64-msvc": "4.30.1",
+        "@types/estree": "1.0.6",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true,
+      "optional": true
+    },
+    "sax": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
+      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+      "dev": true,
+      "optional": true
+    },
+    "semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "dev": true,
+      "optional": true
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true,
+      "optional": true
+    },
+    "source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
+    },
+    "tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+    },
+    "typescript": {
+      "version": "5.6.3",
+      "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.6.3.tgz",
+      "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+      "devOptional": true
+    },
+    "vite": {
+      "version": "6.0.7",
+      "resolved": "https://registry.npmmirror.com/vite/-/vite-6.0.7.tgz",
+      "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==",
+      "dev": true,
+      "requires": {
+        "esbuild": "^0.24.2",
+        "fsevents": "~2.3.3",
+        "postcss": "^8.4.49",
+        "rollup": "^4.23.0"
+      }
+    },
+    "vscode-uri": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.8.tgz",
+      "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
+      "dev": true
+    },
+    "vue": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
+      "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+      "requires": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-sfc": "3.5.13",
+        "@vue/runtime-dom": "3.5.13",
+        "@vue/server-renderer": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "vue-router": {
+      "version": "4.0.13",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.0.13.tgz",
+      "integrity": "sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==",
+      "requires": {
+        "@vue/devtools-api": "^6.0.0"
+      }
+    },
+    "vue-tsc": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.0.tgz",
+      "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==",
+      "dev": true,
+      "requires": {
+        "@volar/typescript": "~2.4.11",
+        "@vue/language-core": "2.2.0"
+      }
+    },
+    "zrender": {
+      "version": "5.6.1",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz",
+      "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
+      "requires": {
+        "tslib": "2.3.0"
+      }
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..a957493
--- /dev/null
+++ b/package.json
@@ -0,0 +1,26 @@
+{
+  "name": "my-project",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vue-tsc -b && vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "echarts": "^5.6.0",
+    "element-plus": "^2.9.2",
+    "vue": "^3.5.13",
+    "vue-router": "^4.0.13"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^5.2.1",
+    "@vue/compiler-sfc": "^3.5.13",
+    "@vue/tsconfig": "^0.7.0",
+    "less": "^4.2.1",
+    "typescript": "~5.6.2",
+    "vite": "^6.0.5",
+    "vue-tsc": "^2.2.0"
+  }
+}
diff --git a/public/vite.svg b/public/vite.svg
new file mode 100644
index 0000000..fcf269d
--- /dev/null
+++ b/public/vite.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 165.75 145.05"><defs><style>.cls-1,.cls-4{fill:#094;}.cls-1,.cls-2,.cls-3{isolation:isolate;opacity:0.5;}.cls-2{fill:#abcd03;}.cls-3{fill:#9fd9f6;}.cls-5{fill:#333;}</style></defs><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><g id="content"><path class="cls-1" d="M0,50.94v58.84c17.4,8.29,111.05-77.9,165.75-69.62V78.29C111.05,86.57,17.4,42.65,0,50.94"/><path class="cls-2" d="M0,.38V144.59c49.73,8.28,92.82-97,165.75-88.68v56.36C92.82,120.55,49.73-7.9,0,.38"/><path class="cls-3" d="M0,44.31V71.66C45.58,79.94,107.74-2.93,165.75,5.36V117.24C107.74,125.53,45.58,36,0,44.31"/><g id="name_and_slogan_id" data-name="name and slogan id"><path id="namepathdata" class="cls-4" d="M73.94,61.48v8.88h7.5v6.12H57V70.36H67.19V61.48H57.87V55.17h9.32V46.29H63.75c-.13,2-.71,3.42-1.75,4.25s-2.71,1.19-5,1.19V41.42h2.31V34.48h4.44v5.69h3.44V34.48h6.75v5.69h6.93v6.12H73.94v8.88h6.44v6.31ZM56.25,35v33.5a15.69,15.69,0,0,1-.44,4A5.4,5.4,0,0,1,54.56,75a4.11,4.11,0,0,1-2.12,1.38,12.06,12.06,0,0,1-3.25.37h-1.5V69.42h2.12V62.73H47.06v5.94a20.92,20.92,0,0,1-.31,4A5,5,0,0,1,45.5,75a4.14,4.14,0,0,1-2.25,1.19,14.36,14.36,0,0,1-3.56.38V68.67h1.12V35ZM47.06,57.36h2.75v-6H47.06Zm0-11.38h2.75V40H47.06Zm79,24.75v5.88H97.25A6.76,6.76,0,0,1,94,76a5.58,5.58,0,0,1-2-2.06,12.18,12.18,0,0,1-.81,1.5,2.3,2.3,0,0,1-.81.87,2.7,2.7,0,0,1-1,.44,7.86,7.86,0,0,1-1.49.13H85V69.23h1.56a1.08,1.08,0,0,0,1.13-.62,5,5,0,0,0,.19-1.38V50.36H85V44.67h9.44V67.42A9.49,9.49,0,0,0,94.56,69a1.45,1.45,0,0,0,.5,1,2.09,2.09,0,0,0,1.19.5,8.29,8.29,0,0,0,2,.19ZM96.94,41.48h10.87V39.86h-10V35.61h20.5v-.82h6.56a6.68,6.68,0,0,1-.31,2.13,3.43,3.43,0,0,1-1.31,1.56,6.28,6.28,0,0,1-2.37,1.06,19.18,19.18,0,0,1-3.82.32h-2.19v1.62h10.88v4.44h-3.5v1.5h3.56v5.12h-2.56c-2.46,0-4.23-.45-5.31-1.37a4.87,4.87,0,0,1-1.56-3.94V45.92h-1.51v6.31h-7.06V45.92H106.5v1.31a4.76,4.76,0,0,1-1.63,3.94c-1,.92-2.81,1.37-5.31,1.37h-2.5V47.42h3.56v-1.5H96.94Zm.94,11.44h24.43l1.75,2.5-2.5,2.87h3.63v7.44a5.29,5.29,0,0,1-1,3.56c-.63.75-1.86,1.13-3.69,1.13h-7.06V65.36h4.5V62.29h-4.82V60l1.94-2.44h-7.25v5.07a12.13,12.13,0,0,1-.44,3.56,5.31,5.31,0,0,1-1.31,2.31,5,5,0,0,1-2.18,1.25,11.25,11.25,0,0,1-3.07.38h-3.5V63.36h2.94V57.54H97.88ZM85.62,42.48V34.61a23.25,23.25,0,0,1,3.69.25A5.42,5.42,0,0,1,91.94,36a4.7,4.7,0,0,1,1.56,2.38,13.71,13.71,0,0,1,.5,4.06Z"/><path id="sloganpathdata" class="cls-5" d="M48.62,87.86a3,3,0,0,1,1.13.18,1.38,1.38,0,0,1,.69.44,2.3,2.3,0,0,1,.37.69,5.57,5.57,0,0,1,.06.87v4.69H49.81V90.48a3.14,3.14,0,0,0-.06-.69,2.06,2.06,0,0,0-.19-.56,1,1,0,0,0-.37-.31,1.63,1.63,0,0,0-.69-.13,2.7,2.7,0,0,0-.63.07,2.45,2.45,0,0,0-.56.18,1.77,1.77,0,0,0-.5.44,3.58,3.58,0,0,0-.37.69v4.56H45.37v-9.5h1.07v3.69a1.64,1.64,0,0,1,.43-.5,1.11,1.11,0,0,1,.5-.31,3,3,0,0,1,.63-.19A3.34,3.34,0,0,1,48.62,87.86Zm9.88,2.81a1.71,1.71,0,0,1-.06.37v.44l-4.63.25a3.37,3.37,0,0,0,.13,1,1.64,1.64,0,0,0,.37.63,1.36,1.36,0,0,0,.69.43,3,3,0,0,0,1,.13,4.76,4.76,0,0,0,1.12-.13,3.59,3.59,0,0,0,1-.31v1l-.37.13-.56.12a3.36,3.36,0,0,1-.63.06,3.81,3.81,0,0,1-.75.07,4.26,4.26,0,0,1-1.31-.19,2,2,0,0,1-1-.56A2.31,2.31,0,0,1,52.94,93a4.84,4.84,0,0,1-.25-1.68,4.9,4.9,0,0,1,.25-1.69,2.28,2.28,0,0,1,.56-1.06,2,2,0,0,1,1-.57,4.06,4.06,0,0,1,1.25-.18,3.54,3.54,0,0,1,1.44.25,2.14,2.14,0,0,1,.81.68,2.68,2.68,0,0,1,.37.88A3.81,3.81,0,0,1,58.5,90.67Zm-1.06,0a3,3,0,0,0-.07-.69,1.29,1.29,0,0,0-.25-.62.74.74,0,0,0-.5-.44,1.63,1.63,0,0,0-.87-.19,2,2,0,0,0-.94.19,1,1,0,0,0-.56.44,1.11,1.11,0,0,0-.31.68c0,.25-.09.57-.13.94Zm10-2.81a2.62,2.62,0,0,1,1,.18,1.31,1.31,0,0,1,.68.44,2.13,2.13,0,0,1,.38.69,3.26,3.26,0,0,1,.12.87v4.69H68.56V90.48a2.51,2.51,0,0,0-.25-1.25,1.22,1.22,0,0,0-1.06-.44,1.91,1.91,0,0,0-.56.07,2.3,2.3,0,0,0-.5.18,1.7,1.7,0,0,0-.38.38,2.52,2.52,0,0,0-.31.56v4.75H64.44V90.48a2.63,2.63,0,0,0-.25-1.25,1.06,1.06,0,0,0-1-.44,1.91,1.91,0,0,0-.56.07,1.52,1.52,0,0,0-.51.18,1.29,1.29,0,0,0-.43.38,3.78,3.78,0,0,0-.25.62v4.69H60.31V88h1.13v.88a1.94,1.94,0,0,1,.81-.82,3.29,3.29,0,0,1,1.12-.18,2.1,2.1,0,0,1,1.25.31,1.33,1.33,0,0,1,.69.81,2.08,2.08,0,0,1,.38-.56,2,2,0,0,1,.56-.31,2,2,0,0,1,.56-.19A3.36,3.36,0,0,1,67.44,87.86Zm7.12,7a4.26,4.26,0,0,1-1.31-.19,2,2,0,0,1-1-.56A2.31,2.31,0,0,1,71.69,93a4.84,4.84,0,0,1-.25-1.68,4.9,4.9,0,0,1,.25-1.69,2.28,2.28,0,0,1,.56-1.06,2,2,0,0,1,1-.57,4.86,4.86,0,0,1,2.62,0,1.76,1.76,0,0,1,1,.57,2.88,2.88,0,0,1,.62,1.06,6.73,6.73,0,0,1,.19,1.69A6.65,6.65,0,0,1,77.5,93a2.93,2.93,0,0,1-.62,1.07,1.75,1.75,0,0,1-1,.56A4.26,4.26,0,0,1,74.56,94.86Zm0-.94a2.8,2.8,0,0,0,.94-.13,1.08,1.08,0,0,0,.62-.37,1.56,1.56,0,0,0,.32-.81,5.51,5.51,0,0,0,.12-1.25,5.45,5.45,0,0,0-.12-1.25,1.56,1.56,0,0,0-.32-.82,2.26,2.26,0,0,0-.62-.43,2.8,2.8,0,0,0-.94-.13,2.84,2.84,0,0,0-.94.13,2.62,2.62,0,0,0-.62.43,2.76,2.76,0,0,0-.31.82,10.75,10.75,0,0,0-.06,1.25,10.87,10.87,0,0,0,.06,1.25,2.17,2.17,0,0,0,.37.81,1.13,1.13,0,0,0,.56.37A2.84,2.84,0,0,0,74.56,93.92Zm10.69-8.69v9.5h-.94l-.12-1.12a1.59,1.59,0,0,1-.75.87,2.57,2.57,0,0,1-1.44.38,3.72,3.72,0,0,1-1.44-.25,2.08,2.08,0,0,1-.81-.75,2.87,2.87,0,0,1-.44-1.07,8.19,8.19,0,0,1-.12-1.43A7,7,0,0,1,79.31,90a3.45,3.45,0,0,1,.44-1.12,2.08,2.08,0,0,1,.81-.75A3,3,0,0,1,82,87.86a4.47,4.47,0,0,1,.81.06,2.31,2.31,0,0,1,.63.31.8.8,0,0,1,.44.38,2.71,2.71,0,0,1,.31.56V85.23Zm-3.13,8.69a3,3,0,0,0,1-.13,1.43,1.43,0,0,0,.69-.56,3.1,3.1,0,0,0,.32-.81,8,8,0,0,0,.06-1.06,9.08,9.08,0,0,0-.06-1.07,3.1,3.1,0,0,0-.32-.81,1.43,1.43,0,0,0-.69-.56,2.17,2.17,0,0,0-1-.19,1.45,1.45,0,0,0-.93.25,1.29,1.29,0,0,0-.57.56,2.84,2.84,0,0,0-.24.88,5.53,5.53,0,0,0-.07.94,6.82,6.82,0,0,0,.07,1,2.15,2.15,0,0,0,.24.81,1.24,1.24,0,0,0,.57.56A2,2,0,0,0,82.12,93.92Zm5.94-7.19a.76.76,0,0,1-.5-.12c-.08,0-.12-.21-.12-.5s0-.46.12-.5a.7.7,0,0,1,.5-.13.82.82,0,0,1,.5.13c.09,0,.13.2.13.5s0,.45-.13.5A.9.9,0,0,1,88.06,86.73ZM87.5,88h1.06v6.75H87.5Zm6.06-.12a6.29,6.29,0,0,1,1.31.12,3,3,0,0,1,.82.44,1.7,1.7,0,0,1,.43.69,2.37,2.37,0,0,1,.13.81v4.81h-.94l-.18-1a1.31,1.31,0,0,1-.38.44,1.56,1.56,0,0,1-.56.37,1.85,1.85,0,0,1-.69.25,3.81,3.81,0,0,1-.75.07,2.7,2.7,0,0,1-1.81-.5,2.16,2.16,0,0,1-.5-1.5,2.32,2.32,0,0,1,.18-1,1.84,1.84,0,0,1,.5-.69,3,3,0,0,1,.88-.38,4.53,4.53,0,0,1,1.06-.12h2.07v-.56a2.08,2.08,0,0,0-.07-.5.62.62,0,0,0-.25-.44,1.29,1.29,0,0,0-.5-.31,2.08,2.08,0,0,0-.81-.13,4.74,4.74,0,0,0-.75.06l-.75.13V88l.75-.12ZM92.81,94a2.83,2.83,0,0,0,1.5-.37,1.81,1.81,0,0,0,.82-.94V91.54H93.19a3.3,3.3,0,0,0-.75.07,1.38,1.38,0,0,0-.5.18.91.91,0,0,0-.31.38,1.46,1.46,0,0,0-.13.69,1,1,0,0,0,.31.81A1.36,1.36,0,0,0,92.81,94Zm7.19.81a1.68,1.68,0,0,1-1.12-.31,1.48,1.48,0,0,1-.38-1.12V85.23h1.06v7.88c0,.33.06.54.19.62a.48.48,0,0,0,.44.19h.25a.71.71,0,0,1,.31-.06v.87a1,1,0,0,1-.31.06Zm1.81,1.5a1.71,1.71,0,0,0,1.25-.37,2.55,2.55,0,0,0,.69-1.19L101.06,88h1.19l2.06,5.63h.06L106.31,88h1.13L105,94.48a11,11,0,0,1-.5,1.19,2.72,2.72,0,0,1-.62.81,1.85,1.85,0,0,1-.82.56,3.46,3.46,0,0,1-1.25.19Zm8.44-1.5h-.56a2.89,2.89,0,0,1-.56-.06,2.22,2.22,0,0,1-.51-.06,1.19,1.19,0,0,0-.37-.06v-.94l.44.12a1.77,1.77,0,0,1,.5.07,2.34,2.34,0,0,0,.56.06h.5a2.59,2.59,0,0,0,1.13-.19.87.87,0,0,0,.43-.81,1.66,1.66,0,0,0-.06-.5.58.58,0,0,0-.25-.31.62.62,0,0,0-.44-.25,5.29,5.29,0,0,0-.81-.25,7.44,7.44,0,0,1-.88-.25,4.2,4.2,0,0,1-.62-.38,1.29,1.29,0,0,1-.25-.56,2.1,2.1,0,0,1-.13-.75,1.59,1.59,0,0,1,.63-1.31,2.81,2.81,0,0,1,1.81-.5,6.86,6.86,0,0,1,.94.06,2.25,2.25,0,0,1,.75.19l-.06.87a4.32,4.32,0,0,0-.69-.19,6.86,6.86,0,0,0-.94-.06,2.34,2.34,0,0,0-1.06.19.81.81,0,0,0-.38.81.92.92,0,0,0,.07.38.79.79,0,0,0,.18.31,2,2,0,0,0,.44.19l.63.18a5.88,5.88,0,0,1,1,.32,1.43,1.43,0,0,1,.62.37,1.16,1.16,0,0,1,.38.56,2.33,2.33,0,0,1,.12.82,1.75,1.75,0,0,1-.69,1.5A3.27,3.27,0,0,1,110.25,94.79Zm4.94-8.06a.9.9,0,0,1-.5-.12c-.09,0-.13-.21-.13-.5s0-.46.13-.5a.82.82,0,0,1,.5-.13.7.7,0,0,1,.5.13c.12,0,.18.2.18.5s-.06.45-.18.5A.76.76,0,0,1,115.19,86.73Zm-.5,1.25h1.06v6.75h-1.06Zm4.87,6.81h-.5a2.4,2.4,0,0,1-.56-.06,1.66,1.66,0,0,1-.5-.06,1.8,1.8,0,0,0-.37-.06v-.94l.37.12a2.38,2.38,0,0,1,.56.07,2.2,2.2,0,0,0,.5.06h.5a3,3,0,0,0,1.19-.19.91.91,0,0,0,.37-.81,1.66,1.66,0,0,0-.06-.5.73.73,0,0,0-.18-.31,1,1,0,0,0-.5-.25,3.41,3.41,0,0,0-.75-.25c-.38-.09-.69-.17-.94-.25a2.33,2.33,0,0,1-.57-.38,1.12,1.12,0,0,1-.31-.56,4.06,4.06,0,0,1-.06-.75,1.68,1.68,0,0,1,.56-1.31,2.81,2.81,0,0,1,1.81-.5,8.26,8.26,0,0,1,1,.06,2.12,2.12,0,0,1,.75.19l-.12.87a2.78,2.78,0,0,0-.69-.19,6.36,6.36,0,0,0-.87-.06,2.1,2.1,0,0,0-1.06.19.81.81,0,0,0-.38.81.94.94,0,0,0,.06.38.81.81,0,0,0,.19.31.91.91,0,0,0,.37.19l.63.18a4.06,4.06,0,0,1,1,.32,1.52,1.52,0,0,1,.69.37A.87.87,0,0,1,122,92a2.31,2.31,0,0,1,.13.82,1.82,1.82,0,0,1-.63,1.5A3.62,3.62,0,0,1,119.56,94.79Z"/></g></g></g></g></svg>
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..7fe1997
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,12 @@
+<script setup lang="ts">
+import { ref } from "vue";
+import deviceView from "./components/deviceView.vue";
+
+</script>
+
+<template>
+  <router-view/>
+</template>
+
+<style scoped>
+</style>
diff --git a/src/assets/vue.svg b/src/assets/vue.svg
new file mode 100644
index 0000000..770e9d3
--- /dev/null
+++ b/src/assets/vue.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
\ No newline at end of file
diff --git a/src/components/deviceView.vue b/src/components/deviceView.vue
new file mode 100644
index 0000000..45b67c2
--- /dev/null
+++ b/src/components/deviceView.vue
@@ -0,0 +1,750 @@
+<template>
+  <div class="divice" :class="{blink:isbaioji}" :style="{borderColor: background}" >
+    <div v-if="deviceData.患者姓名 !== ''&&!xiaoduzhuangti" style="height: 100%;" >
+            <el-row v-if="deviceData.患者姓名 !== ''" @click='showgaojing'  :style="{backgroundColor: background}" :class="{blink2:isbaioji}" style="font-weight: 900;color: #FFFFFF; width: 100%; height: 20%; line-height: 100%;padding: 5px;position: relative; "> 
+                <span class="grid-container"  style="font-size: 300%; height: 100%;" v-if="deviceData.设备名称!==null">{{deviceData.设备名称}}  </span>   
+                <span class="grid-container" style="margin-left: 5%;font-size: 350%; height: 100%;">{{deviceData.患者姓名}} </span> 
+                
+                <span class="grid-container"  v-if="deviceData.年龄!==null" style="margin-left: 5%;font-size: 300%; height: 100%;">{{deviceData.年龄}}岁</span> 
+                <span class="grid-container"  style="margin-left: 5%;font-size: 300%; height: 100%;">{{deviceData.性别}}</span>
+               <div style="position: absolute;top: 0;right: 0;display: grid;padding: 5px; font-size: 300%;" >
+                    <span v-if="deviceData.iot_跨膜压>=200&&Number(deviceData.透析状态)===2"  style="color: #303133;">
+                        TMP↑
+                    </span>
+                    <span v-if="deviceData.iot_跨膜压<0&&Number(deviceData.透析状态)===2" style="color: #303133;">
+                        TMP↓
+                    </span>
+                    <span v-if="deviceData.监测血压是否低于百分之30&&Number(deviceData.透析状态)===2" style="color: #303133;">
+                        BP↓
+                    </span>
+                    <span v-if="deviceData.监测血压是否高于百分之30&&Number(deviceData.透析状态)===2" style="color: #303133;">
+                        BP↑
+                    </span>
+
+               </div>
+                
+            </el-row>
+            <el-row  v-if="deviceData.患者姓名!==''" :style="{backgroundColor: textcolor}" style="padding-right:2px;height: 70%;">
+                <el-col :span="12" style="height: 100%;">
+                    <div style="height:100%;">
+                        <el-row style="padding:10% 0px 0px 20px; height: 100%;">
+                            <el-col :span="10" style="height: 100%;">
+                                <div  :style="{backgroundImage:`url(${deviceData.患者头像})`}" style="background-size:100% 100%;border-radius: 5px; margin-top: 10%;margin-bottom: 1%; height: 80%; width: 100%;"></div>
+                            </el-col>
+                            <el-col :span="14" style="padding-left: 5px; height: 100%; font-weight: 700;font-size: 300%;" >
+                                <el-row  style="height: 25%; ">
+                                    <el-col class="grid-container"  style="height: 100%;" :span="12" :style="{color:deviceData.透析方案==='HDF'?'#E6A23C':''}">
+                                        {{deviceData.透析方案}}
+                                    </el-col>
+                                    <el-col :span="12"  class="grid-container"   style="text-align: right;font-weight: 800; color: #70A3DD;white-space: nowrap;height: 100%;">
+                                        {{txztText}}
+                                    </el-col>
+                                </el-row>
+                                <div  style="height: 25%;">
+                                    <template v-if="Number(deviceData.透析状态)>=2">
+                                        <div class="grid-container"  style="height: 100%;">
+                                            <div>
+                                                <span  v-if="deviceData.iot_静脉压"  style="color: #409EFF;">{{deviceData.iot_静脉压}}/</span><span v-if="deviceData.iot_跨膜压" :style="{color:deviceData.iot_跨膜压>200?'red':''}">{{deviceData.iot_跨膜压}}</span>
+                                            </div>
+                                        </div>
+                                    </template>
+                                </div>
+                                <div style="height: 15%;" >
+                                    <span  v-if="Number(deviceData.透析状态)>=2">
+                                     
+                                       <span  style="color:#303133;">{{Number(deviceData.iot_当前脱水量).toFixed(1)}}</span>/<span  style="font-size: 90%">{{Number(deviceData.iot_脱水目标量).toFixed(1)}}</span><span style="font-size: 80%">({{deviceData.iot_脱水速率}})</span>  
+                                    </span>
+                                    <span v-if="Number(deviceData.透析状态)==1">
+                                        <span style="color:#303133;">{{Number(deviceData.iot_当前脱水量).toFixed(1)}}</span>/<span  style="font-size: 90%">{{Number(deviceData.处方脱水量).toFixed(1)}}</span>
+                                    </span>
+                                </div> 
+                                <div style="height: 10%;">
+                                    <el-progress :text-inside="true" :stroke-width="26" :percentage="70" />
+                                </div>
+                                <div style="height: 25%;">
+                                    <span v-if="Number(deviceData.透析状态)>=1">
+                                        <span style="color: #303133;">{{jgTime4(deviceData.iot_透析时间)}}</span>/<span style="color: #606266;">{{deviceData.透析处方的时长_小时}}:{{deviceData.透析处方的时长_分钟}}</span>
+                                 </span>
+                                </div>
+                            </el-col>
+                        </el-row>
+                    </div>
+                </el-col>
+                <el-col :span="12">
+                    <div v-if="Number(deviceData.透析状态)>1"  :ref="'echartsDiv'+device.设备编号" style="height: 97%;"> 
+                    </div>
+                    <div v-if="Number(deviceData.透析状态)===1" style="text-align: right;height: 100%;">
+                        <div class="container" style="height: 25%;font-weight: 600;color: #909399; font-size: 80%; "> 
+                            CW:<span style="font-weight: 800; font-size: 130%; color: #303133;white-space: nowrap;">{{Number(deviceData.透前称重).toFixed(1)}}</span>
+                        </div>
+                        <div class="container" style="height: 25%;font-weight: 600;color: #909399; font-size: 80%; ">
+                            D<span style="font-weight: 800; font-size: 130%; color: #303133;white-space: nowrap;">{{Number(deviceData.干体重).toFixed(1)}}</span>L<span style="font-weight: 800; font-size: 130%; color: #303133;white-space: nowrap;">{{Number(deviceData.上次透后称重)}}</span>
+                        </div>
+                        <div :style="{color:deviceData.体重增长率>=5?'red':'#303133'}" style="height: 25%;font-weight: 600; font-size: 80%;">
+                            <span style="font-weight: 800; font-size: 130%; white-space: nowrap;">
+                               <template v-if="Number(deviceData.透前称重-deviceData.干体重)>0">+</template>{{Number(deviceData.透前称重-deviceData.干体重).toFixed(1)}}
+                            </span>
+                            <span>({{deviceData.体重增长率}}%)</span>
+                        </div>
+                        <div  class="container" style="font-weight: 600;height: 25%;color: #909399; font-size: 80%;margin-left: -20px;">
+                            <span v-if="deviceData.透前血压_伸缩压"  :style="{color:tqXygj?'red':'#303133'}" style="font-weight: 800; font-size: 130%;white-space: nowrap;">{{deviceData.透前血压_伸缩压}}/</span>
+                            <span :style="{color:tqXygj?'red':'#303133'}" style="font-weight: 800; font-size: 130%;white-space: nowrap;">{{deviceData.透前血压_舒张压}}</span>
+                            <span v-if="deviceData.透前脉搏" :style="{color:tqMbgj?'red':'#303133'}" style="font-weight: 800; font-size: 130%;white-space: nowrap;">,{{deviceData.透前脉搏}}</span>
+                        </div>
+                        
+                    </div>
+                </el-col>
+            </el-row>
+        </div>
+      <div v-else style="height: 100%; border: #409EFF 1px solid;" :class="{blink2:noBaoji!==''}">
+          <el-row  style="font-weight: 900;font-size: 300%; color: #3b3737; width: 100%; height: 20%; border: #3b3737 1px solid;">
+              <el-row v-if="noBaoji===''" :style="{backgroundColor:zhuangtaiColor}"  style="color: #FFFFFF;width: 100%; height: 100%;white-space: nowrap;overflow: hidden;">
+                <div class="grid-container" style="height: 100%;">
+                    {{deviceData.设备名称}}  {{zhuangtaiStr}} 
+                </div>
+                 
+              </el-row>
+
+              <el-row v-else style="width: 100%;">  
+                  <el-col :span="24" style="color: #FFFFFF;width: 100%;white-space: nowrap;overflow: hidden;">
+                      {{deviceData.设备名称}}  {{noBaoji}} 
+                  </el-col>
+              </el-row>
+        
+              
+          </el-row>
+          <el-row   style="padding-right:2px;height: 80%; background-color: #FFFFFF">
+              <el-col :span="15" style="height: 100%;">
+                  <div style="height:100%;">
+                      <el-row style="padding:0px 0px 0px 0px; height: 100%;">
+                          <el-col :span="10" :style="{backgroundImage:`url(${TQS88})`}" style="background-size:100% 100%;border-radius: 5px; margin-top: 2%;margin-bottom: 1%;">
+                              &nbsp;
+                          </el-col>
+                          <el-col  v-if="noBaoji!==''" :span="14" style="padding-left: 5px; height: 100%; font-weight: 500;font-size:100%" >
+                              <div class="grid-container" style="height: 33%; line-height: 100%;color: red; ">
+                                  
+                                  <div class="centered-text">温度:{{wd}}</div>
+                              </div>
+                             
+                              <div class="grid-container" style="height: 33%;color: #409EFF;" >
+                                  
+                                  <div class="centered-text">流速:{{ls}}</div>
+                              </div> 
+                              <div class="grid-container" style="height: 33%;color: #E6A23C;">
+                                 
+                                 <div class="centered-text">Cond:{{ddd}}</div>
+                              </div>
+                          </el-col>
+                      </el-row>
+                  </div>
+              </el-col>
+              <el-col :span="9" v-if="noBaoji!==''">
+                  <!-- 历史状态画图 -->
+                  <div   :ref="'echartsDivwd'+device.设备编号" style="height: 33%;">
+                  </div>
+                  <div   :ref="'echartsDivls'+device.设备编号" style="height: 33%;">
+                  </div>
+                  <div   :ref="'echartsDivddd'+device.设备编号" style="height: 33%;">
+                  </div>
+              </el-col>
+          </el-row>
+      </div>
+     
+       
+  </div>
+  
+</template>
+<script lang="ts" setup>
+import TQS88 from './img/TQS88.png'
+import {computed, getCurrentInstance, onMounted,ref,watch} from 'vue'
+import * as echarts from 'echarts';
+const props = defineProps(['deviceData'])
+import { jgTime4 } from '../utils/formatTime';
+const { proxy } = getCurrentInstance() as any;
+const device=computed(()=>{
+  return props.deviceData
+}) 
+// 告警提示
+const textbaojing=ref('')
+const iscomfig=ref(false)
+const centerDialogVisible=ref(false)
+const background=ref('')
+const txztText=ref('')
+const textcolor=ref('')
+const wd=ref('')
+const ls=ref('')
+const ddd=ref('')
+const txzt: any = computed(() => {
+return props.deviceData.透析状态;
+});
+// 是否是消毒类型和待机
+const xiaoduzhuangti=computed(()=>{
+  // const list=device.value.设备状态列表
+  // if(list&&list.length>0){
+  //    const x= list.findIndex(e=>{return e.状态类型==='透析机消毒'||e.状态类型==='待机'})
+  //    if(x>=0){
+  //     return true
+  //    }else{
+  //     return false
+  //    }
+  // }
+  return false
+});
+// 状态颜色 
+const zhuangtaiColor=computed(()=>{
+  const list=device.value.设备状态列表
+  let colorStr='#13CE66'
+  if(list&&list.length>0){
+      // 默认显示第一状态颜色
+      // colorStr=list[0].状态颜色
+      // 消毒状态优先级高
+     const x= list.findIndex(e=>{return e.状态类型==='透析机消毒'||e.状态类型==='在线'})
+     if(x!==0){
+      colorStr=list[0].状态颜色
+     }
+  }
+  return colorStr
+});
+// 没有报警就返回空字符传
+const noBaoji=computed(()=>{
+  const list=device.value.设备状态列表
+  let zhuantaiStr=''
+  let jinggaoStr=''
+  if(list&&list.length>0){
+      list.forEach((el:any)=>{
+          if(el.是否为警告标记===1){
+              if(jinggaoStr!==''){
+                  jinggaoStr+='/'+el.状态名称
+              }else{
+                  jinggaoStr+=el.状态名称
+              }
+          }else{
+              zhuantaiStr+=el.状态名称
+          }
+      })
+  }
+  return jinggaoStr
+});
+// 状态返回
+const zhuangtaiStr=computed(()=>{
+  const list=device.value.设备状态列表
+  let zhuantaiStr=''
+  if(list&&list.length>0){
+      list.forEach((el:any)=>{
+          if(el.是否为警告标记===1||el.状态类型==='透析机消毒'||el.状态类型==='在线'){ //去掉待机和消毒状态显示
+          }else{
+              if(zhuantaiStr!==''){
+                  zhuantaiStr+='/'+el.状态名称
+              }else{
+                  zhuantaiStr+=el.状态名称
+              }
+              
+          }
+      })
+  }
+
+  return zhuantaiStr
+})
+const isbaioji=computed(()=>{
+  const list=device.value.设备状态列表
+  if((device.value.监测血压是否低于百分之30||device.value.跨膜压是否大于200||device.value.监测血压是否高于百分之30)&&device.value.透析状态==='2.0'){
+      return true
+  } 
+  else{
+      return false
+  }
+})
+// 透前血压告警
+const tqXygj=computed(()=>{
+  if(device.value.透前血压_伸缩压>160||device.value.透前血压_伸缩压<90){
+      return true
+  }else{
+      return false
+  }
+})
+// 透前脉搏告警
+const tqMbgj=computed(()=>{
+  if(device.value.透前脉搏>90){
+      return true
+  }else{
+      return false
+  }
+})
+// 设置内联样式对象
+const backgroundStyle = {
+backgroundImage: `url(${TQS88})`,
+backgroundSize: 'cover', // 根据需要调整
+backgroundPosition: 'center', // 根据需要调整
+};
+watch(
+() => txzt.value,
+() => {
+  if (txzt.value === '0.0') {
+    txztText.value = '未签';
+    textcolor.value = '#FAFAFA';
+          background.value='#606266'
+  } else if (txzt.value === '1.0') {// 蓝色
+          textcolor.value = '#faecd8';
+          background.value='#E6A23C'
+    txztText.value = '已签';
+  } else if (txzt.value === '2.0') {// 绿色
+          // textcolor.value = '#D9F5E2';
+          // background.value='#67C23A'
+          textcolor.value = '#ECF5FF';
+          background.value='#409EFF'
+    txztText.value = '透中';
+  } else if (txzt.value === '2.5') { //
+          textcolor.value = '#fde2e2';
+          background.value='#fab6b6'
+    txztText.value = '结束';
+  } else if (txzt.value === '3.0') {// 已经结束
+          textcolor.value = '#FFECD0';
+          background.value='#E6A23C'
+    txztText.value = '检查';
+  } else if (txzt.value === '4.0') {// yij
+          textcolor.value = '#FFECD0';
+          background.value='#E6A23C'
+    txztText.value = '归档';
+  }
+},
+{
+  immediate: true,
+  deep: true,
+}
+);
+onMounted(()=>{
+})
+watch(()=>device.value.设备变化,()=>{
+  // console.log(device.value.设备名称,'子组件变量')
+  setTimeout(()=>{
+      if(!xiaoduzhuangti.value){
+          initTupiao()
+      }
+     
+  },500)
+})
+
+const showgaojing=()=>{
+ 
+  if(device.value.监测血压是否低于百分之30){
+      centerDialogVisible.value=true
+      iscomfig.value=true
+      textbaojing.value=`${device.value.设备名称}床,${device.value.患者姓名} 监测血压下降至上机血压30%了,请及时处理`
+  }
+  if(device.value.跨膜压是否大于200){
+      centerDialogVisible.value=true
+      iscomfig.value=true
+      textbaojing.value=`${device.value.设备名称}床,${device.value.患者姓名} 跨膜压过高请及时处理`
+  }
+}
+const initTupiao=()=>{
+  if(device.value.患者姓名!==''){
+      const seriesData=[
+      {
+              name: '',
+              type: 'line',
+              symbol: "triangle",
+              symbolSize: 10,
+              symbolRotate:180,
+              data: [],
+              lineStyle: {
+                  width: 5, // 设置线条宽度为5
+                  color:'red'
+
+                  
+              },
+              itemStyle: {
+                  borderWidth: 3,
+                  borderColor: 'red',
+                  color: 'red'
+              },
+              markPoint:{
+                      data:[]
+                  },
+              markLine:{
+                      symbol:"none",
+                      lineStyle:{color:'#409EFF',width: 3 },
+                      data:[{ name:'y90',yAxis:90,label:{show:false},symbol:"none"}]
+                  }
+              },
+              
+              
+              {
+                  name: '',
+                  type: 'line',
+                  symbol: "triangle",
+                  symbolSize: 10,
+                  data: [],
+                  lineStyle: {
+                      color:'#409EFF',
+                      width: 5 // 设置线条宽度为5
+                  },
+                  itemStyle: {
+                      borderWidth: 3,
+                      borderColor: '#409EFF',
+                      color: '#409EFF'
+                  },
+                  markPoint:{
+                      data:[]
+                  },
+                  markLine:{
+                      symbol:"none",
+                      lineStyle:{color:'#F56C6C',width: 3 },
+                      data:[{ name:'y140',yAxis:140,label:{show:false},symbol:"none"}]
+                  }
+              },
+              {
+                  name: '',
+                  type: 'line',
+                  symbolSize: 10,
+                  data: [],
+                  lineStyle: {
+                      color:'#D940FF',
+                      width: 5 // 设置线条宽度为5
+                  },
+                  markPoint:{
+                      data:[]
+                  },
+              
+              },
+      ]
+      const xAxisData=[]
+      if(Number(device.value.透析状态)>=2){
+          // alert(111)
+          device.value.监测记录列表.forEach((e,index)=>{
+              seriesData[0].data.push(e.伸缩压)
+              seriesData[1].data.push(e.舒张压)
+              seriesData[2].data.push(e.脉搏)
+              xAxisData.push(index)
+              if(index==0){
+                  let y=(Number(e.伸缩压)+20)
+                  let y2=(Number(e.舒张压)+20)
+                  seriesData[0].markPoint.data.push({ name: '上机血压', value: e.伸缩压, xAxis: 0, yAxis: e.伸缩压,symbolSize:0,symbolOffset:[25,-15],label:{fontSize:20,color:'red'}})
+                  seriesData[1].markPoint.data.push({ name: '上机血压', value: e.舒张压, xAxis: 0, yAxis: e.舒张压,symbolSize:0 ,symbolOffset:[15,15],label:{fontSize:20,color:'#409EFF'}})
+                  seriesData[2].markPoint.data.push({ name: '上机血压', value: e.脉搏, xAxis: 0, yAxis: e.脉搏,symbolSize:0 ,symbolOffset:[10,-10],label:{fontSize:20,color:'#D940FF'}})
+              }
+              else if(device.value.监测记录列表.length>1&&index===(device.value.监测记录列表.length-1)){
+                  let y=(Number(e.伸缩压)+20)
+                  let y2=(Number(e.舒张压)+20)
+                  seriesData[0].markPoint.data.push({ name: '上机血压', value: e.伸缩压, xAxis: index, yAxis: e.伸缩压,symbolSize:0,symbolOffset:[-15,-15],label:{fontSize:20,color:'red'}})
+                  seriesData[1].markPoint.data.push({ name: '上机血压', value: e.舒张压, xAxis: index, yAxis: e.舒张压,symbolSize:0 ,symbolOffset:[-15,15],label:{fontSize:20,color:'#409EFF'}})
+                  seriesData[2].markPoint.data.push({ name: '上机血压', value: e.脉搏, xAxis: index, yAxis: e.脉搏,symbolSize:0 ,symbolOffset:[0,-10],label:{fontSize:20,color:'#D940FF'}})
+              }
+          })
+          if(device.value.监测记录列表.length===1){
+              xAxisData.push(1)
+          }
+          try{
+              const myChart = echarts.init(proxy.$refs['echartsDiv'+device.value.设备编号]);
+              const option={
+              backgroundColor:textcolor.value,
+              tooltip: {
+                  trigger: 'axis'
+              },
+              toolbox: {
+                  show: false
+              },
+              grid:{
+                  left:8,
+                  top:0,
+                  bottom:0,
+              },
+              xAxis: {
+                  type: 'category',
+                  // 标记做右往左排列
+                  boundaryGap: false,
+                  data: xAxisData,
+                  axisTick: {
+                      show: true // 显示 X 轴刻度
+                  }
+              },
+              yAxis: {
+                  name: '',
+                  type: 'value',
+                  min: 20,
+                  max: 220,
+                  interval: 20, // 指定刻度间隔,
+                  splitLine: {
+                      show: false
+                  }
+              },
+              series: seriesData
+              };
+              myChart.setOption(option);
+          }catch(e){
+              console.log('图标渲染异常异常')
+          }
+      
+      }else{ 
+          try{
+              const myChart = echarts.init(proxy.$refs['echartsDiv'+device.value.设备编号]);
+      
+              const option={
+              backgroundColor:textcolor.value,
+              tooltip: {
+                  trigger: 'axis'
+              },
+              toolbox: {
+                  show: false
+              },
+              grid:{
+                  left:5,
+                  top:0,
+                  bottom:0,
+              },
+              xAxis: {
+                  type: 'category',
+                  boundaryGap: false,
+                  data: [1,2,3,4]
+              },
+              yAxis: {
+                  name: '',
+                  type: 'value',
+                  min: 20,
+                  max: 220,
+                  interval: 20, // 指定刻度间隔,
+                  splitLine: {
+                      show: false
+                  }
+              },
+              series: []
+              };
+              myChart.setOption(option);
+          }catch(e){
+              console.log('异常',proxy.$refs['echartsDiv'+device.value.设备编号])
+          }
+      }       
+  }else if(device.value.患者姓名===''){
+      const tbdata1=[]
+      const tbdata2=[]
+      const tbdata3=[]
+      if(device.value.属性历史列表){
+          device.value.属性历史列表.forEach((e,index)=>{
+              // 温度
+              const wdMode=e.属性列表.find(l=>{return l.identifierText==='透析液温度'})
+              if(wdMode){
+                  tbdata1.push(Number(wdMode?.finalText))
+                  wd.value=Number(wdMode?.finalText)
+              }
+            
+              // 血液流速
+              const xymode=e.属性列表.find(l=>{return l.identifierText==='血液流速'})
+              if(xymode){
+                  tbdata2.push(Number(xymode?.finalText))
+                  ls.value=Number(xymode?.finalText)
+              }
+              
+              // 电导度
+              const dddMode=e.属性列表.find(l=>{return l.identifierText==='透析液电导度'})
+              if(dddMode){
+                  tbdata3.push(Number(dddMode?.finalText))
+                  ddd.value=Number(dddMode?.finalText)
+              }
+          })
+      }
+      try{
+          const myChart1 = echarts.init(proxy.$refs['echartsDivwd'+device.value.设备编号]);
+          const myChart2 = echarts.init(proxy.$refs['echartsDivls'+device.value.设备编号]);
+          const myChart3 = echarts.init(proxy.$refs['echartsDivddd'+device.value.设备编号]);
+              const option1={
+              backgroundColor:textcolor.value,
+              tooltip: {
+                  trigger: 'axis'
+              },
+              toolbox: {
+                  show: false
+              },
+              grid:{
+                  left:8,
+                  top:30,
+                  bottom:0,
+              },
+              xAxis: {
+                  show: false, // 隐藏X轴
+                  type: 'category',
+                  // 标记做右往左排列
+                  boundaryGap: false,
+                  data: [1,2,3],
+                  axisTick: {
+                      show: false // 显示 X 轴刻度
+                  }
+              },
+              yAxis: {
+                  type: 'value',
+                  splitLine: {
+                      show: false
+                  }
+              },
+              series: [
+                  {
+                  data: tbdata1,
+                  type: 'line',
+                  lineStyle: {
+                      width: 10, // 设置线条宽度为5
+                      color:'red'
+                  }
+                  }
+              ]
+              };
+              const option2={
+              backgroundColor:textcolor.value,
+              tooltip: {
+                  trigger: 'axis'
+              },
+              toolbox: {
+                  show: false
+              },
+              grid:{
+                  left:8,
+                  top:20,
+                  bottom:0,
+              },
+              xAxis: {
+                  show: false, // 隐藏X轴
+                  type: 'category',
+                  // 标记做右往左排列
+                  boundaryGap: false,
+                  data: [1,2,3],
+                  axisTick: {
+                      show: false // 显示 X 轴刻度
+                  }
+              },
+              yAxis: {
+                  type: 'value',
+                  min:-10,
+                  splitLine: {
+                      show: false
+                  }
+              },
+              series: [
+                  {
+                  data: tbdata2,
+                  type: 'line',
+                  lineStyle: {
+                      width: 10, // 设置线条宽度为5
+                      color:'#409EFF'
+                  }
+                  
+                  }
+              ]
+              };
+              const option3={
+              backgroundColor:textcolor.value,
+              tooltip: {
+                  trigger: 'axis'
+              },
+              toolbox: {
+                  show: false
+              },
+              grid:{
+                  left:8,
+                  top:10,
+                  bottom:0,
+              },
+              xAxis: {
+                  show: false, // 隐藏X轴
+                  type: 'category',
+                  // 标记做右往左排列
+                  boundaryGap: false,
+                  data: [1,2,3],
+                  axisTick: {
+                      show: false // 显示 X 轴刻度
+                  }
+              },
+              yAxis: {
+                  type: 'value',
+                  min:-10,
+                  splitLine: {
+                      show: false
+                  }
+              },
+              series: [
+                  {
+                  data: tbdata3,
+                  type: 'line',
+                  lineStyle: {
+                      width: 10, // 设置线条宽度为5
+                      color:'#E6A23C'
+                  }
+                  }
+              ]
+              };
+              myChart1.setOption(option1);
+              myChart2.setOption(option2);
+              myChart3.setOption(option3);
+          }catch(e){
+              console.log('图标渲染异常异常')
+          }
+
+      console.log(device.value)
+  }
+  
+
+}
+</script>
+<style lang="less" scoped>
+.divice{
+  font-size: 100%;
+  border-radius: 4px;
+  border: solid 1px;
+  width: 100%;
+  height: 100%;
+  border: 1px solid coral;
+}
+/* 定义闪烁动画 */
+@keyframes blink {
+0% {
+  border:4px solid red ;
+}
+50% {
+  border:4px solid Transparent ;
+}
+100% {
+  border:4px solid red ;
+  // border-bottom:8px solid red ;
+}
+}
+
+/* 应用闪烁动画 */
+.blink {
+  // float: left; /* 让div浮动到左边 */
+  width: 100%;
+  height: 100%;
+  animation: blink 2s infinite; /* 每秒闪烁一次,无限次数 */
+
+//   border-left:5px solid red ;
+//   border-right:5px solid red ;
+ 
+//   background: red;
+   cursor: pointer;
+  //  margin-bottom: 100%;
+}
+@keyframes blink2 {
+0% {
+  background: red ;
+}
+50% {
+  background: Transparent ;
+}
+100% {
+  background: red ;
+  // border-bottom:8px solid red ;
+}
+}
+.blink2{
+  animation: blink2 2s infinite; /* 每秒闪烁一次,无限次数 */
+  width: 100%;
+  height: 100%;
+}
+.grid-container {
+  display: grid;
+  align-items: center; /* 垂直居中 */
+  height: 100vh; /* 根据需要调整高度 */
+}
+
+.centered-text {
+  font-weight: 600;
+  /* 其他样式 */
+}
+
+</style>
\ No newline at end of file
diff --git a/src/components/img/TQS88.png b/src/components/img/TQS88.png
new file mode 100644
index 0000000..5c8300c
--- /dev/null
+++ b/src/components/img/TQS88.png
Binary files differ
diff --git a/src/img/TQS88.png b/src/img/TQS88.png
new file mode 100644
index 0000000..5c8300c
--- /dev/null
+++ b/src/img/TQS88.png
Binary files differ
diff --git a/src/img/maibo.png b/src/img/maibo.png
new file mode 100644
index 0000000..4c4b2ac
--- /dev/null
+++ b/src/img/maibo.png
Binary files differ
diff --git a/src/img/xueya.png b/src/img/xueya.png
new file mode 100644
index 0000000..c0cc320
--- /dev/null
+++ b/src/img/xueya.png
Binary files differ
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..ae667b1
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,8 @@
+import { createApp } from 'vue'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'    
+import router from './router';
+import './style.css'
+import App from './App.vue'
+
+createApp(App).use(router).use(ElementPlus).mount('#app')
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 0000000..e73a4fa
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,34 @@
+// router/index.ts
+import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
+import Home from '../views/Home.vue'; // 假设这是你的主页组件
+import deviceWindows from '../views/deviceWindows.vue'
+// import Search from '../views/Search.vue'; // 搜索结果页,接收查询参数
+
+// 定义路由规则,并为每个路由指定类型安全的 props
+const routes: Array<RouteRecordRaw> = [
+  {
+    path: '/',
+    name: 'Home',
+    component: Home,
+  },
+  {
+    path: '/deviceWindows/:deviceid',
+    name: 'deviceWindows',
+    component: deviceWindows,
+    props: true, // 路径参数将作为 props 传递给组件
+  },
+//   {
+//     path: '/search',
+//     name: 'Search',
+//     component: Search,
+//     props: (route) => ({ query: route.query.q as string }), // 将查询参数 q 作为 prop 传递给组件
+//   }
+];
+
+// 创建路由器实例,并指定类型
+const router = createRouter({
+  history: createWebHistory(import.meta.env.BASE_URL),
+  routes, // 路由配置
+});
+
+export default router;
\ No newline at end of file
diff --git a/src/style.css b/src/style.css
new file mode 100644
index 0000000..877f744
--- /dev/null
+++ b/src/style.css
@@ -0,0 +1,41 @@
+:root {
+  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  font-weight: 400;
+
+  color-scheme: light dark;
+  color: rgba(255, 255, 255, 0.87);
+  background-color: #242424;
+
+  font-synthesis: none;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+html, body {
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  height: 100%;
+}
+
+#app {
+  width: 100%;
+  height: 100%;
+  border: 1px rgb(23, 7, 7) solid;
+  background-color: lightblue; /* 可选:用于可视化效果 */
+}
+
+@media (prefers-color-scheme: light) {
+  :root {
+    color: #213547;
+    background-color: #ffffff;
+  }
+  a:hover {
+    color: #747bff;
+  }
+  button {
+    background-color: #f9f9f9;
+  }
+}
diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts
new file mode 100644
index 0000000..f045667
--- /dev/null
+++ b/src/utils/formatTime.ts
@@ -0,0 +1,310 @@
+/**
+ * 时间日期转换
+ * @param date 当前时间,new Date() 格式
+ * @param format 需要转换的时间格式字符串
+ * @description format 字符串随意,如 `YYYY-mm、YYYY-mm-dd`
+ * @description format 季度:"YYYY-mm-dd HH:MM:SS QQQQ"
+ * @description format 星期:"YYYY-mm-dd HH:MM:SS WWW"
+ * @description format 几周:"YYYY-mm-dd HH:MM:SS ZZZ"
+ * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatDate(date: Date, format: string): string {
+	let we = date.getDay(); // 星期
+	let z = getWeek(date); // 周
+	let qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度
+	const opt: { [key: string]: string } = {
+		'Y+': date.getFullYear().toString(), // 年
+		'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1)
+		'd+': date.getDate().toString(), // 日
+		'H+': date.getHours().toString(), // 时
+		'M+': date.getMinutes().toString(), // 分
+		'S+': date.getSeconds().toString(), // 秒
+		'q+': qut, // 季度
+	};
+	// 中文数字 (星期)
+	const week: { [key: string]: string } = {
+		'0': '日',
+		'1': '一',
+		'2': '二',
+		'3': '三',
+		'4': '四',
+		'5': '五',
+		'6': '六',
+	};
+	// 中文数字(季度)
+	const quarter: { [key: string]: string } = {
+		'1': '一',
+		'2': '二',
+		'3': '三',
+		'4': '四',
+	};
+	if (/(W+)/.test(format))
+		format = format.replace(RegExp.$1, RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]);
+	if (/(Q+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut]);
+	if (/(Z+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 3 ? '第' + z + '周' : z + '');
+	for (let k in opt) {
+		let r = new RegExp('(' + k + ')').exec(format);
+		// 若输入的长度不为1,则前面补零
+		if (r) format = format.replace(r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'));
+	}
+	return format;
+}
+
+/**
+ * 获取当前日期是第几周
+ * @param dateTime 当前传入的日期值
+ * @returns 返回第几周数字值
+ */
+export function getWeek(dateTime: Date): number {
+	let temptTime = new Date(dateTime.getTime());
+	// 周几
+	let weekday = temptTime.getDay() || 7;
+	// 周1+5天=周六
+	temptTime.setDate(temptTime.getDate() - weekday + 1 + 5);
+	let firstDay = new Date(temptTime.getFullYear(), 0, 1);
+	let dayOfWeek = firstDay.getDay();
+	let spendDay = 1;
+	if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1;
+	firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay);
+	let d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000);
+	let result = Math.ceil(d / 7);
+	return result;
+}
+/**
+ * 
+ * @param param moke当前日期的周排班
+ * @param format 
+ * @returns 
+ */
+export function getWeekDatas(week:number){
+	const datas=[];
+	var todey=new Date();
+	const dqweek=getWeek(todey)
+	if(week<dqweek){
+		todey.setTime(todey.getTime()-3600 * 1000 * 24 * 7 * (dqweek-week))
+	}
+	else if(week>dqweek){
+		todey.setTime(todey.getTime()+3600 * 1000 * 24 * 7 * (week-dqweek))
+	}
+	const num= todey.getDay();
+	
+	if(num>0){
+		for(var i=0;i<8;i++){
+			if(i===num){
+				datas.push(formatDate(todey,'YYYY-mm-dd  WWW'))
+			}else if(i<num){
+				const start = new Date(todey)
+				start.setTime(start.getTime() - 3600 * 1000 * 24 * (num-i));
+				datas.push(formatDate(start,'YYYY-mm-dd  WWW'))
+			}else if(i>num){
+				const start2 = new Date(todey);
+				start2.setTime(start2.getTime() + 3600 * 1000 * 24 * (i-num));
+				datas.push(formatDate(start2,'YYYY-mm-dd  WWW'))
+			}
+		}
+		datas.splice(0,1)// 删除第一个
+		return datas
+	}
+	else{
+		for(var x=6;x>=0;x--){
+			const start = new Date(todey)
+			start.setTime(start.getTime() - 3600 * 1000 * 24 * (x));
+			datas.push(formatDate(start,'YYYY-mm-dd  WWW'))
+		}
+		return datas
+	}
+	
+}
+
+/**
+ * 
+ * @param param 获取周列表
+ * @param format  当前周
+ * @returns 
+ */
+export function getgetWeeks(){
+	// const datas=[];
+	for(var x=7;x>0;x--){
+		const start2 = new Date();
+		start2.setTime(start2.getTime() + 3600 * 1000 * 24 * (x*7));
+		const weeks=formatDate(start2,'YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ')
+		console.log(weeks)
+	}
+	for(var x=0;x<7;x++){
+		const start2 = new Date();
+		start2.setTime(start2.getTime() - 3600 * 1000 * 24 * (x*7));
+		const weeks=formatDate(start2,'YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ')
+		console.log(weeks)
+	}
+	// console.log(week)
+}
+
+/**
+ * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前`
+ * @param param 当前时间,new Date() 格式或者字符串时间格式
+ * @param format 需要转换的时间格式字符串
+ * @description param 10秒:  10 * 1000
+ * @description param 1分:   60 * 1000
+ * @description param 1小时: 60 * 60 * 1000
+ * @description param 24小时:60 * 60 * 24 * 1000
+ * @description param 3天:   60 * 60* 24 * 1000 * 3
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatPast(param: string | Date, format: string = 'YYYY-mm-dd'): string {
+	// 传入格式处理、存储转换值
+	let t: any, s: number;
+	// 获取js 时间戳
+	let time: number = new Date().getTime();
+	// 是否是对象
+	typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param);
+	// 当前时间戳 - 传入时间戳
+	time = Number.parseInt(`${time - t}`);
+	if (time < 10000) {
+		// 10秒内
+		return '刚刚';
+	} else if (time < 60000 && time >= 10000) {
+		// 超过10秒少于1分钟内
+		s = Math.floor(time / 1000);
+		return `${s}秒前`;
+	} else if (time < 3600000 && time >= 60000) {
+		// 超过1分钟少于1小时
+		s = Math.floor(time / 60000);
+		return `${s}分钟前`;
+	} else if (time < 86400000 && time >= 3600000) {
+		// 超过1小时少于24小时
+		s = Math.floor(time / 3600000);
+		return `${s}小时前`;
+	} else if (time < 259200000 && time >= 86400000) {
+		// 超过1天少于3天内
+		s = Math.floor(time / 86400000);
+		return `${s}天前`;
+	} else {
+		// 超过3天
+		let date = typeof param === 'string' || 'object' ? new Date(param) : param;
+		return formatDate(date, format);
+	}
+}
+
+/**
+ * 时间问候语
+ * @param param 当前时间,new Date() 格式
+ * @description param 调用 `formatAxis(new Date())` 输出 `上午好`
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatAxis(param: Date): string {
+	let hour: number = new Date(param).getHours();
+	if (hour < 6) return '凌晨好';
+	else if (hour < 9) return '早上好';
+	else if (hour < 12) return '上午好';
+	else if (hour < 14) return '中午好';
+	else if (hour < 17) return '下午好';
+	else if (hour < 19) return '傍晚好';
+	else if (hour < 22) return '晚上好';
+	else return '夜里好';
+}
+//计算日期之间的月数
+export function datemonth(date1,date2){
+    // 拆分年月日
+    date1 = date1.split('-');
+    // 得到月数
+    // date1 = parseInt(date1[0]) * 12 + parseInt(date1[1]);
+    // 拆分年月日
+    date2 = date2.split('-');
+    // 得到月数
+    // date2 = parseInt(date2[0]) * 12 + parseInt(date2[1]);
+	console.log(date1,date2)
+    var m = Math.abs(parseInt(date1[0]) - parseInt(date2[0]));
+	var y=(parseInt(date1[1]) - parseInt(date2[1]))
+	if(y<0){
+		m=m-1
+		y=12+y
+	}
+    return m+'年'+y+'月';
+}
+//getDate('yyyy-MM-dd')
+export function getDate(fmt) {
+	let date = new Date()
+	var o = {
+	  "M+": date.getMonth() + 1, //月份 
+	  "d+": date.getDate(), //日 
+	  "H+": date.getHours(), //小时 
+	  "m+": date.getMinutes(), //分 
+	  "s+": date.getSeconds(), //秒 
+	  "q+": Math.floor((date.getMonth() + 3) / 3), //季度 
+	  "S": date.getMilliseconds() //毫秒 
+	};
+	if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
+	for (var k in o)
+	  if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+	return fmt;
+  }
+  export function GetDateDiff(startDiffTime:string) {  
+    //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式   
+    return  startDiffTime.replace(/\-/g, "/");  
+};  
+// 计算时间间隔
+export function jgTime(data1:string,data2:string):number{
+    // 获取两个日期的毫秒数
+    var milliseconds1 = new Date(data1).getTime();
+    var milliseconds2 = new Date(data2).getTime();
+    // 计算两个日期的差值(毫秒数差)
+    var differenceInMilliseconds = milliseconds2 - milliseconds1;
+    var differenceInSeconds = Math.floor(differenceInMilliseconds / 1000);
+	var differenceInSeconds2=Math.floor(differenceInSeconds / 60);
+    return differenceInSeconds2
+}
+// 计算现在间隔
+export function jgTime2(data1:string,data2:string):number{
+    // 获取两个日期的毫秒数
+    var milliseconds1 = new Date(data1).getTime();
+    var milliseconds2 = new Date().getTime();
+	// 总分数
+	const x= jgTime(data1,data2)
+    // 计算两个日期的差值(毫秒数差)
+    var differenceInMilliseconds = milliseconds2 - milliseconds1;
+    var differenceInSeconds = Math.floor(differenceInMilliseconds / 1000);
+	var differenceInSeconds2=Math.floor(differenceInSeconds / 60);
+	const re=(differenceInSeconds2/x)*100
+    return re
+}
+export function jgTime3(data1:Date,):number{
+
+    // 获取两个日期的毫秒数
+    var milliseconds1 = data1.getTime();
+    var milliseconds2 = new Date().getTime();
+	console.log(milliseconds1,milliseconds2)
+    // 计算两个日期的差值(毫秒数差)
+    var differenceInMilliseconds = milliseconds2 - milliseconds1;
+    var differenceInSeconds = Math.floor(differenceInMilliseconds / 1000);
+	console.log(differenceInSeconds)
+    return differenceInSeconds
+}
+// 计算时间间隔
+export function jgTime4(data1:number):string{
+    // 获取两个日期的毫秒数
+	// 转换为分钟并取整数得到mm
+	var minutes = Math.floor(data1  % 60);
+	// 转换为小时并取整数得到hh
+	var hours = Math.floor(data1/60);
+     // 格式化输出
+   return hours + ':' + (minutes < 10 ? '0' + minutes : minutes);
+
+}
+// 计算时间间隔
+export function jgTime5(data1:string,data2:string):string{
+    // 获取两个日期的毫秒数
+    var milliseconds1 = new Date(data1).getTime();
+	var milliseconds2 = new Date(data2).getTime();
+    // 计算两个日期的差值(毫秒数差)
+    var interval = milliseconds2 - milliseconds1;
+	// 转换为秒并取余数得到ss
+	var seconds = Math.floor((interval / 1000) % 60);
+	// 转换为分钟并取整数得到mm
+	var minutes = Math.floor((interval / (1000 * 60)) % 60);
+	// 转换为小时并取整数得到hh
+	var hours = Math.floor(interval / (1000 * 60 * 60));
+     // 格式化输出
+   return hours + ':' + (minutes < 10 ? '0' + minutes : minutes);
+
+}
\ No newline at end of file
diff --git a/src/views/Home.vue b/src/views/Home.vue
new file mode 100644
index 0000000..7b0755d
--- /dev/null
+++ b/src/views/Home.vue
@@ -0,0 +1,1293 @@
+<template>
+  <div
+    class="divice"
+    :class="{ blink: isbaioji }"
+    :style="{ borderColor: background }"
+  >
+    <div
+      v-if="deviceData.患者姓名 !== '' && !xiaoduzhuangti"
+      style="height: 100%"
+    >
+      <el-row
+        v-if="deviceData.患者姓名 !== ''"
+        @click="showgaojing"
+        :style="{ backgroundColor: background }"
+        :class="{ blink2: isbaioji }"
+        style="
+          font-weight: 900;
+          color: #ffffff;
+          width: 100%;
+          height: 20%;
+          line-height: 100%;
+          padding: 5px;
+          position: relative;
+        "
+      >
+        <span
+          class="grid-container"
+          style="font-size: 300%; height: 100%"
+          v-if="deviceData.设备名称 !== null"
+          >{{ deviceData.设备名称 }}
+        </span>
+        <span
+          class="grid-container" @click="initTupiao"
+          style="margin-left: 5%; font-size: 350%; height: 100%"
+          >{{ deviceData.患者姓名 }}
+        </span>
+
+        <span
+          class="grid-container"
+          v-if="deviceData.年龄 !== null"
+          style="margin-left: 5%; font-size: 300%; height: 100%"
+          >{{ deviceData.年龄 }}岁</span
+        >
+        <span
+          class="grid-container"
+          style="margin-left: 5%; font-size: 300%; height: 100%"
+          >{{ deviceData.性别 }}</span
+        >
+        <div
+          style="
+            position: absolute;
+            top: 0;
+            right: 0;
+            display: grid;
+            padding: 5px;
+            font-size: 300%;
+          "
+        >
+          <span
+            v-if="
+              deviceData.iot_跨膜压 >= 200 && Number(deviceData.透析状态) === 2
+            "
+            style="color: #303133"
+          >
+            TMP↑
+          </span>
+          <span
+            v-if="
+              deviceData.iot_跨膜压 < 0 && Number(deviceData.透析状态) === 2
+            "
+            style="color: #303133"
+          >
+            TMP↓
+          </span>
+          <span
+            v-if="
+              deviceData.监测血压是否低于百分之30 &&
+              Number(deviceData.透析状态) === 2
+            "
+            style="color: #303133"
+          >
+            BP↓
+          </span>
+          <span
+            v-if="
+              deviceData.监测血压是否高于百分之30 &&
+              Number(deviceData.透析状态) === 2
+            "
+            style="color: #303133"
+          >
+            BP↑
+          </span>
+        </div>
+      </el-row>
+      <el-row
+        v-if="deviceData.患者姓名 !== ''"
+        :style="{ backgroundColor: textcolor }"
+        style="padding-right: 2px; height: 60%"
+      >
+        <el-col :span="12" style="height: 100%">
+          <div style="height: 100%">
+            <el-row style="padding: 5% 0px 0px 20px; height: 100%">
+              <el-col :span="10" style="height: 100%">
+                <div
+                  :style="{ backgroundImage: `url(${deviceData.患者头像})` }"
+                  style="
+                    background-size: 100% 100%;
+                    border-radius: 5px;
+                    margin-bottom: 1%;
+                    height: 100%;
+                    width: 100%;
+                  "
+                ></div>
+              </el-col>
+              <el-col
+                :span="14"
+                style="
+                  padding-left: 5px;
+                  height: 100%;
+                  font-weight: 700;
+                  font-size: 300%;
+                "
+              >
+                <el-row style="height: 20%">
+                  <el-col
+                    class="grid-container"
+                    style="height: 100%"
+                    :span="12"
+                    :style="{
+                      color: deviceData.透析方案 === 'HDF' ? '#E6A23C' : '',
+                    }"
+                  >
+                    {{ deviceData.透析方案 }}
+                  </el-col>
+                  <el-col
+                    :span="12"
+                    class="grid-container"
+                    style="
+                      text-align: right;
+                      font-weight: 800;
+                      color: #70a3dd;
+                      white-space: nowrap;
+                      height: 100%;
+                    "
+                  >
+                    {{ txztText }}
+                  </el-col>
+                </el-row>
+                <div style="height: 20%">
+                  <template v-if="Number(deviceData.透析状态) >= 2">
+                    <div class="grid-container" style="height: 100%">
+                      <div>
+                        <span
+                          v-if="deviceData.iot_静脉压"
+                          style="color: #409eff"
+                          >{{ deviceData.iot_静脉压 }}/</span
+                        ><span
+                          v-if="deviceData.iot_跨膜压"
+                          :style="{
+                            color: deviceData.iot_跨膜压 > 200 ? 'red' : '',
+                          }"
+                          >{{ deviceData.iot_跨膜压 }}</span
+                        >
+                      </div>
+                    </div>
+                  </template>
+                </div>
+                <div style="height: 20%">
+                  <span v-if="Number(deviceData.透析状态) >= 2">
+                    <span style="color: #303133">{{
+                      Number(deviceData.iot_当前脱水量).toFixed(1)
+                    }}</span
+                    >/<span style="font-size: 90%">{{
+                      Number(deviceData.iot_脱水目标量).toFixed(1)
+                    }}</span
+                    ><span style="font-size: 80%"
+                      >({{ deviceData.iot_脱水速率 }})</span
+                    >
+                  </span>
+                  <span v-if="Number(deviceData.透析状态) == 1">
+                    <span style="color: #303133">{{
+                      Number(deviceData.iot_当前脱水量).toFixed(1)
+                    }}</span
+                    >/<span style="font-size: 90%">{{
+                      Number(deviceData.处方脱水量).toFixed(1)
+                    }}</span>
+                  </span>
+                </div>
+                <div style="height: 10%">
+                  <el-progress
+                    :text-inside="true"
+                    :stroke-width="26"
+                    :percentage="70"
+                  />
+                </div>
+                <div style="height: 20%">
+                  <span v-if="Number(deviceData.透析状态) >= 1">
+                    <span style="color: #303133">{{
+                      jgTime4(deviceData.iot_透析时间)
+                    }}</span
+                    >/<span style="color: #606266"
+                      >{{ deviceData.透析处方的时长_小时 }}:{{
+                        deviceData.透析处方的时长_分钟
+                      }}</span
+                    >
+                  </span>
+                </div>
+                <div style="height: 10%">
+                  <el-progress
+                    :text-inside="true"
+                    :stroke-width="26"
+                    :percentage="80"
+                    status="success"
+                  />
+                </div>
+              </el-col>
+            </el-row>
+          </div>
+        </el-col>
+        <el-col :span="12">
+          <div
+            v-if="Number(deviceData.透析状态) > 1"
+            :ref="'echartsDiv' + deviceData.设备编号"
+            style="height: 97%"
+          ></div>
+          <div
+            v-if="Number(deviceData.透析状态) === 1"
+            style="text-align: right; height: 100%"
+          >
+            <div
+              class="container"
+              style="
+                height: 25%;
+                font-weight: 600;
+                color: #909399;
+                font-size: 80%;
+              "
+            >
+              CW:<span
+                style="
+                  font-weight: 800;
+                  font-size: 130%;
+                  color: #303133;
+                  white-space: nowrap;
+                "
+                >{{ Number(deviceData.透前称重).toFixed(1) }}</span
+              >
+            </div>
+            <div
+              class="container"
+              style="
+                height: 25%;
+                font-weight: 600;
+                color: #909399;
+                font-size: 80%;
+              "
+            >
+              D<span
+                style="
+                  font-weight: 800;
+                  font-size: 130%;
+                  color: #303133;
+                  white-space: nowrap;
+                "
+                >{{ Number(deviceData.干体重).toFixed(1) }}</span
+              >L<span
+                style="
+                  font-weight: 800;
+                  font-size: 130%;
+                  color: #303133;
+                  white-space: nowrap;
+                "
+                >{{ Number(deviceData.上次透后称重) }}</span
+              >
+            </div>
+            <div
+              :style="{ color: deviceData.体重增长率 >= 5 ? 'red' : '#303133' }"
+              style="height: 25%; font-weight: 600; font-size: 80%"
+            >
+              <span
+                style="font-weight: 800; font-size: 130%; white-space: nowrap"
+              >
+                <template
+                  v-if="Number(deviceData.透前称重 - deviceData.干体重) > 0"
+                  >+</template
+                >{{
+                  Number(deviceData.透前称重 - deviceData.干体重).toFixed(1)
+                }}
+              </span>
+              <span>({{ deviceData.体重增长率 }}%)</span>
+            </div>
+            <div
+              class="container"
+              style="
+                font-weight: 600;
+                height: 25%;
+                color: #909399;
+                font-size: 80%;
+                margin-left: -20px;
+              "
+            >
+              <span
+                v-if="deviceData.透前血压_伸缩压"
+                :style="{ color: tqXygj ? 'red' : '#303133' }"
+                style="font-weight: 800; font-size: 130%; white-space: nowrap"
+                >{{ deviceData.透前血压_伸缩压 }}/</span
+              >
+              <span
+                :style="{ color: tqXygj ? 'red' : '#303133' }"
+                style="font-weight: 800; font-size: 130%; white-space: nowrap"
+                >{{ deviceData.透前血压_舒张压 }}</span
+              >
+              <span
+                v-if="deviceData.透前脉搏"
+                :style="{ color: tqMbgj ? 'red' : '#303133' }"
+                style="font-weight: 800; font-size: 130%; white-space: nowrap"
+                >,{{ deviceData.透前脉搏 }}</span
+              >
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row style="height: 20%;background-color: #ffffff; line-height: 50px;">
+        <!-- <div style="font-size: 200%;height: 100%;text-align: center; color: #909399;" class="grid-container">
+            
+            <el-icon><ChatDotSquare /></el-icon>暂无通知
+
+        </div> -->
+        <div style="color: cornflowerblue;height: 20%; width: 100%;" class="grid-container">
+            <div style="text-align: center;width: 100%; color: #909399;">
+                2025-01-11 12:23:45
+            </div>
+            
+        </div>
+        <div style="font-size: 300%; color: cornflowerblue;height: 80%; width: 100%;" class="grid-container">
+            
+            <div style="text-align: center;width: 100%;">
+               高压:118,低压:88, 心率:89
+            </div>
+
+        </div>
+         <!-- <div style="font-size: 300%; color: red;height: 100%;" class="grid-container">
+            
+            患者掉压验证请注意!
+
+        </div> -->
+        <!-- <el-alert style="font-size: 300%" title="处方已经确认。医嘱已执行" type="success"  show-icon />
+        <el-alert title="患者治疗过程中掉压验证,请注意!" type="warning"  show-icon /> -->
+
+    </el-row>
+    </div>
+    <div
+      v-else
+      style="height: 100%; border: #409eff 1px solid"
+      :class="{ blink2: noBaoji !== '' }"
+    >
+      <el-row
+        style="
+          font-weight: 900;
+          font-size: 300%;
+          color: #3b3737;
+          width: 100%;
+          height: 20%;
+          border: #3b3737 1px solid;
+        "
+      >
+        <el-row
+          v-if="noBaoji === ''"
+          :style="{ backgroundColor: zhuangtaiColor }"
+          style="
+            color: #ffffff;
+            width: 100%;
+            height: 100%;
+            white-space: nowrap;
+            overflow: hidden;
+          "
+        >
+          <div class="grid-container" style="height: 100%">
+            {{ deviceData.设备名称 }} {{ zhuangtaiStr }}
+          </div>
+        </el-row>
+
+        <el-row v-else style="width: 100%">
+          <el-col
+            :span="24"
+            style="
+              color: #ffffff;
+              width: 100%;
+              white-space: nowrap;
+              overflow: hidden;
+            "
+          >
+            {{ deviceData.设备名称 }} {{ noBaoji }}
+          </el-col>
+        </el-row>
+      </el-row>
+      <el-row
+        style="padding-right: 2px; height: 80%; background-color: #ffffff"
+      >
+        <el-col :span="15" style="height: 100%">
+          <div style="height: 100%">
+            <el-row style="padding: 0px 0px 0px 0px; height: 100%">
+              <el-col
+                :span="10"
+                :style="{ backgroundImage: `url(${TQS88})` }"
+                style="
+                  background-size: 100% 100%;
+                  border-radius: 5px;
+                  margin-top: 2%;
+                  margin-bottom: 1%;
+                "
+              >
+                &nbsp;
+              </el-col>
+              <el-col
+                v-if="noBaoji !== ''"
+                :span="14"
+                style="
+                  padding-left: 5px;
+                  height: 100%;
+                  font-weight: 500;
+                  font-size: 100%;
+                "
+              >
+                <div
+                  class="grid-container"
+                  style="height: 33%; line-height: 100%; color: red"
+                >
+                  <div class="centered-text">温度:{{ wd }}</div>
+                </div>
+
+                <div class="grid-container" style="height: 33%; color: #409eff">
+                  <div class="centered-text">流速:{{ ls }}</div>
+                </div>
+                <div class="grid-container" style="height: 33%; color: #e6a23c">
+                  <div class="centered-text">Cond:{{ ddd }}</div>
+                </div>
+              </el-col>
+            </el-row>
+          </div>
+        </el-col>
+        <el-col :span="9" v-if="noBaoji !== ''">
+          <!-- 历史状态画图 -->
+          <div
+            :ref="'echartsDivwd' + deviceData.设备编号"
+            style="height: 33%"
+          ></div>
+          <div
+            :ref="'echartsDivls' + deviceData.设备编号"
+            style="height: 33%"
+          ></div>
+          <div
+            :ref="'echartsDivddd' + deviceData.设备编号"
+            style="height: 33%"
+          ></div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+  <script lang="ts" setup>
+import TQS88 from "../img/TQS88.png";
+import maibo from '../img/maibo.png'
+import xueya from '../img/xueya.png'
+import { computed, getCurrentInstance, onMounted, ref, watch } from "vue";
+import * as echarts from "echarts";
+import { jgTime4 } from "../utils/formatTime";
+const { proxy } = getCurrentInstance() as any;
+// 在需要使用的组件中引入
+import { ChatDotSquare } from '@element-plus/icons-vue';
+const deviceData = ref({
+  iot_传输时间: "2025-01-10 19:15:24",
+  iot_当前脱水量: 2.04,
+  iot_脱水目标量: 3.3,
+  iot_脱水速率: 0.82,
+  iot_跨膜压: 40,
+  iot_透析时间: 149,
+  iot_静脉压: 86,
+  上次透后称重: 72.5,
+  体重增加: 3.1,
+  体重增长率: 4.5,
+  分区编号: "109195231931115eZmM",
+  处方脱水量: 3.3,
+  实时脱水量: 1.65,
+  干体重: 69.5,
+  年龄: 59,
+  性别: "男",
+  患者头像:
+    "http://dhimg.leon056.com/hemodialysis/face/PAT9090070832211PyVq/face-IMG_20240413_112705.jpg-202404131127536157.jpg",
+  患者姓名: "李金山",
+  患者编号: "PAT9090070832211PyVq",
+  患者透析号: "0207",
+  最后一条血压: 116,
+  此次脱水量: 6.1,
+  监测血压是否低于百分之30: false,
+  监测血压是否高于百分之30: false,
+  监测记录列表: [
+    {
+      伸缩压: "152",
+      脉搏: "66",
+      舒张压: "76",
+    },
+    {
+      伸缩压: "133",
+      脉搏: "67",
+      舒张压: "72",
+    },
+    {
+      伸缩压: "116",
+      脉搏: "79",
+      舒张压: "63",
+    },
+  ],
+  第一条血压: 152,
+  脉搏列表: "66,67,79",
+  血压低值列表: "76,72,63",
+  血压高值列表: "152,133,116",
+  设备分区类型: 0,
+  设备号: "23",
+  设备名称: "23",
+  设备序列号: "B97AP002",
+  设备状态列表: [
+    {
+      是否为警告标记: 0,
+      状态名称: "待机",
+      状态类型: "待机",
+      状态颜色: "#13CE66",
+    },
+  ],
+  设备编号: "DEVICE9195233509924hOHL",
+  超滤速度过快: null,
+  跨膜压列表: "2753,33,37",
+  跨膜压是否大于200: false,
+  透前称重: 75.6,
+  透前脉搏: 77,
+  透前血压_伸缩压: 136,
+  透前血压_舒张压: 57,
+  透析单编号: "9347151058555cAjJ",
+  透析器: "B-17AHF",
+  透析处方的时长: 4,
+  透析处方的时长_分钟: "00",
+  透析处方的时长_小时: "4",
+  透析开始时间: "2025-01-10 16:44:00",
+  透析方案: "HD",
+  透析状态: "2.0",
+  透析结束时间: "2025-01-10 20:44:00",
+  设备变化: "1736508117033DEV",
+  属性历史列表: [
+    {
+      属性列表: [
+        {
+          identifier: "D",
+          identifierText: "血液流速",
+          time2: 1736507724242,
+          time: 1736507724242,
+          finalText: "00240",
+          isShow: 1,
+        },
+        {
+          identifier: "F",
+          identifierText: "透析液温度",
+          time2: 1736507724242,
+          time: 1736507724242,
+          finalText: "036.4",
+          isShow: 1,
+        },
+        {
+          identifier: "G",
+          identifierText: "透析液电导度",
+          time2: 1736507724242,
+          time: 1736507724242,
+          finalText: "013.8",
+          isShow: 1,
+        },
+      ],
+      查询时间: "2025-01-10 19:17:57",
+    },
+    {
+      属性列表: [
+        {
+          identifier: "D",
+          identifierText: "血液流速",
+          time2: 1736507538186,
+          time: 1736507538186,
+          finalText: "00240",
+          isShow: 1,
+        },
+        {
+          identifier: "F",
+          identifierText: "透析液温度",
+          time2: 1736507538186,
+          time: 1736507538186,
+          finalText: "036.5",
+          isShow: 1,
+        },
+        {
+          identifier: "G",
+          identifierText: "透析液电导度",
+          time2: 1736507538186,
+          time: 1736507538186,
+          finalText: "013.7",
+          isShow: 1,
+        },
+      ],
+      查询时间: "2025-01-10 19:12:59",
+    },
+    {
+      属性列表: [
+        {
+          identifier: "D",
+          identifierText: "血液流速",
+          time2: 1736507290239,
+          time: 1736507290239,
+          finalText: "00240",
+          isShow: 1,
+        },
+        {
+          identifier: "F",
+          identifierText: "透析液温度",
+          time2: 1736507290239,
+          time: 1736507290239,
+          finalText: "036.5",
+          isShow: 1,
+        },
+        {
+          identifier: "G",
+          identifierText: "透析液电导度",
+          time2: 1736507290239,
+          time: 1736507290239,
+          finalText: "013.8",
+          isShow: 1,
+        },
+      ],
+      查询时间: "2025-01-10 19:08:00",
+    },
+  ],
+});
+// 告警提示
+const textbaojing = ref("");
+const iscomfig = ref(false);
+const centerDialogVisible = ref(false);
+const background = ref("");
+const txztText = ref("");
+const textcolor = ref("");
+const wd = ref("");
+const ls = ref("");
+const ddd = ref("");
+const txzt: any = computed(() => {
+  return deviceData.value.透析状态;
+});
+// 是否是消毒类型和待机
+const xiaoduzhuangti = computed(() => {
+  return false;
+});
+// 状态颜色
+const zhuangtaiColor = computed(() => {
+  const list = deviceData.value.设备状态列表;
+  let colorStr = "#13CE66";
+  if (list && list.length > 0) {
+    // 默认显示第一状态颜色
+    // colorStr=list[0].状态颜色
+    // 消毒状态优先级高
+    const x = list.findIndex((e) => {
+      return e.状态类型 === "透析机消毒" || e.状态类型 === "在线";
+    });
+    if (x !== 0) {
+      colorStr = list[0].状态颜色;
+    }
+  }
+  return colorStr;
+});
+// 没有报警就返回空字符传
+const noBaoji = computed(() => {
+  const list = deviceData.value.设备状态列表;
+  let zhuantaiStr = "";
+  let jinggaoStr = "";
+  if (list && list.length > 0) {
+    list.forEach((el: any) => {
+      if (el.是否为警告标记 === 1) {
+        if (jinggaoStr !== "") {
+          jinggaoStr += "/" + el.状态名称;
+        } else {
+          jinggaoStr += el.状态名称;
+        }
+      } else {
+        zhuantaiStr += el.状态名称;
+      }
+    });
+  }
+  return jinggaoStr;
+});
+// 状态返回
+const zhuangtaiStr = computed(() => {
+  const list = deviceData.value.设备状态列表;
+  let zhuantaiStr = "";
+  if (list && list.length > 0) {
+    list.forEach((el: any) => {
+      if (
+        el.是否为警告标记 === 1 ||
+        el.状态类型 === "透析机消毒" ||
+        el.状态类型 === "在线"
+      ) {
+        //去掉待机和消毒状态显示
+      } else {
+        if (zhuantaiStr !== "") {
+          zhuantaiStr += "/" + el.状态名称;
+        } else {
+          zhuantaiStr += el.状态名称;
+        }
+      }
+    });
+  }
+
+  return zhuantaiStr;
+});
+const isbaioji = computed(() => {
+  const list = deviceData.value.设备状态列表;
+  if (
+    (deviceData.value.监测血压是否低于百分之30 ||
+    deviceData.value.跨膜压是否大于200 ||
+    deviceData.value.监测血压是否高于百分之30) &&
+    deviceData.value.透析状态 === "2.0"
+  ) {
+    return true;
+  } else {
+    return false;
+  }
+});
+// 透前血压告警
+const tqXygj = computed(() => {
+  if (deviceData.value.透前血压_伸缩压 > 160 || deviceData.value.透前血压_伸缩压 < 90) {
+    return true;
+  } else {
+    return false;
+  }
+});
+// 透前脉搏告警
+const tqMbgj = computed(() => {
+  if (deviceData.value.透前脉搏 > 90) {
+    return true;
+  } else {
+    return false;
+  }
+});
+// 设置内联样式对象
+const backgroundStyle = {
+  backgroundImage: `url(${TQS88})`,
+  backgroundSize: "cover", // 根据需要调整
+  backgroundPosition: "center", // 根据需要调整
+};
+watch(
+  () => txzt.value,
+  () => {
+    if (txzt.value === "0.0") {
+      txztText.value = "未签";
+      textcolor.value = "#FAFAFA";
+      background.value = "#606266";
+    } else if (txzt.value === "1.0") {
+      // 蓝色
+      textcolor.value = "#faecd8";
+      background.value = "#E6A23C";
+      txztText.value = "已签";
+    } else if (txzt.value === "2.0") {
+      // 绿色
+      // textcolor.value = '#D9F5E2';
+      // background.value='#67C23A'
+      textcolor.value = "#ECF5FF";
+      background.value = "#409EFF";
+      txztText.value = "透中";
+    } else if (txzt.value === "2.5") {
+      //
+      textcolor.value = "#fde2e2";
+      background.value = "#fab6b6";
+      txztText.value = "结束";
+    } else if (txzt.value === "3.0") {
+      // 已经结束
+      textcolor.value = "#FFECD0";
+      background.value = "#E6A23C";
+      txztText.value = "检查";
+    } else if (txzt.value === "4.0") {
+      // yij
+      textcolor.value = "#FFECD0";
+      background.value = "#E6A23C";
+      txztText.value = "归档";
+    }
+  },
+  {
+    immediate: true,
+    deep: true,
+  }
+);
+onMounted(() => {});
+watch(
+  () => deviceData.value.设备变化,
+  () => {
+    // console.log(device.value.设备名称,'子组件变量')
+    setTimeout(() => {
+      if (!xiaoduzhuangti.value) {
+        initTupiao();
+      }
+    }, 500);
+  }
+);
+
+const showgaojing = () => {
+  if (deviceData.value.监测血压是否低于百分之30) {
+    centerDialogVisible.value = true;
+    iscomfig.value = true;
+    textbaojing.value = `${deviceData.value.设备名称}床,${deviceData.value.患者姓名} 监测血压下降至上机血压30%了,请及时处理`;
+  }
+  if (deviceData.value.跨膜压是否大于200) {
+    centerDialogVisible.value = true;
+    iscomfig.value = true;
+    textbaojing.value = `${deviceData.value.设备名称}床,${deviceData.value.患者姓名} 跨膜压过高请及时处理`;
+  }
+};
+const initTupiao = () => {
+  if (deviceData.value.患者姓名 !== "") {
+    const seriesData = [
+      {
+        name: "",
+        type: "line",
+        symbol: "triangle",
+        symbolSize: 10,
+        symbolRotate: 180,
+        data: [],
+        lineStyle: {
+          width: 5, // 设置线条宽度为5
+          color: "red",
+        },
+        itemStyle: {
+          borderWidth: 3,
+          borderColor: "red",
+          color: "red",
+        },
+        markPoint: {
+          data: [],
+        },
+        markLine: {
+          symbol: "none",
+          lineStyle: { color: "#409EFF", width: 3 },
+          data: [
+            { name: "y90", yAxis: 90, label: { show: false }, symbol: "none" },
+          ],
+        },
+      },
+
+      {
+        name: "",
+        type: "line",
+        symbol: "triangle",
+        symbolSize: 10,
+        data: [],
+        lineStyle: {
+          color: "#409EFF",
+          width: 5, // 设置线条宽度为5
+        },
+        itemStyle: {
+          borderWidth: 3,
+          borderColor: "#409EFF",
+          color: "#409EFF",
+        },
+        markPoint: {
+          data: [],
+        },
+        markLine: {
+          symbol: "none",
+          lineStyle: { color: "#F56C6C", width: 3 },
+          data: [
+            {
+              name: "y140",
+              yAxis: 140,
+              label: { show: false },
+              symbol: "none",
+            },
+          ],
+        },
+      },
+      {
+        name: "",
+        type: "line",
+        symbolSize: 10,
+        data: [],
+        lineStyle: {
+          color: "#D940FF",
+          width: 5, // 设置线条宽度为5
+        },
+        markPoint: {
+          data: [],
+        },
+      },
+    ];
+    const xAxisData = [];
+    if (Number(deviceData.value.透析状态) >= 2) {
+      // alert(111)
+      deviceData.value.监测记录列表.forEach((e, index) => {
+        seriesData[0].data.push(e.伸缩压);
+        seriesData[1].data.push(e.舒张压);
+        seriesData[2].data.push(e.脉搏);
+        xAxisData.push(index);
+        if (index == 0) {
+          let y = Number(e.伸缩压) + 20;
+          let y2 = Number(e.舒张压) + 20;
+          seriesData[0].markPoint.data.push({
+            name: "上机血压",
+            value: e.伸缩压,
+            xAxis: 0,
+            yAxis: e.伸缩压,
+            symbolSize: 0,
+            symbolOffset: [25, -15],
+            label: { fontSize: 20, color: "red" },
+          });
+          seriesData[1].markPoint.data.push({
+            name: "上机血压",
+            value: e.舒张压,
+            xAxis: 0,
+            yAxis: e.舒张压,
+            symbolSize: 0,
+            symbolOffset: [15, 15],
+            label: { fontSize: 20, color: "#409EFF" },
+          });
+          seriesData[2].markPoint.data.push({
+            name: "上机血压",
+            value: e.脉搏,
+            xAxis: 0,
+            yAxis: e.脉搏,
+            symbolSize: 0,
+            symbolOffset: [10, -10],
+            label: { fontSize: 20, color: "#D940FF" },
+          });
+        } else if (
+            deviceData.value.监测记录列表.length > 1 &&
+          index === deviceData.value.监测记录列表.length - 1
+        ) {
+          let y = Number(e.伸缩压) + 20;
+          let y2 = Number(e.舒张压) + 20;
+          seriesData[0].markPoint.data.push({
+            name: "上机血压",
+            value: e.伸缩压,
+            xAxis: index,
+            yAxis: e.伸缩压,
+            symbolSize: 0,
+            symbolOffset: [-15, -15],
+            label: { fontSize: 20, color: "red" },
+          });
+          seriesData[1].markPoint.data.push({
+            name: "上机血压",
+            value: e.舒张压,
+            xAxis: index,
+            yAxis: e.舒张压,
+            symbolSize: 0,
+            symbolOffset: [-15, 15],
+            label: { fontSize: 20, color: "#409EFF" },
+          });
+          seriesData[2].markPoint.data.push({
+            name: "上机血压",
+            value: e.脉搏,
+            xAxis: index,
+            yAxis: e.脉搏,
+            symbolSize: 0,
+            symbolOffset: [0, -10],
+            label: { fontSize: 20, color: "#D940FF" },
+          });
+        }
+      });
+      if (deviceData.value.监测记录列表.length === 1) {
+        xAxisData.push(1);
+      }
+      try {
+        const myChart = echarts.init(
+          proxy.$refs["echartsDiv" + deviceData.value.设备编号]
+        );
+        const option = {
+          backgroundColor: textcolor.value,
+          tooltip: {
+            trigger: "axis",
+          },
+          toolbox: {
+            show: false,
+          },
+          grid: {
+            left: 8,
+            top: 0,
+            bottom: 0,
+          },
+          xAxis: {
+            type: "category",
+            // 标记做右往左排列
+            boundaryGap: false,
+            data: xAxisData,
+            axisTick: {
+              show: true, // 显示 X 轴刻度
+            },
+          },
+          yAxis: {
+            name: "",
+            type: "value",
+            min: 20,
+            max: 220,
+            interval: 20, // 指定刻度间隔,
+            splitLine: {
+              show: false,
+            },
+          },
+          series: seriesData,
+        };
+        myChart.setOption(option);
+      } catch (e) {
+        console.log("图标渲染异常异常");
+      }
+    } else {
+      try {
+        const myChart = echarts.init(
+          proxy.$refs["echartsDiv" + deviceData.value.设备编号]
+        );
+
+        const option = {
+          backgroundColor: textcolor.value,
+          tooltip: {
+            trigger: "axis",
+          },
+          toolbox: {
+            show: false,
+          },
+          grid: {
+            left: 5,
+            top: 0,
+            bottom: 0,
+          },
+          xAxis: {
+            type: "category",
+            boundaryGap: false,
+            data: [1, 2, 3, 4],
+          },
+          yAxis: {
+            name: "",
+            type: "value",
+            min: 20,
+            max: 220,
+            interval: 20, // 指定刻度间隔,
+            splitLine: {
+              show: false,
+            },
+          },
+          series: [],
+        };
+        myChart.setOption(option);
+      } catch (e) {
+        console.log("异常", proxy.$refs["echartsDiv" + deviceData.value.设备编号]);
+      }
+    }
+  } else if (deviceData.value.患者姓名 === "") {
+    const tbdata1 = [];
+    const tbdata2 = [];
+    const tbdata3 = [];
+    if (deviceData.value.属性历史列表) {
+        deviceData.value.属性历史列表.forEach((e, index) => {
+        // 温度
+        const wdMode = e.属性列表.find((l) => {
+          return l.identifierText === "透析液温度";
+        });
+        if (wdMode) {
+          tbdata1.push(Number(wdMode?.finalText));
+          wd.value = Number(wdMode?.finalText);
+        }
+
+        // 血液流速
+        const xymode = e.属性列表.find((l) => {
+          return l.identifierText === "血液流速";
+        });
+        if (xymode) {
+          tbdata2.push(Number(xymode?.finalText));
+          ls.value = Number(xymode?.finalText);
+        }
+
+        // 电导度
+        const dddMode = e.属性列表.find((l) => {
+          return l.identifierText === "透析液电导度";
+        });
+        if (dddMode) {
+          tbdata3.push(Number(dddMode?.finalText));
+          ddd.value = Number(dddMode?.finalText);
+        }
+      });
+    }
+    try {
+      const myChart1 = echarts.init(
+        proxy.$refs["echartsDivwd" + deviceData.value.设备编号]
+      );
+      const myChart2 = echarts.init(
+        proxy.$refs["echartsDivls" + deviceData.value.设备编号]
+      );
+      const myChart3 = echarts.init(
+        proxy.$refs["echartsDivddd" + deviceData.value.设备编号]
+      );
+      const option1 = {
+        backgroundColor: textcolor.value,
+        tooltip: {
+          trigger: "axis",
+        },
+        toolbox: {
+          show: false,
+        },
+        grid: {
+          left: 8,
+          top: 30,
+          bottom: 0,
+        },
+        xAxis: {
+          show: false, // 隐藏X轴
+          type: "category",
+          // 标记做右往左排列
+          boundaryGap: false,
+          data: [1, 2, 3],
+          axisTick: {
+            show: false, // 显示 X 轴刻度
+          },
+        },
+        yAxis: {
+          type: "value",
+          splitLine: {
+            show: false,
+          },
+        },
+        series: [
+          {
+            data: tbdata1,
+            type: "line",
+            lineStyle: {
+              width: 10, // 设置线条宽度为5
+              color: "red",
+            },
+          },
+        ],
+      };
+      const option2 = {
+        backgroundColor: textcolor.value,
+        tooltip: {
+          trigger: "axis",
+        },
+        toolbox: {
+          show: false,
+        },
+        grid: {
+          left: 8,
+          top: 20,
+          bottom: 0,
+        },
+        xAxis: {
+          show: false, // 隐藏X轴
+          type: "category",
+          // 标记做右往左排列
+          boundaryGap: false,
+          data: [1, 2, 3],
+          axisTick: {
+            show: false, // 显示 X 轴刻度
+          },
+        },
+        yAxis: {
+          type: "value",
+          min: -10,
+          splitLine: {
+            show: false,
+          },
+        },
+        series: [
+          {
+            data: tbdata2,
+            type: "line",
+            lineStyle: {
+              width: 10, // 设置线条宽度为5
+              color: "#409EFF",
+            },
+          },
+        ],
+      };
+      const option3 = {
+        backgroundColor: textcolor.value,
+        tooltip: {
+          trigger: "axis",
+        },
+        toolbox: {
+          show: false,
+        },
+        grid: {
+          left: 8,
+          top: 10,
+          bottom: 0,
+        },
+        xAxis: {
+          show: false, // 隐藏X轴
+          type: "category",
+          // 标记做右往左排列
+          boundaryGap: false,
+          data: [1, 2, 3],
+          axisTick: {
+            show: false, // 显示 X 轴刻度
+          },
+        },
+        yAxis: {
+          type: "value",
+          min: -10,
+          splitLine: {
+            show: false,
+          },
+        },
+        series: [
+          {
+            data: tbdata3,
+            type: "line",
+            lineStyle: {
+              width: 10, // 设置线条宽度为5
+              color: "#E6A23C",
+            },
+          },
+        ],
+      };
+      myChart1.setOption(option1);
+      myChart2.setOption(option2);
+      myChart3.setOption(option3);
+    } catch (e) {
+      console.log("图标渲染异常异常");
+    }
+
+    console.log(deviceData.value);
+  }
+};
+</script>
+  <style lang="less" scoped>
+.divice {
+  font-size: 100%;
+  border-radius: 4px;
+  border: solid 1px;
+  width: 100%;
+  height: 100%;
+  border: 1px solid coral;
+}
+/* 定义闪烁动画 */
+@keyframes blink {
+  0% {
+    border: 4px solid red;
+  }
+  50% {
+    border: 4px solid Transparent;
+  }
+  100% {
+    border: 4px solid red;
+    // border-bottom:8px solid red ;
+  }
+}
+
+/* 应用闪烁动画 */
+.blink {
+  // float: left; /* 让div浮动到左边 */
+  width: 100%;
+  height: 100%;
+  animation: blink 2s infinite; /* 每秒闪烁一次,无限次数 */
+
+  //   border-left:5px solid red ;
+  //   border-right:5px solid red ;
+
+  //   background: red;
+  cursor: pointer;
+  //  margin-bottom: 100%;
+}
+@keyframes blink2 {
+  0% {
+    background: red;
+  }
+  50% {
+    background: Transparent;
+  }
+  100% {
+    background: red;
+    // border-bottom:8px solid red ;
+  }
+}
+.blink2 {
+  animation: blink2 2s infinite; /* 每秒闪烁一次,无限次数 */
+  width: 100%;
+  height: 100%;
+}
+.grid-container {
+  display: grid;
+  align-items: center; /* 垂直居中 */
+  height: 100vh; /* 根据需要调整高度 */
+}
+
+.centered-text {
+  font-weight: 600;
+  /* 其他样式 */
+}
+</style>
\ No newline at end of file
diff --git a/src/views/deviceWindows.vue b/src/views/deviceWindows.vue
new file mode 100644
index 0000000..7950549
--- /dev/null
+++ b/src/views/deviceWindows.vue
@@ -0,0 +1,913 @@
+<template>
+    <div class="divice" :class="{blink:isbaioji}" :style="{borderColor: background}" >
+      <div v-if="deviceData.患者姓名 !== ''&&!xiaoduzhuangti" style="height: 100%;" >
+              <el-row v-if="deviceData.患者姓名 !== ''" @click='showgaojing'  :style="{backgroundColor: background}" :class="{blink2:isbaioji}" style="font-weight: 900;color: #FFFFFF; width: 100%; height: 20%; line-height: 100%;padding: 5px;position: relative; "> 
+                  <span class="grid-container"  style="font-size: 300%; height: 100%;" v-if="deviceData.设备名称!==null">{{deviceData.设备名称}}  </span>   
+                  <span class="grid-container" style="margin-left: 5%;font-size: 350%; height: 100%;">{{deviceData.患者姓名}} </span> 
+                  
+                  <span class="grid-container"  v-if="deviceData.年龄!==null" style="margin-left: 5%;font-size: 300%; height: 100%;">{{deviceData.年龄}}岁</span> 
+                  <span class="grid-container"  style="margin-left: 5%;font-size: 300%; height: 100%;">{{deviceData.性别}}</span>
+                 <div style="position: absolute;top: 0;right: 0;display: grid;padding: 5px; font-size: 300%;" >
+                      <span v-if="deviceData.iot_跨膜压>=200&&Number(deviceData.透析状态)===2"  style="color: #303133;">
+                          TMP↑
+                      </span>
+                      <span v-if="deviceData.iot_跨膜压<0&&Number(deviceData.透析状态)===2" style="color: #303133;">
+                          TMP↓
+                      </span>
+                      <span v-if="deviceData.监测血压是否低于百分之30&&Number(deviceData.透析状态)===2" style="color: #303133;">
+                          BP↓
+                      </span>
+                      <span v-if="deviceData.监测血压是否高于百分之30&&Number(deviceData.透析状态)===2" style="color: #303133;">
+                          BP↑
+                      </span>
+  
+                 </div>
+                  
+              </el-row>
+              <el-row  v-if="deviceData.患者姓名!==''" :style="{backgroundColor: textcolor}" style="padding-right:2px;height: 70%;">
+                  <el-col :span="12" style="height: 100%;">
+                      <div style="height:100%;">
+                          <el-row style="padding:10% 0px 0px 20px; height: 100%;">
+                              <el-col :span="10" style="height: 100%;">
+                                  <div  :style="{backgroundImage:`url(${deviceData.患者头像})`}" style="background-size:100% 100%;border-radius: 5px; margin-top: 10%;margin-bottom: 1%; height: 80%; width: 100%;"></div>
+                              </el-col>
+                              <el-col :span="14" style="padding-left: 5px; height: 100%; font-weight: 700;font-size: 300%;" >
+                                  <el-row  style="height: 25%; ">
+                                      <el-col class="grid-container"  style="height: 100%;" :span="12" :style="{color:deviceData.透析方案==='HDF'?'#E6A23C':''}">
+                                          {{deviceData.透析方案}}
+                                      </el-col>
+                                      <el-col :span="12"  class="grid-container"   style="text-align: right;font-weight: 800; color: #70A3DD;white-space: nowrap;height: 100%;">
+                                          {{txztText}}
+                                      </el-col>
+                                  </el-row>
+                                  <div  style="height: 25%;">
+                                      <template v-if="Number(deviceData.透析状态)>=2">
+                                          <div class="grid-container"  style="height: 100%;">
+                                              <div>
+                                                  <span  v-if="deviceData.iot_静脉压"  style="color: #409EFF;">{{deviceData.iot_静脉压}}/</span><span v-if="deviceData.iot_跨膜压" :style="{color:deviceData.iot_跨膜压>200?'red':''}">{{deviceData.iot_跨膜压}}</span>
+                                              </div>
+                                          </div>
+                                      </template>
+                                  </div>
+                                  <div style="height: 15%;" >
+                                      <span  v-if="Number(deviceData.透析状态)>=2">
+                                       
+                                         <span  style="color:#303133;">{{Number(deviceData.iot_当前脱水量).toFixed(1)}}</span>/<span  style="font-size: 90%">{{Number(deviceData.iot_脱水目标量).toFixed(1)}}</span><span style="font-size: 80%">({{deviceData.iot_脱水速率}})</span>  
+                                      </span>
+                                      <span v-if="Number(deviceData.透析状态)==1">
+                                          <span style="color:#303133;">{{Number(deviceData.iot_当前脱水量).toFixed(1)}}</span>/<span  style="font-size: 90%">{{Number(deviceData.处方脱水量).toFixed(1)}}</span>
+                                      </span>
+                                  </div> 
+                                  <div style="height: 10%;">
+                                      <el-progress :text-inside="true" :stroke-width="26" :percentage="70" />
+                                  </div>
+                                  <div style="height: 25%;">
+                                      <span v-if="Number(deviceData.透析状态)>=1">
+                                          <span style="color: #303133;">{{jgTime4(deviceData.iot_透析时间)}}</span>/<span style="color: #606266;">{{deviceData.透析处方的时长_小时}}:{{deviceData.透析处方的时长_分钟}}</span>
+                                   </span>
+                                  </div>
+                              </el-col>
+                          </el-row>
+                      </div>
+                  </el-col>
+                  <el-col :span="12">
+                      <div v-if="Number(deviceData.透析状态)>1"  :ref="'echartsDiv'+device.设备编号" style="height: 97%;"> 
+                      </div>
+                      <div v-if="Number(deviceData.透析状态)===1" style="text-align: right;height: 100%;">
+                          <div class="container" style="height: 25%;font-weight: 600;color: #909399; font-size: 80%; "> 
+                              CW:<span style="font-weight: 800; font-size: 130%; color: #303133;white-space: nowrap;">{{Number(deviceData.透前称重).toFixed(1)}}</span>
+                          </div>
+                          <div class="container" style="height: 25%;font-weight: 600;color: #909399; font-size: 80%; ">
+                              D<span style="font-weight: 800; font-size: 130%; color: #303133;white-space: nowrap;">{{Number(deviceData.干体重).toFixed(1)}}</span>L<span style="font-weight: 800; font-size: 130%; color: #303133;white-space: nowrap;">{{Number(deviceData.上次透后称重)}}</span>
+                          </div>
+                          <div :style="{color:deviceData.体重增长率>=5?'red':'#303133'}" style="height: 25%;font-weight: 600; font-size: 80%;">
+                              <span style="font-weight: 800; font-size: 130%; white-space: nowrap;">
+                                 <template v-if="Number(deviceData.透前称重-deviceData.干体重)>0">+</template>{{Number(deviceData.透前称重-deviceData.干体重).toFixed(1)}}
+                              </span>
+                              <span>({{deviceData.体重增长率}}%)</span>
+                          </div>
+                          <div  class="container" style="font-weight: 600;height: 25%;color: #909399; font-size: 80%;margin-left: -20px;">
+                              <span v-if="deviceData.透前血压_伸缩压"  :style="{color:tqXygj?'red':'#303133'}" style="font-weight: 800; font-size: 130%;white-space: nowrap;">{{deviceData.透前血压_伸缩压}}/</span>
+                              <span :style="{color:tqXygj?'red':'#303133'}" style="font-weight: 800; font-size: 130%;white-space: nowrap;">{{deviceData.透前血压_舒张压}}</span>
+                              <span v-if="deviceData.透前脉搏" :style="{color:tqMbgj?'red':'#303133'}" style="font-weight: 800; font-size: 130%;white-space: nowrap;">,{{deviceData.透前脉搏}}</span>
+                          </div>
+                          
+                      </div>
+                  </el-col>
+              </el-row>
+          </div>
+        <div v-else style="height: 100%; border: #409EFF 1px solid;" :class="{blink2:noBaoji!==''}">
+            <el-row  style="font-weight: 900;font-size: 300%; color: #3b3737; width: 100%; height: 20%; border: #3b3737 1px solid;">
+                <el-row v-if="noBaoji===''" :style="{backgroundColor:zhuangtaiColor}"  style="color: #FFFFFF;width: 100%; height: 100%;white-space: nowrap;overflow: hidden;">
+                  <div class="grid-container" style="height: 100%;">
+                      {{deviceData.设备名称}}  {{zhuangtaiStr}} 
+                  </div>
+                   
+                </el-row>
+  
+                <el-row v-else style="width: 100%;">  
+                    <el-col :span="24" style="color: #FFFFFF;width: 100%;white-space: nowrap;overflow: hidden;">
+                        {{deviceData.设备名称}}  {{noBaoji}} 
+                    </el-col>
+                </el-row>
+          
+                
+            </el-row>
+            <el-row   style="padding-right:2px;height: 80%; background-color: #FFFFFF">
+                <el-col :span="15" style="height: 100%;">
+                    <div style="height:100%;">
+                        <el-row style="padding:0px 0px 0px 0px; height: 100%;">
+                            <el-col :span="10" :style="{backgroundImage:`url(${TQS88})`}" style="background-size:100% 100%;border-radius: 5px; margin-top: 2%;margin-bottom: 1%;">
+                                &nbsp;
+                            </el-col>
+                            <el-col  v-if="noBaoji!==''" :span="14" style="padding-left: 5px; height: 100%; font-weight: 500;font-size:100%" >
+                                <div class="grid-container" style="height: 33%; line-height: 100%;color: red; ">
+                                    
+                                    <div class="centered-text">温度:{{wd}}</div>
+                                </div>
+                               
+                                <div class="grid-container" style="height: 33%;color: #409EFF;" >
+                                    
+                                    <div class="centered-text">流速:{{ls}}</div>
+                                </div> 
+                                <div class="grid-container" style="height: 33%;color: #E6A23C;">
+                                   
+                                   <div class="centered-text">Cond:{{ddd}}</div>
+                                </div>
+                            </el-col>
+                        </el-row>
+                    </div>
+                </el-col>
+                <el-col :span="9" v-if="noBaoji!==''">
+                    <!-- 历史状态画图 -->
+                    <div   :ref="'echartsDivwd'+device.设备编号" style="height: 33%;">
+                    </div>
+                    <div   :ref="'echartsDivls'+device.设备编号" style="height: 33%;">
+                    </div>
+                    <div   :ref="'echartsDivddd'+device.设备编号" style="height: 33%;">
+                    </div>
+                </el-col>
+            </el-row>
+        </div>
+       
+         
+    </div>
+    
+  </template>
+  <script lang="ts" setup>
+  import TQS88 from '../img/TQS88.png'
+  import {computed, getCurrentInstance, onMounted,ref,watch} from 'vue'
+  import * as echarts from 'echarts';
+  import { jgTime4 } from '../utils/formatTime';
+  const { proxy } = getCurrentInstance() as any;
+  const device = ref({
+    iot_传输时间: "2025-01-10 19:15:24",
+    iot_当前脱水量: 2.04,
+    iot_脱水目标量: 3.3,
+    iot_脱水速率: 0.82,
+    iot_跨膜压: 40,
+    iot_透析时间: 149,
+    iot_静脉压: 86,
+    上次透后称重: 72.5,
+    体重增加: 3.1,
+    体重增长率: 4.5,
+    分区编号: "109195231931115eZmM",
+    处方脱水量: 3.3,
+    实时脱水量: 1.65,
+    干体重: 69.5,
+    年龄: 59,
+    性别: "男",
+    患者头像:
+      "http://dhimg.leon056.com/hemodialysis/face/PAT9090070832211PyVq/face-IMG_20240413_112705.jpg-202404131127536157.jpg",
+    患者姓名: "李金山",
+    患者编号: "PAT9090070832211PyVq",
+    患者透析号: "0207",
+    最后一条血压: 116,
+    此次脱水量: 6.1,
+    监测血压是否低于百分之30: false,
+    监测血压是否高于百分之30: false,
+    监测记录列表: [
+      {
+        伸缩压: "152",
+        脉搏: "66",
+        舒张压: "76",
+      },
+      {
+        伸缩压: "133",
+        脉搏: "67",
+        舒张压: "72",
+      },
+      {
+        伸缩压: "116",
+        脉搏: "79",
+        舒张压: "63",
+      },
+    ],
+    第一条血压: 152,
+    脉搏列表: "66,67,79",
+    血压低值列表: "76,72,63",
+    血压高值列表: "152,133,116",
+    设备分区类型: 0,
+    设备号: "23",
+    设备名称: "23",
+    设备序列号: "B97AP002",
+    设备状态列表: [
+      {
+        是否为警告标记: 0,
+        状态名称: "待机",
+        状态类型: "待机",
+        状态颜色: "#13CE66",
+      },
+    ],
+    设备编号: "DEVICE9195233509924hOHL",
+    超滤速度过快: null,
+    跨膜压列表: "2753,33,37",
+    跨膜压是否大于200: false,
+    透前称重: 75.6,
+    透前脉搏: 77,
+    透前血压_伸缩压: 136,
+    透前血压_舒张压: 57,
+    透析单编号: "9347151058555cAjJ",
+    透析器: "B-17AHF",
+    透析处方的时长: 4,
+    透析处方的时长_分钟: "00",
+    透析处方的时长_小时: "4",
+    透析开始时间: "2025-01-10 16:44:00",
+    透析方案: "HD",
+    透析状态: "2.0",
+    透析结束时间: "2025-01-10 20:44:00",
+    设备变化: "1736508117033DEV",
+    属性历史列表: [
+      {
+        属性列表: [
+          {
+            identifier: "D",
+            identifierText: "血液流速",
+            time2: 1736507724242,
+            time: 1736507724242,
+            finalText: "00240",
+            isShow: 1,
+          },
+          {
+            identifier: "F",
+            identifierText: "透析液温度",
+            time2: 1736507724242,
+            time: 1736507724242,
+            finalText: "036.4",
+            isShow: 1,
+          },
+          {
+            identifier: "G",
+            identifierText: "透析液电导度",
+            time2: 1736507724242,
+            time: 1736507724242,
+            finalText: "013.8",
+            isShow: 1,
+          },
+        ],
+        查询时间: "2025-01-10 19:17:57",
+      },
+      {
+        属性列表: [
+          {
+            identifier: "D",
+            identifierText: "血液流速",
+            time2: 1736507538186,
+            time: 1736507538186,
+            finalText: "00240",
+            isShow: 1,
+          },
+          {
+            identifier: "F",
+            identifierText: "透析液温度",
+            time2: 1736507538186,
+            time: 1736507538186,
+            finalText: "036.5",
+            isShow: 1,
+          },
+          {
+            identifier: "G",
+            identifierText: "透析液电导度",
+            time2: 1736507538186,
+            time: 1736507538186,
+            finalText: "013.7",
+            isShow: 1,
+          },
+        ],
+        查询时间: "2025-01-10 19:12:59",
+      },
+      {
+        属性列表: [
+          {
+            identifier: "D",
+            identifierText: "血液流速",
+            time2: 1736507290239,
+            time: 1736507290239,
+            finalText: "00240",
+            isShow: 1,
+          },
+          {
+            identifier: "F",
+            identifierText: "透析液温度",
+            time2: 1736507290239,
+            time: 1736507290239,
+            finalText: "036.5",
+            isShow: 1,
+          },
+          {
+            identifier: "G",
+            identifierText: "透析液电导度",
+            time2: 1736507290239,
+            time: 1736507290239,
+            finalText: "013.8",
+            isShow: 1,
+          },
+        ],
+        查询时间: "2025-01-10 19:08:00",
+      },
+    ],
+  });
+  // 告警提示
+  const textbaojing=ref('')
+  const iscomfig=ref(false)
+  const centerDialogVisible=ref(false)
+  const background=ref('')
+  const txztText=ref('')
+  const textcolor=ref('')
+  const wd=ref('')
+  const ls=ref('')
+  const ddd=ref('')
+  const txzt: any = computed(() => {
+  return device.value.透析状态;
+  });
+  // 是否是消毒类型和待机
+  const xiaoduzhuangti=computed(()=>{
+    // const list=device.value.设备状态列表
+    // if(list&&list.length>0){
+    //    const x= list.findIndex(e=>{return e.状态类型==='透析机消毒'||e.状态类型==='待机'})
+    //    if(x>=0){
+    //     return true
+    //    }else{
+    //     return false
+    //    }
+    // }
+    return false
+  });
+  // 状态颜色 
+  const zhuangtaiColor=computed(()=>{
+    const list=device.value.设备状态列表
+    let colorStr='#13CE66'
+    if(list&&list.length>0){
+        // 默认显示第一状态颜色
+        // colorStr=list[0].状态颜色
+        // 消毒状态优先级高
+       const x= list.findIndex(e=>{return e.状态类型==='透析机消毒'||e.状态类型==='在线'})
+       if(x!==0){
+        colorStr=list[0].状态颜色
+       }
+    }
+    return colorStr
+  });
+  // 没有报警就返回空字符传
+  const noBaoji=computed(()=>{
+    const list=device.value.设备状态列表
+    let zhuantaiStr=''
+    let jinggaoStr=''
+    if(list&&list.length>0){
+        list.forEach((el:any)=>{
+            if(el.是否为警告标记===1){
+                if(jinggaoStr!==''){
+                    jinggaoStr+='/'+el.状态名称
+                }else{
+                    jinggaoStr+=el.状态名称
+                }
+            }else{
+                zhuantaiStr+=el.状态名称
+            }
+        })
+    }
+    return jinggaoStr
+  });
+  // 状态返回
+  const zhuangtaiStr=computed(()=>{
+    const list=device.value.设备状态列表
+    let zhuantaiStr=''
+    if(list&&list.length>0){
+        list.forEach((el:any)=>{
+            if(el.是否为警告标记===1||el.状态类型==='透析机消毒'||el.状态类型==='在线'){ //去掉待机和消毒状态显示
+            }else{
+                if(zhuantaiStr!==''){
+                    zhuantaiStr+='/'+el.状态名称
+                }else{
+                    zhuantaiStr+=el.状态名称
+                }
+                
+            }
+        })
+    }
+  
+    return zhuantaiStr
+  })
+  const isbaioji=computed(()=>{
+    const list=device.value.设备状态列表
+    if((device.value.监测血压是否低于百分之30||device.value.跨膜压是否大于200||device.value.监测血压是否高于百分之30)&&device.value.透析状态==='2.0'){
+        return true
+    } 
+    else{
+        return false
+    }
+  })
+  // 透前血压告警
+  const tqXygj=computed(()=>{
+    if(device.value.透前血压_伸缩压>160||device.value.透前血压_伸缩压<90){
+        return true
+    }else{
+        return false
+    }
+  })
+  // 透前脉搏告警
+  const tqMbgj=computed(()=>{
+    if(device.value.透前脉搏>90){
+        return true
+    }else{
+        return false
+    }
+  })
+  // 设置内联样式对象
+  const backgroundStyle = {
+  backgroundImage: `url(${TQS88})`,
+  backgroundSize: 'cover', // 根据需要调整
+  backgroundPosition: 'center', // 根据需要调整
+  };
+  watch(
+  () => txzt.value,
+  () => {
+    if (txzt.value === '0.0') {
+      txztText.value = '未签';
+      textcolor.value = '#FAFAFA';
+            background.value='#606266'
+    } else if (txzt.value === '1.0') {// 蓝色
+            textcolor.value = '#faecd8';
+            background.value='#E6A23C'
+      txztText.value = '已签';
+    } else if (txzt.value === '2.0') {// 绿色
+            // textcolor.value = '#D9F5E2';
+            // background.value='#67C23A'
+            textcolor.value = '#ECF5FF';
+            background.value='#409EFF'
+      txztText.value = '透中';
+    } else if (txzt.value === '2.5') { //
+            textcolor.value = '#fde2e2';
+            background.value='#fab6b6'
+      txztText.value = '结束';
+    } else if (txzt.value === '3.0') {// 已经结束
+            textcolor.value = '#FFECD0';
+            background.value='#E6A23C'
+      txztText.value = '检查';
+    } else if (txzt.value === '4.0') {// yij
+            textcolor.value = '#FFECD0';
+            background.value='#E6A23C'
+      txztText.value = '归档';
+    }
+  },
+  {
+    immediate: true,
+    deep: true,
+  }
+  );
+  onMounted(()=>{
+  })
+  watch(()=>device.value.设备变化,()=>{
+    // console.log(device.value.设备名称,'子组件变量')
+    setTimeout(()=>{
+        if(!xiaoduzhuangti.value){
+            initTupiao()
+        }
+       
+    },500)
+  })
+  
+  const showgaojing=()=>{
+   
+    if(device.value.监测血压是否低于百分之30){
+        centerDialogVisible.value=true
+        iscomfig.value=true
+        textbaojing.value=`${device.value.设备名称}床,${device.value.患者姓名} 监测血压下降至上机血压30%了,请及时处理`
+    }
+    if(device.value.跨膜压是否大于200){
+        centerDialogVisible.value=true
+        iscomfig.value=true
+        textbaojing.value=`${device.value.设备名称}床,${device.value.患者姓名} 跨膜压过高请及时处理`
+    }
+  }
+  const initTupiao=()=>{
+    if(device.value.患者姓名!==''){
+        const seriesData=[
+        {
+                name: '',
+                type: 'line',
+                symbol: "triangle",
+                symbolSize: 10,
+                symbolRotate:180,
+                data: [],
+                lineStyle: {
+                    width: 5, // 设置线条宽度为5
+                    color:'red'
+  
+                    
+                },
+                itemStyle: {
+                    borderWidth: 3,
+                    borderColor: 'red',
+                    color: 'red'
+                },
+                markPoint:{
+                        data:[]
+                    },
+                markLine:{
+                        symbol:"none",
+                        lineStyle:{color:'#409EFF',width: 3 },
+                        data:[{ name:'y90',yAxis:90,label:{show:false},symbol:"none"}]
+                    }
+                },
+                
+                
+                {
+                    name: '',
+                    type: 'line',
+                    symbol: "triangle",
+                    symbolSize: 10,
+                    data: [],
+                    lineStyle: {
+                        color:'#409EFF',
+                        width: 5 // 设置线条宽度为5
+                    },
+                    itemStyle: {
+                        borderWidth: 3,
+                        borderColor: '#409EFF',
+                        color: '#409EFF'
+                    },
+                    markPoint:{
+                        data:[]
+                    },
+                    markLine:{
+                        symbol:"none",
+                        lineStyle:{color:'#F56C6C',width: 3 },
+                        data:[{ name:'y140',yAxis:140,label:{show:false},symbol:"none"}]
+                    }
+                },
+                {
+                    name: '',
+                    type: 'line',
+                    symbolSize: 10,
+                    data: [],
+                    lineStyle: {
+                        color:'#D940FF',
+                        width: 5 // 设置线条宽度为5
+                    },
+                    markPoint:{
+                        data:[]
+                    },
+                
+                },
+        ]
+        const xAxisData=[]
+        if(Number(device.value.透析状态)>=2){
+            // alert(111)
+            device.value.监测记录列表.forEach((e,index)=>{
+                seriesData[0].data.push(e.伸缩压)
+                seriesData[1].data.push(e.舒张压)
+                seriesData[2].data.push(e.脉搏)
+                xAxisData.push(index)
+                if(index==0){
+                    let y=(Number(e.伸缩压)+20)
+                    let y2=(Number(e.舒张压)+20)
+                    seriesData[0].markPoint.data.push({ name: '上机血压', value: e.伸缩压, xAxis: 0, yAxis: e.伸缩压,symbolSize:0,symbolOffset:[25,-15],label:{fontSize:20,color:'red'}})
+                    seriesData[1].markPoint.data.push({ name: '上机血压', value: e.舒张压, xAxis: 0, yAxis: e.舒张压,symbolSize:0 ,symbolOffset:[15,15],label:{fontSize:20,color:'#409EFF'}})
+                    seriesData[2].markPoint.data.push({ name: '上机血压', value: e.脉搏, xAxis: 0, yAxis: e.脉搏,symbolSize:0 ,symbolOffset:[10,-10],label:{fontSize:20,color:'#D940FF'}})
+                }
+                else if(device.value.监测记录列表.length>1&&index===(device.value.监测记录列表.length-1)){
+                    let y=(Number(e.伸缩压)+20)
+                    let y2=(Number(e.舒张压)+20)
+                    seriesData[0].markPoint.data.push({ name: '上机血压', value: e.伸缩压, xAxis: index, yAxis: e.伸缩压,symbolSize:0,symbolOffset:[-15,-15],label:{fontSize:20,color:'red'}})
+                    seriesData[1].markPoint.data.push({ name: '上机血压', value: e.舒张压, xAxis: index, yAxis: e.舒张压,symbolSize:0 ,symbolOffset:[-15,15],label:{fontSize:20,color:'#409EFF'}})
+                    seriesData[2].markPoint.data.push({ name: '上机血压', value: e.脉搏, xAxis: index, yAxis: e.脉搏,symbolSize:0 ,symbolOffset:[0,-10],label:{fontSize:20,color:'#D940FF'}})
+                }
+            })
+            if(device.value.监测记录列表.length===1){
+                xAxisData.push(1)
+            }
+            try{
+                const myChart = echarts.init(proxy.$refs['echartsDiv'+device.value.设备编号]);
+                const option={
+                backgroundColor:textcolor.value,
+                tooltip: {
+                    trigger: 'axis'
+                },
+                toolbox: {
+                    show: false
+                },
+                grid:{
+                    left:8,
+                    top:0,
+                    bottom:0,
+                },
+                xAxis: {
+                    type: 'category',
+                    // 标记做右往左排列
+                    boundaryGap: false,
+                    data: xAxisData,
+                    axisTick: {
+                        show: true // 显示 X 轴刻度
+                    }
+                },
+                yAxis: {
+                    name: '',
+                    type: 'value',
+                    min: 20,
+                    max: 220,
+                    interval: 20, // 指定刻度间隔,
+                    splitLine: {
+                        show: false
+                    }
+                },
+                series: seriesData
+                };
+                myChart.setOption(option);
+            }catch(e){
+                console.log('图标渲染异常异常')
+            }
+        
+        }else{ 
+            try{
+                const myChart = echarts.init(proxy.$refs['echartsDiv'+device.value.设备编号]);
+        
+                const option={
+                backgroundColor:textcolor.value,
+                tooltip: {
+                    trigger: 'axis'
+                },
+                toolbox: {
+                    show: false
+                },
+                grid:{
+                    left:5,
+                    top:0,
+                    bottom:0,
+                },
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: false,
+                    data: [1,2,3,4]
+                },
+                yAxis: {
+                    name: '',
+                    type: 'value',
+                    min: 20,
+                    max: 220,
+                    interval: 20, // 指定刻度间隔,
+                    splitLine: {
+                        show: false
+                    }
+                },
+                series: []
+                };
+                myChart.setOption(option);
+            }catch(e){
+                console.log('异常',proxy.$refs['echartsDiv'+device.value.设备编号])
+            }
+        }       
+    }else if(device.value.患者姓名===''){
+        const tbdata1=[]
+        const tbdata2=[]
+        const tbdata3=[]
+        if(device.value.属性历史列表){
+            device.value.属性历史列表.forEach((e,index)=>{
+                // 温度
+                const wdMode=e.属性列表.find(l=>{return l.identifierText==='透析液温度'})
+                if(wdMode){
+                    tbdata1.push(Number(wdMode?.finalText))
+                    wd.value=Number(wdMode?.finalText)
+                }
+              
+                // 血液流速
+                const xymode=e.属性列表.find(l=>{return l.identifierText==='血液流速'})
+                if(xymode){
+                    tbdata2.push(Number(xymode?.finalText))
+                    ls.value=Number(xymode?.finalText)
+                }
+                
+                // 电导度
+                const dddMode=e.属性列表.find(l=>{return l.identifierText==='透析液电导度'})
+                if(dddMode){
+                    tbdata3.push(Number(dddMode?.finalText))
+                    ddd.value=Number(dddMode?.finalText)
+                }
+            })
+        }
+        try{
+            const myChart1 = echarts.init(proxy.$refs['echartsDivwd'+device.value.设备编号]);
+            const myChart2 = echarts.init(proxy.$refs['echartsDivls'+device.value.设备编号]);
+            const myChart3 = echarts.init(proxy.$refs['echartsDivddd'+device.value.设备编号]);
+                const option1={
+                backgroundColor:textcolor.value,
+                tooltip: {
+                    trigger: 'axis'
+                },
+                toolbox: {
+                    show: false
+                },
+                grid:{
+                    left:8,
+                    top:30,
+                    bottom:0,
+                },
+                xAxis: {
+                    show: false, // 隐藏X轴
+                    type: 'category',
+                    // 标记做右往左排列
+                    boundaryGap: false,
+                    data: [1,2,3],
+                    axisTick: {
+                        show: false // 显示 X 轴刻度
+                    }
+                },
+                yAxis: {
+                    type: 'value',
+                    splitLine: {
+                        show: false
+                    }
+                },
+                series: [
+                    {
+                    data: tbdata1,
+                    type: 'line',
+                    lineStyle: {
+                        width: 10, // 设置线条宽度为5
+                        color:'red'
+                    }
+                    }
+                ]
+                };
+                const option2={
+                backgroundColor:textcolor.value,
+                tooltip: {
+                    trigger: 'axis'
+                },
+                toolbox: {
+                    show: false
+                },
+                grid:{
+                    left:8,
+                    top:20,
+                    bottom:0,
+                },
+                xAxis: {
+                    show: false, // 隐藏X轴
+                    type: 'category',
+                    // 标记做右往左排列
+                    boundaryGap: false,
+                    data: [1,2,3],
+                    axisTick: {
+                        show: false // 显示 X 轴刻度
+                    }
+                },
+                yAxis: {
+                    type: 'value',
+                    min:-10,
+                    splitLine: {
+                        show: false
+                    }
+                },
+                series: [
+                    {
+                    data: tbdata2,
+                    type: 'line',
+                    lineStyle: {
+                        width: 10, // 设置线条宽度为5
+                        color:'#409EFF'
+                    }
+                    
+                    }
+                ]
+                };
+                const option3={
+                backgroundColor:textcolor.value,
+                tooltip: {
+                    trigger: 'axis'
+                },
+                toolbox: {
+                    show: false
+                },
+                grid:{
+                    left:8,
+                    top:10,
+                    bottom:0,
+                },
+                xAxis: {
+                    show: false, // 隐藏X轴
+                    type: 'category',
+                    // 标记做右往左排列
+                    boundaryGap: false,
+                    data: [1,2,3],
+                    axisTick: {
+                        show: false // 显示 X 轴刻度
+                    }
+                },
+                yAxis: {
+                    type: 'value',
+                    min:-10,
+                    splitLine: {
+                        show: false
+                    }
+                },
+                series: [
+                    {
+                    data: tbdata3,
+                    type: 'line',
+                    lineStyle: {
+                        width: 10, // 设置线条宽度为5
+                        color:'#E6A23C'
+                    }
+                    }
+                ]
+                };
+                myChart1.setOption(option1);
+                myChart2.setOption(option2);
+                myChart3.setOption(option3);
+            }catch(e){
+                console.log('图标渲染异常异常')
+            }
+  
+        console.log(device.value)
+    }
+    
+  
+  }
+  </script>
+  <style lang="less" scoped>
+  .divice{
+    font-size: 100%;
+    border-radius: 4px;
+    border: solid 1px;
+    width: 100%;
+    height: 100%;
+    border: 1px solid coral;
+  }
+  /* 定义闪烁动画 */
+  @keyframes blink {
+  0% {
+    border:4px solid red ;
+  }
+  50% {
+    border:4px solid Transparent ;
+  }
+  100% {
+    border:4px solid red ;
+    // border-bottom:8px solid red ;
+  }
+  }
+  
+  /* 应用闪烁动画 */
+  .blink {
+    // float: left; /* 让div浮动到左边 */
+    width: 100%;
+    height: 100%;
+    animation: blink 2s infinite; /* 每秒闪烁一次,无限次数 */
+  
+  //   border-left:5px solid red ;
+  //   border-right:5px solid red ;
+   
+  //   background: red;
+     cursor: pointer;
+    //  margin-bottom: 100%;
+  }
+  @keyframes blink2 {
+  0% {
+    background: red ;
+  }
+  50% {
+    background: Transparent ;
+  }
+  100% {
+    background: red ;
+    // border-bottom:8px solid red ;
+  }
+  }
+  .blink2{
+    animation: blink2 2s infinite; /* 每秒闪烁一次,无限次数 */
+    width: 100%;
+    height: 100%;
+  }
+  .grid-container {
+    display: grid;
+    align-items: center; /* 垂直居中 */
+    height: 100vh; /* 根据需要调整高度 */
+  }
+  
+  .centered-text {
+    font-weight: 600;
+    /* 其他样式 */
+  }
+  
+  </style>
\ No newline at end of file
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+/// <reference types="vite/client" />
diff --git a/tsconfig.app.json b/tsconfig.app.json
new file mode 100644
index 0000000..cac0e4d
--- /dev/null
+++ b/tsconfig.app.json
@@ -0,0 +1,8 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "outDir": "./dist",
+    "rootDir": "./src"
+  },
+  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue"]
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..cb5a989
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,16 @@
+{
+  "compilerOptions": {
+    "target": "ESNext",
+    "module": "ESNext",
+    "moduleResolution": "node",
+    "baseUrl": ".",
+    "paths": {
+      "*": ["node_modules/*", "src/types/*"]
+    },
+    "esModuleInterop": true,
+    "skipLibCheck": true,
+    "forceConsistentCasingInFileNames": true
+  },
+  "include": ["src/**/*.ts", "src/**/*.vue"],
+  "exclude": ["node_modules"]
+}
\ No newline at end of file
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..233976b
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,7 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "module": "commonjs"
+  },
+  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue"]
+}
\ No newline at end of file
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..efdb8b5
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'vite';
+import vue from '@vitejs/plugin-vue';
+
+export default defineConfig({
+  plugins: [vue()],
+  server: {
+    port: 3034, // 指定端口号为 3000
+    strictPort: true, // 如果端口被占用,则抛出错误而不是尝试下一个可用端口
+  },
+  resolve: {
+    alias: {
+      '@': '/src'
+    }
+  }
+});
\ No newline at end of file

--
Gitblit v1.8.0