From 17912ea8a76b8934cc9ea0950e0d718e6dc377f4 Mon Sep 17 00:00:00 2001 From: zhoulei Date: Thu, 20 Aug 2026 10:41:09 +0800 Subject: [PATCH] =?UTF-8?q?chore(frontend):=20=E6=B2=BB=E7=90=86=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=A1=A5=E5=85=85=20SaaS=20=E5=A4=9A=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E6=8C=87=E9=92=88=E4=B8=8E=E7=A1=AC=E7=BA=A6=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.project.agents/SELF_CONSTRAINTS.md | 6 ++++++ .../.project.agents/docs/context/ARCHITECTURE.md | 10 ++++++++++ .../.project.agents/docs/context/CONVENTIONS.md | 1 + 3 files changed, 17 insertions(+) diff --git a/abacus-static-framework/.project.agents/SELF_CONSTRAINTS.md b/abacus-static-framework/.project.agents/SELF_CONSTRAINTS.md index 31180a5..26f7d1e 100644 --- a/abacus-static-framework/.project.agents/SELF_CONSTRAINTS.md +++ b/abacus-static-framework/.project.agents/SELF_CONSTRAINTS.md @@ -52,6 +52,12 @@ - 不为不可能发生的情况加 fallback。 - 不引入向后兼容 shim,除非用户明确要求。 +### B7. 多租户隔离(SaaS 硬约束) +- 任何数据访问(JPA / 原生 SQL / 编排)必须带 `tenant_id` 过滤;缓存 key 必须前缀 `tenant:{tenantId}:`。 +- 租户标识以 token 为准,禁止在业务参数 / URL 中传递 tenantId;跨租户操作须 `@CrossTenant` + 审批。 +- 前端:品牌/主题/菜单须按 `tenantConfig` 动态加载,禁止硬编码;`X-Tenant-Id` 头由 `request.ts` 自动附加,业务代码不得手写。 +- 详细设计与落地映射见 `docs/architecture.md §7`、`coding-standards.md §9`;本仓库 `ARCHITECTURE.md §10`。 + ### B6. 实施日志(execution log) - **每完成一个可独立验收的部分(milestone 或子任务),必须在 `.project.agents/log` 写日志**。格式与时机见 `VIBECODING_GUIDE`。 - 日志内必须包含本段的版本控制提交列表;若本段未提交,明确写出"未提交"及原因。 diff --git a/abacus-static-framework/.project.agents/docs/context/ARCHITECTURE.md b/abacus-static-framework/.project.agents/docs/context/ARCHITECTURE.md index 2fdb4a9..191d3b7 100644 --- a/abacus-static-framework/.project.agents/docs/context/ARCHITECTURE.md +++ b/abacus-static-framework/.project.agents/docs/context/ARCHITECTURE.md @@ -29,6 +29,7 @@ - I1. `src/framework/**` 只读:业务代码不得 import 后修改框架文件;框架变更只能由框架负责人进行。 - I2. 业务请求一律经 `framework/utils/request.ts`,禁止裸 `axios`/`fetch`。 - I3. 服务别名首段必须是 `settingsStore.backendServices` 中已注册的键。 +- I4. 多租户上下文来自登录 JWT / `useTenantStore`,禁止业务代码硬编码租户标识或手写 `X-Tenant-Id` 头;品牌/主题/菜单须按 `tenantConfig` 动态加载。详见 `../../../../docs/architecture.md §7`。 ## 2. 模块清单 @@ -163,3 +164,12 @@ src/ - 加/删模块或改依赖方向 → 改本文 §2 + §3,同一 commit。 - 改对外签名(request/gridDefaultProps 等)→ 先改 §3.2,再改代码。 - 与 `PRD.md` 冲突 → 以 `PRD.md` 为准,回改本文;与共享 `docs/coding-standards.md` 冲突 → 以 docs/ 为准并回改本文。 + +## 10. SaaS 多租户架构(指针) + +> 完整设计(租户动态品牌/主题/模块/菜单、前后端协作、扩展)见工作区 `../../../../docs/architecture.md §7`;编码约束见 `coding-standards.md §9`。本文仅记录前端特有约束: + +- 登录后 `useTenantStore` 保存 `tenantId` + `tenantConfig` 并持久化;`applyTenantTheme(config)` 运行时应用品牌/主题。 +- 菜单经 `permissionStore.filterAsyncRoutes` 做"权限 ∩ 租户模块订阅"双重过滤。 +- `framework/utils/request.ts` 自动附加 `X-Tenant-Id`(取自 `useTenantStore`);业务代码不得手写。 +- 新增前端 `subsystem/store/tenant.ts`、`framework/utils/theme.ts`,并扩展 `request.ts` 与 `permissionStore`,包归属见 §2 / §6。 diff --git a/abacus-static-framework/.project.agents/docs/context/CONVENTIONS.md b/abacus-static-framework/.project.agents/docs/context/CONVENTIONS.md index 7d4b915..a5e257c 100644 --- a/abacus-static-framework/.project.agents/docs/context/CONVENTIONS.md +++ b/abacus-static-framework/.project.agents/docs/context/CONVENTIONS.md @@ -89,3 +89,4 @@ Conventional Commits:`type(scope): subject`。允许 type:`feat` / `fix` / ` ## 6. 不在本文范围(明确划清) - 模块拆分归 `ARCHITECTURE.md`;行为/范围归 `PRD.md`;前后端共享约束(接口契约/异常码/分页/APP_NAME)归 `docs/coding-standards.md`;视觉细节归 `UIUX.md`。 +- 多租户 SaaS 隔离与前后端协作归 `docs/architecture.md §7`;编码强制约束归 `docs/coding-standards.md §9`(前端落地见本仓库 `ARCHITECTURE.md §10`)。