From 63fb522484494aec0055411df0b0099814539c14 Mon Sep 17 00:00:00 2001 From: 13121765685 Date: Sun, 21 Dec 2025 20:33:54 +0800 Subject: [PATCH] 222 --- .trae/documents/plan_20251219_101004.md | 27 +++++ apps/frontend/src/App.vue | 3 + apps/frontend/src/router/index.js | 16 ++- apps/frontend/src/stores/auth.js | 28 ++++- apps/frontend/src/views/Login/Login.vue | 1 - .../src/views/Project/CreateProject.vue | 2 +- apps/frontend/src/views/Waitlist.vue | 110 +++++++++++++++++- apps/frontend/src/views/user/index.js | 37 ++++++ packages/utils/src/api/frontend/user.js | 2 + 9 files changed, 217 insertions(+), 9 deletions(-) create mode 100644 .trae/documents/plan_20251219_101004.md diff --git a/.trae/documents/plan_20251219_101004.md b/.trae/documents/plan_20251219_101004.md new file mode 100644 index 0000000..cbac95a --- /dev/null +++ b/.trae/documents/plan_20251219_101004.md @@ -0,0 +1,27 @@ +# 实现邀请码升级功能 + +## 1. 修改 Waitlist.vue 组件 +- 在现有界面中添加邀请码输入框和提交按钮 +- 设计输入框样式与现有界面风格保持一致 +- 添加表单验证逻辑 + +## 2. 引入必要的模块和方法 +- 引入 user 模块的 upgrade 方法 +- 引入 auth store 的 updateUserInfo 方法 +- 引入 ElMessage 用于显示操作结果 + +## 3. 实现提交逻辑 +1. 用户输入邀请码并点击提交按钮 +2. 调用 `/views/user/index.js` 中的 `upgrade` 方法 +3. 成功后调用 `/stores/auth.js` 中的 `updateUserInfo` 方法刷新用户信息 +4. 刷新成功后返回首页 + +## 4. 添加错误处理 +- 邀请码验证失败时显示错误信息 +- 网络请求失败时显示错误提示 +- 确保用户体验流畅 + +## 5. 界面优化 +- 输入框添加合适的占位符 +- 按钮状态管理(加载中、禁用等) +- 保持响应式设计,适配不同屏幕尺寸 \ No newline at end of file diff --git a/apps/frontend/src/App.vue b/apps/frontend/src/App.vue index d69d49a..9f4789e 100644 --- a/apps/frontend/src/App.vue +++ b/apps/frontend/src/App.vue @@ -4,6 +4,9 @@ import { useRouter, useRoute } from 'vue-router' import MainLayout from '@/components/layout/MainLayout.vue' import AppHeader from '@/components/layout/AppHeader.vue' import AppSidebar from '@/components/layout/AppSidebar.vue' +import { useAuthStore } from '@/stores/auth'; +const authStore = useAuthStore(); +authStore.updateUserInfo() const route = useRoute() // 判断当前是否为登录页面 const isLoginPage = computed(() => route.path === '/login') diff --git a/apps/frontend/src/router/index.js b/apps/frontend/src/router/index.js index 2fe01e0..d6585aa 100644 --- a/apps/frontend/src/router/index.js +++ b/apps/frontend/src/router/index.js @@ -173,6 +173,14 @@ router.beforeEach(async (to, from, next) => { // window.localStorage.setItem('token','123') // return next() // } + if(to.path=='/login'||to.path=='/login/phone'||to.path=='/register'||to.path=='/forgot-password'){ + const token = localStorage.getItem('token') + // 如果有 token,跳转到首页 + if (token) { + next('/czhome') + return + } + } const newto = freeRoutes.find(route => route.path == to.path) if (newto?.meta?.requiresAuth) { const token = localStorage.getItem('token') @@ -184,8 +192,10 @@ router.beforeEach(async (to, from, next) => { } // 检查是否需要添加动态路由 const authStore = useAuthStore(); - const user_role = authStore.user?.user_role; - if(user_role != '0' && router.getRoutes().length == routes.length) { + // const info = await authStore.updateUserInfo(); + // console.log(info,'infoinfo'); + const user_role = authStore.user?.userRole; + if((user_role == 1||user_role == 2) && router.getRoutes().length == routes.length) { // 添加动态路由 addDynamicRoutes(); if(isDynamicRoute(to.path)) { @@ -195,7 +205,7 @@ router.beforeEach(async (to, from, next) => { }, 20); return } - }else if(user_role == '0'){ + }else if(user_role == 0){ // 恢复默认路由 removeDynamicRoutes() router.addRoute( diff --git a/apps/frontend/src/stores/auth.js b/apps/frontend/src/stores/auth.js index 7c69f98..7082bea 100644 --- a/apps/frontend/src/stores/auth.js +++ b/apps/frontend/src/stores/auth.js @@ -57,9 +57,11 @@ export const useAuthStore = defineStore('auth', () => { //登录成功方法 const loginSuccess = (data,callback=null) => { token.value = data.accessToken - user.value = data + // user.value = data localStorage.setItem('token', token.value); - callback&&callback(data); + updateUserInfo().then(res => { + callback&&callback(data); + }) } // 登出方法 const logout = async (callback) => { @@ -79,8 +81,28 @@ export const useAuthStore = defineStore('auth', () => { window?.Redirectlogin() } } - + //更新用户信息方法 + const updateUserInfo = async (data) => { + if(!token.value){ + return + } + return new Promise(async (resolve, reject) => { + try { + const res = await requestUtils.common(clientApi.default.USER_INFO, data) + if(res.code === 0){ + let data = res.data; + // 更新成功,保存用户信息 + user.value = data + resolve(res) + } + } catch (error) { + console.error('更新用户信息失败:', error) + reject(error) + } + }) + } return { + updateUserInfo, user, token, login, diff --git a/apps/frontend/src/views/Login/Login.vue b/apps/frontend/src/views/Login/Login.vue index 8d9ded1..4285db5 100644 --- a/apps/frontend/src/views/Login/Login.vue +++ b/apps/frontend/src/views/Login/Login.vue @@ -138,7 +138,6 @@ const goToRegister = () => { const goToPhoneLogin = () => { router.push('/login/phone') } - // 页面挂载时初始化认证状态 onMounted(() => { }) diff --git a/apps/frontend/src/views/Project/CreateProject.vue b/apps/frontend/src/views/Project/CreateProject.vue index bbacbfc..4058d55 100644 --- a/apps/frontend/src/views/Project/CreateProject.vue +++ b/apps/frontend/src/views/Project/CreateProject.vue @@ -480,7 +480,7 @@ const handleCreatePromptCard = (index,params) => { status:'loading', imgyt:imgyt||'', type:'image', - inspirationImage:cardData.inspirationImage||'', + // inspirationImage:cardData.inspirationImage||'', },index); console.log(newCard,'newCardnewCard'); // 添加到卡片数组 diff --git a/apps/frontend/src/views/Waitlist.vue b/apps/frontend/src/views/Waitlist.vue index c56ece7..821cfca 100644 --- a/apps/frontend/src/views/Waitlist.vue +++ b/apps/frontend/src/views/Waitlist.vue @@ -9,6 +9,24 @@
{{ t('waitlist.title') }}
{{ t('waitlist.description') }}
+ + +
+ + +
+