diff --git a/pages/index/index.js b/pages/index/index.js index 91d20cd..5017291 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -3956,13 +3956,53 @@ Page({ // 获取openid const openid = wx.getStorageSync('openid') + const phoneNumber = userInfo.phoneNumber || wx.getStorageSync('phoneNumber') || '' + + let serverType = type + let hasServerType = false + + // 尝试从服务器获取现有用户信息,特别是type字段 + if (phoneNumber) { + try { + console.log('尝试从服务器获取现有用户信息...') + const validateRes = await API.validateUserLogin() + if (validateRes.success && validateRes.userInfo) { + if (validateRes.userInfo.type) { + serverType = validateRes.userInfo.type + hasServerType = true + console.log('从服务器获取到用户类型:', serverType) + } else { + console.log('服务器返回的用户信息中没有type字段') + } + } else { + console.log('服务器返回的用户信息为空或无效') + } + } catch (err) { + console.warn('获取服务器用户信息失败:', err) + // 失败时,如果本地类型为空,尝试直接从服务器获取用户类型 + if (!type) { + console.log('本地类型为空,尝试直接获取用户类型') + try { + // 直接调用API获取用户类型 + const userInfoRes = await API.getUserInfo(openid) + if (userInfoRes.success && userInfoRes.userInfo && userInfoRes.userInfo.type) { + serverType = userInfoRes.userInfo.type + hasServerType = true + console.log('从服务器获取到用户类型:', serverType) + } + } catch (innerErr) { + console.warn('直接获取用户类型失败:', innerErr) + } + } + } + } // 构造上传数据(包含openid和session_key) const uploadData = { userId: userId, openid: openid, ...userInfo, - type: type, + type: serverType, timestamp: Date.now() } @@ -4147,7 +4187,10 @@ Page({ currentUserType = app.globalData.userType || '' } - // 7. 保存用户信息并等待上传完成 + // 7. 先将手机号存储到本地,确保uploadUserInfoToServer能获取到 + wx.setStorageSync('phoneNumber', phoneNumber) + + // 8. 保存用户信息并等待上传完成 await this.uploadUserInfoToServer(userInfo, userId, currentUserType) console.log('用户信息保存并上传完成') diff --git a/server-example/server-mysql.js b/server-example/server-mysql.js index 795ebe4..be50c80 100644 --- a/server-example/server-mysql.js +++ b/server-example/server-mysql.js @@ -3249,7 +3249,14 @@ app.post('/api/user/upload', async (req, res) => { if (user) { // 更新用户信息,确保authorized_region字段正确处理 - const updateData = { ...userData, updated_at: getBeijingTime() }; + const updateData = { updated_at: getBeijingTime() }; + + // 只更新非空字段,避免覆盖服务器中的现有值 + Object.keys(userData).forEach(key => { + if (key !== 'openid' && key !== 'userId' && userData[key] !== '' && userData[key] !== null && userData[key] !== undefined) { + updateData[key] = userData[key]; + } + }); // 特别处理authorized_region字段,只有当它是对象时才转换为JSON字符串 if (updateData.authorized_region && typeof updateData.authorized_region === 'object') { @@ -3265,14 +3272,14 @@ app.post('/api/user/upload', async (req, res) => { console.log('authorized_region已经是字符串,无需转换:', updateData.authorized_region); } - console.log('更新用户数据:', { authorized_region: updateData.authorized_region }); + console.log('更新用户数据:', updateData); await User.update(updateData, { where: { openid: userData.openid } }); user = await User.findOne({ where: { openid: userData.openid } }); - console.log('更新后用户数据:', { authorized_region: user.authorized_region }); + console.log('更新后用户数据:', { authorized_region: user.authorized_region, type: user.type }); // 使用统一的关联记录创建函数 await createUserAssociations(user); @@ -3475,8 +3482,8 @@ app.post('/api/wechat/getOpenid', async (req, res) => { ); } else { // 创建新用户 - // 支持从客户端传入type参数,如果没有则默认为buyer - const userType = req.body.type || 'buyer'; + // 支持从客户端传入type参数,如果没有则保持为空 + const userType = req.body.type || ''; await User.create({ openid, userId, @@ -3484,7 +3491,7 @@ app.post('/api/wechat/getOpenid', async (req, res) => { name: '微信用户', // 临时占位,等待用户授权 nickName: '微信用户', // 数据库NOT NULL字段 phoneNumber: '', // 使用空字符串代替临时手机号,后续由微信小程序拉取的真实手机号更新 - type: userType, // 使用客户端传入的类型或默认买家身份 + type: userType, // 使用客户端传入的类型或保持为空 province: '', // 默认空字符串 city: '', // 默认空字符串 district: '', // 默认空字符串 diff --git a/test-login-type.js b/test-login-type.js new file mode 100644 index 0000000..4692f21 --- /dev/null +++ b/test-login-type.js @@ -0,0 +1,98 @@ +// 测试脚本:验证登录时用户类型是否被覆盖 +// 运行方法:在微信开发者工具的控制台中执行 + +// 模拟删除缓存 +function clearCache() { + console.log('=== 开始模拟删除缓存 ==='); + try { + wx.removeStorageSync('userInfo'); + wx.removeStorageSync('users'); + wx.removeStorageSync('userId'); + wx.removeStorageSync('openid'); + wx.removeStorageSync('sessionKey'); + wx.removeStorageSync('phoneNumber'); + wx.removeStorageSync('userType'); + console.log('✅ 缓存删除成功'); + } catch (e) { + console.error('❌ 缓存删除失败:', e); + } + console.log('=== 缓存删除完成 ==='); +} + +// 模拟登录流程 +async function simulateLogin() { + console.log('=== 开始模拟登录流程 ==='); + + // 模拟获取登录code + const loginRes = await new Promise((resolve) => { + wx.login({ + success: resolve + }); + }); + + console.log('✅ 获取登录code成功:', loginRes.code); + + // 模拟获取openid + const API = require('./utils/api.js'); + const openidRes = await API.getOpenid(loginRes.code); + console.log('✅ 获取openid成功:', openidRes); + + const openid = openidRes.data?.openid || openidRes.openid; + const userId = openidRes.data?.userId || openidRes.userId; + + console.log('提取到的openid:', openid); + console.log('提取到的userId:', userId); + + // 存储openid和userId + wx.setStorageSync('openid', openid); + if (userId) { + wx.setStorageSync('userId', userId); + } + + console.log('=== 登录流程模拟完成 ==='); + return { openid, userId }; +} + +// 测试用户类型是否被覆盖 +async function testUserType() { + console.log('=== 开始测试用户类型是否被覆盖 ==='); + + // 1. 清除缓存 + clearCache(); + + // 2. 模拟登录 + const { openid, userId } = await simulateLogin(); + + // 3. 模拟获取手机号(实际登录时会有授权流程) + const phoneNumber = '13800138000'; // 模拟手机号 + wx.setStorageSync('phoneNumber', phoneNumber); + + // 4. 模拟用户信息 + const userInfo = { + name: '测试用户', + avatarUrl: 'https://example.com/avatar.jpg', + phoneNumber: phoneNumber + }; + + // 5. 模拟用户类型(空值,模拟删除缓存后的情况) + const currentUserType = ''; + + // 6. 调用uploadUserInfoToServer + const page = getCurrentPages()[0]; + if (page && page.uploadUserInfoToServer) { + console.log('=== 调用uploadUserInfoToServer ==='); + console.log('传入的用户类型:', currentUserType); + + const result = await page.uploadUserInfoToServer(userInfo, userId || 'test_user_id', currentUserType); + console.log('上传结果:', result); + } else { + console.error('❌ 无法找到uploadUserInfoToServer方法'); + } + + console.log('=== 测试完成 ==='); +} + +// 运行测试 +testUserType().catch(err => { + console.error('测试失败:', err); +});