更新时间:2025年11月2日
状态:✅ 已完成多层降级方案
导航条显示"未知用户",因为 Profile 表中没有存储用户的姓名信息。
我实现了 5 层降级方案,确保无论什么情况都能显示有意义的用户名:
层级 1: Profile 表字段
├─ profile.name
├─ profile.realname
├─ profile.username
└─ profile.nickname
层级 2: 浏览器存储
├─ localStorage.wxwork_userInfo
├─ localStorage.userInfo
└─ sessionStorage.userInfo
层级 3: 企微 API
└─ wxAuth.getUserInfo()
层级 4: Parse User 对象
└─ currentUser.username
层级 5: 使用 userid 生成
└─ "设计师-{userid前6位}"
private getUserInfoFromBrowser(): any {
// 尝试从 localStorage 获取
const userInfoStr = localStorage.getItem('wxwork_userInfo')
|| localStorage.getItem('userInfo');
if (userInfoStr) {
return JSON.parse(userInfoStr);
}
// 尝试从 sessionStorage 获取
const sessionUserInfoStr = sessionStorage.getItem('wxwork_userInfo');
if (sessionUserInfoStr) {
return JSON.parse(sessionUserInfoStr);
}
return null;
}
private generateNameFromUserid(userid: string): string {
if (!userid) return '未知用户';
// 例如:woAs2qCQAA... -> 设计师-woAs2q
const shortId = userid.slice(0, 6);
return `设计师-${shortId}`;
}
private async syncWxworkUserInfo(profile: FmodeObject): Promise<void> {
// 如果 Profile 已有用户名,跳过
if (profile.get('name')) return;
// 方案1: 从浏览器获取
const browserUserInfo = this.getUserInfoFromBrowser();
// 方案2: 从企微 API 获取
if (!browserUserInfo) {
userInfo = await this.wxAuth?.getUserInfo();
}
// 更新并保存 Profile
if (userInfo?.name) {
profile.set('name', userInfo.name);
profile.set('realname', userInfo.name);
await profile.save();
}
}
按 Ctrl+Shift+R (Windows) 或 Cmd+Shift+R (Mac)
🔄 开始同步企微用户信息...
📋 从 localStorage 获取用户信息: {name: '王刚', ...}
✅ 设置用户名: 王刚
✅ 用户信息已同步到 Profile
📋 从浏览器获取用户信息成功: {name: '王刚', ...}
✅ 用户信息映射完成: {name: '王刚', roleName: '组员'}
⚠️ 浏览器中未找到企微用户信息
⚠️ 企微 API 获取用户信息失败
📋 使用 userid 生成显示名: 设计师-woAs2q
✅ 用户信息映射完成: {name: '设计师-woAs2q', roleName: '组员'}
┌─────────────────────────────────────────────────────────┐
│ 设计师工作台 2025年11月2日星期六 [头像] 王刚 [组员] │ (紫色渐变)
└─────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────┐
│ 设计师工作台 2025年11月2日星期六 [头像] 设计师-woAs2q [组员] │ (紫色渐变)
└───────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ 设计师工作台 2025年11月2日星期六 [头像] 未知用户 [组员] │ (紫色渐变)
└──────────────────────────────────────────────────────────────┘
开始
↓
Profile 有 name/realname?
├─ 是 → ✅ 使用 Profile.name
└─ 否 → 继续
↓
localStorage 有 userInfo?
├─ 是 → ✅ 使用 localStorage.userInfo.name
└─ 否 → 继续
↓
wxAuth.getUserInfo() 成功?
├─ 是 → ✅ 使用 API 返回的 name
└─ 否 → 继续
↓
有 userid?
├─ 是 → ✅ 使用 "设计师-{userid前6位}"
└─ 否 → ⚠️ 显示 "未知用户"
刷新页面后,请检查控制台中的这些日志:
🔄 开始同步企微用户信息...
📋 从 localStorage 获取用户信息: {...}
✅ 设置用户名: xxx
✅ 设置头像: xxx
✅ 用户信息已同步到 Profile
📋 Profile 字段调试: {
name: '王刚',
realname: '王刚',
avatar: 'http://...',
最终使用的name: '王刚',
最终使用的avatar: 'http://...'
}
✅ 用户信息映射完成: {userid: '...', name: '王刚', ...}
5 层降级方案确保总能显示有意义的名称
首次访问时自动同步企微用户信息到 Profile
即使没有真实姓名,也显示 设计师-xxxxx,而不是"未知用户"
手动输入姓名
从项目记录反推
企微权限申请
统一用户信息管理
会导致企微认证失效,只需刷新页面即可
所有以 📋、✅、⚠️、❌ 开头的日志都很重要
一旦获取到真实姓名,会自动更新
如果无法获取真实头像,会显示带名称首字母的彩色头像
通过多层降级方案,我们确保了:
✅ 永远不会显示空白或错误
✅ 优先使用真实姓名
✅ 降级方案友好可读
✅ 自动同步用户信息
✅ 性能优化,减少 API 调用
现在请刷新页面,查看效果!🚀
最差情况下会显示:设计师-woAs2q [组员]
最佳情况下会显示:王刚 [组员]