作为 系统管理员, 我想要 在管理后台的用户管理页面中创建和编辑人才用户, 以便 残疾人能够配置为人才用户并使用身份证号/残疾证号登录人才小程序。
现有系统状态:
personId关联残疾人记录users2表已包含userType字段(支持admin/employer/talent)和personId字段CreateUserDto/UpdateUserDto)已支持userType和personId字段/admin/users,使用@d8d/user-management-ui的UserManagement组件@d8d/allin-disability-person-management-ui/components/DisabledPersonSelector问题分析:
UserManagement组件的创建/编辑表单缺少userType下拉选择器UserManagement组件缺少personId残疾人选择器字段users2记录中的personId关联人才登录流程(史诗015已实现):
身份证号/残疾证号 → disabled_person表 → person_id → users2表 (user_type='talent')
关键依赖:
packages/user-management-ui/src/components/UserManagement.tsx - 需要修改@d8d/allin-disability-person-management-ui/components/DisabledPersonSelector - 已存在packages/core-module/user-module/src/schemas/user.schema.ts - Schema已支持需要添加的字段:
userType='talent'时显示条件渲染逻辑:
复用现有模式:
CompanySelectorWrapper组件模式创建DisabledPersonSelectorWrapper@d8d/allin-disability-person-management-ui/components的DisabledPersonSelectorusers2记录包含正确的userType='talent'和personIdpnpm typecheck)packages/user-management-ui/src/components/下创建DisabledPersonSelectorWrapper.tsxCompanySelectorWrapper.tsx的实现模式@d8d/allin-disability-person-management-ui/components/DisabledPersonSelectormode='single')data-testid测试选择器组件接口设计:
interface DisabledPersonSelectorWrapperProps {
value: number | null; // personId
onChange: (value: number | null) => void;
placeholder?: string;
disabled?: boolean;
}
userType字段(FormField)Select组件实现下拉选择器userType字段userType默认为adminuserType为必填字段data-testid="user-type-select"useWatch或useState监听userType字段变化userType === 'talent'时,显示残疾人选择器userType === 'employer'时,显示企业选择器(已存在)userType === 'admin'时,隐藏企业选择器和残疾人选择器personId字段(FormField)userType === 'talent'时显示DisabledPersonSelectorWrapper组件personId字段data-testid="disabled-person-selector"CreateUserDto包含userType和personId字段UpdateUserDto包含userType和personId字段[ ] 5.3 更新创建表单默认值:
defaultValues: {
...existingFields,
userType: UserType.ADMIN, // 新增
personId: null, // 新增
}
[ ] 5.4 更新编辑表单默认值逻辑,加载现有用户的userType和personId
[ ] 5.5 确保表单提交时包含userType和personId字段
DisabledPersonSelectorWrapper组件测试
UserManagement组件集成测试
pnpm typecheckUserManagement
├── DisabledPersonSelectorWrapper (新建)
│ └── DisabledPersonSelector (已存在,来自@d8d/allin-disability-person-management-ui)
├── CompanySelectorWrapper (已存在)
└── Form, Select,等 (来自@d8d/shared-ui-components)
需要在packages/user-management-ui/package.json中添加:
{
"dependencies": {
"@d8d/allin-disability-person-management-ui": "workspace:*"
}
}
enum UserType {
ADMIN = 'admin', // 管理员
EMPLOYER = 'employer', // 企业用户
TALENT = 'talent' // 人才用户
}
const userType = createForm.watch('userType');
{userType === UserType.TALENT && (
<FormField
control={createForm.control}
name="personId"
render={({ field }) => (
<FormItem>
<FormLabel>关联残疾人</FormLabel>
<FormControl>
<DisabledPersonSelectorWrapper
value={field.value}
onChange={field.onChange}
placeholder="请选择残疾人"
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
)}
风险1: 残疾人选择器API不兼容
DisabledPersonSelector组件的props接口,必要时创建适配器风险2: 表单验证逻辑复杂
风险3: 现有功能回归
风险4: 数据一致性
userType和personId字段的关联关系DisabledPersonSelectorWrapper包装组件,参考了CompanySelectorWrapper的设计模式createForm.watch('userType')和updateForm.watch('userType')实现动态字段显示?? null处理Schema中可能为undefined的字段,确保组件类型兼容packages/user-management-ui/src/components/DisabledPersonSelectorWrapper.tsxpackages/user-management-ui/src/components/UserManagement.tsx - 添加userType字段和条件渲染packages/user-management-ui/src/components/index.ts - 导出新组件packages/user-management-ui/package.json - 添加依赖packages/core-module/user-module/src/routes/user.routes.ts - 添加person关联查询(关键修复)错误: Cannot find module '@d8d/allin-disability-person-management-ui/api/types'
解决: 使用@d8d/allin-disability-person-management-ui根路径导入类型
错误: Type 'number | null | undefined' is not assignable to type 'number | null'
解决: 使用field.value ?? null将undefined转换为null
警告: 'value' is declared but its value is never read
解决: 从组件props中移除未使用的value参数
错误: 后端查询用户列表时没有包含person关联,导致前端无法显示残疾人信息
解决: 在packages/core-module/user-module/src/routes/user.routes.ts的relations数组中添加'person'
修改文件: user.routes.ts 第16行,relations: ['roles', 'avatarFile', 'company', 'person']
错误: DisabledPersonSelectorWrapper 组件没有使用传入的 value prop,导致编辑时无法显示已选择的残疾人信息
解决:
value propuseEffect 监听 value 变化通过 API 获取残疾人详细信息并更新显示
修改文件: packages/user-management-ui/src/components/DisabledPersonSelectorWrapper.tsx
useEffect(() => {
if (value) {
disabilityClientManager.get().getDisabledPerson[':id'].$get({
param: { id: value },
}).then(res => {
if (res.status === 200) {
return res.json();
}
return null;
}).then(data => {
if (data) {
setSelectedPerson(data);
}
}).catch(() => {
setSelectedPerson(null);
});
} else {
setSelectedPerson(null);
}
}, [value]);
✅ 管理员可以在用户管理页面创建和编辑人才用户 ✅ 用户类型选择器功能完整,支持三种用户类型 ✅ 条件渲染逻辑正确,根据用户类型显示相应字段 ✅ 残疾人选择器集成成功,支持搜索、筛选、分页 ✅ 用户列表正确显示用户类型和关联残疾人信息 ✅ 类型检查通过
⚠️ 人才用户创建后,需要验证残疾人可以使用身份证号/残疾证号登录人才小程序 ⚠️ 需要完整的E2E测试验证整个流程