Files
jiapu/docs/PC接口对接规划.md
T
2026-07-24 18:11:32 +08:00

648 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PC 接口对接规划(Apifox 79 接口版)
> 状态:当前范围已确认
> 日期:2026-07-24
> 当前阶段:已直接在 Apifox 核验验证码中心、认证登录、文件上传、行政区划、家族圈、字辈谱和世系人物共 57 条接口;施工只以这些 PC 详情为准,其余目录继续逐组核验后再接入。
> 交接入口:[交接文档.md](交接文档.md)
## 1. 已确认的基线
1. **Apifox 的 PC 目录是 PC 前端接口的唯一正式契约源。**
2. 当前 Apifox PC 共 79 个操作:
| 分组 | 数量 |
| --- | ---: |
| 认证登录 | 11 |
| 验证中心 | 4 |
| 文件上传 | 6 |
| 行政区划 | 4 |
| 家族圈 | 14 |
| 字辈谱 | 6 |
| 世系人物 | 12 |
| 内容文章 | 1 |
| 相册 | 2 |
| 视频 | 1 |
| 祭祀 | 2 |
| 族务记录 | 16 |
| **合计** | **79** |
3. 仓库中的旧 OpenAPI 文件不再作为新增功能依据。Apifox 客户端中实时的 PC 目录是最终验收源;导出文件最多作为本地自动测试快照,不能替代在 Apifox 中逐项核对。
4. APP 接口不允许在 PC 页面中直接复用。PC 缺少的能力应先补入 Apifox 的 PC 目录,再开发页面。
5. 当前不根据 APP 或后端公开 OpenAPI 扩大范围;没有进入 Apifox PC 目录的接口,不视为 PC 已确认接口。
6. 后端以后新增 PC 接口时,再按新增后的 Apifox PC 契约启动下一轮规划。
## 2. 当前最重要的结论
现有 79 个接口不能覆盖整个 PC 管理端闭环,主要问题不是前端页面,而是接口目录不完整:
- 没有“我的家谱、家谱详情、创建/加入家谱、家谱成员”接口,PC 无法自行取得真实 `genealogyId`
- 内容文章只有删除接口。
- 相册只有删除相册、删除照片接口。
- 视频只有删除接口。
- 祭祀只有删除祭祀、删除献礼接口。
- 功德记录只有删除接口。
- 世系关系只有新增父母、配偶、兄弟姐妹、子女,没有解除关系接口。
- 字辈谱没有删除接口。
因此对接分成三类:
1. **当前可以形成可用流程:**认证、验证、文件上传、区划、家族圈、字辈谱、世系人物、成长记录、亲友往来、备忘录;其中家谱内接口必须先由 PC 运行入口提供真实 `genealogyId`
2. **当前只做契约映射、不开放页面操作:**文章、相册、视频、祭祀和功德录目前只有删除接口,不能在没有真实列表和详情数据时单独启用删除。
3. **后端补充 PC 接口后再规划:**家谱上下文、成员,以及上述资源缺少的读写操作、世系关系解除和字辈删除/停用。
### 2.1 当前范围规则
- 当前只分析和对接 Apifox PC 中已经存在的 79 个操作。
- 不读取 APP 接口补 PC 缺口,不把 `/genealogy/app` 改前缀后用于 PC。
- 后端公开文档中存在、但 Apifox PC 当前没有的接口,不进入本轮对接;也不以导出文件缺失为由跳过 Apifox 中已有的接口。
- PC 当前缺少的业务接口只登记为后端待办,相关页面继续显示待开发状态。
- 后端新增接口后,必须先进入 Apifox PC 并补齐 DTO,再进入前端对接规划。
## 3. 公共契约规则
### 3.1 接口所有权
- Apifox PC 目录拥有 method、path、请求 DTO、响应 DTO、枚举和权限说明。
- `utils/ApiClient.js` 只负责实现 Apifox 已定义的业务方法,不允许页面自行拼接接口路径。
- 页面脚本只消费 `ApiClient` 方法,不直接调用 Axios。
- 新契约确认后,旧字段兼容读取、旧路径和临时 fallback 必须一起删除,不能长期维护两套契约。
### 3.2 家谱上下文
所有家谱内业务必须使用真实 `genealogyId`
1. 当前 79 个接口没有“我的家谱”入口,本轮不从 APP 获取 `genealogyId`
2. 当前家谱业务页面只接受 PC 运行入口通过 URL 传入的真实 `genealogyId`
3. `profile-common.js` 作为 PC 页面家谱上下文的唯一 owner,负责读取、校验和传播 `genealogyId`
4. `ApiClient` 负责把 `genealogyId` 放入路径。
5. 页面缺少 `genealogyId` 时阻止请求并显示“等待家谱入口接口”,不使用示例编号。
后端补充 PC 家谱入口接口后,再规划“我的家谱 → 选择家谱 → 进入业务页面”的完整导航闭环。
### 3.3 请求头与登录状态
- 所有 PC 请求统一携带 `clientid`
- 登录后接口统一携带 `Authorization: Bearer <token>`
- `tenantId``clientId` 只在 Apifox DTO 明确要求时进入请求体,页面不得自行添加。
- 401:清除本地登录态并跳转登录页。
- 403:保留登录态,展示无权限页或无权限状态。
Apifox 必须为每个操作明确标记“公开”或“需要登录”,不能只依赖接口描述文字。
Apifox 还必须正式声明 Bearer security scheme、`Authorization``clientid`,否则自动生成文档、Mock 和测试时无法还原真实请求。
### 3.4 响应与分页
普通响应统一为:
```json
{
"code": 200,
"msg": "操作成功",
"data": {}
}
```
分页响应统一为:
```json
{
"code": 200,
"msg": "操作成功",
"rows": [],
"total": 0
}
```
分页参数应明确展开为 `pageNum``pageSize``orderByColumn``isAsc`,不把整个 `pageQuery` 声明成一个含义不清的 query object。
除 200 外,每组接口至少定义适用的 400、401、403、404、409、422 和 429 响应,不能把所有失败都写成 401。
### 3.5 ID、日期和枚举
- `genealogyId``personId``feedId``commentId``ossId` 等 ID 在浏览器端统一按字符串处理,避免 JavaScript `int64` 精度丢失。
- Apifox 当前需要统一文件上传响应和业务写入 DTO 中 `ossId` 的类型;不能一处为 string、另一处为 integer。
- 纯日期使用 `YYYY-MM-DD`
- 具体时刻使用带时区的 ISO 8601。
- 性别、状态、角色、可见性、祭祀类型等必须在 Apifox 中给出固定枚举及中文含义。
### 3.6 权限
至少区分:
- 访客
- 普通家谱成员
- 内容编辑者
- 家谱管理员
- 家谱创建者/所有者
- 平台管理员
列表和详情 DTO 应返回 `canEdit``canDelete``canManage` 等能力字段。前端据此显示操作,后端仍必须独立鉴权。
同一个 PC DTO 不等于所有角色都能看到所有字段。手机号、联系方式、通知目标等敏感字段要按权限裁剪;需要时拆成摘要 DTO 和管理员详情 DTO。
前端只使用 Apifox PC 当前声明的 Schema,不从 APP Schema 推导字段。
### 3.7 文件生命周期
图片、小文件:
1. 单文件上传。
2. 获得 `ossId`
3. 保存业务对象。
4. 绑定文件业务引用。
视频、大文件:
1. 初始化分片任务。
2. 上传所有分片。
3. 服务端合并。
4. 保存业务对象。
5. 绑定文件业务引用。
替换或删除业务对象后解除旧文件引用。上传成功但业务保存失败时,也要提供清理策略。
## 4. 79 个接口的页面用途
### 4.1 认证登录(11
| 接口 | 使用页面 | 用途 |
| --- | --- | --- |
| `POST /genealogy/pc/auth/register` | `register.html` | 用户注册 |
| `POST /genealogy/pc/auth/login` | `login.html` | 密码登录 |
| `POST /genealogy/pc/auth/login/sms` | `login.html` | 短信登录 |
| `POST /genealogy/pc/auth/sms/code` | 短信登录、注册、找回密码、换绑手机号、注销账号 | 发送短信验证码 |
| `GET /genealogy/pc/auth/profile` | `profile.html``profile-data.html``profile-security.html` | 获取当前用户资料/已绑定手机号 |
| `PUT /genealogy/pc/auth/profile` | `profile-data.html` | 修改个人资料 |
| `PUT /genealogy/pc/auth/password` | `profile-security.html` | 修改密码 |
| `PUT /genealogy/pc/auth/password/reset` | `forgot-password.html` | 找回密码 |
| `PUT /genealogy/pc/auth/phone` | `profile-security.html` | 换绑手机号 |
| `POST /genealogy/pc/auth/account/deactivate` | `profile-security.html` | 注销账号 |
| `DELETE /genealogy/pc/auth/logout` | 所有登录后页面 | 退出登录 |
状态:第一轮施工已接入密码登录、短信登录、注册、找回密码、换绑手机号、注销和退出。注册必须先取得短信码;找回密码由 `ApiClient` 统一补齐 `grantType``tenantId``clientId`。Apifox 的 `LoginVo` 明确允许 `token``accessToken``tokenValue` 三种响应字段,客户端按该顺序读取第一个非空值;资料响应未给出字段 Schema,页面只读取 PC 页面已使用的明确字段,不增加 APP 字段猜测。
已在 Apifox 直接核验的认证约束:
- 发送短信验证码只允许 `PC_SMS_LOGIN``PC_REGISTER``PC_FORGOT_PASSWORD``PC_PHONE_CHANGE``PC_ACCOUNT_DEACTIVATE` 五个场景。
- 发送短信码请求体为 `clientId``grantType``tenantId``sceneCode``phone``validToken``validToken` 来自验证码中心且只能单次消费。
- 换绑手机号请求体为 `clientId``phone``smsCode`;注销账号请求体为 `clientId``smsCode`。二者不附带 `tenantId`
- 密码登录与注册使用 `grantType: "password"`;短信登录与发送短信码使用 `grantType: "sms"`;所有密码字段均为 32 位 MD5。
第一批页面与接口顺序:
| 页面 | 页面流程 | 对接接口 |
| --- | --- | --- |
| `login.html` | 密码登录 | `POST /genealogy/pc/auth/login` |
| `login.html` | 获取短信码 → 短信登录 | `POST /genealogy/pc/auth/sms/code``POST /genealogy/pc/auth/login/sms` |
| `register.html` | 获取短信码 → 注册 | `POST /genealogy/pc/auth/sms/code``POST /genealogy/pc/auth/register` |
| `forgot-password.html` | 获取短信码 → 重设密码 | `POST /genealogy/pc/auth/sms/code``PUT /genealogy/pc/auth/password/reset` |
| `profile-security.html` | 修改密码 | `PUT /genealogy/pc/auth/password` |
| `profile-security.html` | 获取短信码 → 换绑手机号 | `POST /genealogy/pc/auth/sms/code``PUT /genealogy/pc/auth/phone` |
| `profile-security.html` | 读取绑定手机号 → 获取短信码 → 注销 | `GET /genealogy/pc/auth/profile``POST /genealogy/pc/auth/sms/code``POST /genealogy/pc/auth/account/deactivate` |
| 所有登录后页面 | 退出登录 | `DELETE /genealogy/pc/auth/logout` |
### 4.2 验证中心(4
| 接口 | 使用位置 | 用途 |
| --- | --- | --- |
| `GET /captcha/require` | 发送登录、注册、找回、换绑、注销短信前 | 判断当前场景是否需要验证 |
| `POST /captcha/challenge` | 同上 | 获取滑块或图形验证挑战 |
| `POST /captcha/verify` | 同上 | 校验挑战并换取 `validToken` |
| `GET /auth/code` | 仅兼容旧图形验证码 | 旧验证方案 |
已在 Apifox 直接核验的验证码约束:
- `GET /captcha/require` 使用 `tenantId``clientId``sceneCode``subject` 查询场景策略。
- `POST /captcha/challenge` 必须携带同一组 `tenantId``clientId``sceneCode``subject`;天爱策略返回行为验证数据,系统图形策略返回 `uuid``img`
- `POST /captcha/verify` 除上述字段外还必须携带 `challengeId`,并以 `providerCode``captchaType``payload` 提交验证结果;成功后取得 `validToken`
- `validToken` 与租户、PC 客户端、场景、手机号主体、挑战和请求 IP 绑定,只能随发送短信码接口单次提交。
规划:
- 新流程统一使用 `/captcha/*` 三个接口。
- `/auth/code` 标记为兼容接口,确定所有场景迁移完成后从 Apifox 和代码一起删除。
- `validToken` 只用于发送短信验证码的请求;发送完成后立即从表单清除,不写日志、不长期存储,也不混入登录、注册、重置或换绑的业务 DTO。
### 4.3 文件上传(6
| 接口 | 使用位置 | 用途 |
| --- | --- | --- |
| `POST /genealogy/pc/files/upload` | 头像、文章封面、相册照片、祭祀封面、记录附件 | 单文件上传 |
| `POST /genealogy/pc/files/resumable/init` | 视频、大文件 | 初始化分片任务 |
| `POST /genealogy/pc/files/resumable/chunk` | 视频、大文件 | 上传单个分片 |
| `POST /genealogy/pc/files/resumable/complete` | 视频、大文件 | 合并分片并返回文件 |
| `POST /genealogy/pc/files/reference` | 所有业务保存成功后 | 绑定业务引用 |
| `DELETE /genealogy/pc/files/reference` | 替换或删除业务文件后 | 解除业务引用 |
状态:6 个文件接口已直接在 Apifox 核验,`ApiClient` 的 PC 路径、认证头和请求形状一致。单文件上传只提交 multipart `file`,返回 `data.ossId``url``thumbnailUrl``fileName``originalName``profile-data.html` 使用它回填 `avatarOssId`,再随 `PUT /genealogy/pc/auth/profile` 保存。
已核验的分片/引用约束:
- 初始化必填 `fileName``fileSize``fileMd5``chunkSize``totalChunks`,可选 `contentType``bizType``usageScene`;接口说明规定 `instant=true` 时直接使用返回的 OSS 信息。当前响应仍是未展开字段的 `ObjectResult`,因此不开放续传页面流程。
- 分片上传 multipart 必填 `uploadId``chunkIndex``chunkMd5``file`;完成上传必填 `uploadId``fileMd5``fileSize`
- 绑定引用必填 `bizType``bizTable``bizId``bizField`,可选 `ossId` 或逗号分隔的 `ossIds``bizName``usageScene``usageName`;解除引用只必填 `bizTable``bizId``bizField`
- 具体业务的 `bizType``bizTable``bizField` 目前没有由对应业务接口声明,不在页面中猜测创建或解除引用规则。
### 4.4 行政区划(4
| 接口 | 使用页面 | 用途 |
| --- | --- | --- |
| `GET /genealogy/region/children` | 个人资料、创建/编辑家谱 | 获取下级区划 |
| `GET /genealogy/region/path/{regionCode}` | 同上 | 区划编码回显 |
| `GET /genealogy/region/search` | 同上 | 关键词搜索地区 |
| `GET /genealogy/region/{regionCode}` | 同上 | 获取地区详情 |
状态:四条路径和请求参数已直接核验;个人资料已使用,创建家谱页面待家谱接口补齐后复用同一个区划组件。`children``parentCode` 可选(不传查省级),`search` 必填 `keyword`、可选 `level``limit`,路径/详情使用必填 `regionCode`。当前 Apifox 的地区响应仍是未展开属性的通用对象/数组,页面已有的 `regionCode``regionName``regionLevel` 消费需在联调时以真实响应再确认,不能把导出快照当 Schema。
个人资料页当前流程:
| 页面 | 页面流程 | 对接接口 |
| --- | --- | --- |
| `profile.html` | 读取当前资料、显示昵称/手机/生日/地区 | `GET /genealogy/pc/auth/profile``GET /genealogy/region/path/{regionCode}` |
| `profile-data.html` | 回填并保存昵称、性别、生日和头像 OSS ID | `GET /genealogy/pc/auth/profile``POST /genealogy/pc/files/upload``PUT /genealogy/pc/auth/profile` |
| `profile-data.html` | 回填、搜索、选择并保存现居地区 | `GET /genealogy/region/children` / `path` / `search` / `{regionCode}``PUT /genealogy/pc/auth/profile` |
注意:当前严格使用 Apifox PC 声明的 `/genealogy/region/*`,页面和 `ApiClient` 不再维护其他区划路径。
### 4.5 家族圈(14
| 接口 | 使用页面 | 用途 |
| --- | --- | --- |
| `GET /genealogy/pc/genealogies/{genealogyId}/feeds` | `profile-feed.html` | 非分页动态列表 |
| `GET .../feeds/page` | `profile-feed.html` | 动态分页 |
| `POST .../feeds` | `profile-feed-edit.html` | 发布动态 |
| `GET .../feeds/{feedId}` | 编辑页、动态详情页 | 动态详情 |
| `PUT .../feeds/{feedId}` | `profile-feed-edit.html` | 修改动态 |
| `DELETE .../feeds/{feedId}` | 列表、详情 | 删除动态 |
| `POST .../feeds/{feedId}/likes` | 列表、详情 | 点赞 |
| `DELETE .../feeds/{feedId}/likes` | 列表、详情 | 取消点赞 |
| `GET .../feeds/{feedId}/comments` | 动态详情 | 评论列表 |
| `GET .../feeds/{feedId}/comments/page` | 动态详情 | 评论分页 |
| `POST .../feeds/{feedId}/comments` | 动态详情 | 评论或回复 |
| `DELETE .../feeds/{feedId}/comments/{commentId}` | 动态详情 | 删除评论 |
| `GET .../comments/{commentId}/replies` | 动态详情 | 直接回复列表 |
| `GET .../comments/{commentId}/replies/page` | 动态详情 | 直接回复分页 |
状态:14 个操作均已在 Apifox PC 详情中核验并完成客户端路径映射。`profile-feed.html` 已接入动态分页、点赞、一级评论、发表回复和按需展开直接回复;评论及回复 ID 在路径中按字符串传递。
已核验的评论约束:
- 发表评论请求体只有必填 `commentContent`(最多 1000 字)和可选 `parentCommentId`;不传或传 `null` 表示一级评论,不能发送旧字段 `content` 或未声明的 `replyUserId`
- 一级评论接口只返回正常展示的一级评论;直接回复使用 `GET .../comments/{commentId}/replies`,分页使用 `GET .../comments/{commentId}/replies/page`。两类分页均为 `pageNum``pageSize`
- 评论响应字段为 `commentContent``commentId``parentCommentId``appUserNickName``replyCount``commentLevel``userDeleted` 等;作者删除后 `commentContent``null``userDeleted``1`,页面显示占位而非把响应视为异常。
页面规划:
- `profile-feed.html` 只负责动态分页和轻量操作。
- 新增动态详情页,负责完整正文、评论、回复、通知跳转和分享深链。
- 评论 DTO 必须返回稳定的 `commentId``parentCommentId``replyCount`、发布人和权限字段。
### 4.6 字辈谱(6
| 接口 | 使用页面 | 用途 |
| --- | --- | --- |
| `GET .../generation-poems` | 家谱主页、世系展示 | 查询正常字辈谱 |
| `GET .../generation-poems/management` | `profile-generation.html` | 查询字辈维护列表 |
| `POST .../generation-poems` | `profile-generation.html` | 新增字辈 |
| `PUT .../generation-poems/{poemId}` | `profile-generation.html` | 修改字辈 |
| `POST .../generation-poems/batch/preview` | `profile-generation.html` | 批量文本预览 |
| `POST .../generation-poems/batch/save` | `profile-generation.html` | 批量保存 |
状态:6 个操作均已在 Apifox PC 详情中核验并完成客户端路径映射;`profile-generation.html` 已接入管理列表、新增、修改、停用/恢复、批量预览和批量保存。管理列表仅内容编辑者可访问,403 时页面明确显示无权限并禁用写操作;页面缺少真实 `genealogyId` 时不发请求,也不使用示例编号。
规划:
- 页面只提供新增、修改和批量导入。
- 如果产品要求物理删除,先在 Apifox 增加删除接口;当前修改接口的 `status` 仅按其已声明的正常/停用语义使用,不作为删除替代。
- 批量预览必须展示解析错误、重复代次、原/新状态和将被覆盖的记录,用户确认后才能保存;前端按 Apifox 限制校验总文本不超过 26000 字符、单个字辈不超过 50 字符、一次最多 500 代。
- 字辈新增、修改、状态切换、批量预览和批量保存执行期间锁定写入口,避免重复提交;批量输入示例必须使用 Apifox 已声明的分隔符,连续文本视为一个字辈。
### 4.7 世系人物(12
| 接口 | 使用页面 | 用途 |
| --- | --- | --- |
| `GET .../lineage/persons` | `profile-tree.html` | 成员总览 |
| `GET .../lineage/persons/page` | `profile-tree.html` | 人物分页与关键词搜索 |
| `GET .../lineage/persons/options` | 关系选择、成长记录 | 人物下拉选项 |
| `GET .../lineage/tree` | `profile-tree.html` | 世系树 |
| `POST .../lineage/persons` | `profile-tree.html` | 新增人物 |
| `GET .../lineage/persons/{personId}` | 树内详情、人物详情 | 人物详情 |
| `PUT .../lineage/persons/{personId}` | 人物编辑 | 修改人物 |
| `DELETE .../lineage/persons/{personId}` | 人物详情 | 逻辑停用人物 |
| `POST .../persons/{personId}/children` | 关系维护 | 添加子女 |
| `POST .../persons/{personId}/parents` | 关系维护 | 添加父母 |
| `POST .../persons/{personId}/siblings` | 关系维护 | 添加兄弟姐妹 |
| `POST .../persons/{personId}/spouses` | 关系维护 | 添加配偶 |
状态:12 个操作均已在 Apifox PC 详情中核验并完成客户端路径映射;`profile-tree.html` 已接入成员总览、树、人物分页搜索与翻页、人物选项、详情、新增、修改、逻辑停用,以及新增父母、配偶、兄弟姐妹、子女。写入和停用请求执行期间会锁定操作入口,页面缺少真实 `genealogyId` 时不发请求。
已核验的关键约束:
- 人物 DTO 使用 `name``generation``biography`,不是旧页面字段 `personName``generationNo``introduction`
- `DELETE .../persons/{personId}` 的语义是逻辑停用,不物理删除;人物存在正常子女时后端会拒绝停用。
- 四个关系接口都接收完整的 `LineagePersonBody` 来新建关系人物,并非把两个已有 `personId` 绑定在一起;当前没有解除关系接口。
- `LineagePersonTreeView``spouses``children` 递归返回关系树;页面避免将不安全的数值型 int64 ID 用于后续写请求。
规划:
- `profile-tree.html` 负责树、搜索、人物详情、快捷新增和关系人物新增。
- 人物详情可先使用抽屉;消息和分享需要深链时再补独立详情页。
- Apifox 需补充稳定的关系 ID 与解除关系接口。
- 删除人物前必须返回影响范围,禁止前端猜测是否级联删除子女或关系。
- `GenealogyMember` 是账号和权限成员,`LineagePerson` 是谱系人物,两者不能合并。
### 4.8 内容文章(1
现有接口:
```text
DELETE /genealogy/pc/genealogies/{genealogyId}/articles/{articleId}
```
使用位置:`profile-article.html` 的删除操作。
当前不能启用真实文章管理,因为缺少:
- 文章列表/分页
- 文章详情
- 新增文章
- 修改文章
- 文章分类
- 发布、下线和公开可见性
- 官网公开文章详情
规划:接口补齐前,`profile-article.html``profile-article-edit.html``article-detail.html` 保持设计预览,不单独接入删除接口。
### 4.9 相册(2
现有接口:
```text
DELETE /genealogy/pc/genealogies/{genealogyId}/albums/{albumId}
DELETE /genealogy/pc/genealogies/{genealogyId}/albums/{albumId}/photos/{photoId}
```
使用位置:`profile-album.html` 的删除相册、删除照片操作。
当前缺少相册列表、详情、新增、修改,以及照片列表、新增、修改和文件引用。接口补齐前不启用删除按钮。
### 4.10 视频(1
现有接口:
```text
DELETE /genealogy/pc/genealogies/{genealogyId}/videos/{videoId}
```
使用位置:`profile-video.html` 的删除操作。
当前缺少视频列表、详情、新增、修改、发布状态、公开播放详情以及文件引用。本轮只映射删除契约;后端补齐 PC 读写接口后,再结合分片上传实施完整视频流程。
### 4.11 祭祀/典礼(2
现有接口:
```text
DELETE /genealogy/pc/genealogies/{genealogyId}/ceremonies/{ceremonyId}
DELETE /genealogy/pc/genealogies/{genealogyId}/ceremonies/{ceremonyId}/gifts/{giftId}
```
使用位置:`profile-gift.html` 的删除活动、删除献礼操作。
当前缺少活动列表、详情、新增、修改,以及献礼列表和新增。接口补齐前不启用删除。
命名需先拍板:
- 如果只处理祖先祭祀,DTO 和页面只保留祭祀类型。
- 如果还处理婚礼、生日、升学等活动,Apifox 目录应改为“典礼/贺礼”,避免接口名称和产品含义不一致。
### 4.12 族务记录(16
#### 成长记录(5
```text
GET .../growth-records
POST .../growth-records
GET .../growth-records/{recordId}
PUT .../growth-records/{recordId}
DELETE .../growth-records/{recordId}
```
使用页面:`profile-growth.html``profile-growth-edit.html`
用途:列表、新增、详情、编辑、删除,可关联世系人物和附件。
#### 亲友往来(5
```text
GET .../relative-records
POST .../relative-records
GET .../relative-records/{relativeId}
PUT .../relative-records/{relativeId}
DELETE .../relative-records/{relativeId}
```
当前没有独立页面。现有 `profile-memo.html` 同时写了“人情往来”和“备忘提醒”,会导致两个资源边界混乱。
规划:将“人亲簿/亲友往来”和“备忘录”拆成两个 Tab 或两组页面:
- 亲友往来:亲友、关系、事项、时间、礼金、说明。
- 备忘录:待办、提醒时间、完成状态、附件。
#### 备忘录(5
```text
GET .../memos
POST .../memos
GET .../memos/{memoId}
PUT .../memos/{memoId}
DELETE .../memos/{memoId}
```
使用页面:`profile-memo.html``profile-memo-edit.html`
用途:家族事务、纪念事项、待办提醒和完成状态。
#### 功德记录(1
```text
DELETE .../merit-records/{meritId}
```
使用位置:`profile-merit.html` 的删除操作。
当前缺少列表、新增、详情和修改。接口补齐前,`profile-merit.html``profile-merit-edit.html` 保持设计预览。
## 5. 后端后续补充清单(当前不对接)
本节只登记当前 PC 79 个接口之外的业务缺口,不借用 APP 路径、参数或 DTO。后端把新接口正式加入 Apifox PC 后,再更新接口数量和页面对接计划。
### 后续优先级 1:家谱上下文与成员
这是形成完整 PC 导航闭环的前置能力:
- 我的家谱列表
- 家谱下拉选项
- 公开家谱搜索
- 家谱详情/概览
- 创建、修改家谱
- 申请加入、我的申请、撤销申请
- 待审核申请、审核申请
- 家谱成员列表/选项
- 修改成员角色
- 移除成员
- 退出家谱
- 转让家谱
- 邀请码/邀请链接的生成、校验和失效
### 后续优先级 2:当前只有删除操作的模块
- 文章:列表、详情、新增、修改、分类、发布状态。
- 相册:相册 CRUD、照片列表/新增/修改、文件引用。
- 视频:列表、详情、新增、修改、发布状态、文件引用。
- 祭祀/典礼:活动 CRUD、献礼列表/新增。
- 功德录:列表、详情、新增、修改。
### 后续优先级 3:已有主体但缺少的操作
- 世系关系解除。
- 字辈删除或停用。
- 家族圈评论回复 DTO 和权限字段。
- 删除人物、文章、相册、视频、祭祀等操作的引用清理规则。
- 官网公开内容的无登录只读接口。
## 6. 页面与接口实施顺序
### 阶段 0:锁定当前 PC 契约
目标:
- 直接在 Apifox 客户端中核对当前 PC 目录。
- 锁定 12 个目录、79 个操作及各目录数量,作为本轮唯一对接清单。
- 为每个操作在 Apifox 中确认 method、path、请求 DTO、响应 DTO、权限和错误码;可选导出仅用于生成本地契约测试快照。
- 排除所有未进入 Apifox PC 目录的接口,不引用 APP 或其他公开文档补充本轮范围。
- 统一 token、ID、`ossId`、分页、日期和枚举。
验收:
- Apifox PC 操作数等于 79,目录数量与第 1 节一致。
- 第 4 节中的每个接口都能在 Apifox 客户端中找到,且没有 APP 或其他目录的接口混入当前清单。
- 同一接口只有一套 path 和 DTO。
- 当前计划不再引用 APP 路径或 APP DTO。
### 阶段 1:已接模块回归与补齐
范围:
1. 认证登录 11 个。
2. 验证中心 4 个。
3. 行政区划 4 个。
4. 文件上传 6 个。
5. 家族圈 14 个。
执行重点:
- 先核对现有 `ApiClient` 与当前 PC 契约,保留已正确对接的部分。
- 补齐文件分片、文件引用,以及家族圈评论回复列表和分页等当前 PC 已有但页面尚未完整使用的能力。
- 统一 401、403、业务错误、空状态和重复提交处理。
当前施工进度:
1. 已完成认证、验证码与账号安全流程,包含登录、短信登录、注册、找回密码、换绑、注销和退出。
2. 已完成个人资料读取与保存、头像单文件上传回填、行政区划三级联动/搜索/回显;资料和区划请求统一携带登录态,`ossId` 在浏览器端保持字符串。
3. 已完成文件分片初始化、分片、完成、绑定和解绑的客户端契约映射;待后端补齐初始化响应和各业务引用值后,再开通页面上传闭环。
4. 已完成家族圈回复、字辈谱和世系人物的 Apifox 核验与首轮页面施工;下一步直接核验族务记录的完整路径、DTO 与响应字段,再决定成长记录、亲友往来、备忘录页面能否开放。
验收:
- 登录、验证码、区划和上传流程只请求当前 PC 路径。
- 家族圈列表、详情、点赞、评论和回复使用同一套 DTO 与计数字段。
- 文件上传完成后按业务保存结果创建引用,删除业务数据时按后端规则解除引用。
### 阶段 2:家谱内完整资源
范围与顺序:
1. 字辈谱 6 个。
2. 世系人物 12 个。
3. 成长记录 5 个。
4. 亲友往来 5 个。
5. 备忘录 5 个。
执行前提:
- 页面必须从 PC 的真实入口参数或运行时上下文取得 `genealogyId`
- 当前 PC 尚无家谱入口接口;没有真实 `genealogyId` 时只展示缺少上下文状态,不发请求、不写死 ID,也不调用 APP。
- 只实现当前接口支持的操作;世系关系解除、字辈删除等缺口等待后端补充 PC 接口。
验收:
- 所有请求均携带同一个真实 `genealogyId`,切换上下文后不串数据。
- 列表、新增、详情、修改和删除严格按当前各资源的实际接口能力开放。
- 世系树、人物详情和记录关联统一使用当前 PC 世系人物 DTO。
- 无权限用户看不到写入口,后端 403 能正确呈现。
### 阶段 3:当前只有删除能力的模块
范围:
1. 内容文章 1 个。
2. 相册与照片 2 个。
3. 视频 1 个。
4. 祭祀/典礼与献礼 2 个。
5. 功德记录 1 个。
处理方式:
- 先完成删除接口的 `ApiClient` 契约映射和接口测试。
- 因当前 PC 缺少列表、详情、新增或修改接口,页面继续保持预览状态,不开放孤立的删除按钮。
- 后端补齐同模块 PC 接口后,再按完整资源流程启用页面。
验收:
- 7 个删除操作的 method、path、路径参数和权限定义均与 Apifox PC 一致。
- 当前页面不会因静态演示数据触发真实删除。
- 未补齐的能力不会通过 APP 接口、猜测路径或模拟成功结果实现。
### 阶段 4:接收后端新增 PC 接口
本阶段不属于当前 79 个接口的对接范围。后端每次新增 PC 接口后:
1. 先确认接口已正式进入 Apifox PC 目录。
2. 更新基线数量、第 4 节用途映射和第 5 节缺口。
3. 再安排相应页面、`ApiClient` 方法、契约测试和联调。
4. 不因为 APP 已存在同类能力而提前实现。
## 7. 联调与测试要求
每个接口组按相同顺序验收:
1. 直接在 Apifox PC 目录确认 method、path、DTO、枚举和权限。
2.`ApiClient` 增加业务方法。
3. 增加契约测试,验证 method、path、query 和 body。
4. 接页面加载、空状态、错误状态和成功状态。
5. 验证 401、403、404、业务校验失败和重复提交。
6. 验证写入后重新读取的数据与页面一致。
7. 删除操作验证关联数据和文件引用处理。
禁止以下做法:
- 页面直接写 Axios 请求。
- 猜测字段名或同时兼容多个字段。
- 使用 APP 路径补 PC 缺口。
- 写死 `genealogyId`
- 把静态示例数据当成接口成功结果。
- 只有删除接口时先开放删除按钮。
## 8. 后续业务待确认项(不阻塞当前 79)
以下问题只影响后端后续新增 PC 接口,不改变本轮范围:
1. “祭祀”究竟只指祖先祭祀,还是通用典礼/贺礼。
2. 亲友往来是否从现有备忘录页面拆成独立 Tab,建议拆分。
3. 字辈是否允许物理删除;建议优先停用。
4. 删除世系人物是否允许级联删除关系;建议默认禁止并由接口返回影响范围。
5. `feedback` 只用于意见反馈,还是要承担客服工单;若需要状态、回复和详情,应建立独立 Ticket 契约。
6. 资料提醒是否只是通知的一种类型;若是,`NotificationDTO` 应提供稳定的通知类型和目标深链。