Explorar o código

📝 docs(stories): add documentation for two new UI package stories

- add story for advertisement-type-management-ui package with complete ACs and tasks
- add story for supplier-management-ui package with detailed requirements and implementation plan
- include technical context, testing strategies and dependency management guidelines for both packages
yourname hai 1 mes
pai
achega
6d34c8027d

+ 183 - 0
docs/stories/007.021.advertisement-type-management-ui-package.story.md

@@ -0,0 +1,183 @@
+# 故事007.021: 单租户广告分类管理界面独立包实现
+
+## 状态
+
+Draft
+
+## 故事
+
+**作为** 系统管理员,
+**我想要** 有一个独立的单租户广告分类管理界面包,
+**以便** 可以在单租户系统中独立管理广告分类配置,而不影响现有的多租户系统。
+
+## 验收标准
+
+1. **AC 1**: 成功创建单租户广告分类管理界面包 `@d8d/advertisement-type-management-ui`,包含正确的包配置和依赖管理
+2. **AC 2**: 复制前端广告分类管理界面 `web/src/client/admin/pages/AdvertisementTypes.tsx` 为单租户广告分类管理界面包
+3. **AC 3**: 实现完整的广告分类CRUD操作
+4. **AC 4**: 基于React + TypeScript + TanStack Query + React Hook Form技术栈
+5. **AC 5**: 依赖共享UI组件包 `@d8d/shared-ui-components` 中的基础组件
+6. **AC 6**: 依赖广告模块包 `@d8d/advertisements-module` 提供API客户端和类型定义
+7. **AC 7**: 提供workspace包依赖复用机制
+8. **AC 8**: 支持独立测试和部署
+9. **AC 9**: 验证现有功能无回归
+
+## 任务 / 子任务
+
+- [ ] 任务 1 (AC: 1, 7): 创建单租户广告分类管理界面包结构
+  - [ ] 创建包目录:`packages/advertisement-type-management-ui/`
+  - [ ] 创建基础包结构:`src/`、`tests/`、`package.json`
+  - [ ] 配置包依赖和构建脚本
+
+- [ ] 任务 2 (AC: 1): 配置包依赖和构建
+  - [ ] 创建 `packages/advertisement-type-management-ui/package.json` 包配置
+  - [ ] 添加依赖:`@d8d/shared-ui-components`、`@d8d/advertisements-module`
+  - [ ] 配置构建脚本和TypeScript配置
+
+- [ ] 任务 3 (AC: 2, 3): 复制并调整广告分类管理界面组件
+  - [ ] 复制 `web/src/client/admin/pages/AdvertisementTypes.tsx` 为 `packages/advertisement-type-management-ui/src/components/AdvertisementTypeManagement.tsx`
+  - [ ] 更新组件导入路径,使用共享UI组件包
+  - [ ] 调整API客户端,使用广告模块包
+
+- [ ] 任务 4 (AC: 3, 6): 创建API客户端和类型定义
+  - [ ] 创建 `packages/advertisement-type-management-ui/src/api/advertisementTypeClient.ts` API客户端
+  - [ ] 创建 `packages/advertisement-type-management-ui/src/types/advertisementType.ts` 类型定义
+  - [ ] 确保所有类型定义与广告模块包对齐
+
+- [ ] 任务 5 (AC: 3, 4): 实现完整的广告分类管理功能
+  - [ ] 实现广告分类列表查询和分页功能
+  - [ ] 实现广告分类创建、编辑、删除功能
+  - [ ] 实现广告分类状态管理
+  - [ ] 实现搜索和过滤功能
+
+- [ ] 任务 6 (AC: 8): 创建测试套件
+  - [ ] 创建集成测试:`packages/advertisement-type-management-ui/tests/integration/advertisement-type-management.integration.test.tsx`
+  - [ ] 创建测试工具:`packages/advertisement-type-management-ui/tests/test-utils.tsx`
+
+- [ ] 任务 7 (AC: 1, 7): 配置包导出接口
+  - [ ] 创建 `packages/advertisement-type-management-ui/src/index.ts` 包导出主入口
+  - [ ] 确保所有导出组件、hook和类型定义正确
+  - [ ] 验证导出脚本正常工作
+
+- [ ] 任务 8 (AC: 9): 验证功能无回归
+  - [ ] 运行包构建:`pnpm build`
+  - [ ] 运行所有测试:`pnpm test`
+  - [ ] 验证广告分类管理功能正常
+  - [ ] 验证与现有系统兼容性
+
+- [ ] 任务 9 (新增任务): 实现RPC客户端架构和最佳实践
+  - [ ] 创建单例模式的广告分类客户端管理器
+  - [ ] 实现延迟初始化和客户端重置功能
+  - [ ] 使用Hono的InferRequestType和InferResponseType确保类型安全
+  - [ ] 提供全局唯一的客户端实例管理
+  - [ ] 验证RPC客户端在主应用中的正确集成
+  - [ ] 实现类型安全的API调用模式
+
+- [ ] 任务 10 (新增任务): 安装包依赖
+  - [ ] 在包目录中运行 `pnpm install` 安装所有依赖
+  - [ ] 验证依赖安装成功,无冲突
+  - [ ] 确保所有依赖版本与workspace一致
+
+## 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/advertisement-type-management-ui/` [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/advertisements-module` - 提供广告分类管理API [Source: docs/prd/epic-007-multi-tenant-package-replication.md#广告分类管理界面包]
+
+### 从前一个故事吸取的经验教训
+- **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#测试策略关键发现]
+
+### 测试标准
+- **测试框架**: Vitest + Testing Library [Source: architecture/testing-strategy.md#单元测试]
+- **测试位置**: `packages/advertisement-type-management-ui/tests/unit/` 和 `packages/advertisement-type-management-ui/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#测试金字塔策略]
+
+### 关键实施要点
+- **包命名**: 使用标准命名约定,不添加特殊后缀 [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]
+- **组件复用**: 基于现有广告分类管理界面实现,确保功能完整性和一致性
+
+### 广告分类管理功能特性
+- **分类列表**: 支持分页、搜索、过滤功能
+- **分类CRUD**: 完整的创建、读取、更新、删除操作
+- **状态管理**: 广告分类启用/禁用状态控制
+- **调用别名**: 支持程序调用唯一标识管理
+- **表单验证**: 完整的表单验证和错误处理
+
+### 测试
+
+#### 测试标准和框架
+- **测试框架**: Vitest 3.2.4 + Testing Library 16.3.0 [Source: architecture/testing-strategy.md#工具版本]
+- **测试位置**:
+  - 集成测试: `packages/advertisement-type-management-ui/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#测试架构改进]
+
+#### 特定测试要求
+- **广告分类CRUD测试**: 验证广告分类创建、读取、更新、删除功能
+- **状态管理测试**: 验证广告分类启用/禁用状态控制
+- **搜索过滤测试**: 验证搜索和过滤功能正常工作
+- **表单验证测试**: 验证表单验证和错误处理
+- **API集成测试**: 验证与广告模块的API集成
+
+#### 测试执行命令
+- 运行所有测试: `cd packages/advertisement-type-management-ui && pnpm test`
+- 运行单元测试: `cd packages/advertisement-type-management-ui && pnpm test:unit`
+- 运行集成测试: `cd packages/advertisement-type-management-ui && pnpm test:integration`
+- 生成覆盖率报告: `cd packages/advertisement-type-management-ui && pnpm test:coverage`
+
+## 变更日志
+
+| 日期 | 版本 | 描述 | 作者 |
+|------|------|------|------|
+| 2025-11-16 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
+
+## Dev Agent Record
+
+### Agent Model Used
+
+*此部分将在开发过程中由开发代理填充*
+
+### Debug Log References
+
+*此部分将在开发过程中由开发代理填充*
+
+### Completion Notes List
+
+*此部分将在开发过程中由开发代理填充*
+
+### File List
+
+*此部分将在开发过程中由开发代理填充*
+
+## QA Results
+
+*此部分将在质量保证审查过程中由QA代理填充*

+ 169 - 0
docs/stories/007.029.supplier-management-ui-package.story.md

@@ -0,0 +1,169 @@
+# 故事007.029: 单租户供应商管理界面独立包实现
+
+## 状态
+
+Draft
+
+## 故事
+
+**作为** 系统管理员,
+**我想要** 有一个独立的单租户供应商管理界面包,
+**以便** 可以在单租户系统中独立管理供应商和联系人信息,而不影响现有的多租户系统。
+
+## 验收标准
+
+1. **AC 1**: 成功创建单租户供应商管理界面包 `@d8d/supplier-management-ui`,包含正确的包配置和依赖管理
+2. **AC 2**: 复制前端供应商管理界面 `web/src/client/admin/pages/Suppliers.tsx` 为单租户供应商管理界面包
+3. **AC 3**: 实现完整的供应商CRUD操作和联系人管理
+4. **AC 4**: 基于React + TypeScript + TanStack Query + React Hook Form技术栈
+5. **AC 5**: 依赖共享UI组件包 `@d8d/shared-ui-components`
+6. **AC 6**: 依赖供应商模块包 `@d8d/supplier-module`
+7. **AC 7**: 提供workspace包依赖复用机制
+8. **AC 8**: 支持独立测试和部署
+9. **AC 9**: 验证现有功能无回归
+
+## 任务 / 子任务
+
+- [ ] 任务 1 (AC: 1, 7): 创建单租户供应商管理界面包结构
+  - [ ] 创建包目录:`packages/supplier-management-ui/`
+  - [ ] 创建基础包结构:`src/`、`tests/`、`package.json`
+  - [ ] 配置包依赖和构建脚本
+
+- [ ] 任务 2 (AC: 1): 配置包依赖和构建
+  - [ ] 创建 `packages/supplier-management-ui/package.json` 包配置
+  - [ ] 添加依赖:`@d8d/shared-ui-components`、`@d8d/supplier-module`
+  - [ ] 配置构建脚本和TypeScript配置
+
+- [ ] 任务 3 (AC: 2, 3): 复制并调整供应商管理界面组件
+  - [ ] 复制 `web/src/client/admin/pages/Suppliers.tsx` 为 `packages/supplier-management-ui/src/components/SupplierManagement.tsx`
+  - [ ] 更新组件导入路径,使用共享UI组件包
+  - [ ] 调整API客户端,使用供应商模块包
+
+- [ ] 任务 4 (AC: 3, 6): 创建API客户端和类型定义
+  - [ ] 创建 `packages/supplier-management-ui/src/api/supplierClient.ts` API客户端
+  - [ ] 创建 `packages/supplier-management-ui/src/types/supplier.ts` 类型定义
+  - [ ] 确保所有类型定义与供应商模块包对齐
+
+- [ ] 任务 5 (AC: 3, 4): 实现完整的供应商管理功能
+  - [ ] 实现供应商列表查询和分页功能
+  - [ ] 实现供应商创建、编辑、删除功能
+  - [ ] 实现联系人管理和状态管理
+  - [ ] 实现搜索和过滤功能
+
+- [ ] 任务 6 (AC: 8): 创建测试套件
+  - [ ] 创建集成测试:`packages/supplier-management-ui/tests/integration/supplier-management.integration.test.tsx`
+  - [ ] 创建测试工具:`packages/supplier-management-ui/tests/test-utils.tsx`
+
+- [ ] 任务 7 (AC: 1, 7): 配置包导出接口
+  - [ ] 创建 `packages/supplier-management-ui/src/index.ts` 包导出主入口
+  - [ ] 确保所有导出组件、hook和类型定义正确
+  - [ ] 验证导出脚本正常工作
+
+- [ ] 任务 8 (AC: 9): 验证功能无回归
+  - [ ] 运行包构建:`pnpm build`
+  - [ ] 运行所有测试:`pnpm test`
+  - [ ] 验证供应商管理功能正常
+  - [ ] 验证与现有系统兼容性
+
+- [ ] 任务 9 (新增任务): 实现RPC客户端架构和最佳实践
+  - [ ] 创建单例模式的供应商客户端管理器
+  - [ ] 实现延迟初始化和客户端重置功能
+  - [ ] 使用Hono的InferRequestType和InferResponseType确保类型安全
+  - [ ] 提供全局唯一的客户端实例管理
+  - [ ] 验证RPC客户端在主应用中的正确集成
+  - [ ] 实现类型安全的API调用模式
+
+- [ ] 任务 10 (新增任务): 安装包依赖
+  - [ ] 在包目录中运行 `pnpm install` 安装所有依赖
+  - [ ] 验证依赖安装成功,无版本冲突
+  - [ ] 确保所有开发依赖正确安装
+
+## 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/supplier-management-ui/` [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/supplier-module` - 提供供应商管理API [Source: docs/prd/epic-007-multi-tenant-package-replication.md#供应商管理界面包]
+
+### 从前一个故事吸取的经验教训
+- **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#测试策略关键发现]
+
+### 测试标准
+- **测试框架**: Vitest + Testing Library [Source: architecture/testing-strategy.md#单元测试]
+- **测试位置**: `packages/supplier-management-ui/tests/unit/` 和 `packages/supplier-management-ui/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#测试金字塔策略]
+
+### 关键实施要点
+- **包命名**: 使用标准命名约定,不添加特殊后缀 [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]
+- **组件复用**: 基于现有供应商管理界面实现,确保功能完整性和一致性
+
+### 供应商管理功能特性
+- **供应商列表**: 支持分页、搜索、过滤功能
+- **供应商CRUD**: 完整的创建、读取、更新、删除操作
+- **联系人管理**: 供应商联系人信息管理
+- **状态管理**: 供应商启用/禁用状态控制
+- **表单验证**: 完整的表单验证和错误处理
+
+## 测试
+
+#### 测试标准和框架
+- **测试框架**: Vitest 3.2.4 + Testing Library 16.3.0 [Source: architecture/testing-strategy.md#工具版本]
+- **测试位置**:
+  - 集成测试: `packages/supplier-management-ui/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#测试架构改进]
+
+#### 特定测试要求
+- **供应商CRUD测试**: 验证供应商创建、读取、更新、删除功能
+- **联系人管理测试**: 验证联系人信息管理功能
+- **搜索过滤测试**: 验证搜索和过滤功能正常工作
+- **表单验证测试**: 验证表单验证和错误处理
+- **API集成测试**: 验证与供应商模块的API集成
+
+#### 测试执行命令
+- 运行所有测试: `cd packages/supplier-management-ui && pnpm test`
+- 运行单元测试: `cd packages/supplier-management-ui && pnpm test:unit`
+- 运行集成测试: `cd packages/supplier-management-ui && pnpm test:integration`
+- 生成覆盖率报告: `cd packages/supplier-management-ui && pnpm test:coverage`
+
+## 变更日志
+
+| 日期 | 版本 | 描述 | 作者 |
+|------|------|------|------|
+| 2025-11-16 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
+
+## Dev Agent Record
+
+*此部分将在开发代理实施过程中填充*
+
+## QA Results
+
+*此部分将在质量保证审查过程中由QA代理填充*