Files
huihuiSquare/overview-nickname-prefill-fix-2026-07-21.md
2026-07-24 14:04:21 +08:00

2.4 KiB
Raw Permalink Blame History

创建分身未预填登录昵称 — 根因与修复

现象

登录成功后,进入「创建数字分身」,分身名称 / 显示名称没有默认填入当前登录用户的昵称; 而仪表盘(数字分身管理)却正常显示该昵称。两者读数不一致。

根因(前端取值优先级 bug

AvatarCreate.vueonMounted 原逻辑:

const profile = avatarStore.userProfile || userStore.user
const nick = profile?.nickname
  • avatarStore.userProfile 是一个 truthy 对象(即使昵称为空字符串),会抢在真正含昵称的 userStore.user(登录会话 + localStorage 持久化)之前被选中。
  • src/main.ts 在应用启动时执行 setNativeProfile({ nickname: userStore.user.nickname || '' }) 当 localStorage 里是旧会话、昵称为空时,会把一个「空昵称对象」写进 userProfile
  • 于是 profile.nickname === '',创建页不预填;仪表盘直接读 userStore.user 所以照常显示。

DB 实证:avatar-test 容器内 /app/avatar.dbusers 表确有真实昵称(如 猜猜我是谁)与真实头像 URL —— 数据本身没问题,纯前端取值优先级问题。

修复

文件:digital-avatar-app/src/views/AvatarCreate.vue

  1. onMounted 改为 优先 userStore.useravatarStore.userProfile 仅作兜底
    const real = userStore.user
    const native = avatarStore.userProfile
    const nick = real?.nickname || native?.nickname || ''
    const avatar = real?.avatarUrl || native?.avatarUrl || ''
    
  2. userAvatarUrl 计算属性同样改为优先 userStore.user.avatarUrl
  3. 兜底:本地两者皆空且已登录时,调用 getCurrentUser()GET /huihui/me,读 DB 权威值)补拉真实昵称/头像。

部署与验证

  • ./node_modules/.bin/vite build → 新 chunk AvatarCreate-CNMENOcc.js
  • 部署到测试环境 geo-serverrsync dist/docker cpavatar-test-frontend:/usr/share/nginx/html/
  • 容器内清理旧 AvatarCreate 孤儿 chunkBw_iuiqc.js 等多份历史残留)
  • 验证:首页 HTTP 200线上 chunk 含 displayName 预填逻辑

经验

前端「当前用户资料」应统一以 userStore.user登录会话、localStorage 持久化)为权威源; avatarStore.userProfile(原生壳注入 / 启动桥接)是可空、可被空值覆盖的派生源,绝不能放在 || 左侧优先。