11 KiB
党籍保留亲属姓名字段补充完成报告
📋 问题背景
问题描述
在党籍保留申请功能中,前端表单有 relativeName(亲属姓名)字段并设置为必填项,但数据库表 rs_party_membership_retention 中缺失对应字段,导致:
- ❌ 前端填写的亲属姓名无法保存到数据库
- ❌ 后端实体类、Bo类、Vo类都缺失该字段
- ❌ 查看详情时,亲属姓名永远显示"无"
- ❌ 数据完整性受损,业务逻辑不完整
问题来源
- 前端表单优化时新增了
relativeName字段(参考:党籍保留表单优化说明.md) - 但未同步更新数据库表结构和后端代码
- 导致前后端字段不一致
✅ 解决方案
完整修复流程(5层架构)
1️⃣ 数据库层 - 添加字段
文件: backend/ruoyi-modules/ruoyi-rs/党籍保留补充亲属姓名字段脚本.sql
-- 增加亲属姓名字段(放在 spouse 字段之后)
ALTER TABLE `rs_party_membership_retention`
ADD COLUMN `relative_name` varchar(50) NULL DEFAULT NULL COMMENT '亲属姓名(探望对象)'
AFTER `spouse`;
-- 为亲属姓名添加索引(支持模糊查询)
ALTER TABLE `rs_party_membership_retention`
ADD INDEX `idx_relative_name` (`relative_name`) USING BTREE COMMENT '亲属姓名索引(模糊查询)';
字段说明:
- 字段名:
relative_name - 类型:
varchar(50) - 位置: 在
spouse(配偶姓名)字段之后 - 可为空: 是(NULL)
- 默认值: NULL
- 索引: 添加
idx_relative_name索引,支持模糊查询
2️⃣ 后端实体类 - 补充属性
文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsPartyMembershipRetention.java
修改位置: 第73-79行(在 spouse 字段后)
/**
* 亲属姓名(探望对象)
*/
@TableField("relative_name")
@ExcelProperty(value = "亲属姓名")
private String relativeName;
注解说明:
@TableField("relative_name"): 映射到数据库字段relative_name@ExcelProperty(value = "亲属姓名"): 导出Excel时的列名
3️⃣ 后端Bo类 - 补充属性和验证
文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/bo/RsPartyMembershipRetentionBo.java
修改位置: 第68-72行(在 spouse 字段后)
/**
* 亲属姓名(探望对象)
*/
@NotBlank(message = "亲属姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String relativeName;
验证规则:
@NotBlank: 必填字段,不能为空或空白字符串groups = { AddGroup.class, EditGroup.class }: 新增和编辑时都需要验证
4️⃣ 后端Vo类 - 补充属性
文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsPartyMembershipRetentionVo.java
修改位置: 第60-63行(在 spouse 字段后)
/**
* 亲属姓名(探望对象)
*/
private String relativeName;
5️⃣ 前端API类型定义 - 补充字段
文件: web/src/api/rs/party-membership-retention.ts
修改位置1: PartyRetentionVO 接口(第45-46行)
/** 亲属姓名(探望对象) */
relativeName?: string
修改位置2: PartyRetentionForm 接口(第105-106行)
/** 亲属姓名(探望对象) */
relativeName?: string
📊 字段映射关系表
| 层级 | 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| 数据库 | relative_name |
varchar(50) | 否 | 亲属姓名(探望对象) |
| 实体类 | relativeName |
String | - | 映射到 relative_name |
| Bo类 | relativeName |
String | ✅ 是 | 新增/编辑时必填 |
| Vo类 | relativeName |
String | - | 返回给前端 |
| 前端VO | relativeName |
string | 否 | 可选字段 |
| 前端Form | relativeName |
string | 否 | 可选字段 |
🔍 完整字段对比(补充后)
基本信息字段组
| 前端字段 | 后端Bo字段 | 数据库字段 | 状态 |
|---|---|---|---|
| name | name | name | ✅ 一致 |
| idCard | idCard | id_card | ✅ 一致 |
| position | position | position | ✅ 一致 |
| spouse | spouse | spouse | ✅ 一致 |
| relativeName | relativeName | relative_name | ✅ 已补充 |
出国时间字段组
| 前端字段 | 后端Bo字段 | 数据库字段 | 状态 |
|---|---|---|---|
| travelStartDate | travelStartDate | travel_start_date | ✅ 一致 |
| travelEndDate | travelEndDate | travel_end_date | ✅ 一致 |
| stayDays | stayDays | stay_days | ✅ 一致 |
出国目的字段组
| 前端字段 | 后端Bo字段 | 数据库字段 | 状态 |
|---|---|---|---|
| destination | destination | destination | ✅ 一致 |
| purpose | purpose | purpose | ✅ 一致 |
| travelReason | travelReason | travel_reason | ✅ 一致 |
党支部信息字段组
| 前端字段 | 后端Bo字段 | 数据库字段 | 状态 |
|---|---|---|---|
| partyBranch | partyBranch | party_branch | ✅ 一致 |
| applicationDate | applicationDate | application_date | ✅ 一致 |
📝 数据库执行步骤
1. 备份数据(重要!)
-- 备份现有数据
CREATE TABLE rs_party_membership_retention_backup_20251010
AS SELECT * FROM rs_party_membership_retention;
2. 执行字段添加脚本
# 在数据库中执行
mysql -u root -p hzdyjs_xg < backend/ruoyi-modules/ruoyi-rs/党籍保留补充亲属姓名字段脚本.sql
3. 验证字段添加成功
-- 验证字段是否存在
SELECT
COLUMN_NAME AS '字段名',
COLUMN_TYPE AS '字段类型',
IS_NULLABLE AS '是否可空',
COLUMN_DEFAULT AS '默认值',
COLUMN_COMMENT AS '字段注释'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'hzdyjs_xg'
AND TABLE_NAME = 'rs_party_membership_retention'
AND COLUMN_NAME = 'relative_name';
-- 验证索引是否添加
SHOW INDEX FROM `rs_party_membership_retention`
WHERE Key_name = 'idx_relative_name';
🚀 后端部署步骤
1. 编译后端代码
cd backend
mvn clean package -DskipTests
2. 重启后端服务
# 停止旧服务
./stop-main.sh
# 启动新服务
./start-main.sh
3. 验证后端接口
# 测试获取详情接口,检查是否返回 relativeName 字段
curl -X GET "http://localhost:8080/rs/party/retention/1" \
-H "Authorization: Bearer YOUR_TOKEN"
🎨 前端验证步骤
1. 清除缓存并重新编译
cd web
npm run build
2. 测试功能
- 新增申请: 填写亲属姓名,保存后查看是否成功保存
- 查看详情: 打开已有申请,检查亲属姓名是否正确显示
- 编辑申请: 修改亲属姓名,保存后验证是否更新成功
- 列表导出: 导出Excel,检查是否包含"亲属姓名"列
✅ 修复效果对比
修复前 ❌
前端表单: relativeName = "张三"
↓ 提交
后端Bo类: 无 relativeName 字段 → 数据丢失
↓ 保存
数据库: 无 relative_name 字段 → 无法存储
↓ 查询
前端显示: 亲属姓名 = "无"
修复后 ✅
前端表单: relativeName = "张三"
↓ 提交
后端Bo类: relativeName = "张三" → 数据接收成功
↓ 保存
数据库: relative_name = "张三" → 成功存储
↓ 查询
前端显示: 亲属姓名 = "张三" → 正确显示
📋 修改文件清单
后端文件(4个)
- ✅
backend/ruoyi-modules/ruoyi-rs/党籍保留补充亲属姓名字段脚本.sql- 新建 - ✅
backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsPartyMembershipRetention.java- 修改 - ✅
backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/bo/RsPartyMembershipRetentionBo.java- 修改 - ✅
backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsPartyMembershipRetentionVo.java- 修改
前端文件(1个)
- ✅
web/src/api/rs/party-membership-retention.ts- 修改
文档文件(1个)
- ✅
党籍保留亲属姓名字段补充完成报告.md- 新建
🔄 相关文档更新
需要更新的文档
- API文档: 如果有党籍保留API文档,需要补充
relativeName字段说明 - 数据库设计文档: 更新表结构说明,添加
relative_name字段 - 字段映射文档: 更新前后端字段映射关系表
⚠️ 注意事项
1. 数据库执行注意
- ✅ 执行前务必备份数据
- ✅ 确认数据库连接正确(
hzdyjs_xg) - ✅ 如果字段已存在,ALTER TABLE 会报错(可忽略)
2. 后端部署注意
- ✅ 确保数据库字段添加成功后再部署后端
- ✅ 重启后端服务使新代码生效
- ✅ 检查日志是否有MyBatis映射错误
3. 前端测试注意
- ✅ 清除浏览器缓存,确保使用最新代码
- ✅ 测试新增、编辑、查看详情等完整流程
- ✅ 验证必填项验证是否正常工作
🎯 测试用例
测试用例1:新增申请
步骤:
- 打开党籍保留申请页面
- 填写所有必填字段,包括"亲属姓名"为"张三"
- 点击"保存"按钮
预期结果:
- ✅ 保存成功
- ✅ 数据库
relative_name字段值为"张三"
测试用例2:查看详情
步骤:
- 在列表中点击"查看"按钮
- 查看详情弹窗中的"亲属姓名"字段
预期结果:
- ✅ 正确显示"张三"
- ✅ 不再显示"无"
测试用例3:编辑申请
步骤:
- 在列表中点击"编辑"按钮
- 修改"亲属姓名"为"李四"
- 点击"保存"按钮
预期结果:
- ✅ 保存成功
- ✅ 数据库
relative_name字段更新为"李四" - ✅ 再次查看详情显示"李四"
测试用例4:必填验证
步骤:
- 打开新增申请表单
- 不填写"亲属姓名"
- 点击"保存"按钮
预期结果:
- ✅ 前端显示验证错误:"请输入亲属姓名"
- ✅ 后端返回验证错误:"亲属姓名不能为空"
📊 问题解决总结
问题根源
前端表单优化时新增字段,但未同步更新数据库和后端代码,导致数据层面不一致。
解决方案
按照标准的5层架构(数据库 → 实体类 → Bo类 → Vo类 → 前端API),完整补充 relativeName 字段。
修复范围
- ✅ 数据库表结构(添加字段和索引)
- ✅ 后端实体类(添加属性和注解)
- ✅ 后端Bo类(添加属性和验证)
- ✅ 后端Vo类(添加属性)
- ✅ 前端API类型定义(补充字段)
预防措施
- 强制性文档同步: 字段变更必须同步更新所有层级
- 完整性检查: 新增字段时检查5层架构是否都已补充
- 测试验证: 完整测试新增、编辑、查看等所有流程
🎉 完成状态
- ✅ 数据库字段添加脚本已创建
- ✅ 后端实体类已补充
relativeName属性 - ✅ 后端Bo类已补充
relativeName属性和验证 - ✅ 后端Vo类已补充
relativeName属性 - ✅ 前端API类型定义已补充
relativeName字段 - ✅ 字段映射关系已验证完整
- ✅ 修复报告已编写
状态: 🎉 代码修改完成!请按照部署步骤执行数据库脚本和重启后端服务!
修复完成时间: 2025-10-10
修复人员: Cursor AI
版本: v1.0
相关文档:
党籍保留表单优化说明.md(问题来源)党籍保留字段验证修正完成报告.md(历史问题记录)