kydc/me/me.js

195 lines
7.0 KiB
JavaScript
Raw Normal View History

2026-04-18 17:16:49 +08:00
const app = getApp()
Page({
data: {
name: '',
2026-04-23 11:34:54 +08:00
nickname: '',
2026-04-18 17:16:49 +08:00
days: 0,
badges: 0,
openid: '',
2026-04-23 11:34:54 +08:00
avatarUrl: '',
2026-04-19 11:56:49 +08:00
loading: false,
error: '',
2026-04-23 11:34:54 +08:00
showNicknameModal: false,
nicknameDraft: '',
2026-04-18 17:16:49 +08:00
},
onShow() {
this.loadProfile()
},
2026-04-19 11:56:49 +08:00
async loadProfile() {
this.setData({ loading: true, error: '' })
await app.ensureLogin()
if (!app.globalData.openid) {
2026-05-03 23:02:26 +08:00
this.setData({ loading: false, error: '????????' })
2026-04-19 11:56:49 +08:00
return
}
2026-04-23 11:34:54 +08:00
wx.request({
url: `${app.globalData.baseUrl}/api/v1/auth/profile`,
method: 'GET',
data: { openid: app.globalData.openid },
success: (res) => {
const profile = res.data?.data || {}
const avatarUrl = profile.avatar_url || wx.getStorageSync(`avatarUrl:${app.globalData.openid}`) || ''
2026-05-03 23:02:26 +08:00
const nickname = profile.nickname || '????'
2026-04-23 11:34:54 +08:00
const normalizedAvatar = avatarUrl.startsWith('http') ? avatarUrl : avatarUrl ? `${app.globalData.baseUrl}${avatarUrl}` : ''
this.setData({
openid: app.globalData.openid,
name: nickname,
nickname,
avatarUrl: normalizedAvatar,
nicknameDraft: nickname,
})
},
fail: () => {
const storedAvatarUrl = wx.getStorageSync(`avatarUrl:${app.globalData.openid}`) || ''
const normalizedAvatar = storedAvatarUrl.startsWith('http') ? storedAvatarUrl : storedAvatarUrl ? `${app.globalData.baseUrl}${storedAvatarUrl}` : ''
2026-05-03 23:02:26 +08:00
this.setData({ openid: app.globalData.openid, name: '????', nickname: '????', avatarUrl: normalizedAvatar, nicknameDraft: '????' })
2026-04-23 11:34:54 +08:00
},
complete: () => {
this.loadAchievements()
this.setData({ loading: false })
},
})
},
openNicknameModal() {
2026-05-03 23:02:26 +08:00
this.setData({ showNicknameModal: true, nicknameDraft: this.data.nickname || this.data.name || '????' })
2026-04-23 11:34:54 +08:00
},
onAvatarError() {
this.setData({ avatarUrl: '' })
},
closeNicknameModal() {
2026-05-03 23:02:26 +08:00
this.setData({ showNicknameModal: false, nicknameDraft: this.data.nickname || this.data.name || '????' })
2026-04-23 11:34:54 +08:00
},
onNicknameInput(e) {
this.setData({ nicknameDraft: e.detail.value })
},
saveNickname() {
if (!app.globalData.openid) return
const nickname = (this.data.nicknameDraft || '').trim()
if (!nickname) {
2026-05-03 23:02:26 +08:00
wx.showToast({ title: '??????', icon: 'none' })
2026-04-23 11:34:54 +08:00
return
}
wx.request({
url: `${app.globalData.baseUrl}/api/v1/auth/profile`,
method: 'PUT',
header: { 'Content-Type': 'application/json' },
data: { openid: app.globalData.openid, nickname },
success: (res) => {
const profile = res.data?.data || {}
const nextNickname = profile.nickname || nickname
this.setData({ nickname: nextNickname, name: nextNickname, nicknameDraft: nextNickname, showNicknameModal: false })
2026-05-03 23:02:26 +08:00
wx.showToast({ title: '?????', icon: 'success' })
2026-04-23 11:34:54 +08:00
},
2026-05-03 23:02:26 +08:00
fail: () => wx.showToast({ title: '????', icon: 'none' }),
2026-04-23 11:34:54 +08:00
})
},
chooseAvatar() {
if (!app.globalData.openid) {
2026-05-03 23:02:26 +08:00
wx.showToast({ title: '????', icon: 'none' })
2026-04-23 11:34:54 +08:00
return
}
wx.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const localPath = res.tempFilePaths?.[0] || ''
if (!localPath) return
wx.getImageInfo({
src: localPath,
success: (info) => {
const size = 320
const side = Math.min(info.width, info.height)
const x = Math.max(0, Math.floor((info.width - side) / 2))
const y = Math.max(0, Math.floor((info.height - side) / 2))
const ctx = wx.createCanvasContext('avatar-canvas', this)
ctx.clearRect(0, 0, size, size)
ctx.save()
ctx.beginPath()
ctx.arc(size / 2, size / 2, size / 2, 0, 2 * Math.PI)
ctx.clip()
ctx.drawImage(localPath, x, y, side, side, 0, 0, size, size)
ctx.draw(false, () => {
wx.canvasToTempFilePath({
canvasId: 'avatar-canvas',
width: size,
height: size,
destWidth: size,
destHeight: size,
quality: 0.85,
success: (canvasRes) => {
const uploadPath = canvasRes.tempFilePath || localPath
wx.uploadFile({
url: `${app.globalData.baseUrl}/api/v1/auth/avatar?openid=${encodeURIComponent(app.globalData.openid)}`,
filePath: uploadPath,
name: 'file',
success: (uploadRes) => {
try {
const payload = JSON.parse(uploadRes.data)
const avatarUrl = payload?.data?.avatar_url || ''
if (!avatarUrl) throw new Error('missing avatar_url')
const fullUrl = avatarUrl.startsWith('http') ? avatarUrl : `${app.globalData.baseUrl}${avatarUrl}`
wx.setStorageSync(`avatarUrl:${app.globalData.openid}`, fullUrl)
this.setData({ avatarUrl: fullUrl })
wx.request({
url: `${app.globalData.baseUrl}/api/v1/auth/profile`,
method: 'GET',
data: { openid: app.globalData.openid },
success: (profileRes) => {
const profile = profileRes.data?.data || {}
2026-05-03 23:02:26 +08:00
const nextNickname = profile.nickname || '????'
2026-04-23 11:34:54 +08:00
this.setData({ name: nextNickname, avatarUrl: fullUrl })
},
})
2026-05-03 23:02:26 +08:00
wx.showToast({ title: '?????', icon: 'success' })
2026-04-23 11:34:54 +08:00
} catch (err) {
2026-05-03 23:02:26 +08:00
wx.showToast({ title: '??????', icon: 'none' })
2026-04-23 11:34:54 +08:00
}
},
2026-05-03 23:02:26 +08:00
fail: () => wx.showToast({ title: '??????', icon: 'none' }),
2026-04-23 11:34:54 +08:00
})
},
2026-05-03 23:02:26 +08:00
fail: () => wx.showToast({ title: '??????', icon: 'none' }),
2026-04-23 11:34:54 +08:00
}, this)
})
},
2026-05-03 23:02:26 +08:00
fail: () => wx.showToast({ title: '??????', icon: 'none' }),
2026-04-23 11:34:54 +08:00
})
},
})
2026-04-19 11:56:49 +08:00
},
loadAchievements() {
if (!app.globalData.openid) {
2026-05-03 23:02:26 +08:00
this.setData({ error: '???????' })
2026-04-19 11:56:49 +08:00
return
}
wx.request({
url: `${app.globalData.baseUrl}/api/v1/achievements`,
2026-04-19 11:56:49 +08:00
header: { 'X-OpenID': app.globalData.openid },
success: (res) => {
2026-04-19 11:56:49 +08:00
const list = res.data?.data || []
const badges = Array.isArray(list) ? list.filter((i) => i.is_unlocked).length : 0
this.setData({ badges })
},
2026-05-03 23:02:26 +08:00
fail: () => this.setData({ error: '????????' }),
2026-04-18 17:16:49 +08:00
})
},
goTo(e) {
const { url } = e.currentTarget.dataset
2026-04-19 11:56:49 +08:00
if (!app.globalData.openid) {
2026-05-03 23:02:26 +08:00
wx.showToast({ title: '????', icon: 'none' })
2026-04-19 11:56:49 +08:00
return
}
2026-04-18 17:16:49 +08:00
wx.navigateTo({ url })
},
goHome() {
2026-04-19 16:39:02 +08:00
wx.reLaunch({ url: '/pages/index/index' })
2026-04-18 17:16:49 +08:00
},
2026-04-19 16:39:02 +08:00
goToReview() {
wx.navigateTo({ url: '/pages/review-config/review-config' })
},
goToMe() {},
2026-04-23 11:34:54 +08:00
noop() {},
2026-04-18 17:16:49 +08:00
})