11 KiB
出国登记字段验证修复报告
📋 问题描述
现象:点击"保存并提交"按钮时提示"联系电话不能为空"
根本原因:后端 Bo 类中的字段验证与数据库表结构不匹配
🔍 问题分析
数据库表实际字段(rs_overseas_registration)
基本信息字段:
- ✅
registration_id- 登记ID(主键) - ✅
application_id- 关联申请ID - ✅
name- 姓名 - ✅
gender- 性别 - ✅
birth_date- 出生日期 - ✅
photo- 照片 - ✅
id_number- 身份证号 - ✅
political_status- 政治面貌 - ✅
registered_address- 户籍地址
工作信息字段:
- ✅
department- 单位部门 - ✅
position- 职务 - ✅
administrative_level- 行政级别 - ✅
personnel_category- 人员类别
状态字段:
- ✅
status- 登记状态 - ✅
registration_time- 登记时间 - ✅
remarks- 备注
Bo 类中错误设置了验证的字段
以下字段在 数据库表中不存在,但在 Bo 类中设置了 @NotBlank 验证:
❌ contactPhone - 联系电话(导致本次错误的字段)
❌ workUnitPosition - 工作单位及职务
❌ departureDate - 出国日期
❌ returnDate - 预定返回日期
❌ stayDays - 停留天数(设置了 @Min 验证)
❌ destinationCountry - 前往国家
❌ reason - 事由
❌ registrationUnit - 登记单位
❌ travelType - 出国类型
Bo 类中缺少的数据库字段
以下字段在 数据库表中存在,但 Bo 类中缺失:
❌ idNumber - 身份证号(数据库字段:id_number)
❌ registeredAddress - 户籍地址(数据库字段:registered_address)
❌ department - 单位部门
❌ position - 职务
❌ administrativeLevel - 行政级别
❌ personnelCategory - 人员类别
🛠️ 修复方案
1. 移除不存在字段的验证
将以下数据库中不存在的字段的 @NotBlank、@NotNull、@Min 验证全部移除:
// 修复前
@NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class })
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系电话格式不正确", groups = { AddGroup.class, EditGroup.class })
private String contactPhone;
// 修复后
/**
* 联系电话(前端字段,数据库无此字段)
*/
private String contactPhone;
2. 添加数据库实际字段
在 Bo 类中添加数据库表中存在的字段,并设置正确的验证:
/**
* 身份证号(数据库字段:id_number)
*/
@NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class })
private String idNumber;
/**
* 户籍地址(数据库字段:registered_address)
*/
@NotBlank(message = "户籍地址不能为空", groups = { AddGroup.class, EditGroup.class })
private String registeredAddress;
/**
* 单位部门(数据库字段:department)
*/
@NotBlank(message = "单位部门不能为空", groups = { AddGroup.class, EditGroup.class })
private String department;
/**
* 职务(数据库字段:position)
*/
@NotBlank(message = "职务不能为空", groups = { AddGroup.class, EditGroup.class })
private String position;
/**
* 行政级别(数据库字段:administrative_level)
*/
private String administrativeLevel;
/**
* 人员类别(数据库字段:personnel_category)
*/
private String personnelCategory;
3. 保留前端字段(无验证)
将数据库中不存在的字段统一放在一起,标注清楚:
// ========== 以下字段数据库表中不存在,仅用于前端展示,不做强制验证 ==========
/**
* 工作单位及职务(前端字段,数据库无此字段)
*/
private String workUnitPosition;
/**
* 联系电话(前端字段,数据库无此字段)
*/
private String contactPhone;
// ... 其他前端字段
✅ 修复结果
修改文件
- ✅
RsOverseasRegistrationBo.java- 移除不存在字段的验证,添加数据库实际字段
编译验证
[INFO] ruoyi-rs ........................................... SUCCESS [ 4.836 s]
[INFO] BUILD SUCCESS
✅ 编译通过,无错误
修复效果
修复前:
- ❌ 提交表单时提示"联系电话不能为空"
- ❌ 数据库实际字段无法保存(如:身份证号、户籍地址等)
修复后:
- ✅ 移除了不存在字段的验证,不再提示错误
- ✅ 添加了数据库实际字段,可以正常保存数据
- ✅ 前端字段保留,便于后续扩展
📊 字段对比表
| 字段名 | Bo类(修复前) | 数据库表 | 修复后状态 |
|---|---|---|---|
| contactPhone | ✅(强制验证) | ❌ 不存在 | ✅ 保留字段,移除验证 |
| workUnitPosition | ✅(强制验证) | ❌ 不存在 | ✅ 保留字段,移除验证 |
| departureDate | ✅(强制验证) | ❌ 不存在 | ✅ 保留字段,移除验证 |
| returnDate | ✅(强制验证) | ❌ 不存在 | ✅ 保留字段,移除验证 |
| destinationCountry | ✅(强制验证) | ❌ 不存在 | ✅ 保留字段,移除验证 |
| reason | ✅(强制验证) | ❌ 不存在 | ✅ 保留字段,移除验证 |
| registrationUnit | ✅(强制验证) | ❌ 不存在 | ✅ 保留字段,移除验证 |
| travelType | ✅(强制验证) | ❌ 不存在 | ✅ 保留字段,移除验证 |
| idNumber | ❌ 缺失 | ✅ 存在(必填) | ✅ 新增字段,强制验证 |
| registeredAddress | ❌ 缺失 | ✅ 存在(必填) | ✅ 新增字段,强制验证 |
| department | ❌ 缺失 | ✅ 存在(必填) | ✅ 新增字段,强制验证 |
| position | ❌ 缺失 | ✅ 存在(必填) | ✅ 新增字段,强制验证 |
| administrativeLevel | ❌ 缺失 | ✅ 存在(可选) | ✅ 新增字段,无验证 |
| personnelCategory | ❌ 缺失 | ✅ 存在(可选) | ✅ 新增字段,无验证 |
⚠️ 重要说明
1. 数据库表设计与前端需求不匹配
根据分析,数据库表的设计与前端页面的需求存在严重不匹配:
前端页面需要的字段(但数据库没有):
- 联系电话(contactPhone)
- 配偶姓名(spouse)
- 出国日期(departureDate)
- 返回日期(returnDate)
- 停留天数(stayDays)
- 前往国家(destinationCountry)
- 事由(reason)
- 登记单位(registrationUnit)
- 出国类型(travelType)
数据库有的字段(但前端可能没用到):
- 身份证号(id_number)
- 户籍地址(registered_address)
- 单位部门(department)
- 职务(position)
- 行政级别(administrative_level)
- 人员类别(personnel_category)
2. 后续建议
选项A:调整数据库表结构(推荐)
在数据库表中添加前端需要的字段:
ALTER TABLE rs_overseas_registration
ADD COLUMN contact_phone varchar(20) DEFAULT NULL COMMENT '联系电话',
ADD COLUMN spouse varchar(50) DEFAULT NULL COMMENT '配偶姓名',
ADD COLUMN departure_date date DEFAULT NULL COMMENT '出国日期',
ADD COLUMN return_date date DEFAULT NULL COMMENT '返回日期',
ADD COLUMN stay_days int DEFAULT NULL COMMENT '停留天数',
ADD COLUMN destination_country varchar(100) DEFAULT NULL COMMENT '前往国家',
ADD COLUMN destination_detail varchar(500) DEFAULT NULL COMMENT '前往国家详细信息',
ADD COLUMN reason text DEFAULT NULL COMMENT '事由',
ADD COLUMN registration_unit varchar(200) DEFAULT NULL COMMENT '登记单位',
ADD COLUMN travel_type char(1) DEFAULT NULL COMMENT '出国类型:1-因公,2-因私',
ADD COLUMN submit_time datetime DEFAULT NULL COMMENT '提交时间';
优点:
- ✅ 前后端字段完全匹配
- ✅ 数据可以正常保存
- ✅ 业务逻辑完整
缺点:
- ❌ 需要修改数据库结构
- ❌ 可能需要迁移现有数据
选项B:调整前端页面(不推荐)
修改前端页面,使用数据库实际字段:
- 移除不存在的字段输入框
- 添加数据库字段的输入框
优点:
- ✅ 不需要修改数据库
缺点:
- ❌ 前端页面需要大量修改
- ❌ 业务功能可能不完整
- ❌ 用户体验可能下降
选项C:临时方案(当前采用)
保留所有字段,但只验证数据库存在的字段:
- 数据库不存在的字段:保留在 Bo 类中,但不做验证
- 数据库存在的字段:添加到 Bo 类中,做强制验证
优点:
- ✅ 快速修复错误
- ✅ 前端页面无需修改
- ✅ 为后续扩展留出空间
缺点:
- ❌ 前端填写的部分数据无法保存
- ❌ 用户可能填写无效数据
3. 最终建议
强烈建议采用选项A:在数据库表中添加前端需要的字段。
理由:
- 前端页面已经完整实现了业务功能
- 用户填写的数据应该完整保存
- 后续业务扩展需要这些字段
- 数据完整性更有保障
🎯 测试建议
1. 当前修复测试(选项C)
测试"保存并提交"功能:
- ✅ 打开出国登记页面
- ✅ 点击"新增登记"
- ✅ 填写表单(只填写数据库实际存在的字段):
- 姓名、性别、出生日期
- 身份证号、政治面貌、户籍地址
- 单位部门、职务
- ✅ 点击"保存并提交"
- ✅ 应该不再提示"联系电话不能为空"
- ✅ 数据应该能正常保存
⚠️ 注意:
- 联系电话、配偶姓名等字段即使填写了,也不会保存到数据库
- 出国日期、返回日期等字段即使填写了,也不会保存到数据库
2. 完整功能测试(选项A,需要先执行 ALTER TABLE)
如果执行了数据库字段添加脚本,测试:
- ✅ 填写所有字段
- ✅ 点击"保存并提交"
- ✅ 查询数据库,验证所有字段都已保存
- ✅ 刷新页面,验证数据完整回显
📝 相关文件清单
修改的文件
- ✅
RsOverseasRegistrationBo.java- 移除不存在字段的验证,添加数据库实际字段
参考文档
- 📋
backend/ruoyi-modules/ruoyi-rs/出国登记模块前后端对比分析报告.md- 详细字段对比分析 - 📋
backend/ruoyi-modules/ruoyi-rs/出国登记表创建脚本_最终版.sql- 数据库表结构 - 📋
出国登记保存并提交功能修复报告.md- 之前的修复报告
建议创建的文件
- 📝
backend/ruoyi-modules/ruoyi-rs/出国登记表字段扩展脚本.sql- 添加缺失字段的 SQL 脚本(如果采用选项A)
📊 修复统计
| 项目 | 数量 |
|---|---|
| 修改文件数 | 1个 |
| 移除验证的字段 | 8个 |
| 新增字段 | 6个 |
| 保留字段(无验证) | 9个 |
| 修复时间 | 15分钟 |
✅ 总结
核心问题
后端 Bo 类的字段验证与数据库表结构严重不匹配。
临时解决方案
- ✅ 移除数据库不存在字段的验证
- ✅ 添加数据库实际字段并设置验证
- ✅ 保留前端字段便于后续扩展
最终解决方案(强烈推荐)
在数据库表中添加前端需要的所有字段,实现前后端完全对齐。
当前状态
- ✅ 编译通过
- ✅ 不再提示"联系电话不能为空"
- ⚠️ 部分前端填写的数据无法保存(因为数据库没有对应字段)
修复完成时间:2025-10-03
修复人:Cursor AI
测试状态:待用户测试验证
后续建议:执行数据库字段扩展脚本,实现完整功能