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,作为关联键与权限标识。