Commit c856c3a6 authored by shirlyn.guo's avatar shirlyn.guo 👌🏻

Merge branch 'master' of https://gitlab.gsstcloud.com/poc/poc-fe into shirlyn

parents fc6952f6 4afb6b26
...@@ -26,6 +26,7 @@ export default [ ...@@ -26,6 +26,7 @@ export default [
ConversationMessageItemInfo: 'readonly', ConversationMessageItemInfo: 'readonly',
MittEvents: 'readonly', MittEvents: 'readonly',
I18n: 'readonly', I18n: 'readonly',
google: 'readonly',
}, },
parser: vueParser, parser: vueParser,
parserOptions: { parserOptions: {
......
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="mobile-web-app-capable" content="yes" />
<meta <meta
name="viewport" name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"
/> />
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4711453_n5pnpk71gp.css" /> <link rel="stylesheet" href="//at.alicdn.com/t/c/font_4711453_j7wtxbx0oer.css" />
<title>Model Link</title> <title>Model Link</title>
</head> </head>
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
"spark-md5": "^3.0.2", "spark-md5": "^3.0.2",
"type-fest": "^4.26.1", "type-fest": "^4.26.1",
"validator": "^13.12.0", "validator": "^13.12.0",
"vue": "^3.5.12", "vue": "^3.5.13",
"vue-i18n": "^9.14.0", "vue-i18n": "^9.14.0",
"vue-router": "^4.4.5" "vue-router": "^4.4.5"
}, },
......
...@@ -10,10 +10,10 @@ importers: ...@@ -10,10 +10,10 @@ importers:
dependencies: dependencies:
'@icon-park/vue-next': '@icon-park/vue-next':
specifier: ^1.4.2 specifier: ^1.4.2
version: 1.4.2(vue@3.5.12(typescript@5.6.2)) version: 1.4.2(vue@3.5.13(typescript@5.6.2))
'@iconify/vue': '@iconify/vue':
specifier: ^4.1.2 specifier: ^4.1.2
version: 4.1.2(vue@3.5.12(typescript@5.6.2)) version: 4.1.2(vue@3.5.13(typescript@5.6.2))
'@microsoft/fetch-event-source': '@microsoft/fetch-event-source':
specifier: ^2.0.1 specifier: ^2.0.1
version: 2.0.1 version: 2.0.1
...@@ -22,7 +22,7 @@ importers: ...@@ -22,7 +22,7 @@ importers:
version: 0.61.9 version: 0.61.9
'@vueuse/core': '@vueuse/core':
specifier: ^10.11.1 specifier: ^10.11.1
version: 10.11.1(vue@3.5.12(typescript@5.6.2)) version: 10.11.1(vue@3.5.13(typescript@5.6.2))
axios: axios:
specifier: ^1.7.7 specifier: ^1.7.7
version: 1.7.7 version: 1.7.7
...@@ -70,7 +70,7 @@ importers: ...@@ -70,7 +70,7 @@ importers:
version: 5.0.7 version: 5.0.7
pinia: pinia:
specifier: ^2.2.2 specifier: ^2.2.2
version: 2.2.2(typescript@5.6.2)(vue@3.5.12(typescript@5.6.2)) version: 2.2.2(typescript@5.6.2)(vue@3.5.13(typescript@5.6.2))
spark-md5: spark-md5:
specifier: ^3.0.2 specifier: ^3.0.2
version: 3.0.2 version: 3.0.2
...@@ -81,14 +81,14 @@ importers: ...@@ -81,14 +81,14 @@ importers:
specifier: ^13.12.0 specifier: ^13.12.0
version: 13.12.0 version: 13.12.0
vue: vue:
specifier: ^3.5.12 specifier: ^3.5.13
version: 3.5.12(typescript@5.6.2) version: 3.5.13(typescript@5.6.2)
vue-i18n: vue-i18n:
specifier: ^9.14.0 specifier: ^9.14.0
version: 9.14.0(vue@3.5.12(typescript@5.6.2)) version: 9.14.0(vue@3.5.13(typescript@5.6.2))
vue-router: vue-router:
specifier: ^4.4.5 specifier: ^4.4.5
version: 4.4.5(vue@3.5.12(typescript@5.6.2)) version: 4.4.5(vue@3.5.13(typescript@5.6.2))
devDependencies: devDependencies:
'@commitlint/cli': '@commitlint/cli':
specifier: ^19.5.0 specifier: ^19.5.0
...@@ -101,7 +101,7 @@ importers: ...@@ -101,7 +101,7 @@ importers:
version: 19.5.0 version: 19.5.0
'@intlify/unplugin-vue-i18n': '@intlify/unplugin-vue-i18n':
specifier: ^4.0.0 specifier: ^4.0.0
version: 4.0.0(rollup@4.21.3)(vue-i18n@9.14.0(vue@3.5.12(typescript@5.6.2)))(webpack-sources@3.2.3) version: 4.0.0(rollup@4.21.3)(vue-i18n@9.14.0(vue@3.5.13(typescript@5.6.2)))(webpack-sources@3.2.3)
'@types/howler': '@types/howler':
specifier: ^2.2.12 specifier: ^2.2.12
version: 2.2.12 version: 2.2.12
...@@ -119,31 +119,31 @@ importers: ...@@ -119,31 +119,31 @@ importers:
version: 13.12.2 version: 13.12.2
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^7.18.0 specifier: ^7.18.0
version: 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) version: 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
'@unocss/eslint-config': '@unocss/eslint-config':
specifier: ^0.61.9 specifier: ^0.61.9
version: 0.61.9(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) version: 0.61.9(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
'@vitejs/plugin-vue': '@vitejs/plugin-vue':
specifier: ^4.6.2 specifier: ^4.6.2
version: 4.6.2(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue@3.5.12(typescript@5.6.2)) version: 4.6.2(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue@3.5.13(typescript@5.6.2))
'@vitejs/plugin-vue-jsx': '@vitejs/plugin-vue-jsx':
specifier: ^4.0.1 specifier: ^4.0.1
version: 4.0.1(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue@3.5.12(typescript@5.6.2)) version: 4.0.1(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue@3.5.13(typescript@5.6.2))
autoprefixer: autoprefixer:
specifier: ^10.4.20 specifier: ^10.4.20
version: 10.4.20(postcss@8.4.47) version: 10.4.20(postcss@8.4.47)
eslint: eslint:
specifier: ^9.10.0 specifier: ^9.10.0
version: 9.10.0(jiti@2.0.0-beta.3) version: 9.10.0(jiti@1.21.6)
eslint-config-prettier: eslint-config-prettier:
specifier: ^9.1.0 specifier: ^9.1.0
version: 9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3)) version: 9.1.0(eslint@9.10.0(jiti@1.21.6))
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.2.1 specifier: ^5.2.1
version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3)))(eslint@9.10.0(jiti@2.0.0-beta.3))(prettier@3.3.3) version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@1.21.6)))(eslint@9.10.0(jiti@1.21.6))(prettier@3.3.3)
eslint-plugin-vue: eslint-plugin-vue:
specifier: ^9.28.0 specifier: ^9.28.0
version: 9.28.0(eslint@9.10.0(jiti@2.0.0-beta.3)) version: 9.28.0(eslint@9.10.0(jiti@1.21.6))
globals: globals:
specifier: ^15.9.0 specifier: ^15.9.0
version: 15.9.0 version: 15.9.0
...@@ -155,7 +155,7 @@ importers: ...@@ -155,7 +155,7 @@ importers:
version: 15.2.10 version: 15.2.10
naive-ui: naive-ui:
specifier: ^2.39.0 specifier: ^2.39.0
version: 2.39.0(vue@3.5.12(typescript@5.6.2)) version: 2.39.0(vue@3.5.13(typescript@5.6.2))
postcss: postcss:
specifier: ^8.4.47 specifier: ^8.4.47
version: 8.4.47 version: 8.4.47
...@@ -200,28 +200,28 @@ importers: ...@@ -200,28 +200,28 @@ importers:
version: 5.6.2 version: 5.6.2
typescript-eslint: typescript-eslint:
specifier: ^7.18.0 specifier: ^7.18.0
version: 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) version: 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
unocss: unocss:
specifier: ^0.61.9 specifier: ^0.61.9
version: 0.61.9(postcss@8.4.47)(rollup@4.21.3)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) version: 0.61.9(postcss@8.4.47)(rollup@4.21.3)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))
unplugin-auto-import: unplugin-auto-import:
specifier: ^0.17.8 specifier: ^0.17.8
version: 0.17.8(@vueuse/core@10.11.1(vue@3.5.12(typescript@5.6.2)))(rollup@4.21.3)(webpack-sources@3.2.3) version: 0.17.8(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.6.2)))(rollup@4.21.3)(webpack-sources@3.2.3)
unplugin-vue-components: unplugin-vue-components:
specifier: ^0.26.0 specifier: ^0.26.0
version: 0.26.0(@babel/parser@7.25.8)(rollup@4.21.3)(vue@3.5.12(typescript@5.6.2))(webpack-sources@3.2.3) version: 0.26.0(@babel/parser@7.26.3)(rollup@4.21.3)(vue@3.5.13(typescript@5.6.2))(webpack-sources@3.2.3)
vite: vite:
specifier: ^5.4.6 specifier: ^5.4.6
version: 5.4.6(@types/node@20.16.5)(sass@1.79.1) version: 5.4.6(@types/node@20.16.5)(sass@1.79.1)
vite-plugin-checker: vite-plugin-checker:
specifier: ^0.7.2 specifier: ^0.7.2
version: 0.7.2(eslint@9.10.0(jiti@2.0.0-beta.3))(meow@13.2.0)(optionator@0.9.4)(stylelint@16.9.0(typescript@5.6.2))(typescript@5.6.2)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue-tsc@2.0.29(typescript@5.6.2)) version: 0.7.2(eslint@9.10.0(jiti@1.21.6))(optionator@0.9.4)(stylelint@16.9.0(typescript@5.6.2))(typescript@5.6.2)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue-tsc@2.0.29(typescript@5.6.2))
vite-svg-loader: vite-svg-loader:
specifier: ^5.1.0 specifier: ^5.1.0
version: 5.1.0(vue@3.5.12(typescript@5.6.2)) version: 5.1.0(vue@3.5.13(typescript@5.6.2))
vue-eslint-parser: vue-eslint-parser:
specifier: ^9.4.3 specifier: ^9.4.3
version: 9.4.3(eslint@9.10.0(jiti@2.0.0-beta.3)) version: 9.4.3(eslint@9.10.0(jiti@1.21.6))
vue-tsc: vue-tsc:
specifier: ^2.0.29 specifier: ^2.0.29
version: 2.0.29(typescript@5.6.2) version: 2.0.29(typescript@5.6.2)
...@@ -304,12 +304,12 @@ packages: ...@@ -304,12 +304,12 @@ packages:
resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/helper-string-parser@7.25.7': '@babel/helper-string-parser@7.25.9':
resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.25.7': '@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/helper-validator-option@7.24.8': '@babel/helper-validator-option@7.24.8':
...@@ -334,6 +334,11 @@ packages: ...@@ -334,6 +334,11 @@ packages:
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
hasBin: true hasBin: true
'@babel/parser@7.26.3':
resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/plugin-syntax-jsx@7.24.7': '@babel/plugin-syntax-jsx@7.24.7':
resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
...@@ -380,6 +385,10 @@ packages: ...@@ -380,6 +385,10 @@ packages:
resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/types@7.26.3':
resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
engines: {node: '>=6.9.0'}
'@commitlint/cli@19.5.0': '@commitlint/cli@19.5.0':
resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==}
engines: {node: '>=v18'} engines: {node: '>=v18'}
...@@ -1230,26 +1239,26 @@ packages: ...@@ -1230,26 +1239,26 @@ packages:
peerDependencies: peerDependencies:
'@babel/core': ^7.0.0-0 '@babel/core': ^7.0.0-0
'@vue/compiler-core@3.5.12': '@vue/compiler-core@3.5.13':
resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
'@vue/compiler-core@3.5.6': '@vue/compiler-core@3.5.6':
resolution: {integrity: sha512-r+gNu6K4lrvaQLQGmf+1gc41p3FO2OUJyWmNqaIITaJU6YFiV5PtQSFZt8jfztYyARwqhoCayjprC7KMvT3nRA==} resolution: {integrity: sha512-r+gNu6K4lrvaQLQGmf+1gc41p3FO2OUJyWmNqaIITaJU6YFiV5PtQSFZt8jfztYyARwqhoCayjprC7KMvT3nRA==}
'@vue/compiler-dom@3.5.12': '@vue/compiler-dom@3.5.13':
resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==} resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
'@vue/compiler-dom@3.5.6': '@vue/compiler-dom@3.5.6':
resolution: {integrity: sha512-xRXqxDrIqK8v8sSScpistyYH0qYqxakpsIvqMD2e5sV/PXQ1mTwtXp4k42yHK06KXxKSmitop9e45Ui/3BrTEw==} resolution: {integrity: sha512-xRXqxDrIqK8v8sSScpistyYH0qYqxakpsIvqMD2e5sV/PXQ1mTwtXp4k42yHK06KXxKSmitop9e45Ui/3BrTEw==}
'@vue/compiler-sfc@3.5.12': '@vue/compiler-sfc@3.5.13':
resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==} resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
'@vue/compiler-sfc@3.5.6': '@vue/compiler-sfc@3.5.6':
resolution: {integrity: sha512-pjWJ8Kj9TDHlbF5LywjVso+BIxCY5wVOLhkEXRhuCHDxPFIeX1zaFefKs8RYoHvkSMqRWt93a0f2gNJVJixHwg==} resolution: {integrity: sha512-pjWJ8Kj9TDHlbF5LywjVso+BIxCY5wVOLhkEXRhuCHDxPFIeX1zaFefKs8RYoHvkSMqRWt93a0f2gNJVJixHwg==}
'@vue/compiler-ssr@3.5.12': '@vue/compiler-ssr@3.5.13':
resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==} resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
'@vue/compiler-ssr@3.5.6': '@vue/compiler-ssr@3.5.6':
resolution: {integrity: sha512-VpWbaZrEOCqnmqjE83xdwegtr5qO/2OPUC6veWgvNqTJ3bYysz6vY3VqMuOijubuUYPRpG3OOKIh9TD0Stxb9A==} resolution: {integrity: sha512-VpWbaZrEOCqnmqjE83xdwegtr5qO/2OPUC6veWgvNqTJ3bYysz6vY3VqMuOijubuUYPRpG3OOKIh9TD0Stxb9A==}
...@@ -1268,22 +1277,22 @@ packages: ...@@ -1268,22 +1277,22 @@ packages:
typescript: typescript:
optional: true optional: true
'@vue/reactivity@3.5.12': '@vue/reactivity@3.5.13':
resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==} resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
'@vue/runtime-core@3.5.12': '@vue/runtime-core@3.5.13':
resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==} resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
'@vue/runtime-dom@3.5.12': '@vue/runtime-dom@3.5.13':
resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==} resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
'@vue/server-renderer@3.5.12': '@vue/server-renderer@3.5.13':
resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==} resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
peerDependencies: peerDependencies:
vue: 3.5.12 vue: 3.5.13
'@vue/shared@3.5.12': '@vue/shared@3.5.13':
resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
'@vue/shared@3.5.6': '@vue/shared@3.5.6':
resolution: {integrity: sha512-eidH0HInnL39z6wAt6SFIwBrvGOpDWsDxlw3rCgo1B+CQ1781WzQUSU3YjxgdkcJo9Q8S6LmXTkvI+cLHGkQfA==} resolution: {integrity: sha512-eidH0HInnL39z6wAt6SFIwBrvGOpDWsDxlw3rCgo1B+CQ1781WzQUSU3YjxgdkcJo9Q8S6LmXTkvI+cLHGkQfA==}
...@@ -2289,8 +2298,8 @@ packages: ...@@ -2289,8 +2298,8 @@ packages:
magic-string@0.30.11: magic-string@0.30.11:
resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
magic-string@0.30.12: magic-string@0.30.17:
resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
marked-highlight@2.2.1: marked-highlight@2.2.1:
resolution: {integrity: sha512-SiCIeEiQbs9TxGwle9/OwbOejHCZsohQRaNTY2u8euEXYt2rYUFoiImUirThU3Gd/o6Q1gHGtH9qloHlbJpNIA==} resolution: {integrity: sha512-SiCIeEiQbs9TxGwle9/OwbOejHCZsohQRaNTY2u8euEXYt2rYUFoiImUirThU3Gd/o6Q1gHGtH9qloHlbJpNIA==}
...@@ -2382,6 +2391,11 @@ packages: ...@@ -2382,6 +2391,11 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true hasBin: true
nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nanoid@5.0.7: nanoid@5.0.7:
resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==}
engines: {node: ^18 || >=20} engines: {node: ^18 || >=20}
...@@ -2496,6 +2510,9 @@ packages: ...@@ -2496,6 +2510,9 @@ packages:
picocolors@1.1.0: picocolors@1.1.0:
resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@2.3.1: picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
...@@ -2564,6 +2581,10 @@ packages: ...@@ -2564,6 +2581,10 @@ packages:
resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
postcss@8.4.49:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1: prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
...@@ -3209,8 +3230,8 @@ packages: ...@@ -3209,8 +3230,8 @@ packages:
peerDependencies: peerDependencies:
typescript: '>=5.0.0' typescript: '>=5.0.0'
vue@3.5.12: vue@3.5.13:
resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==} resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
peerDependenciesMeta: peerDependenciesMeta:
...@@ -3310,7 +3331,7 @@ snapshots: ...@@ -3310,7 +3331,7 @@ snapshots:
'@babel/code-frame@7.24.7': '@babel/code-frame@7.24.7':
dependencies: dependencies:
'@babel/highlight': 7.24.7 '@babel/highlight': 7.24.7
picocolors: 1.1.0 picocolors: 1.1.1
'@babel/compat-data@7.25.4': {} '@babel/compat-data@7.25.4': {}
...@@ -3343,7 +3364,7 @@ snapshots: ...@@ -3343,7 +3364,7 @@ snapshots:
'@babel/helper-annotate-as-pure@7.24.7': '@babel/helper-annotate-as-pure@7.24.7':
dependencies: dependencies:
'@babel/types': 7.25.8 '@babel/types': 7.26.3
'@babel/helper-compilation-targets@7.25.2': '@babel/helper-compilation-targets@7.25.2':
dependencies: dependencies:
...@@ -3369,7 +3390,7 @@ snapshots: ...@@ -3369,7 +3390,7 @@ snapshots:
'@babel/helper-member-expression-to-functions@7.24.8': '@babel/helper-member-expression-to-functions@7.24.8':
dependencies: dependencies:
'@babel/traverse': 7.25.6 '@babel/traverse': 7.25.6
'@babel/types': 7.25.8 '@babel/types': 7.26.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
...@@ -3385,14 +3406,14 @@ snapshots: ...@@ -3385,14 +3406,14 @@ snapshots:
'@babel/core': 7.25.2 '@babel/core': 7.25.2
'@babel/helper-module-imports': 7.24.7 '@babel/helper-module-imports': 7.24.7
'@babel/helper-simple-access': 7.24.7 '@babel/helper-simple-access': 7.24.7
'@babel/helper-validator-identifier': 7.25.7 '@babel/helper-validator-identifier': 7.25.9
'@babel/traverse': 7.25.6 '@babel/traverse': 7.25.6
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/helper-optimise-call-expression@7.24.7': '@babel/helper-optimise-call-expression@7.24.7':
dependencies: dependencies:
'@babel/types': 7.25.8 '@babel/types': 7.26.3
'@babel/helper-plugin-utils@7.24.8': {} '@babel/helper-plugin-utils@7.24.8': {}
...@@ -3415,13 +3436,13 @@ snapshots: ...@@ -3415,13 +3436,13 @@ snapshots:
'@babel/helper-skip-transparent-expression-wrappers@7.24.7': '@babel/helper-skip-transparent-expression-wrappers@7.24.7':
dependencies: dependencies:
'@babel/traverse': 7.25.6 '@babel/traverse': 7.25.6
'@babel/types': 7.25.8 '@babel/types': 7.26.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/helper-string-parser@7.25.7': {} '@babel/helper-string-parser@7.25.9': {}
'@babel/helper-validator-identifier@7.25.7': {} '@babel/helper-validator-identifier@7.25.9': {}
'@babel/helper-validator-option@7.24.8': {} '@babel/helper-validator-option@7.24.8': {}
...@@ -3432,19 +3453,23 @@ snapshots: ...@@ -3432,19 +3453,23 @@ snapshots:
'@babel/highlight@7.24.7': '@babel/highlight@7.24.7':
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.25.7 '@babel/helper-validator-identifier': 7.25.9
chalk: 2.4.2 chalk: 2.4.2
js-tokens: 4.0.0 js-tokens: 4.0.0
picocolors: 1.1.0 picocolors: 1.1.1
'@babel/parser@7.25.6': '@babel/parser@7.25.6':
dependencies: dependencies:
'@babel/types': 7.25.8 '@babel/types': 7.26.3
'@babel/parser@7.25.8': '@babel/parser@7.25.8':
dependencies: dependencies:
'@babel/types': 7.25.8 '@babel/types': 7.25.8
'@babel/parser@7.26.3':
dependencies:
'@babel/types': 7.26.3
'@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)':
dependencies: dependencies:
'@babel/core': 7.25.2 '@babel/core': 7.25.2
...@@ -3493,14 +3518,14 @@ snapshots: ...@@ -3493,14 +3518,14 @@ snapshots:
'@babel/template@7.25.0': '@babel/template@7.25.0':
dependencies: dependencies:
'@babel/code-frame': 7.24.7 '@babel/code-frame': 7.24.7
'@babel/parser': 7.25.8 '@babel/parser': 7.26.3
'@babel/types': 7.25.8 '@babel/types': 7.25.8
'@babel/traverse@7.25.6': '@babel/traverse@7.25.6':
dependencies: dependencies:
'@babel/code-frame': 7.24.7 '@babel/code-frame': 7.24.7
'@babel/generator': 7.25.6 '@babel/generator': 7.25.6
'@babel/parser': 7.25.8 '@babel/parser': 7.26.3
'@babel/template': 7.25.0 '@babel/template': 7.25.0
'@babel/types': 7.25.8 '@babel/types': 7.25.8
debug: 4.3.7 debug: 4.3.7
...@@ -3510,10 +3535,15 @@ snapshots: ...@@ -3510,10 +3535,15 @@ snapshots:
'@babel/types@7.25.8': '@babel/types@7.25.8':
dependencies: dependencies:
'@babel/helper-string-parser': 7.25.7 '@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.7 '@babel/helper-validator-identifier': 7.25.9
to-fast-properties: 2.0.0 to-fast-properties: 2.0.0
'@babel/types@7.26.3':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
'@commitlint/cli@19.5.0(@types/node@20.16.5)(typescript@5.6.2)': '@commitlint/cli@19.5.0(@types/node@20.16.5)(typescript@5.6.2)':
dependencies: dependencies:
'@commitlint/format': 19.5.0 '@commitlint/format': 19.5.0
...@@ -3628,9 +3658,9 @@ snapshots: ...@@ -3628,9 +3658,9 @@ snapshots:
dependencies: dependencies:
css-render: 0.15.14 css-render: 0.15.14
'@css-render/vue3-ssr@0.15.14(vue@3.5.12(typescript@5.6.2))': '@css-render/vue3-ssr@0.15.14(vue@3.5.13(typescript@5.6.2))':
dependencies: dependencies:
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
'@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1)': '@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1)':
dependencies: dependencies:
...@@ -3792,9 +3822,9 @@ snapshots: ...@@ -3792,9 +3822,9 @@ snapshots:
'@esbuild/win32-x64@0.23.1': '@esbuild/win32-x64@0.23.1':
optional: true optional: true
'@eslint-community/eslint-utils@4.4.0(eslint@9.10.0(jiti@2.0.0-beta.3))': '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0(jiti@1.21.6))':
dependencies: dependencies:
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.11.1': {} '@eslint-community/regexpp@4.11.1': {}
...@@ -3833,9 +3863,9 @@ snapshots: ...@@ -3833,9 +3863,9 @@ snapshots:
'@humanwhocodes/retry@0.3.0': {} '@humanwhocodes/retry@0.3.0': {}
'@icon-park/vue-next@1.4.2(vue@3.5.12(typescript@5.6.2))': '@icon-park/vue-next@1.4.2(vue@3.5.13(typescript@5.6.2))':
dependencies: dependencies:
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
'@iconify/types@2.0.0': {} '@iconify/types@2.0.0': {}
...@@ -3851,12 +3881,12 @@ snapshots: ...@@ -3851,12 +3881,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@iconify/vue@4.1.2(vue@3.5.12(typescript@5.6.2))': '@iconify/vue@4.1.2(vue@3.5.13(typescript@5.6.2))':
dependencies: dependencies:
'@iconify/types': 2.0.0 '@iconify/types': 2.0.0
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
'@intlify/bundle-utils@8.0.0(vue-i18n@9.14.0(vue@3.5.12(typescript@5.6.2)))': '@intlify/bundle-utils@8.0.0(vue-i18n@9.14.0(vue@3.5.13(typescript@5.6.2)))':
dependencies: dependencies:
'@intlify/message-compiler': 9.14.0 '@intlify/message-compiler': 9.14.0
'@intlify/shared': 9.14.0 '@intlify/shared': 9.14.0
...@@ -3868,7 +3898,7 @@ snapshots: ...@@ -3868,7 +3898,7 @@ snapshots:
source-map-js: 1.2.1 source-map-js: 1.2.1
yaml-eslint-parser: 1.2.3 yaml-eslint-parser: 1.2.3
optionalDependencies: optionalDependencies:
vue-i18n: 9.14.0(vue@3.5.12(typescript@5.6.2)) vue-i18n: 9.14.0(vue@3.5.13(typescript@5.6.2))
'@intlify/core-base@9.14.0': '@intlify/core-base@9.14.0':
dependencies: dependencies:
...@@ -3882,9 +3912,9 @@ snapshots: ...@@ -3882,9 +3912,9 @@ snapshots:
'@intlify/shared@9.14.0': {} '@intlify/shared@9.14.0': {}
'@intlify/unplugin-vue-i18n@4.0.0(rollup@4.21.3)(vue-i18n@9.14.0(vue@3.5.12(typescript@5.6.2)))(webpack-sources@3.2.3)': '@intlify/unplugin-vue-i18n@4.0.0(rollup@4.21.3)(vue-i18n@9.14.0(vue@3.5.13(typescript@5.6.2)))(webpack-sources@3.2.3)':
dependencies: dependencies:
'@intlify/bundle-utils': 8.0.0(vue-i18n@9.14.0(vue@3.5.12(typescript@5.6.2))) '@intlify/bundle-utils': 8.0.0(vue-i18n@9.14.0(vue@3.5.13(typescript@5.6.2)))
'@intlify/shared': 9.14.0 '@intlify/shared': 9.14.0
'@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@rollup/pluginutils': 5.1.0(rollup@4.21.3)
'@vue/compiler-sfc': 3.5.6 '@vue/compiler-sfc': 3.5.6
...@@ -3897,7 +3927,7 @@ snapshots: ...@@ -3897,7 +3927,7 @@ snapshots:
source-map-js: 1.2.1 source-map-js: 1.2.1
unplugin: 1.14.1(webpack-sources@3.2.3) unplugin: 1.14.1(webpack-sources@3.2.3)
optionalDependencies: optionalDependencies:
vue-i18n: 9.14.0(vue@3.5.12(typescript@5.6.2)) vue-i18n: 9.14.0(vue@3.5.13(typescript@5.6.2))
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- supports-color - supports-color
...@@ -4024,15 +4054,15 @@ snapshots: ...@@ -4024,15 +4054,15 @@ snapshots:
'@types/web-bluetooth@0.0.20': {} '@types/web-bluetooth@0.0.20': {}
'@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2))(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)': '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.11.1 '@eslint-community/regexpp': 4.11.1
'@typescript-eslint/parser': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@typescript-eslint/parser': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/type-utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@typescript-eslint/type-utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
...@@ -4042,14 +4072,14 @@ snapshots: ...@@ -4042,14 +4072,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)': '@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/types': 7.18.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0
debug: 4.3.7 debug: 4.3.7
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
...@@ -4060,12 +4090,12 @@ snapshots: ...@@ -4060,12 +4090,12 @@ snapshots:
'@typescript-eslint/types': 7.18.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0
'@typescript-eslint/type-utils@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)': '@typescript-eslint/type-utils@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2)
'@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
debug: 4.3.7 debug: 4.3.7
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
ts-api-utils: 1.3.0(typescript@5.6.2) ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
...@@ -4089,13 +4119,13 @@ snapshots: ...@@ -4089,13 +4119,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)': '@typescript-eslint/utils@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@2.0.0-beta.3)) '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6))
'@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/types': 7.18.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2)
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
...@@ -4128,7 +4158,7 @@ snapshots: ...@@ -4128,7 +4158,7 @@ snapshots:
colorette: 2.0.20 colorette: 2.0.20
consola: 3.2.3 consola: 3.2.3
fast-glob: 3.3.2 fast-glob: 3.3.2
magic-string: 0.30.12 magic-string: 0.30.17
pathe: 1.1.2 pathe: 1.1.2
perfect-debounce: 1.0.0 perfect-debounce: 1.0.0
transitivePeerDependencies: transitivePeerDependencies:
...@@ -4144,17 +4174,17 @@ snapshots: ...@@ -4144,17 +4174,17 @@ snapshots:
'@unocss/core@0.61.9': {} '@unocss/core@0.61.9': {}
'@unocss/eslint-config@0.61.9(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)': '@unocss/eslint-config@0.61.9(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)':
dependencies: dependencies:
'@unocss/eslint-plugin': 0.61.9(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@unocss/eslint-plugin': 0.61.9(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
transitivePeerDependencies: transitivePeerDependencies:
- eslint - eslint
- supports-color - supports-color
- typescript - typescript
'@unocss/eslint-plugin@0.61.9(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)': '@unocss/eslint-plugin@0.61.9(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
'@unocss/config': 0.61.9 '@unocss/config': 0.61.9
'@unocss/core': 0.61.9 '@unocss/core': 0.61.9
magic-string: 0.30.11 magic-string: 0.30.11
...@@ -4182,7 +4212,7 @@ snapshots: ...@@ -4182,7 +4212,7 @@ snapshots:
'@unocss/rule-utils': 0.61.9 '@unocss/rule-utils': 0.61.9
css-tree: 2.3.1 css-tree: 2.3.1
fast-glob: 3.3.2 fast-glob: 3.3.2
magic-string: 0.30.12 magic-string: 0.30.17
postcss: 8.4.47 postcss: 8.4.47
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
...@@ -4237,7 +4267,7 @@ snapshots: ...@@ -4237,7 +4267,7 @@ snapshots:
'@unocss/rule-utils@0.61.9': '@unocss/rule-utils@0.61.9':
dependencies: dependencies:
'@unocss/core': 0.61.9 '@unocss/core': 0.61.9
magic-string: 0.30.12 magic-string: 0.30.17
'@unocss/scope@0.61.9': {} '@unocss/scope@0.61.9': {}
...@@ -4279,26 +4309,26 @@ snapshots: ...@@ -4279,26 +4309,26 @@ snapshots:
'@unocss/transformer-directives': 0.61.9 '@unocss/transformer-directives': 0.61.9
chokidar: 3.6.0 chokidar: 3.6.0
fast-glob: 3.3.2 fast-glob: 3.3.2
magic-string: 0.30.12 magic-string: 0.30.17
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- supports-color - supports-color
'@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue@3.5.12(typescript@5.6.2))': '@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue@3.5.13(typescript@5.6.2))':
dependencies: dependencies:
'@babel/core': 7.25.2 '@babel/core': 7.25.2
'@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2)
'@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.2) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.2)
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1)
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vitejs/plugin-vue@4.6.2(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue@3.5.12(typescript@5.6.2))': '@vitejs/plugin-vue@4.6.2(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue@3.5.13(typescript@5.6.2))':
dependencies: dependencies:
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1)
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
'@volar/language-core@2.4.5': '@volar/language-core@2.4.5':
dependencies: dependencies:
...@@ -4337,15 +4367,15 @@ snapshots: ...@@ -4337,15 +4367,15 @@ snapshots:
'@babel/core': 7.25.2 '@babel/core': 7.25.2
'@babel/helper-module-imports': 7.24.7 '@babel/helper-module-imports': 7.24.7
'@babel/helper-plugin-utils': 7.24.8 '@babel/helper-plugin-utils': 7.24.8
'@babel/parser': 7.25.6 '@babel/parser': 7.26.3
'@vue/compiler-sfc': 3.5.6 '@vue/compiler-sfc': 3.5.13
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vue/compiler-core@3.5.12': '@vue/compiler-core@3.5.13':
dependencies: dependencies:
'@babel/parser': 7.25.8 '@babel/parser': 7.26.3
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
entities: 4.5.0 entities: 4.5.0
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map-js: 1.2.1 source-map-js: 1.2.1
...@@ -4358,26 +4388,26 @@ snapshots: ...@@ -4358,26 +4388,26 @@ snapshots:
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map-js: 1.2.1 source-map-js: 1.2.1
'@vue/compiler-dom@3.5.12': '@vue/compiler-dom@3.5.13':
dependencies: dependencies:
'@vue/compiler-core': 3.5.12 '@vue/compiler-core': 3.5.13
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
'@vue/compiler-dom@3.5.6': '@vue/compiler-dom@3.5.6':
dependencies: dependencies:
'@vue/compiler-core': 3.5.6 '@vue/compiler-core': 3.5.6
'@vue/shared': 3.5.6 '@vue/shared': 3.5.6
'@vue/compiler-sfc@3.5.12': '@vue/compiler-sfc@3.5.13':
dependencies: dependencies:
'@babel/parser': 7.25.8 '@babel/parser': 7.26.3
'@vue/compiler-core': 3.5.12 '@vue/compiler-core': 3.5.13
'@vue/compiler-dom': 3.5.12 '@vue/compiler-dom': 3.5.13
'@vue/compiler-ssr': 3.5.12 '@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
estree-walker: 2.0.2 estree-walker: 2.0.2
magic-string: 0.30.12 magic-string: 0.30.17
postcss: 8.4.47 postcss: 8.4.49
source-map-js: 1.2.1 source-map-js: 1.2.1
'@vue/compiler-sfc@3.5.6': '@vue/compiler-sfc@3.5.6':
...@@ -4392,10 +4422,10 @@ snapshots: ...@@ -4392,10 +4422,10 @@ snapshots:
postcss: 8.4.47 postcss: 8.4.47
source-map-js: 1.2.1 source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.12': '@vue/compiler-ssr@3.5.13':
dependencies: dependencies:
'@vue/compiler-dom': 3.5.12 '@vue/compiler-dom': 3.5.13
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
'@vue/compiler-ssr@3.5.6': '@vue/compiler-ssr@3.5.6':
dependencies: dependencies:
...@@ -4412,9 +4442,9 @@ snapshots: ...@@ -4412,9 +4442,9 @@ snapshots:
'@vue/language-core@2.0.29(typescript@5.6.2)': '@vue/language-core@2.0.29(typescript@5.6.2)':
dependencies: dependencies:
'@volar/language-core': 2.4.5 '@volar/language-core': 2.4.5
'@vue/compiler-dom': 3.5.12 '@vue/compiler-dom': 3.5.13
'@vue/compiler-vue2': 2.7.16 '@vue/compiler-vue2': 2.7.16
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
computeds: 0.0.1 computeds: 0.0.1
minimatch: 9.0.5 minimatch: 9.0.5
muggle-string: 0.4.1 muggle-string: 0.4.1
...@@ -4422,47 +4452,47 @@ snapshots: ...@@ -4422,47 +4452,47 @@ snapshots:
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
'@vue/reactivity@3.5.12': '@vue/reactivity@3.5.13':
dependencies: dependencies:
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
'@vue/runtime-core@3.5.12': '@vue/runtime-core@3.5.13':
dependencies: dependencies:
'@vue/reactivity': 3.5.12 '@vue/reactivity': 3.5.13
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
'@vue/runtime-dom@3.5.12': '@vue/runtime-dom@3.5.13':
dependencies: dependencies:
'@vue/reactivity': 3.5.12 '@vue/reactivity': 3.5.13
'@vue/runtime-core': 3.5.12 '@vue/runtime-core': 3.5.13
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
csstype: 3.1.3 csstype: 3.1.3
'@vue/server-renderer@3.5.12(vue@3.5.12(typescript@5.6.2))': '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.2))':
dependencies: dependencies:
'@vue/compiler-ssr': 3.5.12 '@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
'@vue/shared@3.5.12': {} '@vue/shared@3.5.13': {}
'@vue/shared@3.5.6': {} '@vue/shared@3.5.6': {}
'@vueuse/core@10.11.1(vue@3.5.12(typescript@5.6.2))': '@vueuse/core@10.11.1(vue@3.5.13(typescript@5.6.2))':
dependencies: dependencies:
'@types/web-bluetooth': 0.0.20 '@types/web-bluetooth': 0.0.20
'@vueuse/metadata': 10.11.1 '@vueuse/metadata': 10.11.1
'@vueuse/shared': 10.11.1(vue@3.5.12(typescript@5.6.2)) '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.6.2))
vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.2)) vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.2))
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- vue - vue
'@vueuse/metadata@10.11.1': {} '@vueuse/metadata@10.11.1': {}
'@vueuse/shared@10.11.1(vue@3.5.12(typescript@5.6.2))': '@vueuse/shared@10.11.1(vue@3.5.13(typescript@5.6.2))':
dependencies: dependencies:
vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.2)) vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.2))
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- vue - vue
...@@ -4905,29 +4935,29 @@ snapshots: ...@@ -4905,29 +4935,29 @@ snapshots:
optionalDependencies: optionalDependencies:
source-map: 0.6.1 source-map: 0.6.1
eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3)): eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@1.21.6)):
dependencies: dependencies:
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3)))(eslint@9.10.0(jiti@2.0.0-beta.3))(prettier@3.3.3): eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@1.21.6)))(eslint@9.10.0(jiti@1.21.6))(prettier@3.3.3):
dependencies: dependencies:
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
prettier: 3.3.3 prettier: 3.3.3
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.9.1 synckit: 0.9.1
optionalDependencies: optionalDependencies:
eslint-config-prettier: 9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3)) eslint-config-prettier: 9.1.0(eslint@9.10.0(jiti@1.21.6))
eslint-plugin-vue@9.28.0(eslint@9.10.0(jiti@2.0.0-beta.3)): eslint-plugin-vue@9.28.0(eslint@9.10.0(jiti@1.21.6)):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@2.0.0-beta.3)) '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6))
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
globals: 13.24.0 globals: 13.24.0
natural-compare: 1.4.0 natural-compare: 1.4.0
nth-check: 2.1.1 nth-check: 2.1.1
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
semver: 7.6.3 semver: 7.6.3
vue-eslint-parser: 9.4.3(eslint@9.10.0(jiti@2.0.0-beta.3)) vue-eslint-parser: 9.4.3(eslint@9.10.0(jiti@1.21.6))
xml-name-validator: 4.0.0 xml-name-validator: 4.0.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
...@@ -4946,9 +4976,9 @@ snapshots: ...@@ -4946,9 +4976,9 @@ snapshots:
eslint-visitor-keys@4.0.0: {} eslint-visitor-keys@4.0.0: {}
eslint@9.10.0(jiti@2.0.0-beta.3): eslint@9.10.0(jiti@1.21.6):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@2.0.0-beta.3)) '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6))
'@eslint-community/regexpp': 4.11.1 '@eslint-community/regexpp': 4.11.1
'@eslint/config-array': 0.18.0 '@eslint/config-array': 0.18.0
'@eslint/eslintrc': 3.1.0 '@eslint/eslintrc': 3.1.0
...@@ -4983,7 +5013,7 @@ snapshots: ...@@ -4983,7 +5013,7 @@ snapshots:
strip-ansi: 6.0.1 strip-ansi: 6.0.1
text-table: 0.2.0 text-table: 0.2.0
optionalDependencies: optionalDependencies:
jiti: 2.0.0-beta.3 jiti: 1.21.6
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
...@@ -5443,7 +5473,7 @@ snapshots: ...@@ -5443,7 +5473,7 @@ snapshots:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/sourcemap-codec': 1.5.0
magic-string@0.30.12: magic-string@0.30.17:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/sourcemap-codec': 1.5.0
...@@ -5507,10 +5537,10 @@ snapshots: ...@@ -5507,10 +5537,10 @@ snapshots:
muggle-string@0.4.1: {} muggle-string@0.4.1: {}
naive-ui@2.39.0(vue@3.5.12(typescript@5.6.2)): naive-ui@2.39.0(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
'@css-render/plugin-bem': 0.15.14(css-render@0.15.14) '@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
'@css-render/vue3-ssr': 0.15.14(vue@3.5.12(typescript@5.6.2)) '@css-render/vue3-ssr': 0.15.14(vue@3.5.13(typescript@5.6.2))
'@types/katex': 0.16.7 '@types/katex': 0.16.7
'@types/lodash': 4.17.7 '@types/lodash': 4.17.7
'@types/lodash-es': 4.17.12 '@types/lodash-es': 4.17.12
...@@ -5525,13 +5555,15 @@ snapshots: ...@@ -5525,13 +5555,15 @@ snapshots:
lodash-es: 4.17.21 lodash-es: 4.17.21
seemly: 0.3.8 seemly: 0.3.8
treemate: 0.3.11 treemate: 0.3.11
vdirs: 0.1.8(vue@3.5.12(typescript@5.6.2)) vdirs: 0.1.8(vue@3.5.13(typescript@5.6.2))
vooks: 0.2.12(vue@3.5.12(typescript@5.6.2)) vooks: 0.2.12(vue@3.5.13(typescript@5.6.2))
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vueuc: 0.4.58(vue@3.5.12(typescript@5.6.2)) vueuc: 0.4.58(vue@3.5.13(typescript@5.6.2))
nanoid@3.3.7: {} nanoid@3.3.7: {}
nanoid@3.3.8: {}
nanoid@5.0.7: {} nanoid@5.0.7: {}
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
...@@ -5634,15 +5666,17 @@ snapshots: ...@@ -5634,15 +5666,17 @@ snapshots:
picocolors@1.1.0: {} picocolors@1.1.0: {}
picocolors@1.1.1: {}
picomatch@2.3.1: {} picomatch@2.3.1: {}
pidtree@0.6.0: {} pidtree@0.6.0: {}
pinia@2.2.2(typescript@5.6.2)(vue@3.5.12(typescript@5.6.2)): pinia@2.2.2(typescript@5.6.2)(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
'@vue/devtools-api': 6.6.4 '@vue/devtools-api': 6.6.4
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.2)) vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.2))
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
...@@ -5692,6 +5726,12 @@ snapshots: ...@@ -5692,6 +5726,12 @@ snapshots:
picocolors: 1.1.0 picocolors: 1.1.0
source-map-js: 1.2.1 source-map-js: 1.2.1
postcss@8.4.49:
dependencies:
nanoid: 3.3.8
picocolors: 1.1.1
source-map-js: 1.2.1
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
prettier-linter-helpers@1.0.0: prettier-linter-helpers@1.0.0:
...@@ -5996,7 +6036,7 @@ snapshots: ...@@ -5996,7 +6036,7 @@ snapshots:
css-tree: 2.3.1 css-tree: 2.3.1
css-what: 6.1.0 css-what: 6.1.0
csso: 5.0.5 csso: 5.0.5
picocolors: 1.1.0 picocolors: 1.1.1
synckit@0.9.1: synckit@0.9.1:
dependencies: dependencies:
...@@ -6058,12 +6098,12 @@ snapshots: ...@@ -6058,12 +6098,12 @@ snapshots:
type-fest@4.26.1: {} type-fest@4.26.1: {}
typescript-eslint@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2): typescript-eslint@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2))(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/parser': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@typescript-eslint/parser': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2) '@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
...@@ -6135,7 +6175,7 @@ snapshots: ...@@ -6135,7 +6175,7 @@ snapshots:
- rollup - rollup
- supports-color - supports-color
unplugin-auto-import@0.17.8(@vueuse/core@10.11.1(vue@3.5.12(typescript@5.6.2)))(rollup@4.21.3)(webpack-sources@3.2.3): unplugin-auto-import@0.17.8(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.6.2)))(rollup@4.21.3)(webpack-sources@3.2.3):
dependencies: dependencies:
'@antfu/utils': 0.7.10 '@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@rollup/pluginutils': 5.1.0(rollup@4.21.3)
...@@ -6146,12 +6186,12 @@ snapshots: ...@@ -6146,12 +6186,12 @@ snapshots:
unimport: 3.12.0(rollup@4.21.3)(webpack-sources@3.2.3) unimport: 3.12.0(rollup@4.21.3)(webpack-sources@3.2.3)
unplugin: 1.14.1(webpack-sources@3.2.3) unplugin: 1.14.1(webpack-sources@3.2.3)
optionalDependencies: optionalDependencies:
'@vueuse/core': 10.11.1(vue@3.5.12(typescript@5.6.2)) '@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.6.2))
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- webpack-sources - webpack-sources
unplugin-vue-components@0.26.0(@babel/parser@7.25.8)(rollup@4.21.3)(vue@3.5.12(typescript@5.6.2))(webpack-sources@3.2.3): unplugin-vue-components@0.26.0(@babel/parser@7.26.3)(rollup@4.21.3)(vue@3.5.13(typescript@5.6.2))(webpack-sources@3.2.3):
dependencies: dependencies:
'@antfu/utils': 0.7.10 '@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@rollup/pluginutils': 5.1.0(rollup@4.21.3)
...@@ -6163,9 +6203,9 @@ snapshots: ...@@ -6163,9 +6203,9 @@ snapshots:
minimatch: 9.0.5 minimatch: 9.0.5
resolve: 1.22.8 resolve: 1.22.8
unplugin: 1.14.1(webpack-sources@3.2.3) unplugin: 1.14.1(webpack-sources@3.2.3)
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
optionalDependencies: optionalDependencies:
'@babel/parser': 7.25.8 '@babel/parser': 7.26.3
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- supports-color - supports-color
...@@ -6192,12 +6232,12 @@ snapshots: ...@@ -6192,12 +6232,12 @@ snapshots:
validator@13.12.0: {} validator@13.12.0: {}
vdirs@0.1.8(vue@3.5.12(typescript@5.6.2)): vdirs@0.1.8(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
evtd: 0.2.4 evtd: 0.2.4
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vite-plugin-checker@0.7.2(eslint@9.10.0(jiti@2.0.0-beta.3))(meow@13.2.0)(optionator@0.9.4)(stylelint@16.9.0(typescript@5.6.2))(typescript@5.6.2)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue-tsc@2.0.29(typescript@5.6.2)): vite-plugin-checker@0.7.2(eslint@9.10.0(jiti@1.21.6))(optionator@0.9.4)(stylelint@16.9.0(typescript@5.6.2))(typescript@5.6.2)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))(vue-tsc@2.0.29(typescript@5.6.2)):
dependencies: dependencies:
'@babel/code-frame': 7.24.7 '@babel/code-frame': 7.24.7
ansi-escapes: 4.3.2 ansi-escapes: 4.3.2
...@@ -6215,17 +6255,16 @@ snapshots: ...@@ -6215,17 +6255,16 @@ snapshots:
vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-textdocument: 1.0.12
vscode-uri: 3.0.8 vscode-uri: 3.0.8
optionalDependencies: optionalDependencies:
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
meow: 13.2.0
optionator: 0.9.4 optionator: 0.9.4
stylelint: 16.9.0(typescript@5.6.2) stylelint: 16.9.0(typescript@5.6.2)
typescript: 5.6.2 typescript: 5.6.2
vue-tsc: 2.0.29(typescript@5.6.2) vue-tsc: 2.0.29(typescript@5.6.2)
vite-svg-loader@5.1.0(vue@3.5.12(typescript@5.6.2)): vite-svg-loader@5.1.0(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
svgo: 3.3.2 svgo: 3.3.2
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vite@5.4.6(@types/node@20.16.5)(sass@1.79.1): vite@5.4.6(@types/node@20.16.5)(sass@1.79.1):
dependencies: dependencies:
...@@ -6237,10 +6276,10 @@ snapshots: ...@@ -6237,10 +6276,10 @@ snapshots:
fsevents: 2.3.3 fsevents: 2.3.3
sass: 1.79.1 sass: 1.79.1
vooks@0.2.12(vue@3.5.12(typescript@5.6.2)): vooks@0.2.12(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
evtd: 0.2.4 evtd: 0.2.4
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vscode-jsonrpc@6.0.0: {} vscode-jsonrpc@6.0.0: {}
...@@ -6265,14 +6304,14 @@ snapshots: ...@@ -6265,14 +6304,14 @@ snapshots:
vscode-uri@3.0.8: {} vscode-uri@3.0.8: {}
vue-demi@0.14.10(vue@3.5.12(typescript@5.6.2)): vue-demi@0.14.10(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vue-eslint-parser@9.4.3(eslint@9.10.0(jiti@2.0.0-beta.3)): vue-eslint-parser@9.4.3(eslint@9.10.0(jiti@1.21.6)):
dependencies: dependencies:
debug: 4.3.7 debug: 4.3.7
eslint: 9.10.0(jiti@2.0.0-beta.3) eslint: 9.10.0(jiti@1.21.6)
eslint-scope: 7.2.2 eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
espree: 9.6.1 espree: 9.6.1
...@@ -6282,17 +6321,17 @@ snapshots: ...@@ -6282,17 +6321,17 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
vue-i18n@9.14.0(vue@3.5.12(typescript@5.6.2)): vue-i18n@9.14.0(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
'@intlify/core-base': 9.14.0 '@intlify/core-base': 9.14.0
'@intlify/shared': 9.14.0 '@intlify/shared': 9.14.0
'@vue/devtools-api': 6.6.4 '@vue/devtools-api': 6.6.4
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vue-router@4.4.5(vue@3.5.12(typescript@5.6.2)): vue-router@4.4.5(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
'@vue/devtools-api': 6.6.4 '@vue/devtools-api': 6.6.4
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vue-tsc@2.0.29(typescript@5.6.2): vue-tsc@2.0.29(typescript@5.6.2):
dependencies: dependencies:
...@@ -6301,26 +6340,26 @@ snapshots: ...@@ -6301,26 +6340,26 @@ snapshots:
semver: 7.6.3 semver: 7.6.3
typescript: 5.6.2 typescript: 5.6.2
vue@3.5.12(typescript@5.6.2): vue@3.5.13(typescript@5.6.2):
dependencies: dependencies:
'@vue/compiler-dom': 3.5.12 '@vue/compiler-dom': 3.5.13
'@vue/compiler-sfc': 3.5.12 '@vue/compiler-sfc': 3.5.13
'@vue/runtime-dom': 3.5.12 '@vue/runtime-dom': 3.5.13
'@vue/server-renderer': 3.5.12(vue@3.5.12(typescript@5.6.2)) '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.6.2))
'@vue/shared': 3.5.12 '@vue/shared': 3.5.13
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
vueuc@0.4.58(vue@3.5.12(typescript@5.6.2)): vueuc@0.4.58(vue@3.5.13(typescript@5.6.2)):
dependencies: dependencies:
'@css-render/vue3-ssr': 0.15.14(vue@3.5.12(typescript@5.6.2)) '@css-render/vue3-ssr': 0.15.14(vue@3.5.13(typescript@5.6.2))
'@juggle/resize-observer': 3.4.0 '@juggle/resize-observer': 3.4.0
css-render: 0.15.14 css-render: 0.15.14
evtd: 0.2.4 evtd: 0.2.4
seemly: 0.3.8 seemly: 0.3.8
vdirs: 0.1.8(vue@3.5.12(typescript@5.6.2)) vdirs: 0.1.8(vue@3.5.13(typescript@5.6.2))
vooks: 0.2.12(vue@3.5.12(typescript@5.6.2)) vooks: 0.2.12(vue@3.5.13(typescript@5.6.2))
vue: 3.5.12(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
webpack-sources@3.2.3: webpack-sources@3.2.3:
optional: true optional: true
......
...@@ -43,3 +43,38 @@ export function fetchGetMonthSendMessageCount<T>(agentId: string, channel: strin ...@@ -43,3 +43,38 @@ export function fetchGetMonthSendMessageCount<T>(agentId: string, channel: strin
export function fetchGetMonthConsumePointCount<T>(agentId: string, channel: string[]) { export function fetchGetMonthConsumePointCount<T>(agentId: string, channel: string[]) {
return request.post<T>(`/agentDataAnalyzeRest/getPointUsageCount.json?agentId=${agentId}&channel=${channel}`) return request.post<T>(`/agentDataAnalyzeRest/getPointUsageCount.json?agentId=${agentId}&channel=${channel}`)
} }
/**
* @params { agentId: 应用Id timeRange: { rangType: 类型, startTime: 开始时间, endTime: 结束时间 }}
* @returns API渠道积分使用情况
*/
export function fetchGetAPIChannelPointUsageCount<T>(payload: {
agentId: string
timeRange: {
rangType: 'today' | 'week' | 'month' | 'customize'
startTime: string
endTime: string
}
}) {
return request.post<T>('/agentDataAnalyzeRest/getApiChannelPointUsageCount.json', payload)
}
/**
* @params { reportRequestType:导出类型 agentId: 应用Id timeRange: { rangType: 类型, startTime: 开始时间, endTime: 结束时间 }}
* @returns API调用积分消耗报表导出
*/
export function fetchReportAPIChannelPointUsage<T>(payload: {
reportRequestType: string
agentId: string
timeRange: {
rangType: 'today' | 'week' | 'month' | 'customize'
startTime: string
endTime: string
}
}) {
return request.post<T>('/formReportingRest/report.json', payload, {
ignoreErrorCheck: true,
responseType: 'blob',
timeout: 0,
})
}
...@@ -187,3 +187,17 @@ export function fetchGetAutoPlayByAgentId<T>(agentId: string) { ...@@ -187,3 +187,17 @@ export function fetchGetAutoPlayByAgentId<T>(agentId: string) {
export function fetchUpdateAutoPlay<T>(agentId: string, autoPlay: 'Y' | 'N') { export function fetchUpdateAutoPlay<T>(agentId: string, autoPlay: 'Y' | 'N') {
return request.post<T>(`/agentApplicationRest/enableAutoPlay.json?agentId=${agentId}&autoPlay=${autoPlay}`) return request.post<T>(`/agentApplicationRest/enableAutoPlay.json?agentId=${agentId}&autoPlay=${autoPlay}`)
} }
/**
* @returns 获取API配置
*/
export function fetchGetAPIProfile<T>() {
return request.post<T>('/agentApplicationRest/getApiProfile.json')
}
/**
* @returns 重新生成API配置
*/
export function fetchResetAPIProfile<T>() {
return request.post<T>('/agentApplicationRest/resetApiProfile.json')
}
...@@ -4,12 +4,12 @@ export function fetchUserEquityInfo<T>() { ...@@ -4,12 +4,12 @@ export function fetchUserEquityInfo<T>() {
return request.post<T>('/equityRest/getCurrentEquity.json') return request.post<T>('/equityRest/getCurrentEquity.json')
} }
export function fetchCreateEquityOrder<T>(payload: object) { export function fetchCreateEquityOrder<T>(payload: object, controller: AbortController) {
return request.post<T>('/equityOrderRest/createOrder.json', payload) return request.post<T>('/equityOrderRest/createOrder.json', payload, { signal: controller.signal })
} }
export function fetchGetEquityPayQrCode<T>(payload: object) { export function fetchGetEquityPayQrCode<T>(payload: object, controller: AbortController) {
return request.post<T>('/payRest/pay.json', null, { params: payload }) return request.post<T>('/payRest/pay.json', null, { params: payload, signal: controller.signal })
} }
export function fetchGetPayStatus<T>(payOrderSn: string) { export function fetchGetPayStatus<T>(payOrderSn: string) {
......
import { request } from '@/utils/request'
/**
* @query channels 渠道列表
* @returns 平台积分使用情况
*/
export function fetchGetPlatformPointUsage<T>(channels: string[]) {
return request.post<T>(`/dataStatisticsRest/platformPointUsage.json?channels=${channels}`)
}
/**
* @param { channel: 渠道列表 timeRange: { rangType: 类型, startTime: 开始时间, endTime: 结束时间 } }
* @returns 平台积分使用趋势
*/
export function fetchGetPlatformPointTrend<T>(payload: {
channel: string[]
timeRange: { rangType: string; startTime: string; endTime: string }
}) {
return request.post<T>('/dataStatisticsRest/platformPointTrend.json', payload)
}
/**
* @query channels 渠道列表
* @returns 平台应用使用情况
*/
export function fetchGetPlatformAgentUsage<T>(channels: string[]) {
return request.post<T>(`/dataStatisticsRest/platformAgentUsage.json?channels=${channels}`)
}
/**
* @params { timeRange: { rangType: 类型, startTime: 开始时间, endTime: 结束时间 } }
* @returns 平台应用使用明细
*/
export function fetchGetPlatformAgentUsageDetail<T>(payload: {
timeRange: {
rangType: 'month' | 'week' | 'customize'
startTime: string
endTime: string
}
pagingInfo: {
pageNo: number
pageSize: number
}
}) {
return request.post<T>('/dataStatisticsRest/platformAgentUsageDetail.json', payload)
}
import { request } from '@/utils/request' import { request } from '@/utils/request'
export function fetchLogin<T>(payload: { export function fetchLogin<T>(payload: {
loginChannel: 'MEMBER_PLATFOMR_SMS' | 'MEMBER_PLATFOMR_EMAIL' | 'MEMBER_PLATFOMR_PW' loginChannel: 'MEMBER_PLATFOMR_SMS' | 'MEMBER_PLATFOMR_EMAIL' | 'MEMBER_PLATFOMR_PW' | 'MEMBER_PLATFOMR_GOOGLE'
account: string account: string
password?: string password?: string
authCode?: string authCode?: string
...@@ -38,3 +38,7 @@ export function fetchUserPasswordUpdate<T>(authCode: string, password: string) { ...@@ -38,3 +38,7 @@ export function fetchUserPasswordUpdate<T>(authCode: string, password: string) {
params: { authCode, password }, params: { authCode, password },
}) })
} }
export function fetchGoogleClientId<T>() {
return request.post<T>('/googleConfigRest/getClientId.json')
}
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { useI18n } from 'vue-i18n'
import { RangType } from './type.d'
const emit = defineEmits<{
updateSearchList: [currentTime: RangType, startTime: string, endTime: string]
}>()
const { t } = useI18n()
const currentTime = ref(RangType.week)
const selectDateRange = ref<[string, string]>(['', ''])
const rangTypeOptionList = [
{
label: t('common_module.last_week'),
value: RangType.week,
},
{
label: t('common_module.last_month'),
value: RangType.month,
},
{
label: t('common_module.custom'),
value: RangType.customize,
},
]
const disableSelectDate = (ts: number, type: 'start' | 'end', range: [number, number] | null) => {
if (type === 'start' && range !== null) {
return range[1] - ts >= 86400000 * 365 || ts > Date.now()
}
if (type === 'end' && range !== null) {
return ts - range[0] >= 86400000 * 365 || ts > Date.now()
}
return ts > Date.now()
}
onMounted(() => {
emit('updateSearchList', currentTime.value, '', '')
})
function handleUpdateRangType(rangType: string) {
if (rangType !== RangType.customize) {
selectDateRange.value = ['', '']
emit('updateSearchList', currentTime.value, '', '')
}
}
function handleUpdateDateRange(_value: [number, number], formattedValue: [string, string]) {
if (formattedValue[0] && formattedValue[1]) {
selectDateRange.value = formattedValue
emit('updateSearchList', currentTime.value, selectDateRange.value[0], selectDateRange.value[1])
}
}
</script>
<template>
<div class="flex gap-3">
<n-select
v-model:value="currentTime"
:options="rangTypeOptionList"
class="w-[124px]! time-range-select"
@update:value="handleUpdateRangType"
/>
<n-date-picker
v-show="currentTime === 'customize'"
type="daterange"
:is-date-disabled="disableSelectDate"
clearable
class="w-[250px]! customize-date-picker"
@update:value="handleUpdateDateRange"
/>
</div>
</template>
<style scoped lang="scss">
:deep(.time-range-select .n-base-selection),
:deep(.customize-date-picker.n-date-picker .n-input) {
--n-height: 36px !important;
}
</style>
export enum RangType {
week = 'week',
month = 'month',
customize = 'customize',
}
...@@ -12,6 +12,8 @@ const isShowModal = ref(false) ...@@ -12,6 +12,8 @@ const isShowModal = ref(false)
const modalOptions = reactive({ const modalOptions = reactive({
title: t('common_module.tip'), title: t('common_module.tip'),
content: '', content: '',
cancelText: t('common_module.cancel_btn_text'),
confirmText: t('common_module.confirm_btn_text'),
}) })
let _modalStatusResolve = (_value?: any) => {} let _modalStatusResolve = (_value?: any) => {}
...@@ -33,9 +35,11 @@ function handleConfirm() { ...@@ -33,9 +35,11 @@ function handleConfirm() {
_modalStatusResolve(true) _modalStatusResolve(true)
} }
function handleShowModal(content: string, title?: string) { function handleShowModal(content: string, title?: string, cancelText?: string, confirmText?: string) {
modalOptions.content = content modalOptions.content = content
title && (modalOptions.title = title) title && (modalOptions.title = title)
cancelText && (modalOptions.cancelText = cancelText)
confirmText && (modalOptions.confirmText = confirmText)
isShowModal.value = true isShowModal.value = true
...@@ -63,11 +67,11 @@ function handleShowModal(content: string, title?: string) { ...@@ -63,11 +67,11 @@ function handleShowModal(content: string, title?: string) {
<div class="mt-[50px] text-end"> <div class="mt-[50px] text-end">
<n-button color="#F5F5F5" round class="!px-[34px] !py-[10px] !text-[14px] !text-[#333]" @click="handleCancel"> <n-button color="#F5F5F5" round class="!px-[34px] !py-[10px] !text-[14px] !text-[#333]" @click="handleCancel">
{{ t('common_module.cancel_btn_text') }} {{ modalOptions.cancelText || t('common_module.cancel_btn_text') }}
</n-button> </n-button>
<n-button color="#6F77FF" round class="!ml-[12px] !px-[34px] !py-[10px] !text-[14px]" @click="handleConfirm"> <n-button color="#6F77FF" round class="!ml-[12px] !px-[34px] !py-[10px] !text-[14px]" @click="handleConfirm">
{{ t('common_module.confirm_btn_text') }} {{ modalOptions.confirmText || t('common_module.confirm_btn_text') }}
</n-button> </n-button>
</div> </div>
</div> </div>
......
...@@ -40,6 +40,11 @@ const menuOptions = computed<MenuOption[]>(() => { ...@@ -40,6 +40,11 @@ const menuOptions = computed<MenuOption[]>(() => {
key: 'ApplicationsSquare', key: 'ApplicationsSquare',
icon: () => h('i', { class: 'iconfont icon-square' }), icon: () => h('i', { class: 'iconfont icon-square' }),
}, },
{
label: () => h('div', {}, t('router_title_module.data_statistic')),
key: 'Statistic',
icon: () => h('i', { class: 'iconfont icon-statistics' }),
},
], ],
}, },
] ]
...@@ -144,7 +149,14 @@ function handleNavigateToEquity() { ...@@ -144,7 +149,14 @@ function handleNavigateToEquity() {
<i class="iconfont icon-gift text-[14px] text-[#000dff]"></i> <i class="iconfont icon-gift text-[14px] text-[#000dff]"></i>
<n-ellipsis> <n-ellipsis>
<span class="ml-[5px] truncate">{{ userStore.equityInfo.points || '-' }}</span> <!-- <n-number-animation
v-if="userStore.equityInfo.points"
:from="0"
:to="userStore.equityInfo.points"
:precision="2"
/> -->
<span v-if="userStore.equityInfo.points">{{ userStore.equityInfo.points }}</span>
<span v-else class="ml-[5px]">-</span>
</n-ellipsis> </n-ellipsis>
</span> </span>
......
...@@ -112,6 +112,7 @@ common_module: ...@@ -112,6 +112,7 @@ common_module:
forever_effective: 'Forever Effective' forever_effective: 'Forever Effective'
year: ' Year' year: ' Year'
month: ' Month' month: ' Month'
today: 'Today'
alipay: 'Alipay' alipay: 'Alipay'
wechat: 'WeChat' wechat: 'WeChat'
analysis: 'Analysis' analysis: 'Analysis'
...@@ -126,6 +127,14 @@ common_module: ...@@ -126,6 +127,14 @@ common_module:
unlimited_duration: 'Unlimited duration' unlimited_duration: 'Unlimited duration'
buy_now: 'Buy now' buy_now: 'Buy now'
payment_success: 'Payment success' payment_success: 'Payment success'
back: 'Back'
time: 'Time(s)'
export_data: 'Export Data'
not_generated: 'Not generated'
export_successfully: 'Export successfully'
export_failed: 'Export failed'
copy_link: 'Copy link'
or: 'or'
dialogue_module: dialogue_module:
continue_question_message: 'You can keep asking questions' continue_question_message: 'You can keep asking questions'
...@@ -176,6 +185,7 @@ router_title_module: ...@@ -176,6 +185,7 @@ router_title_module:
application_square: 'Application square' application_square: 'Application square'
personal_settings: 'Personal settings' personal_settings: 'Personal settings'
order_manage: 'Order Management' order_manage: 'Order Management'
data_statistic: 'Data statistic'
login_module: login_module:
app_welcome_words: 'Hi, welcome to Model Link' app_welcome_words: 'Hi, welcome to Model Link'
...@@ -374,6 +384,13 @@ personal_space_module: ...@@ -374,6 +384,13 @@ personal_space_module:
removal_prompt_title: 'Are you sure you want to remove the app from the app plaza' removal_prompt_title: 'Are you sure you want to remove the app from the app plaza'
removal_prompt_content: 'After removal, platform users will not be able to experience this application through the app plaza. If you need to relist it, please reconfigure it' removal_prompt_content: 'After removal, platform users will not be able to experience this application through the app plaza. If you need to relist it, please reconfigure it'
successfully_configured_published: 'Configuration successful, published to App Store' successfully_configured_published: 'Configuration successful, published to App Store'
api_call: 'API call'
api_call_desc: 'You can use apis to connect to agents interfaces'
interface_document: 'Interface document'
click_to_generate: 'Click to generate'
agentId: 'AgentId'
api_call_details: 'API call details'
api_call_datetime: 'Call datetime'
agent_sale_module: agent_sale_module:
application_square_release_setting: 'The application plaza publishes the configuration' application_square_release_setting: 'The application plaza publishes the configuration'
...@@ -414,6 +431,8 @@ personal_space_module: ...@@ -414,6 +431,8 @@ personal_space_module:
upload_knowledge_document_btn_text: 'Import file' upload_knowledge_document_btn_text: 'Import file'
batch_delete_knowledge_document_btn_text: 'Batch deletion' batch_delete_knowledge_document_btn_text: 'Batch deletion'
not_find_knowledge_document_message: 'No knowledge base file found' not_find_knowledge_document_message: 'No knowledge base file found'
not_all_files_train_complete_tip: 'Some of the files are not valid. Please remove the invalid files and try adding again.'
cannot_add_tip_when_file_is_training: 'Currently, the files are being trained and cannot be added'
create_knowledge_modal_title: 'Create a knowledge base' create_knowledge_modal_title: 'Create a knowledge base'
edit_knowledge_modal_title: 'Edit knowledge base' edit_knowledge_modal_title: 'Edit knowledge base'
...@@ -557,6 +576,8 @@ equity_module: ...@@ -557,6 +576,8 @@ equity_module:
point_recharge: 'Point recharge' point_recharge: 'Point recharge'
get_points_for_interacting_with_the_ai: 'Get {points} points for interacting with the AI' get_points_for_interacting_with_the_ai: 'Get {points} points for interacting with the AI'
no_time_limit_when_used_up: 'No time limit, when used up' no_time_limit_when_used_up: 'No time limit, when used up'
agents_created_exceeds_tip: 'The number of agents created exceeds the current package benefits, please upgrade the package'
documents_uploaded_exceeds_tip: 'The number of documents uploaded exceeds the current package benefits, please upgrade the package(The remaining {count} can be uploaded)'
order_manage_module: order_manage_module:
package_name: 'PackageName' package_name: 'PackageName'
...@@ -590,5 +611,26 @@ analysis_module: ...@@ -590,5 +611,26 @@ analysis_module:
usage_channel: 'Usage channel' usage_channel: 'Usage channel'
index: 'Index' index: 'Index'
agent_square: 'Agent square' agent_square: 'Agent square'
api: 'Api' api: 'API'
link_share: 'Link share' link_share: 'Link share'
statistic_module:
data_statistic: 'Data statistic'
point_statistic: 'Point statistic'
agent_statistic: 'Agent statistic'
platform_point_usage: 'Platform point usage'
platform_point_trend: 'Platform point trend'
today_usage: 'Today usage'
current_week_usage: 'Current week usage'
current_month_usage: 'Current month usage'
current_year_usage: 'Current year usage'
create_agent_count: 'Create agent count'
usage_agent_count: 'Usage agent count'
unpublish_agent_count: 'Unpublish agent count'
published_agent_count: 'Published agent count'
platform_agent_usage_detail: 'Platform agent usage detail'
agent_title: 'Agent title'
agent_status: 'Agent status'
owner: 'Owner'
usage_count: 'Usage count'
last_usage_time: 'Last usage time'
...@@ -111,6 +111,7 @@ common_module: ...@@ -111,6 +111,7 @@ common_module:
forever_effective: '永远有效' forever_effective: '永远有效'
year: '年' year: '年'
month: '个月' month: '个月'
today: '今日'
alipay: '支付宝' alipay: '支付宝'
wechat: '微信' wechat: '微信'
analysis: '分析' analysis: '分析'
...@@ -125,6 +126,14 @@ common_module: ...@@ -125,6 +126,14 @@ common_module:
unlimited_duration: '无期限' unlimited_duration: '无期限'
buy_now: '立即购买' buy_now: '立即购买'
payment_success: '支付成功' payment_success: '支付成功'
back: '返回'
time: '次'
export_data: '导出数据'
not_generated: '未生成'
export_successfully: '导出成功'
export_failed: '导出失败'
copy_link: '复制链接'
or: '或'
dialogue_module: dialogue_module:
continue_question_message: '你可以继续提问' continue_question_message: '你可以继续提问'
...@@ -175,6 +184,7 @@ router_title_module: ...@@ -175,6 +184,7 @@ router_title_module:
application_square: '应用广场' application_square: '应用广场'
personal_settings: '个人设置' personal_settings: '个人设置'
order_manage: '订单管理' order_manage: '订单管理'
data_statistic: '数据统计'
login_module: login_module:
app_welcome_words: 'Hi, 欢迎使用Model Link' app_welcome_words: 'Hi, 欢迎使用Model Link'
...@@ -372,6 +382,13 @@ personal_space_module: ...@@ -372,6 +382,13 @@ personal_space_module:
removal_prompt_title: '确定要下架在应用广场的应用?' removal_prompt_title: '确定要下架在应用广场的应用?'
removal_prompt_content: '下架后,平台用户将无法通过应用广场体验本应用,如需再次上架请重新配置。' removal_prompt_content: '下架后,平台用户将无法通过应用广场体验本应用,如需再次上架请重新配置。'
successfully_configured_published: '配置成功,已发布至应用广场' successfully_configured_published: '配置成功,已发布至应用广场'
api_call: 'API调用'
api_call_desc: '可使用API对接应用接口'
interface_document: '接口文档'
click_to_generate: '点击生成'
agentId: '应用ID'
api_call_details: 'API调用明细'
api_call_datetime: '调用时间'
agent_sale_module: agent_sale_module:
application_square_release_setting: '应用广场发布配置' application_square_release_setting: '应用广场发布配置'
...@@ -412,6 +429,8 @@ personal_space_module: ...@@ -412,6 +429,8 @@ personal_space_module:
upload_knowledge_document_btn_text: '导入文件' upload_knowledge_document_btn_text: '导入文件'
batch_delete_knowledge_document_btn_text: '批量删除' batch_delete_knowledge_document_btn_text: '批量删除'
not_find_knowledge_document_message: '未找到知识库文件' not_find_knowledge_document_message: '未找到知识库文件'
not_all_files_train_complete_tip: '存在不可用文件,请删除文件后再添加'
cannot_add_tip_when_file_is_training: '文件正在学习中,不可添加'
create_knowledge_modal_title: '创建知识库' create_knowledge_modal_title: '创建知识库'
edit_knowledge_modal_title: '编辑知识库' edit_knowledge_modal_title: '编辑知识库'
...@@ -555,6 +574,8 @@ equity_module: ...@@ -555,6 +574,8 @@ equity_module:
point_recharge: '积分充值' point_recharge: '积分充值'
get_points_for_interacting_with_the_ai: '获得{points}积分,用于和AI互动行动' get_points_for_interacting_with_the_ai: '获得{points}积分,用于和AI互动行动'
no_time_limit_when_used_up: '无期限,用完即止' no_time_limit_when_used_up: '无期限,用完即止'
agents_created_exceeds_tip: '创建应用数量超出当前套餐权益,请升级套餐'
documents_uploaded_exceeds_tip: '上传文件超出当前套餐权益,请升级套餐(剩余可上传{count}个)'
order_manage_module: order_manage_module:
package_name: '套餐名称' package_name: '套餐名称'
...@@ -588,5 +609,28 @@ analysis_module: ...@@ -588,5 +609,28 @@ analysis_module:
usage_channel: '使用渠道' usage_channel: '使用渠道'
index: '首页' index: '首页'
agent_square: '应用广场' agent_square: '应用广场'
api: 'api调用' api: 'API调用'
link_share: '网页链接' link_share: '网页链接'
statistic_module:
data_statistic: '数据统计'
point_statistic: '积分统计'
agent_statistic: '应用统计'
platform_point_usage: '平台积分使用情况'
platform_point_trend: '平台积分使用趋势'
today_usage: '今日消耗积分'
current_week_usage: '本周消耗积分'
current_month_usage: '本月消耗积分'
current_year_usage: '本年消耗积分'
create_agent_count: '创建的应用'
usage_agent_count: '使用的应用'
unpublish_agent_count: '未发布的应用'
published_agent_count: '已发布的应用'
platform_agent_usage_detail: '各应用使用明细表'
agent_title: '应用标题'
agent_status: '应用状态'
owner: '开发者'
usage_count: '使用次数'
last_usage_time: '最后一次使用时间'
...@@ -111,6 +111,7 @@ common_module: ...@@ -111,6 +111,7 @@ common_module:
forever_effective: '永遠有效' forever_effective: '永遠有效'
year: '年' year: '年'
month: '個月' month: '個月'
today: '今日'
alipay: '支付寶' alipay: '支付寶'
wechat: '微信' wechat: '微信'
analysis: '分析' analysis: '分析'
...@@ -125,6 +126,14 @@ common_module: ...@@ -125,6 +126,14 @@ common_module:
unlimited_duration: '無期限' unlimited_duration: '無期限'
buy_now: '立即購買' buy_now: '立即購買'
payment_success: '支付成功' payment_success: '支付成功'
back: '返回'
time: '次'
export_data: '導出數據'
not_generated: '未生成'
export_successfully: '導出成功'
export_failed: '導出失敗'
copy_link: '複製鏈接'
or: '或'
dialogue_module: dialogue_module:
continue_question_message: '你可以繼續提問' continue_question_message: '你可以繼續提問'
...@@ -175,6 +184,7 @@ router_title_module: ...@@ -175,6 +184,7 @@ router_title_module:
application_square: '應用廣場' application_square: '應用廣場'
personal_settings: '個人設置' personal_settings: '個人設置'
order_manage: '訂單管理' order_manage: '訂單管理'
data_statistic: '數據統計'
login_module: login_module:
app_welcome_words: 'Hi, 歡迎使用Model Link' app_welcome_words: 'Hi, 歡迎使用Model Link'
...@@ -372,6 +382,13 @@ personal_space_module: ...@@ -372,6 +382,13 @@ personal_space_module:
removal_prompt_title: '確定要下架在應用廣場的應用?' removal_prompt_title: '確定要下架在應用廣場的應用?'
removal_prompt_content: '下架後,平臺用戶將無法通過應用廣場體驗本應用,如需再次上架請重新配置。' removal_prompt_content: '下架後,平臺用戶將無法通過應用廣場體驗本應用,如需再次上架請重新配置。'
successfully_configured_published: '配置成功,已發布至應用廣場' successfully_configured_published: '配置成功,已發布至應用廣場'
api_call: 'API調用'
api_call_desc: '可使用API對接應用接口'
interface_document: '接口文檔'
click_to_generate: '點擊生成'
agentId: '應用ID'
api_call_details: 'API調用明細'
api_call_datetime: '調用時間'
agent_sale_module: agent_sale_module:
application_square_release_setting: '應用廣場發佈配寘' application_square_release_setting: '應用廣場發佈配寘'
...@@ -412,6 +429,8 @@ personal_space_module: ...@@ -412,6 +429,8 @@ personal_space_module:
upload_knowledge_document_btn_text: '導入文件' upload_knowledge_document_btn_text: '導入文件'
batch_delete_knowledge_document_btn_text: '批量刪除' batch_delete_knowledge_document_btn_text: '批量刪除'
not_find_knowledge_document_message: '未找到知識庫文件' not_find_knowledge_document_message: '未找到知識庫文件'
not_all_files_train_complete_tip: '存在不可用文件,請刪除文件後再添加'
cannot_add_tip_when_file_is_training: '文件正在學習中,不可添加'
create_knowledge_modal_title: '創建知識庫' create_knowledge_modal_title: '創建知識庫'
edit_knowledge_modal_title: '編輯知識庫' edit_knowledge_modal_title: '編輯知識庫'
...@@ -555,6 +574,8 @@ equity_module: ...@@ -555,6 +574,8 @@ equity_module:
point_recharge: '积分充值' point_recharge: '积分充值'
get_points_for_interacting_with_the_ai: '獲得{points}積分,用於和AI互動行動' get_points_for_interacting_with_the_ai: '獲得{points}積分,用於和AI互動行動'
no_time_limit_when_used_up: '無期限,用完即止' no_time_limit_when_used_up: '無期限,用完即止'
agents_created_exceeds_tip: '創建應用數量超出當前套餐權益,請升級套餐'
documents_uploaded_exceeds_tip: '上傳文件超出當前套餐權益,請升級套餐(剩餘可上傳{count}個)'
order_manage_module: order_manage_module:
package_name: '套餐名稱' package_name: '套餐名稱'
...@@ -588,5 +609,26 @@ analysis_module: ...@@ -588,5 +609,26 @@ analysis_module:
usage_channel: '使用渠道' usage_channel: '使用渠道'
index: '首頁' index: '首頁'
agent_square: '應用廣場' agent_square: '應用廣場'
api: 'api調用' api: 'API調用'
link_share: '網頁鏈接' link_share: '網頁鏈接'
statistic_module:
data_statistic: '數據統計'
point_statistic: '積分統計'
agent_statistic: '應用統計'
platform_point_usage: '平台積分使用情況'
platform_point_trend: '平台積分使用趨勢'
today_usage: '今日消耗積分'
current_week_usage: '本週消耗積分'
current_month_usage: '本月消耗積分'
current_year_usage: '本年消耗積分'
create_agent_count: '創建的應用'
usage_agent_count: '使用的應用'
unpublish_agent_count: '未發佈的應用'
published_agent_count: '已發佈的應用'
platform_agent_usage_detail: '各應用使用明細表'
agent_title: '應用標題'
agent_status: '應用狀態'
owner: '開發者'
usage_count: '使用次數'
last_usage_time: '最後一次使用時間'
import { type RouteRecordRaw } from 'vue-router'
import Layout from '@/layout/index.vue'
export default [
{
path: '/statistic-layout',
name: 'StatisticLayout',
meta: {
rank: 1001,
title: '',
},
component: Layout,
redirect: '/statistic',
children: [
{
path: '/statistic',
name: 'Statistic',
meta: {
rank: 1001,
title: 'router_title_module.data_statistic',
},
component: () => import('@/views/statistics/statistics.vue'),
redirect: '/statistic/point-statistic',
children: [
{
path: '/statistic/point-statistic',
name: 'PointStatistic',
meta: {
rank: 1001,
title: 'router_title_module.data_statistic',
belong: 'Statistic',
},
component: () => import('@/views/statistics/point-statistic/point-static.vue'),
},
{
path: '/statistic/agent-statistic',
name: 'AgentStatistic',
meta: {
rank: 1001,
title: 'router_title_module.data_statistic',
belong: 'Statistic',
},
component: () => import('@/views/statistics/agent-statistic/agent-statistic.vue'),
},
],
},
],
},
] as RouteRecordRaw[]
...@@ -53,6 +53,10 @@ export const useUserStore = defineStore('user-store', { ...@@ -53,6 +53,10 @@ export const useUserStore = defineStore('user-store', {
this.token = '' this.token = ''
this.userInfo = createDefaultUserInfoFactory() this.userInfo = createDefaultUserInfoFactory()
if (window.google) {
window.google.accounts.id.disableAutoSelect()
}
ss.remove(UserStoreStorageKeyEnum.isLogin) ss.remove(UserStoreStorageKeyEnum.isLogin)
ss.remove(UserStoreStorageKeyEnum.token) ss.remove(UserStoreStorageKeyEnum.token)
ss.remove(UserStoreStorageKeyEnum.userInfo) ss.remove(UserStoreStorageKeyEnum.userInfo)
......
<script setup lang="ts"> <script setup lang="ts">
import { useSystemLanguageStore } from '@/store/modules/system-language'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import { computed } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
type VersionName = 'BasicVersion' | 'ProfessionalVersion' | 'FlagshipVersion' | 'EnterpriseVersion' | null type VersionName = 'BasicVersion' | 'ProfessionalVersion' | 'FlagshipVersion' | 'EnterpriseVersion' | null
...@@ -9,6 +11,9 @@ const currentSelectVersion = defineModel<VersionName>('currentSelectVersion', { ...@@ -9,6 +11,9 @@ const currentSelectVersion = defineModel<VersionName>('currentSelectVersion', {
const { t } = useI18n() const { t } = useI18n()
const userStore = useUserStore() const userStore = useUserStore()
const systemLanguageStore = useSystemLanguageStore()
const isEnglishLanguage = computed(() => systemLanguageStore.currentLanguageInfo.key === 'en')
function handleVersionSwitch(version: VersionName) { function handleVersionSwitch(version: VersionName) {
if ( if (
...@@ -32,7 +37,10 @@ function handleVersionSwitch(version: VersionName) { ...@@ -32,7 +37,10 @@ function handleVersionSwitch(version: VersionName) {
class="mt-[31px] grid grid-flow-row-dense gap-[29px]" class="mt-[31px] grid grid-flow-row-dense gap-[29px]"
style="grid-template-columns: repeat(auto-fill, minmax(255px, 1fr))" style="grid-template-columns: repeat(auto-fill, minmax(255px, 1fr))"
> >
<section class="relative h-[452px] rounded-[10px] border border-[#CFD3D4] bg-[#FBFCFF]"> <section
class="relative h-[452px] rounded-[10px] border border-[#CFD3D4] bg-[#FBFCFF]"
:class="[isEnglishLanguage ? 'h-[492px]' : 'h-[452px]']"
>
<div <div
v-if="userStore.equityInfo.equityLevel === 'normal'" v-if="userStore.equityInfo.equityLevel === 'normal'"
class="z-1 absolute left-[-1px] top-0 -translate-y-1/2 rounded-[2px_16px_2px_2px] px-[10px] py-[6px] text-[12px] text-white" class="z-1 absolute left-[-1px] top-0 -translate-y-1/2 rounded-[2px_16px_2px_2px] px-[10px] py-[6px] text-[12px] text-white"
...@@ -58,25 +66,30 @@ function handleVersionSwitch(version: VersionName) { ...@@ -58,25 +66,30 @@ function handleVersionSwitch(version: VersionName) {
</div> </div>
<div class="mt-[12px]"> <div class="mt-[12px]">
<ul class="ml-[42px]"> <ul class="pr-[8px]" :class="isEnglishLanguage ? 'ml-[12px]' : 'ml-[42px]'">
<li class="mb-[14px] flex items-center text-[14px] text-[#010448]"> <li class="mb-[14px] flex text-[14px] text-[#010448]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#D8D8D8]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#D8D8D8]"></span>
{{ t('equity_module.points2') }}<span class="font-600">50</span> <div>{{ t('equity_module.points2') }}<span class="font-600">50</span></div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#010448]"> <li class="mb-[14px] flex text-[14px] text-[#010448]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#D8D8D8]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#D8D8D8]"></span>
{{ t('equity_module.upper_application_limit') }} <div>
<span class="font-600">5{{ t('equity_module.individual') }}</span> {{ t('equity_module.upper_application_limit') }}
<span class="font-600">5 {{ t('equity_module.individual') }}</span>
</div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#010448]"> <li class="mb-[14px] flex text-[14px] text-[#010448]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#D8D8D8]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#D8D8D8]"></span>
{{ t('equity_module.number_of_knowledge_base_files') }}<span class="font-600" <div>
>5{{ t('equity_module.individual') }}</span {{ t('equity_module.number_of_knowledge_base_files') }}
> <span class="font-600">5 {{ t('equity_module.individual') }}</span>
</div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#010448]"> <li class="mb-[14px] flex text-[14px] text-[#010448]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#D8D8D8]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#D8D8D8]"></span>
{{ t('equity_module.support_ai_model') }}<span class="font-600">{{ t('common_module.all') }}</span> <div>
{{ t('equity_module.support_ai_model') }}<span class="font-600">{{ t('common_module.all') }}</span>
</div>
</li> </li>
</ul> </ul>
</div> </div>
...@@ -84,7 +97,10 @@ function handleVersionSwitch(version: VersionName) { ...@@ -84,7 +97,10 @@ function handleVersionSwitch(version: VersionName) {
<section <section
class="relative h-[452px] rounded-[10px] border border-[#F4DEC5] bg-[#FFFDFB] transition-all" class="relative h-[452px] rounded-[10px] border border-[#F4DEC5] bg-[#FFFDFB] transition-all"
:class="currentSelectVersion === 'ProfessionalVersion' ? 'border-[#FFC07B] !bg-[#FFF7ED]' : ''" :class="[
currentSelectVersion === 'ProfessionalVersion' ? 'border-[#FFC07B] !bg-[#FFF7ED]' : '',
isEnglishLanguage ? 'h-[492px]' : 'h-[452px]',
]"
> >
<div <div
v-if="userStore.equityInfo.equityLevel === 'professional'" v-if="userStore.equityInfo.equityLevel === 'professional'"
...@@ -128,29 +144,35 @@ function handleVersionSwitch(version: VersionName) { ...@@ -128,29 +144,35 @@ function handleVersionSwitch(version: VersionName) {
</div> </div>
<div class="mt-[12px]"> <div class="mt-[12px]">
<ul class="ml-[42px]"> <ul :class="isEnglishLanguage ? 'ml-[12px]' : 'ml-[42px]'">
<li class="mb-[14px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[14px] flex text-[14px] text-[#482801]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#EBD8BE]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#EBD8BE]"></span>
{{ t('equity_module.points2') }} <div>
<span class="font-600" {{ t('equity_module.points2') }}
>{{ t('equity_module.monthly_pass') }} 100/{{ t('equity_module.annual_card') }} 1500</span <span class="font-600"
> >{{ t('equity_module.monthly_pass') }} 100/{{ t('equity_module.annual_card') }} 1500</span
>
</div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[14px] flex text-[14px] text-[#482801]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#EBD8BE]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#EBD8BE]"></span>
{{ t('equity_module.upper_application_limit') }}<span class="font-600" <div>
>30{{ t('equity_module.individual') }}</span {{ t('equity_module.upper_application_limit') }}
> <span class="font-600">30{{ t('equity_module.individual') }}</span>
</div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[14px] flex text-[14px] text-[#482801]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#EBD8BE]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#EBD8BE]"></span>
{{ t('equity_module.number_of_knowledge_base_files') }}<span class="font-600" <div>
>50{{ t('equity_module.individual') }}</span {{ t('equity_module.number_of_knowledge_base_files') }}
> <span class="font-600">50{{ t('equity_module.individual') }}</span>
</div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[14px] flex text-[14px] text-[#482801]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#EBD8BE]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#EBD8BE]"></span>
{{ t('equity_module.support_ai_model') }}<span class="font-600">{{ t('common_module.all') }}</span> <div>
{{ t('equity_module.support_ai_model') }}<span class="font-600">{{ t('common_module.all') }}</span>
</div>
</li> </li>
</ul> </ul>
</div> </div>
...@@ -158,7 +180,10 @@ function handleVersionSwitch(version: VersionName) { ...@@ -158,7 +180,10 @@ function handleVersionSwitch(version: VersionName) {
<section <section
class="relative h-[452px] rounded-[10px] border border-[#F4DEC5] bg-[#FFFDFB]" class="relative h-[452px] rounded-[10px] border border-[#F4DEC5] bg-[#FFFDFB]"
:class="currentSelectVersion === 'FlagshipVersion' ? 'border-[#FFC07B] !bg-[#FFF7ED]' : ''" :class="[
currentSelectVersion === 'FlagshipVersion' ? 'border-[#FFC07B] !bg-[#FFF7ED]' : '',
isEnglishLanguage ? 'h-[492px]' : 'h-[452px]',
]"
> >
<div <div
v-if="userStore.equityInfo.equityLevel === 'ultimate'" v-if="userStore.equityInfo.equityLevel === 'ultimate'"
...@@ -202,35 +227,46 @@ function handleVersionSwitch(version: VersionName) { ...@@ -202,35 +227,46 @@ function handleVersionSwitch(version: VersionName) {
</div> </div>
<div class="mt-[12px]"> <div class="mt-[12px]">
<ul class="ml-[42px]"> <ul class="pr-[8px]" :class="isEnglishLanguage ? 'ml-[12px]' : 'ml-[42px]'">
<li class="mb-[14px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[14px] flex text-[14px] text-[#482801]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#EBD8BE]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#EBD8BE]"></span>
{{ t('equity_module.points2') }}<span class="font-600" <div>
>{{ t('equity_module.monthly_pass') }} 200/{{ t('equity_module.annual_card') }} 3000</span {{ t('equity_module.points2') }}
> <span class="font-600">
{{ t('equity_module.monthly_pass') }} 200/{{ t('equity_module.annual_card') }} 3000
</span>
</div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#482801] before:mr-[5px]"> <li class="mb-[14px] flex text-[14px] text-[#482801] before:mr-[5px]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#EBD8BE]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#EBD8BE]"></span>
{{ t('equity_module.upper_application_limit') }} <div>
<span class="font-600">{{ t('common_module.unlimited_amount') }}</span> {{ t('equity_module.upper_application_limit') }}
<span class="font-600">{{ t('common_module.unlimited_amount') }}</span>
</div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[14px] flex text-[14px] text-[#482801]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#EBD8BE]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#EBD8BE]"></span>
{{ t('equity_module.number_of_knowledge_base_files') }}<span class="font-600" <div>
>100{{ t('equity_module.individual') }}</span {{ t('equity_module.number_of_knowledge_base_files') }}
> <span class="font-600">100{{ t('equity_module.individual') }}</span>
</div>
</li> </li>
<li class="mb-[14px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[14px] flex text-[14px] text-[#482801]">
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#EBD8BE]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#EBD8BE]"></span>
{{ t('equity_module.support_ai_model') }}<span class="font-600">{{ t('common_module.all') }}</span> <div>
{{ t('equity_module.support_ai_model') }}<span class="font-600">{{ t('common_module.all') }}</span>
</div>
</li> </li>
</ul> </ul>
</div> </div>
</section> </section>
<section <section
class="relative h-[452px] rounded-[10px] border border-[#D2D2D0] bg-[#F8F8F8]" class="relative rounded-[10px] border border-[#D2D2D0] bg-[#F8F8F8]"
:class="currentSelectVersion === 'EnterpriseVersion' ? 'border-[#000000] !bg-[#86785B]' : ''" :class="[
currentSelectVersion === 'EnterpriseVersion' ? 'border-[#000000] !bg-[#86785B]' : '',
isEnglishLanguage ? 'h-[492px]' : 'h-[452px]',
]"
> >
<!-- <div <!-- <div
v-if="userStore.equityInfo.equityLevel === 'ultimate'" v-if="userStore.equityInfo.equityLevel === 'ultimate'"
...@@ -269,63 +305,76 @@ function handleVersionSwitch(version: VersionName) { ...@@ -269,63 +305,76 @@ function handleVersionSwitch(version: VersionName) {
</button> </button>
</div> </div>
<div class="mt-[12px]"> <div class="mt-[12px]">
<ul class="ml-[42px]"> <ul class="pr-[8px]" :class="isEnglishLanguage ? 'ml-[12px]' : 'ml-[42px]'">
<li <li
class="mb-[14px] flex items-center text-[14px] text-[#482801]" class="mb-[14px] flex text-[14px] text-[#482801]"
:class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''" :class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''"
> >
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#C7C2AB]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#C7C2AB]"></span>
{{ t('equity_module.points2') }}<span class="font-600 text-[#FFE0A0]">{{ <div>
t('common_module.unlimited_amount') {{ t('equity_module.points2') }}
}}</span> <span class="font-600 text-[#FFE0A0]">{{ t('common_module.unlimited_amount') }}</span>
</div>
</li> </li>
<li <li
class="mb-[14px] flex items-center text-[14px] text-[#482801]" class="mb-[14px] flex text-[14px] text-[#482801]"
:class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''" :class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''"
> >
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#C7C2AB]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#C7C2AB]"></span>
{{ t('equity_module.upper_application_limit') }} <div>
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.unlimited_amount') }}</span> {{ t('equity_module.upper_application_limit') }}
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.unlimited_amount') }}</span>
</div>
</li> </li>
<li <li
class="mb-[14px] flex items-center text-[14px] text-[#482801]" class="mb-[14px] flex text-[14px] text-[#482801]"
:class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''" :class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''"
> >
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#C7C2AB]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#C7C2AB]"></span>
{{ t('equity_module.number_of_knowledge_base_files') }} <div>
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.unlimited_amount') }}</span> {{ t('equity_module.number_of_knowledge_base_files') }}
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.unlimited_amount') }}</span>
</div>
</li> </li>
<li <li
class="mb-[14px] flex items-center text-[14px] text-[#482801]" class="mb-[14px] flex text-[14px] text-[#482801]"
:class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''" :class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''"
> >
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#C7C2AB]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#C7C2AB]"></span>
{{ t('equity_module.support_ai_model') }} <div>
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.all') }}</span> {{ t('equity_module.support_ai_model') }}
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.all') }}</span>
</div>
</li> </li>
<li <li
class="mb-[14px] flex items-center text-[14px] text-[#482801]" class="mb-[14px] flex text-[14px] text-[#482801]"
:class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''" :class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''"
> >
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#C7C2AB]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#C7C2AB]"></span>
{{ t('equity_module.custom_digital_person') }} <div>
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.support') }}</span> {{ t('equity_module.custom_digital_person') }}
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.support') }}</span>
</div>
</li> </li>
<li <li
class="mb-[14px] flex items-center text-[14px] text-[#482801]" class="mb-[14px] flex text-[14px] text-[#482801]"
:class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''" :class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''"
> >
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#C7C2AB]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#C7C2AB]"></span>
{{ t('equity_module.ai_training_tuning_service') }} <div>
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.support') }}</span> {{ t('equity_module.ai_training_tuning_service') }}
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.support') }}</span>
</div>
</li> </li>
<li <li
class="mb-[14px] flex items-center text-[14px] text-[#482801]" class="mb-[14px] flex text-[14px] text-[#482801]"
:class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''" :class="currentSelectVersion === 'EnterpriseVersion' ? 'text-[#FFFAF6]' : ''"
> >
<span class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full bg-[#C7C2AB]"></span> <span class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full bg-[#C7C2AB]"></span>
{{ t('equity_module.private_deployment') }} <div>
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.support') }}</span> {{ t('equity_module.private_deployment') }}
<span class="font-600 text-[#FFE0A0]">{{ t('common_module.support') }}</span>
</div>
</li> </li>
</ul> </ul>
</div> </div>
......
<script setup lang="ts"> <script setup lang="ts">
import { fetchCreateEquityOrder, fetchGetEquityPayQrCode, fetchGetPayStatus } from '@/apis/equity' import { fetchCreateEquityOrder, fetchGetEquityPayQrCode, fetchGetPayStatus } from '@/apis/equity'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import { computed, onMounted, ref, watch, watchEffect } from 'vue' import { computed, onMounted, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
type VersionName = 'BasicVersion' | 'ProfessionalVersion' | 'FlagshipVersion' | 'EnterpriseVersion' | null type VersionName = 'BasicVersion' | 'ProfessionalVersion' | 'FlagshipVersion' | 'EnterpriseVersion' | null
...@@ -24,7 +24,7 @@ const packageList = ref({ ...@@ -24,7 +24,7 @@ const packageList = ref({
title: t('equity_module.flagship_version'), title: t('equity_module.flagship_version'),
list: [ list: [
{ name: t('equity_module.monthly_pass'), currentPrice: 29.9, originalPrice: 39.9, discountedPrice: 10 }, { name: t('equity_module.monthly_pass'), currentPrice: 29.9, originalPrice: 39.9, discountedPrice: 10 },
{ name: t('equity_module.annual_card'), currentPrice: 299, originalPrice: 238.9, discountedPrice: 59.9 }, { name: t('equity_module.annual_card'), currentPrice: 299, originalPrice: 358.9, discountedPrice: 59.9 },
], ],
}, },
}) })
...@@ -37,7 +37,8 @@ const payInfo = ref({ ...@@ -37,7 +37,8 @@ const payInfo = ref({
payOrderSn: '', payOrderSn: '',
}) })
const isPayQrcodeInvalid = ref(false) const isPayQrcodeInvalid = ref(false)
const payStatusTimer = ref<NodeJS.Timeout | null>(null) let payStatusTimer: NodeJS.Timeout | null = null
let controller: AbortController | null = null
const isShowPayQrCode = computed(() => { const isShowPayQrCode = computed(() => {
return !!( return !!(
...@@ -53,7 +54,17 @@ const currentPackageInfo = computed(() => { ...@@ -53,7 +54,17 @@ const currentPackageInfo = computed(() => {
return null return null
}) })
watch(currentSelectVersion, () => { watch(currentSelectVersion, (newVal) => {
if ((!newVal && payStatusTimer !== null) || !isShowPayQrCode.value) {
clearPayStatusTimer()
}
if (newVal && ['ProfessionalVersion', 'FlagshipVersion'].includes(newVal)) {
getEquityPayQrCode()
} else {
clearPayStatusTimer()
}
clearPayInfo() clearPayInfo()
currentSelectPackage.value = 0 currentSelectPackage.value = 0
...@@ -66,12 +77,6 @@ watch(currentPackageInfo, (info) => { ...@@ -66,12 +77,6 @@ watch(currentPackageInfo, (info) => {
} }
}) })
watchEffect(() => {
if (isShowPayQrCode.value) {
getEquityPayQrCode()
}
})
onMounted(() => { onMounted(() => {
if (currentPackageInfo.value) { if (currentPackageInfo.value) {
currentPayPrice.value = currentPackageInfo.value.list[0].currentPrice currentPayPrice.value = currentPackageInfo.value.list[0].currentPrice
...@@ -89,9 +94,13 @@ function clearPayInfo() { ...@@ -89,9 +94,13 @@ function clearPayInfo() {
} }
function getEquityPayQrCode() { function getEquityPayQrCode() {
controller && controller.abort()
clearPayStatusTimer() clearPayStatusTimer()
clearPayInfo() clearPayInfo()
controller = new AbortController()
const payload = { const payload = {
type: '', type: '',
domain: 'equity', domain: 'equity',
...@@ -116,7 +125,7 @@ function getEquityPayQrCode() { ...@@ -116,7 +125,7 @@ function getEquityPayQrCode() {
break break
} }
fetchCreateEquityOrder<string>(payload).then((orderRes) => { fetchCreateEquityOrder<string>(payload, controller).then((orderRes) => {
if (orderRes.code !== 0) return '' if (orderRes.code !== 0) return ''
const payQrCodePayload = { const payQrCodePayload = {
...@@ -133,26 +142,28 @@ function getEquityPayQrCode() { ...@@ -133,26 +142,28 @@ function getEquityPayQrCode() {
break break
} }
fetchGetEquityPayQrCode<{ packageExtra: string; payOrderSn: string }>(payQrCodePayload).then((qrcodeRes) => { fetchGetEquityPayQrCode<{ packageExtra: string; payOrderSn: string }>(payQrCodePayload, controller!).then(
if (orderRes.code !== 0) return '' (qrcodeRes) => {
if (orderRes.code !== 0) return ''
isPayQrcodeInvalid.value = false isPayQrcodeInvalid.value = false
payInfo.value = { payInfo.value = {
url: qrcodeRes.data.packageExtra.replace('code_url=', ''), url: qrcodeRes.data.packageExtra.replace('code_url=', ''),
payOrderSn: qrcodeRes.data.payOrderSn, payOrderSn: qrcodeRes.data.payOrderSn,
} }
/* 延迟自动取消支付查询 */ /* 延迟自动取消支付查询 */
setTimeout( setTimeout(
() => { () => {
isPayQrcodeInvalid.value = true isPayQrcodeInvalid.value = true
}, },
10 * 60 * 1000, 10 * 60 * 1000,
) )
getPayStatus() getPayStatus()
}) },
)
}) })
} }
...@@ -175,15 +186,17 @@ function getPayStatus() { ...@@ -175,15 +186,17 @@ function getPayStatus() {
}) })
} }
payStatusTimer.value = setInterval(() => { clearPayStatusTimer()
payStatusTimer = setInterval(() => {
request() request()
}, 1000) }, 1000)
} }
function clearPayStatusTimer() { function clearPayStatusTimer() {
if (payStatusTimer.value) { if (payStatusTimer !== null) {
clearInterval(payStatusTimer.value) clearInterval(payStatusTimer)
payStatusTimer.value = null payStatusTimer = null
} }
} }
...@@ -200,6 +213,10 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric ...@@ -200,6 +213,10 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric
getEquityPayQrCode() getEquityPayQrCode()
} }
function handlePayQrCodeRefresh() {
getEquityPayQrCode()
}
</script> </script>
<template> <template>
...@@ -226,21 +243,21 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric ...@@ -226,21 +243,21 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric
</div> </div>
<div class="font-600 mt-[20px] text-[20px] text-[#482801]"> <div class="font-600 mt-[20px] text-[20px] text-[#482801]">
{{ packageItem.currentPrice }}<span class="text-[14px]"> CNY$/{{ t('equity_module.month') }}</span> {{ packageItem.currentPrice }}<span class="text-[14px]"> /{{ t('equity_module.month') }}</span>
</div> </div>
<div <div
v-show="currentSelectPackage === index" v-show="currentSelectPackage === index"
class="mt-[6px] text-center text-[14px] text-[#482801] line-through" class="mt-[6px] text-center text-[14px] text-[#482801] line-through"
> >
{{ packageItem.originalPrice }} CNY$ {{ packageItem.originalPrice }}
</div> </div>
<div <div
v-show="currentSelectPackage !== index" v-show="currentSelectPackage !== index"
class="absolute bottom-0 w-full bg-[#ffebd2] py-[6px] text-center text-[12px] text-[#9A5705]" class="absolute bottom-0 w-full bg-[#ffebd2] py-[6px] text-center text-[12px] text-[#9A5705]"
> >
{{ t('equity_module.discounted') }}{{ packageItem.discountedPrice }}CNY$ {{ t('equity_module.discounted') }}{{ packageItem.discountedPrice }}
</div> </div>
<div <div
...@@ -301,7 +318,10 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric ...@@ -301,7 +318,10 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric
<div v-show="isPayQrcodeInvalid" class="flex-center absolute inset-0 flex"> <div v-show="isPayQrcodeInvalid" class="flex-center absolute inset-0 flex">
<div class="absolute inset-0 bg-[rgba(0,0,0,0.6)] blur-sm"></div> <div class="absolute inset-0 bg-[rgba(0,0,0,0.6)] blur-sm"></div>
<i class="iconfont icon-huanyihuan font-600 z-1 relative text-[30px] text-[#fff]"></i> <i
class="iconfont icon-huanyihuan font-600 z-1 relative cursor-pointer text-[30px] text-[#fff]"
@click="handlePayQrCodeRefresh"
></i>
</div> </div>
</Transition> </Transition>
</div> </div>
...@@ -316,7 +336,7 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric ...@@ -316,7 +336,7 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric
<span class="font-600 text-[16px]"> <span class="font-600 text-[16px]">
{{ t('common_module.alipay') }} {{ t('equity_module.scan_code_payment') }} {{ t('common_module.alipay') }} {{ t('equity_module.scan_code_payment') }}
<span class="text-[24px] text-[#F25744]">{{ currentPayPrice }}</span <span class="text-[24px] text-[#F25744]">{{ currentPayPrice }}</span
>CNY$ >
</span> </span>
</template> </template>
<template v-else-if="currentPaymentMethod === 'wechatpay'"> <template v-else-if="currentPaymentMethod === 'wechatpay'">
...@@ -324,7 +344,7 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric ...@@ -324,7 +344,7 @@ function handlePackageSwitch(packageKey: typeof currentSelectPackage.value, pric
<span class="font-600 text-[16px]"> <span class="font-600 text-[16px]">
{{ t('common_module.wechat') }} {{ t('equity_module.scan_code_payment') }} {{ t('common_module.wechat') }} {{ t('equity_module.scan_code_payment') }}
<span class="text-[24px] text-[#F25744]">{{ currentPayPrice }}</span <span class="text-[24px] text-[#F25744]">{{ currentPayPrice }}</span
>CNY$ >
</span> </span>
</template> </template>
</div> </div>
......
...@@ -5,14 +5,16 @@ import { ...@@ -5,14 +5,16 @@ import {
fetchGetPayStatus, fetchGetPayStatus,
fetchGetPointsGiftPackageList, fetchGetPointsGiftPackageList,
} from '@/apis/equity' } from '@/apis/equity'
import { useSystemLanguageStore } from '@/store/modules/system-language'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import { ref, watch } from 'vue' import { computed, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
const isShowPointRechargeModal = defineModel<boolean>('isShowPointRechargeModal', { default: false }) const isShowPointRechargeModal = defineModel<boolean>('isShowPointRechargeModal', { default: false })
const { t } = useI18n() const { t } = useI18n()
const userStore = useUserStore() const userStore = useUserStore()
const systemLanguageStore = useSystemLanguageStore()
const currentSelectPackage = ref<0 | 1 | 2>(0) // 1:100积分 2:350积分 3:600积分 const currentSelectPackage = ref<0 | 1 | 2>(0) // 1:100积分 2:350积分 3:600积分
const currentPaymentMethod = ref<'alipay' | 'wechatpay'>('alipay') const currentPaymentMethod = ref<'alipay' | 'wechatpay'>('alipay')
...@@ -41,8 +43,11 @@ const payInfo = ref({ ...@@ -41,8 +43,11 @@ const payInfo = ref({
payOrderSn: '', payOrderSn: '',
}) })
const isPayQrcodeInvalid = ref(false) const isPayQrcodeInvalid = ref(false)
const payStatusTimer = ref<NodeJS.Timeout | null>(null)
const currentPayPrice = ref(0) const currentPayPrice = ref(0)
let payStatusTimer: NodeJS.Timeout | null = null
let controller: AbortController | null = null
const isEnglishLanguage = computed(() => systemLanguageStore.currentLanguageInfo.key === 'en')
watch(isShowPointRechargeModal, (newVal) => { watch(isShowPointRechargeModal, (newVal) => {
if (newVal) { if (newVal) {
...@@ -82,9 +87,13 @@ function getPointsGiftPackageList() { ...@@ -82,9 +87,13 @@ function getPointsGiftPackageList() {
} }
function getEquityPayQrCode() { function getEquityPayQrCode() {
controller && controller.abort()
clearPayStatusTimer() clearPayStatusTimer()
clearPayInfo() clearPayInfo()
controller = new AbortController()
const payload = { const payload = {
type: '', type: '',
domain: 'point', domain: 'point',
...@@ -106,7 +115,7 @@ function getEquityPayQrCode() { ...@@ -106,7 +115,7 @@ function getEquityPayQrCode() {
break break
} }
fetchCreateEquityOrder<string>(payload).then((orderRes) => { fetchCreateEquityOrder<string>(payload, controller).then((orderRes) => {
if (orderRes.code !== 0) return '' if (orderRes.code !== 0) return ''
const payQrCodePayload = { const payQrCodePayload = {
...@@ -123,26 +132,28 @@ function getEquityPayQrCode() { ...@@ -123,26 +132,28 @@ function getEquityPayQrCode() {
break break
} }
fetchGetEquityPayQrCode<{ packageExtra: string; payOrderSn: string }>(payQrCodePayload).then((qrcodeRes) => { fetchGetEquityPayQrCode<{ packageExtra: string; payOrderSn: string }>(payQrCodePayload, controller!).then(
if (orderRes.code !== 0) return '' (qrcodeRes) => {
if (orderRes.code !== 0) return ''
isPayQrcodeInvalid.value = false isPayQrcodeInvalid.value = false
payInfo.value = { payInfo.value = {
url: qrcodeRes.data.packageExtra.replace('code_url=', ''), url: qrcodeRes.data.packageExtra.replace('code_url=', ''),
payOrderSn: qrcodeRes.data.payOrderSn, payOrderSn: qrcodeRes.data.payOrderSn,
} }
/* 延迟自动取消支付查询 */ /* 延迟自动取消支付查询 */
setTimeout( setTimeout(
() => { () => {
isPayQrcodeInvalid.value = true isPayQrcodeInvalid.value = true
}, },
10 * 60 * 1000, 10 * 60 * 1000,
) )
getPayStatus() getPayStatus()
}) },
)
}) })
} }
...@@ -165,16 +176,10 @@ function getPayStatus() { ...@@ -165,16 +176,10 @@ function getPayStatus() {
}) })
} }
const timerId = setInterval(() => { clearPayStatusTimer()
if (!payInfo.value.payOrderSn) { payStatusTimer = setInterval(() => {
clearInterval(timerId)
payStatusTimer.value = null
return
}
request() request()
}, 1000) }, 1000)
payStatusTimer.value = timerId
} }
function handlePaymentMethodSwitch(method: 'alipay' | 'wechatpay') { function handlePaymentMethodSwitch(method: 'alipay' | 'wechatpay') {
...@@ -200,9 +205,9 @@ function clearPayInfo() { ...@@ -200,9 +205,9 @@ function clearPayInfo() {
} }
function clearPayStatusTimer() { function clearPayStatusTimer() {
if (payStatusTimer.value !== null) { if (payStatusTimer !== null) {
clearInterval(payStatusTimer.value) clearInterval(payStatusTimer)
payStatusTimer.value = null payStatusTimer = null
} }
} }
...@@ -213,6 +218,10 @@ function onModalAfterLeave() { ...@@ -213,6 +218,10 @@ function onModalAfterLeave() {
clearPayStatusTimer() clearPayStatusTimer()
clearPayInfo() clearPayInfo()
} }
function handlePayQrCodeRefresh() {
getEquityPayQrCode()
}
</script> </script>
<template> <template>
...@@ -225,7 +234,7 @@ function onModalAfterLeave() { ...@@ -225,7 +234,7 @@ function onModalAfterLeave() {
:on-after-leave="onModalAfterLeave" :on-after-leave="onModalAfterLeave"
> >
<div v-if="!pointsGiftPackageListLoading"> <div v-if="!pointsGiftPackageListLoading">
<ul class="mt-[10px] flex h-[255px]"> <ul class="mt-[10px] flex" :class="isEnglishLanguage ? 'h-[285px]' : 'h-[255px]'">
<li <li
v-for="(packageItem, packageIndex) in pointsGiftPackageList" v-for="(packageItem, packageIndex) in pointsGiftPackageList"
:key="packageItem.id" :key="packageItem.id"
...@@ -256,13 +265,15 @@ function onModalAfterLeave() { ...@@ -256,13 +265,15 @@ function onModalAfterLeave() {
{{ t('common_module.buy_now') }} {{ t('common_module.buy_now') }}
</button> </button>
<ul class="ml-[20px] mt-[26px]"> <ul class="ml-[20px] mt-[26px] pr-[8px]">
<li class="mb-[8px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[8px] flex text-[14px] text-[#482801]">
<span <span
class="mr-[5px] inline-block h-[6px] w-[6px] rounded-full" class="mr-[5px] mt-[8px] inline-block h-[6px] w-[6px] shrink-0 rounded-full"
:class="currentSelectPackage === packageIndex ? 'bg-[#FFEAC8]' : 'bg-[#EBD8BE]'" :class="currentSelectPackage === packageIndex ? 'bg-[#FFEAC8]' : 'bg-[#EBD8BE]'"
></span> ></span>
{{ t('equity_module.get_points_for_interacting_with_the_ai', { points: packageItem.points }) }} <div class="text-start">
{{ t('equity_module.get_points_for_interacting_with_the_ai', { points: packageItem.points }) }}
</div>
</li> </li>
<li class="mb-[8px] flex items-center text-[14px] text-[#482801]"> <li class="mb-[8px] flex items-center text-[14px] text-[#482801]">
<span <span
...@@ -319,7 +330,10 @@ function onModalAfterLeave() { ...@@ -319,7 +330,10 @@ function onModalAfterLeave() {
<div v-show="isPayQrcodeInvalid" class="flex-center absolute inset-0 flex"> <div v-show="isPayQrcodeInvalid" class="flex-center absolute inset-0 flex">
<div class="absolute inset-0 bg-[rgba(0,0,0,0.6)] blur-sm"></div> <div class="absolute inset-0 bg-[rgba(0,0,0,0.6)] blur-sm"></div>
<i class="iconfont icon-huanyihuan font-600 z-1 relative text-[30px] text-[#fff]"></i> <i
class="iconfont icon-huanyihuan font-600 z-1 relative cursor-pointer text-[30px] text-[#fff]"
@click="handlePayQrCodeRefresh"
></i>
</div> </div>
</Transition> </Transition>
</div> </div>
...@@ -331,19 +345,19 @@ function onModalAfterLeave() { ...@@ -331,19 +345,19 @@ function onModalAfterLeave() {
<div class="mt-[10px] flex items-center justify-center"> <div class="mt-[10px] flex items-center justify-center">
<template v-if="currentPaymentMethod === 'alipay'"> <template v-if="currentPaymentMethod === 'alipay'">
<img class="mr-[5px] mt-[6px] h-[16px] w-[16px]" src="@/assets/images/equity/alipay-icon.png" alt="alipay" /> <img class="mr-[5px] mt-[6px] h-[16px] w-[16px]" src="@/assets/images/equity/alipay-icon.png" alt="alipay" />
<span class="font-600 text-[16px]" <span class="font-600 text-[16px]">
>{{ t('common_module.alipay') }} {{ t('equity_module.scan_code_payment') {{ t('common_module.alipay') }} {{ t('equity_module.scan_code_payment') }}
}}<span class="text-[24px] text-[#F25744]">{{ currentPayPrice }}</span <span class="text-[24px] text-[#F25744]">{{ currentPayPrice }}</span>
></span
> </span>
</template> </template>
<template v-else-if="currentPaymentMethod === 'wechatpay'"> <template v-else-if="currentPaymentMethod === 'wechatpay'">
<img class="mr-[5px] mt-[6px] h-[16px] w-[16px]" src="@/assets/images/equity/wechat-icon.png" alt="alipay" /> <img class="mr-[5px] mt-[6px] h-[16px] w-[16px]" src="@/assets/images/equity/wechat-icon.png" alt="alipay" />
<span class="font-600 text-[16px]" <span class="font-600 text-[16px]">
>{{ t('common_module.wechat') }} {{ t('equity_module.scan_code_payment') {{ t('common_module.wechat') }} {{ t('equity_module.scan_code_payment') }}
}}<span class="text-[24px] text-[#F25744]">{{ currentPayPrice }}</span <span class="text-[24px] text-[#F25744]"> {{ currentPayPrice }}</span>
></span
> </span>
</template> </template>
</div> </div>
</div> </div>
......
...@@ -20,6 +20,11 @@ const equityInfo = computed(() => { ...@@ -20,6 +20,11 @@ const equityInfo = computed(() => {
return userStore.equityInfo return userStore.equityInfo
}) })
/* created */
;(function () {
userStore.fetchUpdateEquityInfo()
})()
function handlePointRecharge() { function handlePointRecharge() {
currentSelectVersion.value = null currentSelectVersion.value = null
...@@ -71,17 +76,18 @@ function handlePointRecharge() { ...@@ -71,17 +76,18 @@ function handlePointRecharge() {
</div> </div>
</div> </div>
<div class="ml-[58px] mt-[4px] flex items-end"> <div class="ml-[58px] mt-[4px] flex items-end">
<div class="font-600 text-[24px]"><n-number-animation :from="0" :to="equityInfo.points" /></div> <div class="font-600 text-[24px]">
<n-number-animation :from="0" :to="equityInfo.points" :precision="2" />
</div>
<span class="font-600 mb-[3px] ml-[7px] text-[14px]">{{ t('equity_module.points') }}</span> <span class="font-600 mb-[3px] ml-[7px] text-[14px]">{{ t('equity_module.points') }}</span>
</div> </div>
</div> </div>
<div <div class="flex select-none items-center justify-end text-[15px] text-[#0B7DFF]">
class="flex cursor-pointer select-none items-center justify-end text-[15px] text-[#0B7DFF]" <span class="cursor-pointer" @click="handlePointRecharge">
@click="handlePointRecharge" <span>{{ t('equity_module.top_up_immediately') }}</span>
> <i class="iconfont icon-left ml-[2px] inline-block rotate-180 text-[12px]"></i>
<span>{{ t('equity_module.top_up_immediately') }}</span> </span>
<i class="iconfont icon-left ml-[2px] inline-block rotate-180 text-[12px]"></i>
</div> </div>
</section> </section>
<section <section
......
...@@ -6,6 +6,8 @@ import { nanoid } from 'nanoid' ...@@ -6,6 +6,8 @@ import { nanoid } from 'nanoid'
import fetchEventStreamSource from '../utils/fetch-event-stream-source' import fetchEventStreamSource from '../utils/fetch-event-stream-source'
import { throttle } from 'lodash-es' import { throttle } from 'lodash-es'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { useUserStore } from '@/store/modules/user'
import { ChannelType } from '@/enums/channel'
interface Props { interface Props {
currentSessionId: string currentSessionId: string
...@@ -32,6 +34,7 @@ const currentFetchEventSourceController = defineModel<AbortController | null>('c ...@@ -32,6 +34,7 @@ const currentFetchEventSourceController = defineModel<AbortController | null>('c
const { t } = useI18n() const { t } = useI18n()
const inputFileRef = useTemplateRef<HTMLInputElement | null>('inputFileRef') const inputFileRef = useTemplateRef<HTMLInputElement | null>('inputFileRef')
const userStore = useUserStore()
let fileUploadController = shallowRef<AbortController | null>(null) let fileUploadController = shallowRef<AbortController | null>(null)
...@@ -164,6 +167,7 @@ function questionSubmit() { ...@@ -164,6 +167,7 @@ function questionSubmit() {
agentId: currentAgentApplication.value.agentId, //应用ID agentId: currentAgentApplication.value.agentId, //应用ID
input: questionContent.value.trim(), //提问文本 input: questionContent.value.trim(), //提问文本
fileUrls: currentInputFileInfo.value.url ? [currentInputFileInfo.value.url] : [], fileUrls: currentInputFileInfo.value.url ? [currentInputFileInfo.value.url] : [],
channel: ChannelType.index,
}, },
{ {
onmessage: (message) => { onmessage: (message) => {
...@@ -189,6 +193,8 @@ function questionSubmit() { ...@@ -189,6 +193,8 @@ function questionSubmit() {
nextTick(() => { nextTick(() => {
emit('historyRecordListUpdate') emit('historyRecordListUpdate')
userStore.fetchUpdateEquityInfo()
}) })
}, },
onerror: (err) => { onerror: (err) => {
...@@ -339,7 +345,7 @@ defineExpose({ ...@@ -339,7 +345,7 @@ defineExpose({
<Transition name="application-select-menu"> <Transition name="application-select-menu">
<ul <ul
v-show="isShowApplicationSelectMenu" v-show="isShowApplicationSelectMenu"
class="absolute -top-[10px] left-1/2 w-[200px] -translate-x-1/2 -translate-y-full rounded-[6px] bg-[#fff] p-[10px] pb-[4px] pr-0 shadow-md" class="absolute -top-[10px] left-0 w-[240px] -translate-y-full rounded-[6px] bg-[#fff] p-[10px] pb-[4px] pr-0 shadow-md"
> >
<n-virtual-list <n-virtual-list
style="max-height: 200px" style="max-height: 200px"
...@@ -350,7 +356,7 @@ defineExpose({ ...@@ -350,7 +356,7 @@ defineExpose({
> >
<template #default="{ item }"> <template #default="{ item }">
<li <li
class="relative mb-[6px] flex cursor-pointer items-center overflow-hidden rounded-[4px] bg-[#f3f3f5] px-[10px] py-[4px] transition hover:bg-[#E7E7E7]" class="relative mb-[6px] flex cursor-pointer items-center overflow-hidden rounded-[4px] bg-[#f3f3f5] py-[4px] pl-[10px] pr-[16px] transition hover:bg-[#E7E7E7]"
@click="handleApplicationChange(item)" @click="handleApplicationChange(item)"
> >
<div <div
...@@ -363,6 +369,12 @@ defineExpose({ ...@@ -363,6 +369,12 @@ defineExpose({
{{ item.agentTitle }} {{ item.agentTitle }}
</n-ellipsis> </n-ellipsis>
</div> </div>
<div class="pl-[8px] text-[12px] text-[#0B7DFF]">
<template v-if="item.points && item.points !== 0">
{{ item.points }}{{ t('equity_module.points2') }}/{{ t('common_module.time') }}
</template>
<template v-else-if="item.points && item.points === 0">{{ t('common_module.free') }}</template>
</div>
<i <i
v-if="item.agentId === currentAgentApplication.agentId" v-if="item.agentId === currentAgentApplication.agentId"
......
...@@ -186,7 +186,7 @@ defineExpose({ ...@@ -186,7 +186,7 @@ defineExpose({
</div> --> </div> -->
<div class="px-[4px]"> <div class="px-[4px]">
<div class="h-[40px]"> <div class="h-[40px]" :class="[isHistoryListEdit ? 'sticky top-0 z-10' : '']">
<Transition name="history-record-edit" mode="out-in"> <Transition name="history-record-edit" mode="out-in">
<h2 v-if="!isHistoryListEdit" class="flex items-center justify-between"> <h2 v-if="!isHistoryListEdit" class="flex items-center justify-between">
<span class="flex items-center"> <span class="flex items-center">
......
...@@ -5,6 +5,7 @@ export interface AgentApplicationRecordItem { ...@@ -5,6 +5,7 @@ export interface AgentApplicationRecordItem {
agentDesc: string agentDesc: string
creator: string creator: string
publishedTime: string publishedTime: string
points: number
} }
export interface MessageItemInterface { export interface MessageItemInterface {
......
...@@ -5,27 +5,29 @@ import { Mail, Lock, Iphone, Down, User } from '@icon-park/vue-next' ...@@ -5,27 +5,29 @@ import { Mail, Lock, Iphone, Down, User } from '@icon-park/vue-next'
import isMobilePhone from 'validator/es/lib/isMobilePhone' import isMobilePhone from 'validator/es/lib/isMobilePhone'
import isEmail from 'validator/es/lib/isEmail' import isEmail from 'validator/es/lib/isEmail'
import { ss } from '@/utils/storage' import { ss } from '@/utils/storage'
import { fetchEmailCode, fetchLogin, fetchSMSCode } from '@/apis/user' import { fetchEmailCode, fetchLogin, fetchSMSCode, fetchGoogleClientId } from '@/apis/user'
import SparkMD5 from 'spark-md5' import SparkMD5 from 'spark-md5'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import type { UserInfo } from '@/store/types/user' import type { UserInfo } from '@/store/types/user'
import { useRouter, useRoute } from 'vue-router' import { useRouter, useRoute } from 'vue-router'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import LanguageSetting from '@/components/language-setting/language-setting.vue' import LanguageSetting from '@/components/language-setting/language-setting.vue'
import { useSystemLanguageStore } from '@/store/modules/system-language'
enum StorageKeyEnum { enum StorageKeyEnum {
smsCountdownTime = 'SMS_COUNTDOWN_TIME', smsCountdownTime = 'SMS_COUNTDOWN_TIME',
emailCountdownTime = 'MAIL_COUNTDOWN_TIME', emailCountdownTime = 'MAIL_COUNTDOWN_TIME',
} }
type LoginMethod = 'password' | 'sms' | 'email' type LoginMethod = 'password' | 'sms' | 'email' | 'google'
interface LoginPayload { interface LoginPayload {
loginChannel: 'MEMBER_PLATFOMR_SMS' | 'MEMBER_PLATFOMR_EMAIL' | 'MEMBER_PLATFOMR_PW' loginChannel: 'MEMBER_PLATFOMR_SMS' | 'MEMBER_PLATFOMR_EMAIL' | 'MEMBER_PLATFOMR_PW' | 'MEMBER_PLATFOMR_GOOGLE'
account: string account: string
password?: string password?: string
authCode?: string authCode?: string
} }
const userStore = useUserStore() const userStore = useUserStore()
const systemLanguageStore = useSystemLanguageStore()
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
const { t } = useI18n() const { t } = useI18n()
...@@ -34,6 +36,7 @@ const passwordLoginFormRef = useTemplateRef<FormInst>('passwordLoginFormRef') ...@@ -34,6 +36,7 @@ const passwordLoginFormRef = useTemplateRef<FormInst>('passwordLoginFormRef')
const smsLoginFormRef = useTemplateRef<FormInst>('smsLoginFormRef') const smsLoginFormRef = useTemplateRef<FormInst>('smsLoginFormRef')
const emailLoginFormRef = useTemplateRef<FormInst>('emailLoginFormRef') const emailLoginFormRef = useTemplateRef<FormInst>('emailLoginFormRef')
const countdownRef = useTemplateRef<CountdownInst>('countdownRef') const countdownRef = useTemplateRef<CountdownInst>('countdownRef')
const googleLoginBtnRef = useTemplateRef<HTMLDivElement>('googleLoginBtnRef')
const currentLoginMethod = ref<LoginMethod>('sms') const currentLoginMethod = ref<LoginMethod>('sms')
const showCardReserveAnimation = ref(false) const showCardReserveAnimation = ref(false)
...@@ -52,6 +55,9 @@ const emailLoginForm = ref({ ...@@ -52,6 +55,9 @@ const emailLoginForm = ref({
email: '', email: '',
code: '', code: '',
}) })
const googleLoginForm = ref({
credential: '',
})
const passwordLoginFormRules = shallowReadonly<FormRules>({ const passwordLoginFormRules = shallowReadonly<FormRules>({
account: { required: true, message: t('login_module.please_enter_your_account_number'), trigger: 'blur' }, account: { required: true, message: t('login_module.please_enter_your_account_number'), trigger: 'blur' },
...@@ -90,6 +96,13 @@ const emailLoginFormRules = shallowReadonly<FormRules>({ ...@@ -90,6 +96,13 @@ const emailLoginFormRules = shallowReadonly<FormRules>({
code: { required: true, message: t('login_module.please_enter_the_verification_code') }, code: { required: true, message: t('login_module.please_enter_the_verification_code') },
}) })
const currentPhoneNumberArea = ref<'+86' | '+852'>('+852')
const countdownActive = ref(true)
const isShowCountdown = ref(false)
const countdownDuration = ref<number>(60000)
const googleLoginBtnLoading = ref(false)
const phoneNumberAreaOptions = computed(() => { const phoneNumberAreaOptions = computed(() => {
return [ return [
{ {
...@@ -102,11 +115,6 @@ const phoneNumberAreaOptions = computed(() => { ...@@ -102,11 +115,6 @@ const phoneNumberAreaOptions = computed(() => {
}, },
] ]
}) })
const currentPhoneNumberArea = ref<'+86' | '+852'>('+852')
const countdownActive = ref(true)
const isShowCountdown = ref(false)
const countdownDuration = ref<number>(60000)
watchEffect(() => { watchEffect(() => {
let timeStringDraft = '' let timeStringDraft = ''
...@@ -135,6 +143,25 @@ watchEffect(() => { ...@@ -135,6 +143,25 @@ watchEffect(() => {
} }
}) })
/* created */
;(function () {
if (!window.google) {
const script = document.createElement('script')
script.src = `https://accounts.google.com/gsi/client?hl=${systemLanguageStore.currentLanguage}` // 加载客户端库
script.async = true
script.onload = () => {
getGoogleLoginClientId().then((clientId) => {
clientId && initializeGoogleSignIn(clientId)
})
}
document.head.appendChild(script)
} else {
getGoogleLoginClientId().then((clientId) => {
clientId && initializeGoogleSignIn(clientId)
})
}
})()
function onlyAllowNumber(value: string) { function onlyAllowNumber(value: string) {
return !value || /^\d+$/.test(value) return !value || /^\d+$/.test(value)
} }
...@@ -160,7 +187,7 @@ function onCountdownFinish() { ...@@ -160,7 +187,7 @@ function onCountdownFinish() {
function getInputPhoneNumber() { function getInputPhoneNumber() {
return currentPhoneNumberArea.value !== '+86' return currentPhoneNumberArea.value !== '+86'
? `${currentPhoneNumberArea.value}${smsLoginForm.value.phoneNumber}` ? encodeURIComponent(`${currentPhoneNumberArea.value}${smsLoginForm.value.phoneNumber}`)
: smsLoginForm.value.phoneNumber : smsLoginForm.value.phoneNumber
} }
...@@ -195,7 +222,7 @@ function handleLoginSubmit(method: LoginMethod) { ...@@ -195,7 +222,7 @@ function handleLoginSubmit(method: LoginMethod) {
payload = { payload = {
loginChannel: 'MEMBER_PLATFOMR_SMS', loginChannel: 'MEMBER_PLATFOMR_SMS',
account: getInputPhoneNumber(), account: smsLoginForm.value.phoneNumber,
authCode: smsLoginForm.value.code, authCode: smsLoginForm.value.code,
} }
...@@ -218,6 +245,17 @@ function handleLoginSubmit(method: LoginMethod) { ...@@ -218,6 +245,17 @@ function handleLoginSubmit(method: LoginMethod) {
}) })
} }
break break
case 'google':
{
payload = {
loginChannel: 'MEMBER_PLATFOMR_GOOGLE',
account: '',
authCode: googleLoginForm.value.credential,
}
resolve(true)
}
break
} }
}).then(() => { }).then(() => {
loginBtnLoading.value = true loginBtnLoading.value = true
...@@ -301,6 +339,43 @@ function handleEmailCodeGain() { ...@@ -301,6 +339,43 @@ function handleEmailCodeGain() {
}, },
) )
} }
function initializeGoogleSignIn(clientId: string) {
window.google.accounts.id.initialize({
client_id: encodeURIComponent(clientId),
auto_select: false,
callback: (res: { credential: string; clientId: string }) => {
googleLoginForm.value.credential = res.credential
handleLoginSubmit('google')
},
})
if (googleLoginBtnRef.value) {
window.google.accounts.id.renderButton(googleLoginBtnRef.value, {
size: 'medium',
text: 'signin_with',
logo_alignment: 'left',
locale: systemLanguageStore.currentLanguage,
})
googleLoginBtnLoading.value = true
}
// window.google.accounts.id.prompt((notification: any) => {
// if (notification.isNotDisplayed() || notification.isSkippedMoment()) {
// console.log('💥💥💥💥💥💥登录失败💥💥💥💥💥💥')
// }
// })
}
function getGoogleLoginClientId() {
return fetchGoogleClientId<string>().then((res) => {
if (res.code !== 0) return ''
return res.data
})
}
</script> </script>
<template> <template>
...@@ -313,7 +388,7 @@ function handleEmailCodeGain() { ...@@ -313,7 +388,7 @@ function handleEmailCodeGain() {
<LanguageSetting arrow-direction="bottom" btn-bg-color="#f4f5f5" /> <LanguageSetting arrow-direction="bottom" btn-bg-color="#f4f5f5" />
</div> </div>
<div class="absolute right-[14%] top-1/2 h-[458px] w-[390px] -translate-y-1/2"> <div class="absolute right-[14%] top-1/2 w-[390px] -translate-y-1/2">
<div <div
class="h-full w-full rounded-[10px] bg-[#fff] px-[29px] shadow-2xl" class="h-full w-full rounded-[10px] bg-[#fff] px-[29px] shadow-2xl"
:class="{ 'animate-card-reverse': showCardReserveAnimation }" :class="{ 'animate-card-reverse': showCardReserveAnimation }"
...@@ -532,8 +607,8 @@ function handleEmailCodeGain() { ...@@ -532,8 +607,8 @@ function handleEmailCodeGain() {
</n-form> </n-form>
</div> </div>
<div class="absolute bottom-[22px] left-0 w-full"> <div class="w-full pb-[34px]">
<div class="mb-[32px]"> <div class="h-[134px]">
<div class="mb-[12px] text-center text-[12px] text-[#999999]"> <div class="mb-[12px] text-center text-[12px] text-[#999999]">
{{ t('login_module.other_login_methods') }} {{ t('login_module.other_login_methods') }}
</div> </div>
...@@ -562,6 +637,14 @@ function handleEmailCodeGain() { ...@@ -562,6 +637,14 @@ function handleEmailCodeGain() {
<Lock theme="outline" size="17" fill="#666666" :stroke-width="3" /> <Lock theme="outline" size="17" fill="#666666" :stroke-width="3" />
</button> </button>
</div> </div>
<div v-show="googleLoginBtnLoading" class="py-[10px] text-center text-[12px] text-[#999999]">
{{ t('common_module.or') }}
</div>
<div v-show="googleLoginBtnLoading" class="flex-center flex">
<div ref="googleLoginBtnRef"></div>
</div>
</div> </div>
<!-- <div class="text-center"> <!-- <div class="text-center">
......
...@@ -9,6 +9,7 @@ import { fetchEventStreamSource } from '../utils/fetch-event-stream-source' ...@@ -9,6 +9,7 @@ import { fetchEventStreamSource } from '../utils/fetch-event-stream-source'
import { UploadStatus } from '@/enums/upload-status' import { UploadStatus } from '@/enums/upload-status'
import { ChannelType } from '@/enums/channel' import { ChannelType } from '@/enums/channel'
import { useDialogueFile } from '@/composables/useDialogueFile' import { useDialogueFile } from '@/composables/useDialogueFile'
import { useUserStore } from '@/store/modules/user'
const { t } = useI18n() const { t } = useI18n()
...@@ -29,6 +30,8 @@ const emit = defineEmits<{ ...@@ -29,6 +30,8 @@ const emit = defineEmits<{
clearAllMessage: [] clearAllMessage: []
}>() }>()
const userStore = useUserStore()
const { uploadFileList, handleLimitUpload, handleUpload, handleRemoveFile } = useDialogueFile() const { uploadFileList, handleLimitUpload, handleUpload, handleRemoveFile } = useDialogueFile()
const multiModelDialogueList = defineModel<MultiModelDialogueItem[]>('multiModelDialogueList', { required: true }) const multiModelDialogueList = defineModel<MultiModelDialogueItem[]>('multiModelDialogueList', { required: true })
...@@ -185,6 +188,7 @@ function handleQuestionSubmit() { ...@@ -185,6 +188,7 @@ function handleQuestionSubmit() {
onFinally: () => { onFinally: () => {
modelItem.controller = null modelItem.controller = null
modelItem.isAnswerResponseWait = false modelItem.isAnswerResponseWait = false
userStore.fetchUpdateEquityInfo()
}, },
}) })
}) })
......
...@@ -13,7 +13,6 @@ interface Props { ...@@ -13,7 +13,6 @@ interface Props {
modelListOptions: SelectOption[] modelListOptions: SelectOption[]
totalNum: number totalNum: number
isCurrent: boolean isCurrent: boolean
modelPoints: number
} }
const { t } = useI18n() const { t } = useI18n()
...@@ -139,7 +138,6 @@ function scrollToBottom() { ...@@ -139,7 +138,6 @@ function scrollToBottom() {
v-model:model-config="modelConfig" v-model:model-config="modelConfig"
:model-list-options="modelListOptions" :model-list-options="modelListOptions"
:is-current="isCurrent" :is-current="isCurrent"
:model-points="modelPoints"
@update-config="(modelConfig) => emit('updateConfig', modelConfig)" @update-config="(modelConfig) => emit('updateConfig', modelConfig)"
@reset-conversation="emit('resetConversation')" @reset-conversation="emit('resetConversation')"
/> />
......
...@@ -9,7 +9,6 @@ import { useSystemLanguageStore } from '@/store/modules/system-language' ...@@ -9,7 +9,6 @@ import { useSystemLanguageStore } from '@/store/modules/system-language'
interface Props { interface Props {
modelListOptions: SelectOption[] modelListOptions: SelectOption[]
isCurrent: boolean isCurrent: boolean
modelPoints: number
} }
const { t } = useI18n() const { t } = useI18n()
...@@ -26,7 +25,6 @@ const systemLanguageStore = useSystemLanguageStore() ...@@ -26,7 +25,6 @@ const systemLanguageStore = useSystemLanguageStore()
const modelConfig = defineModel<MultiModelDialogueItem>('modelConfig', { required: true }) const modelConfig = defineModel<MultiModelDialogueItem>('modelConfig', { required: true })
const currentDiversityMode = ref('balance') const currentDiversityMode = ref('balance')
const modelConsumePoints = ref(props.modelPoints || 0)
const currentModelNickName = computed({ const currentModelNickName = computed({
get: () => (modelConfig.value.modelNickName === '' ? undefined : modelConfig.value.modelNickName), get: () => (modelConfig.value.modelNickName === '' ? undefined : modelConfig.value.modelNickName),
...@@ -44,22 +42,24 @@ const isEnLanguage = computed(() => { ...@@ -44,22 +42,24 @@ const isEnLanguage = computed(() => {
}) })
const totalConsumePoints = computed(() => (communicationTurn: number) => { const totalConsumePoints = computed(() => (communicationTurn: number) => {
if (!modelConsumePoints.value) { const modelConsumePoints = modelConfig.value.modelPoints
if (!modelConsumePoints) {
return t('common_module.free') return t('common_module.free')
} }
switch (communicationTurn) { switch (communicationTurn) {
case 1: case 1:
return t('common_module.points_per_time', { count: (modelConsumePoints.value * 1).toFixed(1) }) return t('common_module.points_per_time', { count: (modelConsumePoints * 1).toFixed(1) })
case 5: case 5:
return t('common_module.points_per_time', { count: (modelConsumePoints.value * 1).toFixed(1) }) return t('common_module.points_per_time', { count: (modelConsumePoints * 1).toFixed(1) })
case 10: case 10:
return t('common_module.points_per_time', { count: (modelConsumePoints.value * 2).toFixed(1) }) return t('common_module.points_per_time', { count: (modelConsumePoints * 2).toFixed(1) })
case 15: case 15:
return t('common_module.points_per_time', { count: (modelConsumePoints.value * 3).toFixed(1) }) return t('common_module.points_per_time', { count: (modelConsumePoints * 3).toFixed(1) })
} }
return t('common_module.points_per_time', { count: modelConsumePoints.value.toFixed(1) }) return t('common_module.points_per_time', { count: modelConsumePoints.toFixed(1) })
}) })
watch( watch(
...@@ -139,7 +139,7 @@ function modelListRenderTag({ option }: { option: SelectOption }) { ...@@ -139,7 +139,7 @@ function modelListRenderTag({ option }: { option: SelectOption }) {
// 更新大模型 // 更新大模型
function handleUpdateLargeModel(_value: string, option: SelectOption) { function handleUpdateLargeModel(_value: string, option: SelectOption) {
modelConfig.value.icon = option.icon as string modelConfig.value.icon = option.icon as string
modelConsumePoints.value = (option.points || 0) as number modelConfig.value.modelPoints = (option.points || 0) as number
emit('resetConversation') emit('resetConversation')
handleUpdateAgentConfig() handleUpdateAgentConfig()
} }
......
...@@ -34,7 +34,6 @@ const isFullPageLoading = ref(false) ...@@ -34,7 +34,6 @@ const isFullPageLoading = ref(false)
const agentId = ref('') const agentId = ref('')
const agentApplicationConfig = ref<PersonalAppConfigState>(defaultPersonalAppConfigState()) const agentApplicationConfig = ref<PersonalAppConfigState>(defaultPersonalAppConfigState())
const multiModelDialogueList = ref<MultiModelDialogueItem[]>([]) const multiModelDialogueList = ref<MultiModelDialogueItem[]>([])
const currentModelPoints = ref(0)
let modelListOptions = reactive<SelectOption[]>([]) let modelListOptions = reactive<SelectOption[]>([])
...@@ -92,6 +91,7 @@ function modelDialogueFactory() { ...@@ -92,6 +91,7 @@ function modelDialogueFactory() {
topP: 0.1, topP: 0.1,
temperature: 1, temperature: 1,
communicationTurn: 5, communicationTurn: 5,
modelPoints: 0,
agentSystem: '', agentSystem: '',
controller: null, controller: null,
isAnswerResponseWait: false, isAnswerResponseWait: false,
...@@ -154,7 +154,7 @@ async function handleGetLargeModelInfo() { ...@@ -154,7 +154,7 @@ async function handleGetLargeModelInfo() {
if (res.code === 0) { if (res.code === 0) {
multiModelDialogueList.value[0].icon = res.data.icon multiModelDialogueList.value[0].icon = res.data.icon
currentModelPoints.value = res.data.models?.[0].points || 0 multiModelDialogueList.value[0].modelPoints = res.data.models?.[0].points || 0
isFullPageLoading.value = false isFullPageLoading.value = false
} }
} }
...@@ -265,6 +265,7 @@ function handleClearAllMessage() { ...@@ -265,6 +265,7 @@ function handleClearAllMessage() {
.ctWarning(t('common_module.dialogue_module.clear_message_dialog_content'), t('common_module.tip')) .ctWarning(t('common_module.dialogue_module.clear_message_dialog_content'), t('common_module.tip'))
.then(() => { .then(() => {
handleBlockMessageResponse() handleBlockMessageResponse()
userStore.fetchUpdateEquityInfo()
window.$message.success(t('common_module.clear_success_message')) window.$message.success(t('common_module.clear_success_message'))
}) })
} }
...@@ -316,7 +317,6 @@ function handleBlockMessageResponse() { ...@@ -316,7 +317,6 @@ function handleBlockMessageResponse() {
:key="modelDialogueItem.id" :key="modelDialogueItem.id"
:model-dialogue-item="modelDialogueItem" :model-dialogue-item="modelDialogueItem"
:is-current="modelDialogueItem.id === multiModelDialogueList[0].id" :is-current="modelDialogueItem.id === multiModelDialogueList[0].id"
:model-points="currentModelPoints"
:model-list-options="modelListOptions" :model-list-options="modelListOptions"
:total-num="multiModelDialogueList.length" :total-num="multiModelDialogueList.length"
@update-config="handleSavePersonalAppConfig" @update-config="handleSavePersonalAppConfig"
......
...@@ -19,6 +19,7 @@ export interface MultiModelDialogueItem { ...@@ -19,6 +19,7 @@ export interface MultiModelDialogueItem {
temperature: number temperature: number
agentSystem: string agentSystem: string
communicationTurn: number communicationTurn: number
modelPoints: number
controller: AbortController | null controller: AbortController | null
isAnswerResponseWait: boolean isAnswerResponseWait: boolean
messageList: Map<string, MessageItemInterface> messageList: Map<string, MessageItemInterface>
......
...@@ -40,6 +40,8 @@ const currentPlayMessageItem = ref<ConversationMessageItem | null>(null) ...@@ -40,6 +40,8 @@ const currentPlayMessageItem = ref<ConversationMessageItem | null>(null)
const currentPlayAudioFragmentSerialNo = ref(0) const currentPlayAudioFragmentSerialNo = ref(0)
const currentSoundCtl = shallowRef<Howl | null>(null) const currentSoundCtl = shallowRef<Howl | null>(null)
const isSoundCtlCreated = ref(false) const isSoundCtlCreated = ref(false)
const isAnswerResponseLoading = ref(false)
const createContinueQuestionsException = ref(false)
const isEnLanguage = computed(() => { const isEnLanguage = computed(() => {
return systemLanguageStore.currentLanguageInfo.key === 'en' return systemLanguageStore.currentLanguageInfo.key === 'en'
...@@ -107,12 +109,18 @@ function handleClearAllMessage() { ...@@ -107,12 +109,18 @@ function handleClearAllMessage() {
} }
async function handleCreateContinueQuestions(replyTextContent: string) { async function handleCreateContinueQuestions(replyTextContent: string) {
const res = await fetchCreateContinueQuestions<string[]>({ input: replyTextContent }) createContinueQuestionsException.value = false
if (res.code === 0) { fetchCreateContinueQuestions<string[]>({ input: replyTextContent })
continuousQuestionList.value = res.data .then((res) => {
handleUpdatePageScroll() if (res.code === 0) {
} continuousQuestionList.value = res.data
handleUpdatePageScroll()
}
})
.catch(() => {
createContinueQuestionsException.value = true
})
} }
function handleUpdateContinueQuestionStatus(status: 'default' | 'close') { function handleUpdateContinueQuestionStatus(status: 'default' | 'close') {
...@@ -316,6 +324,8 @@ function handleAudioPause(isClearMessageList = false) { ...@@ -316,6 +324,8 @@ function handleAudioPause(isClearMessageList = false) {
:message-list="messageList" :message-list="messageList"
:continuous-question-status="continuousQuestionStatus" :continuous-question-status="continuousQuestionStatus"
:continuous-question-list="continuousQuestionList" :continuous-question-list="continuousQuestionList"
:is-answer-response-loading="isAnswerResponseLoading"
:create-continue-questions-exception="createContinueQuestionsException"
@audio-play="handleAudioPlay" @audio-play="handleAudioPlay"
@audio-pause="handleAudioPause" @audio-pause="handleAudioPause"
/> />
...@@ -324,6 +334,7 @@ function handleAudioPause(isClearMessageList = false) { ...@@ -324,6 +334,7 @@ function handleAudioPause(isClearMessageList = false) {
<FooterInput <FooterInput
ref="footerInputRef" ref="footerInputRef"
v-model:is-answer-response-loading="isAnswerResponseLoading"
:continuous-question-status="continuousQuestionStatus" :continuous-question-status="continuousQuestionStatus"
:message-list="messageList" :message-list="messageList"
:answer-audio-auto-play="answerAudioAutoPlay" :answer-audio-auto-play="answerAudioAutoPlay"
......
...@@ -11,6 +11,7 @@ import { useDialogueFile } from '@/composables/useDialogueFile' ...@@ -11,6 +11,7 @@ import { useDialogueFile } from '@/composables/useDialogueFile'
import { TEXTTOSPEECH_WS_URL } from '@/config/base-url' import { TEXTTOSPEECH_WS_URL } from '@/config/base-url'
import WebSocketCtr from '@/utils/web-socket-ctr' import WebSocketCtr from '@/utils/web-socket-ctr'
import { ChannelType } from '@/enums/channel' import { ChannelType } from '@/enums/channel'
import { useUserStore } from '@/store/modules/user'
interface Props { interface Props {
messageList: Map<string, ConversationMessageItem> messageList: Map<string, ConversationMessageItem>
...@@ -36,10 +37,12 @@ const emit = defineEmits<{ ...@@ -36,10 +37,12 @@ const emit = defineEmits<{
}>() }>()
const personalAppConfigStore = usePersonalAppConfigStore() const personalAppConfigStore = usePersonalAppConfigStore()
const userStore = useUserStore()
const { uploadFileList, handleLimitUpload, handleUpload, handleRemoveFile } = useDialogueFile() const { uploadFileList, handleLimitUpload, handleUpload, handleRemoveFile } = useDialogueFile()
const messageTipModalRef = useTemplateRef<InstanceType<typeof OverwriteMessageTipModal>>('messageTipModalRef') const messageTipModalRef = useTemplateRef<InstanceType<typeof OverwriteMessageTipModal>>('messageTipModalRef')
const isAnswerResponseLoading = defineModel<boolean>('isAnswerResponseLoading', { required: true })
const emitter = inject<Emitter<MittEvents>>('emitter') const emitter = inject<Emitter<MittEvents>>('emitter')
...@@ -182,6 +185,7 @@ function handleMessageSend() { ...@@ -182,6 +185,7 @@ function handleMessageSend() {
}) })
}) })
isAnswerResponseLoading.value = true
inputMessageContent.value = '' inputMessageContent.value = ''
isAnswerResponseWait.value = true isAnswerResponseWait.value = true
...@@ -226,6 +230,7 @@ function handleMessageSend() { ...@@ -226,6 +230,7 @@ function handleMessageSend() {
isAnswerResponseLoading: false, isAnswerResponseLoading: false,
}) })
isAnswerResponseLoading.value = false
isCreateContinueQuestions.value && emit('createContinueQuestions', replyTextContent) isCreateContinueQuestions.value && emit('createContinueQuestions', replyTextContent)
emit('updatePageScroll') emit('updatePageScroll')
blockMessageResponse() blockMessageResponse()
...@@ -261,6 +266,7 @@ function handleMessageSend() { ...@@ -261,6 +266,7 @@ function handleMessageSend() {
}, },
onFinally: () => { onFinally: () => {
controller = null controller = null
userStore.fetchUpdateEquityInfo()
}, },
}) })
} }
...@@ -285,6 +291,7 @@ function handleClearAllMessage() { ...@@ -285,6 +291,7 @@ function handleClearAllMessage() {
function blockMessageResponse() { function blockMessageResponse() {
controller?.abort() controller?.abort()
isAnswerResponseWait.value = false isAnswerResponseWait.value = false
userStore.fetchUpdateEquityInfo()
} }
function handleSelectFile(cb: () => void) { function handleSelectFile(cb: () => void) {
......
...@@ -8,6 +8,8 @@ interface Props { ...@@ -8,6 +8,8 @@ interface Props {
messageList: Map<string, ConversationMessageItem> messageList: Map<string, ConversationMessageItem>
continuousQuestionStatus: 'default' | 'close' continuousQuestionStatus: 'default' | 'close'
continuousQuestionList: string[] continuousQuestionList: string[]
isAnswerResponseLoading: boolean
createContinueQuestionsException: boolean
} }
const props = defineProps<Props>() const props = defineProps<Props>()
...@@ -23,7 +25,8 @@ const isShowContinueQuestion = computed(() => { ...@@ -23,7 +25,8 @@ const isShowContinueQuestion = computed(() => {
return ( return (
props.continuousQuestionStatus === 'default' && props.continuousQuestionStatus === 'default' &&
props.messageList.size > 1 && props.messageList.size > 1 &&
!Array.from(props.messageList.entries()).pop()?.[1].isAnswerResponseLoading !props.isAnswerResponseLoading &&
!props.createContinueQuestionsException
) )
}) })
......
...@@ -4,6 +4,7 @@ import { FormInst, InputInst } from 'naive-ui' ...@@ -4,6 +4,7 @@ import { FormInst, InputInst } from 'naive-ui'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { Emitter } from 'mitt' import { Emitter } from 'mitt'
import { storeToRefs } from 'pinia' import { storeToRefs } from 'pinia'
import { useRouter } from 'vue-router'
import { useThrottleFn } from '@vueuse/core' import { useThrottleFn } from '@vueuse/core'
import CustomIcon from '@/components/custom-icon/custom-icon.vue' import CustomIcon from '@/components/custom-icon/custom-icon.vue'
import { Help, People, RightOne } from '@icon-park/vue-next' import { Help, People, RightOne } from '@icon-park/vue-next'
...@@ -11,6 +12,7 @@ import UploadImage from '@/components/upload-image/upload-image.vue' ...@@ -11,6 +12,7 @@ import UploadImage from '@/components/upload-image/upload-image.vue'
import AutoConfigModal from './components/auto-config-modal.vue' import AutoConfigModal from './components/auto-config-modal.vue'
import OptimizeSystemModal from './components/optimize-system-modal.vue' import OptimizeSystemModal from './components/optimize-system-modal.vue'
import { usePersonalAppConfigStore } from '@/store/modules/personal-app-config' import { usePersonalAppConfigStore } from '@/store/modules/personal-app-config'
import { useUserStore } from '@/store/modules/user'
import { PersonalAppConfigState } from '@/store/types/personal-app-config' import { PersonalAppConfigState } from '@/store/types/personal-app-config'
import { import {
fetchCreateAgentAvatar, fetchCreateAgentAvatar,
...@@ -28,7 +30,10 @@ import AgentRoleSetting from './components/agent-role-setting.vue' ...@@ -28,7 +30,10 @@ import AgentRoleSetting from './components/agent-role-setting.vue'
const { t } = useI18n() const { t } = useI18n()
const router = useRouter()
const personalAppConfigStore = usePersonalAppConfigStore() const personalAppConfigStore = usePersonalAppConfigStore()
const userStore = useUserStore()
const { baseInfo, commConfig, commModelConfig, knowledgeConfig } = storeToRefs(personalAppConfigStore) const { baseInfo, commConfig, commModelConfig, knowledgeConfig } = storeToRefs(personalAppConfigStore)
...@@ -90,6 +95,8 @@ watch( ...@@ -90,6 +95,8 @@ watch(
) )
onMounted(async () => { onMounted(async () => {
await handleEquityInfoValidate()
emitter?.on('isGetAgentDetail', () => { emitter?.on('isGetAgentDetail', () => {
;['preamble', 'featuredQuestions'] ;['preamble', 'featuredQuestions']
.filter((property) => { .filter((property) => {
...@@ -342,6 +349,32 @@ function handleStopGenerate() { ...@@ -342,6 +349,32 @@ function handleStopGenerate() {
generateAgentSystemController?.abort() generateAgentSystemController?.abort()
isFullScreenLoading.value = false isFullScreenLoading.value = false
} }
async function handleEquityInfoValidate() {
if (!userStore.isLogin) {
router.push({
name: 'Login',
query: { redirect: encodeURIComponent(router.currentRoute.value.fullPath) },
})
}
await userStore.fetchUpdateEquityInfo()
if (
userStore.equityInfo.usedAgentCount >= userStore.equityInfo.maxAgentCount &&
userStore.equityInfo.maxAgentCount !== 0 &&
!baseInfo.value.agentId
) {
window.$message
.ctWarning(t('equity_module.agents_created_exceeds_tip'), '', t('common_module.back'))
.then(() => {
router.replace({ name: 'Equity' })
})
.catch(() => {
router.back()
})
}
}
</script> </script>
<template> <template>
......
<script lang="ts" setup> <script lang="ts" setup>
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { Computer, PreviewOpen, AllApplication, SettingOne } from '@icon-park/vue-next' import { Computer, PreviewOpen, AllApplication, SettingOne, Api } from '@icon-park/vue-next'
import useTableScrollY from '@/composables/useTableScrollY' import useTableScrollY from '@/composables/useTableScrollY'
import { copyToClip } from '@/utils/copy' import { copyToClip } from '@/utils/copy'
import { formatDateTime } from '@/utils/date-formatter' import { formatDateTime } from '@/utils/date-formatter'
...@@ -14,7 +14,8 @@ import { ...@@ -14,7 +14,8 @@ import {
fetchRemoveSalePublishApplication, fetchRemoveSalePublishApplication,
} from '@/apis/agent-application' } from '@/apis/agent-application'
import { defaultPersonalAppConfigState, usePersonalAppConfigStore } from '@/store/modules/personal-app-config' import { defaultPersonalAppConfigState, usePersonalAppConfigStore } from '@/store/modules/personal-app-config'
import { ApplicationMallInfo } from '../../personal-app/types' import { ApplicationMallInfo } from '../../../personal-app/types'
import ApiCallDrawer from './components/api-call-drawer.vue'
const { t } = useI18n() const { t } = useI18n()
...@@ -34,6 +35,7 @@ const applicationMallInfo = ref<ApplicationMallInfo>({ ...@@ -34,6 +35,7 @@ const applicationMallInfo = ref<ApplicationMallInfo>({
isSale: '', isSale: '',
launchTime: '', launchTime: '',
}) })
const isShowAPICallDrawer = ref(false)
watch( watch(
() => saleApplicationsInfo.value, () => saleApplicationsInfo.value,
...@@ -76,6 +78,9 @@ function handleClickChannelPublishTableAction(actionType: string) { ...@@ -76,6 +78,9 @@ function handleClickChannelPublishTableAction(actionType: string) {
case 'unSaleApplication': case 'unSaleApplication':
handleUnSaleApplication() handleUnSaleApplication()
break break
case 'APIConfiguration':
handleAPIConfiguration()
break
} }
} }
...@@ -139,10 +144,14 @@ function handleGetApplicationInfo() { ...@@ -139,10 +144,14 @@ function handleGetApplicationInfo() {
function handleToApplicationSquare() { function handleToApplicationSquare() {
router.push({ name: 'ApplicationsSquare' }) router.push({ name: 'ApplicationsSquare' })
} }
function handleAPIConfiguration() {
isShowAPICallDrawer.value = true
}
</script> </script>
<template> <template>
<div ref="pageContentWrapRef" class="h-full w-full overflow-hidden p-5"> <div id="drawer-target" ref="pageContentWrapRef" class="relative h-full w-full overflow-hidden p-5">
<table class="w-full text-left" :max-height="tableContentY"> <table class="w-full text-left" :max-height="tableContentY">
<thead> <thead>
<tr> <tr>
...@@ -279,25 +288,6 @@ function handleToApplicationSquare() { ...@@ -279,25 +288,6 @@ function handleToApplicationSquare() {
</div> </div>
</div> </div>
<div v-show="applicationMallInfo?.isSale === 'Y'" class="flex"> <div v-show="applicationMallInfo?.isSale === 'Y'" class="flex">
<!-- <div
class="flex cursor-pointer items-center justify-start rounded-[5px] border-[1px] border-[#000DFF] bg-[#f7f7f9] px-[12px] py-[4px] text-[14px] text-[#000DFF] hover:opacity-80"
@click="handleClickChannelPublishTableAction('accessPage')"
>
<PreviewOpen theme="outline" size="16" fill="#000DFF" :stroke-width="4" class="mr-[6px]" />
<span>{{
t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.access_page')
}}</span>
</div>
<div
class="hover:text-theme-color hover:border-theme-color ml-[16px] flex cursor-pointer items-center justify-start rounded-md border bg-[#f7f7f9] px-[12px] py-[4px] text-[14px]"
@click="handleClickChannelPublishTableAction('copyLink')"
>
<CustomIcon icon="pepicons-pop:share-android-circle" class="mr-[6px]" />
<span>{{
t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.share_link')
}}</span>
</div> -->
<div <div
class="hover:text-theme-color hover:border-theme-color flex cursor-pointer items-center justify-start rounded-md border bg-[#f7f7f9] px-[12px] py-[4px] text-[14px]" class="hover:text-theme-color hover:border-theme-color flex cursor-pointer items-center justify-start rounded-md border bg-[#f7f7f9] px-[12px] py-[4px] text-[14px]"
@click="handleClickChannelPublishTableAction('modifySetting')" @click="handleClickChannelPublishTableAction('modifySetting')"
...@@ -321,9 +311,46 @@ function handleToApplicationSquare() { ...@@ -321,9 +311,46 @@ function handleToApplicationSquare() {
</div> </div>
</td> </td>
</tr> </tr>
<tr>
<td class="border-[1px] border-[#efeff5]">
<div class="flex items-center justify-start p-[12px]">
<Api theme="filled" size="24" fill="#000dff" :stroke-width="3" />
<div class="ml-[12px]">
<div class="flex">
<span class="flex items-center gap-[4px]">
{{ t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.api_call') }}
</span>
</div>
<div class="text-[#84868c]">
{{ t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.api_call_desc') }}
</div>
</div>
</div>
</td>
<td class="border-[1px] border-[#efeff5] p-[12px]">
<span class="text-[#84868c]">---</span>
</td>
<td class="border-[1px] border-[#efeff5] p-[12px]">
<div class="flex">
<div
class="flex cursor-pointer items-center justify-start rounded-[5px] border-[1px] border-[#000DFF] bg-[#f7f7f9] px-[12px] py-[4px] text-[14px] text-[#000DFF] hover:opacity-80"
@click="handleClickChannelPublishTableAction('APIConfiguration')"
>
<SettingOne theme="outline" size="16" fill="#000dff" :stroke-width="3" class="mr-[3px]" />
<span>
{{ t('common_module.config') }}
</span>
</div>
</div>
</td>
</tr>
</tbody> </tbody>
</table> </table>
<ApiCallDrawer v-model:is-show="isShowAPICallDrawer" />
<SaleApplicationsConfigurationModal <SaleApplicationsConfigurationModal
v-model="isShowSaleApplicationsConfigurationModal" v-model="isShowSaleApplicationsConfigurationModal"
:sale-applications-data="saleApplicationsInfo" :sale-applications-data="saleApplicationsInfo"
......
import i18n from '@/locales'
import { ApiCallDetailItem } from './type'
const t = i18n.global.t
export function createApiCallDetailColumns() {
return [
{
title: () => (
<span>
{t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.api_call_datetime')}
</span>
),
key: 'dateTime',
align: 'center',
ellipsis: {
tooltip: true,
},
render(row: ApiCallDetailItem) {
return row.dateTime || '--'
},
},
{
title: () => <span>{t('analysis_module.consume_points')}</span>,
key: 'count',
align: 'center',
ellipsis: {
tooltip: true,
},
render(row: ApiCallDetailItem) {
return row.count.toFixed(2) || '--'
},
},
]
}
<script lang="ts" setup>
import { ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { createApiCallDetailColumns } from '../columns'
import { ApiCallDetailItem, ApiProfileInfo } from '../type'
import { usePersonalAppConfigStore } from '@/store/modules/personal-app-config'
import { copyToClip } from '@/utils/copy'
import { fetchGetAPIProfile, fetchResetAPIProfile } from '@/apis/agent-application'
import { fetchGetAPIChannelPointUsageCount, fetchReportAPIChannelPointUsage } from '@/apis/agent-analyze'
enum RangType {
today = 'today',
week = 'week',
month = 'month',
customize = 'customize',
}
const { t } = useI18n()
const personalAppConfigStore = usePersonalAppConfigStore()
const isShow = defineModel<boolean>('isShow', { required: true })
const apiProfileLoading = ref(false)
const apiCallDetailLoading = ref(false)
const reportAPIUsageDataLoading = ref(false)
const apiProfileInfo = ref<ApiProfileInfo>({
apiKey: '',
apiSecret: '',
})
const currentRangType = ref(RangType.today)
const selectDateRange = ref<[string, string]>(['', ''])
const rangTypeOptionList = [
{
label: t('common_module.today'),
value: RangType.today,
},
{
label: t('common_module.last_week'),
value: RangType.week,
},
{
label: t('common_module.last_month'),
value: RangType.month,
},
{
label: t('common_module.custom'),
value: RangType.customize,
},
]
const apiCallDetailColumns = createApiCallDetailColumns()
const apiCallDetailData = ref<ApiCallDetailItem[]>([])
const disableDateRange = (ts: number, type: 'start' | 'end', range: [number, number] | null) => {
if (type === 'start' && range !== null) {
return range[1] - ts >= 86400000 * 365 || ts > Date.now()
}
if (type === 'end' && range !== null) {
return ts - range[0] >= 86400000 * 365 || ts > Date.now()
}
return ts > Date.now()
}
watch(
() => isShow.value,
async (newVal) => {
if (newVal) {
await handleGetAPIProfile()
await handleGetAPIChannelPointUsageCount()
}
},
)
function handleTurnToInterfaceDocument() {
window.open(
'https://www.yuque.com/u21309325/qlruxb/vp47nefvokd23d58?singleDoc#%20%E3%80%8Amodel-link%20api%E6%96%87%E6%A1%A3%E3%80%8B',
'_blank',
)
}
async function handleGetAPIProfile() {
apiProfileLoading.value = true
const res = await fetchGetAPIProfile<ApiProfileInfo>()
if (res.code === 0) {
apiProfileInfo.value = res.data
apiProfileLoading.value = false
}
}
async function handleResetAPIProfile() {
apiProfileLoading.value = true
const res = await fetchResetAPIProfile<ApiProfileInfo>()
if (res.code === 0) {
apiProfileInfo.value = res.data
apiProfileLoading.value = false
}
}
async function handleGetAPIChannelPointUsageCount() {
apiCallDetailLoading.value = true
const res = await fetchGetAPIChannelPointUsageCount<ApiCallDetailItem[]>({
agentId: personalAppConfigStore.baseInfo.agentId,
timeRange: {
rangType: currentRangType.value,
startTime: selectDateRange.value[0],
endTime: selectDateRange.value[1],
},
})
if (res.code === 0) {
apiCallDetailLoading.value = false
apiCallDetailData.value = res.data
}
}
function handleCopyText(text: string) {
copyToClip(text)
window.$message.success(t('common_module.copy_success_message'))
}
async function handleUpdateRangType(rangType: string) {
if (rangType !== RangType.customize) {
selectDateRange.value = ['', '']
await handleGetAPIChannelPointUsageCount()
}
}
async function handleUpdateDateRange(_value: [number, number], formattedValue: [string, string]) {
if (formattedValue[0] && formattedValue[1]) {
selectDateRange.value = formattedValue
await handleGetAPIChannelPointUsageCount()
}
}
async function handleExportAPIChannelPointUsageData() {
reportAPIUsageDataLoading.value = true
fetchReportAPIChannelPointUsage({
reportRequestType: 'API_CHANNEL_POINT_USAGE',
agentId: personalAppConfigStore.baseInfo.agentId,
timeRange: {
rangType: currentRangType.value,
startTime: selectDateRange.value[0],
endTime: selectDateRange.value[1],
},
})
.then((data: any) => {
const blob = new Blob([data], { type: 'application/vnd.ms-excel' })
const link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = `${personalAppConfigStore.baseInfo.agentId}.xlsx`
link.click()
window.URL.revokeObjectURL(link.href)
window.$message.success(t('common_module.export_successfully'))
})
.catch(() => {
window.$message.error(t('common_module.export_failed'))
})
.finally(() => {
reportAPIUsageDataLoading.value = false
})
}
</script>
<template>
<n-drawer
v-model:show="isShow"
:width="861"
:show-mask="'transparent'"
:trap-focus="false"
:block-scroll="false"
content-class="rounded-[10px]"
class="shadow-none!"
to="#drawer-target"
>
<n-drawer-content
:title="t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.api_call')"
header-class="border-b-0! p-5! pt-6! text-[16px]! font-600!"
body-content-class="px-5! py-0!"
footer-class="border-t-0! py-2!"
:native-scrollbar="false"
closable
>
<div class="flex min-h-[calc(100vh-56px-62px-20px)] flex-col rounded-[10px] bg-[#fafbfc] p-5">
<div class="mb-5 flex justify-end pr-5">
<n-button type="primary" :bordered="false" @click="handleTurnToInterfaceDocument">
{{ t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.interface_document') }}
</n-button>
</div>
<div class="text-font-color flex h-full flex-col gap-5 text-[14px]">
<div class="rounded-[10px] border border-[#e7e7e7] bg-white p-5">
<div class="mb-[7px] flex items-center justify-between">
<p class="font-600">App Key</p>
<span
v-show="!apiProfileInfo.apiKey"
class="text-theme-color cursor-pointer hover:opacity-80"
@click="handleGetAPIProfile"
>
{{
t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.click_to_generate')
}}
</span>
<span
v-show="apiProfileInfo.apiKey"
class="text-theme-color cursor-pointer hover:opacity-80"
@click="handleResetAPIProfile"
>
{{ t('common_module.regenerate') }}
</span>
</div>
<div class="rounded-theme h-9 w-full cursor-default border px-3">
<div v-show="!apiProfileLoading" class="flex h-full w-full items-center justify-between">
<span>{{ apiProfileInfo.apiKey || t('common_module.not_generated') }}</span>
<n-popover trigger="hover">
<template #trigger>
<i
v-show="apiProfileInfo.apiKey"
class="iconfont icon-copy text-gray-font-color hover:text-theme-color cursor-pointer leading-4"
@click="handleCopyText(apiProfileInfo.apiKey)"
/>
</template>
<span>{{ t('common_module.data_table_module.copy') }}</span>
</n-popover>
</div>
<div v-show="apiProfileLoading" class="flex h-full w-full items-center">
<div class="bg-px-api_profile_loading-gif h-[10px] w-[54px] bg-contain bg-no-repeat" />
</div>
</div>
<p class="font-600 mb-[7px] mt-[20px]">App Secret</p>
<div class="rounded-theme h-9 w-full cursor-default border px-3">
<div v-show="!apiProfileLoading" class="flex h-full w-full items-center justify-between">
<span>{{ apiProfileInfo.apiSecret || t('common_module.not_generated') }}</span>
<n-popover trigger="hover">
<template #trigger>
<i
v-show="apiProfileInfo.apiSecret"
class="iconfont icon-copy text-gray-font-color hover:text-theme-color cursor-pointer leading-4"
@click="handleCopyText(apiProfileInfo.apiSecret)"
/>
</template>
<span>{{ t('common_module.data_table_module.copy') }}</span>
</n-popover>
</div>
<div v-show="apiProfileLoading" class="flex h-full w-full items-center">
<div class="bg-px-api_profile_loading-gif h-[10px] w-[54px] bg-contain bg-no-repeat" />
</div>
</div>
</div>
<div class="rounded-[10px] border border-[#e7e7e7] bg-white p-5">
<p class="font-600 mb-2">
{{ t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.agentId') }}
</p>
<div class="rounded-theme flex h-9 w-full cursor-default items-center justify-between border px-3">
<span>{{ personalAppConfigStore.baseInfo.agentId }}</span>
<span
class="text-theme-color border-inactive-border-color cursor-pointer border-l pl-3 hover:opacity-80"
@click="handleCopyText(personalAppConfigStore.baseInfo.agentId)"
>
{{ t('common_module.copy_link') }}
</span>
</div>
</div>
<div class="flex h-[476px] flex-col rounded-[10px] border border-[#e7e7e7] bg-white p-5">
<p class="font-600 mb-2">
{{ t('personal_space_module.agent_module.agent_setting_module.agent_publish_module.api_call_details') }}
</p>
<div class="my-4.5 flex items-center justify-between">
<div class="flex gap-3">
<n-select
v-model:value="currentRangType"
:options="rangTypeOptionList"
class="w-[124px]! text-[#84868c]! time-range-select"
@update:value="handleUpdateRangType"
/>
<n-date-picker
v-show="currentRangType === 'customize'"
:is-date-disabled="disableDateRange"
type="daterange"
clearable
class="w-[250px]! customize-date-picker"
@update:value="handleUpdateDateRange"
/>
</div>
<n-button
type="primary"
:bordered="false"
:disabled="!apiCallDetailData.length"
:loading="reportAPIUsageDataLoading"
@click="handleExportAPIChannelPointUsageData"
>
{{ t('common_module.export_data') }}
</n-button>
</div>
<n-data-table
:columns="apiCallDetailColumns"
:bordered="true"
:bottom-bordered="true"
:single-line="false"
:max-height="283"
:loading="apiCallDetailLoading"
:data="apiCallDetailData"
virtual-scroll
>
<template #empty>
<div class="flex h-[283px] items-center justify-center">
<div class="flex flex-col items-center justify-center">
<div class="bg-px-empty_list-png mb-5 h-[68px] w-[68px]" />
<p class="select-none text-[#84868c]">{{ t('common_module.empty_data') }}</p>
</div>
</div>
</template>
</n-data-table>
</div>
</div>
</div>
<template #footer></template>
</n-drawer-content>
</n-drawer>
</template>
<style lang="scss" scoped>
:deep(.time-range-select .n-base-selection),
:deep(.customize-date-picker.n-date-picker .n-input) {
--n-height: 36px !important;
}
:deep(.n-input .n-input__input-el) {
height: 36px !important;
}
</style>
export interface ApiProfileInfo {
apiKey: string
apiSecret: string
}
export interface ApiCallDetailItem {
dateTime: Date
count: number
}
...@@ -5,7 +5,7 @@ import { Emitter } from 'mitt' ...@@ -5,7 +5,7 @@ import { Emitter } from 'mitt'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import PageNarBar from './components/page-narbar.vue' import PageNarBar from './components/page-narbar.vue'
import AgentConfig from './components/agent-config/agent-config.vue' import AgentConfig from './components/agent-config/agent-config.vue'
import AgentPublish from './components/agent-publish.vue' import AgentPublish from './components/agent-publish/agent-publish.vue'
import AgentAnalysis from './components/agent-analysis/agent-analysis.vue' import AgentAnalysis from './components/agent-analysis/agent-analysis.vue'
import { usePersonalAppConfigStore } from '@/store/modules/personal-app-config' import { usePersonalAppConfigStore } from '@/store/modules/personal-app-config'
import { PersonalAppConfigState } from '@/store/types/personal-app-config' import { PersonalAppConfigState } from '@/store/types/personal-app-config'
......
...@@ -4,7 +4,6 @@ import { useI18n } from 'vue-i18n' ...@@ -4,7 +4,6 @@ import { useI18n } from 'vue-i18n'
import { Search, MoreOne, Star } from '@icon-park/vue-next' import { Search, MoreOne, Star } from '@icon-park/vue-next'
import { PaginationInfo } from '@/components/custom-pagination/custom-pagination.vue' import { PaginationInfo } from '@/components/custom-pagination/custom-pagination.vue'
import { formatDateTime } from '@/utils/date-formatter' import { formatDateTime } from '@/utils/date-formatter'
import { import {
fetchApplicationsCollectionStatusChange, fetchApplicationsCollectionStatusChange,
fetchDeleteApplication, fetchDeleteApplication,
...@@ -18,10 +17,12 @@ import { defaultPersonalAppConfigState } from '@/store/modules/personal-app-conf ...@@ -18,10 +17,12 @@ import { defaultPersonalAppConfigState } from '@/store/modules/personal-app-conf
import searchEmptyImage from '@/assets/images/search-empty.png' import searchEmptyImage from '@/assets/images/search-empty.png'
import applicationEmptyImage from '@/assets/images/application-empty.png' import applicationEmptyImage from '@/assets/images/application-empty.png'
import { debounce } from 'lodash-es' import { debounce } from 'lodash-es'
import { useUserStore } from '@/store/modules/user'
const { t } = useI18n() const { t } = useI18n()
const cardContentWrapRef = useTemplateRef<HTMLDivElement>('cardContentWrapRef') const cardContentWrapRef = useTemplateRef<HTMLDivElement>('cardContentWrapRef')
const userStore = useUserStore()
const selectedPublishStatusValue = ref('') const selectedPublishStatusValue = ref('')
const isShowSaleApplicationsConfigurationModal = ref(false) const isShowSaleApplicationsConfigurationModal = ref(false)
...@@ -144,6 +145,8 @@ function handleDeletePersonalApp(agentId: string) { ...@@ -144,6 +145,8 @@ function handleDeletePersonalApp(agentId: string) {
window.$message.success(t('common_module.delete_success_message')) window.$message.success(t('common_module.delete_success_message'))
agentAppList.value.length === 1 && (pagingInfo.value.pageNo = pagingInfo.value.pageNo - 1) agentAppList.value.length === 1 && (pagingInfo.value.pageNo = pagingInfo.value.pageNo - 1)
getApplicationList() getApplicationList()
userStore.fetchUpdateEquityInfo()
}) })
}) })
} }
......
...@@ -16,11 +16,14 @@ import { ...@@ -16,11 +16,14 @@ import {
} from '@/apis/knowledge' } from '@/apis/knowledge'
import useTableScrollY from '@/composables/useTableScrollY' import useTableScrollY from '@/composables/useTableScrollY'
import EditKnowledgeModal, { KnowledgeFormDataInterface } from './components/edit-knowledge-modal.vue' import EditKnowledgeModal, { KnowledgeFormDataInterface } from './components/edit-knowledge-modal.vue'
import { useUserStore } from '@/store/modules/user'
const { t } = useI18n() const { t } = useI18n()
const router = useRouter() const router = useRouter()
const userStore = useUserStore()
const { pageContentWrapRef, tableContentY } = useTableScrollY(48 + 48) const { pageContentWrapRef, tableContentY } = useTableScrollY(48 + 48)
const knowledgeDocumentColumn = createKnowledgeDocumentColumn(handleClickKnowledgeDocumentTableAction) const knowledgeDocumentColumn = createKnowledgeDocumentColumn(handleClickKnowledgeDocumentTableAction)
...@@ -146,6 +149,7 @@ async function handleDeleteKnowledgeDocument(kdId: number) { ...@@ -146,6 +149,7 @@ async function handleDeleteKnowledgeDocument(kdId: number) {
if (res.code === 0) { if (res.code === 0) {
window.$message.success(t('common_module.delete_success_message')) window.$message.success(t('common_module.delete_success_message'))
await userStore.fetchUpdateEquityInfo()
await handleGetKnowledgeDocumentList() await handleGetKnowledgeDocumentList()
} }
}) })
...@@ -192,6 +196,7 @@ async function handleBatchDelDocument() { ...@@ -192,6 +196,7 @@ async function handleBatchDelDocument() {
if (res.code === 0) { if (res.code === 0) {
window.$message.success(t('common_module.delete_success_message')) window.$message.success(t('common_module.delete_success_message'))
await userStore.fetchUpdateEquityInfo()
await handleGetKnowledgeDocumentList() await handleGetKnowledgeDocumentList()
} }
}) })
......
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref } from 'vue' import { computed, onMounted, ref } from 'vue'
import { UploadFileInfo } from 'naive-ui' import { UploadFileInfo } from 'naive-ui'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router'
import { UploadOne } from '@icon-park/vue-next' import { UploadOne } from '@icon-park/vue-next'
import CustomIcon from '@/components/custom-icon/custom-icon.vue' import CustomIcon from '@/components/custom-icon/custom-icon.vue'
import { fetchUploadKnowledgeDocument } from '@/apis/knowledge' import { fetchUploadKnowledgeDocument } from '@/apis/knowledge'
import { useUserStore } from '@/store/modules/user'
interface Emit { interface Emit {
(e: 'next', value: number[]): void (e: 'next', value: number[]): void
...@@ -29,9 +31,14 @@ interface FileItem { ...@@ -29,9 +31,14 @@ interface FileItem {
const { t } = useI18n() const { t } = useI18n()
const router = useRouter()
const userStore = useUserStore()
const emit = defineEmits<Emit>() const emit = defineEmits<Emit>()
const uploadFileList = ref<FileItem[]>([]) const uploadFileList = ref<FileItem[]>([])
const isExceedKnowledgeCount = ref(false)
const uploadFileIcon = (type: string) => { const uploadFileIcon = (type: string) => {
return `https://gsst-poe-sit.gz.bcebos.com/icon/${type}.svg` return `https://gsst-poe-sit.gz.bcebos.com/icon/${type}.svg`
...@@ -53,8 +60,49 @@ const uploadFileSize = computed(() => (fileSize: number) => { ...@@ -53,8 +60,49 @@ const uploadFileSize = computed(() => (fileSize: number) => {
return (fileSize / Math.pow(binarySize, unit)).toPrecision(3) + ' ' + sizes[unit] return (fileSize / Math.pow(binarySize, unit)).toPrecision(3) + ' ' + sizes[unit]
}) })
onMounted(async () => {
await handleGetEquityInfo()
})
async function handleGetEquityInfo() {
await userStore.fetchUpdateEquityInfo()
}
// 上传文件前限制 // 上传文件前限制
function handleLimitUpload(data: { file: UploadFileInfo }) { function handleLimitUpload(data: { file: UploadFileInfo; fileList: UploadFileInfo[] }) {
// 上传数量达到上限
if (isExceedKnowledgeCount.value) {
return false
}
// 获取文件上传时多选的个数
let uploadKnowledgeCount = 0
const knowledgeFileList = document.getElementsByClassName('upload-knowledge-file')
if (knowledgeFileList && knowledgeFileList.length > 0) {
const knowledgeFile = knowledgeFileList[0].getElementsByTagName('input')
if (knowledgeFile && knowledgeFile.length > 0 && knowledgeFile[0].files && knowledgeFile[0].files.length > 0) {
uploadKnowledgeCount = knowledgeFile[0].files.length
}
}
const enableKnowledgeCount = Math.max(
0,
userStore.equityInfo.maxKnowledgeCount - userStore.equityInfo.usedKnowledgeCount - uploadFileList.value.length,
)
if (userStore.equityInfo.maxKnowledgeCount !== 0 && enableKnowledgeCount < uploadKnowledgeCount) {
isExceedKnowledgeCount.value = true
window.$message
.ctWarning(t('equity_module.documents_uploaded_exceeds_tip', { count: enableKnowledgeCount }), '')
.then(() => {
router.push({ name: 'Equity' })
})
.catch(() => {})
return false
}
const allowTypeList = ['md', 'doc', 'docx', 'pdf', 'txt'] const allowTypeList = ['md', 'doc', 'docx', 'pdf', 'txt']
const fileType = (data.file.file && data.file.file?.name.split('.')?.pop()?.toLowerCase()) || '' const fileType = (data.file.file && data.file.file?.name.split('.')?.pop()?.toLowerCase()) || ''
...@@ -144,6 +192,26 @@ function handleDropFile(e: DragEvent) { ...@@ -144,6 +192,26 @@ function handleDropFile(e: DragEvent) {
const files = e.dataTransfer?.files as FileList const files = e.dataTransfer?.files as FileList
const file = files[0] const file = files[0]
isExceedKnowledgeCount.value = false
const dropKnowledgeCount = files.length
const enableKnowledgeCount = Math.max(
0,
userStore.equityInfo.maxKnowledgeCount - userStore.equityInfo.usedKnowledgeCount - uploadFileList.value.length,
)
if (userStore.equityInfo.maxKnowledgeCount !== 0 && enableKnowledgeCount < dropKnowledgeCount) {
isExceedKnowledgeCount.value = true
window.$message
.ctWarning(t('equity_module.documents_uploaded_exceeds_tip', { count: enableKnowledgeCount }), '')
.then(() => {
router.push({ name: 'Equity' })
})
.catch(() => {})
return
}
const allowTypeList = ['md', 'doc', 'docx', 'pdf', 'txt'] const allowTypeList = ['md', 'doc', 'docx', 'pdf', 'txt']
if (file && file.name) { if (file && file.name) {
...@@ -175,12 +243,13 @@ function handleNextStep() { ...@@ -175,12 +243,13 @@ function handleNextStep() {
directory-dnd directory-dnd
:show-file-list="false" :show-file-list="false"
:disabled="uploadFileList.length >= 5" :disabled="uploadFileList.length >= 5"
class="upload-knowledge-file"
accept=".doc, .pdf, .docx, .txt, .md" accept=".doc, .pdf, .docx, .txt, .md"
@before-upload="handleLimitUpload" @before-upload="handleLimitUpload"
@change="handleUpload" @change="handleUpload"
@drop="handleDropFile" @drop="handleDropFile"
> >
<NUploadDragger> <NUploadDragger @click="isExceedKnowledgeCount = false">
<div class="mb-3 flex justify-center"> <div class="mb-3 flex justify-center">
<UploadOne theme="outline" size="36" fill="#333" /> <UploadOne theme="outline" size="36" fill="#333" />
</div> </div>
......
...@@ -71,6 +71,8 @@ async function handleCreateKnowledgeNextStep(createKnowledgeData: KnowledgeFormD ...@@ -71,6 +71,8 @@ async function handleCreateKnowledgeNextStep(createKnowledgeData: KnowledgeFormD
const res = await fetchCreateKnowledge<{ id: number }>({ const res = await fetchCreateKnowledge<{ id: number }>({
knowledgeName: createKnowledgeData.knowledgeName, knowledgeName: createKnowledgeData.knowledgeName,
desc: createKnowledgeData.knowledgeDesc, desc: createKnowledgeData.knowledgeDesc,
}).finally(() => {
createKnowledgeBtnLoading.value = false
}) })
if (res.code === 0) { if (res.code === 0) {
...@@ -82,7 +84,6 @@ async function handleCreateKnowledgeNextStep(createKnowledgeData: KnowledgeFormD ...@@ -82,7 +84,6 @@ async function handleCreateKnowledgeNextStep(createKnowledgeData: KnowledgeFormD
}, },
}) })
showCreateKnowledgeModal.value = false showCreateKnowledgeModal.value = false
createKnowledgeBtnLoading.value = false
} }
} }
</script> </script>
......
...@@ -50,6 +50,8 @@ const userStore = useUserStore() ...@@ -50,6 +50,8 @@ const userStore = useUserStore()
const { uploadFileList, handleLimitUpload, handleUpload, handleRemoveFile } = useDialogueFile() const { uploadFileList, handleLimitUpload, handleUpload, handleRemoveFile } = useDialogueFile()
const isAnswerResponseLoading = defineModel<boolean>('isAnswerResponseLoading', { required: true })
const emitter = inject<Emitter<MittEvents>>('emitter') const emitter = inject<Emitter<MittEvents>>('emitter')
const inputMessageContent = ref('') const inputMessageContent = ref('')
...@@ -175,6 +177,7 @@ function handleMessageSend() { ...@@ -175,6 +177,7 @@ function handleMessageSend() {
const input = inputMessageContent.value const input = inputMessageContent.value
let replyTextContent = '' let replyTextContent = ''
isAnswerResponseLoading.value = true
isAnswerResponseWait.value = true isAnswerResponseWait.value = true
inputMessageContent.value = '' inputMessageContent.value = ''
currentReplyContentSentenceExtractIndex.value = 0 currentReplyContentSentenceExtractIndex.value = 0
...@@ -204,6 +207,7 @@ function handleMessageSend() { ...@@ -204,6 +207,7 @@ function handleMessageSend() {
isAnswerResponseLoading: false, isAnswerResponseLoading: false,
}) })
isAnswerResponseLoading.value = false
isCreateContinueQuestions.value && emit('createContinueQuestions', replyTextContent) isCreateContinueQuestions.value && emit('createContinueQuestions', replyTextContent)
emit('updatePageScroll') emit('updatePageScroll')
blockMessageResponse() blockMessageResponse()
...@@ -239,6 +243,7 @@ function handleMessageSend() { ...@@ -239,6 +243,7 @@ function handleMessageSend() {
}, },
onFinally: () => { onFinally: () => {
controller = null controller = null
userStore.fetchUpdateEquityInfo()
}, },
}) })
} }
...@@ -263,6 +268,7 @@ function handleClearAllMessage() { ...@@ -263,6 +268,7 @@ function handleClearAllMessage() {
function blockMessageResponse() { function blockMessageResponse() {
controller?.abort() controller?.abort()
isAnswerResponseWait.value = false isAnswerResponseWait.value = false
userStore.fetchUpdateEquityInfo()
} }
function handleToLogin() { function handleToLogin() {
......
...@@ -10,6 +10,8 @@ interface Props { ...@@ -10,6 +10,8 @@ interface Props {
agentApplicationConfig: PersonalAppConfigState agentApplicationConfig: PersonalAppConfigState
continuousQuestionStatus: 'default' | 'close' continuousQuestionStatus: 'default' | 'close'
continuousQuestionList: string[] continuousQuestionList: string[]
isAnswerResponseLoading: boolean
createContinueQuestionsException: boolean
} }
const props = defineProps<Props>() const props = defineProps<Props>()
...@@ -25,7 +27,8 @@ const isShowContinueQuestion = computed(() => { ...@@ -25,7 +27,8 @@ const isShowContinueQuestion = computed(() => {
return ( return (
props.continuousQuestionStatus === 'default' && props.continuousQuestionStatus === 'default' &&
props.messageList.size > 1 && props.messageList.size > 1 &&
!Array.from(props.messageList.entries()).pop()?.[1].isAnswerResponseLoading !props.isAnswerResponseLoading &&
!props.createContinueQuestionsException
) )
}) })
......
...@@ -48,6 +48,8 @@ const currentPlayMessageItem = ref<ConversationMessageItem | null>(null) ...@@ -48,6 +48,8 @@ const currentPlayMessageItem = ref<ConversationMessageItem | null>(null)
const currentPlayAudioFragmentSerialNo = ref(0) const currentPlayAudioFragmentSerialNo = ref(0)
const currentSoundCtl = shallowRef<Howl | null>(null) const currentSoundCtl = shallowRef<Howl | null>(null)
const isSoundCtlCreated = ref(false) const isSoundCtlCreated = ref(false)
const isAnswerResponseLoading = ref(false)
const createContinueQuestionsException = ref(false)
const isEnableDocumentParse = computed(() => { const isEnableDocumentParse = computed(() => {
return agentApplicationConfig.value.knowledgeConfig.isDocumentParsing === 'Y' return agentApplicationConfig.value.knowledgeConfig.isDocumentParsing === 'Y'
...@@ -184,12 +186,18 @@ function handleClearAllMessage() { ...@@ -184,12 +186,18 @@ function handleClearAllMessage() {
} }
async function handleCreateContinueQuestions(replyTextContent: string) { async function handleCreateContinueQuestions(replyTextContent: string) {
const res = await fetchCreateContinueQuestions<string[]>({ input: replyTextContent }) createContinueQuestionsException.value = false
if (res.code === 0) { fetchCreateContinueQuestions<string[]>({ input: replyTextContent })
continueQuestionList.value = res.data .then((res) => {
handleUpdatePageScroll() if (res.code === 0) {
} continueQuestionList.value = res.data
handleUpdatePageScroll()
}
})
.catch(() => {
createContinueQuestionsException.value = true
})
} }
function handleResetContinueQuestionList() { function handleResetContinueQuestionList() {
...@@ -316,6 +324,8 @@ function handleAudioPause(isClearMessageList = false) { ...@@ -316,6 +324,8 @@ function handleAudioPause(isClearMessageList = false) {
:message-list="messageList" :message-list="messageList"
:continuous-question-status="continuousQuestionStatus" :continuous-question-status="continuousQuestionStatus"
:continuous-question-list="continueQuestionList" :continuous-question-list="continueQuestionList"
:is-answer-response-loading="isAnswerResponseLoading"
:create-continue-questions-exception="createContinueQuestionsException"
@audio-play="handleAudioPlay" @audio-play="handleAudioPlay"
@audio-pause="handleAudioPause" @audio-pause="handleAudioPause"
/> />
...@@ -325,6 +335,7 @@ function handleAudioPause(isClearMessageList = false) { ...@@ -325,6 +335,7 @@ function handleAudioPause(isClearMessageList = false) {
<div class="footer-operation px-4"> <div class="footer-operation px-4">
<FooterInput <FooterInput
ref="footerInputRef" ref="footerInputRef"
v-model:is-answer-response-loading="isAnswerResponseLoading"
:message-list="messageList" :message-list="messageList"
:dialogs-id="dialogsId" :dialogs-id="dialogsId"
:agent-id="agentApplicationConfig.baseInfo.agentId" :agent-id="agentApplicationConfig.baseInfo.agentId"
......
...@@ -51,6 +51,8 @@ const currentPlayMessageItem = ref<ConversationMessageItem | null>(null) ...@@ -51,6 +51,8 @@ const currentPlayMessageItem = ref<ConversationMessageItem | null>(null)
const currentPlayAudioFragmentSerialNo = ref(0) const currentPlayAudioFragmentSerialNo = ref(0)
const currentSoundCtl = shallowRef<Howl | null>(null) const currentSoundCtl = shallowRef<Howl | null>(null)
const isSoundCtlCreated = ref(false) const isSoundCtlCreated = ref(false)
const isAnswerResponseLoading = ref(false)
const createContinueQuestionsException = ref(false)
const isEnableDocumentParse = computed(() => { const isEnableDocumentParse = computed(() => {
return agentApplicationConfig.value.knowledgeConfig.isDocumentParsing === 'Y' return agentApplicationConfig.value.knowledgeConfig.isDocumentParsing === 'Y'
...@@ -205,12 +207,18 @@ function handleClearAllMessage() { ...@@ -205,12 +207,18 @@ function handleClearAllMessage() {
} }
async function handleCreateContinueQuestions(replyTextContent: string) { async function handleCreateContinueQuestions(replyTextContent: string) {
const res = await fetchCreateContinueQuestions<string[]>({ input: replyTextContent }) createContinueQuestionsException.value = false
if (res.code === 0) { fetchCreateContinueQuestions<string[]>({ input: replyTextContent })
continueQuestionList.value = res.data .then((res) => {
handleUpdatePageScroll() if (res.code === 0) {
} continueQuestionList.value = res.data
handleUpdatePageScroll()
}
})
.catch(() => {
createContinueQuestionsException.value = true
})
} }
function handleResetContinueQuestionList() { function handleResetContinueQuestionList() {
...@@ -339,6 +347,8 @@ function handleAudioPause(isClearMessageList = false) { ...@@ -339,6 +347,8 @@ function handleAudioPause(isClearMessageList = false) {
:message-list="messageList" :message-list="messageList"
:continuous-question-status="continuousQuestionStatus" :continuous-question-status="continuousQuestionStatus"
:continuous-question-list="continueQuestionList" :continuous-question-list="continueQuestionList"
:is-answer-response-loading="isAnswerResponseLoading"
:create-continue-questions-exception="createContinueQuestionsException"
@audio-play="handleAudioPlay" @audio-play="handleAudioPlay"
@audio-pause="handleAudioPause" @audio-pause="handleAudioPause"
/> />
...@@ -348,6 +358,7 @@ function handleAudioPause(isClearMessageList = false) { ...@@ -348,6 +358,7 @@ function handleAudioPause(isClearMessageList = false) {
<div class="px-5"> <div class="px-5">
<FooterInput <FooterInput
ref="footerInputRef" ref="footerInputRef"
v-model:is-answer-response-loading="isAnswerResponseLoading"
:message-list="messageList" :message-list="messageList"
:dialogs-id="dialogsId" :dialogs-id="dialogsId"
:agent-id="agentApplicationConfig.baseInfo.agentId" :agent-id="agentApplicationConfig.baseInfo.agentId"
......
<script setup lang="ts">
import { onMounted, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import ContentTitle from '../components/content-title.vue'
import { IPlatformAgentUsage, IPlatformAgentUsageDetailItem } from '../type'
import { createPlatformAgentUsageDetail } from './columns'
import CustomPagination from '@/components/custom-pagination/custom-pagination.vue'
import { fetchGetPlatformAgentUsage, fetchGetPlatformAgentUsageDetail } from '@/apis/statistic'
import { ChannelType } from '@/enums/channel'
import { usePagination } from '@/composables/usePagination'
import useTableScrollY from '@/composables/useTableScrollY'
import DataSelectSearch from '@/components/date-select-search/data-select-search.vue'
import { RangType } from '@/components/date-select-search/type.d'
const { t } = useI18n()
const { pageContentWrapRef, tableContentY } = useTableScrollY(46 + 124 + 28 + 36 + 20 + 48 + 28 + 40)
const { paginationData, handlePageNoChange, handlePageSizeChange } = usePagination()
const platformAgentUsage = ref<IPlatformAgentUsage>({
createCount: 0,
usageCount: 0,
unPublishCount: 0,
publishCount: 0,
})
const currentTime = ref<RangType>(RangType.week)
const selectDateRange = ref<[string, string]>(['', ''])
const platformAgentUsageDetailLoading = ref(false)
const platformAgentUsageDetailColumns = createPlatformAgentUsageDetail()
const platformAgentUsageDetailData = ref<IPlatformAgentUsageDetailItem[]>([])
watch([() => paginationData.pageNo, () => paginationData.pageSize], () => {
handleGetPlatformAgentUsageDetail(currentTime.value, selectDateRange.value[0], selectDateRange.value[1])
})
onMounted(() => {
handleGetPlatformAgentUsage()
})
async function handleGetPlatformAgentUsage() {
const channels = [
ChannelType.api,
ChannelType.index,
ChannelType.link_share,
ChannelType.mall,
ChannelType.preview,
ChannelType.multi_preview,
]
const res = await fetchGetPlatformAgentUsage<IPlatformAgentUsage>(channels)
if (res.code === 0) {
platformAgentUsage.value = res.data
}
}
async function handleGetPlatformAgentUsageDetail(rangType: RangType, startTime: string, endTime: string) {
currentTime.value = rangType
selectDateRange.value = [startTime, endTime]
platformAgentUsageDetailLoading.value = true
const res = await fetchGetPlatformAgentUsageDetail<IPlatformAgentUsageDetailItem[]>({
timeRange: {
rangType,
startTime,
endTime,
},
pagingInfo: paginationData,
})
if (res.code === 0) {
platformAgentUsageDetailData.value = res.data
paginationData.totalRows = res.pagingInfo?.totalRows || 0
paginationData.totalPages = res.pagingInfo?.totalPages || 0
platformAgentUsageDetailLoading.value = false
}
}
</script>
<template>
<div ref="pageContentWrapRef" class="mx-6 h-full rounded-[10px] bg-white pt-[46px]">
<div class="text-font-color mb-7 flex w-full justify-around gap-2 px-[34px]">
<div
class="relative flex h-[124px] max-w-[312px] flex-1 flex-col justify-center rounded-[10px] bg-[#F8F9FB] px-10"
>
<div class="bg-px-statistics-create_icon-png absolute bottom-0 right-0 h-[93px] w-[90px]" />
<div class="font-600 text-[30px]">
<n-number-animation :from="0" :to="platformAgentUsage.createCount" />
</div>
<span class="mt-3">{{ t('statistic_module.create_agent_count') }}</span>
</div>
<div
class="relative flex h-[124px] max-w-[312px] flex-1 flex-col justify-center rounded-[10px] bg-[#F8F9FB] px-10"
>
<div class="bg-px-statistics-usage_icon-png absolute bottom-0 right-0 h-[93px] w-[90px]" />
<div class="font-600 text-[30px]">
<n-number-animation :from="0" :to="platformAgentUsage.usageCount" />
</div>
<span class="mt-3">{{ t('statistic_module.usage_agent_count') }}</span>
</div>
<div
class="relative flex h-[124px] max-w-[312px] flex-1 flex-col justify-center rounded-[10px] bg-[#F8F9FB] px-10"
>
<div class="bg-px-statistics-unpublish_icon-png absolute bottom-0 right-0 h-[93px] w-[90px]" />
<div class="font-600 text-[30px]">
<n-number-animation :from="0" :to="platformAgentUsage.unPublishCount" />
</div>
<span class="mt-3">{{ t('statistic_module.unpublish_agent_count') }}</span>
</div>
<div
class="relative flex h-[124px] max-w-[312px] flex-1 flex-col justify-center rounded-[10px] bg-[#F8F9FB] px-10"
>
<div class="bg-px-statistics-publish_icon-png absolute bottom-0 right-0 h-[93px] w-[90px]" />
<div class="font-600 text-[30px]">
<n-number-animation :from="0" :to="platformAgentUsage.publishCount" />
</div>
<span class="mt-3">{{ t('statistic_module.published_agent_count') }}</span>
</div>
</div>
<div class="mx-[34px] flex items-start justify-between">
<ContentTitle :title="t('statistic_module.platform_agent_usage_detail')" />
<DataSelectSearch @update-search-list="handleGetPlatformAgentUsageDetail" />
</div>
<div class="mx-[34px] mt-5 flex flex-1 flex-col">
<div :style="{ height: tableContentY + 48 + 'px' }">
<n-data-table
:columns="platformAgentUsageDetailColumns"
:bordered="false"
:bottom-bordered="false"
:max-height="tableContentY"
:loading="platformAgentUsageDetailLoading"
:data="platformAgentUsageDetailData"
:scroll-x="1505"
>
<template #empty>
<div class="flex items-center justify-center" :style="{ height: tableContentY + 'px' }">
<div class="flex flex-col items-center justify-center">
<div class="bg-px-empty_list-png mb-5 h-[68px] w-[68px]" />
<p class="select-none text-[#84868c]">{{ t('common_module.empty_data') }}</p>
</div>
</div>
</template>
</n-data-table>
</div>
<div v-show="tableContentY > 0" class="mt-5 flex justify-end">
<CustomPagination
:paging-info="paginationData"
@update-page-no="handlePageNoChange"
@update-page-size="handlePageSizeChange"
/>
</div>
</div>
</div>
</template>
import i18n from '@/locales'
import { IPlatformAgentUsageDetailItem } from '../type'
import { formatDateTime } from '@/utils/date-formatter'
const t = i18n.global.t
export function createPlatformAgentUsageDetail() {
return [
{
title: () => <span>{t('statistic_module.agent_title')}</span>,
key: 'agentTitle',
align: 'left',
width: '369px',
ellipsis: {
tooltip: true,
},
render(row: IPlatformAgentUsageDetailItem) {
return row.agentTitle || '--'
},
},
{
title: () => <span>{t('analysis_module.consume_points')}</span>,
key: 'totalPoint',
align: 'left',
width: '188px',
ellipsis: {
tooltip: true,
},
render(row: IPlatformAgentUsageDetailItem) {
return row.totalPoint.toFixed(1) || '--'
},
},
{
title: () => <span>{t('statistic_module.agent_status')}</span>,
key: 'publishStatus',
align: 'left',
width: '160px',
ellipsis: {
tooltip: true,
},
render(row: IPlatformAgentUsageDetailItem) {
return row.publishStatus === 'Y' ? t('common_module.published') : t('common_module.unpublished')
},
},
{
title: () => <span>{t('statistic_module.owner')}</span>,
key: 'owner',
align: 'left',
width: '236px',
ellipsis: {
tooltip: true,
},
render(row: IPlatformAgentUsageDetailItem) {
return row.owner || '--'
},
},
{
title: () => <span>{t('statistic_module.usage_count')}</span>,
key: 'usageCount',
align: 'left',
width: '200px',
ellipsis: {
tooltip: true,
},
render(row: IPlatformAgentUsageDetailItem) {
return row.usageCount || '--'
},
},
{
title: () => <span>{t('statistic_module.last_usage_time')}</span>,
key: 'lastUsageTime',
align: 'left',
width: '360px',
ellipsis: {
tooltip: true,
},
render(row: IPlatformAgentUsageDetailItem) {
return row.lastUsageTime ? formatDateTime(row.lastUsageTime) : '--'
},
},
]
}
<script setup lang="ts">
interface Props {
title: string
}
defineProps<Props>()
</script>
<template>
<div class="flex items-start">
<span class="bg-theme-color mr-[5px] mt-1.5 inline-block h-[14px] w-1 flex-shrink-0 rounded-sm" />
<span class="text-[16px]">{{ title }}</span>
</div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import ContentTitle from '../../components/content-title.vue'
import { IPlatformPointUsage } from '../../type'
import { fetchGetPlatformPointUsage } from '@/apis/statistic'
interface Props {
channel: string[]
}
const { t } = useI18n()
const props = defineProps<Props>()
const platformPointUsage = ref<IPlatformPointUsage>({
today: 0,
week: 0,
month: 0,
year: 0,
})
watch(
() => props.channel,
() => {
handleGetPlatformPointUsage()
},
)
async function handleGetPlatformPointUsage() {
const res = await fetchGetPlatformPointUsage<IPlatformPointUsage>(props.channel)
if (res.code === 0) {
platformPointUsage.value = res.data
}
}
</script>
<template>
<div class="w-full rounded-[20px] bg-white py-5">
<ContentTitle :title="t('statistic_module.platform_point_usage')" class="ml-[34px]" />
<div class="text-font-color mt-6.5 mb-2.5 flex w-full justify-around gap-2 px-[34px]">
<div
class="relative flex h-[124px] max-w-[312px] flex-1 flex-col justify-center rounded-[10px] bg-[#F8F9FB] px-10"
>
<div class="bg-px-statistics-today_point_icon-png absolute bottom-0 right-0 h-[93px] w-[90px]" />
<div class="font-600 text-[30px]">
<n-number-animation :from="0" :to="platformPointUsage.today" :precision="1" />
</div>
<span class="mt-3">{{ t('statistic_module.today_usage') }}</span>
</div>
<div
class="relative flex h-[124px] max-w-[312px] flex-1 flex-col justify-center rounded-[10px] bg-[#F8F9FB] px-10"
>
<div class="bg-px-statistics-week_point_icon-png absolute bottom-0 right-0 h-[93px] w-[90px]" />
<div class="font-600 text-[30px]">
<n-number-animation :from="0" :to="platformPointUsage.week" :precision="1" />
</div>
<span class="mt-3">{{ t('statistic_module.current_week_usage') }}</span>
</div>
<div
class="relative flex h-[124px] max-w-[312px] flex-1 flex-col justify-center rounded-[10px] bg-[#F8F9FB] px-10"
>
<div class="bg-px-statistics-month_point_icon-png absolute bottom-0 right-0 h-[93px] w-[90px]" />
<div class="font-600 text-[30px]">
<n-number-animation :from="0" :to="platformPointUsage.month" :precision="1" />
</div>
<span class="mt-3">{{ t('statistic_module.current_month_usage') }}</span>
</div>
<div
class="relative flex h-[124px] max-w-[312px] flex-1 flex-col justify-center rounded-[10px] bg-[#F8F9FB] px-10"
>
<div class="bg-px-statistics-year_point_icon-png absolute bottom-0 right-0 h-[93px] w-[90px]" />
<div class="font-600 text-[30px]">
<n-number-animation :from="0" :to="platformPointUsage.year" :precision="1" />
</div>
<span class="mt-3">{{ t('statistic_module.current_year_usage') }}</span>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { reactive, ref, useTemplateRef, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import ContentTitle from '../../components/content-title.vue'
import { IPlatformPointTrendItem } from '../../type'
import { type EChartsOption } from '@/utils/echarts'
import CustomEchart from '@/components/custom-echart/custom-echart.vue'
import DataSelectSearch from '@/components/date-select-search/data-select-search.vue'
import { RangType } from '@/components/date-select-search/type.d'
import { ChannelText, ChannelType } from '@/enums/channel'
import { fetchGetPlatformPointTrend } from '@/apis/statistic'
interface Props {
channel: string[]
}
const { t } = useI18n()
const props = defineProps<Props>()
const pointUsageTrendRef = useTemplateRef<InstanceType<typeof CustomEchart> | null>('pointUsageTrendRef')
const currentTime = ref<RangType>(RangType.week)
const selectDateRange = ref<[string, string]>(['', ''])
const defaultEchartOption: EChartsOption = {
legend: {
top: '36px',
},
tooltip: {
trigger: 'axis',
textStyle: {
fontWeight: 'normal',
},
},
xAxis: { type: 'category' },
yAxis: { gridIndex: 0 },
grid: { top: '100px', left: '110px', right: '70px', bottom: '40px' },
color: ['#e94540', '#6ea2ff', '#ba68ff', '#ff61c1', '#2db70e', '#eda030'],
series: [
{
type: 'line',
smooth: true,
seriesLayoutBy: 'row',
emphasis: { focus: 'series' },
},
{
type: 'line',
smooth: true,
seriesLayoutBy: 'row',
emphasis: { focus: 'series' },
},
{
type: 'line',
smooth: true,
seriesLayoutBy: 'row',
emphasis: { focus: 'series' },
},
{
type: 'line',
smooth: true,
seriesLayoutBy: 'row',
emphasis: { focus: 'series' },
},
{
type: 'line',
smooth: true,
seriesLayoutBy: 'row',
emphasis: { focus: 'series' },
},
{
type: 'line',
smooth: true,
seriesLayoutBy: 'row',
emphasis: { focus: 'series' },
},
],
}
const pointUsageTrendEchartsOption = reactive<EChartsOption>({ ...defaultEchartOption })
watch(
() => props.channel,
() => {
handleGetPlatformPointTrend(currentTime.value, selectDateRange.value[0], selectDateRange.value[1])
},
)
async function handleGetPlatformPointTrend(rangType: RangType, startTime: string, endTime: string) {
if (!props.channel.length) {
return
}
currentTime.value = rangType
selectDateRange.value = [startTime, endTime]
pointUsageTrendRef.value?.echartShowLoading()
const res = await fetchGetPlatformPointTrend<IPlatformPointTrendItem[]>({
channel: props.channel,
timeRange: {
rangType,
startTime,
endTime,
},
})
if (res.code === 0) {
const dataSourceSort = handleDataSourceSort(res.data)
const dateList = [...new Set(dataSourceSort.flatMap((item) => item.pointUsages.map((usage) => usage.date)))].sort()
const dataSource: [string[], ...[string, ...number[]][]] = [['product', ...dateList]]
dataSourceSort.forEach((item) => {
const row: [string, ...number[]] = [t(ChannelText[item.channel])]
dateList.forEach((date) => {
const count = item.pointUsages.find((usage) => usage.date === date)?.count || 0
row.push(count)
})
dataSource.push(row)
})
pointUsageTrendEchartsOption.dataset = {
source: dataSource,
}
pointUsageTrendRef.value?.echartHideLoading()
}
}
function handleDataSourceSort(dataSource: IPlatformPointTrendItem[]) {
const channelSortMap = {
[ChannelType.preview]: 1,
[ChannelType.multi_preview]: 2,
[ChannelType.mall]: 3,
[ChannelType.index]: 4,
[ChannelType.link_share]: 5,
[ChannelType.api]: 6,
}
return dataSource.sort((a, b) => channelSortMap[a.channel] - channelSortMap[b.channel])
}
</script>
<template>
<div class="relative h-[455px] w-full rounded-[20px] bg-white py-5">
<div class="absolute left-0 right-0 z-10">
<div class="mx-[34px] flex items-start justify-between">
<ContentTitle :title="t('statistic_module.platform_point_trend')" />
<DataSelectSearch @update-search-list="handleGetPlatformPointTrend" />
</div>
</div>
<div class="h-full w-full">
<CustomEchart ref="pointUsageTrendRef" :option="pointUsageTrendEchartsOption" />
</div>
</div>
</template>
<script setup lang="ts">
import { computed, h, onMounted, readonly, ref } from 'vue'
import { NTag, TreeSelectOption } from 'naive-ui'
import { useI18n } from 'vue-i18n'
import PointUsagePanel from './components/point-usage-panel.vue'
import PointUsageTrend from './components/point-usage-trend.vue'
import { ChannelType } from '@/enums/channel'
import { useSystemLanguageStore } from '@/store/modules/system-language'
const { t } = useI18n()
const systemLanguageStore = useSystemLanguageStore()
const channelOptionList = [
{
label: t('analysis_module.agent_debug'),
key: 'agent_preview',
children: [
{
label: t('analysis_module.debug'),
key: ChannelType.preview,
},
{
label: t('analysis_module.multi_debug'),
key: ChannelType.multi_preview,
},
],
},
{
label: t('analysis_module.usage_channel'),
key: 'usage_channel',
children: [
{
label: t('analysis_module.index'),
key: ChannelType.index,
},
{
label: t('analysis_module.agent_square'),
key: ChannelType.mall,
},
{
label: t('analysis_module.link_share'),
key: ChannelType.link_share,
},
{
label: t('analysis_module.api'),
key: ChannelType.api,
},
],
},
]
const channelGroupList = readonly(channelOptionList.map((channelItem) => channelItem.key))
const allChannelList = handleGetAllChannelList(channelOptionList)
const selectChannelList = ref<string[]>([])
onMounted(() => {
selectChannelList.value = allChannelList
})
const isEnLanguage = computed(() => {
return systemLanguageStore.currentLanguageInfo.key === 'en'
})
function handleUpdateChannelList(channelList: string[]) {
if (channelList.length === 0) {
selectChannelList.value = allChannelList
return
}
selectChannelList.value = channelList
}
function handleRenderChannelLabel({ option }: { option: TreeSelectOption }) {
return h('span', { style: { marginRight: '24px' } }, { default: () => option.label as string })
}
function handleRenderSelectChannel({ option }: { option: TreeSelectOption }) {
if (
selectChannelList.value.length === allChannelList.length &&
selectChannelList.value.every((item) => allChannelList.includes(item))
) {
return option.key === allChannelList?.[0]
? h('span', { class: 'mb-[3px]' }, t('analysis_module.all_channels'))
: null
}
return h(NTag, { class: 'mb-[3px] px-[10px]!' }, { default: () => option.label as string })
}
function handleGetAllChannelList(options: TreeSelectOption[]) {
let channelList: string[] = []
function recurseChannelList(channels: TreeSelectOption[]) {
if (Array.isArray(channels)) {
channels.forEach((channel) => {
if (!channel.children || channel.children.length === 0) {
channelList.push(channel.key as string)
} else {
recurseChannelList(channel.children)
}
})
}
}
recurseChannelList(options)
return channelList
}
</script>
<template>
<div class="flex h-full w-full flex-col overflow-y-auto overflow-x-hidden px-6">
<div class="flex justify-end pr-[34px]">
<div class="max-w-[300px]" :class="isEnLanguage ? 'min-w-[124px]' : 'min-w-[154px]'">
<n-tree-select
v-model:value="selectChannelList"
multiple
cascade
checkable
check-strategy="child"
placement="bottom-end"
max-tag-count="responsive"
class="tree-tag"
:options="channelOptionList"
:menu-props="{ style: { marginTop: '6px', borderRadius: '5px' } }"
:consistent-menu-width="false"
:ellipsis-tag-popover-props="{ show: false }"
:default-expanded-keys="channelGroupList"
:render-label="handleRenderChannelLabel"
:render-tag="handleRenderSelectChannel"
@update:value="handleUpdateChannelList"
>
</n-tree-select>
</div>
</div>
<div class="mt-5 flex flex-1 flex-col gap-5">
<PointUsagePanel :channel="selectChannelList" />
<PointUsageTrend :channel="selectChannelList" />
</div>
</div>
</template>
<style scoped lang="scss">
@include custom-scrollbar(6px);
:deep(.tree-tag .n-base-selection) {
--n-height: 36px !important;
--n-color: #f3f5f8 !important;
--n-color-active: #f3f5f8 !important;
--n-border: 1px solid #ccc !important;
.n-base-selection-tag-wrapper .n-tag {
margin-right: 10px !important;
background: #fff !important;
border-radius: 5px !important;
--n-border: none !important;
}
.n-base-selection-tag-wrapper {
padding: 0;
}
}
</style>
<script setup lang="ts">
import { ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { useRoute, useRouter } from 'vue-router'
const { t } = useI18n()
const currentRoute = useRoute()
const router = useRouter()
const routerNameValue = ref(currentRoute.name)
const statisticModuleList = [
{
routeName: 'PointStatistic',
label: 'statistic_module.point_statistic',
},
{
routeName: 'AgentStatistic',
label: 'statistic_module.agent_statistic',
},
]
watch(
() => currentRoute.fullPath,
() => {
routerNameValue.value = currentRoute.name
},
)
function handleChangeRoute(routeName: string) {
router.replace({ name: routeName })
}
</script>
<template>
<div class="m-auto flex h-full max-w-[1669px] flex-col pb-2 pt-1">
<div class="flex flex-col px-6">
<div class="mb-5 flex items-center">
<img src="@/assets/images/statistics/statistics-icon.png" />
<p class="ml-[5px] text-lg">{{ t('statistic_module.data_statistic') }}</p>
</div>
<ul class="mb-5 flex">
<li
v-for="statisticModuleItem in statisticModuleList"
:key="statisticModuleItem.routeName"
class="rounded-theme hover:bg-theme-color ml-2.5 h-8 cursor-pointer select-none px-[14px] leading-8 transition-colors duration-300 first:ml-0 hover:text-white"
:class="[
routerNameValue === statisticModuleItem.routeName
? 'bg-theme-color text-white'
: 'text-gray-font-color border-transparent',
]"
@click="handleChangeRoute(statisticModuleItem.routeName)"
>
{{ t(statisticModuleItem.label) }}
</li>
</ul>
</div>
<div class="h-full overflow-hidden">
<RouterView v-slot="{ Component }">
<Transition appear name="fade-slide" mode="out-in">
<Component :is="Component" />
</Transition>
</RouterView>
</div>
</div>
</template>
<style lang="scss" scoped>
.fade-slide-leave-active,
.fade-slide-enter-active {
transition: all 0.3s;
}
.fade-slide-enter-from {
opacity: 0;
transform: translateX(-30px);
}
.fade-slide-leave-to {
opacity: 0;
transform: translateX(30px);
}
</style>
import { ChannelType } from '@/enums/channel'
export interface IPlatformPointUsage {
today: number
week: number
month: number
year: number
}
export interface IPlatformPointTrendItem {
channel: ChannelType
pointUsages: {
date: string
count: number
}[]
}
export interface IPlatformAgentUsage {
createCount: number
usageCount: number
unPublishCount: number
publishCount: number
}
export interface IPlatformAgentUsageDetailItem {
agentTitle: string
owner: string
publishStatus: 'Y' | 'N'
totalPoint: number
usageCount: number
lastUsageTime: Date
}
...@@ -3,9 +3,11 @@ declare interface Window { ...@@ -3,9 +3,11 @@ declare interface Window {
$loadingBar: import('naive-ui').LoadingBarProviderInst $loadingBar: import('naive-ui').LoadingBarProviderInst
$dialog: import('naive-ui').DialogProviderInst $dialog: import('naive-ui').DialogProviderInst
$message: import('naive-ui').MessageProviderInst & { $message: import('naive-ui').MessageProviderInst & {
ctWarning: (message: string, title?: string) => Promise<boolean | Error> ctWarning: (message: string, title?: string, cancelText?: string, confirmText?: string) => Promise<boolean | Error>
} }
$notification: import('naive-ui').NotificationProviderInst $notification: import('naive-ui').NotificationProviderInst
google: any
} }
declare namespace JSX { declare namespace JSX {
......
...@@ -112,6 +112,7 @@ declare namespace I18n { ...@@ -112,6 +112,7 @@ declare namespace I18n {
forever_effective: string forever_effective: string
year: string year: string
month: string month: string
today: string
alipay: string alipay: string
wechat: string wechat: string
analysis: string analysis: string
...@@ -125,6 +126,14 @@ declare namespace I18n { ...@@ -125,6 +126,14 @@ declare namespace I18n {
support: string support: string
buy_now: string buy_now: string
payment_success: string payment_success: string
back: string
time: string
export_data: string
not_generated: string
export_successfully: string
export_failed: string
copy_link: string
or: string
dialogue_module: { dialogue_module: {
continue_question_message: string continue_question_message: string
...@@ -182,6 +191,7 @@ declare namespace I18n { ...@@ -182,6 +191,7 @@ declare namespace I18n {
application_square: string application_square: string
personal_settings: string personal_settings: string
order_manage: string order_manage: string
data_statistic: string
} }
login_module: { login_module: {
...@@ -376,6 +386,13 @@ declare namespace I18n { ...@@ -376,6 +386,13 @@ declare namespace I18n {
removal_prompt_title: string removal_prompt_title: string
removal_prompt_content: string removal_prompt_content: string
successfully_configured_published: string successfully_configured_published: string
api_call: string
api_call_desc: string
interface_document: string
click_to_generate: string
agentId: string
api_call_details: string
api_call_datetime: string
} }
} }
...@@ -420,6 +437,8 @@ declare namespace I18n { ...@@ -420,6 +437,8 @@ declare namespace I18n {
upload_knowledge_document_btn_text: string upload_knowledge_document_btn_text: string
batch_delete_knowledge_document_btn_text: string batch_delete_knowledge_document_btn_text: string
not_find_knowledge_document_message: string not_find_knowledge_document_message: string
not_all_files_train_complete_tip: string
cannot_add_tip_when_file_is_training: string
create_knowledge_modal_title: string create_knowledge_modal_title: string
edit_knowledge_modal_title: string edit_knowledge_modal_title: string
...@@ -571,6 +590,8 @@ declare namespace I18n { ...@@ -571,6 +590,8 @@ declare namespace I18n {
point_recharge: string point_recharge: string
get_points_for_interacting_with_the_ai: string get_points_for_interacting_with_the_ai: string
no_time_limit_when_used_up: string no_time_limit_when_used_up: string
agents_created_exceeds_tip: string
documents_uploaded_exceeds_tip: string
} }
order_manage_module: { order_manage_module: {
...@@ -609,5 +630,27 @@ declare namespace I18n { ...@@ -609,5 +630,27 @@ declare namespace I18n {
api: string api: string
link_share: string link_share: string
} }
statistic_module: {
data_statistic: string
point_statistic: string
agent_statistic: string
platform_point_usage: string
platform_point_trend: string
today_usage: string
current_week_usage: string
current_month_usage: string
current_year_usage: string
create_agent_count: string
usage_agent_count: string
unpublish_agent_count: string
published_agent_count: string
platform_agent_usage_detail: string
agent_title: string
agent_status: string
owner: string
usage_count: string
last_usage_time: string
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment