# Story 12.1: user-page-object - 用户管理 Page Object

Status: ready-for-dev

## Story

作为测试开发者，
我想要扩展用户管理 Page Object 以支持企业用户和人才用户的创建，
以便为 Epic 12 的用户管理和小程序登录测试提供基础的 Page Object 能力。

## Acceptance Criteria

1. **扩展 UserManagementPage 支持 EMPLOYER 类型用户**
   - 添加 `createEmployerUser` 方法，支持创建企业用户
   - 方法接收 `username`, `password`, `companyId` 以及可选的 `phone`, `email`, `nickname`, `name`
   - 在表单中选择用户类型为"企业用户"
   - 使用 Radix UI Select 选择公司

2. **扩展 UserManagementPage 支持 TALENT 类型用户**
   - 添加 `createTalentUser` 方法，支持创建人才用户
   - 方法接收 `username`, `password`, `personId` 以及可选的 `phone`, `email`, `nickname`, `name`
   - 在表单中选择用户类型为"人才用户"
   - 使用 Radix UI Select 选择残疾人

3. **保持向后兼容**
   - 现有的 `createUser` 方法保持不变（默认创建 ADMIN 用户）
   - 所有现有测试继续通过

4. **类型安全**
   - 导出 `EmployerUserData` 和 `TalentUserData` 接口
   - 使用 TypeScript 严格类型检查

5. **错误处理**
   - 当公司或残疾人不存在时，正确捕获并报告错误
   - 表单验证失败时提供清晰的错误信息

## Tasks / Subtasks

- [ ] 任务 1: 分析用户管理表单结构 (AC: 1, 2)
  - [ ] 1.1 查看 web 端用户管理 UI 组件，确定表单字段和选择器
  - [ ] 1.2 确认用户类型选择器（Radix UI Select）
  - [ ] 1.3 确认公司选择器（Radix UI Select）
  - [ ] 1.4 确认残疾人选择器（Radix UI Select）

- [ ] 任务 2: 扩展 UserManagementPage 类型定义 (AC: 4)
  - [ ] 2.1 添加 `EmployerUserData` 接口
  - [ ] 2.2 添加 `TalentUserData` 接口
  - [ ] 2.3 导出 `UserType` 常量（参考 `@d8d/shared-types`）

- [ ] 任务 3: 实现 `createEmployerUser` 方法 (AC: 1)
  - [ ] 3.1 点击"创建用户"按钮
  - [ ] 3.2 选择用户类型为"企业用户"
  - [ ] 3.3 填写必填字段（用户名、密码、公司）
  - [ ] 3.4 填写可选字段（手机号、邮箱、昵称、真实姓名）
  - [ ] 3.5 使用 `selectRadixOptionAsync` 选择公司
  - [ ] 3.6 提交表单并等待结果

- [ ] 任务 4: 实现 `createTalentUser` 方法 (AC: 2)
  - [ ] 4.1 点击"创建用户"按钮
  - [ ] 4.2 选择用户类型为"人才用户"
  - [ ] 4.3 填写必填字段（用户名、密码、残疾人）
  - [ ] 4.4 填写可选字段（手机号、邮箱、昵称、真实姓名）
  - [ ] 4.5 使用 `selectRadixOptionAsync` 选择残疾人
  - [ ] 4.6 提交表单并等待结果

- [ ] 任务 5: 添加辅助方法 (AC: 5)
  - [ ] 5.1 添加 `selectUserType` 方法（选择用户类型）
  - [ ] 5.2 添加 `selectCompany` 方法（选择公司）
  - [ ] 5.3 添加 `selectPerson` 方法（选择残疾人）
  - [ ] 5.4 添加错误处理逻辑

- [ ] 任务 6: 编写单元测试验证 Page Object (AC: 3, 5)
  - [ ] 6.1 验证 `createEmployerUser` 方法正确调用
  - [ ] 6.2 验证 `createTalentUser` 方法正确调用
  - [ ] 6.3 验证错误处理逻辑

- [ ] 任务 7: 运行现有测试确保向后兼容 (AC: 3)
  - [ ] 7.1 运行 `users.spec.ts` 所有测试通过
  - [ ] 7.2 确认无破坏性变更

## Dev Notes

### 架构模式

**Page Object 模式**
- 文件位置: `web/tests/e2e/pages/admin/user-management.page.ts`
- 现有实现已支持基础用户 CRUD
- 需要扩展以支持多类型用户创建

**Radix UI Select 集成**
- 用户类型、公司、残疾人选择器使用 Radix UI Select 组件
- 使用 `@d8d/e2e-test-utils` 的 `selectRadixOptionAsync` 工具函数
- 参考: `packages/e2e-test-utils/src/select.ts`

**依赖的测试数据**
- Epic 11 已完成，有 Company 和 Platform 数据可用
- 需要预先创建残疾人数据（可使用 Epic 9 的测试数据）

### 用户类型定义

**来自 `packages/shared-types/src/index.ts`:**
```typescript
export enum UserType {
  ADMIN = 'admin',       // 管理员
  EMPLOYER = 'employer', // 企业用户
  TALENT = 'talent'      // 人才用户
}

export const TypeNameMap: Record<UserType, string> = {
  [UserType.ADMIN]: '管理员',
  [UserType.EMPLOYER]: '企业用户',
  [UserType.TALENT]: '人才用户'
};
```

**创建用户 Schema** (来自 `packages/core-module/user-module/src/schemas/user.schema.ts`):
- 企业用户必须字段: `username`, `password`, `companyId`
- 人才用户必须字段: `username`, `password`, `personId`
- 可选字段: `phone`, `email`, `nickname`, `name`, `avatarFileId`, `isDisabled`

### 项目结构说明

**对齐统一项目结构**
- Page Objects 位置: `web/tests/e2e/pages/admin/`
- 测试 Fixtures 位置: `web/tests/e2e/fixtures/`
- 测试 Specs 位置: `web/tests/e2e/specs/admin/`

**测试标准参考**
- Page Object 设计参考 `company-management.page.ts`
- Select 工具使用参考 `company-create.spec.ts`

### 技术约束

**TypeScript 配置**
- 目标: ES2020+
- 严格类型检查，禁止 `any` 类型

**Playwright 配置**
- 超时设置: 参考 `TIMEOUTS` 常量
- 测试隔离: 每个测试独立运行，不共享状态

**依赖包**
- `@d8d/e2e-test-utils`: 提供测试工具函数
- `@playwright/test`: E2E 测试框架

## References

- **Epic 12 定义**: `_bmad-output/planning-artifacts/epics.md` (第 2383-2425 行)
- **PRD**: `_bmad-output/planning-artifacts/prd.md`
- **Architecture**: `_bmad-output/planning-artifacts/architecture.md`
- **User Schema**: `packages/core-module/user-module/src/schemas/user.schema.ts`
- **UserType 定义**: `packages/shared-types/src/index.ts` (第 56-67 行)
- **现有 Page Object**: `web/tests/e2e/pages/admin/user-management.page.ts`
- **参考 Page Object**: `web/tests/e2e/pages/admin/company-management.page.ts`
- **Select 工具**: `packages/e2e-test-utils/src/select.ts`
- **现有用户测试**: `web/tests/e2e/specs/admin/users.spec.ts`

## Dev Agent Record

### Agent Model Used

Claude Opus 4.5 (model ID: 'claude-opus-4-5-20251101')

### Debug Log References

无（开发过程中记录）

### Completion Notes List

无（开发过程中记录）

### File List

主要文件:
- `web/tests/e2e/pages/admin/user-management.page.ts` (主要修改文件)
- `web/tests/e2e/specs/admin/users.spec.ts` (现有测试，确保通过)
- `web/tests/e2e/fixtures/test-users.json` (测试用户数据)
