Trae AI 7 days ago
parent
commit
3a978e6d76
  1. 47
      pages/index/index.js
  2. 19
      server-example/server-mysql.js
  3. 98
      test-login-type.js

47
pages/index/index.js

@ -3956,13 +3956,53 @@ Page({
// 获取openid // 获取openid
const openid = wx.getStorageSync('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) // 构造上传数据(包含openid和session_key)
const uploadData = { const uploadData = {
userId: userId, userId: userId,
openid: openid, openid: openid,
...userInfo, ...userInfo,
type: type, type: serverType,
timestamp: Date.now() timestamp: Date.now()
} }
@ -4147,7 +4187,10 @@ Page({
currentUserType = app.globalData.userType || '' currentUserType = app.globalData.userType || ''
} }
// 7. 保存用户信息并等待上传完成 // 7. 先将手机号存储到本地,确保uploadUserInfoToServer能获取到
wx.setStorageSync('phoneNumber', phoneNumber)
// 8. 保存用户信息并等待上传完成
await this.uploadUserInfoToServer(userInfo, userId, currentUserType) await this.uploadUserInfoToServer(userInfo, userId, currentUserType)
console.log('用户信息保存并上传完成') console.log('用户信息保存并上传完成')

19
server-example/server-mysql.js

@ -3249,7 +3249,14 @@ app.post('/api/user/upload', async (req, res) => {
if (user) { if (user) {
// 更新用户信息,确保authorized_region字段正确处理 // 更新用户信息,确保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字符串 // 特别处理authorized_region字段,只有当它是对象时才转换为JSON字符串
if (updateData.authorized_region && typeof updateData.authorized_region === 'object') { 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('更新用户数据:', { authorized_region: updateData.authorized_region }); console.log('更新用户数据:', updateData);
await User.update(updateData, { await User.update(updateData, {
where: { openid: userData.openid } where: { openid: userData.openid }
}); });
user = await User.findOne({ 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); await createUserAssociations(user);
@ -3475,8 +3482,8 @@ app.post('/api/wechat/getOpenid', async (req, res) => {
); );
} else { } else {
// 创建新用户 // 创建新用户
// 支持从客户端传入type参数,如果没有则默认为buyer // 支持从客户端传入type参数,如果没有则保持为空
const userType = req.body.type || 'buyer'; const userType = req.body.type || '';
await User.create({ await User.create({
openid, openid,
userId, userId,
@ -3484,7 +3491,7 @@ app.post('/api/wechat/getOpenid', async (req, res) => {
name: '微信用户', // 临时占位,等待用户授权 name: '微信用户', // 临时占位,等待用户授权
nickName: '微信用户', // 数据库NOT NULL字段 nickName: '微信用户', // 数据库NOT NULL字段
phoneNumber: '', // 使用空字符串代替临时手机号,后续由微信小程序拉取的真实手机号更新 phoneNumber: '', // 使用空字符串代替临时手机号,后续由微信小程序拉取的真实手机号更新
type: userType, // 使用客户端传入的类型或默认买家身份 type: userType, // 使用客户端传入的类型或保持为空
province: '', // 默认空字符串 province: '', // 默认空字符串
city: '', // 默认空字符串 city: '', // 默认空字符串
district: '', // 默认空字符串 district: '', // 默认空字符串

98
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);
});
Loading…
Cancel
Save