From 36d92d85cad4744345cc372c46e4c0f9decc15b4 Mon Sep 17 00:00:00 2001 From: lipenghui Date: Thu, 18 Jan 2024 20:53:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:1.=20=E5=A2=9E=E5=8A=A0=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=9B2.=20=E5=A2=9E=E5=8A=A0mqtt=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 10 +- .env.production | 10 +- eslint.config.js | 1 + package.json | 1 + pnpm-lock.yaml | 258 +++++++++++++++++++++-- src/api/base/message.ts | 47 +++++ src/assets/images/conversation/user.png | Bin 0 -> 2863 bytes src/assets/svg/user.svg | 22 ++ src/components/AppMessage/index.d.ts | 9 + src/components/AppMessage/index.ts | 3 + src/components/AppMessage/index.vue | 138 ++++++++++++ src/components/AppSubMenuList/index.d.ts | 11 +- src/components/AppTextarea/index.vue | 11 +- src/enums/cacheEnum.ts | 4 +- src/enums/messageEnum.ts | 26 +++ src/enums/mqttEnum.ts | 54 +++++ src/hooks/useMqtt.ts | 86 ++++++++ src/layout/AppMenu/index.vue | 12 +- src/store/moules/messageStore/index.d.ts | 20 ++ src/store/moules/messageStore/index.ts | 51 +++++ src/store/moules/userStore/index.d.ts | 7 + src/store/moules/userStore/index.ts | 26 ++- src/utils/mqtt.ts | 93 ++++++++ src/views/conversation/index.vue | 138 ++++++++++-- types/vite-env.d.ts | 7 +- 25 files changed, 1000 insertions(+), 45 deletions(-) create mode 100644 src/api/base/message.ts create mode 100644 src/assets/images/conversation/user.png create mode 100644 src/assets/svg/user.svg create mode 100644 src/components/AppMessage/index.d.ts create mode 100644 src/components/AppMessage/index.ts create mode 100644 src/components/AppMessage/index.vue create mode 100644 src/enums/messageEnum.ts create mode 100644 src/enums/mqttEnum.ts create mode 100644 src/hooks/useMqtt.ts create mode 100644 src/store/moules/messageStore/index.d.ts create mode 100644 src/store/moules/messageStore/index.ts create mode 100644 src/utils/mqtt.ts diff --git a/.env.development b/.env.development index 199e83f..b89c9b6 100644 --- a/.env.development +++ b/.env.development @@ -4,7 +4,15 @@ VITE_GLOB_BASE_URL = "http://localhost:48080" # 本地MQTT地址 -VITE_GLOB_MQTT_URL = "http://localhost:48080" +VITE_GLOB_MQTT_HOST = "223.99.228.240" +VITE_GLOB_MQTT_PORT = 28083 +VITE_GLOB_MQTT_PROTOCOL = "ws" + +# 本地MQTT用户名 +VITE_GLOB_MQTT_USERNAME = "serverAdmin" + +# 本地MQTT密码 +VITE_GLOB_MQTT_PASSWORD = "EnpfgI9yuSwi" # 接口授权标识 VITE_GLOB_APP_AUTHORIZATION = "ZmFsY29uOmZhbGNvbl9zZWNyZXQ=" \ No newline at end of file diff --git a/.env.production b/.env.production index e85c639..40563ef 100644 --- a/.env.production +++ b/.env.production @@ -4,7 +4,15 @@ VITE_GLOB_BASE_URL = "http://223.99.228.207:19872" # 本地MQTT地址 -VITE_GLOB_MQTT_URL = "http://localhost:48080" +VITE_GLOB_MQTT_HOST = "223.99.228.240" +VITE_GLOB_MQTT_PORT = 28083 +VITE_GLOB_MQTT_PROTOCOL = "ws" + +# 本地MQTT用户名 +VITE_GLOB_MQTT_USERNAME = "serverAdmin" + +# 本地MQTT密码 +VITE_GLOB_MQTT_PASSWORD = "EnpfgI9yuSwi" # 接口授权标识 VITE_GLOB_APP_AUTHORIZATION = "ZmFsY29uOmZhbGNvbl9zZWNyZXQ=" \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 50cdef1..e916aa7 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -7,6 +7,7 @@ export default antfu( formatters: true, rules: { 'vue/html-self-closing': 'off', + 'curly': 'off', }, }, ) diff --git a/package.json b/package.json index d15b365..45b05b2 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "axios": "^1.6.5", "crypto-js": "^4.2.0", "lodash-es": "^4.17.21", + "mqtt": "^5.3.4", "pinia": "^2.1.7", "pinia-plugin-persistedstate": "^3.2.1", "qs": "^6.11.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66cd466..08439c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ dependencies: lodash-es: specifier: ^4.17.21 version: 4.17.21 + mqtt: + specifier: ^5.3.4 + version: 5.3.4 pinia: specifier: ^2.1.7 version: 2.1.7(typescript@5.3.3)(vue@3.4.13) @@ -1147,7 +1150,6 @@ packages: resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} dependencies: undici-types: 5.26.5 - dev: true /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1157,6 +1159,13 @@ packages: resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} dev: true + /@types/readable-stream@4.0.10: + resolution: {integrity: sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==} + dependencies: + '@types/node': 20.11.0 + safe-buffer: 5.1.2 + dev: false + /@types/semver@7.5.6: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} dev: true @@ -1175,6 +1184,12 @@ packages: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} dev: false + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.11.0 + dev: false + /@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1668,6 +1683,13 @@ packages: - vue dev: false + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1828,7 +1850,10 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} @@ -1852,6 +1877,14 @@ packages: engines: {node: '>=8'} dev: true + /bl@6.0.10: + resolution: {integrity: sha512-F14DFhDZfxtVm2FY0k9kG2lWAwzZkO9+jX3Ytuoy/V0E1/5LBuBzzQHXAjqpxXEDIpmTPZZf5GVIGPQcLxFpaA==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 4.5.2 + dev: false + /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true @@ -1871,7 +1904,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true /braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} @@ -1909,6 +1941,17 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: true + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -2098,6 +2141,10 @@ packages: engines: {node: '>= 12.0.0'} dev: true + /commist@3.2.0: + resolution: {integrity: sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==} + dev: false + /component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} dev: true @@ -2114,6 +2161,16 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: false + /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2247,7 +2304,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -2927,6 +2983,16 @@ packages: engines: {node: '>= 0.6'} dev: true + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3030,6 +3096,14 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-unique-numbers@8.0.13: + resolution: {integrity: sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==} + engines: {node: '>=16.1.0'} + dependencies: + '@babel/runtime': 7.23.8 + tslib: 2.6.2 + dev: false + /fastq@1.16.0: resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} dependencies: @@ -3131,7 +3205,6 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -3209,6 +3282,17 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: false + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -3334,6 +3418,13 @@ packages: hasBin: true dev: true + /help-me@4.2.0: + resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} + dependencies: + glob: 8.1.0 + readable-stream: 3.6.2 + dev: false + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -3359,6 +3450,10 @@ packages: engines: {node: '>=16.17.0'} dev: true + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + /ignore@5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} @@ -3397,11 +3492,9 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /is-accessor-descriptor@1.0.1: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} @@ -3587,6 +3680,10 @@ packages: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} dev: true + /js-sdsl@4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3775,6 +3872,11 @@ packages: js-tokens: 4.0.0 dev: false + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -3917,6 +4019,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -3926,7 +4035,6 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} @@ -3945,6 +4053,43 @@ packages: ufo: 1.3.2 dev: true + /mqtt-packet@9.0.0: + resolution: {integrity: sha512-8v+HkX+fwbodsWAZIZTI074XIoxVBOmPeggQuDFCGg1SqNcC+uoRMWu7J6QlJPqIUIJXmjNYYHxBBLr1Y/Df4w==} + dependencies: + bl: 6.0.10 + debug: 4.3.4 + process-nextick-args: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /mqtt@5.3.4: + resolution: {integrity: sha512-nyhr2bnFtyiv68jV3yfR6eQtGcGs/jr2l3ETKXYc0amttsasXa1KgvETHRNRjfeDt/yc68IqoEjFzKkHpoQUPQ==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@types/readable-stream': 4.0.10 + '@types/ws': 8.5.10 + commist: 3.2.0 + concat-stream: 2.0.0 + debug: 4.3.4 + help-me: 4.2.0 + lru-cache: 10.1.0 + minimist: 1.2.8 + mqtt-packet: 9.0.0 + number-allocator: 1.0.14 + readable-stream: 4.5.2 + reinterval: 1.1.0 + rfdc: 1.3.0 + split2: 4.2.0 + worker-timers: 7.1.1 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} @@ -3956,7 +4101,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4044,6 +4188,15 @@ packages: boolbase: 1.0.0 dev: true + /number-allocator@1.0.14: + resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==} + dependencies: + debug: 4.3.4 + js-sdsl: 4.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4088,7 +4241,6 @@ packages: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: true /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} @@ -4371,6 +4523,15 @@ packages: hasBin: true dev: true + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -4433,7 +4594,17 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true + + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -4466,6 +4637,10 @@ packages: jsesc: 0.5.0 dev: true + /reinterval@1.1.0: + resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==} + dev: false + /repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} @@ -4518,6 +4693,10 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: false + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -4554,9 +4733,12 @@ packages: queue-microtask: 1.2.3 dev: true + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true /safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} @@ -4768,6 +4950,11 @@ packages: extend-shallow: 3.0.2 dev: true + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + /stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' @@ -4799,7 +4986,6 @@ packages: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: true /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} @@ -4987,7 +5173,6 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -5011,6 +5196,10 @@ packages: engines: {node: '>=8'} dev: true + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: false + /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} @@ -5031,7 +5220,6 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} @@ -5130,7 +5318,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -5299,6 +5486,31 @@ packages: isexe: 2.0.0 dev: true + /worker-timers-broker@6.1.1: + resolution: {integrity: sha512-CTlDnkXAewtYvw5gOwVIc6UuIPcNHJrqWxBMhZbCWOmadvl20nPs9beAsXlaTEwW3G2KBpuKiSgkhBkhl3mxDA==} + dependencies: + '@babel/runtime': 7.23.8 + fast-unique-numbers: 8.0.13 + tslib: 2.6.2 + worker-timers-worker: 7.0.65 + dev: false + + /worker-timers-worker@7.0.65: + resolution: {integrity: sha512-Dl4nGONr8A8Fr+vQnH7Ee+o2iB480S1fBcyJYqnMyMwGRVyQZLZU+o91vbMvU1vHqiryRQmjXzzMYlh86wx+YQ==} + dependencies: + '@babel/runtime': 7.23.8 + tslib: 2.6.2 + dev: false + + /worker-timers@7.1.1: + resolution: {integrity: sha512-axtq83GwPqYwkQmQmei2abQ9cT7oSwmLw4lQCZ9VmMH9g4t4kuEF1Gw+tdnIJGHCiZ2QPDnr/+307bYx6tynLA==} + dependencies: + '@babel/runtime': 7.23.8 + tslib: 2.6.2 + worker-timers-broker: 6.1.1 + worker-timers-worker: 7.0.65 + dev: false + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -5310,7 +5522,19 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} diff --git a/src/api/base/message.ts b/src/api/base/message.ts new file mode 100644 index 0000000..bdb17fd --- /dev/null +++ b/src/api/base/message.ts @@ -0,0 +1,47 @@ +import { defHttp } from '@/utils/axios/index' + +/** + * @description 对话列表 + */ +export async function conversationList() { + return defHttp.get({ + url: `/open-chat/chat/conversation/list`, + }) +} + +/** + * @description 对话历史记录 + */ +export async function historyMessage(data: { + conversationId: string + current: number + size: number +}) { + return defHttp.get({ + url: `/open-chat/chat/chatMessageLog/page`, + data, + }) +} + +/** + * @description 发送消息 + */ +export async function sendMessage(data: { + roleId: number + conversationId: string + question: string +}) { + return defHttp.post({ + url: `/open-chat/chat/session`, + data, + }) +} + +/** + * @description 获取chat信息 + */ +export async function chatInfo() { + return defHttp.get({ + url: `/open-chat/chat/ai/getWxUserInfo`, + }) +} diff --git a/src/assets/images/conversation/user.png b/src/assets/images/conversation/user.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9ddab55ed9ee8359bf41da51bcece969d10c8f GIT binary patch literal 2863 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 F`9FYLjF12T literal 0 HcmV?d00001 diff --git a/src/assets/svg/user.svg b/src/assets/svg/user.svg new file mode 100644 index 0000000..78dcfd6 --- /dev/null +++ b/src/assets/svg/user.svg @@ -0,0 +1,22 @@ + + + 编组 7备份 4 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/AppMessage/index.d.ts b/src/components/AppMessage/index.d.ts new file mode 100644 index 0000000..21a4a04 --- /dev/null +++ b/src/components/AppMessage/index.d.ts @@ -0,0 +1,9 @@ +import type { MessageStatusEnum, MessageTypeEnum } from '@/enums/messageEnum' + +export interface MessageItem { + messageType: MessageType + content: string + time: string + avatar: string + messageStatus?: MessageStatusEnum +} diff --git a/src/components/AppMessage/index.ts b/src/components/AppMessage/index.ts new file mode 100644 index 0000000..a19fa5c --- /dev/null +++ b/src/components/AppMessage/index.ts @@ -0,0 +1,3 @@ +import AppMessage from './index.vue' + +export { AppMessage } diff --git a/src/components/AppMessage/index.vue b/src/components/AppMessage/index.vue new file mode 100644 index 0000000..361229d --- /dev/null +++ b/src/components/AppMessage/index.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/components/AppSubMenuList/index.d.ts b/src/components/AppSubMenuList/index.d.ts index 26278f0..8b36d51 100644 --- a/src/components/AppSubMenuList/index.d.ts +++ b/src/components/AppSubMenuList/index.d.ts @@ -1,5 +1,14 @@ 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 - id: string } diff --git a/src/components/AppTextarea/index.vue b/src/components/AppTextarea/index.vue index f37ac76..a8297b3 100644 --- a/src/components/AppTextarea/index.vue +++ b/src/components/AppTextarea/index.vue @@ -8,6 +8,10 @@ defineProps({ type: String, default: '在此输入你想了解的内容(Shift + Enter = 换行)', }, + btnLoading: { + type: Boolean, + default: false, + }, }) const emit = defineEmits(['pressEnter', 'send']) @@ -38,7 +42,12 @@ function handeleSend() { @press-enter="pressEnter" > - diff --git a/src/enums/cacheEnum.ts b/src/enums/cacheEnum.ts index 86d7178..77b8a8c 100644 --- a/src/enums/cacheEnum.ts +++ b/src/enums/cacheEnum.ts @@ -4,9 +4,11 @@ export const ACCESS_TOKEN_KEY = 'ACCESS_TOKEN' // user info key export const USER_INFO_KEY = 'USER_INFO' -export const USET_STORE_KEY = 'USER_STORE' +// chat info key +export const CHAT_INFO_KEY = 'CHAT_INFO' export enum CatchTypeEnum { ACCESS_TOKEN_KEY, USER_INFO_KEY, + CHAT_INFO_KEY, } diff --git a/src/enums/messageEnum.ts b/src/enums/messageEnum.ts new file mode 100644 index 0000000..6e191d2 --- /dev/null +++ b/src/enums/messageEnum.ts @@ -0,0 +1,26 @@ +/** + * @description: 消息类型:ai/user + */ +export enum MessageTypeEnum { + AI = 'ai', + USER = 'user', +} + +export enum MessageStatusEnum { + /* + * loading + */ + LOADING = 'loading', + /* + * 开始 + */ + ACTICON = 'a', + /* + * 结束 + */ + END = 'e', + /* + * 报错 + */ + ERROR = 'error', +} diff --git a/src/enums/mqttEnum.ts b/src/enums/mqttEnum.ts new file mode 100644 index 0000000..d87218b --- /dev/null +++ b/src/enums/mqttEnum.ts @@ -0,0 +1,54 @@ +/* + * @Description: + * @Author: yeke + * @Date: 2024-01-09 14:10:43 + * @LastEditors: yeke + * @LastEditTime: 2024-01-10 14:25:19 + */ + +/** + * @description: mqtt 连接状态枚举 + * @param UNCONNECTED 未连接 + * @param CONNECTING 连接中 + * @param CONNECTED 已连接 + * @param CONNECT_FAILED 连接失败 + * @param DISCONNECTED 断开连接 + * @param RECONNECTING 重连中 + */ +export enum MqttConnectStateEnum { + // 未连接 + UNCONNECTED = "unConnected", + // 连接中 + CONNECTING = "connecting", + // 已连接 + CONNECTED = "connected", + // 连接失败 + CONNECT_FAILED = "connectFailed", + + // 断开连接 + DISCONNECTED = "disConnected", + // 断开中 + DISCONNECTING = "disconnecting", + // 断开失败 + DISCONNECT_FAILED = "disconnectFailed", + // 重连中 + RECONNECTING = "reConnecting", +} + +/** + * @description: mqtt 订阅状态枚举 + * @param UNSUBSCRIBED 未订阅 + * @param SUBSCRIBING 订阅中 + * @param SUBSCRIBE_SUCCESS 订阅成功 + * @param SUBSCRIBE_FAILED 订阅失败 + */ +export enum MqttSubcribeStateEnum { + // 未订阅 + UNSUBSCRIBED = "unSubscribed", + // 订阅中 + SUBSCRIBING = "subscribing", + // 订阅成功 + SUBSCRIBE_SUCCESS = "subscribeSuccess", + // 订阅失败 + SUBSCRIBE_FAILED = "subscribeFailed", +} diff --git a/src/hooks/useMqtt.ts b/src/hooks/useMqtt.ts new file mode 100644 index 0000000..c5e8572 --- /dev/null +++ b/src/hooks/useMqtt.ts @@ -0,0 +1,86 @@ +import type { Options } from '@/utils/mqtt' +import { MqttService } from '@/utils/mqtt' +import { useUserStore } from '@/store/moules/userStore/index' +import { useMessageStore } from '@/store/moules/messageStore/index' +import { MessageStatusEnum, MessageTypeEnum } from '@/enums/messageEnum' + +export function useMqtt() { + const userStore = useUserStore() + const messageStore = useMessageStore() + + const options: Options = { + host: import.meta.env.VITE_GLOB_MQTT_HOST, + port: import.meta.env.VITE_GLOB_MQTT_PORT, + protocol: import.meta.env.VITE_GLOB_MQTT_PROTOCOL, + clean: true, + connectTimeout: 4000, // 超时时间 + reconnectPeriod: 4000, // 重连时间间隔 + clientId: `Consumer@${userStore.getUserInfo?.chatCode}_${new Date().getTime()}`, + username: import.meta.env.VITE_GLOB_MQTT_USERNAME, + password: import.meta.env.VITE_GLOB_MQTT_PASSWORD, + } + + const mqttService = new MqttService(options) + + /** + * @description: 订阅 + */ + const subscribe = (topicKey: string) => { + mqttService + .subscribe(topicKey) + .then(() => { + mqttService.onMessage(topicKey, (messageData: any) => { + console.log(messageData) + + if (messageData.message_type === MessageStatusEnum.ACTICON) { + messageStore.setMessageStatus(MessageStatusEnum.ACTICON) + messageStore.setMessageFirstItem({ + messageType: MessageTypeEnum.AI, + content: messageData.message_content, + time: String(new Date().getTime()), + avatar: '', + messageStatus: MessageStatusEnum.ACTICON, + }) + } + if (messageData.message_type === MessageStatusEnum.END) { + messageStore.setMessageStatus(MessageStatusEnum.END) + messageStore.setMessageFirstItem({ + messageType: MessageTypeEnum.AI, + content: messageData.message_content, + time: String(new Date().getTime()), + avatar: '', + messageStatus: MessageStatusEnum.END, + }) + } + }) + }) + .catch(() => { + // uni.hideLoading() + }) + } + + /** + * @description: 建立连接 + */ + const connect = async () => { + return new Promise((resolve, reject) => { + mqttService + .connect() + .then(() => { + const topicKey = `chatgpt_${userStore.getChatInfo?.chatCode}_${messageStore.conversationData?.id}` + messageStore.setTopicKey(topicKey) + subscribe(topicKey) + resolve(true) + }) + .catch(() => { + // eslint-disable-next-line prefer-promise-reject-errors + reject(false) + }) + }) + } + + return { + connect, + subscribe, + } +} diff --git a/src/layout/AppMenu/index.vue b/src/layout/AppMenu/index.vue index 155a295..979343d 100644 --- a/src/layout/AppMenu/index.vue +++ b/src/layout/AppMenu/index.vue @@ -1,5 +1,5 @@ diff --git a/types/vite-env.d.ts b/types/vite-env.d.ts index 4616d11..a21e20f 100644 --- a/types/vite-env.d.ts +++ b/types/vite-env.d.ts @@ -1,4 +1,5 @@ /// +import type mqtt from 'mqtt' interface ImportMetaEnv { NODE_ENV: string @@ -6,7 +7,11 @@ interface ImportMetaEnv { VITE_GLOB_APP_TITLE: string VITE_GLOB_APP_SHORT_NAME: string VITE_GLOB_BASE_URL: string - VITE_GLOB_MQTT_URL: string + VITE_GLOB_MQTT_HOST: string + VITE_GLOB_MQTT_PORT: number + VITE_GLOB_MQTT_PROTOCOL: mqtt.MqttProtocol VITE_GLOB_APP_AUTHORIZATION: string VITE_GLOB_APP_TOKEN_KEY: string + VITE_GLOB_MQTT_USERNAME: string + VITE_GLOB_MQTT_PASSWORD: string }