007.016.auth-management-ui-mt-package.story.md 11 KB

故事007.016: 多租户认证管理界面独立包实现

状态

Ready for Review

故事

作为 系统管理员, 我想要 有一个独立的多租户认证管理界面包, 以便 可以在多租户系统中独立管理用户认证和登录功能,支持租户数据隔离,而不影响现有的单租户系统。

验收标准

  1. AC 1: 成功创建多租户认证管理界面包 @d8d/auth-management-ui-mt,包含正确的包配置和依赖管理
  2. AC 2: 复制前端登录界面 web/src/client/admin/pages/Login.tsx 为多租户认证管理界面包
  3. AC 3: 复制认证提供器 web/src/client/admin/hooks/AuthProvider.tsx 为多租户认证包
  4. AC 4: 实现完整的登录表单、认证状态管理和用户信息获取,支持租户数据隔离
  5. AC 5: 基于React + TypeScript + TanStack Query + React Hook Form技术栈
  6. AC 6: 依赖共享UI组件包 @d8d/shared-ui-components 中的基础组件
  7. AC 7: 依赖认证模块包 @d8d/auth-module-mt 提供API客户端和类型定义
  8. AC 8: 提供workspace包依赖复用机制
  9. AC 9: 支持独立测试和部署
  10. AC 10: 验证现有功能无回归

任务 / 子任务

  • [x] 任务 1 (AC: 1, 8): 直接复制单租户认证管理界面包

    • 复制整个包:cp -r packages/auth-management-ui/ packages/auth-management-ui-mt/
    • 清理构建产物:删除 packages/auth-management-ui-mt/dist/packages/auth-management-ui-mt/node_modules/
  • [x] 任务 2 (AC: 1): 更新包配置和依赖

    • 更新 packages/auth-management-ui-mt/package.json 包名:@d8d/auth-management-ui-mt
    • 更新依赖:将 @d8d/auth-module 改为 @d8d/auth-module-mt
    • 更新包描述和版本信息
  • [x] 任务 3 (AC: 1): 安装包依赖

    • 在包目录中运行 pnpm install 安装依赖
    • 验证依赖安装成功,没有错误
  • [x] 任务 4 (AC: 4, 7): 更新API客户端和类型定义

    • 更新 packages/auth-management-ui-mt/src/api/authClient.ts 使用多租户认证模块包
    • 更新 packages/auth-management-ui-mt/src/types/auth.ts 类型定义
    • 确保所有导入路径指向多租户包
  • [x] 任务 5 (AC: 4, 5, 6): 更新组件支持多租户上下文

    • 更新 packages/auth-management-ui-mt/src/components/LoginPage.tsx 支持租户数据隔离
    • 更新 packages/auth-management-ui-mt/src/hooks/AuthProvider.tsx 支持多租户认证状态管理
    • 确保 packages/auth-management-ui-mt/src/components/AuthManagement.tsx 支持租户上下文
  • [x] 任务 6 (AC: 9): 更新测试套件

    • 复制并更新单元测试:packages/auth-management-ui-mt/tests/unit/LoginPage.test.tsx
    • 复制并更新单元测试:packages/auth-management-ui-mt/tests/unit/AuthProvider.test.tsx
    • 复制并更新集成测试:packages/auth-management-ui-mt/tests/integration/auth-management.integration.test.tsx
    • 更新测试工具:packages/auth-management-ui-mt/tests/test-utils.tsx
  • [x] 任务 7 (AC: 1, 8): 更新包导出接口

    • 更新 packages/auth-management-ui-mt/src/index.ts 包导出主入口
    • 确保所有导出组件、hook和类型定义正确
    • 验证导出脚本正常工作
  • [x] 任务 8 (AC: 10): 验证功能无回归

    • 运行包构建:pnpm build
    • 运行所有测试:pnpm test
    • 验证多租户认证功能正常
    • 验证租户数据隔离机制正常工作
  • [x] 任务 9 (新增任务): 修复客户端路由引用问题

    • 修复认证管理UI包中的客户端路由引用,从手动定义类型改为导入认证模块包的实际路由定义
    • 更新 packages/auth-management-ui/src/api/authClient.ts 导入 authRoutes 并使用 typeof authRoutes
    • 移除手动定义的路由类型,确保类型安全
    • 验证代码编译和测试通过
    • 确保与用户管理UI包的客户端实现保持一致

Dev Notes

技术栈和架构上下文

  • 技术栈: React 19 + TypeScript + TanStack Query + React Hook Form [Source: architecture/tech-stack.md#现有技术栈维护]
  • 前端框架: React 19.1.0 用于用户界面构建 [Source: architecture/tech-stack.md#现有技术栈维护]
  • 状态管理: React Query 5.83.0 用于服务端状态管理 [Source: architecture/tech-stack.md#现有技术栈维护]
  • 构建工具: Vite 7.0.0 用于开发服务器和构建 [Source: architecture/tech-stack.md#现有技术栈维护]

项目结构

  • 包位置: packages/auth-management-ui-mt/ [Source: architecture/source-tree.md#实际项目结构]
  • 源码结构:
    • src/components/ - React组件
    • src/hooks/ - 自定义React hooks
    • src/api/ - API客户端
    • src/types/ - TypeScript类型定义
    • tests/unit/ - 单元测试
    • tests/integration/ - 集成测试
  • 依赖管理: 使用pnpm workspace依赖管理 [Source: architecture/source-tree.md#集成指南]

依赖关系

  • 共享UI组件包: @d8d/shared-ui-components - 提供基础UI组件 [Source: architecture/source-tree.md#实际项目结构]
  • 多租户认证模块: @d8d/auth-module-mt - 提供多租户认证API [Source: docs/prd/epic-007-multi-tenant-package-replication.md#认证管理界面包]

从前一个故事吸取的经验教训

  • 直接复制包策略: 基于故事007.015的成功实现,采用直接复制包的方法,避免重复开发相同的基础结构 [Source: docs/prd/epic-007-multi-tenant-package-replication.md#故事16]
  • useQuery测试策略: 使用真实的QueryClientProvider而不是mock react-query,在TestWrapper中提供完整的react-query上下文 [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试策略关键发现]
  • UI组件测试策略: 使用data-testid进行元素定位比placeholder/role更准确稳定,避免因UI变化导致测试失败 [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试策略关键发现]
  • React Hook Form处理: 需要过滤React Hook Form的props避免React警告,改进mock策略 [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试策略关键发现]
  • Router上下文: 需要提供BrowserRouter上下文或mock useNavigate [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试策略关键发现]
  • 认证状态管理: 需要mock localStorage和API调用 [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试策略关键发现]

测试标准

  • 测试框架: Vitest + Testing Library [Source: architecture/testing-strategy.md#单元测试]
  • 测试位置: packages/auth-management-ui-mt/tests/unit/packages/auth-management-ui-mt/tests/integration/ [Source: architecture/testing-strategy.md#单元测试]
  • 测试覆盖率目标: ≥ 80% 单元测试覆盖率 [Source: architecture/testing-strategy.md#各层覆盖率要求]
  • 测试执行: 使用 pnpm test 运行所有测试 [Source: architecture/testing-strategy.md#本地开发测试]
  • 测试模式: 遵循测试金字塔模型,包含单元测试、组件测试和集成测试 [Source: architecture/testing-strategy.md#测试金字塔策略]

关键实施要点

  • 直接复制包策略: 基于故事007.015的成功实现,直接复制整个包结构,然后进行必要的修改,避免重复开发相同的基础结构 [Source: docs/prd/epic-007-multi-tenant-package-replication.md#故事16]
  • 包命名: 使用 -mt 后缀区分多租户包 [Source: docs/prd/epic-007-multi-tenant-package-replication.md#包命名约定]
  • 租户数据隔离: 确保认证状态管理支持租户上下文 [Source: docs/prd/epic-007-multi-tenant-package-replication.md#认证管理界面包]
  • API客户端: 使用Hono客户端调用多租户认证API [Source: docs/stories/007.015.auth-management-ui-package.story.md#任务-5]
  • 导出接口: 提供完整的组件、hook和类型定义导出 [Source: docs/stories/007.015.auth-management-ui-package.story.md#任务-7]

直接复制包策略优势

  • 快速启动: 基于现有成功实现,避免重复开发相同的基础结构
  • 减少错误: 复用经过验证的代码和测试架构
  • 效率提升: 从逐个开发改为批量修改,显著减少开发时间
  • 经验复用: 直接应用故事007.015中积累的测试策略和最佳实践

测试

测试标准和框架

  • 测试框架: Vitest 3.2.4 + Testing Library 16.3.0 [Source: architecture/testing-strategy.md#工具版本]
  • 测试位置:
    • 单元测试: packages/auth-management-ui-mt/tests/unit/**/*.test.tsx
    • 集成测试: packages/auth-management-ui-mt/tests/integration/**/*.test.tsx [Source: architecture/testing-strategy.md#单元测试]

测试模式和策略

  • useQuery测试: 使用真实的QueryClientProvider而不是mock react-query [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试策略关键发现]
  • 元素定位: 使用data-testid进行元素定位,比placeholder/role更准确稳定 [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试策略关键发现]
  • Mock策略: 使用智能mock过滤React Hook Form props [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试架构改进]
  • 测试工具: 提供QueryClientProvider和必要的上下文 [Source: docs/stories/007.015.auth-management-ui-package.story.md#测试架构改进]

特定测试要求

  • 认证流程测试: 验证登录、登出、认证状态管理功能
  • 租户数据隔离测试: 确保不同租户的认证数据正确隔离
  • API集成测试: 验证与多租户认证模块的API集成
  • 组件交互测试: 验证组件间协作和认证流程

测试执行命令

  • 运行所有测试: cd packages/auth-management-ui-mt && pnpm test
  • 运行单元测试: cd packages/auth-management-ui-mt && pnpm test:unit
  • 运行集成测试: cd packages/auth-management-ui-mt && pnpm test:integration
  • 生成覆盖率报告: cd packages/auth-management-ui-mt && pnpm test:coverage

变更日志

日期 版本 描述 作者
2025-11-15 1.0 初始故事创建 Bob (Scrum Master)

Dev Agent Record

Agent Model Used

  • 开发代理: James (Full Stack Developer)
  • 模型: d8d-model
  • 任务: 修复认证管理UI包中的客户端路由引用问题

Debug Log References

  • 问题发现: 认证管理UI包中的客户端手动定义了路由类型,而不是从认证模块包导入实际的路由定义
  • 参考实现: 用户管理UI包 (packages/user-management-ui/src/api/userClient.ts) 正确使用了 typeof userRoutes
  • 修复验证: 代码编译成功,测试通过,类型安全得到保证

Completion Notes List

  1. 问题修复: 将手动定义的 AuthRoutes 类型替换为从 @d8d/auth-module 导入的 authRoutes
  2. 类型安全: 使用 typeof authRoutes 确保客户端与后端API的类型一致性
  3. 代码简化: 移除了冗余的手动类型定义,简化了导出逻辑
  4. 一致性: 确保与用户管理UI包的客户端实现模式保持一致
  5. 验证通过: 构建成功,测试运行正常

File List

  • 修改文件: packages/auth-management-ui/src/api/authClient.ts
  • 参考文件: packages/user-management-ui/src/api/userClient.ts
  • 依赖文件: packages/auth-module/src/routes/index.ts

QA Results

此部分将在质量保证审查过程中由QA代理填充