diff --git a/README.md b/README.md index 8b13789..9143bb6 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ +## 今日计划 +### 一、技术 +用vue3框架ts进行开发,element plus页面构建,web端应用 +用了高德地图API +### 二、功能介绍 +1. 登录注册 +2. ai文字询问 +3. ai语音询问 +4. ai图片询问 +5. 个人信息展示 +6. 地图实时显示地理位置 +7. ai生成今日天气的风景图 diff --git a/auto-imports.d.ts b/auto-imports.d.ts index bc57d8c..b60e825 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -8,4 +8,5 @@ export {} declare global { const ElMenu: typeof import('element-plus/es')['ElMenu'] const ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + const ElMessage: typeof import('element-plus/es')['ElMessage'] } diff --git a/components.d.ts b/components.d.ts index 73ded34..93b8b95 100644 --- a/components.d.ts +++ b/components.d.ts @@ -9,6 +9,7 @@ export {} declare module 'vue' { export interface GlobalComponents { Charts: typeof import('./src/components/charts.vue')['default'] + ElAlert: typeof import('element-plus/es')['ElAlert'] ElAside: typeof import('element-plus/es')['ElAside'] ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] @@ -22,14 +23,19 @@ declare module 'vue' { ElCol: typeof import('element-plus/es')['ElCol'] ElContainer: typeof import('element-plus/es')['ElContainer'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] + ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] + ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] + ElEmpty: typeof import('element-plus/es')['ElEmpty'] ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElHeader: typeof import('element-plus/es')['ElHeader'] ElIcon: typeof import('element-plus/es')['ElIcon'] + ElImage: typeof import('element-plus/es')['ElImage'] ElInput: typeof import('element-plus/es')['ElInput'] + ElLoading: typeof import('element-plus/es')['ElLoading'] ElMain: typeof import('element-plus/es')['ElMain'] ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] @@ -47,14 +53,18 @@ declare module 'vue' { ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] + ElTag: typeof import('element-plus/es')['ElTag'] ElText: typeof import('element-plus/es')['ElText'] ElTimePicker: typeof import('element-plus/es')['ElTimePicker'] + ElTooltip: typeof import('element-plus/es')['ElTooltip'] HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] IconCommunity: typeof import('./src/components/icons/IconCommunity.vue')['default'] IconDocumentation: typeof import('./src/components/icons/IconDocumentation.vue')['default'] IconEcosystem: typeof import('./src/components/icons/IconEcosystem.vue')['default'] IconSupport: typeof import('./src/components/icons/IconSupport.vue')['default'] IconTooling: typeof import('./src/components/icons/IconTooling.vue')['default'] + LocationMap: typeof import('./src/components/LocationMap.vue')['default'] + Main: typeof import('./src/components/main.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] TheWelcome: typeof import('./src/components/TheWelcome.vue')['default'] @@ -62,4 +72,7 @@ declare module 'vue' { ValidCode: typeof import('./src/components/validCode.vue')['default'] WelcomeItem: typeof import('./src/components/WelcomeItem.vue')['default'] } + export interface ComponentCustomProperties { + vLoading: typeof import('element-plus/es')['ElLoadingDirective'] + } } diff --git a/index.html b/index.html index 872ab31..4d45f34 100644 --- a/index.html +++ b/index.html @@ -11,3 +11,5 @@ + + diff --git a/package-lock.json b/package-lock.json index 74aebc9..16bbadd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,22 +9,27 @@ "version": "0.0.0", "dependencies": { "@element-plus/icons-vue": "^2.3.1", - "axios": "^1.9.0", + "axios": "^1.10.0", "echarts": "^5.6.0", "element-plus": "^2.9.9", "pinia": "^3.0.1", + "pinia-plugin-persistedstate": "^4.3.0", + "recordrtc": "^5.6.2", "vue": "^3.5.13", - "vue-router": "^4.5.0" + "vue-router": "^4.5.0", + "weixin-js-sdk": "^1.6.5" }, "devDependencies": { "@tsconfig/node22": "^22.0.1", "@types/axios": "^0.9.36", "@types/echarts": "^4.9.22", - "@types/node": "^22.14.0", + "@types/node": "^22.15.34", + "@types/recordrtc": "^5.6.14", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", "less": "^4.3.0", "npm-run-all2": "^7.0.2", + "sass-embedded": "^1.89.2", "typescript": "~5.8.0", "unplugin-auto-import": "^19.1.2", "unplugin-vue-components": "^28.5.0", @@ -502,6 +507,13 @@ "node": ">=6.9.0" } }, + "node_modules/@bufbuild/protobuf": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.5.2.tgz", + "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", @@ -1022,6 +1034,85 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@nuxt/kit": { + "version": "3.17.4", + "resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.17.4.tgz", + "integrity": "sha512-l+hY8sy2XFfg3PigZj+PTu6+KIJzmbACTRimn1ew/gtCz+F38f6KTF4sMRTN5CUxiB8TRENgEonASmkAWfpO9Q==", + "license": "MIT", + "dependencies": { + "c12": "^3.0.4", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.5", + "ignore": "^7.0.4", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "tinyglobby": "^0.2.13", + "ufo": "^1.6.1", + "unctx": "^2.4.1", + "unimport": "^5.0.1", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxt/kit/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@nuxt/kit/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nuxt/kit/node_modules/unimport": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-5.0.1.tgz", + "integrity": "sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "tinyglobby": "^0.2.13", + "unplugin": "^2.3.2", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=18.12.0" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz", @@ -1391,7 +1482,6 @@ "version": "1.0.7", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz", "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, "license": "MIT" }, "node_modules/@types/lodash": { @@ -1410,15 +1500,22 @@ } }, "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "version": "22.15.34", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.15.34.tgz", + "integrity": "sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/recordrtc": { + "version": "5.6.14", + "resolved": "https://registry.npmmirror.com/@types/recordrtc/-/recordrtc-5.6.14.tgz", + "integrity": "sha512-Reiy1sl11xP0r6w8DW3iQjc1BgXFyNC7aDuutysIjpFoqyftbQps9xPA2FoBkfVXpJM61betgYPNt+v65zvMhA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/web-bluetooth": { "version": "0.0.16", "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", @@ -1845,7 +1942,6 @@ "version": "8.14.1", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1914,9 +2010,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -2009,6 +2105,13 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true, + "license": "MIT/X11" + }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", @@ -2025,6 +2128,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/c12": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/c12/-/c12-3.0.4.tgz", + "integrity": "sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.5.0", + "exsolve": "^1.0.5", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.1.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -2084,6 +2243,22 @@ "fsevents": "~2.3.2" } }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2100,9 +2275,17 @@ "version": "0.2.2", "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true, "license": "MIT" }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2200,6 +2383,12 @@ } } }, + "node_modules/deep-pick-omit": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz", + "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==", + "license": "MIT" + }, "node_modules/default-browser": { "version": "5.2.1", "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.2.1.tgz", @@ -2243,6 +2432,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2252,6 +2447,24 @@ "node": ">=0.4.0" } }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2351,6 +2564,12 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/errx": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/errx/-/errx-0.1.0.tgz", + "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==", + "license": "MIT" + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2457,7 +2676,6 @@ "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, "license": "MIT", "engines": { "node": ">=12" @@ -2503,14 +2721,12 @@ "version": "1.0.5", "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.5.tgz", "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", - "dev": true, "license": "MIT" }, "node_modules/fdir": { "version": "6.4.4", "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -2688,6 +2904,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", @@ -2730,6 +2963,16 @@ "dev": true, "license": "ISC" }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", @@ -2809,6 +3052,15 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", @@ -2823,6 +3075,13 @@ "node": ">=0.10.0" } }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2981,6 +3240,15 @@ "node": ">=16" } }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3037,6 +3305,21 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/knitwork/-/knitwork-1.2.0.tgz", + "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==", + "license": "MIT" + }, "node_modules/kolorist": { "version": "1.8.0", "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", @@ -3095,7 +3378,6 @@ "version": "1.1.1", "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz", "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", - "dev": true, "license": "MIT", "dependencies": { "mlly": "^1.7.4", @@ -3262,7 +3544,6 @@ "version": "1.7.4", "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz", "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.14.0", @@ -3275,14 +3556,12 @@ "version": "0.1.8", "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, "license": "MIT" }, "node_modules/mlly/node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, "license": "MIT", "dependencies": { "confbox": "^0.1.8", @@ -3350,6 +3629,12 @@ "node": ">= 4.4.x" } }, + "node_modules/node-fetch-native": { + "version": "1.6.6", + "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz", + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", @@ -3440,6 +3725,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/nypm": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/nypm/-/nypm-0.6.0.tgz", + "integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "pathe": "^2.0.3", + "pkg-types": "^2.0.0", + "tinyexec": "^0.3.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, "node_modules/open": { "version": "10.1.2", "resolved": "https://registry.npmmirror.com/open/-/open-10.1.2.tgz", @@ -3503,7 +3813,6 @@ "version": "2.0.3", "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, "license": "MIT" }, "node_modules/perfect-debounce": { @@ -3522,7 +3831,6 @@ "version": "4.0.2", "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -3576,11 +3884,34 @@ } } }, + "node_modules/pinia-plugin-persistedstate": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.3.0.tgz", + "integrity": "sha512-x9wxpHj6iFDj5ITQJ3rj6+KesEqyRk/vqcE3WE+VGfetleV9Zufqwa9qJ6AkA5wmRSQEp7BTA1us/MDVTRHFFw==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^3.17.2", + "deep-pick-omit": "^1.2.1", + "defu": "^6.1.4", + "destr": "^2.0.5" + }, + "peerDependencies": { + "@pinia/nuxt": ">=0.10.0", + "pinia": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@pinia/nuxt": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, "node_modules/pkg-types": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.1.0.tgz", "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", - "dev": true, "license": "MIT", "dependencies": { "confbox": "^0.2.1", @@ -3650,7 +3981,6 @@ "version": "0.2.10", "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz", "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", - "dev": true, "funding": [ { "type": "individual", @@ -3663,6 +3993,16 @@ ], "license": "MIT" }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, "node_modules/read-package-json-fast": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", @@ -3703,6 +4043,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/recordrtc": { + "version": "5.6.2", + "resolved": "https://registry.npmmirror.com/recordrtc/-/recordrtc-5.6.2.tgz", + "integrity": "sha512-1QNKKNtl7+KcwD1lyOgP3ZlbiJ1d0HtXnypUy7yq49xEERxk31PHvE9RCciDrulPCY7WJ+oz0R9hpNxgsIurGQ==", + "license": "MIT" + }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", @@ -3762,6 +4108,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3770,6 +4126,319 @@ "license": "MIT", "optional": true }, + "node_modules/sass-embedded": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.89.2.tgz", + "integrity": "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.89.2", + "sass-embedded-android-arm64": "1.89.2", + "sass-embedded-android-riscv64": "1.89.2", + "sass-embedded-android-x64": "1.89.2", + "sass-embedded-darwin-arm64": "1.89.2", + "sass-embedded-darwin-x64": "1.89.2", + "sass-embedded-linux-arm": "1.89.2", + "sass-embedded-linux-arm64": "1.89.2", + "sass-embedded-linux-musl-arm": "1.89.2", + "sass-embedded-linux-musl-arm64": "1.89.2", + "sass-embedded-linux-musl-riscv64": "1.89.2", + "sass-embedded-linux-musl-x64": "1.89.2", + "sass-embedded-linux-riscv64": "1.89.2", + "sass-embedded-linux-x64": "1.89.2", + "sass-embedded-win32-arm64": "1.89.2", + "sass-embedded-win32-x64": "1.89.2" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.2.tgz", + "integrity": "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.2.tgz", + "integrity": "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.2.tgz", + "integrity": "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.2.tgz", + "integrity": "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.2.tgz", + "integrity": "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.2.tgz", + "integrity": "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.2.tgz", + "integrity": "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.2.tgz", + "integrity": "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.2.tgz", + "integrity": "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.2.tgz", + "integrity": "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.2.tgz", + "integrity": "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.2.tgz", + "integrity": "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.2.tgz", + "integrity": "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.2.tgz", + "integrity": "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.2.tgz", + "integrity": "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.2.tgz", + "integrity": "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz", @@ -3782,7 +4451,6 @@ "version": "1.3.0", "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -3888,6 +4556,12 @@ "node": ">=0.10.0" } }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "license": "MIT" + }, "node_modules/strip-final-newline": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz", @@ -3905,7 +4579,6 @@ "version": "3.0.0", "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.0.0.tgz", "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^9.0.1" @@ -3918,7 +4591,6 @@ "version": "9.0.1", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, "license": "MIT" }, "node_modules/superjson": { @@ -3933,11 +4605,55 @@ "node": ">=16" } }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.13.tgz", "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.4.4", @@ -3998,9 +4714,29 @@ "version": "1.6.1", "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true, "license": "MIT" }, + "node_modules/unctx": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/unctx/-/unctx-2.4.1.tgz", + "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17", + "unplugin": "^2.1.0" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", @@ -4071,7 +4807,6 @@ "version": "2.3.2", "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.2.tgz", "integrity": "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w==", - "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.14.1", @@ -4119,7 +4854,6 @@ "version": "0.2.4", "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.4.tgz", "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", - "dev": true, "license": "MIT", "dependencies": { "pathe": "^2.0.2", @@ -4168,6 +4902,22 @@ } } }, + "node_modules/untyped": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/untyped/-/untyped-2.0.0.tgz", + "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "defu": "^6.1.4", + "jiti": "^2.4.2", + "knitwork": "^1.2.0", + "scule": "^1.3.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -4199,6 +4949,13 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "6.3.4", "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.4.tgz", @@ -4432,7 +5189,12 @@ "version": "0.6.2", "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, + "license": "MIT" + }, + "node_modules/weixin-js-sdk": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/weixin-js-sdk/-/weixin-js-sdk-1.6.5.tgz", + "integrity": "sha512-Gph1WAWB2YN/lMOFB/ymb+hbU/wYazzJgu6PMMktCy9cSCeW5wA6Zwt0dpahJbJ+RJEwtTv2x9iIu0U4enuVSQ==", "license": "MIT" }, "node_modules/which": { diff --git a/package.json b/package.json index 5423c0e..3ca1ab1 100644 --- a/package.json +++ b/package.json @@ -12,22 +12,27 @@ }, "dependencies": { "@element-plus/icons-vue": "^2.3.1", - "axios": "^1.9.0", + "axios": "^1.10.0", "echarts": "^5.6.0", "element-plus": "^2.9.9", "pinia": "^3.0.1", + "pinia-plugin-persistedstate": "^4.3.0", + "recordrtc": "^5.6.2", "vue": "^3.5.13", - "vue-router": "^4.5.0" + "vue-router": "^4.5.0", + "weixin-js-sdk": "^1.6.5" }, "devDependencies": { "@tsconfig/node22": "^22.0.1", "@types/axios": "^0.9.36", - "@types/echarts": "^4.9.22", - "@types/node": "^22.14.0", + "@types/echarts": "^4.9.22", + "@types/node": "^22.15.34", + "@types/recordrtc": "^5.6.14", "@vitejs/plugin-vue": "^5.2.3", "@vue/tsconfig": "^0.7.0", "less": "^4.3.0", "npm-run-all2": "^7.0.2", + "sass-embedded": "^1.89.2", "typescript": "~5.8.0", "unplugin-auto-import": "^19.1.2", "unplugin-vue-components": "^28.5.0", diff --git a/public/5.png b/public/5.png new file mode 100644 index 0000000..c123c5e Binary files /dev/null and b/public/5.png differ diff --git a/src/App.vue b/src/App.vue index 38cd007..fa5d5bf 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,7 +3,11 @@ import { RouterLink, RouterView } from 'vue-router' \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 6158c08..42a5c84 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,7 @@ import './assets/main.css' import * as ElementPlusIconsVue from '@element-plus/icons-vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' +import '@/assets/fonts/theFonts.css' import { createApp } from 'vue' import { createPinia } from 'pinia' @@ -15,15 +16,12 @@ const app = createApp(App) for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component) } -app.use(createPinia()) -app.use(router) - -app.mount('#app') - - - +const pinia = createPinia() +app.use(pinia) +app.use(router) +app.mount('#app') app.use(ElementPlus) diff --git a/src/router/index.ts b/src/router/index.ts index beaa195..f4c996e 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -8,6 +8,7 @@ import ChatAi from '@/views/ask/chatAi.vue' import MusicAi from '@/views/ask/musicAi.vue' import My from '@/views/myself/my.vue' import Used from '@/views/myself/used.vue' +import Change from '@/views/myself/change.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -56,6 +57,11 @@ const router = createRouter({ path: '/used', name: 'used', component: Used, + }, + { + path: '/change', + name: 'change', + component: Change } ] }) diff --git a/src/stores/counter.ts b/src/stores/counter.ts deleted file mode 100644 index b6757ba..0000000 --- a/src/stores/counter.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ref, computed } from 'vue' -import { defineStore } from 'pinia' - -export const useCounterStore = defineStore('counter', () => { - const count = ref(0) - const doubleCount = computed(() => count.value * 2) - function increment() { - count.value++ - } - - return { count, doubleCount, increment } -}) diff --git a/src/stores/index.ts b/src/stores/index.ts new file mode 100644 index 0000000..0c7dfda --- /dev/null +++ b/src/stores/index.ts @@ -0,0 +1,8 @@ +import { createPinia } from "pinia"; +import piniaPluginPersistedstate from "pinia-plugin-persistedstate"; + +// pinia persist +const pinia = createPinia(); +pinia.use(piniaPluginPersistedstate); + +export default pinia; diff --git a/src/stores/modules/user.ts b/src/stores/modules/user.ts new file mode 100644 index 0000000..e6fda8f --- /dev/null +++ b/src/stores/modules/user.ts @@ -0,0 +1,277 @@ +import { defineStore } from 'pinia' +import { reqRegister } from '@/api/user/register' +import { reqLogin } from '@/api/user/login' +import { type registerForm, type userRegisterResponseData } from '@/api/user/register/type' +import { type loginForm, type userLoginResponseData } from '@/api/user/login/type' +import { reqAitable } from '@/api/interface' +import { type aiTableForm, type aiResponsePictureData } from '@/api/interface/type' +import { useRouter } from 'vue-router' +import { ElNotification } from 'element-plus' + +// 定义用户状态类型 +interface UserState { + userId: number + token: string + username: string + email: string + sessionId: string + generatedImages: UserImage[] + currentImage: UserImage | null +} + +interface UserImage { + ossUrl: string + createdAt: number +} + +// localStorage键名常量 +const STORAGE_KEYS = { + USER_ID: 'userId', + TOKEN: 'token', + USERNAME: 'username', + EMAIL: 'email', + SESSION_ID: 'sessionId', + GENERATED_IMAGES: 'generatedImages', + CURRENT_IMAGE: 'currentImage' +} + +export const useUserStore = defineStore('user', { + state: (): UserState => ({ + userId: 0, + token: '', + username: '', + email: '', + sessionId: '', + generatedImages: [], + currentImage: null + }), + + actions: { + /** + * 保存用户基本信息到localStorage + */ + saveUserToLocalStorage() { + localStorage.setItem(STORAGE_KEYS.USER_ID, this.userId.toString()) + localStorage.setItem(STORAGE_KEYS.TOKEN, this.token) + localStorage.setItem(STORAGE_KEYS.USERNAME, this.username) + localStorage.setItem(STORAGE_KEYS.EMAIL, this.email) + localStorage.setItem(STORAGE_KEYS.SESSION_ID, this.sessionId) + }, + + /** + * 从localStorage加载用户基本信息 + */ + loadUserFromLocalStorage() { + const userId = localStorage.getItem(STORAGE_KEYS.USER_ID) + const token = localStorage.getItem(STORAGE_KEYS.TOKEN) + const username = localStorage.getItem(STORAGE_KEYS.USERNAME) + const email = localStorage.getItem(STORAGE_KEYS.EMAIL) + const sessionId = localStorage.getItem(STORAGE_KEYS.SESSION_ID) + + if (userId && token) { + this.userId = parseInt(userId) + this.token = token + this.username = username || '' + this.email = email || '' + this.sessionId = sessionId || '' + } + }, + + // 用户注册方法 + async userRegister(data: registerForm) { + try { + const result: userRegisterResponseData = await reqRegister(data) + + if (result.code === 200) { + ElNotification({ + title: '注册成功', + message: '请登录后使用完整功能', + type: 'success', + duration: 3000 + }) + return true + } else { + ElNotification({ + title: '注册失败', + message: result.msg, + type: 'error', + duration: 3000 + }) + } + } catch (error: any) { + console.error('Register request failed:', error) + ElNotification({ + title: '注册异常', + message: error.response?.data?.message || '注册请求失败,请稍后再试', + type: 'error', + duration: 3000 + }) + } + }, + + // 用户登录方法 + async userLogin(data: loginForm) { + try { + const result: userLoginResponseData = await reqLogin(data) + + if (result.code === 200) { + this.userId = result.data.id + this.email = result.data.email + this.username = result.data.username + this.token = result.data.token + this.sessionId = result.data.sessionId + + // 使用新的方法保存用户信息 + this.saveUserToLocalStorage() + this.loadImagesFromStorage() + + ElNotification({ + title: '登录成功', + message: `欢迎回来,${this.username}`, + type: 'success', + duration: 3000 + }) + return true + } else { + ElNotification({ + title: '登录失败', + message: result.msg || '用户不存在或密码错误', + type: 'error', + duration: 3000 + }) + } + } catch (error: any) { + console.error('Login request failed:', error) + ElNotification({ + title: '登录异常', + message: error.response?.data?.message || '登录请求失败,请稍后再试', + type: 'error', + duration: 3000 + }) + } + }, + + // 初始化用户状态 + initUserState() { + this.loadUserFromLocalStorage() + this.loadImagesFromStorage() + }, + + /** + * 从localStorage加载图片数据 + */ + loadImagesFromStorage() { + const imagesJson = localStorage.getItem(STORAGE_KEYS.GENERATED_IMAGES) + if (imagesJson) { + try { + this.generatedImages = JSON.parse(imagesJson) + this.generatedImages.sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0)) + } catch (error) { + console.error('Failed to parse generated images:', error) + this.generatedImages = [] + } + } + + const currentImageJson = localStorage.getItem(STORAGE_KEYS.CURRENT_IMAGE) + if (currentImageJson) { + try { + this.currentImage = JSON.parse(currentImageJson) + } catch (error) { + console.error('Failed to parse current image:', error) + this.currentImage = null + } + } + }, + + /** + * 保存图片数据到localStorage + */ + saveImagesToStorage() { + localStorage.setItem(STORAGE_KEYS.GENERATED_IMAGES, JSON.stringify(this.generatedImages)) + console.log('保存生成的图片到localStorage:', this.generatedImages) + localStorage.setItem(STORAGE_KEYS.CURRENT_IMAGE, JSON.stringify(this.currentImage)) + }, + + + // 生成图片方法 + async generateImage(prompt: string) { + try { + const requestData: aiTableForm = { + picture: prompt, + userId: this.userId.toString(), + sessionId: this.sessionId, + token: this.token + } + + const response: aiResponsePictureData = await reqAitable(requestData) + + if (response.code === 200 && response.data) { + const newImage: UserImage = { + ossUrl: response.data, + createdAt: Date.now() + } + + this.generatedImages.unshift(newImage) + this.currentImage = newImage + this.saveImagesToStorage() + + ElNotification({ + title: '图片生成成功', + message: '已生成新图片', + type: 'success', + duration: 3000 + }) + + return newImage.ossUrl + } else { + throw new Error(response.msg || '图片生成失败') + } + } catch (error: any) { + ElNotification({ + title: '生成失败', + message: error.message, + type: 'error', + duration: 3000 + }) + throw error + } + }, + + // 设置当前显示的图片 + setCurrentImage(imageUrl: string) { + const image = this.generatedImages.find(img => img.ossUrl === imageUrl) + if (image) { + this.currentImage = image + localStorage.setItem(STORAGE_KEYS.CURRENT_IMAGE, JSON.stringify(image)) + } + }, + + // 清除用户数据 + clearUserData() { + this.$reset() + Object.values(STORAGE_KEYS).forEach(key => localStorage.removeItem(key)) + } + }, + + getters: { + // 判断用户是否已登录 + isLoggedIn(): boolean { + return !!this.token && !!this.userId && !!this.username && !!this.email + }, + + // 获取当前用户的所有图片 + allImages(): UserImage[] { + return this.generatedImages + }, + + // 获取当前显示的图片 + displayedImage(): string | undefined { + return this.currentImage?.ossUrl + }, + + // 检查是否有生成记录 + hasGeneratedImages(): boolean { + return this.generatedImages.length > 0 + } + } +}) \ No newline at end of file diff --git a/src/types/amap.d.ts b/src/types/amap.d.ts new file mode 100644 index 0000000..d2f1030 --- /dev/null +++ b/src/types/amap.d.ts @@ -0,0 +1,71 @@ +// types/amap.d.ts +declare global { + namespace AMap { + // 基础类 + class Map { + constructor(container: HTMLElement, options?: MapOptions); + destroy(): void; + add(overlay: Overlay): void; + setCenter(lnglat: LngLat | [number, number]): void; + setZoom(zoom: number): void; + } + class Marker { + constructor(options?: MarkerOptions); + on(event: string, callback: (event: MapsEvent) => void): void; + getPosition(): LngLat; + setPosition(lnglat: LngLat | [number, number]): void; + } + class InfoWindow { + constructor(options?: InfoWindowOptions); + open(map: Map, position: LngLat | [number, number]): void; + } + class Polyline { + constructor(options?: PolylineOptions); + } + class LngLat { + constructor(lng: number, lat: number); + } + class Pixel { + constructor(x: number, y: number); + } + + // 配置接口 + interface MapOptions { + zoom?: number; + center?: LngLat | [number, number]; + resizeEnable?: boolean; + } + interface MarkerOptions { + position?: LngLat | [number, number]; + icon?: string; + offset?: Pixel; + } + interface InfoWindowOptions { + isCustom?: boolean; + content?: string; + offset?: Pixel; + } + interface PolylineOptions { + path?: (LngLat | [number, number])[]; + strokeColor?: string; + strokeWeight?: number; + strokeStyle?: string; + } + interface MapsEvent { + target: Marker; + } + + // 全局暴露 + const Map: typeof Map; + const Marker: typeof Marker; + const InfoWindow: typeof InfoWindow; + const Polyline: typeof Polyline; + const LngLat: typeof LngLat; + const Pixel: typeof Pixel; + } + + // 全局变量 + const AMap: typeof AMap; +} + +export {}; \ No newline at end of file diff --git a/src/utils/request.ts b/src/utils/request.ts index e05b30c..b3a335c 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -14,6 +14,7 @@ let request = axios.create({ //添加请求与响应拦截器 request.interceptors.request.use((config) => { //config配置对象有headers属性请求头,配置一些公共参数 + //返回配置对象 return config; }) @@ -58,5 +59,5 @@ request.interceptors.response.use( return Promise.reject(error); }) - // 对外暴露 +// 对外暴露 export default request; \ No newline at end of file diff --git a/src/utils/ws.ts b/src/utils/ws.ts new file mode 100644 index 0000000..95cbc5a --- /dev/null +++ b/src/utils/ws.ts @@ -0,0 +1,145 @@ +import { ref, onBeforeUnmount } from 'vue' +import { ElMessage } from 'element-plus' + +export interface WebSocketMessage { + userId: number + latitude: number + longitude: number + recordTime: string +} + +export interface WebSocketResponse { + trackId?: string + status?: string + recordTime?: string + remark?: string +} + +export class RealtimeLocationWS { + private ws: WebSocket | null = null + private sid: string + private userId: number + private wsUrl: string + private retryCount = 0 + private maxRetryCount = 3 + private retryTimer: number | null = null + private messageHandler: ((data: WebSocketResponse) => void) | null = null + + public connected = ref(false) + + constructor(userId: number, host: string, onMessage?: (data: WebSocketResponse) => void) { + this.userId = userId + this.sid = this.generateSessionId() + this.wsUrl = `ws://${host}/realtime/${this.sid}` + this.messageHandler = onMessage || null + this.connect() + } + + private generateSessionId(): string { + return 'sid-' + Math.random().toString(36).substr(2, 9) + Date.now().toString(36) + } + + public connect(): void { + if (this.connected.value) return + + try { + this.ws = new WebSocket(this.wsUrl) + + this.ws.onopen = () => { + this.connected.value = true + this.retryCount = 0 + console.log('WebSocket连接已建立') + } + + this.ws.onmessage = (event) => { + try { + const response: WebSocketResponse = JSON.parse(event.data) + console.log('收到服务端响应:', response) + this.messageHandler?.(response) + } catch (error) { + console.error('解析WebSocket消息失败:', error) + } + } + + this.ws.onerror = (error) => { + console.error('WebSocket错误:', error) + this.reconnect() + } + + this.ws.onclose = () => { + this.connected.value = false + console.log('WebSocket连接已关闭') + this.reconnect() + } + } catch (error) { + console.error('WebSocket初始化失败:', error) + this.reconnect() + } + } + + private reconnect(): void { + if (this.retryCount >= this.maxRetryCount) { + console.error(`已达到最大重试次数(${this.maxRetryCount}),停止重连`) + ElMessage.warning('位置服务连接失败,请刷新页面重试') + return + } + + this.retryCount++ + const delay = Math.min(1000 * 2 ** this.retryCount, 30000) // 指数退避,最大30秒 + + console.log(`将在${delay}ms后尝试第${this.retryCount}次重连...`) + this.retryTimer = window.setTimeout(() => { + this.connect() + }, delay) + } + + public sendLocation(position: [number, number]): boolean { + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { + console.warn('WebSocket未连接,无法发送位置数据') + return false + } + + const [longitude, latitude] = position + const message: WebSocketMessage = { + userId: this.userId, + latitude, + longitude, + recordTime: new Date().toISOString().split('.')[0] // ISO8601格式,去掉毫秒部分 + } + + try { + this.ws.send(JSON.stringify(message)) + console.log('已发送位置数据:', message) + return true + } catch (error) { + console.error('发送位置数据失败:', error) + return false + } + } + + public close(): void { + if (this.retryTimer) { + clearTimeout(this.retryTimer) + this.retryTimer = null + } + + if (this.ws) { + this.ws.close() + this.ws = null + } + + this.connected.value = false + } +} + +// 导出一个创建WebSocket实例的函数 +export function useRealtimeLocationWS(userId: number, host: string, onMessage?: (data: WebSocketResponse) => void) { + const wsInstance = new RealtimeLocationWS(userId, host, onMessage) + + // 自动在组件卸载时关闭连接 + onBeforeUnmount(() => { + wsInstance.close() + }) + + return wsInstance +} \ No newline at end of file diff --git a/src/views/ask/chatAi.vue b/src/views/ask/chatAi.vue index 4e1c891..b86c197 100644 --- a/src/views/ask/chatAi.vue +++ b/src/views/ask/chatAi.vue @@ -57,10 +57,10 @@ - + - user + {{ userStore.username || 'user' }} @@ -71,7 +71,7 @@
-

{{ userThing }}

+

{{ userThing.question }}

user
@@ -117,11 +117,11 @@ import { onMounted, ref, watch } from 'vue' import { getTimeState } from '@/utils/index' import { ElMessage } from 'element-plus' -import router from '@/router' -import axios from 'axios' import { reqAiChat } from '@/api/interface' +import { useUserStore } from '@/stores/modules/user' +import { type aiChatForm } from '@/api/interface/type' +import { useRouter } from 'vue-router' -const baseURL = '' //侧边栏开合 const isCollapse = ref(false) @@ -140,50 +140,68 @@ onMounted(() => { console.log(thisTimeState.value) }) + /*网页全屏*/ +const handleFullscreen = () => { + document.documentElement.requestFullscreen() +} + /*对话框写入部分*/ const text = ref() const isShow = ref(false) const handleEnter = (event: KeyboardEvent) => { - // 如果按下Shift+Enter则插入换行 - if (event.shiftKey) { - return - } - // 否则阻止默认行为(不换行) + if (event.shiftKey) return event.preventDefault() + submitClick() // 回车触发提交 } /*对话框交互部分*/ +// 获取用户状态 +const userStore = useUserStore() +const userId = userStore.userId.toString() +const sessionId = userStore.sessionId + const backThing = ref() -const userThing = ref() -watch(userThing, async (newValue) => { - if (newValue.trim()) { - backThing.value = '思考中...' - backThing.value = await reqAiChat(newValue.trim()) - .then((res) => { - if (res.code === 200) { - return res.Respond - } else { - ElMessage.error('请求失败,请稍后再试') - return '请求失败,请稍后再试' - } - }) - .catch((error) => { - console.error('请求错误:', error) - ElMessage.error('请求错误,请稍后再试') - return '请求错误,请稍后再试' - }) - } +const userThing = ref({ + question: text.value ?? '', + userId: userId, // 默认用1或默认userId + sessionId: sessionId, + token: userStore.token }) -const submitClick = (): void => { + + +const submitClick = async (): Promise => { const inputValue = text.value.trim() if (!inputValue) { ElMessage.warning('请输入内容') return } - - userThing.value = inputValue - text.value = '' + isShow.value = true + + try { + backThing.value = '思考中...' + userThing.value.question = inputValue // 更新用户输入内容 + + const res = await reqAiChat({ + question: inputValue, + userId: userId, + sessionId: sessionId, + token: userStore.token + }) + + if (res.code === 200) { + backThing.value = res.data.Respond + } else { + ElMessage.error(res.msg || '请求失败,请稍后再试') + backThing.value = '请求失败,请稍后再试' + } + } catch (error) { + console.error('请求错误:', error) + ElMessage.error('请求错误,请稍后再试') + backThing.value = '请求错误,请稍后再试' + } finally { + text.value = '' + } } diff --git a/src/views/ask/musicAi.vue b/src/views/ask/musicAi.vue index fd0ceb7..3dd725b 100644 --- a/src/views/ask/musicAi.vue +++ b/src/views/ask/musicAi.vue @@ -57,25 +57,58 @@ - + - user + {{ userStore.username || 'user' }}
- - - -
- +
+ + +

发送了一条音频

+
+ user +
+
+ +
+ + AI + +

{{ backThing }}

+
+
+
+ + + +
+

录音时长: {{ duration }}秒

+

文件大小: {{ fileSize }}KB

+ +
+
+ + 暂无录音内容 +
+
+ +
+ + 点我录制 + + + 点我停止 + + + 点我重录 + +
@@ -93,10 +126,16 @@ diff --git a/src/views/ask/tableAi.vue b/src/views/ask/tableAi.vue index 7689a8b..8600fcb 100644 --- a/src/views/ask/tableAi.vue +++ b/src/views/ask/tableAi.vue @@ -56,18 +56,43 @@ {{ thisTimeState }} - - + + - user + {{ userStore.username || 'user' }}
+ +
+ + +

{{ userThing.picture }}

+
+ user +
+
+ +
+ + AI + + + + + +
+ { console.log(key, keyPath) @@ -118,30 +146,57 @@ const handleFullscreen = () => { document.documentElement.requestFullscreen() } +/*对话框写入部分*/ const text = ref() +const isShow = ref(false) + const handleEnter = (event: KeyboardEvent) => { - // 如果按下Shift+Enter则插入换行 - if (event.shiftKey) { - return + if (!event.shiftKey) { + event.preventDefault() + submitClick() } - // 否则阻止默认行为(不换行) - event.preventDefault() } -const submitClick = () => { - if(text.value.trim() == 0) { - ElMessage.warning("请输入东西哦亲") - }else{ - - } - - - +/*对话框交互部分*/ +// 获取用户状态 +const userStore = useUserStore() +const userId = userStore.userId.toString() + +const backThing = ref() +const userThing = ref({ + picture: text.value, + userId: userId , + sessionId: userStore.sessionId, + token: userStore.token +}) - ElMessage.success("正在为您生成计划") -} +const submitClick = async () => { + const inputValue = text.value.trim() + if (!inputValue) { + ElMessage.warning('请输入图片描述') + return + } + try { + isShow.value = true + userThing.value.picture = inputValue + backThing.value = '思考中...' + + // 使用store中的方法生成图片 + const imageData = await userStore.generateImage(inputValue) + backThing.value = imageData + + ElMessage.success('图片生成成功') + console.log('生成的图片:', imageData) // 打印生成的图片数据 + text.value = '' + } catch (error: any) { + console.error('图片生成失败:', error) + ElMessage.error(error.message || '图片生成失败') + backThing.value = '' + } finally { + } +} \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 50a6d63..7cda6b6 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,162 +1,352 @@ + + - \ No newline at end of file + \ No newline at end of file diff --git a/src/views/myself/change.vue b/src/views/myself/change.vue new file mode 100644 index 0000000..ed277e5 --- /dev/null +++ b/src/views/myself/change.vue @@ -0,0 +1,216 @@ + + + + \ No newline at end of file diff --git a/src/views/myself/my.vue b/src/views/myself/my.vue index 9dab16b..3e9b6bb 100644 --- a/src/views/myself/my.vue +++ b/src/views/myself/my.vue @@ -1,8 +1,6 @@ - + \ No newline at end of file diff --git a/src/views/myself/used.vue b/src/views/myself/used.vue index 365a84c..7e46baf 100644 --- a/src/views/myself/used.vue +++ b/src/views/myself/used.vue @@ -1,110 +1,161 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/views/table/index.vue b/src/views/table/index.vue index 184f539..ae91922 100644 --- a/src/views/table/index.vue +++ b/src/views/table/index.vue @@ -1,8 +1,6 @@ \ No newline at end of file