From ab003714bfe46063de9d1345fe5228209cccda0c Mon Sep 17 00:00:00 2001 From: yangchunlong <292345300@qq.com> Date: Wed, 7 May 2025 17:55:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=9A=80=20=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=AF=8C=E6=96=87=E6=9C=AC=E7=BC=96=E8=BE=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 589 +++++++++++++++--- package.json | 3 + src/components.d.ts | 17 +- src/components/Editor/index.scss | 80 +++ src/components/Editor/index.vue | 242 +++++++ src/components/Editor/quill-image.js | 20 + src/components/Editor/quill-video.js | 64 ++ src/components/Editor/titleConfig.js | 47 ++ src/components/Editor/utils.js | 8 + src/components/WangEditor/index.scss | 3 + src/components/WangEditor/index.vue | 18 +- src/components/WangEditor/text.txt | 1 + src/components/rulesForm/index.vue | 3 +- src/main.ts | 4 +- src/utils/convertSpanToDiv.ts | 15 + src/utils/recursiveCompare.ts | 13 + src/views/QAManagement/list/edit.vue | 8 +- src/views/articleManagement/class/index.vue | 8 + .../articleManagement/list/constant/edit.ts | 2 +- .../articleManagement/list/constant/search.ts | 2 +- src/views/articleManagement/list/edit.vue | 37 +- src/views/articleManagement/list/index.vue | 17 +- src/views/articleManagement/recycle/index.vue | 18 +- src/views/downloadManagement/list/edit.vue | 31 +- src/views/productManagement/list/edit.vue | 6 +- .../list/utils/edit/initDetailParams.ts | 3 +- src/views/videoManagement/list/index.vue | 14 +- vite.config.ts | 4 +- 28 files changed, 1145 insertions(+), 132 deletions(-) create mode 100644 src/components/Editor/index.scss create mode 100644 src/components/Editor/index.vue create mode 100644 src/components/Editor/quill-image.js create mode 100644 src/components/Editor/quill-video.js create mode 100644 src/components/Editor/titleConfig.js create mode 100644 src/components/Editor/utils.js create mode 100644 src/components/WangEditor/text.txt create mode 100644 src/utils/convertSpanToDiv.ts create mode 100644 src/utils/recursiveCompare.ts diff --git a/package-lock.json b/package-lock.json index e09bb2d..23c977a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.1.0", "@types/decimal.js": "^7.4.0", + "@vueup/vue-quill": "^1.2.0", "@vueuse/core": "^10.1.2", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", @@ -27,12 +28,14 @@ "jsbarcode": "^3.11.6", "jsonpack": "^1.1.5", "lodash-es": "^4.17.21", + "mavon-editor": "^3.0.2", "mitt": "^3.0.0", "nprogress": "^0.2.0", "pinia": "^2.1.3", "pinia-plugin-persistedstate": "^3.1.0", "print-js": "^1.6.0", "qs": "^6.13.1", + "quill": "^2.0.3", "sortablejs": "^1.15.0", "vue": "^3.3.4", "vue-router": "^4.2.2", @@ -3607,6 +3610,74 @@ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.4.tgz", "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, + "node_modules/@vueup/vue-quill": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@vueup/vue-quill/-/vue-quill-1.2.0.tgz", + "integrity": "sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==", + "dependencies": { + "quill": "^1.3.7", + "quill-delta": "^4.2.2" + }, + "peerDependencies": { + "vue": "^3.2.41" + } + }, + "node_modules/@vueup/vue-quill/node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" + }, + "node_modules/@vueup/vue-quill/node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "node_modules/@vueup/vue-quill/node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "node_modules/@vueup/vue-quill/node_modules/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "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/@vueup/vue-quill/node_modules/quill-delta": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/quill-delta/-/quill-delta-4.2.2.tgz", + "integrity": "sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==", + "dependencies": { + "fast-diff": "1.2.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + } + }, + "node_modules/@vueup/vue-quill/node_modules/quill/node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "node_modules/@vueup/vue-quill/node_modules/quill/node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/@vueuse/core": { "version": "10.1.2", "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.1.2.tgz", @@ -4323,13 +4394,20 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/call-bind-apply-helpers": { @@ -4683,7 +4761,6 @@ "version": "2.1.2", "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, "engines": { "node": ">=0.8" } @@ -5448,6 +5525,11 @@ "node": ">=4" } }, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmmirror.com/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, "node_modules/csso": { "version": "4.2.0", "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", @@ -5617,6 +5699,25 @@ "node": ">=0.10" } }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "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/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", @@ -5637,6 +5738,22 @@ "resolved": "https://registry.npmmirror.com/default-passive-events/-/default-passive-events-2.0.0.tgz", "integrity": "sha512-eMtt76GpDVngZQ3ocgvRcNCklUMwID1PaNbCNxfpDXuiOXttSh0HzBbda1HU9SIUsDc02vb7g9+3I5tlqe/qMQ==" }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -5647,16 +5764,19 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-property": { @@ -6566,6 +6686,11 @@ "es5-ext": "~0.10.14" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", @@ -6715,6 +6840,11 @@ "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -6755,8 +6885,7 @@ "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" }, "node_modules/fast-glob": { "version": "3.2.12", @@ -7061,8 +7190,7 @@ "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -7576,12 +7704,14 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { @@ -7605,15 +7735,17 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-value": { @@ -7958,6 +8090,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -8049,7 +8196,6 @@ "version": "1.0.5", "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8202,7 +8348,6 @@ "version": "1.1.4", "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9161,6 +9306,14 @@ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, + "node_modules/mavon-editor": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/mavon-editor/-/mavon-editor-3.0.2.tgz", + "integrity": "sha512-QmmsypznEkru3Gj9u/i3OLs7uWOwrAUDyLAiQnl7bj2lvZZ++J7MPA+Al0G26cQZ8GwzyC69T5l6NQjZ2z1Nuw==", + "dependencies": { + "xss": "^1.0.10" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.30.tgz", @@ -9725,11 +9878,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "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.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -9898,6 +10065,11 @@ "tslib": "^2.0.3" } }, + "node_modules/parchment": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/parchment/-/parchment-3.0.0.tgz", + "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", @@ -10653,6 +10825,33 @@ "node": ">=8" } }, + "node_modules/quill": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/quill/-/quill-2.0.3.tgz", + "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==", + "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://registry.npmmirror.com/quill-delta/-/quill-delta-5.1.0.tgz", + "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", + "dependencies": { + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", @@ -10925,17 +11124,22 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpu-core": { @@ -11284,6 +11488,36 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", @@ -14839,6 +15073,26 @@ "node": ">=12" } }, + "node_modules/xss": { + "version": "1.0.15", + "resolved": "https://registry.npmmirror.com/xss/-/xss-1.0.15.tgz", + "integrity": "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==", + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xss/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", @@ -17502,6 +17756,72 @@ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.4.tgz", "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, + "@vueup/vue-quill": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@vueup/vue-quill/-/vue-quill-1.2.0.tgz", + "integrity": "sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==", + "requires": { + "quill": "^1.3.7", + "quill-delta": "^4.2.2" + }, + "dependencies": { + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "quill": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/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" + }, + "dependencies": { + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/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" + } + } + } + }, + "quill-delta": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/quill-delta/-/quill-delta-4.2.2.tgz", + "integrity": "sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==", + "requires": { + "fast-diff": "1.2.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + } + } + } + }, "@vueuse/core": { "version": "10.1.2", "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.1.2.tgz", @@ -18014,13 +18334,14 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" } }, "call-bind-apply-helpers": { @@ -18301,8 +18622,7 @@ "clone": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" }, "codepage": { "version": "1.15.0", @@ -18909,6 +19229,11 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmmirror.com/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, "csso": { "version": "4.2.0", "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", @@ -19040,6 +19365,19 @@ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, + "deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/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" + } + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", @@ -19057,6 +19395,16 @@ "resolved": "https://registry.npmmirror.com/default-passive-events/-/default-passive-events-2.0.0.tgz", "integrity": "sha512-eMtt76GpDVngZQ3ocgvRcNCklUMwID1PaNbCNxfpDXuiOXttSh0HzBbda1HU9SIUsDc02vb7g9+3I5tlqe/qMQ==" }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -19064,11 +19412,11 @@ "dev": true }, "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -19784,6 +20132,11 @@ "es5-ext": "~0.10.14" } }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", @@ -19914,6 +20267,11 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -19948,8 +20306,7 @@ "fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" }, "fast-glob": { "version": "3.2.12", @@ -20191,8 +20548,7 @@ "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "gensync": { "version": "1.0.0-beta.2", @@ -20600,12 +20956,11 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, "has-proto": { @@ -20620,12 +20975,11 @@ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "has-value": { @@ -20901,6 +21255,15 @@ "kind-of": "^6.0.0" } }, + "is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "requires": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + } + }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -20980,7 +21343,6 @@ "version": "1.0.5", "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -21088,7 +21450,6 @@ "version": "1.1.4", "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -21866,6 +22227,14 @@ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, + "mavon-editor": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/mavon-editor/-/mavon-editor-3.0.2.tgz", + "integrity": "sha512-QmmsypznEkru3Gj9u/i3OLs7uWOwrAUDyLAiQnl7bj2lvZZ++J7MPA+Al0G26cQZ8GwzyC69T5l6NQjZ2z1Nuw==", + "requires": { + "xss": "^1.0.10" + } + }, "mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.30.tgz", @@ -22328,11 +22697,19 @@ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.3.tgz", "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==" }, + "object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -22466,6 +22843,11 @@ "tslib": "^2.0.3" } }, + "parchment": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/parchment/-/parchment-3.0.0.tgz", + "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", @@ -23059,6 +23441,27 @@ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, + "quill": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/quill/-/quill-2.0.3.tgz", + "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==", + "requires": { + "eventemitter3": "^5.0.1", + "lodash-es": "^4.17.21", + "parchment": "^3.0.0", + "quill-delta": "^5.1.0" + } + }, + "quill-delta": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", @@ -23280,14 +23683,16 @@ } }, "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" } }, "regexpu-core": { @@ -23557,6 +23962,30 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", @@ -26355,6 +26784,22 @@ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, + "xss": { + "version": "1.0.15", + "resolved": "https://registry.npmmirror.com/xss/-/xss-1.0.15.tgz", + "integrity": "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==", + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index d9c89d6..a30a6f9 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.1.0", "@types/decimal.js": "^7.4.0", + "@vueup/vue-quill": "^1.2.0", "@vueuse/core": "^10.1.2", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", @@ -39,12 +40,14 @@ "jsbarcode": "^3.11.6", "jsonpack": "^1.1.5", "lodash-es": "^4.17.21", + "mavon-editor": "^3.0.2", "mitt": "^3.0.0", "nprogress": "^0.2.0", "pinia": "^2.1.3", "pinia-plugin-persistedstate": "^3.1.0", "print-js": "^1.6.0", "qs": "^6.13.1", + "quill": "^2.0.3", "sortablejs": "^1.15.0", "vue": "^3.3.4", "vue-router": "^4.2.2", diff --git a/src/components.d.ts b/src/components.d.ts index b03dfa2..c3bd2b4 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -11,21 +11,15 @@ declare module "vue" { 404: typeof import("./components/ErrorMessage/404.vue")["default"]; 500: typeof import("./components/ErrorMessage/500.vue")["default"]; ColSetting: typeof import("./components/ProTable/components/ColSetting.vue")["default"]; + Editor: typeof import("./components/Editor/index.vue")["default"]; ElAside: typeof import("element-plus/es")["ElAside"]; ElAutocomplete: typeof import("element-plus/es")["ElAutocomplete"]; ElBreadcrumb: typeof import("element-plus/es")["ElBreadcrumb"]; ElBreadcrumbItem: typeof import("element-plus/es")["ElBreadcrumbItem"]; ElButton: typeof import("element-plus/es")["ElButton"]; - ElCarousel: typeof import("element-plus/es")["ElCarousel"]; - ElCarouselItem: typeof import("element-plus/es")["ElCarouselItem"]; - ElCheckbox: typeof import("element-plus/es")["ElCheckbox"]; - ElCheckboxGroup: typeof import("element-plus/es")["ElCheckboxGroup"]; - ElColorPicker: typeof import("element-plus/es")["ElColorPicker"]; ElContainer: typeof import("element-plus/es")["ElContainer"]; ElDatePicker: typeof import("element-plus/es")["ElDatePicker"]; ElDialog: typeof import("element-plus/es")["ElDialog"]; - ElDivider: typeof import("element-plus/es")["ElDivider"]; - ElDrawer: typeof import("element-plus/es")["ElDrawer"]; ElDropdown: typeof import("element-plus/es")["ElDropdown"]; ElDropdownItem: typeof import("element-plus/es")["ElDropdownItem"]; ElDropdownMenu: typeof import("element-plus/es")["ElDropdownMenu"]; @@ -33,28 +27,19 @@ declare module "vue" { ElFormItem: typeof import("element-plus/es")["ElFormItem"]; ElHeader: typeof import("element-plus/es")["ElHeader"]; ElIcon: typeof import("element-plus/es")["ElIcon"]; - ElImage: typeof import("element-plus/es")["ElImage"]; ElInput: typeof import("element-plus/es")["ElInput"]; ElInputNumber: typeof import("element-plus/es")["ElInputNumber"]; ElMain: typeof import("element-plus/es")["ElMain"]; ElMenu: typeof import("element-plus/es")["ElMenu"]; ElMenuItem: typeof import("element-plus/es")["ElMenuItem"]; ElOption: typeof import("element-plus/es")["ElOption"]; - ElPagination: typeof import("element-plus/es")["ElPagination"]; ElRadio: typeof import("element-plus/es")["ElRadio"]; - ElRadioButton: typeof import("element-plus/es")["ElRadioButton"]; ElRadioGroup: typeof import("element-plus/es")["ElRadioGroup"]; ElScrollbar: typeof import("element-plus/es")["ElScrollbar"]; ElSelect: typeof import("element-plus/es")["ElSelect"]; ElSubMenu: typeof import("element-plus/es")["ElSubMenu"]; - ElSwitch: typeof import("element-plus/es")["ElSwitch"]; - ElTable: typeof import("element-plus/es")["ElTable"]; - ElTableColumn: typeof import("element-plus/es")["ElTableColumn"]; ElTabPane: typeof import("element-plus/es")["ElTabPane"]; ElTabs: typeof import("element-plus/es")["ElTabs"]; - ElTag: typeof import("element-plus/es")["ElTag"]; - ElTooltip: typeof import("element-plus/es")["ElTooltip"]; - ElTree: typeof import("element-plus/es")["ElTree"]; ElTreeSelect: typeof import("element-plus/es")["ElTreeSelect"]; ElUpload: typeof import("element-plus/es")["ElUpload"]; Empty: typeof import("./components/ProTable/components/Empty.vue")["default"]; diff --git a/src/components/Editor/index.scss b/src/components/Editor/index.scss new file mode 100644 index 0000000..2a275d7 --- /dev/null +++ b/src/components/Editor/index.scss @@ -0,0 +1,80 @@ +.editor, +.ql-toolbar { + line-height: normal !important; + white-space: pre-wrap !important; +} +.editor-img-uploader { + display: none; +} +.ql-editor { + min-height: 600px; + max-height: 600px; + overflow: auto; +} +.ql-snow .ql-tooltip[data-mode="link"]::before { + content: "请输入链接地址:"; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + padding-right: 0; + content: "保存"; + border-right: 0; +} +.ql-snow .ql-tooltip[data-mode="video"]::before { + content: "请输入视频地址:"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: "14px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { + content: "10px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before { + content: "18px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before { + content: "32px"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: "文本"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: "标题1"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: "标题2"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: "标题3"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: "标题4"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: "标题5"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: "标题6"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: "标准字体"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before { + content: "衬线字体"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { + content: "等宽字体"; +} diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue new file mode 100644 index 0000000..2d04219 --- /dev/null +++ b/src/components/Editor/index.vue @@ -0,0 +1,242 @@ + + + + diff --git a/src/components/Editor/quill-image.js b/src/components/Editor/quill-image.js new file mode 100644 index 0000000..cf0f84e --- /dev/null +++ b/src/components/Editor/quill-image.js @@ -0,0 +1,20 @@ +import { Quill } from "@vueup/vue-quill"; +let BlockEmbed = Quill.import("blots/block/embed"); +class ImageBlot extends BlockEmbed { + static create(value) { + let node = super.create(); + node.setAttribute("src", value.url); + node.setAttribute("id", value.id); + return node; + } + + static value(node) { + return { + url: node.getAttribute("src"), + id: node.getAttribute("id") + }; + } +} +ImageBlot.blotName = "image"; +ImageBlot.tagName = "img"; +export default ImageBlot; diff --git a/src/components/Editor/quill-video.js b/src/components/Editor/quill-video.js new file mode 100644 index 0000000..3c41a47 --- /dev/null +++ b/src/components/Editor/quill-video.js @@ -0,0 +1,64 @@ +import { Quill } from "@vueup/vue-quill"; +// 源码中是import直接倒入,这里要用Quill.import引入 +const BlockEmbed = Quill.import("blots/block/embed"); +const Link = Quill.import("formats/link"); + +const ATTRIBUTES = ["height", "width"]; + +class Video extends BlockEmbed { + static create(value) { + let node = super.create(); + // 添加video标签所需的属性 + node.setAttribute("controls", "controls"); + node.setAttribute("playsinline", "true"); + node.setAttribute("webkit-playsinline", "true"); + node.setAttribute("type", "video/mp4"); + // poster 属性指定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像。 + node.setAttribute("poster", value.poster); + node.setAttribute("src", this.sanitize(value.url)); + return node; + } + + static formats(domNode) { + return ATTRIBUTES.reduce((formats, attribute) => { + if (domNode.hasAttribute(attribute)) { + formats[attribute] = domNode.getAttribute(attribute); + } + return formats; + }, {}); + } + + static sanitize(url) { + return Link.sanitize(url); + } + + static value(domNode) { + // 设置自定义的属性值 + return { + url: domNode.getAttribute("src"), + poster: domNode.getAttribute("poster") + }; + } + + format(name, value) { + if (ATTRIBUTES.indexOf(name) > -1) { + if (value) { + this.domNode.setAttribute(name, value); + } else { + this.domNode.removeAttribute(name); + } + } else { + super.format(name, value); + } + } + + html() { + const { video } = this.value(); + return `${video}`; + } +} +Video.blotName = "video"; // 这里不用改,不用iframe,直接替换掉原来,如果需要也可以保留原来的,这里用个新的blot +Video.className = "ql-video"; // 可添加样式,看实际使用需要 +Video.tagName = "video"; // 用video标签替换iframe + +export default Video; diff --git a/src/components/Editor/titleConfig.js b/src/components/Editor/titleConfig.js new file mode 100644 index 0000000..43d093e --- /dev/null +++ b/src/components/Editor/titleConfig.js @@ -0,0 +1,47 @@ +// toolbar标题(此项是用来增加hover标题) +export const titleConfig = ref([ + { Choice: ".ql-insertMetric", title: "跳转配置" }, + { Choice: ".ql-bold", title: "加粗" }, + { Choice: ".ql-italic", title: "斜体" }, + { Choice: ".ql-underline", title: "下划线" }, + { Choice: ".ql-header", title: "段落格式" }, + { Choice: ".ql-strike", title: "删除线" }, + { Choice: ".ql-blockquote", title: "块引用" }, + { Choice: ".ql-code", title: "插入代码" }, + { Choice: ".ql-code-block", title: "插入代码段" }, + { Choice: ".ql-font", title: "字体" }, + { Choice: ".ql-size", title: "字体大小" }, + { Choice: '.ql-list[value="ordered"]', title: "编号列表" }, + { Choice: '.ql-list[value="bullet"]', title: "项目列表" }, + { Choice: ".ql-direction", title: "文本方向" }, + { Choice: '.ql-header[value="1"]', title: "h1" }, + { Choice: '.ql-header[value="2"]', title: "h2" }, + { Choice: ".ql-align", title: "对齐方式" }, + { Choice: ".ql-color", title: "字体颜色" }, + { Choice: ".ql-background", title: "背景颜色" }, + { Choice: ".ql-image", title: "图像" }, + { Choice: ".ql-video", title: "视频" }, + { Choice: ".ql-link", title: "添加链接" }, + { Choice: ".ql-formula", title: "插入公式" }, + { Choice: ".ql-clean", title: "清除字体格式" }, + { Choice: '.ql-script[value="sub"]', title: "下标" }, + { Choice: '.ql-script[value="super"]', title: "上标" }, + { Choice: '.ql-indent[value="-1"]', title: "向左缩进" }, + { Choice: '.ql-indent[value="+1"]', title: "向右缩进" }, + { Choice: ".ql-header .ql-picker-label", title: "标题大小" }, + { Choice: '.ql-header .ql-picker-item[data-value="1"]', title: "标题一" }, + { Choice: '.ql-header .ql-picker-item[data-value="2"]', title: "标题二" }, + { Choice: '.ql-header .ql-picker-item[data-value="3"]', title: "标题三" }, + { Choice: '.ql-header .ql-picker-item[data-value="4"]', title: "标题四" }, + { Choice: '.ql-header .ql-picker-item[data-value="5"]', title: "标题五" }, + { Choice: '.ql-header .ql-picker-item[data-value="6"]', title: "标题六" }, + { Choice: ".ql-header .ql-picker-item:last-child", title: "标准" }, + { Choice: '.ql-size .ql-picker-item[data-value="small"]', title: "小号" }, + { Choice: '.ql-size .ql-picker-item[data-value="large"]', title: "大号" }, + { Choice: '.ql-size .ql-picker-item[data-value="huge"]', title: "超大号" }, + { Choice: ".ql-size .ql-picker-item:nth-child(2)", title: "标准" }, + { Choice: ".ql-align .ql-picker-item:first-child", title: "居左对齐" }, + { Choice: '.ql-align .ql-picker-item[data-value="center"]', title: "居中对齐" }, + { Choice: '.ql-align .ql-picker-item[data-value="right"]', title: "居右对齐" }, + { Choice: '.ql-align .ql-picker-item[data-value="justify"]', title: "两端对齐" } +]); diff --git a/src/components/Editor/utils.js b/src/components/Editor/utils.js new file mode 100644 index 0000000..3239b12 --- /dev/null +++ b/src/components/Editor/utils.js @@ -0,0 +1,8 @@ +export const routerObj = { + articleEditIndex: "article", + productEditIndex: "product", + bannerListIndex: "banner", + downloadListIndex: "download", + videoListIndex: "video", + QAListIndex: "QA" +}; diff --git a/src/components/WangEditor/index.scss b/src/components/WangEditor/index.scss index bbdda6f..97130be 100644 --- a/src/components/WangEditor/index.scss +++ b/src/components/WangEditor/index.scss @@ -26,3 +26,6 @@ overflow-y: hidden; } } +span img { + display: block !important; +} diff --git a/src/components/WangEditor/index.vue b/src/components/WangEditor/index.vue index 1473048..e1e026a 100644 --- a/src/components/WangEditor/index.vue +++ b/src/components/WangEditor/index.vue @@ -20,7 +20,7 @@ import { Editor, Toolbar } from "@wangeditor/editor-for-vue"; import { uploadImg, uploadVideo } from "@/api/modules/upload"; import "@wangeditor/editor/dist/css/style.css"; import { formContextKey, formItemContextKey } from "element-plus"; - +// import { cloneDeep } from "lodash-es"; // 富文本 DOM 元素 const editorRef = shallowRef(); @@ -28,6 +28,8 @@ const editorRef = shallowRef(); const handleCreated = (editor: any) => { editorRef.value = editor; }; + +console.log(editorRef.value, "=editorRef.value="); const $router = useRouter(); const routerValueName: string = $router.currentRoute.value.name as string; const routerObj: any = { @@ -55,12 +57,23 @@ const props = withDefaults(defineProps(), { excludeKeys: [] }; }, + editorConfig: () => { return { placeholder: "请输入内容...", MENU_CONF: {} + // parseElemHtml: (elemHtml: string, elem: HTMLElement, editor: any) => { + // console.log(editor, "========editor========="); + // console.log(elem.tagName, "=elem.tagName="); + // if (elem.tagName === "SPAN" && elem.querySelector("img")) { + // // 确保 span 元素可以正确显示 img + // elem.style.display = "inline-block"; + // } + // return elemHtml; + // } }; }, + height: "500px", mode: "default", hideToolBar: false, @@ -84,7 +97,9 @@ type EmitProps = { (e: "update:value", val: string): void; (e: "check-validate"): void; }; + const emit = defineEmits(); + const valueHtml = computed({ get() { return props.value; @@ -112,7 +127,6 @@ props.editorConfig.MENU_CONF!["uploadImage"] = { const result = await uploadImg(formData, routerName.value); if (result?.code === 0) { const { data } = result; - console.log(data, "==============data===================="); insertFn(import.meta.env.VITE_APP_API_BASE_UPLOAD_URL + data.path); } } catch (error) { diff --git a/src/components/WangEditor/text.txt b/src/components/WangEditor/text.txt new file mode 100644 index 0000000..bf1f407 --- /dev/null +++ b/src/components/WangEditor/text.txt @@ -0,0 +1 @@ +"

\r\n\t拿到产品后我该如何安装使用 \r\n

\r\n

\r\n\t1. 下载安装赛博云空间 \r\n

\r\n

\r\n\t1Android 移动客户端下载 \r\n

\r\n

\r\n\t手机扫一扫,进入下载页,选择安卓客户端.apk文件,下载【赛博云空间】APP \r\n

\r\n

\r\n\t可前往手机应用商店搜索“赛博云空间”进行下载(目前已安排在鸿蒙4.0、小米、OPPO、vivo应用商店上架) \r\n

\r\n

\r\n\t
\r\n
\r\n

\r\n

\r\n\t\"\" \"\" \r\n

\r\n

\r\n\t(2)Windows, macOS, iOS, TV 客户端下载 \r\n

\r\n

\r\n\t点击链接进入ORICO官网下载即可。(苹果用户也可直接AppStore搜索“赛博云空间”获取安装)。 \r\n

\r\n

\r\n\t
\r\n
\r\n

\r\n

\r\n\t\"\" \r\n

\r\n

\r\n\t
\r\n
\r\n

\r\n注:部分浏览器下载好的安装包会有告警提示,点击右边的“...”选择保留即可完成客户端安装
\r\n
\r\n

\r\n\t
\r\n

\r\n

\r\n\t\"\" \r\n

\r\n

\r\n\t \r\n

\r\n

\r\n\t
\r\n
\r\n

\r\n

\r\n\t \r\n

\r\n

\r\n\t3. 设备绑定与初始化设备 \r\n

\r\n

\r\n\t1)设备绑定 \r\n

\r\n

\r\n\t以下操作仅适用作为第一个绑定设备的管理员机主身份操作
\r\n
如果是别人分享的设备,请参阅教程如何将我的NAS设备分享给他人使用? \r\n

\r\n

\r\n\t① 发现新设备 \r\n

\r\n

\r\n\t运行PC客户端(名称:赛博云空间 ),会显示您还没有绑定设备,可点击绑定新设备进行绑定。 \r\n

\r\n

\r\n\t客户端会通过局域网扫描发现NAS设备。 \r\n

\r\n

\r\n\t\"\" \"\" \r\n

\r\n

\r\n\t②绑定成功 \r\n

\r\n

\r\n\t点击搜索到的NAS设备 ,即会提示“设备绑定成功”。注意:请确保电脑和NAS设备在同一局域网,才可发现到设备。\r\n

\r\n

\r\n\t\"\" \r\n

\r\n

\r\n\t \r\n

\r\n

\r\n\t
\r\n

\r\n

\r\n\t \r\n

\r\n

\r\n\t2)初始化设备/格式化硬盘 \r\n

\r\n

\r\n\t完成设备绑定后,会自动跳转到初始化设备入口。\r\n

\r\n

\r\n\t① 检测更新 \r\n

\r\n

\r\n\t完成设备绑定后,客户端会自行检测系统更新,若有更新需要下载安装后才可进行下一步的初始化设备操作。 \r\n

\r\n

\r\n\t\"\" \r\n

\r\n

\r\n\t
\r\n
\r\n

\r\n

\r\n\t② 初始化设备 \r\n

\r\n

\r\n\t安装完更新后进入到初始化系统池设置,点击初始化设备默认选择 简单模式 ,点击下一步”。 \r\n

\r\n

\r\n\t\"\" \r\n

\r\n

\r\n\t
\r\n
\r\n

\r\n

\r\n\t③ 设置阵列 \r\n

\r\n

\r\n\t勾选需加入系统池的磁盘(默认全勾选) , 根据需求选择需要的 磁盘阵列模式。点击下一步”。 \r\n

\r\n

\r\n\t\"\" \r\n

\r\n

\r\n\t④ 确认执行 \r\n

\r\n

\r\n\t最终确认初始化操作及风险,点击确认”执行初始化操作,等待完成即可。设备初始化成功后,会弹窗提示,引导用户完成账户注册使用。\r\n

\r\n

\r\n\t\"\"\r\n

\r\n

\r\n\t
\r\n

\r\n

\r\n\t \r\n

\r\n

\r\n\t4. 账户注册与登录 \r\n

\r\n

\r\n\t初次使用客户端,需先绑定设备才能注册账户\r\n

\r\n

\r\n\t1)开始注册 \r\n

\r\n

\r\n\t完成设备绑定之后,返回到客户端登录页面,点击注册”,即进入账户注册流程。 \r\n

\r\n

\r\n\t\"\" \r\n

\r\n

\r\n\t2)绑定手机号或邮箱 \r\n

\r\n

\r\n\t输入账户名和密码,绑定手机号或邮箱验证,便于忘记密码时找回密码和重置密码。 \r\n

\r\n

\r\n\t验证成功后,点击注册”, 注册成功会弹出提示。 \r\n

\r\n

\r\n\t\"\" \"\" \r\n

\r\n

\r\n\t \r\n

\r\n

\r\n\t3)账户登录 \r\n

\r\n

\r\n\t完成账户注册后,会自动返回到客户端登录页面。输入账户名和密码,点击登录”即可。 \r\n

\r\n

\r\n\t\"\" \r\n

" diff --git a/src/components/rulesForm/index.vue b/src/components/rulesForm/index.vue index 4757de6..04cbf46 100644 --- a/src/components/rulesForm/index.vue +++ b/src/components/rulesForm/index.vue @@ -178,7 +178,7 @@ @@ -189,6 +189,7 @@ import type { FormInstance, FormRules } from "element-plus"; import UploadVideo from "@/components/Upload/UploadVideo.vue"; import UploadImg from "@/components/Upload/UploadImg.vue"; +import Editor from "@/components/Editor/index.vue"; interface IProps { ruleForm: { [key: string]: any }; formData: any[]; diff --git a/src/main.ts b/src/main.ts index e038195..9763ab9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -33,8 +33,10 @@ import errorHandler from "@/utils/errorHandler"; import VXETable from "vxe-table"; import "vxe-table/lib/style.css"; +import mavonEditor from "mavon-editor"; +import "mavon-editor/dist/css/index.css"; const app = createApp(App); app.config.errorHandler = errorHandler; -app.use(directives).use(router).use(pinia).use(VXETable).mount("#app"); +app.use(directives).use(router).use(pinia).use(VXETable).use(mavonEditor).mount("#app"); diff --git a/src/utils/convertSpanToDiv.ts b/src/utils/convertSpanToDiv.ts new file mode 100644 index 0000000..226b3ff --- /dev/null +++ b/src/utils/convertSpanToDiv.ts @@ -0,0 +1,15 @@ +export const convertSpanToDiv = (html: any) => { + const parser = new DOMParser(); + const doc = parser.parseFromString(html, "text/html"); + const spans = doc.querySelectorAll("span"); + if (!spans.length) { + return; + } + spans.forEach((span: any) => { + if (span.querySelector("img")) { + const img = span.querySelector("img"); + span.parentNode.replaceChild(img, span); + } + }); + return doc.body.innerHTML; +}; diff --git a/src/utils/recursiveCompare.ts b/src/utils/recursiveCompare.ts new file mode 100644 index 0000000..c88b0f2 --- /dev/null +++ b/src/utils/recursiveCompare.ts @@ -0,0 +1,13 @@ +export const recursiveCompare = (item: any, targetId: any) => { + if (typeof item === "object" && item !== null) { + if (item.value !== undefined && item.value === targetId) { + return true; + } + for (const key in item) { + if (recursiveCompare(item[key], targetId)) { + return true; + } + } + } + return false; +}; diff --git a/src/views/QAManagement/list/edit.vue b/src/views/QAManagement/list/edit.vue index b215dfd..e6dd4cd 100644 --- a/src/views/QAManagement/list/edit.vue +++ b/src/views/QAManagement/list/edit.vue @@ -20,7 +20,7 @@
- +
@@ -32,7 +32,8 @@ import rulesForm from "@/components/rulesForm/index.vue"; import { getQAListDetailsApi, getQAListEditUpApi, getQAListSaveApi } from "@/api/modules/QAList"; import { ref, reactive } from "vue"; -import WangEditor from "@/components/WangEditor/index.vue"; +// import { convertSpanToDiv } from "@/utils/convertSpanToDiv"; +import Editor from "@/components/Editor/index.vue"; import { useMsg } from "@/hooks/useMsg"; import { EDIT_FORM_DATA, EDIT_RULE_FORM, RULES } from "./constant/index"; import { cloneDeep } from "lodash-es"; @@ -49,7 +50,6 @@ const formRef: any = ref(null); //详情 const getQAListDetails = async () => { let id = $route.query.id; - console.log(id, "=========id========"); if (!id) { return; } @@ -58,6 +58,8 @@ const getQAListDetails = async () => { const { data } = result; //这里是传给基本信息组件的表单数据 dataStore.editRuleForm = cloneDeep(data); + // dataStore.editRuleForm.answer = convertSpanToDiv(dataStore.editRuleForm.answer); + dataStore.value = data.answer; } }; diff --git a/src/views/articleManagement/class/index.vue b/src/views/articleManagement/class/index.vue index 106c69f..a56512b 100644 --- a/src/views/articleManagement/class/index.vue +++ b/src/views/articleManagement/class/index.vue @@ -27,6 +27,12 @@ {{ row.is_show === 1 ? "✔️" : "❌" }} + + + +