diff --git a/openspec/changes/platform-tenant-switch/.openspec.yaml b/openspec/changes/archive/2026-10-12-platform-tenant-switch/.openspec.yaml similarity index 100% rename from openspec/changes/platform-tenant-switch/.openspec.yaml rename to openspec/changes/archive/2026-10-12-platform-tenant-switch/.openspec.yaml diff --git a/openspec/changes/platform-tenant-switch/design.md b/openspec/changes/archive/2026-10-12-platform-tenant-switch/design.md similarity index 100% rename from openspec/changes/platform-tenant-switch/design.md rename to openspec/changes/archive/2026-10-12-platform-tenant-switch/design.md diff --git a/openspec/changes/platform-tenant-switch/proposal.md b/openspec/changes/archive/2026-10-12-platform-tenant-switch/proposal.md similarity index 100% rename from openspec/changes/platform-tenant-switch/proposal.md rename to openspec/changes/archive/2026-10-12-platform-tenant-switch/proposal.md diff --git a/openspec/changes/platform-tenant-switch/specs/backend/auth/spec.md b/openspec/changes/archive/2026-10-12-platform-tenant-switch/specs/backend/auth/spec.md similarity index 100% rename from openspec/changes/platform-tenant-switch/specs/backend/auth/spec.md rename to openspec/changes/archive/2026-10-12-platform-tenant-switch/specs/backend/auth/spec.md diff --git a/openspec/changes/platform-tenant-switch/specs/frontend/AD/layout/spec.md b/openspec/changes/archive/2026-10-12-platform-tenant-switch/specs/frontend/AD/layout/spec.md similarity index 100% rename from openspec/changes/platform-tenant-switch/specs/frontend/AD/layout/spec.md rename to openspec/changes/archive/2026-10-12-platform-tenant-switch/specs/frontend/AD/layout/spec.md diff --git a/openspec/changes/platform-tenant-switch/specs/shared/api-contract/spec.md b/openspec/changes/archive/2026-10-12-platform-tenant-switch/specs/shared/api-contract/spec.md similarity index 100% rename from openspec/changes/platform-tenant-switch/specs/shared/api-contract/spec.md rename to openspec/changes/archive/2026-10-12-platform-tenant-switch/specs/shared/api-contract/spec.md diff --git a/openspec/changes/platform-tenant-switch/tasks.md b/openspec/changes/archive/2026-10-12-platform-tenant-switch/tasks.md similarity index 100% rename from openspec/changes/platform-tenant-switch/tasks.md rename to openspec/changes/archive/2026-10-12-platform-tenant-switch/tasks.md diff --git a/openspec/specs/backend/auth/spec.md b/openspec/specs/backend/auth/spec.md index 9e8850f..2e1f82d 100644 --- a/openspec/specs/backend/auth/spec.md +++ b/openspec/specs/backend/auth/spec.md @@ -67,3 +67,18 @@ #### Scenario: 改密后清除 - **WHEN** 待改密用户修改密码成功 - **THEN** 其 must_change_password 置为 false + +### Requirement: 平台超管租户切换 +系统 SHALL 支持平台超管(`super_admin`)切入任意租户:`POST /auth/switch-tenant` 校验调用者为平台超管后签发 `super=true` 的新 token,其 `tenantCode` 为目标租户、`sub` 为超管真实 userId;切换后数据按目标租户过滤、权限按超管绕过。 + +#### Scenario: 切换租户 +- **WHEN** 平台超管请求切入目标租户 +- **THEN** 返回新 token(tenantCode=目标租户、super=true) + +#### Scenario: 非超管切换被拒 +- **WHEN** 非平台超管请求切换租户 +- **THEN** 系统返回 403 + +#### Scenario: 切换后数据隔离 +- **WHEN** 切换后的超管查询业务数据 +- **THEN** 返回目标租户的数据 diff --git a/openspec/specs/frontend/AD/layout/spec.md b/openspec/specs/frontend/AD/layout/spec.md index 7722e9f..1717da6 100644 --- a/openspec/specs/frontend/AD/layout/spec.md +++ b/openspec/specs/frontend/AD/layout/spec.md @@ -85,6 +85,13 @@ - **WHEN** 租户未配置某品牌字段 - **THEN** 该字段回退为默认值(标题回退 name、主题色回退默认主色) +### Requirement: 顶栏租户切换 +前端 SHALL 在顶栏为平台超管提供「切换租户」入口:列出全部租户,切换后替换 token、重置菜单/字典/权限等缓存并刷新。 + +#### Scenario: 切换租户 +- **WHEN** 平台超管选择某租户并切换 +- **THEN** 前端更新 token、重置缓存,按目标租户渲染菜单与数据 + ### Requirement: 布局设置持久化 所有布局与主题设置 SHALL 持久化到 localStorage,刷新页面后保持。 diff --git a/openspec/specs/shared/api-contract/spec.md b/openspec/specs/shared/api-contract/spec.md index 5694d8e..29b33cd 100644 --- a/openspec/specs/shared/api-contract/spec.md +++ b/openspec/specs/shared/api-contract/spec.md @@ -115,3 +115,10 @@ #### Scenario: 维护租户品牌 - **WHEN** 管理员新增或编辑租户并填写品牌字段 - **THEN** 品牌字段随 tenant 一并保存与返回 + +### Requirement: 租户切换接口 +系统 SHALL 提供 `POST /auth/switch-tenant`(body 含 tenantCode,仅登录态),由平台超管调用,返回切换后的新 access/refresh token 与目标租户信息。 + +#### Scenario: 切换租户 +- **WHEN** 平台超管请求 POST /auth/switch-tenant +- **THEN** 返回新 token,后续请求按目标租户上下文执行