小程序开发日记③:个人中心、登录与资料维护

1163 字
6 分钟
小程序开发日记③:个人中心、登录与资料维护

个人中心看起来是头像加几行菜单,背后却集中了身份、授权、资料同步和登录过期处理。本篇把“我是谁”这件事从页面一直追到请求层。

1. 未登录与已登录是两套体验#

未登录用户可以浏览一级页面,但访问地址簿、订单和消息时会被引导进行手机号授权。登录后,个人中心展示头像、昵称、脱敏手机号、进行中订单和历史订单数量。

const maskedMobile = computed(() => {
const mobile = String(auth.mobile || '')
return /^(\d{3})\d{4}(\d{4})$/.test(mobile)
? mobile.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2')
: mobile || '未绑定手机号'
})

脱敏不应依赖模板截字符串,统一计算属性更容易复用和测试。

2. Auth Store 的职责#

store/modules/auth.js 保存 token、用户资料和头像临时地址,并暴露登录、退出、刷新资料、修改昵称和上传头像的方法。

const isLogin = computed(() => !!token.value)
const userId = computed(() => userInfo.value?.userId || null)
const nickname = computed(() => userInfo.value?.nickname || DEFAULT_USER_NICKNAME)

页面不直接操作本地存储。Store 在登录成功后同时更新响应式状态和持久化数据,退出时清理 token、资料与鉴权图片缓存。

3. 微信登录和手机号授权#

登录流程由 wxLoginFlow 与 phoneLoginFlow 封装。页面只负责获得授权事件并触发流程:

wx.login 获取临时 code
↓
手机号授权凭证
↓
后端换取 token 与用户资料
↓
保存认证状态并刷新头像

把平台 API 包装在 utils/wx 中,可以避免页面里到处出现回调式代码,也方便处理用户拒绝授权、会话失效等分支。

4. Token 失效后的刷新#

请求层遇到 401 时,若存在 token 和刷新器,会尝试刷新并重放原请求。多个请求同时 401 时共用一个 refreshPromise:

if (!refreshPromise) {
refreshPromise = tokenRefresher()
.finally(() => { refreshPromise = null })
}
return refreshPromise

这叫“单飞”控制。否则首页、消息和个人资料可能同时刷新三次 token,后端刚发的新 token 又被后一个响应覆盖。

刷新失败后统一清理认证并弹出登录提示,页面不需要各写一套 401 处理。

5. 头像为什么要鉴权下载#

头像接口不是公开静态地址,需要携带 token 获取临时文件。Store 使用 getAuthenticatedImage 下载,并维护缓存键 current-user-avatar。

上传新头像后,页面直接采用上传接口返回的最新资料,再强制刷新临时图。头像刷新使用 Promise 链串行执行:

avatarRefreshChain = avatarRefreshChain
.catch(() => '')
.then(() => getAuthenticatedImage(url, { cacheKey, force: true }))

这是为了避免 onShow 的旧请求晚于上传后的新请求返回,把新头像又覆盖回旧图。

6. 昵称和订单统计#

昵称通过小程序昵称输入能力采集,提交前执行长度和内容校验。保存成功后重新拉取 profile,以服务端结果为准。

个人中心的进行中/历史订单统计来自完整订单列表,再通过 isHistoryOrder 分类:

orderStats.value = orders.reduce((stats, order) => {
if (isHistoryOrder(order)) stats.history += 1
else stats.active += 1
return stats
}, { active: 0, history: 0 })

下拉刷新时资料与统计通过 Promise.allSettled 并行加载,一项失败不影响另一项更新。

7. 本篇小结#

请求登录的时机#

登录弹窗不是应用一打开就出现。首页允许游客先了解服务,只有访问订单、地址、消息等需要身份的能力时才调用 requestPhoneLogin,并给出当前动作需要登录的原因。这样的授权更符合微信小程序的交互要求,也比无缘无故索要手机号更容易被理解。

退出登录清理什么#

退出时除了 token,还要清理用户资料、头像临时文件缓存、消息列表和可能残留的业务 Store。下次其他账号登录后,不能短暂看到上一位用户的头像或消息。公共配置和未提交的游客页面状态则不必一股脑删除。

个人资料接口失败时保留本地已有资料并提示刷新失败,不把头像和昵称突然清空。认证失败与普通网络失败要区别处理:前者引导重新登录,后者允许重试。

个人中心是用户身份的总入口,也最容易被并发和缓存捉弄。处理完登录、头像和资料刷新后,我终于理解:一张圆圆的头像背后,站着的不是一个 image 标签,而是一整支认证小队。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
小程序开发日记③:个人中心、登录与资料维护
https://firefly.cuteleaf.cn/posts/mmp-dev-diary-3/
作者
Yore
发布于
2026-08-10
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Yore
Hello, I'm Yore.
公告
欢迎来到Yore的博客!本站基于原创作者夏叶的博客网站模版创作。
分类
标签
最新动态
站点统计
文章
51
分类
2
标签
124
总字数
94,115
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.15.0
文章许可
CC BY-NC-SA 4.0