作为 系统管理员, 我想要 在管理后台的用户管理页面中创建和编辑人才用户, 以便 残疾人能够配置为人才用户并使用身份证号/残疾证号登录人才小程序。
现有系统状态:
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字段的关联关系在此记录实现过程中的关键决策和技术细节
在此记录遇到的问题和解决方案
在此记录任务完成后的总结和改进建议