From ed9af5337d1d89b4be653c8e11f72a280d150ccb Mon Sep 17 00:00:00 2001 From: liuyun Date: Sun, 11 Oct 2026 22:33:21 +0800 Subject: [PATCH] =?UTF-8?q?docs(spec):=20=E5=BD=92=E6=A1=A3=20tenant-brand?= =?UTF-8?q?=20+=20=E5=90=8C=E6=AD=A5=E7=A7=9F=E6=88=B7=E5=93=81=E7=89=8C?= =?UTF-8?q?=E4=B8=BB=20spec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- .../2026-10-11-tenant-brand}/.openspec.yaml | 0 .../2026-10-11-tenant-brand}/design.md | 0 .../2026-10-11-tenant-brand}/proposal.md | 0 .../specs/backend/tenants/spec.md | 0 .../specs/frontend/AD/layout/spec.md | 0 .../specs/shared/api-contract/spec.md | 0 .../specs/shared/data-model/spec.md | 0 .../2026-10-11-tenant-brand}/tasks.md | 0 openspec/specs/backend/tenants/spec.md | 7 +++++++ openspec/specs/frontend/AD/layout/spec.md | 11 +++++++++++ openspec/specs/shared/api-contract/spec.md | 11 +++++++++++ openspec/specs/shared/data-model/spec.md | 7 +++++++ 12 files changed, 36 insertions(+) rename openspec/changes/{tenant-brand => archive/2026-10-11-tenant-brand}/.openspec.yaml (100%) rename openspec/changes/{tenant-brand => archive/2026-10-11-tenant-brand}/design.md (100%) rename openspec/changes/{tenant-brand => archive/2026-10-11-tenant-brand}/proposal.md (100%) rename openspec/changes/{tenant-brand => archive/2026-10-11-tenant-brand}/specs/backend/tenants/spec.md (100%) rename openspec/changes/{tenant-brand => archive/2026-10-11-tenant-brand}/specs/frontend/AD/layout/spec.md (100%) rename openspec/changes/{tenant-brand => archive/2026-10-11-tenant-brand}/specs/shared/api-contract/spec.md (100%) rename openspec/changes/{tenant-brand => archive/2026-10-11-tenant-brand}/specs/shared/data-model/spec.md (100%) rename openspec/changes/{tenant-brand => archive/2026-10-11-tenant-brand}/tasks.md (100%) diff --git a/openspec/changes/tenant-brand/.openspec.yaml b/openspec/changes/archive/2026-10-11-tenant-brand/.openspec.yaml similarity index 100% rename from openspec/changes/tenant-brand/.openspec.yaml rename to openspec/changes/archive/2026-10-11-tenant-brand/.openspec.yaml diff --git a/openspec/changes/tenant-brand/design.md b/openspec/changes/archive/2026-10-11-tenant-brand/design.md similarity index 100% rename from openspec/changes/tenant-brand/design.md rename to openspec/changes/archive/2026-10-11-tenant-brand/design.md diff --git a/openspec/changes/tenant-brand/proposal.md b/openspec/changes/archive/2026-10-11-tenant-brand/proposal.md similarity index 100% rename from openspec/changes/tenant-brand/proposal.md rename to openspec/changes/archive/2026-10-11-tenant-brand/proposal.md diff --git a/openspec/changes/tenant-brand/specs/backend/tenants/spec.md b/openspec/changes/archive/2026-10-11-tenant-brand/specs/backend/tenants/spec.md similarity index 100% rename from openspec/changes/tenant-brand/specs/backend/tenants/spec.md rename to openspec/changes/archive/2026-10-11-tenant-brand/specs/backend/tenants/spec.md diff --git a/openspec/changes/tenant-brand/specs/frontend/AD/layout/spec.md b/openspec/changes/archive/2026-10-11-tenant-brand/specs/frontend/AD/layout/spec.md similarity index 100% rename from openspec/changes/tenant-brand/specs/frontend/AD/layout/spec.md rename to openspec/changes/archive/2026-10-11-tenant-brand/specs/frontend/AD/layout/spec.md diff --git a/openspec/changes/tenant-brand/specs/shared/api-contract/spec.md b/openspec/changes/archive/2026-10-11-tenant-brand/specs/shared/api-contract/spec.md similarity index 100% rename from openspec/changes/tenant-brand/specs/shared/api-contract/spec.md rename to openspec/changes/archive/2026-10-11-tenant-brand/specs/shared/api-contract/spec.md diff --git a/openspec/changes/tenant-brand/specs/shared/data-model/spec.md b/openspec/changes/archive/2026-10-11-tenant-brand/specs/shared/data-model/spec.md similarity index 100% rename from openspec/changes/tenant-brand/specs/shared/data-model/spec.md rename to openspec/changes/archive/2026-10-11-tenant-brand/specs/shared/data-model/spec.md diff --git a/openspec/changes/tenant-brand/tasks.md b/openspec/changes/archive/2026-10-11-tenant-brand/tasks.md similarity index 100% rename from openspec/changes/tenant-brand/tasks.md rename to openspec/changes/archive/2026-10-11-tenant-brand/tasks.md diff --git a/openspec/specs/backend/tenants/spec.md b/openspec/specs/backend/tenants/spec.md index 9353a44..8bb3a87 100644 --- a/openspec/specs/backend/tenants/spec.md +++ b/openspec/specs/backend/tenants/spec.md @@ -26,3 +26,10 @@ #### Scenario: 删除租户 - **WHEN** 删除租户 - **THEN** 其用户/角色/资源/组织/字典/日志一并清理 + +### Requirement: 租户品牌维护 +系统 SHALL 支持管理员在新增/编辑租户时填写品牌名、Logo、主色、版权,并在租户详情/列表中返回。 + +#### Scenario: 编辑租户品牌 +- **WHEN** 管理员编辑某租户的品牌字段 +- **THEN** 品牌字段保存并可查询 diff --git a/openspec/specs/frontend/AD/layout/spec.md b/openspec/specs/frontend/AD/layout/spec.md index b85f091..7722e9f 100644 --- a/openspec/specs/frontend/AD/layout/spec.md +++ b/openspec/specs/frontend/AD/layout/spec.md @@ -74,6 +74,17 @@ - **WHEN** 用户开启「固定底部」 - **THEN** 版权条常驻视口底部;关闭时随内容滚动 +### Requirement: 租户品牌应用 +前端 SHALL 在登录后拉取当前租户品牌,并应用:主色覆盖默认主题色、Logo/品牌名显示于顶栏、版权显示于底部;字段为空时回退默认。 + +#### Scenario: 应用租户品牌 +- **WHEN** 用户登录某租户 +- **THEN** 顶栏标题/Logo、主题色、底部版权按该租户品牌渲染 + +#### Scenario: 缺省回退 +- **WHEN** 租户未配置某品牌字段 +- **THEN** 该字段回退为默认值(标题回退 name、主题色回退默认主色) + ### Requirement: 布局设置持久化 所有布局与主题设置 SHALL 持久化到 localStorage,刷新页面后保持。 diff --git a/openspec/specs/shared/api-contract/spec.md b/openspec/specs/shared/api-contract/spec.md index 98bd928..0e2241f 100644 --- a/openspec/specs/shared/api-contract/spec.md +++ b/openspec/specs/shared/api-contract/spec.md @@ -96,3 +96,14 @@ #### Scenario: 标记已读 - **WHEN** 用户请求 POST /notices/:id/read - **THEN** 该通知对当前用户标记为已读 + +### Requirement: 租户品牌接口 +系统 SHALL 提供 `GET /auth/brand`(仅登录态),返回当前租户品牌(name、brandName、logoUrl、themeColor、copyright);tenant 的新增/编辑/列表接口 SHALL 支持品牌字段。 + +#### Scenario: 拉取当前租户品牌 +- **WHEN** 已登录用户请求 GET /auth/brand +- **THEN** 返回其所在租户的品牌字段(缺省为空) + +#### Scenario: 维护租户品牌 +- **WHEN** 管理员新增或编辑租户并填写品牌字段 +- **THEN** 品牌字段随 tenant 一并保存与返回 diff --git a/openspec/specs/shared/data-model/spec.md b/openspec/specs/shared/data-model/spec.md index 41105bb..969036b 100644 --- a/openspec/specs/shared/data-model/spec.md +++ b/openspec/specs/shared/data-model/spec.md @@ -35,6 +35,13 @@ - **WHEN** 用户阅读某通知 - **THEN** 写入 notice_read 记录其 read_at +### Requirement: 租户品牌字段 +tenant 实体 SHALL 新增可空品牌字段:`brand_name`(品牌显示名)、`logo_url`(Logo 地址)、`theme_color`(主色,如 #2E7FA3)、`copyright`(版权文案);为空时前端回退默认值或 `name`。 + +#### Scenario: 租户配置品牌 +- **WHEN** 管理员为租户填写品牌名/Logo/主色/版权 +- **THEN** 存入 tenant 对应字段,登录该租户后前端按此渲染 + ### Requirement: 资源类型与代码 resource 实体 SHALL 通过 type 字段区分菜单(menu)、按钮(button)、接口(api)三种类型;「目录」由菜单节点是否拥有菜单子节点推导,不设独立类型。每个 resource SHALL 拥有租户内唯一的 code,作为关联键与权限标识。