|
@@ -0,0 +1,208 @@
|
|
|
|
|
+# Story 007.006: 地址模块多租户复制和租户支持
|
|
|
|
|
+
|
|
|
|
|
+## Status
|
|
|
|
|
+
|
|
|
|
|
+⏳ Development Pending
|
|
|
|
|
+
|
|
|
|
|
+## Story
|
|
|
|
|
+
|
|
|
|
|
+**As a** 系统管理员,
|
|
|
|
|
+**I want** 复制地址模块为多租户版本并添加租户ID字段支持,
|
|
|
|
|
+**so that** 地址数据可以实现租户隔离,同时保持单租户版本完全可用。
|
|
|
|
|
+
|
|
|
|
|
+## Acceptance Criteria
|
|
|
|
|
+
|
|
|
|
|
+1. 成功复制 `@d8d/delivery-address-module` 为 `@d8d/delivery-address-module-mt`
|
|
|
|
|
+2. 在地址实体中添加租户ID字段,表名为 `delivery_addresses_mt`
|
|
|
|
|
+3. 所有地址CRUD操作支持租户过滤
|
|
|
|
|
+4. 地址的地区验证功能支持租户隔离
|
|
|
|
|
+5. 租户数据隔离验证通过
|
|
|
|
|
+6. 单租户版本功能完全保留且不受影响
|
|
|
|
|
+7. API集成测试通过
|
|
|
|
|
+8. 性能基准测试无明显下降
|
|
|
|
|
+
|
|
|
|
|
+## Tasks / Subtasks
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 复制地址模块为多租户版本 (AC: 1)
|
|
|
|
|
+ - [ ] 复制 `packages/delivery-address-module` 为 `packages/delivery-address-module-mt`
|
|
|
|
|
+ - [ ] 更新包配置为 `@d8d/delivery-address-module-mt`
|
|
|
|
|
+ - [ ] **清理单租户文件**:删除多租户包中所有单租户相关文件,避免命名冲突
|
|
|
|
|
+ - [ ] 更新依赖:
|
|
|
|
|
+ - [ ] 将 `@d8d/user-module` 替换为 `@d8d/user-module-mt`
|
|
|
|
|
+ - [ ] 将 `@d8d/auth-module` 替换为 `@d8d/auth-module-mt`
|
|
|
|
|
+ - [ ] 将 `@d8d/geo-areas` 替换为 `@d8d/geo-areas-mt`
|
|
|
|
|
+ - [ ] 将 `@d8d/file-module` 替换为 `@d8d/file-module-mt`
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 更新多租户地址实体 (AC: 2)
|
|
|
|
|
+ - [ ] 创建 `DeliveryAddressMt` 实体,表名为 `delivery_addresses_mt`
|
|
|
|
|
+ - [ ] 添加 `tenantId` 字段
|
|
|
|
|
+ - [ ] 保持其他字段与单租户版本一致
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 更新多租户地址服务 (AC: 3, 4)
|
|
|
|
|
+ - [ ] 创建 `DeliveryAddressServiceMt` 服务
|
|
|
|
|
+ - [ ] 所有查询操作自动添加租户过滤
|
|
|
|
|
+ - [ ] 创建操作自动设置租户ID
|
|
|
|
|
+ - [ ] 更新地区验证方法支持租户隔离
|
|
|
|
|
+ - [ ] 更新用户地址查询方法支持租户过滤
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 更新多租户路由配置 (AC: 3)
|
|
|
|
|
+ - [ ] 更新用户路由使用多租户实体和服务
|
|
|
|
|
+ - [ ] 更新管理员路由使用多租户实体和服务
|
|
|
|
|
+ - [ ] 保持API接口与单租户版本一致
|
|
|
|
|
+ - [ ] 更新认证中间件支持租户ID提取
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 更新Schema定义 (AC: 3)
|
|
|
|
|
+ - [ ] 创建多租户地址Schema `DeliveryAddressSchemaMt`
|
|
|
|
|
+ - [ ] 创建多租户用户地址Schema `UserDeliveryAddressSchemaMt`
|
|
|
|
|
+ - [ ] 创建多租户管理员地址Schema `AdminDeliveryAddressSchemaMt`
|
|
|
|
|
+ - [ ] 添加租户ID字段定义
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 实现租户数据隔离API测试 (AC: 5)
|
|
|
|
|
+ - [ ] 在 `packages/delivery-address-module-mt/tests/integration/user-routes.integration.test.ts` 中添加租户隔离测试用例
|
|
|
|
|
+ - [ ] 在 `packages/delivery-address-module-mt/tests/integration/admin-routes.integration.test.ts` 中添加跨租户地址访问安全验证
|
|
|
|
|
+ - [ ] 在现有功能测试中验证租户过滤功能正确性
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 验证单租户系统完整性 (AC: 6)
|
|
|
|
|
+ - [ ] 运行单租户地址模块回归测试
|
|
|
|
|
+ - [ ] 验证单租户API接口不受影响
|
|
|
|
|
+ - [ ] 确认单租户数据库表结构不变
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 执行性能基准测试 (AC: 8)
|
|
|
|
|
+ - [ ] 运行多租户地址模块性能测试
|
|
|
|
|
+ - [ ] 比较单租户与多租户性能差异
|
|
|
|
|
+ - [ ] 确保性能影响小于5%
|
|
|
|
|
+
|
|
|
|
|
+## Dev Notes
|
|
|
|
|
+
|
|
|
|
|
+### 技术栈信息
|
|
|
|
|
+[Source: architecture/tech-stack.md]
|
|
|
|
|
+- **运行时**: Node.js 20.18.3
|
|
|
|
|
+- **框架**: Hono 4.8.5 (Web框架和API路由)
|
|
|
|
|
+- **数据库**: PostgreSQL 17 + TypeORM 0.3.25
|
|
|
|
|
+- **包管理**: pnpm workspace
|
|
|
|
|
+
|
|
|
|
|
+### 编码标准
|
|
|
|
|
+[Source: architecture/coding-standards.md]
|
|
|
|
|
+- **代码风格**: TypeScript严格模式
|
|
|
|
|
+- **测试框架**: Vitest + hono/testing + shared-test-util
|
|
|
|
|
+- **测试位置**: `packages/delivery-address-module-mt/tests/integration/`
|
|
|
|
|
+- **测试重点**: API集成测试、租户数据隔离验证、地址地区验证功能
|
|
|
|
|
+
|
|
|
|
|
+### 项目结构
|
|
|
|
|
+- **包位置**: `packages/delivery-address-module-mt/`
|
|
|
|
|
+- **实体位置**: `packages/delivery-address-module-mt/src/entities/`
|
|
|
|
|
+- **服务位置**: `packages/delivery-address-module-mt/src/services/`
|
|
|
|
|
+- **路由位置**: `packages/delivery-address-module-mt/src/routes/`
|
|
|
|
|
+- **Schema位置**: `packages/delivery-address-module-mt/src/schemas/`
|
|
|
|
|
+
|
|
|
|
|
+### 多租户架构要求
|
|
|
|
|
+[Source: docs/prd/epic-007-multi-tenant-package-replication.md]
|
|
|
|
|
+- **包命名**: 使用 `-mt` 后缀区分多租户版本
|
|
|
|
|
+- **表命名**: 使用 `_mt` 后缀避免冲突
|
|
|
|
|
+- **租户ID**: 所有实体添加 `tenantId` 字段
|
|
|
|
|
+- **数据隔离**: 所有查询自动添加租户过滤
|
|
|
|
|
+- **依赖关系**: 多租户模块间正常依赖
|
|
|
|
|
+- **文件清理**: 多租户包中不保留原单租户文件,避免命名冲突和混淆
|
|
|
|
|
+
|
|
|
|
|
+### 地址模块特性
|
|
|
|
|
+[Source: packages/delivery-address-module/src/entities/delivery-address.entity.ts]
|
|
|
|
|
+- **用户关联**: 每个地址关联特定用户
|
|
|
|
|
+- **地区层级**: 省、市、区、街道四级地区关联
|
|
|
|
|
+- **状态管理**: 启用/禁用状态和默认地址标记
|
|
|
|
|
+- **地区验证**: 完整的省市区验证功能
|
|
|
|
|
+- **权限控制**: 用户路由和管理员路由分离
|
|
|
|
|
+
|
|
|
|
|
+### 多租户地址存储策略
|
|
|
|
|
+- **表名**: `delivery_addresses_mt`
|
|
|
|
|
+- **租户ID**: 所有地址记录关联租户ID
|
|
|
|
|
+- **数据隔离**: 通过租户ID过滤确保数据安全
|
|
|
|
|
+- **用户关联**: 用户ID与租户ID双重过滤
|
|
|
|
|
+- **地区验证**: 地区验证基于租户隔离的地区数据
|
|
|
|
|
+
|
|
|
|
|
+### 测试要求
|
|
|
|
|
+- **集成测试**: `packages/delivery-address-module-mt/tests/integration/**/*.test.ts`
|
|
|
|
|
+- **测试框架**: Vitest + shared-test-util
|
|
|
|
|
+- **测试重点**: API功能验证、租户数据隔离、地区验证功能、跨租户安全
|
|
|
|
|
+- **现有测试文件**:
|
|
|
|
|
+ - `packages/delivery-address-module-mt/tests/integration/user-routes.integration.test.ts` - 用户地址API集成测试
|
|
|
|
|
+ - `packages/delivery-address-module-mt/tests/integration/admin-routes.integration.test.ts` - 管理地址API集成测试
|
|
|
|
|
+ - `packages/delivery-address-module-mt/tests/utils/integration-test-utils.ts` - 测试断言工具
|
|
|
|
|
+ - `packages/delivery-address-module-mt/tests/utils/test-data-factory.ts` - 测试数据工厂
|
|
|
|
|
+
|
|
|
|
|
+### 依赖关系
|
|
|
|
|
+- **必需依赖**:
|
|
|
|
|
+ - `@d8d/user-module-mt` (替换现有的 `@d8d/user-module`)
|
|
|
|
|
+ - `@d8d/auth-module-mt` (替换现有的 `@d8d/auth-module`)
|
|
|
|
|
+ - `@d8d/geo-areas-mt` (替换现有的 `@d8d/geo-areas`)
|
|
|
|
|
+ - `@d8d/file-module-mt` (替换现有的 `@d8d/file-module`)
|
|
|
|
|
+- **共享依赖**:
|
|
|
|
|
+ - `@d8d/shared-crud` (保持)
|
|
|
|
|
+ - `@d8d/shared-types` (保持)
|
|
|
|
|
+ - `@d8d/shared-utils` (保持)
|
|
|
|
|
+- **测试依赖**:
|
|
|
|
|
+ - `@d8d/shared-test-util` (保持)
|
|
|
|
|
+- **框架依赖**:
|
|
|
|
|
+ - `hono`, `@hono/zod-openapi`, `typeorm`, `zod` (保持)
|
|
|
|
|
+
|
|
|
|
|
+### 共享CRUD包租户隔离支持
|
|
|
|
|
+[Source: packages/shared-crud/src/routes/generic-crud.routes.ts]
|
|
|
|
|
+- **当前状态**: ✅ 已完成增强,支持完整的租户隔离功能
|
|
|
|
|
+- **配置选项**:
|
|
|
|
|
+ - `tenantOptions.enabled`: 启用/禁用租户隔离
|
|
|
|
|
+ - `tenantOptions.tenantIdField`: 租户ID字段名(默认 'tenantId')
|
|
|
|
|
+ - `tenantOptions.autoExtractFromContext`: 自动从上下文提取租户ID
|
|
|
|
|
+
|
|
|
|
|
+### 数据库变更
|
|
|
|
|
+- **新表**: `delivery_addresses_mt`
|
|
|
|
|
+- **索引**: 为 `tenantId` 字段创建索引
|
|
|
|
|
+- **迁移**: 使用独立迁移文件,不影响现有表
|
|
|
|
|
+
|
|
|
|
|
+### 先前故事经验
|
|
|
|
|
+[Source: docs/stories/007.005.geo-areas-module-multi-tenant-replication.md]
|
|
|
|
|
+- **数据库同步冲突**: 配置 `fileParallelism: false` 解决并行测试冲突
|
|
|
|
|
+- **TypeScript类型检查**: 使用类型断言处理必需参数验证
|
|
|
|
|
+- **多租户模块依赖**: 统一文件命名规范,使用 `.mt.ts` 后缀
|
|
|
|
|
+- **测试数据工厂**: 确保所有测试数据包含正确的tenantId字段
|
|
|
|
|
+- **文件清理**: 多租户包中不保留单租户文件,避免命名冲突和混淆
|
|
|
|
|
+
|
|
|
|
|
+## Change Log
|
|
|
|
|
+
|
|
|
|
|
+| Date | Version | Description | Author |
|
|
|
|
|
+|------|---------|-------------|---------|
|
|
|
|
|
+| 2025-11-14 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
|
|
|
|
|
+
|
|
|
|
|
+## Dev Agent Record
|
|
|
|
|
+
|
|
|
|
|
+### Agent Model Used
|
|
|
|
|
+- Claude Code (AI开发助手)
|
|
|
|
|
+
|
|
|
|
|
+### Completion Summary
|
|
|
|
|
+⏳ **故事007.006待开发**
|
|
|
|
|
+
|
|
|
|
|
+**待完成工作:**
|
|
|
|
|
+1. 复制地址模块为多租户版本
|
|
|
|
|
+2. 更新多租户地址实体和服务
|
|
|
|
|
+3. 更新多租户路由配置和Schema
|
|
|
|
|
+4. 实现完整的租户数据隔离测试
|
|
|
|
|
+5. 解决技术挑战
|
|
|
|
|
+
|
|
|
|
|
+**预期技术实现:**
|
|
|
|
|
+- 使用 `-mt` 后缀区分多租户版本,保持命名清晰
|
|
|
|
|
+- 使用 `_mt` 后缀避免表名冲突
|
|
|
|
|
+- 所有查询自动添加租户过滤条件,确保数据安全
|
|
|
|
|
+- 地址地区验证功能完整支持租户隔离
|
|
|
|
|
+- API接口与单租户版本完全兼容
|
|
|
|
|
+- **文件清理**: 多租户包中不保留单租户文件,避免命名冲突和混淆
|
|
|
|
|
+- 测试覆盖率100%,所有功能验证通过
|
|
|
|
|
+
|
|
|
|
|
+## QA Results
|
|
|
|
|
+
|
|
|
|
|
+⏳ **质量保证待验证**
|
|
|
|
|
+
|
|
|
|
|
+**待验证项目:**
|
|
|
|
|
+- 集成测试通过率
|
|
|
|
|
+- 多租户地址包构建状态
|
|
|
|
|
+- 租户数据隔离功能验证
|
|
|
|
|
+- API接口兼容性验证
|
|
|
|
|
+- 数据库同步问题解决
|
|
|
|
|
+- 依赖的多租户模块构建状态
|