gz-oarms/docs/fix/错题库/2026-05/2026-05-21-001-前端联调高频错误模式归纳.md

101 lines
3.9 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.

# LE-2026-05-001 - 前端联调高频错误模式归纳(来自 gz-atms-web 项目)
**日期**2026-05-21
**模块**:通用
**分类**:前后端数据映射 / 接口参数 / 组件框架 / 数据库SQL
**严重程度**P1(严重)
## 问题描述
从 gz-atms-web 项目(`D:\chinaweal\gz-atms\gz-atms-web\docs\fix\错题库`)的 12 条错题中,归纳出前后端联调的 8 大高频错误模式。
## 错误模式归纳
### 模式 1字段名不匹配
| 维度 | 说明 |
|------|------|
| 表现 | 表格数据为空prop 与后端返回的 JSON key 不一致 |
| 根因 | 前端 prop 用中文/自定义名,后端返回 Java camelCase 字段名 |
| 修复 | prop 必须与 API 返回的 JSON key 精确一致 |
| 检测 | 对比前端 table column prop 与后端 VO 字段名 |
### 模式 2rowKey 不匹配
| 维度 | 说明 |
|------|------|
| 表现 | 翻页后操作列按钮消失、DOM 状态错乱 |
| 根因 | 默认 rowKey='id',但后端主键字段名不同(如 marketId |
| 修复 | 显式设置 `row-key="实际主键名"` |
| 检测 | 检查 Entity @TableId 的字段名,与前端 row-key 对比 |
### 模式 3分页字段名list vs records
| 维度 | 说明 |
|------|------|
| 表现 | 列表数据加载不出来 |
| 根因 | MyBatis-Plus 分页返回 `records`,前端误用 `list` |
| 修复 | 统一使用 `res.records` |
| 检测 | 后端返回 `Page<Entity>` 时,前端取列表数据的字段名 |
### 模式 4JSON 字符串未解析
| 维度 | 说明 |
|------|------|
| 表现 | 调用 `.map()` 报 TypeError: xxx.map is not a function |
| 根因 | 后端 CLOB/JSON 字段返回 String前端当数组直接使用 |
| 修复 | `JSON.parse(data)``Array.isArray(data) ? data : JSON.parse(data)` |
| 检测 | 后端 Entity 中 String 类型但实际存储 JSON 的字段(如 relatedRules、scopeDistricts |
### 模式 5数组与单对象混淆
| 维度 | 说明 |
|------|------|
| 表现 | 访问属性报 undefined渲染异常 |
| 根因 | 一对多关系后端返回数组,前端当单个对象使用 |
| 修复 | `Array.isArray(data) ? data[0] : data` |
| 检测 | 详情接口返回类型如果是 `List<Entity>` 而非 `Entity` |
### 模式 6响应拦截器自动解包
| 维度 | 说明 |
|------|------|
| 表现 | 取 res.data.data 报 undefined |
| 根因 | request.js 拦截器已自动解包 `response.data`,业务代码再解包一次就多了一层 |
| 修复 | 直接使用 `res.list`、`res.total` 等已解包字段 |
| 检测 | 检查前端 request.js 响应拦截器的 return 逻辑 |
### 模式 7导出接口 responseType 未设 blob
| 维度 | 说明 |
|------|------|
| 表现 | 文件下载报"业务出错"或下载文件损坏 |
| 根因 | 未设置 `responseType: 'blob'`,二进制数据被当文本处理 |
| 修复 | 请求配置中添加 `responseType: 'blob'` |
| 检测 | 所有文件下载接口的前端请求配置 |
### 模式 8排序字段驼峰未转下划线
| 维度 | 说明 |
|------|------|
| 表现 | 达梦数据库报错"列名无效" |
| 根因 | 前端传驼峰字段名,后端直接拼 SQLDM8 要求大写下划线列名 |
| 修复 | 后端排序字段先转下划线再拼 SQL或前端直接传下划线格式 |
| 检测 | 后端 QueryWrapper orderBy 使用了 camelCase 字段名的位置 |
## 检测规则
```
CHECK: 对 OARMS 项目进行以下 8 项自动检测
RULE:
1. 前端 table column prop == 后端 VO/Entity 字段名
2. 前端 row-key == 后端 @TableId 字段名
3. 前端分页取数据字段 == "records"(非 "list"
4. 后端 CLOB/String 字段relatedRules, scopeDistricts 等)前端有 JSON.parse
5. 详情接口返回数组时前端有 Array.isArray 判断
6. 前端 request.js 拦截器解包逻辑与业务代码一致
7. 文件下载接口前端有 responseType:'blob'
8. 后端排序字段名已转下划线
FAIL: 任一规则不满足 → 报告具体位置和修复建议
```