diff --git a/gpt-vue/pnpm-lock.yaml b/gpt-vue/pnpm-lock.yaml index 3cca3413..d1395123 100644 --- a/gpt-vue/pnpm-lock.yaml +++ b/gpt-vue/pnpm-lock.yaml @@ -65,6 +65,9 @@ importers: '@gpt-vue/packages': specifier: workspace:^1.0.0 version: link:../../packages + echarts: + specifier: ^5.5.0 + version: 5.5.0 md-editor-v3: specifier: ^2.2.1 version: 2.11.3(vue@3.4.21) @@ -93,6 +96,9 @@ importers: '@vitejs/plugin-vue-jsx': specifier: ^3.1.0 version: 3.1.0(vite@5.1.5)(vue@3.4.21) + '@vue/eslint-config-prettier': + specifier: ^7.0.0 + version: 7.1.0(eslint@8.57.0)(prettier@3.2.5) '@vue/eslint-config-typescript': specifier: ^12.0.0 version: 12.0.0(eslint-plugin-vue@9.22.0)(eslint@8.57.0)(typescript@5.3.3) @@ -1283,6 +1289,18 @@ packages: resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} dev: false + /@vue/eslint-config-prettier@7.1.0(eslint@8.57.0)(prettier@3.2.5): + resolution: {integrity: sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==} + peerDependencies: + eslint: '>= 7.28.0' + prettier: '>= 2.0.0' + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 8.10.0(eslint@8.57.0) + eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@3.2.5) + prettier: 3.2.5 + dev: true + /@vue/eslint-config-typescript@12.0.0(eslint-plugin-vue@9.22.0)(eslint@8.57.0)(typescript@5.3.3): resolution: {integrity: sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==} engines: {node: ^14.17.0 || >=16.0.0} @@ -1637,6 +1655,13 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true + /echarts@5.5.0: + resolution: {integrity: sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==} + dependencies: + tslib: 2.3.0 + zrender: 5.5.0 + dev: false + /electron-to-chromium@1.4.692: resolution: {integrity: sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA==} dev: true @@ -1708,6 +1733,15 @@ packages: engines: {node: '>=10'} dev: true + /eslint-config-prettier@8.10.0(eslint@8.57.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + dev: true + /eslint-config-prettier@9.1.0(eslint@8.57.0): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true @@ -1717,6 +1751,23 @@ packages: eslint: 8.57.0 dev: true + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@3.2.5): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 8.10.0(eslint@8.57.0) + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + dev: true + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2797,6 +2848,10 @@ packages: typescript: 5.3.3 dev: true + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + dev: false + /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true @@ -3008,3 +3063,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /zrender@5.5.0: + resolution: {integrity: sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==} + dependencies: + tslib: 2.3.0 + dev: false diff --git a/gpt-vue/projects/vue-admin/package.json b/gpt-vue/projects/vue-admin/package.json index 707518d2..aafca4cc 100644 --- a/gpt-vue/projects/vue-admin/package.json +++ b/gpt-vue/projects/vue-admin/package.json @@ -14,6 +14,7 @@ "dependencies": { "@arco-design/web-vue": "^2.54.6", "@gpt-vue/packages": "workspace:^1.0.0", + "echarts": "^5.5.0", "md-editor-v3": "^2.2.1", "pinia": "^2.1.7", "vue": "^3.4.15", diff --git a/gpt-vue/projects/vue-admin/src/components/CustomLayout.vue b/gpt-vue/projects/vue-admin/src/components/CustomLayout.vue index 73dd6a24..28485467 100644 --- a/gpt-vue/projects/vue-admin/src/components/CustomLayout.vue +++ b/gpt-vue/projects/vue-admin/src/components/CustomLayout.vue @@ -1,13 +1,17 @@ @@ -19,18 +23,33 @@ const authStore = useAuthStore(); - + + + - 更改密码 + + + + + + ChatPlus-AI 创作系统 + + + + + + + 打赏作者 + - + 退出 @@ -49,6 +68,20 @@ const authStore = useAuthStore(); + + + 如果你觉得这个项目对你有帮助,并且情况允许的话,可以请作者喝杯咖啡,非常感谢你的支持~ + + + + + diff --git a/gpt-vue/projects/vue-admin/src/composables/useState.ts b/gpt-vue/projects/vue-admin/src/composables/useState.ts new file mode 100644 index 00000000..969637e7 --- /dev/null +++ b/gpt-vue/projects/vue-admin/src/composables/useState.ts @@ -0,0 +1,10 @@ +import { ref, type Ref } from "vue"; +function useState(defaultValue?: T): [Ref, (newValue: T) => void] { + const state = ref(defaultValue) as Ref; + const setState = (newValue: T) => { + state.value = newValue; + }; + return [state, setState]; +} + +export default useState; diff --git a/gpt-vue/projects/vue-admin/src/composables/useSubmit.ts b/gpt-vue/projects/vue-admin/src/composables/useSubmit.ts index 64e8db0d..11665cf7 100644 --- a/gpt-vue/projects/vue-admin/src/composables/useSubmit.ts +++ b/gpt-vue/projects/vue-admin/src/composables/useSubmit.ts @@ -12,7 +12,7 @@ function useSubmit = Record, R = any> const hasError = await formRef.value?.validate(); if (!hasError) { const { data, message } = await api({ ...formData ?? {}, ...unref(params) }); - Message.success(message); + message && Message.success(message); return Promise.resolve({ formData, data }); } return Promise.reject(false); diff --git a/gpt-vue/projects/vue-admin/src/http/config.ts b/gpt-vue/projects/vue-admin/src/http/config.ts index 1e07e4eb..1d024a94 100644 --- a/gpt-vue/projects/vue-admin/src/http/config.ts +++ b/gpt-vue/projects/vue-admin/src/http/config.ts @@ -3,7 +3,7 @@ import { Notification } from "@arco-design/web-vue"; import createInstance from "@gpt-vue/packages/request" import type { BaseResponse } from "@gpt-vue/packages/type"; -export const uploadUrl = import.meta.env.VITE_PROXY_BASE_URL + "/api/upload"; +export const uploadUrl = import.meta.env.VITE_PROXY_BASE_URL + "/api/admin/upload"; export const instance = createInstance() diff --git a/gpt-vue/projects/vue-admin/src/http/login.ts b/gpt-vue/projects/vue-admin/src/http/login.ts index 71e2e1bc..8e159b65 100644 --- a/gpt-vue/projects/vue-admin/src/http/login.ts +++ b/gpt-vue/projects/vue-admin/src/http/login.ts @@ -32,4 +32,11 @@ export const loginLog = (params?: Record) => { method: "get", params }) -} \ No newline at end of file +} + +export const captcha = () => { + return http({ + url: "/api/admin/login/captcha", + method: "get", + }); +}; diff --git a/gpt-vue/projects/vue-admin/src/views/ApiKey/ApiKeyContainer.vue b/gpt-vue/projects/vue-admin/src/views/ApiKey/ApiKeyContainer.vue index f3e04486..e9710a85 100644 --- a/gpt-vue/projects/vue-admin/src/views/ApiKey/ApiKeyContainer.vue +++ b/gpt-vue/projects/vue-admin/src/views/ApiKey/ApiKeyContainer.vue @@ -19,6 +19,7 @@ const columns = [ { title: "key", dataIndex: "value", + slotName: "value", }, { title: "用途", @@ -96,7 +97,14 @@ const handleStatusChange = ({ filed, value, record, reload }) => { - 新增 + 新增 + + + + + {{ record[column.dataIndex] }} + { - 新增 + 新增 import { ref, h } from "vue"; import { Message, Modal } from "@arco-design/web-vue"; +import { dateFormat } from "@gpt-vue/packages/utils"; import SearchTable from "@/components/SearchTable/SearchTable.vue"; import type { SearchTableColumns } from "@/components/SearchTable/type"; import app from "@/main"; @@ -51,6 +52,7 @@ const columns: SearchTableColumns[] = [ search: { valueType: "range", }, + render: ({ record }) => dateFormat(record.created_at), }, { title: "操作", diff --git a/gpt-vue/projects/vue-admin/src/views/DashboardView.vue b/gpt-vue/projects/vue-admin/src/views/DashboardView.vue index bd87dad0..aeb71243 100644 --- a/gpt-vue/projects/vue-admin/src/views/DashboardView.vue +++ b/gpt-vue/projects/vue-admin/src/views/DashboardView.vue @@ -1,13 +1,11 @@ - + @@ -40,6 +95,27 @@ getData(); + + + + + {{ key }} + + + + diff --git a/gpt-vue/projects/vue-admin/src/views/Functions/FunctionsContainer.vue b/gpt-vue/projects/vue-admin/src/views/Functions/FunctionsContainer.vue index 94e12a54..8945f787 100644 --- a/gpt-vue/projects/vue-admin/src/views/Functions/FunctionsContainer.vue +++ b/gpt-vue/projects/vue-admin/src/views/Functions/FunctionsContainer.vue @@ -57,7 +57,7 @@ const handleRemove = async (id, reload) => { - + 新增 diff --git a/gpt-vue/projects/vue-admin/src/views/LoginView.vue b/gpt-vue/projects/vue-admin/src/views/LoginView.vue index 4bb71a19..94b77c96 100644 --- a/gpt-vue/projects/vue-admin/src/views/LoginView.vue +++ b/gpt-vue/projects/vue-admin/src/views/LoginView.vue @@ -1,24 +1,82 @@ @@ -33,44 +91,54 @@ async function handleSubmit({ errors, values }: any) { ChatGPT Plus Admin - - + + - + + + + + + + + + + + 记住密码 - - + 登录 diff --git a/gpt-vue/projects/vue-admin/src/views/Order/OrderContainer.vue b/gpt-vue/projects/vue-admin/src/views/Order/OrderContainer.vue index 6112fb2e..8e03c052 100644 --- a/gpt-vue/projects/vue-admin/src/views/Order/OrderContainer.vue +++ b/gpt-vue/projects/vue-admin/src/views/Order/OrderContainer.vue @@ -1,6 +1,7 @@ + + 未支付 + {{ dateFormat(record.pay_time) }} + 删除 diff --git a/gpt-vue/projects/vue-admin/src/views/Product/ProductContainer.vue b/gpt-vue/projects/vue-admin/src/views/Product/ProductContainer.vue index 53168a2e..190a4961 100644 --- a/gpt-vue/projects/vue-admin/src/views/Product/ProductContainer.vue +++ b/gpt-vue/projects/vue-admin/src/views/Product/ProductContainer.vue @@ -102,7 +102,9 @@ const handleStatusChange = ({ value, record, reload }) => { - 新增 + 新增 + { - 新增 + 新增 { - 提交 + 保存 diff --git a/gpt-vue/projects/vue-admin/src/views/System/SystemChatConfig.vue b/gpt-vue/projects/vue-admin/src/views/System/SystemChatConfig.vue index ff1bab52..e8d3dcc4 100644 --- a/gpt-vue/projects/vue-admin/src/views/System/SystemChatConfig.vue +++ b/gpt-vue/projects/vue-admin/src/views/System/SystemChatConfig.vue @@ -141,7 +141,7 @@ onMounted(reload); /> - 提交 + 保存 diff --git a/gpt-vue/projects/vue-admin/src/views/System/SystemNoticeConfig.vue b/gpt-vue/projects/vue-admin/src/views/System/SystemNoticeConfig.vue index 04e216e7..4ca8b600 100644 --- a/gpt-vue/projects/vue-admin/src/views/System/SystemNoticeConfig.vue +++ b/gpt-vue/projects/vue-admin/src/views/System/SystemNoticeConfig.vue @@ -61,7 +61,7 @@ onMounted(reload); - 提交 + 保存 diff --git a/gpt-vue/projects/vue-admin/src/views/System/SystemUploader.vue b/gpt-vue/projects/vue-admin/src/views/System/SystemUploader.vue index 742d2db8..2d09cae5 100644 --- a/gpt-vue/projects/vue-admin/src/views/System/SystemUploader.vue +++ b/gpt-vue/projects/vue-admin/src/views/System/SystemUploader.vue @@ -1,5 +1,6 @@ - - - - - - - - - - - - + + + + + + + + + + diff --git a/gpt-vue/projects/vue-admin/src/views/User/UserContainer.vue b/gpt-vue/projects/vue-admin/src/views/User/UserContainer.vue index 697de629..cf8ef9f4 100644 --- a/gpt-vue/projects/vue-admin/src/views/User/UserContainer.vue +++ b/gpt-vue/projects/vue-admin/src/views/User/UserContainer.vue @@ -80,9 +80,9 @@ const handleDelete = async ({ id }: { id: string }, reload) => { 重置密码 - 新增用户 + + 新增 +
+ +