Browse Source

台账管理页面+地图修改

rui.jiang 1 year ago
parent
commit
6b1ca3af87

BIN
dist.zip


+ 539 - 0
package-lock.json

@@ -17,9 +17,11 @@
         "happypack": "^5.0.1",
         "ol": "^9.2.3",
         "qs": "^6.12.0",
+        "quill": "^2.0.2",
         "svg-sprite-loader": "^6.0.11",
         "terser-webpack-plugin": "^5.3.10",
         "vue": "^2.6.14",
+        "vue-quill-editor": "^3.0.6",
         "vue-router": "^3.5.1",
         "vuex": "^3.6.2",
         "vuex-persistedstate": "^4.1.0",
@@ -34,7 +36,9 @@
         "postcss": "^8.4.38",
         "sass": "^1.32.7",
         "sass-loader": "^12.0.0",
+        "style-resources-loader": "^1.4.1",
         "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.2.17",
+        "vue-cli-plugin-style-resources-loader": "~0.1.5",
         "vue-template-compiler": "^2.6.14"
       }
     },
@@ -6663,6 +6667,26 @@
         "node": ">=0.10"
       }
     },
+    "node_modules/deep-equal": {
+      "version": "1.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/deep-equal/-/deep-equal-1.1.2.tgz",
+      "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-arguments": "^1.1.1",
+        "is-date-object": "^1.0.5",
+        "is-regex": "^1.1.4",
+        "object-is": "^1.1.5",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.5.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/deepmerge": {
       "version": "1.5.2",
       "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
@@ -7626,6 +7650,12 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "license": "MIT"
+    },
     "node_modules/extend-shallow": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
@@ -7663,6 +7693,12 @@
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "license": "MIT"
     },
+    "node_modules/fast-diff": {
+      "version": "1.3.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fast-diff/-/fast-diff-1.3.0.tgz",
+      "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+      "license": "Apache-2.0"
+    },
     "node_modules/fast-glob": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -9051,6 +9087,22 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/is-arguments": {
+      "version": "1.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-arguments/-/is-arguments-1.1.1.tgz",
+      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/is-array-buffer": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
@@ -9855,6 +9907,18 @@
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "license": "MIT"
     },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+      "license": "MIT"
+    },
+    "node_modules/lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
+      "license": "MIT"
+    },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -9868,6 +9932,12 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+      "license": "MIT"
+    },
     "node_modules/lodash.kebabcase": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
@@ -10835,6 +10905,22 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/object-is": {
+      "version": "1.1.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/object-is/-/object-is-1.1.6.tgz",
+      "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/object-keys": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -11114,6 +11200,12 @@
         "tslib": "^2.0.3"
       }
     },
+    "node_modules/parchment": {
+      "version": "3.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/parchment/-/parchment-3.0.0.tgz",
+      "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==",
+      "license": "BSD-3-Clause"
+    },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -12533,6 +12625,41 @@
       "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==",
       "license": "ISC"
     },
+    "node_modules/quill": {
+      "version": "2.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/quill/-/quill-2.0.2.tgz",
+      "integrity": "sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "eventemitter3": "^5.0.1",
+        "lodash-es": "^4.17.21",
+        "parchment": "^3.0.0",
+        "quill-delta": "^5.1.0"
+      },
+      "engines": {
+        "npm": ">=8.2.3"
+      }
+    },
+    "node_modules/quill-delta": {
+      "version": "5.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/quill-delta/-/quill-delta-5.1.0.tgz",
+      "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
+      "license": "MIT",
+      "dependencies": {
+        "fast-diff": "^1.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.isequal": "^4.5.0"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      }
+    },
+    "node_modules/quill/node_modules/eventemitter3": {
+      "version": "5.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/eventemitter3/-/eventemitter3-5.0.1.tgz",
+      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+      "license": "MIT"
+    },
     "node_modules/randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -14223,6 +14350,123 @@
         "node": ">=6"
       }
     },
+    "node_modules/style-resources-loader": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/style-resources-loader/-/style-resources-loader-1.5.0.tgz",
+      "integrity": "sha512-fIfyvQ+uvXaCBGGAgfh+9v46ARQB1AWdaop2RpQw0PBVuROsTBqGvx8dj0kxwjGOAyq3vepe4AOK3M6+Q/q2jw==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.2.0",
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.7.0",
+        "tslib": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.9"
+      },
+      "peerDependencies": {
+        "webpack": "^3.0.0 || ^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/style-resources-loader/node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/style-resources-loader/node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "dev": true,
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/style-resources-loader/node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true,
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/style-resources-loader/node_modules/emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/style-resources-loader/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "node_modules/style-resources-loader/node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/style-resources-loader/node_modules/loader-utils": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+      "dev": true,
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/style-resources-loader/node_modules/schema-utils": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+      "dev": true,
+      "dependencies": {
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 8.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/style-resources-loader/node_modules/tslib": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+      "dev": true
+    },
     "node_modules/stylehacks": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.0.tgz",
@@ -15446,6 +15690,12 @@
         "csstype": "^3.1.0"
       }
     },
+    "node_modules/vue-cli-plugin-style-resources-loader": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmmirror.com/vue-cli-plugin-style-resources-loader/-/vue-cli-plugin-style-resources-loader-0.1.5.tgz",
+      "integrity": "sha512-LluhjWTZmpGl3tiXg51EciF+T70IN/9t6UvfmgluJBqxbrb6OV9i7L5lTd+OKtcTeghDkhcBmYhtTxxU4w/8sQ==",
+      "dev": true
+    },
     "node_modules/vue-hot-reload-api": {
       "version": "2.3.4",
       "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
@@ -15476,6 +15726,66 @@
         }
       }
     },
+    "node_modules/vue-quill-editor": {
+      "version": "3.0.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
+      "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==",
+      "license": "MIT",
+      "dependencies": {
+        "object-assign": "^4.1.1",
+        "quill": "^1.3.4"
+      },
+      "engines": {
+        "node": ">= 4.0.0",
+        "npm": ">= 3.0.0"
+      }
+    },
+    "node_modules/vue-quill-editor/node_modules/eventemitter3": {
+      "version": "2.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/eventemitter3/-/eventemitter3-2.0.3.tgz",
+      "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==",
+      "license": "MIT"
+    },
+    "node_modules/vue-quill-editor/node_modules/fast-diff": {
+      "version": "1.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fast-diff/-/fast-diff-1.1.2.tgz",
+      "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/vue-quill-editor/node_modules/parchment": {
+      "version": "1.1.4",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/parchment/-/parchment-1.1.4.tgz",
+      "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/vue-quill-editor/node_modules/quill": {
+      "version": "1.3.7",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/quill/-/quill-1.3.7.tgz",
+      "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "clone": "^2.1.1",
+        "deep-equal": "^1.0.1",
+        "eventemitter3": "^2.0.3",
+        "extend": "^3.0.2",
+        "parchment": "^1.1.4",
+        "quill-delta": "^3.6.2"
+      }
+    },
+    "node_modules/vue-quill-editor/node_modules/quill-delta": {
+      "version": "3.6.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/quill-delta/-/quill-delta-3.6.3.tgz",
+      "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+      "license": "MIT",
+      "dependencies": {
+        "deep-equal": "^1.0.1",
+        "extend": "^3.0.2",
+        "fast-diff": "1.1.2"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
     "node_modules/vue-router": {
       "version": "3.6.5",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz",
@@ -20817,6 +21127,19 @@
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
       "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="
     },
+    "deep-equal": {
+      "version": "1.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/deep-equal/-/deep-equal-1.1.2.tgz",
+      "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
+      "requires": {
+        "is-arguments": "^1.1.1",
+        "is-date-object": "^1.0.5",
+        "is-regex": "^1.1.4",
+        "object-is": "^1.1.5",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.5.1"
+      }
+    },
     "deepmerge": {
       "version": "1.5.2",
       "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
@@ -21502,6 +21825,11 @@
         }
       }
     },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
     "extend-shallow": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
@@ -21530,6 +21858,11 @@
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
     },
+    "fast-diff": {
+      "version": "1.3.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fast-diff/-/fast-diff-1.3.0.tgz",
+      "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="
+    },
     "fast-glob": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -22456,6 +22789,15 @@
         "hasown": "^2.0.0"
       }
     },
+    "is-arguments": {
+      "version": "1.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-arguments/-/is-arguments-1.1.1.tgz",
+      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
     "is-array-buffer": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
@@ -22978,6 +23320,16 @@
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
+    "lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+    },
     "lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -22989,6 +23341,11 @@
       "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
       "dev": true
     },
+    "lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+    },
     "lodash.kebabcase": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
@@ -23675,6 +24032,15 @@
       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
       "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
     },
+    "object-is": {
+      "version": "1.1.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/object-is/-/object-is-1.1.6.tgz",
+      "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+      "requires": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1"
+      }
+    },
     "object-keys": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -23864,6 +24230,11 @@
         "tslib": "^2.0.3"
       }
     },
+    "parchment": {
+      "version": "3.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/parchment/-/parchment-3.0.0.tgz",
+      "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A=="
+    },
     "parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -24775,6 +25146,34 @@
       "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
       "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
     },
+    "quill": {
+      "version": "2.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/quill/-/quill-2.0.2.tgz",
+      "integrity": "sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==",
+      "requires": {
+        "eventemitter3": "^5.0.1",
+        "lodash-es": "^4.17.21",
+        "parchment": "^3.0.0",
+        "quill-delta": "^5.1.0"
+      },
+      "dependencies": {
+        "eventemitter3": {
+          "version": "5.0.1",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/eventemitter3/-/eventemitter3-5.0.1.tgz",
+          "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
+        }
+      }
+    },
+    "quill-delta": {
+      "version": "5.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/quill-delta/-/quill-delta-5.1.0.tgz",
+      "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
+      "requires": {
+        "fast-diff": "^1.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.isequal": "^4.5.0"
+      }
+    },
     "randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -25966,6 +26365,91 @@
       "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
       "dev": true
     },
+    "style-resources-loader": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/style-resources-loader/-/style-resources-loader-1.5.0.tgz",
+      "integrity": "sha512-fIfyvQ+uvXaCBGGAgfh+9v46ARQB1AWdaop2RpQw0PBVuROsTBqGvx8dj0kxwjGOAyq3vepe4AOK3M6+Q/q2jw==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.2.0",
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.7.0",
+        "tslib": "^2.3.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.5.2",
+          "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+          "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+          "dev": true,
+          "requires": {}
+        },
+        "big.js": {
+          "version": "5.2.2",
+          "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+          "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+          "dev": true
+        },
+        "emojis-list": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
+        },
+        "json5": {
+          "version": "2.2.3",
+          "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+          "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+          "dev": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "schema-utils": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz",
+          "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.5",
+            "ajv": "^6.12.4",
+            "ajv-keywords": "^3.5.2"
+          }
+        },
+        "tslib": {
+          "version": "2.6.2",
+          "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
+          "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+          "dev": true
+        }
+      }
+    },
     "stylehacks": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.0.tgz",
@@ -26795,6 +27279,12 @@
         "csstype": "^3.1.0"
       }
     },
+    "vue-cli-plugin-style-resources-loader": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmmirror.com/vue-cli-plugin-style-resources-loader/-/vue-cli-plugin-style-resources-loader-0.1.5.tgz",
+      "integrity": "sha512-LluhjWTZmpGl3tiXg51EciF+T70IN/9t6UvfmgluJBqxbrb6OV9i7L5lTd+OKtcTeghDkhcBmYhtTxxU4w/8sQ==",
+      "dev": true
+    },
     "vue-hot-reload-api": {
       "version": "2.3.4",
       "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
@@ -26812,6 +27302,55 @@
         "watchpack": "^2.4.0"
       }
     },
+    "vue-quill-editor": {
+      "version": "3.0.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
+      "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "quill": "^1.3.4"
+      },
+      "dependencies": {
+        "eventemitter3": {
+          "version": "2.0.3",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/eventemitter3/-/eventemitter3-2.0.3.tgz",
+          "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
+        },
+        "fast-diff": {
+          "version": "1.1.2",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/fast-diff/-/fast-diff-1.1.2.tgz",
+          "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
+        },
+        "parchment": {
+          "version": "1.1.4",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/parchment/-/parchment-1.1.4.tgz",
+          "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+        },
+        "quill": {
+          "version": "1.3.7",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/quill/-/quill-1.3.7.tgz",
+          "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+          "requires": {
+            "clone": "^2.1.1",
+            "deep-equal": "^1.0.1",
+            "eventemitter3": "^2.0.3",
+            "extend": "^3.0.2",
+            "parchment": "^1.1.4",
+            "quill-delta": "^3.6.2"
+          }
+        },
+        "quill-delta": {
+          "version": "3.6.3",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/quill-delta/-/quill-delta-3.6.3.tgz",
+          "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+          "requires": {
+            "deep-equal": "^1.0.1",
+            "extend": "^3.0.2",
+            "fast-diff": "1.1.2"
+          }
+        }
+      }
+    },
     "vue-router": {
       "version": "3.6.5",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz",

+ 4 - 0
package.json

@@ -16,9 +16,11 @@
     "happypack": "^5.0.1",
     "ol": "^9.2.3",
     "qs": "^6.12.0",
+    "quill": "^2.0.2",
     "svg-sprite-loader": "^6.0.11",
     "terser-webpack-plugin": "^5.3.10",
     "vue": "^2.6.14",
+    "vue-quill-editor": "^3.0.6",
     "vue-router": "^3.5.1",
     "vuex": "^3.6.2",
     "vuex-persistedstate": "^4.1.0",
@@ -33,7 +35,9 @@
     "postcss": "^8.4.38",
     "sass": "^1.32.7",
     "sass-loader": "^12.0.0",
+    "style-resources-loader": "^1.4.1",
     "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.2.17",
+    "vue-cli-plugin-style-resources-loader": "~0.1.5",
     "vue-template-compiler": "^2.6.14"
   },
   "browserslist": [

+ 5 - 5
src/components/HeaderCom.vue

@@ -35,7 +35,7 @@
               size="mini"
             >
               <el-option
-                v-for="(item,index) in colorData"
+                v-for="(item, index) in colorData"
                 :key="index"
                 :label="item.lable"
                 :value="item.value"
@@ -69,10 +69,10 @@ export default {
       currentDate: "",
       currentTheme: this.$store.state.themes.theme,
       colorData: [
-        { lable: "Light", value: "light", color: "#f90" },
-        { lable: "Dark", value: "dark", color: "#1f2d3d" },
-        { lable: "Green", value: "green", color: "#008080" },
-        { lable: "Blue", value: "blue", color: "#409eff" },
+        { lable: "黄色", value: "light", color: "#82780ccf" },
+        { lable: "深色", value: "dark", color: "#607d8b" },
+        { lable: "绿色", value: "green", color: "#008080" },
+        { lable: "蓝色", value: "blue", color: "#00bcd4" },
       ],
     };
   },

+ 130 - 0
src/components/Tinymce.vue

@@ -0,0 +1,130 @@
+<template>
+  <div>
+    <quill-editor
+      ref="quillEditor"
+      v-model="content"
+      :options="editorOptions"
+      @ready="onEditorReady"
+    />
+  </div>
+</template>
+
+<script>
+import { quillEditor } from "vue-quill-editor";
+import "quill/dist/quill.core.css";
+import "quill/dist/quill.snow.css";
+import "quill/dist/quill.bubble.css";
+import Quill from "quill";
+
+export default {
+  components: {
+    quillEditor,
+  },
+  data() {
+    return {
+      content: "",
+      editorOptions: {
+        theme: "snow",
+        modules: {
+          toolbar: {
+            container: [
+              [{ header: "1" }, { header: "2" }, { font: [] }],
+              [{ size: [] }],
+              ["bold", "italic", "underline", "strike", "blockquote"],
+              [
+                { list: "ordered" },
+                { list: "bullet" },
+                { indent: "-1" },
+                { indent: "+1" },
+              ],
+              ["link", "image", "video"],
+              ["clean"],
+            ],
+            handlers: {
+              image: this.imageHandler,
+              video: this.videoHandler,
+            },
+          },
+        },
+      },
+    };
+  },
+  methods: {
+    onEditorReady(editor) {
+      // Any additional setup for the editor can be done here
+    },
+    imageHandler() {
+      const input = document.createElement("input");
+      input.setAttribute("type", "file");
+      input.setAttribute("accept", "image/*");
+      input.click();
+
+      input.onchange = async () => {
+        const file = input.files[0];
+        if (file) {
+          const formData = new FormData();
+          formData.append("file", file);
+
+          try {
+            const response = await this.uploadImage(formData);
+            const url = response.data.url; // 根据你的实际响应数据结构
+            const quill = this.$refs.quillEditor.quill;
+            const range = quill.getSelection();
+            quill.insertEmbed(range.index, "image", url);
+          } catch (error) {
+            console.error("Image upload failed", error);
+          }
+        }
+      };
+    },
+    videoHandler() {
+      const input = document.createElement("input");
+      input.setAttribute("type", "file");
+      input.setAttribute("accept", "video/*");
+      input.click();
+
+      input.onchange = async () => {
+        const file = input.files[0];
+        if (file) {
+          const formData = new FormData();
+          formData.append("file", file);
+
+          try {
+            const response = await this.uploadVideo(formData);
+            const url = response.data.url; // 根据你的实际响应数据结构
+            const quill = this.$refs.quillEditor.quill;
+            const range = quill.getSelection();
+            quill.insertEmbed(range.index, "video", url);
+          } catch (error) {
+            console.error("Video upload failed", error);
+          }
+        }
+      };
+    },
+    async uploadImage(formData) {
+      // 在这里实现你的图片上传逻辑
+      // 示例:使用 axios 进行上传
+      const response = await axios.post("/api/upload/image", formData, {
+        headers: {
+          "Content-Type": "multipart/form-data",
+        },
+      });
+      return response;
+    },
+    async uploadVideo(formData) {
+      // 在这里实现你的视频上传逻辑
+      // 示例:使用 axios 进行上传
+      const response = await axios.post("/api/upload/video", formData, {
+        headers: {
+          "Content-Type": "multipart/form-data",
+        },
+      });
+      return response;
+    },
+  },
+};
+</script>
+
+<style scoped>
+/* 添加你需要的样式 */
+</style>

+ 35 - 7
src/main.js

@@ -7,7 +7,7 @@ import "./icons/index"; // icon
 // 引入element ui
 import ElementUI from "element-ui";
 import "element-ui/lib/theme-chalk/index.css";
-Vue.use(ElementUI);
+
 // 引入css
 import "./styles/index.scss";
 // 注册svg组件
@@ -16,7 +16,9 @@ Vue.component("SvgIcons", SvgIcons);
 // 序列化post方法
 import qs from "qs";
 Vue.prototype.$qs = qs;
+// Vue.prototype.$tinymce = tinymce;
 
+Vue.use(ElementUI);
 // 引入tailwind
 // https://www.tailwindcss.cn/docs/installation
 
@@ -48,18 +50,44 @@ new Vue({
   },
   watch: {
     "$store.state.themes.theme": {
-      handler(newTheme) {
-        console.log(newTheme, "newTheme");
-        this.applyTheme(newTheme);
+      handler(newTheme, oldTheme) {
+        this.applyTheme(newTheme, oldTheme);
       },
       immediate: true,
     },
   },
   methods: {
-    applyTheme(theme) {
+    async applyTheme(theme, oldTheme) {
       const themeFile = theme || this.$store.state.themes.theme;
-      console.log(themeFile, "themeFile");
-      import(`./themes/${themeFile}.scss`);
+      console.log(theme, oldTheme, "themeFile");
+
+      // 动态加载新的主题样式
+      try {
+        // 动态导入 SCSS 文件
+        const theme = await import(`@/themes/${themeFile}.scss`);
+
+        Vue.prototype.$backgroundColor = getComputedStyle(
+          document.documentElement
+        ).getPropertyValue("--background-color");
+
+        // 移除之前的主题样式
+        let oldThemeStyle = document.getElementById("theme-style");
+        if (oldThemeStyle) {
+          oldThemeStyle.parentNode.removeChild(oldThemeStyle);
+        }
+
+        // 创建新的样式标签并插入到 head 中
+        const style = document.createElement("style");
+        style.id = "theme-style";
+        style.type = "text/css";
+        style.innerHTML = theme.default;
+        document.head.appendChild(style);
+        if (theme !== oldTheme && oldTheme !== undefined) {
+          this.$router.go(0);
+        }
+      } catch (error) {
+        console.error("Failed to load theme", error);
+      }
     },
   },
   render: (h) => h(App),

+ 1 - 1
src/styles/base.css

@@ -295,6 +295,6 @@ body {
 .el-dialog__body {
   padding-top: 15px;
 }
-.el-form-item{
+.el-form-item {
   margin-bottom: 10px;
 }

+ 51 - 2
src/styles/global.scss

@@ -1,11 +1,31 @@
-.el-button--primary {
+.el-button--primary,
+.el-button--primary:focus {
+  background-color: var(--primary-color) !important;
+  border-color: var(--primary-color) !important;
+  color: var(--text-color) !important;
+}
+
+.el-dialog__header {
   background-color: var(--primary-color);
-  border-color: var(--primary-color);
   color: var(--text-color) !important;
 }
+.el-dialog__header .el-dialog__title {
+  color: var(--text-color) !important;
+}
+
+.el-button--primary:hover {
+  opacity: 0.7;
+  // color: var(--primary-color) !important;
+}
 .el-button--text {
   color: var(--primary-color);
 }
+.el-button--default:focus,
+.el-button--default:hover {
+  border-color: var(--primary-color);
+  background-color: var(--bgopacity-color) !important;
+  color: var(--primary-color);
+}
 
 .el-menu {
   background-color: var(--background-color);
@@ -25,6 +45,35 @@
   border-color: var(--primary-color);
   color: var(--text-color);
 }
+.el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active {
+  color: var(--primary-color);
+}
+.el-tabs--border-card > .el-tabs__header .el-tabs__item:hover {
+  color: var(--primary-color) !important;
+}
+
+.el-dialog__body .el-table th.el-table__cell {
+  background-color: var(--text-color);
+  color: #67696d !important;
+}
+.el-checkbox__input.is-checked .el-checkbox__inner,
+.el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: var(--primary-color);
+  border-color: var(--primary-color);
+  // color: var(--text-color);
+}
+.is-checked > .el-checkbox__label {
+  color: var(--primary-color) !important;
+}
+.el-tabs__active-bar {
+  background-color: var(--primary-color);
+}
+.el-tabs__item:hover {
+  color: var(--primary-color);
+}
+.el-tabs__item.is-active {
+  color: var(--primary-color);
+}
 // .el-switch {
 //   background-color: var(--primary-color);
 //   border-color: var(--primary-color);

+ 4 - 3
src/themes/blue.scss

@@ -1,9 +1,10 @@
-$primary-color: #409eff;
-$background-color: #409eff;
+$primary-color: #00bcd4;
+$background-color: #00bcd4;
 $text-color: #ffffff;
-
+$bgopacity-color: #00bbd429;
 :root {
   --primary-color: #{$primary-color};
   --background-color: #{$background-color};
   --text-color: #{$text-color};
+  --bgopacity-color: #{$bgopacity-color};
 }

+ 4 - 3
src/themes/dark.scss

@@ -1,9 +1,10 @@
-$primary-color: #1f2d3d;
-$background-color: #2e2e2e;
+$primary-color: #607d8b;
+$background-color: #607d8b;
 $text-color: #ffffff;
-
+$bgopacity-color: #607d8b31;
 :root {
   --primary-color: #{$primary-color};
   --background-color: #{$background-color};
   --text-color: #{$text-color};
+  --bgopacity-color: #{$bgopacity-color};
 }

+ 2 - 1
src/themes/green.scss

@@ -1,9 +1,10 @@
 $primary-color: #008080;
 $background-color: #008080;
 $text-color: #ffffff;
-
+$bgopacity-color: #00968730;
 :root {
   --primary-color: #{$primary-color};
   --background-color: #{$background-color};
   --text-color: #{$text-color};
+  --bgopacity-color: #{$bgopacity-color};
 }

+ 4 - 2
src/themes/light.scss

@@ -1,9 +1,11 @@
-$primary-color: #f90;
-$background-color: #f90;
+$primary-color: #82780ccf;
+$background-color: #82780ccf;
 $text-color: #ffffff;
+$bgopacity-color: #82780c27;
 
 :root {
   --primary-color: #{$primary-color};
   --background-color: #{$background-color};
+  --bgopacity-color: #{$bgopacity-color};
   --text-color: #{$text-color};
 }

+ 4 - 5
src/views/home/Index.vue

@@ -3,14 +3,13 @@
     <el-container>
       <Menu></Menu>
       <el-main>
-        <HeaderCom  @setLoding="setLoding"></HeaderCom>
+        <HeaderCom @setLoding="setLoding"></HeaderCom>
         <!-- 主体内容-->
         <transition name="slide-fade">
-        <div class="">
+          <div class="">
             <router-view />
-        </div>
-      </transition>
-
+          </div>
+        </transition>
       </el-main>
     </el-container>
   </div>

+ 55 - 29
src/views/home/components/Menu.vue

@@ -20,12 +20,17 @@
             color="#222"
           ></SvgIcons>
         </div>
-        <span v-if="!isCollapse" @click="
-          handleChangeMenuUrl(
-            { name: '驾驶舱', id: 1, path: 'cockpitManage', iconName: 'gps' },
-            `/home/cockpitManage?name=驾驶舱`
-          )
-          " :class="isCollapse ? 'stop-animation' : 'active-animation'">风机运行管理平台</span>
+        <span
+          v-if="!isCollapse"
+          @click="
+            handleChangeMenuUrl(
+              { name: '驾驶舱', id: 1, path: 'cockpitManage', iconName: 'gps' },
+              `/home/cockpitManage?name=驾驶舱`
+            )
+          "
+          :class="isCollapse ? 'stop-animation' : 'active-animation'"
+          >风机运行管理平台</span
+        >
       </div>
     </div>
     <el-menu
@@ -36,75 +41,96 @@
       @close="handleClose"
       background-color="#eff1f3"
       text-color="#000"
-      active-text-color="#0754a1"
+      :active-text-color="activeTextColor"
       :router="true"
       :default-active="defaultActive"
       :unique-opened="true"
       :collapse="isCollapse"
     >
-      <div v-for="item in routerList" :key="item.id">
+      <template v-for="item in routerList">
         <el-submenu
+          v-if="item.children && item.children.length"
           :index="item.path"
-          v-if="item.children && item.children.length > 0"
         >
           <template slot="title">
-            <i class="el-icon-menu" v-if="isElPrefix(item.iconName)"></i>
-            <i v-else class="svnIcon"
-              ><svg-icon :icon-class="item.iconName"
-            /></i>
+            <i v-if="isElPrefix(item.iconName)" class="el-icon-menu"></i>
+            <i v-else class="svnIcon">
+              <svg-icon :icon-class="item.iconName" />
+            </i>
             <span>{{ item.name }}</span>
           </template>
           <el-menu-item
             v-for="child in item.children"
+            v-if="child.meta?.hidden === false"
             :key="child.id"
-            :index="`/home/${item.path}/${child.path}?id=${child.id}&name=${child.name}`"
+            :index="`/home/${item.path}/${child.path}?id=${child.id}`"
           >
-            <i class="el-icon-menu" v-if="isElPrefix(child.iconName)"></i>
-            <i v-else class="svnIcon"
-              ><svg-icon :icon-class="child.iconName"
-            /></i>
+            <i v-if="isElPrefix(child.iconName)" class="el-icon-menu"></i>
+            <i v-else class="svnIcon">
+              <svg-icon :icon-class="child.iconName" />
+            </i>
             <span>{{ child.name }}</span>
           </el-menu-item>
         </el-submenu>
         <el-menu-item
+          v-else-if="item.meta?.hidden === false"
           :key="item.id"
-          :index="`/home/${item.path}?id=${item.id}&name=${item.name}`"
-          v-else
+          :index="`/home/${item.path}?id=${item.id}`"
         >
-          <i class="el-icon-menu" v-if="isElPrefix(item.iconName)"></i>
-          <i v-else class="svnIcon"><svg-icon :icon-class="item.iconName" /></i>
+          <i v-if="isElPrefix(item.iconName)" class="el-icon-menu"></i>
+          <i v-else class="svnIcon">
+            <svg-icon :icon-class="item.iconName" />
+          </i>
           <span>{{ item.name }}</span>
         </el-menu-item>
-      </div>
+      </template>
     </el-menu>
     <div class="foldBox flexCenter">
-      <span v-show="isCollapse" class="el-icon-s-unfold icon" @click="isCollapse = false">展开</span>
-      <span v-show="!isCollapse" class="el-icon-s-fold icon" @click="isCollapse = true">收起</span>
+      <span
+        v-show="isCollapse"
+        class="el-icon-s-unfold icon"
+        @click="isCollapse = false"
+        >展开</span
+      >
+      <span
+        v-show="!isCollapse"
+        class="el-icon-s-fold icon"
+        @click="isCollapse = true"
+        >收起</span
+      >
     </div>
   </el-aside>
 </template>
 
 <script>
 import { orgList } from "./mockData";
+import Vue from "vue";
 export default {
   data() {
     return {
       isCollapse: false,
       orgList: orgList,
       searchInputValue: "",
-      defaultActive: "",
+      defaultActive: this.$route.fullPath,
       activeIndex: false,
       keyObject: {},
+      activeTextColor: Vue.prototype.$backgroundColor,
       routerList: [
         {
-          id:1,
+          id: 1,
           path: "cockpitManage",
           name: "驾驶舱",
           iconName: "gps",
+          meta: {
+            hidden: false,
+          },
           children: [
             {
-              id:11,
+              id: 11,
               iconName: "gps",
+              meta: {
+                hidden: false,
+              },
               path: "electronic-map",
               name: "电子地图",
             },
@@ -114,11 +140,11 @@ export default {
     };
   },
   created() {
+    console.log(this.defaultActive, "defaultActive", this.$route);
     this.routerList = [
       ...this.routerList,
       ...this.$store.state.auth.dynamicRouter,
     ];
-    console.log(this.routerList, "组件内dynamicRouter");
   },
   computed: {
     currentMenuIndex() {

+ 410 - 4
src/views/performance/assetssMag.vue

@@ -1,6 +1,412 @@
-import Vue from 'vue/types/umd';
 <template>
-  <div>性能分析管理</div>
+  <div class="global-variable">
+    <div class="condition">
+      <el-form
+        :inline="true"
+        ref="ruleForm"
+        :model="formInline"
+        class="demo-form-inline"
+        :rules="rules"
+      >
+        <el-form-item label="风场名称:" prop="userName">
+          <el-input
+            size="small"
+            v-model="formInline.userName"
+            placeholder="请输入风场名称"
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="onSubmit" size="small"
+            >查询</el-button
+          >
+          <el-button @click="reset('ruleForm')" size="small">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="list-page">
+      <el-table
+        v-loading="loading"
+        class="center-align-table"
+        :data="tableData"
+        border
+        :cell-style="rowStyle"
+      >
+        <el-table-column
+          align="center"
+          fixed
+          prop="userId"
+          label="风场名称"
+          width="100"
+        >
+        </el-table-column>
+        <el-table-column align="center" label="批次编号" prop="userName">
+        </el-table-column>
+        <el-table-column prop="loginName" align="center" label="分析状态">
+        </el-table-column>
+        <el-table-column
+          prop="state"
+          align="center"
+          label="异常状态"
+          width="100"
+        >
+          <template slot-scope="scope">
+            <span>
+              {{
+                scope.row.state == 0
+                  ? "未启用"
+                  : scope.row.state == 1
+                  ? "启用"
+                  : "禁用"
+              }}</span
+            >
+          </template>
+        </el-table-column>
+        <el-table-column prop="roleName" align="center" label="异常信息">
+          <template slot-scope="scope">
+            <el-button
+              @click="abnormalDialog(scope.row, '异常详情')"
+              type="text"
+              size="small"
+              >异常详情</el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column prop="roleName" align="center" label="分析记录">
+          <template slot-scope="scope">
+            <el-button
+              @click="handleAssetssDetail(scope.row)"
+              type="text"
+              size="small"
+              >分析详情</el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column prop="roleName" align="center" label="创建时间">
+        </el-table-column>
+        <el-table-column
+          prop="transition"
+          align="center"
+          fixed="right"
+          label="操作"
+          width="200"
+        >
+          <template slot-scope="scope">
+            <el-button
+              @click="handleAssetss(scope.row)"
+              type="text"
+              size="small"
+              >分析</el-button
+            >
+            <el-button
+              @click="abnormalDialog(scope.row, '异常描述')"
+              type="text"
+              size="small"
+              >异常描述</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="pagination-container">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="formInline.pageNum"
+          layout="total, prev, pager, next"
+          :page-size="formInline.pageSize"
+          :total="formInline.totalSize"
+        >
+        </el-pagination>
+      </div>
+    </div>
+    <!-- 弹出层 -->
+    <!-- 异常信息 /异常描述-->
+    <my-dialog :visible="dialogVisible" :title="title" @confirm="handleConfirm">
+      <div slot="tableEl">
+        <el-empty description="暂无数据"></el-empty>
+      </div>
+    </my-dialog>
+  </div>
 </template>
-<script></script>
-<style scoped lang="scss"></style>
+
+<script>
+import MyDialog from "./components/dialogCom.vue";
+
+export default {
+  components: {
+    MyDialog,
+  },
+  data() {
+    const validateUserName = (rule, value, callback) => {
+      const regex = /^[^\u4e00-\u9fa5\W]+$/;
+      if (!value) {
+        callback(new Error("账号名称不能为空"));
+      } else if (!regex.test(value)) {
+        callback(new Error("账号名称不能包含中文及特殊字符"));
+      } else {
+        callback();
+      }
+    };
+    const validatePhone = (rule, value, callback) => {
+      const phoneRegex = /^[1][3-9][0-9]{9}$/;
+      if (!value) {
+        return callback(new Error("手机号不能为空"));
+      }
+      if (!phoneRegex.test(value)) {
+        return callback(new Error("请输入正确的手机号"));
+      }
+      callback();
+    };
+    return {
+      dialogVisible: false,
+      loadingView: false,
+      loading: false, //数据加载中
+      rules: {
+        roleId: { trigger: "change" },
+        userName: { trigger: "blur" },
+      },
+      roleList: [],
+      formInline: {
+        userName: undefined,
+        roleId: undefined,
+        pageNum: 1,
+        pageSize: 10,
+        // sort: "desc",
+        totalSize: 0,
+      },
+      tableData: [{}],
+      // 新增编辑表单
+      ruleForm: {
+        phone: null,
+        pwd: null,
+        roleId: null,
+        userName: null,
+        loginName: null,
+      },
+      addUserRules: {
+        phone: [
+          { required: true, message: "请输入手机号", trigger: "blur" },
+          { validator: validatePhone, trigger: "blur" },
+        ],
+        loginName: [
+          { required: true, message: "请输入账号名称", trigger: "blur" },
+          { validator: validateUserName, trigger: "blur" },
+        ],
+        pwd: { required: true, message: "请输入密码", trigger: "blur" },
+        roleId: { required: true, message: "请选择角色", trigger: "change" },
+        userName: [
+          { required: true, message: "请输入员工姓名", trigger: "blur" },
+        ],
+      },
+      title: "",
+    };
+  },
+  created() {},
+
+  methods: {
+    //分析
+    handleAssetss() {
+      this.$router.push({
+        path: "/home/performance/editAssets",
+        query: { id: 123, name: "John" },
+      });
+    },
+    //分析详情
+    handleAssetssDetail() {
+      this.$router.push({
+        path: "/home/performance/assetssDetail",
+        query: { id: 123, name: "John" },
+      });
+    },
+    abnormalDialog(row, title) {
+      console.log("dialog 调起");
+      this.dialogVisible = true;
+      this.title = title;
+    },
+    handleConfirm(slotContent) {
+      console.log("确认按钮点击");
+      console.log("插槽内容:", slotContent);
+      this.dialogVisible = false;
+    },
+    //分页数据切换
+    handleCurrentChange(val) {
+      this.formInline.pageNum = val;
+      // this.getTableList();
+    },
+    //修改状态
+    setState(state, userId) {},
+    async getTableList() {
+      try {
+        this.loading = true;
+        // const result = await getUserTableList({
+        //   ...this.formInline,
+        //   totalSize: undefined,
+        // });
+        // this.tableData = result.data.list;
+        // this.formInline.totalSize = result.data.totalSize;
+        // this.loading = false;
+      } catch (error) {
+        this.$message({
+          type: "error",
+          message: "请检查是否连接网络",
+        });
+      }
+    },
+    rowStyle() {
+      return "text-align:center";
+    },
+    // 查询
+    onSubmit() {
+      this.getTableList();
+    },
+    // 重置
+    reset(formName) {
+      this.$refs[formName].resetFields();
+      this.getTableList();
+    },
+
+    // 新增,编辑确定
+    // submitForm(formName) {
+    //   this.$refs[formName].validate((valid) => {
+    //     if (valid) {
+    //       this.loadingView = true;
+    //       switch (this.title) {
+    //         case "新增":
+    //           addUser({ ...this.ruleForm, userId: undefined })
+    //             .then((res) => {
+    //               this.$message({
+    //                 type: "success",
+    //                 message: res.msg,
+    //               });
+    //               this.getTableList();
+    //               this.nuedialog = false;
+    //               this.loadingView = false;
+    //             })
+    //             .catch(() => {
+    //               this.loadingView = false;
+    //             });
+
+    //           break;
+    //         case "编辑":
+    //           editUser({ ...this.ruleForm })
+    //             .then((res) => {
+    //               this.$message({
+    //                 type: "success",
+    //                 message: res.msg,
+    //               });
+    //               this.getTableList();
+    //               this.nuedialog = false;
+    //               this.loadingView = false;
+    //             })
+    //             .catch(() => {
+    //               this.loadingView = false;
+    //             });
+
+    //           break;
+    //       }
+    //       // this.nuedialog = false;
+    //     } else {
+    //       return false;
+    //     }
+    //   });
+    // },
+    //点击取消
+    // cancel(formName) {
+    //   this.$refs[formName] && this.$refs[formName].resetFields();
+    //   this.ruleForm = {
+    //     phone: null,
+    //     pwd: null,
+    //     roleId: null,
+    //     userName: null,
+    //     userId: null,
+    //     loginName: null,
+    //   };
+    //   this.nuedialog = false;
+    //   this.loadingView = false;
+    // },
+    // 编辑 回显数据
+    async compile(row) {
+      try {
+        // const result = await getUserInfoByUserId({ userId: row.userId });
+        const userInfo = result.data;
+        // 直接替换整个对象,以确保 Vue 的响应式系统能够检测到变化
+        this.ruleForm = {
+          phone: userInfo.userPhone,
+          pwd: undefined, // 如果需要重置密码字段
+          roleId: userInfo.roleId.toString(),
+          userName: userInfo.userName,
+          userId: userInfo.userId, // 如果需要用户ID
+          loginName: userInfo.loginName,
+        };
+        this.nuedialog = true;
+        this.title = "编辑";
+      } catch (error) {
+        this.$message.error("获取用户信息失败");
+      }
+    },
+    // 新增
+    newnuedialog() {
+      this.cancel("addUserForm");
+      this.ruleForm = {
+        loginName: "",
+        pwd: "",
+        userName: "",
+      };
+      this.nuedialog = true;
+      this.title = "新增";
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.general {
+  display: flex;
+  flex-wrap: wrap;
+
+  .condition {
+    width: 50%;
+    display: flex;
+
+    p {
+      width: 100px;
+      text-align: right;
+      line-height: 40px;
+    }
+
+    span {
+      line-height: 40px;
+
+      padding-left: 20px;
+    }
+
+    .el-select {
+      width: 100%;
+      margin-bottom: 20px;
+    }
+
+    .el-input {
+      margin-bottom: 20px;
+    }
+  }
+}
+
+.attachment {
+  display: flex;
+  padding-top: 10px;
+
+  p {
+    margin-right: 20px;
+    color: #409eff;
+  }
+}
+
+.addition {
+  display: flex;
+  justify-content: flex-end;
+  margin-bottom: 10px;
+}
+.demo-ruleForm {
+  .el-form-item {
+    margin-bottom: 25px;
+  }
+}
+</style>

+ 14 - 39
src/views/performance/batchMag.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-05-27 09:23:37
- * @LastEditTime: 2024-05-27 10:34:49
+ * @LastEditTime: 2024-05-28 14:23:30
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/batchMag.vue
@@ -23,17 +23,13 @@
             placeholder="请输入风场名称"
           ></el-input>
         </el-form-item>
-        <el-form-item label="角色名称:" prop="roleId">
+        <el-form-item label="状态:" prop="roleAvailable" size="small">
           <el-select
-            v-model="formInline.roleId"
-            placeholder="请选择角色"
-            size="small"
+            v-model="formInline.roleAvailable"
+            placeholder="请选择状态"
           >
-            <el-option
-              :label="item.roleDescription"
-              v-for="item in roleList"
-              :value="item.id + ''"
-            ></el-option>
+            <el-option label="启用" value="1"></el-option>
+            <el-option label="停用" value="0"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -147,37 +143,10 @@
           label-width="100px"
           class="demo-ruleForm"
         >
-          <el-form-item label="员工名称" prop="userName">
-            <el-input
-              v-model="ruleForm.userName"
-              placeholder="请输入员工名称"
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="电话号码" prop="phone">
-            <el-input
-              v-model="ruleForm.phone"
-              placeholder="请输入电话号码"
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="账号名称" prop="loginName">
-            <el-input
-              v-model="ruleForm.loginName"
-              placeholder="请输入账号名称"
-              autocomplete="off"
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="密码" prop="pwd" v-if="title === '新增'">
-            <el-input
-              v-model="ruleForm.pwd"
-              autocomplete="new-password"
-              show-password
-              placeholder="请输入密码"
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="角色名称:" prop="roleId">
+          <el-form-item label="关联风场:" prop="roleId">
             <el-select
               v-model="ruleForm.roleId"
-              placeholder="请选择角色"
+              placeholder="请选择关联风场"
               style="width: 100%"
             >
               <el-option
@@ -187,6 +156,12 @@
               ></el-option>
             </el-select>
           </el-form-item>
+          <el-form-item label="批次名称" prop="phone">
+            <el-input
+              v-model="ruleForm.phone"
+              placeholder="请输入批次名称"
+            ></el-input>
+          </el-form-item>
         </el-form>
         <span slot="footer" class="dialog-footer">
           <el-button @click="cancel('addUserForm')" size="small"

+ 163 - 0
src/views/performance/components/EditAnalysis.vue

@@ -0,0 +1,163 @@
+<!--
+ * @Author: your name
+ * @Date: 2024-05-29 09:14:23
+ * @LastEditTime: 2024-05-30 17:49:58
+ * @LastEditors: bogon
+ * @Description: In User Settings Edit
+ * @FilePath: /performance-test/src/views/performance/components/EditAnalysis.vue
+-->
+<template>
+  <div>
+    <el-card shadow="always" class="box-card">
+      <el-row>
+        <el-col :span="12"
+          ><div class="left">
+            <div>
+              <span>机组编号:</span>
+              <el-select v-model="value" placeholder="请选择" size="small">
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+            <div>1.额定功率(Rated Power):指发电机组在标准工况下</div>
+            <div>2.发电机类型(Generator Type):</div>
+            <div>3.经度(Longitude):</div>
+            <div>4.维度(Dimensionality):</div>
+            <div>5.海拔高度(Altitude):</div>
+            <div>6.并网时间(Grid connection time):</div>
+            <div>7.是否标杆(Benchmarking or not):</div>
+            <div>8.地理位置(Location):不同地理位置的气候条件</div>
+            <div>
+              9.供应商信息(Manufacturer
+              Information):制造商的信誉、技术水平和售后
+            </div>
+            <div>
+              10.维护需求(Maintenance Requirements):风力发电机组需要定期
+            </div>
+            <div>11.预期寿命(Expected Lifetime):风力发电机组的设计寿命</div>
+          </div>
+        </el-col>
+        <el-col :span="12"><div class="right">右</div></el-col>
+      </el-row>
+    </el-card>
+    <div class="abalysisType">
+      <el-tabs
+        v-model="editableTabsValue"
+        type="card"
+        editable
+        @edit="handleTabsEdit"
+      >
+        <el-tab-pane
+          :key="item.name"
+          v-for="(item, index) in editableTabs"
+          :label="item.title"
+          :name="item.name"
+        >
+          {{ item.content }}
+          <tinymce-editor
+            ref="editor"
+            v-model="msg"
+            :disabled="disabled"
+            :base-url="baseUrl"
+            :language="language"
+            :skin="skin"
+            @onClick="onClick"
+          >
+          </tinymce-editor>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+<script>
+import TinymceEditor from "@/components/Tinymce.vue";
+export default {
+  components: {
+    TinymceEditor,
+  },
+  data() {
+    return {
+      value: "",
+      options: [],
+      editableTabsValue: "2",
+      editableTabs: [
+        {
+          title: "Tab 1",
+          name: "1",
+          content: "Tab 1 content",
+        },
+        {
+          title: "Tab 2",
+          name: "2",
+          content: "Tab 2 content",
+        },
+      ],
+      formData: { content: "<p>Hello, Tinymce!</p>" },
+      tabIndex: 2,
+    };
+  },
+  methods: {
+    // 鼠标单击的事件
+    onClick(e, editor) {
+      console.log("Element clicked");
+      console.log(e);
+      console.log(editor);
+    },
+    // 清空内容
+    clear() {
+      this.$refs.editor.clear();
+    },
+    handleTabsEdit(targetName, action) {
+      if (action === "add") {
+        let newTabName = ++this.tabIndex + "";
+        this.editableTabs.push({
+          title: "New Tab",
+          name: newTabName,
+          content: "New Tab content",
+        });
+        this.editableTabsValue = newTabName;
+      }
+      if (action === "remove") {
+        let tabs = this.editableTabs;
+        let activeName = this.editableTabsValue;
+        if (activeName === targetName) {
+          tabs.forEach((tab, index) => {
+            if (tab.name === targetName) {
+              let nextTab = tabs[index + 1] || tabs[index - 1];
+              if (nextTab) {
+                activeName = nextTab.name;
+              }
+            }
+          });
+        }
+
+        this.editableTabsValue = activeName;
+        this.editableTabs = tabs.filter((tab) => tab.name !== targetName);
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.box-card {
+  // box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
+  width: 100%;
+  font-size: 14px;
+  .el-card__body {
+    width: 100%;
+    .left {
+      > div {
+        line-height: 3;
+      }
+    }
+  }
+}
+.abalysisType {
+  margin-top: 30px;
+}
+</style>

+ 160 - 0
src/views/performance/components/abnormalDetail.vue

@@ -0,0 +1,160 @@
+<template>
+  <div>
+    <div class="newly">
+      <el-button type="primary" @click="addRow" size="small">新增</el-button>
+    </div>
+
+    <el-table :data="tableData" border>
+      <el-table-column prop="name" label="异常数量" align="center">
+        <template slot-scope="scope">
+          <div v-if="scope.row.isEditing">
+            <el-input
+              v-model="scope.row.name"
+              placeholder="Enter name"
+            ></el-input>
+          </div>
+          <div v-else>
+            {{ scope.row.name }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="age" label="解决异常" align="center">
+        <template slot-scope="scope">
+          <div v-if="scope.row.isEditing">
+            <el-input
+              v-model="scope.row.age"
+              type="number"
+              placeholder="Enter age"
+            ></el-input>
+          </div>
+          <div v-else>
+            {{ scope.row.age }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="address" label="分析类型">
+        <template slot-scope="scope">
+          <div v-if="scope.row.isEditing">
+            <el-input
+              v-model="scope.row.address"
+              placeholder="Enter address"
+            ></el-input>
+          </div>
+          <div v-else>
+            {{ scope.row.address }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="address" label="机组编号" align="center">
+        <template slot-scope="scope">
+          <div v-if="scope.row.isEditing">
+            <el-input
+              v-model="scope.row.address"
+              placeholder="Enter address"
+            ></el-input>
+          </div>
+          <div v-else>
+            {{ scope.row.address }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="address" label="创建时间" align="center">
+        <template slot-scope="scope">
+          <div v-if="scope.row.isEditing">/</div>
+          <div v-else>/</div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="address" label="更新时间" align="center">
+        <template slot-scope="scope">
+          <div v-if="scope.row.isEditing">/</div>
+          <div v-else>/</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="150" align="center">
+        <template slot-scope="scope">
+          <el-button
+            v-if="!scope.row.isEditing"
+            size="small"
+            @click="editRow(scope.$index)"
+            >编辑</el-button
+          >
+          <el-button
+            v-if="scope.row.isEditing"
+            size="small"
+            @click="submitRow(scope.$index)"
+            >提交</el-button
+          >
+          <el-button @click="deleteRow(scope.$index)" size="small"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="pagination-container">
+      <el-pagination
+        @current-change="handleCurrentChange"
+        :current-page.sync="formInline.pageNum"
+        layout="total, prev, pager, next"
+        :page-size="formInline.pageSize"
+        :total="formInline.totalSize"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      formInline: {
+        pageNum: 1,
+        pageSize: 10,
+        totalSize: 0,
+      },
+      tableData: [
+        { name: "John", age: 25, address: "New York", isEditing: false },
+        { name: "Mike", age: 30, address: "Los Angeles", isEditing: false },
+        { name: "Kate", age: 22, address: "Chicago", isEditing: false },
+      ],
+    };
+  },
+  methods: {
+    // 分页数据切换
+    handleCurrentChange(val) {
+      this.formInline.pageNum = val;
+      // this.getTableList();
+    },
+    // 新增数据
+    addRow() {
+      this.tableData.unshift({
+        name: "",
+        age: null,
+        address: "",
+        isEditing: true,
+      });
+    },
+    // 编辑行
+    editRow(index) {
+      this.$set(this.tableData[index], "isEditing", true);
+    },
+    // 提交行
+    submitRow(index) {
+      this.$set(this.tableData[index], "isEditing", false);
+      // 处理提交逻辑,例如发送数据到服务器
+      console.log("Row submitted:", this.tableData[index]);
+    },
+    // 删除行
+    deleteRow(index) {
+      this.tableData.splice(index, 1);
+    },
+  },
+};
+</script>
+
+<style scoped>
+.pagination-container {
+  margin-top: 20px;
+  text-align: right;
+}
+</style>

+ 565 - 0
src/views/performance/components/analysisEvent.vue

@@ -0,0 +1,565 @@
+<!--
+ * @Author: your name
+ * @Date: 2024-05-29 09:13:51
+ * @LastEditTime: 2024-05-31 13:57:21
+ * @LastEditors: bogon
+ * @Description: In User Settings Edit
+ * @FilePath: /performance-test/src/views/performance/components/analysisEvent.vue
+-->
+<template>
+  <div>
+    <el-card shadow="always" class="box-card">
+      <el-form ref="form" :model="form">
+        <el-row class="flex-wrap-row" :gutter="5">
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="5">
+            <el-form-item label="分析类型">
+              <el-select
+                v-model="form.region"
+                placeholder="请选择分析类型"
+                size="small"
+              >
+                <el-option label="类型一" value="shanghai"></el-option>
+                <el-option label="类型二" value="beijing"></el-option>
+              </el-select> </el-form-item
+          ></el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="5">
+            <el-form-item label="机组编号">
+              <el-select
+                multiple
+                v-model="form.region"
+                placeholder="请选择机组编号"
+                size="small"
+              >
+                <el-option label="类型一" value="shanghai"></el-option>
+                <el-option label="类型二" value="beijing"></el-option>
+              </el-select> </el-form-item
+          ></el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="5">
+            <el-form-item label="滤除月份">
+              <el-date-picker
+                width="200"
+                size="small"
+                type="dates"
+                v-model="value4"
+                placeholder="选择一个或多个日期"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="9">
+            <el-form-item label="分析时间">
+              <el-date-picker
+                size="small"
+                v-model="value1"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+              >
+              </el-date-picker> </el-form-item
+          ></el-col>
+        </el-row>
+        <!-- <el-row>
+          <el-col style="color: #666; line-height: 40px">
+            SACAD数据测点过滤设置 :</el-col
+          >
+        </el-row> -->
+        <el-row :gutter="5">
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="风速过滤">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="桨距角过滤">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="有功功率过滤">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="发电机转速过滤">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="5">
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="发电机转矩">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="步长"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input2"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="风能利用系数">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="步长"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input2"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="叶尖转速比">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="步长"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input2"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="有功功率">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="步长"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input2"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6">
+            <el-form-item label="桨距角">
+              <div class="demo-input-suffix">
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="步长"
+                  v-model="input1"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最小值"
+                  v-model="input2"
+                >
+                </el-input>
+                <el-input
+                  type="number"
+                  size="small"
+                  placeholder="最大值"
+                  v-model="input2"
+                >
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row type="flex" justify="end">
+          <el-col :span="5">
+            <el-form-item class="searchFrom">
+              <el-button type="primary" @click="onSubmit" size="small"
+                >查询</el-button
+              >
+              <el-button size="small">重置</el-button>
+              <i @click="drawer = true" class="el-icon-setting"></i>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card shadow="always" class="box-card">
+      <el-row>
+        <el-col :span="12"
+          ><div class="left">
+            <div>
+              <span>机组编号:</span>
+              <el-select v-model="value" placeholder="请选择" size="small">
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+            <div>1.额定功率(Rated Power):指发电机组在标准工况下</div>
+            <div>2.发电机类型(Generator Type):</div>
+            <div>3.经度(Longitude):</div>
+            <div>4.维度(Dimensionality):</div>
+            <div>5.海拔高度(Altitude):</div>
+            <div>6.并网时间(Grid connection time):</div>
+            <div>7.是否标杆(Benchmarking or not):</div>
+            <div>8.地理位置(Location):不同地理位置的气候条件</div>
+            <div>
+              9.供应商信息(Manufacturer
+              Information):制造商的信誉、技术水平和售后
+            </div>
+            <div>
+              10.维护需求(Maintenance Requirements):风力发电机组需要定期
+            </div>
+            <div>11.预期寿命(Expected Lifetime):风力发电机组的设计寿命</div>
+          </div>
+        </el-col>
+        <el-col :span="12"><div class="right">右</div></el-col>
+      </el-row>
+    </el-card>
+    <el-drawer
+      title="偏好设置"
+      :visible.sync="drawer"
+      :direction="direction"
+      :before-close="handleClose"
+      class="drawerOption"
+    >
+      <el-row>
+        <el-col :span="12"
+          ><div class="drawerLeft">
+            <div style="text-align: center; font-size: 16px">常用功能设置</div>
+            <el-checkbox
+              :indeterminate="isIndeterminate"
+              v-model="checkAll"
+              @change="handleCheckAllChange"
+              >全选</el-checkbox
+            >
+            <div style="margin: 15px 0"></div>
+            <el-checkbox-group
+              v-model="checkedCities"
+              @change="handleCheckedCitiesChange"
+            >
+              <el-checkbox v-for="city in cities" :label="city" :key="city">{{
+                city
+              }}</el-checkbox>
+              <el-checkbox
+                label="SCADA数据过滤"
+                key="SCADA数据过滤"
+              ></el-checkbox>
+              <div class="checkFromRow">
+                <el-row>
+                  <el-col :span="12">发电机转速测点</el-col>
+                  <el-col :span="12">桨距角值测点</el-col>
+                  <el-col :span="12">有功功率测点</el-col>
+                  <el-col :span="12">风速速度测点</el-col>
+                </el-row>
+              </div>
+
+              <el-checkbox label="图像设置" key="图像设置"></el-checkbox>
+              <div class="checkFromRow">
+                <el-row>
+                  <el-col :span="12">发电机转矩轴系</el-col>
+                  <el-col :span="12">桨距角轴系</el-col>
+                  <el-col :span="12">叶尖速比轴系</el-col>
+                  <el-col :span="12">有功功率轴系</el-col>
+                  <el-col :span="12">发电机转矩轴系</el-col>
+                </el-row>
+              </div>
+            </el-checkbox-group>
+          </div></el-col
+        >
+        <el-col :span="12">
+          <div class="drawerRight">
+            <div style="text-align: center; font-size: 16px">已选中功能</div>
+          </div></el-col
+        >
+      </el-row>
+    </el-drawer>
+  </div>
+</template>
+<script>
+import TinymceEditor from "@/components/Tinymce.vue";
+export default {
+  components: {
+    TinymceEditor,
+  },
+  data() {
+    return {
+      checkAll: false,
+      checkedCities: [],
+      cities: ["分析类型", "分析时间", "过滤月份", "机组编号"],
+      isIndeterminate: true,
+      drawer: false,
+      direction: "rtl",
+      value: "",
+      options: [],
+      editableTabsValue: "2",
+      editableTabs: [
+        {
+          title: "Tab 1",
+          name: "1",
+          content: "Tab 1 content",
+        },
+        {
+          title: "Tab 2",
+          name: "2",
+          content: "Tab 2 content",
+        },
+      ],
+      form: {
+        name: "",
+        region: "",
+        date1: "",
+        date2: "",
+        delivery: false,
+        type: [],
+        resource: "",
+        desc: "",
+      },
+      formData: { content: "<p>Hello, Tinymce!</p>" },
+      tabIndex: 2,
+    };
+  },
+  methods: {
+    handleCheckAllChange(val) {
+      this.checkedCities = val
+        ? [...this.cities, "SCADA数据过滤", "图像设置"]
+        : [];
+      this.isIndeterminate = false;
+    },
+    handleCheckedCitiesChange(value) {
+      let checkedCount = value.length;
+      this.checkAll = checkedCount === this.cities.length + 2;
+      this.isIndeterminate =
+        checkedCount > 0 && checkedCount < this.cities.length + 2;
+    },
+    handleClose(done) {
+      this.$confirm("确认关闭?")
+        .then((_) => {
+          done();
+        })
+        .catch((_) => {});
+    },
+    // 鼠标单击的事件
+    onClick(e, editor) {
+      console.log("Element clicked");
+      console.log(e);
+      console.log(editor);
+    },
+    onSubmit() {
+      console.log("submit!");
+    },
+    // 清空内容
+    clear() {
+      this.$refs.editor.clear();
+    },
+    handleTabsEdit(targetName, action) {
+      if (action === "add") {
+        let newTabName = ++this.tabIndex + "";
+        this.editableTabs.push({
+          title: "New Tab",
+          name: newTabName,
+          content: "New Tab content",
+        });
+        this.editableTabsValue = newTabName;
+      }
+      if (action === "remove") {
+        let tabs = this.editableTabs;
+        let activeName = this.editableTabsValue;
+        if (activeName === targetName) {
+          tabs.forEach((tab, index) => {
+            if (tab.name === targetName) {
+              let nextTab = tabs[index + 1] || tabs[index - 1];
+              if (nextTab) {
+                activeName = nextTab.name;
+              }
+            }
+          });
+        }
+
+        this.editableTabsValue = activeName;
+        this.editableTabs = tabs.filter((tab) => tab.name !== targetName);
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.box-card {
+  margin: 10px 0;
+  // box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
+  width: 100%;
+  font-size: 14px;
+  .el-card__body {
+    width: 100%;
+    .left {
+      > div {
+        line-height: 3;
+      }
+    }
+  }
+  ::v-deep .searchFrom {
+    .el-form-item__content {
+      display: flex !important;
+      justify-content: end !important;
+      align-items: center !important;
+      i {
+        margin-left: 10px;
+        font-size: 20px;
+      }
+    }
+  }
+}
+.drawerOption {
+  .el-checkbox-group {
+    line-height: 40px !important;
+  }
+  .drawerLeft {
+    margin-left: 20px;
+  }
+  .checkFromRow {
+    .el-col-12 {
+      color: #606266 !important;
+      font-size: 14px;
+    }
+    .el-col-12:nth-child(even) {
+      text-align: end !important;
+    }
+  }
+}
+// ::v-deep.el-drawer__body {
+//   margin: 0 20px !important;
+// }
+
+::v-deep.el-input--small .el-input__inner {
+  width: 200px !important;
+}
+.demo-input-suffix {
+  display: flex !important;
+}
+::v-deep.demo-input-suffix .el-input--small {
+  width: 100px !important;
+}
+::v-deep.demo-input-suffix .el-input--small .el-input__inner {
+  width: 90px !important;
+}
+.abalysisType {
+  margin-top: 30px;
+}
+</style>

+ 64 - 0
src/views/performance/components/dialogCom.vue

@@ -0,0 +1,64 @@
+<template>
+  <el-dialog
+    :visible.sync="dialogVisible"
+    :title="title"
+    :before-close="handleClose"
+  >
+    <!-- 根据 emptyFlag 和 title 显示不同的内容 -->
+    <slot v-if="emptyFlag" name="tableEl"></slot>
+    <abnormal-detail
+      v-else-if="title === '异常描述'"
+      ref="abnormalDetailRef"
+    ></abnormal-detail>
+    <div slot="footer" v-if="title === '异常详情'" class="dialog-footer">
+      <el-button @click="handleClose">取消</el-button>
+      <el-button type="primary" @click="handleConfirm">确定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import AbnormalDetail from "./abnormalDetail.vue";
+
+export default {
+  components: {
+    AbnormalDetail,
+  },
+  props: {
+    title: String,
+    visible: Boolean, // 控制对话框显示隐藏
+  },
+  data() {
+    return {
+      dialogVisible: this.visible,
+      emptyFlag: false,
+    };
+  },
+  watch: {
+    visible(newVal) {
+      this.dialogVisible = newVal;
+      this.checkEmptyFlag();
+    },
+  },
+  methods: {
+    handleClose() {
+      this.$emit("confirm");
+    },
+    handleConfirm() {
+      // 获取插槽内容并传递出去
+      const slotContent = this.$slots.tableEl;
+      console.log(slotContent);
+      this.$emit("confirm", slotContent);
+    },
+    checkEmptyFlag() {
+      this.$nextTick(() => {
+        if (this.$refs.abnormalDetailRef) {
+          const tableData = this.$refs.abnormalDetailRef.tableData;
+          this.emptyFlag = !tableData || tableData.length === 0;
+          console.log(this.emptyFlag, "this.emptyFlag");
+        }
+      });
+    },
+  },
+};
+</script>

+ 31 - 3
src/views/performance/editAssets.vue

@@ -1,13 +1,41 @@
 <!--
  * @Author: your name
  * @Date: 2024-05-27 09:26:31
- * @LastEditTime: 2024-05-27 09:28:23
+ * @LastEditTime: 2024-05-31 10:07:56
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/editAssets.vue
 -->
 <template>
-  <div>编辑性能分析</div>
+  <div class="global-variable">
+    <el-tabs v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="分析事件" name="first">
+        <analysis-event></analysis-event>
+      </el-tab-pane>
+      <el-tab-pane label="分析编辑" name="second">
+        <edit-analysis></edit-analysis>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
 </template>
-<script></script>
+<script>
+import EditAnalysis from "./components/EditAnalysis.vue";
+import AnalysisEvent from "./components/analysisEvent.vue";
+export default {
+  components: {
+    EditAnalysis,
+    AnalysisEvent,
+  },
+  data() {
+    return {
+      activeName: "first",
+    };
+  },
+  methods: {
+    handleClick(tab, event) {
+      console.log(tab, event);
+    },
+  },
+};
+</script>
 <style scoped lang="scss"></style>

+ 0 - 1
src/views/system/roleMag/components/menuTree.vue

@@ -9,7 +9,6 @@
       highlight-current
       :props="defaultProps"
     >
-      <!-- :check-strictly="true"? -->
     </el-tree>
   </div>
 </template>

+ 1 - 0
src/views/system/roleMag/index.vue

@@ -193,6 +193,7 @@
               <el-option
                 :label="item.contentsName"
                 v-for="item in stateOPtions"
+                :key="item.contentsName"
                 :value="item.contentsValue"
               ></el-option>
             </el-select>

+ 22 - 4
src/views/system/userMag/index.vue

@@ -6,8 +6,17 @@
           <el-input size="small" v-model="formInline.userName" placeholder="请输入用户名称"></el-input>
         </el-form-item>
         <el-form-item label="角色名称:" prop="roleId">
-          <el-select v-model="formInline.roleId" placeholder="请选择角色" size="small">
-            <el-option :label="item.roleDescription" v-for="item in roleList" :value="item.id + ''"></el-option>
+          <el-select
+            v-model="formInline.roleId"
+            placeholder="请选择角色"
+            size="small"
+          >
+            <el-option
+              :label="item.roleDescription"
+              v-for="item in roleList"
+              :key="item.id"
+              :value="item.id + ''"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -84,8 +93,17 @@
             <el-input v-model="ruleForm.pwd" autocomplete="new-password" show-password placeholder="请输入密码"></el-input>
           </el-form-item>
           <el-form-item label="角色名称:" prop="roleId">
-            <el-select v-model="ruleForm.roleId" placeholder="请选择角色" style="width: 100%">
-              <el-option :label="item.roleDescription" v-for="item in roleList" :value="item.id + ''"></el-option>
+            <el-select
+              v-model="ruleForm.roleId"
+              placeholder="请选择角色"
+              style="width: 100%"
+            >
+              <el-option
+                :label="item.roleDescription"
+                v-for="item in roleList"
+                :key="item.id"
+                :value="item.id + ''"
+              ></el-option>
             </el-select>
           </el-form-item>
         </el-form>

+ 12 - 2
vue.config.js

@@ -44,6 +44,7 @@ module.exports = {
       },
     ]);
   },
+
   css: {
     loaderOptions: {
       postcss: {
@@ -58,12 +59,13 @@ module.exports = {
       },
     },
   },
+
   devServer: {
     proxy: {
       "/api": {
         // target: "http://192.168.5.4:16200", // 石月
-        // target: "http://192.168.50.235:16200", //内网
-        target: "http://106.120.102.238:16600",//外网
+        target: "http://192.168.50.235:16200", //内网
+        // target: "http://106.120.102.238:16600", //外网
         changeOrigin: true,
         pathRewrite: {
           "^/api": "", // 需要rewrite重写的,
@@ -71,6 +73,7 @@ module.exports = {
       },
     },
   },
+
   configureWebpack: {
     resolve: {
       alias: {
@@ -86,4 +89,11 @@ module.exports = {
       minimizer: [new TerserPlugin(), new CssMinimizerPlugin()],
     },
   },
+
+  pluginOptions: {
+    'style-resources-loader': {
+      preProcessor: 'sass',
+      patterns: []
+    }
+  }
 };