const app = getApp() Page({ data: { userInfo: null, ladderUser: null, currentStore: null, showQrcode: false, qrcodeImage: '', qrcodeLoading: false, // 完善资料弹框 showProfileModal: false, profileForm: { avatar: '', nickname: '' }, isEditMode: false // true: 编辑模式,false: 完善模式(登录时) }, onLoad() { this.initData() }, onShow() { // 检查门店是否切换 if (app.globalData.storeChanged) { app.globalData.storeChanged = false this.refreshData() } else { // 同步最新数据 this.setData({ userInfo: app.globalData.userInfo, ladderUser: app.globalData.ladderUser, currentStore: app.globalData.currentStore }) } }, async onPullDownRefresh() { try { await this.refreshData() } finally { wx.stopPullDownRefresh() } }, async initData() { // 先进行微信登录获取openid if (!app.globalData.wxLoginInfo) { try { await app.wxLogin() } catch (e) { console.error('微信登录失败:', e) } } if (app.globalData.token) { await this.refreshData() } }, async refreshData() { if (!app.globalData.token) return try { await app.getUserInfo() this.setData({ userInfo: app.globalData.userInfo, ladderUser: app.globalData.ladderUser, currentStore: app.globalData.currentStore }) } catch (e) { console.error('获取用户信息失败:', e) } }, // 获取手机号授权 async onGetPhoneNumber(e) { if (e.detail.errMsg !== 'getPhoneNumber:ok') { wx.showToast({ title: '需要授权手机号才能登录', icon: 'none' }) return } wx.showLoading({ title: '登录中...' }) try { // 如果没有微信登录信息,先登录 if (!app.globalData.wxLoginInfo) { await app.wxLogin() } // 手机号登录(先不传头像昵称) await app.phoneLogin(e.detail.encryptedData, e.detail.iv, null) // 获取门店信息 await app.getCurrentStore() const userInfo = app.globalData.userInfo this.setData({ userInfo: userInfo, ladderUser: app.globalData.ladderUser, currentStore: app.globalData.currentStore }) wx.hideLoading() // 检查是否需要完善资料(没有头像或昵称为默认值) const needProfile = !userInfo.avatar || userInfo.avatar === '' || !userInfo.nickname || userInfo.nickname === '新用户' || userInfo.nickname === '' if (needProfile) { // 弹出完善资料弹框 this.setData({ showProfileModal: true, isEditMode: false, profileForm: { avatar: userInfo.avatar || '/images/avatar-default.svg', nickname: userInfo.nickname === '新用户' ? '' : (userInfo.nickname || '') } }) wx.showToast({ title: '登录成功,请完善资料', icon: 'none' }) } else { wx.showToast({ title: '登录成功', icon: 'success' }) } } catch (e) { wx.hideLoading() console.error('登录失败:', e) wx.showToast({ title: e.message || '登录失败', icon: 'none' }) } }, // 点击头像,打开编辑资料弹框 onTapAvatar() { if (!this.data.userInfo?.phone) return this.setData({ showProfileModal: true, isEditMode: true, profileForm: { avatar: this.data.userInfo.avatar || '/images/avatar-default.svg', nickname: this.data.userInfo.nickname || '' } }) }, // 选择头像(新API:button open-type="chooseAvatar") onChooseAvatarNew(e) { const avatarUrl = e.detail.avatarUrl this.setData({ 'profileForm.avatar': avatarUrl }) }, // 输入昵称 onNicknameInput(e) { this.setData({ 'profileForm.nickname': e.detail.value }) }, // 确认保存资料 async saveProfile() { const { avatar, nickname } = this.data.profileForm if (!nickname || nickname.trim() === '') { wx.showToast({ title: '请输入昵称', icon: 'none' }) return } wx.showLoading({ title: '保存中...' }) try { // 如果选择了新头像,先上传 let avatarUrl = avatar if (avatar && (avatar.startsWith('wxfile://') || avatar.startsWith('http://tmp'))) { avatarUrl = await this.uploadAvatar(avatar) } // 调用更新资料接口 const res = await app.request('/api/user/profile', { nickname: nickname.trim(), avatar: avatarUrl }, 'PUT') // 更新本地数据(服务端已返回完整URL) const userInfo = { ...this.data.userInfo, nickname: res.data?.nickname || nickname.trim(), avatar: res.data?.avatar || avatarUrl } app.globalData.userInfo = userInfo this.setData({ userInfo: userInfo, showProfileModal: false, profileForm: { avatar: '', nickname: '' } }) wx.hideLoading() wx.showToast({ title: '保存成功', icon: 'success' }) } catch (e) { wx.hideLoading() console.error('保存资料失败:', e) wx.showToast({ title: e.message || '保存失败', icon: 'none' }) } }, // 上传头像 async uploadAvatar(filePath) { return new Promise((resolve, reject) => { wx.uploadFile({ url: `${app.globalData.baseUrl}/api/upload/avatar`, filePath: filePath, name: 'file', header: { 'Authorization': `Bearer ${app.globalData.token}` }, success: (res) => { try { const data = JSON.parse(res.data) if (data.code === 0 && data.data?.url) { resolve(data.data.url) } else { console.error('上传头像失败:', data) resolve(filePath) } } catch (e) { resolve(filePath) } }, fail: (err) => { console.error('上传头像失败:', err) resolve(filePath) } }) }) }, // 关闭资料弹框 closeProfileModal() { // 如果是完善模式,提示用户 if (!this.data.isEditMode) { wx.showModal({ title: '提示', content: '完善资料后可以让好友更容易找到你,确定跳过?', confirmText: '跳过', cancelText: '继续完善', success: (res) => { if (res.confirm) { this.setData({ showProfileModal: false }) } } }) } else { this.setData({ showProfileModal: false }) } }, async showMemberCode() { if (!this.data.userInfo?.memberCode) return this.setData({ showQrcode: true, qrcodeLoading: true }) try { // 调用接口获取二维码 const res = await app.request('/api/user/qrcode') if (res.data && res.data.qrcode) { this.setData({ qrcodeImage: res.data.qrcode, qrcodeLoading: false }) } } catch (e) { console.error('获取二维码失败:', e) this.setData({ qrcodeLoading: false }) wx.showToast({ title: '获取二维码失败', icon: 'none' }) } }, hideQrcode() { this.setData({ showQrcode: false, qrcodeImage: '' }) }, goTo(e) { const url = e.currentTarget.dataset.url if (!app.globalData.token) { wx.showToast({ title: '请先登录', icon: 'none' }) return } wx.navigateTo({ url }) }, // 阻止事件冒泡 preventBubble() { // 空函数,仅用于阻止事件冒泡 } })