Browse Source

校园报修 页面和接口都已完成

hzj18279462576@163.com 2 years ago
parent
commit
6ea31a73e0
100 changed files with 3506 additions and 0 deletions
  1. 24 0
      .gitignore
  2. 3 0
      .vscode/extensions.json
  3. 36 0
      README.en.md
  4. 15 0
      index.html
  5. 944 0
      package-lock.json
  6. 35 0
      package.json
  7. 33 0
      src/App.vue
  8. 87 0
      src/api/admin.js
  9. 14 0
      src/api/home.js
  10. 110 0
      src/api/vidicons.js
  11. BIN
      src/assets/111.png
  12. BIN
      src/assets/account.png
  13. BIN
      src/assets/accountA.png
  14. BIN
      src/assets/add.png
  15. BIN
      src/assets/addImg.png
  16. BIN
      src/assets/affiche.png
  17. BIN
      src/assets/area.png
  18. BIN
      src/assets/areaTable.png
  19. BIN
      src/assets/audio.png
  20. BIN
      src/assets/back.png
  21. BIN
      src/assets/bg-video.png
  22. BIN
      src/assets/bg.png
  23. BIN
      src/assets/blacklist.png
  24. BIN
      src/assets/blacklistA.png
  25. BIN
      src/assets/bottom.png
  26. BIN
      src/assets/busquery.png
  27. BIN
      src/assets/busqueryA.png
  28. BIN
      src/assets/car.png
  29. BIN
      src/assets/carA.png
  30. BIN
      src/assets/carnumber.png
  31. BIN
      src/assets/carnumberA.png
  32. BIN
      src/assets/classX.png
  33. BIN
      src/assets/classXX.png
  34. BIN
      src/assets/classes.png
  35. BIN
      src/assets/classesA.png
  36. BIN
      src/assets/close.png
  37. BIN
      src/assets/colorSelect.png
  38. BIN
      src/assets/consumable.png
  39. BIN
      src/assets/evaluate.png
  40. BIN
      src/assets/home.png
  41. BIN
      src/assets/import.png
  42. BIN
      src/assets/importBlue.png
  43. BIN
      src/assets/importwhite.png
  44. BIN
      src/assets/log.png
  45. BIN
      src/assets/logA.png
  46. BIN
      src/assets/login.png
  47. BIN
      src/assets/login2.png
  48. BIN
      src/assets/login3.png
  49. BIN
      src/assets/logo.png
  50. BIN
      src/assets/logoBg.jpg
  51. BIN
      src/assets/nanchang.png
  52. BIN
      src/assets/news.png
  53. BIN
      src/assets/news1.png
  54. BIN
      src/assets/nodata.png
  55. BIN
      src/assets/noworkTime.png
  56. BIN
      src/assets/open.png
  57. BIN
      src/assets/orderInfo.png
  58. BIN
      src/assets/path.png
  59. BIN
      src/assets/pathA.png
  60. BIN
      src/assets/paySuccess.png
  61. BIN
      src/assets/read.png
  62. BIN
      src/assets/refund.png
  63. BIN
      src/assets/refundPrice.png
  64. BIN
      src/assets/repairs.png
  65. BIN
      src/assets/repairsInfo.png
  66. BIN
      src/assets/report.png
  67. BIN
      src/assets/reportA.png
  68. BIN
      src/assets/scheduling.png
  69. BIN
      src/assets/search.png
  70. BIN
      src/assets/staff.png
  71. BIN
      src/assets/statement.png
  72. BIN
      src/assets/statementA.png
  73. BIN
      src/assets/step.png
  74. BIN
      src/assets/step_active.png
  75. BIN
      src/assets/step_common.png
  76. BIN
      src/assets/system.png
  77. BIN
      src/assets/system111.png
  78. BIN
      src/assets/systemA.png
  79. BIN
      src/assets/timer.png
  80. BIN
      src/assets/toLead.png
  81. 1 0
      src/assets/vite.svg
  82. BIN
      src/assets/waiting.png
  83. BIN
      src/assets/workTime.png
  84. 42 0
      src/components/HelloWorld.vue
  85. 192 0
      src/layout/index.vue
  86. 454 0
      src/layout/sidebar/Navbar.vue
  87. 259 0
      src/layout/sidebar/SidevarItem.vue
  88. 26 0
      src/main.js
  89. 104 0
      src/router/index.js
  90. BIN
      src/static/daoxiang.mp3
  91. BIN
      src/static/gaobai.mp3
  92. 5 0
      src/store/getters.js
  93. 22 0
      src/store/index.js
  94. 148 0
      src/store/modules/user.js
  95. 89 0
      src/style.css
  96. 1 0
      src/style/mixin.scss
  97. 46 0
      src/utils/request.js
  98. 22 0
      src/utils/rsa.js
  99. 794 0
      src/views/account/account.vue
  100. 0 0
      src/views/affiche/affiche.vue

+ 24 - 0
.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?

+ 3 - 0
.vscode/extensions.json

@@ -0,0 +1,3 @@
+{
+  "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
+}

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# 校车预约管理系统
+
+#### Description
+{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Instructions
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Contribution
+
+1.  Fork the repository
+2.  Create Feat_xxx branch
+3.  Commit your code
+4.  Create Pull Request
+
+
+#### Gitee Feature
+
+1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4.  The most valuable open source project [GVP](https://gitee.com/gvp)
+5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 15 - 0
index.html

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html lang="zh">
+  <head>
+    <meta charset="UTF-8" />
+    <!-- <link rel="icon" type="image/svg+xml" href="./src/assets/vite.svg" /> -->
+    <link rel="icon" type="image/svg+xml" href="./src/assets/nanchang.png" />
+    <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.js"></script>
+  </body>
+</html>

+ 944 - 0
package-lock.json

@@ -0,0 +1,944 @@
+{
+  "name": "vite-project",
+  "version": "0.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/parser": {
+      "version": "7.20.15",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.15.tgz",
+      "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg=="
+    },
+    "@ctrl/tinycolor": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz",
+      "integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg=="
+    },
+    "@easydarwin/easyplayer": {
+      "version": "5.0.7",
+      "resolved": "https://registry.npmmirror.com/@easydarwin/easyplayer/-/easyplayer-5.0.7.tgz",
+      "integrity": "sha512-cKsvrUwFN1ZmYR+grhTKiOUp6QG1mgu64XGPjeASsAWCc03TygKQBsKCHPndafotjCXFFwuG9g1HatOiNvd3dQ=="
+    },
+    "@element-plus/icons-vue": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz",
+      "integrity": "sha512-ygEZ1mwPjcPo/OulhzLE7mtDrQBWI8vZzEWSNB2W/RNCRjoQGwbaK4N8lV4rid7Ts4qvySU3njMN7YCiSlSaTQ=="
+    },
+    "@esbuild/android-arm": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
+      "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
+      "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
+      "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
+      "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
+      "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
+      "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
+      "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
+      "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
+      "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ia32": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
+      "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-loong64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
+      "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-mips64el": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
+      "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ppc64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
+      "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-riscv64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
+      "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-s390x": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
+      "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
+      "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/netbsd-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
+      "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
+      "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/sunos-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
+      "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-arm64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
+      "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-ia32": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
+      "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-x64": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
+      "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@floating-ui/core": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.2.0.tgz",
+      "integrity": "sha512-GHUXPEhMEmTpnpIfesFA2KAoMJPb1SPQw964tToQwt+BbGXdhqTCWT1rOb0VURGylsxsYxiGMnseJ3IlclVpVA=="
+    },
+    "@floating-ui/dom": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.2.0.tgz",
+      "integrity": "sha512-QXzg57o1cjLz3cGETzKXjI3kx1xyS49DW9l7kV2jw2c8Yftd434t2hllX0sVGn2Q8MtcW/4pNm8bfE1/4n6mng==",
+      "requires": {
+        "@floating-ui/core": "^1.2.0"
+      }
+    },
+    "@jridgewell/gen-mapping": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+      "requires": {
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "@jridgewell/resolve-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
+    },
+    "@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
+    },
+    "@jridgewell/source-map": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+      "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+      "requires": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+    },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.17",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+      "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+      "requires": {
+        "@jridgewell/resolve-uri": "3.1.0",
+        "@jridgewell/sourcemap-codec": "1.4.14"
+      }
+    },
+    "@liveqing/liveplayer-v3": {
+      "version": "3.7.10",
+      "resolved": "https://registry.npmmirror.com/@liveqing/liveplayer-v3/-/liveplayer-v3-3.7.10.tgz",
+      "integrity": "sha512-ZfgEObnH/vZJHotBXY0qY4adXTUnqHtNFsSXB7GBZ/WjOxq13saLG5NgoHjdvHiRyuhNkVzOqHZT4UmQpswoww=="
+    },
+    "@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=="
+    },
+    "@types/lodash": {
+      "version": "4.14.191",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.191.tgz",
+      "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
+    },
+    "@types/lodash-es": {
+      "version": "4.17.6",
+      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz",
+      "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
+      "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": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz",
+      "integrity": "sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==",
+      "dev": true
+    },
+    "@vue/compiler-core": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
+      "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
+      "requires": {
+        "@babel/parser": "^7.16.4",
+        "@vue/shared": "3.2.47",
+        "estree-walker": "^2.0.2",
+        "source-map": "^0.6.1"
+      }
+    },
+    "@vue/compiler-dom": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
+      "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
+      "requires": {
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "@vue/compiler-sfc": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
+      "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
+      "requires": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/compiler-ssr": "3.2.47",
+        "@vue/reactivity-transform": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7",
+        "postcss": "^8.1.10",
+        "source-map": "^0.6.1"
+      }
+    },
+    "@vue/compiler-ssr": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
+      "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
+      "requires": {
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "@vue/devtools-api": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
+      "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
+    },
+    "@vue/reactivity": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.47.tgz",
+      "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==",
+      "requires": {
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "@vue/reactivity-transform": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
+      "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
+      "requires": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7"
+      }
+    },
+    "@vue/runtime-core": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz",
+      "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==",
+      "requires": {
+        "@vue/reactivity": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "@vue/runtime-dom": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz",
+      "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==",
+      "requires": {
+        "@vue/runtime-core": "3.2.47",
+        "@vue/shared": "3.2.47",
+        "csstype": "^2.6.8"
+      }
+    },
+    "@vue/server-renderer": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz",
+      "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==",
+      "requires": {
+        "@vue/compiler-ssr": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "@vue/shared": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.47.tgz",
+      "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ=="
+    },
+    "@vueuse/core": {
+      "version": "9.12.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.12.0.tgz",
+      "integrity": "sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==",
+      "requires": {
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.12.0",
+        "@vueuse/shared": "9.12.0",
+        "vue-demi": "*"
+      }
+    },
+    "@vueuse/metadata": {
+      "version": "9.12.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.12.0.tgz",
+      "integrity": "sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ=="
+    },
+    "@vueuse/shared": {
+      "version": "9.12.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.12.0.tgz",
+      "integrity": "sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==",
+      "requires": {
+        "vue-demi": "*"
+      }
+    },
+    "acorn": {
+      "version": "8.8.2",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz",
+      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="
+    },
+    "animate.css": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz",
+      "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
+    },
+    "anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "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=="
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "axios": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.3.3.tgz",
+      "integrity": "sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==",
+      "requires": {
+        "follow-redirects": "^1.15.0",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+    },
+    "chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "requires": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+    },
+    "csstype": {
+      "version": "2.6.21",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz",
+      "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
+    },
+    "dayjs": {
+      "version": "1.11.8",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.8.tgz",
+      "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ=="
+    },
+    "deepmerge": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.0.tgz",
+      "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og=="
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+    },
+    "echarts": {
+      "version": "5.4.2",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.4.2.tgz",
+      "integrity": "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==",
+      "requires": {
+        "tslib": "2.3.0",
+        "zrender": "5.4.3"
+      }
+    },
+    "element-plus": {
+      "version": "2.2.29",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.29.tgz",
+      "integrity": "sha512-g4dcrURrKkR5uUX8n5RVnnqGnimoki9HfqS4yHHG6XwCHBkZGozdq4x+478BzeWUe31h++BO+7dakSx4VnM8RQ==",
+      "requires": {
+        "@ctrl/tinycolor": "^3.4.1",
+        "@element-plus/icons-vue": "^2.0.6",
+        "@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.3",
+        "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"
+      }
+    },
+    "esbuild": {
+      "version": "0.16.17",
+      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.16.17.tgz",
+      "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
+      "dev": true,
+      "requires": {
+        "@esbuild/android-arm": "0.16.17",
+        "@esbuild/android-arm64": "0.16.17",
+        "@esbuild/android-x64": "0.16.17",
+        "@esbuild/darwin-arm64": "0.16.17",
+        "@esbuild/darwin-x64": "0.16.17",
+        "@esbuild/freebsd-arm64": "0.16.17",
+        "@esbuild/freebsd-x64": "0.16.17",
+        "@esbuild/linux-arm": "0.16.17",
+        "@esbuild/linux-arm64": "0.16.17",
+        "@esbuild/linux-ia32": "0.16.17",
+        "@esbuild/linux-loong64": "0.16.17",
+        "@esbuild/linux-mips64el": "0.16.17",
+        "@esbuild/linux-ppc64": "0.16.17",
+        "@esbuild/linux-riscv64": "0.16.17",
+        "@esbuild/linux-s390x": "0.16.17",
+        "@esbuild/linux-x64": "0.16.17",
+        "@esbuild/netbsd-x64": "0.16.17",
+        "@esbuild/openbsd-x64": "0.16.17",
+        "@esbuild/sunos-x64": "0.16.17",
+        "@esbuild/win32-arm64": "0.16.17",
+        "@esbuild/win32-ia32": "0.16.17",
+        "@esbuild/win32-x64": "0.16.17"
+      }
+    },
+    "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=="
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.15.2",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+    },
+    "form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "hls.js": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmmirror.com/hls.js/-/hls.js-1.3.4.tgz",
+      "integrity": "sha512-iFEwVqtEDk6sKotcTwtJ5OMo/nuDTk9PrpB8FI2J2WYf8EriTVfR4FaK0aNyYtwbYeRSWCXJKlz23xeREdlNYg=="
+    },
+    "immutable": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.2.4.tgz",
+      "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w=="
+    },
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz",
+      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
+    },
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+    },
+    "jsencrypt": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.3.1.tgz",
+      "integrity": "sha512-dVvV54GdFuJgmEKn+oBiaifDMen4p6o6j/lJh0OVMcouME8sST0bJ7bldIgKBQk4za0zyGn0/pm4vOznR25mLw=="
+    },
+    "klona": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz",
+      "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="
+    },
+    "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=="
+    },
+    "magic-string": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
+      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "requires": {
+        "sourcemap-codec": "^1.4.8"
+      }
+    },
+    "memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+    },
+    "mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+    },
+    "mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "requires": {
+        "mime-db": "1.52.0"
+      }
+    },
+    "nanoid": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
+      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+    },
+    "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=="
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+    },
+    "postcss": {
+      "version": "8.4.21",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz",
+      "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+      "requires": {
+        "nanoid": "^3.3.4",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      }
+    },
+    "proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "resolve": {
+      "version": "1.22.1",
+      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "rollup": {
+      "version": "3.14.0",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.14.0.tgz",
+      "integrity": "sha512-o23sdgCLcLSe3zIplT9nQ1+r97okuaiR+vmAPZPTDYB7/f3tgWIYNyiQveMsZwshBT0is4eGax/HH83Q7CG+/Q==",
+      "dev": true,
+      "requires": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "sass": {
+      "version": "1.58.0",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.58.0.tgz",
+      "integrity": "sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==",
+      "requires": {
+        "chokidar": ">=3.0.0 <4.0.0",
+        "immutable": "^4.0.0",
+        "source-map-js": ">=0.6.2 <2.0.0"
+      }
+    },
+    "sass-loader": {
+      "version": "13.2.0",
+      "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-13.2.0.tgz",
+      "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==",
+      "requires": {
+        "klona": "^2.0.4",
+        "neo-async": "^2.6.2"
+      }
+    },
+    "shvl": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/shvl/-/shvl-2.0.3.tgz",
+      "integrity": "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw=="
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+    },
+    "source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+    },
+    "source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
+    "terser": {
+      "version": "5.16.5",
+      "resolved": "https://registry.npmmirror.com/terser/-/terser-5.16.5.tgz",
+      "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==",
+      "requires": {
+        "@jridgewell/source-map": "^0.3.2",
+        "acorn": "^8.5.0",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      }
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+    },
+    "vite": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/vite/-/vite-4.1.1.tgz",
+      "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==",
+      "dev": true,
+      "requires": {
+        "esbuild": "^0.16.14",
+        "fsevents": "~2.3.2",
+        "postcss": "^8.4.21",
+        "resolve": "^1.22.1",
+        "rollup": "^3.10.0"
+      }
+    },
+    "vue": {
+      "version": "3.2.47",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.47.tgz",
+      "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",
+      "requires": {
+        "@vue/compiler-dom": "3.2.47",
+        "@vue/compiler-sfc": "3.2.47",
+        "@vue/runtime-dom": "3.2.47",
+        "@vue/server-renderer": "3.2.47",
+        "@vue/shared": "3.2.47"
+      }
+    },
+    "vue-demi": {
+      "version": "0.13.11",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
+      "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A=="
+    },
+    "vue-router": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.0.10.tgz",
+      "integrity": "sha512-YbPf6QnZpyyWfnk7CUt2Bme+vo7TLfg1nGZNkvYqKYh4vLaFw6Gn8bPGdmt5m4qrGnKoXLqc4htAsd3dIukICA==",
+      "requires": {
+        "@vue/devtools-api": "^6.0.0-beta.14"
+      }
+    },
+    "vuex": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.0.2.tgz",
+      "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==",
+      "requires": {
+        "@vue/devtools-api": "^6.0.0-beta.11"
+      }
+    },
+    "vuex-persistedstate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
+      "integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==",
+      "requires": {
+        "deepmerge": "^4.2.2",
+        "shvl": "^2.0.3"
+      }
+    },
+    "zrender": {
+      "version": "5.4.3",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.3.tgz",
+      "integrity": "sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==",
+      "requires": {
+        "tslib": "2.3.0"
+      }
+    }
+  }
+}

+ 35 - 0
package.json

@@ -0,0 +1,35 @@
+{
+  "name": "vite-project",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "@easydarwin/easyplayer": "^5.0.7",
+    "@element-plus/icons-vue": "^2.0.10",
+    "@liveqing/liveplayer-v3": "^3.7.10",
+    "animate.css": "^4.1.1",
+    "axios": "^1.3.2",
+    "dayjs": "^1.11.8",
+    "echarts": "^5.4.2",
+    "element-plus": "^2.2.29",
+    "hls.js": "^1.3.4",
+    "jsencrypt": "^3.3.1",
+    "lodash": "^4.17.21",
+    "sass": "^1.58.0",
+    "sass-loader": "^13.2.0",
+    "terser": "^5.16.5",
+    "vue": "^3.2.45",
+    "vue-router": "^4.0.10",
+    "vuex": "^4.0.2",
+    "vuex-persistedstate": "^4.1.0"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^4.0.0",
+    "vite": "^4.1.0"
+  }
+}

+ 33 - 0
src/App.vue

@@ -0,0 +1,33 @@
+<script setup>
+import { ref, reactive, nextTick, onBeforeMount, onUnmounted } from "vue";
+import { useRouter } from "vue-router";
+import { useStore } from "vuex";
+const store = useStore();
+const router = useRouter();
+onBeforeMount(() => {
+  // store.dispatch("pathSelect");
+  // store.dispatch("busNum");
+  // store.dispatch("newsAsync");
+  // store.dispatch("sm_time");
+});
+</script>
+
+<template>
+  <router-view></router-view>
+</template>
+
+<style lang="scss">
+#app {
+  max-width: 1920px;
+  width: 1920px;
+  min-height: 100vh;
+  max-height: 1080px;
+  margin: 0;
+  padding: 0;
+  text-align: unset;
+  // width: 100%;
+  // height: 100%;
+  // margin: 0;
+  // padding: 0;
+}
+</style>

+ 87 - 0
src/api/admin.js

@@ -0,0 +1,87 @@
+import request from "@/utils/request";
+const requests = '/api'// 线上
+// const requests = '/video/transcoding/transcoding'//线下
+export default {
+    // 登录账号
+    // async adminLogin(data) {
+    //     let requestData = await request({
+    //         url: `${requests}/carBook/adminlogin.action`,
+    //         method: "POST",
+    //         // headers: { "Content-Type": "application/json;charset=utf-8" },
+    //         data: data,
+    //     });
+    //     return requestData;
+    // },
+
+    // 账号列表
+    // async adminList(params) {
+    //     let requestData = await request({
+    //         url: `${requests}/carBook/adminlist.action`,
+    //         method: "GET",
+    //         headers: { "Content-Type": "multipart/form-data" },
+    //         params,
+    //     });
+    //     return requestData;
+    // },
+
+    // 新增管理员
+    async adminAdd(data) {
+        let requestData = await request({
+            url: `${requests}/carBook/admininsert.action`,
+            method: "POST",
+            data,
+        });
+        return requestData;
+    },
+    // 修改管理员
+    async adminUpdate(data) {
+        let requestData = await request({
+            url: `${requests}/carBook/adminupdate.action`,
+            method: "POST",
+            data,
+        });
+        return requestData;
+    },
+    // 修改密码
+    // async updatePassword(data) {
+    //     let requestData = await request({
+    //         url: `${requests}/videoAdmin/updatePassword`,
+    //         method: "PUT",
+    //         data,
+    //     });
+    //     return requestData;
+    // },
+    // 删除管理员
+    async adminDel(data) {
+        let requestData = await request({
+            url: `${requests}/carBook/admindel.action`,
+            method: "POST",
+            data,
+        });
+        return requestData;
+    },
+
+    // 导出管理员信息
+    async download(params) {
+        let requestData = await request({
+            url: `${requests}/carBook/admintoExcel.action`,
+            method: "GET",
+            headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" },
+            responseType: "blob",
+            params,
+        });
+        return requestData;
+    },
+
+    // 导入监控信息
+    // async importByExcel(data) {
+    //     let requestData = await request({
+    //         // url: "/api/video/videoAdmin/importByExcel",
+    //         url: `${requests}/camera/importByExcel`,
+    //         method: "POST",
+    //         headers: { "Content-Type": "multipart/form-data" },
+    //         data: data,
+    //     });
+    //     return requestData;
+    // },
+};

+ 14 - 0
src/api/home.js

@@ -0,0 +1,14 @@
+import request from "@/utils/request";
+// const request='/api'
+export default {
+    /*搜索*/
+
+    async getHomeList(data) {
+        let requestData = await request({
+            url: "/api",
+            method: "POST",
+            data: data,
+        });
+        return requestData;
+    }
+}

+ 110 - 0
src/api/vidicons.js

@@ -0,0 +1,110 @@
+import request from "@/utils/request";
+const requests = '/video/transcoding'// 线上
+// const requests = '/video/transcoding/transcoding'// 线下
+export default {
+    // 添加监控信息
+    async addCamera(data) {
+        let requestData = await request({
+            url: `${requests}/camera/addCamera`,
+            method: "POST",
+            headers: { "Content-Type": "application/json; charset=utf-8" },
+            data: data,
+        });
+        return requestData;
+    },
+
+    // 删除监控信息
+    async delCamera(data) {
+        let requestData = await request({
+            url: `${requests}/camera/delete`,
+            method: "DELETE",
+            data
+        });
+        return requestData;
+    },
+
+    // 修改监控信息
+    async updateCamera(data) {
+        let requestData = await request({
+            url: `${requests}/camera/updateCamera`,
+            method: "PUT",
+            headers: { "Content-Type": "application/json; charset=utf-8" },
+            data,
+        });
+        return requestData;
+    },
+
+    // 监控信息列表
+    async queryCamera(data) {
+        let requestData = await request({
+            url: `${requests}/camera/queryCamera`,
+            method: "POST",
+            headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" },
+            params: data,
+        });
+        return requestData;
+    },
+    // 导出监控信息
+    async download(params) {
+        let requestData = await request({
+            url: `${requests}/camera/download`,
+            method: "GET",
+            headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" },
+            responseType: "blob",
+            params,
+        });
+        return requestData;
+    },
+    // 导入监控信息
+    async importByExcel(data) {
+        let requestData = await request({
+            url: `${requests}/camera/importByExcel`,
+            method: "POST",
+            headers: { "Content-Type": "multipart/form-data" },
+            data,
+        });
+        return requestData;
+    },
+
+    // 使用Stream推拉流
+    async addStreamSource(data) {
+        let requestData = await request({
+            url: `${requests}/stream/addStreamSource`,
+            method: "POST",
+            headers: { "Content-Type": "application/json; charset=utf-8" },
+            data,
+        });
+        return requestData;
+    },
+
+    // 关闭Stream推拉流
+    async delStreamSource(data) {
+        let requestData = await request({
+            url: `${requests}/stream/delStreamSource`,
+            method: "POST",
+            headers: { "Content-Type": "application/json; charset=utf-8" },
+            data,
+        });
+        return requestData;
+    },
+    // 更新输出链接
+    async updateCameraLink(params) {
+        let requestData = await request({
+            url: `${requests}/camera/updateCameraLink`,
+            method: "GET",
+            headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" },
+            params,
+        });
+        return requestData;
+    },
+    // 关闭当前播放回写剩下的播放链接、
+    async delAndUpdateLink(params) {
+        let requestData = await request({
+            url: `${requests}/stream/delAndUpdateLink`,
+            method: "GET",
+            headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" },
+            params,
+        });
+        return requestData;
+    },
+};

BIN
src/assets/111.png


BIN
src/assets/account.png


BIN
src/assets/accountA.png


BIN
src/assets/add.png


BIN
src/assets/addImg.png


BIN
src/assets/affiche.png


BIN
src/assets/area.png


BIN
src/assets/areaTable.png


BIN
src/assets/audio.png


BIN
src/assets/back.png


BIN
src/assets/bg-video.png


BIN
src/assets/bg.png


BIN
src/assets/blacklist.png


BIN
src/assets/blacklistA.png


BIN
src/assets/bottom.png


BIN
src/assets/busquery.png


BIN
src/assets/busqueryA.png


BIN
src/assets/car.png


BIN
src/assets/carA.png


BIN
src/assets/carnumber.png


BIN
src/assets/carnumberA.png


BIN
src/assets/classX.png


BIN
src/assets/classXX.png


BIN
src/assets/classes.png


BIN
src/assets/classesA.png


BIN
src/assets/close.png


BIN
src/assets/colorSelect.png


BIN
src/assets/consumable.png


BIN
src/assets/evaluate.png


BIN
src/assets/home.png


BIN
src/assets/import.png


BIN
src/assets/importBlue.png


BIN
src/assets/importwhite.png


BIN
src/assets/log.png


BIN
src/assets/logA.png


BIN
src/assets/login.png


BIN
src/assets/login2.png


BIN
src/assets/login3.png


BIN
src/assets/logo.png


BIN
src/assets/logoBg.jpg


BIN
src/assets/nanchang.png


BIN
src/assets/news.png


BIN
src/assets/news1.png


BIN
src/assets/nodata.png


BIN
src/assets/noworkTime.png


BIN
src/assets/open.png


BIN
src/assets/orderInfo.png


BIN
src/assets/path.png


BIN
src/assets/pathA.png


BIN
src/assets/paySuccess.png


BIN
src/assets/read.png


BIN
src/assets/refund.png


BIN
src/assets/refundPrice.png


BIN
src/assets/repairs.png


BIN
src/assets/repairsInfo.png


BIN
src/assets/report.png


BIN
src/assets/reportA.png


BIN
src/assets/scheduling.png


BIN
src/assets/search.png


BIN
src/assets/staff.png


BIN
src/assets/statement.png


BIN
src/assets/statementA.png


BIN
src/assets/step.png


BIN
src/assets/step_active.png


BIN
src/assets/step_common.png


BIN
src/assets/system.png


BIN
src/assets/system111.png


BIN
src/assets/systemA.png


BIN
src/assets/timer.png


BIN
src/assets/toLead.png


File diff suppressed because it is too large
+ 1 - 0
src/assets/vite.svg


BIN
src/assets/waiting.png


BIN
src/assets/workTime.png


+ 42 - 0
src/components/HelloWorld.vue

@@ -0,0 +1,42 @@
+<template>
+  <h1>{{ msg }}</h1>
+
+  <div class="card">
+    <button type="button" @click="count++">count is {{ count }}</button>
+    <p>
+      Edit
+      <code>components/HelloWorld.vue</code> to test HMR
+    </p>
+  </div>
+
+  <p>
+    Check out
+    <a href="https://vuejs.org/guide/quick-start.html#local" target="_blank">create-vue</a
+    >, the official Vue + Vite starter
+  </p>
+  <p>
+    Install
+    <a href="https://github.com/johnsoncodehk/volar" target="_blank">Volar</a>
+    in your IDE for a better DX
+  </p>
+  <p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
+  <div class="ul">
+    <div class="li">文字</div>
+  </div>
+</template>
+
+<script setup>
+import { ref } from "vue";
+
+defineProps({
+  msg: String,
+});
+
+const count = ref(0);
+</script>
+
+<style scoped lang="scss">
+.read-the-docs {
+  color: #888;
+}
+</style>

+ 192 - 0
src/layout/index.vue

@@ -0,0 +1,192 @@
+<template>
+  <div class="body-box">
+    <SidevarItem></SidevarItem>
+    <div class="content">
+      <Navbar></Navbar>
+      <!-- <router-view></router-view>
+       -->
+      <router-view v-slot="{ Component }">
+        <transition name="router_animate">
+          <component :is="Component" />
+        </transition>
+      </router-view>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onBeforeMount, onMounted, watch } from "vue";
+import Navbar from "./sidebar/Navbar.vue";
+import SidevarItem from "./sidebar/SidevarItem.vue";
+import { useStore } from "vuex";
+import axios from "axios";
+import { useRouter } from "vue-router";
+const store = useStore();
+const router = useRouter();
+const api = ref("");
+watch(
+  () => router.currentRoute.value.fullPath,
+  (newValue, oldValue) => {
+    console.log(newValue);
+    if (newValue == "/repairs/statement") {
+      store.commit("indexUp", 1);
+      sessionStorage.setItem("sidevarItem", 1);
+    }
+    if (newValue == "/repairs/workOrder") {
+      store.commit("indexUp", 2);
+      sessionStorage.setItem("sidevarItem", 2);
+    }
+    if (newValue == "/repairs/area") {
+      store.commit("indexUp", 3);
+      sessionStorage.setItem("sidevarItem", 3);
+    }
+    if (newValue == "/repairs/consumable") {
+      store.commit("indexUp", 4);
+      sessionStorage.setItem("sidevarItem", 4);
+    }
+    if (newValue == "/repairs/staff") {
+      store.commit("indexUp", 5);
+      sessionStorage.setItem("sidevarItem", 5);
+    }
+    if (newValue == "/repairs/account") {
+      store.commit("indexUp", 6);
+      sessionStorage.setItem("sidevarItem", 6);
+    }
+    if (newValue == "/repairs/goods") {
+      store.commit("indexUp", 7);
+      sessionStorage.setItem("sidevarItem", 7);
+    }
+    if (newValue == "/repairs/scheduling") {
+      store.commit("indexUp", 8);
+      sessionStorage.setItem("sidevarItem", 8);
+    }
+
+    if (newValue == "/repairs/paySuccess") {
+      store.commit("indexUp", 9);
+      sessionStorage.setItem("sidevarItem", 9);
+    }
+    if (newValue == "/repairs/evaluate") {
+      store.commit("indexUp", 10);
+      sessionStorage.setItem("sidevarItem", 10);
+    }
+    if (newValue == "/repairs/affiche") {
+      store.commit("indexUp", 11);
+      sessionStorage.setItem("sidevarItem", 11);
+    }
+    if (newValue == "/repairs/waiting") {
+      store.commit("indexUp", 12);
+      sessionStorage.setItem("sidevarItem", 12);
+    }
+    if (newValue == "/repairs/news") {
+      store.commit("indexUp", 0);
+      sessionStorage.setItem("sidevarItem", 0);
+    }
+  }
+);
+const tableData = reactive({
+  list: [],
+});
+onBeforeMount(async () => {
+  api.value = store.state.user.api;
+
+  // {
+  //   let res = await axios({
+  //     method: "post",
+  //     url: api.value + "/carBook/cnqueryHb.action",
+  //     headers: {
+  //       token: sessionStorage.getItem("token"),
+  //     },
+  //   });
+  //   console.log(res, "系统配置");
+  //   sessionStorage.setItem("waiting", JSON.stringify(res.data.data));
+  // }
+});
+</script>
+
+<style scoped lang="scss">
+.body-box {
+  display: flex;
+  .content {
+    // min-width: 1740px;
+    max-width: calc(100vw - 81px);
+    min-width: calc(100vw - 200px);
+    width: 100%;
+    height: calc(100vh);
+    background-color: rgba(238, 238, 238, 1);
+    :deep(.el-dialog__header .el-dialog__headerbtn) {
+      outline: none;
+    }
+  }
+}
+.router_animate-enter-active {
+  animation: fadeIn 1.5s;
+}
+.router_animate-leave-active {
+  animation: fadeIn 0s;
+}
+</style>
+<style lang="scss">
+.is-message-box {
+  .el-message-box__header {
+    .el-message-box__headerbtn {
+      outline: none;
+    }
+  }
+  .el-message-box__btns {
+    .el-button--primary {
+      background-color: rgba(61, 81, 232, 1);
+      border: 0.5px solid rgba(61, 81, 232, 1);
+    }
+    .el-button--primary:hover {
+      background-color: rgb(119, 133, 239);
+      border: 0.5px solid rgb(119, 133, 239);
+    }
+  }
+}
+.el-dialog__body {
+  .el-input {
+    .el-input__suffix-inner {
+      color: rgba(61, 81, 232, 1);
+    }
+  }
+}
+.pw {
+  .el-dialog__body {
+    .el-form {
+      .el-form-item {
+        .queding {
+          background-color: rgba(61, 81, 232, 1);
+          border: 0.5px solid rgba(61, 81, 232, 1);
+        }
+        .queding:hover {
+          background-color: rgb(119, 133, 239);
+          border: 0.5px solid rgb(119, 133, 239);
+        }
+      }
+    }
+  }
+}
+#notification_1 {
+  .el-notification__group {
+    .el-notification__title {
+      color: red;
+    }
+  }
+}
+*::-webkit-scrollbar-track {
+  background-color: #fff;
+}
+
+*::-webkit-scrollbar {
+  background-color: #57b2ff;
+  height: 0;
+  width: 0;
+}
+
+*::-webkit-scrollbar-thumb {
+  background: #57b2ff;
+  border-radius: 4px;
+  height: 0;
+  width: 0;
+}
+</style>

+ 454 - 0
src/layout/sidebar/Navbar.vue

@@ -0,0 +1,454 @@
+<template>
+  <el-menu
+    :default-active="activeIndex"
+    class="el-menu-demo"
+    mode="horizontal"
+    background-color=""
+    text-color="#000"
+    active-text-color="#4392f7"
+    @select="handleSelect"
+  >
+    <el-icon
+      :size="20"
+      v-show="!menuclose"
+      class="fold"
+      @click="SpreadMenu(true)"
+      ><Fold
+    /></el-icon>
+    <el-icon
+      :size="20"
+      v-show="menuclose"
+      class="fold"
+      @click="SpreadMenu(false)"
+      ><Expand
+    /></el-icon>
+    <div class="logo">
+      <img src="@/assets/nanchang.png" style="width: 30px; height: 30px" />
+      <span>校园报修管理系统</span>
+    </div>
+    <div class="login">
+      <span class="dateTime">{{ dateTime }}</span>
+      <el-badge :value="titlenumber" class="item" v-if="titlenumber">
+        <img
+          src="@/assets/news.png"
+          @click="newsClick"
+          style="width: 20px; height: 20px; cursor: pointer"
+          alt=""
+        />
+        <!-- <el-icon><Bell /></el-icon> -->
+      </el-badge>
+      <img
+        v-else
+        src="@/assets/news.png"
+        @click="newsClick"
+        style="width: 20px; height: 20px; cursor: pointer"
+        alt=""
+      />
+      <div class="flex flex-wrap items-center" style="cursor: pointer">
+        <el-dropdown :hide-on-click="false" trigger="click">
+          <el-avatar :size="30">
+            <img
+              src="https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png"
+            />
+          </el-avatar>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item @click="uppassword">
+                <el-icon class="switchButton" :size="20" color="#000">
+                  <Lock />
+                </el-icon>
+                <span>修改密码</span>
+              </el-dropdown-item>
+              <el-dialog
+                :append-to-body="true"
+                custom-class="pw"
+                v-model="uppasswordShow"
+                title="修改密码"
+                width="30%"
+                :before-close="uppasswordClose"
+                align-center
+                :close-on-click-modal="false"
+              >
+                <el-form
+                  ref="ruleFormRef"
+                  :model="ruleForm"
+                  :rules="rules"
+                  label-width="100px"
+                  class="demo-ruleForm"
+                  :size="formSize"
+                  label-position="left"
+                  status-icon
+                >
+                  <el-form-item label="原密码" prop="oldpass">
+                    <el-input
+                      v-model="ruleForm.oldpass"
+                      placeholder="请输入原密码"
+                      clearable
+                    />
+                  </el-form-item>
+                  <el-form-item label="新密码" prop="nowpass">
+                    <el-input
+                      v-model="ruleForm.nowpass"
+                      placeholder="请输入新密码"
+                      clearable
+                    />
+                  </el-form-item>
+                  <el-form-item
+                    label="确定新密码"
+                    prop="correctpass"
+                    style="
+                      padding-bottom: 40px;
+                      border-bottom: 1px solid rgba(230, 230, 230, 1);
+                    "
+                  >
+                    <el-input
+                      v-model="ruleForm.correctpass"
+                      placeholder="请再次输入新密码"
+                      clearable
+                    />
+                  </el-form-item>
+
+                  <el-form-item class="options">
+                    <el-button
+                      class="queding"
+                      type="primary"
+                      @click="submitForm(ruleFormRef)"
+                    >
+                      确定
+                    </el-button>
+                    <el-button class="congzhi" @click="resetForm(ruleFormRef)"
+                      >重置</el-button
+                    >
+                  </el-form-item>
+                </el-form>
+                <!-- <template #footer>
+                  <span class="dialog-footer">
+                    <el-button @click="dialogVisible = false">取消</el-button>
+                    <el-button type="primary" @click="dialogVisible = false">
+                      确定
+                    </el-button>
+                  </span>
+                </template> -->
+              </el-dialog>
+              <el-dropdown-item @click="loginOut">
+                <el-icon class="switchButton" :size="20" color="#000">
+                  <SwitchButton />
+                </el-icon>
+                <span>退出登录</span>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </div>
+      <span class="name">{{ username }}</span>
+    </div>
+  </el-menu>
+</template>
+
+<script setup>
+import { ref, reactive, onBeforeMount, onMounted, watch } from "vue";
+import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
+import { useStore } from "vuex";
+import { useRouter } from "vue-router";
+import { dayjs } from "element-plus";
+import axios from "axios";
+
+const api = ref();
+const store = useStore();
+const router = useRouter();
+const username = ref(); // 账号名称
+const titlenumber = ref(1); //  消息条数
+const activeIndex = ref(); // 路由路径
+const loginOutDialogVisible = ref(false); // 退出按钮
+const menuclose = ref(false); // 左边状态栏展开按钮状态
+const uppasswordShow = ref(false); // 修改密码展示框
+const ruleForm = reactive({
+  oldpass: "",
+  nowpass: "",
+  correctpass: "",
+});
+const ruleFormRef = ref();
+// 表单验证
+const rules = reactive({
+  oldpass: [
+    {
+      required: true,
+      message: "密码不能为空",
+      trigger: "blur",
+    },
+  ],
+  nowpass: [
+    {
+      required: true,
+      message: "新密码不能为空",
+      trigger: "blur",
+    },
+  ],
+  correctpass: [
+    {
+      required: true,
+      message: "两次密码是否输入正确",
+      trigger: "blur",
+    },
+  ],
+  // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
+});
+
+// 监控消息通知数量
+watch(
+  () => store.state.user.newsNum,
+  (newValue, oldValue) => {
+    titlenumber.value = newValue;
+    console.log(newValue, "监控消息数量");
+  }
+);
+
+// 点击消息通知
+const newsClick = () => {
+  store.commit("indexUp", 0);
+  sessionStorage.setItem("sidevarItem", 0);
+  router.push({
+    path: `/repairs/news`,
+  });
+};
+const dateTime = ref(
+  dayjs().format("YYYY-MM-DD") + ` 星期四 ` + dayjs().format("HH:mm:ss")
+); // 时间
+
+// 选择菜单
+const handleSelect = (key, keyPath) => {
+  store.commit("navbarUpdata", key);
+  activeIndex.value = key;
+};
+
+// 展开按钮
+const SpreadMenu = (flag) => {
+  store.commit("menuClose", flag);
+  menuclose.value = flag;
+};
+// 修改密码
+const uppassword = () => {
+  uppasswordShow.value = true;
+};
+const uppasswordClose = () => {
+  uppasswordShow.value = false;
+  ruleFormRef.value.resetFields();
+};
+// 提交修改密码表单
+const submitForm = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      let data = {
+        oldPassword: ruleForm.oldpass,
+        newPassword: ruleForm.nowpass,
+        confirmPassword: ruleForm.correctpass,
+      };
+      if (ruleForm.nowpass == ruleForm.correctpass) {
+        let resUpdata = await axios({
+          method: "post",
+          url: api.value + "login/ChangePassword",
+          headers: {
+            token: sessionStorage.getItem("token"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+        console.log(resUpdata);
+        if (resUpdata.data.code == 200) {
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: resUpdata.data.message,
+            center: true,
+          });
+          sessionStorage.removeItem("token");
+          sessionStorage.removeItem("userhead");
+          localStorage.removeItem("pass");
+          uppasswordShow.value = false;
+          ruleFormRef.value.resetFields();
+          ElNotification({
+            type: "warning",
+            title: "提示!!!",
+            message: "密码已修改,请重新登录页面",
+            // duration: 0,
+            // position: "top-right",
+          });
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      } else {
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: "两次密码输入不正确",
+          center: true,
+        });
+      }
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+};
+// 重置表单
+const resetForm = (formEl) => {
+  // console.log("重置表单");
+  if (!formEl) return;
+  formEl.resetFields();
+};
+
+const loginOut = () => {
+  ElMessageBox.confirm("是否退出登录?", "提示", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      sessionStorage.removeItem("token");
+      sessionStorage.removeItem("userhead");
+      router.push({
+        path: `/login`,
+      });
+      ElMessage({
+        type: "success",
+        message: "退出成功",
+      });
+    })
+    .catch(() => {
+      ElMessage({
+        type: "info",
+        message: "已取消登录",
+      });
+    });
+};
+
+onMounted(() => {
+  api.value = store.state.user.api;
+  activeIndex.value = store.state.user.navbar;
+  if (sessionStorage.getItem("newsNum") == 0) {
+    titlenumber.value = "";
+  } else {
+    titlenumber.value = sessionStorage.getItem("newsNum");
+  }
+
+  username.value = sessionStorage.getItem("username");
+  setInterval(() => {
+    var week = ["日", "一", "二", "三", "四", "五", "六"];
+    var datas = dayjs().day();
+    dateTime.value =
+      dayjs().format("YYYY-MM-DD") +
+      ` 星期${week[datas]} ` +
+      dayjs().format("HH:mm:ss");
+  }, 1000);
+});
+</script>
+
+<style scoped lang="scss">
+.el-menu--horizontal {
+  border-bottom: none;
+  display: flex;
+  align-items: center;
+  height: 65px;
+  // width: 100%;
+  background-color: #fff;
+  box-shadow: 5px 5px 10px 0px rgba(213, 228, 252, 1);
+  .logo {
+    left: 90px;
+    display: flex;
+    align-items: center;
+    span {
+      margin-left: 10px;
+      font-size: 24px;
+      font-weight: 600;
+    }
+  }
+  .login {
+    color: #000;
+    display: flex;
+    align-items: center;
+    position: absolute;
+    right: 10px;
+    top: 17px;
+
+    .dateTime {
+      margin-right: 20px;
+    }
+    .el-badge {
+      display: flex;
+      align-items: center;
+      // :deep(.el-badge__content) {
+      //   width: 2px;
+      //   height: 14px;
+      // }
+    }
+    .items-center {
+      margin-left: 20px;
+    }
+    .name {
+      height: 20px;
+      line-height: 20px;
+      text-decoration: underline;
+      padding: 0 10px;
+      margin: 0 10px;
+      border-left: 2px solid #ccc;
+    }
+    .switchButton {
+      cursor: pointer;
+    }
+  }
+  .login:focus {
+    outline: none;
+  }
+  .fold {
+    width: 46px;
+    height: 65px;
+  }
+  .fold:hover {
+    cursor: pointer;
+    background-color: rgba(67, 146, 249, 0.1);
+  }
+}
+.el-dialog__body {
+  .options {
+    display: flex;
+    flex-direction: row-reverse;
+    :deep(.el-form-item__content) {
+      margin-left: 0 !important;
+      flex: none;
+    }
+  }
+}
+</style>
+<style lang="scss">
+.el-overlay {
+  .el-overlay-dialog {
+    .pw {
+      border-radius: 11px;
+
+      .el-dialog__header {
+        border-radius: 11px 11px 0 0;
+        background: rgba(237, 241, 245, 1);
+        font-weight: 600;
+        margin: 0;
+        .el-dialog__headerbtn {
+          outline: none;
+        }
+      }
+      .el-dialog__body {
+        padding: 30px 20px 10px 20px;
+        .el-input {
+          width: 200px;
+        }
+        .options {
+          margin-left: 170px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 259 - 0
src/layout/sidebar/SidevarItem.vue

@@ -0,0 +1,259 @@
+<template>
+  <div class="box-item">
+    <el-menu
+      class="el-menu-vertical-demo"
+      text-color="#fff"
+      active-color="#000"
+      :default-active="activeIndex"
+      :collapse="menuClose"
+      @select="handleSelect"
+    >
+      <!-- <div class="logo">logo</div> -->
+      <div class="logo el-menu-item">
+        <el-icon :size="20"
+          ><img src="@/assets/logo.png" style="width: 30px; height: 24px"
+        /></el-icon>
+      </div>
+
+      <el-menu-item :index="1">
+        <img src="@/assets/home.png" alt="" />
+        <span>系统首页</span>
+      </el-menu-item>
+      <el-menu-item :index="2">
+        <img src="@/assets/classes.png" alt="" />
+        <span>工单管理</span>
+      </el-menu-item>
+
+      <el-menu-item :index="3">
+        <img
+          src="@/assets/area.png"
+          alt=""
+          style="width: 22px; height: 22px; margin: 0 19px"
+        />
+        <span>报修区域</span>
+      </el-menu-item>
+      <el-menu-item :index="7">
+        <img src="@/assets/repairs.png" alt="" />
+        <span>报修物品</span>
+      </el-menu-item>
+      <el-menu-item :index="4">
+        <img src="@/assets/consumable.png" alt="" />
+        <span>耗材管理</span>
+      </el-menu-item>
+      <el-menu-item :index="5">
+        <img
+          src="@/assets/staff.png"
+          alt=""
+          style="width: 23px; height: 23px; margin: 0 18px 0 16px"
+        />
+        <span>员工管理</span>
+      </el-menu-item>
+      <el-menu-item :index="8">
+        <img
+          src="@/assets/scheduling.png"
+          alt=""
+          style="width: 20px; height: 20px"
+        />
+        <span>排班管理</span>
+      </el-menu-item>
+      <el-menu-item :index="10">
+        <img
+          src="@/assets/evaluate.png"
+          alt=""
+          style="width: 21px; height: 21px; margin: 0 20px"
+        />
+        <span>评价管理</span>
+      </el-menu-item>
+
+      <el-menu-item :index="9">
+        <img
+          src="@/assets/paySuccess.png "
+          alt=""
+          style="width: 20px; height: 20px; margin: 0 19px"
+        />
+        <span>支付成功订单</span>
+      </el-menu-item>
+
+      <el-menu-item :index="11">
+        <img
+          src="@/assets/affiche.png"
+          alt=""
+          style="width: 21px; height: 21px; margin: 0 20px"
+        />
+        <span>公告管理</span>
+      </el-menu-item>
+      <el-menu-item :index="6">
+        <img src="@/assets/account.png" alt="" />
+        <span>账号管理</span>
+      </el-menu-item>
+      <el-menu-item :index="12">
+        <img
+          style="width: 22px; height: 22px; margin: 0 20px 0 18px"
+          src="@/assets/system.png"
+          alt=""
+        />
+        <span>系统设置</span>
+      </el-menu-item>
+    </el-menu>
+  </div>
+</template>
+
+<script setup>
+import { ref, onBeforeMount, onMounted, watch, reactive } from "vue";
+import { useStore } from "vuex";
+
+import { useRouter } from "vue-router";
+
+const store = useStore();
+const router = useRouter();
+
+const menuClose = ref(false);
+const activeIndex = ref(1);
+const acitveItems = reactive({ list: [] });
+
+watch(
+  () => store.state.user.collapse,
+  (newValue, oldValue) => {
+    menuClose.value = newValue;
+  }
+);
+watch(
+  () => store.state.user.activeIndex,
+  (newValue, oldValue) => {
+    console.log(newValue);
+
+    activeIndex.value = newValue;
+  }
+);
+
+const handleSelect = (key) => {
+  store.commit("indexUp", key);
+  activeIndex.value = key;
+  sessionStorage.setItem("sidevarItem", key);
+
+  if (activeIndex.value == 1) {
+    router.push({
+      path: `/repairs/home`,
+    });
+  }
+  if (activeIndex.value == 2) {
+    router.push({
+      path: `/repairs/workOrder`,
+    });
+  }
+  if (activeIndex.value == 3) {
+    router.push({
+      path: `/repairs/area`,
+    });
+  }
+  if (activeIndex.value == 4) {
+    router.push({
+      path: `/repairs/consumable`,
+    });
+  }
+  if (activeIndex.value == 5) {
+    router.push({
+      path: `/repairs/staff`,
+    });
+  }
+  if (activeIndex.value == 6) {
+    router.push({
+      path: `/repairs/account`,
+    });
+  }
+  if (activeIndex.value == 7) {
+    router.push({
+      path: `/repairs/goods`,
+    });
+  }
+  if (activeIndex.value == 8) {
+    router.push({
+      path: `/repairs/scheduling`,
+    });
+  }
+
+  if (activeIndex.value == 9) {
+    router.push({
+      path: `/repairs/paySuccess`,
+    });
+  }
+  if (activeIndex.value == 10) {
+    router.push({
+      path: `/repairs/evaluate`,
+    });
+  }
+  if (activeIndex.value == 11) {
+    router.push({
+      path: `/repairs/affiche`,
+    });
+  }
+  if (activeIndex.value == 12) {
+    router.push({
+      path: `/repairs/waiting`,
+    });
+  }
+  if (activeIndex.value == 0) {
+    router.push({
+      path: `/repairs/news`,
+    });
+  }
+};
+onBeforeMount(() => {
+  activeIndex.value = Number(sessionStorage.getItem("sidevarItem"));
+  store.commit("indexUp", Number(sessionStorage.getItem("sidevarItem")));
+});
+</script>
+
+<style lang="scss" scoped>
+.el-menu-vertical-demo:not(.el-menu--collapse) {
+  width: 200px;
+  // min-height: 400px;
+}
+.el-menu {
+  width: 100%;
+  height: 100%;
+  // background: linear-gradient(
+  //   0deg,
+  //   rgba(134, 132, 255, 1) 0%,
+  //   rgba(60, 80, 232, 1) 100%
+  // );
+  background: rgba(34, 45, 50, 1);
+  box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.16);
+
+  .logo {
+    height: 65px;
+    color: rgb(255, 255, 255);
+    cursor: default;
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+  }
+  .logo:hover {
+    background-color: transparent !important;
+  }
+  .el-menu-item {
+    // border-left: 3px solid rgba(248, 220, 38);
+    padding: 0 10px;
+  }
+  .el-menu-item:hover {
+    background-color: rgba(255, 255, 255, 0.4);
+    // background-color: rgba(111, 182, 184, 1);
+  }
+  .el-menu-item.is-active:hover {
+    // background-color: #fff;
+    background-color: rgba(111, 182, 184, 1);
+  }
+  .el-menu-item img {
+    width: 18px;
+    height: 18px;
+    margin: 0 20px;
+  }
+}
+
+.el-menu-item.is-active {
+  box-sizing: border-box;
+  // background-color: #fff;
+  background-color: rgba(111, 182, 184, 1);
+  color: #fff;
+}
+</style>

+ 26 - 0
src/main.js

@@ -0,0 +1,26 @@
+import { createApp } from "vue";
+import "./style.css";
+import ElementPlus from "element-plus";
+import zhCn from "element-plus/dist/locale/zh-cn.mjs";
+import "element-plus/dist/index.css";
+import * as ElementPlusIconsVue from "@element-plus/icons-vue";
+import App from "./App.vue";
+
+import router from "@/router";
+import store from "@/store";
+
+import "animate.css/animate.min.css";
+
+const app = createApp(App);
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(key, component);
+}
+
+app.use(ElementPlus, {
+  locale: zhCn,
+});
+app.use(router);
+app.use(store);
+
+app.mount("#app");
+app.config.devtools = true;

+ 104 - 0
src/router/index.js

@@ -0,0 +1,104 @@
+import {
+  createRouter,
+  createWebHistory,
+  createWebHashHistory,
+} from "vue-router";
+import Layout from "@/layout/index.vue";
+const router = createRouter({
+  // history: createWebHashHistory("/carstop/dist6"), // 线上地址
+  history: createWebHashHistory("/campusMaintenance/repairManage"), // 测试环境发布地址
+  routes: [
+    {
+      path: "/login",
+      component: () => import("@/views/login/index.vue"),
+    },
+    {
+      path: "/",
+      redirect: "/login",
+    },
+    {
+      path: "/repairs",
+      component: Layout,
+      children: [
+        {
+          path: "news",
+          component: () => import("@/views/news/news.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "home",
+          component: () => import("@/views/home/home.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "workOrder",
+          component: () => import("@/views/workOrder/workOrder.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "area",
+          component: () => import("@/views/area/area.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "consumable",
+          component: () => import("@/views/consumable/consumable.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "staff",
+          component: () => import("@/views/staff/staff.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "account",
+          component: () => import("@/views/account/account.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "goods",
+          component: () => import("@/views/goods/goods.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "scheduling",
+          component: () => import("@/views/scheduling/scheduling.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "paySuccess",
+          component: () => import("@/views/paySuccess/paySuccess.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "evaluate",
+          component: () => import("@/views/evaluate/evaluate.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "affiche",
+          component: () => import("@/views/affiche/affiche.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+        {
+          path: "waiting",
+          component: () => import("@/views/waiting/waiting.vue"),
+          meta: { title: "Dashboard", icon: "dashboard" },
+        },
+      ],
+    },
+  ],
+});
+export default router;
+router.beforeEach((to, from, next) => {
+  // 判断 如果cook是否存在,可以进去
+  if (sessionStorage.getItem("token")) {
+    next(); //放行
+  } else {
+    if (to.path == "/login") {
+      next();
+    } else {
+      next(`/login`);
+    }
+  }
+});

BIN
src/static/daoxiang.mp3


BIN
src/static/gaobai.mp3


+ 5 - 0
src/store/getters.js

@@ -0,0 +1,5 @@
+//store/getters
+const getters = {
+    age: state => state.user.age //导出age
+}
+export default getters;

+ 22 - 0
src/store/index.js

@@ -0,0 +1,22 @@
+//store/index.js
+
+import createPersistedstate from 'vuex-persistedstate' //持久化插件
+import { createStore } from 'vuex'; //引入vuex
+import user from './modules/user'; //引入modules的方法;
+import getters from './getters' //引入getters
+const store = createStore({
+    modules: {
+        user
+    },
+    getters,
+    // plugins: [
+    //     createPersistedstate({
+    //         // key: 'userStore', //存储持久状态的键。(默认:vuex)
+    //         paths: ['user'], //部分持续状态的任何路径的数组。如果不加,默认所有。
+    //         storage: window.sessionStorage //默认存储到localStorage,想要存储到sessionStorage
+    //     })
+    // ]
+
+})
+
+export default store;

+ 148 - 0
src/store/modules/user.js

@@ -0,0 +1,148 @@
+import axios from "axios";
+
+//store/modules/user.js
+
+// 声明变量
+const state = {
+  collapse: false,
+  activeIndex: 0,
+  username: "",
+  password: "",
+  // api: "/carstop/carbook", // 线上
+  api: "/campusMaintenance/repair-api/repair/api", // 测试
+  newsNum: "",
+};
+
+// 修改变量(state不能直接赋值修改,只能通过mutations)
+const mutations = {
+  menuClose: (state, value) => {
+    state.collapse = value;
+  },
+  indexUp: (state, value) => {
+    state.activeIndex = value;
+  },
+  userName: (state, value) => {
+    state.username = value;
+  },
+  passWord: (state, value) => {
+    state.password = value;
+  },
+  newsUp: (state, value) => {
+    state.newsNum = value;
+  },
+};
+// mutations的值由actions传入(异步)
+const actions = {
+  addAsync: ({ commit }) => {
+    setTimeout(() => {
+      commit("add");
+    }, 1000);
+  },
+  newsAsync: async ({ commit, state }) => {
+    let data = {};
+    let res = await axios({
+      method: "get",
+      url: state.api + "/repairSystemMessages/queryPCMessageUnreadCount",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      params: data,
+    });
+    console.log(res, "系统消息");
+    commit("newsUp", res.data.data.count);
+    sessionStorage.setItem("newsNum", res.data.data.count);
+  },
+  // // 车辆管理
+  // busNum: async ({ commit, state }) => {
+  //   let data = new FormData();
+  //   // let res = await adminApi.adminLogin(data);
+  //   let res = await axios({
+  //     method: "post",
+  //     url: state.api + "/carBook/cinfoqueryAll.action",
+  //     headers: {
+  //       token: sessionStorage.getItem("token"),
+  //     },
+  //     data: data,
+  //   });
+  //   console.log(res, "车辆管理");
+  //   if (res.status == 200) {
+  //     sessionStorage.setItem("busSelect", JSON.stringify(res.data.data));
+  //   } else {
+  //     // ElMessage({
+  //     //   type: "error",
+  //     //   showClose: true,
+  //     //   message: res.data.message,
+  //     //   center: true,
+  //     // });
+  //     // if (res.data.message == "token错误") {
+  //     //   router.push({
+  //     //     path: `/login`,
+  //     //   });
+  //     // }
+  //   }
+  // },
+  // // 路线管理
+  // pathSelect: async ({ commit, state }) => {
+  //   let data = new FormData();
+  //   let res = await axios({
+  //     method: "post",
+  //     url: state.api + "/carBook/routequeryAll.action",
+  //     headers: {
+  //       token: sessionStorage.getItem("token"),
+  //     },
+  //     data: data,
+  //   });
+  //   res.data.data.forEach((item) => {
+  //     if (item.is_repair == 0) {
+  //       item.state = false;
+  //     } else if (item.is_repair == 1) {
+  //       item.state = true;
+  //     }
+  //     if (item.repair_end == "null") {
+  //       item.repair_end = "";
+  //     }
+  //   });
+  //   console.log(res, "路线管理");
+  //   if (res.status == 200) {
+  //     sessionStorage.setItem("route_endSelect", JSON.stringify(res.data.data));
+  //     let obj2 = {};
+  //     var reduce2 = res.data.data.reduce((curr, next) => {
+  //       /*判断对象中是否已经有该属性  没有的话 push 到 curr数组*/
+  //       obj2[next.route] ? "" : (obj2[next.route] = curr.push(next));
+  //       return curr;
+  //     }, []);
+  //     sessionStorage.setItem("pathSelect", JSON.stringify(reduce2));
+  //   } else {
+  //     ElMessage({
+  //       type: "error",
+  //       showClose: true,
+  //       message: res.data.message,
+  //       center: true,
+  //     });
+  //   }
+  // },
+  // 系统扫码时间
+  // sm_time: async ({ commit, state }) => {
+  //   let res = await axios({
+  //     method: "post",
+  //     url: state.api + "/carBook/cnqueryHb.action",
+  //     headers: {
+  //       token: sessionStorage.getItem("token"),
+  //     },
+  //   });
+  //   console.log(res.data, "系统扫码时间");
+
+  //   if (res.data.code == 200) {
+  //     sessionStorage.setItem("sm_start", res.data.data.sm_start);
+  //     sessionStorage.setItem("sm_end", res.data.data.sm_end);
+  //     sessionStorage.setItem("yy_end", res.data.data.yy_end);
+  //   }
+  // },
+};
+
+export default {
+  state,
+  mutations,
+  actions,
+};

+ 89 - 0
src/style.css

@@ -0,0 +1,89 @@
+: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;
+  -webkit-text-size-adjust: 100%;
+}
+
+a {
+  font-weight: 500;
+  color: #646cff;
+  text-decoration: inherit;
+}
+a:hover {
+  color: #535bf2;
+}
+
+a {
+  font-weight: 500;
+  color: #646cff;
+  text-decoration: inherit;
+}
+a:hover {
+  color: #535bf2;
+}
+
+body {
+  margin: 0;
+  display: flex;
+  place-items: center;
+  min-width: 320px;
+  min-height: 100vh;
+}
+
+h1 {
+  font-size: 3.2em;
+  line-height: 1.1;
+}
+
+button {
+  border-radius: 8px;
+  border: 1px solid transparent;
+  padding: 0.6em 1.2em;
+  font-size: 1em;
+  font-weight: 500;
+  font-family: inherit;
+  background-color: #1a1a1a;
+  cursor: pointer;
+  transition: border-color 0.25s;
+}
+button:hover {
+  border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+  outline: 4px auto -webkit-focus-ring-color;
+}
+
+.card {
+  padding: 2em;
+}
+
+/* #app {
+  max-width: 1280px;
+  margin: 0 auto;
+  padding: 2rem;
+  text-align: center;
+} */
+
+@media (prefers-color-scheme: light) {
+  :root {
+    color: #213547;
+    background-color: #ffffff;
+  }
+  a:hover {
+    color: #747bff;
+  }
+  button {
+    background-color: #f9f9f9;
+  }
+}

+ 1 - 0
src/style/mixin.scss

@@ -0,0 +1 @@
+$default: red

+ 46 - 0
src/utils/request.js

@@ -0,0 +1,46 @@
+import axios from "axios";
+const service = axios.create({
+    baseURL: import.meta.env.VITE_BASE_API, //接口统一域名
+    timeout: 6000, //设置超时
+   
+});
+
+// request拦截器
+service.interceptors.request.use(
+    (config) => {
+        config.data = JSON.stringify(config.data); //数据转化,也可以使用qs转换
+        // config.headers = {
+        //     'Content-Type': 'application/json' //配置请求头
+        // }
+        // config.headers = { 'Content-Type': 'application/x-www-form-urlencoded' } //配置请求头
+        //如有需要:注意使用token的时候需要引入cookie方法或者用本地localStorage等方法,推荐js-cookie
+        // const token = sessionStorage.getItem("token"); //这里取token之前,你肯定需要先拿到token,存一下
+        // if (token) {
+        //     // config.params = { 'admin_token': token } //如果要求携带在参数中
+        //     config.headers["token"] = token; //如果要求携带在请求头中
+        // }
+        return config;
+    },
+    (error) => {
+        Promise.reject(error);
+    }
+);
+// 响应拦截器
+service.interceptors.response.use(
+    (response) => {
+        const res = response.data;
+
+        return response.data;
+    },
+    (error) => {
+        /* Message({
+                      message: '服务器调用错误',
+                      type: 'error',
+                      duration: 5 * 1000
+                    }) */
+        console.log(error);
+
+        return Promise.reject(error);
+    }
+);
+export default service;

+ 22 - 0
src/utils/rsa.js

@@ -0,0 +1,22 @@
+import { JSEncrypt } from 'jsencrypt';
+let publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMOcPB06u5yKyQsPjfVWiWgbEIrd14kiXNNihciaVKb6HnkQvq7zpQuZ80WEX94spnUMI3iOAl/GmIvHrpGwcbB4hJbznm+PajiwnUSPuCCXA68YJF640cJKb/8KeM7WVz69OFkIEPHhVxOy4FFF5QWe/kt6zOZ19HmE+ak+5x/QIDAQAB'
+let privateKey = '这里是封装的私钥'
+//加密方法
+export function RSAencrypt(pas) {
+    //实例化jsEncrypt对象
+    let jse = new JSEncrypt();
+    //设置公钥
+    jse.setPublicKey(publicKey);
+    console.log('加密:' + jse.encrypt(pas))
+    return jse.encrypt(pas);
+}
+
+//解密方法
+export function RSAdecrypt(pas) {
+    let jse = new JSEncrypt();
+    // 私钥
+    jse.setPrivateKey(privateKey)
+    console.log('解密:' + jse.decrypt(pas))
+    return jse.decrypt(pas);
+}
+

+ 794 - 0
src/views/account/account.vue

@@ -0,0 +1,794 @@
+<template>
+  <div class="content-box">
+    <div class="left">
+      <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
+      <span class="cameratxt">账号管理</span>
+    </div>
+    <div class="middle">
+      <div class="filter">
+        <div class="condition">
+          <span>账号 : </span>
+          <el-input clearable v-model="searchInput.account" @clear="searchBtn" class="w-50 m-2" placeholder="请输入账号"
+            style="width: 150px" />
+        </div>
+        <div class="condition">
+          <span>创建时间 : </span>
+          <el-date-picker v-model="searchInput.createTime" type="daterange" range-separator="-" start-placeholder="起始时间"
+            end-placeholder="结束时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" :prefix-icon="Calendar"
+            placeholder="请选择日期" />
+        </div>
+
+        <el-button style="margin-left: 20px" color="rgba(111, 182, 184, 1)" type="primary" class="search"
+          @click="searchBtn"><el-icon>
+            <Search />
+          </el-icon> <span>查询</span></el-button>
+      </div>
+      <!-- 按钮列表 -->
+      <div class="gongneng">
+        <el-button type="primary" color="rgba(111, 182, 184, 1)" @click="addlist"><el-icon>
+            <CirclePlus />
+          </el-icon><span>新增账号</span></el-button>
+        <el-button color="rgba(111, 182, 184, 1)" class="import" type="primary" @click="importExcel"><img
+            src="@/assets/import.png" style="width: 14px; height: 14px; margin-right: 4px" alt="" />
+          <span>导出表单</span></el-button>
+      </div>
+    </div>
+    <div class="footer">
+      <el-table :row-class-name="tableRowClassName" :data="tableData.list" @selection-change="handleSelectionChange"
+        style="width: 100%" :header-cell-style="{
+          background: 'rgba(240, 243, 247, 1)',
+          height: '50px',
+          border: 0,
+        }">
+        <!-- <el-table-column align="center" type="selection" width="80" /> -->
+        <el-table-column width="150" align="center" label="序号" type="index" index="1" />
+        <el-table-column align="center" prop="username" label="名称" />
+        <el-table-column align="center" prop="account" label="账号" />
+        <el-table-column align="center" prop="phone" label="手机号码" />
+        <el-table-column align="center" label="管理员">
+          <template #default="{ row }">
+            {{ row.isSuper == 1 ? "超级管理员" : "管理员" }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="updateTime" label="创建时间" />
+
+        <el-table-column align="center" label="操作" width="220">
+          <template #default="scope">
+            <div class="options">
+              <div class="look" @click="edit(scope.row)">编辑</div>
+
+              <el-popconfirm width="220" confirm-button-text="确认" cancel-button-text="取消" :icon="InfoFilled"
+                icon-color="#f89626" title="是否删除此账号?" @confirm="del(scope.row)" @cancel="cancelEvent">
+                <template #reference>
+                  <div class="look">删除</div>
+                </template>
+              </el-popconfirm>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 添加车辆弹窗 -->
+      <el-dialog class="addStaff" v-model="addDialogVisible" :close-on-click-modal="false" :close-on-press-escape="false"
+        :title="dialongTitle" align-center width="609" :before-close="cancelAdd">
+        <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="100px" class="demo-ruleForm"
+          :size="formSize" label-position="left" status-icon>
+          <el-form-item label="校区 :" prop="schoolId">
+            <el-select v-model="ruleForm.schoolId" placeholder="请选择校区">
+              <el-option label="黄家湖校区" :value="1" />
+              <el-option label="墨轩湖校区" :value="2" />
+            </el-select>
+          </el-form-item>
+          <el-form-item v-if="dialongTitle == '新增账号'" label="微校卡号 :" prop="cardNumber">
+            <el-input v-model="ruleForm.cardNumber" placeholder="请输入微校卡号" clearable />
+          </el-form-item>
+          <el-form-item label="账号 :" prop="account" v-if="dialongTitle == '新增账号'">
+            <el-input v-model="ruleForm.account" placeholder="请输入账号" clearable />
+          </el-form-item>
+          <el-form-item label="账号 :" prop="account" v-if="dialongTitle == '编辑信息'">
+            <el-input v-model="ruleForm.account" disabled placeholder="请输入账号" clearable />
+          </el-form-item>
+          <el-form-item label="密码 :" v-if="dialongTitle == '新增账号'" prop="pass">
+            <el-input v-model="ruleForm.pass" placeholder="请输入密码" clearable />
+          </el-form-item>
+          <el-form-item label="手机号码 :" prop="phone">
+            <el-input v-model="ruleForm.phone" placeholder="请输入手机号码" clearable />
+          </el-form-item>
+          <el-form-item label="用户名称 :" prop="name" style="
+              padding-bottom: 40px;
+              border-bottom: 1px solid rgba(230, 230, 230, 1);
+            ">
+            <el-input v-model="ruleForm.name" placeholder="请输入用户名称" clearable />
+          </el-form-item>
+
+          <el-form-item>
+            <div class="options">
+              <el-button color="rgba(111, 182, 184, 1)" class="queding" type="primary" @click="submitAdd(ruleFormRef)">
+                确定
+              </el-button>
+              <el-button class="congzhi" @click="cancelAdd()">取消</el-button>
+            </div>
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+    </div>
+
+    <!-- 分页组件 -->
+    <el-pagination background :current-page="currentPage" :page-size="pageSize"
+      layout="total, prev, pager, next, jumper, slot" :total="total" @update:current-page="handleCurrentChange" />
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  reactive,
+  watch,
+  nextTick,
+  onBeforeMount,
+  onUnmounted,
+} from "vue";
+import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import { dayjs } from "element-plus";
+import lodash, { reduce } from "lodash";
+import axios from "axios";
+import { useStore } from "vuex";
+const store = useStore();
+const router = useRouter();
+// 表格数据
+const tableData = reactive({ list: [] });
+const activeIndex = ref(); // 默认跳转路由
+const dialongTitle = ref("新增账号"); // 弹窗标题
+
+const searchInput = reactive({
+  account: "",
+  createTime: "",
+}); // 搜索按钮数据
+5;
+
+const currentPage = ref(1); // 当前页
+const pageSize = ref(10);
+const total = ref(); // 当前总数
+const selectData = reactive({ list: [] }); // 多选框选择的数据
+const api = ref("");
+const addDialogVisible = ref(false); // 控制添加员工弹窗
+
+// 表单数据
+const formSize = ref("default");
+const ruleFormRef = ref();
+const ruleForm = reactive({
+  schoolId: "",
+  cardNumber: "",
+  name: "",
+  account: "",
+  pass: "",
+  phone: "",
+  id: "",
+});
+// 表单验证
+const rules = reactive({
+  account: [
+    { required: true, message: "账号不能为空", trigger: "blur" },
+    // { min: 3, max: 5, message: "Length should be 3 to 5", trigger: "blur" },
+    // {
+    //   pattern: /^[a-zA-z]\w{3,15}$/,
+    //   message: "请输入正确账号",
+    //   trigger: "blur",
+    // },
+  ],
+  // ^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*,\._\+(){}])[0-9a-zA-Z!@#$%^&*,\\._\+(){}]{8,20}$
+  pass: [
+    {
+      required: true,
+      message: "密码不能为空",
+      trigger: "blur",
+    },
+    // {
+    //   min: 8,
+    //   max: 20,
+    //   pattern:
+    //     /^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*,\._\+(){}])[0-9a-zA-Z!@#$%^&*,\\._\+(){}]{8,20}$/,
+    //   message: "请输入8-20位正确密码(大小写字母·字符·数字)",
+    //   trigger: "blur",
+    // },
+  ],
+  name: [
+    {
+      required: true,
+      message: "用户名称不能为空",
+      trigger: "blur",
+    },
+  ],
+  phone: [
+    {
+      required: true,
+      message: "手机号码不能为空",
+      trigger: "blur",
+    },
+  ],
+  schoolId: [
+    {
+      required: true,
+      message: "校区不能为空",
+      trigger: "blur",
+    },
+  ],
+  cardNumber: [
+    {
+      required: true,
+      message: "微校卡号不能为空",
+      trigger: "blur",
+    },
+  ],
+  // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
+});
+
+watch(
+  () => searchInput.createTime,
+  (newVal, oldVal) => {
+    console.log("监听时间:", newVal);
+    if (newVal == null) {
+      searchBtn();
+    }
+  }
+);
+// 获取账户列表
+const getList = async (message) => {
+  // let res = await vidiconsApi.queryCamera(data);
+  // let data = new FormData();
+  // if (searchInput.createTime == null) {
+  //   searchInput.createTime = "";
+  // }
+  // data.set("number", searchInput.carnumber);
+  // data.set("create_time", searchInput.createTime); //前面的key记得对应!
+  // data.set("page", currentPage.value);
+  // data.set("rows", pageSize.value); //前面的key记得对应!
+  let data = {
+    currentPage: currentPage.value, // 当前页
+    pageCount: pageSize.value, // 一页数据条数
+    // account:"",  //账号
+    // phone:"",  //手机号
+    // userName:"",  //账号名称
+  };
+  if (searchInput.account) {
+    data.account = searchInput.account;
+  }
+  if (searchInput.createTime) {
+    data.startTime = searchInput.createTime[0];
+    data.endTime = searchInput.createTime[1];
+  }
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairAdmin/queryPageRepairAdmin",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "账号信息");
+  if (res.data.code == 200) {
+    tableData.list = res.data.data.list;
+    currentPage.value = res.data.data.currPage;
+    total.value = res.data.data.totalCount;
+  } else {
+    // tableData.list = res.data.rows;
+    // currentPage.value = 1;
+    // total.value = res.data.total;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+    // if (res.data.message == "token错误") {
+    //   router.push({
+    //     path: `/login`,
+    //   });
+    // }
+  }
+};
+
+// 搜索功能
+const searchBtn = lodash.debounce(async () => {
+  getList();
+}, 300);
+
+// 重置搜索
+const searchRefresh = lodash.debounce(async () => {
+  searchInput.carnumber = "";
+  searchInput.createTime = "";
+  currentPage.value = 1;
+  getList();
+}, 300);
+
+//导出功能
+const importExcel = async () => {
+  let datas = {};
+  if (searchInput.account) {
+    data.account = searchInput.account;
+  }
+  if (searchInput.createTime) {
+    data.startTime = searchInput.createTime[0];
+    data.endTime = searchInput.createTime[1];
+  }
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairAdmin/downloadRepairAdminExcel",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    responseType: "blob",
+    params: datas,
+  });
+  console.log(res, "导出账号");
+  if (res.status == 200) {
+    let name = `账号管理数据`;
+    var content = res.data;
+    // var data = new Blob([content],{type:"application/octet-stream;charset=utf-8"});
+    // var data = new Blob([content], {
+    //   type: "application/vnd.ms-excel;charset=utf-8",
+    // });
+    var data = new Blob([content]);
+    var downloadUrl = window.URL.createObjectURL(data);
+    var anchor = document.createElement("a");
+    anchor.href = downloadUrl;
+    anchor.download = name + ".xlsx";
+    anchor.click();
+    window.URL.revokeObjectURL(data);
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: "导出成功",
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+// 添加员工
+const addlist = () => {
+  dialongTitle.value = "新增账号";
+  addDialogVisible.value = true;
+  ruleForm.name = "";
+  ruleForm.account = "";
+  ruleForm.pass = "";
+  ruleForm.phone = "";
+  ruleForm.schoolId = "";
+  ruleForm.cardNumber = "";
+};
+// 取消添加员工
+const cancelAdd = () => {
+  addDialogVisible.value = false;
+  ruleFormRef.value.resetFields();
+};
+//编辑按钮
+const edit = (row) => {
+  dialongTitle.value = "编辑信息";
+  addDialogVisible.value = true;
+  console.log(row);
+  ruleForm.pass = row.password;
+  ruleForm.phone = row.phone;
+  ruleForm.name = row.username;
+  ruleForm.account = row.account;
+  ruleForm.schoolId = row.schoolId;
+  ruleForm.cardNumber = row.cardNumber;
+  ruleForm.id = row.id;
+};
+// 确认添加员工
+const submitAdd = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      if (dialongTitle.value == "新增账号") {
+        let data = {
+          username: ruleForm.name,
+          account: ruleForm.account,
+          password: ruleForm.pass,
+          phone: ruleForm.phone,
+          schoolId: ruleForm.schoolId,
+          cardNumber: ruleForm.cardNumber,
+        };
+        let res = await axios({
+          method: "post",
+          url: api.value + "/repairAdmin/insertRepairAdmin",
+          headers: {
+            token: sessionStorage.getItem("token"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+        console.log(res, "添加账号");
+        if (res.data.code == 200) {
+          getList();
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+          addDialogVisible.value = false;
+          ruleFormRef.value.resetFields();
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      } else {
+        let data = {
+          username: ruleForm.name,
+          phone: ruleForm.phone,
+          id: ruleForm.id,
+        };
+        let res = await axios({
+          method: "post",
+          url: api.value + "/repairAdmin/updateRepairAdminById",
+          headers: {
+            token: sessionStorage.getItem("token"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+        // console.log(res, "修改账号");
+        if (res.data.code == 200) {
+          getList();
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+          addDialogVisible.value = false;
+          ruleFormRef.value.resetFields();
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      }
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+};
+
+//删除按钮
+const del = async (row) => {
+  console.log(row);
+  let data = {
+    id: row.id,
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairAdmin/deleteRepairAdminById",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  if (res.data.code == 200) {
+    if (tableData.list.length == 1 && currentPage.value != 1) {
+      currentPage.value = currentPage.value - 1;
+    }
+    getList();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+  console.log(res);
+};
+// 取消删除
+const cancelEvent = () => {
+  ElMessage({
+    type: "info",
+    showClose: true,
+    message: "取消删除",
+    center: true,
+  });
+};
+
+// 多选框功能
+// const handleSelectionChange = (val) => {
+//   console.log(val);
+//   selectData.list = val;
+// };
+
+// 表格斑马纹颜色修改
+const tableRowClassName = ({ row, rowIndex }) => {
+  if (rowIndex % 2 === 0) {
+    return "even";
+  } else if (rowIndex % 2 !== 0) {
+    return "odd";
+  }
+  return "";
+};
+// 分页
+const handleCurrentChange = (value) => {
+  // console.log(value);
+  currentPage.value = value;
+  getList();
+};
+
+onBeforeMount(() => {
+  api.value = store.state.user.api;
+  getList();
+});
+onUnmounted(() => {
+  // document.removeEventListener("keyup", Enters);
+});
+</script>
+
+<style scoped lang="scss">
+.content-box {
+  width: 97.5%;
+  height: 89%;
+  margin: 20px auto;
+  background-color: #fff;
+  color: #fff;
+  display: flex;
+  flex-direction: column;
+  box-shadow: 0px 3px 10px rgba(213, 228, 252, 1);
+
+  .left {
+    // width: calc(100wh - 40px);
+    display: flex;
+    align-items: center;
+    height: 60px;
+    margin: 0 30px;
+    border-bottom: 1px solid #ccc;
+    color: #000;
+    font-size: 18px;
+    font-weight: 600;
+
+    .camera {
+      margin-right: 15px;
+      color: #4392f7;
+    }
+  }
+
+  .middle {
+    width: 96%;
+    margin: 0 auto;
+
+    color: #000;
+
+    // border-bottom: 1px solid rgb(231, 231, 231);
+    .filter {
+      display: flex;
+      flex-wrap: wrap;
+      align-items: center;
+      margin: 10px 0 0 0;
+
+      .search {
+        margin-left: 0 !important;
+        color: #fff;
+      }
+
+      .condition {
+        display: flex;
+        align-items: center;
+        margin: 10px 30px 10px 0;
+
+        :deep(.el-input .el-input__inner) {
+          font-size: 16px;
+        }
+
+        span {
+          margin: 0 10px 0 0;
+        }
+      }
+    }
+
+    .gongneng {
+      margin: 10px 0;
+
+      .el-button {
+        color: #fff;
+      }
+    }
+
+    :deep(.cont) {
+      width: 60%;
+      margin: 20px auto;
+    }
+
+    :deep(.download) {
+      display: flex;
+      align-items: center;
+      margin: 10px;
+    }
+
+    :deep(.download span) {
+      font-size: 16px;
+      margin-left: 20px;
+    }
+
+    :deep(.cont .el-button) {
+      margin-left: 60px;
+      margin-bottom: 30px;
+    }
+
+    :deep(.cont .accomplish) {
+      width: 100%;
+      display: flex;
+      justify-content: center;
+    }
+
+    :deep(.cont .accomplish .el-button) {
+      width: 50%;
+      margin: 0;
+    }
+  }
+
+  .footer {
+    width: 96%;
+    height: 550px;
+    margin: 10px auto 10px;
+
+    .el-table--fit {
+      height: 100%;
+
+      :deep(.el-table__header-wrapper) {
+        background-color: #000;
+        font-size: 16px;
+        color: #000;
+      }
+
+      :deep(.el-table__row) {
+        height: 50px;
+        font-size: 16px;
+        color: #000;
+      }
+
+      :deep(.el-table__row td) {
+        padding: 0;
+        border: 0;
+      }
+
+      .el-button--primary {
+        margin-left: 5px;
+      }
+
+      :deep(.el-table__body .even) {
+        background-color: #fff;
+      }
+
+      :deep(.el-table__body .odd) {
+        background-color: rgba(240, 243, 247, 1);
+      }
+
+      :deep(.options) {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+
+        .look {
+          padding: 5px 10px;
+          color: rgba(111, 182, 184, 1);
+          cursor: pointer;
+        }
+      }
+    }
+
+    // 添加员工弹窗样式
+    :deep(.addStaff) {
+      //   height: 420px;
+      border-radius: 11px;
+
+      .el-dialog__header {
+        border-radius: 11px 11px 0 0;
+        background: rgba(237, 241, 245, 1);
+        font-weight: 600;
+        margin: 0;
+
+        .el-dialog__headerbtn {
+          outline: none;
+        }
+      }
+
+      .el-dialog__body {
+        padding: 30px 20px 10px 20px;
+
+        .el-input {
+          width: 200px;
+
+          .el-input__suffix-inner {
+            color: rgba(61, 81, 232, 1);
+          }
+        }
+
+        .options {
+          display: flex;
+          flex-direction: row-reverse;
+          margin: 10px 20px 0 0;
+          width: 100%;
+
+          .queding {
+            color: #fff;
+            margin-left: 15px;
+          }
+        }
+      }
+    }
+  }
+
+  .el-pagination {
+    // width: 1600px;
+    width: 96%;
+    margin: 20px auto 18px;
+    justify-content: flex-end;
+
+    :deep(.el-pagination__total) {
+      color: #000;
+    }
+
+    :deep(.el-pagination__goto) {
+      color: #000;
+    }
+
+    :deep(.el-pagination__classifier) {
+      color: #000;
+    }
+
+    :deep(.el-input__wrapper) {
+      border: 1px solid rgba(0, 0, 0, 1);
+      border-radius: 5px;
+      box-shadow: none;
+    }
+
+    :deep(.el-pager li) {
+      margin: 0 5px;
+      border: 1px solid rgba(0, 0, 0, 1);
+      border-radius: 5px;
+      background-color: transparent;
+    }
+
+    :deep(.el-pager li.is-active) {
+      background-color: rgba(111, 182, 184, 1);
+    }
+
+    :deep(.btn-prev) {
+      margin-right: 5px;
+      border: 1px solid rgba(0, 0, 0, 1);
+      border-radius: 5px;
+      background-color: transparent;
+    }
+
+    :deep(.btn-next) {
+      margin-left: 5px;
+      border: 1px solid rgba(0, 0, 0, 1);
+      border-radius: 5px;
+      background-color: transparent;
+    }
+  }
+}
+
+.el-input {
+  width: 192px;
+}
+</style>

+ 0 - 0
src/views/affiche/affiche.vue


Some files were not shown because too many files changed in this diff