为身份激活页面添加混合模式表单:
实现"自动获取 + 选择性编辑"的最佳平衡。
2025年11月3日
| 字段名 | 类型 | 必填 | 可编辑 | 数据来源 |
|---|---|---|---|---|
| 真实姓名 | 文本输入 | ✅ | ✅ | 企微自动填充,可修改 |
| 手机号 | 电话输入 | ❌ | ✅ | 企微自动填充,可修改 |
| 所属部门 | 只读显示 | - | ❌ | 企微自动获取 |
| 职位角色 | 只读显示 | - | ❌ | 企微自动获取 |
| 员工ID | 只读显示 | - | ❌ | 企微自动获取 |
┌─────────────────────────────────────┐
│ 用户身份确认 │
│ 请确认您的身份信息 │
├─────────────────────────────────────┤
│ [头像] │
│ 张设计师 │
│ 组员 │
├─────────────────────────────────────┤
│ 真实姓名 * │
│ [张设计师 ] ← 可编辑 ✏️ │
│ │
│ 所属部门 │
│ [设计部 ] ← 只读 🔒 │
│ │
│ 职位角色 │
│ [组员 ] ← 只读 🔒 │
│ │
│ 手机号 │
│ [13800138000 ] ← 可编辑 ✏️ │
│ │
│ 员工ID │
│ [test_user_001 ] ← 只读 🔒 │
├─────────────────────────────────────┤
│ [✓ 确认身份] │
└─────────────────────────────────────┘
profile-activation.component.ts只保留可编辑字段:
// 可编辑的表单字段(只有姓名和手机号可编辑)
formData = {
realname: '',
mobile: ''
};
departmentList 数组(不需要下拉选择)roleList 数组(不需要下拉选择)formData.department(由企微自动同步)formData.roleName(由企微自动同步)populateFormData() 方法(第139-153行)只填充可编辑字段:
private populateFormData(): void {
// 优先从Profile获取,其次从企微userInfo获取
this.formData.realname = this.profile?.get('realname') ||
this.profile?.get('name') ||
this.userInfo?.name || '';
this.formData.mobile = this.profile?.get('mobile') ||
this.userInfo?.mobile || '';
console.log('📝 自动填充表单数据:', this.formData);
}
只验证姓名:
// 表单验证(只验证必填的姓名)
if (!this.formData.realname?.trim()) {
alert('请填写您的真实姓名');
return;
}
只保存用户可编辑的字段:
// 保存用户编辑的信息(只保存姓名和手机号,部门和角色由企微自动同步)
this.profile.set('realname', this.formData.realname);
this.profile.set('name', this.formData.realname); // 同时更新name字段
if (this.formData.mobile) {
this.profile.set('mobile', this.formData.mobile);
}
await this.profile.save();
console.log('✅ 用户信息已保存:', {
realname: this.formData.realname,
mobile: this.formData.mobile
});
profile-activation.component.html<div class="form-container">
<!-- 真实姓名:可编辑 -->
<div class="form-group">
<label class="form-label">
<span class="label-text">真实姓名</span>
<span class="required">*</span>
</label>
<input
type="text"
class="form-input"
[(ngModel)]="formData.realname"
placeholder="请输入您的真实姓名"
required />
</div>
<!-- 所属部门:只读 -->
<div class="form-group readonly">
<label class="form-label">
<span class="label-text">所属部门</span>
</label>
<div class="readonly-value">{{ getDepartment() }}</div>
</div>
<!-- 职位角色:只读 -->
<div class="form-group readonly">
<label class="form-label">
<span class="label-text">职位角色</span>
</label>
<div class="readonly-value">{{ getUserRole() }}</div>
</div>
<!-- 手机号:可编辑 -->
<div class="form-group">
<label class="form-label">
<span class="label-text">手机号</span>
</label>
<input
type="tel"
class="form-input"
[(ngModel)]="formData.mobile"
placeholder="请输入手机号" />
</div>
<!-- 员工ID:只读 -->
<div class="form-group readonly">
<label class="form-label">
<span class="label-text">员工ID</span>
</label>
<div class="readonly-value">{{ getUserId() }}</div>
</div>
</div>
使用原有方法获取角色:
<h2 class="user-name">{{ formData.realname || '请填写姓名' }}</h2>
<p class="user-role">{{ getUserRole() }}</p>
profile-activation.component.scss样式保持不变,已包含:
.form-input - 可编辑输入框样式.form-group.readonly - 只读字段灰色背景样式.readonly-value - 只读内容样式以下方法保持原有逻辑,用于获取企微数据:
getDepartment()(第368-393行)
getUserRole()(第361-363行)
roleNamegetUserId()(第398-400行)
useridgetUserAvatar()(第341-346行)
getUserName()(第351-356行)
realname页面加载
↓
initAuth() - 初始化企微认证
↓
获取企微用户信息
├─ userid
├─ name
├─ mobile
├─ department (数组/对象/字符串)
└─ avatar
↓
checkActivationStatus() - 查询Profile
↓
populateFormData() - 自动填充
├─ formData.realname = userInfo.name ✅
└─ formData.mobile = userInfo.mobile ✅
↓
显示表单
├─ 姓名输入框(已填充)✏️
├─ 部门只读框(getDepartment())🔒
├─ 角色只读框(getUserRole())🔒
├─ 手机输入框(已填充)✏️
└─ ID只读框(getUserId())🔒
用户编辑姓名/手机号
↓
点击"确认身份"
↓
验证 realname 非空
↓
confirmActivation()
↓
wxAuth.syncUserInfo()
├─ 自动同步企微 department
├─ 自动同步企微 roleName
└─ 自动同步企微 userid
↓
保存用户编辑的字段
├─ profile.set('realname', formData.realname) ✏️
├─ profile.set('name', formData.realname) ✏️
└─ profile.set('mobile', formData.mobile) ✏️
↓
设置激活标记
├─ isActivated = true
└─ activatedAt = new Date()
↓
激活成功
departmentList 列表roleList 列表/wxwork/test/activation[1, 2]getDepartment() 处理为"部门1" ✅在 confirmActivation() 中调用:
// 生产模式:同步用户信息
this.profile = await this.wxAuth!.syncUserInfo(this.userInfo);
自动同步以下企微字段:
userid - 员工IDdepartment - 部门信息roleName - 角色/职位avatar - 头像用户编辑的字段后续覆盖:
realname - 用户填写的真实姓名mobile - 用户填写的手机号这样既保证了企微数据的准确性,又允许用户完善个人信息。
点击"确认身份"后,Profile表保存的数据:
{
// 企微自动同步
userid: "WangGang001",
department: "设计部",
roleName: "组员",
avatar: "https://...",
// 用户可编辑(覆盖企微数据)
realname: "王刚", // 用户修改
name: "王刚", // 同步更新
mobile: "13900139000", // 用户修改
// 系统字段
isActivated: true,
activatedAt: "2025-11-03T12:00:00.000Z"
}
最终方案实现了"企微自动同步 + 用户选择性编辑"的完美平衡:
这种设计既保证了数据的规范性和一致性,又给用户提供了必要的灵活性,是企业内部系统的最佳实践。