diff --git a/.opencode/opencode.json b/.opencode/opencode.json new file mode 100644 index 00000000..b4a064b4 --- /dev/null +++ b/.opencode/opencode.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://opencode.ai/config.json", + "plugin": [ + "oh-my-openagent" + ] +} diff --git a/Project/fonrey/DATA_MODEL/DATA_MODEL.md b/Project/fonrey/DATA_MODEL/DATA_MODEL.md index 9c23a564..86895def 100644 --- a/Project/fonrey/DATA_MODEL/DATA_MODEL.md +++ b/Project/fonrey/DATA_MODEL/DATA_MODEL.md @@ -499,20 +499,20 @@ CREATE INDEX idx_enum_labels_domain ON enum_labels(domain, sort_order); | domain | 说明 | 对应表字段 | |--------|------|-----------| -| `client.status` | 客源状态(7 态) | `clients.status` | +| `client.status` | 客源状态(8 态) | `clients.status` | | `client.grade` | 客源等级(5 档 + E) | `clients.grade` | -| `client.purpose_type` | 需求类型 | `client_requirements.purpose_type` | -| `client.usage` | 房源用途偏好 | `client_requirements.usage` | +| `client.requirement_type` | 需求类型(旧:`client.purpose_type`) | `client_requirements.requirement_type` | +| `client.property_usage` | 房源用途偏好(旧:`client.usage`) | `client_requirements.property_usage` | | `client.orientation` | 朝向偏好 | `client_requirements.orientation` | | `client.payment_method` | 付款方式 | `clients.payment_method` | | `property.status` | 房源状态 | `properties.status` | | `property.attribute` | 房源属性(公/私/保护) | `properties.attribute` | -| `property.usage` | 房源用途 | `properties.usage` | +| `property.property_type` | 房源类型(旧:`property.usage`) | `properties.property_type` | | `property.grade` | 房源等级(5 档) | `properties.grade` | -| `property.listing_type` | 挂牌类型 | `properties.listing_type` | +| `property.listing_history.listing_type` | 挂牌类型(旧:`property.listing_type`) | `listing_histories.listing_type` | | `property.decoration` | 装修程度 | `properties.decoration` | | `property.orientation` | 朝向 | `properties.orientation` | -| `commission.type` | 委托类型 | `commissions.commission_type` | +| `property.commission.status` | 委托状态(旧:`commission.type`) | `commissions.status` | | `field_survey.status` | 实勘状态 | `field_surveys.status` | | `follow_log.log_type` | 跟进日志类型 | `follow_logs.log_type` | diff --git a/Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md b/Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md index 2e98a40e..a7fe5c94 100644 --- a/Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md +++ b/Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md @@ -70,7 +70,7 @@ Staff (员工) | client_no | VARCHAR(30) | UNIQUE, NOT NULL | 系统生成的客源编号,格式由运营配置(如 KY20260424001) | | client_type | VARCHAR(20) | NOT NULL DEFAULT 'private' | `private`=私客 / `public`=公客 / `transacted`=成交客 | | status | VARCHAR(20) | NOT NULL DEFAULT 'buying' | 见下方枚举 | -| grade | VARCHAR(5) | NOT NULL DEFAULT 'C' | `A_urgent`=A急迫 / `A` / `B`=较强 / `C`=一般 / `D`=较弱 / `E`=暂不关注 | +| grade | VARCHAR(5) | NOT NULL DEFAULT 'C' | `A`=A急迫 / `B`=较强 / `C`=一般 / `D`=较弱 / `E`=暂不关注 | | property_usage | VARCHAR(30) | NOT NULL DEFAULT 'residential' | `residential`=住宅 / `villa`=别墅 / `commercial_residential`=商住 / `shop`=商铺 / `office`=写字楼 / `other`=其他 | | buying_purpose | VARCHAR(20)[] | | 购房目的多选:`rigid`=刚需 / `investment`=投资 / `school_district`=学区 / `upgrade`=改善 / `commercial`=商用 / `other`=其他 | | payment_method | VARCHAR(30) | | `full`=全额 / `mortgage`=商业贷款 / `mortgage_fund`=商贷+公积金 / `fund`=公积金 | diff --git a/Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md b/Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md index 9f8512f6..cef486a9 100644 --- a/Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md +++ b/Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md @@ -155,11 +155,10 @@ | 值 | 说明 | |----|------| -| `A_urgent` | A(急迫) | -| `A` | A | +| `A` | A(急迫) | | `B` | B(较强) | | `C` | C(一般) | -| `D` | D | +| `D` | D(较弱) | ### follow_log.log_type(跟进日志类型) @@ -263,7 +262,7 @@ CREATE TABLE properties ( -- ── 等级与标签 ── grade VARCHAR(10) - CHECK (grade IN ('A_urgent','A','B','C','D')), + CHECK (grade IN ('A','B','C','D')), -- ── 交易属性 ── ownership_years VARCHAR(30), -- 房本年限:不满2年/满2年/满5年 等 diff --git a/Project/fonrey/DATA_MODEL/ENUMS.md b/Project/fonrey/DATA_MODEL/ENUMS.md index 52ab65c5..f70e1797 100644 --- a/Project/fonrey/DATA_MODEL/ENUMS.md +++ b/Project/fonrey/DATA_MODEL/ENUMS.md @@ -3,10 +3,14 @@ # Fonrey — 统一枚举字典(ENUMS) > **定位**:本文件是 Fonrey 全局枚举标准(Public + Tenant)的统一实现基线。 -> **版本**:v2.1 -> **日期**:2026-04-27 +> **版本**:v2.2 +> **日期**:2026-04-28 > **适用范围**:`DATA_MODEL_PUBLIC.md`、`DATA_MODEL_LOGIN.md`、`DATA_MODEL_ORG.md`、`DATA_MODEL_COMPLEX.md`、`DATA_MODEL_PROPERTY.md`、`DATA_MODEL_CLIENT.md`、`DATA_MODEL_PERMISSION.md`、`DATA_MODEL_SETTING.md` +> **⚠️ 枚举值命名规范**:所有枚举值统一使用 **`lower_snake_case`**(全小写+下划线)。 +> 历史遗留大写值(`SUCCESS`/`FAILED`、`BOOLEAN`/`SCOPE`/`INTEGER`、`REPLACE`/`RESTRICT`/`GRANT`、`A_urgent`/`A_app`/`B_schema`/`C_feature`)在 v2.2 中已统一迁移为小写。 +> **DB `CHECK` 约束、`enum_labels` 种子数据、前端代码须同步更新为新值**;迁移脚本须包含历史数据 UPDATE。 + --- ## 一、枚举分层标准(必须遵守) @@ -58,8 +62,8 @@ Fonrey 采用两层枚举体系: ### 2.3 平台审计与备份导出 **domain**: `public.platform_audit.result` -- `SUCCESS`:成功 -- `FAILED`:失败 +- `success`:成功 +- `failed`:失败 **domain**: `public.backup_schedule.frequency` - `hourly`:每小时 @@ -92,7 +96,7 @@ Fonrey 采用两层枚举体系: **domain**: `public.export_task.status` - `pending`:待执行 - `in_progress`:执行中 -- `done`:已完成 +- `success`:成功(语义等价原 `done`,与 `backup_record.status` 对齐) - `failed`:失败 ### 2.4 升级与发布(Public) @@ -102,9 +106,9 @@ Fonrey 采用两层枚举体系: - `rollback`:回滚 **domain**: `public.upgrade_event.upgrade_type` -- `A_app`:A类应用升级 -- `B_schema`:B类数据库结构升级 -- `C_feature`:C类功能开关升级 +- `app`:A类-应用升级(原 `A_app`) +- `schema`:B类-数据库结构升级(原 `B_schema`) +- `feature`:C类-功能开关升级(原 `C_feature`) **domain**: `public.upgrade_event.strategy` - `full`:全量发布 @@ -241,9 +245,9 @@ Fonrey 采用两层枚举体系: - `recharge`:在线充值 **domain**: `permission.value_type` -- `BOOLEAN`:开关型 -- `SCOPE`:范围型 -- `INTEGER`:数值型 +- `boolean`:开关型(原 `BOOLEAN`) +- `scope`:范围型(原 `SCOPE`) +- `integer`:数值型(原 `INTEGER`) **domain**: `permission.role_category` - `agent`:置业顾问 @@ -262,9 +266,9 @@ Fonrey 采用两层枚举体系: - `company`:全公司 **domain**: `permission.override_mode` -- `REPLACE`:覆盖 -- `RESTRICT`:限制 -- `GRANT`:授予 +- `replace`:覆盖(原 `REPLACE`) +- `restrict`:限制(原 `RESTRICT`) +- `grant`:授予(原 `GRANT`) **domain**: `permission.data_scope_type` - `self`:本人 @@ -394,11 +398,10 @@ Fonrey 采用两层枚举体系: - `inconvenient`:不便看房 **domain**: `property.grade` -- `A_urgent`:A(急迫) -- `A`:A -- `B`:B(较强) -- `C`:C(一般) -- `D`:D(较弱) +- `a`:A(急迫) +- `b`:B(较强) +- `c`:C(一般) +- `d`:D(较弱) **domain**: `property.contact.gender` - `male`:先生 @@ -519,6 +522,21 @@ Fonrey 采用两层枚举体系: - `public`:公客 - `invalid`:无效 +> **⚠️ 合法组合约束**(`client_type` × `client.status`) +> `client_type` 表示客源的"身份类别",`status` 表示客源的"当前业务状态",两者是不同维度。 +> 合法组合矩阵如下: +> +> | `client_type` | 允许的 `status` 值 | 禁止的 `status` 值 | +> |---|---|---| +> | `private`(私客) | `buying` / `renting` / `buy_or_rent` / `suspended` / `invalid` | `public`、`bought`、`rented_done`(未成交不可用终态) | +> | `public`(公客) | `public` / `buying` / `renting` / `buy_or_rent` / `suspended` / `invalid` | `bought`、`rented_done` | +> | `transacted`(成交客) | `bought` / `rented_done` | 其他所有值(终态不可逆) | +> +> **实施要求**: +> - 服务层(`ClientService`)在状态变更时必须校验组合合法性 +> - DB 侧可用触发器或 `CHECK` 约束覆盖最关键禁止项(如 `transacted` + 非终态) +> - `private → public` 转换须调用专用方法 `transfer_to_public()`,同时修改 `client_type` 和 `status` + **domain**: `client.grade` - `A`:A(急迫) - `B`:B(较强) @@ -697,7 +715,7 @@ Fonrey 采用两层枚举体系: - `sale`:出售 - `rent`:出租 - `sale_rent`:租售 -- `*`:全部 +- `all`:全部(原设计为 `*`,因 SQL/URL/权限表达式通配误解风险已统一改为 `all`;DB CHECK 约束、前端筛选器须同步) **domain**: `setting.field_rule.requirement` - `required`:必填 diff --git a/Project/fonrey/PRD/PRD_MVP.md b/Project/fonrey/PRD/PRD_MVP.md index 80c0af23..a8bde2e5 100644 --- a/Project/fonrey/PRD/PRD_MVP.md +++ b/Project/fonrey/PRD/PRD_MVP.md @@ -133,10 +133,10 @@ | 房源设置(字段必填/自定义字段/标签) | **P0** | 影响录入表单 | | 相关方设置 | **P1** | | | 客源设置(基本配置/参数配置) | **P1** | | -| 人事OA设置 | **P2** | | -| 交易设置 | **P2** | | -| 财务设置 | **P2** | | -| 合同设置 | **P2** | | +| 人事OA设置 | **P2** | 依赖人事OA模块完整规划,本期不实现 | +| 交易设置 | **P2** | 依赖交易模块完整规划,本期不实现 | +| 财务设置 | **Out of Scope** | 消费方「财务管理模块」为 Out of Scope,配置面板无意义,随模块一并排除 | +| 合同设置 | **Out of Scope** | 消费方「合同管理模块」为 Out of Scope,配置面板无意义,随模块一并排除 | #### 🖥️ 系统管理(运营后台) diff --git a/Project/fonrey/PRD/TASK.md b/Project/fonrey/PRD/TASK.md index a5b22467..feea5b4e 100644 --- a/Project/fonrey/PRD/TASK.md +++ b/Project/fonrey/PRD/TASK.md @@ -108,8 +108,8 @@ | [US-ORG-022](#US-ORG-022-管理员查看门店分布地图) | 组织人事 | 管理员查看门店分布地图 | [ ] | | [US-SETTING-020](#US-SETTING-020-管理员配置人事OA相关参数) | 系统配置 | 管理员配置人事OA相关参数 | [ ] | | [US-SETTING-021](#US-SETTING-021-管理员配置交易规则) | 系统配置 | 管理员配置交易规则 | [ ] | -| [US-SETTING-022](#US-SETTING-022-管理员配置财务规则) | 系统配置 | 管理员配置财务规则 | [ ] | -| [US-SETTING-023](#US-SETTING-023-管理员配置合同模板) | 系统配置 | 管理员配置合同模板 | [ ] | +| ~~US-SETTING-022~~ | ~~系统配置~~ | ~~管理员配置财务规则~~ — **已移出,财务模块 Out of Scope** | ~~[ ]~~ | +| ~~US-SETTING-023~~ | ~~系统配置~~ | ~~管理员配置合同模板~~ — **已移出,合同模块 Out of Scope** | ~~[ ]~~ | | [US-SYSTEM-020](#US-SYSTEM-020-平台管理员查看操作审计日志) | 系统管理 | 平台管理员查看操作审计日志 | [ ] | | [US-SYSTEM-021](#US-SYSTEM-021-平台管理员管理灰度发布滚动升级) | 系统管理 | 平台管理员管理灰度发布/滚动升级 | [ ] | @@ -806,17 +806,13 @@ - 状态:[ ] - 验收标准:(规划中,详细验收标准待PRD细化后补充) -##### US-SETTING-022 管理员配置财务规则 +##### ~~US-SETTING-022 管理员配置财务规则~~ -- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 财务设置 -- 状态:[ ] -- 验收标准:(规划中,详细验收标准待PRD细化后补充) +> ⛔ **已移出路线图**:消费方「财务管理/提成结算模块」在 MVP 及近期版本中明确为 Out of Scope(见 PRD_MVP.md §3),对应的系统配置面板无实际消费方,随模块一并排除。若后续财务模块立项,本 US 随之恢复。 -##### US-SETTING-023 管理员配置合同模板 +##### ~~US-SETTING-023 管理员配置合同模板~~ -- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 合同设置 -- 状态:[ ] -- 验收标准:(规划中,详细验收标准待PRD细化后补充) +> ⛔ **已移出路线图**:消费方「合同管理模块」在 MVP 及近期版本中明确为 Out of Scope(见 PRD_MVP.md §3),对应的系统配置面板无实际消费方,随模块一并排除。若后续合同模块立项,本 US 随之恢复。 --- diff --git a/Project/fonrey/PRD/TASK_AGENT_READY.md b/Project/fonrey/PRD/TASK_AGENT_READY.md new file mode 100644 index 00000000..ed440de7 --- /dev/null +++ b/Project/fonrey/PRD/TASK_AGENT_READY.md @@ -0,0 +1,5899 @@ +# TASK Agent Ready Prompts(OpenCode 执行版) + +> 生成时间:2026-04-28 16:01:37 +> 来源文件:`PRD/TASK.md` +> 目标:把每条 US 转成可直接交给 OpenCode 的执行提示词。 + +## 1) 总体结论 + +- 任务总数:**83** +- 完备度分级:A=24,B+=38,B=5,C=16 +- 其中 C 级(不建议直接编码):**16**(主要为 P2 验收标准占位) + +### 分阶段统计 + +| Phase | 任务数 | A | B+ | B | C | 验收占位数 | +|---|---:|---:|---:|---:|---:|---:| +| P0 | 42 | 20 | 21 | 1 | 0 | 0 | +| P1 | 28 | 4 | 17 | 4 | 3 | 0 | +| P2 | 13 | 0 | 0 | 0 | 13 | 13 | + +## 2) 模块 → TECH_STACK 技术方案映射 + +| 模块 | 技术方案输入文档 | +|---|---| +| 用户登录 | `Project/fonrey/TECH_STACK/登录管理技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 楼盘管理 | `Project/fonrey/TECH_STACK/楼盘管理技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 房源管理 | `Project/fonrey/TECH_STACK/房源管理技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 客源管理 | `Project/fonrey/TECH_STACK/客源管理技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 组织人事 | `Project/fonrey/TECH_STACK/组织人事技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 权限管理 | `Project/fonrey/TECH_STACK/权限管理系统技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 系统配置 | `Project/fonrey/TECH_STACK/系统设置技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 系统管理(运营后台) | `Project/fonrey/TECH_STACK/系统管理技术文档.md`;`Project/fonrey/TECH_STACK/API_CONTRACT.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 客户端发布 | `Project/fonrey/TECH_STACK/API_CONTRACT.md`;`Project/fonrey/TECH_STACK/系统管理技术文档.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | + +## 3) OpenCode 全局执行约束(每条任务都必须带上) + +1. 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +2. 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +3. Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +4. HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +5. 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +6. 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +7. PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +8. 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +9. 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +10. 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +11. `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于**强约束输入**:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +12. 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +## 4) 通用执行模板(复制后替换 US 内容) + +```text +你是 OpenCode 编程代理。请在当前仓库根目录实现以下任务。 + +【任务ID】 +【任务标题】 +【阶段】 +【模块】<模块名> + +【输入文档】 +- PRD: <路径> +- DATA_MODEL: <路径或 N/A> +- UI: <路径或 N/A> +- TECH_STACK: <路径列表> + +【必须遵循约束】 +- 多租户 URL 分离、Admin 弃用、HTMX 片段返回、TenantClient、PII 加密、testing settings 等(见 TASK_AGENT_READY.md §3) + +【实现要求】 +1) 先输出你将修改/新增的文件清单(精确路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 `UI_DESIGN/` 对应 `.html`/`.md` 静态页面,列出“必须保持一致”的页面结构与交互点,再开始编码。 +4) 再按最小可交付实现功能,不做额外功能扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补充/更新对应测试。 +6) 执行测试命令并给出结果。 +7) 输出风险与后续建议。 + +【验收标准】 +<粘贴该 US 的验收标准> + +【必须执行测试命令】 +- pytest -q +- 如涉及 HTMX 局部接口:补充 HTTP_HX_REQUEST=true 场景测试 + +【交付格式】 +- 变更文件列表 +- API 契约核对清单(逐条对应 API_CONTRACT:已对齐/偏差项) +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 关键实现说明 +- 测试结果 +- 未完成项/阻塞项 +``` + +## 5) 任务索引与完备性 + +| US | Phase | 模块 | 完备度 | 缺口 | +|---|---|---|---|---| +| US-ACCOUNT-001 | P0 | 用户登录 | A | 无 | +| US-ACCOUNT-002 | P0 | 用户登录 | B+ | 缺 UI | +| US-ACCOUNT-003 | P0 | 用户登录 | B+ | 缺 UI | +| US-COMPLEX-001 | P0 | 楼盘管理 | B | 引用文件缺失 | +| US-COMPLEX-002 | P0 | 楼盘管理 | A | 无 | +| US-COMPLEX-003 | P0 | 楼盘管理 | B+ | 缺 UI | +| US-PROPERTY-001 | P0 | 房源管理 | A | 无 | +| US-PROPERTY-002 | P0 | 房源管理 | A | 无 | +| US-PROPERTY-003 | P0 | 房源管理 | A | 无 | +| US-PROPERTY-004 | P0 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-005 | P0 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-006 | P0 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-007 | P0 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-008 | P0 | 房源管理 | B+ | 缺 UI | +| US-CLIENT-001 | P0 | 客源管理 | A | 无 | +| US-CLIENT-002 | P0 | 客源管理 | A | 无 | +| US-CLIENT-003 | P0 | 客源管理 | A | 无 | +| US-CLIENT-004 | P0 | 客源管理 | A | 无 | +| US-CLIENT-005 | P0 | 客源管理 | A | 无 | +| US-CLIENT-006 | P0 | 客源管理 | A | 无 | +| US-CLIENT-007 | P0 | 客源管理 | A | 无 | +| US-CLIENT-008 | P0 | 客源管理 | A | 无 | +| US-CLIENT-009 | P0 | 客源管理 | A | 无 | +| US-CLIENT-010 | P0 | 客源管理 | A | 无 | +| US-CLIENT-011 | P0 | 客源管理 | A | 无 | +| US-CLIENT-012 | P0 | 客源管理 | A | 无 | +| US-CLIENT-013 | P0 | 客源管理 | A | 无 | +| US-CLIENT-014 | P0 | 客源管理 | A | 无 | +| US-CLIENT-015 | P0 | 客源管理 | A | 无 | +| US-CLIENT-016 | P0 | 客源管理 | B+ | 缺 UI | +| US-CLIENT-017 | P0 | 客源管理 | B+ | 缺 UI | +| US-ORG-001 | P0 | 组织人事 | B+ | 缺 UI | +| US-ORG-002 | P0 | 组织人事 | B+ | 缺 UI | +| US-ORG-003 | P0 | 组织人事 | B+ | 缺 UI | +| US-PERMISSION-001 | P0 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-002 | P0 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-003 | P0 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-004 | P0 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-005 | P0 | 权限管理 | B+ | 缺 UI | +| US-SETTING-001-A | P0 | 系统配置 | B+ | 缺 UI | +| US-SETTING-001-B | P0 | 系统配置 | B+ | 缺 UI | +| US-SETTING-001-C | P0 | 系统配置 | B+ | 缺 UI | +| US-ACCOUNT-010 | P1 | 用户登录 | B+ | 缺 UI | +| US-ACCOUNT-011 | P1 | 用户登录 | B+ | 缺 UI | +| US-ACCOUNT-012 | P1 | 用户登录 | B+ | 缺 UI | +| US-COMPLEX-010 | P1 | 楼盘管理 | B+ | 缺 UI | +| US-COMPLEX-011 | P1 | 楼盘管理 | B+ | 缺 UI | +| US-COMPLEX-012 | P1 | 楼盘管理 | B+ | 缺 UI | +| US-PROPERTY-010 | P1 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-011 | P1 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-012 | P1 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-013 | P1 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-014 | P1 | 房源管理 | B+ | 缺 UI | +| US-CLIENT-020 | P1 | 客源管理 | A | 无 | +| US-CLIENT-021 | P1 | 客源管理 | A | 无 | +| US-CLIENT-022 | P1 | 客源管理 | A | 无 | +| US-CLIENT-023 | P1 | 客源管理 | A | 无 | +| US-CLIENT-024 | P1 | 客源管理 | B+ | 缺 UI | +| US-ORG-010 | P1 | 组织人事 | B+ | 缺 UI | +| US-ORG-011 | P1 | 组织人事 | B+ | 缺 UI | +| US-ORG-012 | P1 | 组织人事 | B+ | 缺 UI | +| US-PERMISSION-010 | P1 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-011 | P1 | 权限管理 | B+ | 缺 UI | +| US-SETTING-010 | P1 | 系统配置 | C | 缺 UI;引用文件缺失 | +| US-SETTING-011 | P1 | 系统配置 | C | 缺 UI;引用文件缺失 | +| US-SETTING-012 | P1 | 系统配置 | C | 缺 UI;引用文件缺失 | +| US-SYSTEM-010 | P1 | 系统管理(运营后台) | B | 缺 DATA_MODEL;缺 UI | +| US-SYSTEM-011 | P1 | 系统管理(运营后台) | B | 缺 DATA_MODEL;缺 UI | +| US-RELEASE-010 | P1 | 客户端发布 | B | 缺 DATA_MODEL;缺 UI | +| US-RELEASE-011 | P1 | 客户端发布 | B | 缺 DATA_MODEL;缺 UI | +| US-PROPERTY-020 | P2 | 房源管理 | C | 缺 DATA_MODEL;缺 UI;验收占位 | +| US-PROPERTY-021 | P2 | 房源管理 | C | 缺 DATA_MODEL;缺 UI;验收占位 | +| US-COMPLEX-020 | P2 | 楼盘管理 | C | 缺 DATA_MODEL;缺 UI;验收占位 | +| US-CLIENT-030 | P2 | 客源管理 | C | 缺 UI;验收占位 | +| US-CLIENT-031 | P2 | 客源管理 | C | 缺 UI;验收占位 | +| US-CLIENT-032 | P2 | 客源管理 | C | 缺 UI;验收占位 | +| US-ORG-020 | P2 | 组织人事 | C | 缺 UI;验收占位 | +| US-ORG-021 | P2 | 组织人事 | C | 缺 UI;验收占位 | +| US-ORG-022 | P2 | 组织人事 | C | 缺 UI;验收占位 | +| US-SETTING-020 | P2 | 系统配置 | C | 缺 DATA_MODEL;缺 UI;验收占位;引用文件缺失 | +| US-SETTING-021 | P2 | 系统配置 | C | 缺 DATA_MODEL;缺 UI;验收占位;引用文件缺失 | +| US-SYSTEM-020 | P2 | 系统管理(运营后台) | C | 缺 DATA_MODEL;缺 UI;验收占位 | +| US-SYSTEM-021 | P2 | 系统管理(运营后台) | C | 缺 DATA_MODEL;缺 UI;验收占位 | + +## 6) 每条任务的 OpenCode 可执行提示词 + +### US-ACCOUNT-001 经纪人管理员使用账号密码登录系统 + +- 阶段:**P0** +- 模块:**用户登录** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 账号密码登录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/登录管理/登录_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-001 +【任务标题】经纪人管理员使用账号密码登录系统 +【阶段】P0 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 账号密码登录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/登录管理/登录_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +输入正确账号密码后跳转首页;密码错误时展示"账号或密码错误"提示;连续错误5次后账号锁定提示;登录成功后 Token 写入 Cookie + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ACCOUNT-002 系统识别多租户子域名域名路由 + +- 阶段:**P0** +- 模块:**用户登录** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 多租户识别 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-002 +【任务标题】系统识别多租户子域名域名路由 +【阶段】P0 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 多租户识别 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +访问不同子域名时系统自动切换对应租户 Schema;非法/不存在子域名返回404页面;跨租户请求被拦截并返回403 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ACCOUNT-003 系统管理 Token 与会话超时 + +- 阶段:**P0** +- 模块:**用户登录** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - Token 管理/会话超时 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-003 +【任务标题】系统管理 Token 与会话超时 +【阶段】P0 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - Token 管理/会话超时 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +会话超时后自动跳转登录页;Token 刷新机制正常工作;登出后 Token 立即失效,再次请求跳转登录页 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-001 管理员录入与维护楼盘基础信息 + +- 阶段:**P0** +- 模块:**楼盘管理** +- 完备度:**B** +- 引用缺失:`UI_DESIGN/楼盘管理/楼盘详情_UI.md` + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘信息管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/楼盘管理/楼盘详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-001 +【任务标题】管理员录入与维护楼盘基础信息 +【阶段】P0 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘信息管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/楼盘管理/楼盘详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【输入缺口】 +- 缺少文件:UI_DESIGN/楼盘管理/楼盘详情_UI.md +- 若缺口阻塞实现,请先输出“阻塞清单 + 最小替代方案”,再继续实现可落地部分。 + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可录入楼盘名称、地址、楼栋、结构等基础字段;保存成功后楼盘出现在楼盘列表;必填字段未填时高亮错误提示;楼盘编号系统自动生成且唯一 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-002 经纪人查看楼盘列表与详情 + +- 阶段:**P0** +- 模块:**楼盘管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘列表/楼盘详情 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/楼盘管理/楼盘列表_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-002 +【任务标题】经纪人查看楼盘列表与详情 +【阶段】P0 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘列表/楼盘详情 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/楼盘管理/楼盘列表_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +楼盘列表支持按名称/地址关键词搜索;支持分页(默认20条/页);点击楼盘名称跳转详情页;详情页展示楼盘基本信息、楼栋结构信息 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-003 管理员维护区域管理城区商圈 + +- 阶段:**P0** +- 模块:**楼盘管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 区域管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-003 +【任务标题】管理员维护区域管理城区商圈 +【阶段】P0 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 区域管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可新增/编辑/删除城区和商圈;商圈必须归属于城区;区域数据被房源和客源模块正确关联引用;删除有关联数据的区域时系统给出警告 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-001 经纪人录入二手住宅出售出租 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 录入住宅(二手出售/出租) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/新增房源_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-001 +【任务标题】经纪人录入二手住宅出售出租 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 录入住宅(二手出售/出租) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/新增房源_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可在3分钟内完成住宅基本信息录入;必填字段(楼盘/楼层/面积/价格)未填时高亮错误提示;保存成功后跳转房源详情页并显示"保存成功";录入后即刻出现在房源列表 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-002 经纪人查看与筛选房源列表 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源列表(二手&租赁) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/房源列表_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-002 +【任务标题】经纪人查看与筛选房源列表 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源列表(二手&租赁) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/房源列表_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +列表支持按楼盘名/业主姓名/电话/房源编号关键词搜索;支持状态/区域/价格/房型多维度组合筛选;列表分页(默认20条/页)且89000条数据下查询响应<2秒;支持导出当前筛选结果为Excel + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-003 经纪人查看房源详情页 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源详情页 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/房源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-003 +【任务标题】经纪人查看房源详情页 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源详情页 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/房源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +详情页完整展示基本信息、产证信息、交易信息;号码默认打码,点击"查看号码"后解密展示并记录审计日志;页面各功能 Tab 可正常切换 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-004 经纪人写入与查看房源跟进记录 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 跟进记录(全部/写入/修改/其他) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-004 +【任务标题】经纪人写入与查看房源跟进记录 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 跟进记录(全部/写入/修改/其他) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +跟进记录按时间线倒序展示;支持写入跟进/修改跟进/其他跟进(钥匙/委托/实勘)子Tab切换;跟进内容最少6字校验;写入成功后记录实时出现在列表顶部 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-005 经纪人管理房源图片上传分类排序 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 图片管理(相册上传/分类/排序) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-005 +【任务标题】经纪人管理房源图片上传分类排序 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 图片管理(相册上传/分类/排序) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持上传 bmp/jpg/png/gif 格式图片,单文件最大20MB;上传成功后自动按分类展示;支持拖拽排序;封面图可手动指定 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-006 经纪人管理业主联系人 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 业主联系人管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-006 +【任务标题】经纪人管理业主联系人 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 业主联系人管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持新增/编辑业主联系人(姓名/电话/微信);手机号加密存储,展示时默认打码;可查看同业主名下其他房源;至少保留一个联系人 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-007 经纪人调整房源价格 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 价格调整(调价/调价记录) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-007 +【任务标题】经纪人调整房源价格 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 价格调整(调价/调价记录) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +调价弹窗需填写新价格和调价原因;调价成功后房源列表和详情页价格实时更新;调价记录以时间线形式留存且不可删除;调价幅度在列表中以"降价XX万"标签展示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-008 经纪人变更房源状态 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源状态变更(在售/暂缓/成交/下架) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-008 +【任务标题】经纪人变更房源状态 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源状态变更(在售/暂缓/成交/下架) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +状态变更严格遵循状态机流转规则(在售→暂缓/成交/下架);每次状态变更需填写原因;状态变更后列表状态标签实时更新;状态变更记录写入跟进日志 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-001 经纪人录入新私客 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 1:经纪人录入新私客;5.2 录入私客 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/新增客源_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-001 +【任务标题】经纪人录入新私客 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 1:经纪人录入新私客;5.2 录入私客 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/新增客源_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +录入页面可通过顶部导航「客源」→「+新增私客」或右侧快捷入口「增客」触达;联系人1必填(姓名/性别/电话1),联系人2起可增加删除;基础信息必填字段(状态/用途/等级/来源)缺填时高亮错误并定位到第一个错误处;保存成功后跳转该客源详情页并显示"保存成功"提示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-002 经纪人查看与筛选私客列表全部求购求租 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2/3/4:经纪人查看与筛选私客列表;5.1 客源列表 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源列表_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-002 +【任务标题】经纪人查看与筛选私客列表全部求购求租 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2/3/4:经纪人查看与筛选私客列表;5.1 客源列表 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源列表_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +顶部Tab导航(私客/资料客/营销客/成交客/公客)及二级Tab(求购/求租/暂缓/全部私客)可正常切换;搜索框支持按客源姓名/号码/号码后4位/客源编号/备注检索;筛选栏支持状态/等级/位置/价格/房室等多维度组合筛选;列表底部实时显示当前筛选总条数,分页默认20条/页,89000条数据量下查询<2秒 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-003 经纪人批量操作私客列表 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2:列表批量操作;5.1.3 批量操作 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源列表_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-003 +【任务标题】经纪人批量操作私客列表 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2:列表批量操作;5.1.3 批量操作 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源列表_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +勾选客源后激活批量操作按钮(修改相关方/修改来源/删除客源/合并客户);批量删除执行软删除,可在"已删客源"中查看;批量修改相关方成功后列表归属人字段实时刷新;列表支持导出当前筛选结果为Excel(Celery异步处理) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-004 经纪人查看私客详情页 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 6:经纪人查看私客详情页;Story 15:经纪人查看客源信息概览面板 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-004 +【任务标题】经纪人查看私客详情页 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 6:经纪人查看私客详情页;Story 15:经纪人查看客源信息概览面板 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +详情页顶部展示需求标题+联系人姓名+带看进度标签;右侧固定信息概览面板展示客户编号/委托日期/需求类型等字段且不随页面滚动消失;主内容区Tab导航(需求信息/跟进记录/带看/客源解读/智能配房)默认激活"需求信息"Tab;右侧面板三个主操作按钮(打电话/写跟进/报备带看)可正常触发对应流程 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-005 经纪人查看与编辑需求信息 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 7:经纪人查看与编辑需求信息 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-005 +【任务标题】经纪人查看与编辑需求信息 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 7:经纪人查看与编辑需求信息 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +需求信息Tab展示总价/面积/居室/装修/朝向/楼层/楼龄/意向商圈/意向小区等字段(三栏布局);字段值为空时显示"-"占位符;右上角「编辑」链接点击后字段转为输入框/选择器;保存成功后返回详情页并刷新需求信息区块 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-006 经纪人写入与查看跟进记录 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 8:经纪人写入与查看跟进记录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-006 +【任务标题】经纪人写入与查看跟进记录 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 8:经纪人写入与查看跟进记录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +跟进记录分5个子Tab(全部/写入跟进/敏感信息跟进/修改跟进/其他跟进);全部Tab支持时间范围筛选及「有录音」「有图片」快速过滤;跟进记录以时间线形式按日期分组倒序展示;写入跟进时跟进目的支持23项多选,跟进内容最少6字校验;系统自动生成的操作日志(如新增私客/状态变更)出现在"其他跟进"Tab + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-007 经纪人管理带看记录预约带看新增带看 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 9:经纪人管理带看记录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-007 +【任务标题】经纪人管理带看记录预约带看新增带看 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 9:经纪人管理带看记录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +带看Tab分"预约"和"带看"两个子Tab;新增带看表单必填字段(带看时间/带看情况≥6字/带看房源≥1套)校验通过才可提交;带看记录以时间线展示,含带看房源蓝色可点击链接和带看进度标签;员工选择器弹层支持组织树搜索和多选;带看房源选择器支持按编号/楼盘/业主关键词搜索 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-008 经纪人管理客源联系人查看新增编辑 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 23:经纪人管理客源联系人 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-008 +【任务标题】经纪人管理客源联系人查看新增编辑 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 23:经纪人管理客源联系人 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +联系人面板默认打码显示电话("+86 135\*\*\*\*\*\*\*\*"),点击「查看号码」后展示完整号码并写入敏感信息跟进日志;新增联系人必填字段(姓名/称呼/电话1)校验;编辑联系人时电话1需点击「查看号码」后才可编辑;保存成功后联系人面板实时刷新 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-009 经纪人修改客源等级 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 17:经纪人修改客源等级 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-009 +【任务标题】经纪人修改客源等级 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 17:经纪人修改客源等级 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「改等级」触发弹窗,展示当前等级(只读)和新等级下拉选择器(A急迫/B较强/C一般/D较弱/E暂不关注);新等级未选择时「确定」按钮置灰;保存成功后信息概览面板等级标签实时更新;操作日志中自动新增"改等级"记录 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-010 经纪人修改客源状态 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 18:经纪人修改客源状态 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-010 +【任务标题】经纪人修改客源状态 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 18:经纪人修改客源状态 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「改状态」触发弹窗,展示当前状态(只读)、新状态下拉(求购/求租/租购)、等级下拉和必填更改理由文本框;新状态未选或理由未填时「确定」按钮置灰;保存成功后信息概览面板状态标签实时更新;操作日志新增"改状态"记录(含更改理由) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-011 经纪人手动将私客转为公客 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 19:经纪人手动将私客转为公客 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-011 +【任务标题】经纪人手动将私客转为公客 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 19:经纪人手动将私客转为公客 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「转公客」触发弹窗,状态和等级均为必填;确认后客源从私客列表移除并进入公客池(client_type='public',transfer_to_public_type='manual');操作日志新增"转公客"记录(含操作人/操作时间);权限控制:仅归属人、首录人或有管理权限的店长/经理可操作 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-012 经纪人将私客转为成交客 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 20:经纪人将私客转为成交客 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-012 +【任务标题】经纪人将私客转为成交客 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 20:经纪人将私客转为成交客 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「转成交」触发"客户成交"弹窗,必填字段(状态/房源类型/成交房源/成交日期/成交价格/成交方)全部填写后「确定」按钮高亮;成交房源选择浮层支持关键词搜索和区域/状态筛选;提交后客源移入成交客列表,状态更新为"成交";操作日志新增"转成交"记录(含成交信息摘要) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-013 经纪人将客源标记为无效 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 21:经纪人将客源标记为无效 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-013 +【任务标题】经纪人将客源标记为无效 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 21:经纪人将客源标记为无效 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「转无效」触发弹窗,展示蓝色提示框说明"将把所有电话标记无效",无效原因单选(号码无效/同行中介/广告推销/客户无意向/其他)默认选中"号码无效";确认后所有联系人电话标记为无效,客源从私客活跃列表移除;操作日志新增"转无效"记录(含无效原因);权限控制:仅归属人、首录人或有管理权限者可操作 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-014 经纪人编辑客源完整信息联系人基础信息需求 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 14:经纪人编辑客源信息 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/编辑客源_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-014 +【任务标题】经纪人编辑客源完整信息联系人基础信息需求 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 14:经纪人编辑客源信息 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/编辑客源_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +编辑页面分三个Tab(联系人/基础信息/二手或新房或租房);联系人Tab的电话1需点击「查看号码」后才可编辑,旁边提供「标记无效」链接;基础信息Tab包含需求类型/购房目的/付款方式/名下房产/贷款记录等扩展字段;保存时校验所有必填字段,成功后返回详情页并刷新需求信息区块 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-015 经纪人管理客源相关员工查看编辑归属人首录人 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 24:经纪人管理客源相关员工 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-015 +【任务标题】经纪人管理客源相关员工查看编辑归属人首录人 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 24:经纪人管理客源相关员工 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +相关员工面板展示首录人/归属人的所属门店+小组+姓名及参与时间;点击「编辑」触发弹窗,首录人和归属人均为必填下拉选择器(支持搜索姓名);保存后面板实时更新,操作日志新增"修改相关员工"记录;权限控制:跨团队/跨店修改需店长及以上权限 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-016 系统自动将超时无跟进的私客转为公客 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - 关键业务规则:私客自动转公 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-016 +【任务标题】系统自动将超时无跟进的私客转为公客 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - 关键业务规则:私客自动转公 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +Celery Beat 定时任务每日凌晨执行;超过运营配置天数(如30天)无跟进且非保护客的私客自动转入公客池(transfer_to_public_type='auto');自动转公后 client_status_logs 生成一条 to_public 记录;即将过期的私客在列表中显示"即将掉公"提示标签 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-017 系统自动检测重复客源并提示 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2:顶部重复检测提示;关键业务规则:私客手机号唯一性 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-017 +【任务标题】系统自动检测重复客源并提示 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2:顶部重复检测提示;关键业务规则:私客手机号唯一性 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +录入/编辑联系人手机号时实时通过phone_hash检测与现有私客/成交客/公客的重复;客源列表顶部实时显示"私客与成交客重复:XX"和"私客与公客重复:XX"蓝色可点击链接;点击重复数字链接可查看重复名单 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-001 管理员维护公司组织结构部门门店树 + +- 阶段:**P0** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 公司组织结构(部门/门店树) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-001 +【任务标题】管理员维护公司组织结构部门门店树 +【阶段】P0 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 公司组织结构(部门/门店树) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持新增/编辑/删除部门和门店节点;组织树以层级结构展示(公司→区域→门店→小组);删除有员工的部门时系统提示并阻止操作;组织结构变更实时反映在员工选择器弹层中 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-002 管理员查看与维护员工列表 + +- 阶段:**P0** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工列表/员工详情 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-002 +【任务标题】管理员查看与维护员工列表 +【阶段】P0 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工列表/员工详情 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +员工列表支持按姓名/手机号关键词搜索;支持按部门/状态筛选;列表展示员工姓名/所属门店/职位/状态等字段;点击员工姓名跳转员工详情页 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-003 管理员办理员工入职并创建系统账号 + +- 阶段:**P0** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工入职/账号创建 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-003 +【任务标题】管理员办理员工入职并创建系统账号 +【阶段】P0 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工入职/账号创建 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +入职表单必填字段(姓名/手机号/所属门店/职位)校验;创建账号后系统自动生成登录密码并可发送给员工;新员工账号立即可登录系统;员工账号与组织树节点正确关联 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-001 管理员配置角色预设角色自定义角色 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 角色管理(预设角色+自定义角色) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-001 +【任务标题】管理员配置角色预设角色自定义角色 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 角色管理(预设角色+自定义角色) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +系统预设角色(经纪人/店长/管理员等)不可删除但可复制;支持创建自定义角色并配置功能权限;角色名称在同租户内唯一;删除自定义角色前需解除所有人员绑定 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-002 管理员查看与管理人员权限列表 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 人员权限列表 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-002 +【任务标题】管理员查看与管理人员权限列表 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 人员权限列表 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +人员权限列表展示员工姓名/所属部门/当前角色;支持按部门/角色筛选;列表支持分页;点击员工行可查看详细权限配置 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-003 管理员批量为员工分配角色 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 角色批量分配 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-003 +【任务标题】管理员批量为员工分配角色 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 角色批量分配 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +勾选多名员工后可批量指定角色;批量分配成功后所有选中员工角色立即生效;分配后员工下次登录或刷新页面权限即更新(Redis权限快照失效重载) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-004 系统执行功能权限控制菜单级 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 功能权限(菜单级) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-004 +【任务标题】系统执行功能权限控制菜单级 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 功能权限(菜单级) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +无权限的菜单在导航中不展示;直接访问无权限URL返回403页面;权限变更后Redis缓存自动失效,用户下一次请求即应用新权限;经纪人无法访问管理员专属功能页 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-005 系统执行数据权限控制部门个人全司 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 数据权限(部门/个人/全司) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-005 +【任务标题】系统执行数据权限控制部门个人全司 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 数据权限(部门/个人/全司) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +经纪人只能看到自己名下的房源和客源数据;店长可见本门店所有员工的房源和客源;管理员可见全司数据;不同数据权限级别的用户查询结果严格隔离,不可通过URL参数绕过 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-001-A 管理员配置可选枚举值 Lookup Items + +- 阶段:**P0** +- 模块:**系统配置** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-A +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `lookup_items` DDL) +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-001-A +【任务标题】管理员配置可选枚举值 Lookup Items +【阶段】P0 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-A +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `lookup_items` DDL) +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +- 管理员进入「系统设置 → 参数配置」,页面按模块分组展示所有可配置参数项(客源来源、跟进目的、房源来源) +- 可新增自定义选项,新选项追加至列表末尾并立即对经纪人录入下拉生效(刷新后) +- 系统预制选项(`is_system=True`)不可删除,仅可停用;停用后前端下拉不再展示,历史数据保留并标注「已停用」 +- 支持调整选项排序(拖拽或修改排序值),排序变更在保存后前端生效 +- 配置保存时主动失效 Redis 缓存 key `{tenant_schema}:setting:lookup:{module}.{key}`,最长 5 分钟延迟 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-001-B 管理员配置房源字段必填规则 + +- 阶段:**P0** +- 模块:**系统配置** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-B +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `field_requirement_rules` DDL)、`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-001-B +【任务标题】管理员配置房源字段必填规则 +【阶段】P0 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-B +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `field_requirement_rules` DDL)、`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +- 管理员进入「系统设置 → 房源字段规则」,以「用途 × 交易状态」矩阵展示配置(住宅×出售、住宅×出租) +- 每个字段显示当前规则(必填 / 选填 / 隐藏),以三态 Toggle 或 Radio 形式编辑,保存后生效 +- 规则应用于录入界面:必填字段显示「*」标记,提交时为空则拦截;隐藏字段不渲染 +- 规则变更仅影响新录入,不影响存量房源数据 +- MVP 可配置字段:朝向、装修情况、楼层、建筑面积、套内面积、房型、产权年限、车位数 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-001-C 管理员配置客源录入规则 + +- 阶段:**P0** +- 模块:**系统配置** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-C +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `tenant_settings` DDL)、`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-001-C +【任务标题】管理员配置客源录入规则 +【阶段】P0 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-C +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `tenant_settings` DDL)、`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +- 管理员进入「系统设置 → 客源规则」,可配置新增私客时的查重范围:本人(默认)/ 本部门 / 全公司 +- 查重规则实时生效:经纪人录入手机号失焦后,系统按当前查重范围加密比对,若重复则提示归属人和录入时间,经纪人可选「仍然录入」或「放弃」 +- 可配置客源必填字段开关(等级、来源默认必填;总价区间、居室需求、购房目的默认选填) +- 配置保存时主动失效 Redis 缓存 key `{tenant_schema}:setting:client_rules`,经纪人下次打开录入界面即应用最新规则 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ACCOUNT-010 经纪人使用短信验证码登录 + +- 阶段:**P1** +- 模块:**用户登录** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 短信验证码登录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-010 +【任务标题】经纪人使用短信验证码登录 +【阶段】P1 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 短信验证码登录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击"发送验证码"后60秒内不可重复点击;验证码5分钟内有效;输入正确验证码后登录成功跳转首页;错误验证码给出明确提示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ACCOUNT-011 经纪人重置账号密码 + +- 阶段:**P1** +- 模块:**用户登录** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 密码重置 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-011 +【任务标题】经纪人重置账号密码 +【阶段】P1 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 密码重置 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +通过手机号验证码或邮箱链接验证身份;新密码需二次确认且满足强度要求(8位以上含字母+数字);重置成功后原会话立即失效需重新登录;重置操作写入审计日志 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ACCOUNT-012 系统记住用户登录状态 + +- 阶段:**P1** +- 模块:**用户登录** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 记住登录状态 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-012 +【任务标题】系统记住用户登录状态 +【阶段】P1 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 记住登录状态 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +勾选"记住我"后关闭浏览器重新打开仍处于登录态;记住登录的有效期为7天;超过有效期自动跳转登录页;管理员可在后台强制让指定账号的所有会话失效 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-010 管理员管理楼盘照片 + +- 阶段:**P1** +- 模块:**楼盘管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘照片管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-010 +【任务标题】管理员管理楼盘照片 +【阶段】P1 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘照片管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持上传楼盘封面图和相册图片(格式jpg/png/gif,单文件≤20MB);上传成功后图片在楼盘详情页展示;支持删除图片;楼盘封面图可手动设置 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-011 管理员维护楼盘价格走势 + +- 阶段:**P1** +- 模块:**楼盘管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘价格走势 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-011 +【任务标题】管理员维护楼盘价格走势 +【阶段】P1 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘价格走势 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +楼盘详情页可查看历史价格走势折线图;价格走势数据按月维度展示;支持手动录入或批量导入历史均价数据 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-012 管理员维护周边配套学校管理 + +- 阶段:**P1** +- 模块:**楼盘管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 周边配套(学校管理) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-012 +【任务标题】管理员维护周边配套学校管理 +【阶段】P1 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 周边配套(学校管理) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可为楼盘关联周边学校(从学校库选择);学校库支持新增/编辑/删除;楼盘详情页展示关联学校列表;学校数据可在客源意向学校字段中搜索引用 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-010 经纪人查看房源维护完成度诊断面板 + +- 阶段:**P1** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源维护完成度(诊断面板) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-010 +【任务标题】经纪人查看房源维护完成度诊断面板 +【阶段】P1 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源维护完成度(诊断面板) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +房源详情页展示数据完整度百分比及未填字段提示列表;点击未填字段提示可直接跳转对应编辑区域;完整度≥80%时展示绿色状态,<60%时展示红色警告 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-011 经纪人管理敏感信息跟进权限控制 + +- 阶段:**P1** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 敏感信息跟进(查看权限控制) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-011 +【任务标题】经纪人管理敏感信息跟进权限控制 +【阶段】P1 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 敏感信息跟进(查看权限控制) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +敏感信息跟进Tab仅对有权限的角色可见;查看敏感信息自动写入审计日志(不可删除);无权限用户看到Tab时显示"无权限查看"提示而非隐藏Tab + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-012 经纪人管理房源附件 + +- 阶段:**P1** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 附件管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-012 +【任务标题】经纪人管理房源附件 +【阶段】P1 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 附件管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持上传PDF/Word/Excel等文档类附件(单文件≤50MB);附件按上传时间倒序展示;支持下载和删除附件;附件上传通过Celery异步处理,不阻塞主线程 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-013 经纪人查看房源市场报盘 + +- 阶段:**P1** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 市场报盘 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-013 +【任务标题】经纪人查看房源市场报盘 +【阶段】P1 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 市场报盘 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +房源详情页可查看同楼盘其他在售房源的报价分布;展示该楼盘近期成交均价和当前挂牌均价;数据按成交日期倒序展示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-014 经纪人查看房源价格解读 + +- 阶段:**P1** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 价格解读 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-014 +【任务标题】经纪人查看房源价格解读 +【阶段】P1 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 价格解读 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +房源详情页展示基于同楼盘/同商圈数据的价格合理性分析;展示当前报价与参考价的偏差百分比;无足够数据时展示"暂无参考数据" + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-020 经纪人使用二手配房功能查看匹配房源 + +- 阶段:**P1** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 11:经纪人使用二手配房功能推荐房源 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-020 +【任务标题】经纪人使用二手配房功能查看匹配房源 +【阶段】P1 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 11:经纪人使用二手配房功能推荐房源 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +智能配房Tab分"录客配房"和"系统配房"两个子Tab;录客配房按优质户型/降价/热门/新上四个分组展示房源卡片;每套房源卡片展示封面图/小区名/户型/面积/售价/标签;点击「分享房源」触发房源分享流程;支持「批量分享」多套房源 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-021 经纪人查看客源解读AI行为分析 + +- 阶段:**P1** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 10:经纪人查看客源解读 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-021 +【任务标题】经纪人查看客源解读AI行为分析 +【阶段】P1 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 10:经纪人查看客源解读 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +客源解读Tab展示活跃行为/活跃时间/购房偏好三个模块;购房偏好支持近7日/近30日/近90日三个时间维度切换,切换后数据联动刷新;价格/户型/面积偏好以圆环图+图例形式展示;无数据时展示"暂无数据"而非报错 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-022 经纪人将重点客源收藏至收藏夹 + +- 阶段:**P1** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 16:经纪人收藏客源至私客收藏夹 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-022 +【任务标题】经纪人将重点客源收藏至收藏夹 +【阶段】P1 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 16:经纪人收藏客源至私客收藏夹 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「☆收藏」触发"选择私客收藏夹"浮层,默认选中"默认收藏夹";支持在浮层内创建新收藏夹(名称最多10字,超出「创建」按钮置灰);收藏成功后图标变为实心★橙色;私客列表支持按收藏夹筛选展示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-023 经纪人通过快捷入口编辑客源基础信息 + +- 阶段:**P1** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 22:经纪人编辑客源基础信息(快捷入口) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-023 +【任务标题】经纪人通过快捷入口编辑客源基础信息 +【阶段】P1 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 22:经纪人编辑客源基础信息(快捷入口) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击信息概览面板「编辑客源」入口触发"编辑基础信息"抽屉浮层;浮层包含需求类型/用途/来源(必填)及购房目的/付款方式/名下房产等选填字段;点击「确定」校验必填字段,保存成功后面板相关字段实时更新;点击「取消」或×关闭不保存 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-024 经纪人查看客源操作日志 + +- 阶段:**P1** +- 模块:**客源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 25:经纪人查看客源操作日志 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-024 +【任务标题】经纪人查看客源操作日志 +【阶段】P1 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 25:经纪人查看客源操作日志 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「查看操作日志」跳转独立日志列表页(面包屑:客源/客源详情/客源操作日志);支持按日期范围/操作人/操作类型筛选;日志列表按操作时间倒序排列,展示操作时间/操作人/操作类型/操作内容;日志为只读,不支持编辑或删除;支持分页(默认20条/页) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-010 管理员办理员工离职与调动 + +- 阶段:**P1** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工离职/调动 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-010 +【任务标题】管理员办理员工离职与调动 +【阶段】P1 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工离职/调动 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +员工离职后账号立即禁用无法登录;离职员工名下房源和客源可批量转移给其他员工;员工调动后所属部门/组织信息实时更新;调动/离职操作写入异动记录 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-011 管理员维护员工通讯录 + +- 阶段:**P1** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工通讯录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-011 +【任务标题】管理员维护员工通讯录 +【阶段】P1 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工通讯录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +通讯录支持按姓名/部门搜索;展示员工姓名/职位/手机号/所属门店;手机号默认打码,有权限才可查看完整号码;支持按部门分组展示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-012 管理员管理员工职务 + +- 阶段:**P1** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 职务管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-012 +【任务标题】管理员管理员工职务 +【阶段】P1 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 职务管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持新增/编辑/删除职务(如经纪人/店长/区域经理);职务可关联权限角色;删除有在职员工绑定的职务时系统提示并阻止 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-010 管理员配置字段级权限敏感字段可见性 + +- 阶段:**P1** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 字段级权限(敏感字段可见性) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-010 +【任务标题】管理员配置字段级权限敏感字段可见性 +【阶段】P1 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 字段级权限(敏感字段可见性) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可为不同角色配置联系人手机号/证件号码等敏感字段的可见性;无查看权限的角色访问时号码始终打码,无法点击查看;查看敏感字段操作记录在审计日志中;字段级权限配置变更后Redis缓存立即失效 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-011 管理员配置个人特定权限覆盖 + +- 阶段:**P1** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 个人特定权限覆盖 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-011 +【任务标题】管理员配置个人特定权限覆盖 +【阶段】P1 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 个人特定权限覆盖 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持在角色权限基础上为特定员工单独开启或关闭特定权限点;个人覆盖权限优先级高于角色权限;个人权限覆盖配置记录可查看和删除 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-010 管理员配置首页展示内容 + +- 阶段:**P1** +- 模块:**系统配置** +- 完备度:**C** +- 引用缺失:`PRD/系统配置/系统配置.md` + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 首页设置 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-010 +【任务标题】管理员配置首页展示内容 +【阶段】P1 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 首页设置 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【输入缺口】 +- 缺少文件:PRD/系统配置/系统配置.md +- 若缺口阻塞实现,请先输出“阻塞清单 + 最小替代方案”,再继续实现可落地部分。 + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可配置首页展示的统计数据卡片(如今日新增房源/客源数量);配置变更后首页实时生效;不同角色可配置不同的首页视图 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-011 管理员配置相关方规则 + +- 阶段:**P1** +- 模块:**系统配置** +- 完备度:**C** +- 引用缺失:`PRD/系统配置/系统配置.md` + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 相关方设置 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-011 +【任务标题】管理员配置相关方规则 +【阶段】P1 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 相关方设置 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【输入缺口】 +- 缺少文件:PRD/系统配置/系统配置.md +- 若缺口阻塞实现,请先输出“阻塞清单 + 最小替代方案”,再继续实现可落地部分。 + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可配置房源/客源的相关方角色(如协作人/跟进人)及其权限范围;相关方配置影响房源/客源详情页的相关员工区块展示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-012 管理员配置客源相关参数 + +- 阶段:**P1** +- 模块:**系统配置** +- 完备度:**C** +- 引用缺失:`PRD/系统配置/系统配置.md` + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 客源设置(基本配置/参数配置) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-012 +【任务标题】管理员配置客源相关参数 +【阶段】P1 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 客源设置(基本配置/参数配置) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【输入缺口】 +- 缺少文件:PRD/系统配置/系统配置.md +- 若缺口阻塞实现,请先输出“阻塞清单 + 最小替代方案”,再继续实现可落地部分。 + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可配置私客自动转公客的天数阈值;可配置客源来源枚举值(lookup_items);可配置活跃度计算的各阈值天数;配置变更后Celery定时任务下次执行时使用新配置 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SYSTEM-010 平台管理员管理租户开通暂停配置 + +- 阶段:**P1** +- 模块:**系统管理(运营后台)** +- 完备度:**B** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 租户管理(开通/暂停/配置) +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SYSTEM-010 +【任务标题】平台管理员管理租户开通暂停配置 +【阶段】P1 +【模块】系统管理(运营后台) + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 租户管理(开通/暂停/配置) +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可在运营后台新开通租户(自动创建独立PostgreSQL Schema);可暂停租户(暂停后租户用户无法登录);可为租户配置域名/子域名;租户操作记录写入平台操作日志 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SYSTEM-011 平台管理员监控系统健康状态 + +- 阶段:**P1** +- 模块:**系统管理(运营后台)** +- 完备度:**B** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 系统健康监控 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SYSTEM-011 +【任务标题】平台管理员监控系统健康状态 +【阶段】P1 +【模块】系统管理(运营后台) + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 系统健康监控 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +运营后台展示系统核心指标(API响应时间/错误率/Celery队列积压);Sentry错误告警正常接收;Grafana面板可查看历史监控数据;关键指标超阈值时触发告警通知 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-RELEASE-010 系统发布Windows桌面客户端安装包 + +- 阶段:**P1** +- 模块:**客户端发布** +- 完备度:**B** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md` - Windows桌面客户端 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-RELEASE-010 +【任务标题】系统发布Windows桌面客户端安装包 +【阶段】P1 +【模块】客户端发布 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md` - Windows桌面客户端 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +electron-builder 输出 NSIS .exe 安装包和便携版 .zip;安装包经EV证书签名,安装时无SmartScreen警告;安装包上传至Cloudflare R2并通过CDN分发;后端 ClientRelease 表新增一条版本记录 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-RELEASE-011 客户端自动检测并更新至最新版本 + +- 阶段:**P1** +- 模块:**客户端发布** +- 完备度:**B** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md` - 自动更新机制 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-RELEASE-011 +【任务标题】客户端自动检测并更新至最新版本 +【阶段】P1 +【模块】客户端发布 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md` - 自动更新机制 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +客户端启动时及每4小时自动检测 GET /api/client/updates/latest/ 接口;有新版本时后台静默下载,下载完成后提示用户重启;下载完成后校验SHA256与服务端返回一致才允许安装;强制更新标记时用户无法跳过更新 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-020 经纪人录入别墅商铺商住写字楼其他类型房源 + +- 阶段:**P2** +- 模块:**房源管理** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 录入别墅/商铺/商住/写字楼/其他 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-020 +【任务标题】经纪人录入别墅商铺商住写字楼其他类型房源 +【阶段】P2 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 录入别墅/商铺/商住/写字楼/其他 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-021 经纪人查看全部商铺写字楼列表 + +- 阶段:**P2** +- 模块:**房源管理** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 全部商铺列表/全部写字楼列表 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-021 +【任务标题】经纪人查看全部商铺写字楼列表 +【阶段】P2 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 全部商铺列表/全部写字楼列表 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-020 管理员使用应用数据标准功能 + +- 阶段:**P2** +- 模块:**楼盘管理** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 应用数据标准 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-020 +【任务标题】管理员使用应用数据标准功能 +【阶段】P2 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 应用数据标准 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-030 经纪人查看与管理公客列表 + +- 阶段:**P2** +- 模块:**客源管理** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 12:经纪人查看与筛选公客列表 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-030 +【任务标题】经纪人查看与管理公客列表 +【阶段】P2 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 12:经纪人查看与筛选公客列表 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-031 经纪人查看与管理成交客列表 + +- 阶段:**P2** +- 模块:**客源管理** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 13:经纪人查看成交客列表 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-031 +【任务标题】经纪人查看与管理成交客列表 +【阶段】P2 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 13:经纪人查看成交客列表 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-032 经纪人管理暂缓私客 + +- 阶段:**P2** +- 模块:**客源管理** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 5:经纪人管理暂缓私客 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-032 +【任务标题】经纪人管理暂缓私客 +【阶段】P2 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 5:经纪人管理暂缓私客 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-020 管理员查看员工异动记录 + +- 阶段:**P2** +- 模块:**组织人事** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 异动记录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-020 +【任务标题】管理员查看员工异动记录 +【阶段】P2 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 异动记录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-021 管理员管理员工奖惩记录 + +- 阶段:**P2** +- 模块:**组织人事** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 奖惩记录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-021 +【任务标题】管理员管理员工奖惩记录 +【阶段】P2 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 奖惩记录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-022 管理员查看门店分布地图 + +- 阶段:**P2** +- 模块:**组织人事** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 门店分布地图 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-022 +【任务标题】管理员查看门店分布地图 +【阶段】P2 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 门店分布地图 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-020 管理员配置人事OA相关参数 + +- 阶段:**P2** +- 模块:**系统配置** +- 完备度:**C** +- 引用缺失:`PRD/系统配置/系统配置.md` +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 人事OA设置 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-020 +【任务标题】管理员配置人事OA相关参数 +【阶段】P2 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 人事OA设置 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【输入缺口】 +- 缺少文件:PRD/系统配置/系统配置.md +- 若缺口阻塞实现,请先输出“阻塞清单 + 最小替代方案”,再继续实现可落地部分。 + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-021 管理员配置交易规则 + +- 阶段:**P2** +- 模块:**系统配置** +- 完备度:**C** +- 引用缺失:`PRD/系统配置/系统配置.md` +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 交易设置 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-021 +【任务标题】管理员配置交易规则 +【阶段】P2 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置.md` - 交易设置 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【输入缺口】 +- 缺少文件:PRD/系统配置/系统配置.md +- 若缺口阻塞实现,请先输出“阻塞清单 + 最小替代方案”,再继续实现可落地部分。 + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SYSTEM-020 平台管理员查看操作审计日志 + +- 阶段:**P2** +- 模块:**系统管理(运营后台)** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 操作审计日志 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SYSTEM-020 +【任务标题】平台管理员查看操作审计日志 +【阶段】P2 +【模块】系统管理(运营后台) + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 操作审计日志 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SYSTEM-021 平台管理员管理灰度发布滚动升级 + +- 阶段:**P2** +- 模块:**系统管理(运营后台)** +- 完备度:**C** +- 备注:当前验收标准仍为占位,建议先补充 PRD 后再编码。 + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 灰度发布/滚动升级 +- DATA_MODEL:N/A +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SYSTEM-021 +【任务标题】平台管理员管理灰度发布滚动升级 +【阶段】P2 +【模块】系统管理(运营后台) + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统管理/系统管理模块PRD.md` - 灰度发布/滚动升级 +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统管理技术文档.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出“实现计划(不编码)”:包含文件变更清单、接口/模型变更、测试计划。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 对缺失的验收标准提出可测试化建议(2~5条)。 +5) 不直接提交代码,等待确认后再实现。 + +【验收标准(原始)】 +(规划中,详细验收标准待PRD细化后补充) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +## 7) 高优先级缺口清单(建议先补) + +- 引用文件不存在:**6** 条任务受影响。 + - US-COMPLEX-001: UI_DESIGN/楼盘管理/楼盘详情_UI.md + - US-SETTING-010: PRD/系统配置/系统配置.md + - US-SETTING-011: PRD/系统配置/系统配置.md + - US-SETTING-012: PRD/系统配置/系统配置.md + - US-SETTING-020: PRD/系统配置/系统配置.md + - US-SETTING-021: PRD/系统配置/系统配置.md +- 验收标准仍占位:**13** 条(均不建议直接编码)。 + - US-PROPERTY-020,US-PROPERTY-021,US-COMPLEX-020,US-CLIENT-030,US-CLIENT-031,US-CLIENT-032,US-ORG-020,US-ORG-021,US-ORG-022,US-SETTING-020,US-SETTING-021,US-SYSTEM-020,US-SYSTEM-021 +- 缺少 DATA_MODEL 引用:**11** 条。 + - US-SYSTEM-010,US-SYSTEM-011,US-RELEASE-010,US-RELEASE-011,US-PROPERTY-020,US-PROPERTY-021,US-COMPLEX-020,US-SETTING-020,US-SETTING-021,US-SYSTEM-020,US-SYSTEM-021 + +--- + +> 说明:本文件用于“把 TASK 直接交给 OpenCode 执行”。若需进一步提升自动化成功率,建议下一步把 P0/P1 的每条任务补充“目标文件路径 + API/字段契约 + 指定测试文件路径”。 diff --git a/Project/fonrey/PRD/TASK_AGENT_READY_P0.md b/Project/fonrey/PRD/TASK_AGENT_READY_P0.md new file mode 100644 index 00000000..920a47b2 --- /dev/null +++ b/Project/fonrey/PRD/TASK_AGENT_READY_P0.md @@ -0,0 +1,3104 @@ +# TASK_AGENT_READY_P0(仅 P0) + +> 从 `PRD/TASK_AGENT_READY.md` 按“先基础设施 → 再业务模块”重排提取。 + +## 执行顺序说明 + +### A. 基础设施(先做) +- 用户登录 +- 组织人事 +- 权限管理 +- 系统配置 + +### B. 业务模块(后做) +- 楼盘管理 +- 房源管理 +- 客源管理 + +**P0 任务总数:42** + +## 模块分布 + +- 用户登录: 3 +- 组织人事: 3 +- 权限管理: 5 +- 系统配置: 3 +- 楼盘管理: 3 +- 房源管理: 8 +- 客源管理: 17 + +# TASK Agent Ready Prompts(OpenCode 执行版) + +> 生成时间:2026-04-28 16:01:37 +> 来源文件:`PRD/TASK.md` +> 目标:把每条 US 转成可直接交给 OpenCode 的执行提示词。 + +## 1) 总体结论 + +- 任务总数:**83** +- 完备度分级:A=24,B+=38,B=5,C=16 +- 其中 C 级(不建议直接编码):**16**(主要为 P2 验收标准占位) + +### 分阶段统计 + +| Phase | 任务数 | A | B+ | B | C | 验收占位数 | +|---|---:|---:|---:|---:|---:|---:| +| P0 | 42 | 20 | 21 | 1 | 0 | 0 | +| P1 | 28 | 4 | 17 | 4 | 3 | 0 | +| P2 | 13 | 0 | 0 | 0 | 13 | 13 | + +## 2) 模块 → TECH_STACK 技术方案映射 + +| 模块 | 技术方案输入文档 | +|---|---| +| 用户登录 | `Project/fonrey/TECH_STACK/登录管理技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 楼盘管理 | `Project/fonrey/TECH_STACK/楼盘管理技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 房源管理 | `Project/fonrey/TECH_STACK/房源管理技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 客源管理 | `Project/fonrey/TECH_STACK/客源管理技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 组织人事 | `Project/fonrey/TECH_STACK/组织人事技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 权限管理 | `Project/fonrey/TECH_STACK/权限管理系统技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 系统配置 | `Project/fonrey/TECH_STACK/系统设置技术方案.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 系统管理(运营后台) | `Project/fonrey/TECH_STACK/系统管理技术文档.md`;`Project/fonrey/TECH_STACK/API_CONTRACT.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | +| 客户端发布 | `Project/fonrey/TECH_STACK/API_CONTRACT.md`;`Project/fonrey/TECH_STACK/系统管理技术文档.md`;`Project/fonrey/TECH_STACK/TECH_STACK.md`;`Project/fonrey/TECH_STACK/测试规范.md` | + +## 3) OpenCode 全局执行约束(每条任务都必须带上) + +1. 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +2. 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +3. Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +4. HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +5. 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +6. 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +7. PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +8. 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +9. 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +10. 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +11. `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于**强约束输入**:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +12. 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +## 4) 通用执行模板(复制后替换 US 内容) + +```text +你是 OpenCode 编程代理。请在当前仓库根目录实现以下任务。 + +【任务ID】 +【任务标题】 +【阶段】 +【模块】<模块名> + +【输入文档】 +- PRD: <路径> +- DATA_MODEL: <路径或 N/A> +- UI: <路径或 N/A> +- TECH_STACK: <路径列表> + +【必须遵循约束】 +- 多租户 URL 分离、Admin 弃用、HTMX 片段返回、TenantClient、PII 加密、testing settings 等(见 TASK_AGENT_READY.md §3) + +【实现要求】 +1) 先输出你将修改/新增的文件清单(精确路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 `UI_DESIGN/` 对应 `.html`/`.md` 静态页面,列出“必须保持一致”的页面结构与交互点,再开始编码。 +4) 再按最小可交付实现功能,不做额外功能扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补充/更新对应测试。 +6) 执行测试命令并给出结果。 +7) 输出风险与后续建议。 + +【验收标准】 +<粘贴该 US 的验收标准> + +【必须执行测试命令】 +- pytest -q +- 如涉及 HTMX 局部接口:补充 HTTP_HX_REQUEST=true 场景测试 + +【交付格式】 +- 变更文件列表 +- API 契约核对清单(逐条对应 API_CONTRACT:已对齐/偏差项) +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 关键实现说明 +- 测试结果 +- 未完成项/阻塞项 +``` + +## 5) 任务索引与完备性 + +| US | Phase | 模块 | 完备度 | 缺口 | +|---|---|---|---|---| +| US-ACCOUNT-001 | P0 | 用户登录 | A | 无 | +| US-ACCOUNT-002 | P0 | 用户登录 | B+ | 缺 UI | +| US-ACCOUNT-003 | P0 | 用户登录 | B+ | 缺 UI | +| US-COMPLEX-001 | P0 | 楼盘管理 | B | 引用文件缺失 | +| US-COMPLEX-002 | P0 | 楼盘管理 | A | 无 | +| US-COMPLEX-003 | P0 | 楼盘管理 | B+ | 缺 UI | +| US-PROPERTY-001 | P0 | 房源管理 | A | 无 | +| US-PROPERTY-002 | P0 | 房源管理 | A | 无 | +| US-PROPERTY-003 | P0 | 房源管理 | A | 无 | +| US-PROPERTY-004 | P0 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-005 | P0 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-006 | P0 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-007 | P0 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-008 | P0 | 房源管理 | B+ | 缺 UI | +| US-CLIENT-001 | P0 | 客源管理 | A | 无 | +| US-CLIENT-002 | P0 | 客源管理 | A | 无 | +| US-CLIENT-003 | P0 | 客源管理 | A | 无 | +| US-CLIENT-004 | P0 | 客源管理 | A | 无 | +| US-CLIENT-005 | P0 | 客源管理 | A | 无 | +| US-CLIENT-006 | P0 | 客源管理 | A | 无 | +| US-CLIENT-007 | P0 | 客源管理 | A | 无 | +| US-CLIENT-008 | P0 | 客源管理 | A | 无 | +| US-CLIENT-009 | P0 | 客源管理 | A | 无 | +| US-CLIENT-010 | P0 | 客源管理 | A | 无 | +| US-CLIENT-011 | P0 | 客源管理 | A | 无 | +| US-CLIENT-012 | P0 | 客源管理 | A | 无 | +| US-CLIENT-013 | P0 | 客源管理 | A | 无 | +| US-CLIENT-014 | P0 | 客源管理 | A | 无 | +| US-CLIENT-015 | P0 | 客源管理 | A | 无 | +| US-CLIENT-016 | P0 | 客源管理 | B+ | 缺 UI | +| US-CLIENT-017 | P0 | 客源管理 | B+ | 缺 UI | +| US-ORG-001 | P0 | 组织人事 | B+ | 缺 UI | +| US-ORG-002 | P0 | 组织人事 | B+ | 缺 UI | +| US-ORG-003 | P0 | 组织人事 | B+ | 缺 UI | +| US-PERMISSION-001 | P0 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-002 | P0 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-003 | P0 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-004 | P0 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-005 | P0 | 权限管理 | B+ | 缺 UI | +| US-SETTING-001-A | P0 | 系统配置 | B+ | 缺 UI | +| US-SETTING-001-B | P0 | 系统配置 | B+ | 缺 UI | +| US-SETTING-001-C | P0 | 系统配置 | B+ | 缺 UI | +| US-ACCOUNT-010 | P1 | 用户登录 | B+ | 缺 UI | +| US-ACCOUNT-011 | P1 | 用户登录 | B+ | 缺 UI | +| US-ACCOUNT-012 | P1 | 用户登录 | B+ | 缺 UI | +| US-COMPLEX-010 | P1 | 楼盘管理 | B+ | 缺 UI | +| US-COMPLEX-011 | P1 | 楼盘管理 | B+ | 缺 UI | +| US-COMPLEX-012 | P1 | 楼盘管理 | B+ | 缺 UI | +| US-PROPERTY-010 | P1 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-011 | P1 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-012 | P1 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-013 | P1 | 房源管理 | B+ | 缺 UI | +| US-PROPERTY-014 | P1 | 房源管理 | B+ | 缺 UI | +| US-CLIENT-020 | P1 | 客源管理 | A | 无 | +| US-CLIENT-021 | P1 | 客源管理 | A | 无 | +| US-CLIENT-022 | P1 | 客源管理 | A | 无 | +| US-CLIENT-023 | P1 | 客源管理 | A | 无 | +| US-CLIENT-024 | P1 | 客源管理 | B+ | 缺 UI | +| US-ORG-010 | P1 | 组织人事 | B+ | 缺 UI | +| US-ORG-011 | P1 | 组织人事 | B+ | 缺 UI | +| US-ORG-012 | P1 | 组织人事 | B+ | 缺 UI | +| US-PERMISSION-010 | P1 | 权限管理 | B+ | 缺 UI | +| US-PERMISSION-011 | P1 | 权限管理 | B+ | 缺 UI | +| US-SETTING-010 | P1 | 系统配置 | C | 缺 UI;引用文件缺失 | +| US-SETTING-011 | P1 | 系统配置 | C | 缺 UI;引用文件缺失 | +| US-SETTING-012 | P1 | 系统配置 | C | 缺 UI;引用文件缺失 | +| US-SYSTEM-010 | P1 | 系统管理(运营后台) | B | 缺 DATA_MODEL;缺 UI | +| US-SYSTEM-011 | P1 | 系统管理(运营后台) | B | 缺 DATA_MODEL;缺 UI | +| US-RELEASE-010 | P1 | 客户端发布 | B | 缺 DATA_MODEL;缺 UI | +| US-RELEASE-011 | P1 | 客户端发布 | B | 缺 DATA_MODEL;缺 UI | +| US-PROPERTY-020 | P2 | 房源管理 | C | 缺 DATA_MODEL;缺 UI;验收占位 | +| US-PROPERTY-021 | P2 | 房源管理 | C | 缺 DATA_MODEL;缺 UI;验收占位 | +| US-COMPLEX-020 | P2 | 楼盘管理 | C | 缺 DATA_MODEL;缺 UI;验收占位 | +| US-CLIENT-030 | P2 | 客源管理 | C | 缺 UI;验收占位 | +| US-CLIENT-031 | P2 | 客源管理 | C | 缺 UI;验收占位 | +| US-CLIENT-032 | P2 | 客源管理 | C | 缺 UI;验收占位 | +| US-ORG-020 | P2 | 组织人事 | C | 缺 UI;验收占位 | +| US-ORG-021 | P2 | 组织人事 | C | 缺 UI;验收占位 | +| US-ORG-022 | P2 | 组织人事 | C | 缺 UI;验收占位 | +| US-SETTING-020 | P2 | 系统配置 | C | 缺 DATA_MODEL;缺 UI;验收占位;引用文件缺失 | +| US-SETTING-021 | P2 | 系统配置 | C | 缺 DATA_MODEL;缺 UI;验收占位;引用文件缺失 | +| US-SYSTEM-020 | P2 | 系统管理(运营后台) | C | 缺 DATA_MODEL;缺 UI;验收占位 | +| US-SYSTEM-021 | P2 | 系统管理(运营后台) | C | 缺 DATA_MODEL;缺 UI;验收占位 | + +## 6) P0 任务的 OpenCode 可执行提示词(按执行顺序) + +### US-ACCOUNT-001 经纪人管理员使用账号密码登录系统 + +- 阶段:**P0** +- 模块:**用户登录** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 账号密码登录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/登录管理/登录_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-001 +【任务标题】经纪人管理员使用账号密码登录系统 +【阶段】P0 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 账号密码登录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/登录管理/登录_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +输入正确账号密码后跳转首页;密码错误时展示"账号或密码错误"提示;连续错误5次后账号锁定提示;登录成功后 Token 写入 Cookie + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ACCOUNT-002 系统识别多租户子域名域名路由 + +- 阶段:**P0** +- 模块:**用户登录** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 多租户识别 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-002 +【任务标题】系统识别多租户子域名域名路由 +【阶段】P0 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - 多租户识别 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +访问不同子域名时系统自动切换对应租户 Schema;非法/不存在子域名返回404页面;跨租户请求被拦截并返回403 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ACCOUNT-003 系统管理 Token 与会话超时 + +- 阶段:**P0** +- 模块:**用户登录** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - Token 管理/会话超时 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ACCOUNT-003 +【任务标题】系统管理 Token 与会话超时 +【阶段】P0 +【模块】用户登录 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/登录管理/用户登录管理模块PRD.md` - Token 管理/会话超时 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/登录管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +会话超时后自动跳转登录页;Token 刷新机制正常工作;登出后 Token 立即失效,再次请求跳转登录页 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-001 管理员维护公司组织结构部门门店树 + +- 阶段:**P0** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 公司组织结构(部门/门店树) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-001 +【任务标题】管理员维护公司组织结构部门门店树 +【阶段】P0 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 公司组织结构(部门/门店树) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持新增/编辑/删除部门和门店节点;组织树以层级结构展示(公司→区域→门店→小组);删除有员工的部门时系统提示并阻止操作;组织结构变更实时反映在员工选择器弹层中 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-002 管理员查看与维护员工列表 + +- 阶段:**P0** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工列表/员工详情 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-002 +【任务标题】管理员查看与维护员工列表 +【阶段】P0 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工列表/员工详情 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +员工列表支持按姓名/手机号关键词搜索;支持按部门/状态筛选;列表展示员工姓名/所属门店/职位/状态等字段;点击员工姓名跳转员工详情页 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-ORG-003 管理员办理员工入职并创建系统账号 + +- 阶段:**P0** +- 模块:**组织人事** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工入职/账号创建 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-ORG-003 +【任务标题】管理员办理员工入职并创建系统账号 +【阶段】P0 +【模块】组织人事 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md` - 员工入职/账号创建 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/组织人事技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +入职表单必填字段(姓名/手机号/所属门店/职位)校验;创建账号后系统自动生成登录密码并可发送给员工;新员工账号立即可登录系统;员工账号与组织树节点正确关联 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-001 管理员配置角色预设角色自定义角色 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 角色管理(预设角色+自定义角色) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-001 +【任务标题】管理员配置角色预设角色自定义角色 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 角色管理(预设角色+自定义角色) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +系统预设角色(经纪人/店长/管理员等)不可删除但可复制;支持创建自定义角色并配置功能权限;角色名称在同租户内唯一;删除自定义角色前需解除所有人员绑定 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-002 管理员查看与管理人员权限列表 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 人员权限列表 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-002 +【任务标题】管理员查看与管理人员权限列表 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 人员权限列表 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +人员权限列表展示员工姓名/所属部门/当前角色;支持按部门/角色筛选;列表支持分页;点击员工行可查看详细权限配置 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-003 管理员批量为员工分配角色 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 角色批量分配 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-003 +【任务标题】管理员批量为员工分配角色 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 角色批量分配 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +勾选多名员工后可批量指定角色;批量分配成功后所有选中员工角色立即生效;分配后员工下次登录或刷新页面权限即更新(Redis权限快照失效重载) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-004 系统执行功能权限控制菜单级 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 功能权限(菜单级) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-004 +【任务标题】系统执行功能权限控制菜单级 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 功能权限(菜单级) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +无权限的菜单在导航中不展示;直接访问无权限URL返回403页面;权限变更后Redis缓存自动失效,用户下一次请求即应用新权限;经纪人无法访问管理员专属功能页 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PERMISSION-005 系统执行数据权限控制部门个人全司 + +- 阶段:**P0** +- 模块:**权限管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 数据权限(部门/个人/全司) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PERMISSION-005 +【任务标题】系统执行数据权限控制部门个人全司 +【阶段】P0 +【模块】权限管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/权限管理/权限管理模块PRD.md` - 数据权限(部门/个人/全司) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PERMISSION.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/权限管理系统技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +经纪人只能看到自己名下的房源和客源数据;店长可见本门店所有员工的房源和客源;管理员可见全司数据;不同数据权限级别的用户查询结果严格隔离,不可通过URL参数绕过 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-001-A 管理员配置可选枚举值 Lookup Items + +- 阶段:**P0** +- 模块:**系统配置** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-A +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `lookup_items` DDL) +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-001-A +【任务标题】管理员配置可选枚举值 Lookup Items +【阶段】P0 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-A +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `lookup_items` DDL) +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +- 管理员进入「系统设置 → 参数配置」,页面按模块分组展示所有可配置参数项(客源来源、跟进目的、房源来源) +- 可新增自定义选项,新选项追加至列表末尾并立即对经纪人录入下拉生效(刷新后) +- 系统预制选项(`is_system=True`)不可删除,仅可停用;停用后前端下拉不再展示,历史数据保留并标注「已停用」 +- 支持调整选项排序(拖拽或修改排序值),排序变更在保存后前端生效 +- 配置保存时主动失效 Redis 缓存 key `{tenant_schema}:setting:lookup:{module}.{key}`,最长 5 分钟延迟 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-001-B 管理员配置房源字段必填规则 + +- 阶段:**P0** +- 模块:**系统配置** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-B +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `field_requirement_rules` DDL)、`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-001-B +【任务标题】管理员配置房源字段必填规则 +【阶段】P0 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-B +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `field_requirement_rules` DDL)、`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +- 管理员进入「系统设置 → 房源字段规则」,以「用途 × 交易状态」矩阵展示配置(住宅×出售、住宅×出租) +- 每个字段显示当前规则(必填 / 选填 / 隐藏),以三态 Toggle 或 Radio 形式编辑,保存后生效 +- 规则应用于录入界面:必填字段显示「*」标记,提交时为空则拦截;隐藏字段不渲染 +- 规则变更仅影响新录入,不影响存量房源数据 +- MVP 可配置字段:朝向、装修情况、楼层、建筑面积、套内面积、房型、产权年限、车位数 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-SETTING-001-C 管理员配置客源录入规则 + +- 阶段:**P0** +- 模块:**系统配置** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-C +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `tenant_settings` DDL)、`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-SETTING-001-C +【任务标题】管理员配置客源录入规则 +【阶段】P0 +【模块】系统配置 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/系统配置/系统配置模块PRD.md` - US-SETTING-001-C +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL.md`(待 Atlas 补充 `tenant_settings` DDL)、`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/系统设置技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +- 管理员进入「系统设置 → 客源规则」,可配置新增私客时的查重范围:本人(默认)/ 本部门 / 全公司 +- 查重规则实时生效:经纪人录入手机号失焦后,系统按当前查重范围加密比对,若重复则提示归属人和录入时间,经纪人可选「仍然录入」或「放弃」 +- 可配置客源必填字段开关(等级、来源默认必填;总价区间、居室需求、购房目的默认选填) +- 配置保存时主动失效 Redis 缓存 key `{tenant_schema}:setting:client_rules`,经纪人下次打开录入界面即应用最新规则 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-001 管理员录入与维护楼盘基础信息 + +- 阶段:**P0** +- 模块:**楼盘管理** +- 完备度:**B** +- 引用缺失:`UI_DESIGN/楼盘管理/楼盘详情_UI.md` + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘信息管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/楼盘管理/楼盘详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-001 +【任务标题】管理员录入与维护楼盘基础信息 +【阶段】P0 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘信息管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/楼盘管理/楼盘详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【输入缺口】 +- 缺少文件:UI_DESIGN/楼盘管理/楼盘详情_UI.md +- 若缺口阻塞实现,请先输出“阻塞清单 + 最小替代方案”,再继续实现可落地部分。 + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可录入楼盘名称、地址、楼栋、结构等基础字段;保存成功后楼盘出现在楼盘列表;必填字段未填时高亮错误提示;楼盘编号系统自动生成且唯一 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-002 经纪人查看楼盘列表与详情 + +- 阶段:**P0** +- 模块:**楼盘管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘列表/楼盘详情 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/楼盘管理/楼盘列表_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-002 +【任务标题】经纪人查看楼盘列表与详情 +【阶段】P0 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 楼盘列表/楼盘详情 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/楼盘管理/楼盘列表_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +楼盘列表支持按名称/地址关键词搜索;支持分页(默认20条/页);点击楼盘名称跳转详情页;详情页展示楼盘基本信息、楼栋结构信息 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-COMPLEX-003 管理员维护区域管理城区商圈 + +- 阶段:**P0** +- 模块:**楼盘管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 区域管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-COMPLEX-003 +【任务标题】管理员维护区域管理城区商圈 +【阶段】P0 +【模块】楼盘管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/楼盘管理模块PRD.md` - 区域管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/楼盘管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可新增/编辑/删除城区和商圈;商圈必须归属于城区;区域数据被房源和客源模块正确关联引用;删除有关联数据的区域时系统给出警告 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-001 经纪人录入二手住宅出售出租 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 录入住宅(二手出售/出租) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/新增房源_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-001 +【任务标题】经纪人录入二手住宅出售出租 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 录入住宅(二手出售/出租) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/新增房源_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +可在3分钟内完成住宅基本信息录入;必填字段(楼盘/楼层/面积/价格)未填时高亮错误提示;保存成功后跳转房源详情页并显示"保存成功";录入后即刻出现在房源列表 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-002 经纪人查看与筛选房源列表 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源列表(二手&租赁) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/房源列表_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-002 +【任务标题】经纪人查看与筛选房源列表 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源列表(二手&租赁) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/房源列表_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +列表支持按楼盘名/业主姓名/电话/房源编号关键词搜索;支持状态/区域/价格/房型多维度组合筛选;列表分页(默认20条/页)且89000条数据下查询响应<2秒;支持导出当前筛选结果为Excel + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-003 经纪人查看房源详情页 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源详情页 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/房源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-003 +【任务标题】经纪人查看房源详情页 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源详情页 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/房源管理/房源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +详情页完整展示基本信息、产证信息、交易信息;号码默认打码,点击"查看号码"后解密展示并记录审计日志;页面各功能 Tab 可正常切换 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-004 经纪人写入与查看房源跟进记录 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 跟进记录(全部/写入/修改/其他) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-004 +【任务标题】经纪人写入与查看房源跟进记录 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 跟进记录(全部/写入/修改/其他) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +跟进记录按时间线倒序展示;支持写入跟进/修改跟进/其他跟进(钥匙/委托/实勘)子Tab切换;跟进内容最少6字校验;写入成功后记录实时出现在列表顶部 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-005 经纪人管理房源图片上传分类排序 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 图片管理(相册上传/分类/排序) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-005 +【任务标题】经纪人管理房源图片上传分类排序 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 图片管理(相册上传/分类/排序) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持上传 bmp/jpg/png/gif 格式图片,单文件最大20MB;上传成功后自动按分类展示;支持拖拽排序;封面图可手动指定 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-006 经纪人管理业主联系人 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 业主联系人管理 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-006 +【任务标题】经纪人管理业主联系人 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 业主联系人管理 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +支持新增/编辑业主联系人(姓名/电话/微信);手机号加密存储,展示时默认打码;可查看同业主名下其他房源;至少保留一个联系人 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-007 经纪人调整房源价格 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 价格调整(调价/调价记录) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-007 +【任务标题】经纪人调整房源价格 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 价格调整(调价/调价记录) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +调价弹窗需填写新价格和调价原因;调价成功后房源列表和详情页价格实时更新;调价记录以时间线形式留存且不可删除;调价幅度在列表中以"降价XX万"标签展示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-PROPERTY-008 经纪人变更房源状态 + +- 阶段:**P0** +- 模块:**房源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源状态变更(在售/暂缓/成交/下架) +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-PROPERTY-008 +【任务标题】经纪人变更房源状态 +【阶段】P0 +【模块】房源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/房源管理/房源管理模块PRD.md` - 房源状态变更(在售/暂缓/成交/下架) +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/房源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +状态变更严格遵循状态机流转规则(在售→暂缓/成交/下架);每次状态变更需填写原因;状态变更后列表状态标签实时更新;状态变更记录写入跟进日志 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-001 经纪人录入新私客 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 1:经纪人录入新私客;5.2 录入私客 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/新增客源_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-001 +【任务标题】经纪人录入新私客 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 1:经纪人录入新私客;5.2 录入私客 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/新增客源_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +录入页面可通过顶部导航「客源」→「+新增私客」或右侧快捷入口「增客」触达;联系人1必填(姓名/性别/电话1),联系人2起可增加删除;基础信息必填字段(状态/用途/等级/来源)缺填时高亮错误并定位到第一个错误处;保存成功后跳转该客源详情页并显示"保存成功"提示 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-002 经纪人查看与筛选私客列表全部求购求租 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2/3/4:经纪人查看与筛选私客列表;5.1 客源列表 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源列表_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-002 +【任务标题】经纪人查看与筛选私客列表全部求购求租 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2/3/4:经纪人查看与筛选私客列表;5.1 客源列表 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源列表_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +顶部Tab导航(私客/资料客/营销客/成交客/公客)及二级Tab(求购/求租/暂缓/全部私客)可正常切换;搜索框支持按客源姓名/号码/号码后4位/客源编号/备注检索;筛选栏支持状态/等级/位置/价格/房室等多维度组合筛选;列表底部实时显示当前筛选总条数,分页默认20条/页,89000条数据量下查询<2秒 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-003 经纪人批量操作私客列表 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2:列表批量操作;5.1.3 批量操作 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源列表_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-003 +【任务标题】经纪人批量操作私客列表 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2:列表批量操作;5.1.3 批量操作 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源列表_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +勾选客源后激活批量操作按钮(修改相关方/修改来源/删除客源/合并客户);批量删除执行软删除,可在"已删客源"中查看;批量修改相关方成功后列表归属人字段实时刷新;列表支持导出当前筛选结果为Excel(Celery异步处理) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-004 经纪人查看私客详情页 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 6:经纪人查看私客详情页;Story 15:经纪人查看客源信息概览面板 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-004 +【任务标题】经纪人查看私客详情页 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 6:经纪人查看私客详情页;Story 15:经纪人查看客源信息概览面板 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +详情页顶部展示需求标题+联系人姓名+带看进度标签;右侧固定信息概览面板展示客户编号/委托日期/需求类型等字段且不随页面滚动消失;主内容区Tab导航(需求信息/跟进记录/带看/客源解读/智能配房)默认激活"需求信息"Tab;右侧面板三个主操作按钮(打电话/写跟进/报备带看)可正常触发对应流程 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-005 经纪人查看与编辑需求信息 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 7:经纪人查看与编辑需求信息 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-005 +【任务标题】经纪人查看与编辑需求信息 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 7:经纪人查看与编辑需求信息 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +需求信息Tab展示总价/面积/居室/装修/朝向/楼层/楼龄/意向商圈/意向小区等字段(三栏布局);字段值为空时显示"-"占位符;右上角「编辑」链接点击后字段转为输入框/选择器;保存成功后返回详情页并刷新需求信息区块 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-006 经纪人写入与查看跟进记录 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 8:经纪人写入与查看跟进记录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-006 +【任务标题】经纪人写入与查看跟进记录 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 8:经纪人写入与查看跟进记录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +跟进记录分5个子Tab(全部/写入跟进/敏感信息跟进/修改跟进/其他跟进);全部Tab支持时间范围筛选及「有录音」「有图片」快速过滤;跟进记录以时间线形式按日期分组倒序展示;写入跟进时跟进目的支持23项多选,跟进内容最少6字校验;系统自动生成的操作日志(如新增私客/状态变更)出现在"其他跟进"Tab + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-007 经纪人管理带看记录预约带看新增带看 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 9:经纪人管理带看记录 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-007 +【任务标题】经纪人管理带看记录预约带看新增带看 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 9:经纪人管理带看记录 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +带看Tab分"预约"和"带看"两个子Tab;新增带看表单必填字段(带看时间/带看情况≥6字/带看房源≥1套)校验通过才可提交;带看记录以时间线展示,含带看房源蓝色可点击链接和带看进度标签;员工选择器弹层支持组织树搜索和多选;带看房源选择器支持按编号/楼盘/业主关键词搜索 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-008 经纪人管理客源联系人查看新增编辑 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 23:经纪人管理客源联系人 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-008 +【任务标题】经纪人管理客源联系人查看新增编辑 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 23:经纪人管理客源联系人 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +联系人面板默认打码显示电话("+86 135\*\*\*\*\*\*\*\*"),点击「查看号码」后展示完整号码并写入敏感信息跟进日志;新增联系人必填字段(姓名/称呼/电话1)校验;编辑联系人时电话1需点击「查看号码」后才可编辑;保存成功后联系人面板实时刷新 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-009 经纪人修改客源等级 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 17:经纪人修改客源等级 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-009 +【任务标题】经纪人修改客源等级 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 17:经纪人修改客源等级 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「改等级」触发弹窗,展示当前等级(只读)和新等级下拉选择器(A急迫/B较强/C一般/D较弱/E暂不关注);新等级未选择时「确定」按钮置灰;保存成功后信息概览面板等级标签实时更新;操作日志中自动新增"改等级"记录 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-010 经纪人修改客源状态 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 18:经纪人修改客源状态 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-010 +【任务标题】经纪人修改客源状态 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 18:经纪人修改客源状态 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「改状态」触发弹窗,展示当前状态(只读)、新状态下拉(求购/求租/租购)、等级下拉和必填更改理由文本框;新状态未选或理由未填时「确定」按钮置灰;保存成功后信息概览面板状态标签实时更新;操作日志新增"改状态"记录(含更改理由) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-011 经纪人手动将私客转为公客 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 19:经纪人手动将私客转为公客 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-011 +【任务标题】经纪人手动将私客转为公客 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 19:经纪人手动将私客转为公客 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「转公客」触发弹窗,状态和等级均为必填;确认后客源从私客列表移除并进入公客池(client_type='public',transfer_to_public_type='manual');操作日志新增"转公客"记录(含操作人/操作时间);权限控制:仅归属人、首录人或有管理权限的店长/经理可操作 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-012 经纪人将私客转为成交客 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 20:经纪人将私客转为成交客 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-012 +【任务标题】经纪人将私客转为成交客 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 20:经纪人将私客转为成交客 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「转成交」触发"客户成交"弹窗,必填字段(状态/房源类型/成交房源/成交日期/成交价格/成交方)全部填写后「确定」按钮高亮;成交房源选择浮层支持关键词搜索和区域/状态筛选;提交后客源移入成交客列表,状态更新为"成交";操作日志新增"转成交"记录(含成交信息摘要) + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-013 经纪人将客源标记为无效 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 21:经纪人将客源标记为无效 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-013 +【任务标题】经纪人将客源标记为无效 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 21:经纪人将客源标记为无效 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +点击「转无效」触发弹窗,展示蓝色提示框说明"将把所有电话标记无效",无效原因单选(号码无效/同行中介/广告推销/客户无意向/其他)默认选中"号码无效";确认后所有联系人电话标记为无效,客源从私客活跃列表移除;操作日志新增"转无效"记录(含无效原因);权限控制:仅归属人、首录人或有管理权限者可操作 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-014 经纪人编辑客源完整信息联系人基础信息需求 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 14:经纪人编辑客源信息 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/编辑客源_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-014 +【任务标题】经纪人编辑客源完整信息联系人基础信息需求 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 14:经纪人编辑客源信息 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/编辑客源_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +编辑页面分三个Tab(联系人/基础信息/二手或新房或租房);联系人Tab的电话1需点击「查看号码」后才可编辑,旁边提供「标记无效」链接;基础信息Tab包含需求类型/购房目的/付款方式/名下房产/贷款记录等扩展字段;保存时校验所有必填字段,成功后返回详情页并刷新需求信息区块 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-015 经纪人管理客源相关员工查看编辑归属人首录人 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**A** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 24:经纪人管理客源相关员工 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- - 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-015 +【任务标题】经纪人管理客源相关员工查看编辑归属人首录人 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 24:经纪人管理客源相关员工 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考UI_Design文档:`Project/fonrey/UI_DESIGN/客源管理/客源详情_UI.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +相关员工面板展示首录人/归属人的所属门店+小组+姓名及参与时间;点击「编辑」触发弹窗,首录人和归属人均为必填下拉选择器(支持搜索姓名);保存后面板实时更新,操作日志新增"修改相关员工"记录;权限控制:跨团队/跨店修改需店长及以上权限 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-016 系统自动将超时无跟进的私客转为公客 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - 关键业务规则:私客自动转公 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-016 +【任务标题】系统自动将超时无跟进的私客转为公客 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - 关键业务规则:私客自动转公 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +Celery Beat 定时任务每日凌晨执行;超过运营配置天数(如30天)无跟进且非保护客的私客自动转入公客池(transfer_to_public_type='auto');自动转公后 client_status_logs 生成一条 to_public 记录;即将过期的私客在列表中显示"即将掉公"提示标签 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` + +### US-CLIENT-017 系统自动检测重复客源并提示 + +- 阶段:**P0** +- 模块:**客源管理** +- 完备度:**B+** + +**引用文档** +- - 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2:顶部重复检测提示;关键业务规则:私客手机号唯一性 +- - 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- UI:N/A +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- - 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +```text +你是 OpenCode 编程代理。请在当前仓库根目录完成下面任务。 + +【任务ID】US-CLIENT-017 +【任务标题】系统自动检测重复客源并提示 +【阶段】P0 +【模块】客源管理 + +【输入文档(必须阅读)】 +- 参考PRD文档:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` - Story 2:顶部重复检测提示;关键业务规则:私客手机号唯一性 +- 参考DATA_MODEL文档:`Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/客源管理技术方案.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/TECH_STACK.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/测试规范.md` +- 参考TECH_STACK文档:`Project/fonrey/TECH_STACK/API_CONTRACT.md` + +【必须遵循项目约束】 +- 技术栈固定:Django + HTMX + Alpine.js + Tailwind + PostgreSQL + Redis + Celery + R2。禁止引入 React/Vue。 +- 必须保持多租户边界:tenant 路由在 config/urls.py,public 路由在 config/urls_public.py。 +- Django Admin 全环境弃用:不得引入 django.contrib.admin / admin.site.urls。 +- HTMX 局部请求必须按片段返回;出错通过 HX-Trigger 触发 toast。 +- 涉及 HTMX 视图测试需带 HTTP_HX_REQUEST=true。 +- 集成测试必须使用 TenantClient,禁止 Django 原生 Client()。 +- PII(手机号等)必须加密存储(core/encryption.py),展示默认脱敏。 +- 测试默认 settings 使用 config.settings.testing,且 CELERY_TASK_ALWAYS_EAGER=True。 +- 必须遵守 `Project/fonrey/TECH_STACK/API_CONTRACT.md`:接口路径/方法/参数/响应结构/错误码与契约一致;禁止擅自变更契约。 +- 如实现与 API 契约冲突:先按契约实现,并在交付中列出差异与影响;不得未确认即改契约。 +- `UI_DESIGN/` 下已审阅的静态页面(`.html`/`.md`)属于强约束输入:必须以其为实现基线,禁止擅自重做页面信息架构、主布局、字段顺序与关键交互。 +- 若实现与 UI 静态页存在冲突:先按 UI 静态页落地,并在交付中列出冲突点;不得在未确认前自行改版 UI。 + +【实现步骤】 +1) 先输出你将变更的文件清单(create/modify,精确到路径)。 +2) 先对照 `Project/fonrey/TECH_STACK/API_CONTRACT.md`,列出本任务涉及接口的契约核对项(路径/方法/参数/响应/错误码)。 +3) 先对照 UI 静态页(如该任务 UI=N/A,需在交付中明确说明),列出必须保持一致的页面结构与关键交互。 +4) 实现最小可交付版本,不做需求外扩展,不得擅自重做 UI 信息架构,不得擅自改动 API 契约。 +5) 补齐/更新测试(单测+必要集成测试)。 +6) 执行测试并报告结果。 + +【验收标准(原始)】 +录入/编辑联系人手机号时实时通过phone_hash检测与现有私客/成交客/公客的重复;客源列表顶部实时显示"私客与成交客重复:XX"和"私客与公客重复:XX"蓝色可点击链接;点击重复数字链接可查看重复名单 + +【必须执行测试命令】 +- pytest -q +- 如有 HTMX 局部请求:补充 HTTP_HX_REQUEST=true 的测试场景 + +【交付格式】 +- 变更文件列表 +- UI 一致性核对清单(逐条对应 UI 静态页:已对齐/偏差项) +- 核心实现说明(与验收标准逐条对应) +- 测试命令与结果 +- 未完成项/阻塞项 +``` diff --git a/Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md b/Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md index e076d817..5418db37 100644 --- a/Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md +++ b/Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md @@ -1,407 +1,407 @@ -# PRD: 客户端发布管理模块 -**状态**: Draft -**作者**: 产品经理 -**最后更新**: 2026-04-24(v1.0 初稿) -**版本**: 1.0 -**所属系统**: Fonrey 房产经纪管理系统 -**关联模块**: 系统管理、权限管理 -**干系人**: 工程负责人、运维负责人、系统管理员 - ---- - -## 1. 问题陈述 - -### 背景 - -Fonrey 房产经纪管理系统当前为纯 Web 应用,依赖用户自行通过浏览器访问。然而在实际部署场景中,经纪公司的终端设备环境高度复杂: - -- **浏览器版本参差不齐**:经纪人使用的 Windows 设备可能运行 IE11、旧版 Edge、或未更新的 Chrome,导致 HTMX + Alpine.js 等现代前端技术出现兼容性问题,系统体验碎片化 -- **交付和部署门槛高**:IT 能力薄弱的经纪公司无法独立配置浏览器访问方式,URL 记忆成本高,容易访问错误版本 -- **版本管理缺失**:后端服务升级后,用户仍可能使用旧版缓存页面操作,导致接口不兼容和功能异常 -- **无官方入口**:用户通过私发链接访问系统,存在钓鱼仿冒风险,且无法统一品牌形象 - -### 目标用户 - -| 角色 | 使用场景 | 使用频率 | -|------|---------|----------| -| 一线经纪人 | 下载安装客户端、日常登录使用系统、接受自动更新 | 每日 | -| 店长/经理 | 同上 | 每日 | -| 系统管理员 | 发布新版本、管理安装包下载地址、监控客户端版本分布 | 按需 | -| IT 运维人员 | 维护更新服务器、签名证书、构建发布流水线 | 按发布周期 | - -### 核心痛点 - -1. **无法控制用户使用的浏览器环境**,兼容性问题无法从根源解决 -2. **升级依赖用户主动刷新浏览器**,后端 API 变更时旧客户端可能造成数据错误 -3. **缺乏官方分发渠道**,无法向终端用户传递信任感和版本一致性保障 -4. **SaaS 多租户管理系统需要统一、可控的客户端入口**,避免因客户端环境差异导致的支持成本上升 - ---- - -## 2. 目标与成功指标 - -| 目标 | 指标 | 当前基准 | 目标值 | 衡量周期 | -|------|------|---------|--------|---------| -| 消除浏览器兼容性问题 | 因浏览器兼容产生的支持工单数 | 待统计 | 降低 ≥ 90% | 上线后 60 天 | -| 提升版本一致性 | 在线用户中使用最新版本客户端的比例 | 0%(无客户端) | ≥ 95% | 版本发布后 7 天 | -| 降低部署门槛 | 新客户从获取安装包到完成首次登录的时间 | 无基准 | ≤ 10 分钟 | 上线后首批客户反馈 | -| 自动更新成功率 | 客户端自动更新完成率(收到更新通知 → 升级完成) | 无基准 | ≥ 98% | 每次版本发布后 48 小时 | - ---- - -## 3. 非目标(本期不做) - -- **不支持 macOS / Linux 客户端**:目标用户群体 99% 使用 Windows,macOS 版本为后续规划 -- **不支持移动端 App(iOS / Android)**:移动端为 v2 规划,本期不涉及 -- **不开发私有化部署的离线安装方案**:本期聚焦 SaaS 在线版,私有化部署另行规划 -- **不包含客户端内置的离线模式**:系统需联网使用,客户端不缓存业务数据供离线访问 -- **不包含客户端层面的安全加固(如代码混淆、反逆向)**:本期以功能交付为优先,安全加固列入后续迭代 - ---- - -## 4. 用户故事与验收标准 - ---- - -### Story 1:经纪人下载并安装客户端 - -**As** 一线经纪人,**I want** 通过公司提供的网址下载一个安装程序并完成安装,**So that** 我可以立即打开登录界面使用 Fonrey 系统,无需手动配置浏览器。 - -**验收标准**: -- [ ] 官方下载页面可通过指定 URL 访问,页面展示最新版本号、发布日期及下载按钮 -- [ ] 下载产物为单一 `.exe` 安装包(或免安装便携版 `.zip`),文件大小控制在合理范围内 -- [ ] 双击安装包后,安装向导步骤不超过 3 步(下一步 → 选择安装路径 → 安装),无需勾选额外组件 -- [ ] 安装完成后,桌面自动生成快捷方式(图标为 Fonrey 品牌 Logo) -- [ ] 首次启动后直接显示登录界面,无需用户手动输入任何 URL -- [ ] 安装包经过代码签名,Windows SmartScreen 不弹出"无法识别的应用"警告 -- [ ] 安装过程无需管理员权限(支持用户级安装到 `%APPDATA%` 目录),降低企业 IT 审批障碍 - ---- - -### Story 2:经纪人使用客户端正常登录并使用系统 - -**As** 一线经纪人,**I want** 打开客户端后直接访问 Fonrey 系统的完整功能,**So that** 我的日常使用体验与使用 Chrome 浏览器无差异,且不受本机安装的浏览器版本影响。 - -**验收标准**: -- [ ] 客户端内嵌现代 Chromium 内核(如基于 Electron 或 WebView2),版本不低于 Chromium 100,支持现代 Web 标准(ES2020、CSS Grid、Fetch API 等) -- [ ] HTMX 局部刷新、Alpine.js 状态交互、Tailwind CSS 样式在客户端中渲染效果与 Chrome 最新版一致 -- [ ] 支持 Cookie / Session 存储,登录状态在客户端关闭后保留(复用 Django Session 机制) -- [ ] 文件上传(图片、附件)、文件下载(Excel 导出)在客户端中正常工作 -- [ ] 客户端窗口支持最大化、最小化、拖拽调整大小,支持多显示器 -- [ ] 客户端标题栏显示应用名称和当前版本号(如:`Fonrey 房睿 v1.2.3`) -- [ ] 客户端不显示浏览器默认的地址栏、书签栏、扩展工具栏,保持沉浸式应用体验 - ---- - -### Story 3:客户端感知新版本并自动升级 - -**As** 一线经纪人,**I want** 客户端在有新版本时自动提示并完成升级,**So that** 我无需手动下载安装,始终使用最新版本,不会因版本落后导致功能异常。 - -**验收标准**: -- [ ] 客户端启动时及运行期间(每隔 4 小时)自动向更新服务器检查最新版本 -- [ ] 有新版本时,客户端右下角弹出非阻断式通知:"发现新版本 vX.X.X,点击立即更新",用户可选择"立即更新"或"稍后提醒" -- [ ] 点击"立即更新"后,客户端在后台静默下载更新包,进度条显示下载进度 -- [ ] 下载完成后提示用户"更新已就绪,重启客户端完成安装",用户选择"立即重启"或"下次启动时安装" -- [ ] 重启后,新版本生效,标题栏版本号更新,历史会话自动恢复(用户无需重新登录) -- [ ] 支持强制更新模式:服务端可标记某版本为"强制升级",客户端不展示"稍后提醒"选项,必须升级后方可继续使用(用于重大 API 兼容性变更场景) -- [ ] 更新失败时(网络中断、磁盘空间不足等),客户端显示错误提示并保持当前版本正常运行,不影响用户当前操作 - ---- - -### Story 4:系统管理员发布新版本 - -**As** 系统管理员,**I want** 通过管理后台上传新版客户端安装包并配置版本信息,**So that** 客户端能感知到更新并引导用户升级。 - -**验收标准**: -- [ ] 系统管理后台提供"客户端版本管理"页面(位于系统管理模块下) -- [ ] 支持上传 `.exe` 安装包,并填写版本号(遵循 SemVer:`X.Y.Z`)、版本说明(更新日志,支持 Markdown)、发布日期 -- [ ] 支持设置版本类型:普通更新 / 强制更新 -- [ ] 支持设置版本状态:草稿(不对外生效)/ 已发布 / 已下线 -- [ ] 发布后,更新服务器 API 即时返回最新版本信息,客户端下次检测时可感知 -- [ ] 支持版本回滚:将指定历史版本重新设为"已发布",自动将当前版本标记为已下线 -- [ ] 支持查看各版本的下载量和活跃客户端版本分布统计 - ---- - -### Story 5:管理员监控客户端版本分布 - -**As** 系统管理员,**I want** 查看当前所有在线客户端的版本分布情况,**So that** 了解升级覆盖率,对仍在使用旧版本的客户端发出提醒或强制升级。 - -**验收标准**: -- [ ] 客户端版本管理页面展示版本分布统计:各版本在线客户端数量及占比(饼图或条形图) -- [ ] 支持按租户维度查看版本分布(多租户场景下,区分不同经纪公司的版本使用情况) -- [ ] 支持对指定版本范围的用户推送"强制更新"通知(如:将所有低于 v1.5.0 的客户端标记为强制更新) - ---- - -## 5. 功能详细说明 - -### 5.1 技术架构选型 - -#### 5.1.1 客户端技术方案 - -基于 Fonrey 现有技术栈(Django + HTMX + Alpine.js + Tailwind CSS,后端已采用 Docker Compose 部署),客户端本质是一个**内嵌现代 Chromium 内核的原生 Windows 应用外壳(Shell)**,其核心职责是: - -1. 提供操作系统级原生窗口(标题栏、任务栏图标、托盘) -2. 内嵌高版本 Chromium 内核加载 Fonrey Web 应用 URL -3. 实现版本检测与自动更新逻辑 -4. 处理文件下载、本地存储等 OS 级能力 - -**推荐方案:Electron(主选)** - -| 维度 | Electron | Tauri | WebView2 封装 | -|------|---------|-------|--------------| -| 内核控制 | ✅ 捆绑 Chromium,100% 可控 | ❌ 依赖系统 WebView,版本不可控 | ⚠️ 依赖 Windows 内置 WebView2 Runtime | -| 包体大小 | ~150MB(可接受) | ~5MB | ~5MB | -| 生态成熟度 | ✅ 最成熟,社区最大 | ✅ 较新但活跃 | ⚠️ 微软官方但文档偏少 | -| 自动更新支持 | ✅ `electron-updater` 成熟方案 | ✅ 内置更新器 | ⚠️ 需自行实现 | -| 跨平台 | ✅ Win/Mac/Linux | ✅ | ❌ 仅 Windows | -| 团队技术匹配 | ✅ 主进程用 Node.js,渲染层纯 Web | ⚠️ 主进程需 Rust | ✅ 主进程用 C# | -| **推荐度** | **✅ 主选** | 次选 | 备选 | - -**选型决策**:采用 **Electron + electron-updater**。理由: - -- 内嵌 Chromium 内核是本需求的核心约束,Electron 是唯一能 100% 保证内核版本可控的主流方案 -- `electron-updater` 配合 GitHub Releases 或自建 S3/R2 存储可实现完整的版本管理与自动更新流程,开发成本最低 -- 渲染层完全复用 Fonrey 现有 Web 技术栈,无需新增前端框架学习成本 -- 团队具备 JavaScript/Node.js 能力,主进程开发门槛可控 - -**技术决策**:客户端不内置任何业务逻辑,所有业务功能由服务端 Fonrey Web 应用提供。客户端仅负责加载 Web 应用、更新管理和 OS 级能力(窗口、托盘、文件下载路径)。 - ---- - -#### 5.1.2 更新服务架构 - -更新机制采用**差量检测 + 全量包下载**模式: - -``` -客户端启动 / 定时检测(每4小时) - │ - ▼ -GET /api/client/updates/latest?platform=win32&arch=x64¤t_version=1.2.0 - │ - ▼ -更新服务器(Fonrey 后端 Django API) - 返回:{ latest_version, download_url, release_notes, force_update, checksum } - │ - ├── 无更新 → 继续正常运行 - │ - └── 有更新 → 弹出通知 - │ - ├── 用户点击"立即更新" → 后台下载 .exe / NSIS 更新包 - │ │ - │ └── 下载完成 → 校验 SHA256 → 提示重启安装 - │ - └── 用户选择"稍后" → 下次启动再提示 -``` - -**更新包存储**:上传至 Cloudflare R2(与现有对象存储一致),通过 Cloudflare CDN 加速下载,全国用户均可获得稳定下载速度。 - -**版本 API 端点**(新增至 Django 后端): - -| 端点 | 方法 | 说明 | -|------|------|------| -| `/api/client/updates/latest/` | GET | 客户端查询最新版本,返回版本信息和下载 URL | -| `/api/client/updates/` | GET | 管理端查询版本列表(需认证) | -| `/api/client/updates/` | POST | 管理端发布新版本(需管理员权限) | -| `/api/client/updates//` | PATCH | 管理端修改版本状态(发布/下线/强制) | - ---- - -#### 5.1.3 安装包签名与分发 - -**代码签名**: -- 使用 EV 代码签名证书(推荐购买 DigiCert 或 Sectigo EV 证书) -- 通过 `electron-builder` 在 CI/CD 构建时自动签名 -- 签名后安装包经 Windows SmartScreen 审核,用户安装时不触发安全警告 - -**安装包分发**: -- 官方下载页:独立 HTML 页面托管于 Cloudflare Pages 或 Nginx 静态站 -- 页面展示:最新版本号 + 发布日期 + 更新日志 + 下载按钮 -- 下载 URL 格式:`https://download.fonrey.com/releases/v1.2.3/fonrey-setup-1.2.3-win.exe` -- 同时提供便携版(Portable):`fonrey-portable-1.2.3-win.zip`,供无安装权限的企业环境使用 - ---- - -### 5.2 客户端功能规格 - -#### 5.2.1 主窗口 - -| 属性 | 规格 | -|------|------| -| 默认窗口尺寸 | 1280 × 800(最小:1024 × 600) | -| 标题栏 | 显示 `Fonrey 房睿 v{version}`,含原生最小化/最大化/关闭按钮 | -| 内嵌 URL | 启动时加载 `https://{tenant}.fonrey.com`(或私有化部署地址,可配置) | -| 地址栏 | 不显示(沉浸式应用模式) | -| 右键菜单 | 仅保留"复制"/"粘贴"/"检查元素(仅开发模式)",移除"查看源代码"等浏览器默认项 | -| 外部链接 | 点击 `target="_blank"` 链接时,在系统默认浏览器中打开,不在客户端内新窗口打开 | - -#### 5.2.2 系统托盘 - -| 功能 | 说明 | -|------|------| -| 托盘图标 | Fonrey Logo,鼠标悬停显示 `Fonrey 房睿 - 已连接` / `- 离线` | -| 右键菜单 | 打开主窗口 / 检查更新 / 关于 / 退出 | -| 最小化行为 | 点击关闭按钮时最小化至托盘(不退出程序),用户通过托盘图标恢复窗口 | - -#### 5.2.3 网络状态感知 - -| 状态 | 客户端行为 | -|------|-----------| -| 正常联网 | 加载 Fonrey Web 应用,状态栏显示"已连接" | -| 网络断开 | 显示全屏提示页:"网络连接已断开,请检查您的网络后重试",提供"重新连接"按钮 | -| 服务器维护 | 服务器返回 503 时,展示维护提示页(内容由服务端控制) | - -#### 5.2.4 文件下载处理 - -- Excel 导出等文件下载触发时,客户端调用系统原生"另存为"对话框,用户选择保存路径 -- 下载完成后,状态栏显示"下载完成,点击打开"提示,点击可直接打开文件 - ---- - -### 5.3 版本管理后台(系统管理模块新增页面) - -**页面路径**:系统管理 → 客户端发布管理 - -#### 5.3.1 版本列表 - -| 列 | 说明 | -|----|------| -| 版本号 | SemVer 格式,如 `v1.2.3` | -| 版本类型 | 普通更新 / 强制更新(红色标签) | -| 状态 | 草稿 / 已发布(绿色)/ 已下线(灰色) | -| 发布时间 | 版本设为已发布的时间 | -| 下载量 | 该版本安装包被下载次数 | -| 操作 | 发布 / 下线 / 编辑 / 复制下载链接 | - -#### 5.3.2 新增/编辑版本表单 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| 版本号 | 文本输入 | 是 | 格式:`X.Y.Z`,自动校验 SemVer 格式 | -| 版本类型 | 单选 | 是 | 普通更新 / 强制更新 | -| 最低兼容版本 | 文本输入 | 否 | 低于该版本的客户端将被强制更新(如填写 `1.0.0`,则低于此版本的客户端强制升级) | -| 安装包(EXE) | 文件上传 | 是 | 上传至 Cloudflare R2,最大 500MB | -| 便携版(ZIP) | 文件上传 | 否 | 同上 | -| SHA256 校验值 | 文本输入(自动填充) | 是 | 上传后系统自动计算并填充,用于客户端下载完成后校验完整性 | -| 更新日志 | Markdown 文本区域 | 是 | 展示给用户看的版本说明,最多 2000 字 | -| 发布说明(内部) | 文本区域 | 否 | 仅内部查看的技术说明,不对外展示 | -| 状态 | 单选 | 是 | 草稿 / 立即发布 | - -#### 5.3.3 版本分布统计 - -| 图表 | 说明 | -|------|------| -| 版本分布饼图 | 按客户端版本号统计当前活跃用户数量及占比 | -| 升级进度趋势图 | 新版本发布后,各天累计升级完成的用户比例(折线图) | -| 租户版本明细 | 按租户(经纪公司)展示其员工的客户端版本分布 | - ---- - -### 5.4 更新 API 规格 - -#### GET `/api/client/updates/latest/` - -**请求参数(Query String)**: - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `platform` | string | 是 | 平台标识,如 `win32` | -| `arch` | string | 是 | CPU 架构,如 `x64` / `arm64` | -| `current_version` | string | 是 | 客户端当前版本号,如 `1.2.0` | - -**响应示例(有新版本)**: - -```json -{ - "has_update": true, - "latest_version": "1.3.0", - "force_update": false, - "download_url": "https://download.fonrey.com/releases/v1.3.0/fonrey-setup-1.3.0-win.exe", - "portable_url": "https://download.fonrey.com/releases/v1.3.0/fonrey-portable-1.3.0-win.zip", - "checksum_sha256": "a1b2c3d4...", - "release_notes": "## v1.3.0 更新内容\n- 新增客源智能配房功能\n- 修复房源列表筛选条件保存异常", - "release_date": "2026-05-01" -} -``` - -**响应示例(已是最新)**: - -```json -{ - "has_update": false, - "latest_version": "1.3.0" -} -``` - ---- - -## 6. 技术实现注意事项 - -### 6.1 依赖关系 - -| 依赖项 | 说明 | 负责方 | 风险等级 | -|--------|------|--------|---------| -| Electron 框架 | 客户端技术基础,需评估 License(MIT,商业可用) | 前端/客户端工程师 | 低 | -| EV 代码签名证书 | 需提前申请,EV 证书审核周期 1-2 周 | IT/运维 | 中(需提前排期) | -| Cloudflare R2 存储桶 | 存放安装包,利用现有账号新增 bucket | 运维 | 低 | -| `electron-updater` | 自动更新库,需配合更新 API 端点实现 | 客户端工程师 | 低 | -| Django 更新 API | 新增 `/api/client/updates/` 相关接口 | 后端工程师 | 低 | -| CI/CD 构建流水线 | 自动构建、签名、上传安装包 | 运维/DevOps | 中 | - -### 6.2 已知风险 - -| 风险 | 可能性 | 影响 | 缓解措施 | -|------|--------|------|---------| -| EV 证书申请延迟 | 中 | 高(无签名包无法正常分发) | MVP 阶段可使用普通 OV 证书临时过渡,但需向用户说明安全警告原因 | -| Electron 包体过大导致下载放弃 | 低 | 中 | 使用 `electron-builder` 的 `asar` 压缩 + 分片下载;首包控制在 150MB 以内 | -| 企业网络拦截 CDN 下载 | 中 | 中 | 提供备用下载 URL(直连服务器),支持客户手动下载后本地安装 | -| 自动更新期间用户强制关闭 | 低 | 低 | 更新包下载完成后才替换原文件,下载中断不影响现有版本正常运行 | -| 多租户场景下 URL 配置问题 | 低 | 高 | 客户端启动时加载的 URL 通过配置文件指定,支持定制化部署;SaaS 版统一指向主域名 | - -### 6.3 开放问题(开发启动前必须解决) - -- [ ] **租户 URL 如何分发到客户端?** 选项 A:客户端硬编码主域名,由服务端重定向到租户子域(`fonrey.com` → `{tenant}.fonrey.com`);选项 B:安装包内置配置文件,由销售/运维在分发给客户前填写租户子域。——**Owner**: 产品 + 工程 **Deadline**: 开发启动前 -- [ ] **代码签名证书采购主体和预算是否确认?** — **Owner**: IT 负责人 **Deadline**: 立项后 1 周 -- [ ] **CI/CD 平台选型是否确定?**(GitHub Actions / Jenkins / 其他)— **Owner**: 运维负责人 **Deadline**: 开发启动前 -- [ ] **便携版(Portable ZIP)是否纳入 v1 范围?** 便携版可解决企业无安装权限场景,但增加测试成本。— **Owner**: PM **Deadline**: 立项后 1 周 - ---- - -## 7. 发布计划 - -| 阶段 | 时间 | 受众 | 成功门槛 | -|------|------|------|---------| -| 内部 Alpha | 开发完成后 1 周 | 内部团队 + 1 家种子客户 | 核心流程无 P0 Bug,自动更新机制验证通过 | -| 封闭 Beta | Alpha + 2 周 | 3-5 家头部客户 | 安装成功率 ≥ 95%,自动更新成功率 ≥ 95%,无 P0/P1 Bug | -| 正式发布(GA) | Beta + 1 周 | 全部客户 | Beta 阶段目标达成 | - -**回滚标准**:若正式发布后 24 小时内出现以下情况,立即下线该版本并恢复上一稳定版本为"已发布": -- 自动更新失败率 > 5% -- 客户端白屏/崩溃率 > 2% -- 收到 P0 级安全漏洞报告 - ---- - -## 8. 附录 - -### 8.1 竞品参考 - -| 产品 | 客户端方案 | 更新机制 | -|------|-----------|---------| -| 企业微信 | Electron + 自研内核 | 强制更新,启动时自动下载 | -| 飞书 | Electron | 后台静默更新,重启生效 | -| 钉钉 | Electron | 同上 | - -> 房产经纪行业的竞品(如房客多、云客优)均采用 Electron 方案,验证了技术路线的合理性。 - -### 8.2 术语表 - -| 术语 | 定义 | -|------|------| -| SemVer | 语义化版本控制(Semantic Versioning):`主版本号.次版本号.补丁号`,如 `1.2.3` | -| Electron | 由 GitHub 开发的开源框架,允许使用 Web 技术(HTML/CSS/JS)构建跨平台桌面应用,内嵌 Chromium 和 Node.js | -| electron-updater | Electron 生态中成熟的自动更新库,支持增量更新和全量更新 | -| EV 证书 | Extended Validation 代码签名证书,由 CA 机构颁发,可消除 Windows SmartScreen 安全警告 | -| SHA256 | 安全散列算法,用于验证下载文件的完整性,防止篡改或下载损坏 | -| Portable | 便携版,无需安装,解压即用,适合无管理员权限的企业环境 | +# PRD: 客户端发布管理模块 +**状态**: Draft +**作者**: 产品经理 +**最后更新**: 2026-04-24(v1.0 初稿) +**版本**: 1.0 +**所属系统**: Fonrey 房产经纪管理系统 +**关联模块**: 系统管理、权限管理 +**干系人**: 工程负责人、运维负责人、系统管理员 + +--- + +## 1. 问题陈述 + +### 背景 + +Fonrey 房产经纪管理系统当前为纯 Web 应用,依赖用户自行通过浏览器访问。然而在实际部署场景中,经纪公司的终端设备环境高度复杂: + +- **浏览器版本参差不齐**:经纪人使用的 Windows 设备可能运行 IE11、旧版 Edge、或未更新的 Chrome,导致 HTMX + Alpine.js 等现代前端技术出现兼容性问题,系统体验碎片化 +- **交付和部署门槛高**:IT 能力薄弱的经纪公司无法独立配置浏览器访问方式,URL 记忆成本高,容易访问错误版本 +- **版本管理缺失**:后端服务升级后,用户仍可能使用旧版缓存页面操作,导致接口不兼容和功能异常 +- **无官方入口**:用户通过私发链接访问系统,存在钓鱼仿冒风险,且无法统一品牌形象 + +### 目标用户 + +| 角色 | 使用场景 | 使用频率 | +|------|---------|----------| +| 一线经纪人 | 下载安装客户端、日常登录使用系统、接受自动更新 | 每日 | +| 店长/经理 | 同上 | 每日 | +| 系统管理员 | 发布新版本、管理安装包下载地址、监控客户端版本分布 | 按需 | +| IT 运维人员 | 维护更新服务器、签名证书、构建发布流水线 | 按发布周期 | + +### 核心痛点 + +1. **无法控制用户使用的浏览器环境**,兼容性问题无法从根源解决 +2. **升级依赖用户主动刷新浏览器**,后端 API 变更时旧客户端可能造成数据错误 +3. **缺乏官方分发渠道**,无法向终端用户传递信任感和版本一致性保障 +4. **SaaS 多租户管理系统需要统一、可控的客户端入口**,避免因客户端环境差异导致的支持成本上升 + +--- + +## 2. 目标与成功指标 + +| 目标 | 指标 | 当前基准 | 目标值 | 衡量周期 | +|------|------|---------|--------|---------| +| 消除浏览器兼容性问题 | 因浏览器兼容产生的支持工单数 | 待统计 | 降低 ≥ 90% | 上线后 60 天 | +| 提升版本一致性 | 在线用户中使用最新版本客户端的比例 | 0%(无客户端) | ≥ 95% | 版本发布后 7 天 | +| 降低部署门槛 | 新客户从获取安装包到完成首次登录的时间 | 无基准 | ≤ 10 分钟 | 上线后首批客户反馈 | +| 自动更新成功率 | 客户端自动更新完成率(收到更新通知 → 升级完成) | 无基准 | ≥ 98% | 每次版本发布后 48 小时 | + +--- + +## 3. 非目标(本期不做) + +- **不支持 macOS / Linux 客户端**:目标用户群体 99% 使用 Windows,macOS 版本为后续规划 +- **不支持移动端 App(iOS / Android)**:移动端为 v2 规划,本期不涉及 +- **不开发私有化部署的离线安装方案**:本期聚焦 SaaS 在线版,私有化部署另行规划 +- **不包含客户端内置的离线模式**:系统需联网使用,客户端不缓存业务数据供离线访问 +- **不包含客户端层面的安全加固(如代码混淆、反逆向)**:本期以功能交付为优先,安全加固列入后续迭代 + +--- + +## 4. 用户故事与验收标准 + +--- + +### Story 1:经纪人下载并安装客户端 + +**As** 一线经纪人,**I want** 通过公司提供的网址下载一个安装程序并完成安装,**So that** 我可以立即打开登录界面使用 Fonrey 系统,无需手动配置浏览器。 + +**验收标准**: +- [ ] 官方下载页面可通过指定 URL 访问,页面展示最新版本号、发布日期及下载按钮 +- [ ] 下载产物为单一 `.exe` 安装包(或免安装便携版 `.zip`),文件大小控制在合理范围内 +- [ ] 双击安装包后,安装向导步骤不超过 3 步(下一步 → 选择安装路径 → 安装),无需勾选额外组件 +- [ ] 安装完成后,桌面自动生成快捷方式(图标为 Fonrey 品牌 Logo) +- [ ] 首次启动后直接显示登录界面,无需用户手动输入任何 URL +- [ ] 安装包经过代码签名,Windows SmartScreen 不弹出"无法识别的应用"警告 +- [ ] 安装过程无需管理员权限(支持用户级安装到 `%APPDATA%` 目录),降低企业 IT 审批障碍 + +--- + +### Story 2:经纪人使用客户端正常登录并使用系统 + +**As** 一线经纪人,**I want** 打开客户端后直接访问 Fonrey 系统的完整功能,**So that** 我的日常使用体验与使用 Chrome 浏览器无差异,且不受本机安装的浏览器版本影响。 + +**验收标准**: +- [ ] 客户端内嵌现代 Chromium 内核(如基于 Electron 或 WebView2),版本不低于 Chromium 100,支持现代 Web 标准(ES2020、CSS Grid、Fetch API 等) +- [ ] HTMX 局部刷新、Alpine.js 状态交互、Tailwind CSS 样式在客户端中渲染效果与 Chrome 最新版一致 +- [ ] 支持 Cookie / Session 存储,登录状态在客户端关闭后保留(复用 Django Session 机制) +- [ ] 文件上传(图片、附件)、文件下载(Excel 导出)在客户端中正常工作 +- [ ] 客户端窗口支持最大化、最小化、拖拽调整大小,支持多显示器 +- [ ] 客户端标题栏显示应用名称和当前版本号(如:`Fonrey 房睿 v1.2.3`) +- [ ] 客户端不显示浏览器默认的地址栏、书签栏、扩展工具栏,保持沉浸式应用体验 + +--- + +### Story 3:客户端感知新版本并自动升级 + +**As** 一线经纪人,**I want** 客户端在有新版本时自动提示并完成升级,**So that** 我无需手动下载安装,始终使用最新版本,不会因版本落后导致功能异常。 + +**验收标准**: +- [ ] 客户端启动时及运行期间(每隔 4 小时)自动向更新服务器检查最新版本 +- [ ] 有新版本时,客户端右下角弹出非阻断式通知:"发现新版本 vX.X.X,点击立即更新",用户可选择"立即更新"或"稍后提醒" +- [ ] 点击"立即更新"后,客户端在后台静默下载更新包,进度条显示下载进度 +- [ ] 下载完成后提示用户"更新已就绪,重启客户端完成安装",用户选择"立即重启"或"下次启动时安装" +- [ ] 重启后,新版本生效,标题栏版本号更新,历史会话自动恢复(用户无需重新登录) +- [ ] 支持强制更新模式:服务端可标记某版本为"强制升级",客户端不展示"稍后提醒"选项,必须升级后方可继续使用(用于重大 API 兼容性变更场景) +- [ ] 更新失败时(网络中断、磁盘空间不足等),客户端显示错误提示并保持当前版本正常运行,不影响用户当前操作 + +--- + +### Story 4:系统管理员发布新版本 + +**As** 系统管理员,**I want** 通过管理后台上传新版客户端安装包并配置版本信息,**So that** 客户端能感知到更新并引导用户升级。 + +**验收标准**: +- [ ] 系统管理后台提供"客户端版本管理"页面(位于系统管理模块下) +- [ ] 支持上传 `.exe` 安装包,并填写版本号(遵循 SemVer:`X.Y.Z`)、版本说明(更新日志,支持 Markdown)、发布日期 +- [ ] 支持设置版本类型:普通更新 / 强制更新 +- [ ] 支持设置版本状态:草稿(不对外生效)/ 已发布 / 已下线 +- [ ] 发布后,更新服务器 API 即时返回最新版本信息,客户端下次检测时可感知 +- [ ] 支持版本回滚:将指定历史版本重新设为"已发布",自动将当前版本标记为已下线 +- [ ] 支持查看各版本的下载量和活跃客户端版本分布统计 + +--- + +### Story 5:管理员监控客户端版本分布 + +**As** 系统管理员,**I want** 查看当前所有在线客户端的版本分布情况,**So that** 了解升级覆盖率,对仍在使用旧版本的客户端发出提醒或强制升级。 + +**验收标准**: +- [ ] 客户端版本管理页面展示版本分布统计:各版本在线客户端数量及占比(饼图或条形图) +- [ ] 支持按租户维度查看版本分布(多租户场景下,区分不同经纪公司的版本使用情况) +- [ ] 支持对指定版本范围的用户推送"强制更新"通知(如:将所有低于 v1.5.0 的客户端标记为强制更新) + +--- + +## 5. 功能详细说明 + +### 5.1 技术架构选型 + +#### 5.1.1 客户端技术方案 + +基于 Fonrey 现有技术栈(Django + HTMX + Alpine.js + Tailwind CSS,后端已采用 Docker Compose 部署),客户端本质是一个**内嵌现代 Chromium 内核的原生 Windows 应用外壳(Shell)**,其核心职责是: + +1. 提供操作系统级原生窗口(标题栏、任务栏图标、托盘) +2. 内嵌高版本 Chromium 内核加载 Fonrey Web 应用 URL +3. 实现版本检测与自动更新逻辑 +4. 处理文件下载、本地存储等 OS 级能力 + +**推荐方案:Electron(主选)** + +| 维度 | Electron | Tauri | WebView2 封装 | +|------|---------|-------|--------------| +| 内核控制 | ✅ 捆绑 Chromium,100% 可控 | ❌ 依赖系统 WebView,版本不可控 | ⚠️ 依赖 Windows 内置 WebView2 Runtime | +| 包体大小 | ~150MB(可接受) | ~5MB | ~5MB | +| 生态成熟度 | ✅ 最成熟,社区最大 | ✅ 较新但活跃 | ⚠️ 微软官方但文档偏少 | +| 自动更新支持 | ✅ `electron-updater` 成熟方案 | ✅ 内置更新器 | ⚠️ 需自行实现 | +| 跨平台 | ✅ Win/Mac/Linux | ✅ | ❌ 仅 Windows | +| 团队技术匹配 | ✅ 主进程用 Node.js,渲染层纯 Web | ⚠️ 主进程需 Rust | ✅ 主进程用 C# | +| **推荐度** | **✅ 主选** | 次选 | 备选 | + +**选型决策**:采用 **Electron + electron-updater**。理由: + +- 内嵌 Chromium 内核是本需求的核心约束,Electron 是唯一能 100% 保证内核版本可控的主流方案 +- `electron-updater` 配合 GitHub Releases 或自建 S3/R2 存储可实现完整的版本管理与自动更新流程,开发成本最低 +- 渲染层完全复用 Fonrey 现有 Web 技术栈,无需新增前端框架学习成本 +- 团队具备 JavaScript/Node.js 能力,主进程开发门槛可控 + +**技术决策**:客户端不内置任何业务逻辑,所有业务功能由服务端 Fonrey Web 应用提供。客户端仅负责加载 Web 应用、更新管理和 OS 级能力(窗口、托盘、文件下载路径)。 + +--- + +#### 5.1.2 更新服务架构 + +更新机制采用**差量检测 + 全量包下载**模式: + +``` +客户端启动 / 定时检测(每4小时) + │ + ▼ +GET /api/client/updates/latest?platform=win32&arch=x64¤t_version=1.2.0 + │ + ▼ +更新服务器(Fonrey 后端 Django API) + 返回:{ latest_version, download_url, release_notes, force_update, checksum } + │ + ├── 无更新 → 继续正常运行 + │ + └── 有更新 → 弹出通知 + │ + ├── 用户点击"立即更新" → 后台下载 .exe / NSIS 更新包 + │ │ + │ └── 下载完成 → 校验 SHA256 → 提示重启安装 + │ + └── 用户选择"稍后" → 下次启动再提示 +``` + +**更新包存储**:上传至 Cloudflare R2(与现有对象存储一致),通过 Cloudflare CDN 加速下载,全国用户均可获得稳定下载速度。 + +**版本 API 端点**(新增至 Django 后端): + +| 端点 | 方法 | 说明 | +|------|------|------| +| `/api/client/updates/latest/` | GET | 客户端查询最新版本,返回版本信息和下载 URL | +| `/api/client/updates/` | GET | 管理端查询版本列表(需认证) | +| `/api/client/updates/` | POST | 管理端发布新版本(需管理员权限) | +| `/api/client/updates//` | PATCH | 管理端修改版本状态(发布/下线/强制) | + +--- + +#### 5.1.3 安装包签名与分发 + +**代码签名**: +- 使用 EV 代码签名证书(推荐购买 DigiCert 或 Sectigo EV 证书) +- 通过 `electron-builder` 在 CI/CD 构建时自动签名 +- 签名后安装包经 Windows SmartScreen 审核,用户安装时不触发安全警告 + +**安装包分发**: +- 官方下载页:独立 HTML 页面托管于 Cloudflare Pages 或 Nginx 静态站 +- 页面展示:最新版本号 + 发布日期 + 更新日志 + 下载按钮 +- 下载 URL 格式:`https://download.fonrey.com/releases/v1.2.3/fonrey-setup-1.2.3-win.exe` +- 同时提供便携版(Portable):`fonrey-portable-1.2.3-win.zip`,供无安装权限的企业环境使用 + +--- + +### 5.2 客户端功能规格 + +#### 5.2.1 主窗口 + +| 属性 | 规格 | +|------|------| +| 默认窗口尺寸 | 1280 × 800(最小:1024 × 600) | +| 标题栏 | 显示 `Fonrey 房睿 v{version}`,含原生最小化/最大化/关闭按钮 | +| 内嵌 URL | 启动时加载 `https://{tenant}.fonrey.com`(或私有化部署地址,可配置) | +| 地址栏 | 不显示(沉浸式应用模式) | +| 右键菜单 | 仅保留"复制"/"粘贴"/"检查元素(仅开发模式)",移除"查看源代码"等浏览器默认项 | +| 外部链接 | 点击 `target="_blank"` 链接时,在系统默认浏览器中打开,不在客户端内新窗口打开 | + +#### 5.2.2 系统托盘 + +| 功能 | 说明 | +|------|------| +| 托盘图标 | Fonrey Logo,鼠标悬停显示 `Fonrey 房睿 - 已连接` / `- 离线` | +| 右键菜单 | 打开主窗口 / 检查更新 / 关于 / 退出 | +| 最小化行为 | 点击关闭按钮时最小化至托盘(不退出程序),用户通过托盘图标恢复窗口 | + +#### 5.2.3 网络状态感知 + +| 状态 | 客户端行为 | +|------|-----------| +| 正常联网 | 加载 Fonrey Web 应用,状态栏显示"已连接" | +| 网络断开 | 显示全屏提示页:"网络连接已断开,请检查您的网络后重试",提供"重新连接"按钮 | +| 服务器维护 | 服务器返回 503 时,展示维护提示页(内容由服务端控制) | + +#### 5.2.4 文件下载处理 + +- Excel 导出等文件下载触发时,客户端调用系统原生"另存为"对话框,用户选择保存路径 +- 下载完成后,状态栏显示"下载完成,点击打开"提示,点击可直接打开文件 + +--- + +### 5.3 版本管理后台(系统管理模块新增页面) + +**页面路径**:系统管理 → 客户端发布管理 + +#### 5.3.1 版本列表 + +| 列 | 说明 | +|----|------| +| 版本号 | SemVer 格式,如 `v1.2.3` | +| 版本类型 | 普通更新 / 强制更新(红色标签) | +| 状态 | 草稿 / 已发布(绿色)/ 已下线(灰色) | +| 发布时间 | 版本设为已发布的时间 | +| 下载量 | 该版本安装包被下载次数 | +| 操作 | 发布 / 下线 / 编辑 / 复制下载链接 | + +#### 5.3.2 新增/编辑版本表单 + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| 版本号 | 文本输入 | 是 | 格式:`X.Y.Z`,自动校验 SemVer 格式 | +| 版本类型 | 单选 | 是 | 普通更新 / 强制更新 | +| 最低兼容版本 | 文本输入 | 否 | 低于该版本的客户端将被强制更新(如填写 `1.0.0`,则低于此版本的客户端强制升级) | +| 安装包(EXE) | 文件上传 | 是 | 上传至 Cloudflare R2,最大 500MB | +| 便携版(ZIP) | 文件上传 | 否 | 同上 | +| SHA256 校验值 | 文本输入(自动填充) | 是 | 上传后系统自动计算并填充,用于客户端下载完成后校验完整性 | +| 更新日志 | Markdown 文本区域 | 是 | 展示给用户看的版本说明,最多 2000 字 | +| 发布说明(内部) | 文本区域 | 否 | 仅内部查看的技术说明,不对外展示 | +| 状态 | 单选 | 是 | 草稿 / 立即发布 | + +#### 5.3.3 版本分布统计 + +| 图表 | 说明 | +|------|------| +| 版本分布饼图 | 按客户端版本号统计当前活跃用户数量及占比 | +| 升级进度趋势图 | 新版本发布后,各天累计升级完成的用户比例(折线图) | +| 租户版本明细 | 按租户(经纪公司)展示其员工的客户端版本分布 | + +--- + +### 5.4 更新 API 规格 + +#### GET `/api/client/updates/latest/` + +**请求参数(Query String)**: + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `platform` | string | 是 | 平台标识,如 `win32` | +| `arch` | string | 是 | CPU 架构,如 `x64` / `arm64` | +| `current_version` | string | 是 | 客户端当前版本号,如 `1.2.0` | + +**响应示例(有新版本)**: + +```json +{ + "has_update": true, + "latest_version": "1.3.0", + "force_update": false, + "download_url": "https://download.fonrey.com/releases/v1.3.0/fonrey-setup-1.3.0-win.exe", + "portable_url": "https://download.fonrey.com/releases/v1.3.0/fonrey-portable-1.3.0-win.zip", + "checksum_sha256": "a1b2c3d4...", + "release_notes": "## v1.3.0 更新内容\n- 新增客源智能配房功能\n- 修复房源列表筛选条件保存异常", + "release_date": "2026-05-01" +} +``` + +**响应示例(已是最新)**: + +```json +{ + "has_update": false, + "latest_version": "1.3.0" +} +``` + +--- + +## 6. 技术实现注意事项 + +### 6.1 依赖关系 + +| 依赖项 | 说明 | 负责方 | 风险等级 | +|--------|------|--------|---------| +| Electron 框架 | 客户端技术基础,需评估 License(MIT,商业可用) | 前端/客户端工程师 | 低 | +| EV 代码签名证书 | 需提前申请,EV 证书审核周期 1-2 周 | IT/运维 | 中(需提前排期) | +| Cloudflare R2 存储桶 | 存放安装包,利用现有账号新增 bucket | 运维 | 低 | +| `electron-updater` | 自动更新库,需配合更新 API 端点实现 | 客户端工程师 | 低 | +| Django 更新 API | 新增 `/api/client/updates/` 相关接口 | 后端工程师 | 低 | +| CI/CD 构建流水线 | 自动构建、签名、上传安装包 | 运维/DevOps | 中 | + +### 6.2 已知风险 + +| 风险 | 可能性 | 影响 | 缓解措施 | +|------|--------|------|---------| +| EV 证书申请延迟 | 中 | 高(无签名包无法正常分发) | MVP 阶段可使用普通 OV 证书临时过渡,但需向用户说明安全警告原因 | +| Electron 包体过大导致下载放弃 | 低 | 中 | 使用 `electron-builder` 的 `asar` 压缩 + 分片下载;首包控制在 150MB 以内 | +| 企业网络拦截 CDN 下载 | 中 | 中 | 提供备用下载 URL(直连服务器),支持客户手动下载后本地安装 | +| 自动更新期间用户强制关闭 | 低 | 低 | 更新包下载完成后才替换原文件,下载中断不影响现有版本正常运行 | +| 多租户场景下 URL 配置问题 | 低 | 高 | 客户端启动时加载的 URL 通过配置文件指定,支持定制化部署;SaaS 版统一指向主域名 | + +### 6.3 开放问题(开发启动前必须解决) + +- [ ] **租户 URL 如何分发到客户端?** 选项 A:客户端硬编码主域名,由服务端重定向到租户子域(`fonrey.com` → `{tenant}.fonrey.com`);选项 B:安装包内置配置文件,由销售/运维在分发给客户前填写租户子域。——**Owner**: 产品 + 工程 **Deadline**: 开发启动前 +- [ ] **代码签名证书采购主体和预算是否确认?** — **Owner**: IT 负责人 **Deadline**: 立项后 1 周 +- [ ] **CI/CD 平台选型是否确定?**(GitHub Actions / Jenkins / 其他)— **Owner**: 运维负责人 **Deadline**: 开发启动前 +- [ ] **便携版(Portable ZIP)是否纳入 v1 范围?** 便携版可解决企业无安装权限场景,但增加测试成本。— **Owner**: PM **Deadline**: 立项后 1 周 + +--- + +## 7. 发布计划 + +| 阶段 | 时间 | 受众 | 成功门槛 | +|------|------|------|---------| +| 内部 Alpha | 开发完成后 1 周 | 内部团队 + 1 家种子客户 | 核心流程无 P0 Bug,自动更新机制验证通过 | +| 封闭 Beta | Alpha + 2 周 | 3-5 家头部客户 | 安装成功率 ≥ 95%,自动更新成功率 ≥ 95%,无 P0/P1 Bug | +| 正式发布(GA) | Beta + 1 周 | 全部客户 | Beta 阶段目标达成 | + +**回滚标准**:若正式发布后 24 小时内出现以下情况,立即下线该版本并恢复上一稳定版本为"已发布": +- 自动更新失败率 > 5% +- 客户端白屏/崩溃率 > 2% +- 收到 P0 级安全漏洞报告 + +--- + +## 8. 附录 + +### 8.1 竞品参考 + +| 产品 | 客户端方案 | 更新机制 | +|------|-----------|---------| +| 企业微信 | Electron + 自研内核 | 强制更新,启动时自动下载 | +| 飞书 | Electron | 后台静默更新,重启生效 | +| 钉钉 | Electron | 同上 | + +> 房产经纪行业的竞品(如房客多、云客优)均采用 Electron 方案,验证了技术路线的合理性。 + +### 8.2 术语表 + +| 术语 | 定义 | +|------|------| +| SemVer | 语义化版本控制(Semantic Versioning):`主版本号.次版本号.补丁号`,如 `1.2.3` | +| Electron | 由 GitHub 开发的开源框架,允许使用 Web 技术(HTML/CSS/JS)构建跨平台桌面应用,内嵌 Chromium 和 Node.js | +| electron-updater | Electron 生态中成熟的自动更新库,支持增量更新和全量更新 | +| EV 证书 | Extended Validation 代码签名证书,由 CA 机构颁发,可消除 Windows SmartScreen 安全警告 | +| SHA256 | 安全散列算法,用于验证下载文件的完整性,防止篡改或下载损坏 | +| Portable | 便携版,无需安装,解压即用,适合无管理员权限的企业环境 | diff --git a/Project/fonrey/PRD/客源管理/客源管理模块PRD.md b/Project/fonrey/PRD/客源管理/客源管理模块PRD.md index c306096d..fe7523c2 100644 --- a/Project/fonrey/PRD/客源管理/客源管理模块PRD.md +++ b/Project/fonrey/PRD/客源管理/客源管理模块PRD.md @@ -1942,6 +1942,134 @@ --- +## 6. 技术考量 + +### 6.0 核心技术设计 + +#### 6.0.1 客源状态机 + +客源在生命周期内的状态流转是系统的核心业务逻辑,必须在后端通过状态机严格控制,禁止跨状态直接跳转。 + +``` + ┌─────────────────────────────────────────┐ + │ ▼ + [录入] ──► 私客(求购/求租/暂缓)──► 公客 ──► 成交客 + │ │ + │ 手动转公/自动掉公 │ 转私客(若有权限) + │ │ + ▼ ▼ + 无效客 无效客 +``` + +| 状态 | 允许流转目标 | 触发方式 | +|------|------------|---------| +| 私客(求购) | 求租、暂缓、公客、成交客、无效 | 手动操作 / 掉公规则 | +| 私客(求租) | 求购、暂缓、公客、成交客、无效 | 手动操作 / 掉公规则 | +| 私客(暂缓) | 求购、求租、公客、无效 | 手动操作 | +| 公客 | 无效 | 手动操作(暂不支持公转私) | +| 成交客 | — | 终态,不可流转 | +| 无效客 | — | 终态,不可流转 | + +**实现要求**: +- 所有状态变更须通过后端 API 的状态机校验,前端不直接修改状态字段 +- 每次状态变更自动写入 `ClientStatusChangeLog` 审计表(变更人、变更前后状态、时间、理由) +- 状态变更失败须返回明确错误码,前端展示友好提示 + +--- + +#### 6.0.2 重复客源检测算法 + +重复检测是客源管理的核心数据质量保障。采用**异步检测 + 前端提示**策略,不阻塞录入流程。 + +**检测触发时机**: +1. 录入时:提交表单后,后端异步触发检测,结果以橙色提示横幅展示 +2. 编辑手机号时:号码变更保存后重新触发 +3. 批量导入后:全量扫描,生成重复报告 + +**去重匹配规则(按优先级)**: + +| 优先级 | 匹配维度 | 匹配逻辑 | 说明 | +|--------|---------|---------|------| +| P0 | 手机号精确匹配 | `phone_normalized = normalize(input_phone)` | 去除空格、+86、国际区号后精确比对 | +| P1 | 手机号模糊匹配 | 去除格式差异后匹配 | 处理 `135****8888` 与 `13500008888` 等录入差异 | +| P2 | 姓名 + 意向商圈组合 | 同名 + 相同意向区域 | 辅助人工判断,不自动合并 | + +**去重处理规则**: +- **私客与私客重复**:提示「该手机号已存在于 [员工姓名] 名下私客,请确认是否为同一客户」,由操作人决定是否继续录入或转为该员工协作方 +- **私客与公客重复**:提示「该手机号已在公客池中,请确认业务归属后操作」 +- **合并客户**:合并以**首录时间更早**的记录为主数据,跟进记录、带看记录全部合并至主记录,被合并记录保留为「已合并」历史副本,不可恢复 + +**数据模型**: +```python +class ClientDuplicateLog(TenantModel): + source_client = ForeignKey(Client, related_name='duplicate_source') + target_client = ForeignKey(Client, related_name='duplicate_target') + match_type = CharField(choices=['phone_exact', 'phone_fuzzy', 'name_area']) + detected_at = DateTimeField(auto_now_add=True) + resolved_by = ForeignKey(User, null=True) + resolution = CharField(choices=['merged', 'ignored', 'pending']) +``` + +--- + +#### 6.0.3 私客掉公(自动转公)机制 + +掉公规则由运营配置,初期建议默认值如下(待业务确认后写入系统配置模块): + +| 触发条件 | 默认值 | 是否可配置 | +|---------|--------|----------| +| 私客无跟进天数 | 30 天 | 是(系统配置模块) | +| 触发检测频率 | 每日凌晨 02:00 Celery 定时任务 | 否 | +| 提前预警天数 | 到期前 3 天,系统消息通知归属人 | 是 | + +**掉公流程**: +``` +Celery Beat(每日 02:00) + └─► 扫描:last_follow_up_at < NOW() - 掉公天数 AND status='private' + └─► 批量更新状态为 'public' + └─► 写入 ClientStatusChangeLog(operator='system') + └─► 触发消息推送:「您的 N 个客源已自动转入公客池」 +``` + +**边界情况**: +- 暂缓状态的私客**不参与**掉公计算 +- 成交客、无效客**不参与**掉公计算 +- 掉公后归属人变更为 `NULL`,首录人保留 + +--- + +#### 6.0.4 敏感号码权限与留痕 + +手机号码为核心敏感数据,访问须满足以下要求: + +| 场景 | 展示方式 | 查看权限 | 留痕要求 | +|------|---------|---------|---------| +| 列表页 | `+86 135****8888` 打码 | 无需额外权限 | 不留痕 | +| 详情页联系人面板 | `+86 135****8888` 打码 | 无需额外权限 | 不留痕 | +| 点击「查看号码」 | 展示完整号码 10 秒后重新打码 | 需「查看客源完整号码」权限 | **必须留痕**:写入操作日志 | +| 编辑联系人 | 打码显示 + 「查看号码」链接 | 查看需权限,编辑需「编辑客源联系人」权限 | 查看留痕 | + +**实现要求**: +- 号码存储使用字段级加密(AES-256),与房源模块同等安全标准 +- 查看完整号码的 API 须独立端点(不含在标准详情接口内),方便审计 +- 操作日志异步写入,不影响查看响应时间 + +--- + +#### 6.0.5 列表性能策略 + +当前截图显示公客池已有 28,878 条,私客总量持续增长,列表性能须在设计阶段预防: + +| 策略 | 说明 | +|------|------| +| 服务端分页 | 所有列表接口默认 20 条/页,禁止前端全量加载 | +| 筛选条件下推 | 所有筛选条件传至 Django ORM,生成 SQL WHERE 子句,不做内存过滤 | +| 索引设计 | 联合索引:`(tenant_id, status,归属人, 最后跟进时间)`;手机号哈希索引(辅助去重查询) | +| 慢查询监控 | 超过 500ms 的查询写入慢日志,上线前需通过 EXPLAIN ANALYZE 验证核心列表查询 | +| 智能配房批量计算 | 不在请求链路内实时计算,通过 Celery 定时或客源更新时异步触发,结果缓存至 Redis | + +--- + ### 6.1 依赖关系 | 系统/模块 | 依赖原因 | 优先级风险 | diff --git a/Project/fonrey/PRD/权限管理/权限管理模块PRD.md b/Project/fonrey/PRD/权限管理/权限管理模块PRD.md index 75fb5106..b0140d83 100644 --- a/Project/fonrey/PRD/权限管理/权限管理模块PRD.md +++ b/Project/fonrey/PRD/权限管理/权限管理模块PRD.md @@ -43,7 +43,7 @@ ## 3. 非目标(本期不做) -- 不包含细化到行级(Row-level)的数据权限(如仅允许查看特定小区的房源),本期数据范围控制以「本人 / 本部门 / 全公司」三档为主 +- 不包含细化到行级(Row-level)的数据权限(如仅允许查看特定小区的房源);本期数据范围控制采用**五档模型**:本人 / 本组 / 本门店 / 本区域 / 全公司。注意:并非所有权限项均开放五档,各项的实际可选范围以权限编辑页的下拉配置为准(例如某些权限项仅提供「本人 / 本门店 / 全公司」三个选项) - 不包含权限申请审批工作流(员工自助申请权限需上级审批),本期由管理员直接操作 - 不包含操作日志的可视化看板(日志写入,查询能力在后续版本规划) - 不包含 IP 白名单、登录时段等安全策略配置(安全策略模块另行规划) diff --git a/Project/fonrey/PRD/系统管理/系统管理模块PRD.md b/Project/fonrey/PRD/系统管理/系统管理模块PRD.md index 7d85a7a2..233086d6 100644 --- a/Project/fonrey/PRD/系统管理/系统管理模块PRD.md +++ b/Project/fonrey/PRD/系统管理/系统管理模块PRD.md @@ -1,36 +1,26 @@ # PRD:系统管理模块(Admin & System Management) -**Status**: Draft -**Author**: Alex (Product Manager) -**Last Updated**: 2026-04-24 -**Version**: 1.0 -**Stakeholders**: 工程负责人、运营团队、安全合规、客户成功团队 - ---- - -## 0. 模块定位与背景 - -Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-tenants` 实现 PostgreSQL Schema 级别的多租户隔离。随着平台商业化推进,运营团队需要一套独立的管理后台(Admin Console)来管理租户生命周期、系统升级、备份恢复及合规审计。 - -**核心问题**:平台运营团队当前缺乏统一的工具来: - -1. 管理数百家经纪公司(租户)的开通、暂停、注销流程 -2. 在不中断服务的前提下对平台进行版本升级与灰度发布 -3. 应对数据灾难场景(数据误删、升级失败)时快速恢复 -4. 满足合规要求,对所有高危操作留存完整审计轨迹 - -**本模块不解决**: - -- 租户内部的业务功能(房源、客源、楼盘管理)——已在各自 PRD 中覆盖 -- 移动端管理能力——v2 规划 -- 财务收费与发票系统——独立财务模块 -- 自动化客服与工单系统——独立支持模块 +**状态**:Draft +**作者**:产品经理 +**最后更新**:2026-04-24 +**版本**:v1.0 +**利益相关方**:工程负责人、运营团队、安全合规、客户成功团队 --- ## 1. 问题陈述 -### 1.1 核心痛点 +### 1.1 背景 + +Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-tenants` 实现 PostgreSQL Schema 级别的多租户隔离。随着平台商业化推进,运营团队需要一套独立的管理后台(Admin Console)来管理租户生命周期、系统升级、备份恢复及合规审计。 + +**本模块解决的核心问题**:平台运营团队当前缺乏统一的工具来: +1. 管理数百家经纪公司(租户)的开通、暂停、注销流程 +2. 在不中断服务的前提下对平台进行版本升级与灰度发布 +3. 应对数据灾难场景(数据误删、升级失败)时快速恢复 +4. 满足合规要求,对所有高危操作留存完整审计轨迹 + +### 1.2 核心痛点 | 痛点 | 影响方 | 当前代价 | |------|--------|---------| @@ -39,7 +29,7 @@ Fonrey 是一套面向房产经纪公司的 B2B SaaS 平台,采用 `django-ten | 数据备份无策略,灾难恢复依赖人工 | 平台稳定性 | 数据丢失风险 | | 高危操作无审计日志,合规风险暴露 | 管理层/合规 | 法律与客户信任风险 | -### 1.2 目标用户 +### 1.3 目标用户 | 角色 | 使用场景 | 频率 | | --------------------------- | ----------- | ------ | diff --git a/Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md b/Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md index 910531ae..011533e2 100644 --- a/Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md +++ b/Project/fonrey/PRD/组织人事管理/组织人事管理模块PRD.md @@ -465,7 +465,127 @@ --- -## 6. 上线计划 +## 6. 技术考量 + +### 6.1 依赖关系 + +| 系统/模块 | 依赖原因 | 优先级风险 | +|-----------|---------|-----------| +| 登录管理模块 | 员工账号的创建、冻结、密码重置由登录模块提供接口 | 高 | +| 权限管理模块 | 员工的角色/权限分配在人事模块发起,权限模块执行 | 高 | +| 系统配置模块 | 职务类别、部门级别、奖惩类型等枚举值从系统配置读取 | 中 | + +### 6.2 核心技术设计 + +#### 6.2.1 组织树存储方案 + +采用 **Closure Table(闭包表)** 存储多层级部门树,最大支持 8 层嵌套: + +| 方案 | 优点 | 缺点 | 选用理由 | +|------|------|------|---------| +| Adjacency List | 写入简单 | 递归查询慢,需多次 SQL | ❌ 不适合 8 层嵌套 | +| Nested Set | 读取极快 | 写入时需重排序,高并发写冲突大 | ❌ 人事模块写入频繁 | +| **Closure Table** | 读写均衡,查询任意层级 O(1) | 存储量略多 | ✅ **选用** | + +**数据结构**: +```python +class OrgUnit(TenantModel): # 部门节点 + id = UUIDField(primary_key=True) + name = CharField(max_length=100) + level = CharField(choices=['事业部','大区','区域','片区','门店','店组','职能']) + parent = ForeignKey('self', null=True, on_delete=PROTECT) # 直接父节点 + is_direct = BooleanField(default=True) # True=直营, False=加盟 + deleted_at = DateTimeField(null=True) + +class OrgUnitClosure(TenantModel): # 闭包表 + ancestor = ForeignKey(OrgUnit, related_name='descendants') + descendant = ForeignKey(OrgUnit, related_name='ancestors') + depth = IntegerField() # 0=自身, 1=子, 2=孙... +``` + +**查询示例**: +- 查某节点所有子孙:`WHERE ancestor_id = X AND depth > 0` +- 查某节点完整路径:`WHERE descendant_id = X ORDER BY depth DESC` +- 移动节点:删除旧闭包记录 + 插入新闭包记录(事务内执行) + +#### 6.2.2 员工状态机 + +员工在系统内的状态须通过后端状态机严格控制: + +``` +[录入] ──► 试用期 ──► 正式 ──► 离职 + │ │ + └──────────────┘ + 复职 + │ + ▼ + 试用期 / 正式(恢复上次状态) +``` + +| 状态 | 允许流转目标 | 触发方式 | +|------|------------|---------| +| 试用期 | 正式、离职 | 管理员手动操作 | +| 正式 | 离职 | 管理员手动操作 | +| 离职 | 复职 | 管理员手动操作 | +| 冻结 | 启用(需先恢复员工状态) | 账号冻结操作 | + +**实现要求**: +- 每次状态变更写入 `StaffChangeLog`(异动记录表),字段包含:变更人、变更类型、变更前后值、变更时间、备注 +- 员工离职时,系统自动:① 冻结关联登录账号 ② 解除权限角色 ③ 归属客源触发掉公检查 +- 员工状态变更失败返回明确错误码,前端展示友好提示 + +#### 6.2.3 异动记录审计策略 + +异动记录为**只追加(append-only)**设计,不支持修改或删除: + +| 异动类型枚举 | 触发场景 | +|------------|---------| +| 入职 | 员工首次录入系统 | +| 转正 | 试用期转为正式员工 | +| 调岗 | 员工所属部门变更 | +| 上级变动 | 直接上级变更 | +| 离职 | 办理离职手续 | +| 复职 | 离职员工重新入职 | +| 账号冻结 | 账号被冻结 | +| 账号启用 | 账号从冻结恢复 | + +```python +class StaffChangeLog(TenantModel): + staff = ForeignKey(Staff) + change_type = CharField(choices=[...]) # 见枚举表 + before_value = JSONField(null=True) # 变更前状态快照 + after_value = JSONField(null=True) # 变更后状态快照 + operator = ForeignKey(User) + remark = TextField(blank=True) + created_at = DateTimeField(auto_now_add=True) + # 无 updated_at / deleted_at — append-only +``` + +#### 6.2.4 敏感数据脱敏 + +| 数据 | 存储方式 | 展示方式 | 查看权限 | +|------|---------|---------|---------| +| 手机号 | AES-256-GCM 加密 + SHA-256 哈希索引 | `159****9696` | 需「查看员工手机号」权限,留操作日志 | +| 证件号码 | AES-256-GCM 加密 | `410***********3037` | 需「查看员工证件」权限,留操作日志 | +| 通讯录号码 | AES-256-GCM 加密 | 脱敏显示 | 点击「查看号码」后临时展示,留痕 | + +### 6.3 已知风险 + +| 风险 | 可能性 | 影响 | 缓解措施 | +|------|--------|------|---------| +| 大型机构部门树深度超过 8 层 | 低 | 中 | 前端录入时限制最大深度,超出提示联系运营调整 | +| 员工大批量导入时账号创建并发冲突 | 中 | 中 | 批量导入走 Celery 异步任务,序列化账号创建 | +| 组织调整时历史客源/房源归属关系错乱 | 中 | 高 | 员工调岗不改变现有资源归属,仅更新组织关系;业务重新分配由管理员手动操作 | + +### 6.4 待确认问题 + +- [ ] 员工工号规则:系统自动生成还是管理员手动填写?格式约定是什么? — 待业务确认 — 开发前必须明确 +- [ ] 「复职」时是否复用原有账号?还是重新创建新账号? — 待产品/法务确认 +- [ ] 部门移动操作(将某节点及其子树挂到新父节点)是否在 MVP 范围内? — 待产品确认 + +--- + +## 7. 上线计划 | 阶段 | 时间 | 受众 | 验收门槛 | |------|------|------|----------| diff --git a/Project/fonrey/TECH_STACK/API_CONTRACT.md b/Project/fonrey/TECH_STACK/API_CONTRACT.md index 9881ded8..15635155 100644 --- a/Project/fonrey/TECH_STACK/API_CONTRACT.md +++ b/Project/fonrey/TECH_STACK/API_CONTRACT.md @@ -2,10 +2,10 @@ # Fonrey API 契约规范(API_CONTRACT) -**版本**: 1.0 +**版本**: 1.1 **适用范围**: 全模块(account / permission / property / client / complex / org / setting) **关联总纲**: `TECH_STACK/TECH_STACK.md` -**最后更新**: 2026-04-27 +**最后更新**: 2026-04-28 --- @@ -285,3 +285,183 @@ Fonrey 优先采用“预签名上传 + 回执提交(commit)”两段式。 - [ ] 下载是否采用 job 流程并处理未就绪 409 - [ ] 权限拒绝是否遵循 200/403/302(401) 三态 - [ ] 测试是否覆盖契约关键路径 +- [ ] 所有视图是否附加 `@extend_schema`(或 `@extend_schema_view`)注解 +- [ ] 枚举字段是否通过 `OpenApiTypes` 或 `ChoiceField` 在 Schema 中完整暴露所有值 +- [ ] 生成的 `openapi.json` 是否已提交 / 与代码同步更新 +- [ ] `schemathesis` 契约测试是否纳入 CI(至少覆盖 Positive 用例) + +--- + +## 11. OpenAPI 落地规范(机器可读契约) + +> **For AI assistants**: §11 是实现层强约定。生成视图代码时必须同步写 @extend_schema;生成测试代码时必须包含契约断言。 + +### 11.1 工具链(MUST) + +| 角色 | 工具 | 说明 | +|---|---|---| +| Schema 生成 | `drf-spectacular` | 唯一授权的 OpenAPI 生成库;禁止 drf-yasg | +| Schema 文件 | `openapi.json`(根目录) | 每次 CI 必须重新生成并 diff 检查 | +| 契约测试 | `schemathesis` | 基于生成 Schema 做 Positive + Negative 测试 | +| 文档 UI | Swagger UI(`/api/docs/`) | 开发环境默认开启,生产环境按需 | + +安装: +```bash +pip install drf-spectacular schemathesis +``` + +`settings.py` 最低配置: +```python +INSTALLED_APPS += ["drf_spectacular"] + +SPECTACULAR_SETTINGS = { + "TITLE": "Fonrey API", + "VERSION": "1.1.0", + "SERVE_INCLUDE_SCHEMA": False, + "SCHEMA_PATH_PREFIX": r"/api/", + # 枚举值直接展开(不折叠成 $ref),便于 AI agent 直接读值 + "ENUM_GENERATE_CHOICE_DESCRIPTION": True, + "COMPONENT_SPLIT_REQUEST": True, +} +``` + +`urls.py`: +```python +from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView + +urlpatterns += [ + path("api/schema/", SpectacularAPIView.as_view(), name="schema"), + path("api/docs/", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger-ui"), +] +``` + +### 11.2 视图注解规范(MUST) + +每个 `APIView` / `ViewSet` 动作 MUST 携带 `@extend_schema`,最低包含: + +```python +from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample +from drf_spectacular.types import OpenApiTypes + +@extend_schema( + summary="获取房源详情", # 简短操作名(中文 OK) + tags=["property"], # 模块 tag,与路由前缀一致 + responses={200: PropertyDetailSerializer}, + # 失败响应也要声明,给 AI agent 提供完整错误路径 + responses={ + 200: PropertyDetailSerializer, + 403: OpenApiTypes.OBJECT, # 统一 error envelope + 404: OpenApiTypes.OBJECT, + }, +) +def retrieve(self, request, pk=None): + ... +``` + +枚举字段 MUST 在 Serializer 中使用 `ChoiceField` 并指定 `choices`,`drf-spectacular` 会自动生成 `enum` 约束: + +```python +from ENUMS import PropertyType # 取自项目枚举常量 + +class PropertySerializer(serializers.Serializer): + property_type = serializers.ChoiceField( + choices=PropertyType.choices, + help_text="房源类型(详见 DATA_MODEL/ENUMS.md § property.property_type)" + ) +``` + +分页/筛选端点额外声明 `parameters`: + +```python +@extend_schema( + parameters=[ + OpenApiParameter("cursor", OpenApiTypes.STR, description="Keyset 游标,首页传 null"), + OpenApiParameter("limit", OpenApiTypes.INT, description="每页条数,最大 100"), + OpenApiParameter("status", OpenApiTypes.STR, description="状态筛选,多选用逗号分隔"), + ] +) +``` + +### 11.3 Schema 文件管理(MUST) + +CI pipeline MUST 包含以下步骤,防止 Schema 与代码漂移: + +```bash +# 生成最新 Schema +python manage.py spectacular --color --file openapi.json + +# diff 检查(有变更时 CI 提醒,但不阻断 — 由开发者 review 后提交) +git diff --exit-code openapi.json || echo "⚠️ openapi.json has changed — please review and commit" +``` + +- `openapi.json` MUST 纳入版本控制(不加入 `.gitignore`) +- 合并 PR 时若 `openapi.json` 有非预期变更,MUST 作为 Review 阻断项 + +### 11.4 契约测试规范(MUST) + +使用 `schemathesis` 对每个模块做 Positive 路径覆盖,最低要求: + +```bash +# 对本地运行的 dev server 跑契约测试 +schemathesis run openapi.json \ + --base-url http://localhost:8000 \ + --auth-header "Authorization: Bearer $TEST_TOKEN" \ + --checks status_code_conformance response_schema_conformance \ + --tag property # 可按模块 tag 分批跑 +``` + +CI 集成示例(GitHub Actions): + +```yaml +- name: Contract Tests + run: | + python manage.py spectacular --file openapi.json + schemathesis run openapi.json \ + --base-url http://localhost:8000 \ + --checks status_code_conformance response_schema_conformance \ + --exitfirst # 首个失败即停止 +``` + +**AI Agent 验收词(Acceptance Criteria)**:实现任意 API 端点后,须能通过以下验证: + +``` +GIVEN openapi.json 已重新生成 +WHEN schemathesis 对该端点执行 Positive 测试 +THEN status_code_conformance PASS(响应码与 Schema 声明一致) + AND response_schema_conformance PASS(响应体结构与 Serializer 一致) + AND 所有枚举字段值落在 ENUMS.md 定义的合法值集合内 +``` + +### 11.5 枚举值契约一致性(MUST) + +`ENUMS.md` 是枚举的单一事实来源(Source of Truth)。项目 MUST 维护一个 `enums.py`(或按模块拆分),与 `ENUMS.md` 保持同步: + +```python +# fonrey/core/enums.py — 机器可读枚举常量,与 ENUMS.md 严格对齐 +from django.db import models + +class PropertyType(models.TextChoices): + RESIDENTIAL = "residential", "住宅" + COMMERCIAL = "commercial", "商业" + OFFICE = "office", "办公" + INDUSTRIAL = "industrial", "工业" + LAND = "land", "土地" + OTHER = "other", "其他" +``` + +AI agent 实现时验证词: + +``` +GIVEN enums.py 中某枚举类的所有 value +WHEN 与 ENUMS.md 对应域的值列表对比 +THEN 两侧完全一致(无多余值,无缺失值,大小写相同) +``` + +### 11.6 分阶段落地路线(参考) + +| 阶段 | 目标 | 完成标志 | +|---|---|---| +| **P0 接入** | 安装 drf-spectacular,生成首版 `openapi.json`,Swagger UI 可访问 | `/api/docs/` 正常渲染,无 import 报错 | +| **P1 注解补全** | 所有现有视图加 `@extend_schema`,枚举字段用 ChoiceField | `openapi.json` 无 `{}` 空 Schema;所有端点有 `summary` 和 `tags` | +| **P2 契约测试** | schemathesis 纳入 CI,Positive 用例全绿 | CI status_code + response_schema 两项检查全 PASS | +| **P3 持续守护** | openapi.json diff 纳入 PR Review;枚举值变更同步 enums.py | PR checklist 自动提醒 Schema 变更 | diff --git a/Project/fonrey/UI_DESIGN/UI_设计任务总表.md b/Project/fonrey/UI_DESIGN/UI_设计任务总表.md index 897f5455..1dc499ca 100644 --- a/Project/fonrey/UI_DESIGN/UI_设计任务总表.md +++ b/Project/fonrey/UI_DESIGN/UI_设计任务总表.md @@ -24,35 +24,33 @@ 5. 我按反馈修改静态页 + 回写 UI.md 6. 该任务标记为 `已完成` -> 设计基线:所有新页面默认包含 **Light / Dark / System** 主题切换方案与状态说明。 - --- ## 3) P0 缺口任务(按优先级执行) -| 序号 | 优先级 | 模块 | 覆盖 US | UI.md 目标文件 | HTML 目标文件 | 当前状态 | 下一步 | -|---|---|---|---|---|---|---|---| -| 01 | P0-A | 登录管理 | US-ACCOUNT-001~003 | `UI_DESIGN/登录管理/登录_UI.md` | `UI_DESIGN/登录_UI.html` | 待评审 | 你评审登录 UI.md + 静态页,给我反馈我再迭代 | -| 02 | P0-A | 房源管理(新增) | US-PROPERTY-001 | `UI_DESIGN/房源管理/新增房源_UI.md` | `UI_DESIGN/新增房源_UI.html` | 待设计 | 完成任务01后开始 | -| 03 | P0-A | 房源管理(详情) | US-PROPERTY-003~008 | `UI_DESIGN/房源管理/房源详情_UI.md` | `UI_DESIGN/房源详情_UI.html` | 待设计 | 完成任务02后开始 | -| 04 | P0-B | 楼盘管理(列表) | US-COMPLEX-002 | `UI_DESIGN/楼盘管理/楼盘列表_UI.md` | `UI_DESIGN/楼盘列表_UI.html` | 待设计 | 完成任务03后开始 | -| 05 | P0-B | 楼盘管理(详情/维护) | US-COMPLEX-001 | `UI_DESIGN/楼盘管理/楼盘详情_UI.md` | `UI_DESIGN/楼盘详情_UI.html` | 待设计 | 完成任务04后开始 | -| 06 | P0-B | 楼盘管理(区域) | US-COMPLEX-003 | `UI_DESIGN/楼盘管理/区域管理_UI.md` | `UI_DESIGN/区域管理_UI.html` | 待设计 | 完成任务05后开始 | -| 07 | P0-C | 组织人事 | US-ORG-001~003 | `UI_DESIGN/组织人事管理/组织人事_UI.md` | `UI_DESIGN/组织人事_UI.html` | 待设计 | 完成任务06后开始 | -| 08 | P0-C | 权限管理 | US-PERMISSION-001~005 | `UI_DESIGN/权限管理/权限管理_UI.md` | `UI_DESIGN/权限管理_UI.html` | 待设计 | 完成任务07后开始 | -| 09 | P0-C | 系统配置 | US-SETTING-001-A/B/C | `UI_DESIGN/系统配置/系统配置_UI.md` | `UI_DESIGN/系统配置_UI.html` | 待设计 | 完成任务08后开始 | +| 序号 | 优先级 | 模块 | 覆盖 US | UI.md 目标文件 | HTML 目标文件 | 当前状态 | 下一步 | +| --- | ---- | ----------- | --------------------- | ----------------------------- | ------------------------ | ---- | --------------------------- | +| 01 | P0-A | 登录管理 | US-ACCOUNT-001~003 | `UI_DESIGN/登录管理/登录_UI.md` | `UI_DESIGN/登录_UI.html` | 待评审 | 你评审登录 UI.md + 静态页,给我反馈我再迭代 | +| 02 | P0-A | 房源管理(新增) | US-PROPERTY-001 | `UI_DESIGN/房源管理/新增房源_UI.md` | `UI_DESIGN/新增房源_UI.html` | 已完成 | 已完成评审迭代(壳层/按钮/结构一致化),进入任务03 | +| 03 | P0-A | 房源管理(详情) | US-PROPERTY-003~008 | `UI_DESIGN/房源管理/房源详情_UI.md` | `UI_DESIGN/房源详情_UI.html` | 待评审 | 你评审房源详情 UI.md + 静态页,给我反馈我再迭代 | +| 04 | P0-B | 楼盘管理(列表) | US-COMPLEX-002 | `UI_DESIGN/楼盘管理/楼盘列表_UI.md` | `UI_DESIGN/楼盘列表_UI.html` | 待评审 | 你评审楼盘列表 UI.md + 静态页,给我反馈我再迭代 | +| 05 | P0-B | 楼盘管理(详情/维护) | US-COMPLEX-001 | `UI_DESIGN/楼盘管理/楼盘详情_UI.md` | `UI_DESIGN/楼盘详情_UI.html` | 待设计 | 完成任务04后开始 | +| 06 | P0-B | 楼盘管理(区域) | US-COMPLEX-003 | `UI_DESIGN/楼盘管理/区域管理_UI.md` | `UI_DESIGN/区域管理_UI.html` | 待设计 | 完成任务05后开始 | +| 07 | P0-C | 组织人事 | US-ORG-001~003 | `UI_DESIGN/组织人事管理/组织人事_UI.md` | `UI_DESIGN/组织人事_UI.html` | 待设计 | 完成任务06后开始 | +| 08 | P0-C | 权限管理 | US-PERMISSION-001~005 | `UI_DESIGN/权限管理/权限管理_UI.md` | `UI_DESIGN/权限管理_UI.html` | 待设计 | 完成任务07后开始 | +| 09 | P0-C | 系统配置 | US-SETTING-001-A/B/C | `UI_DESIGN/系统配置/系统配置_UI.md` | `UI_DESIGN/系统配置_UI.html` | 待设计 | 完成任务08后开始 | --- ## 4) 已有 UI(保留并在后续做回归校对) -| 模块 | 现有 UI.md | 当前状态 | 说明 | -|---|---|---|---| -| 客源管理 | `UI_DESIGN/客源管理/新增客源_UI.md` | 已有 | 后续按你反馈可增量调整 | -| 客源管理 | `UI_DESIGN/客源管理/客源列表_UI.md` | 已有 | 后续按你反馈可增量调整 | -| 客源管理 | `UI_DESIGN/客源管理/客源详情_UI.md` | 已有 | 后续按你反馈可增量调整 | -| 客源管理 | `UI_DESIGN/客源管理/编辑客源_UI.md` | 已有 | `US-CLIENT-014` 的新房/租房 Tab 边界待确认 | -| 房源管理 | `UI_DESIGN/房源管理/房源列表_UI.md` | 已有 | 后续按你反馈可增量调整 | +| 模块 | 现有 UI.md | 当前状态 | 说明 | +| ---- | --------------------------- | ---- | -------------------------------- | +| 客源管理 | `UI_DESIGN/客源管理/新增客源_UI.md` | 已有 | 后续按你反馈可增量调整 | +| 客源管理 | `UI_DESIGN/客源管理/客源列表_UI.md` | 已有 | 后续按你反馈可增量调整 | +| 客源管理 | `UI_DESIGN/客源管理/客源详情_UI.md` | 已有 | 后续按你反馈可增量调整 | +| 客源管理 | `UI_DESIGN/客源管理/编辑客源_UI.md` | 已有 | `US-CLIENT-014` 的新房/租房 Tab 边界待确认 | +| 房源管理 | `UI_DESIGN/房源管理/房源列表_UI.md` | 已有 | 后续按你反馈可增量调整 | --- diff --git a/Project/fonrey/UI_DESIGN/房源管理/房源详情_UI.md b/Project/fonrey/UI_DESIGN/房源管理/房源详情_UI.md new file mode 100644 index 00000000..4e72192c --- /dev/null +++ b/Project/fonrey/UI_DESIGN/房源管理/房源详情_UI.md @@ -0,0 +1,286 @@ +# 房源详情 UI 设计文档 + +> **版本**:v1.0 · **日期**:2026-04-28 +> **依赖规范**:`UI_SYSTEM/UI_SYSTEM.md v1.2`、`UI_SYSTEM/UI_SYSTEM文档要求.md` +> **PRD 来源**:`PRD/房源管理/房源管理模块PRD.md` §5.2(房源详情)+ Story 3~8 +> **TASK 来源**:`PRD/TASK.md` · `US-PROPERTY-003 ~ US-PROPERTY-008` +> **数据模型来源**:`DATA_MODEL/DATA_MODEL_PROPERTY.md` + +--- + +## 1. 模块概述 + +### 1.1 页面目标 + +本任务对应任务03(P0-A),目标是交付可评审的房源详情主页面原型,覆盖以下关键能力: + +- 完整展示房源详情信息,按分区连续展示并通过二级锚点导航定位(US-PROPERTY-003) +- 在详情页内支持写入/筛选跟进日志(US-PROPERTY-004) +- 支持房源状态变更(改状态)弹层入口(US-PROPERTY-008) +- 支持写跟进弹层入口(US-PROPERTY-004) +- 提供图片与附件管理入口结构(US-PROPERTY-005) +- 提供业主联系人与相关员工信息区(US-PROPERTY-006) +- 提供调价/调级/改属性等快捷编辑入口位(US-PROPERTY-007) + +### 1.2 页面清单 + +| 页面 | 文件 | 优先级 | 说明 | +|---|---|---|---| +| 房源详情页 | `UI_DESIGN/房源详情_UI.html` | P0 🔴 | 主详情壳层 + 二级锚点导航 + 跟进子Tab + 右侧信息面板 + 关键弹层 | + +--- + +## 2. 信息架构与页面骨架 + +### 2.1 壳层结构(与新增客源页对齐) + +``` +Top Bar(固定 56px,bg-primary-800) +├─ 左:品牌区(Fonrey) +├─ 中:主导航(工作台/房源/客源/营销/交易/数据/人事/系统) +└─ 右:消息 + 用户 + +Sidebar(固定左侧 240px,位于 top-14 下) +└─ 房源管理导航(全部房源 / 我的房源 / 公盘池 / 成交房源 / 已删房源) + +Main Content(ml-60 + pt-[72px]) +├─ 面包屑 + 标题区 + 顶部操作区 +├─ 二级锚点导航(8个分区) +└─ 双栏布局 + ├─ 左侧:分区主内容(连续展示) + └─ 右侧:固定信息面板(业主联系人 / 维护完成度 / 房源动态) +``` + +### 2.2 二级锚点分区定义(PRD §5.2 对齐) + +1. 核心信息 +2. 跟进日志 +3. 业务信息 +4. 房源信息 +5. 营销信息 +6. 相关员工 +7. 相册信息 +8. 附件信息 + +--- + +## 3. 核心区块设计 + +### 3.1 顶部标题操作区 + +- 标题:`交易标签 + 房源名称`(例:出售 · 都市港湾055-0301) +- 快捷操作: + - `改状态`(弹层) + - `编辑房源`(入口) + - `分享`(入口) + - `写跟进`(弹层) + - `更多`(下拉入口位) + +### 3.2 核心信息分区 + +由三层信息组成: + +1. **价格与图片层**:主图、总价、单价、近30天变化、调价入口 +2. **房源概要层**:户型、面积、楼层、电梯、装修、朝向 +3. **详情字段层**:基础信息 + 交易信息(键值对) + +快捷编辑入口位(文本链): + +- 调价 +- 改等级 +- 改属性 +- 改用途 +- 看房时间 +- 挂牌历史 + +### 3.3 跟进日志分区 + +#### 3.3.1 子Tab结构 + +- 全部 +- 写入跟进 +- 敏感信息跟进 +- 敏感信息查看 +- 修改跟进 +- 其他跟进 + +#### 3.3.2 筛选区 + +- 日期范围(开始/结束) +- 复选项:有录音 / 有附件 / 仅看我的 +- 关键字输入(记录内容检索) + +#### 3.3.3 时间线 + +每条记录包含: + +- 类型标签(颜色区分) +- 内容摘要 +- 操作人 + 门店组别 +- 时间戳 +- 公开/隐藏状态位 + +### 3.4 业务信息分区 + +卡片化展示三个模块: + +- 钥匙管理(新增钥匙 / 钥匙在他司) +- 委托管理(新增委托 / 查看全部) +- 实勘管理(新增实勘) + +### 3.5 房源信息分区 + +四块可编辑信息: + +- 基本信息 +- 产证信息 +- 房屋介绍 +- 楼盘信息 + +每块右上角保留 `编辑` 入口。 + +### 3.6 相关员工分区 + +以列表卡片展示角色与归属: + +- 首录方 +- 号码方 +- 出售方 +- 实买方 + +### 3.7 相册信息分区 + +- 分类 Tab(全部/封面/客厅/卧室/卫生间/厨房…) +- 操作行(上传图片/批量改类/批量删除/批量下载) +- 图片网格(封面标记 + 分类 + 时间) + +### 3.8 附件信息分区 + +- 分类 Tab(全部/身份证/房产证/委托书/其他) +- 操作行(上传附件/批量改类/批量下载) +- 空状态(暂无附件) + +--- + +## 4. 右侧固定信息面板 + +> 布局:`w-80`,`sticky top-16` + +### 4.1 业主联系人 + +字段与交互: + +- 姓名 + 身份 +- 电话(默认打码) +- `查看号码`(示例交互) +- `新增联系人`(入口位) +- `更多`(入口位) + +### 4.2 房源维护完成度 + +- 总分(0~100) +- 分项进度(重点信息/附件/实勘/VR/钥匙/委托) +- 视觉:进度条 + 百分比 + +### 4.3 房源动态(近30天) + +指标卡: + +- 带看次数 +- 复看次数 +- 面访次数 +- 收藏人数 +- 分享次数 + +--- + +## 5. 关键弹层与交互 + +### 5.1 改状态弹层(US-PROPERTY-008) + +字段: + +- 原状态(只读) +- 原交易类型(只读) +- 新状态(必填) +- 更改理由(必填,≤50字) + +交互规则: + +- 未选新状态或理由为空不可提交 +- 提交成功后提示“状态已更新(原型模拟)” + +### 5.2 写跟进弹层(US-PROPERTY-004) + +字段: + +- 跟进目的(必填) +- 跟进内容(必填,6~500字) +- 附件上传入口(原型位) + +交互规则: + +- 内容不足 6 字时给出错误提示 +- 提交后关闭弹层并提示“跟进已写入(原型模拟)” + +--- + +## 6. 数据模型映射(关键字段) + +| UI字段 | 数据模型字段 | 备注 | +|---|---|---| +| 房源状态 | `properties.status` | 支持状态流转 | +| 房源属性 | `properties.attribute` | 公盘/私盘 | +| 售价 | `properties.sale_price` | 调价入口 | +| 租价 | `properties.rent_price` | 状态联动显示 | +| 单价 | `properties.sale_unit_price`(计算) | 展示字段 | +| 户型(室厅卫厨阳) | `bedroom_count/living_room_count/bathroom_count/kitchen_count/balcony_count` | 概要展示 | +| 建筑面积 | `properties.area` | m² | +| 房本年限 | `properties.ownership_years` | 交易信息 | +| 等级 | `properties.grade` | 改等级入口 | +| 看房时间 | `properties.viewing_time` | 改看房时间入口 | +| 最后跟进时间 | `properties.last_followed_at` | 动态区可关联 | +| 联系人姓名/身份 | `property_contacts.name/identity` | 右侧面板 | +| 联系人号码 | `property_contacts.phone_enc/phone_hash` | 默认打码展示 | +| 跟进记录 | `follow_logs` | 跟进子Tab来源 | +| 跟进附件 | `follow_log_attachments` | 有附件筛选 | +| 调价记录 | `price_changes` | 历史追踪 | +| 相册 | `property_photos` | 分类、封面、排序 | +| 附件 | `property_attachments` | 分类、批量下载 | + +--- + +## 7. 状态矩阵 + +| 状态 | 触发 | UI反馈 | +|---|---|---| +| 默认 | 首次进入 | 页面滚动到“核心信息”分区,右侧面板可见,锚点高亮同步 | +| 分区导航点击 | 点击二级锚点 | 平滑滚动至对应分区并更新高亮 | +| 跟进子Tab切换 | 点击跟进类型子Tab | 时间线按类型过滤 | +| 改状态弹层打开 | 点击改状态 | Modal 打开 | +| 写跟进弹层打开 | 点击写跟进 | Modal 打开 | +| 校验失败 | 必填未填/字数不达标 | 字段下方错误文案 | +| 提交成功(模拟) | 校验通过 | Toast 成功提示 | + +--- + +## 8. 可访问性 + +### 8.1 可访问性 + +- 所有按钮具备可见文本或 `aria-label` +- Modal 支持 ESC 关闭 +- 关键操作保留焦点态(focus ring) + +--- + +## 9. 验收清单 + +- [x] 产出 `UI_DESIGN/房源管理/房源详情_UI.md` +- [x] 产出 `UI_DESIGN/房源详情_UI.html` +- [x] 覆盖 `US-PROPERTY-003 ~ US-PROPERTY-008` 的 UI 入口与结构 +- [x] 二级锚点分区导航 + 跟进子Tab + 时间线结构齐备 +- [x] 右侧信息面板(业主联系人/维护完成度/房源动态)齐备 +- [x] 改状态 / 写跟进 弹层原型齐备 +- [x] 页面内不包含 Light/Dark/System 主题切换控件 +- [ ] 待你评审后迭代(先改 HTML,再回写本 UI 文档) \ No newline at end of file diff --git a/Project/fonrey/UI_DESIGN/房源管理/新增房源_UI.md b/Project/fonrey/UI_DESIGN/房源管理/新增房源_UI.md new file mode 100644 index 00000000..b7f7d51f --- /dev/null +++ b/Project/fonrey/UI_DESIGN/房源管理/新增房源_UI.md @@ -0,0 +1,198 @@ +# 新增房源 UI 设计文档 + +> **版本**:v1.0 · **日期**:2026-04-28 +> **依赖规范**:`UI_SYSTEM/UI_SYSTEM.md v1.2`、`UI_SYSTEM/UI_SYSTEM文档要求.md` +> **PRD 来源**:`PRD/房源管理/房源管理模块PRD.md` §5.3(新增房源)+ §5.3.1 / §5.3.2(类型差异) +> **TASK 来源**:`PRD/TASK.md` · `US-PROPERTY-001` +> **数据模型来源**:`DATA_MODEL/DATA_MODEL_PROPERTY.md` + +--- + +## 1. 模块概述 + +### 1.1 设计目标 + +本任务对应 `UI_设计任务总表.md` 任务 02(P0-A)与 `US-PROPERTY-001`: + +- 支持经纪人录入二手房源核心信息,并完成必填校验 +- 以「新增住宅」为 P0 主链路 +- 同页支持切换房源类型并展示差异字段(便于评审与后续迭代) +- 保存成功后给出“保存成功”反馈并进入详情页(静态原型中为模拟跳转) + +### 1.2 页面清单 + +| 页面 | 文件 | 优先级 | 说明 | +|---|---|---|---| +| 新增房源页 | `UI_DESIGN/新增房源_UI.html` | P0 🔴 | 主表单页,含类型切换、锚点导航、校验与保存反馈 | + +--- + +## 2. 信息架构与布局 + +### 2.1 页面骨架 + +``` +Top Bar(固定 56px,高优先主导航) +├─ 左侧品牌区(Fonrey) +├─ 中部主导航(工作台/房源/客源/营销/交易/数据/人事/系统) +└─ 右侧消息+用户信息 + +Sidebar(固定左侧 240px,位于 Top Bar 下方) +└─ 房源管理二级导航(全部房源/我的房源/公海池/成交房源/已删房源) + +Main Content(ml-60 + pt-[72px]) +├─ 页面头卡(面包屑 + 页面标题 + Theme Toggle + 返回列表) +├─ 房源类型选择器(住宅/别墅/商住/商铺/写字楼/其他) +├─ 表单锚点导航(房源核心信息 / 业主联系人 / 基础信息 / 交易信息 / 相关方) +├─ 五个纵向区块卡片(按锚点顺序) +└─ 底部操作条(取消 / 保存并继续新增 / 保存) +``` + +### 2.2 设计说明 + +- 页面壳层**对齐 `UI_DESIGN/新增客源_UI.html`**:同款 top bar + left sidebar + content 区域栅格 +- 表单采用“分区块竖向布局 + 顶部锚点”方案,对齐 PRD §5.3 +- 锚点导航 `sticky`,滚动时高亮当前区块 +- 必填未填时:字段红框 + 错误文案 + 自动滚动到首个错误字段 + +--- + +## 3. 字段设计(通用) + +## 3.1 房源核心信息 + +| 字段 | 控件 | 必填 | 规则 / 说明 | 数据模型映射 | +|---|---|---|---|---| +| 状态 | Radio | 是 | 出售 / 出租 / 租售 / 暂缓 | `properties.status` | +| 房源属性 | Radio | 是 | 公盘 / 私盘 | `properties.attribute` | +| 用途 | Radio | 否 | 选项随房源类型变化 | `properties.usage_type` | +| 小区名称 | 搜索输入 | 是 | 支持联想,原型中为文本输入 | `properties.complex_id`(落地后) | +| 户室号 | 3 段输入 | 否 | 栋/幢/弄/胡同 + 单元/号 + 门牌/室号 | `block_no/unit_no/room_no` | +| 所在楼层 | 数字输入×2 | 是 | 当前楼层 ≤ 总楼层 | `floor/total_floors` | +| 户型 | 室厅卫厨阳台 | 条件必填 | 商铺/写字楼不显示 | `bedroom_count...balcony_count` | +| 建筑面积 | 数字输入 | 是 | 单位 m² | `area` | +| 售价 | 数字输入 | 条件必填 | 状态含出售/租售时显示 | `sale_price` | +| 租价 | 数字输入 | 条件必填 | 状态含出租/租售时显示 | `rent_price` | +| 开间 | 数字输入 | 条件必填 | 仅商铺显示,单位米 | `shop_frontage` | +| 进深 | 数字输入 | 条件必填 | 仅商铺显示,单位米 | `shop_depth` | +| 层高 | 数字输入 | 条件必填 | 仅商铺显示,单位米 | `shop_height` | +| 位置 | Radio | 条件必填 | 仅商铺:临街/商场/小区/底商/商业综合体 | `shop_location` | + +## 3.2 业主/联系人 + +| 字段 | 控件 | 必填 | 规则 | 数据模型映射 | +|---|---|---|---|---| +| 姓名 | Input | 是 | 联系人1必填 | `property_contacts.name` | +| 性别 | Radio | 是 | 先生 / 女士,默认先生 | `property_contacts.gender` | +| 身份 | Select | 是 | 默认业主 | `property_contacts.identity` | +| 电话1 | Input | 否 | 手机/座机格式提示 | `phone_enc/phone_hash`(后端加密) | +| 电话2 | Input | 否 | 备用号码 | `phone2_enc/phone2_hash` | + +交互:支持“+ 添加联系人”,第 1 个联系人不可删除。 + +## 3.3 基础信息 + +| 字段 | 控件 | 必填 | 规则 | 数据模型映射 | +|---|---|---|---|---| +| 朝向 | Radio | 是 | 10个枚举值 | `properties.orientation` | +| 装修 | Radio | 是 | 毛坯~豪装 | `properties.decoration` | + +## 3.4 交易信息 + +| 字段 | 控件 | 必填 | 规则 | 数据模型映射 | +|---|---|---|---|---| +| 房本年限 | 双下拉 | 是(显示时) | 左侧年限 + 右侧补充 | `ownership_years / ownership_years_detail` | + +显示规则: +- 住宅 / 别墅 / 其他:显示完整交易信息入口(本版先落地房本年限) +- 商住:仅显示房本年限 +- 商铺 / 写字楼:不显示该区块 + +## 3.5 相关方 + +| 字段 | 控件 | 必填 | 规则 | 数据模型映射 | +|---|---|---|---|---| +| 首录方 | 只读输入 | 自动 | 默认当前登录人 | `first_recorder_id` | +| 号码方 | 员工选择 | 是 | 默认当前登录人,可清除重选 | `number_holder_id` | +| 出售方 | 员工选择 | 是 | 默认当前登录人,可清除重选 | `seller_agent_id` | + +--- + +## 4. 房源类型差异(对齐 PRD §5.3.1) + +| 类型 | 区块结构 | 与住宅差异 | +|---|---|---| +| 住宅(P0) | 5区块完整 | 用途:普通住宅/花园洋房 | +| 别墅(P1) | 5区块完整 | 用途:联排/独栋/双拼/叠加 | +| 商住(P2) | 5区块 | 用途字段保留但无选项;交易信息仅房本年限 | +| 商铺(P2) | 4区块(无交易信息) | 无户型;新增开间/进深/层高/位置 | +| 写字楼(P2) | 4区块(无交易信息) | 无户型;其余与住宅主干一致 | +| 其他(P2) | 5区块完整 | 用途为10项杂类 | + +> 说明:根据 PRD,P2 类型在 v1 为“即将上线”。原型保留展示与交互,提交时给出“即将上线”提示,避免与开发范围冲突。 + +--- + +## 5. 关键交互与状态 + +## 5.1 联动规则 + +1. **状态-价格联动** + - 出售:仅显示售价 + - 出租:仅显示租价 + - 租售:售价+租价均显示 + - 暂缓:隐藏售价/租价并给出提示文案 + +2. **类型-字段联动** + - 商铺/写字楼:隐藏户型 + - 商铺:显示开间/进深/层高/位置 + - 商铺/写字楼:隐藏交易信息 + +3. **校验失败定位** + - 点击保存后,自动滚动到首个错误字段 + - 字段红框 + 错误文案 + +## 5.2 页面状态 + +| 状态 | 触发 | 反馈 | +|---|---|---| +| 默认 | 首次进入 | 住宅类型 + 空白表单 | +| 编辑中 | 任意字段修改 | 页面 `dirty` 标记 | +| 保存中 | 点击保存 | 按钮 loading + 禁用 | +| 保存成功 | 校验通过 | Success Toast:保存成功,正在跳转 | +| 保存失败 | 校验不通过 | 错误提示 + 自动定位 | +| 类型未开放 | 提交 P2 类型 | Warning Toast:该类型即将上线 | + +## 5.3 离开确认 + +- 页面有未保存更改时,离开触发浏览器确认 +- 对齐 PRD“离开页面需提示是否放弃填写内容” + +--- + +## 6. 主题与可访问性 + +## 6.1 主题(本任务新增) + +页面内置 Theme Toggle:`Light / Dark / System` + +- 存储键:`fonrey_theme` +- `system` 跟随 `prefers-color-scheme` +- 颜色通过 CSS 变量驱动,避免硬编码 + +## 6.2 可访问性 + +- 所有输入项均有可见 Label +- 错误提示与字段 `aria-describedby` 关联 +- 锚点导航和按钮均支持键盘焦点态 +- 颜色之外辅以文字提示(如必填、错误、状态文案) + +--- + +## 7. 实现与评审清单 + +- [x] 产出 `UI_DESIGN/房源管理/新增房源_UI.md` +- [x] 产出 `UI_DESIGN/新增房源_UI.html` +- [x] 覆盖 `US-PROPERTY-001` 的主流程与验收关键点 +- [x] 包含 Light / Dark / System 主题切换 +- [ ] 待你评审后按反馈迭代(先改 HTML,再回写本 UI 文档) diff --git a/Project/fonrey/UI_DESIGN/房源详情_UI.html b/Project/fonrey/UI_DESIGN/房源详情_UI.html new file mode 100644 index 00000000..b3994ab3 --- /dev/null +++ b/Project/fonrey/UI_DESIGN/房源详情_UI.html @@ -0,0 +1,662 @@ + + + + + + Fonrey 房源详情 · 静态原型 + + + + + + + + +
+
+
F
+ Fonrey +
+ +
+ +
+
+ 魏深 +
+
+
+ + + + + +
+
+
+ + +
+
+

出售 · 都市港湾055-0301

+

嘉定 · 丰庄 · 109.77㎡ · 2室2厅 · 房源编号 01DS016848

+
+
+ + + + +
+
+
+ + +
+ +
+ +
+
+ +
+
+
+
+
房源主图
+

全部 16 张 · 封面 1 张

+
+
+
+
+
650 万
+
59215 元/㎡ · 近30天无价格变动
+
+ +
+
+
户型
2室2厅1卫1厨2阳
+
面积
109.77㎡
+
楼层
3 / 14
+
电梯
有电梯
+
装修
精装
+
朝向
南北
+
+
+
+
+ +
+
+

基础信息

+ +
+
+
等级
C(一般)
+
属性
公盘
+
房屋现状
未知
+
看房时间
随时可看
+
用途
住宅
+
录入时间
2015-05-01 19:05:53
+
+
+
+ + +
+
+
+

跟进日志

+ +
+ +
+ +
+ +
+ + + + + + +
+ +
    + +
+
+
+ + +
+
+

业务信息

+
+
+

钥匙管理

+

当前:无钥匙

+
+ + +
+
+
+

委托管理

+

当前:无委托

+
+ + +
+
+
+

实勘管理

+

当前:无实勘

+
+ +
+
+
+
+
+ + +
+
+

房源信息

+
+
+

基本信息

编辑
+

购房付款方式、原购价、包税费、来源

+
+
+

产证信息

编辑
+

权属方名称、证件号、房屋坐落

+
+
+

房屋介绍

编辑
+

营销标题、核心卖点、业主心态

+
+
+

楼盘信息

编辑
+

建成年代、物业公司、物业费、绿化率

+
+
+
+
+ +
+
+

营销信息

+
+
+

AI 视频

+

生成讲房短视频素材

+
+
+

抖音营销

+

一键生成发布文案

+
+
+

小红书营销

+

多模板图文内容

+
+
+
+
+ +
+
+
+

相关员工

+ 编辑 +
+
+ +
+
+
+ +
+
+

相册信息

+
+ 全部(16) + 封面(1) + 客厅(2) + 卧室(4) + 厨房(1) + 卫生间(1) +
+
+ + + + +
+
+ +
+
+
+ +
+
+

附件信息

+
+ 全部(0) + 身份证(0) + 房产证(0) + 委托书(0) + 其他(0) +
+
+ + + +
+
暂无附件
+
+
+
+ + +
+
+
+ + +
+
+
+

改状态

+ +
+
+
+ + +

请选择新状态

+
+
+ + +

请填写更改理由

+
+
+
+ + +
+
+
+ + +
+
+
+

写跟进

+ +
+
+
+ + +

请选择跟进目的

+
+
+ + +

跟进内容至少 6 字

+
+
+
+ + +
+
+
+ +
+ + + + diff --git a/Project/fonrey/UI_DESIGN/新增客源_UI.html b/Project/fonrey/UI_DESIGN/新增客源_UI.html index 39ecc4f5..bdb1092c 100644 --- a/Project/fonrey/UI_DESIGN/新增客源_UI.html +++ b/Project/fonrey/UI_DESIGN/新增客源_UI.html @@ -55,6 +55,11 @@ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-thumb { background: #CBD5E1; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #94A3B8; } + + .chip { border:1px solid #E2E8F0; background:#FFFFFF; color:#64748B; } + .chip.active { border-color:#0F766E; color:#0F766E; background:#F0FDFA; } + .subtab { color:#64748B; border-bottom:2px solid transparent; } + .subtab.active { color:#0F766E; border-bottom-color:#0F766E; font-weight:600; } @@ -108,8 +113,78 @@

录入私客

-
-
+ +
+
+
需求状态
+
+ + + +
+

+
+
+ + + +
+

房源信息

+ +
+
+ +
+ +
+

+
+ +
+ +
+ +
+

+
+ +
+ + +

+
+
+
+ +

联系人

最多添加 5 位联系人 @@ -250,72 +325,10 @@
-
+

基础信息

-
- -
- - - -
-

-
- -
- -
- -
-

-
- -
- -
- -
-

-
- -
- - -

-
-
-
+

相关员工

@@ -374,27 +387,39 @@
-
- - -

+
+
+
+ + + +
+

+
@@ -419,7 +444,6 @@ { value: 'villa', label: '别墅' }, { value: 'commercial_residential', label: '商住' }, { value: 'shop', label: '商铺' }, - { value: 'office', label: '写字楼' }, { value: 'other', label: '其他' } ], gradeOptions: [ @@ -435,6 +459,7 @@ infoExpanded: false, checkingDuplicate: false, duplicateHint: '', + activeSection: 'client-info', submitting: false, redirectHint: '', errors: {}, @@ -458,6 +483,7 @@ init() { this.form.contacts = [this.newContact()]; this.simulateSourceLoading(); + this.bindSectionObserver(); }, newContact() { @@ -516,6 +542,24 @@ this.form.schools.splice(idx, 1); }, + setPropertyUsage(type) { + this.form.propertyUsage = type; + }, + + bindSectionObserver() { + this.$nextTick(() => { + const sections = Array.from(document.querySelectorAll('[data-section-key]')); + const observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + this.activeSection = entry.target.getAttribute('data-section-key'); + } + }); + }, { rootMargin: '-35% 0px -55% 0px', threshold: 0 }); + sections.forEach((s) => observer.observe(s)); + }); + }, + simulateSourceLoading() { setTimeout(() => { this.sourceOptions = [ @@ -619,7 +663,7 @@ }, 2200); }, - submitForm() { + submitForm(continueMode = false) { if (this.submitting) return; if (!this.validateForm()) return; @@ -629,10 +673,28 @@ setTimeout(() => { this.submitting = false; this.showToast('保存成功'); - this.redirectHint = '模拟跳转中:即将进入客源详情页 /clients/CL20260426001/'; + if (continueMode) { + this.form.contacts = [this.newContact()]; + this.form.status = ''; + this.form.grade = ''; + this.form.source = ''; + this.form.idType = ''; + this.form.idNumber = ''; + this.form.schools = ['']; + this.infoExpanded = false; + this.errors = {}; + this.redirectHint = '已保存当前客源,表单已重置,可继续新增。'; + window.scrollTo({ top: 0, behavior: 'smooth' }); + } else { + this.redirectHint = '模拟跳转中:即将进入客源详情页 /clients/CL20260426001/'; + } }, 1200); }, + submitAndContinue() { + this.submitForm(true); + }, + cancelForm() { this.redirectHint = '已取消录入,模拟返回客源列表 /clients/'; } diff --git a/Project/fonrey/UI_DESIGN/新增房源_UI.html b/Project/fonrey/UI_DESIGN/新增房源_UI.html new file mode 100644 index 00000000..9100cd68 --- /dev/null +++ b/Project/fonrey/UI_DESIGN/新增房源_UI.html @@ -0,0 +1,758 @@ + + + + + + Fonrey 房源管理 · 新增房源(任务02) + + + + + +
+
+
F
+ Fonrey +
+ +
+ +
+
+ 魏深 +
+
+
+ + + +
+
+
+
+
+ +

新增房源

+
+ +
+
+ +
+
+
+
房源类型
+
+ + + + + + +
+

当前类型:住宅

+
+
+
验收重点(US-PROPERTY-001)
+
    +
  • 必填缺失时红色提示并定位
  • +
  • 状态与价格字段联动(出售/出租/租售/暂缓)
  • +
  • 保存成功给出反馈(原型中模拟详情跳转)
  • +
+
+
+
+ + + +
+
+

房源核心信息

+ +
+
+ +
+ + + + +
+

+
+ +
+ +
+ + +
+

+
+ +
+ +
+ +
+ +
+ + +

+
+ +
+ +
+ + + +
+
+ +
+ +
+ + 楼,共 + + +
+

+
+ +
+ +
+ + +
+

+
+ +
+ +
+ + + + + +
+

+
+ + + +
+ +
+

+
+ + + + +
+
+ +
+
+

业主/联系人

+ +
+
+
+ +
+

基础信息

+
+ +
+

+
+
+ +
+

+
+
+ +
+

交易信息

+
+
+ + +
+
+ +
+

商住类型仅保留房本年限;商铺/写字楼不展示该区块。

+
+

+
+ + + +
+
+
当前内容已保存或未变更
+
+ + + +
+
+
+
+
+
+ +
+ + + + + + diff --git a/Project/fonrey/UI_DESIGN/楼盘列表_UI.html b/Project/fonrey/UI_DESIGN/楼盘列表_UI.html new file mode 100644 index 00000000..52ef9f42 --- /dev/null +++ b/Project/fonrey/UI_DESIGN/楼盘列表_UI.html @@ -0,0 +1,513 @@ + + + + + + Fonrey 楼盘列表 · 静态原型 + + + + + + + +
+
+
F
+ Fonrey +
+ +
+ +
+
+ 魏深 +
+
+
+ + + + + +
+
+ +
+
+
+ +

楼盘管理

+
+ +
+
+ + +
+ +
+ + +
+
+

数据完整度指标

+ +
+
+ +
+
+ + +
+
+ + + +
+ +
+ 区域: + +
+ +
+ 用途: + +
+ +
+ +
+
+ + +
+
+ + + + + +
+ +
+ 未选中楼盘 + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + +
+ + 楼盘名称楼盘类型详细地址城区商圈当月挂牌均价(元/㎡)楼栋数产品数房源数操作
+
+
+ + +
+

+ +
+ + + + + 20条/页 + 跳至 + + +
+
+
+
+ + +
+ + + + \ No newline at end of file diff --git a/Project/fonrey/UI_DESIGN/楼盘管理/楼盘列表_UI.md b/Project/fonrey/UI_DESIGN/楼盘管理/楼盘列表_UI.md new file mode 100644 index 00000000..902c9d6d --- /dev/null +++ b/Project/fonrey/UI_DESIGN/楼盘管理/楼盘列表_UI.md @@ -0,0 +1,174 @@ +# 楼盘列表 UI 设计文档 + +> **任务编号**:04(P0-B) +> **覆盖范围**:`US-COMPLEX-002`(经纪人查看楼盘列表与详情入口) +> **输出文件**:`UI_DESIGN/楼盘列表_UI.html` +> **设计基线**:`UI_SYSTEM/UI_SYSTEM.md`(列表页模板、Top Bar + Sidebar 壳层、分页规范) + +--- + +## 1. 目标与范围 + +### 1.1 页面目标 + +楼盘列表页用于经纪人和运营人员进行楼盘检索与筛选,并作为楼盘详情页的统一入口。 + +核心目标: + +1. 支持关键词搜索(楼盘名称 / 别名 / 概要地址) +2. 支持区域、用途等维度筛选 +3. 支持分页(默认 20 条/页 + 跳页) +4. 列表中楼盘名称可点击进入楼盘详情 +5. 提供完整度统计面板与批量操作入口位(P0 原型占位) + +### 1.2 本任务边界 + +本任务只交付“楼盘列表页”的静态高保真原型,不实现真实后端查询。 + +- ✅ 包含:筛选交互、分页演示、详情跳转入口位 +- ⛔ 不包含:真实接口联动、真实批量操作执行、真实权限校验 + +--- + +## 2. 信息架构 + +## 2.1 壳层结构(与新增客源/房源详情一致) + +- **Top Bar(固定 56px)**:品牌 + 一级导航 + 用户区 +- **Sidebar(固定 240px)**:房源管理二级导航 +- **Main Content(`ml-60 pt-[72px]`)**: + 1. 面包屑 + 页面标题 + 2. 模块 Tab(楼盘 / 区域管理 / 学校管理 / 应用标准数据) + 3. 完整度统计面板 + 4. 搜索筛选区 + 5. 批量操作条 + 6. 列表表格 + 7. 分页条 + +## 2.2 楼盘列表表格字段 + +| 列字段 | 说明 | +|---|---| +| 勾选 | 批量操作选择 | +| 楼盘名称 | 蓝色可点击,进入详情页 | +| 楼盘类型 | 住宅 / 别墅 / 商住 / 商业 / 写字楼 / 其他 | +| 详细地址 | 城市 + 街道 / 弄号 | +| 城区商圈 | 形如「嘉定-江桥新城」 | +| 当月挂牌均价(元/㎡) | 数值,支持排序入口位 | +| 楼栋数 | 数值 | +| 产品数 | 数值 | +| 房源数 | 出售N / 出租N / 共N | +| 操作 | 编辑 / 删除 | + +--- + +## 3. 交互设计 + +## 3.1 搜索与筛选 + +### 3.1.1 关键词搜索 + +- 输入框占位:`楼盘名/别名/拼音/详细地址` +- 点击「查询」执行前端过滤演示 +- 点击「清除」重置全部条件 + +### 3.1.2 快捷筛选 + +- 区域:不限、静安、闵行、普陀、松江、长宁、嘉定 +- 用途:不限、住宅、别墅、商住、商业、写字楼、其他 + +### 3.1.3 下拉筛选(占位) + +- 固定情况 +- 完善情况 +- 楼盘类型 +- 有无房源 +- 楼栋类型 +- 权属关系 +- 有无坐标 + +> 以上下拉项在本原型为可见控件,不做真实复杂筛选逻辑。 + +## 3.2 批量操作 + +按钮区: + +- + 新增楼盘(主 CTA) +- 批量新增楼栋 +- 批改区域商圈 +- 删除 +- 合并楼盘 + +规则(原型态): + +- 当未选择行时,批量按钮显示禁用态 +- 选中 1 条及以上时,禁用态解除(仅视觉) + +## 3.3 列表与跳转 + +- 点击楼盘名称:跳转 `#/complex/{id}`(原型 hash)并 Toast 提示“进入楼盘详情(原型)” +- 点击编辑 / 删除:仅触发提示,不执行真实动作 + +## 3.4 分页 + +- 默认每页 20 条 +- 支持上一页 / 下一页 +- 支持输入页码跳转(超范围自动纠正) +- 展示 `共 X 条` + 当前页码 + +--- + +## 4. 状态矩阵 + +| 状态 | 触发 | 页面反馈 | +|---|---|---| +| 默认 | 首次加载 | 展示全部 mock 数据第一页 | +| 搜索结果 | 输入关键词并查询 | 表格按关键词过滤 | +| 空结果 | 条件过严 | 空状态(暂无匹配楼盘)+ 清除筛选 | +| 行选中 | 勾选一行或全选 | 批量按钮解除禁用 | +| 分页切换 | 点击页码/上一页/下一页 | 列表刷新为对应页 | +| 页面主题 | 统一浅色管理后台主题 | 不在页面内提供 Light/Dark 切换控件 | + +--- + +## 5. 数据模型映射(DATA_MODEL_COMPLEX) + +| UI 字段 | 数据模型字段 | +|---|---| +| 楼盘名称 | `complexes.name` | +| 详细地址 | `complexes.address` | +| 概要地址(搜索) | `complexes.address_summary` | +| 城区 | `complexes.district_id -> districts.name` | +| 主商圈 | `complex_business_areas.is_primary -> business_areas.name` | +| 楼栋数 | `COUNT(buildings.id)` | +| 出售/出租数量 | `properties.status` 聚合 | +| 搜索向量 | `complexes.search_vector` | + +--- + +## 6. 可访问性与规范 + +- 表头使用语义化 `` +- 纯图标按钮添加 `aria-label` +- 所有输入项含可见 label 或占位 + 分组标题 +- 焦点态统一 `focus-visible:ring-2` +- 空状态提供主动作按钮(清除筛选) + +--- + +## 7. 验收清单 + +- [x] 壳层结构:Top Bar + Sidebar + Main +- [x] 楼盘列表页模块 Tab 完整 +- [x] 统计面板、筛选区、批量区、表格区、分页区完整 +- [x] 默认 20 条/页的分页演示 +- [x] 楼盘名称可点击触发“进入详情”原型行为 +- [x] 页面内不包含主题切换控件(遵循统一后台视觉) +- [x] 控制台 0 报错(本地预览验证阶段) + +--- + +## 8. 后续衔接 + +- 本页评审通过后,进入任务05:楼盘详情/维护(`US-COMPLEX-001`) +- 任务05将复用本页的详情入口与模块 Tab 风格,保证楼盘模块前后页体验一致 diff --git a/Project/fonrey/prompt/提示词模板/创建项目骨架提示词_v1.md b/Project/fonrey/prompt/提示词模板/创建项目骨架提示词_v2.2.md similarity index 59% rename from Project/fonrey/prompt/提示词模板/创建项目骨架提示词_v1.md rename to Project/fonrey/prompt/提示词模板/创建项目骨架提示词_v2.2.md index 618427f8..23bde1eb 100644 --- a/Project/fonrey/prompt/提示词模板/创建项目骨架提示词_v1.md +++ b/Project/fonrey/prompt/提示词模板/创建项目骨架提示词_v2.2.md @@ -1,4 +1,6 @@ # Fonrey 项目骨架搭建 — 工程执行提示词 +> **版本**:v2.2(2026-04-28)|v2.0 修复 P0×5+P1×4;v2.1 修复 P0×9(交叉比对 AGENTS.md / 测试规范.md / 系统管理技术文档.md);v2.2 收口剩余一致性问题(URL 分离、Admin 弃用、密钥变量统一、测试 settings 一致性、环境变量占位修复) +> **v2.2 主要变更**:统一 `config/urls.py` / `config/urls_public.py` 职责并修正执行清单;移除 Django Admin 路由引用(对齐系统管理技术文档);PII 密钥统一为 `PHONE_ENCRYPTION_KEY`;`pyproject.toml` 测试 settings 对齐 `config.settings.testing` 并新增 `testing.py` 生成要求;修复 AWS/R2 示例占位符与 `.env.example` 断行问题;修正 docker-compose 服务数量描述 ## 你的角色与约束 你是一名资深 Django 后端工程师。你的任务是**严格按照规范**搭建 Fonrey 项目骨架,不得自行发明技术方案,不得引入文档未授权的第三方库。每一步操作后必须验证结果。 **项目工作目录**:`/mnt/c/Project/`(在此目录下创建 `fonrey/` 子目录) @@ -33,12 +35,13 @@ fonrey/ │ ├── property/ # 房源核心(in TENANT_APPS) │ ├── client/ # 客源管理(in TENANT_APPS) │ ├── setting/ # 系统设置(in TENANT_APPS) -│ └── release/ # 客户端发布管理(in SHARED_APPS) +│ └── release/ # 客户端发布管理(in SHARED_APPS,⚠️ 无 services/,不做多租户隔离) ├── core/ │ ├── __init__.py │ ├── models/ │ │ ├── __init__.py │ │ └── base.py # 抽象基类(见第四节规范) +│ ├── enums.py # 全局枚举类(与 ENUMS.md 严格对齐,供 models/serializers 导入) │ ├── encryption.py # PII 加密(AES-256-GCM) │ ├── cache.py # Redis 工具 │ ├── templatetags/ @@ -56,8 +59,10 @@ fonrey/ │ │ ├── __init__.py │ │ ├── base.py # 基础配置 │ │ ├── development.py +│ │ ├── testing.py # 测试配置(pytest) │ │ └── production.py -│ ├── urls.py +│ ├── urls.py # tenant schema 路由入口 +│ ├── urls_public.py # public schema 路由入口 │ ├── asgi.py # ASGI 入口 │ └── wsgi.py ├── templates/ @@ -111,7 +116,7 @@ apps/property/ ├── services/ │ ├── __init__.py │ └── .gitkeep -├── tasks.py # Celery 任务骨架 +├── tasks.py # Celery 任务骨架(见第九节模板) ├── views.py # HTMX/JSON 视图骨架 ├── urls.py ├── templates/ @@ -120,8 +125,85 @@ apps/property/ ├── __init__.py └── .gitkeep ``` +**⚠️ `apps/release/` 的内部结构特殊**(in SHARED_APPS,不做多租户数据隔离): +``` +└── tests/ + ├── __init__.py + └── .gitkeep # App 内单元测试(纯 model/service 逻辑,无 HTTP) +``` +**整体 tests/ 分层规范**(P1-10): +- `apps//tests/` — 单元测试(该 App 内部逻辑,不跨 App) +- 项目根 `tests/` — 集成测试 / E2E(跨 App 或依赖外部服务) +``` +tests/ # 项目根集成/E2E 测试 +├── __init__.py +├── conftest.py # 全局 fixture(DB、租户、认证) +├── integration/ +│ ├── __init__.py +│ ├── property/ +│ │ └── .gitkeep +│ ├── client/ +│ │ └── .gitkeep +│ └── release/ +│ └── test_client_update_api.py # schemathesis 契约测试骨架 +└── e2e/ + ├── __init__.py + └── .gitkeep # playwright E2E(pytest-playwright) +``` +⚠️ `release/` **无** `services/`、`tasks.py`;不引用 `schema_context`。 +``` +apps/release/ +├── __init__.py +├── apps.py +├── admin.py +├── models/ +│ ├── __init__.py +│ └── .gitkeep # ClientRelease 模型 +├── views.py # 公开 API(无需登录),返回 JSON +├── urls.py # 被 config/urls_public.py include(public schema) +└── serializers.py # DRF Serializer(配合 drf-spectacular) +``` --- ## 三、Django 配置规范 +### 3.0 URL 路由文件职责(强制分离,禁止合并) +```python +# config/urls.py — Tenant schema 路由入口(仅 tenant) +from django.urls import path, include + +urlpatterns = [ + path("", include("apps.account.urls")), + path("", include("apps.property.urls")), + path("", include("apps.client.urls")), + path("", include("apps.complex.urls")), + path("", include("apps.org.urls")), + path("", include("apps.permission.urls")), + path("", include("apps.setting.urls")), +] +``` + +```python +# config/urls_public.py — Public schema 专用路由(管理后台、release API、OpenAPI) +# ⚠️ 对齐 TECH_STACK/系统管理技术文档.md:Django Admin 全环境弃用,不注册任何管理后台路由 +from django.urls import path, include +from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView + +urlpatterns = [ + path("api/client/updates/latest/", include("apps.release.urls")), + # OpenAPI — 仅 DEBUG 暴露,production 通过 nginx ACL 限制 + path("api/schema/", SpectacularAPIView.as_view(), name="schema"), + path("api/docs/", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger-ui"), +] +``` +⚠️ django-tenants URL routing 强制规范(系统管理技术文档.md:207): + +```python +# config/settings/base.py — 多租户 URL 分离配置(必须显式声明) +ROOT_URLCONF = "config.urls" # tenant schema 路由入口 +PUBLIC_SCHEMA_URLCONF = "config.urls_public" # public schema 路由入口 +``` + +> `config/urls.py` 仅包含 `urlpatterns`(tenant 路由),`config/urls_public.py` 包含 `urlpatterns`(public 路由)。两个文件分开维护,**不得合并**。 + ### 3.1 INSTALLED_APPS 分区 ```python # config/settings/base.py @@ -139,6 +221,11 @@ SHARED_APPS = [ # 第三方(shared) "django_celery_beat", "django_celery_results", + "rest_framework", # DRF(drf-spectacular 依赖) + "drf_spectacular", # OpenAPI schema(API_CONTRACT.md §11 MUST) + "core", # 基础工具层(非业务 App,放 shared 确保迁移可见) + "django_htmx", # HTMX 中间件(request.htmx 语义支持,系统管理技术文档.md:431) + "django_extensions", # shell_plus 等开发辅助命令 ] TENANT_APPS = [ "apps.account", @@ -149,7 +236,6 @@ TENANT_APPS = [ "apps.property", "apps.client", "apps.setting", - "core", ] INSTALLED_APPS = list(SHARED_APPS) + list(TENANT_APPS) ``` @@ -158,7 +244,7 @@ INSTALLED_APPS = list(SHARED_APPS) + list(TENANT_APPS) # 多租户 TENANT_MODEL = "tenant.Tenant" TENANT_DOMAIN_MODEL = "tenant.Domain" -DEFAULT_AUTO_FIELD = "django.db.models.UUIDField" # 全局 UUID PK +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # 非 UUID 表的默认 PK;业务表 UUID PK 靠 UUIDPrimaryKeyModel # 数据库(从环境变量读取) DATABASES = { "default": { @@ -206,7 +292,7 @@ ASGI_APPLICATION = "config.asgi.application" SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_SAMESITE = "Lax" -CSRF_COOKIE_HTTPONLY = False # HTMX 需要读取 +CSRF_COOKIE_HTTPONLY = False # ⚠️ HTMX 需要 JS 读取 CSRF token,故意设为 False,禁止"修复"此项 X_FRAME_OPTIONS = "DENY" # 模板 TEMPLATES = [{ @@ -224,6 +310,15 @@ TEMPLATES = [{ }] # HTMX HTMX_GLOBAL_CSRF = True # 全局 CSRF 注入 +# drf-spectacular(OpenAPI,API_CONTRACT.md §11 MUST) +SPECTACULAR_SETTINGS = { + "TITLE": "Fonrey API", + "DESCRIPTION": "Fonrey 房产经纪管理系统 OpenAPI 3.1", + "VERSION": "1.0.0", + "SERVE_INCLUDE_SCHEMA": False, + "COMPONENT_SPLIT_REQUEST": True, + "ENUM_GENERATE_CHOICE_DESCRIPTION": False, # 枚举说明由 ENUMS.md 权威维护 +} # 日志(骨架,production 扩展) LOGGING = { "version": 1, @@ -244,6 +339,7 @@ MIDDLEWARE = [ "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", + "django_htmx.middleware.HtmxMiddleware", # HTMX:request.htmx(系统管理技术文档.md:431) "core.middleware.audit.AuditMiddleware", # 自定义审计(骨架) ] ``` @@ -266,6 +362,10 @@ class TimeStampedModel(UUIDPrimaryKeyModel): class Meta: abstract = True ordering = ["-created_at"] +class ActiveManager(models.Manager): + """默认只返回未软删除的记录""" + def get_queryset(self): + return super().get_queryset().filter(deleted_at__isnull=True) class SoftDeleteModel(TimeStampedModel): """软删除:deleted_at=NULL 表示未删除""" deleted_at = models.DateTimeField(null=True, blank=True, db_index=True) @@ -301,37 +401,125 @@ class AuditedModel(SoftDeleteModel): ) class Meta: abstract = True -class ActiveManager(models.Manager): - """默认只返回未软删除的记录""" - def get_queryset(self): - return super().get_queryset().filter(deleted_at__isnull=True) ``` --- -## 五、PII 加密(core/encryption.py) -骨架实现,接口固定(后续补充实现体),确保接口签名正确: +## 五、全局枚举骨架(core/enums.py) +**权威来源**:`DATA_MODEL/ENUMS.md v2.2`。本文件是 ENUMS.md 的 Python 镜像,每次 ENUMS.md 更新后必须同步。 +**规范**:所有枚举值 `lower_snake_case`,禁止在 models/serializers 中硬编码字符串枚举值,必须从此文件导入。 + +```python +from django.db import models + +# ────────────────────────────────────────────── +# public schema 枚举 +# ────────────────────────────────────────────── +class PlatformAuditResult(models.TextChoices): + SUCCESS = "success", "通过" + FAILED = "failed", "未通过" + +class UpgradeType(models.TextChoices): + APP = "app", "应用升级" + SCHEMA = "schema", "数据库 Schema 升级" + FEATURE = "feature", "功能开关升级" + +class ExportTaskStatus(models.TextChoices): + PENDING = "pending", "排队中" + PROCESSING = "processing", "处理中" + SUCCESS = "success", "成功" + FAILED = "failed", "失败" + +# ────────────────────────────────────────────── +# property 枚举(骨架,值见 ENUMS.md §property) +# ────────────────────────────────────────────── +class PropertyGrade(models.TextChoices): + A = "a", "A(急迫)" + B = "b", "B(优先)" + C = "c", "C(普通)" + D = "d", "D(搁置)" + +# ────────────────────────────────────────────── +# client 枚举(骨架,值见 ENUMS.md §client) +# ────────────────────────────────────────────── +class ClientGrade(models.TextChoices): + A = "a", "A(急迫)" + B = "b", "B(优先)" + C = "c", "C(普通)" + D = "d", "D(搁置)" + E = "e", "E(冷冻)" + +class ClientType(models.TextChoices): + PRIVATE = "private", "私客" + PUBLIC = "public", "公客" + TRANSACTED = "transacted", "成交客" + INVALID = "invalid", "无效客" + +class ClientStatus(models.TextChoices): + BUYING = "buying", "买房中" + RENTING = "renting", "租房中" + BUY_OR_RENT = "buy_or_rent", "买租均可" + SUSPENDED = "suspended", "暂停" + BOUGHT = "bought", "已购" + RENTED_DONE = "rented_done", "已租" + PUBLIC = "public", "已转公客" + INVALID = "invalid", "已无效" + +# ────────────────────────────────────────────── +# permission 枚举(骨架,值见 ENUMS.md §permission) +# ────────────────────────────────────────────── +class PermissionValueType(models.TextChoices): + BOOLEAN = "boolean", "布尔" + SCOPE = "scope", "数据范围" + INTEGER = "integer", "整数" + +class PermissionOverrideMode(models.TextChoices): + REPLACE = "replace", "替换" + RESTRICT = "restrict", "限制(取更严格)" + GRANT = "grant", "授权(取更宽松)" + +# TODO:其余枚举按 ENUMS.md 顺序补全(setting、org、complex、account...) +``` +--- +## 六、PII 加密(core/encryption.py) +骨架实现,接口固定(后续补充实现体),确保接口签名正确: + +> ⚠️ **算法强制规范(AGENTS.md §4.4):必须用 AES-256-GCM,禁止 Fernet(Fernet 是 AES-128-CBC)。** +> `cryptography` 库使用 `cryptography.hazmat.primitives.ciphers.aead.AESGCM`。 + ```python -from cryptography.fernet import Fernet import hashlib +import os import base64 from django.conf import settings +from cryptography.hazmat.primitives.ciphers.aead import AESGCM + class PhoneEncryption: """ 手机号 AES-256-GCM 加密存储 + SHA-256 哈希索引 - 存储字段:phone_encrypted(加密密文)+ phone_hash(哈希,用于精确查询) - 显示:脱敏格式 138****1234 + - 加密算法:AES-256-GCM(AGENTS.md §4.4,对照 TECH_STACK/系统管理技术文档.md) + - 存储字段:phone_encrypted(base64 密文)+ phone_hash(SHA-256,用于精确查询) + - 显示:脱敏格式 138****1234 + 密钥来源:settings.PHONE_ENCRYPTION_KEY(32字节,base64 encoded,从 .env 注入) """ + @staticmethod + def _get_key() -> bytes: + key_b64 = settings.PHONE_ENCRYPTION_KEY + return base64.b64decode(key_b64) # 必须 32 bytes(AES-256) + @staticmethod def encrypt(phone: str) -> str: - """加密手机号,返回 base64 密文""" - ... # TODO: 实现 + """加密手机号,返回 base64(nonce + ciphertext + tag)""" + ... # TODO: AESGCM(key).encrypt(nonce, phone.encode(), None) + @staticmethod def decrypt(ciphertext: str) -> str: """解密返回明文""" - ... # TODO: 实现 + ... # TODO: AESGCM(key).decrypt(nonce, ciphertext_bytes, None).decode() + @staticmethod def hash(phone: str) -> str: """返回 SHA-256 哈希(用于 DB 索引查询)""" - ... # TODO: 实现 + ... # TODO: hashlib.sha256(phone.encode()).hexdigest() + @staticmethod def mask(phone: str) -> str: """返回脱敏格式:138****1234""" @@ -340,7 +528,7 @@ class PhoneEncryption: return phone[:3] + "****" + phone[-4:] ``` --- -## 六、Heroicons Templatetag(core/templatetags/heroicons.py) +## 七、Heroicons Templatetag(core/templatetags/heroicons.py) ```python from django import template from django.utils.safestring import mark_safe @@ -356,11 +544,61 @@ def heroicon(name: str, size: str = "24", style: str = "outline", css_class: str # 骨架:实际从 heroicons vendor 文件读取 SVG # size 可选: 12, 16, 20, 24 # style 可选: outline, solid, mini - css = f'class="w-{size//4 if isinstance(size, int) else size} h-{size//4 if isinstance(size, int) else size} {css_class}"' + size_int = int(size) + css = f'class="w-{size_int // 4} h-{size_int // 4} {css_class}"' return mark_safe(f'') # TODO: 替换为实际 SVG ``` --- -## 七、模板体系 +## 八、Redis 工具(core/cache.py) +**Redis Key 格式规范**(所有 Redis 操作必须遵守):`{tenant_schema}:{module}:{key}` +禁止裸字符串拼接 Key;public schema 操作传 `"public"` 作为 `tenant_schema`。 + +```python +from django.core.cache import cache + +def get_redis_key(tenant_schema: str, module: str, key: str) -> str: + """ + 构造带租户前缀的 Redis Key。 + 示例:get_redis_key("acme", "permission", "staff:uuid-xxx") + → "acme:permission:staff:uuid-xxx" + """ + return f"{tenant_schema}:{module}:{key}" + +def cache_get(tenant_schema: str, module: str, key: str): + return cache.get(get_redis_key(tenant_schema, module, key)) + +def cache_set(tenant_schema: str, module: str, key: str, value, timeout: int = 300): + cache.set(get_redis_key(tenant_schema, module, key), value, timeout=timeout) + +def cache_delete(tenant_schema: str, module: str, key: str): + cache.delete(get_redis_key(tenant_schema, module, key)) +``` + +--- +## 九、Celery 多租户任务模板(apps//tasks.py) +所有 Celery 任务必须接收 `tenant_schema_name` 参数并在任务入口处 `schema_context()`,**禁止依赖调用时的线程 schema 上下文**。 + +```python +from celery import shared_task +from django_tenants.utils import schema_context + +@shared_task(bind=True, max_retries=3, default_retry_delay=60) +def example_tenant_task(self, tenant_schema_name: str, **kwargs): + """ + 多租户 Celery 任务模板。 + 调用方示例: + example_tenant_task.delay(tenant_schema_name=connection.schema_name, ...) + """ + try: + with schema_context(tenant_schema_name): + # --- 业务逻辑 --- + pass + except Exception as exc: + raise self.retry(exc=exc) +``` + +--- +## 十、模板体系 ### 7.1 base.html(全局根模板) 包含以下 block 定义(骨架,后续填充): - `{% block title %}` — 页面标题 @@ -369,7 +607,7 @@ def heroicon(name: str, size: str = "24", style: str = "outline", css_class: str - `{% block content %}` — 页面主内容 - `{% block extra_js %}` — 页面级 JS 引入资源顺序: -1. Tailwind CSS(编译后的 `main.css`) +1. Tailwind CSS(编译后的 `output.css`,即 `tailwindcss -o ./static/css/output.css` 的产出;`main.css` 是 Tailwind 入口源文件,**不直接加载**) 2. Flatpickr CSS(条件加载) 3. HTMX `htmx.min.js` 4. Alpine.js `alpine.min.js`(defer,必须在 HTMX 之后) @@ -453,6 +691,10 @@ uvicorn[standard]==0.32.0 sentry-sdk[django]==2.18.0 python-decouple==3.8 # .env 读取 Pillow==11.0.0 # 图片处理 +djangorestframework==3.15.2 # DRF(drf-spectacular 依赖) +drf-spectacular==0.27.2 # OpenAPI 3.1 schema 自动生成(API_CONTRACT.md §11 MUST) +django-htmx==1.21.0 # request.htmx 语义(AGENTS.md §4.2 / 系统管理技术文档.md:431) +django-extensions==3.2.3 # shell_plus、runscript 等开发辅助命令 ``` ### requirements/development.txt ``` @@ -461,7 +703,47 @@ ruff==0.7.0 black==24.10.0 pytest-django==4.9.0 factory-boy==3.3.1 +pytest-mock==3.14.0 # Mock 打桩(测试规范.md:86) +responses==0.25.3 # 三方 HTTP 隔离(测试规范.md:87) +pytest-cov==5.0.0 # 覆盖率报告(测试规范.md:88) +pytest-xdist==3.6.1 # 并行加速(测试规范.md:89) django-debug-toolbar==4.4.6 +schemathesis==3.36.0 # OpenAPI 契约测试(API_CONTRACT.md §11 MUST) +pytest-playwright==0.5.0 # E2E 测试(TECH_STACK.md §10 / AGENTS.md §6) +playwright==1.47.0 +django-htmx==1.21.0 # request.htmx 支持(系统管理技术文档.md:431) +django-extensions==3.2.3 # shell_plus、runscript 等(Makefile 依赖) +``` + +### 测试关键约定(对齐 AGENTS.md §6 / 测试规范.md) +> ⚠️ 以下约定**不可省略**,缺少任何一条将导致 CI 失败或测试体系不合规: + +```python +# conftest.py — 必须包含 TenantClient fixture +import pytest +from django_tenants.test.client import TenantClient +from django_tenants.utils import schema_context + +@pytest.fixture +def tenant_client(db, tenant): + """所有集成测试必须使用此 client,禁止 Django 原生 Client()""" + with schema_context(tenant.schema_name): + yield TenantClient(tenant) + +# HTMX 局部请求测试示例(测试规范.md:206) +def test_property_list_htmx(tenant_client): + response = tenant_client.get( + "/property/", + HTTP_HX_REQUEST="true", # 必须携带,触发 partial 模板逻辑 + ) + assert response.status_code == 200 + assert "全局布局标签" not in response.content.decode() # 返回 partial 而非完整页面 +``` + +```ini +# pytest.ini / pyproject.toml [tool.pytest.ini_options] +DJANGO_SETTINGS_MODULE = config.settings.testing +addopts = --cov=apps --cov=core --cov-report=term-missing -n auto ``` --- ## 十、Makefile 快捷命令 @@ -553,9 +835,9 @@ target-version = ["py312"] profile = "black" line_length = 100 [tool.pytest.ini_options] -DJANGO_SETTINGS_MODULE = "config.settings.development" +DJANGO_SETTINGS_MODULE = "config.settings.testing" python_files = ["test_*.py", "*_test.py"] -addopts = "--reuse-db" +addopts = "--reuse-db --cov=apps --cov=core --cov-report=term-missing -n auto" ``` --- ## 十五、执行顺序与验证清单 @@ -565,12 +847,13 @@ addopts = "--reuse-db" [ ] 2. 创建 pyproject.toml / .gitignore / .env.example / Makefile [ ] 3. 创建 requirements/ 三个文件 [ ] 4. 创建 config/settings/base.py(完整配置) -[ ] 5. 创建 config/settings/development.py 和 production.py -[ ] 6. 创建 config/urls.py(骨架路由,含 django-tenants URL routing) +[ ] 5. 创建 config/settings/development.py、testing.py 和 production.py +[ ] 6. 创建 config/urls.py(仅 tenant 路由)与 config/urls_public.py(release API + OpenAPI) [ ] 7. 创建 config/asgi.py(ASGI 入口) [ ] 8. 创建 core/models/base.py(四个抽象基类) +[ ] 8b. 创建 core/enums.py(枚举骨架,见第五节;与 ENUMS.md v2.2 对齐) [ ] 9. 创建 core/encryption.py(PhoneEncryption 骨架) -[ ] 10. 创建 core/cache.py(Redis 工具骨架) +[ ] 10. 创建 core/cache.py(Redis 工具骨架,含 get_redis_key,见第八节) [ ] 11. 创建 core/htmx.py(htmx_response 工具) [ ] 12. 创建 core/templatetags/heroicons.py [ ] 13. 创建 core/middleware/audit.py(骨架) @@ -584,7 +867,7 @@ addopts = "--reuse-db" [ ] 21. 创建 tailwind.config.js(完整色彩/字体规范) [ ] 22. 创建 package.json [ ] 23. 创建 Dockerfile -[ ] 24. 创建 docker-compose.yml(5 个服务) +[ ] 24. 创建 docker-compose.yml(6 个服务:web/db/redis/celery/celery-beat/tailwind) [ ] 25. 创建 manage.py [ ] 26. 验证:python manage.py check --deploy 无致命错误 [ ] 27. 验证:项目目录树与第二节规范 100% 匹配 diff --git a/Project/fonrey/screenshots/房源/增房/上传图片.png b/Project/fonrey/screenshots/房源/上传图片.png similarity index 100% rename from Project/fonrey/screenshots/房源/增房/上传图片.png rename to Project/fonrey/screenshots/房源/上传图片.png diff --git a/Project/fonrey/screenshots/房源/增房/写跟进.png b/Project/fonrey/screenshots/房源/写跟进.png similarity index 100% rename from Project/fonrey/screenshots/房源/增房/写跟进.png rename to Project/fonrey/screenshots/房源/写跟进.png diff --git a/raw/Others/可自动化、可扩展、AI增强的电商数据采集与处理系统.md b/raw/Others/可自动化、可扩展、AI增强的电商数据采集与处理系统.md index 8d4abdec..b2ad5cf8 100644 --- a/raw/Others/可自动化、可扩展、AI增强的电商数据采集与处理系统.md +++ b/raw/Others/可自动化、可扩展、AI增强的电商数据采集与处理系统.md @@ -1,695 +1,695 @@ ---- -title: 安装 Playwright 浏览器 -source: -author: shenwei -published: -created: 2025-11-11 -description: 可自动化、可扩展、AI增强的电商数据采集与处理系统 -tags: [] -link: ---- - - - - -非常好的思路——你想要的是一个**可自动化、可扩展、AI增强的数据采集与处理系统**,基于 Docker + Ubuntu + n8n 搭建。下面我给你一个详细的设计与工具选择建议,从爬取到分析的整体架构。 - ---- - -## 🧩 一、系统整体架构建议 - -你的目标系统可以分为三个层次: - -|层次|组件|说明| -|---|---|---| -|**数据采集层(爬虫)**|Scrapy / Playwright / Selenium / Apify|从各大电商网站采集结构化信息(标题、描述、图片、视频等)| -|**数据处理层(自动化管道)**|n8n + LLM API (e.g., OpenAI, Ollama, LM Studio)|对采集数据进行清洗、分类、摘要、翻译、属性提取等AI处理| -|**存储与展示层**|PostgreSQL / SQLite + MinIO / NAS + Grafana / Metabase|存储文本、图片和视频元数据,并可视化结果| - ---- - -## 🕷️ 二、爬虫工具推荐与对比 - -|工具|适用场景|优点|缺点| -|---|---|---|---| -|**Scrapy**|静态页面、电商产品信息|轻量高效、插件生态丰富、可Docker化部署|对JS渲染页面支持弱,需要配合Splash或Playwright| -|**Playwright (Python/Node.js)**|动态渲染页面、滚动加载、视频图片加载|可模拟浏览器、支持无头模式、可靠性高|相对重,适合单站点深度采集| -|**Apify (Open Source SDK)**|通用网页爬取+API接口+调度|已内置防封禁策略、支持Docker|学习曲线略陡、对纯本地化部署需定制| -|**Colly (Go语言)**|高性能爬虫服务、轻量API爬取|性能强、可编译为二进制Docker镜像|JS支持弱,不适合电商复杂页面| -|**Crawlee (Node.js)**|Apify的开源核心框架,支持Playwright/Selenium|与n8n、LangChain容易集成|需要JS/TS开发基础| - -**推荐组合:** - -> ✅ **Scrapy + Playwright(或Crawlee + Playwright)** - -- Scrapy 负责结构化抓取、分页调度、下载媒体; - -- Playwright 负责加载动态页面; - -- 两者可通过 Docker Compose 容器化; - -- 输出 JSON 或 CSV 文件供 n8n 消费。 - - ---- - -## ⚙️ 三、Docker 架构示例 - - -Scrapy 爬完的数据(JSON/CSV)存放在 `/data`,由 n8n 定时读取和处理。 - ---- - -## 🤖 四、n8n 中的AI集成与自动化 - -在 n8n 中可以通过 workflow 实现整个管线自动化: - -**工作流示例:** - -1. **Cron Trigger** → 定时启动 - -2. **Execute Command Node** → 执行 `docker exec scraper scrapy crawl amazon` - -3. **Read File Node** → 读取爬取的 JSON 文件 - -4. **OpenAI / Ollama Node** → 调用 LLM 对产品描述提取属性(品牌、型号、价格区间、关键词等) - -5. **Database Node** → 写入 PostgreSQL / SQLite - -6. **Webhook / Email Node** → 生成报表或通知 - - -你也可以用 n8n 的 “HTTP Request Node” 抓取 API 页面(适合公开电商API如阿里、Shopee)。 - ---- - -## 🧠 五、AI 处理建议 - -结合 LLM 做如下任务: - -- **内容摘要与分类**(提炼产品特点) - -- **多语言翻译** - -- **特征提取**(品牌、价格、类别) - -- **异常检测**(自动识别异常价格或缺图产品) - -- **结构化JSON输出**,便于数据库存储 - - -可以本地使用 **Ollama** (Mistral, Llama3) 模型,通过 n8n 的 HTTP Request 调用本地 `http://localhost:11434/api/generate`。 - ---- - -## 🗄️ 六、数据存储与管理建议 - -|数据类型|存储建议|工具| -|---|---|---| -|文本/结构化数据|PostgreSQL / SQLite|适合AI分析、可视化| -|图片/视频|MinIO / 本地NAS|模拟S3存储方式| -|Dashboard|Grafana / Metabase|生成电商趋势与分析报表| - ---- - -## 🛡️ 七、防封与安全建议 - -- 使用 **User-Agent轮换**(Scrapy 内置 `scrapy-user-agents`) - -- **代理池**(BrightData / ScraperAPI / 免费代理) - -- 对同一网站设置 **下载延迟 + 随机化访问** - -- **分布式调度** 可用 `Scrapyd` 或 `Archetype`(Scrapy集群) - -- 不采集个人隐私信息或侵权内容(仅公开页面信息) - - ---- - -## 🚀 八、后续可扩展方向 - -- 增加 **FastAPI 服务层**:暴露 REST API 给前端或 BI 工具; - -- 使用 **LangChain** 结合 Vector DB(e.g. Qdrant / Milvus)存储产品语义信息; - -- n8n 可触发自动生成市场趋势报告(AI Summarizer); - -- 可视化电商类目趋势(Grafana + Postgres)。 - - ---- - -## ✅ 推荐起步路径 - -1. **在 Ubuntu 上安装 Docker + Docker Compose** - -2. 启动基础环境:`scrapy + playwright + n8n` - -3. 选择 1–2 个电商站点(如 Amazon / JD / Taobao) - -4. 构建 Scrapy 爬虫模板 - -5. 用 n8n 处理数据并测试 AI 工作流 - -6. 逐步扩展至全自动管线 - - ---- - -太好了 ✅ 我将为你生成一个**可直接部署的爬虫自动化系统骨架**,基于以下目标设计: - -> **目标:** 在 Ubuntu 上使用 Docker Compose 部署一个自动化电商爬虫系统,采集电商网站产品信息 → 存入本地文件 → 由 n8n 自动读取并利用 AI 处理。 - -下面是完整结构与代码示例。 - ---- - -## 🧩 一、项目目录结构 - -```bash -ecommerce-crawler/ -├── docker-compose.yml -├── scrapy/ -│ ├── Dockerfile -│ ├── requirements.txt -│ ├── scrapy.cfg -│ └── ecommerce/ -│ ├── __init__.py -│ ├── items.py -│ ├── middlewares.py -│ ├── pipelines.py -│ ├── settings.py -│ └── spiders/ -│ └── amazon_spider.py -├── n8n_data/ # n8n 数据持久化 -├── data/ # 爬取结果输出目录 -└── README.md -``` - ---- - -## 🧱 二、`docker-compose.yml` - -```yaml -version: '3.8' -services: - # Scrapy 爬虫容器 - scraper: - build: ./scrapy - container_name: ecommerce-scraper - working_dir: /app/scrapy - volumes: - - ./data:/app/data - depends_on: - - playwright - environment: - - PLAYWRIGHT_BROWSERS_PATH=/ms-playwright - networks: - - crawler-net - - - # Playwright 浏览器支持容器 - playwright: - image: mcr.microsoft.com/playwright/python:v1.48.0-jammy - shm_size: 2gb - networks: - - crawler-net - - # n8n 自动化平台 - #n8n: - # image: n8nio/n8n:latest - # container_name: n8n - # ports: - # - 5678:5678 - # environment: - # - N8N_BASIC_AUTH_ACTIVE=true - # - N8N_BASIC_AUTH_USER=admin - # - N8N_BASIC_AUTH_PASSWORD=changeme - # - N8N_PATH=/workflows - # volumes: - # - ./n8n_data:/home/node/.n8n - # - ./data:/data - # networks: - # - crawler-net - -networks: - crawler-net: -``` - ---- - -## 🐍 三、Scrapy 部分 - -### `scrapy/Dockerfile` - -```dockerfile -FROM mcr.microsoft.com/playwright/python:v1.48.0-jammy - -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . - -# 安装 Playwright 浏览器 -RUN playwright install - -WORKDIR /app -CMD ["scrapy", "crawl", "amazon"] - -``` - ---- - -### `scrapy/requirements.txt` - -```txt -scrapy==2.13.3 -playwright==1.48.0 -scrapy-playwright==0.0.44 -``` - -> 说明:`scrapy-playwright` 插件可直接让 Scrapy 调用 Playwright 渲染动态页面,非常适合电商网站。 - ---- - -### `scrapy/scrapy.cfg` - -```ini -[settings] -default = settings - -[deploy] -# 如果你将来要用 scrapyd 部署,可以在这里定义目标(可忽略) -# url = http://localhost:6800/ -# project = crawler - -``` - ---- - -### `scrapy/ecommerce/settings.py` - -```python -BOT_NAME = "scrapy" - -SPIDER_MODULES = ["spiders"] # 指向当前目录下的 spiders -NEWSPIDER_MODULE = "spiders" # 新建 spider 时默认放在这里 - -ROBOTSTXT_OBEY = False -DOWNLOAD_DELAY = 2 - -DOWNLOAD_HANDLERS = { - "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", - "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", -} - -TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor" - -PLAYWRIGHT_LAUNCH_OPTIONS = { - "headless": True, - "args": ["--no-sandbox", "--disable-setuid-sandbox"], -} -PLAYWRIGHT_BROWSER_TYPE = "chromium" - -FEEDS = { - "/app/data/amazon.json": {"format": "json", "overwrite": True}, -} - -``` - ---- - -### `scrapy/ecommerce/items.py` - -```python -import scrapy - -class ProductItem(scrapy.Item): - title = scrapy.Field() - price = scrapy.Field() - rating = scrapy.Field() - image_urls = scrapy.Field() - images = scrapy.Field() - product_url = scrapy.Field() -``` - ---- - -### `scrapy/ecommerce/pipelines.py` - -```python -import json - -class JsonWriterPipeline: - def open_spider(self, spider): - self.file = open("data/products.json", "w", encoding="utf-8") - self.file.write("[\n") - - def close_spider(self, spider): - self.file.write("]\n") - self.file.close() - - def process_item(self, item, spider): - line = json.dumps(dict(item), ensure_ascii=False) + ",\n" - self.file.write(line) - return item -``` - ---- - -### `scrapy/ecommerce/spiders/amazon_spider.py` - -> ⚠️ 仅作演示用途,使用通用搜索页采集,不涉及登录或侵权内容。 - -```python -import scrapy -from scrapy_playwright.page import PageMethod - -class QuotesSpider(scrapy.Spider): - name = "amazon" - start_urls = ["https://quotes.toscrape.com/js/"] - - custom_settings = { - "PLAYWRIGHT_LAUNCH_OPTIONS": {"headless": True}, - "PLAYWRIGHT_CONTEXT_ARGS": {"viewport": {"width": 1280, "height": 720}}, - } - - def start_requests(self): - for url in self.start_urls: - yield scrapy.Request( - url, - meta={ - "playwright": True, - "playwright_page_methods": [ - PageMethod("wait_for_selector", "div.quote") - ], - }, - ) - - async def parse(self, response): - quotes = response.css("div.quote") - for quote in quotes: - text = quote.css("span.text::text").get() - author = quote.css("small.author::text").get() - yield {"text": text, "author": author} - - # 翻页 - next_page = response.css("li.next a::attr(href)").get() - if next_page: - next_url = response.urljoin(next_page) - yield scrapy.Request( - next_url, - meta={ - "playwright": True, - "playwright_page_methods": [ - PageMethod("wait_for_selector", "div.quote") - ], - }, - callback=self.parse - ) -``` - -### `scrapy/ecommerce/spiders/__init__.py` - -```python -#empty -``` - - - ---- - -## ⚙️ 四、运行方式 - -```bash -# 1. 构建并启动所有容器 -docker compose up --build -d - -# 2. 进入 Scrapy 容器执行爬虫 -docker exec -it ecommerce-scraper scrapy crawl amazon - -# 3. 查看数据 -cat data/products.json -``` - -### Docker 命令 - - -``` bash -docker compose down -v -docker compose up --build -d - -docker exec -it ecommerce-scraper bash - -#进入交互模式 -docker run -it --entrypoint bash ecommerce-scraper -``` ---- - -## 🤖 五、n8n 自动化流程(示例) - -你可以在 n8n Web UI([http://localhost:5678)导入如下逻辑:](http://localhost:5678%EF%BC%89%E5%AF%BC%E5%85%A5%E5%A6%82%E4%B8%8B%E9%80%BB%E8%BE%91%EF%BC%9A/) - -**Workflow 示例逻辑:** - -1. **Cron Node**:每天凌晨触发 - -2. **Execute Command Node**:执行命令 - `docker exec ecommerce-scraper scrapy crawl amazon` - -3. **Read File Node**:读取 `/data/products.json` - -4. **OpenAI Node**(或 HTTP Request 调本地 Ollama): - - - Prompt 示例: - - ```text - 从以下JSON中提取每个产品的简短摘要(不超过30字)并分类。 - ``` - -5. **Write to Database Node**(或 Google Sheet / CSV) - 保存提炼结果 - -6. **Telegram / Email Node** - 发送日报通知 - - ---- - -## 💡 六、后续增强建议 - -|功能|工具|说明| -|---|---|---| -|图像下载/视频下载|Scrapy 自带 `ImagesPipeline` 或 `requests`|下载并存储本地或 MinIO| -|多站点并行爬取|Scrapy 多 Spider + n8n 并行调度|自动轮询不同站点| -|数据可视化|Metabase / Grafana|接 PostgreSQL 实时展示产品趋势| -|向量搜索|Qdrant / Weaviate|用于AI语义检索| -|本地AI处理|Ollama + Llama3|替代外部API| - ---- - -是否希望我帮你再生成一个 **完整可导入的 n8n workflow JSON 文件模板**(包含 Cron、执行 Scrapy、读取 JSON、调用 AI、存入数据库)? -这样你只需导入到 n8n UI 就能立即自动化整个流程。 - -非常好 👍 -下面是一个**完整可导入的 n8n Workflow JSON 模板**,它能自动: - -1️⃣ 定时运行 Scrapy 爬虫(通过 Docker 命令) -2️⃣ 读取爬取的数据(`products.json`) -3️⃣ 调用 AI(可选择 OpenAI 或本地 Ollama)进行摘要与分类 -4️⃣ 存入数据库或文件 -5️⃣ 发送报告通知 - ---- - -## 🧩 一、Workflow 功能概览 - -|步骤|节点类型|功能| -|---|---|---| -|1|**Cron Trigger**|每天凌晨 2:00 自动触发| -|2|**Execute Command**|执行 `docker exec ecommerce-scraper scrapy crawl amazon`| -|3|**Read Binary File**|读取 `/data/products.json`| -|4|**OpenAI (或 HTTP Request)**|提炼摘要与分类(可切换 Ollama)| -|5|**Write Binary File**|输出 `data/products_summary.json`| -|6|**Email (或 Telegram)**|发送日报通知| - ---- - -## 📦 二、Workflow JSON 模板(可直接导入) - -将以下 JSON 内容保存为 -👉 `workflow_ecommerce_automation.json` -然后在 n8n Web UI → **Import from file** 导入。 - -```json -{ - "name": "Ecommerce Crawler + AI Summary", - "nodes": [ - { - "parameters": { - "triggerTimes": { - "item": [ - { - "mode": "everyDay", - "hour": 2 - } - ] - } - }, - "id": "1", - "name": "Cron Trigger", - "type": "n8n-nodes-base.cron", - "typeVersion": 1, - "position": [250, 250] - }, - { - "parameters": { - "command": "docker exec ecommerce-scraper scrapy crawl amazon" - }, - "id": "2", - "name": "Run Scrapy Crawler", - "type": "n8n-nodes-base.executeCommand", - "typeVersion": 1, - "position": [500, 250] - }, - { - "parameters": { - "path": "/data/products.json", - "options": {} - }, - "id": "3", - "name": "Read Products JSON", - "type": "n8n-nodes-base.readBinaryFile", - "typeVersion": 1, - "position": [750, 250] - }, - { - "parameters": { - "functionCode": "const data = JSON.parse(Buffer.from(items[0].binary.data.data, 'base64').toString());\nreturn data.map(p => ({ json: p }));" - }, - "id": "4", - "name": "Parse JSON", - "type": "n8n-nodes-base.function", - "typeVersion": 1, - "position": [1000, 250] - }, - { - "parameters": { - "model": "gpt-4-turbo", - "prompt": "你是一个电商产品分析助手。请从以下产品信息中提取每个产品的简短摘要(不超过30字)并归类到相应产品类别。\n\n输入数据:{{$json[\"title\"]}},价格:{{$json[\"price\"]}},评分:{{$json[\"rating\"]}}。\n\n输出格式:{\"title\":\"...\",\"summary\":\"...\",\"category\":\"...\"}" - }, - "id": "5", - "name": "AI Summarize & Categorize", - "type": "n8n-nodes-base.openAi", - "typeVersion": 2, - "position": [1250, 250], - "credentials": { - "openAIApi": { - "id": "YOUR-OPENAI-CREDENTIAL-ID", - "name": "OpenAI API" - } - } - }, - { - "parameters": { - "fileName": "/data/products_summary.json", - "options": {}, - "dataPropertyName": "json" - }, - "id": "6", - "name": "Write Summary JSON", - "type": "n8n-nodes-base.writeBinaryFile", - "typeVersion": 1, - "position": [1500, 250] - }, - { - "parameters": { - "fromEmail": "noreply@yourdomain.com", - "toEmail": "your@email.com", - "subject": "Daily Product Summary Report", - "text": "今日电商产品摘要已生成,请查看 /data/products_summary.json 文件。" - }, - "id": "7", - "name": "Send Email Notification", - "type": "n8n-nodes-base.emailSend", - "typeVersion": 1, - "position": [1750, 250] - } - ], - "connections": { - "Cron Trigger": { "main": [[{ "node": "Run Scrapy Crawler", "type": "main", "index": 0 }]] }, - "Run Scrapy Crawler": { "main": [[{ "node": "Read Products JSON", "type": "main", "index": 0 }]] }, - "Read Products JSON": { "main": [[{ "node": "Parse JSON", "type": "main", "index": 0 }]] }, - "Parse JSON": { "main": [[{ "node": "AI Summarize & Categorize", "type": "main", "index": 0 }]] }, - "AI Summarize & Categorize": { "main": [[{ "node": "Write Summary JSON", "type": "main", "index": 0 }]] }, - "Write Summary JSON": { "main": [[{ "node": "Send Email Notification", "type": "main", "index": 0 }]] } - }, - "active": true -} -``` - ---- - -## 🧠 三、使用说明 - -1. **导入流程** - - - 访问 `http://<你的服务器IP>:5678` - - - 点击右上角「Import from File」→ 选择上面的 JSON 文件 - -2. **配置 OpenAI 凭证** - - - n8n → Credentials → 新建 OpenAI API Key - - - 将 `YOUR-OPENAI-CREDENTIAL-ID` 替换为对应 ID - - - 若使用本地 Ollama,则: - - - 替换节点 `AI Summarize & Categorize` 为 “HTTP Request” - - - URL 填入 `http://ollama:11434/api/generate` - - - POST body 示例: - - ```json - { - "model": "llama3", - "prompt": "分析以下产品信息:{{$json[\"title\"]}} ..." - } - ``` - -3. **设置邮箱凭证** - - - n8n → Credentials → Email Send (SMTP) - - - 支持 Gmail, Outlook, AWS SES 等 - -4. **测试运行** - - - 手动点击 ▶️ 运行 - - - 查看 `/data/products_summary.json` - - - 邮箱将收到日报通知 - - ---- - -## 🚀 四、可选扩展 - -|目标|实现方式| -|---|---| -|改为多站点爬取|添加更多 spider(如 `jd_spider.py`, `ebay_spider.py`)并在 n8n 串联运行| -|增加数据库写入|在 n8n 中加入 “PostgreSQL Node” 写入产品与AI摘要| -|生成图表报表|把数据库接入 Grafana / Metabase| -|向量检索增强|在 n8n 中调用 Qdrant 插入语义向量| - ---- - -是否希望我在下一步帮你生成一个适配 **Ollama 本地模型(离线AI处理)** 的 workflow 版本? -它将不依赖外部API,完全在本地自动运行分析。 - - - +--- +title: 安装 Playwright 浏览器 +source: +author: shenwei +published: +created: 2025-11-11 +description: 可自动化、可扩展、AI增强的电商数据采集与处理系统 +tags: [] +link: +--- + + + + +非常好的思路——你想要的是一个**可自动化、可扩展、AI增强的数据采集与处理系统**,基于 Docker + Ubuntu + n8n 搭建。下面我给你一个详细的设计与工具选择建议,从爬取到分析的整体架构。 + +--- + +## 🧩 一、系统整体架构建议 + +你的目标系统可以分为三个层次: + +|层次|组件|说明| +|---|---|---| +|**数据采集层(爬虫)**|Scrapy / Playwright / Selenium / Apify|从各大电商网站采集结构化信息(标题、描述、图片、视频等)| +|**数据处理层(自动化管道)**|n8n + LLM API (e.g., OpenAI, Ollama, LM Studio)|对采集数据进行清洗、分类、摘要、翻译、属性提取等AI处理| +|**存储与展示层**|PostgreSQL / SQLite + MinIO / NAS + Grafana / Metabase|存储文本、图片和视频元数据,并可视化结果| + +--- + +## 🕷️ 二、爬虫工具推荐与对比 + +|工具|适用场景|优点|缺点| +|---|---|---|---| +|**Scrapy**|静态页面、电商产品信息|轻量高效、插件生态丰富、可Docker化部署|对JS渲染页面支持弱,需要配合Splash或Playwright| +|**Playwright (Python/Node.js)**|动态渲染页面、滚动加载、视频图片加载|可模拟浏览器、支持无头模式、可靠性高|相对重,适合单站点深度采集| +|**Apify (Open Source SDK)**|通用网页爬取+API接口+调度|已内置防封禁策略、支持Docker|学习曲线略陡、对纯本地化部署需定制| +|**Colly (Go语言)**|高性能爬虫服务、轻量API爬取|性能强、可编译为二进制Docker镜像|JS支持弱,不适合电商复杂页面| +|**Crawlee (Node.js)**|Apify的开源核心框架,支持Playwright/Selenium|与n8n、LangChain容易集成|需要JS/TS开发基础| + +**推荐组合:** + +> ✅ **Scrapy + Playwright(或Crawlee + Playwright)** + +- Scrapy 负责结构化抓取、分页调度、下载媒体; + +- Playwright 负责加载动态页面; + +- 两者可通过 Docker Compose 容器化; + +- 输出 JSON 或 CSV 文件供 n8n 消费。 + + +--- + +## ⚙️ 三、Docker 架构示例 + + +Scrapy 爬完的数据(JSON/CSV)存放在 `/data`,由 n8n 定时读取和处理。 + +--- + +## 🤖 四、n8n 中的AI集成与自动化 + +在 n8n 中可以通过 workflow 实现整个管线自动化: + +**工作流示例:** + +1. **Cron Trigger** → 定时启动 + +2. **Execute Command Node** → 执行 `docker exec scraper scrapy crawl amazon` + +3. **Read File Node** → 读取爬取的 JSON 文件 + +4. **OpenAI / Ollama Node** → 调用 LLM 对产品描述提取属性(品牌、型号、价格区间、关键词等) + +5. **Database Node** → 写入 PostgreSQL / SQLite + +6. **Webhook / Email Node** → 生成报表或通知 + + +你也可以用 n8n 的 “HTTP Request Node” 抓取 API 页面(适合公开电商API如阿里、Shopee)。 + +--- + +## 🧠 五、AI 处理建议 + +结合 LLM 做如下任务: + +- **内容摘要与分类**(提炼产品特点) + +- **多语言翻译** + +- **特征提取**(品牌、价格、类别) + +- **异常检测**(自动识别异常价格或缺图产品) + +- **结构化JSON输出**,便于数据库存储 + + +可以本地使用 **Ollama** (Mistral, Llama3) 模型,通过 n8n 的 HTTP Request 调用本地 `http://localhost:11434/api/generate`。 + +--- + +## 🗄️ 六、数据存储与管理建议 + +|数据类型|存储建议|工具| +|---|---|---| +|文本/结构化数据|PostgreSQL / SQLite|适合AI分析、可视化| +|图片/视频|MinIO / 本地NAS|模拟S3存储方式| +|Dashboard|Grafana / Metabase|生成电商趋势与分析报表| + +--- + +## 🛡️ 七、防封与安全建议 + +- 使用 **User-Agent轮换**(Scrapy 内置 `scrapy-user-agents`) + +- **代理池**(BrightData / ScraperAPI / 免费代理) + +- 对同一网站设置 **下载延迟 + 随机化访问** + +- **分布式调度** 可用 `Scrapyd` 或 `Archetype`(Scrapy集群) + +- 不采集个人隐私信息或侵权内容(仅公开页面信息) + + +--- + +## 🚀 八、后续可扩展方向 + +- 增加 **FastAPI 服务层**:暴露 REST API 给前端或 BI 工具; + +- 使用 **LangChain** 结合 Vector DB(e.g. Qdrant / Milvus)存储产品语义信息; + +- n8n 可触发自动生成市场趋势报告(AI Summarizer); + +- 可视化电商类目趋势(Grafana + Postgres)。 + + +--- + +## ✅ 推荐起步路径 + +1. **在 Ubuntu 上安装 Docker + Docker Compose** + +2. 启动基础环境:`scrapy + playwright + n8n` + +3. 选择 1–2 个电商站点(如 Amazon / JD / Taobao) + +4. 构建 Scrapy 爬虫模板 + +5. 用 n8n 处理数据并测试 AI 工作流 + +6. 逐步扩展至全自动管线 + + +--- + +太好了 ✅ 我将为你生成一个**可直接部署的爬虫自动化系统骨架**,基于以下目标设计: + +> **目标:** 在 Ubuntu 上使用 Docker Compose 部署一个自动化电商爬虫系统,采集电商网站产品信息 → 存入本地文件 → 由 n8n 自动读取并利用 AI 处理。 + +下面是完整结构与代码示例。 + +--- + +## 🧩 一、项目目录结构 + +```bash +ecommerce-crawler/ +├── docker-compose.yml +├── scrapy/ +│ ├── Dockerfile +│ ├── requirements.txt +│ ├── scrapy.cfg +│ └── ecommerce/ +│ ├── __init__.py +│ ├── items.py +│ ├── middlewares.py +│ ├── pipelines.py +│ ├── settings.py +│ └── spiders/ +│ └── amazon_spider.py +├── n8n_data/ # n8n 数据持久化 +├── data/ # 爬取结果输出目录 +└── README.md +``` + +--- + +## 🧱 二、`docker-compose.yml` + +```yaml +version: '3.8' +services: + # Scrapy 爬虫容器 + scraper: + build: ./scrapy + container_name: ecommerce-scraper + working_dir: /app/scrapy + volumes: + - ./data:/app/data + depends_on: + - playwright + environment: + - PLAYWRIGHT_BROWSERS_PATH=/ms-playwright + networks: + - crawler-net + + + # Playwright 浏览器支持容器 + playwright: + image: mcr.microsoft.com/playwright/python:v1.48.0-jammy + shm_size: 2gb + networks: + - crawler-net + + # n8n 自动化平台 + #n8n: + # image: n8nio/n8n:latest + # container_name: n8n + # ports: + # - 5678:5678 + # environment: + # - N8N_BASIC_AUTH_ACTIVE=true + # - N8N_BASIC_AUTH_USER=admin + # - N8N_BASIC_AUTH_PASSWORD=changeme + # - N8N_PATH=/workflows + # volumes: + # - ./n8n_data:/home/node/.n8n + # - ./data:/data + # networks: + # - crawler-net + +networks: + crawler-net: +``` + +--- + +## 🐍 三、Scrapy 部分 + +### `scrapy/Dockerfile` + +```dockerfile +FROM mcr.microsoft.com/playwright/python:v1.48.0-jammy + +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt +COPY . . + +# 安装 Playwright 浏览器 +RUN playwright install + +WORKDIR /app +CMD ["scrapy", "crawl", "amazon"] + +``` + +--- + +### `scrapy/requirements.txt` + +```txt +scrapy==2.13.3 +playwright==1.48.0 +scrapy-playwright==0.0.44 +``` + +> 说明:`scrapy-playwright` 插件可直接让 Scrapy 调用 Playwright 渲染动态页面,非常适合电商网站。 + +--- + +### `scrapy/scrapy.cfg` + +```ini +[settings] +default = settings + +[deploy] +# 如果你将来要用 scrapyd 部署,可以在这里定义目标(可忽略) +# url = http://localhost:6800/ +# project = crawler + +``` + +--- + +### `scrapy/ecommerce/settings.py` + +```python +BOT_NAME = "scrapy" + +SPIDER_MODULES = ["spiders"] # 指向当前目录下的 spiders +NEWSPIDER_MODULE = "spiders" # 新建 spider 时默认放在这里 + +ROBOTSTXT_OBEY = False +DOWNLOAD_DELAY = 2 + +DOWNLOAD_HANDLERS = { + "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", + "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", +} + +TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor" + +PLAYWRIGHT_LAUNCH_OPTIONS = { + "headless": True, + "args": ["--no-sandbox", "--disable-setuid-sandbox"], +} +PLAYWRIGHT_BROWSER_TYPE = "chromium" + +FEEDS = { + "/app/data/amazon.json": {"format": "json", "overwrite": True}, +} + +``` + +--- + +### `scrapy/ecommerce/items.py` + +```python +import scrapy + +class ProductItem(scrapy.Item): + title = scrapy.Field() + price = scrapy.Field() + rating = scrapy.Field() + image_urls = scrapy.Field() + images = scrapy.Field() + product_url = scrapy.Field() +``` + +--- + +### `scrapy/ecommerce/pipelines.py` + +```python +import json + +class JsonWriterPipeline: + def open_spider(self, spider): + self.file = open("data/products.json", "w", encoding="utf-8") + self.file.write("[\n") + + def close_spider(self, spider): + self.file.write("]\n") + self.file.close() + + def process_item(self, item, spider): + line = json.dumps(dict(item), ensure_ascii=False) + ",\n" + self.file.write(line) + return item +``` + +--- + +### `scrapy/ecommerce/spiders/amazon_spider.py` + +> ⚠️ 仅作演示用途,使用通用搜索页采集,不涉及登录或侵权内容。 + +```python +import scrapy +from scrapy_playwright.page import PageMethod + +class QuotesSpider(scrapy.Spider): + name = "amazon" + start_urls = ["https://quotes.toscrape.com/js/"] + + custom_settings = { + "PLAYWRIGHT_LAUNCH_OPTIONS": {"headless": True}, + "PLAYWRIGHT_CONTEXT_ARGS": {"viewport": {"width": 1280, "height": 720}}, + } + + def start_requests(self): + for url in self.start_urls: + yield scrapy.Request( + url, + meta={ + "playwright": True, + "playwright_page_methods": [ + PageMethod("wait_for_selector", "div.quote") + ], + }, + ) + + async def parse(self, response): + quotes = response.css("div.quote") + for quote in quotes: + text = quote.css("span.text::text").get() + author = quote.css("small.author::text").get() + yield {"text": text, "author": author} + + # 翻页 + next_page = response.css("li.next a::attr(href)").get() + if next_page: + next_url = response.urljoin(next_page) + yield scrapy.Request( + next_url, + meta={ + "playwright": True, + "playwright_page_methods": [ + PageMethod("wait_for_selector", "div.quote") + ], + }, + callback=self.parse + ) +``` + +### `scrapy/ecommerce/spiders/__init__.py` + +```python +#empty +``` + + + +--- + +## ⚙️ 四、运行方式 + +```bash +# 1. 构建并启动所有容器 +docker compose up --build -d + +# 2. 进入 Scrapy 容器执行爬虫 +docker exec -it ecommerce-scraper scrapy crawl amazon + +# 3. 查看数据 +cat data/products.json +``` + +### Docker 命令 + + +``` bash +docker compose down -v +docker compose up --build -d + +docker exec -it ecommerce-scraper bash + +#进入交互模式 +docker run -it --entrypoint bash ecommerce-scraper +``` +--- + +## 🤖 五、n8n 自动化流程(示例) + +你可以在 n8n Web UI([http://localhost:5678)导入如下逻辑:](http://localhost:5678%EF%BC%89%E5%AF%BC%E5%85%A5%E5%A6%82%E4%B8%8B%E9%80%BB%E8%BE%91%EF%BC%9A/) + +**Workflow 示例逻辑:** + +1. **Cron Node**:每天凌晨触发 + +2. **Execute Command Node**:执行命令 + `docker exec ecommerce-scraper scrapy crawl amazon` + +3. **Read File Node**:读取 `/data/products.json` + +4. **OpenAI Node**(或 HTTP Request 调本地 Ollama): + + - Prompt 示例: + + ```text + 从以下JSON中提取每个产品的简短摘要(不超过30字)并分类。 + ``` + +5. **Write to Database Node**(或 Google Sheet / CSV) + 保存提炼结果 + +6. **Telegram / Email Node** + 发送日报通知 + + +--- + +## 💡 六、后续增强建议 + +|功能|工具|说明| +|---|---|---| +|图像下载/视频下载|Scrapy 自带 `ImagesPipeline` 或 `requests`|下载并存储本地或 MinIO| +|多站点并行爬取|Scrapy 多 Spider + n8n 并行调度|自动轮询不同站点| +|数据可视化|Metabase / Grafana|接 PostgreSQL 实时展示产品趋势| +|向量搜索|Qdrant / Weaviate|用于AI语义检索| +|本地AI处理|Ollama + Llama3|替代外部API| + +--- + +是否希望我帮你再生成一个 **完整可导入的 n8n workflow JSON 文件模板**(包含 Cron、执行 Scrapy、读取 JSON、调用 AI、存入数据库)? +这样你只需导入到 n8n UI 就能立即自动化整个流程。 + +非常好 👍 +下面是一个**完整可导入的 n8n Workflow JSON 模板**,它能自动: + +1️⃣ 定时运行 Scrapy 爬虫(通过 Docker 命令) +2️⃣ 读取爬取的数据(`products.json`) +3️⃣ 调用 AI(可选择 OpenAI 或本地 Ollama)进行摘要与分类 +4️⃣ 存入数据库或文件 +5️⃣ 发送报告通知 + +--- + +## 🧩 一、Workflow 功能概览 + +|步骤|节点类型|功能| +|---|---|---| +|1|**Cron Trigger**|每天凌晨 2:00 自动触发| +|2|**Execute Command**|执行 `docker exec ecommerce-scraper scrapy crawl amazon`| +|3|**Read Binary File**|读取 `/data/products.json`| +|4|**OpenAI (或 HTTP Request)**|提炼摘要与分类(可切换 Ollama)| +|5|**Write Binary File**|输出 `data/products_summary.json`| +|6|**Email (或 Telegram)**|发送日报通知| + +--- + +## 📦 二、Workflow JSON 模板(可直接导入) + +将以下 JSON 内容保存为 +👉 `workflow_ecommerce_automation.json` +然后在 n8n Web UI → **Import from file** 导入。 + +```json +{ + "name": "Ecommerce Crawler + AI Summary", + "nodes": [ + { + "parameters": { + "triggerTimes": { + "item": [ + { + "mode": "everyDay", + "hour": 2 + } + ] + } + }, + "id": "1", + "name": "Cron Trigger", + "type": "n8n-nodes-base.cron", + "typeVersion": 1, + "position": [250, 250] + }, + { + "parameters": { + "command": "docker exec ecommerce-scraper scrapy crawl amazon" + }, + "id": "2", + "name": "Run Scrapy Crawler", + "type": "n8n-nodes-base.executeCommand", + "typeVersion": 1, + "position": [500, 250] + }, + { + "parameters": { + "path": "/data/products.json", + "options": {} + }, + "id": "3", + "name": "Read Products JSON", + "type": "n8n-nodes-base.readBinaryFile", + "typeVersion": 1, + "position": [750, 250] + }, + { + "parameters": { + "functionCode": "const data = JSON.parse(Buffer.from(items[0].binary.data.data, 'base64').toString());\nreturn data.map(p => ({ json: p }));" + }, + "id": "4", + "name": "Parse JSON", + "type": "n8n-nodes-base.function", + "typeVersion": 1, + "position": [1000, 250] + }, + { + "parameters": { + "model": "gpt-4-turbo", + "prompt": "你是一个电商产品分析助手。请从以下产品信息中提取每个产品的简短摘要(不超过30字)并归类到相应产品类别。\n\n输入数据:{{$json[\"title\"]}},价格:{{$json[\"price\"]}},评分:{{$json[\"rating\"]}}。\n\n输出格式:{\"title\":\"...\",\"summary\":\"...\",\"category\":\"...\"}" + }, + "id": "5", + "name": "AI Summarize & Categorize", + "type": "n8n-nodes-base.openAi", + "typeVersion": 2, + "position": [1250, 250], + "credentials": { + "openAIApi": { + "id": "YOUR-OPENAI-CREDENTIAL-ID", + "name": "OpenAI API" + } + } + }, + { + "parameters": { + "fileName": "/data/products_summary.json", + "options": {}, + "dataPropertyName": "json" + }, + "id": "6", + "name": "Write Summary JSON", + "type": "n8n-nodes-base.writeBinaryFile", + "typeVersion": 1, + "position": [1500, 250] + }, + { + "parameters": { + "fromEmail": "noreply@yourdomain.com", + "toEmail": "your@email.com", + "subject": "Daily Product Summary Report", + "text": "今日电商产品摘要已生成,请查看 /data/products_summary.json 文件。" + }, + "id": "7", + "name": "Send Email Notification", + "type": "n8n-nodes-base.emailSend", + "typeVersion": 1, + "position": [1750, 250] + } + ], + "connections": { + "Cron Trigger": { "main": [[{ "node": "Run Scrapy Crawler", "type": "main", "index": 0 }]] }, + "Run Scrapy Crawler": { "main": [[{ "node": "Read Products JSON", "type": "main", "index": 0 }]] }, + "Read Products JSON": { "main": [[{ "node": "Parse JSON", "type": "main", "index": 0 }]] }, + "Parse JSON": { "main": [[{ "node": "AI Summarize & Categorize", "type": "main", "index": 0 }]] }, + "AI Summarize & Categorize": { "main": [[{ "node": "Write Summary JSON", "type": "main", "index": 0 }]] }, + "Write Summary JSON": { "main": [[{ "node": "Send Email Notification", "type": "main", "index": 0 }]] } + }, + "active": true +} +``` + +--- + +## 🧠 三、使用说明 + +1. **导入流程** + + - 访问 `http://<你的服务器IP>:5678` + + - 点击右上角「Import from File」→ 选择上面的 JSON 文件 + +2. **配置 OpenAI 凭证** + + - n8n → Credentials → 新建 OpenAI API Key + + - 将 `YOUR-OPENAI-CREDENTIAL-ID` 替换为对应 ID + + - 若使用本地 Ollama,则: + + - 替换节点 `AI Summarize & Categorize` 为 “HTTP Request” + + - URL 填入 `http://ollama:11434/api/generate` + + - POST body 示例: + + ```json + { + "model": "llama3", + "prompt": "分析以下产品信息:{{$json[\"title\"]}} ..." + } + ``` + +3. **设置邮箱凭证** + + - n8n → Credentials → Email Send (SMTP) + + - 支持 Gmail, Outlook, AWS SES 等 + +4. **测试运行** + + - 手动点击 ▶️ 运行 + + - 查看 `/data/products_summary.json` + + - 邮箱将收到日报通知 + + +--- + +## 🚀 四、可选扩展 + +|目标|实现方式| +|---|---| +|改为多站点爬取|添加更多 spider(如 `jd_spider.py`, `ebay_spider.py`)并在 n8n 串联运行| +|增加数据库写入|在 n8n 中加入 “PostgreSQL Node” 写入产品与AI摘要| +|生成图表报表|把数据库接入 Grafana / Metabase| +|向量检索增强|在 n8n 中调用 Qdrant 插入语义向量| + +--- + +是否希望我在下一步帮你生成一个适配 **Ollama 本地模型(离线AI处理)** 的 workflow 版本? +它将不依赖外部API,完全在本地自动运行分析。 + + +