Jelajahi Sumber

上传文件和公共样式

dusenyao 1 tahun lalu
induk
melakukan
c9b46a571c

+ 197 - 199
package-lock.json

@@ -8,9 +8,9 @@
       "name": "gcls_page_textbook",
       "version": "0.1.0",
       "dependencies": {
-        "@electron-forge/plugin-fuses": "^7.3.0",
+        "@electron-forge/plugin-fuses": "^7.3.1",
         "axios": "^1.6.8",
-        "core-js": "^3.36.0",
+        "core-js": "^3.36.1",
         "electron-squirrel-startup": "^1.0.0",
         "element-ui": "^2.15.14",
         "js-cookie": "^3.0.5",
@@ -21,15 +21,15 @@
         "vuex": "^3.6.2"
       },
       "devDependencies": {
-        "@babel/core": "^7.24.0",
-        "@babel/eslint-parser": "^7.23.10",
-        "@electron-forge/cli": "^7.3.0",
-        "@electron-forge/maker-deb": "^7.3.0",
-        "@electron-forge/maker-rpm": "^7.3.0",
-        "@electron-forge/maker-squirrel": "^7.3.0",
-        "@electron-forge/maker-zip": "^7.3.0",
-        "@electron-forge/plugin-auto-unpack-natives": "^7.3.0",
-        "@rushstack/eslint-patch": "^1.7.2",
+        "@babel/core": "^7.24.3",
+        "@babel/eslint-parser": "^7.24.1",
+        "@electron-forge/cli": "^7.3.1",
+        "@electron-forge/maker-deb": "^7.3.1",
+        "@electron-forge/maker-rpm": "^7.3.1",
+        "@electron-forge/maker-squirrel": "^7.3.1",
+        "@electron-forge/maker-zip": "^7.3.1",
+        "@electron-forge/plugin-auto-unpack-natives": "^7.3.1",
+        "@rushstack/eslint-patch": "^1.8.0",
         "@types/md5": "^2.3.5",
         "@vue/cli-plugin-babel": "~5.0.8",
         "@vue/cli-plugin-eslint": "~5.0.8",
@@ -37,7 +37,7 @@
         "@vue/eslint-config-prettier": "^9.0.0",
         "@vue/preload-webpack-plugin": "^2.0.0",
         "compression-webpack-plugin": "^6.1.2",
-        "electron": "^29.1.4",
+        "electron": "^29.1.5",
         "eslint": "^8.57.0",
         "eslint-plugin-prettier": "^5.1.3",
         "eslint-plugin-vue": "^9.23.0",
@@ -96,13 +96,13 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.23.5",
-      "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.23.5.tgz",
-      "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+      "version": "7.24.2",
+      "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.2.tgz",
+      "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==",
       "dev": true,
       "dependencies": {
-        "@babel/highlight": "^7.23.4",
-        "chalk": "^2.4.2"
+        "@babel/highlight": "^7.24.2",
+        "picocolors": "^1.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -118,20 +118,20 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.24.0.tgz",
-      "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==",
+      "version": "7.24.3",
+      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.24.3.tgz",
+      "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
       "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.23.5",
-        "@babel/generator": "^7.23.6",
+        "@babel/code-frame": "^7.24.2",
+        "@babel/generator": "^7.24.1",
         "@babel/helper-compilation-targets": "^7.23.6",
         "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helpers": "^7.24.0",
-        "@babel/parser": "^7.24.0",
+        "@babel/helpers": "^7.24.1",
+        "@babel/parser": "^7.24.1",
         "@babel/template": "^7.24.0",
-        "@babel/traverse": "^7.24.0",
+        "@babel/traverse": "^7.24.1",
         "@babel/types": "^7.24.0",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
@@ -144,9 +144,9 @@
       }
     },
     "node_modules/@babel/eslint-parser": {
-      "version": "7.23.10",
-      "resolved": "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz",
-      "integrity": "sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==",
+      "version": "7.24.1",
+      "resolved": "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz",
+      "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==",
       "dev": true,
       "dependencies": {
         "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
@@ -162,14 +162,14 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.6.tgz",
-      "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+      "version": "7.24.1",
+      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.1.tgz",
+      "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.23.6",
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
+        "@babel/types": "^7.24.0",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
       },
       "engines": {
@@ -482,13 +482,13 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.0.tgz",
-      "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==",
+      "version": "7.24.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.1.tgz",
+      "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==",
       "dev": true,
       "dependencies": {
         "@babel/template": "^7.24.0",
-        "@babel/traverse": "^7.24.0",
+        "@babel/traverse": "^7.24.1",
         "@babel/types": "^7.24.0"
       },
       "engines": {
@@ -496,23 +496,24 @@
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.23.4.tgz",
-      "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+      "version": "7.24.2",
+      "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.24.2.tgz",
+      "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==",
       "dev": true,
       "dependencies": {
         "@babel/helper-validator-identifier": "^7.22.20",
         "chalk": "^2.4.2",
-        "js-tokens": "^4.0.0"
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.0.tgz",
-      "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
+      "version": "7.24.1",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.1.tgz",
+      "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -1812,18 +1813,18 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.0.tgz",
-      "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==",
+      "version": "7.24.1",
+      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.1.tgz",
+      "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.23.5",
-        "@babel/generator": "^7.23.6",
+        "@babel/code-frame": "^7.24.1",
+        "@babel/generator": "^7.24.1",
         "@babel/helper-environment-visitor": "^7.22.20",
         "@babel/helper-function-name": "^7.23.0",
         "@babel/helper-hoist-variables": "^7.22.5",
         "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/parser": "^7.24.0",
+        "@babel/parser": "^7.24.1",
         "@babel/types": "^7.24.0",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
@@ -1902,13 +1903,13 @@
       }
     },
     "node_modules/@electron-forge/cli": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/cli/-/cli-7.3.0.tgz",
-      "integrity": "sha512-tIzNYTvCEjJbma7zLWpa03phLKX/pd9f+vG+0HlIpmESMFGWhyLDzunZn0YOOXPRKpCTVg5RpC+BVte1Da4VjQ==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/cli/-/cli-7.3.1.tgz",
+      "integrity": "sha512-qPIeLxUO5d0xqiJZn0eZ17ytkDjFCN1acgrO/4B767PHsy5MmylyK0ulnRje/aQ/K+u/bN7N0cDyWs3JAEYZrQ==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/core": "7.3.0",
-        "@electron-forge/shared-types": "7.3.0",
+        "@electron-forge/core": "7.3.1",
+        "@electron-forge/shared-types": "7.3.1",
         "@electron/get": "^3.0.0",
         "chalk": "^4.0.0",
         "commander": "^4.1.1",
@@ -2109,24 +2110,24 @@
       "dev": true
     },
     "node_modules/@electron-forge/core": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/core/-/core-7.3.0.tgz",
-      "integrity": "sha512-Z0wvs/YutUzo5xbCBjhoWSnlO1y5DbM4LMa5Di4Dxaf8v/xi7PQ/ncjAiOJKFYI8mG23Nn8Ae13weG0tiXISbA==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/core-utils": "7.3.0",
-        "@electron-forge/maker-base": "7.3.0",
-        "@electron-forge/plugin-base": "7.3.0",
-        "@electron-forge/publisher-base": "7.3.0",
-        "@electron-forge/shared-types": "7.3.0",
-        "@electron-forge/template-base": "7.3.0",
-        "@electron-forge/template-vite": "7.3.0",
-        "@electron-forge/template-vite-typescript": "7.3.0",
-        "@electron-forge/template-webpack": "7.3.0",
-        "@electron-forge/template-webpack-typescript": "7.3.0",
-        "@electron-forge/tracer": "7.3.0",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/core/-/core-7.3.1.tgz",
+      "integrity": "sha512-Gveci4eAIk4zH/cS+reHqccoAN/qJPde9K/5TotNyNvu8l6QxGd+qJL4bqCixUUXdQ7Nq4tEG12gB/DtUHb6Bw==",
+      "dev": true,
+      "dependencies": {
+        "@electron-forge/core-utils": "7.3.1",
+        "@electron-forge/maker-base": "7.3.1",
+        "@electron-forge/plugin-base": "7.3.1",
+        "@electron-forge/publisher-base": "7.3.1",
+        "@electron-forge/shared-types": "7.3.1",
+        "@electron-forge/template-base": "7.3.1",
+        "@electron-forge/template-vite": "7.3.1",
+        "@electron-forge/template-vite-typescript": "7.3.1",
+        "@electron-forge/template-webpack": "7.3.1",
+        "@electron-forge/template-webpack-typescript": "7.3.1",
+        "@electron-forge/tracer": "7.3.1",
         "@electron/get": "^3.0.0",
-        "@electron/packager": "^18.1.2",
+        "@electron/packager": "^18.1.3",
         "@electron/rebuild": "^3.2.10",
         "@malept/cross-spawn-promise": "^2.0.0",
         "chalk": "^4.0.0",
@@ -2155,12 +2156,12 @@
       }
     },
     "node_modules/@electron-forge/core-utils": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/core-utils/-/core-utils-7.3.0.tgz",
-      "integrity": "sha512-cKeWuC8zYcp2n9caRWvCQgwIFtDqaUlwQVeg2VBpgJTGYHNKEDQHadR2xtIXTcfNgPUbQEAXiaS2xuxuhPQLfw==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/core-utils/-/core-utils-7.3.1.tgz",
+      "integrity": "sha512-+DLk6Futxb4576vi5FKjem1v9+D8EuaLVQy9Y3om7oYkc5JC3eTVSqbryVTEfoyNIm1xdZqya4tRSQ9v7EWu7A==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0",
+        "@electron-forge/shared-types": "7.3.1",
         "@electron/rebuild": "^3.2.10",
         "@malept/cross-spawn-promise": "^2.0.0",
         "chalk": "^4.0.0",
@@ -2558,12 +2559,12 @@
       "dev": true
     },
     "node_modules/@electron-forge/maker-base": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-base/-/maker-base-7.3.0.tgz",
-      "integrity": "sha512-1o0YT1QBCf9oAfQNJmWQehn+DQp8mqaUbwaivNtIgTKRlzAVfD7UoAS7izuUqEW6M6NOvFXfCQjp7IgGckVVBg==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-base/-/maker-base-7.3.1.tgz",
+      "integrity": "sha512-FWQg2IIBodLh6ms6UvIRdQ4WiNUrUvlzUfIyKQ/DbMk9MUCxbzqY8YI76Uv5vna/rGdXf0lPOC48tpOgTREv/g==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0",
+        "@electron-forge/shared-types": "7.3.1",
         "fs-extra": "^10.0.0",
         "which": "^2.0.2"
       },
@@ -2601,13 +2602,13 @@
       }
     },
     "node_modules/@electron-forge/maker-deb": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-deb/-/maker-deb-7.3.0.tgz",
-      "integrity": "sha512-rlTYjF18p1rVVzInr9kJPSwELvu2ycLp7qGi/Nrj91N2cS92D3z8l6UkQE6wvhsBMhhL0sOX+NyDhvzKoRsWNQ==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-deb/-/maker-deb-7.3.1.tgz",
+      "integrity": "sha512-A+UAxIcSsUoks9hiYoYHe3GIz02OkBBY7quVfiSUrYe2HXB7/++PsxOJ6pSwAFyJ9gzRBU+rSigocXOCFyvB8Q==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/maker-base": "7.3.0",
-        "@electron-forge/shared-types": "7.3.0"
+        "@electron-forge/maker-base": "7.3.1",
+        "@electron-forge/shared-types": "7.3.1"
       },
       "engines": {
         "node": ">= 16.4.0"
@@ -2617,13 +2618,13 @@
       }
     },
     "node_modules/@electron-forge/maker-rpm": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-rpm/-/maker-rpm-7.3.0.tgz",
-      "integrity": "sha512-EzfkRcnWeLYHUvGmtP2KcGU8I93izAaGfYze1xQqG6BQ0FXjEm7xcESy2gZThX/2vEtQUdjCdIbfVf4yveZKFQ==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-rpm/-/maker-rpm-7.3.1.tgz",
+      "integrity": "sha512-ICf9SyXoT6nNC8qROIJhuiWByDhgtf0CWVUKIC8oDvQ2N3hQCNhDwpKycAm2psX30j1M/HpKfqe0C+pBntcW+w==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/maker-base": "7.3.0",
-        "@electron-forge/shared-types": "7.3.0"
+        "@electron-forge/maker-base": "7.3.1",
+        "@electron-forge/shared-types": "7.3.1"
       },
       "engines": {
         "node": ">= 16.4.0"
@@ -2633,20 +2634,20 @@
       }
     },
     "node_modules/@electron-forge/maker-squirrel": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-squirrel/-/maker-squirrel-7.3.0.tgz",
-      "integrity": "sha512-JXKKwztnIDiMjzwUwROphZyIAtUivw7YOsWhskuxj/KhxtHpksNboBbwhvbvX8stfzVl2M95IgqATyPJXClQ9w==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-squirrel/-/maker-squirrel-7.3.1.tgz",
+      "integrity": "sha512-eUOTdt5KTt/kWl1HIQHBOvlJbrhqVeXMiPwSXffVWWWJb+h+ckFdQmu1jtQySWKcgj7ZkbP1j+0uQFm82Nb5gQ==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/maker-base": "7.3.0",
-        "@electron-forge/shared-types": "7.3.0",
+        "@electron-forge/maker-base": "7.3.1",
+        "@electron-forge/shared-types": "7.3.1",
         "fs-extra": "^10.0.0"
       },
       "engines": {
         "node": ">= 16.4.0"
       },
       "optionalDependencies": {
-        "electron-winstaller": "^5.0.0"
+        "electron-winstaller": "^5.3.0"
       }
     },
     "node_modules/@electron-forge/maker-squirrel/node_modules/fs-extra": {
@@ -2664,13 +2665,13 @@
       }
     },
     "node_modules/@electron-forge/maker-zip": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-zip/-/maker-zip-7.3.0.tgz",
-      "integrity": "sha512-VYYLScDpibVIiMRK7JWeCS9G8VYvPXa1X6p6fNYQoFOWommG9zC7OOnFfNnLBrH1+0ginZRJeLD1zo+cM12JuQ==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/maker-zip/-/maker-zip-7.3.1.tgz",
+      "integrity": "sha512-kH8M5gZnzO13rZIjzEPe+xLFZ0OrxLpJCrF64km2SksVCP8GKdWuD92z/vXZsyXfzQpa8mjHvqigzAB5R6mEiQ==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/maker-base": "7.3.0",
-        "@electron-forge/shared-types": "7.3.0",
+        "@electron-forge/maker-base": "7.3.1",
+        "@electron-forge/shared-types": "7.3.1",
         "cross-zip": "^4.0.0",
         "fs-extra": "^10.0.0",
         "got": "^11.8.5"
@@ -2694,36 +2695,36 @@
       }
     },
     "node_modules/@electron-forge/plugin-auto-unpack-natives": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.3.0.tgz",
-      "integrity": "sha512-cWcor6pEplaAo2OSr+khth4282xoLUtESdSLtGtRYE1Q8sNM5BbPKcwyr3tP8FFgWnj2TAYbpubwScLyb5BXZA==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.3.1.tgz",
+      "integrity": "sha512-DNg4KK2GcFycwQHV/H5KYUGQMdmNgGZ5lMAdaBUY+tLyiiJpNdjAfH7H+UwL2zupxF+XJ5llv1GQyObQJxOkXA==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/plugin-base": "7.3.0",
-        "@electron-forge/shared-types": "7.3.0"
+        "@electron-forge/plugin-base": "7.3.1",
+        "@electron-forge/shared-types": "7.3.1"
       },
       "engines": {
         "node": ">= 16.4.0"
       }
     },
     "node_modules/@electron-forge/plugin-base": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/plugin-base/-/plugin-base-7.3.0.tgz",
-      "integrity": "sha512-cS0dqi9yTMgKzy1RhJ21YheRjWSbUh0bOKuByYAWevdqMZfqO2KyhXIsmH5QizL+bub8uWOUsknXVrOp73NLfw==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/plugin-base/-/plugin-base-7.3.1.tgz",
+      "integrity": "sha512-4mAzUqfOkRqBwFmE3yO+9dEM2nK9PN/UXFALjN42GS7hbLorluHVmzELkC48Y6M0k1Q+GN3NAdzfMiD+X2PWVA==",
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0"
+        "@electron-forge/shared-types": "7.3.1"
       },
       "engines": {
         "node": ">= 16.4.0"
       }
     },
     "node_modules/@electron-forge/plugin-fuses": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/plugin-fuses/-/plugin-fuses-7.3.0.tgz",
-      "integrity": "sha512-+p23S+NQwia+uX1D6Hx01R2b0Ck2bNVDgS1JL8lyU8cz3OXAA3J52Ck94wMslwmj2TfdV0ErsMxI/QOQlPffiw==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/plugin-fuses/-/plugin-fuses-7.3.1.tgz",
+      "integrity": "sha512-l6JtSlW8FihJtYVE/2MHmGBkTOItQgzRw4fGs0KRS0/A1fQie7mlRz6aYPXPdx+QOhyWJSV6L2DY06QTB1R1Xw==",
       "dependencies": {
-        "@electron-forge/plugin-base": "7.3.0",
-        "@electron-forge/shared-types": "7.3.0"
+        "@electron-forge/plugin-base": "7.3.1",
+        "@electron-forge/shared-types": "7.3.1"
       },
       "engines": {
         "node": ">= 16.4.0"
@@ -2733,24 +2734,24 @@
       }
     },
     "node_modules/@electron-forge/publisher-base": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/publisher-base/-/publisher-base-7.3.0.tgz",
-      "integrity": "sha512-iO8QuM0zTLcEA0/7adEUOzMrhu/h6Qk9UiWNUllBctZXZ+FO0CbAY7eGzOgjOKqH5akbEKHwCSRnjrFt91QpQg==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/publisher-base/-/publisher-base-7.3.1.tgz",
+      "integrity": "sha512-2JMTbUfgBi11AkprTclyeGhn4dwN0rsDVzHYLwOZ08cWSMhvQ0zy/YznI4Yfl9pptirb9I9X8fLQMEK4XbeBQA==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0"
+        "@electron-forge/shared-types": "7.3.1"
       },
       "engines": {
         "node": ">= 16.4.0"
       }
     },
     "node_modules/@electron-forge/shared-types": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/shared-types/-/shared-types-7.3.0.tgz",
-      "integrity": "sha512-+YGOTGUGVrcaRm9zO3xsWSj2GS9iVY6E1WTG0vD2OxZtdEGcdy3hZryV72f5gH+qeZZvujYSR2s7VvZjhFEHaQ==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/shared-types/-/shared-types-7.3.1.tgz",
+      "integrity": "sha512-yRW3UWd+AwtK1UrZxWCtxqnD1lF6e+1GWXdgR186/UX2CMy+jVzUtL4Xk+xMKrLgiVKZglVbTdee1cEb6egtVw==",
       "dependencies": {
-        "@electron-forge/tracer": "7.3.0",
-        "@electron/packager": "^18.1.2",
+        "@electron-forge/tracer": "7.3.1",
+        "@electron/packager": "^18.1.3",
         "@electron/rebuild": "^3.2.10",
         "listr2": "^5.0.3"
       },
@@ -2759,12 +2760,12 @@
       }
     },
     "node_modules/@electron-forge/template-base": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/template-base/-/template-base-7.3.0.tgz",
-      "integrity": "sha512-Lf0fupMzuO9XuBOaWoQ5QljjQ89B7TYU40+eEUvxnIMNAfnU3n+cfhC4xGLldmh+LYRuotB1jJitX79BwRqzIA==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/template-base/-/template-base-7.3.1.tgz",
+      "integrity": "sha512-iGzjWeZlxoIdZMaLu4ABwG4AzI2/QEUMM9817mMVb24+7ZUTtrP8WJWkpsJjcEjXtb1oyt3CRoNqQt+iH6H1BA==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0",
+        "@electron-forge/shared-types": "7.3.1",
         "@malept/cross-spawn-promise": "^2.0.0",
         "debug": "^4.3.1",
         "fs-extra": "^10.0.0",
@@ -2789,13 +2790,13 @@
       }
     },
     "node_modules/@electron-forge/template-vite": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/template-vite/-/template-vite-7.3.0.tgz",
-      "integrity": "sha512-4vdOLmd0/rThA9lO/Tf16oCoDBPWGLRZZF+XM+ECPDfaL0CbFNoEa/NLrr6T/2D6IlV5+GnmVjz29LlVOFUB7w==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/template-vite/-/template-vite-7.3.1.tgz",
+      "integrity": "sha512-r1PFPZ2Y7t4EDte2HckTUiXQY1L++wofolm6TRzVv/h5ZViHq8vNBWvXTyZNtZOtqIErIRbGXHL1DbiRlgOMTg==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0",
-        "@electron-forge/template-base": "7.3.0",
+        "@electron-forge/shared-types": "7.3.1",
+        "@electron-forge/template-base": "7.3.1",
         "fs-extra": "^10.0.0"
       },
       "engines": {
@@ -2803,13 +2804,13 @@
       }
     },
     "node_modules/@electron-forge/template-vite-typescript": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.3.0.tgz",
-      "integrity": "sha512-4gVlJihXLM+r6GBOCeO6mSv5vZImew9Vp/xFfxMrf3nDThMCnA6HYLIGA361ZTbn4z3ARquXPo6Vsm7/s4ykbw==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.3.1.tgz",
+      "integrity": "sha512-YS2arQENkpBbpFXk7SlAulK77OMLgcutjmZd0jW9Z/PUCUo9rdTW9QmlCNFz37tRHvwpClJcTcAoKpCoJUrIVA==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0",
-        "@electron-forge/template-base": "7.3.0",
+        "@electron-forge/shared-types": "7.3.1",
+        "@electron-forge/template-base": "7.3.1",
         "fs-extra": "^10.0.0"
       },
       "engines": {
@@ -2845,13 +2846,13 @@
       }
     },
     "node_modules/@electron-forge/template-webpack": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/template-webpack/-/template-webpack-7.3.0.tgz",
-      "integrity": "sha512-5Cv0g+AHdEI2R4hPI38PzWTnqUwqpM36jpQgkXV1RnL3V9FvNuza/w9RLMj5bhGzB0j5M4bVbcnglMX0pDvVBQ==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/template-webpack/-/template-webpack-7.3.1.tgz",
+      "integrity": "sha512-SlzfFsOUVsx9Yk6Hhqqsw33s1/J1cx7eGkc9AVASKZnGHnFDGYUVyTr1ueR7SFQwZd5TOs7OISQ6sL2GQa4Icg==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0",
-        "@electron-forge/template-base": "7.3.0",
+        "@electron-forge/shared-types": "7.3.1",
+        "@electron-forge/template-base": "7.3.1",
         "fs-extra": "^10.0.0"
       },
       "engines": {
@@ -2859,13 +2860,13 @@
       }
     },
     "node_modules/@electron-forge/template-webpack-typescript": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.3.0.tgz",
-      "integrity": "sha512-eiBhsY/LUaV1vIy/PZqnmkxWyjEyN/PsXyq79lr1nuOKrqkVgZUe/IdvtNxr8wvPoKSScORNLHjiD/C2Jp74HA==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.3.1.tgz",
+      "integrity": "sha512-cCFAuiKiKCNAJTXOgA3NTLAU6VQ0uYtGa6WiI8q5tK7d34Ef6zEuCKt5opI4zKXVdFrE0vYE0PBHH/M++z1g1w==",
       "dev": true,
       "dependencies": {
-        "@electron-forge/shared-types": "7.3.0",
-        "@electron-forge/template-base": "7.3.0",
+        "@electron-forge/shared-types": "7.3.1",
+        "@electron-forge/template-base": "7.3.1",
         "fs-extra": "^10.0.0"
       },
       "engines": {
@@ -2901,9 +2902,9 @@
       }
     },
     "node_modules/@electron-forge/tracer": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmmirror.com/@electron-forge/tracer/-/tracer-7.3.0.tgz",
-      "integrity": "sha512-FS7ABTm52BMP2BlR/pDmUIKtH9NI1i+BBJuKke58KguToBRuvAX1cLt0Hhkq4HlqYR9fNjRoCo1vrK4OBb0Bew==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmmirror.com/@electron-forge/tracer/-/tracer-7.3.1.tgz",
+      "integrity": "sha512-Jz6SgnHZ2Gk4l7WRu/rLyQTe6F23dXcTNsjI5gtUEJxjjd2K9L0UoxVcGikA7SEMUufaPyskSJfrW7NSZ4s43Q==",
       "dependencies": {
         "chrome-trace-event": "^1.0.3"
       },
@@ -2912,9 +2913,9 @@
       }
     },
     "node_modules/@electron/asar": {
-      "version": "3.2.8",
-      "resolved": "https://registry.npmmirror.com/@electron/asar/-/asar-3.2.8.tgz",
-      "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==",
+      "version": "3.2.9",
+      "resolved": "https://registry.npmmirror.com/@electron/asar/-/asar-3.2.9.tgz",
+      "integrity": "sha512-Vu2P3X2gcZ3MY9W7yH72X9+AMXwUQZEJBrsPIbX0JsdllLtoh62/Q8Wg370/DawIEVKOyfD6KtTLo645ezqxUA==",
       "dependencies": {
         "commander": "^5.0.0",
         "glob": "^7.1.6",
@@ -3002,9 +3003,9 @@
       }
     },
     "node_modules/@electron/osx-sign": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmmirror.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz",
-      "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/@electron/osx-sign/-/osx-sign-1.1.0.tgz",
+      "integrity": "sha512-9xxNAyTu2YEAfn2TOQXC5fcTZ9hxVT/zAgWOONpOvxivv5rU97RldGbJrxz+OBKXGAiQRJUYOY07mJI++S/iYw==",
       "dependencies": {
         "compare-version": "^0.1.2",
         "debug": "^4.3.4",
@@ -3391,9 +3392,9 @@
       }
     },
     "node_modules/@electron/windows-sign": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmmirror.com/@electron/windows-sign/-/windows-sign-1.1.1.tgz",
-      "integrity": "sha512-g8/atfOCKuuGedjVE6Xu/rlBtJvfDrmBH9UokBrjrvBVWdVz3SGV7DTjPTLvl7F+XUlmqj4genub62r3jKHIHw==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/@electron/windows-sign/-/windows-sign-1.1.2.tgz",
+      "integrity": "sha512-eXEiZjDtxW3QORCWfRUarANPRTlH9B6At4jqBZJ0NzokSGutXQUVLPA6WmGpIhDW6w2yCMdHW1EJd1HrXtU5sg==",
       "dependencies": {
         "cross-dirname": "^0.1.0",
         "debug": "^4.3.4",
@@ -3405,7 +3406,7 @@
         "electron-windows-sign": "bin/electron-windows-sign.js"
       },
       "engines": {
-        "node": ">=16.0.0"
+        "node": ">=14.14"
       }
     },
     "node_modules/@electron/windows-sign/node_modules/fs-extra": {
@@ -3735,14 +3736,14 @@
       }
     },
     "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz",
-      "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
       "dev": true,
       "dependencies": {
-        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
+        "@jridgewell/trace-mapping": "^0.3.24"
       },
       "engines": {
         "node": ">=6.0.0"
@@ -3758,9 +3759,9 @@
       }
     },
     "node_modules/@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==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
       "dev": true,
       "engines": {
         "node": ">=6.0.0"
@@ -3783,9 +3784,9 @@
       "dev": true
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.23",
-      "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz",
-      "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==",
+      "version": "0.3.25",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "dev": true,
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
@@ -4011,9 +4012,9 @@
       "dev": true
     },
     "node_modules/@rushstack/eslint-patch": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz",
-      "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==",
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.8.0.tgz",
+      "integrity": "sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ==",
       "dev": true
     },
     "node_modules/@sideway/address": {
@@ -7224,9 +7225,9 @@
       }
     },
     "node_modules/core-js": {
-      "version": "3.36.0",
-      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.36.0.tgz",
-      "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==",
+      "version": "3.36.1",
+      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.36.1.tgz",
+      "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==",
       "hasInstallScript": true
     },
     "node_modules/core-js-compat": {
@@ -8035,9 +8036,9 @@
       }
     },
     "node_modules/detect-libc": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.2.tgz",
-      "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.3.tgz",
+      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
       "engines": {
         "node": ">=8"
       }
@@ -8219,9 +8220,9 @@
       "dev": true
     },
     "node_modules/electron": {
-      "version": "29.1.4",
-      "resolved": "https://registry.npmmirror.com/electron/-/electron-29.1.4.tgz",
-      "integrity": "sha512-IWXys0SqgmIfrqXusUGQC0gGG7CCqA5vfmNsUMj8dFkAnK3lisKyjSESStWlrsste/OX/AAC5wsVlf23reUNnw==",
+      "version": "29.1.5",
+      "resolved": "https://registry.npmmirror.com/electron/-/electron-29.1.5.tgz",
+      "integrity": "sha512-1uWGRw/ffA62lcrklxGUgVxVtOHojsg/nwsYr+/F9cVjipZJn8iPv/ABGIIexhmUqWcho8BqfTJ4osCBa29gBg==",
       "dev": true,
       "hasInstallScript": true,
       "dependencies": {
@@ -8608,9 +8609,9 @@
       "dev": true
     },
     "node_modules/electron-winstaller": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmmirror.com/electron-winstaller/-/electron-winstaller-5.2.2.tgz",
-      "integrity": "sha512-nw+SbS0DA6SF8bEkcL4SqtPOoLKc5JkEXAz7kzdzz22rY12PZRtTn9zpztbwy+xrLqSBBFR1u0bdvNLpvlmrkw==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/electron-winstaller/-/electron-winstaller-5.3.0.tgz",
+      "integrity": "sha512-ml77/OmeeLFFc+dk3YCwPQrl8rthwYcAea6mMZPFq7cGXlpWyRmmT0LY73XdCukPnevguXJFs+4Xu+aGHJwFDA==",
       "dev": true,
       "hasInstallScript": true,
       "optional": true,
@@ -8623,6 +8624,9 @@
       },
       "engines": {
         "node": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@electron/windows-sign": "^1.1.2"
       }
     },
     "node_modules/electron-winstaller/node_modules/fs-extra": {
@@ -11212,11 +11216,6 @@
         "node": ">= 12"
       }
     },
-    "node_modules/ip-address/node_modules/sprintf-js": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz",
-      "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
-    },
     "node_modules/ipaddr.js": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz",
@@ -16076,12 +16075,6 @@
         "node": ">=8.0"
       }
     },
-    "node_modules/roarr/node_modules/sprintf-js": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz",
-      "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
-      "optional": true
-    },
     "node_modules/run-parallel": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -16922,6 +16915,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/sprintf-js": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz",
+      "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
+    },
     "node_modules/ssri": {
       "version": "8.0.1",
       "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz",

+ 12 - 12
package.json

@@ -15,9 +15,9 @@
     "make": "electron-forge make"
   },
   "dependencies": {
-    "@electron-forge/plugin-fuses": "^7.3.0",
+    "@electron-forge/plugin-fuses": "^7.3.1",
     "axios": "^1.6.8",
-    "core-js": "^3.36.0",
+    "core-js": "^3.36.1",
     "electron-squirrel-startup": "^1.0.0",
     "element-ui": "^2.15.14",
     "js-cookie": "^3.0.5",
@@ -28,23 +28,23 @@
     "vuex": "^3.6.2"
   },
   "devDependencies": {
-    "@babel/core": "^7.24.0",
-    "@babel/eslint-parser": "^7.23.10",
+    "@babel/core": "^7.24.3",
+    "@babel/eslint-parser": "^7.24.1",
     "@types/md5": "^2.3.5",
-    "@rushstack/eslint-patch": "^1.7.2",
+    "@rushstack/eslint-patch": "^1.8.0",
     "@vue/eslint-config-prettier": "^9.0.0",
     "@vue/preload-webpack-plugin": "^2.0.0",
-    "@electron-forge/cli": "^7.3.0",
-    "@electron-forge/maker-deb": "^7.3.0",
-    "@electron-forge/maker-rpm": "^7.3.0",
-    "@electron-forge/maker-squirrel": "^7.3.0",
-    "@electron-forge/maker-zip": "^7.3.0",
-    "@electron-forge/plugin-auto-unpack-natives": "^7.3.0",
+    "@electron-forge/cli": "^7.3.1",
+    "@electron-forge/maker-deb": "^7.3.1",
+    "@electron-forge/maker-rpm": "^7.3.1",
+    "@electron-forge/maker-squirrel": "^7.3.1",
+    "@electron-forge/maker-zip": "^7.3.1",
+    "@electron-forge/plugin-auto-unpack-natives": "^7.3.1",
     "@vue/cli-plugin-babel": "~5.0.8",
     "@vue/cli-plugin-eslint": "~5.0.8",
     "@vue/cli-service": "~5.0.8",
     "compression-webpack-plugin": "^6.1.2",
-    "electron": "^29.1.4",
+    "electron": "^29.1.5",
     "eslint": "^8.57.0",
     "eslint-plugin-prettier": "^5.1.3",
     "eslint-plugin-vue": "^9.23.0",

+ 6 - 0
src/App.vue

@@ -1,11 +1,17 @@
 <template>
   <div id="app">
     <RouterView />
+    <GlobalProgress />
   </div>
 </template>
 
 <script>
+import GlobalProgress from '@/components/GlobalProgress.vue';
+
 export default {
   name: 'App',
+  components: {
+    GlobalProgress,
+  },
 };
 </script>

+ 41 - 43
src/api/app.js

@@ -1,6 +1,6 @@
 import { http } from '@/utils/http';
-// import store from '@/store';
-// import { app } from '@/store/mutation-types';
+import store from '@/store';
+import { app } from '@/store/mutation-types';
 
 /**
  * @description 得到验证码图像
@@ -62,50 +62,48 @@ export function SaveFileByteBase64Text(data) {
  * @param {function} option.handleUploadProgress 上传进度回调
  * @param {boolean} option.isGlobalprogress 是否使用全局进度条
  */
-// export function fileUpload(
-//   SecurityLevel,
-//   file,
-//   { handleUploadProgress, isGlobalprogress = false } = { isGlobalprogress: false },
-// ) {
-//   let formData = null;
-//   if (file instanceof FormData) {
-//     formData = file;
-//   } else {
-//     formData = new FormData();
-//     formData.append(file.filename, file.file, file.file.name);
-//   }
+export async function fileUpload(
+  SecurityLevel,
+  file,
+  { handleUploadProgress, isGlobalprogress = false } = { isGlobalprogress: false },
+) {
+  let formData = null;
+  if (file instanceof FormData) {
+    formData = file;
+  } else {
+    formData = new FormData();
+    formData.append(file.filename, file.file, file.file.name);
+  }
 
-//   let onUploadProgress = handleUploadProgress || null;
-//   if (isGlobalprogress) {
-//     store.commit(`app/${app.SHOW_PROGRESS}`, true);
-//     onUploadProgress = ({ loaded, progress, total }) => {
-//       // 因为上传进度为 1 后,上传事件还会继续一段时间,所以这里将进度设置为 0.99
-//       let precent = progress >= 1 ? 0.99 : progress;
-//       store.commit(`app/${app.SET_UPLOAD_INFO}`, { loaded, progress: precent, total });
-//     };
-//   }
+  let onUploadProgress = handleUploadProgress || null;
+  if (isGlobalprogress) {
+    store.commit(`app/${app.SHOW_PROGRESS}`, true);
+    onUploadProgress = ({ loaded, progress, total }) => {
+      // 因为上传进度为 1 后,上传事件还会继续一段时间,所以这里将进度设置为 0.99
+      let precent = progress >= 1 ? 0.99 : progress;
+      store.commit(`app/${app.SET_UPLOAD_INFO}`, { loaded, progress: precent, total });
+    };
+  }
 
-//   const controller = new AbortController();
-//   store.commit(`app/${app.SET_UPLOAD_CONTROLLER}`, controller);
+  const controller = new AbortController();
+  store.commit(`app/${app.SET_UPLOAD_CONTROLLER}`, controller);
 
-//   return http
-//     .postForm('/GCLSFileServer/WebFileUpload', formData, {
-//       params: {
-//         SecurityLevel,
-//       },
-//       signal: controller.signal,
-//       transformRequest: [data => data],
-//       onUploadProgress,
-//       timeout: 0,
-//     })
-//     .then(res => {
-//       store.commit(`app/${app.SET_UPLOAD_INFO}`, { loaded: 0, progress: 1, total: 0 });
-//       return res;
-//     })
-//     .finally(() => {
-//       store.commit(`app/${app.SET_UPLOAD_CONTROLLER}`, null);
-//     });
-// }
+  try {
+    const res = await http.postForm('/GCLSFileServer/WebFileUpload', formData, {
+      params: {
+        SecurityLevel,
+      },
+      signal: controller.signal,
+      transformRequest: [(data) => data],
+      onUploadProgress,
+      timeout: 0,
+    });
+    store.commit(`app/${app.SET_UPLOAD_INFO}`, { progress: 1 });
+    return res;
+  } finally {
+    store.commit(`app/${app.SET_UPLOAD_CONTROLLER}`, null);
+  }
+}
 
 export function GetStaticResources(MethodName, data) {
   return http.post(`/GCLSFileServer/ServiceInterface?MethodName=${MethodName}`, data);

+ 102 - 0
src/components/GlobalProgress.vue

@@ -0,0 +1,102 @@
+<template>
+  <div v-show="showProgress" class="global-progress">
+    <div class="progress">
+      <div class="title">上传...</div>
+      <el-progress :percentage="uploadInfo.progress" :show-text="false" />
+      <div class="upload-info">
+        <span>上传文件 {{ uploadInfo.loaded }}/{{ uploadInfo.total }}</span>
+        <span :class="[{ success: complete }]">{{ uploadText }}</span>
+      </div>
+      <div class="footer">
+        <el-button v-if="complete" type="primary" @click="uploadComplete">完成</el-button>
+        <el-button v-else @click="cancelUpload">取消</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapState } from 'vuex';
+import { app } from '@/store/mutation-types';
+
+export default {
+  name: 'GlobalProgress',
+  data() {
+    return {};
+  },
+  computed: {
+    complete() {
+      return this.uploadInfo.progress === 100;
+    },
+    uploadText() {
+      if (this.complete) return '上传成功';
+      return `${this.uploadInfo.progress}%`;
+    },
+    ...mapState({
+      uploadInfo: (state) => state.app.uploadInfo,
+      uploadController: (state) => state.app.uploadController,
+      showProgress: (state) => state.app.showProgress,
+    }),
+  },
+  methods: {
+    cancelUpload() {
+      this.$store.commit(`app/${app.SHOW_PROGRESS}`, false);
+      this.$store.commit(`app/${app.RESET_UPLOAD_INFO}`);
+      this.uploadController?.abort();
+    },
+    uploadComplete() {
+      this.$store.commit(`app/${app.SHOW_PROGRESS}`, false);
+      this.$store.commit(`app/${app.RESET_UPLOAD_INFO}`);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.global-progress {
+  position: fixed;
+  inset: 0;
+  z-index: 3001;
+  display: flex;
+  justify-content: center;
+  color: #242634;
+  background-color: hsla(0deg, 0%, 100%, 80%);
+  transition: opacity 0.3s;
+
+  .progress {
+    display: flex;
+    flex-direction: column;
+    row-gap: 8px;
+    width: 400px;
+    height: 164px;
+    padding: 24px;
+    margin-top: 35vh;
+    background-color: #fff;
+    border-radius: 4px;
+    box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 8%);
+
+    .title {
+      font-weight: bold;
+    }
+
+    .upload-info {
+      display: flex;
+      justify-content: space-between;
+      font-size: 12px;
+
+      :first-child {
+        font-weight: bold;
+      }
+
+      span.success {
+        color: #0fbc00;
+      }
+    }
+
+    .footer {
+      margin-top: 16px;
+      text-align: center;
+    }
+  }
+}
+</style>

+ 2 - 2
src/store/modules/app.js

@@ -36,9 +36,9 @@ const mutations = {
   },
   [app.SET_UPLOAD_INFO]: (state, { loaded, progress, total }) => {
     state.uploadInfo = {
-      loaded: conversionSize(loaded),
+      loaded: loaded ? conversionSize(loaded) : state.uploadInfo.loaded,
       progress: parseInt(String(progress * 100).replace(/(\d+)\.\d+/, '$1')),
-      total: conversionSize(total),
+      total: total ? conversionSize(total) : state.uploadInfo.total,
     };
   },
 };

+ 55 - 0
src/styles/common.scss

@@ -0,0 +1,55 @@
+@use './variables.scss' as *;
+
+// 不换行,显示省略号
+.nowrap-ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.link {
+  display: inline-flex;
+  align-items: center;
+  font-size: 14px;
+  color: $main-color;
+  cursor: pointer;
+
+  & + & {
+    margin-left: 8px;
+  }
+
+  &.danger {
+    color: $danger-color;
+
+    &:hover {
+      color: $danger-hover-color;
+    }
+  }
+
+  &:hover {
+    color: $main-hover-color;
+  }
+}
+
+.pointer {
+  cursor: pointer;
+}
+
+.line {
+  width: 1px;
+  height: 100%;
+  min-height: 32px;
+  background-color: $border-color;
+}
+
+.horizontal-line {
+  width: 32px;
+  height: 1px;
+  background-color: $border-color;
+}
+
+.tag {
+  & + & {
+    margin-left: 8px;
+  }
+}

+ 1 - 1
src/styles/index.scss

@@ -1,5 +1,5 @@
-@use './variables.scss' as *;
 @use './element.scss' as *;
+@use './common.scss' as *;
 
 :root {
   box-sizing: border-box;

+ 2 - 0
src/views/book/courseware/create/index.vue

@@ -18,12 +18,14 @@
         </div>
       </div>
     </div>
+
     <div class="create-middle">
       <div></div>
       <div class="canvas">
         <component :is="componentList[curType]" ref="components" @showSetting="showSetting" />
       </div>
     </div>
+
     <div class="create-right">
       <div class="setting-tittle">设置</div>
       <component :is="componentSettingList[curType]" ref="setting" @updateSetting="updateSetting" />

+ 1 - 1
src/views/book/courseware/data/bookType.js

@@ -48,7 +48,7 @@ export const componentSettingList = bookTypeOption
   .flatMap((item) => item.children)
   .reduce((prev, { value, set }) => ({ ...prev, [value]: set }), {});
 
-// 组件名称类别
+// 组件名称列表
 export const componentNameList = bookTypeOption
   .flatMap((item) => item.children)
   .reduce((prev, { value, label }) => ({ ...prev, [value]: label }), {});

+ 117 - 5
src/views/book/create.vue

@@ -13,6 +13,22 @@
     <div class="basic-info">
       <div class="basic-info-title">基本信息</div>
       <el-form ref="form" :model="form" label-width="80px">
+        <el-form-item label="封面">
+          <el-upload
+            class="avatar-uploader"
+            action="none"
+            :show-file-list="false"
+            :http-request="uploadCover"
+            :before-upload="beforeCoverUpload"
+          >
+            <img v-if="form.image_url" :src="form.image_url" class="avatar" />
+            <div v-else class="avatar-uploader-icon">
+              <i class="el-icon-plus"></i>
+              <span>点击上传封面</span>
+            </div>
+          </el-upload>
+          <div class="tips">支持jpg、png格式图片,图片尺寸必须为 456 x 640px,大小不超过5mb。</div>
+        </el-form-item>
         <el-form-item label="书籍名称" prop="name">
           <el-input v-model="form.name" placeholder="请输入内容" />
         </el-form-item>
@@ -20,22 +36,29 @@
           <el-input v-model="form.author" placeholder="请输入内容" />
         </el-form-item>
         <el-form-item label="现价" prop="current_price">
-          <el-input v-model="form.current_price" placeholder="请输入内容" />
+          <el-input v-model="form.current_price" placeholder="请输入内容">
+            <template slot="append">元</template>
+          </el-input>
         </el-form-item>
         <el-form-item label="原价" prop="original_price">
-          <el-input v-model="form.original_price" placeholder="请输入内容" />
+          <el-input v-model="form.original_price" placeholder="请输入内容">
+            <template slot="append">元</template>
+          </el-input>
         </el-form-item>
         <el-form-item label="标签" prop="tags">
           <el-input v-model="form.tags" placeholder="请输入内容" />
         </el-form-item>
         <el-form-item label="分类" prop="classify">
-          <el-input v-model="form.classify" placeholder="请输入内容" />
+          <el-select v-model="form.classify" placeholder="选择分类">
+            <el-option label="分类1" value="1" />
+            <el-option label="分类2" value="2" />
+          </el-select>
         </el-form-item>
         <el-form-item label="简介" prop="brief_introduction">
           <el-input
             v-model="form.brief_introduction"
             type="textarea"
-            :autosize="{ minRows: 6 }"
+            :autosize="{ minRows: 12 }"
             :maxlength="500"
             show-word-limit
             placeholder="请输入更多内容"
@@ -51,11 +74,14 @@
 </template>
 
 <script>
+import { fileUpload } from '@/api/app';
+
 export default {
   name: 'CreateBookPage',
   data() {
     return {
       form: {
+        image_url: '',
         name: '',
         author: '',
         current_price: '',
@@ -71,6 +97,46 @@ export default {
     confirm() {
       this.$router.push('/courseware');
     },
+    uploadCover(file) {
+      fileUpload('Mid', file, { isGlobalprogress: true }).then(({ file_info_list }) => {
+        if (file_info_list.length > 0) {
+          const { file_url } = file_info_list[0];
+          this.form.image_url = file_url;
+        }
+      });
+    },
+    beforeCoverUpload(file) {
+      return new Promise((resolve, reject) => {
+        // 图片尺寸必须为 456 x 640px
+        const img = new Image();
+        img.src = window.URL.createObjectURL(file);
+        let isCorrectSize = true; // 是否为正确尺寸
+        img.onload = () => {
+          const { width, height } = img;
+          if (width !== 456 || height !== 640) {
+            isCorrectSize = false;
+            this.$message.error('图片尺寸必须为 456 x 640px!');
+            reject();
+          }
+
+          const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
+          if (!isJPG) {
+            this.$message.error('上传封面图片只能是 JPG 或 PNG 格式!');
+            reject();
+          }
+
+          const isLt5M = file.size / 1024 / 1024 < 5;
+          if (!isLt5M) {
+            this.$message.error('上传封面图片大小不能超过 5MB!');
+            reject();
+          }
+
+          if (!isCorrectSize && isJPG && isLt5M) {
+            resolve();
+          }
+        };
+      });
+    },
   },
 };
 </script>
@@ -126,7 +192,8 @@ export default {
 
     .el-form {
       .el-input,
-      .el-textarea {
+      .el-textarea,
+      .el-select {
         width: 400px;
 
         :deep .el-input__inner,
@@ -135,6 +202,51 @@ export default {
           border-color: #dcdcdc;
         }
       }
+
+      .avatar-uploader {
+        :deep .el-upload {
+          position: relative;
+          overflow: hidden;
+          cursor: pointer;
+          border: 1px dashed #d9d9d9;
+          border-radius: 6px;
+
+          &:hover {
+            border-color: #409eff;
+          }
+        }
+
+        &-icon {
+          display: flex;
+          flex-direction: column;
+          row-gap: 4px;
+          align-items: center;
+          justify-content: center;
+          width: 228px;
+          height: 320px;
+          font-size: 12px;
+          color: #8c939d;
+          background-color: #eee;
+
+          .el-icon-plus {
+            font-size: 16px;
+            font-weight: bold;
+            color: #000;
+          }
+        }
+
+        .avatar {
+          display: block;
+          width: 178px;
+          height: 178px;
+        }
+      }
+
+      .tips {
+        margin-top: -4px;
+        font-size: 12px;
+        color: #8c8c8c;
+      }
     }
   }
 }

+ 46 - 4
src/views/home/index.vue

@@ -4,6 +4,7 @@
       <span>教材列表</span>
       <el-button type="primary" @click="createBook">创建教材</el-button>
     </div>
+
     <div class="home-tabs">
       <span
         v-for="{ label, value } in tabList"
@@ -14,10 +15,16 @@
         {{ label }}
       </span>
     </div>
-    <div>
-      <span>搜索</span>
-      <el-input v-model="search" />
+
+    <div class="search">
+      <span class="search-name">搜索</span>
+      <el-input v-model="search" placeholder="全部" suffix-icon="el-icon-search" />
+      <span class="search-name">创建者</span>
+      <el-select v-model="creator" placeholder="全部">
+        <el-option label="张三" value="1" />
+      </el-select>
     </div>
+
     <el-table :data="data" height="100%">
       <el-table-column prop="number" label="序号" width="64" />
       <el-table-column prop="name" label="教材名称" width="248" />
@@ -27,7 +34,13 @@
       <el-table-column prop="recently_edited" label="最近编辑" width="100" />
       <el-table-column prop="recently_edited_time" label="最近编辑时间" width="120" />
       <el-table-column prop="memo" label="简介" />
-      <el-table-column prop="operation" label="操作" width="245" fixed="right" />
+      <el-table-column prop="operation" label="操作" width="245" fixed="right">
+        <template slot-scope="{ row }">
+          <span class="link" @click="editBook(row.id)">编辑</span>
+          <span class="link" @click="groundingBook(row.id)">上架</span>
+          <span class="link danger" @click="deleteBook(row.id)">删除</span>
+        </template>
+      </el-table-column>
     </el-table>
     <el-pagination
       background
@@ -51,6 +64,7 @@ export default {
     return {
       data: undefined,
       search: '',
+      creator: '',
       cur_page: 1,
       page_capacity: 10,
       total: 0,
@@ -77,6 +91,21 @@ export default {
     changePageSize(size) {
       this.page_capacity = size;
     },
+    /**
+     * 编辑教材
+     * @param {string} id 教材id
+     */
+    editBook(id) {},
+    /**
+     * 上架教材
+     * @param {string} id 教材id
+     */
+    groundingBook(id) {},
+    /**
+     * 删除教材
+     * @param {string} id 教材id
+     */
+    deleteBook(id) {},
   },
 };
 </script>
@@ -119,5 +148,18 @@ export default {
       }
     }
   }
+
+  .search {
+    display: grid;
+    grid-template-rows: 30px 32px;
+    grid-template-columns: repeat(2, 200px);
+    grid-auto-flow: column;
+    column-gap: 24px;
+
+    &-name {
+      font-size: 14px;
+      color: $font-light-color;
+    }
+  }
 }
 </style>