318 lines
8.0 KiB
JavaScript
318 lines
8.0 KiB
JavaScript
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()
|
||
|
||
// 如果当前门店有 ladderUserId,确保获取该门店的天梯用户信息
|
||
if (app.globalData.currentStore?.storeId && !app.globalData.ladderUser) {
|
||
try {
|
||
await app.getLadderUser(app.globalData.currentStore.storeId)
|
||
} catch (e) {
|
||
console.error('获取天梯用户信息失败:', e)
|
||
}
|
||
}
|
||
|
||
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() {
|
||
// 空函数,仅用于阻止事件冒泡
|
||
}
|
||
})
|