Files
soul-yongping/miniprogram/pages/settings/settings.js
2026-03-07 22:58:43 +08:00

451 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Soul创业派对 - 设置页
* 账号绑定功能
*/
const app = getApp()
Page({
data: {
statusBarHeight: 44,
isLoggedIn: false,
userInfo: null,
version: '1.0.0',
// 绑定信息
phoneNumber: '',
wechatId: '',
alipayAccount: '',
address: '',
// 自动提现(默认开启)
autoWithdrawEnabled: true,
// 绑定弹窗
showBindModal: false,
bindType: '', // phone | wechat | alipay
bindValue: ''
},
onLoad() {
wx.showShareMenu({ withShareTimeline: true })
this.setData({
statusBarHeight: app.globalData.statusBarHeight,
isLoggedIn: app.globalData.isLoggedIn,
userInfo: app.globalData.userInfo
})
this.loadBindingInfo()
},
onShow() {
this.loadBindingInfo()
},
// 加载绑定信息
loadBindingInfo() {
const { userInfo, isLoggedIn } = app.globalData
if (isLoggedIn && userInfo) {
// 从本地存储或用户信息中获取绑定数据
const phoneNumber = wx.getStorageSync('user_phone') || userInfo.phone || ''
const wechatId = wx.getStorageSync('user_wechat') || userInfo.wechat || ''
const alipayAccount = wx.getStorageSync('user_alipay') || userInfo.alipay || ''
const address = wx.getStorageSync('user_address') || userInfo.address || ''
// 默认开启自动提现
const autoWithdrawEnabled = wx.getStorageSync('auto_withdraw_enabled') !== false
this.setData({
isLoggedIn: true,
userInfo,
phoneNumber,
wechatId,
alipayAccount,
address,
autoWithdrawEnabled
})
}
},
// 切换自动提现
async toggleAutoWithdraw(e) {
const enabled = e.detail.value
// 检查是否绑定了支付方式
if (enabled && !this.data.wechatId && !this.data.alipayAccount) {
wx.showToast({ title: '请先绑定微信号或支付宝', icon: 'none' })
this.setData({ autoWithdrawEnabled: false })
return
}
// 开启时需要确认
if (enabled) {
wx.showModal({
title: '开启自动提现',
content: `收益将自动打款到您的${this.data.alipayAccount ? '支付宝' : '微信'}账户,确认开启吗?`,
success: async (res) => {
if (res.confirm) {
this.setData({ autoWithdrawEnabled: true })
wx.setStorageSync('auto_withdraw_enabled', true)
// 同步到服务器
try {
await app.request('/api/miniprogram/user/update', {
method: 'POST',
data: {
userId: app.globalData.userInfo?.id,
autoWithdraw: true,
withdrawAccount: this.data.alipayAccount || this.data.wechatId
}
})
} catch (e) {
console.log('同步自动提现设置失败', e)
}
wx.showToast({ title: '已开启自动提现', icon: 'success' })
} else {
this.setData({ autoWithdrawEnabled: false })
}
}
})
} else {
this.setData({ autoWithdrawEnabled: false })
wx.setStorageSync('auto_withdraw_enabled', false)
wx.showToast({ title: '已关闭自动提现', icon: 'success' })
}
},
// 绑定手机号
bindPhone() {
this.setData({
showBindModal: true,
bindType: 'phone',
bindValue: ''
})
},
// 微信号输入
onWechatInput(e) {
this.setData({ wechatId: e.detail.value })
},
// 保存微信号
async saveWechat() {
const { wechatId } = this.data
if (!wechatId || wechatId.length < 6) return
wx.setStorageSync('user_wechat', wechatId)
// 更新用户信息
if (app.globalData.userInfo) {
app.globalData.userInfo.wechat = wechatId
wx.setStorageSync('userInfo', app.globalData.userInfo)
}
// 同步到服务器
try {
await app.request('/api/miniprogram/user/update', {
method: 'POST',
data: {
userId: app.globalData.userInfo?.id,
wechat: wechatId
}
})
wx.showToast({ title: '微信号已保存', icon: 'success' })
} catch (e) {
console.log('保存微信号失败', e)
}
},
// 输入绑定值
onBindInput(e) {
let value = e.detail.value
if (this.data.bindType === 'phone') {
value = value.replace(/\D/g, '').slice(0, 11)
}
this.setData({ bindValue: value })
},
// 确认绑定
confirmBind() {
const { bindType, bindValue } = this.data
if (!bindValue) {
wx.showToast({ title: '请输入内容', icon: 'none' })
return
}
// 验证
if (bindType === 'phone' && !/^1[3-9]\d{9}$/.test(bindValue)) {
wx.showToast({ title: '请输入正确的手机号', icon: 'none' })
return
}
if (bindType === 'wechat' && bindValue.length < 6) {
wx.showToast({ title: '微信号至少6位', icon: 'none' })
return
}
if (bindType === 'alipay' && !bindValue.includes('@') && !/^1[3-9]\d{9}$/.test(bindValue)) {
wx.showToast({ title: '请输入正确的支付宝账号', icon: 'none' })
return
}
// 保存绑定信息到本地
if (bindType === 'phone') {
wx.setStorageSync('user_phone', bindValue)
this.setData({ phoneNumber: bindValue })
} else if (bindType === 'wechat') {
wx.setStorageSync('user_wechat', bindValue)
this.setData({ wechatId: bindValue })
} else if (bindType === 'alipay') {
wx.setStorageSync('user_alipay', bindValue)
this.setData({ alipayAccount: bindValue })
}
// 同步到服务器
this.syncProfileToServer()
this.setData({ showBindModal: false })
wx.showToast({ title: '绑定成功', icon: 'success' })
},
// 同步资料到服务器
async syncProfileToServer() {
try {
const userId = app.globalData.userInfo?.id
if (!userId) return
const res = await app.request('/api/miniprogram/user/profile', {
method: 'POST',
data: {
userId,
phone: this.data.phoneNumber || undefined,
wechatId: this.data.wechatId || undefined
}
})
if (res.success) {
console.log('[Settings] 资料同步成功')
// 更新本地用户信息
if (app.globalData.userInfo) {
app.globalData.userInfo.phone = this.data.phoneNumber
app.globalData.userInfo.wechatId = this.data.wechatId
wx.setStorageSync('userInfo', app.globalData.userInfo)
}
}
} catch (e) {
console.log('[Settings] 资料同步失败:', e)
}
},
// 获取微信头像(新版授权)
async getWechatAvatar() {
try {
const res = await wx.getUserProfile({
desc: '用于完善会员资料'
})
if (res.userInfo) {
const { nickName, avatarUrl: tempAvatarUrl } = res.userInfo
wx.showLoading({ title: '上传中...', mask: true })
// 1. 先上传图片到服务器
console.log('[Settings] 开始上传头像:', tempAvatarUrl)
const uploadRes = await new Promise((resolve, reject) => {
wx.uploadFile({
url: app.globalData.baseUrl + '/api/miniprogram/upload',
filePath: tempAvatarUrl,
name: 'file',
formData: {
folder: 'avatars'
},
success: (uploadResult) => {
try {
const data = JSON.parse(uploadResult.data)
if (data.success) {
resolve(data)
} else {
reject(new Error(data.error || '上传失败'))
}
} catch (err) {
reject(new Error('解析响应失败'))
}
},
fail: (err) => {
reject(err)
}
})
})
// 2. 获取上传后的完整URL
const avatarUrl = app.globalData.baseUrl + uploadRes.data.url
console.log('[Settings] 头像上传成功:', avatarUrl)
// 3. 更新本地
this.setData({
userInfo: {
...this.data.userInfo,
nickname: nickName,
avatar: avatarUrl
}
})
// 4. 同步到服务器数据库
const userId = app.globalData.userInfo?.id
if (userId) {
await app.request('/api/miniprogram/user/profile', {
method: 'POST',
data: { userId, nickname: nickName, avatar: avatarUrl }
})
}
// 5. 更新全局
if (app.globalData.userInfo) {
app.globalData.userInfo.nickname = nickName
app.globalData.userInfo.avatar = avatarUrl
wx.setStorageSync('userInfo', app.globalData.userInfo)
}
wx.hideLoading()
wx.showToast({ title: '头像更新成功', icon: 'success' })
}
} catch (e) {
wx.hideLoading()
console.error('[Settings] 获取头像失败:', e)
wx.showToast({
title: e.message || '获取头像失败',
icon: 'none'
})
}
},
// 一键获取微信手机号button组件回调
async onGetPhoneNumber(e) {
console.log('[Settings] 获取手机号回调:', e.detail)
if (e.detail.errMsg !== 'getPhoneNumber:ok') {
wx.showToast({ title: '授权失败', icon: 'none' })
return
}
try {
// 需要将code发送到服务器解密获取手机号
const code = e.detail.code
if (!code) {
// 如果没有code弹出手动输入
this.bindPhone()
return
}
wx.showLoading({ title: '获取中...', mask: true })
// 调用服务器解密手机号传入userId以便同步到数据库
const userId = app.globalData.userInfo?.id
const res = await app.request('/api/miniprogram/phone', {
method: 'POST',
data: { code, userId }
})
wx.hideLoading()
if (res.success && res.phoneNumber) {
wx.setStorageSync('user_phone', res.phoneNumber)
this.setData({ phoneNumber: res.phoneNumber })
// 更新用户信息
if (app.globalData.userInfo) {
app.globalData.userInfo.phone = res.phoneNumber
wx.setStorageSync('userInfo', app.globalData.userInfo)
}
// 同步到服务器
this.syncProfileToServer()
wx.showToast({ title: '手机号绑定成功', icon: 'success' })
} else {
// 获取失败,弹出手动输入
this.bindPhone()
}
} catch (e) {
wx.hideLoading()
console.log('[Settings] 获取手机号失败:', e)
// 获取失败,弹出手动输入
this.bindPhone()
}
},
// 关闭绑定弹窗
closeBindModal() {
this.setData({ showBindModal: false })
},
// 清除缓存
clearCache() {
wx.showModal({
title: '清除缓存',
content: '确定要清除本地缓存吗?',
success: (res) => {
if (res.confirm) {
// 保留登录信息,只清除其他缓存
const token = wx.getStorageSync('token')
const userInfo = wx.getStorageSync('userInfo')
wx.clearStorageSync()
if (token) wx.setStorageSync('token', token)
if (userInfo) wx.setStorageSync('userInfo', userInfo)
wx.showToast({ title: '缓存已清除', icon: 'success' })
}
}
})
},
// 退出登录
handleLogout() {
wx.showModal({
title: '退出登录',
content: '确定要退出登录吗?',
success: (res) => {
if (res.confirm) {
app.logout()
this.setData({
isLoggedIn: false,
userInfo: null,
phoneNumber: '',
wechatId: '',
alipayAccount: ''
})
wx.showToast({ title: '已退出登录', icon: 'success' })
setTimeout(() => getApp().goBackOrToHome(), 1500)
}
}
})
},
// 联系客服 - 跳转到Soul派对房
contactService() {
wx.showToast({ title: '请在Soul派对房联系客服', icon: 'none' })
},
// 阻止冒泡
stopPropagation() {},
goBack() { getApp().goBackOrToHome() },
// 跳转到地址管理页
goToAddresses() {
wx.navigateTo({ url: '/pages/addresses/addresses' })
},
onShareAppMessage() {
const ref = app.getMyReferralCode()
return {
title: 'Soul创业派对 - 设置',
path: ref ? `/pages/settings/settings?ref=${ref}` : '/pages/settings/settings'
}
},
onShareTimeline() {
const ref = app.getMyReferralCode()
return { title: 'Soul创业派对 - 设置', query: ref ? `ref=${ref}` : '' }
}
})