# 代码调整记录 - 2025-01-07 - wuzilong
## 2025-01-07 20:15:00 - 学生信息详细对话框改为完全禁用模式
### 📋 变更描述
将学生信息详细对话框(stuMsgDetailDialog.vue)中所有输入控件从 `readonly` 状态改为 `disabled` 状态,实现完全禁用效果。
### 🎯 变更目标
- 统一所有输入控件的禁用状态
- 从 `readonly`(可读但不可编辑)改为 `disabled`(完全禁用)
- 修复 linter 错误
### 🔧 具体修改内容
#### 1. 导入错误修复
```javascript
// ElMessage导入修复
// 尝试过的方式:import ElMessage from 'element-plus/es/components/message';
// 最终正确方式:
import { ElMessage } from 'element-plus';
// Request导入类型错误修复
// @ts-ignore
import request from '@/utils/request';
```
#### 2. 输入控件状态统一
将所有 `el-input` 的 `readonly` 属性改为 `disabled` 属性:
**涉及的输入控件**:
- 基础信息:英文姓名、曾用名、手机号码、邮政编码、户籍所在地、家庭地址、现住址等
- 扩展信息:宗教信仰、毕业院校、电子邮箱、QQ、微信、紧急联系人信息、助学贷款金额等
- 扩展文本域:特长爱好、获奖情况、违纪记录、社会活动等
- 家庭信息:父母姓名、电话、工作单位、监护人信息、家庭收入等
- 健康信息:身高、体重、健康状况、残疾等级、疾病史等
- 银行卡信息:银行卡号、持卡人姓名、开户银行、开户支行等
#### 3. 状态对比
- **readonly**:字段可被选中和复制,但不可编辑
- **disabled**:字段完全禁用,不可选中、复制或编辑,呈现灰色状态
### 📁 影响文件
- `web/src/views/stuMsgSupply/stuMsgDetailDialog.vue`
### ✅ 验证结果
- [x] 修复了 ElMessage 导入错误
- [x] 所有文本输入框改为 disabled 状态
- [x] 所有文本域改为 disabled 状态
- [x] select、date-picker、tree-select 保持原有 disabled 状态
- [x] 界面呈现完全禁用的灰色效果
- [x] 无 linter 错误
### 🎯 用户体验
- 更明显的视觉禁用效果(灰色显示)
- 防止用户尝试选中或复制内容
- 统一的禁用状态,界面更加一致
---
## 2025-01-07 19:50:00 - 学生信息详细对话框改为只读模式
### 📋 变更描述
将学生信息详细对话框(stuMsgDetailDialog.vue)从编辑模式改为只读查看模式,所有输入控件不可编辑。
### 🎯 变更目标
- 将界面从信息完善对话框改为信息查看对话框
- 移除编辑和提交功能,仅保留查看功能
### 🔧 具体修改内容
#### 1. 界面标题修改
- 默认标题:`学生信息完善` → `学生信息详情查看`
- Props默认值:`title: '学生信息完善'` → `title: '学生信息详情查看'`
#### 2. 底部按钮修改
- 移除:确定按钮(提交功能)
- 保留:关闭按钮(`取消` → `关闭`)
#### 3. 输入控件只读化
**基础信息Tab**:
- `el-input`:添加 `readonly` 属性
- `el-select`:添加 `disabled` 属性
- `el-date-picker`:添加 `disabled` 属性
- `el-tree-select`:添加 `disabled` 属性
- 照片上传:改为 `
` 纯显示
**扩展信息Tab**:
- 所有文本输入框:添加 `readonly` 属性
- 所有下拉选择器:添加 `disabled` 属性
- 所有文本域:添加 `readonly` 属性
**家庭信息Tab**:
- 父母信息输入框:添加 `readonly` 属性
- 监护人信息输入框:添加 `readonly` 属性
- 经济状况选择器:添加 `disabled` 属性
**健康信息Tab**:
- 身高体重输入框:添加 `readonly` 属性
- 血型选择器:添加 `disabled` 属性
- 是否残疾等选择器:添加 `disabled` 属性
- 健康相关文本域:添加 `readonly` 属性
**学籍信息Tab**:
- 培养方式选择器:添加 `disabled` 属性
- 录取类别选择器:添加 `disabled` 属性
- 学籍状态选择器:添加 `disabled` 属性
- 入学日期选择器:添加 `disabled` 属性
**银行卡信息Tab**:
- 所有银行卡相关输入框:添加 `readonly` 属性
#### 4. 功能函数移除
- 移除:`submitForm()` 提交表单函数
- 移除:`beforePhotoUpload()` 照片上传校验函数
- 移除:`handlePhotoUpload()` 照片上传处理函数
#### 5. 样式优化
添加照片显示容器样式:
```css
.photo-display {
border: 1px solid var(--el-border-color);
border-radius: 6px;
overflow: hidden;
width: 120px;
height: 150px;
display: flex;
align-items: center;
justify-content: center;
}
```
### 📁 影响文件
- `web/src/views/stuMsgSupply/stuMsgDetailDialog.vue`
### ✅ 验证结果
- [x] 所有Tab页的输入控件均为只读状态
- [x] 照片显示正常,无法上传新照片
- [x] 底部只有关闭按钮,无提交功能
- [x] 历史记录Tab正常显示
- [x] 界面标题正确显示为"学生信息详情查看"
- [x] 样式保持一致,用户体验良好
### 🎯 使用场景
该只读对话框适用于:
- 查看学生已提交的信息详情
- 历史记录查看
- 信息确认和核实
- 管理员查看学生信息
### 📝 后续计划
- 如需要编辑功能,可创建单独的编辑对话框组件
- 可根据权限控制显示编辑按钮
- 可添加打印或导出功能
---
## 2025-01-07 18:30:00 - 学生信息批次管理收集范围功能完善
## 历史记录Tab页样式优化及箭头逻辑修正
### 变更时间
2025-01-07 16:45:00(初次优化)
2025-01-07 17:00:00(箭头逻辑修正)
### 变更内容
优化了学生信息完善弹窗中历史记录Tab页的显示样式,统一卡片大小,添加内容省略和tooltip效果,调整箭头显示逻辑。
### 修改文件
- `web/src/views/stuMsgSupply/stuMsgDialog.vue`
### 具体变更
1. **卡片样式统一化**
- 设置固定卡片尺寸:宽度200px,高度120px
- 使用flex布局:`flex-direction: column` 和 `justify-content: space-between`
- 确保所有卡片大小一致,提升视觉效果
2. **操作内容省略优化**
- 添加 `el-tooltip` 包装操作内容文本
- 设置省略规则:最多显示2行,超出显示省略号
- 添加条件tooltip:内容长度>20字符时才显示tooltip
- CSS样式:使用 `-webkit-line-clamp: 2` 实现多行省略
3. **箭头显示逻辑调整**
- **取消第四个卡片的向下箭头**:条件从 `(index + 1) % 4 === 0` 改为 `(index + 1) % 4 === 0 && index !== 3`
- **新增每行第一个卡片前的向右箭头**:条件为 `index % 4 === 0 && index >= 4`
- **修正箭头重复问题**:避免第二行第二个卡片出现两个箭头,只在每行第一个卡片前显示向右箭头
- 添加 `row-start-arrow` 和 `right-arrow` 样式类
4. **响应式布局优化**
- 在所有断点(1200px、900px、600px)下隐藏新的向右箭头
- 确保小屏幕下的显示效果不受影响
- 保持原有的列数布局逻辑
### 样式变更详情
```css
/* 卡片固定尺寸 */
.history-card {
width: 200px;
height: 120px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
/* 内容省略效果 */
.operate-content {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
max-height: 2.8em;
}
/* 新的向右箭头 */
.row-start-arrow {
position: absolute;
left: -25px;
z-index: 10;
}
```
### 用户体验改进
- **视觉一致性**:所有卡片大小统一,界面更整洁
- **内容可读性**:长文本显示省略号,悬停查看完整内容
- **流程清晰度**:箭头逻辑更合理,每行第一个卡片前显示向右箭头表示换行,避免箭头重复
- **适配性**:在不同屏幕尺寸下都有良好的显示效果
### 技术要点
- 使用CSS Grid/Flexbox实现响应式布局
- -webkit-line-clamp实现多行文本省略
- Element Plus tooltip组件增强交互体验
- 媒体查询确保移动端适配
---
## 学生信息完善弹窗蒙层加载效果优化
### 变更时间
2025-01-07 15:30:00
### 变更内容
优化了学生信息完善弹窗的蒙层加载效果,解决用户看不到加载状态的问题。
### 修改文件
- `web/src/views/stuMsgSupply/stuMsgDialog.vue`
### 具体变更
1. **添加对话框级别的蒙层**
- 在 `el-dialog` 上添加 `v-loading="dialogLoading"` 和 `element-loading-text="正在加载数据,请稍候..."`
- 新增 `dialogLoading` 响应式变量控制加载状态
2. **优化加载逻辑**
- 立即显示蒙层,防止闪烁
- 分阶段加载数据:第一阶段加载基础配置,第二阶段加载业务数据
- 增加最小显示时间到1000ms,确保用户能看到加载过程
- 增强日志输出,使用emoji提升可读性
3. **修复导入错误**
- 将 `import service from '@/utils/request'` 修正为 `import request from '@/utils/request'`
- 更新所有相关的API调用从 `service` 改为 `request`
4. **异常处理优化**
- 在 try-catch-finally 结构中确保蒙层能够正确隐藏
- 对话框关闭时重置加载状态
### 技术要点
- 使用Element Plus的v-loading指令实现蒙层效果
- 分阶段加载策略避免多API并发调用的时序问题
- 最小显示时间机制确保用户体验
### 预期效果
- 弹窗打开时显示明显的蒙层加载效果
- 防止用户在数据加载期间误操作
- 提供更好的用户体验和视觉反馈
---
## 变更概述
新增学生信息批次收集模块中的学生提交完善信息接口
## 变更时间
2025-01-07 14:30:00
## 变更人员
wuzilong
---
## 🔄 变更记录(按时间倒序)
### 2025-01-07 14:30:00 - 新增学生提交信息完善接口
#### 📋 变更说明
在学生信息批次收集模块中新增接口,用于存储学生提交的完善信息。
#### 🎯 业务需求
- 学生在信息完善界面提交数据时,需要先逻辑删除历史数据,再插入新数据
- 确保每个学生在同一批次中只有一条有效记录
- 支持使用前台传递的ID进行数据插入
#### 🔧 技术实现
**1. Controller层变更**
- 文件:`backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgBatchController.java`
- 新增接口:`POST /studentMsgBatch/studentMsgBatch/submitStudentMsg`
- 权限要求:`studentMsgBatch:studentMsgBatch:add`
- 入参:`XgStudentMsgBatchBo`
- 返回:`R`
**2. Service层变更**
- 接口文件:`backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentMsgBatchService.java`
- 新增方法:`Boolean submitStudentMsg(XgStudentMsgBatchBo bo)`
- 实现文件:`backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgBatchServiceImpl.java`
- 实现业务逻辑:逻辑删除 + 数据插入
**3. Mapper层变更**
- 接口文件:`backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgBatchMapper.java`
- 新增方法:`int logicalDeleteByUserId(@Param("userId") Long userId)`
- XML文件:`backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsgBatch/XgStudentMsgBatchMapper.xml`
- 新增SQL:逻辑删除操作(只更新deleted字段,不更新update_by和update_time)
#### 📝 核心业务逻辑
```java
// 第一步:逻辑删除当前登录人的历史数据
UPDATE xg_student_msg_batch
SET deleted = 1
WHERE id = #{userId} AND deleted = 0
// 第二步:插入新的学生信息数据(使用前台传递的id)
XgStudentMsgBatch add = MapstructUtils.convert(bo, XgStudentMsgBatch.class);
if (bo.getId() != null) {
add.setId(bo.getId());
}
baseMapper.insert(add);
```
#### ✅ 测试验证
- [ ] 接口功能测试
- [ ] 权限验证测试
- [ ] 数据完整性测试
- [ ] 并发操作测试
#### 📚 文档更新
- [x] 变更记录文档
- [ ] API文档更新(待补充到学工管理API文档中)
#### 🏷️ 关联标签
- 模块:学工管理
- 功能:学生信息批次收集
- 类型:新增接口
- 影响范围:后端API
---
## 📋 待办事项
1. 补充API文档到相应的学工管理API文档中
2. 编写完整的接口测试用例
3. 前端对接测试
## 🔗 相关文件
- Controller: `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgBatchController.java`
- Service: `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/`
- Mapper: `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgBatchMapper.java`
- XML: `backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsgBatch/XgStudentMsgBatchMapper.xml`
---
# 代码调整记录 - 2025-01-07
**调整时间**: 2025-01-07
**调整人员**: wuzilong
**调整范围**: 学生信息收集批次管理 - 历史记录功能
---
## 📝 本次调整概述
在学生信息完善对话框(`stuMsgDialog.vue`)中增加历史记录Tab页功能,展示用户的历史提交记录。
---
## 🔧 具体调整内容
### 1. 新增历史记录Tab页
- **位置**: 在基础信息Tab前面增加"历史记录"Tab页
- **默认显示**: 打开对话框时默认显示历史记录Tab
- **数据来源**: 通过 `getStudentMsgHistory` 方法获取后端数据
### 2. 历史记录数据管理
- **新增变量**: `historyLoading`、`historyRecords`
- **接口调用**: `/studentMsgBatch/studentMsgBatch/history/{batchId}`
- **数据提取**: 从返回数据的 `historyMsg` 字段获取历史记录列表
### 3. 历史记录展示逻辑
- **空数据处理**: 当 `historyMsg` 为空时显示"暂无历史记录"
- **卡片展示**: 每条记录以卡片形式展示
- **布局设计**: 每行4个卡片,使用flex布局
- **连接线**: 卡片间用箭头连接,行尾显示向下箭头
### 4. 操作内容显示规则
- **infoStatus = 3**: 显示"信息填写提交"
- **infoStatus = 4 或 5**: 显示 `remark` 字段内容
- **其他状态**: 显示"未知操作"
### 5. 时间格式化
- **方法**: `formatDateTime`
- **格式**: `YYYY-MM-DD HH:mm:ss` 中文本地化格式
---
## 🎨 界面优化
### 卡片设计
- **卡片结构**: 头部(操作人+时间)+ 内容(操作内容)
- **悬停效果**: 阴影加深,轻微上移
- **边框圆角**: 8px 圆角设计
- **间距**: 16px 内边距,20px 底部外边距
### 连接线设计
- **水平箭头**: 卡片间显示 → 符号
- **换行箭头**: 每行末尾显示 ↓ 符号
- **颜色**: 主题蓝色 (#409eff)
- **字体**: 18px 粗体
### 响应式布局
- **>1200px**: 每行4列
- **900-1200px**: 每行3列
- **600-900px**: 每行2列,隐藏连接线
- **<600px**: 每行1列,隐藏连接线
---
## 🔄 数据流程
### 对话框打开流程
1. 设置默认Tab为"history"
2. 并行加载:行政区划、宿舍楼栋、历史记录、历史数据
3. 历史记录通过 `getStudentMsgHistory` 方法获取
4. 数据存储在 `historyRecords` 响应式变量中
### 关闭重置流程
1. 重置Tab为"history"
2. 清空 `historyRecords` 数组
3. 重置表单数据到默认值
---
## 📁 涉及文件
### 前端文件
- **主要文件**: `web/src/views/stuMsgSupply/stuMsgDialog.vue`
- **修改类型**: 新增功能、样式优化
### 后端接口
- **控制器**: `XgStudentMsgBatchController.java`
- **方法**: `getStudentMsgHistory(@PathVariable Long batchId)`
- **返回**: `Map` 包含 `historyMsg` 字段
---
## ✅ 测试要点
### 功能测试
- [ ] 历史记录Tab页正常显示
- [ ] 无历史记录时显示空状态
- [ ] 有历史记录时正确显示卡片
- [ ] 操作内容根据状态正确显示
- [ ] 时间格式化正确
### 界面测试
- [ ] 卡片布局每行4个
- [ ] 连接线和箭头正确显示
- [ ] 响应式布局在不同屏幕下正常
- [ ] 悬停效果正常
- [ ] 加载状态正常显示
### 数据测试
- [ ] 接口调用正常
- [ ] 数据解析正确
- [ ] 错误处理正常
- [ ] 空数据处理正常
---
## 🎯 预期效果
1. **用户体验**: 用户可以直观查看历史提交记录
2. **界面美观**: 卡片式布局清晰美观,连接线体现时间流程
3. **响应式**: 在不同设备上都有良好的显示效果
4. **性能**: 历史记录和表单数据并行加载,提升加载速度
---
## 📋 后续优化建议
1. **分页加载**: 如果历史记录过多,考虑分页显示
2. **筛选功能**: 可按时间范围或操作类型筛选记录
3. **详情查看**: 点击卡片可查看更详细的历史信息
4. **导出功能**: 支持导出历史记录为Excel
---
**变更状态**: ✅ 已完成
**测试状态**: 🔄 待测试
**上线状态**: 📋 待上线