登录模块审核
This commit is contained in:
177
Project/fonrey/PRD/PERSONA_定义.md
Normal file
177
Project/fonrey/PRD/PERSONA_定义.md
Normal file
@@ -0,0 +1,177 @@
|
||||
# Fonrey 系统角色 Persona 定义
|
||||
|
||||
**版本**:v1.0
|
||||
**状态**:已定稿
|
||||
**作者**:产品团队
|
||||
**最后更新**:2026-04-30
|
||||
|
||||
> 本文档是 Fonrey 所有 PRD、DATA_MODEL、PERMISSION_SEED 等文档的角色命名**唯一权威来源**。
|
||||
> 所有其他文档中的角色称谓**必须**以本文档为准,禁止自造名称或混用。
|
||||
|
||||
---
|
||||
|
||||
## 一、角色层级概览
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Fonrey SaaS 平台 │
|
||||
│ │
|
||||
│ ① Platform Admin(平台超级管理员) │
|
||||
│ └── 管理所有租户:开通、暂停、配置、版本升级 │
|
||||
│ │
|
||||
│ ─ ─ ─ ─ ─ ─ ─ 租 户 边 界 ─ ─ ─ ─ ─ ─ ─ ─ ─ │
|
||||
│ │
|
||||
│ ② Tenant Admin(租户管理员) │
|
||||
│ └── 管理本租户:组织架构、账号、权限、系统配置 │
|
||||
│ │
|
||||
│ ③ Agent(经纪人) │
|
||||
│ └── 日常业务操作:录入房源、跟进客源、查看数据 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、Persona 详细定义
|
||||
|
||||
### P1 — Platform Admin(平台超级管理员)
|
||||
|
||||
| 属性 | 值 |
|
||||
| ---------------- | --------------------- |
|
||||
| **Persona 名称** | Platform Admin |
|
||||
| **中文称谓** | 平台超级管理员 |
|
||||
| **Persona Code** | `PLATFORM_ADMIN` |
|
||||
| **所属层** | 平台层(Platform) |
|
||||
| **账号归属** | 平台运营团队(Fonrey 公司内部人员) |
|
||||
| **账号数量** | 极少,手动创建,不通过租户系统管理 |
|
||||
| **认证入口** | 独立管理后台(非租户客户端) |
|
||||
| **Schema 归属** | `public`(跨所有租户) |
|
||||
|
||||
**职责范围:**
|
||||
- 创建、暂停、注销租户(Tenant)
|
||||
- 为租户初始化 Tenant Admin 账号
|
||||
- 管理平台版本、发布客户端安装包
|
||||
- 监控系统健康状态、查看平台级日志
|
||||
- 配置平台级参数(短信网关、OSS、第三方集成等)
|
||||
|
||||
**不涉及:**
|
||||
- 不进入任何租户的业务数据
|
||||
- 不参与租户内部的权限分配、组织管理
|
||||
|
||||
**关键约束:**
|
||||
- Platform Admin 走**独立认证体系**,不纳入租户 RBAC 权限模型
|
||||
- 无需在 `permission_definitions` 中注册权限项
|
||||
|
||||
---
|
||||
|
||||
### P2 — Tenant Admin(租户管理员)
|
||||
|
||||
| 属性 | 值 |
|
||||
| ---------------- | ---------------------------------- |
|
||||
| **Persona 名称** | Tenant Admin |
|
||||
| **中文称谓** | 租户管理员 |
|
||||
| **Persona Code** | `TENANT_ADMIN` |
|
||||
| **所属层** | 租户层(Tenant) |
|
||||
| **账号归属** | 各租户(房产经纪公司)的系统管理员 |
|
||||
| **账号数量** | 每个租户 1~3 个,由 Platform Admin 创建初始账号 |
|
||||
| **认证入口** | 与经纪人相同的租户客户端(Electron App) |
|
||||
| **登录账号** | 平台运营分配的自定义字符串(不限于手机号格式) |
|
||||
| **初始密码** | 平台统一固定初始密码,首次登录强制修改 |
|
||||
| **Schema 归属** | 租户 Schema(`tenant_{id}`) |
|
||||
| | |
|
||||
|
||||
**职责范围:**
|
||||
- 维护组织架构(部门/门店树)
|
||||
- 办理员工入职、离职、调动
|
||||
- 创建和管理员工系统账号
|
||||
- 配置角色与权限(角色创建、权限分配、个人权限调整)
|
||||
- 配置系统枚举值(Lookup Items)、房源录入规则、客源规则
|
||||
- 查看全租户范围的业务数据(受数据权限规则约束)
|
||||
|
||||
**不涉及:**
|
||||
- 不能跨租户操作
|
||||
- 不能修改平台级配置(版本、短信网关等)
|
||||
|
||||
**与「经纪人」的区别:**
|
||||
- Tenant Admin 是**管理身份**,不从事日常房源/客源业务操作
|
||||
- 在系统内显示为「管理员」身份,拥有全模块管理权限
|
||||
- 可以同时持有某个业务角色(如总经),但账号性质以 Tenant Admin 为主
|
||||
|
||||
**在 PRD 中的出现场景:**
|
||||
- 组织人事管理模块的主操作者
|
||||
- 权限管理模块的主操作者
|
||||
- 系统配置模块的主操作者
|
||||
- 在楼盘管理、发布管理中执行管理操作的用户
|
||||
|
||||
---
|
||||
|
||||
### P3 — Agent(经纪人)
|
||||
|
||||
| 属性 | 值 |
|
||||
| ---------------- | ----------------------------- |
|
||||
| **Persona 名称** | Agent |
|
||||
| **中文称谓** | 经纪人 |
|
||||
| **Persona Code** | `AGENT` |
|
||||
| **所属层** | 租户层(Tenant) |
|
||||
| **账号归属** | 各租户的在职员工 |
|
||||
| **账号数量** | 每个租户 N 个,由 Tenant Admin 创建 |
|
||||
| **认证入口** | 租户客户端(Electron App) |
|
||||
| **登录账号** | 手机号(由 Tenant Admin 录入员工时自动创建) |
|
||||
| **初始密码** | 系统统一固定初始密码,首次登录强制修改 |
|
||||
| **Schema 归属** | 租户 Schema(`tenant_{id}`) |
|
||||
|
||||
**内部岗位子类型(Agent Sub-roles):**
|
||||
|
||||
Agent 是统称,内部通过「角色」区分岗位权限层级。系统内置以下角色(不可删除):
|
||||
|
||||
| 角色名称 | Role Code | 典型岗位 | 数据权限范围 |
|
||||
| ---- | ---------------- | -------- | --------- |
|
||||
| 置业顾问 | `ROLE_AGENT` | 一线经纪人 | 仅自己的数据 |
|
||||
| 店管 | `ROLE_STORE_MGR` | 门店店长 | 本门店数据 |
|
||||
| 区管 | `ROLE_AREA_MGR` | 区域经理 | 本区域数据 |
|
||||
| 区总 | `ROLE_AREA_DIR` | 区域总监 | 本区域+下属区数据 |
|
||||
| 副总 | `ROLE_VP` | 副总经理 | 全公司数据(部分) |
|
||||
| 总经 | `ROLE_GM` | 总经理 | 全公司数据 |
|
||||
| 其他职能 | `ROLE_OTHER` | 行政/财务/HR | 按需配置 |
|
||||
|
||||
**在 PRD 中的出现场景:**
|
||||
- 房源管理模块的主操作者
|
||||
- 客源管理模块的主操作者
|
||||
- 楼盘管理模块的查看用户
|
||||
- 登录模块的主要使用者
|
||||
|
||||
---
|
||||
|
||||
## 三、命名规范与替换对照表
|
||||
|
||||
以下为历史文档中出现的混乱称谓,与标准称谓的对照关系:
|
||||
|
||||
| 历史称谓(禁止继续使用) | 应替换为 | 说明 |
|
||||
| ------------ | ----------------------- | ---------------- |
|
||||
| 超级管理员 | Platform Admin(平台超级管理员) | 仅指平台层 |
|
||||
| 平台管理员 | Platform Admin(平台超级管理员) | 同上 |
|
||||
| 系统管理员 | Tenant Admin(租户管理员) | 租户层管理员 |
|
||||
| 管理员(泛称) | Tenant Admin(租户管理员) | 明确指向租户层 |
|
||||
| HR 管理员 | Tenant Admin(租户管理员) | 同一人,不区分子角色 |
|
||||
| HR 行政 | Tenant Admin(租户管理员) | 同上 |
|
||||
| 一线经纪人 | Agent(经纪人) | 统称,角色层面才区分岗位 |
|
||||
| 置业顾问(作为用户称谓) | Agent(经纪人) | 置业顾问仅作为「内置角色名」使用 |
|
||||
|
||||
**规则说明:**
|
||||
1. PRD User Story 的 **As a** 部分:使用中文称谓(`Tenant Admin(租户管理员)`、`Agent(经纪人)`)
|
||||
2. 权限矩阵、DATA_MODEL 注释:使用 Persona Code(`TENANT_ADMIN`、`AGENT`)
|
||||
3. 角色名称(置业顾问、店管、总经等)**仅在角色管理相关语境中**出现,不作为用户身份称谓
|
||||
4. `Platform Admin` 在各 PRD 中尽量少出现,其功能属于「系统管理模块」,不在各子模块 PRD 内展开
|
||||
|
||||
---
|
||||
|
||||
## 四、快速索引
|
||||
|
||||
| 场景 | 使用 |
|
||||
|------|------|
|
||||
| PRD User Story 主语 | `Tenant Admin(租户管理员)` / `Agent(经纪人)` |
|
||||
| 错误提示文案(面向用户) | 「请联系您的租户管理员」 |
|
||||
| DATA_MODEL 注释 | `created_by: 创建该记录的 Agent(经纪人)用户 ID` |
|
||||
| 权限矩阵行标题 | 使用角色名(置业顾问 / 店管 / 总经 ...) |
|
||||
| 代码注释 / 枚举值 | `PLATFORM_ADMIN` / `TENANT_ADMIN` / `AGENT` |
|
||||
| 日志、审计记录 | `operator_type: PLATFORM_ADMIN / TENANT_ADMIN / AGENT` |
|
||||
@@ -180,7 +180,7 @@
|
||||
## 4. 用户故事(MVP 核心路径)
|
||||
|
||||
### Story 1 — 经纪人录入房源
|
||||
> As a **一线经纪人**,
|
||||
> As a **Agent(经纪人)**,
|
||||
> I want to **快速录入一套二手住宅并上传图片和业主联系方式**,
|
||||
> So that **这套房源的信息能被团队所有成员找到和跟进**.
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
---
|
||||
|
||||
### Story 2 — 经纪人跟进房源
|
||||
> As a **一线经纪人**,
|
||||
> As a **Agent(经纪人)**,
|
||||
> I want to **对我负责的房源记录每次跟进(面访/电话/钥匙/实勘)**,
|
||||
> So that **我的跟进历史有据可查,团队不会重复联系同一业主**.
|
||||
|
||||
@@ -204,7 +204,7 @@
|
||||
---
|
||||
|
||||
### Story 3 — 经纪人录入客源
|
||||
> As a **一线经纪人**,
|
||||
> As a **Agent(经纪人)**,
|
||||
> I want to **录入意向购房/租房客户并跟进其需求变化**,
|
||||
> So that **我能在合适时机将客户与合适房源匹配**.
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
---
|
||||
|
||||
### Story 4 — 转成交
|
||||
> As a **一线经纪人**,
|
||||
> As a **Agent(经纪人)**,
|
||||
> I want to **将已达成交易的客源标记为"成交"并关联成交房源**,
|
||||
> So that **成交数据进入系统留存,房源状态自动更新**.
|
||||
|
||||
|
||||
@@ -88,8 +88,8 @@
|
||||
| [US-SETTING-010](#US-SETTING-010-管理员配置首页展示内容) | 系统配置 | 管理员配置首页展示内容 | [ ] |
|
||||
| [US-SETTING-011](#US-SETTING-011-管理员配置相关方规则) | 系统配置 | 管理员配置相关方规则 | [ ] |
|
||||
| [US-SETTING-012](#US-SETTING-012-管理员配置客源相关参数) | 系统配置 | 管理员配置客源相关参数 | [ ] |
|
||||
| [US-SYSTEM-010](#US-SYSTEM-010-平台管理员管理租户开通暂停配置) | 系统管理 | 平台管理员管理租户(开通/暂停/配置) | [ ] |
|
||||
| [US-SYSTEM-011](#US-SYSTEM-011-平台管理员监控系统健康状态) | 系统管理 | 平台管理员监控系统健康状态 | [ ] |
|
||||
| [US-SYSTEM-010](#US-SYSTEM-010-Platform Admin(平台超级管理员)管理租户开通暂停配置) | 系统管理 | Platform Admin(平台超级管理员)管理租户(开通/暂停/配置) | [ ] |
|
||||
| [US-SYSTEM-011](#US-SYSTEM-011-Platform Admin(平台超级管理员)监控系统健康状态) | 系统管理 | Platform Admin(平台超级管理员)监控系统健康状态 | [ ] |
|
||||
| [US-RELEASE-010](#US-RELEASE-010-系统发布Windows桌面客户端安装包) | 客户端发布 | 系统发布Windows桌面客户端安装包 | [ ] |
|
||||
| [US-RELEASE-011](#US-RELEASE-011-客户端自动检测并更新至最新版本) | 客户端发布 | 客户端自动检测并更新至最新版本 | [ ] |
|
||||
|
||||
@@ -110,8 +110,8 @@
|
||||
| [US-SETTING-021](#US-SETTING-021-管理员配置交易规则) | 系统配置 | 管理员配置交易规则 | [ ] |
|
||||
| ~~US-SETTING-022~~ | ~~系统配置~~ | ~~管理员配置财务规则~~ — **已移出,财务模块 Out of Scope** | ~~[ ]~~ |
|
||||
| ~~US-SETTING-023~~ | ~~系统配置~~ | ~~管理员配置合同模板~~ — **已移出,合同模块 Out of Scope** | ~~[ ]~~ |
|
||||
| [US-SYSTEM-020](#US-SYSTEM-020-平台管理员查看操作审计日志) | 系统管理 | 平台管理员查看操作审计日志 | [ ] |
|
||||
| [US-SYSTEM-021](#US-SYSTEM-021-平台管理员管理灰度发布滚动升级) | 系统管理 | 平台管理员管理灰度发布/滚动升级 | [ ] |
|
||||
| [US-SYSTEM-020](#US-SYSTEM-020-Platform Admin(平台超级管理员)查看操作审计日志) | 系统管理 | Platform Admin(平台超级管理员)查看操作审计日志 | [ ] |
|
||||
| [US-SYSTEM-021](#US-SYSTEM-021-Platform Admin(平台超级管理员)管理灰度发布滚动升级) | 系统管理 | Platform Admin(平台超级管理员)管理灰度发布/滚动升级 | [ ] |
|
||||
|
||||
---
|
||||
|
||||
@@ -682,13 +682,13 @@
|
||||
|
||||
### 系统管理(运营后台)
|
||||
|
||||
##### US-SYSTEM-010 平台管理员管理租户开通暂停配置
|
||||
##### US-SYSTEM-010 Platform Admin(平台超级管理员)管理租户开通暂停配置
|
||||
|
||||
- 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 租户管理(开通/暂停/配置)
|
||||
- 状态:[ ]
|
||||
- 验收标准:可在运营后台新开通租户(自动创建独立PostgreSQL Schema);可暂停租户(暂停后租户用户无法登录);可为租户配置域名/子域名;租户操作记录写入平台操作日志
|
||||
|
||||
##### US-SYSTEM-011 平台管理员监控系统健康状态
|
||||
##### US-SYSTEM-011 Platform Admin(平台超级管理员)监控系统健康状态
|
||||
|
||||
- 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 系统健康监控
|
||||
- 状态:[ ]
|
||||
@@ -818,13 +818,13 @@
|
||||
|
||||
### 系统管理(运营后台)
|
||||
|
||||
##### US-SYSTEM-020 平台管理员查看操作审计日志
|
||||
##### US-SYSTEM-020 Platform Admin(平台超级管理员)查看操作审计日志
|
||||
|
||||
- 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 操作审计日志
|
||||
- 状态:[ ]
|
||||
- 验收标准:(规划中,详细验收标准待PRD细化后补充)
|
||||
|
||||
##### US-SYSTEM-021 平台管理员管理灰度发布滚动升级
|
||||
##### US-SYSTEM-021 Platform Admin(平台超级管理员)管理灰度发布滚动升级
|
||||
|
||||
- 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 灰度发布/滚动升级
|
||||
- 状态:[ ]
|
||||
|
||||
@@ -5489,7 +5489,7 @@ Celery Beat 定时任务每日凌晨执行;超过运营配置天数(如30天
|
||||
- 未完成项/阻塞项
|
||||
```
|
||||
|
||||
### US-SYSTEM-010 平台管理员管理租户开通暂停配置
|
||||
### US-SYSTEM-010 Platform Admin(平台超级管理员)管理租户开通暂停配置
|
||||
|
||||
- 阶段:**P1**
|
||||
- 模块:**系统管理(运营后台)**
|
||||
@@ -5508,7 +5508,7 @@ Celery Beat 定时任务每日凌晨执行;超过运营配置天数(如30天
|
||||
你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。
|
||||
|
||||
【任务ID】US-SYSTEM-010
|
||||
【任务标题】平台管理员管理租户开通暂停配置
|
||||
【任务标题】Platform Admin(平台超级管理员)管理租户开通暂停配置
|
||||
【阶段】P1
|
||||
【模块】系统管理(运营后台)
|
||||
|
||||
@@ -5563,7 +5563,7 @@ Celery Beat 定时任务每日凌晨执行;超过运营配置天数(如30天
|
||||
- 未完成项/阻塞项
|
||||
```
|
||||
|
||||
### US-SYSTEM-011 平台管理员监控系统健康状态
|
||||
### US-SYSTEM-011 Platform Admin(平台超级管理员)监控系统健康状态
|
||||
|
||||
- 阶段:**P1**
|
||||
- 模块:**系统管理(运营后台)**
|
||||
@@ -5582,7 +5582,7 @@ Celery Beat 定时任务每日凌晨执行;超过运营配置天数(如30天
|
||||
你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。
|
||||
|
||||
【任务ID】US-SYSTEM-011
|
||||
【任务标题】平台管理员监控系统健康状态
|
||||
【任务标题】Platform Admin(平台超级管理员)监控系统健康状态
|
||||
【阶段】P1
|
||||
【模块】系统管理(运营后台)
|
||||
|
||||
@@ -6651,7 +6651,7 @@ electron-builder 输出 NSIS .exe 安装包和便携版 .zip;安装包经EV证
|
||||
- 未完成项/阻塞项
|
||||
```
|
||||
|
||||
### US-SYSTEM-020 平台管理员查看操作审计日志
|
||||
### US-SYSTEM-020 Platform Admin(平台超级管理员)查看操作审计日志
|
||||
|
||||
- 阶段:**P2**
|
||||
- 模块:**系统管理(运营后台)**
|
||||
@@ -6671,7 +6671,7 @@ electron-builder 输出 NSIS .exe 安装包和便携版 .zip;安装包经EV证
|
||||
你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。
|
||||
|
||||
【任务ID】US-SYSTEM-020
|
||||
【任务标题】平台管理员查看操作审计日志
|
||||
【任务标题】Platform Admin(平台超级管理员)查看操作审计日志
|
||||
【阶段】P2
|
||||
【模块】系统管理(运营后台)
|
||||
|
||||
@@ -6725,7 +6725,7 @@ electron-builder 输出 NSIS .exe 安装包和便携版 .zip;安装包经EV证
|
||||
- 未完成项/阻塞项
|
||||
```
|
||||
|
||||
### US-SYSTEM-021 平台管理员管理灰度发布滚动升级
|
||||
### US-SYSTEM-021 Platform Admin(平台超级管理员)管理灰度发布滚动升级
|
||||
|
||||
- 阶段:**P2**
|
||||
- 模块:**系统管理(运营后台)**
|
||||
@@ -6745,7 +6745,7 @@ electron-builder 输出 NSIS .exe 安装包和便携版 .zip;安装包经EV证
|
||||
你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。
|
||||
|
||||
【任务ID】US-SYSTEM-021
|
||||
【任务标题】平台管理员管理灰度发布滚动升级
|
||||
【任务标题】Platform Admin(平台超级管理员)管理灰度发布滚动升级
|
||||
【阶段】P2
|
||||
【模块】系统管理(运营后台)
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
**版本**: 1.0
|
||||
**所属系统**: Fonrey 房产经纪管理系统
|
||||
**关联模块**: 系统管理、权限管理
|
||||
**干系人**: 工程负责人、运维负责人、系统管理员
|
||||
**干系人**: 工程负责人、运维负责人、Tenant Admin(租户管理员)
|
||||
|
||||
---
|
||||
|
||||
@@ -24,9 +24,9 @@ Fonrey 房产经纪管理系统当前为纯 Web 应用,依赖用户自行通
|
||||
|
||||
| 角色 | 使用场景 | 使用频率 |
|
||||
|------|---------|----------|
|
||||
| 一线经纪人 | 下载安装客户端、日常登录使用系统、接受自动更新 | 每日 |
|
||||
| Agent(经纪人) | 下载安装客户端、日常登录使用系统、接受自动更新 | 每日 |
|
||||
| 店长/经理 | 同上 | 每日 |
|
||||
| 系统管理员 | 发布新版本、管理安装包下载地址、监控客户端版本分布 | 按需 |
|
||||
| Tenant Admin(租户管理员) | 发布新版本、管理安装包下载地址、监控客户端版本分布 | 按需 |
|
||||
| IT 运维人员 | 维护更新服务器、签名证书、构建发布流水线 | 按发布周期 |
|
||||
|
||||
### 核心痛点
|
||||
@@ -65,7 +65,7 @@ Fonrey 房产经纪管理系统当前为纯 Web 应用,依赖用户自行通
|
||||
|
||||
### Story 1:经纪人下载并安装客户端
|
||||
|
||||
**As** 一线经纪人,**I want** 通过公司提供的网址下载一个安装程序并完成安装,**So that** 我可以立即打开登录界面使用 Fonrey 系统,无需手动配置浏览器。
|
||||
**As** Agent(经纪人),**I want** 通过公司提供的网址下载一个安装程序并完成安装,**So that** 我可以立即打开登录界面使用 Fonrey 系统,无需手动配置浏览器。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 官方下载页面可通过指定 URL 访问,页面展示最新版本号、发布日期及下载按钮
|
||||
@@ -80,7 +80,7 @@ Fonrey 房产经纪管理系统当前为纯 Web 应用,依赖用户自行通
|
||||
|
||||
### Story 2:经纪人使用客户端正常登录并使用系统
|
||||
|
||||
**As** 一线经纪人,**I want** 打开客户端后直接访问 Fonrey 系统的完整功能,**So that** 我的日常使用体验与使用 Chrome 浏览器无差异,且不受本机安装的浏览器版本影响。
|
||||
**As** Agent(经纪人),**I want** 打开客户端后直接访问 Fonrey 系统的完整功能,**So that** 我的日常使用体验与使用 Chrome 浏览器无差异,且不受本机安装的浏览器版本影响。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 客户端内嵌现代 Chromium 内核(如基于 Electron 或 WebView2),版本不低于 Chromium 100,支持现代 Web 标准(ES2020、CSS Grid、Fetch API 等)
|
||||
@@ -95,7 +95,7 @@ Fonrey 房产经纪管理系统当前为纯 Web 应用,依赖用户自行通
|
||||
|
||||
### Story 3:客户端感知新版本并自动升级
|
||||
|
||||
**As** 一线经纪人,**I want** 客户端在有新版本时自动提示并完成升级,**So that** 我无需手动下载安装,始终使用最新版本,不会因版本落后导致功能异常。
|
||||
**As** Agent(经纪人),**I want** 客户端在有新版本时自动提示并完成升级,**So that** 我无需手动下载安装,始终使用最新版本,不会因版本落后导致功能异常。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 客户端启动时及运行期间(每隔 4 小时)自动向更新服务器检查最新版本
|
||||
@@ -108,9 +108,9 @@ Fonrey 房产经纪管理系统当前为纯 Web 应用,依赖用户自行通
|
||||
|
||||
---
|
||||
|
||||
### Story 4:系统管理员发布新版本
|
||||
### Story 4:Tenant Admin(租户管理员)发布新版本
|
||||
|
||||
**As** 系统管理员,**I want** 通过管理后台上传新版客户端安装包并配置版本信息,**So that** 客户端能感知到更新并引导用户升级。
|
||||
**As** Tenant Admin(租户管理员),**I want** 通过管理后台上传新版客户端安装包并配置版本信息,**So that** 客户端能感知到更新并引导用户升级。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 系统管理后台提供"客户端版本管理"页面(位于系统管理模块下)
|
||||
@@ -125,7 +125,7 @@ Fonrey 房产经纪管理系统当前为纯 Web 应用,依赖用户自行通
|
||||
|
||||
### Story 5:管理员监控客户端版本分布
|
||||
|
||||
**As** 系统管理员,**I want** 查看当前所有在线客户端的版本分布情况,**So that** 了解升级覆盖率,对仍在使用旧版本的客户端发出提醒或强制升级。
|
||||
**As** Tenant Admin(租户管理员),**I want** 查看当前所有在线客户端的版本分布情况,**So that** 了解升级覆盖率,对仍在使用旧版本的客户端发出提醒或强制升级。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 客户端版本管理页面展示版本分布统计:各版本在线客户端数量及占比(饼图或条形图)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
| 角色 | 描述 | 使用频率 |
|
||||
|------|------|----------|
|
||||
| 一线经纪人 | 负责录入、维护、跟进自己名下的客源,并与客户进行带看匹配 | 每日高频 |
|
||||
| Agent(经纪人) | 负责录入、维护、跟进自己名下的客源,并与客户进行带看匹配 | 每日高频 |
|
||||
| 店长/经理 | 查看全店/全区客源概况,监控跟进完成度及带看活跃度 | 每日 |
|
||||
| 行政人员 | 审核客源信息,处理重复客户合并、来源修改审批等 | 每日 |
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
### Story 1:经纪人录入新私客
|
||||
|
||||
**As** 一线经纪人,**I want** 快速录入一位新客户的基本信息和购房/租房需求,**So that** 客源进入系统统一管理并支持后续的智能配房和跟进管理。
|
||||
**As** Agent(经纪人),**I want** 快速录入一位新客户的基本信息和购房/租房需求,**So that** 客源进入系统统一管理并支持后续的智能配房和跟进管理。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 录入页面标题为"录入私客",通过顶部导航「客源」→「+ 新增私客」或右侧浮动快捷入口「增客」触达
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
### Story 2:经纪人查看与筛选私客列表
|
||||
|
||||
**As** 一线经纪人,**I want** 在客源列表中快速定位目标客户并了解其跟进状态,**So that** 提升客户管理效率,优先跟进高意向客户。
|
||||
**As** Agent(经纪人),**I want** 在客源列表中快速定位目标客户并了解其跟进状态,**So that** 提升客户管理效率,优先跟进高意向客户。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 顶部 Tab 导航按需求类型分组:**求购 / 求租 / 暂缓 / 全部私客**,Tab 间可自由切换
|
||||
@@ -100,7 +100,7 @@
|
||||
|
||||
### Story 3:经纪人查看求购私客列表
|
||||
|
||||
**As** 一线经纪人,**I want** 在求购 Tab 下查看所有有购房意向的私客,并通过多维度筛选快速定位目标客户,**So that** 优先匹配合适房源,提升成交效率。
|
||||
**As** Agent(经纪人),**I want** 在求购 Tab 下查看所有有购房意向的私客,并通过多维度筛选快速定位目标客户,**So that** 优先匹配合适房源,提升成交效率。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 求购 Tab 下,状态筛选项为:不限 / 求购 / 租购
|
||||
@@ -116,7 +116,7 @@
|
||||
|
||||
### Story 4:经纪人查看求租私客列表
|
||||
|
||||
**As** 一线经纪人,**I want** 在求租 Tab 下查看所有有租房意向的私客,**So that** 快速为其匹配合适的出租房源。
|
||||
**As** Agent(经纪人),**I want** 在求租 Tab 下查看所有有租房意向的私客,**So that** 快速为其匹配合适的出租房源。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 求租 Tab 下,状态筛选项为:不限 / 求租 / 租购
|
||||
@@ -129,7 +129,7 @@
|
||||
|
||||
### Story 5:经纪人管理暂缓私客
|
||||
|
||||
**As** 一线经纪人,**I want** 将暂时没有购房/租房需求的客户标记为"暂缓"状态,**So that** 保持活跃客源列表的精准性,同时不丢失潜在客户资源。
|
||||
**As** Agent(经纪人),**I want** 将暂时没有购房/租房需求的客户标记为"暂缓"状态,**So that** 保持活跃客源列表的精准性,同时不丢失潜在客户资源。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 暂缓 Tab 下仅展示状态为"暂缓"的客源
|
||||
@@ -140,7 +140,7 @@
|
||||
|
||||
### Story 6:经纪人查看私客详情页
|
||||
|
||||
**As** 一线经纪人,**I want** 点击客源姓名后进入详情页,查看该客户的完整信息和快捷操作入口,**So that** 在一个页面内完成客户的跟进、带看、配房等核心操作。
|
||||
**As** Agent(经纪人),**I want** 点击客源姓名后进入详情页,查看该客户的完整信息和快捷操作入口,**So that** 在一个页面内完成客户的跟进、带看、配房等核心操作。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 详情页顶部展示客源标题(需求标题+联系人姓名),旁边显示带看进度标签(如"一看")
|
||||
@@ -158,7 +158,7 @@
|
||||
|
||||
### Story 7:经纪人查看与编辑需求信息
|
||||
|
||||
**As** 一线经纪人,**I want** 在需求信息 Tab 中查看客户的完整购房/租房需求字段,并支持编辑,**So that** 确保需求信息准确以提升智能配房的匹配精度。
|
||||
**As** Agent(经纪人),**I want** 在需求信息 Tab 中查看客户的完整购房/租房需求字段,并支持编辑,**So that** 确保需求信息准确以提升智能配房的匹配精度。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 需求信息 Tab 下展示以下字段(三栏布局):总价(范围区间,万元)、面积(范围区间,㎡)、居室(X居格式)、装修(下拉枚举)、朝向(多选枚举)、楼层(多选:中楼层/低楼层等)、楼龄(范围区间)、意向商圈(多选)、意向小区(多选)、交通情况(文本)、备注(文本)
|
||||
@@ -170,7 +170,7 @@
|
||||
|
||||
### Story 8:经纪人写入与查看跟进记录
|
||||
|
||||
**As** 一线经纪人,**I want** 在跟进记录 Tab 中记录每一次与客户的沟通内容,并按类型筛选查看,**So that** 保留完整的跟进轨迹,便于持续维护客户关系。
|
||||
**As** Agent(经纪人),**I want** 在跟进记录 Tab 中记录每一次与客户的沟通内容,并按类型筛选查看,**So that** 保留完整的跟进轨迹,便于持续维护客户关系。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 跟进记录区块顶部为 5 个子 Tab:全部 / 写入跟进 / 敏感信息跟进 / 修改跟进 / 其他跟进
|
||||
@@ -189,7 +189,7 @@
|
||||
|
||||
### Story 9:经纪人管理带看记录
|
||||
|
||||
**As** 一线经纪人,**I want** 在带看 Tab 中记录与该客户的预约带看和实际带看情况,**So that** 系统化追踪带看进度,提升成交转化效率。
|
||||
**As** Agent(经纪人),**I want** 在带看 Tab 中记录与该客户的预约带看和实际带看情况,**So that** 系统化追踪带看进度,提升成交转化效率。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 带看区块顶部提供两个子 Tab:**预约** / **带看**
|
||||
@@ -217,7 +217,7 @@
|
||||
|
||||
### Story 10:经纪人查看客源解读(AI行为分析)
|
||||
|
||||
**As** 一线经纪人,**I want** 在客源解读 Tab 中查看系统根据该客户的找房行为自动生成的偏好分析,**So that** 更准确地判断客户真实需求和购房意向,提升推房精准度。
|
||||
**As** Agent(经纪人),**I want** 在客源解读 Tab 中查看系统根据该客户的找房行为自动生成的偏好分析,**So that** 更准确地判断客户真实需求和购房意向,提升推房精准度。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 客源解读 Tab 展示说明文字:"以下数据通过客户找房行为分析生成,百分比越高代表浏览次数多",右上角提供「使用指南」链接
|
||||
@@ -235,7 +235,7 @@
|
||||
|
||||
### Story 11:经纪人使用二手配房功能推荐房源
|
||||
|
||||
**As** 一线经纪人,**I want** 在智能配房(二手配房)Tab 中查看系统为该客户匹配的房源列表,并将合适房源分享给客户,**So that** 提升推房效率,加快成交进度。
|
||||
**As** Agent(经纪人),**I want** 在智能配房(二手配房)Tab 中查看系统为该客户匹配的房源列表,并将合适房源分享给客户,**So that** 提升推房效率,加快成交进度。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 二手配房区块标题右侧显示最后更新时间(如"2026-04-22 17:38 更新")及刷新说明 ⓘ 图标
|
||||
@@ -262,7 +262,7 @@
|
||||
|
||||
### Story 12:经纪人查看与筛选公客列表
|
||||
|
||||
**As** 一线经纪人,**I want** 在公客 Tab 中查看全公司公共客源池中的客户,并通过多维度筛选快速找到我有能力跟进的公客,**So that** 利用公客资源开拓新成交机会。
|
||||
**As** Agent(经纪人),**I want** 在公客 Tab 中查看全公司公共客源池中的客户,并通过多维度筛选快速找到我有能力跟进的公客,**So that** 利用公客资源开拓新成交机会。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 顶部一级 Tab 切换至「公客」后激活该视图,Tab 标题高亮橙色下划线
|
||||
@@ -312,7 +312,7 @@
|
||||
|
||||
### Story 13:经纪人查看成交客列表
|
||||
|
||||
**As** 一线经纪人,**I want** 在成交客 Tab 中查看已完成成交的客户列表,并通过筛选快速回顾历史成交记录,**So that** 为复购/转介绍跟进和业绩复盘提供数据支撑。
|
||||
**As** Agent(经纪人),**I want** 在成交客 Tab 中查看已完成成交的客户列表,并通过筛选快速回顾历史成交记录,**So that** 为复购/转介绍跟进和业绩复盘提供数据支撑。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 顶部一级 Tab 切换至「成交客」后激活该视图(面包屑:客源 / 客源管理 / 成交客)
|
||||
@@ -353,7 +353,7 @@
|
||||
|
||||
### Story 14:经纪人编辑客源信息
|
||||
|
||||
**As** 一线经纪人,**I want** 对已录入的客源进行编辑,修改联系方式、基础信息或购房需求,**So that** 保持客源数据的准确性,提升智能配房匹配精度。
|
||||
**As** Agent(经纪人),**I want** 对已录入的客源进行编辑,修改联系方式、基础信息或购房需求,**So that** 保持客源数据的准确性,提升智能配房匹配精度。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 编辑客源页面标题为「编辑客源」,通过私客详情页右侧「编辑」按钮或需求信息 Tab「编辑」链接触达
|
||||
@@ -404,7 +404,7 @@
|
||||
|
||||
### Story 15:经纪人查看客源信息概览面板
|
||||
|
||||
**As** 一线经纪人,**I want** 在客源详情页右侧快速概览该客源的核心信息和常用操作,**So that** 无需切换 Tab 即可掌握客户关键状态并快速执行高频操作。
|
||||
**As** Agent(经纪人),**I want** 在客源详情页右侧快速概览该客源的核心信息和常用操作,**So that** 无需切换 Tab 即可掌握客户关键状态并快速执行高频操作。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 客源详情页右侧固定展示"信息概览"面板,不随页面滚动消失
|
||||
@@ -422,7 +422,7 @@
|
||||
|
||||
### Story 16:经纪人收藏客源至私客收藏夹
|
||||
|
||||
**As** 一线经纪人,**I want** 将重点客户收藏至私客收藏夹,**So that** 在私客列表中可按收藏夹快速筛选出重点跟进客户。
|
||||
**As** Agent(经纪人),**I want** 将重点客户收藏至私客收藏夹,**So that** 在私客列表中可按收藏夹快速筛选出重点跟进客户。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击信息概览面板中的「☆ 收藏」触发"选择私客收藏夹"浮层
|
||||
@@ -440,7 +440,7 @@
|
||||
|
||||
### Story 17:经纪人修改客源等级
|
||||
|
||||
**As** 一线经纪人,**I want** 快速修改客源的购买意向等级,**So that** 确保客源等级与客户当前实际意向相符,辅助工作优先级排序。
|
||||
**As** Agent(经纪人),**I want** 快速修改客源的购买意向等级,**So that** 确保客源等级与客户当前实际意向相符,辅助工作优先级排序。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击信息概览面板中的「改等级」触发"改等级"弹窗
|
||||
@@ -456,7 +456,7 @@
|
||||
|
||||
### Story 18:经纪人修改客源状态
|
||||
|
||||
**As** 一线经纪人,**I want** 修改客源的需求状态(求购/求租/租购),**So that** 准确反映客户当前的业务需求方向,保证配房匹配精准。
|
||||
**As** Agent(经纪人),**I want** 修改客源的需求状态(求购/求租/租购),**So that** 准确反映客户当前的业务需求方向,保证配房匹配精准。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击信息概览面板中的「改状态」触发"改状态"弹窗
|
||||
@@ -473,7 +473,7 @@
|
||||
|
||||
### Story 19:经纪人手动将私客转为公客
|
||||
|
||||
**As** 一线经纪人或店长,**I want** 主动将某私客转入公共客源池,**So that** 让其他经纪人也能跟进该客户,提升客源利用率和成交机会。
|
||||
**As** Agent(经纪人)或店长,**I want** 主动将某私客转入公共客源池,**So that** 让其他经纪人也能跟进该客户,提升客源利用率和成交机会。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击信息概览面板中的「转公客」触发"把此私客转为公客"弹窗
|
||||
@@ -492,7 +492,7 @@
|
||||
|
||||
### Story 20:经纪人将私客转为成交客
|
||||
|
||||
**As** 一线经纪人,**I want** 在客户完成购房/租房成交后将其标记为成交客,并录入成交信息,**So that** 完整记录成交数据,同步到成交客列表及业绩统计。
|
||||
**As** Agent(经纪人),**I want** 在客户完成购房/租房成交后将其标记为成交客,并录入成交信息,**So that** 完整记录成交数据,同步到成交客列表及业绩统计。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击信息概览面板中的「转成交」触发"客户成交"弹窗
|
||||
@@ -526,7 +526,7 @@
|
||||
|
||||
### Story 21:经纪人将客源标记为无效
|
||||
|
||||
**As** 一线经纪人,**I want** 将无效客户(如空号/骚扰/无意向等)标记为无效,**So that** 避免对无效客户持续无效跟进,提升客源列表质量。
|
||||
**As** Agent(经纪人),**I want** 将无效客户(如空号/骚扰/无意向等)标记为无效,**So that** 避免对无效客户持续无效跟进,提升客源列表质量。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击信息概览面板中的「转无效」触发"请选择无效原因"弹窗
|
||||
@@ -549,7 +549,7 @@
|
||||
|
||||
### Story 22:经纪人编辑客源基础信息(快捷入口)
|
||||
|
||||
**As** 一线经纪人,**I want** 通过信息概览面板的快捷入口直接编辑客源基础信息,**So that** 无需进入完整编辑页即可快速更新常用字段。
|
||||
**As** Agent(经纪人),**I want** 通过信息概览面板的快捷入口直接编辑客源基础信息,**So that** 无需进入完整编辑页即可快速更新常用字段。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击信息概览面板中的「编辑客源」入口,触发"编辑基础信息"弹窗(抽屉浮层)
|
||||
@@ -577,7 +577,7 @@
|
||||
|
||||
### Story 23:经纪人管理客源联系人
|
||||
|
||||
**As** 一线经纪人,**I want** 在客源详情页查看、新增或编辑该客源的联系人信息,**So that** 确保联系方式信息完整,随时可以联系到客户。
|
||||
**As** Agent(经纪人),**I want** 在客源详情页查看、新增或编辑该客源的联系人信息,**So that** 确保联系方式信息完整,随时可以联系到客户。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
@@ -620,7 +620,7 @@
|
||||
|
||||
### Story 24:经纪人管理客源相关员工
|
||||
|
||||
**As** 一线经纪人或店长,**I want** 查看和修改客源的首录人与归属人,**So that** 确保客源归属关系正确,保证客源跟进责任到人。
|
||||
**As** Agent(经纪人)或店长,**I want** 查看和修改客源的首录人与归属人,**So that** 确保客源归属关系正确,保证客源跟进责任到人。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
@@ -649,7 +649,7 @@
|
||||
|
||||
### Story 25:经纪人查看客源操作日志
|
||||
|
||||
**As** 一线经纪人或店长,**I want** 查看某一客源的完整操作历史记录,**So that** 了解客源的全生命周期操作轨迹,追溯变更原因,辅助审计和管理。
|
||||
**As** Agent(经纪人)或店长,**I want** 查看某一客源的完整操作历史记录,**So that** 了解客源的全生命周期操作轨迹,追溯变更原因,辅助审计和管理。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
| 角色 | 描述 | 使用频率 |
|
||||
|------|------|----------|
|
||||
| 一线经纪人 | 负责录入、维护、跟进自己名下的房源 | 每日高频 |
|
||||
| Agent(经纪人) | 负责录入、维护、跟进自己名下的房源 | 每日高频 |
|
||||
| 店长/经理 | 查看全店/全区房源概况,分配任务,监控跟进完成度 | 每日 |
|
||||
| 行政人员 | 审核房源信息,维护数据质量 | 每日 |
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
### Story 1:经纪人录入新房源
|
||||
|
||||
**As** 一线经纪人,**I want** 快速录入一套新房源的完整信息,**So that** 房源能进入公盘流通并留存完整的基础数据。
|
||||
**As** Agent(经纪人),**I want** 快速录入一套新房源的完整信息,**So that** 房源能进入公盘流通并留存完整的基础数据。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 支持选择 6 种房源类型(住宅、别墅、商铺、商住、写字楼、其他),本期 P0 实现住宅,P1 实现别墅,商业类型低优先级
|
||||
@@ -79,7 +79,7 @@
|
||||
|
||||
### Story 2:经纪人筛选查找目标房源
|
||||
|
||||
**As** 一线经纪人,**I want** 在数万条房源中快速定位符合客户需求的房源,**So that** 提升匹配推荐效率、减少无效沟通。
|
||||
**As** Agent(经纪人),**I want** 在数万条房源中快速定位符合客户需求的房源,**So that** 提升匹配推荐效率、减少无效沟通。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 支持关键词搜索:小区名称、地址、业主姓名、电话、钥匙编号等
|
||||
@@ -100,7 +100,7 @@
|
||||
|
||||
### Story 3:经纪人变更房源状态
|
||||
|
||||
**As** 一线经纪人,**I want** 在房源详情页快速变更房源的交易状态并说明原因,**So that** 保持房源状态与实际情况同步,团队成员能及时感知。
|
||||
**As** Agent(经纪人),**I want** 在房源详情页快速变更房源的交易状态并说明原因,**So that** 保持房源状态与实际情况同步,团队成员能及时感知。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 状态变更入口位于详情页顶部操作区"改状态"按钮
|
||||
@@ -113,7 +113,7 @@
|
||||
|
||||
### Story 4:经纪人在详情页快捷编辑房源核心字段
|
||||
|
||||
**As** 一线经纪人,**I want** 不离开房源详情页就能直接修改价格、等级、属性、现状、用途等高频字段,**So that** 减少页面跳转,快速响应业主意向变化。
|
||||
**As** Agent(经纪人),**I want** 不离开房源详情页就能直接修改价格、等级、属性、现状、用途等高频字段,**So that** 减少页面跳转,快速响应业主意向变化。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 详情页顶部支持快捷编辑栋座单元房号(含更改理由,最多 200 字)
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
### Story 5:经纪人记录房源跟进
|
||||
|
||||
**As** 一线经纪人,**I want** 随时记录与业主的沟通内容,**So that** 保留完整的跟进轨迹,团队协作时不会重复打扰业主。
|
||||
**As** Agent(经纪人),**I want** 随时记录与业主的沟通内容,**So that** 保留完整的跟进轨迹,团队协作时不会重复打扰业主。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 在房源详情页顶部可直接唤起"写跟进"浮层,无需离开当前页面
|
||||
@@ -151,7 +151,7 @@
|
||||
|
||||
### Story 6:经纪人管理钥匙与委托
|
||||
|
||||
**As** 一线经纪人,**I want** 在系统中登记钥匙持有情况和委托协议信息,**So that** 提升房源维护完成度评分,并让团队知悉钥匙状态,避免带看时出现无法入场的情况。
|
||||
**As** Agent(经纪人),**I want** 在系统中登记钥匙持有情况和委托协议信息,**So that** 提升房源维护完成度评分,并让团队知悉钥匙状态,避免带看时出现无法入场的情况。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
|
||||
### Story 7:经纪人提交实勘记录
|
||||
|
||||
**As** 一线经纪人,**I want** 完成实地勘察后在系统中提交实勘报告和分类照片,**So that** 提升房源维护完成度、保障房源信息真实性,给客户提供更可信的参考依据。
|
||||
**As** Agent(经纪人),**I want** 完成实地勘察后在系统中提交实勘报告和分类照片,**So that** 提升房源维护完成度、保障房源信息真实性,给客户提供更可信的参考依据。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 实勘为独立页面,包含:实勘定位(GPS)、实勘说明(最多 200 字)
|
||||
@@ -186,7 +186,7 @@
|
||||
|
||||
### Story 8:经纪人管理房源业主与联系人
|
||||
|
||||
**As** 一线经纪人,**I want** 在房源详情页随时新增、编辑业主/联系人信息,并查看该业主名下的其他房源,**So that** 保持联系人资料准确完整,了解业主资产全貌,避免重复打扰、提升沟通效率。
|
||||
**As** Agent(经纪人),**I want** 在房源详情页随时新增、编辑业主/联系人信息,并查看该业主名下的其他房源,**So that** 保持联系人资料准确完整,了解业主资产全貌,避免重复打扰、提升沟通效率。
|
||||
|
||||
#### 验收标准 8.1:新增业主/联系人
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
|
||||
### Story 9:经纪人管理房源图片
|
||||
|
||||
**As** 一线经纪人,**I want** 为房源上传并分类管理照片、设置封面图,**So that** 提升房源展示质量,吸引更多买家/租客关注。
|
||||
**As** Agent(经纪人),**I want** 为房源上传并分类管理照片、设置封面图,**So that** 提升房源展示质量,吸引更多买家/租客关注。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 支持图片分类:封面(限 1 张)、玄关、客厅、餐厅、卧室、卫生间、厨房、阳台、书房、室内其他、室外、全景
|
||||
@@ -235,7 +235,7 @@
|
||||
|
||||
### Story 10:经纪人管理房源附件
|
||||
|
||||
**As** 一线经纪人,**I want** 为房源上传并分类管理证件/协议等附件文件,**So that** 将核心证明材料与房源绑定留存,方便后续合规审查和团队共享查阅。
|
||||
**As** Agent(经纪人),**I want** 为房源上传并分类管理证件/协议等附件文件,**So that** 将核心证明材料与房源绑定留存,方便后续合规审查和团队共享查阅。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 附件分类 Tab 包含:全部 / 身份证 / 房产证 / 委托书 / 其他,每个 Tab 实时显示该分类文件数量
|
||||
@@ -248,7 +248,7 @@
|
||||
|
||||
### Story 11:经纪人补全房源详细信息
|
||||
|
||||
**As** 一线经纪人,**I want** 不离开房源详情页补充或修改基本信息、产证信息、房屋介绍和楼盘信息,**So that** 提升房源维护完成度评分,增强房源对买家/租客的吸引力。
|
||||
**As** Agent(经纪人),**I want** 不离开房源详情页补充或修改基本信息、产证信息、房屋介绍和楼盘信息,**So that** 提升房源维护完成度评分,增强房源对买家/租客的吸引力。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 「房源信息」Tab 下,以下区块均支持点击"编辑"触发浮窗编辑,无需跳转页面:
|
||||
|
||||
@@ -27,9 +27,9 @@
|
||||
| 角色 | 描述 | 使用频率 |
|
||||
|------|------|----------|
|
||||
| 运营/数据管理员 | 维护楼盘信息、楼栋结构、区域体系、学校信息的标准化数据 | 每日 |
|
||||
| 一线经纪人 | 查询楼盘详情、参考价格走势、了解周边配套辅助成交 | 每日 |
|
||||
| Agent(经纪人) | 查询楼盘详情、参考价格走势、了解周边配套辅助成交 | 每日 |
|
||||
| 店长/经理 | 监控楼盘数据完整度,分析区域市场行情 | 每周 |
|
||||
| 系统管理员 | 配置区域关联关系,管理数据标准 | 不定期 |
|
||||
| Tenant Admin(租户管理员) | 配置区域关联关系,管理数据标准 | 不定期 |
|
||||
|
||||
---
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
|
||||
### Story 7:经纪人查看楼盘价格走势
|
||||
|
||||
**As** 一线经纪人,**I want** 在楼盘详情页查看该楼盘的挂牌价走势和历史成交数据,**So that** 在带看时能为客户提供客观的市场行情参考,增强议价信心。
|
||||
**As** Agent(经纪人),**I want** 在楼盘详情页查看该楼盘的挂牌价走势和历史成交数据,**So that** 在带看时能为客户提供客观的市场行情参考,增强议价信心。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
@@ -263,7 +263,7 @@
|
||||
|
||||
### Story 8:经纪人查看楼盘周边配套
|
||||
|
||||
**As** 一线经纪人,**I want** 在楼盘详情页查看该楼盘周边的交通/教育/医疗/购物/生活/娱乐配套,**So that** 在带客时快速回答客户关于生活便利性的问题,增强成交转化。
|
||||
**As** Agent(经纪人),**I want** 在楼盘详情页查看该楼盘周边的交通/教育/医疗/购物/生活/娱乐配套,**So that** 在带客时快速回答客户关于生活便利性的问题,增强成交转化。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 周边配套 Tab 以地图为主体,楼盘位置以橙色标记点展示在地图上
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
| 司内成交明细及套数 | true/false | 开启后,显示公司成交的房源明细信息及成交套数 |
|
||||
| 区域管理 | true/false | 若启用,则可对区域商圈进行新增、合并、关联操作 |
|
||||
| 查看销控盘 | true/false | 开启后,可在楼盘管理系统-楼盘里,查看销控盘。请注意:员工查看销控盘时房源地址是直接可见的,建议只给管理层开启!!! |
|
||||
| 查看销控盘时,只可查看本部门作业范围内的楼盘 | true/false | 开启后,只可查看本部门作业范围内的楼盘的销控盘;关闭后,则跟作业范围无关,「查看销控盘」权限开启即可见所有楼盘的销控盘;系统管理员不受限制 |
|
||||
| 查看销控盘时,只可查看本部门作业范围内的楼盘 | true/false | 开启后,只可查看本部门作业范围内的楼盘的销控盘;关闭后,则跟作业范围无关,「查看销控盘」权限开启即可见所有楼盘的销控盘;Tenant Admin(租户管理员)不受限制 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
|
||||
| 角色 | 描述 | 使用频率 |
|
||||
|------|------|----------|
|
||||
| 系统管理员 | 负责角色创建、权限配置、人员权限分配及批量操作,是本模块的核心使用者 | 每日 |
|
||||
| Tenant Admin(租户管理员) | 负责角色创建、权限配置、人员权限分配及批量操作,是本模块的核心使用者 | 每日 |
|
||||
| 店长 / 区域经理 | 查看下属员工当前权限,按需发起权限变更申请 | 按需 |
|
||||
| 一线经纪人 | 受权限约束的数据访问者,感知到功能入口的显示/隐藏变化 | 被动感知 |
|
||||
| Agent(经纪人) | 受权限约束的数据访问者,感知到功能入口的显示/隐藏变化 | 被动感知 |
|
||||
|
||||
---
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
|
||||
### Story 1:管理员查看人员权限列表
|
||||
|
||||
**As** 系统管理员,**I want** 在人员列表中查看全公司所有员工的当前角色与权限状态,**So that** 能快速定位权限异常人员并执行调整。
|
||||
**As** Tenant Admin(租户管理员),**I want** 在人员列表中查看全公司所有员工的当前角色与权限状态,**So that** 能快速定位权限异常人员并执行调整。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 页面入口路径:顶部导航「人事」→「组织人事」→「权限管理」,面包屑显示「人事OA / 组织人事 / 权限管理」
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
### Story 2:管理员为员工批量设置角色
|
||||
|
||||
**As** 系统管理员,**I want** 同时为多名员工批量设置同一角色,**So that** 在员工入职或组织架构调整时能高效完成权限初始化,无需逐一操作。
|
||||
**As** Tenant Admin(租户管理员),**I want** 同时为多名员工批量设置同一角色,**So that** 在员工入职或组织架构调整时能高效完成权限初始化,无需逐一操作。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 在人员列表中勾选至少一名员工后,「批量设置角色」按钮从禁用变为可点击
|
||||
@@ -95,7 +95,7 @@
|
||||
|
||||
### Story 3:管理员修改个人权限
|
||||
|
||||
**As** 系统管理员,**I want** 为特定员工在角色权限基础上进行个性化权限调整,**So that** 满足因岗位特殊性而需要区别于通用角色权限配置的场景。
|
||||
**As** Tenant Admin(租户管理员),**I want** 为特定员工在角色权限基础上进行个性化权限调整,**So that** 满足因岗位特殊性而需要区别于通用角色权限配置的场景。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击人员列表中某员工操作列的「修改权限」后,进入该员工的权限编辑页
|
||||
@@ -132,7 +132,7 @@
|
||||
|
||||
### Story 4:管理员查看并编辑特定权限项(侧边抽屉)
|
||||
|
||||
**As** 系统管理员,**I want** 在编辑单个权限项时,同时看到该权限当前应用该角色的所有人员名单,**So that** 能了解本次修改的影响范围,再决定是否确认变更。
|
||||
**As** Tenant Admin(租户管理员),**I want** 在编辑单个权限项时,同时看到该权限当前应用该角色的所有人员名单,**So that** 能了解本次修改的影响范围,再决定是否确认变更。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击权限项的「编辑」按钮后,页面右侧滑出 Drawer(不覆盖左侧导航)
|
||||
@@ -147,7 +147,7 @@
|
||||
|
||||
### Story 5:管理员查看角色列表
|
||||
|
||||
**As** 系统管理员,**I want** 在角色管理页查看所有已创建的角色及其基本信息,**So that** 快速了解当前系统的角色体系,并按需编辑或删除。
|
||||
**As** Tenant Admin(租户管理员),**I want** 在角色管理页查看所有已创建的角色及其基本信息,**So that** 快速了解当前系统的角色体系,并按需编辑或删除。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击顶部「角色管理」Tab 切换至角色列表页
|
||||
@@ -165,7 +165,7 @@
|
||||
|
||||
### Story 6:管理员新增角色
|
||||
|
||||
**As** 系统管理员,**I want** 新建一个角色并配置其权限,**So that** 为新增岗位或特殊职能定义标准权限模板,便于批量分配给对应员工。
|
||||
**As** Tenant Admin(租户管理员),**I want** 新建一个角色并配置其权限,**So that** 为新增岗位或特殊职能定义标准权限模板,便于批量分配给对应员工。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击「+ 新增角色」按钮弹出 Modal,标题为「添加角色」
|
||||
@@ -182,7 +182,7 @@
|
||||
|
||||
### Story 7:管理员配置角色权限
|
||||
|
||||
**As** 系统管理员,**I want** 在角色权限编辑页为角色精细配置各模块的权限开关和数据范围,**So that** 该角色下所有人员自动继承统一的权限配置,减少重复操作。
|
||||
**As** Tenant Admin(租户管理员),**I want** 在角色权限编辑页为角色精细配置各模块的权限开关和数据范围,**So that** 该角色下所有人员自动继承统一的权限配置,减少重复操作。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 角色权限编辑页顶部展示:角色名称、角色类别、「编辑」按钮(支持在线修改角色基本信息)
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
### Story 8:管理员修改角色(切换员工角色)
|
||||
|
||||
**As** 系统管理员,**I want** 在员工权限编辑页直接切换员工所属角色,**So that** 快速完成角色变更而不需要退出到人员列表再操作。
|
||||
**As** Tenant Admin(租户管理员),**I want** 在员工权限编辑页直接切换员工所属角色,**So that** 快速完成角色变更而不需要退出到人员列表再操作。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 在员工权限编辑页顶部,角色名称旁有下拉箭头,点击展开角色选择器
|
||||
@@ -427,7 +427,7 @@ Fonrey 采用 **RBAC(基于角色的访问控制)+ 个人权限叠加** 的
|
||||
| 司内成交明细及套数 | 开关型 | 开启后,显示公司成交的房源明细信息及成交套数 |
|
||||
| 区域管理 | 开关型 | 若启用,则可对区域商圈进行新增、合并、关联操作 |
|
||||
| 查看销控盘 | 开关型 | 开启后,可在楼盘管理系统-楼盘里,查看销控盘;注意:员工查看销控盘时房源地址是直接可见的,建议只给管理层开启!!!|
|
||||
| 查看销控盘时,只可查看本部门作业范围内的楼盘 | 开关型 | 开启后,只可查看本部门作业范围内的楼盘的销控盘;关闭,则跟作业范围无关,「查看销控盘」权限开启即可查看所有楼盘的销控盘;系统管理员不受限制 |
|
||||
| 查看销控盘时,只可查看本部门作业范围内的楼盘 | 开关型 | 开启后,只可查看本部门作业范围内的楼盘的销控盘;关闭,则跟作业范围无关,「查看销控盘」权限开启即可查看所有楼盘的销控盘;Tenant Admin(租户管理员)不受限制 |
|
||||
|
||||
**楼盘资料管理**
|
||||
|
||||
@@ -537,8 +537,8 @@ Fonrey 采用 **RBAC(基于角色的访问控制)+ 个人权限叠加** 的
|
||||
| 阶段 | 时间 | 受众 | 通过标准 |
|
||||
|------|------|------|---------|
|
||||
| 内部 Alpha | TBD | 研发 + 产品团队 | 角色 CRUD 流程通畅,权限编辑保存无误 |
|
||||
| 封闭 Beta | TBD | 1-2 家试点门店系统管理员 | 批量设置角色 / 个人权限修改功能可用,无 P0 Bug |
|
||||
| 正式上线 | TBD | 全部租户系统管理员 | 权限变更实时生效,错误率 < 0.5%,系统管理员 CSAT ≥ 4/5 |
|
||||
| 封闭 Beta | TBD | 1-2 家试点门店Tenant Admin(租户管理员) | 批量设置角色 / 个人权限修改功能可用,无 P0 Bug |
|
||||
| 正式上线 | TBD | 全部租户Tenant Admin(租户管理员) | 权限变更实时生效,错误率 < 0.5%,Tenant Admin(租户管理员) CSAT ≥ 4/5 |
|
||||
|
||||
**回滚标准**:若权限写入后错误率 > 2%,或出现跨租户数据泄漏问题,立即回滚并通知所有租户管理员。
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 284 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 180 KiB |
@@ -2,8 +2,8 @@
|
||||
|
||||
**状态**: Draft
|
||||
**作者**: 产品经理
|
||||
**最后更新**: 2026-04-25(v1.4 §5.5 后端数据模型迁移至独立文档 `DATA_MODEL/DATA_MODEL_LOGIN.md`)
|
||||
**版本**: 1.4
|
||||
**最后更新**: 2026-04-30(v2.0 根据 review 后的 §4 用户故事全面同步 §5 功能详细说明:删除找回用户名流程及邮件模板;找回密码改为纯短信流程;新增 §5.5 手机验证码登录详细说明;§6 技术注意事项更新短信依赖/风险/开放问题;§8.2 接口清单同步正式功能状态)
|
||||
**版本**: 2.0
|
||||
**所属系统**: Fonrey 房产经纪管理系统
|
||||
**关联模块**: 组织人事管理、权限管理、系统管理
|
||||
|
||||
@@ -28,17 +28,17 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用多租户架
|
||||
|------|--------|---------|
|
||||
| 多租户环境下,客户端不知道应该连接哪个租户的服务端 | 新用户首次安装后无法正常使用 | 系统无法启动,用户体验极差 |
|
||||
| 账号密码裸露登录,缺乏验证码保护 | 所有用户 | 存在暴力破解、自动化恶意登录风险 |
|
||||
| 用户忘记账号或密码无自助找回通道 | 一线经纪人 | 依赖管理员手动重置,效率低 |
|
||||
| 账号未与实名经纪人档案绑定 | 系统管理员、合规审计 | 操作行为无法追溯至自然人 |
|
||||
| 用户忘记账号或密码无自助找回通道 | Agent(经纪人) | 依赖管理员手动重置,效率低 |
|
||||
| 账号未与实名经纪人档案绑定 | Tenant Admin(租户管理员)、合规审计 | 操作行为无法追溯至自然人 |
|
||||
| 无多因素认证,安全系数低 | 管理层、数据合规 | 存在账号冒用、数据泄露风险 |
|
||||
|
||||
### 1.3 目标用户
|
||||
|
||||
| 角色 | 描述 | 使用频率 |
|
||||
|------|------|----------|
|
||||
| 一线经纪人 | 每日登录系统使用房源/客源功能 | 每日高频 |
|
||||
| Agent(经纪人) | 每日登录系统使用房源/客源功能 | 每日高频 |
|
||||
| 店长 / 经理 | 登录后查看全店数据、管理任务 | 每日 |
|
||||
| 系统管理员 | 管理账号创建、密码重置、租户初始化 | 按需 |
|
||||
| Tenant Admin(租户管理员) | 管理账号创建、密码重置、租户初始化 | 按需 |
|
||||
| 新安装用户 | 首次安装客户端后需完成 Tenant 识别 | 一次性 |
|
||||
|
||||
---
|
||||
@@ -49,7 +49,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用多租户架
|
||||
|------|------|----------|--------|----------|
|
||||
| 降低登录失败率 | 账号密码正确情况下的登录成功率 | 待统计 | ≥ 99% | 上线后 30 天 |
|
||||
| 防止恶意登录 | 每日验证码拦截异常登录请求数 | 0(无保护) | 建立基线,同IP异常次数 > 5次/分钟触发封锁 | 上线后持续监控 |
|
||||
| 提升找回账号效率 | 用户自助找回密码耗时 | 依赖管理员(约1工作日) | < 3 分钟(邮件/短信自助) | 上线后 30 天 |
|
||||
| 提升找回账号效率 | 用户自助找回密码耗时 | 依赖管理员(约1工作日) | < 3 分钟(短信验证码自助) | 上线后 30 天 |
|
||||
| 确保账号实名绑定率 | 拥有系统账号且未与员工档案绑定的账号比例 | 待统计 | 0%(强制绑定) | 上线即达标 |
|
||||
| Tenant 识别成功率 | 首次安装后成功完成 Tenant 识别的用户比例 | 待统计 | ≥ 98% | 上线后 30 天 |
|
||||
|
||||
@@ -58,11 +58,12 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用多租户架
|
||||
## 3. 非目标(本期不做)
|
||||
|
||||
- **手机验证码登录**:移动端小程序上线后实现,本期**接口预留**,UI 入口以「即将开放」禁用态展示
|
||||
> **注意**:本条已更新。手机验证码登录已升级为 **MVP 正式功能**(见 Story 5),与密码登录并列提供。此非目标条目保留仅作版本记录,已失效。
|
||||
- **微信扫码登录**:移动端小程序上线后实现,本期**接口预留**,UI 入口以「即将开放」禁用态展示
|
||||
- **单点登录(SSO)/ 企业微信集成**:后续版本规划
|
||||
- **多设备并发登录的强制踢出策略**:本期允许同账号多端登录,后续安全策略模块规划
|
||||
- **登录时段限制 / IP 白名单**:安全策略模块另行规划
|
||||
- **管理后台(Platform Admin)登录**:系统管理员登录管理后台的流程属于系统管理模块,本 PRD 专注租户内用户登录
|
||||
- **管理后台(Platform Admin)登录**:Tenant Admin(租户管理员)登录管理后台的流程属于系统管理模块,本 PRD 专注租户内用户登录
|
||||
|
||||
---
|
||||
|
||||
@@ -72,31 +73,33 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用多租户架
|
||||
|
||||
### Story 1:新用户首次启动客户端——Tenant 识别
|
||||
|
||||
**As** 新安装 Fonrey 客户端的经纪人,**I want** 在首次启动时输入所属公司的 Tenant ID 完成租户识别,**So that** 客户端能连接到正确的服务端,后续显示对应公司的登录界面和数据。
|
||||
**As** 新安装 Fonrey 客户端的经纪人,**I want** 在首次启动时输入所属公司的 12位 Tenant Code 完成租户识别,**So that** 客户端能连接到正确的服务端,后续显示对应公司的登录界面和数据。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
- [ ] 客户端首次启动时(本地无 Tenant ID 缓存),自动呈现「Tenant 识别」界面,而非直接显示登录界面
|
||||
- [ ] 界面包含:产品 Logo、产品名称「Fonrey 房睿」、说明文案「请输入您公司的专属识别码」、Tenant ID 输入框、「确认」按钮
|
||||
- [ ] Tenant ID 输入框支持粘贴操作,自动去除前后空格
|
||||
- [ ] 客户端首次启动时(本地无 Tenant Code 缓存),自动呈现「Tenant 识别」界面,而非直接显示登录界面
|
||||
- [ ] 界面包含:产品 Logo、产品名称「Fonrey 房睿」、说明文案「请输入您公司的专属识别码」、Tenant Code 输入框、「确认」按钮
|
||||
- [ ] Tenant Code 输入框支持粘贴操作,自动去除前后空格
|
||||
- [ ] 点击「确认」后,客户端向服务端发起 Tenant 验证请求(`POST /api/auth/tenant/verify/`),展示加载状态(spinner)
|
||||
- [ ] **验证成功**:服务端返回租户名称及品牌信息(如公司名称、Logo URL);客户端将 Tenant ID 写入本地持久化存储,自动跳转至该租户的登录界面;界面顶部展示「正在登录:XX 房产」
|
||||
- [ ] **验证失败(Tenant ID 无效)**:输入框下方显示红色错误提示「识别码无效,请联系您的系统管理员获取正确的识别码」;Tenant ID 不写入本地缓存;用户可重新输入
|
||||
- [ ] **验证成功**:服务端返回租户名称及品牌信息(如公司名称、Logo URL);客户端将 Tenant Code 写入本地持久化存储,自动跳转至该租户的登录界面;界面顶部展示「正在登录:XX 房产」
|
||||
- [ ] **验证失败(Tenant Code 无效)**:输入框下方显示红色错误提示「识别码无效,请联系您的Tenant Admin(租户管理员)获取正确的识别码」;Tenant Code 不写入本地缓存;用户可重新输入
|
||||
- [ ] **网络异常**:显示「网络连接失败,请检查网络后重试」,提供「重试」按钮
|
||||
- [ ] 非首次启动(本地已有合法 Tenant ID 缓存):直接跳过识别界面,进入登录界面
|
||||
- [ ] 登录界面提供「切换公司」入口(链接文字,非主要 CTA),点击后清除本地 Tenant ID 缓存并重新显示 Tenant 识别界面;确认前弹出二次确认「切换公司将退出当前账号,是否继续?」
|
||||
- [ ] 非首次启动(本地已有合法 Tenant Code 缓存):直接跳过识别界面,进入登录界面
|
||||
- [ ] 登录界面提供「切换公司」入口(链接文字,非主要 CTA),点击后清除本地 Tenant Code 缓存并重新显示 Tenant 识别界面;确认前弹出二次确认「切换公司将退出当前账号,是否继续?」
|
||||
- [ ] Tenant 验证接口属于公开接口,无需鉴权;但需对单 IP 请求频率限制(每分钟 ≤ 10 次)以防止枚举攻击
|
||||
|
||||
---
|
||||
|
||||
### Story 2:经纪人通过账号密码登录
|
||||
### Story 2:经纪人通过手机号和密码登录
|
||||
|
||||
**As** 已识别租户的经纪人,**I want** 通过用户名和密码完成登录,**So that** 进入系统开始工作。
|
||||
**As** 已识别租户的经纪人,**I want** 通过手机号和密码完成登录,**So that** 进入系统开始工作。
|
||||
|
||||
> **说明**:普通员工的登录账号即为其手机号(由Tenant Admin(租户管理员)在新增员工时自动创建),无需记忆额外用户名。Tenant Admin 账号的登录名为平台运营自定义字符串,不受此约束。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
- [ ] 登录界面展示:租户品牌标识(公司 Logo + 公司名称)、用户名输入框、密码输入框、滑块拼图验证区域、「登录」按钮
|
||||
- [ ] 用户名输入框 Placeholder:「请输入用户名」;支持英文字母、数字、下划线,最大长度 50 字符
|
||||
- [ ] 登录界面展示:租户品牌标识(公司 Logo + 公司名称)、手机号输入框、密码输入框、滑块拼图验证区域、「登录」按钮
|
||||
- [ ] 手机号输入框 Placeholder:「请输入您的手机号」;仅接受数字字符(非数字自动过滤),固定 11 位
|
||||
- [ ] 密码输入框默认密文显示,右侧提供「显示/隐藏」图标切换明密文
|
||||
- [ ] **行为验证码(滑块拼图)**:展示一张带缺口的背景图和一块可拖动的拼图碎片,用户通过拖动滑块将碎片移动至缺口位置完成验证;无需输入任何字符,操作直观快速
|
||||
- [ ] 验证逻辑:前端记录滑动轨迹(坐标序列 + 耗时),与背景图缺口位置一同发送至服务端;服务端综合校验**位置偏差**(允许 ±5px 容差)和**轨迹特征**(是否存在人类滑动的加速/减速规律)以区分机器行为
|
||||
@@ -104,92 +107,121 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用多租户架
|
||||
- [ ] 验证成功后,拼图区域显示绿色对勾 + 「验证通过」文案,状态持续至本次登录提交完成
|
||||
- [ ] 提供「刷新」图标按钮,允许用户主动刷新背景图(针对图片模糊或缺口不清晰的情况)
|
||||
- [ ] 背景图从预置图库中随机抽取,缺口位置每次随机生成,防止固定模式被预测
|
||||
- [ ] 三项(用户名、密码、验证码)均有填写后,「登录」按钮才可点击(否则置灰)
|
||||
- [ ] 三项(手机号、密码、验证码)均有填写后,「登录」按钮才可点击(否则置灰)
|
||||
- [ ] 点击「登录」触发前端格式校验:
|
||||
- 用户名为空 → 输入框下方红色提示「请输入用户名」
|
||||
- 手机号为空 → 输入框下方红色提示「请输入手机号」
|
||||
- 手机号不满 11 位 → 提示「请输入完整的 11 位手机号」
|
||||
- 密码为空 → 提示「请输入密码」
|
||||
- 验证码为空 → 提示「请输入验证码」
|
||||
- 验证码为空 → 提示「请完成滑块验证」
|
||||
- [ ] 格式校验通过后,向服务端发起登录请求,按钮进入 loading 状态防止重复提交
|
||||
- [ ] **登录成功**:服务端返回 Session Token;客户端存储 Token;跳转至系统首页;顶部显示欢迎信息「欢迎回来,{姓名}」
|
||||
- [ ] **登录失败(用户名或密码错误)**:显示「用户名或密码错误,请重新输入」(不区分是用户名错误还是密码错误,防止枚举攻击);验证码自动刷新;密码输入框清空;用户名保留
|
||||
- [ ] **登录成功(常规)**:服务端返回 Session Token 及 `is_initial_password` 标记;客户端存储 Token;
|
||||
- 若 `is_initial_password = False`:直接跳转系统首页,顶部显示欢迎信息「欢迎回来,{姓名}」
|
||||
- 若 `is_initial_password = True`:**立即跳转「修改初始密码」强制页面**,不可关闭、不可跳过、不可访问任何其他功能页面(详见 §5.3.4)
|
||||
- [ ] **登录失败(手机号或密码错误)**:显示「手机号或密码错误,请重新输入」(不区分具体原因,防止枚举攻击);验证码自动刷新;密码输入框清空;手机号保留
|
||||
- [ ] **登录失败(验证码错误)**:显示「验证码有误,请重新输入」;验证码自动刷新;验证码输入框清空
|
||||
- [ ] **账号被锁定**(同一账号密码连续错误 ≥ 5 次):显示「账号已被临时锁定,请 30 分钟后重试,或联系管理员解锁」;锁定状态下「登录」按钮置灰
|
||||
- [ ] **账号已停用**:显示「账号已停用,请联系您的管理员」
|
||||
- [ ] **Session 过期**:用户在系统内操作时 Session 过期,自动跳转至登录界面,并提示「登录已过期,请重新登录」
|
||||
- [ ] 登录界面底部提供:「忘记用户名」链接、「忘记密码」链接(详见 Story 3、Story 4)
|
||||
- [ ] 登录界面底部提供:「忘记密码」链接(详见 Story 3);移除「忘记用户名」入口(普通员工用户名即手机号,无需找回;Tenant Admin 如忘记用户名请联系平台运营)
|
||||
|
||||
---
|
||||
|
||||
### Story 3:经纪人找回用户名
|
||||
### Story 3:经纪人找回密码
|
||||
|
||||
**As** 忘记用户名的经纪人,**I want** 通过绑定的邮箱或手机号找回用户名,**So that** 不依赖管理员也能自助恢复登录。
|
||||
**As** 忘记密码的经纪人,**I want** 通过手机号 + 短信验证码完成身份核验,重新设定密码,**So that** 无需邮箱、无需联系管理员,独立完成密码重置。
|
||||
|
||||
> **说明**:考虑到大多数Agent(经纪人)没有常用邮箱,本期找回密码统一通过短信验证码实现,废弃邮箱找回方式。账号中 `email` 字段在本系统无任何必须业务用途,完全可选。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
- [ ] 点击登录界面「忘记用户名」链接,跳转至「找回用户名」页面(或弹窗)
|
||||
- [ ] 找回方式(本期以邮箱为主,手机号为预留字段):
|
||||
- 邮箱找回:输入注册邮箱,系统校验邮箱是否与已知账号匹配,匹配成功则发送包含用户名的邮件至该邮箱
|
||||
- 手机号找回(预留,UI 入口以「即将开放」禁用态展示)
|
||||
- [ ] 邮箱输入框:格式校验(包含「@」和域名),错误时提示「请输入有效的邮箱地址」
|
||||
- [ ] 点击「发送」后:
|
||||
- 邮箱存在且已绑定账号 → 显示「用户名已发送至您的邮箱,请查收」;发送按钮进入 60 秒倒计时不可重复点击
|
||||
- 邮箱不存在 → **不提示「邮箱未注册」**(防止用户信息枚举),统一显示「如该邮箱已绑定账号,您将收到一封包含用户名的邮件」
|
||||
- [ ] 邮件内容:纯文本邮件,包含用户名、发送时间,及「如非本人操作请联系管理员」说明
|
||||
- [ ] 发送频率限制:同一邮箱 1 小时内最多发送 3 次
|
||||
- [ ] 提供「返回登录」链接
|
||||
- [ ] 点击登录界面「忘记密码」链接,跳转至「找回密码」流程(Stepper 分步页面,共三步)
|
||||
|
||||
**步骤一:输入手机号**
|
||||
|
||||
- [ ] 页面显示:手机号输入框(11 位数字,自动过滤非数字)、「获取验证码」按钮、「返回登录」链接
|
||||
- [ ] 手机号为空或不足 11 位 → 点击「获取验证码」时在输入框下方提示「请输入完整的 11 位手机号」
|
||||
- [ ] 手机号格式合法后,点击「获取验证码」,按钮进入 60 秒倒计时冷却态(「重新获取(59s)」),倒计时结束后按钮恢复可点击
|
||||
- [ ] 服务端收到请求后:
|
||||
- 若该手机号**存在**且账号状态为 `active`:向该号码发送 6 位数字短信验证码,有效期 **10 分钟**
|
||||
- 若手机号**不存在**或账号已停用:页面统一提示「如该手机号已注册,验证码将在 1 分钟内发送」(**不泄露账号是否存在**)
|
||||
- [ ] 同一手机号 1 小时内最多发送 **5 次**短信验证码,超限后提示「发送次数过多,请 1 小时后再试」
|
||||
- [ ] 短信内容模板:「【Fonrey 房睿】您的密码重置验证码为 {code},10 分钟内有效,请勿泄露。」
|
||||
|
||||
**步骤二:输入短信验证码**
|
||||
|
||||
- [ ] 页面显示:6 位验证码输入框(支持分格输入)、「重新发送」倒计时链接、「下一步」按钮
|
||||
- [ ] 「下一步」按钮:6 位验证码全部输入后方可点击
|
||||
- [ ] 服务端校验验证码:
|
||||
- 正确且未过期 → 进入步骤三,颁发一次性 `sms_reset_token`(有效期 15 分钟,一次性,服务端存储)
|
||||
- 错误 → 提示「验证码有误,请重新输入」,错误次数 ≥ 5 次则本次验证码作废,需重新获取
|
||||
- 已过期 → 提示「验证码已过期,请重新获取」
|
||||
|
||||
**步骤三:重置密码**
|
||||
|
||||
- [ ] 步骤三依赖步骤二颁发的 `sms_reset_token`(通过 URL 参数或会话状态传递),Token 无效或过期 → 显示「操作已超时,请重新发起找回密码」,跳回步骤一
|
||||
- [ ] **本页面复用「设置新密码」公共组件**(与首次登录强制修改密码页面为同一组件,详见 §5.3.4),保持 UI 与交互逻辑完全一致;入口上下文不同时,仅页面标题和提示文案有所差异:
|
||||
|
||||
| 元素 | 首次登录强制修改(§5.3.4) | 找回密码步骤三(本 Story) |
|
||||
|------|--------------------------|--------------------------|
|
||||
| 页面标题 | 「欢迎使用 Fonrey,请先设置您的登录密码」 | 「重置您的登录密码」 |
|
||||
| 提示文案 | 「您当前使用的是初始密码,为保障账号安全,请立即设置新密码后开始使用」 | 「请输入您的新密码,设置完成后请使用新密码重新登录」 |
|
||||
| 提交按钮文案 | 「确认并进入系统」 | 「确认重置密码」 |
|
||||
| 提交后跳转 | `is_initial_password = False`,Session 保持,直接进入首页 | 所有 Session 立即失效,跳转登录界面并提示「密码已重置,请使用新密码登录」 |
|
||||
|
||||
- [ ] 提交成功后:`is_initial_password` 置为 **`False`**(找回密码属于用户主动操作,已完成身份核验,无需再触发强制修改流程)
|
||||
> **注意**:与首次登录流程不同,找回密码时用户已通过短信验证码完成了身份核验,本次密码设置即视为"用户本人主动设置",不应再触发 `is_initial_password = True` 的二次强制修改。
|
||||
|
||||
---
|
||||
|
||||
### Story 4:经纪人找回密码
|
||||
### Story 4:经纪人找回用户名(已废弃)
|
||||
|
||||
**As** 忘记密码的经纪人,**I want** 通过已知用户名 + 绑定邮箱(或手机号)自助重置密码,**So that** 不依赖管理员也能快速恢复登录。
|
||||
> **状态**:已废弃。普通员工用户名固定为手机号,无需找回;Tenant Admin 如忘记用户名,请联系平台运营线下处理。本 Story 保留占位以维持版本记录,实现时跳过此 Story。
|
||||
|
||||
---
|
||||
|
||||
### Story 5:手机验证码登录(MVP 实现)
|
||||
|
||||
**As** 已有账号的经纪人,**I want** 通过手机号 + 短信验证码直接登录,**So that** 在忘记密码或不想输入密码时,仍能快速进入系统。
|
||||
|
||||
> **说明**:短信基础设施(`sms_otp_records` 表、OTP 发送/校验逻辑)已在 Story 3 找回密码中建设完成,本 Story 直接复用,实现成本极低。登录界面提供「密码登录」和「验证码登录」两个并列入口,用户自由切换,两种方式均为 MVP 正式功能。
|
||||
|
||||
**验收标准**:
|
||||
|
||||
- [ ] 点击登录界面「忘记密码」链接,跳转至「找回密码」流程(分步骤页面或 Stepper 组件)
|
||||
- [ ] 登录界面提供两种登录方式的切换 Tab:**「密码登录」**(默认选中)和 **「验证码登录」**
|
||||
- [ ] 切换 Tab 时,输入区域平滑切换,已填内容清空,滑块验证状态重置
|
||||
|
||||
**步骤一:身份验证**
|
||||
**「验证码登录」界面元素**:
|
||||
- [ ] 手机号输入框(规格同 Story 2,11 位数字,自动过滤非数字)
|
||||
- [ ] 验证码输入框(6 位数字分格输入)+ 「获取验证码」按钮(60 秒倒计时冷却态)
|
||||
- [ ] 滑块拼图验证区域(规格同 Story 2,**先通过滑块验证,再允许点击「获取验证码」**)
|
||||
- [ ] 「登录」按钮(手机号 + 验证码均填写后方可点击)
|
||||
|
||||
- [ ] 用户输入:用户名 + 邮箱(本期);手机号找回为预留入口(禁用态)
|
||||
- [ ] 服务端校验用户名与邮箱是否匹配,不泄露具体原因(统一提示「如信息匹配,重置链接将发送至您的邮箱」)
|
||||
- [ ] 校验通过后,向绑定邮箱发送含一次性重置链接的邮件;链接有效期 **30 分钟**,使用后立即失效
|
||||
- [ ] 同一账号 1 小时内最多发送 3 次重置邮件
|
||||
**获取验证码逻辑**:
|
||||
- [ ] 用户须先完成滑块验证,「获取验证码」按钮方可点击;未完成滑块时点击 → 提示「请先完成滑块验证」
|
||||
- [ ] 点击「获取验证码」后,服务端:
|
||||
- 手机号格式不合法 → 前端拦截,提示「请输入完整的 11 位手机号」
|
||||
- 手机号存在且状态 `active` → 发送 6 位 OTP,有效期 **5 分钟**,存入 `sms_otp_records`(`scene = 'login'`)
|
||||
- 手机号不存在或已停用 → 统一响应「如该手机号已注册,验证码将在 1 分钟内发送」(防止枚举攻击)
|
||||
- [ ] 同一手机号 1 小时内最多发送 **10 次**登录验证码(找回密码为独立计数,两者不共享限额);超限后提示「发送次数过多,请 1 小时后再试」
|
||||
- [ ] 短信内容模板:「【Fonrey 房睿】您的登录验证码为 {code},5 分钟内有效,请勿泄露。」
|
||||
|
||||
**步骤二:重置密码**
|
||||
**登录校验逻辑**:
|
||||
- [ ] 点击「登录」,服务端校验 OTP:
|
||||
- 正确且未过期 → 登录成功,后续行为与 Story 2 密码登录完全一致(含 `is_initial_password` 判断)
|
||||
- 错误 → 提示「验证码有误,请重新输入」;连续错误 ≥ 5 次 → 本次 OTP 作废,提示「验证码已失效,请重新获取」
|
||||
- 已过期 → 提示「验证码已过期,请重新获取」
|
||||
- [ ] **账号被锁定**(密码登录失败次数触发):验证码登录仍受账号锁定限制,锁定期间无法通过任何方式登录,提示「账号已被临时锁定,请 30 分钟后重试,或联系管理员解锁」
|
||||
> **设计说明**:账号锁定是账号维度的安全策略,不区分登录方式;否则锁定形同虚设。
|
||||
- [ ] **账号已停用**:提示「账号已停用,请联系您的管理员」
|
||||
|
||||
- [ ] 用户点击邮件中的链接,跳转至「重置密码」页面(链接含加密 Token,服务端校验 Token 有效性)
|
||||
- [ ] Token 无效或已过期 → 显示「链接已过期或已使用,请重新申请」,提供「重新申请」按钮
|
||||
- [ ] 页面包含:新密码输入框、确认新密码输入框
|
||||
- [ ] **密码复杂度规则**(符合安全基线):
|
||||
- 长度 8 ~ 32 位
|
||||
- 必须包含字母(区分大小写)和数字
|
||||
- 建议包含特殊符号(非强制,但页面提示推荐)
|
||||
- 不得与最近 3 次历史密码相同
|
||||
- [ ] 两次密码输入不一致 → 提示「两次密码输入不一致」
|
||||
- [ ] 不符合复杂度 → 实时提示具体不满足的规则(逐条校验,红色 × / 绿色 ✓ 视觉指引)
|
||||
- [ ] 提交成功 → 显示「密码已重置,请使用新密码登录」,自动跳转至登录界面;原所有 Session 立即失效(强制重新登录)
|
||||
|
||||
---
|
||||
|
||||
### Story 5:预留——手机验证码登录(接口预留,v2 实现)
|
||||
|
||||
**As** 绑定了手机号的经纪人,**I want** 通过手机号 + 短信验证码快速登录,**So that** 在忘记密码时仍能正常登录系统。
|
||||
|
||||
**当前状态**:本期 UI 入口以「即将开放」禁用态展示于登录界面,接口定义预留,不开放实际功能。
|
||||
|
||||
**预留接口设计**(供后端提前规划):
|
||||
**接口规范**:
|
||||
|
||||
```
|
||||
POST /api/auth/login/phone/
|
||||
Request: { phone: string, sms_code: string, tenant_id: string }
|
||||
Response: { token: string, user: {...} } | { error: string }
|
||||
Request: { phone: string, sms_code: string }
|
||||
Response: { token: string, is_initial_password: bool, user: {...} } | { error_code: string, message: string }
|
||||
```
|
||||
|
||||
**绑定条件**(v2 实现时的前置要求):
|
||||
- 手机号必须先在「个人设置」中与用户名账号完成绑定并通过验证
|
||||
- 一个手机号只能绑定一个用户名账号(同一租户内)
|
||||
- 绑定手机号后,可通过手机号 + 短信验证码联合登录
|
||||
|
||||
---
|
||||
|
||||
### Story 6:预留——微信扫码登录(接口预留,v2 实现)
|
||||
@@ -221,9 +253,9 @@ POST /api/auth/wechat/callback/ # 微信扫码确认后回调,换取系
|
||||
```
|
||||
客户端启动
|
||||
│
|
||||
├─ 本地有 Tenant ID 缓存?
|
||||
├─ 本地有 Tenant Code 缓存?
|
||||
│ │
|
||||
│ YES ──→ 校验缓存 Tenant ID 是否仍有效(服务端 validate)
|
||||
│ YES ──→ 校验缓存 Tenant Code 是否仍有效(服务端 validate)
|
||||
│ │
|
||||
│ 有效 ──→ 直接进入登录界面
|
||||
│ │
|
||||
@@ -231,33 +263,33 @@ POST /api/auth/wechat/callback/ # 微信扫码确认后回调,换取系
|
||||
│
|
||||
└─ NO ──→ 显示 Tenant 识别界面
|
||||
│
|
||||
用户输入 Tenant ID → 发起验证
|
||||
用户输入 Tenant Code → 发起验证
|
||||
│
|
||||
验证成功 ──→ 缓存 Tenant ID → 进入登录界面
|
||||
验证成功 ──→ 缓存 Tenant Code → 进入登录界面
|
||||
│
|
||||
验证失败 ──→ 显示错误信息,保持识别界面
|
||||
```
|
||||
|
||||
#### 5.1.2 Tenant 识别界面规范
|
||||
|
||||
| 元素 | 规格 |
|
||||
|------|------|
|
||||
| 页面背景 | 品牌色渐变(与登录界面保持一致的视觉风格) |
|
||||
| Logo | Fonrey 产品 Logo,居中显示 |
|
||||
| 标题 | 「欢迎使用 Fonrey 房睿」 |
|
||||
| 副标题 | 「请输入您公司的专属识别码以继续」 |
|
||||
| Tenant ID 输入框 | 单行数字输入,固定 12 位,支持粘贴;非数字字符自动过滤,超出 12 位截断 |
|
||||
| 输入框 Label | 「公司识别码(Tenant ID)」 |
|
||||
| 确认按钮 | 主色调按钮,文字「确认」 |
|
||||
| 错误提示 | 输入框下方红色文字,固定区域占位(不影响布局抖动) |
|
||||
| 帮助文案 | 「不知道识别码?请联系您公司的系统管理员」 |
|
||||
| 元素 | 规格 |
|
||||
| ------------- | --------------------------------------- |
|
||||
| 页面背景 | 品牌色渐变(与登录界面保持一致的视觉风格) |
|
||||
| Logo | Fonrey 产品 Logo,居中显示 |
|
||||
| 标题 | 「欢迎使用 Fonrey 房睿」 |
|
||||
| 副标题 | 「请输入您公司的专属识别码以继续」 |
|
||||
| Tenant Code 输入框 | 单行数字输入,固定 12 位,支持粘贴;非数字字符自动过滤,超出 12 位截断 |
|
||||
| 输入框 Label | 「公司识别码(Tenant Code)」 |
|
||||
| 确认按钮 | 主色调按钮,文字「确认」 |
|
||||
| 错误提示 | 输入框下方红色文字,固定区域占位(不影响布局抖动) |
|
||||
| 帮助文案 | 「不知道识别码?请联系您公司的Tenant Admin(租户管理员)」 |
|
||||
|
||||
#### 5.1.3 Tenant ID 格式规范
|
||||
#### 5.1.3 Tenant Code 格式规范
|
||||
|
||||
- **格式**:固定 **12 位纯数字**,如 `202500010001`
|
||||
- **生成规则**(建议):由平台运营在系统管理后台开通租户时自动生成,不允许手动指定,确保全局唯一性;可采用时间戳前缀 + 随机后缀的方式生成(如 `YYYYMM` + 6 位随机数)
|
||||
- **前端校验**:输入框仅接受数字字符(非数字自动过滤),输入满 12 位后自动触发格式完成状态;少于 12 位时点击「确认」弹出提示「识别码须为 12 位数字」
|
||||
- **唯一性**:全局唯一(公共 Schema 层面),同一 Tenant ID 不可分配给多个租户
|
||||
- **唯一性**:全局唯一(公共 Schema 层面),同一 Tenant Code 不可分配给多个租户
|
||||
- **客户端存储**:Electron `app.getPath('userData')` 目录下的配置文件(加密存储,防止明文读取)
|
||||
|
||||
#### 5.1.4 服务端 Tenant 验证接口规范
|
||||
@@ -267,7 +299,7 @@ POST /api/auth/tenant/verify/
|
||||
|
||||
Request Body:
|
||||
{
|
||||
"tenant_id": "202500010001"
|
||||
"tenant_code": "202500010001"
|
||||
}
|
||||
|
||||
Response 200 (成功):
|
||||
@@ -294,31 +326,48 @@ Response 200 (失败):
|
||||
|
||||
#### 5.2.1 界面布局
|
||||
|
||||
登录界面顶部以 **Tab 切换**区分两种登录方式(「密码登录」默认选中),Tab 下方的表单区随当前选中 Tab 动态切换,微信扫码作为独立的「其他登录」保持禁用。
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ [租户 Logo] [租户公司名称] │ ← 顶部品牌区(Tenant 识别后回填)
|
||||
│ │
|
||||
│ ┌──────────────┬──────────────────┐ │
|
||||
│ │ 密码登录 ✓ │ 验证码登录 │ │ ← 登录方式 Tab,默认选中「密码登录」
|
||||
│ └──────────────┴──────────────────┘ │
|
||||
│ │
|
||||
│ ── 密码登录 Tab(默认展示)─────────── │
|
||||
│ ┌───────────────────────┐ │
|
||||
│ │ 用户名 │ │
|
||||
│ │ 手机号 │ │
|
||||
│ └───────────────────────┘ │
|
||||
│ ┌───────────────────────┐ │
|
||||
│ │ 密码 👁 │ │
|
||||
│ └───────────────────────┘ │
|
||||
│ ┌─────────────────────────────────┐ │
|
||||
│ │ [背景图 + 拼图缺口] 🔄 │ │ ← 右上角刷新图标
|
||||
│ │ │ │
|
||||
│ │ [拼图碎片] │ │
|
||||
│ │ ├────────────────────────────── │ │
|
||||
│ │ ◀ 拖动滑块完成拼图 ▶ │ │
|
||||
│ │ [拼图碎片] ◀ 拖动滑块完成拼图 ▶│ │
|
||||
│ └─────────────────────────────────┘ │
|
||||
│ ┌───────────────────────┐ │
|
||||
│ │ 登 录 │ │ ← 主 CTA,橙色
|
||||
│ └───────────────────────┘ │
|
||||
│ 忘记密码 │ ← 文字链接(忘记用户名入口已废弃)
|
||||
│ │
|
||||
│ 忘记用户名 忘记密码 │ ← 次级入口,文字链接
|
||||
│ ── 验证码登录 Tab(切换后展示)──────── │
|
||||
│ ┌───────────────────────┐ │
|
||||
│ │ 手机号 │ │
|
||||
│ └───────────────────────┘ │
|
||||
│ ┌─────────────────────────────────┐ │
|
||||
│ │ [拼图验证] ← 先完成验证,再获取 │ │ ← 验证码登录下滑块前置
|
||||
│ └─────────────────────────────────┘ │
|
||||
│ ┌──────────────────┐ ┌─────────────┐ │
|
||||
│ │ 验证码(6 位) │ │ 获取验证码 │ │ ← 通过滑块后按钮可点击;60s 冷却
|
||||
│ └──────────────────┘ └─────────────┘ │
|
||||
│ ┌───────────────────────┐ │
|
||||
│ │ 登 录 │ │
|
||||
│ └───────────────────────┘ │
|
||||
│ 忘记密码 │
|
||||
│ │
|
||||
│ ─────────────── 其他登录 ──────────────│
|
||||
│ [手机验证码登录 - 即将开放] │ ← 禁用态,灰色
|
||||
│ [微信扫码登录 - 即将开放] │ ← 禁用态,灰色
|
||||
│ │
|
||||
│ 切换公司 │ ← 底部,小字链接
|
||||
@@ -335,7 +384,7 @@ Response 200 (失败):
|
||||
| 验证码有效期 | 单次验证会话有效,提交登录后服务端 Token 立即失效;超过 3 分钟未操作需重新加载 |
|
||||
| 验证失败处理 | 拼图区域抖动动画提示,自动刷新新背景图;**不计入账号密码错误次数**(行为验证失败属独立事件) |
|
||||
| 密码错误锁定 | 同一账号连续密码错误 ≥ 5 次,锁定 30 分钟;解锁方式:等待超时自动解锁 或 管理员手动解锁 |
|
||||
| 密码错误计数 | 计数存于 Redis,Key 格式:`login_fail:tenant_id:username`,TTL 30 分钟 |
|
||||
| 密码错误计数 | 计数存于 Redis,Key 格式:`login_fail:tenant_id:phone`(phone 即用户名/手机号),TTL 30 分钟 |
|
||||
| 验证码刷新 | 登录失败(用户名/密码错误)后自动刷新拼图;用户亦可主动点击「刷新」图标重新加载背景图 |
|
||||
| HTTPS | 所有登录相关请求强制 HTTPS,不允许 HTTP 降级 |
|
||||
| 密码传输 | 前端不做密码加密,HTTPS 层保证传输安全;后端存储使用 `django.contrib.auth` 默认的 `PBKDF2+SHA256` 哈希 |
|
||||
@@ -355,18 +404,19 @@ Response 200 (失败):
|
||||
|
||||
系统内共有两类账号创建场景,权限和规则各不相同:
|
||||
|
||||
**① Tenant Admin 账号(每个租户唯一的超级管理账号)**
|
||||
**② Tenant Admin 账号(每个租户的超级管理账号)**
|
||||
|
||||
| 项目 | 规格 |
|
||||
|------|------|
|
||||
| 创建时机 | 平台运营在系统管理后台开通租户时,同步创建第一个 Tenant Admin 账号 |
|
||||
| 用户名 | **由平台运营自定义设置**,格式:英文字母开头,仅含字母/数字/下划线,6~30 字符,同租户内唯一 |
|
||||
| 初始密码 | **由平台运营自定义设置**,须符合密码复杂度规则(8~32 位,含字母+数字) |
|
||||
| 首次登录 | 强制修改初始密码,不可跳过 |
|
||||
| 权限范围 | 拥有该租户内最高权限,可管理员工账号、角色、系统设置等 |
|
||||
| 数量限制 | 每个租户仅限 1 个 Tenant Admin 账号(后续可扩展为多管理员,v2 规划) |
|
||||
| 项目 | 规格 |
|
||||
| ---- | ------------------------------------------------------------ |
|
||||
| 创建时机 | 平台运营在系统管理后台开通租户时,系统**自动**以该租户联系人手机号创建 Tenant Admin 账号,无需手动设置 |
|
||||
| 用户名 | **固定为该租户联系人的手机号**(11 位数字),全局唯一,创建后不可更改 |
|
||||
| 初始密码 | **系统统一固定初始密码**(与普通员工相同,由平台在部署配置中设定,如 `Fonrey@2025`) |
|
||||
| 首次登录 | 强制修改初始密码,不可跳过 |
|
||||
| 权限范围 | 拥有该租户内最高权限,可管理员工账号、角色、系统设置等 |
|
||||
| 数量限制 | 每个租户仅限 1 个 Tenant Admin 账号(后续可扩展为多管理员,v2 规划) |
|
||||
| 数据来源 | 联系人手机号来自 `public.tenants.contact_phone` 字段,开通租户时由平台运营录入,必填 |
|
||||
|
||||
**② 普通员工账号(经纪人、店长、行政等)**
|
||||
**① 普通员工账号(经纪人、店长、行政等)**
|
||||
|
||||
| 项目 | 规格 |
|
||||
|------|------|
|
||||
@@ -381,10 +431,10 @@ Response 200 (失败):
|
||||
|
||||
| 字段 | 类型 | Tenant Admin | 普通员工账号 | 说明 |
|
||||
|------|------|-------------|-------------|------|
|
||||
| 用户名(username) | CharField(30) | 平台运营自定义,字母开头,含字母/数字/下划线,6~30 字符 | **固定为员工手机号**(11 位数字) | 登录 ID,创建后不可更改 |
|
||||
| 密码(password) | CharField | 平台运营自定义初始密码 | **系统统一固定初始密码** | PBKDF2+SHA256 哈希存储 |
|
||||
| 手机号(phone) | CharField(11) | 选填,加密存储 | **必填,同时作为用户名**,加密存储,同租户内唯一 | 当前阶段为登录 ID;v2 启用手机验证码登录后复用此字段 |
|
||||
| 邮箱(email) | EmailField | 选填,同租户唯一 | 选填,同租户唯一 | 用于找回密码;若为空则无法自助找回 |
|
||||
| 用户名(username) | CharField(30) | **固定为联系人手机号**(11 位数字) | **固定为员工手机号**(11 位数字) | 登录 ID,创建后不可更改;两类账号规则统一 |
|
||||
| 密码(password) | CharField | **系统统一固定初始密码** | **系统统一固定初始密码** | PBKDF2+SHA256 哈希存储;首次登录强制修改 |
|
||||
| 手机号(phone) | CharField(11) | **必填,同时作为用户名**,来源于 `public.tenants.contact_phone` | **必填,同时作为用户名**,加密存储,同租户内唯一 | 两类账号均用手机号登录,v2 启用手机验证码后复用此字段 |
|
||||
| 邮箱(email) | EmailField | 选填,同租户唯一 | 选填,同租户唯一 | 在本系统无必须业务用途,完全可选;普通员工忘记密码通过手机短信验证码自助找回,**与邮箱无关** |
|
||||
| 员工档案关联(staff_id) | OneToOneField → `org.Staff` | 可选关联(平台运营账号) | 必须关联 | 实名绑定 |
|
||||
| 账号状态(status) | CharField | `active` / `disabled` / `locked` | `active` / `disabled` / `locked` | locked 为密码错误锁定,30 分钟自动恢复 |
|
||||
| 初始密码标记(is_initial_password) | BooleanField | True(首次登录前) | True(首次登录前) | True 时登录成功后强制跳转修改密码页 |
|
||||
@@ -411,109 +461,84 @@ Response 200 (失败):
|
||||
|
||||
---
|
||||
|
||||
### 5.4 找回流程详细说明
|
||||
### 5.4 找回密码详细说明
|
||||
|
||||
#### 5.4.1 找回用户名流程
|
||||
> **说明**:Story 4「找回用户名」已废弃。普通员工用户名固定为手机号,无需找回;Tenant Admin 如忘记用户名请联系平台运营线下处理。
|
||||
|
||||
> **说明**:由于普通员工的用户名即为其**手机号**,通常无需「找回用户名」功能。登录界面的「忘记用户名」入口保留,但仅对 Tenant Admin 账号有意义(其用户名为自定义字符串)。
|
||||
|
||||
```
|
||||
用户点击「忘记用户名」
|
||||
│
|
||||
├─ 普通员工:提示「您的登录账号为您的手机号,请直接使用手机号登录」
|
||||
│ 提供「返回登录」按钮
|
||||
│
|
||||
└─ Tenant Admin(用户名非手机号格式):
|
||||
│
|
||||
├─ 输入绑定邮箱
|
||||
│ │
|
||||
│ 服务端查询(不向前端返回查询结果,防止枚举)
|
||||
│ │
|
||||
│ 统一响应「如该邮箱已绑定账号,您将收到邮件」
|
||||
│ │
|
||||
│ 后台:邮箱存在 → 发送邮件(包含用户名)
|
||||
│ 邮箱不存在 → 静默处理
|
||||
│
|
||||
└─ 用户查收邮件,获取用户名 → 返回登录
|
||||
```
|
||||
![[找回用户名流程.png]]
|
||||
> **前端识别逻辑**:用户在「忘记用户名」页面输入邮箱提交后,服务端根据是否匹配到 Tenant Admin 账号决定处理路径,前端无需区分,统一展示「如该邮箱已绑定账号,您将收到邮件」。
|
||||
|
||||
**邮件模板(找回用户名)**:
|
||||
|
||||
```
|
||||
主题:您的 Fonrey 房睿用户名
|
||||
|
||||
您好,
|
||||
|
||||
您请求找回在 [公司名称] 的 Fonrey 账号用户名。
|
||||
|
||||
您的用户名为:{username}
|
||||
|
||||
如果这不是您的操作,请忽略此邮件。如有疑问,请联系您的系统管理员。
|
||||
|
||||
此邮件由系统自动发送,请勿回复。
|
||||
发送时间:{datetime}
|
||||
```
|
||||
|
||||
#### 5.4.2 找回密码流程
|
||||
#### 5.4.1 找回密码流程
|
||||
|
||||
```
|
||||
用户点击「忘记密码」
|
||||
│
|
||||
步骤1:身份验证
|
||||
步骤1:输入手机号
|
||||
│
|
||||
├─ 输入手机号(即用户名)+ 绑定邮箱
|
||||
│ (Tenant Admin 则输入自定义用户名 + 绑定邮箱)
|
||||
├─ 输入 11 位手机号,点击「获取验证码」
|
||||
│ │
|
||||
│ 服务端校验用户名与邮箱是否匹配
|
||||
│ 服务端校验手机号是否存在且状态为 active
|
||||
│ │
|
||||
│ 统一响应「如信息匹配,重置链接将发送至您的邮箱」(防止枚举)
|
||||
│ 统一响应「如该手机号已注册,验证码将在 1 分钟内发送」(防止枚举)
|
||||
│ │
|
||||
│ 后台:匹配成功 → 生成加密 Token(有效期 30min)→ 异步发送邮件
|
||||
│ 不匹配 → 静默处理
|
||||
│ 后台:存在且 active → 生成 6 位 OTP,有效期 10 分钟,存入 sms_otp_records → 发送短信
|
||||
│ 不存在或已停用 → 静默处理
|
||||
│
|
||||
步骤2:用户点击邮件中的重置链接
|
||||
步骤2:输入短信验证码
|
||||
│
|
||||
├─ 服务端校验 Token 有效性
|
||||
├─ 输入 6 位验证码,点击「下一步」
|
||||
│ │
|
||||
│ 有效 → 展示「重置密码」表单
|
||||
│ 服务端校验 OTP:
|
||||
│ │
|
||||
│ 无效/过期 → 提示「链接已过期,请重新申请」,提供「重新申请」按钮
|
||||
│ 正确且未过期 → 颁发一次性 sms_reset_token(有效期 15 分钟)→ 进入步骤3
|
||||
│ │
|
||||
│ 错误(累计 < 5 次)→ 提示「验证码有误,请重新输入」
|
||||
│ 错误(累计 ≥ 5 次)→ 提示「验证已失败,请重新获取验证码」,本次 OTP 作废
|
||||
│ 已过期 → 提示「验证码已过期,请重新获取」
|
||||
│
|
||||
步骤3:用户输入并提交新密码
|
||||
步骤3:重置密码
|
||||
│
|
||||
├─ 密码复杂度校验(≥ 8 位,含字母+数字)
|
||||
├─ 与历史密码对比校验(最近 3 次,含固定初始密码)
|
||||
├─ 页面携带 sms_reset_token,服务端校验有效性
|
||||
│ │
|
||||
│ 无效/过期 → 提示「操作已超时,请重新发起找回密码」,跳回步骤1
|
||||
│ │
|
||||
├─ 用户输入新密码 + 确认新密码,实时逐条校验复杂度规则(✓/✗)
|
||||
│
|
||||
└─ 校验通过 → 更新密码,is_initial_password = False
|
||||
→ 清除该账号所有有效 Session(强制重新登录)
|
||||
→ 跳转登录界面,提示「密码已重置,请重新登录」
|
||||
```
|
||||
![[找回密码流程.png]]
|
||||
> **注意**:找回密码流程依赖员工账号绑定了邮箱。若员工未绑定邮箱,无法自助找回,需联系 Tenant Admin 在管理界面执行「重置密码」操作,将密码恢复为固定初始密码。
|
||||
|
||||
**邮件模板(重置密码)**:
|
||||
|
||||
```
|
||||
主题:重置您的 Fonrey 房睿密码
|
||||
|
||||
您好,
|
||||
|
||||
我们收到了重置您在 [公司名称] 的 Fonrey 账号密码的请求。
|
||||
|
||||
请点击以下链接重置密码(链接 30 分钟内有效):
|
||||
{reset_link}
|
||||
|
||||
如果您未发起此请求,请忽略此邮件,您的密码不会被更改。
|
||||
|
||||
此邮件由系统自动发送,请勿回复。
|
||||
发送时间:{datetime}
|
||||
└─ 提交成功
|
||||
→ 更新密码,is_initial_password = False
|
||||
→ 清除该账号所有有效 Session(强制重新登录)
|
||||
→ 跳转登录界面,提示「密码已重置,请使用新密码登录」
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.5 后端数据模型设计
|
||||
### 5.5 手机验证码登录详细说明
|
||||
|
||||
> 本节为 Story 5 的实现规范补充。短信基础设施(`sms_otp_records` 表、OTP 发送/校验逻辑)在 Story 3 找回密码中已建设完成,本节描述在**登录场景**下复用该基础设施时的关键差异点。
|
||||
|
||||
**与找回密码短信逻辑的差异对比**:
|
||||
|
||||
| 维度 | 找回密码(Story 3) | 验证码登录(Story 5) |
|
||||
|------|-------------------|---------------------|
|
||||
| `scene` 字段 | `password_reset` | `login` |
|
||||
| OTP 有效期 | 10 分钟 | 5 分钟 |
|
||||
| 每小时发送上限 | 5 次 | 10 次 |
|
||||
| 验证成功后动作 | 颁发 `sms_reset_token` → 步骤三重置密码 | 直接颁发 Session Token,登录成功 |
|
||||
| 短信文案 | 「密码重置验证码」 | 「登录验证码」 |
|
||||
| 账号锁定影响 | 不受密码错误锁定限制(非密码登录路径) | **受账号锁定限制**(账号维度安全策略,不区分方式)|
|
||||
|
||||
**滑块验证前置规则**(验证码登录特有):
|
||||
|
||||
- 用户须先完成滑块拼图验证,「获取验证码」按钮方可点击
|
||||
- 滑块验证通过后,拼图区域保持「验证通过」状态,不需要在点击「登录」前再次验证
|
||||
- 切换 Tab 时,滑块验证状态重置(须重新完成验证后方可获取验证码)
|
||||
|
||||
**`sms_otp_records` 表复用说明**:
|
||||
|
||||
- 不新建表,复用 `DATA_MODEL_LOGIN.md` 中定义的 `sms_otp_records`
|
||||
- `scene` 字段区分场景:`login` / `password_reset`,各自独立限流计数
|
||||
- 同一手机号同一 scene 同一时间只有一条有效 OTP;新发送时将旧记录标记为 `used`
|
||||
|
||||
---
|
||||
|
||||
### 5.6 后端数据模型设计
|
||||
|
||||
> **数据模型已迁移至独立文档**,请参阅:
|
||||
> **`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md`**
|
||||
@@ -521,7 +546,7 @@ Response 200 (失败):
|
||||
该文档包含:
|
||||
- `user_accounts` 账号主表(完整字段定义、约束、索引、Django Model 代码)
|
||||
- `login_attempts` 登录审计表
|
||||
- `password_reset_tokens` 密码重置令牌表
|
||||
- `sms_otp_records` 短信验证码记录表(找回密码 + 验证码登录共用)
|
||||
- `password_histories` 历史密码记录表
|
||||
- Redis 缓存结构说明
|
||||
- 账号状态机与创建流程
|
||||
@@ -531,13 +556,13 @@ Response 200 (失败):
|
||||
|
||||
---
|
||||
|
||||
### 5.6 Electron 客户端登录相关约定
|
||||
### 5.7 Electron 客户端登录相关约定
|
||||
|
||||
| 约定项 | 规格 |
|
||||
|--------|------|
|
||||
| Tenant ID 存储 | `electron-store` 或 `app.getPath('userData')` + AES 加密,不存储明文 |
|
||||
| Tenant Code 存储 | `electron-store` 或 `app.getPath('userData')` + AES 加密,不存储明文 |
|
||||
| Session Token 存储 | 内存(`global` 变量)+ `session` Cookie(Chromium 管理),不写入磁盘明文文件 |
|
||||
| 登录页加载 | 客户端主进程根据 Tenant ID 构建目标 URL(`https://{tenant_slug}.fonrey.com/auth/login/`),通过 `BrowserWindow.loadURL()` 加载 |
|
||||
| 登录页加载 | 客户端主进程根据 Tenant Code 构建目标 URL(`https://{tenant_slug}.fonrey.com/auth/login/`),通过 `BrowserWindow.loadURL()` 加载 |
|
||||
| 多标签页处理 | 同一 `BrowserWindow` 内,所有页面共享同一 Session Cookie |
|
||||
| 客户端登出 | 调用服务端 `POST /api/auth/logout/` 使服务端 Session 失效 + 清除 Chromium Session Cookie |
|
||||
| 窗口关闭时 | Session 保留(不自动登出),下次打开客户端时若 Session 未过期,直接进入系统 |
|
||||
@@ -553,8 +578,9 @@ Response 200 (失败):
|
||||
|--------|------|------|
|
||||
| `django.contrib.auth` | 用户认证基础框架 | 扩展 `AbstractBaseUser` 而非直接使用 `User` 模型,以支持 `username` 唯一性约束在租户维度而非全局 |
|
||||
| `django-tenants` | 多租户隔离 | `UserAccount` 属于租户级 Schema,Tenant 验证接口属于 `shared_apps` |
|
||||
| `Redis` | 滑块验证 Token 存储、登录失败计数、密码重置 Token 缓存 | 验证 Key:`captcha_token:{uuid}`(TTL 3min);登录失败 Key:`login_fail:{tenant_id}:{username}` |
|
||||
| `Celery` | 发送找回邮件 | 邮件发送异步处理,防止接口响应超时 |
|
||||
| `Redis` | 滑块验证 Token 存储、登录失败计数、短信 OTP 限流计数 | 验证 Key:`captcha_token:{uuid}`(TTL 3min);登录失败 Key:`login_fail:{tenant_id}:{username}`;OTP 限流 Key:`sms_limit:{scene}:{phone}`(TTL 1h)|
|
||||
| 短信服务(待选型) | 发送登录验证码 / 找回密码验证码 | 国内需选用具备短信资质的服务商(如阿里云短信、腾讯云短信);需申请短信签名和模板审核 |
|
||||
| `Celery` | 异步任务处理 | 短信发送异步处理,防止接口响应超时;原邮件发送需求已废弃,短信为主要通知方式 |
|
||||
| `django-ratelimit` 或自定义中间件 | 接口限流 | Tenant 验证接口、登录接口、找回密码接口均需限流 |
|
||||
| `Pillow` | 滑块拼图图片处理 | 生成拼图背景图(抠出缺口区域)及对应的拼图碎片图片,输出为 Base64,分别通过两个字段返回给前端 |
|
||||
|
||||
@@ -569,17 +595,17 @@ Response 200 (失败):
|
||||
| 风险 | 可能性 | 影响 | 缓解措施 |
|
||||
|------|--------|------|---------|
|
||||
| 滑块验证被机器模拟轨迹绕过 | 低 | 高 | 服务端同时校验位置偏差 + 轨迹曲线特征(非线性运动特征),拒绝匀速/程序化轨迹;后续可引入设备指纹加固 |
|
||||
| Tenant ID 枚举攻击(暴力试探) | 低 | 中 | Tenant 验证接口限流(每IP每分钟≤10次),返回结果不区分「未找到」与「已禁用」|
|
||||
| 密码重置 Token 泄露 | 低 | 高 | Token 单次有效、30分钟过期、HTTPS 传输 |
|
||||
| 邮件发送失败导致用户无法找回密码 | 中 | 中 | 邮件发送失败写入告警日志,管理员可通过后台查看 Token 手动告知用户 |
|
||||
| Tenant Code 枚举攻击(暴力试探) | 低 | 中 | Tenant 验证接口限流(每IP每分钟≤10次),返回结果不区分「未找到」与「已禁用」|
|
||||
| 密码重置 Token 泄露 | 低 | 高 | `sms_reset_token` 单次有效、15 分钟过期、HTTPS 传输 |
|
||||
| 短信服务故障导致用户无法找回密码或验证码登录 | 中 | 高 | 短信发送失败写入告警日志;密码登录作为保底方式(非单一入口);建议配置备用短信服务商通道 |
|
||||
| 多端同时登录同一账号 | 高(日常场景) | 低 | 本期允许,后续如需踢出,可在 Token 机制中引入版本号 |
|
||||
|
||||
### 6.4 开放问题(开发前需确认)
|
||||
|
||||
- [ ] **邮件服务商选型**:使用 SendGrid / 阿里云邮件推送 / SMTP 自建?需运维确认 — 负责人:后端负责人 — 截止:开发启动前
|
||||
- [ ] **短信服务商选型**:使用阿里云短信 / 腾讯云短信 / 其他服务商?需运维确认并提前申请短信签名和模板审核(国内审核周期 1–3 个工作日)— 负责人:后端负责人 — 截止:开发启动前
|
||||
- [ ] **Session 有效期默认值**:8 小时是否满足各租户需求?是否允许租户管理员自行配置?— 负责人:产品经理 — 截止:开发启动前
|
||||
- [ ] **滑块拼图实现方案**:自研(Pillow 生成图片 + 前端拖拽组件)还是集成第三方行为验证服务(如极验 GeeTest / 网易易盾)?自研可控但需维护图库;第三方开箱即用但引入外部依赖,需评估数据合规要求 — 负责人:后端负责人 + 安全 — 截止:开发启动前
|
||||
- [ ] **账号锁定通知**:账号被锁定后,是否自动发邮件通知用户和/或管理员?— 负责人:产品经理 — 截止:开发启动前
|
||||
- [ ] **账号锁定通知**:账号被锁定后,是否自动发短信通知用户和/或通知管理员(站内消息)?— 负责人:产品经理 — 截止:开发启动前
|
||||
- [ ] **历史密码校验范围**:最近 3 次是否足够?是否需要额外规则(如不能与用户名相同)?— 负责人:产品经理 — 截止:开发启动前
|
||||
|
||||
---
|
||||
@@ -602,7 +628,7 @@ Response 200 (失败):
|
||||
|
||||
```
|
||||
[未识别 Tenant]
|
||||
│ 输入有效 Tenant ID
|
||||
│ 输入有效 Tenant Code
|
||||
↓
|
||||
[未登录]
|
||||
│ 账密登录成功
|
||||
@@ -625,24 +651,20 @@ Response 200 (失败):
|
||||
|
||||
| 接口 | 方法 | Schema 位置 | 是否需要鉴权 | 说明 |
|
||||
|------|------|------------|------------|------|
|
||||
| `/api/auth/tenant/verify/` | POST | Public(shared) | 否 | Tenant ID 验证 |
|
||||
| `/api/auth/tenant/verify/` | POST | Public(shared) | 否 | Tenant Code 验证 |
|
||||
| `/api/auth/captcha/` | GET | Tenant | 否 | 获取滑块拼图验证码(返回背景图 Base64 + 碎片图 Base64 + 验证 Token) |
|
||||
| `/api/auth/captcha/verify/` | POST | Tenant | 否 | 提交滑动轨迹 + 位置,服务端校验并返回一次性通过凭证(供登录接口使用) |
|
||||
| `/api/auth/login/` | POST | Tenant | 否 | 账号密码登录 |
|
||||
| `/api/auth/login/` | POST | Tenant | 否 | 手机号 + 密码登录 |
|
||||
| `/api/auth/login/phone/` | POST | Tenant | 否 | 手机号 + 短信验证码登录(MVP 正式功能) |
|
||||
| `/api/auth/logout/` | POST | Tenant | 是 | 登出,使 Session 失效 |
|
||||
| `/api/auth/recover/username/` | POST | Tenant | 否 | 发起找回用户名 |
|
||||
| `/api/auth/recover/password/request/` | POST | Tenant | 否 | 发起找回密码(发送邮件) |
|
||||
| `/api/auth/recover/password/request/` | POST | Tenant | 否 | 发起找回密码(发送短信验证码) |
|
||||
| `/api/auth/recover/password/verify/` | POST | Tenant | 否 | 校验短信验证码,颁发一次性 `sms_reset_token` |
|
||||
| `/api/auth/recover/password/reset/` | POST | Tenant | 否(Token 鉴权) | 提交新密码 |
|
||||
| `/api/auth/login/phone/` | POST | Tenant | 否 | **预留**,手机验证码登录 |
|
||||
| `/api/auth/wechat/qrcode/` | GET | Tenant | 否 | **预留**,获取微信二维码 |
|
||||
| `/api/auth/wechat/callback/` | POST | Tenant | 否 | **预留**,微信扫码回调 |
|
||||
| `/api/auth/wechat/qrcode/` | GET | Tenant | 否 | **预留 v2**,获取微信二维码 |
|
||||
| `/api/auth/wechat/callback/` | POST | Tenant | 否 | **预留 v2**,微信扫码回调 |
|
||||
|
||||
### 8.3 相关文档参考
|
||||
|
||||
- 客户端发布管理模块 PRD:`Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md`
|
||||
- 组织人事管理模块 PRD:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md`
|
||||
- 权限管理模块 PRD:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md`
|
||||
- 系统管理模块 PRD:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md`
|
||||
- 技术栈文档:`Project/fonrey/TECH_STACK/TECH_STACK.md`
|
||||
- **登录管理数据模型**:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md`
|
||||
- **登录管理技术方案**:`Project/fonrey/TECH_STACK/登录管理技术方案.md`
|
||||
|
||||
@@ -33,7 +33,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
|
||||
| 角色 | 使用场景 | 频率 |
|
||||
| --------------------------- | ----------- | ------ |
|
||||
| 超级管理员(Platform Super Admin) | 全局配置、高危操作授权 | 低频(每周) |
|
||||
| Platform Admin(平台超级管理员)(Platform Super Admin) | 全局配置、高危操作授权 | 低频(每周) |
|
||||
| 运维人员(Ops Operator) | 日常租户管理、监控巡检 | 高频(每日) |
|
||||
| 只读审计员(Read-only Auditor) | 日志查询、合规报告导出 | 中频(每周) |
|
||||
|
||||
@@ -97,13 +97,13 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
|
||||
---
|
||||
|
||||
### Persona B:超级管理员 David(系统升级与回滚)
|
||||
### Persona B:Platform Admin(平台超级管理员) David(系统升级与回滚)
|
||||
|
||||
> 负责平台技术运维,周期性执行版本升级,关注升级稳定性与租户影响面,有权执行所有高危操作。
|
||||
|
||||
**Story 4**:灰度系统升级
|
||||
|
||||
> 作为超级管理员,我希望先对内测租户升级新版本,验证稳定后再全量推送,避免一次性影响所有客户。
|
||||
> 作为Platform Admin(平台超级管理员),我希望先对内测租户升级新版本,验证稳定后再全量推送,避免一次性影响所有客户。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 升级前自动执行健康检查,存在异常服务时阻断升级并提示
|
||||
@@ -113,7 +113,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
|
||||
**Story 5**:升级失败回滚
|
||||
|
||||
> 作为超级管理员,我希望在升级出现问题时能立即回滚至上一稳定版本,并生成事件报告。
|
||||
> 作为Platform Admin(平台超级管理员),我希望在升级出现问题时能立即回滚至上一稳定版本,并生成事件报告。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 回滚操作触发前自动保存当前状态快照
|
||||
@@ -177,7 +177,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
| 模式 | 说明 |
|
||||
|------|------|
|
||||
| 软删除(Soft Delete) | 标记删除状态,数据保留 30 天(默认,可配置)后由 Celery 定时任务清除 |
|
||||
| 硬删除(Hard Delete) | 立即清除所有数据、Schema、存储资源及子域名授权;仅超级管理员可操作 |
|
||||
| 硬删除(Hard Delete) | 立即清除所有数据、Schema、存储资源及子域名授权;仅Platform Admin(平台超级管理员)可操作 |
|
||||
|
||||
删除前置条件:
|
||||
1. 操作人必须确认数据导出已完成(勾选确认框)
|
||||
@@ -264,7 +264,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
**Tenant Admin 管理**
|
||||
|
||||
- 每个租户可设置 1 至多名 Tenant Admin(超级用户)
|
||||
- 平台管理员可直接在后台创建新用户并赋予 Tenant Admin 角色,或从租户现有用户中指定
|
||||
- Platform Admin(平台超级管理员)可直接在后台创建新用户并赋予 Tenant Admin 角色,或从租户现有用户中指定
|
||||
- 支持查看当前 Tenant Admin 列表,执行:新增 / 替换 / 撤销权限
|
||||
|
||||
**Tenant Admin 权限配置(RBAC)**
|
||||
@@ -282,7 +282,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
|
||||
**密码重置**
|
||||
|
||||
- 平台管理员可为任意租户的任意用户发起密码重置
|
||||
- Platform Admin(平台超级管理员)可为任意租户的任意用户发起密码重置
|
||||
- 方式一:发送重置链接至注册邮箱(用户自助重置)
|
||||
- 方式二:管理员直接设置临时密码(用户首次登录后强制修改)
|
||||
- 所有重置操作记录于操作审计日志
|
||||
@@ -331,7 +331,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
|
||||
**灰度升级策略**:
|
||||
|
||||
- 维护"内测租户组"列表,由超级管理员配置
|
||||
- 维护"内测租户组"列表,由Platform Admin(平台超级管理员)配置
|
||||
- 灰度阶段仅对内测租户执行升级,其余租户保持原版本
|
||||
- 内测租户验证通过(手动确认)后,触发全量升级
|
||||
|
||||
@@ -423,7 +423,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
**管理员设置**
|
||||
|
||||
- 管理员账号管理(创建、编辑、停用)
|
||||
- 角色配置(超级管理员 / 运营人员 / 只读审计员)
|
||||
- 角色配置(Platform Admin(平台超级管理员) / 运营人员 / 只读审计员)
|
||||
- MFA 设置(强制启用,支持 TOTP)
|
||||
- IP 白名单配置
|
||||
- 登录会话管理(查看活跃会话、强制登出)
|
||||
@@ -438,7 +438,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
| IP 白名单 | 仅允许指定 IP 范围访问管理控制台 URL(Nginx 层或应用层限制) |
|
||||
| 高危操作二次验证 | 删除租户、数据恢复、系统回滚操作触发 MFA 二次确认弹窗 |
|
||||
| 会话超时 | 无操作 30 分钟后自动登出,Token 失效 |
|
||||
| 强制登出 | 超级管理员可在"管理员设置"中强制终止指定管理员的所有会话 |
|
||||
| 强制登出 | Platform Admin(平台超级管理员)可在"管理员设置"中强制终止指定管理员的所有会话 |
|
||||
|
||||
**与租户应用隔离**:
|
||||
|
||||
@@ -546,7 +546,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten
|
||||
|
||||
### 9.2 管理员角色权限矩阵
|
||||
|
||||
| 操作 | 超级管理员 | 运营人员 | 只读审计员 |
|
||||
| 操作 | Platform Admin(平台超级管理员) | 运营人员 | 只读审计员 |
|
||||
|------|-----------|---------|-----------|
|
||||
| 创建租户 | ✅ | ✅ | ❌ |
|
||||
| 挂起 / 恢复租户 | ✅ | ✅ | ❌ |
|
||||
|
||||
@@ -277,7 +277,7 @@
|
||||
|
||||
| 相关方 | 相关方说明 | 状态 | 启动权限 | 操作 |
|
||||
| ------ | ------------------------------ | --- | ------------------------ | -------------- |
|
||||
| 平台摄影师 | 开启平台实勘功能后,在房源预约拍摄完成后统一处理为系统管理员 | 停用 | | 权限配置 |
|
||||
| 平台摄影师 | 开启平台实勘功能后,在房源预约拍摄完成后统一处理为Tenant Admin(租户管理员) | 停用 | | 权限配置 |
|
||||
| 维护人 | 出租或出售房源的维护人 | 停用 | | 权限配置 |
|
||||
| 售维护人 | 出售房源的维护人(租、售维护人分开时自动启用) | 停用 | | 权限配置 |
|
||||
| 租维护人 | 出租房源的维护人(租、售维护人分开时自动启用) | 停用 | | 权限配置 |
|
||||
|
||||
@@ -50,12 +50,12 @@
|
||||
|
||||
## 4. 目标用户
|
||||
|
||||
**主要角色**:系统管理员(租户侧,每租户 1~3 人)
|
||||
**主要角色**:Tenant Admin(租户管理员)(租户侧,每租户 1~3 人)
|
||||
|
||||
> 典型画像:门店运营负责人或行政主管,熟悉业务流程,无技术背景,通过系统后台进行日常运营配置。使用频率:初始开通时高频(完成初始化配置),此后低频(按需调整)。
|
||||
|
||||
**间接受益角色**:
|
||||
- 一线经纪人 — 看到的下拉选项和必填规则由管理员配置决定
|
||||
- Agent(经纪人) — 看到的下拉选项和必填规则由管理员配置决定
|
||||
- 店长/经理 — 配置直接影响客源来源分析报表的数据质量
|
||||
|
||||
---
|
||||
@@ -66,7 +66,7 @@
|
||||
|
||||
### US-SETTING-001-A:管理员配置可选枚举值(Lookup Items)
|
||||
|
||||
> **As** 系统管理员,
|
||||
> **As** Tenant Admin(租户管理员),
|
||||
> **I want** 在「系统设置 → 参数配置」页面维护各业务模块的下拉选项(如客源来源、跟进目的),
|
||||
> **So that** 经纪人录入时看到的选项符合公司实际业务,不再依赖研发修改代码。
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
|
||||
### US-SETTING-001-B:管理员配置房源字段必填规则
|
||||
|
||||
> **As** 系统管理员,
|
||||
> **As** Tenant Admin(租户管理员),
|
||||
> **I want** 按「房源用途 × 交易状态」的组合,控制哪些字段在录入时为必填/选填/隐藏,
|
||||
> **So that** 系统能在录入时强制采集公司要求的关键信息,提升房源数据完整度。
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
|
||||
### US-SETTING-001-C:管理员配置客源录入规则
|
||||
|
||||
> **As** 系统管理员,
|
||||
> **As** Tenant Admin(租户管理员),
|
||||
> **I want** 配置新增私客时的查重范围,以及必填字段控制,
|
||||
> **So that** 减少客源重复录入风险,并确保客源数据质量满足公司管理要求。
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
|
||||
**核心设计决策**:
|
||||
|
||||
1. **Lookup Items 与 enum_labels 分离**:固定系统枚举(装修/朝向/状态/等级)存放在 Public Schema 的 `enum_labels` 表,由平台管理员通过 migration 维护,租户无权修改。可配置枚举(来源/跟进目的)存放在 Tenant Schema 的 `lookup_items` 表,由租户管理员自主维护。详见数据模型说明文档。
|
||||
1. **Lookup Items 与 enum_labels 分离**:固定系统枚举(装修/朝向/状态/等级)存放在 Public Schema 的 `enum_labels` 表,由Platform Admin(平台超级管理员)通过 migration 维护,租户无权修改。可配置枚举(来源/跟进目的)存放在 Tenant Schema 的 `lookup_items` 表,由租户管理员自主维护。详见数据模型说明文档。
|
||||
|
||||
2. **字段规则不新增字段**:`field_requirement_rules` 只控制「必填/选填/隐藏」状态,字段本身的存在性由数据模型决定。避免配置层与数据模型层职责混淆。
|
||||
|
||||
|
||||
@@ -25,9 +25,9 @@
|
||||
|
||||
| 角色 | 描述 | 使用频率 |
|
||||
|------|------|----------|
|
||||
| 系统管理员 / HR 行政 | 负责新增/编辑部门、办理员工入职/离职/调岗,维护账号状态与证件信息 | 每日 |
|
||||
| Tenant Admin(租户管理员) / Tenant Admin(租户管理员) | 负责新增/编辑部门、办理员工入职/离职/调岗,维护账号状态与证件信息 | 每日 |
|
||||
| 店长 / 区域经理 | 查看本部门组织架构、员工列表,发起入职邀请 | 每日 |
|
||||
| 一线经纪人 | 查看同事联系方式(通讯录),查看自己的档案信息 | 按需 |
|
||||
| Agent(经纪人) | 查看同事联系方式(通讯录),查看自己的档案信息 | 按需 |
|
||||
| 公司管理层 | 通过架构图了解全公司组织结构,监控人员异动动态 | 按需 |
|
||||
|
||||
---
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
### Story 1:管理员查看组织人员列表
|
||||
|
||||
**As** 系统管理员/店长,**I want** 在组织结构页面查看公司所有部门及其员工信息,**So that** 能快速掌握当前人员分布并进行管理操作。
|
||||
**As** Tenant Admin(租户管理员)/店长,**I want** 在组织结构页面查看公司所有部门及其员工信息,**So that** 能快速掌握当前人员分布并进行管理操作。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 页面入口路径:顶部导航「人事」→「组织人事」→「组织结构」,面包屑显示「人事OA / 组织人事 / 组织结构」
|
||||
@@ -72,7 +72,7 @@
|
||||
- [ ] 点击部门节点后,右侧展示该部门及其下级部门员工列表(可通过「显示下属部门员工」下拉切换)
|
||||
- [ ] 右上角显示全局系统提示(账号数量上限、实名认证不匹配人数等),提示可点击「立即筛选数据」跳转至对应筛选结果
|
||||
- [ ] 页面右上角有「员工入黑名单」快捷操作入口
|
||||
- [ ] 员工列表支持多条件筛选:姓名/工号/电话(文本搜索)、职务(下拉选择)、职务类别(全选/单选)、员工状态(下拉,含已选 N 个计数)、审批状态(下拉)、冻结状态(全选)、登录账号(全选)、系统管理员(请选择)、入职时间(日期范围)、离职时间(日期范围)、显示下属部门员工(显示/隐藏)、部门级别(全选)、证件状态(不限)、证件号搜索
|
||||
- [ ] 员工列表支持多条件筛选:姓名/工号/电话(文本搜索)、职务(下拉选择)、职务类别(全选/单选)、员工状态(下拉,含已选 N 个计数)、审批状态(下拉)、冻结状态(全选)、登录账号(全选)、Tenant Admin(租户管理员)(请选择)、入职时间(日期范围)、离职时间(日期范围)、显示下属部门员工(显示/隐藏)、部门级别(全选)、证件状态(不限)、证件号搜索
|
||||
- [ ] 点击「查询」按钮执行筛选,点击「清空条件」重置所有筛选项
|
||||
- [ ] 员工列表支持批量操作:勾选复选框后,可执行「批量调动员工」「批量设置员工上级」,通过「更多」下拉展开更多批量操作
|
||||
- [ ] 列表操作区包含:「新增员工」(主按钮,带下拉箭头)、「导出员工」、「批量调动员工」、「批量设置员工上级」、「更多」、「员工异动记录」(链接)
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
### Story 2:管理员新增部门
|
||||
|
||||
**As** 系统管理员,**I want** 新增一个业务部门并配置其基本信息,**So that** 新部门能纳入组织架构并支持员工归属。
|
||||
**As** Tenant Admin(租户管理员),**I want** 新增一个业务部门并配置其基本信息,**So that** 新部门能纳入组织架构并支持员工归属。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击左侧「+ 新增部门」按钮,跳转至「部门新增」页面,面包屑显示「人事OA / 组织人事 / 组织结构 / 部门新增」
|
||||
@@ -113,7 +113,7 @@
|
||||
|
||||
### Story 3:管理员编辑部门信息
|
||||
|
||||
**As** 系统管理员,**I want** 编辑已有部门的基本信息,**So that** 组织信息保持最新准确状态。
|
||||
**As** Tenant Admin(租户管理员),**I want** 编辑已有部门的基本信息,**So that** 组织信息保持最新准确状态。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 通过部门详情页右上角「编辑」按钮进入「部门编辑」页面,面包屑显示「人事OA / 组织人事 / 组织结构 / 部门编辑」
|
||||
@@ -163,7 +163,7 @@
|
||||
|
||||
### Story 6:查看员工详情 - 员工基本信息
|
||||
|
||||
**As** HR 管理员,**I want** 查看某员工的完整档案信息,**So that** 能全面了解员工的任职、个人、来源等情况。
|
||||
**As** Tenant Admin(租户管理员),**I want** 查看某员工的完整档案信息,**So that** 能全面了解员工的任职、个人、来源等情况。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击员工列表的「查看」操作进入员工详情页,页面标题显示「[部门名称] [员工姓名]」,面包屑显示「人事OA / 组织人事 / 组织结构 / 员工详情」
|
||||
@@ -218,7 +218,7 @@
|
||||
|
||||
### Story 7:查看员工详情 - 异动记录
|
||||
|
||||
**As** HR 管理员,**I want** 在员工详情页查看该员工的所有人事异动历史,**So that** 能追溯员工入职、调岗、上级变动等完整轨迹。
|
||||
**As** Tenant Admin(租户管理员),**I want** 在员工详情页查看该员工的所有人事异动历史,**So that** 能追溯员工入职、调岗、上级变动等完整轨迹。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 在员工详情页左侧导航点击「异动记录」切换至异动记录 Tab
|
||||
@@ -233,7 +233,7 @@
|
||||
|
||||
### Story 8:查看员工详情 - 账号信息
|
||||
|
||||
**As** HR 管理员/系统管理员,**I want** 在员工详情页查看和管理该员工的系统账号及第三方平台账号,**So that** 能统一管理员工的登录凭证和外部账号绑定状态。
|
||||
**As** Tenant Admin(租户管理员)/Tenant Admin(租户管理员),**I want** 在员工详情页查看和管理该员工的系统账号及第三方平台账号,**So that** 能统一管理员工的登录凭证和外部账号绑定状态。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 在员工详情页左侧导航点击「账号信息」切换至账号信息 Tab
|
||||
@@ -280,7 +280,7 @@
|
||||
|
||||
### Story 10:查看组织员工异动记录(全局视图)
|
||||
|
||||
**As** HR 管理员,**I want** 在组织结构模块查看全公司所有员工的异动记录汇总,**So that** 能统一审计和追踪所有人事变动。
|
||||
**As** Tenant Admin(租户管理员),**I want** 在组织结构模块查看全公司所有员工的异动记录汇总,**So that** 能统一审计和追踪所有人事变动。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 异动记录入口:组织结构员工列表页右上角「员工异动记录」链接,跳转至异动记录汇总页,面包屑显示「人事OA / 组织人事 / 组织结构 / 异动记录」
|
||||
@@ -299,7 +299,7 @@
|
||||
|
||||
### Story 11:员工离职操作
|
||||
|
||||
**As** HR 管理员/店长,**I want** 在组织结构员工列表中对在职员工发起离职操作,**So that** 员工状态及时变更为「离职」,并触发业务数据的归属处理流程。
|
||||
**As** Tenant Admin(租户管理员)/店长,**I want** 在组织结构员工列表中对在职员工发起离职操作,**So that** 员工状态及时变更为「离职」,并触发业务数据的归属处理流程。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 离职操作入口:员工列表行右侧「异动」下拉菜单中点击「离职」,弹出「员工离职」对话框(Modal 形式,背景遮罩,不跳转页面)
|
||||
@@ -328,7 +328,7 @@
|
||||
|
||||
### Story 12:员工调动操作
|
||||
|
||||
**As** HR 管理员,**I want** 通过右侧抽屉面板对员工发起调动操作并修改其部门、上级、职务等信息,**So that** 员工的组织归属变更即时生效并留下完整的调动记录。
|
||||
**As** Tenant Admin(租户管理员),**I want** 通过右侧抽屉面板对员工发起调动操作并修改其部门、上级、职务等信息,**So that** 员工的组织归属变更即时生效并留下完整的调动记录。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 调动操作入口:员工列表行右侧「异动」下拉菜单中点击「调动」,从页面右侧滑出「员工调动」抽屉面板(不跳转页面,背景列表可见但交互禁用)
|
||||
@@ -367,7 +367,7 @@
|
||||
|
||||
### Story 13:查看员工奖惩记录
|
||||
|
||||
**As** HR 管理员/店长,**I want** 在员工详情页查看该员工的所有奖惩记录,**So that** 能了解员工的奖励与处罚历史,作为绩效管理和晋升的参考依据。
|
||||
**As** Tenant Admin(租户管理员)/店长,**I want** 在员工详情页查看该员工的所有奖惩记录,**So that** 能了解员工的奖励与处罚历史,作为绩效管理和晋升的参考依据。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 在员工详情页左侧导航点击「奖惩记录」切换至奖惩记录 Tab,当前选中项高亮(橙色文字 + 左侧橙色指示条)
|
||||
@@ -381,7 +381,7 @@
|
||||
|
||||
### Story 14:新增员工奖惩记录
|
||||
|
||||
**As** HR 管理员,**I want** 在员工奖惩记录页面新增一条奖惩记录,**So that** 员工的奖励或处罚情况被系统留档,可追溯查询。
|
||||
**As** Tenant Admin(租户管理员),**I want** 在员工奖惩记录页面新增一条奖惩记录,**So that** 员工的奖励或处罚情况被系统留档,可追溯查询。
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 点击奖惩记录页面右上角「新增」按钮,弹出「新增奖惩记录」对话框(Modal 形式,标题「新增奖惩记录」,右上角有「×」关闭按钮)
|
||||
|
||||
Reference in New Issue
Block a user