# 登录显示成功但无法进入系统问题修复 ## 问题描述 用户登录后显示"登录成功",但页面一直停留在登录页面或显示空白,无法进入系统。 ## 问题原因分析 ### 原因 1:`getBobbiesList` 初始值为空字符串 **代码位置**:`xuniYou/pages/index/index.vue` 第 932 行 ```javascript getBobbiesList: '', // ❌ 初始值为空字符串 ``` **问题**: - 页面使用 `v-show="getBobbiesList.reg_step == 1 || getBobbiesList.reg_step == 2 || getBobbiesList.reg_step == 3"` 来判断显示哪个界面 - 当 `getBobbiesList` 为空字符串时,`getBobbiesList.reg_step` 为 `undefined` - 导致所有 `v-show` 条件都不满足,页面显示空白 ### 原因 2:`getUserBasic()` 调用时机问题 **代码位置**:`xuniYou/pages/index/index.vue` 第 960-969 行 ```javascript onShow() { this.checkUnderAgeStatus(); if (uni.getStorageSync('token')) { this.getUserBasic() this.loverBasic() this.loadHomeLooks() } } ``` **问题**: - 只有在 `onShow()` 时才调用 `getUserBasic()` - 如果从登录页跳转过来,可能还没来得及执行 `onShow()` - 或者 token 还没有正确保存到 storage ### 原因 3:API 请求失败 可能的原因: - PHP 后端服务未启动(端口 30100) - Token 无效或过期 - 网络请求失败 - CORS 跨域问题 --- ## 解决方案 ### 方案 1:修改 `getBobbiesList` 初始值(推荐) 将初始值从空字符串改为对象,并设置默认的 `reg_step`: ```javascript // 修改前 getBobbiesList: '', // 修改后 getBobbiesList: { reg_step: 1 // 默认显示第一步:完善个人资料 }, ``` ### 方案 2:添加加载状态 添加一个加载状态,在数据加载完成前显示加载提示: ```javascript data() { return { isLoading: true, // 添加加载状态 getBobbiesList: { reg_step: 1 }, // ... } } ``` 在模板中添加加载提示: ```vue 加载中... ``` 在 `getUserBasic()` 成功后设置: ```javascript getUserBasic() { GetUserBasic({}).then(res => { if (res.code == 1) { let data = res.data // ... this.getBobbiesList = data this.isLoading = false // 加载完成 } }).catch(() => { this.isLoading = false // 加载失败也要隐藏加载状态 uni.showToast({ title: '加载失败,请重试', icon: 'none' }) }) } ``` ### 方案 3:在 `onLoad` 时也调用 `getUserBasic()` ```javascript onLoad(options) { //#ifdef MP-WEIXIN this.checkPermission() //#endif // 如果有 tab 参数,切换到对应的 tab if (options && options.tab) { const tabIndex = parseInt(options.tab); if (!isNaN(tabIndex) && tabIndex >= 0 && tabIndex < this.tabs.length) { this.currentTab = tabIndex; } } // 添加:在 onLoad 时也检查并加载用户数据 if (uni.getStorageSync('token')) { this.getUserBasic() this.loverBasic() this.loadHomeLooks() } }, onReady() { this.getServerData(); }, ``` --- ## 快速修复步骤 ### 第 1 步:检查后端服务是否运行 ```bash # Windows - 检查 PHP 服务 netstat -ano | findstr :30100 # 如果没有运行,启动 PHP 服务 cd xunifriend_RaeeC/public php -S 0.0.0.0:30100 ``` ### 第 2 步:检查浏览器控制台 1. 打开浏览器开发者工具(F12) 2. 切换到 Console 标签 3. 查看是否有错误信息 4. 切换到 Network 标签 5. 查看 API 请求是否成功 **关键检查点**: - `/api/user_basic/get_user_basic` 请求是否返回 200 - 响应数据中是否包含 `reg_step` 字段 - Token 是否正确传递 ### 第 3 步:检查 Token 在浏览器控制台执行: ```javascript // 检查 token 是否存在 console.log('Token:', uni.getStorageSync('token')) // 检查用户信息 console.log('UserInfo:', uni.getStorageSync('userinfo')) // 手动调用 getUserBasic // 在 index 页面的控制台执行 this.getUserBasic() ``` ### 第 4 步:修改代码(推荐方案 1) 修改 `xuniYou/pages/index/index.vue` 第 932 行: ```javascript // 修改前 getBobbiesList: '', // 修改后 getBobbiesList: { reg_step: 1, level: 0, intimacy: 0, next_level_intimacy: 100 }, ``` ### 第 5 步:重新编译前端 ```bash # 在 xuniYou 目录下 npm run dev:h5 # 或 npm run build:h5 ``` --- ## 调试方法 ### 方法 1:添加调试日志 在 `getUserBasic()` 方法中添加日志: ```javascript getUserBasic() { console.log('开始获取用户信息...') console.log('Token:', uni.getStorageSync('token')) GetUserBasic({}).then(res => { console.log('getUserBasic 响应:', res) if (res.code == 1) { let data = res.data console.log('用户数据:', data) console.log('reg_step:', data.reg_step) // ... this.getBobbiesList = data console.log('getBobbiesList 已更新:', this.getBobbiesList) } else { console.error('getUserBasic 失败:', res.msg) } }).catch(err => { console.error('getUserBasic 异常:', err) }) } ``` ### 方法 2:检查 API 响应 使用 curl 或 Postman 测试 API: ```bash # 替换 YOUR_TOKEN 为实际的 token curl -X GET "http://localhost:30100/api/user_basic/get_user_basic" \ -H "token: YOUR_TOKEN" ``` **预期响应**: ```json { "code": 1, "msg": "成功", "data": { "id": 1, "username": "18800000001", "nickname": "用户昵称", "avatar": "头像URL", "reg_step": 4, "level": 1, "intimacy": 50, "next_level_intimacy": 100, // ... } } ``` ### 方法 3:临时绕过检查 如果需要紧急修复,可以临时修改 `v-show` 条件: ```vue ``` --- ## 常见错误和解决方法 ### 错误 1:Cannot read property 'reg_step' of '' **原因**:`getBobbiesList` 为空字符串 **解决**:使用方案 1,将初始值改为对象 ### 错误 2:Network Error **原因**:后端服务未启动或网络问题 **解决**: 1. 检查 PHP 服务是否运行 2. 检查端口是否正确(30100) 3. 检查防火墙设置 ### 错误 3:401 Unauthorized **原因**:Token 无效或过期 **解决**: 1. 清除本地存储,重新登录 2. 检查 token 是否正确保存 3. 检查后端 token 验证逻辑 ### 错误 4:页面显示空白 **原因**:所有 `v-show` 条件都不满足 **解决**: 1. 检查 `getBobbiesList.reg_step` 的值 2. 添加默认显示逻辑 3. 使用方案 2 添加加载状态 --- ## 完整修复代码 ### 修改 `xuniYou/pages/index/index.vue` ```javascript data() { return { // ... 其他数据 // 修改这里:添加默认值 getBobbiesList: { reg_step: 1, // 默认第一步 level: 0, intimacy: 0, next_level_intimacy: 100 }, loverBasicList: null, // 改为 null 而不是空字符串 // 添加加载状态 isLoading: true, // ... 其他数据 } }, onLoad(options) { //#ifdef MP-WEIXIN this.checkPermission() //#endif console.log('uni.env.', uni.env) // 如果有 tab 参数,切换到对应的 tab if (options && options.tab) { const tabIndex = parseInt(options.tab); if (!isNaN(tabIndex) && tabIndex >= 0 && tabIndex < this.tabs.length) { this.currentTab = tabIndex; } } // 添加:在 onLoad 时也加载用户数据 const token = uni.getStorageSync('token') console.log('onLoad - Token:', token) if (token) { this.getUserBasic() this.loverBasic() this.loadHomeLooks() } else { // 没有 token,显示默认状态 this.isLoading = false } }, getUserBasic() { console.log('开始获取用户信息...') GetUserBasic({}).then(res => { console.log('getUserBasic 响应:', res) if (res.code == 1) { let data = res.data const conversationStore = useConversationStore(); let listener = { nickname: data.username, headImage: data.avatar, openid: data.wxapp_openid, } conversationStore.setUserInfo(listener); this.getBobbiesList = data this.isLoading = false // 加载完成 console.log('用户数据已更新:', this.getBobbiesList) this.getServerData(); } else { this.isLoading = false uni.showToast({ title: res.msg, icon: 'none', position: 'top' }) } }).catch(err => { console.error('getUserBasic 异常:', err) this.isLoading = false uni.showToast({ title: '加载失败,请重试', icon: 'none' }) }) }, ``` ### 在模板中添加加载状态 ```vue ``` --- ## 测试步骤 1. **清除缓存** ```javascript // 在浏览器控制台执行 uni.clearStorageSync() ``` 2. **重新登录** - 输入手机号和密码 - 点击登录 - 观察是否正常跳转 3. **检查日志** - 查看控制台是否有错误 - 查看 Network 标签的 API 请求 - 查看 `getUserBasic` 的响应数据 4. **验证功能** - 确认能正常进入首页 - 确认能看到用户信息 - 确认能正常使用各个功能 --- ## 预防措施 1. **始终为对象类型的数据设置默认值** ```javascript // ❌ 不好 userData: '' // ✅ 好 userData: { id: 0, name: '', // ... } ``` 2. **添加错误处理** ```javascript GetUserBasic({}).then(res => { // ... }).catch(err => { console.error('错误:', err) // 显示友好的错误提示 }) ``` 3. **添加加载状态** - 让用户知道系统正在处理 - 避免用户重复点击 4. **添加调试日志** - 方便排查问题 - 生产环境可以关闭 --- ## 总结 登录无法进入的主要原因是 `getBobbiesList` 初始值为空字符串,导致页面判断逻辑失效。 **推荐修复方案**: 1. 将 `getBobbiesList` 初始值改为对象 2. 添加加载状态 3. 在 `onLoad` 时也调用 `getUserBasic()` 4. 添加完善的错误处理 修复后,用户登录成功就能正常进入系统了!