diff --git a/frontend/src/views/login-sjtb/index.vue b/frontend/src/views/login-sjtb/index.vue index b4b3235..fb41c60 100644 --- a/frontend/src/views/login-sjtb/index.vue +++ b/frontend/src/views/login-sjtb/index.vue @@ -187,7 +187,7 @@ import loginImg from "@/assets/images/logo.png"; import { UserOutlined, LockOutlined, MobileOutlined } from "@ant-design/icons-vue"; import { getCaptcha, sendSmsCode, smsLoginApi, resetPassword } from "@/api/auth"; import { message } from "ant-design-vue"; -import { setPath } from "@/utils/auth"; +import { setPath, setToken } from "@/utils/auth"; // 组件依赖 import router from "@/router"; @@ -200,6 +200,7 @@ import { encrypt, decrypt } from "@/utils/rsaEncrypt"; // 状态管理依赖 import { useUserStore } from "@/store/modules/user"; +import { usePermissionStoreHook } from "@/store/modules/permission"; // 国际化 import { useI18n } from "vue-i18n"; @@ -385,42 +386,88 @@ function onFinish() { * 短信验证码登录 */ const onSmsLogin = async () => { - // 对短信登录表单进行验证 try { - // 验证手机号格式 + // ========== 第一部分:表单验证 ========== const phoneRegex = /^1[3-9]\d{9}$/; if (!loginData.value.username || !phoneRegex.test(loginData.value.username)) { message.error("请输入正确的手机号"); return; } - // 验证验证码 if (!loginData.value.code || loginData.value.code.trim() === '') { message.error("请输入验证码"); return; } - // console.log() - // debugger + + // ========== 第二部分:设置加载状态 ========== state.loading = true; - // 调用短信登录接口 - await smsLoginApi( + // ========== 第三部分:调用短信登录 API ========== + console.log('开始调用短信登录API, 手机号:', loginData.value.username); + const res: any = await smsLoginApi( loginData.value.username, // 手机号 - loginData.value.code // 验证码 + loginData.value.code // 短信验证码 ); + console.log('短信登录API响应:', res); - // 登录成功处理 - const res: any = setPath("/login-sjtb"); - if (res.code == 0) { - message.success("登录成功"); - - // 跳转到首页 - router.push({ path: "/" }); + // ========== 第四部分:检查响应结果 ========== + console.log('检查响应结果, res.code:', res.code, '类型:', typeof res.code); + + // 注意:code 可能是字符串 "0" 或数字 0,需要兼容处理 + if (res.code !== 0 && res.code !== '0') { + console.error('短信登录失败, 错误码:', res.code, '错误信息:', res.msg); + message.error(res.msg || "登录失败"); + return; } + + // ========== 第五部分:提取并存储 Token ========== + console.log('开始提取Token, res.data:', res.data); + const token = res.data?.token || res.data; // 兼容两种结构 + + if (!token) { + console.error('Token为空, res.data结构:', JSON.stringify(res.data)); + message.error("登录失败:未获取到Token"); + return; + } + + console.log('Token获取成功:', token); + // 存储到 Cookie + setToken(token); + + // 更新 Store 状态(注意是大写 Token) + userStore.Token = token; + console.log('Token已存储到Store'); + + // ========== 第六部分:获取用户信息和角色 ========== + console.log('开始获取用户信息...'); + const userInfo = await userStore.getInfo(); + console.log('用户信息获取成功:', userInfo); + const roles = userInfo.roles; + console.log('用户角色:', roles); + + // ========== 第七部分:生成路由(获取菜单)========== + console.log('开始生成路由...'); + const permissionStore = usePermissionStoreHook(); + const accessRoutes:any = await permissionStore.generateRoutes(roles); + console.log('路由生成成功, 路由数量:', accessRoutes.length); + + // ========== 第八部分:动态添加路由 ========== + accessRoutes.forEach((route: any) => { + router.addRoute(route); + }); + + // ========== 第九部分:设置路径并跳转 ========== + setPath("/login-sjtb"); + router.push({ path: accessRoutes[0].children[0].opturl }); + message.success("登录成功"); + } catch (error: any) { - // console.error("短信登录失败", error); - // message.error(error.message || "登录失败,请重试"); + // ========== 第十部分:错误处理 ========== + console.error("短信登录失败", error); + message.error(error.message || "登录失败,请重试"); + } finally { + // ========== 第十一部分:关闭加载状态 ========== state.loading = false; } };