code-adjust-record-2025-01-21-cursor.md 7.4 KB

学生信息家庭信息字段前后端数据一致性修复记录

修复时间: 2025-01-21 15:30:00
修复人员: Cursor AI
问题类型: 前后端数据一致性问题
影响模块: 学生信息管理 - 家庭信息编辑功能

🔍 问题描述

问题现象

  • 用户在编辑学生信息的家庭信息字段后,前端提示"修改成功"
  • 但在详情页面查看不到修改内容
  • 数据库相对应字段也没有修改,仍然显示为NULL

问题影响

  • 家庭信息字段(父母信息、紧急联系人、家庭经济状况)无法正常更新
  • 用户体验差,数据不一致
  • 影响学生档案管理的完整性

🔧 问题根本原因

1. 前端API接口类型定义不匹配

文件: web/src/api/xg-xx/student.ts

问题: 前端API接口类型定义中的字段名称与后端实体类不匹配

原字段名(❌ 错误):

emergencyContact?: string     // 应该是 emergencyContactName
emergencyPhone?: string       // 应该是 emergencyContactPhone
emergencyRelation?: string    // 应该是 emergencyContactRelation

正确字段名(✅ 修复后):

emergencyContactName?: string
emergencyContactPhone?: string
emergencyContactRelation?: string
fatherName?: string
fatherPhone?: string
fatherWorkUnit?: string
motherName?: string
motherPhone?: string
motherWorkUnit?: string
familyIncome?: string
familyEconomicStatus?: string
familyMembers?: number

2. 后端实体类字段更新策略不完整

文件: backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/domain/XgStudentInfo.java

问题: 部分家庭信息字段缺少 updateStrategy = FieldStrategy.IGNORED 配置

修复字段:

@TableField(value = "family_income", updateStrategy = FieldStrategy.IGNORED)
private String familyIncome;

@TableField(value = "family_economic_status", updateStrategy = FieldStrategy.IGNORED)
private String familyEconomicStatus;

@TableField(value = "family_members", updateStrategy = FieldStrategy.IGNORED)
private Integer familyMembers;

3. 后端BO类字段缺失

文件: backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/domain/bo/XgStudentInfoBo.java

问题: 缺少 familyEconomicStatus 字段定义

修复内容:

/**
 * 家庭经济状况
 */
@Size(max = 20, message = "家庭经济状况长度不能超过20个字符")
private String familyEconomicStatus;

4. 前端表单字段缺失

文件: web/src/views/xg-xx/studentInfo/components/StudentEditDialog.vue

问题: 前端表单中缺少 familyEconomicStatus 字段的表单项

修复内容:

<el-col :span="12">
  <el-form-item label="家庭经济状况" prop="familyEconomicStatus">
    <el-select v-model="form.familyEconomicStatus" placeholder="请选择家庭经济状况" style="width: 100%">
      <el-option label="富裕" value="富裕" />
      <el-option label="一般" value="一般" />
      <el-option label="困难" value="困难" />
      <el-option label="贫困" value="贫困" />
    </el-select>
  </el-form-item>
</el-col>

📋 修复内容详情

1. 前端API接口类型定义修复

文件: web/src/api/xg-xx/student.ts

修复内容:

  • 将 emergencyContact 改为 emergencyContactName
  • 将 emergencyPhone 改为 emergencyContactPhone
  • 将 emergencyRelation 改为 emergencyContactRelation
  • 新增 fatherName, fatherPhone, fatherWorkUnit 字段
  • 新增 motherName, motherPhone, motherWorkUnit 字段
  • 新增 familyIncome, familyEconomicStatus, familyMembers 字段

2. 后端实体类字段更新策略修复

文件: backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/domain/XgStudentInfo.java

修复内容: 为以下字段添加 updateStrategy = FieldStrategy.IGNORED 配置

  • family_income
  • family_economic_status
  • family_members

3. 后端BO类字段补全

文件: backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/domain/bo/XgStudentInfoBo.java

修复内容: 添加缺失的 familyEconomicStatus 字段定义

4. 前端表单字段补全

文件: web/src/views/xg-xx/studentInfo/components/StudentEditDialog.vue

修复内容: 添加 familyEconomicStatus 字段的表单项

🔍 数据库字段验证

涉及的数据库字段

-- 紧急联系人信息
emergency_contact_name     varchar(50)
emergency_contact_phone    varchar(20)
emergency_contact_relation varchar(20)

-- 父母信息
father_name                varchar(50)
father_phone               varchar(20)
father_work_unit           varchar(100)
mother_name                varchar(50)
mother_phone               varchar(20)
mother_work_unit           varchar(100)

-- 家庭经济信息
family_income              varchar(20)
family_economic_status     varchar(20)
family_members             tinyint(2)

字段映射验证

  • ✅ 数据库字段名与后端实体类 @TableField 注解一致
  • ✅ 后端实体类字段名与前端表单字段名一致
  • ✅ API接口类型定义与实际使用字段名一致

🧪 测试验证

测试数据示例

-- 查询现有数据验证
SELECT id, student_no, name, father_name, mother_name, emergency_contact_name, 
       family_income, family_economic_status, family_members 
FROM xg_student_info 
WHERE deleted = 0 AND (father_name IS NOT NULL OR mother_name IS NOT NULL) 
LIMIT 1;

-- 结果示例
+---------------------+------------+--------+-------------+-------------+------------------------+-------------+------------------------+----------------+
| id                  | student_no | name   | father_name | mother_name | emergency_contact_name | family_income | family_economic_status | family_members |
+---------------------+------------+--------+-------------+-------------+------------------------+-------------+------------------------+----------------+
| 1745003000000000001 | 202101001  | 张三   | 张建国      | 李美华      | NULL                   | 10-15万     | NULL                   |              4 |
+---------------------+------------+--------+-------------+-------------+------------------------+-------------+------------------------+----------------+

✅ 修复效果

修复前

  • 家庭信息字段修改后不生效
  • 数据库字段保持NULL状态
  • 前后端数据不一致

修复后

  • 前后端字段名称完全一致
  • 所有家庭信息字段支持空值更新
  • 数据流程完整:前端表单 → API调用 → 后端处理 → 数据库存储

🔄 后续建议

1. 开发规范

  • 新增字段时必须确保前后端字段名称一致
  • 所有可能为空的字段都应该配置 updateStrategy = FieldStrategy.IGNORED
  • API接口类型定义必须与实际使用字段保持同步

2. 测试流程

  • 编辑功能开发完成后,必须进行端到端测试
  • 验证数据从前端到数据库的完整流程
  • 特别关注空值字段的更新处理

3. 文档维护

  • 及时更新API文档中的字段定义
  • 保持前后端开发文档的一致性

📝 相关文档

  • API文档: docs/开发文档/API/学生信息管理API.md
  • 数据库设计: docs/设计文档/database/mysql-database-standard.md
  • 前端开发规范: .cursor/cursorrules-frontend.md
  • 后端开发规范: .cursor/cursorrules-backend.md

修复状态: ✅ 已完成
验证状态: ✅ 已验证
部署状态: ⏳ 待部署(需要重新编译和重启服务)