5.9 KiB
5.9 KiB
目标
将 contract-template 相关页面从旧的 PostgREST 直连方式切换到新的 FastAPI 业务接口,范围仅覆盖:
- 模板分类
- 模板列表
- 模板搜索
- 模板详情
本清单不包含“起草合同”能力,后续会作为独立模块重新开发。
当前前端依赖点
当前前端核心依赖集中在:
legal-platform-frontend/lib/api/legacy/contract-template/templates.ts
这个文件现在直接调用:
/api/postgrest/proxy/contract_categories/api/postgrest/proxy/contract_templates
受影响页面:
app/(audit)/contract-template/search/page.tsxapp/(audit)/contract-template/search/results/page.tsxapp/(audit)/contract-template/list/page.tsxapp/(audit)/contract-template/detail/[id]/page.tsx
推荐新接口
建议前端最终切换为:
GET /api/v3/contract-templates/categoriesGET /api/v3/contract-templatesGET /api/v3/contract-templates/searchGET /api/v3/contract-templates/{id}
改造步骤
第 1 步:新增新接口客户端文件
建议新增:
legal-platform-frontend/lib/api/contract-template/index.ts
职责:
- 仅封装新的业务后端接口
- 不再依赖
postgrest-client.ts - 返回字段尽量与页面现有消费结构兼容
建议方法:
getContractTemplateCategoriesgetContractTemplateListsearchContractTemplateListgetContractTemplateDetail
第 2 步:定义前端接口类型
建议在新客户端文件中定义或复用以下类型:
ContractTemplateCategoryContractTemplateListItemContractTemplatePageContractTemplateDetailContractTemplateSearchResult
字段建议优先与新后端对齐,然后在页面边界做一次轻量转换,避免业务层长期保留 snake_case 和 camelCase 混用。
第 3 步:改造搜索首页
文件:
app/(audit)/contract-template/search/page.tsx
当前行为:
- 调
getContractCategoriesWithCount
改造后:
- 改为调用
getContractTemplateCategories - 直接消费后端返回的
templateCount
页面影响:
transformCategory中的template_count改为新接口字段
第 4 步:改造列表页
文件:
app/(audit)/contract-template/list/page.tsx
当前行为:
- 调
getContractTemplates - 同时调
getContractCategoriesWithCount
改造后:
- 列表数据改为
getContractTemplateList - 分类数据改为
getContractTemplateCategories
注意事项:
- 当前页面把
sortBy=relevance映射成id.asc,这是旧 PostgREST 兼容逻辑 - 切换新接口后应明确排序语义:
relevance仅搜索场景有效- 列表页默认建议改为
updated_at desc
第 5 步:改造搜索结果页
文件:
app/(audit)/contract-template/search/results/page.tsx
当前行为:
- 调
searchContractTemplates - 额外循环所有分类,再逐类搜索统计命中数
改造后:
- 改为一次调用
searchContractTemplateList - 直接使用后端返回的
categoryStats
收益:
- 避免当前每次搜索都发起多次分类二次查询
- 页面搜索耗时会明显降低
第 6 步:改造详情页
文件:
app/(audit)/contract-template/detail/[id]/page.tsx
当前行为:
- 调
getContractTemplate
改造后:
- 改为调用
getContractTemplateDetail
注意事项:
- 页面中依赖:
template_codefile_pathpdf_file_pathplaceholder_schemacategory.namecategory.description
- 新接口最好直接扁平返回,前端减少再拼装
第 7 步:保留旧文件作为过渡,避免一次性大改
建议不要立刻删除:
lib/api/legacy/contract-template/templates.ts
更稳妥的做法:
- 新建新接口客户端文件
- 页面逐个切换
- 确认没有页面再引用旧文件
- 再删除旧实现
字段映射建议
建议后端返回使用 camelCase 还是 snake_case,前后端尽量统一一次定死。
如果后端沿用当前 Python VO 风格的 snake_case,那么前端建议统一在 API client 中做转换:
template_code -> templateCodecategory_id -> categoryIdfile_path -> filePathpdf_file_path -> pdfFilePathplaceholder_schema -> placeholderSchemaupdated_at -> updatedAt
不要把这类转换分散在页面组件里。
具体函数替换建议
当前旧函数:
getContractCategoriesgetContractCategoriesWithCountgetContractTemplatesgetContractTemplatesearchContractTemplates
建议替换为新函数:
getContractTemplateCategoriesgetContractTemplateListgetContractTemplateDetailsearchContractTemplateList
风险点
-
排序语义变化
- 旧逻辑混入了 PostgREST 风格排序拼接
- 新接口需要明确合法排序字段白名单
-
搜索分类统计变化
- 旧页面自己循环查询分类统计
- 新接口如果不返回
categoryStats,页面逻辑还要保留一部分旧实现
-
详情页字段结构变化
- 旧页面默认拿
template.category?.name - 新接口若改成扁平字段,需要同步调整页面 transform
- 旧页面默认拿
-
token 传递方式变化
- 旧实现依赖
postgrest-client.ts - 新接口应统一走
axios-client.ts或新业务客户端
- 旧实现依赖
建议落地顺序
- 新增
lib/api/contract-template/index.ts - 先切
search/page.tsx - 再切
list/page.tsx - 再切
search/results/page.tsx - 最后切
detail/[id]/page.tsx - 全部验证通过后删除旧
legacy/contract-template/templates.ts
验收标准
contract-template/search能正常展示分类和数量contract-template/list能分页、筛选、排序contract-template/search/results能搜索并展示分类统计contract-template/detail/[id]能正常查看详情与预览- 页面不再直接请求
/api/postgrest/proxy/contract_categories - 页面不再直接请求
/api/postgrest/proxy/contract_templates