import { fetchPerson } from '../../../services/usercenter/fetchPerson'; import { phoneEncryption } from '../../../utils/util'; import Toast from 'tdesign-miniprogram/toast/index'; const weChatAuthService = require('../../../services/auth/wechat'); Page({ data: { personInfo: { avatarUrl: '', nickName: '', gender: 0, // 默认为0(未设置) phoneNumber: '', level: 1 }, originalPersonInfo: null, // 保存原始数据 displayPhoneNumber: '', // 用于显示的加密手机号 defaultAvatarUrl: 'https://tdesign.gtimg.com/miniprogram/template/retail/usercenter/icon-user-center-avatar@2x.png', genderVisible: false, genderList: [ { label: '男', value: 1 }, { label: '女', value: 2 }, { label: '未设置', value: 0 } ], // 性别映射 genderMap: { 0: '未设置', 1: '男', 2: '女' }, saving: false }, onLoad() { this.init(); }, init() { this.fetchData(); }, fetchData() { console.log('=== 开始获取用户信息 ==='); fetchPerson().then((personInfo) => { console.log('从API获取到的原始用户信息:', personInfo); // 确保所有字段都有正确的类型和默认值 const safePersonInfo = { avatarUrl: personInfo.avatarUrl || '', nickName: personInfo.nickName || '', gender: personInfo.gender || 0, phoneNumber: personInfo.phoneNumber || '', level: personInfo.level || 1, }; console.log('处理后的安全用户信息:', safePersonInfo); console.log('性别数据详细信息:', { 原始性别: personInfo.gender, 处理后性别: safePersonInfo.gender, 性别类型: typeof safePersonInfo.gender }); console.log('手机号数据详细信息:', { 原始手机号: personInfo.phoneNumber, 处理后手机号: safePersonInfo.phoneNumber, 手机号类型: typeof safePersonInfo.phoneNumber }); console.log('个人资料页 - 头像URL:', safePersonInfo.avatarUrl); console.log('个人资料页 - 默认头像URL:', this.data.defaultAvatarUrl); // 保存原始数据用于编辑,显示数据用于界面展示 this.setData({ personInfo: safePersonInfo, originalPersonInfo: JSON.parse(JSON.stringify(safePersonInfo)), // 深拷贝保存原始数据 originalNickname: safePersonInfo.nickName, // 保存原始昵称用于重置 displayPhoneNumber: phoneEncryption(safePersonInfo.phoneNumber), // 仅用于显示的加密手机号 }); console.log('设置到页面数据后的personInfo:', this.data.personInfo); console.log('原始数据originalPersonInfo:', this.data.originalPersonInfo); }).catch((error) => { console.error('获取用户信息失败:', error); Toast({ context: this, selector: '#t-toast', message: '获取用户信息失败', theme: 'error', }); }); }, onClickCell({ currentTarget }) { const { dataset } = currentTarget; const { nickName } = this.data.personInfo; switch (dataset.type) { case 'name': wx.navigateTo({ url: `/pages/user/name-edit/index?name=${nickName}`, }); break; case 'avatarUrl': this.toModifyAvatar(); break; default: { break; } } }, // 保存性别设置 async saveGender(gender) { this.setData({ saving: true }); try { const userInfo = { nickName: this.data.personInfo.nickName, avatarUrl: this.data.personInfo.avatarUrl, gender: gender }; await weChatAuthService.updateUserProfile(userInfo); this.setData({ saving: false }); Toast({ context: this, selector: '#t-toast', message: '性别设置成功', theme: 'success', }); } catch (error) { console.error('保存性别失败:', error); this.setData({ saving: false }); Toast({ context: this, selector: '#t-toast', message: '性别设置失败,请重试', theme: 'error', }); } }, // 处理头像昵称组件的回调(微信官方组件)- 自动保存 async onChooseAvatar(e) { const { avatarUrl } = e.detail; console.log('从微信头像组件获取头像:', avatarUrl); // 立即更新界面显示 this.setData({ 'personInfo.avatarUrl': avatarUrl, }); // 自动保存头像 await this.saveAvatar(avatarUrl); }, // 保存头像 async saveAvatar(avatarUrl) { this.setData({ saving: true }); try { const userInfo = { nickName: this.data.personInfo.nickName, avatarUrl: avatarUrl, gender: this.data.personInfo.gender }; console.log('保存头像信息:', userInfo); await weChatAuthService.updateUserProfile(userInfo); // 确保头像URL已保存到本地数据 this.setData({ saving: false, 'personInfo.avatarUrl': avatarUrl }); Toast({ context: this, selector: '#t-toast', message: '头像设置成功', theme: 'success', }); } catch (error) { console.error('保存头像失败:', error); this.setData({ saving: false }); Toast({ context: this, selector: '#t-toast', message: '头像设置失败,请重试', theme: 'error', }); } }, // 昵称输入变化 onNicknameChange(e) { console.log('昵称输入变化:', e.detail.value); this.setData({ 'personInfo.nickName': e.detail.value }); }, // 保存昵称(兼容旧方式) saveNickname(e) { console.log('保存昵称事件触发:', e); const nickname = e.detail.value || this.data.personInfo.nickName; console.log('要保存的昵称:', nickname); if (!nickname || nickname.trim() === '') { wx.showToast({ title: '昵称不能为空', icon: 'none' }); return; } this.saveNicknameToServer(nickname.trim()); }, // 性别选择事件(radio-group change事件) onGenderChange(e) { const gender = parseInt(e.detail.value); console.log('性别选择变化:', gender); this.setData({ 'personInfo.gender': gender }); // 自动保存性别 this.saveGender(gender); }, // 手机号获得焦点事件 onPhoneFocus(e) { console.log('手机号输入框获得焦点'); // 确保显示原始手机号而不是加密的 if (this.data.originalPersonInfo && this.data.originalPersonInfo.phoneNumber) { this.setData({ displayPhoneNumber: this.data.originalPersonInfo.phoneNumber }); } }, // 手机号输入事件(实时输入) onPhoneInput(e) { const phoneNumber = e.detail.value.trim(); // 更新显示数据和实际数据 this.setData({ displayPhoneNumber: phoneNumber, 'personInfo.phoneNumber': phoneNumber }); // 清除之前的定时器 if (this.phoneInputTimer) { clearTimeout(this.phoneInputTimer); } // 设置延迟自动保存(用户停止输入1.5秒后自动保存) this.phoneInputTimer = setTimeout(() => { this.updatePhoneNumber(phoneNumber, 'auto'); }, 1500); }, // 手机号输入失焦事件 onPhoneBlur(e) { const phoneNumber = e.detail.value.trim(); // 清除定时器,立即保存 if (this.phoneInputTimer) { clearTimeout(this.phoneInputTimer); this.phoneInputTimer = null; } this.updatePhoneNumber(phoneNumber, 'blur'); // 失焦后显示加密的手机号 if (phoneNumber) { this.setData({ displayPhoneNumber: phoneEncryption(phoneNumber) }); } }, // 手机号输入确认事件(回车) onPhoneConfirm(e) { const phoneNumber = e.detail.value.trim(); // 清除定时器,立即保存 if (this.phoneInputTimer) { clearTimeout(this.phoneInputTimer); this.phoneInputTimer = null; } this.updatePhoneNumber(phoneNumber, 'confirm'); }, // 更新手机号 updatePhoneNumber(phoneNumber, triggerType = 'manual') { console.log(`=== 手机号更新触发 (${triggerType}) ===`); console.log('输入的手机号:', phoneNumber); // 如果手机号为空,直接保存(清空操作) if (!phoneNumber) { console.log('手机号为空,执行清空操作'); this.setData({ 'personInfo.phoneNumber': phoneNumber }); this.savePhoneNumber(phoneNumber, triggerType); return; } // 验证手机号格式 if (!this.validatePhoneNumber(phoneNumber)) { // 只在非自动触发时显示错误提示 if (triggerType !== 'auto') { wx.showToast({ title: '手机号格式不正确', icon: 'none' }); } console.log('手机号格式验证失败:', phoneNumber); return; } // 检查是否与原始值相同,避免重复保存 const originalPhoneNumber = this.data.originalPersonInfo ? this.data.originalPersonInfo.phoneNumber : ''; if (phoneNumber === originalPhoneNumber) { console.log('手机号未变化,跳过保存'); return; } // 更新数据 this.setData({ 'personInfo.phoneNumber': phoneNumber }); // 自动保存手机号 this.savePhoneNumber(phoneNumber, triggerType); }, // 验证手机号格式 validatePhoneNumber(phoneNumber) { const phoneRegex = /^1[3-9]\d{9}$/; return phoneRegex.test(phoneNumber); }, // 保存手机号 async savePhoneNumber(phoneNumber, triggerType = 'manual') { if (this.data.saving) { console.log('正在保存中,跳过重复请求'); return; } this.setData({ saving: true }); try { console.log(`=== 开始保存手机号到服务器 (${triggerType}) ===`); console.log('要保存的手机号:', phoneNumber); // 构建用户信息对象,包含手机号 const userInfo = { nickName: this.data.personInfo.nickName, avatarUrl: this.data.personInfo.avatarUrl, gender: this.data.personInfo.gender, phoneNumber: phoneNumber // 添加手机号字段 }; console.log('发送到服务器的用户信息:', userInfo); // 调用微信授权服务更新用户信息 const result = await weChatAuthService.updateUserProfile(userInfo); console.log('服务器返回结果:', result); // 根据触发方式显示不同的提示 if (triggerType === 'auto') { // 自动保存时显示更简洁的提示 console.log('自动保存成功'); } else { // 手动触发时显示Toast提示 wx.showToast({ title: phoneNumber ? '手机号保存成功' : '手机号已清空', icon: 'success', duration: 1500 }); } // 保存成功后,立即更新原始数据 if (this.data.originalPersonInfo) { this.setData({ 'originalPersonInfo.phoneNumber': phoneNumber }); } // 重新获取用户信息验证是否真的更新了 console.log('=== 重新获取用户信息验证更新 ==='); this.fetchData(); } catch (error) { console.error('保存手机号失败:', error); // 只在非自动触发时显示错误提示 if (triggerType !== 'auto') { wx.showToast({ title: '保存失败,请重试', icon: 'none' }); } } finally { this.setData({ saving: false }); } }, // 保存昵称到服务器 async saveNicknameToServer(nickname) { this.setData({ saving: true }); try { console.log('=== 开始保存昵称到服务器 ==='); // 如果传入了昵称参数,使用传入的昵称;否则使用当前数据中的昵称 const finalNickname = nickname || this.data.personInfo.nickName; console.log('要保存的昵称:', finalNickname); console.log('当前数据中的昵称:', this.data.personInfo.nickName); // 更新本地数据 if (nickname && nickname !== this.data.personInfo.nickName) { this.setData({ 'personInfo.nickName': nickname }); } const userInfo = { nickName: finalNickname, avatarUrl: this.data.personInfo.avatarUrl, gender: this.data.personInfo.gender }; console.log('发送到服务器的用户信息:', userInfo); const result = await weChatAuthService.updateUserProfile(userInfo); console.log('服务器返回结果:', result); // 保存成功后,重新获取用户信息验证是否真的更新了 console.log('=== 重新获取用户信息验证更新 ==='); this.fetchData(); this.setData({ saving: false }); Toast({ context: this, selector: '#t-toast', message: '昵称设置成功', theme: 'success', }); } catch (error) { console.error('保存昵称失败:', error); this.setData({ saving: false }); Toast({ context: this, selector: '#t-toast', message: '昵称设置失败,请重试', theme: 'error', }); } }, // 兼容旧版本的头像选择方式 - 自动保存 async toModifyAvatar() { try { const tempFilePath = await new Promise((resolve, reject) => { wx.chooseImage({ count: 1, sizeType: ['compressed'], sourceType: ['album', 'camera'], success: (res) => { const { path, size } = res.tempFiles && res.tempFiles.length > 0 ? res.tempFiles[0] : {}; if (size <= 10485760) { resolve(path); } else { reject({ errMsg: '图片大小超出限制,请重新上传' }); } }, fail: (err) => reject(err), }); }); // 更新本地显示 this.setData({ 'personInfo.avatarUrl': tempFilePath, }); // 自动保存头像 await this.saveAvatar(tempFilePath); } catch (error) { if (error.errMsg === 'chooseImage:fail cancel') return; Toast({ context: this, selector: '#t-toast', message: error.errMsg || error.msg || '选择头像出错了', theme: 'error', }); } }, // 切换账号登录 openUnbindConfirm() { wx.showModal({ title: '切换账号', content: '确定要切换到其他微信账号登录吗?', success: (res) => { if (res.confirm) { // 清除本地存储的用户信息 wx.removeStorageSync('token'); wx.removeStorageSync('userInfo'); // 跳转到登录页面 wx.reLaunch({ url: '/pages/login/index' }); } } }); }, // 页面卸载时清理定时器 onUnload() { if (this.phoneInputTimer) { clearTimeout(this.phoneInputTimer); this.phoneInputTimer = null; console.log('页面卸载,清理手机号输入定时器'); } } });