已完成
作为 系统管理员, 我想要 复制商户模块并添加多租户支持, 以便 商户可以在租户隔离的环境中管理,同时保持与现有单租户系统的完全兼容性。
@d8d/merchant-module 为 @d8d/merchant-module-mt,包含正确的包配置MerchantMt,包含租户ID字段和表名 merchants_mt[x] 复制商户模块为多租户版本 (AC: 1)
packages/merchant-module 为 packages/merchant-module-mt@d8d/merchant-module-mt@d8d/user-module 替换为 @d8d/user-module-mt@d8d/auth-module 替换为 @d8d/auth-module-mt@d8d/file-module 替换为 @d8d/file-module-mt[x] 更新多租户商户实体 (AC: 2)
MerchantMt 实体,表名为 merchants_mttenantId 字段和正确的TypeORM配置[x] 更新多租户商户服务 (AC: 3, 4)
MerchantServiceMt 服务,继承GenericCrudService[x] 更新多租户路由配置 (AC: 3)
[x] 更新Schema定义 (AC: 3)
MerchantSchemaMtUserMerchantSchemaMtAdminMerchantSchemaMt[x] 实现租户数据隔离API测试 (AC: 7)
packages/merchant-module-mt/tests/integration/user-routes.integration.test.ts 中添加租户隔离测试用例packages/merchant-module-mt/tests/integration/admin-routes.integration.test.ts 中添加跨租户商户访问安全验证[x] 验证单租户系统完整性 (AC: 5, 6)
[x] 在创建复制的代码修改完后先运行安装
pnpm install 安装依赖[x] 执行性能基准测试 (AC: 8)
[x] 执行回归测试验证 (AC: 9)
从故事007.006(地址模块)学到的关键经验:
.mt.ts 后缀区分多租户文件 [Source: epic-007-multi-tenant-package-replication.md#最佳实践]fileParallelism: false 避免数据库冲突 [Source: epic-007-multi-tenant-package-replication.md#技术挑战和解决方案]商户实体结构:
merchants_mt (多租户版本)tenantId (必需,已索引)name, username, password, phone, realname, loginNum, loginTime, loginIp, lastLoginTime, lastLoginIp, state, rsaPublicKey, aesKey [Source: source-tree.md#商户管理模块]createdBy, updatedBy [Source: source-tree.md#商户管理模块]createdAt, updatedAt [Source: source-tree.md#商户管理模块]用户路由:
/api/merchants (用户专用)authMiddleware 来自 @d8d/auth-module-mt [Source: source-tree.md#商户管理模块]userIdField: 'createdBy' [Source: source-tree.md#商户管理模块]['name', 'username', 'realname', 'phone'] [Source: source-tree.md#商户管理模块]管理员路由:
/api/admin/merchants (完整权限)authMiddleware 来自 @d8d/auth-module-mt [Source: source-tree.md#商户管理模块]商户服务方法:
updateLoginStats(merchantId, loginTime, loginIp): 更新商户登录统计信息 [Source: source-tree.md#商户管理模块]findByUsername(username): 根据用户名查找商户,包含租户过滤 [Source: source-tree.md#商户管理模块]getByState(state): 根据状态获取商户列表,包含租户过滤 [Source: source-tree.md#商户管理模块]要创建的源文件:
packages/merchant-module-mt/src/entities/merchant.mt.entity.ts (多租户实体)packages/merchant-module-mt/src/services/merchant.mt.service.ts (多租户服务)packages/merchant-module-mt/src/routes/user-routes.mt.ts (多租户用户路由)packages/merchant-module-mt/src/routes/admin-routes.mt.ts (多租户管理员路由)packages/merchant-module-mt/src/schemas/merchant.mt.schema.ts (多租户schemas)packages/merchant-module-mt/tests/integration/tenant-isolation.integration.test.ts (租户隔离测试)要删除的文件(单租户清理):
.mt.ts 后缀的文件数据库索引:
tenantId 字段上创建索引以提高性能 [Source: epic-007-multi-tenant-package-replication.md#数据库迁移策略]认证集成:
@d8d/auth-module-mt 的更新版 authMiddleware,从用户上下文中提取租户ID [Source: epic-007-multi-tenant-package-replication.md#租户上下文管理]测试标准:
packages/merchant-module-mt/tests/integration/ [Source: testing-strategy.md#集成测试]特定测试要求:
| 日期 | 版本 | 描述 | 作者 |
|---|---|---|---|
| 2025-11-14 | 1.0 | 初始故事创建,包含从前面的故事中学到的全面经验教训 | Bob (Scrum Master) |
实施进展 (2025-11-14):
✅ 已完成任务:
@d8d/merchant-module-mtMerchantMt 和表结构MerchantServiceMt 支持租户过滤✅ 所有测试通过:
✅ 回归测试结果 (200个测试全部通过):
技术挑战解决:
update和delete方法中的权限验证抛出错误逻辑,确保路由层能正确捕获并返回相应状态码代码质量:
MerchantTestUtils.mt.ts 后缀此部分将在质量保证审查过程中由QA代理填充