From 093388d51f56e95d155f204971d49fe303b76408 Mon Sep 17 00:00:00 2001
From: longyvfengyun <496960745@qq.com>
Date: 星期三, 06 九月 2023 17:24:24 +0800
Subject: [PATCH] 门禁历史记录

---
 src/views/accessControl/accessControl.vue              |   42 +
 package-lock.json                                      |  769 ++++++++++++++++++++++++++++++++++++++
 src/views/accessControl/js/api.js                      |   23 +
 src/main.js                                            |   27 +
 src/views/home/js/homeInfoModule.js                    |   14 
 src/views/accessControl/js/doorInfoModule.js           |   76 ++-
 package.json                                           |    6 
 src/views/accessControl/components/doorHistoryData.vue |   99 ++++
 src/assets/js/tools/exportExcelUtil.js                 |   30 +
 vite.config.js                                         |    2 
 src/views/accessControl/js/doorInfoHistoryModule.js    |   89 ++++
 11 files changed, 1,116 insertions(+), 61 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 392cefc..724cb02 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,16 +11,20 @@
         "@element-plus/icons-vue": "^2.1.0",
         "axios": "^1.4.0",
         "element-plus": "^2.3.6",
+        "file-saver": "^2.0.5",
         "jquery": "^3.7.0",
         "js-md5": "^0.7.3",
         "pinia": "^2.1.4",
+        "script-loader": "^0.7.2",
         "vue": "^3.3.4",
-        "vue-router": "^4.2.2"
+        "vue-router": "^4.2.2",
+        "xlsx": "^0.18.5"
       },
       "devDependencies": {
         "@vitejs/plugin-vue": "^4.2.3",
         "less": "^4.1.3",
         "vite": "^4.3.9",
+        "vite-plugin-require-transform": "^1.0.21",
         "vite-plugin-windicss": "^1.9.0",
         "windicss": "^3.5.6"
       }
@@ -34,15 +38,170 @@
         "url": "https://github.com/sponsors/antfu"
       }
     },
-    "node_modules/@babel/parser": {
+    "node_modules/@babel/code-frame": {
+      "version": "7.22.13",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+      "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/highlight": "^7.22.13",
+        "chalk": "^2.4.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz",
+      "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.22.15",
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jsesc": "^2.5.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-environment-visitor": {
       "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
-      "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+      "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-function-name": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+      "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/template": "^7.22.5",
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-hoist-variables": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-split-export-declaration": {
+      "version": "7.22.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz",
+      "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.22.13",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz",
+      "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.22.5",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz",
+      "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
       "engines": {
         "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+      "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.22.13",
+        "@babel/parser": "^7.22.15",
+        "@babel/types": "^7.22.15"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz",
+      "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.22.13",
+        "@babel/generator": "^7.22.15",
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-function-name": "^7.22.5",
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/parser": "^7.22.15",
+        "@babel/types": "^7.22.15",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz",
+      "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.15",
+        "to-fast-properties": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
     "node_modules/@ctrl/tinycolor": {
@@ -426,10 +585,52 @@
         "@floating-ui/core": "^1.3.0"
       }
     },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+      "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+      "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
     },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
@@ -729,6 +930,26 @@
         "url": "https://github.com/sponsors/antfu"
       }
     },
+    "node_modules/adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/async-validator": {
       "version": "4.2.5",
       "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
@@ -761,6 +982,55 @@
         "node": ">=8"
       }
     },
+    "node_modules/cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "dev": true
+    },
     "node_modules/combined-stream": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -782,6 +1052,17 @@
       },
       "funding": {
         "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+      "bin": {
+        "crc32": "bin/crc32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
       }
     },
     "node_modules/csstype": {
@@ -899,6 +1180,15 @@
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
     },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
     "node_modules/estree-walker": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -928,6 +1218,11 @@
       "dependencies": {
         "reusify": "^1.0.4"
       }
+    },
+    "node_modules/file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
     },
     "node_modules/fill-range": {
       "version": "7.0.1",
@@ -973,6 +1268,14 @@
         "node": ">= 6"
       }
     },
+    "node_modules/frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/fsevents": {
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -999,12 +1302,30 @@
         "node": ">= 6"
       }
     },
+    "node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
       "dev": true,
       "optional": true
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
     },
     "node_modules/iconv-lite": {
       "version": "0.6.3",
@@ -1086,6 +1407,24 @@
       "version": "0.7.3",
       "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz",
       "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ=="
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
     },
     "node_modules/kolorist": {
       "version": "1.8.0",
@@ -1424,6 +1763,11 @@
         }
       ]
     },
+    "node_modules/raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+    },
     "node_modules/reusify": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -1487,6 +1831,14 @@
       "dev": true,
       "optional": true
     },
+    "node_modules/script-loader": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz",
+      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
+      "dependencies": {
+        "raw-loader": "~0.5.1"
+      }
+    },
     "node_modules/semver": {
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -1513,6 +1865,38 @@
       "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
       "engines": {
         "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "dependencies": {
+        "frac": "~1.1.2"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
       }
     },
     "node_modules/to-regex-range": {
@@ -1581,6 +1965,18 @@
         }
       }
     },
+    "node_modules/vite-plugin-require-transform": {
+      "version": "1.0.21",
+      "resolved": "https://registry.npmjs.org/vite-plugin-require-transform/-/vite-plugin-require-transform-1.0.21.tgz",
+      "integrity": "sha512-A3SrHhVg9tCW35O7E8kcuB71YTEdVd3EaM1zh6gbH4zxy4WzXSfcNf0UiWmaHHhr6wdFhiiAGdpR6S0SUxXkGQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/generator": "^7.22.5",
+        "@babel/parser": "^7.22.5",
+        "@babel/traverse": "^7.22.5",
+        "@babel/types": "^7.22.5"
+      }
+    },
     "node_modules/vite-plugin-windicss": {
       "version": "1.9.0",
       "resolved": "https://registry.npmjs.org/vite-plugin-windicss/-/vite-plugin-windicss-1.9.0.tgz",
@@ -1636,6 +2032,42 @@
       "engines": {
         "node": ">= 12"
       }
+    },
+    "node_modules/wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/xlsx": {
+      "version": "0.18.5",
+      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
+      "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "cfb": "~1.2.1",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      },
+      "bin": {
+        "xlsx": "bin/xlsx.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
     }
   },
   "dependencies": {
@@ -1645,10 +2077,129 @@
       "integrity": "sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==",
       "dev": true
     },
-    "@babel/parser": {
+    "@babel/code-frame": {
+      "version": "7.22.13",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+      "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.22.13",
+        "chalk": "^2.4.2"
+      }
+    },
+    "@babel/generator": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz",
+      "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.22.15",
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jsesc": "^2.5.1"
+      }
+    },
+    "@babel/helper-environment-visitor": {
       "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
-      "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q=="
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+      "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
+      "dev": true
+    },
+    "@babel/helper-function-name": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+      "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.22.5",
+        "@babel/types": "^7.22.5"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.22.5"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.22.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.22.5"
+      }
+    },
+    "@babel/helper-string-parser": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+      "dev": true
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz",
+      "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==",
+      "dev": true
+    },
+    "@babel/highlight": {
+      "version": "7.22.13",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz",
+      "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.22.5",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz",
+      "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA=="
+    },
+    "@babel/template": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+      "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.22.13",
+        "@babel/parser": "^7.22.15",
+        "@babel/types": "^7.22.15"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz",
+      "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.22.13",
+        "@babel/generator": "^7.22.15",
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-function-name": "^7.22.5",
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/parser": "^7.22.15",
+        "@babel/types": "^7.22.15",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/types": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz",
+      "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-string-parser": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.15",
+        "to-fast-properties": "^2.0.0"
+      }
     },
     "@ctrl/tinycolor": {
       "version": "3.6.0",
@@ -1828,10 +2379,43 @@
         "@floating-ui/core": "^1.3.0"
       }
     },
+    "@jridgewell/gen-mapping": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "dev": true,
+      "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.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+      "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+      "dev": true
+    },
+    "@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "dev": true
+    },
     "@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+    },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+      "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
     },
     "@nodelib/fs.scandir": {
       "version": "2.1.5",
@@ -2059,6 +2643,20 @@
         "windicss": "^3.5.6"
       }
     },
+    "adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
     "async-validator": {
       "version": "4.2.5",
       "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
@@ -2088,6 +2686,46 @@
         "fill-range": "^7.0.1"
       }
     },
+    "cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      }
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "dev": true
+    },
     "combined-stream": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -2104,6 +2742,11 @@
       "requires": {
         "is-what": "^3.14.1"
       }
+    },
+    "crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
     },
     "csstype": {
       "version": "3.1.2",
@@ -2196,6 +2839,12 @@
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
     },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true
+    },
     "estree-walker": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -2223,6 +2872,11 @@
         "reusify": "^1.0.4"
       }
     },
+    "file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
     "fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -2247,6 +2901,11 @@
         "mime-types": "^2.1.12"
       }
     },
+    "frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+    },
     "fsevents": {
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -2263,12 +2922,24 @@
         "is-glob": "^4.0.1"
       }
     },
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true
+    },
     "graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
       "dev": true,
       "optional": true
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true
     },
     "iconv-lite": {
       "version": "0.6.3",
@@ -2329,6 +3000,18 @@
       "version": "0.7.3",
       "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz",
       "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ=="
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true
     },
     "kolorist": {
       "version": "1.8.0",
@@ -2539,6 +3222,11 @@
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
       "dev": true
     },
+    "raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+    },
     "reusify": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -2577,6 +3265,14 @@
       "dev": true,
       "optional": true
     },
+    "script-loader": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz",
+      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
+      "requires": {
+        "raw-loader": "~0.5.1"
+      }
+    },
     "semver": {
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -2595,6 +3291,29 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
       "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+    },
+    "ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "requires": {
+        "frac": "~1.1.2"
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "dev": true
     },
     "to-regex-range": {
       "version": "5.0.1",
@@ -2621,6 +3340,18 @@
         "fsevents": "~2.3.2",
         "postcss": "^8.4.23",
         "rollup": "^3.21.0"
+      }
+    },
+    "vite-plugin-require-transform": {
+      "version": "1.0.21",
+      "resolved": "https://registry.npmjs.org/vite-plugin-require-transform/-/vite-plugin-require-transform-1.0.21.tgz",
+      "integrity": "sha512-A3SrHhVg9tCW35O7E8kcuB71YTEdVd3EaM1zh6gbH4zxy4WzXSfcNf0UiWmaHHhr6wdFhiiAGdpR6S0SUxXkGQ==",
+      "dev": true,
+      "requires": {
+        "@babel/generator": "^7.22.5",
+        "@babel/parser": "^7.22.5",
+        "@babel/traverse": "^7.22.5",
+        "@babel/types": "^7.22.5"
       }
     },
     "vite-plugin-windicss": {
@@ -2660,6 +3391,30 @@
       "resolved": "https://registry.npmjs.org/windicss/-/windicss-3.5.6.tgz",
       "integrity": "sha512-P1mzPEjgFMZLX0ZqfFht4fhV/FX8DTG7ERG1fBLiWvd34pTLVReS5CVsewKn9PApSgXnVfPWwvq+qUsRwpnwFA==",
       "dev": true
+    },
+    "wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
+    },
+    "word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
+    },
+    "xlsx": {
+      "version": "0.18.5",
+      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
+      "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "cfb": "~1.2.1",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      }
     }
   }
 }
diff --git a/package.json b/package.json
index d7ddb20..14c9dd2 100644
--- a/package.json
+++ b/package.json
@@ -11,16 +11,20 @@
     "@element-plus/icons-vue": "^2.1.0",
     "axios": "^1.4.0",
     "element-plus": "^2.3.6",
+    "file-saver": "^2.0.5",
     "jquery": "^3.7.0",
     "js-md5": "^0.7.3",
     "pinia": "^2.1.4",
+    "script-loader": "^0.7.2",
     "vue": "^3.3.4",
-    "vue-router": "^4.2.2"
+    "vue-router": "^4.2.2",
+    "xlsx": "^0.18.5"
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^4.2.3",
     "less": "^4.1.3",
     "vite": "^4.3.9",
+    "vite-plugin-require-transform": "^1.0.21",
     "vite-plugin-windicss": "^1.9.0",
     "windicss": "^3.5.6"
   }
diff --git a/src/assets/js/tools/exportExcelUtil.js b/src/assets/js/tools/exportExcelUtil.js
new file mode 100644
index 0000000..d86053e
--- /dev/null
+++ b/src/assets/js/tools/exportExcelUtil.js
@@ -0,0 +1,30 @@
+import * as XLSX from "xlsx";
+import FileSaver from 'file-saver';
+function exportExcelUtil(headers, data, fileName, sheetName) {
+  // 鏍煎紡鍖栨暟鎹幓闄ゆ棤鏁堟暟鎹�
+  let list = data.map(item=>{
+    let obj = {};
+    Object.keys(headers).forEach(key=>{
+      obj[key] = item[key];
+    });
+    return obj;
+  });
+  const exportData = [
+    headers,
+    ...list,
+  ];
+  sheetName = sheetName?sheetName:"Sheet1";
+  fileName = fileName?fileName:"鏂板缓xlsx宸ヤ綔琛�";
+  // 娉ㄦ剰琛ㄦ牸涓婄粦瀹歩d锛岃幏鍙杁om鍏冪礌
+  const worksheet = XLSX.utils.json_to_sheet(exportData, { skipHeader: true });
+  const workbook = XLSX.utils.book_new();
+  XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
+  const workbookOutput = XLSX.write(workbook, { bookType: "xlsx", type: "array" });
+  try {
+    FileSaver.saveAs(new Blob([workbookOutput], { type: 'application/octet-stream' }), fileName+".xlsx")
+  } catch (e) {
+    console.log(e)
+  }
+}
+
+export default exportExcelUtil;
diff --git a/src/main.js b/src/main.js
index 214d721..da4123f 100644
--- a/src/main.js
+++ b/src/main.js
@@ -5,6 +5,8 @@
 import ElementPlus from "element-plus";
 import "element-plus/dist/index.css";
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+import zhCn from "element-plus/es/locale/lang/zh-cn";
+
 
 import { createPinia } from 'pinia'
 
@@ -24,7 +26,30 @@
   return hold;
 };
 
-app.use(ElementPlus);
+//鏍煎紡鍖栨椂闂�
+Date.prototype.format = function (format) {
+  var o = {
+    "M+": this.getMonth() + 1, //month
+    "d+": this.getDate(), //day
+    "h+": this.getHours(), //hour
+    "m+": this.getMinutes(), //minute
+    "s+": this.getSeconds(), //second
+    "q+": Math.floor((this.getMonth() + 3) / 3), //quarter
+    "S": this.getMilliseconds() //millisecond
+  };
+  if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
+    (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+  for (var k in o)
+    if (new RegExp("(" + k + ")").test(format))
+      format = format.replace(RegExp.$1,
+        RegExp.$1.length == 1 ? o[k] :
+          ("00" + o[k]).substr(("" + o[k]).length));
+  return format;
+};
+
+app.use(ElementPlus, {
+  locale: zhCn
+});
 app.use(router);
 app.use(pinia);
 
diff --git a/src/views/accessControl/accessControl.vue b/src/views/accessControl/accessControl.vue
index e1c17c5..f5265ed 100644
--- a/src/views/accessControl/accessControl.vue
+++ b/src/views/accessControl/accessControl.vue
@@ -1,9 +1,10 @@
 <script setup>
+import {ref} from "vue";
 import FlexBox from "@/components/FlexBox.vue";
 import doorInfoModule from "@/views/accessControl/js/doorInfoModule";
-import HdwLight from "@/components/HdwLight.vue";
 import {ElMessageBox} from "element-plus";
-const {doorInfos, openDoor, closeDoor} = doorInfoModule();
+import DoorHistoryData from "@/views/accessControl/components/doorHistoryData.vue";
+const {doorInfos, openDoor} = doorInfoModule();
 const openDoorConfirm = async (info)=>{
 	ElMessageBox.confirm(
 		"纭寮�鍚棬绂�",
@@ -19,20 +20,15 @@
 	}).catch(()=>{});
 }
 
-const closeDoorConfirm = async (info)=>{
-	ElMessageBox.confirm(
-		"纭鍏抽棴闂ㄧ",
-		"绯荤粺鎻愮ず",
-		{
-			confirmButtonText: '纭畾',
-			cancelButtonText: '鍙栨秷',
-			type: 'info',
-			draggable: true,
-		}
-	).then(()=>{
-		closeDoor(info);
-	}).catch(()=>{});
+const doorHistoryDialog = ref(false);
+const carcameraId = ref(0);
+const carcameraName = ref(0);
+const showHistoryDialog = (data)=>{
+	doorHistoryDialog.value =  true;
+	carcameraId.value = data.carcameraId;
+	carcameraName.value =data.carcameraName;
 }
+
 </script>
 
 <template>
@@ -45,14 +41,16 @@
 							<div class="access-control-item">
 								<div class="access-control-tool">
 									<div class="access-control-tool-item">
-										<el-button type="warning" size="large" @click="openDoorConfirm(item)">寮�闂�</el-button>
+										<el-button type="warning" @click="openDoorConfirm(item)">寮�闂�</el-button>
+										<div style="margin-bottom: 8px;"></div>
+										<el-button type="success" @click="showHistoryDialog(item)">鍘嗗彶</el-button>
 									</div>
 								</div>
 								<flex-box>
 									<div class="access-control-img">
 										<img src="./images/menJin.png" alt="">
 									</div>
-									<div class="access-control-text home-number">{{ item.name }}</div>
+									<div class="access-control-text home-number">{{ item.carcameraName }}</div>
 									<div class="access-control-text state">闂ㄩ攣鐘舵�侊細<span :class="{'error-text': item.status !==0}">{{ item.statusText }}</span></div>
 								</flex-box>
 							</div>
@@ -62,6 +60,16 @@
 			</div>
 		</div>
 	</div>
+	<el-dialog
+		class="center-dialog"
+		title="闂ㄧ鍘嗗彶鏁版嵁"
+		width="auto"
+		v-model="doorHistoryDialog"
+		align-center
+		:close-on-click-modal="false"
+		:modal-append-to-body="false">
+		<door-history-data v-if="doorHistoryDialog" :id="carcameraId" :name="carcameraName"></door-history-data>
+	</el-dialog>
 </template>
 
 <style lang="less" scoped>
diff --git a/src/views/accessControl/components/doorHistoryData.vue b/src/views/accessControl/components/doorHistoryData.vue
new file mode 100644
index 0000000..c1424ea
--- /dev/null
+++ b/src/views/accessControl/components/doorHistoryData.vue
@@ -0,0 +1,99 @@
+<script setup>
+import doorInfoHistoryModule from "@/views/accessControl/js/doorInfoHistoryModule";
+import {onMounted} from "vue";
+const props = defineProps({
+	id: {
+		type: [Number, String],
+		default: 0
+	},
+	name: {
+		type: [Number, String],
+		default: 0
+	}
+});
+
+const {page, doorHistoryData, searchDoorHistory, exportFile} = doorInfoHistoryModule(props.id);
+const handleSizeChange = (size)=>{
+	page.value.pageSize = size;
+	searchDoorHistory();
+}
+const handleCurrentChange = (current)=>{
+	page.value.pageCurr = current;
+	searchDoorHistory();
+}
+
+onMounted(()=>{
+	searchDoorHistory();
+});
+</script>
+
+<template>
+	<div class="tbl-wrapper">
+		<div class="tbl-container">
+			<el-table
+				stripe
+				empty-text="鏆傛棤鏁版嵁"
+				:data="doorHistoryData"
+				height="100%">
+				<el-table-column
+					type="index"
+					label="缂栧彿"
+					width="80">
+				</el-table-column>
+				<el-table-column
+					align="center"
+					prop="carcameraName"
+					label="闂ㄧ鍚嶇О">
+				</el-table-column>
+				<el-table-column
+					align="center"
+					prop="recordTime"
+					label="寮�闂ㄦ椂闂�">
+				</el-table-column>
+				<el-table-column
+					align="center"
+					prop="state"
+					label="鐘舵�佸彉鎹�">
+				</el-table-column>
+			</el-table>
+		</div>
+		<div class="paging-wrapper">
+			<el-button type="primary" size="small" @click="searchDoorHistory()">鏌ヨ</el-button>
+			<el-popover placement="top" effect="dark" :width="200" trigger="click">
+				<template #reference>
+					<el-button type="primary" size="small" style="margin-right: 16px">瀵煎嚭</el-button>
+				</template>
+				<el-button type="primary" size="small" @click="exportFile">瀵煎嚭褰撳墠椤�</el-button>
+				<el-button type="primary" size="small" @click="exportFile(true)">瀵煎嚭鍏ㄩ儴</el-button>
+			</el-popover>
+			<div class="paging-container">
+				<el-pagination
+					@size-change="handleSizeChange"
+					@current-change="handleCurrentChange"
+					:current-page.sync="page.pageCurr"
+					:page-size="page.pageSize"
+					layout="total, sizes, prev, pager, next"
+					:total="page.total">
+				</el-pagination>
+			</div>
+		</div>
+	</div>
+</template>
+
+<style scoped>
+.tbl-wrapper {
+	background-color: #FFFFFF;
+}
+.tbl-container {
+	width: 700px;
+	height: 440px;
+}
+.paging-wrapper {
+	text-align: center;
+	padding: 4px 8px;
+}
+.paging-container {
+	margin-left: 8px;
+	display: inline-block;
+}
+</style>
diff --git a/src/views/accessControl/js/api.js b/src/views/accessControl/js/api.js
index 01bf52c..c7c221e 100644
--- a/src/views/accessControl/js/api.js
+++ b/src/views/accessControl/js/api.js
@@ -16,3 +16,26 @@
     }
   });
 }
+
+/**
+ * 鏌ヨ闂ㄧ淇℃伅
+ * @return {Promise<axios.AxiosResponse<any>> | *}
+ */
+export const searchDoorInfoApi = ()=>{
+  return axios({
+    method: "GET",
+    url: "/CarCameraInf/getCarCameraInf",
+  });
+}
+
+export const searchDoorHistoryApi = (carCameraId, pageCurr, pageSize)=>{
+  return axios({
+    method: "GET",
+    url: "/CarCameraHis/getCarCameraHis",
+    params: {
+      carCameraId,
+      pageCurr,
+      pageSize,
+    }
+  });
+}
diff --git a/src/views/accessControl/js/doorInfoHistoryModule.js b/src/views/accessControl/js/doorInfoHistoryModule.js
new file mode 100644
index 0000000..13ca22c
--- /dev/null
+++ b/src/views/accessControl/js/doorInfoHistoryModule.js
@@ -0,0 +1,89 @@
+import {searchDoorHistoryApi} from "@/views/accessControl/js/api";
+import {ref} from "vue";
+import door from "@/assets/js/const/door";
+import getLabelByKey from "@/assets/js/tools/getLabelByKey";
+import exportExcelUtil from "@/assets/js/tools/exportExcelUtil";
+import { ElMessage } from 'element-plus';
+
+const doorInfoHistoryModule =  (id)=>{
+  const doorId = ref(id);
+  const headers = {carcameraName:"闂ㄧ鍚嶇О", recordTime: "寮�闂ㄦ椂闂�", state: "鐘舵�佸彉鎹�"};
+  const lockStatusList = door.lockStatus;
+  const doorHistoryData = ref([]);
+  const page = ref({
+    pageCurr: 1,
+    pageSize: 10,
+    total: 0
+  });
+
+  /**
+   * 鏌ヨ闂ㄧ寮�闂ㄥ巻鍙茶褰�
+   * @return {Promise<void>}
+   */
+  const searchDoorHistory = async (isExportFile, isAll)=>{
+    const pageValue = page.value;
+    // 鍒ゆ柇鏄惁瀵煎嚭鍏ㄩ儴 === 涓嶈兘鍒犻櫎锛岄槻姝sExPortFile={}
+    isExportFile = isExportFile === true;
+    isAll = isAll === true;
+    try{
+      const curr = isExportFile && isAll?1:pageValue.pageCurr;
+      const size = isExportFile && isAll?pageValue.total:pageValue.pageSize;
+      const res = await searchDoorHistoryApi(doorId.value, curr, size);
+      let list = [];
+      let pageCurr = 1;
+      let total = 0;
+      let rs = res.data;
+      if(rs.code === 1 && rs.data) {
+        let data2 = rs.data2;
+        list = data2.list.map(item=>{
+          let lastState = getLabelByKey(item.lastStatus, lockStatusList, "鏈煡");
+          let state = getLabelByKey(item.status, lockStatusList, "鏈煡");
+          item.carcameraName = item.cameraInf.carcameraName;
+          item.state = "浠�"+lastState+"鍙樻洿涓�"+state;
+          return item;
+        });
+        pageCurr = data2.pageNum;
+        total = data2.total;
+      }else {
+        pageCurr = 0;
+        total = 0;
+      }
+      if(isExportFile) {
+        exportExcelUtil(
+          headers,
+          list,
+          "闂ㄧ鍘嗗彶璁板綍-"+new Date().format("yyyy-MM-dd hh:mm:ss")
+        );
+      }else {
+        page.value.pageCurr = pageCurr;
+        page.value.total = total;
+        doorHistoryData.value = list;
+      }
+    }catch (e) {
+      page.value.pageCurr = 0;
+      page.value.total = 0;
+    }
+  }
+
+  const exportFile = (isAll)=>{
+    isAll = isAll === true;
+    if(page.value.total === 0) {
+      ElMessage({
+        message: '鏆傛棤鏁版嵁锛屾棤娉曞鍑�',
+        type: 'warning',
+      })
+      return;
+    }
+    searchDoorHistory(true, isAll);
+  }
+
+  return {
+    doorId,
+    page,
+    doorHistoryData,
+    searchDoorHistory,
+    exportFile
+  }
+}
+
+export default doorInfoHistoryModule;
diff --git a/src/views/accessControl/js/doorInfoModule.js b/src/views/accessControl/js/doorInfoModule.js
index a62ef48..a160380 100644
--- a/src/views/accessControl/js/doorInfoModule.js
+++ b/src/views/accessControl/js/doorInfoModule.js
@@ -1,57 +1,63 @@
 import createWs from "@/assets/js/tools/websocket/createWs";
-import {onMounted, reactive} from "vue";
+import {onMounted, ref} from "vue";
 import door from "@/assets/js/const/door";
 import getLabelByKey from "@/assets/js/tools/getLabelByKey";
-import {changeDoorState} from "@/views/accessControl/js/api";
+import {changeDoorState, searchDoorInfoApi} from "@/views/accessControl/js/api";
 import {ElLoading, ElMessage} from "element-plus";
 const lockStatusList = door.lockStatus;
 const doorInfoModule = ()=>{
   const {
     SOCKET
-  } = createWs("carCameraSocket");
+  } = createWs("carCameraRtSocket");
 
-  const doorInfos = reactive([
+  const doorInfos = ref([
     {
+      carcameraId: 8001,
+      carcameraName: "鏅鸿兘瀹為獙瀹�",
       ip: "192.168.0.18",
-      passWord: "a1234567.",
+      num: 1,
+      password: "a1234567.",
       port: 8000,
-      userName: "admin",
       status: 0,
-      name: "鏅鸿兘瀹為獙瀹�",
-      statusText: "鏈煡"
-    },
-    {
-      ip: "192.168.0.19",
-      passWord: "a1234567.",
-      port: 8000,
-      userName: "admin",
-      status: 0,
-      name: "PCR瀹為獙瀹�",
-      statusText: "鏈煡"
-    },
-    {
-      ip: "192.168.0.44",
-      passWord: "a1234567.",
-      port: 8000,
-      userName: "admin",
-      status: 0,
-      name: "瑗胯棌瀹夌惇",
-      statusText: "鏈煡"
-    },
+      statusText: "姝e父鍏�",
+      userName: "admin"
+    }
   ]);
 
+
+  const searchDoorInfo = async ()=>{
+    try{
+      const res = await searchDoorInfoApi();
+      const rs = res.data;
+      if(rs.code === 1 && rs.data) {
+        doorInfos.value = rs.data2.map(item=>{
+          item.status = -1;
+          item.statusText = "鏈煡";
+          return item;
+        });
+      }
+    }catch (e) {
+      console.log(e);
+    }
+  }
   const handleOpen = ()=>{
-    SOCKET.value.send(JSON.stringify(doorInfos));
+    SOCKET.value.send(JSON.stringify(doorInfos.value));
   }
 
   const handleMessage = (res)=>{
     let rs = JSON.parse(res.data);
-    let data = rs.data;
-    doorInfos.map(item=>{
-      let doorInfo = data[item.ip];
-      item.status = doorInfo.data2.lockStatus;
-      item.statusText = getLabelByKey(doorInfo.data2.lockStatus, lockStatusList, "鏈煡");
-    });
+    if(rs.code ===1 && rs.data) {
+      let data = rs.data2;
+      doorInfos.value.map(item=>{
+        for(let i=0; i<data.length; i++) {
+          if(item.carcameraId === data[i].carcameraId) {
+            const lockStatus = data[i].lockStatus;
+            item.status = lockStatus;
+            item.statusText = getLabelByKey(lockStatus, lockStatusList, "鏈煡");
+          }
+        }
+      });
+    }
   }
   /**
    * 寮�鍚棬绂�
@@ -119,6 +125,8 @@
   }
 
   onMounted(()=>{
+    searchDoorInfo();
+
     SOCKET.value.addEventListener("open", handleOpen, false);
     SOCKET.value.addEventListener("message", handleMessage, false);
   });
diff --git a/src/views/home/js/homeInfoModule.js b/src/views/home/js/homeInfoModule.js
index 03a5534..ece87fc 100644
--- a/src/views/home/js/homeInfoModule.js
+++ b/src/views/home/js/homeInfoModule.js
@@ -33,6 +33,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "left",
@@ -51,6 +52,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -69,6 +71,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "left",
@@ -87,6 +90,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -105,6 +109,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -123,6 +128,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -141,6 +147,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -159,6 +166,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -177,6 +185,7 @@
       temp: 0,
       hum: 0,
       diffPre: 0,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -195,6 +204,7 @@
       temp: 0,
       hum: 0,
       diffPre: 0,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -213,6 +223,7 @@
       temp: 0,
       hum: 0,
       diffPre: 0,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -231,6 +242,7 @@
       temp: 0,
       hum: 0,
       diffPre: 0,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "top",
@@ -249,6 +261,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "left",
@@ -267,6 +280,7 @@
       temp: 32,
       hum: 7,
       diffPre: 1,
+      noInfo: true,
       pos: {
         visible: true,
         placement: "left",
diff --git a/vite.config.js b/vite.config.js
index 1af06e1..cda1bda 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -17,7 +17,7 @@
   },
   plugins: [
     vue(),
-    WindiCSS(),
+    WindiCSS()
   ],
   server: {
     port: 8080,

--
Gitblit v1.9.1