# 编辑客源 UI 设计文档 > **版本**:v1.0 · **日期**:2026-04-26 > **依赖规范**:UI_SYSTEM.md v1.2 · 组件规范设计.md v1.0 > **PRD 来源**:`Project/fonrey/PRD/客源管理/客源管理模块PRD.md` §5.15 + Story 14 > **优先级**:P0 功能在本文档中用 🔴 标注,P1 用 🟡,P2 用 ⚫ --- ## 目录 1. [模块概述](#1-模块概述) - 1.1 功能范围 - 1.2 页面清单 - 1.3 用户角色与权限差异 2. [页面设计规范](#2-页面设计规范) - 2.1 编辑客源主页面(三 Tab 表单) 3. [弹窗/抽屉设计规范](#3-弹窗抽屉设计规范) - 3.1 编辑基础信息弹窗(快捷入口,来自信息概览面板) 4. [交互状态规范](#4-交互状态规范) - 4.1 全局状态说明 - 4.2 权限控制矩阵 - 4.3 HTMX 请求规范 5. [关键数据字段说明](#5-关键数据字段说明) 6. [竞品截图对应关系](#6-竞品截图对应关系) 7. [实现优先级与工期估算](#7-实现优先级与工期估算) 8. [开放问题(待决策)](#8-开放问题待决策) --- ## 1. 模块概述 ### 1.1 功能范围 编辑客源模块包含以下功能,按优先级分组: **P0 — MVP 上线必须实现** 🔴 | 功能 | PRD 来源 | |------|---------| | 联系人 Tab:编辑主联系人及多联系人信息(姓名/称呼/电话1/电话2/微信/QQ/备注) | Story 14 §5.15.2 | | 联系人 Tab:查看号码权限验证(点击「查看号码」后才能编辑电话) | §5.15.2 | | 联系人 Tab:「标记无效」号码操作 | §5.15.2 | | 联系人 Tab:「+ 添加联系人」追加联系人区块 | §5.15.2 | | 基础信息 Tab:必填字段编辑(需求类型/用途/等级/来源) | §5.15.3 | | 基础信息 Tab:选填字段编辑(购房目的/付款方式/名下房产/贷款记录/证件/意向学校/入学时间) | §5.15.3 | | 二手 Tab:全量需求字段可编辑(总价/面积/居室/楼层/朝向/装修/楼龄/意向商圈/意向小区/交通/备注) | §5.15.4 | | 全局保存/取消操作(表单底部内联按钮,保存成功返回详情页) | §5.15.5 | | Tab 切换时保持各 Tab 表单数据不丢失 | §5.15.5 | | 表单校验:必填字段红框高亮 + 滚动定位到首个错误 | §5.15.5 | **P1 — 首迭代实现** 🟡 | 功能 | PRD 来源 | |------|---------| | 新房 Tab:新房需求字段编辑(待截图补充确认字段) | §5.15.4 注 | | 租房 Tab:租房需求字段编辑(待截图补充确认字段) | §5.15.4 注 | | 编辑基础信息弹窗(从信息概览面板「编辑客源」快捷入口触发,Story 22) | §5.23 | ### 1.2 页面清单 | 页面名称 | URL 模式建议 | 优先级 | 对应 PRD 章节 | |---------|------------|--------|--------------| | 编辑客源主页面 | `/clients//edit/` | P0 🔴 | §5.15 / Story 14 | | 编辑基础信息弹窗 | 无独立 URL,HTMX 局部渲染 | P1 🟡 | §5.23 / Story 22 | ### 1.3 用户角色与权限差异 | 功能 | 经纪人(归属人/首录人) | 经纪人(非归属人) | 店长/管理员 | |------|-------------------|-----------------|-----------| | 进入编辑客源页 | ✅ 可进入 | ❌ 无权限 | ✅ 可进入 | | 查看并编辑电话号码 | 需点击「查看号码」验证,通过后可编辑 | ❌ | ✅ | | 「标记无效」号码 | ✅ | ❌ | ✅ | | 编辑基础信息/需求信息 | ✅ | ❌ | ✅ | | 添加/删除联系人 | ✅ | ❌ | ✅ | | 「+ 添加联系人」按钮 | ✅ | ❌ | ✅ | > **说明**: > - 电话1 默认打码显示(`137****1234`),需权限验证后才能查看完整号码并进入编辑态。 > - 非归属人/非首录人访问 `/clients//edit/` 时,后端返回 403,前端重定向至详情页并展示 Toast "无权限编辑该客源"。 --- ## 2. 页面设计规范 ### 2.1 编辑客源主页面(P0 🔴) #### 2.1.1 页面概述 - **URL**:`/clients//edit/` - **访问入口**: - 私客详情页右侧信息概览面板「编辑」文字按钮 - 私客详情页需求信息 Tab 右上角「编辑」蓝色文字链接(跳转到编辑页的「二手/新房/租房」Tab 激活态) - **页面职责**:允许经纪人修改客源联系人信息、基础属性、购房/租房需求的全量字段 - **竞品参考截图**:`Project/fonrey/screenshots/客源/编辑客源.png` #### 2.1.2 布局结构 ``` ┌──────────────────────────────────────────────────────────┐ │ 面包屑导航:客源 / 客源管理 / 编辑客源 │ │ 页面标题:编辑客源(text-xl font-semibold) │ ├──────────────────────────────────────────────────────────┤ │ Tab 导航栏:[联系人] [基础信息] [二手/新房/租房] │ │ (Tab 下划线橙色激活 #F97316,对应竞品,非主色 Teal) │ ├──────────────────────────────────────────────────────────┤ │ │ │ 联系人 Tab 内容区 │ │ ┌────────────────────────────────────────────────────┐ │ │ │ [区块标题:联系人] [右上角:查看后可编辑号码 查看号码] [+添加联系人] │ │ │ │ │ │ │ 联系人 1 区块(白色卡片 rounded-lg) │ │ │ │ ● 姓名 [input] ● 电话1 [***打码] [标记无效] │ │ │ │ ● 称呼 ○先生 ○女士 电话2 [-] 微信 [-] │ │ │ │ QQ [-] │ │ │ │ 备注 [textarea] │ │ │ │ │ │ │ │ 联系人 2 区块(同上,右上角有「删除」红色链接) │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ ─ ─ ─ ─ 以下为基础信息区块(同页,分 Section 渲染)─ ─ │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 基础信息 │ │ │ │ ● 需求类型 ☑二手 □新房 │ │ │ │ ● 用途 ○住宅 ○别墅 ○商住 ○商铺 ○写字楼 ○其他 │ │ │ │ ● 等级 ○A ○B ●C ○D ○E │ │ │ │ ● 来源 [下拉] │ │ │ │ 购房目的 □刚需 □投资 □学区 □改善 □商用 □其他 │ │ │ │ 付款方式 ○全额 ○商业贷款 ○商贷+公积金 ○公积金 │ │ │ │ 名下房产 ○无 ○本地无外地有 ○本地有房 │ │ │ │ 贷款记录 ○有 ○无 │ │ │ │ 证件类型 [下拉] 证件号码 [input] │ │ │ │ 意向学校1 [input] + 添加学校 │ │ │ │ 入学时间 [月份选择器] │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 二手(需求信息区块,仅在「二手」Tab 或同页展示) │ │ │ │ ● 总价 [数字输入] - [数字输入] 万元 │ │ │ │ ● 面积 [数字输入] - [数字输入] m² │ │ │ │ ● 居室 □1居 □2居 □3居 □4居 □5居及以上 │ │ │ │ 楼层 □不要一层 □低楼层 □中楼层 □高楼层 □不要顶层│ │ │ │ 朝向 □东 □南 □西 □北 │ │ │ │ 装修 □毛坯 □清水 □简装 □中装 □精装 □豪装 │ │ │ │ 楼龄 □5年以内 □5-10年 □10-15年 □15-20年 □20年以上│ │ │ │ 意向商圈 [下拉多选] │ │ │ │ 意向小区1 [input] + 添加小区 │ │ │ │ 交通 [input, max 50字] │ │ │ │ 备注 [textarea, max 200字] │ │ │ └────────────────────────────────────────────────────┘ │ │ │ ├──────────────────────────────────────────────────────────┤ │ 表单底部内联操作区:[保存(Teal 主按钮)] [取消(白色边框)] │ └──────────────────────────────────────────────────────────┘ ``` > **截图与文档差异说明**:竞品截图(`编辑客源.png`)显示三个 Tab(联系人/基础信息/二手)**在同一页面内纵向分 Section 展示**,并非切换 Tab 才能看到内容——联系人、基础信息、二手三个区块都在一个页面滚动展示。顶部 Tab 的功能是**快速定位锚点**(点击 Tab 滚动到对应区块),而非隐藏其他区块。以截图为准实现。 #### 2.1.3 区域详细规范 --- **[顶部面包屑 + 标题区]** | 属性 | 说明 | |------|------| | 面包屑 | `客源 / 客源管理 / 编辑客源`,使用 `text-sm text-neutral-500`,分隔符 `/`,最后一级用 `text-neutral-700` | | 页面标题 | `编辑客源`,`text-xl font-semibold text-neutral-800` | | 布局 | 面包屑在上,标题在下,左对齐,顶部 padding `pt-6 pb-4` | --- **[Tab 导航栏]** | 属性 | 说明 | |------|------| | 组件 | §10 Tab Navigation(组件规范设计.md) | | Tab 项 | 「联系人」「基础信息」「二手/新房/租房」(第三项 label 根据客源需求类型动态确定) | | 激活样式 | **注意:竞品使用橙色下划线** `border-b-2 border-orange-500 text-orange-500`,与系统主色 Teal 不同。为保持一致性,**本模块 Tab 激活色统一使用橙色** `#F97316`(`text-orange-500 border-orange-500`),以匹配竞品客源模块整体视觉风格 | | 非激活样式 | `text-neutral-500 hover:text-neutral-700 border-b-2 border-transparent` | | 行为 | 点击 Tab 触发 Alpine.js 平滑滚动到对应 Section 的锚点(`scrollIntoView({ behavior: 'smooth' })`),不做 HTMX 请求;Tab 同时高亮当前可见区域(Intersection Observer 驱动) | | 粘性 | Tab 栏 `sticky top-0 z-10 bg-white border-b border-neutral-200` | ```html
``` --- **[联系人 Section]**(锚点 `id="section-contacts"`) 区块标题行: | 元素 | 说明 | |------|------| | 标题 | `联系人`,`text-base font-semibold text-neutral-800` | | 右侧辅助文字 | `查看后可编辑号码`,`text-sm text-neutral-400` | | 「查看号码」按钮 | `text-sm text-info-600 hover:underline cursor-pointer`,点击后触发查看号码确认流程(见下方) | | 「+ 添加联系人」按钮 | `btn-secondary text-sm`,位于标题行右侧最末,点击后 Alpine.js 动态追加联系人区块 | **联系人区块(每个联系人独立卡片)**: ``` bg-white rounded-lg border border-neutral-200 p-5 mb-4 ``` 区块内字段布局为**网格布局**,参考截图:3列网格,每列包含"字段名 + 输入组件"。 | 字段 | 必填 | 组件类型 | 校验 | 备注 | |------|------|---------|------|------| | 姓名 | ✅ | `` | 不可为空,最多50字 | 与录入一致 | | 称呼 | ✅ | 单选 Radio | 选一 | `○ 先生 ○ 女士` | | 电话1 | ✅ | 区号下拉 + 手机号 input | 手机号格式 | 默认打码,需「查看号码」后才能编辑(见下方交互) | | 标记无效 | — | 蓝色文字链接 | — | 显示在电话1 旁,点击 HTMX PATCH 标记 `phone_is_invalid=True` | | 微信 | 否 | `` | — | 显示 `-` 时可直接编辑 | | 电话2 | 否 | 区号下拉 + 手机号 input | 手机号格式(若填写) | 同电话1,但无打码逻辑 | | QQ | 否 | `` | — | | | 备注 | 否 | `