diff --git a/package-lock.json b/package-lock.json index 6256e0b..2f88d15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,13 @@ "name": "chatgpt-web", "version": "2.11.1", "dependencies": { + "@ant-design/icons-vue": "^7.0.1", "@quasar/extras": "^1.16.9", "@traptitech/markdown-it-katex": "^3.6.0", "@vueuse/core": "^9.13.0", "ant-design-vue": "^4.1.1", "dayjs": "^1.11.10", + "element-plus": "^2.5.3", "highlight.js": "^11.7.0", "html2canvas": "^1.4.1", "katex": "^0.16.4", @@ -52,6 +54,7 @@ "rimraf": "^4.3.0", "tailwindcss": "^3.2.7", "typescript": "~4.9.5", + "unplugin-auto-import": "^0.17.3", "unplugin-vue-components": "^0.26.0", "vite": "^4.2.0", "vite-plugin-pwa": "^0.14.4", @@ -2234,6 +2237,14 @@ "node": ">=10" } }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", @@ -2652,6 +2663,28 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.5.3", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.5.3.tgz", + "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.5.4.tgz", + "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "dependencies": { + "@floating-ui/core": "^1.5.3", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -2867,6 +2900,12 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" + }, "node_modules/@quasar/extras": { "version": "1.16.9", "resolved": "https://registry.npmmirror.com/@quasar/extras/-/extras-1.16.9.tgz", @@ -5009,6 +5048,31 @@ "integrity": "sha512-LfxbHXdA/S+qyoTEA4EbhxGjrxx7WK2h6yb5K2v0UCOufUKX+VZaHbl3svlzZfv9sGseym/g3Ne4DpsgRULmqg==", "dev": true }, + "node_modules/element-plus": { + "version": "2.5.3", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.5.3.tgz", + "integrity": "sha512-wmtstxaMkD6UinIgD+45CjrhbRh4u0vt+/GgxfPeMLt5pDpIVwZFjkUaVcWqqxcxd5a80HP3XlDF74fW7wim9A==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -5180,6 +5244,11 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -7230,6 +7299,12 @@ "url": "https://github.com/sponsors/ota-meshi" } }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -7692,6 +7767,16 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -7981,6 +8066,11 @@ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -8170,6 +8260,18 @@ "node": ">=8" } }, + "node_modules/mlly": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.5.0.tgz", + "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8325,6 +8427,11 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -8839,6 +8946,12 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -8936,6 +9049,17 @@ "node": ">= 6" } }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -9759,6 +9883,12 @@ "compute-scroll-into-view": "^1.0.20" } }, + "node_modules/scule": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.2.0.tgz", + "integrity": "sha512-CRCmi5zHQnSoeCik9565PONMg0kfkvYmcSqrbOJY4txFfy1wvVULV4FDaiXhUblUgahdqz3F2NwHZ8i4eBTwUw==", + "dev": true + }, "node_modules/seemly": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.6.tgz", @@ -10182,6 +10312,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + } + }, "node_modules/stylis": { "version": "4.3.1", "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.1.tgz", @@ -10639,6 +10778,12 @@ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, + "node_modules/ufo": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.3.2.tgz", + "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", + "dev": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -10694,6 +10839,70 @@ "node": ">=4" } }, + "node_modules/unimport": { + "version": "3.7.1", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.7.1.tgz", + "integrity": "sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "acorn": "^8.11.2", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "mlly": "^1.4.2", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.1.1", + "strip-literal": "^1.3.0", + "unplugin": "^1.5.1" + } + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/unimport/node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -10740,6 +10949,83 @@ "webpack-virtual-modules": "^0.6.1" } }, + "node_modules/unplugin-auto-import": { + "version": "0.17.3", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.17.3.tgz", + "integrity": "sha512-0cn0wr8X579TtdZKUAps0dDVrYzttx38ImdxZjmCeNlMDJX8UuSjO83vFqgS4ClNDIGWAute+xl9j5vRSX+vsw==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.7", + "@rollup/pluginutils": "^5.1.0", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "minimatch": "^9.0.3", + "unimport": "^3.7.0", + "unplugin": "^1.6.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-auto-import/node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/unplugin-auto-import/node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/unplugin-auto-import/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/unplugin-vue-components": { "version": "0.26.0", "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz", @@ -13385,6 +13671,12 @@ "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==" }, + "@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "requires": {} + }, "@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", @@ -13585,6 +13877,28 @@ "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", "dev": true }, + "@floating-ui/core": { + "version": "1.5.3", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.5.3.tgz", + "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "requires": { + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/dom": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.5.4.tgz", + "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "requires": { + "@floating-ui/core": "^1.5.3", + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -13753,6 +14067,11 @@ "fastq": "^1.6.0" } }, + "@popperjs/core": { + "version": "npm:@sxzz/popperjs-es@2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" + }, "@quasar/extras": { "version": "1.16.9", "resolved": "https://registry.npmmirror.com/@quasar/extras/-/extras-1.16.9.tgz", @@ -15344,6 +15663,28 @@ "integrity": "sha512-LfxbHXdA/S+qyoTEA4EbhxGjrxx7WK2h6yb5K2v0UCOufUKX+VZaHbl3svlzZfv9sGseym/g3Ne4DpsgRULmqg==", "dev": true }, + "element-plus": { + "version": "2.5.3", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.5.3.tgz", + "integrity": "sha512-wmtstxaMkD6UinIgD+45CjrhbRh4u0vt+/GgxfPeMLt5pDpIVwZFjkUaVcWqqxcxd5a80HP3XlDF74fW7wim9A==", + "requires": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + } + }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -15481,6 +15822,11 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -16938,6 +17284,12 @@ "semver": "^7.3.5" } }, + "jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -17255,6 +17607,12 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "requires": {} + }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -17491,6 +17849,11 @@ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -17621,6 +17984,18 @@ "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true }, + "mlly": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.5.0.tgz", + "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", + "dev": true, + "requires": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -17756,6 +18131,11 @@ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, + "normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -18127,6 +18507,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -18173,6 +18559,17 @@ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -18758,6 +19155,12 @@ "compute-scroll-into-view": "^1.0.20" } }, + "scule": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.2.0.tgz", + "integrity": "sha512-CRCmi5zHQnSoeCik9565PONMg0kfkvYmcSqrbOJY4txFfy1wvVULV4FDaiXhUblUgahdqz3F2NwHZ8i4eBTwUw==", + "dev": true + }, "seemly": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.6.tgz", @@ -19078,6 +19481,15 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "requires": { + "acorn": "^8.10.0" + } + }, "stylis": { "version": "4.3.1", "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.1.tgz", @@ -19420,6 +19832,12 @@ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, + "ufo": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.3.2.tgz", + "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", + "dev": true + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -19460,6 +19878,63 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "unimport": { + "version": "3.7.1", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.7.1.tgz", + "integrity": "sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.1.0", + "acorn": "^8.11.2", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "mlly": "^1.4.2", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.1.1", + "strip-literal": "^1.3.0", + "unplugin": "^1.5.1" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0" + } + }, + "local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "requires": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + } + }, + "magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + } + } + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -19496,6 +19971,61 @@ "webpack-virtual-modules": "^0.6.1" } }, + "unplugin-auto-import": { + "version": "0.17.3", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.17.3.tgz", + "integrity": "sha512-0cn0wr8X579TtdZKUAps0dDVrYzttx38ImdxZjmCeNlMDJX8UuSjO83vFqgS4ClNDIGWAute+xl9j5vRSX+vsw==", + "dev": true, + "requires": { + "@antfu/utils": "^0.7.7", + "@rollup/pluginutils": "^5.1.0", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "minimatch": "^9.0.3", + "unimport": "^3.7.0", + "unplugin": "^1.6.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "requires": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + } + }, + "magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "unplugin-vue-components": { "version": "0.26.0", "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz", diff --git a/package.json b/package.json index f23757b..a20fc9a 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,13 @@ "common:prepare": "husky install" }, "dependencies": { + "@ant-design/icons-vue": "^7.0.1", "@quasar/extras": "^1.16.9", "@traptitech/markdown-it-katex": "^3.6.0", "@vueuse/core": "^9.13.0", "ant-design-vue": "^4.1.1", "dayjs": "^1.11.10", + "element-plus": "^2.5.3", "highlight.js": "^11.7.0", "html2canvas": "^1.4.1", "katex": "^0.16.4", @@ -67,6 +69,7 @@ "rimraf": "^4.3.0", "tailwindcss": "^3.2.7", "typescript": "~4.9.5", + "unplugin-auto-import": "^0.17.3", "unplugin-vue-components": "^0.26.0", "vite": "^4.2.0", "vite-plugin-pwa": "^0.14.4", diff --git a/src/App.vue b/src/App.vue index a52d6a8..0bf6345 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,10 +3,11 @@ import { NConfigProvider } from 'naive-ui' import { NaiveProvider } from '@/components/common' import { useTheme } from '@/hooks/useTheme' import { useLanguage } from '@/hooks/useLanguage' +import zhCN from 'ant-design-vue/es/locale/zh_CN'; const { theme, themeOverrides } = useTheme() const { language } = useLanguage() -localStorage.setItem('token','46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644e756eda7154e1af9e70d1c9d2f100823a26885ea6df3249fe619995cb79dc5dbd5ead32d43b955d6b3ce83129097bb21bb8169898f48692de4f966db140c71b85a2065acfc948561c465279fc05194a79a1115f3b00170944b6c4bd6c52ada909a075c55d18d76c2ed2175602421b34b27362a05c350733ed73382471df0a08950f7f1e812a610c17bdac82d82d54be38969f6b41201af79b8d36ef177c5b94bdd0b97501291f5dc1988d078f75b7de79982f003b0d7c5ba286511f285173cc55eb06d64ee6a12f0de1add728edd6b4632a432be8221f44bb864b0e9e4985ca7b47a53f8d55c0171f6f9465e063db4881b1dd87b8f903f3959a83ec525aa0695') +localStorage.setItem('token','46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644e756eda7154e1af9e70d1c9d2f100823a26885ea6df3249fe619995cb79dc5dbd5ead32d43b955d6b3ce83129097bb21bb8169898f48692de4f966db140c71b85a2065acfc948561c465279fc05194a79a1115f3b00170944b6c4bd6c52ada909a075c55d18d76c2ed2175602421b34b27362a05c350733ed73382471df0a08950f7f1e812a610c17bdac82d82d54be38969f6b41201af79b8d36ef177c5b94bdd0b97501291f5dc1988d078f75b7de7fde85696e7a51443d1971ab54a97988fb4ced751732ef87ea638352124e2645128eb8977fcc63e3316cf2c94f10a9ff967353f430059dcda7b3d4f48288fb374d56461b354dab136b5b28029f29cfe5d') + diff --git a/src/api/api.js b/src/api/api.js index ad76a2e..cc708e8 100644 --- a/src/api/api.js +++ b/src/api/api.js @@ -28,3 +28,13 @@ export const postRequest = (url,data) => { data }) } +export const uploadImg = (data) => { + return request({ + headers: { + 'Content-Type': 'multipart/form-data' + }, + url:'/upload/img', + method: 'post', + data + }) +} diff --git a/src/main.js b/src/main.js index 2221ee6..fcd9f6c 100644 --- a/src/main.js +++ b/src/main.js @@ -5,12 +5,14 @@ import { setupAssets, setupScrollbarStyle } from './plugins' import { setupStore } from './store' import { setupRouter } from './router' import Antd from "ant-design-vue"; -import 'ant-design-vue/dist/reset.css'; - +import "ant-design-vue/dist/reset.css"; +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' async function bootstrap() { const app = createApp(App) setupAssets() app.use(Antd); + app.use(ElementPlus); setupScrollbarStyle() setupStore(app) diff --git a/src/store/modules/session/index.js b/src/store/modules/session/index.js index 20c88c4..490f0c1 100644 --- a/src/store/modules/session/index.js +++ b/src/store/modules/session/index.js @@ -32,11 +32,17 @@ const currentListUuid=ref('') return ''; } })(), + fileList:(()=>{ + return JSON.parse(x.message)?.filter((y)=>{ + return y.type === 'image_url' + }).map(z=>z.image_url) + })(), inversion:x.role==='user', error:false, conversationOpt:null, } }) + console.log(sessionDetail.value,'sessionDetail.value') detailData.value=res.data } } diff --git a/src/utils/request/request.js b/src/utils/request/request.js index 4a79902..37d5b05 100644 --- a/src/utils/request/request.js +++ b/src/utils/request/request.js @@ -1,16 +1,22 @@ -//对axios进行二次封装,将刚才下载好的axios导入进来 -import axios from "axios"; +import axios from "axios"; +import { ElLoading } from 'element-plus' const request = axios.create({ baseURL:'http://114.218.158.24:9020', timeout:5000 }); - +let loading request.interceptors.request.use((config)=>{ - config.headers.Authorization = "46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644e756eda7154e1af9e70d1c9d2f100823a26885ea6df3249fe619995cb79dc5dbd5ead32d43b955d6b3ce83129097bb21bb8169898f48692de4f966db140c71b85a2065acfc948561c465279fc05194a79a1115f3b00170944b6c4bd6c52ada909a075c55d18d76c2ed2175602421b34b27362a05c350733ed73382471df0a08950f7f1e812a610c17bdac82d82d54be38969f6b41201af79b8d36ef177c5b94bdd0b97501291f5dc1988d078f75b7de774c3731c3c9c46b80f79c664fd16568e0b12316c09aa60453346b960b888f074045242038258c55452ce5d275f05aaead8f7653f8448035dd6c6cff9ee8cd2d8c1e41bdbfb90320b2ac30e3a2e0e63e6" +loading=ElLoading.service({ + lock: true, + text: '加载中', + background: 'rgba(0, 0, 0, 0.7)', + }) + config.headers.Authorization =localStorage.getItem('token') return config; }); request.interceptors.response.use((res)=>{ + loading.close() return res.data; }); export default request; diff --git a/src/views/chat/components/Message/Text.vue b/src/views/chat/components/Message/Text.vue index 4103854..3cc5548 100644 --- a/src/views/chat/components/Message/Text.vue +++ b/src/views/chat/components/Message/Text.vue @@ -10,6 +10,7 @@ import { copyToClip } from '@/utils/copy' interface Props { inversion?: boolean + fileList?: [] error?: boolean text?: string loading?: boolean @@ -44,7 +45,7 @@ const wrapClass = computed(() => { 'min-w-[20px]', 'rounded-md', isMobile.value ? 'p-2' : 'px-3 py-2', - props.inversion ? 'bg-[#d2f9d1]' : 'bg-[#f4f6f8]', + props.inversion ? 'bg-[#dfd7f3]' : 'bg-[#f4f6f8]', props.inversion ? 'dark:bg-[#a1dc95]' : 'dark:bg-[#1e1e20]', props.inversion ? 'message-request' : 'message-reply', { 'text-red-500': props.error }, @@ -110,11 +111,22 @@ onUnmounted(() => {
-
+
+
+
+ +
+
+
diff --git a/src/views/chat/components/Message/index.vue b/src/views/chat/components/Message/index.vue index a19e7f7..b4f032c 100644 --- a/src/views/chat/components/Message/index.vue +++ b/src/views/chat/components/Message/index.vue @@ -12,6 +12,7 @@ import { copyToClip } from '@/utils/copy' interface Props { dateTime?: string text?: string + fileList?: [] inversion?: boolean error?: boolean loading?: boolean @@ -113,6 +114,7 @@ async function handleCopy() { :class="[inversion ? 'flex-row-reverse' : 'flex-row']" > +import {uploadImg} from "@/api/api"; import dayjs from "dayjs"; -import { computed, onMounted, onUnmounted, ref } from 'vue' +import { computed, onMounted, onUnmounted, ref,watch } from 'vue' import { useRoute } from 'vue-router' -import { storeToRefs } from 'pinia' import { NAutoComplete, NButton, NInput, useDialog, useMessage } from 'naive-ui' +import { AreaChartOutlined ,PlusOutlined } from '@ant-design/icons-vue'; import html2canvas from 'html2canvas' import { Message } from './components' import { useScroll } from './hooks/useScroll' @@ -15,12 +16,12 @@ import { useBasicLayout } from '@/hooks/useBasicLayout' import { useChatStore, usePromptStore } from '@/store' import { fetchChatAPIProcess } from '@/api' import { t } from '@/locales' +import {storeToRefs} from 'pinia' import { sessionDetailForSetup } from '@/store' const sessionDetailData=sessionDetailForSetup() let controller = new AbortController() - +const { sessionDetail:dataSources ,currentListUuid,gptMode} = storeToRefs(sessionDetailData) const openLongReply = import.meta.env.VITE_GLOB_OPEN_LONG_REPLY === 'true' - const route = useRoute() const dialog = useDialog() const ms = useMessage() @@ -33,9 +34,11 @@ const { scrollRef, scrollToBottom, scrollToBottomIfAtBottom } = useScroll() const { usingContext, toggleUsingContext } = useUsingContext() const { uuid } = route.params - -const dataSources = sessionDetailForSetup().sessionDetail -const conversationList = computed(() => dataSources.filter(item => (!item.inversion && !!item.conversationOptions))) +if (uuid){ + currentListUuid.value=uuid + sessionDetailData.getSessionDetail() +} +const conversationList = computed(() => dataSources.value.filter(item => (!item.inversion && !!item.conversationOptions))) const dataSessionDetail=ref([]) const prompt = ref('') const loading = ref(false) @@ -48,37 +51,45 @@ const promptStore = usePromptStore() const { promptList: promptTemplate } = storeToRefs(promptStore) // 未知原因刷新页面,loading 状态不会重置,手动重置 -dataSources.forEach((item, index) => { +dataSources.value.forEach((item, index) => { if (item.loading) updateChatSome(+uuid, index, { loading: false }) }) function handleSubmit() { - dataSources.push({ + dataSources.value.push({ dateTime: dayjs().format('YYYY/MM/DD HH:mm:ss'), text: prompt.value, inversion: true, error: false, + fileList:fileList.value.map(x=>x.url) }) sendDataStream() - console.log(sessionDetailForSetup().sessionDetail,'sessionDetailForSetup().sessionDetail') /* onConversation() */ } const API_URL = 'http://114.218.158.24:9020/chat/completion'; const createParams = () => { - const sessionDetail = sessionDetailForSetup().sessionDetail; - const messages = sessionDetail.map(x => ({ - content: x.text, - role: x.inversion ? 'user' : 'assistant' - })); - + const messages = dataSources.value.map((x) => { + return { + content:(()=>{ + if (x.fileList?.length>0){ + return [{type: "text", text: x.text},...x.fileList.map((y)=>{ + return {type: "image_url", image_url:y} + })] + }else { + return x.text + } + })(), + role: x.inversion ? 'user' : 'assistant' + } + }); return { - listUuid: sessionDetailForSetup().currentListUuid, + listUuid: currentListUuid.value, messages, frequency_penalty: 0, max_tokens: 1000, - model: sessionDetailForSetup().gptMode, + model: gptMode.value, presence_penalty: 0, stream: true, temperature: 1, @@ -88,20 +99,20 @@ const createParams = () => { const handleResponseStream = async (reader) => { const { done, value } = await reader.read(); - if (!done) { let decoded = new TextDecoder().decode(value); let decodedArray = decoded.split("data: "); - decodedArray.forEach((decoded) => { if (decoded !== "") { if (decoded.trim() === "[DONE]") { + return; } else { + console.log(decoded,'decoded') const response = JSON.parse(decoded).choices[0].delta.content ? JSON.parse(decoded).choices[0].delta.content : ""; - dataSources[dataSources.length - 1].text += response; + dataSources.value[dataSources.value.length - 1].text += response; } } }); @@ -111,15 +122,15 @@ const handleResponseStream = async (reader) => { }; const sendDataStream = async () => { - dataSources.push({ + const params = createParams(); + fileList.value=[] + prompt.value='' + dataSources.value.push({ dateTime: dayjs().format('YYYY/MM/DD HH:mm:ss'), text: '', inversion: false, error: false, }); - - const params = createParams(); - try { const response = await fetch(API_URL, { method: "POST", @@ -131,6 +142,8 @@ const sendDataStream = async () => { Authorization: localStorage.getItem('token'), }, }); + + console.log(dataSources.value,'dataSources.value') const contentType = response.headers.get('Content-Type'); if (!contentType || !contentType.includes('application/json')) { const reader = response.body.getReader(); @@ -207,7 +220,7 @@ async function onConversation() { const data = JSON.parse(chunk) updateChat( +uuid, - dataSources.length - 1, + dataSources.value.length - 1, { dateTime: new Date().toLocaleString(), text: lastText + (data.text ?? ''), @@ -232,7 +245,7 @@ async function onConversation() { } }, }) - updateChatSome(+uuid, dataSources.length - 1, { loading: false }) + updateChatSome(+uuid, dataSources.value.length - 1, { loading: false }) } await fetchChatAPIOnce() @@ -243,7 +256,7 @@ async function onConversation() { if (error.message === 'canceled') { updateChatSome( +uuid, - dataSources.length - 1, + dataSources.value.length - 1, { loading: false, }, @@ -252,12 +265,12 @@ async function onConversation() { return } - const currentChat = getChatByUuidAndIndex(+uuid, dataSources.length - 1) + const currentChat = getChatByUuidAndIndex(+uuid, dataSources.value.length - 1) if (currentChat?.text && currentChat.text !== '') { updateChatSome( +uuid, - dataSources.length - 1, + dataSources.value.length - 1, { text: `${currentChat.text}\n[${errorMessage}]`, error: false, @@ -266,10 +279,9 @@ async function onConversation() { ) return } - updateChat( +uuid, - dataSources.length - 1, + dataSources.value.length - 1, { dateTime: new Date().toLocaleString(), text: errorMessage, @@ -287,13 +299,13 @@ async function onConversation() { } } -async function onRegenerate(index) { +/* async function onRegenerate(index) { if (loading.value) return controller = new AbortController() - const { requestOptions } = dataSources[index] + const { requestOptions } = dataSources.value[index] let message = requestOptions?.prompt ?? '' @@ -396,7 +408,7 @@ async function onRegenerate(index) { finally { loading.value = false } -} +} */ function handleExport() { if (loading.value) @@ -540,23 +552,63 @@ onMounted(() => { if (inputRef.value && !isMobile.value) inputRef.value?.focus() }) - +const fileList = ref([ +]); onUnmounted(() => { if (loading.value) controller.abort() }) +function getBase64(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); +} +const previewVisible = ref(false); +const previewImage = ref(''); +const previewTitle = ref(''); +const handleCancel = () => { + previewVisible.value = false; + previewTitle.value = ''; +}; +const handlePreview = async (file) => { + if (!file.url && !file.preview) { + file.preview = (await getBase64(file.originFileObj)) + } + previewImage.value = file.url || file.preview; + previewVisible.value = true; + previewTitle.value = file.name || file.url.substring(file.url.lastIndexOf('/') + 1); +}; const value = ref('gpt-3.5-turbo'); - +const visible=ref(false) const options=ref([{ label: 'GPT-3.5', value: 'gpt-3.5-turbo' }, { label: 'GPT-4.0', value: 'gpt-4-1106-preview' }, { label: 'GPT-V', value: 'gpt-4-vision-preview' }]) +const removeImg=(data)=>{ + fileList.value.splice(fileList.value.findIndex(x=>x.url===data.url),1) +} +watch(gptMode,()=>{ + dataSources.value=[] +}) +const customRequest=async (file)=>{ + const res=await uploadImg({file:file.file,source:'approval'}) + if (res.code===0){ + file.onSuccess() + fileList.value.push({ + url:res.data.ori_url + }) + } + console.log(res,'res') +}