007.018.user-management-ui-mt-package.story.md 9.7 KB

故事 007.018: 多租户用户管理界面独立包实现

状态: ✅ Ready for Review 史诗: 007 - 多租户包复制策略 故事类型: 前端/UI

故事陈述

基于故事007.017的单租户用户管理UI包,创建一个多租户版本的用户管理界面独立包,采用复制策略直接复制单租户包并更新依赖,使用标准RPC客户端架构,租户上下文由后端处理。

验收标准

  • ✅ 创建多租户用户管理UI包,包名为 @d8d/user-management-ui-mt
  • ✅ 复制故事007.017的单租户用户管理UI包结构和代码
  • ✅ 更新包配置和依赖,确保与多租户架构兼容
  • ✅ 验证RPC客户端架构在多租户环境中的正确使用
  • ✅ 确保所有组件和API调用使用标准的RPC客户端
  • ✅ 通过集成测试,确保功能完整性
  • 新增: 确保多租户包在RPC单例架构上与单租户包完全同步,包括UserSelector组件

Dev Notes

先前故事洞察

  • 故事007.017实现了单租户用户管理UI包,采用RPC客户端架构
  • 使用单例模式和延迟初始化确保类型安全和性能
  • 组件结构清晰,包含认证管理、用户列表、用户表单等核心组件

数据模型

  • 用户管理数据模型基于多租户隔离原则 [Source: architecture/component-architecture.md#数据模型]
  • 用户实体包含租户ID字段用于数据隔离 [Source: architecture/component-architecture.md#多租户支持]

API规范

  • 使用RPC客户端架构进行API调用 [Source: architecture/tech-stack.md#前端技术栈]
  • 租户上下文由后端认证包处理,前端使用标准RPC客户端 [Source: architecture/component-architecture.md#认证授权]

组件规范

  • React 19.1.0 + TypeScript 5.6.2 [Source: architecture/tech-stack.md#前端技术栈]
  • TanStack Query v5用于状态管理 [Source: architecture/tech-stack.md#前端技术栈]
  • React Hook Form v7用于表单处理 [Source: architecture/tech-stack.md#前端技术栈]
  • 组件采用函数式组件和Hooks模式 [Source: architecture/component-architecture.md#组件设计原则]

文件位置

  • 新包位置:packages/user-management-ui-mt/ [Source: architecture/source-tree.md#包结构]
  • 组件文件:packages/user-management-ui-mt/src/components/ [Source: architecture/source-tree.md#前端包结构]
  • API客户端:packages/user-management-ui-mt/src/api/ [Source: architecture/source-tree.md#前端包结构]
  • 测试文件:packages/user-management-ui-mt/src/__tests__/ [Source: architecture/source-tree.md#测试结构]

测试要求

  • 使用Vitest进行集成测试 [Source: architecture/testing-strategy.md#测试框架]
  • 使用Testing Library进行组件集成测试 [Source: architecture/testing-strategy.md#测试框架]
  • 测试文件与源码文件同目录 [Source: architecture/testing-strategy.md#测试文件组织]
  • 重点验证多租户上下文和功能完整性
  • 多租户测试重点
    • 测试多租户上下文传递的正确性
    • 验证不同租户间的数据隔离
    • 测试租户切换时的组件状态管理
    • 确保API调用包含正确的租户标识
    • 验证认证和授权的多租户感知

技术约束

  • Node.js 20.19.2 [Source: architecture/tech-stack.md#开发环境]
  • TypeScript严格模式启用 [Source: architecture/component-architecture.md#typescript配置]
  • 租户上下文由后端处理,前端使用标准RPC客户端 [Source: architecture/component-architecture.md#多租户支持]

实施注意事项

  • 文件重命名策略: 复制单租户包文件后,立即重命名文件为多租户包名,然后再进行内容修改
  • 依赖管理: 所有包配置更新完成后,必须执行 pnpm install 命令以确保依赖正确安装
  • 包命名规范: 多租户包使用 -mt 后缀标识(Multi-Tenant)

实施总结

  • 修正需求: 租户上下文处理由后端负责,前端使用标准RPC客户端,无需前端处理租户认证
  • 技术修复: 修复TypeORM装饰器类型错误,更新TypeScript配置继承根配置
  • 依赖管理: 成功安装 @hono/zod-openapi 依赖,确保多租户用户模块schemas正确导入
  • 类型安全: 修复Role类型不匹配问题,适配后端返回的字符串日期格式
  • 组件验证: 组件能够正常编译、渲染,类型检查通过
  • RPC单例同步: RPC客户端架构已与单租户包同步,但缺少UserSelector组件

RPC客户端架构参考

  • 单例模式: 用户客户端管理器采用单例模式确保全局唯一实例 [参考: 故事007.017任务9]
  • 延迟初始化: 支持延迟初始化和客户端重置功能 [参考: 故事007.017任务9]
  • 类型安全: 使用Hono的InferRequestType和InferResponseType确保类型安全 [参考: 故事007.017任务9]
  • API调用模式: 实现类型安全的API调用模式 [参考: 故事007.017任务9]
  • 集成验证: 验证RPC客户端在主应用中的正确集成 [参考: 故事007.017任务9]

项目结构说明

基于源码树文档检查,项目结构完全对齐:

  • 包结构符合workspace模式 [Source: architecture/source-tree.md#包结构]
  • 前端包采用标准React + TypeScript结构 [Source: architecture/source-tree.md#前端包结构]
  • 测试文件组织符合测试策略要求 [Source: architecture/source-tree.md#测试结构]

任务 / 子任务

  1. 创建多租户用户管理UI包结构 (AC: 1)

    • ✅ 创建 packages/user-management-ui-mt/ 目录
    • ✅ 复制单租户包的结构和文件
    • 重要:复制后立即重命名文件为多租户包名
    • ✅ 更新包名为 @d8d/user-management-ui-mt
  2. 更新包配置和依赖 (AC: 2, 3)

    • ✅ 更新 package.json 中的包名和依赖
    • ✅ 确保与多租户共享包的依赖兼容
    • ✅ 验证workspace依赖配置
    • 重要:修改完成后务必执行 pnpm install 命令
  3. 实现RPC客户端架构和最佳实践 (AC: 4, 5)

    • ✅ 创建单例模式的用户客户端管理器 [参考: packages/user-management-ui-mt/src/api/userClient.ts]
    • ✅ 实现延迟初始化和客户端重置功能 [参考: packages/user-management-ui-mt/src/api/userClient.ts:17-33]
    • ✅ 使用Hono的InferRequestType和InferResponseType确保类型安全 [参考: packages/user-management-ui-mt/src/components/UserManagement.tsx:26-29]
    • ✅ 提供全局唯一的客户端实例管理 [参考: packages/user-management-ui-mt/src/api/userClient.ts:4-15]
    • ✅ 验证RPC客户端在主应用中的正确集成 [参考: web/src/client/api_init.ts]
    • ✅ 实现类型安全的API调用模式 [参考: packages/user-management-ui-mt/src/components/UserManagement.tsx:100-112]
  4. 验证RPC客户端架构 (AC: 4, 5)

    • ✅ 验证RPC客户端在多租户环境中的正确使用
    • ✅ 确保所有组件使用标准的RPC客户端,无需前端处理租户上下文
  5. 组件和功能验证 (AC: 5)

    • ✅ 测试用户列表组件的功能完整性
    • ✅ 验证用户表单的正常工作
    • ✅ 确保认证管理的标准实现
  6. 集成验证和测试 (AC: 6)

    • ✅ 验证包在多租户应用中的集成
    • ✅ 确保数据隔离由后端处理
    • ✅ 实现集成测试,确保功能完整性
    • 重要:添加标准RPC客户端测试到现有的复制过来的修改后的测试文件中
      • ✅ 测试API调用的正确性
      • ✅ 验证组件与后端的正常交互
      • ✅ 确保RPC客户端架构的稳定性
  7. 新增任务: 确保RPC单例架构完全同步 (AC: 新增)

    • 复制UserSelector组件文件
      • 源文件: packages/user-management-ui/src/components/UserSelector.tsx
      • 目标文件: packages/user-management-ui-mt/src/components/UserSelector.tsx
    • 更新组件导出文件
      • 文件: packages/user-management-ui-mt/src/components/index.ts
      • 添加: export { UserSelector } from './UserSelector';
    • 更新包主导出文件
      • 文件: packages/user-management-ui-mt/src/index.ts
      • 添加: export { UserSelector } from './components';
    • 创建UserSelector集成测试文件
      • 源文件: packages/user-management-ui/tests/integration/user-selector.integration.test.tsx
      • 目标文件: packages/user-management-ui-mt/tests/integration/user-selector.integration.test.tsx
    • 验证文件列表
      • packages/user-management-ui-mt/src/components/UserSelector.tsx
      • packages/user-management-ui-mt/src/components/index.ts
      • packages/user-management-ui-mt/src/index.ts
      • packages/user-management-ui-mt/tests/integration/user-selector.integration.test.tsx

Dev Agent Record

Agent Model Used

  • 主要代理: James (Dev Agent)
  • 模型: d8d-model

完成记录

  • 任务7: 确保多租户包在RPC单例架构上与单租户包完全同步
    • ✅ UserSelector组件已成功复制到多租户包
    • ✅ 组件导出文件已更新
    • ✅ 包主导出文件已更新
    • ✅ 集成测试文件已创建
    • ✅ 所有6个UserSelector集成测试100%通过
    • ✅ 包构建成功,类型检查通过

变更日志

  • 2025-11-17: 新增任务7完成 - UserSelector组件同步
    • 修复API调用路径问题(userClient.index.$get vs userClient.$get
    • 更新测试mock配置以匹配正确的API结构
    • 验证多租户包RPC单例架构完全同步

文件列表

  • packages/user-management-ui-mt/src/components/UserSelector.tsx
  • packages/user-management-ui-mt/src/components/index.ts
  • packages/user-management-ui-mt/src/index.ts
  • packages/user-management-ui-mt/tests/integration/user-selector.integration.test.tsx

故事创建时间: 2025-11-16 故事完成时间: 2025-11-16 故事更新时间: 2025-11-17 基于史诗007和架构文档创建