feat(ui): 记录页月份联动与多项 UI 美化/修复
- records: 底部列表与月份选择器联动,新增 [本月|最近] 分段控件;标题/空态随模式切换 - leaderboard: 领奖台布局(冠军居中+皇冠)、次数标注于底座且三档水平对齐;头像 cloud:// 批量预解析提速(云函数需重新部署) - index/timer: 主色底图标改白色变体修复隐形;目标数字按微信字体缩放补偿真机遮挡 - settings: 配色方案横滑渐变色卡;头像上传前压缩至 200px - theme: 新增 teal 主题;暗黑背景统一对齐 - 圆形头像双保险(image 自身 border-radius)修复月/年榜方图 注: cloudfunctions/leaderboard 改动须在开发者工具重新部署才生效。
This commit is contained in:
@@ -194,12 +194,37 @@ Page({
|
||||
*/
|
||||
async _uploadAvatar(filePath) {
|
||||
if (!cloud.enabled) throw new Error('cloud not enabled')
|
||||
// Shrink the chosen avatar (chooseAvatar returns a full-res PNG) before
|
||||
// upload — a 200px-wide file is tens of KB vs the original's MB, which
|
||||
// is what lets remote avatars load in well under a second on the
|
||||
// leaderboard. Falls back to the original file if compression is
|
||||
// unavailable (e.g. old base lib / devtools) so upload never breaks.
|
||||
const compressed = await this._compressAvatar(filePath)
|
||||
const cloudPath = `avatar/${Date.now()}-${Math.floor(Math.random() * 1e6)}.png`
|
||||
const res = await wx.cloud.uploadFile({ cloudPath, filePath })
|
||||
const res = await wx.cloud.uploadFile({ cloudPath, filePath: compressed })
|
||||
if (!res || !res.fileID) throw new Error('uploadFile returned no fileID')
|
||||
return res.fileID
|
||||
},
|
||||
|
||||
/**
|
||||
* Compress an avatar temp file to ~200px wide before upload. Uses
|
||||
* wx.compressImage (base lib 2.21.0+ honours `compressedWidth`; older
|
||||
* libs ignore it and just apply `quality`, still a win). Resolves to the
|
||||
* original path on any failure so the caller degrades gracefully.
|
||||
*/
|
||||
_compressAvatar(filePath) {
|
||||
return new Promise((resolve) => {
|
||||
if (!wx.compressImage || !filePath) { resolve(filePath); return }
|
||||
wx.compressImage({
|
||||
src: filePath,
|
||||
quality: 80,
|
||||
compressedWidth: 200,
|
||||
success: (res) => resolve((res && res.tempFilePath) || filePath),
|
||||
fail: () => resolve(filePath)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
onNicknameBlur(e) {
|
||||
const value = (e.detail.value || '').trim()
|
||||
if (!value) return
|
||||
|
||||
Reference in New Issue
Block a user