系统管理模块更新

This commit is contained in:
Shen Wei
2026-05-02 05:10:16 +08:00
parent 804954c367
commit 464c5fce51
4 changed files with 567 additions and 348 deletions

View File

@@ -2,8 +2,8 @@
**状态**Draft
**作者**:产品经理
**最后更新**2026-04-24
**版本**v1.0
**最后更新**2026-05-01
**版本**v1.3
**利益相关方**:工程负责人、运营团队、安全合规、客户成功团队
## 变更历史
@@ -11,6 +11,8 @@
| 版本 | 日期 | 作者 | 变更说明 |
|------|------|------|---------|
| v1.0 | 2026-04-24 | 产品经理 | 初稿 |
| v1.1 | 2026-05-01 | 产品经理 | ① Story 1 补充「默认配置」内容定义(权限定义 + 系统默认角色);② Story 1 补充欢迎通知机制邮件内容规范、默认密码发放、Tenant Code、页面下载 PDF③ Story 2 补充 License 时效管理(到期自动挂起、提前 15 天预警倒计时);④ Story 3 标注为已废弃(暂不实现);⑤ 新增 Story 7平台版本总览基础数据版本 + 租户数据升级版本);⑥ §5.1.1 补充默认配置内容说明、通知机制细节、时效日期字段、到期挂起流程;⑦ 管理员角色权限矩阵补充版本总览权限 |
| v1.3 | 2026-05-01 | 产品经理 | Story 1 Tenant Admin 权限机制修正:初始 Tenant Admin 不赋予任何业务角色,由系统在租户创建时直接写入独立的「租户管理员」专属权限集合;该集合不在角色管理界面显示,不可自行修改或分配;新增/变更租户管理员须由平台运营方操作 |
---
@@ -48,13 +50,13 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
## 2. 目标与成功指标
| 目标 | 指标 | 当前基线 | 目标值 | 测量窗口 |
|------|------|---------|--------|---------|
| 租户管理效率提升 | 新租户开通耗时 | 人工脚本 ~30 分钟 | < 5 分钟(含自动初始化) | 上线后 30 天 |
| 平台升级零停机 | 升级期间受影响租户数 | 全量中断 | 灰度阶段受影响 ≤ 5% 租户 | 每次升级 |
| 数据恢复能力建立 | RTO恢复时间目标 | 无标准流程 | 单租户恢复 < 2 小时 | v1 上线即达标 |
| 操作合规覆盖 | 高危操作审计日志覆盖率 | 0% | 100% | 上线后 30 天 |
| 管理员安全 | MFA 启用率 | 0% | 100%(强制) | 上线即达标 |
| 目标 | 指标 | 当前基线 | 目标值 | 测量窗口 |
| -------- | ----------- | ----------- | --------------- | -------- |
| 租户管理效率提升 | 新租户开通耗时 | 人工脚本 ~30 分钟 | < 5 分钟(含自动初始化) | 上线后 30 天 |
| 平台升级零停机 | 升级期间受影响租户数 | 全量中断 | 灰度阶段受影响 ≤ 5% 租户 | 每次升级 |
| 数据恢复能力建立 | RTO恢复时间目标 | 无标准流程 | 单租户恢复 < 2 小时 | v1 上线即达标 |
| 操作合规覆盖 | 高危操作审计日志覆盖率 | 0% | 100% | 上线后 30 天 |
| 管理员安全 | MFA 启用率 | 0% | 100%(强制) | 上线即达标 |
---
@@ -78,11 +80,29 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
> 作为运营人员,我希望通过填写表单快速完成租户开通,并由系统自动完成数据库初始化与欢迎邮件,无需手动执行脚本。
**验收标准**
- [ ] 表单提交后,系统在后台自动创建 PostgreSQL Schema 并注入默认配置,完成时间 < 60 秒
- [ ] 新租户创建后,管理员收到系统通知,租户联系人收到欢迎邮件
- [ ] 子域名创建成功后在租户详情中显示可访问链接
- [ ] 表单提交后,系统在后台自动创建 PostgreSQL Schema 并注入默认配置(见 §5.1.1 默认配置说明),完成时间 < 60 秒
- [ ] 默认配置注入包含两部分:**1权限定义PermissionDef**:注入该平台所有权限码的定义数据(`permission_code`、描述、模块归属),作为该租户 RBAC 权限体系的基础;**2系统默认角色与权限绑定**:按「角色权限矩阵.md」定义注入 7 个系统内置业务角色——置业顾问、店管、区管、区总、副总、总经、其他职能——并完成各角色对应的权限集合绑定
- [ ] 初始 Tenant Admin 用户(以联系人手机号创建)**不通过业务角色赋权**,而是在租户创建时由系统直接写入「租户管理员」专属权限集合;该权限集合独立于 7 个业务角色之外,不在租户的角色管理界面中显示,不可由 Tenant Admin 自行修改或分配给其他用户;如需新增或变更租户管理员,须由平台运营方在管理后台操作
- [ ] 新租户创建后,平台运营管理员收到系统内通知(站内消息);租户联系人收到欢迎邮件(见下方「欢迎邮件规范」)
- [ ] 若联系人无邮箱,运营人员可在租户详情页下载「入驻信息 PDF 文档」,通过微信等渠道手动转发
- [ ] 租户访问地址采用 Fonrey 平台统一域名 + Tenant Code 参数的形式(如 `https://app.fonrey.com/?tenant=ABCD`),无需为每个租户单独创建子域名;租户详情页展示该访问链接,可一键复制
- [ ] 创建失败时回滚所有已创建资源,并显示明确的错误原因
**欢迎邮件规范**(联系人有邮箱时自动发送):
| 字段 | 内容 |
| ---- | ----------------------------------------------------------------------------------------------------------- |
| 主题 | 【房睿平台】您的账号已开通,欢迎登录 |
| 收件人 | 租户联系人邮箱 |
| 正文内容 | 公司名称、**Tenant Code**(登录时所需的租户识别码)、登录地址(`https://app.fonrey.com/?tenant={Tenant Code}`、Tenant Admin 手机号(脱敏展示后三位)、**系统初始密码**(明文,首次登录后强制修改)、平台客服联系方式 |
| 备注 | 初始密码由系统随机生成12 位,含大小写字母+数字),发送后立即标记为「首次登录强制修改」状态 |
**入驻信息 PDF 文档**(可在租户详情页下载,适用于无邮箱客户):
- 包含与欢迎邮件相同的所有关键信息
- 页面入口:租户详情 → 基本信息 Tab → 「下载入驻信息」按钮
- 文件名格式:`{公司名称}_入驻信息_{日期}.pdf`
**Story 2**:挂起问题租户
> 作为运营人员,我希望能快速冻结欠费租户的访问,同时保证数据不丢失,并在欠费解决后一键恢复。
@@ -92,15 +112,21 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
- [ ] 支持设置到期时间,到期后系统自动恢复租户状态,并发送通知邮件
- [ ] 所有挂起/恢复操作记录于操作审计日志,包含操作人、时间、原因
**Story 3**响应客户数据导出请求
**Story 2b**License 时效管理与到期自动挂起
> 作为运营人员,我希望能为指定租户触发数据导出,并在完成后通过邮件通知对方下载,无需手动操作数据库
> 作为 Platform Admin我希望每个租户能够设置 License 有效期,在到期后系统自动挂起租户,并在到期前提前预警,减少人工干预
**验收标准**
- [ ] 导出任务异步执行Celery提交后界面不阻塞
- [ ] 导出完成后邮件通知管理员,邮件包含加密下载链接,有效期 24 小时
- [ ] 支持按模块选择导出内容(客户数据、房源数据、交易记录、系统配置
- [ ] 导出格式支持CSV、JSON、SQL Dump
- [ ] 每个租户的「基本信息」中包含 **License 到期日期**字段,由 Platform Admin 在创建租户或套餐续费时设定(如购买 1 年期 License
- [ ] 系统Celery Beat 每日检查)在 License 到期时自动将租户状态切换为「已挂起 Suspended」挂起原因标注为「License 到期」
- [ ] 自动挂起后租户联系人收到通知邮件Platform Admin 可手动解除挂起(续费后操作
- [ ] **提前 15 天预警倒计时**:租户内的 Tenant Admin 在登录后的管理界面顶部看到醒目横幅提示,内容示例:「您的 License 将于 X 天后到期({到期日期}),请联系平台续费。」;提前 15 天开始出现,每天展示直至到期或续费完成
- [ ] 倒计时横幅仅对租户端 Tenant Admin 可见,不影响普通 Agent 用户体验(可配置)
- [ ] License 到期日期在管理后台租户列表和详情页均可见支持按「即将到期15 天内)」筛选
**Story 3**:响应客户数据导出请求
> **状态**:暂缓(当前 P0 计划阶段不实现,后续迭代规划)。本 Story 保留需求描述,待进入相应排期后正式细化。
---
@@ -145,7 +171,46 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
---
## 5. 功能规格
### Persona DPlatform Admin平台超级管理员David平台版本总览
**Story 7**:查看平台与租户版本总览
> 作为 Platform Admin我希望能在管理界面一眼看到整个平台的版本情况包括基础数据版本和每个租户各自的数据升级版本以便掌握升级进度和版本差异。
**验收标准**
- [ ] 管理控制台「系统版本管理」页面提供「版本总览」视图,分为两个部分:
**Part 1平台基础数据版本**
- 展示当前平台基础数据(公共 Schema 中的 PermissionDef、系统配置等 seed 数据)的版本号
- 该版本对所有租户一致,每次平台升级为一次性全量升级
- 展示字段:版本号、最后升级时间、升级描述、升级执行人
**Part 2租户数据升级版本**
- 以列表形式展示每个租户当前的数据版本号(即该租户 Schema 已完成的 migration 版本)
- 由于采用灰度升级,各租户版本号可能不一致
- 列表字段:租户名称、当前数据版本号、上次升级时间、升级状态(最新 / 待升级 / 升级中 / 升级失败)
- 支持按「待升级」「升级失败」筛选,快速定位异常租户
- 点击租户行可跳转至该租户详情的「备份记录」Tab 查看详情
- [ ] 页面支持手动刷新版本状态
- [ ] 「版本总览」数据展示无需实时,允许最多 5 分钟缓存延迟
---
**Story 8**:查看与控制租户用户数
> 作为 Platform Admin我希望能在管理界面看到每个租户当前的用户数量并能设置用户数上限以便根据 License 授权进行管控(用户数是 License 计费的重要依据)。
**验收标准**
- [ ] 租户列表新增「当前用户数」列,显示该租户当前已创建的有效用户总数(含 Tenant Admin + 所有 Agent不含已删除/离职用户)
- [ ] 租户详情页「基本信息」Tab 显示:当前用户数 / License 授权用户数上限12 / 50
- [ ] Platform Admin 可在租户详情页设置「License 授权用户数上限」字段当租户实际用户数达到上限时Tenant Admin 在该租户内将无法继续创建新用户,并收到提示:「当前用户数已达 License 上限,请联系平台扩容」
- [ ] Platform Admin 可随时调整用户数上限(续费扩容 or 缩容),变更记录写入操作审计日志
- [ ] 租户列表支持按「用户数已满(≥ 上限)」筛选,便于平台运营主动识别需要续费的租户
---
### 5.1 租户管理Tenant Management
@@ -157,27 +222,40 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|------|------|------|------|
| 公司名称 | Text | ✅ | 最大 100 字符 |
| 联系人 | Text | ✅ | 租户主联系人姓名 |
| 联系邮箱 | Email | | 用于发送欢迎邮件及系统通知 |
| 联系邮箱 | Email | ❌(可选) | 用于发送欢迎邮件及系统通知;无邮箱时改用 PDF 下载方式 |
| 所在地区 | Select | ✅ | 省市两级 |
| 订阅套餐 | Select | ✅ | Basic / Professional / Enterprise |
| 子域名 | Text | ✅ | 格式:`{slug}.platform.com`,唯一,创建后不可修改 |
| 子域名 | Text | ❌(无需) | 租户访问统一使用 Fonrey 平台域名 + Tenant Code 参数,无子域名 |
| License 到期日期 | Date | ✅ | 由 Platform Admin 设定,决定租户有效期;到期后系统自动挂起 |
创建流程:
1. 表单校验通过后,后台 Celery 任务执行:
- 创建 PostgreSQL Schema`tenant_{id}`
- 执行 Migrate 初始化表结构
- 注入默认系统配置
- 发送欢迎邮件至联系邮箱
- 注入默认配置(见下方「默认配置内容」说明)
- 生成初始密码12 位随机,含大小写字母+数字),标记为「首次登录强制修改」
- 若联系邮箱已填写:发送欢迎邮件(含 Tenant Code、初始密码、平台访问链接 `https://app.fonrey.com/?tenant={TenantCode}`
2. 任务完成后更新租户状态为 `active`,失败则全量回滚并标记为 `failed`
3. 生成唯一 Tenant IDUUID记录创建时间、创建人
3. 生成唯一 Tenant IDUUID及 Tenant Code可读短码`FR-2024-0001`,记录创建时间、创建人
**默认配置内容Schema 初始化时注入)**
| 配置类型 | 内容 | 说明 |
|---------|------|------|
| 权限定义PermissionDef | 平台全量权限码(`permission_code`、描述、模块归属) | 从 public schema 同步至租户 schema作为 RBAC 权限体系基础 |
| 系统默认角色 | Tenant Admin租户管理员、Agent经纪人 | 按权限管理模块 PRD 定义的权限集合完成角色-权限绑定 |
| 初始 Tenant Admin 用户 | 以联系人手机号创建,角色为 Tenant Admin | 首次登录后强制修改密码 |
**挂起Suspend**
- 操作触发条件:运营人员手动触发,选择挂起原因(欠费 / 违规 / 主动申请 / 其他)
- 操作触发条件:
- **手动触发**:运营人员手动触发,选择挂起原因(欠费 / 违规 / 主动申请 / 其他)
- **自动触发**Celery Beat 每日检查 License 到期日期到期后自动挂起原因标注为「License 到期」)
- 可设置挂起到期时间(留空表示永久挂起直至手动恢复)
- 挂起效果:该租户所有用户请求返回 `HTTP 403`,重定向至暂停提示页;管理后台数据仍可访问
- 到期自动恢复:`Celery Beat` 定时检查到期挂起记录,自动切换状态为 `active`
- 通知:挂起与恢复均向租户联系邮箱发送通知邮件
- 到期自动恢复:`Celery Beat` 定时检查到期挂起记录,自动切换状态为 `active`仅适用于手动设置了到期时间的挂起License 到期自动挂起需 Platform Admin 手动恢复)
- 通知:挂起与恢复均向租户联系邮箱发送通知邮件(无邮箱则跳过)
- **License 到期预警**License 到期前 15 天起,租户端 Tenant Admin 管理界面顶部显示倒计时横幅,直至到期或续费后由 Platform Admin 更新 License 到期日期
**删除Delete**
@@ -385,7 +463,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
- 分页展示(默认 20 条/页)
- 搜索:按公司名称、子域名、联系邮箱关键词搜索
- 筛选按状态Active / Suspended / Deleted、套餐Basic/Pro/Enterprise、注册时间范围
- 筛选按状态Active / Suspended / Deleted、套餐Basic/Pro/Enterprise、注册时间范围、**即将到期15 天内)**
- 列表字段:公司名称、子域名、套餐、状态、注册时间、活跃用户数
- 快捷操作:查看详情、挂起、发起备份、数据导出
@@ -564,6 +642,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
| 数据恢复 | ✅ | ❌ | ❌ |
| 系统升级 | ✅ | ❌ | ❌ |
| 系统回滚 | ✅ | ❌ | ❌ |
| 查看版本总览 | ✅ | ✅ | ❌ |
| 配置告警规则 | ✅ | ✅ | ❌ |
| 查看审计日志 | ✅ | ✅ | ✅ |
| 导出审计日志 | ✅ | ✅ | ✅ |