﻿# 2026-07-31 产品确认清单（A 端 / B 端 / C 端）

- **提出人**：任远帅
- **状态**：待产品确认
- **依据文档**：
  - B 端：`VISTA_Link_产品需求文档.md` V0.201（2026-07-30）、`../../internal/VISTA_Link_B端范围变更确认记录.md`（2026-07-29）
  - A 端：`vista-new-c/A端需求/输出稿/01~04`、`A端需求/评审记录/2026-07-31-A端待产品确认问题清单.md`
  - C 端：`vista-new-c/C端需求/`（01 页面体系、02 Widget 体系、03 通用组件体系）
  - 技术侧：`AI-DOC/技术设计/VISTA-Link-B端项目/`、`AI-DOC/技术设计/HOMEVISTA-A端/`
  - 现状：`vista-admin/doc/现有的vista-b的登陆校验逻辑.md`（2026-07-31）
- **使用方式**：每条问题分为「PRD 现状」和「需产品拍板」。带 🔴 的是不确认就无法开工的阻塞项。
- **端归属标记**：每条问题标注需要在哪一端定义或落地。`A`＝A 端运营管理；`B`＝VISTA Link 销售工作台；`C`＝HOMEVISTA 客户访问端。多端并列表示该问题在多端同时存在，必须一次性对齐，不能各端分别决定。

## 追踪编号

| 主题 | 本文档章节 | 端归属 | 追踪编号 |
|---|---|---|---|
| 登录校验逻辑 | §1 | **B**（Q1-7 涉及 C） | [ISSUE-062](./ISSUE-062.md) |
| 顾客 / 链接 / 页面关系 | §2 | **B + C**（Q2-5 涉及 A） | [ISSUE-063](./ISSUE-063.md) |
| 素材定义、维度与 Widget 选材匹配 | §3 | **A + B + C** | [ISSUE-064](./ISSUE-064.md) |
| A 端与 B 端页面库是否互通 | §4 | **A + B + C** | [ISSUE-065](./ISSUE-065.md) |
| 链接与顾客的绑定关系 | §5 | **B + C** | [ISSUE-066](./ISSUE-066.md) |
| 页面封面字段缺失 | §6 | **A + B**（术语区分涉及 C） | [ISSUE-067](./ISSUE-067.md) |
| Widget 定义与实例的关系 | §7 | **A + B + C** | [ISSUE-068](./ISSUE-068.md) |
| 主题的作用域与 B 端归属 | §8 | **A + B + C** | [ISSUE-069](./ISSUE-069.md) |

---

## 0. 阻塞项速览

| 编号 | 端 | 问题 | 阻塞对象 |
|---|---|---|---|
| 🔴 Q1-1 | B | 统一登录服务到底是新建，还是把现有 vista-b 登录包装成 SSO | 账号模型、密码算法、迁移方案 |
| 🔴 Q1-3 | B | 登录时绑定项目（现状）vs 登录后选项目（PRD §4.8.3），且与 B-010 冲突 | 登录接口契约、会话结构 |
| 🔴 Q3-1 | A+B+C | 「分类 × 类型」两套清单对不上，缺完整矩阵 | 素材表结构、筛选器 |
| 🔴 Q3-8 | A+B+C | Widget 选材只按类型精确匹配，在现有类型值域下走不通 | 选材器、Widget 定义契约 |
| 🔴 Q4-1 / Q4-3 | A+B | A/B 是否同一套页面数据；两套状态机如何合并 | 页面领域模型、上游投影 |
| 🔴 Q5-3 | B | 自动创建的顾客负责人为空，与数据权限规则冲突 | 客户列表可见性、权限设计 |
| 🔴 Q6-1 | A+B | A 端页面无封面字段，B 端却把它当必填上游数据 | 上游投影、页面库列表 |
| 🔴 Q7-1 / Q7-2 | A+B+C | Widget 定义 : 实例是一对多，但 A 端元数据只有 3 项，撑不起 B 端要求的 13 项 | Widget 定义契约、页面编辑器、选材过滤 |
| 🔴 Q8-3 | A+B+C | B 端 PRD 全文无「主题」，销售页面在 C 端用哪套主题未定义 | B 端预览一致性、C 端渲染 |

---

## 1. 登录：是否沿用现有 B 端登录校验逻辑

> **端归属：B 端**（Q1-7 同时涉及 C 端）。A 端运营管理端自身的登录不在本次范围，但若 Q1-1 选择新建统一登录服务，A 端后续需一并对接。

### PRD 现状（§4.8、§6.4、§10）

- 邮箱 + 密码登录；**统一登录服务**负责身份认证和密码处理，界面不出现 SSO 字样。
- 明确写了：「用户无需先进入旧 B 端，旧 B 端不是登录入口」「VISTA Link 不使用旧 B 端账号状态或权限完成登录判断」。
- 旧 VISTA 的账户 / 项目成员 / 角色权限**只允许技术人员一次性迁移**，界面不提供导入入口。
- 登录成功 → 建 VISTA Link 会话 → 读可访问项目 → **必须进项目选择页**（只有一个项目也不自动进）。
- 会话「必须设置有效期」，无「退出所有设备」；密码 / Token / 会话凭证不得写操作日志。

### 现有 vista-b 实际做的（对照）

| 维度 | 现有 vista-b | PRD 是否覆盖 |
|---|---|---|
| 账号标识 | 手机号**或**邮箱（含 `@` 走邮箱） | ❌ PRD 只写邮箱 |
| 项目绑定 | 登录请求带 `vistaId`，非项目成员直接 `800004` 拒登 | ❌ PRD 是先登录后选项目 |
| 密码 | 前端加密 → `SHA-256` 或 `Base64(MD5)`，Redis 缓存优先 | ❌ 未提 |
| IP 白名单 | `@IPRestricted` + 配置中心 `vista.allowip.{vistaId}` | ❌ 未提 |
| 失败锁定 | 用户 10 次 / 30 分钟、IP 100 次 / 24 小时，**但主流程不查冻结表，正确密码可绕过** | ❌ 未提 |
| 人机验证 | reCAPTCHA 独立接口，**未与登录闭环** | ❌ 未提 |
| 二次验证 | 在 token 签发**之后**，验证成功不改变授权；验证码 4 位、1 小时有效、**可重放** | ❌ 未提 |
| 设备识别 | 任意非空 `deviceIdentifier` 即视为已知设备 | ❌ 未提 |
| 初始密码 | `verifyUserPwd` + `IS_EDIT_ORI_PWD`，是否强制跳转由前端决定 | ❌ 未提 |
| Token | JWT 15 天，重复登录不清旧 token，多 token 并存 | ⚠️ 只写「必须设置有效期」 |
| 超管 | 配置 `vista.super.admin` 白名单可跳过成员校验 | ❌ 未提 |

### 需产品拍板

| # | 端 | 确认项 |
|---|---|---|
| 🔴 Q1-1 | B | **「统一登录服务」的实体是什么？** 新建独立 SSO，还是把现有 vista-b 的 `USER` 表 + `userLogin` 包装成统一登录服务？两者在密码算法（是否保留 `Base64(MD5)` 兼容）、token 格式、迁移是否需要用户重设密码上完全不同 |
| Q1-2 | B | **登录标识只支持邮箱吗？** PRD 说「登录邮箱不可修改」。现有账号中只有手机号、没有邮箱的用户迁移后如何登录？是否需要一次性补录邮箱的运营流程 |
| 🔴 Q1-3 | B | **项目绑定时机以哪个为准？** PRD §4.8.3「登录后选项目」／范围变更记录 B-010「登录后已确定、不再选择」／现有 vista-b「登录即绑定、非成员拒登」三方不一致。我方按 PRD V0.201 理解为「先登录、再选项目」，需正式裁定 |
| Q1-4 | B | **安全策略：对齐现状还是重做？** 现有冻结、人机验证、二次验证在源码层面均未生效。若要保留，请给参数：失败锁定阈值与时长（锁定期间正确密码是否也拒绝，现状是放行）／人机验证第几次触发、不通过是否真的拦截／是否保留二次验证与可信设备、是否改为验证通过才签发 token／是否保留 IP 白名单及由谁维护（§4.7 无此入口）／是否保留初始密码强制修改 |
| Q1-5 | B | **会话有效期给具体值。** 现有 15 天且多 token 并存。请给出有效期、是否滑动续期、同一账号多设备是否允许并存（PRD 已明确不做「退出所有设备」） |
| Q1-6 | B | **会话过期后是否回跳原地址？** §4.8.7 只写「重新登录后需重新选择项目」。销售从聊天工具点开页面详情被踢到登录页，登录后落在哪 |
| Q1-7 | **B + C** | **确认 C 端顾客认证与 B 端登录是两套。** §4.3.7 的顾客只用邮箱验证码、不登录 VISTA Link。需确认**不复用**现有 vista-b 的验证码接口（4 位码、1 小时有效、校验后不失效、可重放），C 端另起一套一次性验证码 |

---

## 2. 顾客 / 链接 / 页面 三者关系

> **端归属：B 端 + C 端**。关系与提示在 B 端定义，识别与失效表现在 C 端落地；Q2-5 因系统提供页面由 A 端产出，同时涉及 A 端。

### PRD 现状（你的疑问 PRD 里其实已经有答案，先对齐）

| 问题 | PRD 的回答 | 出处 |
|---|---|---|
| 页面是固定链接吗？ | 是。一个分享页面 ↔ 一条固定链接，一一对应，不能创建第二条；编辑页面不改地址和二维码 | 术语表、§4.3.2、§4.3.3 |
| 只存在「是否添加顾客」的差别吗？ | 是。指定顾客只是在固定链接后加一个**随机客户标识参数**；带参数地址不是新链接，不进链接列表 | §4.3.2 |
| 顾客被删除，链接会失效吗？ | **不会。** 只有该顾客对应的参数永久失效，链接本身照常可用，按无参数固定链接处理 | §4.1.8、§4.3.2、§4.3.7 |
| 去掉顾客参数还是能访问？ | 是。公开链接直接看；非公开链接走浏览器会话识别，识别不到就要邮箱验证码 | §4.3.7 |
| 那指定顾客意义何在？ | PRD 明说：**指定顾客用于身份识别，不是账号级访问授权**，任何拿到带参数地址的人都可能被识别为该顾客 | §4.3.2、§9.1 风险表 |

一条链接可关联多个顾客；一个顾客可关联多条链接；同一链接 + 同一顾客只保留一个有效参数（重复指定返回同一地址）。

### 需产品拍板

| # | 端 | 确认项 |
|---|---|---|
| Q2-1 | **B + C** | **顾客删除后的降级是静默的。** 已发出的带参数地址会悄悄变成「需要验证身份」（非公开）或「匿名可看」（公开），销售侧无提示。是否需要在页面详情 / 关联顾客列表提示「该顾客已删除，此前发出的地址已失去识别能力」？ |
| Q2-2 | **B + C** | **是否需要真正的「只有指定顾客能看」模式？** 销售的心理预期（发给谁只有谁能看）与实际行为（谁拿到都能看）不一致。请正式确认「不做强绑定」，或提出一人一链接 / 一次性访问的需求 |
| Q2-3 | B | **发错人怎么补救？** PRD 写「当前不提供按客户单独停用参数」，唯一手段是停用整条链接，会连带影响该链接上其他所有顾客。是否接受？ |
| Q2-4 | **B + C** | **页面删除后的残留关系怎么展示？** §4.3.3 / §4.3.6：页面删除 → 链接自动停用且不能再启用，但顾客关联关系和参数继续保留。顾客详情里会出现一批指向死链的记录，展示成什么样？ |
| 🔴 Q2-5 | **A + B** | **系统提供页面是全项目共用一条固定链接。** §4.3.1 写「VISTA ADMIN 更新后原固定链接展示最新内容，会同时影响所有使用该页面的销售」。推论：①销售 A 和销售 B 给各自顾客生成的参数挂在同一条链接上；②管理员停用它，全项目分享同时失效；③「关联顾客列表」里销售 A 会看到销售 B 的顾客。请确认三点是否都是预期行为，第三点涉及客户数据权限（§4.7） |

---

## 3. 素材是什么、素材的维度、Widget 选材如何匹配

> **端归属：A + B + C 三端都存在。** 类型与呈现方式由 C 端和来源系统定义，A 端在「选择项目内容」时使用同一套素材，B 端做选材和标签维护。三端必须使用同一套值域，不能各自定义。

### PRD 现状（§4.2、B-005 / B-006 / B-007）

- **定义**：素材 = 当前项目内**可被 Widget 选择的内容**。不只是文件。
- **边界**：B 端**不上传、不创建、不删除**素材，也不能改类型、来源、原始地址、文件内容和结构化业务数据。B 端只能维护两样东西——**素材说明**和**素材标签**。
- **不属于素材**：页面、Widget 定义、页面模板、客户；来场预约 / 联系 / 下载等入口是 Widget，不进素材列表。
- **已声明的维度**：

| 维度 | 内容 | 谁维护 |
|---|---|---|
| 名称 | 来源端 | 来源端 |
| 分类 | 描述所属空间或内容对象；现阶段只有「大楼外观」「室内空间」 | 来源端 |
| 类型 | 描述呈现方式；至少覆盖 图片 / 视频 / PDF / WALK / VR / 3D 大楼 / 户型 / 眺望 / 资料集 | 来源端 |
| 标签 | 项目内生效，与客户标签分开管理 | **B 端**（营销企划 / 项目管理员） |
| 素材说明 | 自由文本，记录用途和使用建议，**不展示给顾客** | **B 端** |
| 更新时间 | — | 来源端 |
| 类型专属属性 | 户型保留面积、LDK、楼栋、楼层等结构化字段与关联关系，不能压成图片 | 来源端 |
| 链接类素材 | 必须有明确业务类型（官网 / 第三方 VR / WALK / 3D 大楼 / 项目资料），不能只存 URL | 来源端 |

### Widget 选材时「为什么能选出来」——现状的判定链

PRD §4.3.4 和技术设计给出的准入条件只有三条，**分类完全不参与**：

```
候选素材 = 当前项目 (project_id)
         ∧ 上线状态 (status = online)
         ∧ 素材类型 ∈ Widget 定义的「允许素材类型」
```

- §4.3.4：「系统先限定当前项目，再按当前 Widget 允许的素材类型自动筛选」「WALK Widget 只显示 WALK 素材，VR Widget 只显示 VR 素材」「用户不能取消 Widget 自带的素材类型限制」。
- 技术设计 `material_projection.material_type` 是唯一过滤键（值如 `walk`/`vr`/`pdf`/`image`/`link`），不匹配返回 `MATERIAL_TYPE_NOT_ALLOWED`；`category` 字段注明「用于列表筛选」，不参与准入。
- Widget 侧的允许类型放在 `widget_definition.rules_json`；`GET /materials?eligibleFor={widgetDefinitionId}` 服务端只按「允许类型 + 项目 + 上线状态」过滤。
- 素材数量、实例数量、必需项**不在选材时拦截**，统一延后到页面保存时按完整草稿校验。
- 名称 / 分类 / 类型 / 标签是给人用的**二次筛选**，只在已准入的候选集内收窄，不能扩大候选集。

**所以「分类匹配」这个机制目前并不存在**——分类只是展示和人工筛选维度。这正是问题所在。

### 需产品拍板

| # | 端 | 确认项 |
|---|---|---|
| 🔴 Q3-1 | A+B+C | **请给出完整的「分类 × 类型」矩阵。** §4.2 开头列了 9 种类型（图片 / 视频 / PDF / WALK / VR / 3D 大楼 / 户型 / 眺望 / 资料集）；§4.2.1 却说现阶段分类只有「大楼外观」「室内空间」，其下类型只有 `VISTA Building 3D`／`VISTA City`／`VISTA Building WALK`（大楼外观）和 `VR`／`WALK`（室内空间）。**图片、视频、PDF、户型、眺望、资料集这 6 类无处安放** |
| Q3-2 | A+B | **分类的形态**：单选还是多选？一级还是两级？没有分类的素材怎么显示、怎么被筛到？分类由谁维护（PRD 只说标签 B 端可维护） |
| Q3-3 | A+B+C | **类型枚举的权威方是谁？** §4.2 说「由 C 端和来源系统定义，VISTA Link 使用这些定义」，§4.2.1 又把值写死。类型是上游下发的动态字典，还是各端固化枚举？新增类型时是否需要改代码 |
| Q3-4 | B | **类型专属属性是否参与检索？** PRD 要求保留户型的面积、LDK、楼栋、楼层，但 §4.2.1 的筛选条件只有分类 / 类型 / 标签。销售选材能不能按 LDK 或面积筛？ |
| Q3-5 | A+B+C | **素材的「可分享单位」怎么定？** 一个 VR 项目是一条素材，还是每个房间一条？「资料集」是一条素材还是一组 PDF？这决定 Widget 的「素材数量限制」怎么算 |
| Q3-6 | **B + C** | **素材下线后 C 端顾客看到什么？** §4.2 说已加入页面的素材下线时「标记为已下线 / 已删除」，§4.3.4／§4.3.5 又说已下线素材不能保存。已发布页面中的素材被下线时，顾客侧表现（隐藏 Widget / 显示占位 / 整页报错）未定义 |
| Q3-7 | A+B | **素材的上游到底是哪个系统？** §10 把「A 端」和「VISTA ADMIN 及现有内容系统」分开列，素材写在 VISTA ADMIN 一栏；A 端 PRD 中模块「选择项目内容」的候选又是 A 端的项目数据。素材目录 API 对接谁 |
| 🔴 Q3-8 | A+B+C | **现有类型值域下，「只按类型精确匹配」走不通，需要产品选定匹配模型。** 三处具体冲突见下方 |
| Q3-9 | A+B+C | **Widget 允许多种类型时是「或」关系（满足任一即可入选），且不能被用户放宽——请确认。** 另确认：是否存在「某 Widget 只接受某个分类下的某类型」这种需求（若有，模型必须升级为方案 B） |

#### Q3-8 的三处具体冲突

1. **两套值域对不上，且「WALK」在两个分类下都出现。**
   §4.3.4 写「WALK Widget 只显示 WALK 素材」。那 `VISTA Building WALK` 算不算 WALK？
   - 若按字符串精确相等 → **大楼 WALK 永远进不了 WALK Widget**；
   - 若按包含 / 前缀匹配 → 室内 WALK 和大楼 WALK 会混在同一个候选集里，而**分类不参与准入**，销售在选材器里无法区分这两种完全不同的内容。
2. **链接类素材是第二套类型码。**
   技术设计里链接类素材 `material_type = 'link'`，真实业务类型藏在 `attributes_json`（官网 / 第三方 VR / WALK / 3D 大楼 / 项目资料）。于是同一个「WALK」既可能是 `material_type = walk`，也可能是 `material_type = link` + 业务类型 `WALK`。**WALK Widget 到底认哪一个？** 若只认前者，来源端以链接形式提供的 WALK 全部选不出来。
3. **「3D 大楼」的粒度未定。**
   `VISTA Building 3D` 和 `VISTA City` 是同属「3D 大楼」类型的两个子品牌，还是两个独立类型？直接决定 3D 大楼 Widget 的允许类型要写几个值。

#### Q3-8 的三个可选模型（请产品选一个）

| 方案 | 匹配规则 | 代价 |
|---|---|---|
| **A（建议）** 类型扁平且全局唯一，分类只做展示分组 | `material_type ∈ Widget.allowedTypes`，维持现状 | 必须先把 §4.2 的 9 种和 §4.2.1 的品牌化值统一成**一套值域**，且「室内 WALK」和「大楼 WALK」必须是两个不同的类型码；链接类素材要么按业务类型拆成正式类型，要么明确 Widget 不接受 link |
| **B** 用「分类 + 类型」二元组匹配 | `(category, type) ∈ Widget.allowedPairs` | Widget 定义契约要改，A 端 Widget 注册界面要同时选分类；分类从此变成强约束，来源端不能随意调整 |
| **C** 引入独立的「素材能力码」，与展示用的分类 / 类型解耦 | `capability ∈ Widget.requiredCapabilities` | 多一层映射维护成本，但对来源端改名 / 加品牌最不敏感，长期最稳 |

---

## 4. A 端和 B 端的页面库是否互通

> **端归属：A + B 两端都存在**（Q4-3 / Q4-4 / Q4-5 / Q4-8 的结果直接决定 C 端顾客看到什么，需三端一起确认）。

### PRD 现状（两份文档的说法拼起来）

**B 端 PRD 的说法：**
- 「页面模板只在 A 端用于生成系统提供页面，**B 端不读取或管理页面模板**」（§5、§10）
- A 端提供「已注册 Widget 定义和**生成完成的系统提供页面**」（§10）
- 「系统提供页面的发布、更新和下架由 **VISTA ADMIN** 负责」（§4.3.1）
- 销售创建页面「默认只向创建人和项目管理员展示」（§1.6）

**A 端 PRD 的说法（§5.2 页面来源）：**

| 页面显示 | 产品标识 | 创建端 |
|---|---|---|
| 系统默认提供 | `system-default` | A 端 |
| 客户自定义 | `customer-custom` | **B 端**（本期不实现创建流程） |

并且写了：「后续接入 B 端创建页面时，**A 端可展示「客户自定义」记录**；是否允许 A 端编辑此类页面由后续权限需求定义」。

→ **A 端 PRD 的设计意图是「同一套页面数据、用来源字段区分」；B 端 PRD 完全没提销售创建的页面会出现在 A 端。**

### 需产品拍板

| # | 端 | 确认项 |
|---|---|---|
| 🔴 Q4-1 | **A + B** | **是不是同一套页面数据？** B 端的「系统提供页面」和 A 端的「系统默认提供页面（`system-default`）」是同一个对象吗？若是，术语要统一，并明确 B 端销售创建的页面是否写入同一张表、带 `customer-custom` 来源 |
| Q4-2 | **A + B** | **A 端能不能看到 / 编辑 B 端销售创建的页面？** A 端说「后续定义」，B 端说销售页面只对创建人和项目管理员可见。若 A 端运营可见，等于运营方能看销售的私有页面（我方建议：A 端只读且默认不可见） |
| 🔴 Q4-3 | **A + B + C** | **两套状态机怎么合并？** A 端＝草稿/已上线/已下线 + 发布快照（改了必须重新预览+发布）；B 端＝链接启用/停用 + 公开/非公开，且「编辑后立即展示最新内容」。同一对象不可能并存。B 端销售页面是否也要走「草稿→完成预览→发布」？ |
| Q4-4 | **A + B + C** | **访问控制的两个开关是不是同一个字段？** A 端「允许未登录顾客查看」 vs B 端「公开访问」。谁能改？A 端设为不允许时，B 端销售还能不能设成公开？ |
| Q4-5 | **A + B + C** | **A 端把系统页面下线后，B 端和 C 端表现是什么？** ①页面库还显示吗、还能被复制 / 分享吗？②销售此前复制出去的独立页面是否受影响（按 §4.3.4 应不受影响，请确认）？③顾客打开已下线的系统页面链接看到什么——A 端 PRD 写「页面已下线或暂不可用」，而 B 端 §4.3.7 只定义了「已删除」和「已停用」两态，**缺「已下线」** |
| Q4-6 | **A + B** | **B 端「新建空白页面」在 A 端模型里怎么表达？** A 端页面对象要求必须有「来源模板标识和名称」，且明确「不提供无模板空白创建路径」；B 端空白页面没有来源模板。留空还是绑隐式空模板？ |
| Q4-7 | **A + B** | **术语统一。** A 端管「Widget 复制进页面后」叫**模块**，B 端全程叫 **Widget**。请定一个（含接口字段命名） |
| Q4-8 | **A + B + C** | **页面里的 Widget 是快照还是实时？** A 端明确「加入时的元数据快照，来源 Widget 停用/改名/改元数据都不影响已有模块」；B 端只提到有「定义版本」，未说是否固化（B 端技术设计问题报告 P0-3 已记录该冲突） |

---

## 5. 链接与顾客在 B 端 / C 端的绑定关系

> **端归属：B 端 + C 端**。绑定关系与统计口径在 B 端，身份识别、认证与切换在 C 端。

### PRD 现状（§4.3.7 已给出完整流程，先对齐）

**分享时不选顾客：**
1. 顾客打开无参数固定链接 → 先判链接状态（已删除 / 已停用 → 直接终止）；
2. 链接**已公开** → 直接看，**不创建顾客、不建关系、不进统计**；
3. 链接**未公开** → 查浏览器里的客户访问会话；识别不到 → 要求填邮箱 + 一次性验证码。

**填的邮箱在当前项目已存在** → 识别为该已有顾客，**保留其原负责人**，与该链接建立关系（来源记为「客户访问认证」）。

**填的邮箱不存在** → 自动在当前项目创建新顾客：姓名 = 邮箱前缀、来源 = 「链接访问认证」、状态 = 项目默认状态、**负责人 = 空**。

**分享时选了顾客：** 是的，等于绑定。系统生成随机参数、**在复制地址那一刻就建立顾客 ↔ 链接关系**并记录首次关联来源和操作人。参数与浏览器已有身份冲突时，必须弹脱敏身份确认页，默认保留当前浏览器身份，**不能静默覆盖**；识别完成后地址栏去掉参数。

### 需产品拍板

| # | 端 | 确认项 |
|---|---|---|
| Q5-1 | B | **「关联顾客」的语义是「发过」还是「看过」？** 关系在销售复制地址时就建立，顾客可能从没打开过。「关联顾客数」会把没访问过的人算进去。请确认口径，并明确后续统计（§4.6）里「关联顾客」和「访问顾客」是不是两个指标 |
| Q5-2 | **B + C** | **邮箱匹配规则。** 是否大小写不敏感？是否忽略 `+alias`、点号等变体？只匹配「邮箱」字段（LINE / WhatsApp / 备用电话不参与）？该规则同时受 §4.1.2「邮箱在项目内唯一」约束 |
| 🔴 Q5-3 | B | **自动创建的顾客负责人为空，谁跟进？** 该顾客由某个销售的链接带来，销售却可能因负责人为空在自己客户列表里看不到。两方案择一：(a) 保持为空 + 增加「待分配顾客」入口或提醒；(b) 自动归属为链接所属页面的创建人——但系统提供页面全项目共用一条链接，无法确定是谁分享的（见 Q2-5） |
| Q5-4 | B | **已有顾客通过认证进来时的可见性。** 若该顾客负责人是别的销售，当前销售能否在「关联顾客列表」里看到姓名和编号？§4.3.3 只说需要「查看客户」权限，没说是否受负责人数据权限限制 |
| Q5-5 | **B + C** | **公开链接完全不进统计。** 销售一旦用公开链接分享就永远拿不到跟进数据。请确认产品接受，或是否需要为公开链接保留匿名 PV |
| Q5-6 | **C**（影响 B 统计） | **会话跨链接复用带来的串号风险。** 同一浏览器在同一项目内访问其他无参数链接时不重复认证。样板间共用 iPad、家人共用电脑时，所有访问算到第一个认证的人身上。术语表提到「客户主动切换身份」，但**访问流程中没有定义该入口**。是否需要在 C 端提供显式的「不是我 / 切换身份」入口？ |
| Q5-7 | **C** | **顾客侧的隐私告知。** 邮箱验证码属于收集个人信息，日本个人情报保护法下是否需要在认证页展示隐私说明 / 同意勾选？验证码邮件的发件人、语言（日 / 英）、文案由谁提供？ |

---

## 6. 页面封面：A 端无此字段，B 端却当作必填上游数据

> **端归属：A 端 + B 端**（Q6-9 的术语区分涉及 C 端）。
> 本节来自 [A端待产品确认问题清单 Q-01](../../../vista-new-c/A端需求/评审记录/2026-07-31-A端待产品确认问题清单.md)，合并到本清单统一跟踪。

### 现状

**A 端侧：完全缺失。** `03-A端项目页面管理PRD.md` 全文无封面字段——§5.3 项目页面组成、§8.1 项目页面列表、§8.2 新增和编辑页面、§9 数据与配置说明（`instance_*` 无 `cover_*`）四处均无；§5.9 发布快照也不含封面。`01/02/04` 及 `AI-DOC/技术设计/HOMEVISTA-A端/` 同样零出现。

**B 端侧：已作为必填依赖写死。**

| 来源 | 原文 |
|---|---|
| B 端 PRD §4.3.1 | 列表展示**页面缩略图** + 页面名称；「页面缩略图使用页面保存的封面图，不从页面素材中自动截取」「页面封面和页面缩略图统一使用 16:9 比例」 |
| B 端用例文档 | 「页面缩略图使用页面保存的**系统默认封面图**」 |
| 上游投影技术设计 §2/§3/§4 | 系统提供页面「只投影目录（标识、名称、**封面**、状态、当前发布版号）」；字段 `system_page_catalog.cover_default_code`；「每个系统提供页面在页面库中都有名称、16:9 封面和可用固定链接」 |
| 页面库与客户访问技术设计 §3.1 | 「封面不能为空」；复刻系统提供页面时「默认沿用原页面封面（`cover_default_id` 直接沿用）」 |
| B 端总体技术设计 §2 | 「封面为空时不能保存页面」 |

**后果：** ①`cover_default_code` 无上游数据，只能由 B 端随机兜底，与「使用页面保存的封面图」直接矛盾；②「复刻时沿用原页面封面」失去起点，销售复制出的页面封面与原页面不一致；③A 端页面列表本身也无视觉识别信息。

### 需产品拍板

| # | 端 | 确认项 | 建议方案 |
|---|---|---|---|
| 🔴 Q6-1 | **A + B** | A 端项目页面是否新增「页面封面」字段，是否必填？ | 必填。创建页面时系统自动选中一张平台默认封面，可更换 |
| Q6-2 | **A + B** | 封面来源范围：平台默认封面库 / A 端上传自定义图 / 从项目素材中选择？ | 与 B 端销售侧口径一致：平台默认封面库 + 允许上传；不进素材库 |
| Q6-3 | **A + B** | 若允许 A 端上传，上游投影只有 `cover_default_code` 是否够用？ | 需扩展为 `cover_source` + 图片引用，否则 A 端上传的封面无法传到 B 端（需同步给 B 端技术） |
| Q6-4 | **A + B** | 比例与规格：是否统一 16:9？最小像素、格式、大小上限？ | 统一 16:9，与 B 端 `page_cover_default` 规格对齐 |
| Q6-5 | **A + B** | 封面是否进入发布快照？改封面是否算「未发布修改」、是否使已完成预览失效、是否必须重新发布？ | B 端技术设计称「封面只影响 B 端页面库展示，不影响 A 端发布版内容」；若采纳则封面走目录同步、不进快照、不触发重新预览——需明确拍板（与 Q4-3 的状态机结论强相关） |
| Q6-6 | **A** | A 端页面列表是否展示封面缩略图（§8.1 是否增列）？ | 增列，与 B 端页面库观感一致 |
| Q6-7 | **A** | 页面模板是否也带默认封面并在创建页面时带入？ | 模板带默认封面，页面创建时复制为页面自身数据，后续不跟随模板 |
| Q6-8 | **A + B** | A 端更换封面后，B 端已复刻的页面是否同步更新？ | 不同步。复刻为一次性拷贝，只更新 `a_preset` 引用记录的封面 |
| Q6-9 | **A + C** | 术语区分：A 端「页面封面」与 C 端 M-01「项目封面图」是否明确为两个对象？ | 明确区分。页面封面＝页面库缩略图用；项目封面＝C 端 M-01 内容素材（`usage_type = project_cover`） |

### 附带澄清项

C 端 `02-Widget体系/01-M-01项目概览Widget-PRD.md` 写明「A 端从项目素材中选择一张作为封面」，而 A 端 PRD §5.7 只定义了「通过弹窗选择项目内容」的通用机制，未定义项目素材本身的维护入口。需确认：**项目封面素材由 A 端维护，还是由既有项目数据系统提供、A 端只做选择**（端归属：**A + C**）。此项与 Q6-1 不是同一个对象，但容易在评审中被混为一谈；同时与 §3 的素材上游归属（Q3-7）相关。

---

## 7. Widget 定义与实例：一对多，但 A 端元数据撑不起 B 端要求

> **端归属：A + B + C 三端都存在。** 定义在 A 端注册、实例在 A/B 两端的页面中产生、渲染规则在 C 端。

### 现状：关系本身是一对多，分歧在「谁来约束数量」

**A 端（明确一对多，且无数量上限）**

- Widget 台账中一条定义 → 可被多个页面模板引用 → 可被多个项目页面复制成模块。
- A 端页面管理 §5.5：「**同一个 Widget 可以多次添加，形成不同模块编号，名称和内容互不覆盖**」。
- 「Widget 只存在于注册和模板定义阶段。被复制或添加到项目页面后，页面端统一称为**模块**。」
- 每个模块保存：稳定唯一的模块编号、来源 Widget 标识、**加入时的名称与元数据快照**、当前顺序、模块自身的名称/多语言名称/内容。
- A 端 Widget §5.6：Widget 停用后「不能加入新模板或新增页面模块，但**不得删除既有模板区块和项目页面模块**」。

**B 端（也是一对多，但受「实例数量」约束）**

- §4.3.4：「一个页面是否可以包含多个相同 Widget、最多可以包含几个，**由 Widget 定义决定**」「Widget 不允许删除或有最少实例数量时，B 端不允许删除到低于最少数量」。
- §4.3.5：「其他 Widget 是否允许删除、是否允许多个、**最少和最多实例数量**，由 Widget 定义」。
- 所以 B 端是**受控的一对多**：上限可能是 1（等于一对一）、可能是 N、可能无上限。页头 / 页脚是必需且不可删除，实例数量固定为 1。

**→ 关系是一对多；但 B 端赖以约束的「实例数量」在 A 端的 Widget 元数据里根本不存在。**

### 字段缺口：A 端 3 项 vs B 端要求 13 项

A 端 Widget 元数据只有 3 项（§5.4，由代码提供、A 端只读）：内容配置方式、数据来源（受控清单 9 项）、选择数量（单选/多选）。

B 端 §5 要求 Widget 定义至少提供 13 项：Widget 标识、名称、**允许素材类型**、**素材数量**、**实例数量**、**删除规则**、**必需规则**、内容来源、**动作配置**、**校验规则**、**可编辑字段**、**展示形式**、**定义版本**。

| B 端要求 | A 端是否有 | 后果 |
|---|---|---|
| 允许素材类型 | ❌ 只有「数据来源」，是业务对象维度 | 选材过滤无依据（见 §3 Q3-8 冲突 4） |
| 素材数量 | ⚠️ 只有单选/多选，无具体上下限 | 无法校验「最多 6 张」 |
| **实例数量** | ❌ 完全没有 | B 端无法判断一页能放几个同类 Widget；A 端默认无限 |
| 删除规则 / 必需规则 | ❌ | 页头页脚「不可删除」在 A 端无处声明 |
| 动作配置 | ❌ | 预约 / 联系 / 下载类 Widget 无定义 |
| 校验规则 | ❌ | 保存前校验无依据 |
| 可编辑字段 | ❌ | B 端不知道哪些字段允许销售改 |
| 展示形式 | ❌ | B-016「按 Widget 定义调整展示形式」失去输入 |
| 定义版本 | ❌ | 快照与实时之争无法落地（Q4-8） |

A 端 §5.4 写了「元数据缺失或组合无效时阻止确认上线」，但它检查的只是这 3 项——**B 端需要的 10 项字段既不采集也不校验，Widget 却已经可以上线**。

### 需产品拍板

| # | 端 | 确认项 |
|---|---|---|
| 🔴 Q7-1 | A+B | **确认 Widget 定义 : 实例 = 一对多**，同一定义可在同一页面内产生多个实例。约束「一页最多几个同类实例」的规则由谁声明——A 端 Widget 元数据、页面模板，还是 B 端另行配置？ |
| 🔴 Q7-2 | A+B+C | **A 端 Widget 元数据必须扩展到 13 项，还是 B 端降低要求？** 若扩展，请确认新增字段清单、由代码提供还是人工填写、是否作为上线前置校验项 |
| Q7-3 | A+B | **「数据来源」（A 端，业务对象维度）与「允许素材类型」（B 端，呈现方式维度）是同一概念的两种叫法，还是两个独立维度？** 若同一 → 必须合并值域；若两个 → 定义须同时提供（详见 §3 Q3-8 冲突 4） |
| Q7-4 | A+B | **实例的最小/最大数量、可否删除、是否必需，是 Widget 级还是模板级属性？** 若在模板层声明，B 端的空白页面（无模板）拿不到这些约束 |
| Q7-5 | A+B | **B 端空白页面的页头 / 页脚从哪来？** B 端说「自动带入不可删除的页头页脚」，A 端明确「不提供无模板空白创建路径」，且「必需 / 不可删除」在 A 端无处声明。靠约定两个固定标识，还是需要隐式默认模板？ |
| Q7-6 | A+B+C | **元数据快照 vs 实时读取的口径统一。** A 端明确快照且不受来源变更影响；B 端只提到有「定义版本」。若 B 端也走快照，Widget 升级后老页面永不更新，需确认这是预期（与 Q4-8 是同一个决策） |
| Q7-7 | A+B | **术语统一**：A 端叫「模块」，B 端叫「Widget」，接口字段用哪个（与 Q4-7 同一件事） |
| Q7-8 | A | **A 端「已上线 Widget 发生不兼容的元数据变化时应注册新标识」是建议还是强制？** 若是建议，实例快照会与新定义长期漂移；若强制，需要一条「什么算不兼容」的判定规则 |

---

## 8. 主题：项目级单套，B 端 PRD 全文未提

> **端归属：A + B + C 三端都存在。** A 端配置，B 端页面继承并需在预览中还原，C 端实际渲染。

### 现状：主题是「项目级」，不是全局；且明确只有一套

- **作用域是项目，不是全局。** A 端主题 §5.1：项目未定义个性化主题 → 用 VISTA 默认主题；已定义 → 用当前项目主题，「统一作用于该项目所有页面、模板代码、Widget 和通用组件」。§5.3：「不同项目之间必须隔离」。**唯一真正全局的是 VISTA 默认主题**（以及锁定的系统状态色）。
- **每个项目同时只有一个有效个性化主题**（§5.2）。
- **多套主题在本期被明确排除。** §3.2「本期明确不做」第一条即「一个项目创建多套主题或在多套主题间切换」，第二条是「为单个页面或单个 Widget 区块设置主题」。
- **MVP 不提供主题名称**（§5.6），页面只显示「VISTA 默认主题」/「个性化主题」两态（§5.8）。
- 主题不进页面发布快照，改主题**不要求页面重新预览或发布**，既有分享链接不变（§5.3）。

**「后续会不会多个」PRD 没有任何演进说明，属于待确认。** 但存储上其实已经不是严格单条：§3.1 / §5.2 要求「恢复默认后**保留最近一次个性化主题配置**，供再次编辑或启用」——这等于「多条配置 + 一个 active 指针」，模型天然可扩展，只是界面不暴露。这一点需要在建表时就定，后改代价高。

### 真正的缺口：B 端 PRD 全文没有「主题」

`VISTA_Link_产品需求文档.md` V0.201 全文**「主题」出现 0 次**。而：

- A 端说主题「统一作用于该项目所有页面」——按字面包含 B 端销售创建的页面；
- B 端 §4.3.5 要求「预览使用与 C 端相同的 Widget 展示规则」，B-017 也确认「B 端使用 C 端真实规则预览页面」——但**没有任何一处说预览要加载项目主题**；
- 结果：销售在 B 端预览看到的配色可能与顾客在 C 端看到的不一致，直接违背 §9.1 风险表里「B 端预览与 C 端不一致」的处理承诺。

### 需产品拍板

| # | 端 | 确认项 |
|---|---|---|
| Q8-1 | A | **确认主题作用域是「项目级、单套」**，「全局」只指 VISTA 默认主题和锁定的系统状态色。是否存在租户级 / 企业级品牌主题的诉求（一家房地产公司下多个项目统一品牌）？ |
| Q8-2 | A | **后续是否会支持一个项目多套主题？** 若会（按活动季节切换、A/B 测试配色），请现在说明，以便直接按「多条配置 + active 指针」建表；若不会，也请明确「恢复默认后保留的上一次配置」是否算第二条记录 |
| 🔴 Q8-3 | A+B+C | **B 端销售创建的页面用哪套主题？** 请确认：①销售页面在 C 端渲染时继承所属项目的当前主题；②B 端预览必须加载同一主题，否则预览与实际不一致；③销售**不能**修改主题。三条都需写进 B 端 PRD |
| Q8-4 | A+B | **改主题是否影响 B 端？** A 端说改主题不要求页面重新预览或发布、分享链接不变。请确认对 B 端销售页面同样成立，且页面库缩略图 / 封面**不随主题变化**（封面是独立图片，见 §6） |
| Q8-5 | B+C | **主题变更时已打开的 C 端页面如何处理？** 顾客正在浏览时主题被改，下次访问才生效还是即时生效？是否需要缓存失效策略 |
| Q8-6 | A+C | **主题是否进入 C 端页面缓存键？** 主题不进发布快照、页面读取「所属项目当前有效主题」。若 C 端对快照做缓存，主题必须作为独立维度，否则改主题不生效 |
| Q8-7 | A | **主题字段集是否够用？** §5.6 的 15 个字段中边框宽度只有 0/1/2px 三档、圆角 0/4/8/16px 四档、系统状态色锁定。请确认 §3.3「新增 Widget 不应要求 A 端增加一组 Widget 专属主题字段」这条约束长期有效 |

---

## 附录：以下问题 PRD 已有明确答案，评审时可跳过

1. 页面和固定链接是 1:1，编辑页面不改地址和二维码。（B 端 §4.3.2）
2. 带客户标识参数的地址不是新链接，不单独出现在链接列表。（B 端 §4.3.2）
3. 顾客被删除**不会**让链接失效，只让该顾客的参数永久失效，之后按无参数链接处理。（B 端 §4.1.8、§4.3.7）
4. 无参数固定链接始终可用，这是设计意图；指定顾客只解决归因，不是访问授权。（B 端 §4.3.2、§9.1）
5. 同一链接 + 同一顾客只有一个有效参数，重复指定返回同一地址。（B 端 §4.3.2）
6. 一条链接可关联多个顾客，一个顾客可关联多条链接。（B 端 §4.3.3）
7. B 端不能上传 / 创建 / 删除素材，只能维护素材说明和素材标签。（B 端 §4.2、B-006、B-007）
8. Widget 选材的准入条件只有「当前项目 + 已上线 + 类型允许」三条，分类和标签只是二次筛选。（B 端 §4.3.4）
9. 素材数量、Widget 实例数量、必需项不在选材时拦截，统一在页面保存时校验。（B 端 §4.3.4、§4.3.5）
10. 分享选了顾客 = 立即建立顾客与链接的绑定关系，并记录首次关联来源。（B 端 §4.3.2）
11. 分享不选顾客且链接非公开时，C 端必须填邮箱 + 验证码；邮箱已存在则复用顾客并保留原负责人，不存在则自动建顾客。（B 端 §4.3.7）
12. 参数身份与浏览器身份冲突时必须弹确认页，不能静默覆盖。（B 端 §4.3.7、§6.4）
13. A 端页面来源由创建端自动写入，A/B 均不提供手工选择或修改入口。（A 端 §5.2）
14. A 端页面模块是「加入时的 Widget 元数据快照」，来源 Widget 后续变更不影响已有模块。（A 端 §5.5）
15. Widget 定义与实例是**一对多**：同一个 Widget 可在同一页面内多次添加，各实例有独立编号、名称和内容，互不覆盖。（A 端页面管理 §5.5、B 端 §4.3.4）
16. Widget 停用后不能新增实例，但既有模板区块和页面模块不得删除。（A 端 Widget §5.6）
17. 主题是**项目级、单套**：一个项目同时只有一个有效个性化主题，全项目所有页面统一生效，跨项目隔离。（A 端主题 §5.1～§5.3）
18. 一个项目建多套主题、按页面或按 Widget 设主题，本期明确不做。（A 端主题 §3.2）
19. 改主题不进页面发布快照，不要求页面重新预览或发布，既有分享链接不变。（A 端主题 §5.3）
