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

个人中心看起来是头像加几行菜单,背后却集中了身份、授权、资料同步和登录过期处理。本篇把“我是谁”这件事从页面一直追到请求层。
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 标签,而是一整支认证小队。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!





























