Browse Source

fix:完成会话功能;

dxj
李朋徽 1 year ago
parent
commit
c6a1fe536b
  1. 18
      .env.zxh
  2. 3
      package.json
  3. 582
      pnpm-lock.yaml
  4. 31
      src/api/base/message.ts
  5. 16
      src/assets/svg/delete.svg
  6. 13
      src/assets/svg/edit.svg
  7. 14
      src/assets/svg/toTop.svg
  8. 41
      src/components/AppMessage/index.vue
  9. 2
      src/components/AppModelSelect/index.vue
  10. 23
      src/components/AppSubMenuList/index.d.ts
  11. 127
      src/components/AppSubMenuList/index.vue
  12. 13
      src/design/index.scss
  13. 2
      src/design/mixins/config.scss
  14. 2
      src/hooks/useMqtt.ts
  15. 12
      src/store/moules/messageStore/index.d.ts
  16. 4
      src/store/moules/messageStore/index.ts
  17. 8
      src/store/moules/userStore/index.ts
  18. 4
      src/utils/mqtt.ts
  19. 178
      src/views/conversation/index.vue
  20. 1
      tsconfig.json
  21. 2
      vite.config.ts

18
.env.zxh

@ -0,0 +1,18 @@
# 朱新华
# 公共地址
VITE_GLOB_BASE_URL = "http://192.168.1.101:9872"
# 本地MQTT地址
VITE_GLOB_MQTT_HOST = "192.168.1.231"
VITE_GLOB_MQTT_PORT = 8083
VITE_GLOB_MQTT_PROTOCOL = "ws"
# 本地MQTT用户名
VITE_GLOB_MQTT_USERNAME = "serverAdmin"
# 本地MQTT密码
VITE_GLOB_MQTT_PASSWORD = "EnpfgI9yuSwi"
# 接口授权标识
VITE_GLOB_APP_AUTHORIZATION = "ZmFsY29uOmZhbGNvbl9zZWNyZXQ="

3
package.json

@ -10,6 +10,7 @@
"scripts": {
"dev": "vite --host --mode development",
"dev:prod": "vite --host --mode production",
"dev:zxh": "vite --host --mode zxh",
"build": "vue-tsc && vite build",
"preview": "vite preview",
"lint": "eslint .",
@ -22,6 +23,7 @@
"axios": "^1.6.5",
"crypto-js": "^4.2.0",
"lodash-es": "^4.17.21",
"md-editor-v3": "^4.11.0",
"mqtt": "^5.3.4",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
@ -36,6 +38,7 @@
"@types/node": "^20.11.0",
"@types/qs": "^6.9.11",
"@vitejs/plugin-vue": "^4.5.2",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"eslint": "^8.56.0",
"eslint-plugin-format": "^0.1.0",
"sass": "^1.69.7",

582
pnpm-lock.yaml

@ -23,6 +23,9 @@ dependencies:
lodash-es:
specifier: ^4.17.21
version: 4.17.21
md-editor-v3:
specifier: ^4.11.0
version: 4.11.0(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(vue@3.4.13)
mqtt:
specifier: ^5.3.4
version: 5.3.4
@ -61,6 +64,9 @@ devDependencies:
'@vitejs/plugin-vue':
specifier: ^4.5.2
version: 4.6.2(vite@5.0.11)(vue@3.4.13)
'@vitejs/plugin-vue-jsx':
specifier: ^3.1.0
version: 3.1.0(vite@5.0.11)(vue@3.4.13)
eslint:
specifier: ^8.56.0
version: 8.56.0
@ -536,6 +542,282 @@ packages:
'@babel/helper-validator-identifier': 7.22.20
to-fast-properties: 2.0.0
/@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1):
resolution: {integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==}
peerDependencies:
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
dependencies:
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
'@lezer/common': 1.2.1
dev: false
/@codemirror/commands@6.3.3:
resolution: {integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==}
dependencies:
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
'@lezer/common': 1.2.1
dev: false
/@codemirror/lang-angular@0.1.3:
resolution: {integrity: sha512-xgeWGJQQl1LyStvndWtruUvb4SnBZDAu/gvFH/ZU+c0W25tQR8e5hq7WTwiIY2dNxnf+49mRiGI/9yxIwB6f5w==}
dependencies:
'@codemirror/lang-html': 6.4.7
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.10.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@codemirror/lang-cpp@6.0.2:
resolution: {integrity: sha512-6oYEYUKHvrnacXxWxYa6t4puTlbN3dgV662BDfSH8+MfjQjVmP697/KYTDOqpxgerkvoNm7q5wlFMBeX8ZMocg==}
dependencies:
'@codemirror/language': 6.10.0
'@lezer/cpp': 1.1.2
dev: false
/@codemirror/lang-css@6.2.1(@codemirror/view@6.23.0):
resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/css': 1.1.7
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-html@6.4.7:
resolution: {integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.23.0)
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
'@lezer/common': 1.2.1
'@lezer/css': 1.1.7
'@lezer/html': 1.3.8
dev: false
/@codemirror/lang-java@6.0.1:
resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==}
dependencies:
'@codemirror/language': 6.10.0
'@lezer/java': 1.1.1
dev: false
/@codemirror/lang-javascript@6.2.1:
resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.0
'@codemirror/lint': 6.4.2
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
'@lezer/common': 1.2.1
'@lezer/javascript': 1.4.13
dev: false
/@codemirror/lang-json@6.0.1:
resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==}
dependencies:
'@codemirror/language': 6.10.0
'@lezer/json': 1.0.2
dev: false
/@codemirror/lang-less@6.0.2(@codemirror/view@6.23.0):
resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==}
dependencies:
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.23.0)
'@codemirror/language': 6.10.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-markdown@6.2.4:
resolution: {integrity: sha512-UghkA1vSMs8bT7RSZM6vsIocigyah2bV00eRQuZy76401UmFZdsTsbQNBGdyxRQDOLeEvF5iFwap0BM8LKyd+g==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/lang-html': 6.4.7
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
'@lezer/common': 1.2.1
'@lezer/markdown': 1.2.0
dev: false
/@codemirror/lang-php@6.0.1:
resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==}
dependencies:
'@codemirror/lang-html': 6.4.7
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/php': 1.0.2
dev: false
/@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1):
resolution: {integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.0
'@lezer/python': 1.1.11
transitivePeerDependencies:
- '@codemirror/state'
- '@codemirror/view'
- '@lezer/common'
dev: false
/@codemirror/lang-rust@6.0.1:
resolution: {integrity: sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ==}
dependencies:
'@codemirror/language': 6.10.0
'@lezer/rust': 1.0.2
dev: false
/@codemirror/lang-sass@6.0.2(@codemirror/view@6.23.0):
resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==}
dependencies:
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.23.0)
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/sass': 1.0.4
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-sql@6.5.5(@codemirror/view@6.23.0):
resolution: {integrity: sha512-DvOaP2RXLb2xlxJxxydTFfwyYw5YDqEFea6aAfgh9UH0kUD6J1KFZ0xPgPpw1eo/5s2w3L6uh5PVR7GM23GxkQ==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-vue@0.1.3:
resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==}
dependencies:
'@codemirror/lang-html': 6.4.7
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.10.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@codemirror/lang-wast@6.0.2:
resolution: {integrity: sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==}
dependencies:
'@codemirror/language': 6.10.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@codemirror/lang-xml@6.0.2(@codemirror/view@6.23.0):
resolution: {integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.0
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/xml': 1.0.4
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/language-data@6.3.1(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1):
resolution: {integrity: sha512-p6jhJmvhGe1TG1EGNhwH7nFWWFSTJ8NDKnB2fVx5g3t+PpO0+63R7GJNxjS0TmmH3cdMxZbzejsik+rlEh1EyQ==}
dependencies:
'@codemirror/lang-angular': 0.1.3
'@codemirror/lang-cpp': 6.0.2
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.23.0)
'@codemirror/lang-html': 6.4.7
'@codemirror/lang-java': 6.0.1
'@codemirror/lang-javascript': 6.2.1
'@codemirror/lang-json': 6.0.1
'@codemirror/lang-less': 6.0.2(@codemirror/view@6.23.0)
'@codemirror/lang-markdown': 6.2.4
'@codemirror/lang-php': 6.0.1
'@codemirror/lang-python': 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/lang-rust': 6.0.1
'@codemirror/lang-sass': 6.0.2(@codemirror/view@6.23.0)
'@codemirror/lang-sql': 6.5.5(@codemirror/view@6.23.0)
'@codemirror/lang-vue': 0.1.3
'@codemirror/lang-wast': 6.0.2
'@codemirror/lang-xml': 6.0.2(@codemirror/view@6.23.0)
'@codemirror/language': 6.10.0
'@codemirror/legacy-modes': 6.3.3
transitivePeerDependencies:
- '@codemirror/state'
- '@codemirror/view'
- '@lezer/common'
dev: false
/@codemirror/language@6.10.0:
resolution: {integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==}
dependencies:
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
style-mod: 4.1.0
dev: false
/@codemirror/legacy-modes@6.3.3:
resolution: {integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==}
dependencies:
'@codemirror/language': 6.10.0
dev: false
/@codemirror/lint@6.4.2:
resolution: {integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==}
dependencies:
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
crelt: 1.0.6
dev: false
/@codemirror/search@6.5.5:
resolution: {integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==}
dependencies:
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
crelt: 1.0.6
dev: false
/@codemirror/state@6.4.0:
resolution: {integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==}
dev: false
/@codemirror/view@6.23.0:
resolution: {integrity: sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==}
dependencies:
'@codemirror/state': 6.4.0
style-mod: 4.1.0
w3c-keyname: 2.2.8
dev: false
/@ctrl/tinycolor@3.6.1:
resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
engines: {node: '>=10'}
@ -892,6 +1174,117 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/@lezer/common@1.2.1:
resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==}
dev: false
/@lezer/cpp@1.1.2:
resolution: {integrity: sha512-macwKtyeUO0EW86r3xWQCzOV9/CF8imJLpJlPv3sDY57cPGeUZ8gXWOWNlJr52TVByMV3PayFQCA5SHEERDmVQ==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/css@1.1.7:
resolution: {integrity: sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/highlight@1.2.0:
resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==}
dependencies:
'@lezer/common': 1.2.1
dev: false
/@lezer/html@1.3.8:
resolution: {integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/java@1.1.1:
resolution: {integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/javascript@1.4.13:
resolution: {integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/json@1.0.2:
resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/lr@1.3.14:
resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==}
dependencies:
'@lezer/common': 1.2.1
dev: false
/@lezer/markdown@1.2.0:
resolution: {integrity: sha512-d7MwsfAukZJo1GpPrcPGa3MxaFFOqNp0gbqF+3F7pTeNDOgeJN1muXzx1XXDPt+Ac+/voCzsH7qXqnn+xReG/g==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
dev: false
/@lezer/php@1.0.2:
resolution: {integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/python@1.1.11:
resolution: {integrity: sha512-C3QeLCcdAKJDUOsYjfFP6a1wdn8jhUNX200bgFm8TpKH1eM2PlgYQS5ugw6E38qGeEx7CP21I1Q52SoybXt0OQ==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/rust@1.0.2:
resolution: {integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/sass@1.0.4:
resolution: {integrity: sha512-AqW4myvp73sbMk6y0+gJrMjN5xtqFZzqTftzO3YcO8gSL5d3pymIP3deQllAI8+s1ZoSzH6kD4hsoFLpkD9Kfg==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/xml@1.0.4:
resolution: {integrity: sha512-WmXKb5eX8+rRfZYSNRR5TPee/ZoDgBdVS/rj1VCJGDKa5gNldIctQYibCoFVyNhvZsyL/8nHbZJZPM4gnXN2Vw==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@ -1130,6 +1523,10 @@ packages:
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
dev: true
/@types/linkify-it@3.0.5:
resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==}
dev: false
/@types/lodash-es@4.17.12:
resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
dependencies:
@ -1140,12 +1537,23 @@ packages:
resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==}
dev: true
/@types/markdown-it@12.2.3:
resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==}
dependencies:
'@types/linkify-it': 3.0.5
'@types/mdurl': 1.0.5
dev: false
/@types/mdast@3.0.15:
resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
dependencies:
'@types/unist': 2.0.10
dev: true
/@types/mdurl@1.0.5:
resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==}
dev: false
/@types/node@20.11.0:
resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==}
dependencies:
@ -1540,6 +1948,26 @@ packages:
- rollup
dev: true
/@vavt/util@1.4.1:
resolution: {integrity: sha512-EhYyvt5w+GE6IO1JzDFZLmJOXQmWHnx3OBvA3YY/ZB1kWqHlhJTpL4x7TuANTzK7q1Y6G/okk4eFpLVWxvEBVA==}
dev: false
/@vitejs/plugin-vue-jsx@3.1.0(vite@5.0.11)(vue@3.4.13):
resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
vite: ^4.0.0 || ^5.0.0
vue: ^3.0.0
dependencies:
'@babel/core': 7.23.7
'@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.7)
'@vue/babel-plugin-jsx': 1.1.6(@babel/core@7.23.7)
vite: 5.0.11(@types/node@20.11.0)(sass@1.69.7)
vue: 3.4.13(typescript@5.3.3)
transitivePeerDependencies:
- supports-color
dev: true
/@vitejs/plugin-vue@4.6.2(vite@5.0.11)(vue@3.4.13):
resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==}
engines: {node: ^14.18.0 || >=16.0.0}
@ -1570,6 +1998,32 @@ packages:
path-browserify: 1.0.1
dev: true
/@vue/babel-helper-vue-transform-on@1.1.6:
resolution: {integrity: sha512-XxM2tZHjYHTd9yiKHHt7fKCN0e2BK2z78UxU5rpjH3YCstEV/tcrW29CaOdrxIdeD0c/9mHHebvXWwDxlphjKA==}
dev: true
/@vue/babel-plugin-jsx@1.1.6(@babel/core@7.23.7):
resolution: {integrity: sha512-s2pK8Wwg0LiR25lyCKWGJePt8aXF0DsXOmTHYJnlKNdT3yTKfdvkKmsWjaHBctFvwWmetedObrAoINc9BeYZlA==}
peerDependencies:
'@babel/core': ^7.0.0-0
peerDependenciesMeta:
'@babel/core':
optional: true
dependencies:
'@babel/core': 7.23.7
'@babel/helper-module-imports': 7.22.15
'@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7)
'@babel/template': 7.22.15
'@babel/traverse': 7.23.7
'@babel/types': 7.23.6
'@vue/babel-helper-vue-transform-on': 1.1.6
camelcase: 6.3.0
html-tags: 3.3.1
svg-tags: 1.0.0
transitivePeerDependencies:
- supports-color
dev: true
/@vue/compiler-core@3.4.13:
resolution: {integrity: sha512-zGUdmB3j3Irn9z51GXLJ5s0EAHxmsm5/eXl0y6MBaajMeOAaiT4+zaDoxui4Ets98dwIRr8BBaqXXHtHSfm+KA==}
dependencies:
@ -1788,7 +2242,6 @@ packages:
/argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true
/arr-diff@4.0.0:
resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
@ -1996,6 +2449,11 @@ packages:
engines: {node: '>=6'}
dev: true
/camelcase@6.3.0:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
dev: true
/caniuse-lite@1.0.30001576:
resolution: {integrity: sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==}
dev: true
@ -2091,6 +2549,20 @@ packages:
engines: {node: '>=0.8'}
dev: true
/codemirror@6.0.1(@lezer/common@1.2.1):
resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@codemirror/commands': 6.3.3
'@codemirror/language': 6.10.0
'@codemirror/lint': 6.4.2
'@codemirror/search': 6.5.5
'@codemirror/state': 6.4.0
'@codemirror/view': 6.23.0
transitivePeerDependencies:
- '@lezer/common'
dev: false
/collection-visit@1.0.0:
resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
engines: {node: '>=0.10.0'}
@ -2185,6 +2657,12 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/copy-to-clipboard@3.3.3:
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
dependencies:
toggle-selection: 1.0.6
dev: false
/core-js-compat@3.35.0:
resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==}
dependencies:
@ -2204,6 +2682,10 @@ packages:
vary: 1.1.2
dev: true
/crelt@1.0.6:
resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
dev: false
/cross-spawn@7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'}
@ -2456,6 +2938,11 @@ packages:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
dev: true
/entities@3.0.1:
resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
engines: {node: '>=0.12'}
dev: false
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
@ -3429,6 +3916,11 @@ packages:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
dev: true
/html-tags@3.3.1:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'}
dev: true
/htmlparser2@3.10.1:
resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
dependencies:
@ -3818,6 +4310,12 @@ packages:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
dev: true
/linkify-it@4.0.1:
resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==}
dependencies:
uc.micro: 1.0.6
dev: false
/loader-utils@1.4.2:
resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
engines: {node: '>=4.0.0'}
@ -3890,6 +4388,11 @@ packages:
yallist: 4.0.0
dev: true
/lru-cache@8.0.5:
resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==}
engines: {node: '>=16.14'}
dev: false
/magic-string@0.30.5:
resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
engines: {node: '>=12'}
@ -3908,6 +4411,54 @@ packages:
object-visit: 1.0.1
dev: true
/markdown-it-image-figures@2.1.1(markdown-it@13.0.2):
resolution: {integrity: sha512-mwXSQ2nPeVUzCMIE3HlLvjRioopiqyJLNph0pyx38yf9mpqFDhNGnMpAXF9/A2Xv0oiF2cVyg9xwfF0HNAz05g==}
engines: {node: '>=12.0.0'}
peerDependencies:
markdown-it: '*'
dependencies:
markdown-it: 13.0.2
dev: false
/markdown-it-task-lists@2.1.1:
resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==}
dev: false
/markdown-it@13.0.2:
resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==}
hasBin: true
dependencies:
argparse: 2.0.1
entities: 3.0.1
linkify-it: 4.0.1
mdurl: 1.0.1
uc.micro: 1.0.6
dev: false
/md-editor-v3@4.11.0(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(vue@3.4.13):
resolution: {integrity: sha512-xSzmhqyHfx6r8AzI8/ioll/YScAVNHjc3Hob4qv7cyxigJDuDmk7aBWk3+uA8SzA7z6p6v+4cyvxHexVwPbWZw==}
peerDependencies:
vue: ^3.2.47
dependencies:
'@codemirror/lang-markdown': 6.2.4
'@codemirror/language-data': 6.3.1(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)
'@types/markdown-it': 12.2.3
'@vavt/util': 1.4.1
codemirror: 6.0.1(@lezer/common@1.2.1)
copy-to-clipboard: 3.3.3
lru-cache: 8.0.5
markdown-it: 13.0.2
markdown-it-image-figures: 2.1.1(markdown-it@13.0.2)
markdown-it-task-lists: 2.1.1
medium-zoom: 1.1.0
punycode: 2.3.1
vue: 3.4.13(typescript@5.3.3)
transitivePeerDependencies:
- '@codemirror/state'
- '@codemirror/view'
- '@lezer/common'
dev: false
/mdast-util-from-markdown@0.8.5:
resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==}
dependencies:
@ -3932,6 +4483,14 @@ packages:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
dev: true
/mdurl@1.0.1:
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
dev: false
/medium-zoom@1.1.0:
resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==}
dev: false
/merge-options@1.0.1:
resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
engines: {node: '>=4'}
@ -4547,7 +5106,6 @@ packages:
/punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
dev: true
/qs@6.11.2:
resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==}
@ -5023,6 +5581,10 @@ packages:
engines: {node: '>=8'}
dev: true
/style-mod@4.1.0:
resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==}
dev: false
/stylis@4.3.1:
resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==}
dev: false
@ -5078,6 +5640,10 @@ packages:
- supports-color
dev: true
/svg-tags@1.0.0:
resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
dev: true
/svgo@2.8.0:
resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
engines: {node: '>=10.13.0'}
@ -5145,6 +5711,10 @@ packages:
safe-regex: 1.1.0
dev: true
/toggle-selection@1.0.6:
resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
dev: false
/toml-eslint-parser@0.9.3:
resolution: {integrity: sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -5205,6 +5775,10 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
/uc.micro@1.0.6:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
dev: false
/ufo@1.3.2:
resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}
dev: true
@ -5472,6 +6046,10 @@ packages:
'@vue/shared': 3.4.13
typescript: 5.3.3
/w3c-keyname@2.2.8:
resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
dev: false
/warning@4.0.3:
resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
dependencies:

31
src/api/base/message.ts

@ -1,5 +1,36 @@
import { defHttp } from '@/utils/axios/index'
/**
* @description
*/
export async function addMessage(data: {
title: string
}) {
return defHttp.post({
url: `/open-chat/chat/conversation/save`,
data,
})
}
/**
* @description
*/
export async function updateMessage(data: any) {
return defHttp.post({
url: `/open-chat/chat/conversation/update`,
data,
})
}
/**
* @description id删除会话
*/
export async function removeMessage(ids: string) {
return defHttp.post({
url: `/open-chat/chat/conversation/remove?ids=${ids}`,
})
}
/**
* @description
*/

16
src/assets/svg/delete.svg

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>编组 5</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="充值" transform="translate(-346.000000, -317.000000)">
<g id="编组-6" transform="translate(270.000000, 292.000000)">
<g id="编组-5" transform="translate(76.000000, 25.000000)">
<rect id="矩形" x="0" y="0" width="14" height="14"></rect>
<g id="shanchu" transform="translate(1.272727, 0.000000)" fill="#A6AEBA" fill-rule="nonzero">
<path d="M10.5500327,1.45770065 L7.23413996,1.45770065 C7.23413996,0.652928416 6.55918901,0 5.72727273,0 C4.89535644,0 4.22040549,0.652928416 4.22040549,1.45770065 L0.904512753,1.45770065 C0.404185742,1.45770065 0,1.84869848 0,2.33270065 C0,2.81670282 0.404185742,3.20770065 0.904512753,3.20770065 L1.42838457,12.6201193 C1.4735121,13.3926247 2.13472858,14 2.9352518,14 L8.51929366,14 C9.32177894,14 9.98103336,13.3926247 10.0261609,12.6201193 L10.5500327,3.20770065 C11.0503597,3.20770065 11.4545455,2.81670282 11.4545455,2.33270065 C11.4545455,1.84869848 11.0503597,1.45770065 10.5500327,1.45770065 L10.5500327,1.45770065 Z M4.82079791,11.0827007 C4.82079791,11.4034707 4.5500327,11.6654013 4.21844343,11.6654013 C3.88685415,11.6654013 3.61608895,11.4034707 3.61608895,11.0827007 L3.61608895,5.25 C3.61608895,4.92922993 3.88685415,4.66729935 4.21844343,4.66729935 C4.5500327,4.66729935 4.82079791,4.92922993 4.82079791,5.25 L4.82079791,11.0827007 Z M7.83649444,11.0827007 C7.83649444,11.4034707 7.56572923,11.6654013 7.23413996,11.6654013 C6.90255069,11.6654013 6.63178548,11.4034707 6.63178548,11.0827007 L6.63178548,5.25 C6.63178548,4.92922993 6.90255069,4.66729935 7.23413996,4.66729935 C7.56572923,4.66729935 7.83649444,4.92922993 7.83649444,5.25 L7.83649444,11.0827007 Z" id="形状"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

13
src/assets/svg/edit.svg

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>bianjisekuai</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="充值" transform="translate(-316.000000, -317.000000)" fill="#A6AEBA" fill-rule="nonzero">
<g id="编组-6" transform="translate(270.000000, 292.000000)">
<g id="bianjisekuai" transform="translate(46.000000, 25.000000)">
<path d="M10.6493244,5.04183023 L8.21820066,2.31991314 L1.01455554,8.99785827 L0.413541662,11.96589 L3.39856057,11.7632371 L10.6493244,5.04183023 Z M13.0634051,2.47051308 L11.0082284,0.086687808 L11.003717,0.0816341186 C10.9101033,-0.0209865837 10.7517367,-0.0277711702 10.6498256,0.0664730505 L8.59515015,1.9707032 L11.0257726,4.6926203 L13.0438559,2.82174449 C13.1439239,2.72945887 13.1526041,2.57350644 13.0634051,2.47051308 L13.0634051,2.47051308 Z M0,12.9892621 L13.0328281,12.9892621 L13.0328281,14 L0,14 L0,12.9892621 Z" id="形状"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

14
src/assets/svg/toTop.svg

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="13px" height="14px" viewBox="0 0 13 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>zhiding</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="充值" transform="translate(-288.000000, -317.000000)" fill="#A6AEBA" fill-rule="nonzero">
<g id="编组-6" transform="translate(270.000000, 292.000000)">
<g id="zhiding" transform="translate(18.000000, 25.000000)">
<path d="M6.79183094,1.55441855 C6.54600563,1.18602073 6.01214833,1.17756507 5.74959244,1.53731505 L0.122987436,8.71501906 C-0.182155359,9.14318304 0.114432031,9.74295852 0.639924047,9.74295852 L3.28373446,9.74295852 L3.28373446,13.0748737 C3.28373446,13.5802917 3.6904014,14 4.19897272,14 L8.02057729,14 C8.52040309,14 8.93562544,13.5889395 8.93562544,13.0748737 L8.93562544,9.74295852 L11.6049119,9.74295852 C12.1218486,9.74295852 12.4269914,9.16047871 12.1387692,8.73212256 L6.79183094,1.55441855 Z" id="路径"></path>
<path d="M0.718012595,1.27272727 L11.5317979,1.27272727 C11.9289036,1.27272727 12.25,0.988144379 12.25,0.636363636 C12.25,0.284582893 11.9289036,0 11.5317979,0 L0.718012595,0 C0.320906896,0 0,0.284582893 0,0.636363636 C0,0.988144379 0.321096446,1.27272727 0.718012595,1.27272727 Z" id="路径"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

41
src/components/AppMessage/index.vue

@ -1,13 +1,18 @@
<script setup lang="ts">
import { nextTick, onMounted, ref, watch } from 'vue'
import { MdPreview } from 'md-editor-v3'
import 'md-editor-v3/lib/style.css'
import type { MessageItem } from './index.d'
import { SvgIcon } from '@/components/SvgIcon'
import { MessageStatusEnum, MessageTypeEnum } from '@/enums/messageEnum'
import { copyText } from '@/utils/copyTextToClipboard'
const props = defineProps<{
list: MessageItem[]
}>()
const props = defineProps({
list: {
type: Array as PropType<MessageItem[]>,
default: () => [],
},
})
const emit = defineEmits(['onScrollTop', 'reloadMessage'])
@ -16,12 +21,12 @@ defineExpose({ getScrollTopDistance, seamlessScrollToTop })
const messageRef = ref<Element | null>(null)
const elHeight = ref(0) //
const defaultScrollTop = ref(0) //
const isStop = ref(false) //
const isAutoScroll = ref(true) //
watch(
() => props.list[props.list.length - 1],
() => {
isStop.value && scrollToBottom()
isAutoScroll.value && scrollToBottom()
},
{ immediate: true },
)
@ -46,12 +51,12 @@ function onScroll() {
return
}
// 20px
// - > 20px
if (messageRef.value.scrollTop - defaultScrollTop.value > 20) {
isStop.value = true
isAutoScroll.value = true
}
else {
isStop.value = false
isAutoScroll.value = false
}
emit('onScrollTop', messageRef.value.scrollTop)
}
@ -109,7 +114,7 @@ onMounted(async () => {
<div v-if="item.messageType === MessageTypeEnum.AI" class="ai">
<img class="icon-ai" src="@/assets/images/conversation/logo.png" alt="">
<div class="content">
{{ item.content }}
<MdPreview editor-id="preview-only-ai" :model-value="item.content" />
</div>
<div v-if="item.messageStatus === MessageStatusEnum.ERROR" class="error">
哎呀出问题了...
@ -141,9 +146,15 @@ onMounted(async () => {
height: calc(100% - 120px);
overflow: auto;
box-sizing: border-box;
:deep(.md-editor-preview) {
font-size: 14px;
}
:deep(.md-editor-preview-wrapper) {
padding: 0;
}
.item {
padding: 0 15px;
margin-top: 15px;
margin-top: 20px;
.user,
.ai {
display: flex;
@ -152,10 +163,9 @@ onMounted(async () => {
justify-content: flex-end;
.content {
max-width: calc(100% - 110px);
color: #ffffff;
padding: 10px 15px;
background: linear-gradient(131deg, #009bfc 0%, #00eadb 100%);
border-radius: 15px 15px 0px 15px;
background: #edf3ff;
border-radius: 10px;
}
.icon-user {
width: 40px;
@ -180,8 +190,9 @@ onMounted(async () => {
width: calc(100% - 110px);
padding: 10px 15px;
background: #ffffff;
border-radius: 0px 15px 15px 15px;
border: 1px solid #e7edef;
box-shadow: 0px 2px 10px 0px rgba(128, 135, 152, 0.4);
border-radius: 10px;
border: 1px solid #e3ebfc;
}
.error {
color: red;

2
src/components/AppModelSelect/index.vue

@ -53,7 +53,7 @@ function handelChange(index: number, item: ModelSelect) {
border-radius: 20px;
cursor: pointer;
position: absolute;
top: 30px;
top: 0px;
left: calc(50% - 100px);
.icon {
width: 24px;

23
src/components/AppSubMenuList/index.d.ts vendored

@ -1,14 +1,11 @@
export interface SubMenuItem {
createDept: string
createTime: string
createUser: string
id: string
isDeleted: number
roleId: number
status: number
title: string
updateTime: string
updateUser: string
userId: string
content: string
import type { ConversationData } from '@/store/moules/messageStore/index.d'
export interface SubMenuItem extends ConversationData {}
export enum SubMenuActionEnum {
// not表示没有状态
NOT = 'not',
TO_TOP = 'toTop',
EDIT = 'edit',
DELETE = 'delete',
}

127
src/components/AppSubMenuList/index.vue

@ -1,16 +1,44 @@
<!-- 子菜单列表组件 -->
<script setup lang="ts">
import { computed, nextTick, ref, watch } from 'vue'
import { Input } from 'ant-design-vue'
import { CheckOutlined, CloseOutlined } from '@ant-design/icons-vue'
import type { SubMenuItem } from './index.d'
import { SubMenuActionEnum } from './index.d'
import { SvgIcon } from '@/components/SvgIcon'
defineProps<{
const props = defineProps<{
list: SubMenuItem[]
activeIndex: number
activeIndex: number //
actionIndex: number // (input)
inputValue?: string
}>()
const emit = defineEmits(['change'])
const emit = defineEmits(['change', 'handleAction', 'inputAffirm', 'inputClose', 'inputBlur', 'update:inputValue'])
function handleClick(index: number, item: SubMenuItem) {
emit('change', index, item)
const inputValue = computed({
get: () => props.inputValue,
set: value => emit('update:inputValue', value),
})
const inputRef = ref()
const inputActionTag = ref(false) // input
// focus
watch(() => props.actionIndex, (val: number) => {
if (val !== -1) {
nextTick(() => {
inputRef.value && inputRef.value.focus()
})
}
})
function handleBlur(index: number, item: SubMenuItem, inputValue?: string) {
// 100affirm
setTimeout(() => {
!inputActionTag.value && emit('inputBlur', index, item, inputValue)
}, 100)
}
</script>
@ -19,27 +47,73 @@ function handleClick(index: number, item: SubMenuItem) {
<div
v-for="(item, index) in list"
:key="item.id"
class="app-sub-menu-list-item"
:class="[activeIndex === index && 'app-sub-menu-list-item-active']"
@click="handleClick(index, item)"
>
<p class="title">
{{ item.title }}
</p>
<p class="content truncate">
{{ item.content }}
</p>
<div
v-if="item.actionType === SubMenuActionEnum.EDIT"
class="app-sub-menu-list-item-input flex items-center"
>
<Input
:ref="(el) => el && (inputRef = el)"
v-model:value="inputValue"
@blur="handleBlur(index, item, inputValue)"
@input="$emit('update:inputValue', $event.target.value)"
@press-enter="$emit('inputAffirm', index, item, inputValue)"
>
<template #suffix>
<CheckOutlined @click="() => { inputActionTag = true; $emit('inputAffirm', index, item, inputValue) }" />
<CloseOutlined @click="() => { inputActionTag = true; $emit('inputClose', index, item) }" />
</template>
</Input>
</div>
<div
v-else
class="app-sub-menu-list-item"
:class="[activeIndex === index && 'app-sub-menu-list-item-active']"
@click="$emit('change', index, item)"
>
<p class="title">
{{ item.title }}
</p>
<p class="content truncate">
{{ item.content }}
</p>
<div class="actions absolute">
<SvgIcon
class-name="icon"
name="toTop"
@click.stop="$emit('handleAction', SubMenuActionEnum.TO_TOP, item, index)"
>
</SvgIcon>
<SvgIcon
class-name="icon"
name="edit"
@click.stop="$emit('handleAction', SubMenuActionEnum.EDIT, item, index)"
>
</SvgIcon>
<SvgIcon
class-name="icon"
name="delete"
@click.stop="$emit('handleAction', SubMenuActionEnum.DELETE, item, index)"
>
</SvgIcon>
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
@include app('sub-menu-list') {
height: calc(100% - 280px);
overflow-y: auto;
&-item-input {
padding: 5px;
}
&-item {
padding: 10px 10px 10px 20px;
border-radius: 10px 0 0 10px;
transition: all 0.2s;
cursor: pointer;
position: relative;
.title {
font-weight: bold;
font-size: 14px;
@ -50,12 +124,35 @@ function handleClick(index: number, item: SubMenuItem) {
margin: 0;
font-size: 12px;
}
.actions {
top: calc(50% - 12px);
right: 10px;
padding: 0 5px;
background-color: #e1e9f9;
box-shadow: 0 0 5px #e1e9f9;
display: none;
.icon {
width: 25px;
height: 25px;
padding: 6px;
border-radius: 3px;
}
.icon + .icon {
margin-left: 4px;
}
.icon:hover {
background-color: #d5e1f8;
}
}
}
&-item-active {
background: #e1e9f9;
}
&-item:hover {
background: #e1e9f9;
.actions {
display: block;
}
}
}
</style>

13
src/design/index.scss

@ -64,6 +64,19 @@ html[data-theme="dark"] {
width: 100%;
}
.app-content-spin {
width: 100%;
height: 100%;
.ant-spin-container {
width: 100%;
height: 100%;
position: relative;
&::after {
background: #eeeeee;
}
}
}
// 保持 windi 一样的全局样式减少升级带来的影响
ul {
padding: 0;

2
src/design/mixins/config.scss

@ -1,3 +1,3 @@
$namespace: "app";
$menu-width: 80px;
$sub-menu-width: 180px;
$sub-menu-width: 240px;

2
src/hooks/useMqtt.ts

@ -86,7 +86,7 @@ export function useMqtt() {
* @description:
*/
const end = () => {
console.log('123123123123')
console.log('关闭连接')
mqttService.end()
}

12
src/store/moules/messageStore/index.d.ts vendored

@ -1,9 +1,21 @@
import type { MessageStatusEnum } from '@/enums/messageEnum'
import type { MessageItem } from '@/components/AppMessage/index.d'
import type { SubMenuActionEnum } from '@/components/AppSubMenuList/index.d'
export interface ConversationData {
createDept: string
createTime: string
createUser: string
id: string
isDeleted: number
roleId: number
status: number
title: string
updateTime: string
updateUser: string
userId: string
content: string
actionType: SubMenuActionEnum
}
export interface MessageStoreType {

4
src/store/moules/messageStore/index.ts

@ -47,6 +47,10 @@ export const useMessageStore = defineStore('useMessageStore', {
this.messageList[this.messageList.length - 1] = item
},
setMessageClear() {
this.messageList = []
},
setTopicKey(key: string) {
this.topicKey = key
},

8
src/store/moules/userStore/index.ts

@ -63,10 +63,10 @@ export const useUserStore = defineStore('useUserStore', {
* @description: logout
*/
async logout(goLogin = false) {
this.$reset()
localStorage.clear()
// 清空数据
goLogin && router.push(PageEnum.BASE_LOGIN)
// this.$reset()
// localStorage.clear()
// // 清空数据
// goLogin && router.push(PageEnum.BASE_LOGIN)
},
},
persist: [

4
src/utils/mqtt.ts

@ -26,6 +26,8 @@ export class MqttService {
const connectUrl = `${protocol}://${host}:${port}/mqtt`
this.client = mqtt.connect(connectUrl, this.options)
this.client.on('connect', () => {
console.log('连接成功')
resolve(true)
})
this.client.on('error', (error: any) => {
@ -61,6 +63,8 @@ export class MqttService {
'message',
(receivedTopic: string, message: { toString: () => any }) => {
if (receivedTopic === topic) {
console.log(JSON.parse(message.toString()))
callback(JSON.parse(message.toString()))
}
},

178
src/views/conversation/index.vue

@ -1,25 +1,32 @@
<script setup lang="ts">
import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
import { onBeforeRouteLeave } from 'vue-router'
import { Button, message } from 'ant-design-vue'
import { Button, Spin, message } from 'ant-design-vue'
import { AppContainerBox } from '@/components/AppContainerBox'
import { AppSubMenuTitle } from '@/components/AppSubMenuTitle'
import { AppSubMenuList } from '@/components/AppSubMenuList'
import { AppConversationDefault } from '@/components/AppConversationDefault'
import { SubMenuActionEnum } from '@/components/AppSubMenuList/index.d'
import type { SubMenuItem } from '@/components/AppSubMenuList/index.d'
import { AppTextarea } from '@/components/AppTextarea'
import { AppMessage } from '@/components/AppMessage'
import type { MessageItem } from '@/components/AppMessage/index.d'
import { useMessageStore } from '@/store/moules/messageStore/index'
import { MessageStatusEnum, MessageTypeEnum } from '@/enums/messageEnum'
import { conversationList, historyMessage } from '@/api/base/message'
import { addMessage, conversationList, historyMessage, removeMessage, updateMessage } from '@/api/base/message'
import { useMqtt } from '@/hooks/useMqtt'
import { useMessage } from '@/hooks/useMessage'
const { createConfirm } = useMessage()
const messageStore = useMessageStore()
const sendBtnLoading = ref(false)
const subMenuActive = ref(0)
const subMenuActiveIndex = ref(0) //
const subMenuActionIndex = ref(-1) //
const subMenuList = ref<SubMenuItem[]>([])
const subMenuInputValue = ref<string>('')
const appMessage = ref()
const messageList = computed(() => messageStore.getMessageList)
const messageStatus = computed(() => messageStore.getMessageStatus)
@ -31,7 +38,9 @@ const historyMessageParams = ref({
total: 0,
})
const conversationDefaultShow = ref(true)
const conversationDefaultShow = ref(false)
const appMessageShow = ref(true)
const spinning = ref(true)
watch(
() => messageStatus.value,
@ -42,24 +51,82 @@ watch(
},
)
function handleSubMenuChange(index: number) {
/**
* @description: 点击会话操作项
*/
function handlesubMenuActionIndex(type: SubMenuActionEnum, item: SubMenuItem, index: number) {
subMenuActionIndex.value = index
if (type === SubMenuActionEnum.EDIT) {
subMenuList.value.forEach((item) => {
item.actionType = SubMenuActionEnum.NOT
})
subMenuList.value[index].actionType = SubMenuActionEnum.EDIT
subMenuInputValue.value = item.title
}
if (type === SubMenuActionEnum.DELETE) {
createConfirm({
title: '删除',
content: `确定要删除${item.title}会话吗?`,
iconType: 'warning',
onOk: () => {
removeMessage(item.id).then(() => {
message.success('删除成功')
getConversationList()
})
},
})
}
}
/**
* @description: 切换会话
*/
async function handleSubMenuChange(index: number) {
if (messageStatus.value !== MessageStatusEnum.END) {
message.warn('请先结束对话')
return
}
subMenuActive.value = index
subMenuActiveIndex.value = index
historyMessageParams.value.current = 1
historyMessageParams.value.total = 0
messageStore.setConversationData(subMenuList.value[subMenuActiveIndex.value])
messageStore.setMessageClear()
useMqtt().end()
useMqtt().connect()
getHistoryMessage()
//
appMessageShow.value = false
setTimeout(() => {
appMessageShow.value = true
}, 0)
}
/**
* @description: 发送消息
*/
function handleSend(value: string) {
async function handleSend(value: string) {
sendBtnLoading.value = true
conversationDefaultShow.value = false
if (!messageStore.getConversationData) {
if (!conversationData.value) {
return
}
useMqtt().sendMessage(messageStore.getConversationData.roleId, messageStore.getConversationData.id, value)
if (subMenuActiveIndex.value === -1) {
try {
await addMessage({ title: '新的对话' })
await getConversationList()
await nextTick()
useMqtt().sendMessage(conversationData.value.roleId, conversationData.value.id, value)
}
catch (error) {
message.error('新建对话失败,请稍后重试!')
}
}
else {
useMqtt().sendMessage(conversationData.value.roleId, conversationData.value.id, value)
}
}
/**
@ -67,14 +134,13 @@ function handleSend(value: string) {
*/
async function getConversationList() {
const res = await conversationList()
res.forEach((item: SubMenuItem) => {
item.actionType = SubMenuActionEnum.NOT
})
subMenuList.value = res
subMenuActive.value = 0
subMenuActiveIndex.value = 0
if (subMenuList.value.length) {
messageStore.setConversationData(subMenuList.value[subMenuActive.value])
historyMessageParams.value.current = 1
getHistoryMessage()
await useMqtt().connect()
await handleSubMenuChange(0)
}
}
@ -85,8 +151,10 @@ async function getHistoryMessage() {
if (!conversationData.value) {
return
}
spinning.value = true
historyMessageParams.value.conversationId = conversationData.value.id
const res = await historyMessage(historyMessageParams.value)
spinning.value = false
if (!res || !res.records || !res.records.length) {
return
}
@ -130,11 +198,35 @@ async function onScrollTop(scrollTop: number) {
* @description: 重新回答
*/
function reloadMessage() {
if (!messageStore.getConversationData) {
if (!conversationData.value) {
return
}
const question = messageList.value[messageList.value.length - 2]?.content
useMqtt().sendMessage(messageStore.getConversationData.roleId, messageStore.getConversationData.id, question)
useMqtt().sendMessage(conversationData.value.roleId, conversationData.value.id, question)
}
/**
* @description: 点击新建会话按钮
*/
function handleAddMessage() {
conversationDefaultShow.value = true
subMenuActiveIndex.value = -1
}
//
function handleSubMenuInputAffirm(index: number, item: SubMenuItem, inputValue: string) {
updateMessage({ ...item, title: inputValue }).then(() => {
message.success('修改成功')
subMenuList.value[index].title = inputValue
subMenuList.value[index].actionType = SubMenuActionEnum.NOT
})
}
function handleSubMenuInputClose(index: number) {
subMenuList.value[index].actionType = SubMenuActionEnum.NOT
}
function handleSubMenuInputBlur(index: number, item: SubMenuItem, inputValue: string) {
subMenuActionIndex.value = -1
handleSubMenuInputAffirm(index, item, inputValue)
}
onMounted(() => {
@ -162,37 +254,45 @@ onBeforeRouteLeave(() => {
<!-- 按钮 -->
<div class="px-5 mb-5">
<Button type="primary" class="w-full">
<Button type="primary" class="w-full" @click="handleAddMessage">
新建会话
</Button>
</div>
<!-- 会话列表 -->
<AppSubMenuList
v-model:input-value="subMenuInputValue"
:list="subMenuList"
:active-index="subMenuActive"
:active-index="subMenuActiveIndex"
:action-index="subMenuActionIndex"
@change="handleSubMenuChange"
@handle-action="handlesubMenuActionIndex"
@input-affirm="handleSubMenuInputAffirm"
@input-close="handleSubMenuInputClose"
@input-blur="handleSubMenuInputBlur"
>
</AppSubMenuList>
</template>
<template #content>
<!-- 默认导语 -->
<AppConversationDefault
v-if="conversationDefaultShow"
height="calc(100% - 120px)"
>
</AppConversationDefault>
<!-- 消息列表 -->
<AppMessage
v-else
ref="appMessage"
class="pl-27 pr-5"
:list="messageList"
@on-scroll-top="onScrollTop"
@reload-message="reloadMessage"
>
</AppMessage>
<Spin :spinning="spinning" wrapper-class-name="app-content-spin">
<!-- 默认导语 -->
<AppConversationDefault
v-if="conversationDefaultShow"
height="calc(100% - 120px)"
>
</AppConversationDefault>
<!-- 消息列表 -->
<AppMessage
v-if="!conversationDefaultShow && appMessageShow"
ref="appMessage"
class="pl-27 pr-5"
:list="messageList"
@on-scroll-top="onScrollTop"
@reload-message="reloadMessage"
>
</AppMessage>
</Spin>
<!-- 发送框 -->
<AppTextarea
@ -204,4 +304,6 @@ onBeforeRouteLeave(() => {
</AppContainerBox>
</template>
<style scoped></style>
<style lang="scss" scoped>
</style>

1
tsconfig.json

@ -16,6 +16,7 @@
"resolveJsonModule": true,
"types": ["vite/client"],
"allowImportingTsExtensions": true,
"allowJs": true,
"strict": true,
"noFallthroughCasesInSwitch": true,

2
vite.config.ts

@ -1,5 +1,6 @@
import { join, resolve } from 'node:path'
import { defineConfig } from 'vite'
import vueJsx from '@vitejs/plugin-vue-jsx'
import vue from '@vitejs/plugin-vue'
import UnoCSS from 'unocss/vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
@ -8,6 +9,7 @@ import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
export default defineConfig({
plugins: [
vue(),
vueJsx(),
UnoCSS(),
createSvgIconsPlugin({
// eslint-disable-next-line node/prefer-global/process

Loading…
Cancel
Save