// pages/edit/edit.js // 点单端设置页;纯打手端时:头像走 /yonghu/xiugai,昵称走 /yonghu/dsgxxx,手机只读(点单端已认证手机号) const app = getApp() import upload from '../../utils/upload.js' import request from '../../utils/request.js' import { isFighterOnly } from '../../utils/fighter-only.js' Page({ data: { avatarUrl: '', uid: '', nicheng: '', phone: '', originalAvatar: '', originalNicheng: '', isSaving: false, hasChanges: false, newAvatarFile: null, isLoading: true, isAvatarActive: false, nicknameError: '', // 打手扩展字段缓存,更新昵称时原样带回,避免后端把空串覆盖掉 _dsDianhua: '', _dsWeixin: '', _dsJieshao: '', fighterMode: false, }, onLoad() { const fighterMode = isFighterOnly() this.setData({ fighterMode }) wx.setNavigationBarTitle({ title: '编辑资料' }) if (fighterMode) { this.loadFighterModeData() } else { this.loadUserData() } }, onShow() { this.registerNotificationComponent() }, registerNotificationComponent() { const notificationComp = this.selectComponent('#global-notification') if (notificationComp && notificationComp.showNotification) { app.globalData.globalNotification = { show: (data) => notificationComp.showNotification(data), hide: () => notificationComp.hideNotification(), } } }, // ——— 点单端:原逻辑 ——— loadUserData() { try { const uid = wx.getStorageSync('uid') || '' const nicheng = wx.getStorageSync('nicheng') || '' const phone = wx.getStorageSync('phone') || '' const touxiang = wx.getStorageSync('touxiang') || '' this.setData({ avatarUrl: this.buildAvatarUrl(touxiang), uid, nicheng, phone, originalAvatar: touxiang, originalNicheng: nicheng, isLoading: false, }) } catch (error) { console.error('加载用户数据失败:', error) this.setData({ isLoading: false }) wx.showToast({ title: '加载数据失败', icon: 'none' }) } }, // ——— 纯打手端:手机/头像用点单端存储;昵称用打手资料 ——— async loadFighterModeData() { this.setData({ isLoading: true }) try { const uid = wx.getStorageSync('uid') || '' const phone = wx.getStorageSync('phone') || '' const touxiang = wx.getStorageSync('touxiang') || '' let nicheng = wx.getStorageSync('dsnc') || app.globalData.dashouNicheng || '' let dsDianhua = wx.getStorageSync('dsdianhua') || '' let dsWeixin = wx.getStorageSync('dsweixin') || '' let dsJieshao = wx.getStorageSync('dsjieshao') || '' // 昵称缺失时拉打手资料(不碰点单端昵称) if (!nicheng || !String(nicheng).trim()) { try { const res = await request({ url: '/yonghu/dszjxxhq', method: 'POST' }) if (res && res.data && res.data.code === 200 && res.data.data) { const d = res.data.data nicheng = d.nicheng || '' dsDianhua = d.dianhua || dsDianhua dsWeixin = d.wechat || dsWeixin dsJieshao = d.jieshao || dsJieshao wx.setStorageSync('dsnc', nicheng) wx.setStorageSync('dsdianhua', dsDianhua) wx.setStorageSync('dsweixin', dsWeixin) wx.setStorageSync('dsjieshao', dsJieshao) } } catch (e) { console.warn('拉取打手昵称失败', e) } } this.setData({ avatarUrl: this.buildAvatarUrl(touxiang), uid, phone, nicheng, originalAvatar: touxiang, originalNicheng: nicheng, _dsDianhua: dsDianhua, _dsWeixin: dsWeixin, _dsJieshao: dsJieshao, isLoading: false, }) } catch (error) { console.error('加载打手设置数据失败:', error) this.setData({ isLoading: false }) wx.showToast({ title: '加载数据失败', icon: 'none' }) } }, buildAvatarUrl(touxiang) { const ossImageUrl = app.globalData.ossImageUrl || '' const defaultAvatar = app.globalData.morentouxiang || '' if (touxiang) { return touxiang.startsWith('http') ? touxiang : `${ossImageUrl}${touxiang}` } if (defaultAvatar) { return defaultAvatar.startsWith('http') ? defaultAvatar : `${ossImageUrl}${defaultAvatar}` } return '' }, onChooseAvatar(e) { const avatarTempPath = e.detail.avatarUrl this.setData( { avatarUrl: avatarTempPath, newAvatarFile: avatarTempPath, }, () => this.checkChanges() ) }, chooseAvatar() { this.setData({ isAvatarActive: true }) setTimeout(() => this.setData({ isAvatarActive: false }), 500) }, onNicknameInput(e) { const value = e.detail.value.trim() this.setData( { nicheng: value, nicknameError: '', }, () => this.checkChanges() ) }, checkChanges() { const { originalNicheng, nicheng, newAvatarFile } = this.data const hasChanges = nicheng !== originalNicheng || newAvatarFile !== null this.setData({ hasChanges }) }, validateData() { const { nicheng } = this.data let hasError = false this.setData({ nicknameError: '' }) if (nicheng && nicheng.length > 20) { this.setData({ nicknameError: '昵称不能超过20个字符' }) hasError = true } if (nicheng !== this.data.originalNicheng && nicheng.trim() === '') { this.setData({ nicknameError: '昵称不能为空' }) hasError = true } if (hasError) { if (this.data.nicknameError) { wx.showToast({ title: this.data.nicknameError, icon: 'none' }) } return false } return true }, async onSave() { if (!this.data.hasChanges) { wx.showToast({ title: '没有需要保存的更改', icon: 'none' }) return } if (this.data.isSaving) return if (!this.validateData()) return this.setData({ isSaving: true }) wx.showLoading({ title: '保存中...', mask: true }) try { if (this.data.fighterMode) { await this.saveFighterMode() } else { await this.saveOrderMode() } } catch (error) { console.error('保存失败:', error) if (error.message && (error.message.includes('认证失败') || error.message.includes('401'))) { wx.showModal({ title: '提示', content: '登录已过期,请重新登录', complete: (res) => { if (res.confirm) { wx.removeStorageSync('token') wx.removeStorageSync('userInfo') wx.reLaunch({ url: '/pages/fighter/fighter' }) } }, }) } else { wx.showToast({ title: error.message || '保存失败', icon: 'none' }) } } finally { wx.hideLoading() this.setData({ isSaving: false }) } }, /** 点单端原保存:昵称+头像 → /yonghu/xiugai */ async saveOrderMode() { const formData = {} if (this.data.nicheng !== this.data.originalNicheng) { formData.nicheng = this.data.nicheng } const res = await upload({ url: '/yonghu/xiugai', formData, filePath: this.data.newAvatarFile, fileName: 'avatar', }) if (res.statusCode === 200 && res.data && res.data.code === 0) { await this.handleUpdateSuccess(res.data.data || {}) } else { throw new Error((res.data && (res.data.msg || res.data.message)) || '保存失败') } }, /** * 纯打手端混调: * - 头像变了 → /yonghu/xiugai(点单端,只传头像,不改点单昵称) * - 昵称变了 → /yonghu/dsgxxx(打手端,带回其它打手字段防覆盖) * 手机号只读,不提交 */ async saveFighterMode() { const nickChanged = this.data.nicheng !== this.data.originalNicheng const avatarChanged = !!this.data.newAvatarFile let avatarData = null let nickData = null if (avatarChanged) { const res = await upload({ url: '/yonghu/xiugai', formData: {}, filePath: this.data.newAvatarFile, fileName: 'avatar', }) if (!(res.statusCode === 200 && res.data && res.data.code === 0)) { throw new Error((res.data && (res.data.msg || res.data.message)) || '头像保存失败') } avatarData = res.data.data || {} } if (nickChanged) { const postData = { nicheng: this.data.nicheng, dianhua: this.data._dsDianhua || wx.getStorageSync('dsdianhua') || '', wechat: this.data._dsWeixin || wx.getStorageSync('dsweixin') || '', jieshao: this.data._dsJieshao || wx.getStorageSync('dsjieshao') || '', } const res = await request({ url: '/yonghu/dsgxxx', method: 'POST', data: postData, }) if (!(res && res.data && res.data.code === 200)) { throw new Error((res && res.data && res.data.msg) || '昵称保存失败') } nickData = res.data.data || postData } this.handleFighterUpdateSuccess(avatarData, nickData) }, handleFighterUpdateSuccess(avatarData, nickData) { const ossImageUrl = app.globalData.ossImageUrl || '' let avatarUrl = this.data.avatarUrl let originalAvatar = this.data.originalAvatar let originalNicheng = this.data.originalNicheng let nicheng = this.data.nicheng if (avatarData && avatarData.touxiang != null) { wx.setStorageSync('touxiang', avatarData.touxiang) originalAvatar = avatarData.touxiang avatarUrl = avatarData.touxiang.startsWith('http') ? avatarData.touxiang : `${ossImageUrl}${avatarData.touxiang}` } if (nickData) { const newNick = nickData.nicheng != null ? nickData.nicheng : nicheng nicheng = newNick originalNicheng = newNick wx.setStorageSync('dsnc', newNick) app.globalData.dashouNicheng = newNick if (nickData.dianhua != null) wx.setStorageSync('dsdianhua', nickData.dianhua || '') if (nickData.wechat != null) wx.setStorageSync('dsweixin', nickData.wechat || '') if (nickData.jieshao != null) wx.setStorageSync('dsjieshao', nickData.jieshao || '') } this.setData({ avatarUrl, nicheng, originalAvatar, originalNicheng, newAvatarFile: null, hasChanges: false, _dsDianhua: wx.getStorageSync('dsdianhua') || this.data._dsDianhua, _dsWeixin: wx.getStorageSync('dsweixin') || this.data._dsWeixin, _dsJieshao: wx.getStorageSync('dsjieshao') || this.data._dsJieshao, }) wx.showToast({ title: '保存成功', icon: 'success', duration: 2000 }) }, async handleUpdateSuccess(updateData) { if (updateData.touxiang !== undefined && updateData.touxiang !== null) { wx.setStorageSync('touxiang', updateData.touxiang) } if (updateData.nicheng !== undefined && updateData.nicheng !== null) { wx.setStorageSync('nicheng', updateData.nicheng) } if (updateData.nicheng) { app.globalData.userNicheng = updateData.nicheng } const ossImageUrl = app.globalData.ossImageUrl || '' let avatarUrl = this.data.avatarUrl if (updateData.touxiang) { avatarUrl = updateData.touxiang.startsWith('http') ? updateData.touxiang : `${ossImageUrl}${updateData.touxiang}` } this.setData({ avatarUrl, originalAvatar: updateData.touxiang || this.data.originalAvatar, originalNicheng: updateData.nicheng || this.data.originalNicheng, newAvatarFile: null, hasChanges: false, }) wx.showToast({ title: '保存成功', icon: 'success', duration: 2000 }) }, })