8.9 KiB
8.9 KiB
第三阶段问题记录
问题记录格式
使用双链形式连接步骤文档,例如:第三阶段-核心功能完善和UniApp开发
问题列表
问题1
- 关联步骤:第三阶段-核心功能完善和UniApp开发
- 问题描述:插入学科分类时,数据库报错
subject_name字段没有默认值 - 发生时间:2025-11-11
- 错误信息:
Error updating database. Cause: java.sql.SQLException: Field 'subject_name' doesn't have a default value The error may exist in file [StudySubjectMapper.xml] The error may involve com.ddnai.system.mapper.study.StudySubjectMapper.insertSubject-Inline The error occurred while setting parameters SQL: insert into subject ( sort_order, status, create_by, create_time ) values ( ?, ?, ?, sysdate() ) Cause: java.sql.SQLException: Field 'subject_name' doesn't have a default value - 问题原因:
- 根本原因:前端表单使用的字段名与后端实体类不匹配
- 前端使用:
name、code - 后端期望:
subjectName、subjectCode - 导致提交时
subjectName为null,后端接收不到数据
- 前端使用:
- 次要原因:
StudySubjectMapper.xml中的insertSubject方法使用了条件判断<if test="subjectName != null and subjectName != ''">- 当
subjectName为空或 null 时,SQL 语句中不会包含subject_name字段 - 但数据库表
subject中的subject_name字段是必填的(NOT NULL 且没有默认值) - 因此当
subjectName为空时,插入操作会失败
- 当
- 根本原因:前端表单使用的字段名与后端实体类不匹配
- 解决方案:
- 修改 Mapper XML (
StudySubjectMapper.xml):- 将
subject_name字段从条件判断中移除,设为必填字段 - 确保插入 SQL 始终包含
subject_name字段
<insert id="insertSubject" parameterType="StudySubject" useGeneratedKeys="true" keyProperty="id"> insert into subject <trim prefix="(" suffix=")" suffixOverrides=","> subject_name, <!-- 改为必填,不使用 if 判断 --> <if test="subjectCode != null and subjectCode != ''">subject_code,</if> ... </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> #{subjectName}, <!-- 改为必填,不使用 if 判断 --> <if test="subjectCode != null and subjectCode != ''">#{subjectCode},</if> ... </trim> </insert> - 将
- 添加 Service 层验证 (
StudySubjectServiceImpl.java):- 在
insertSubject方法中添加验证逻辑 - 如果
subjectName为空,抛出异常,避免执行到数据库插入
@Override public int insertSubject(StudySubject subject) { // 验证必填字段 if (StringUtils.isEmpty(subject.getSubjectName())) { throw new RuntimeException("学科名称不能为空"); } return subjectMapper.insertSubject(subject); } - 在
- 添加实体类验证注解 (
StudySubject.java):- 在
getSubjectName()方法上添加@NotBlank注解 - 添加
@Size注解限制长度
@NotBlank(message = "学科名称不能为空") @Size(min = 0, max = 50, message = "学科名称不能超过50个字符") public String getSubjectName() { return subjectName; } - 在
- 修复前端字段名 (
ruoyi-ui/src/views/study/subject/index.vue):- 将表单字段名从
name、code改为subjectName、subjectCode - 修改查询参数、表单数据、表格列、验证规则等所有相关字段名
// 修改前 queryParams: { name: null } form: { name: null, code: null } // 修改后 queryParams: { subjectName: null } form: { subjectName: null, subjectCode: null } - 将表单字段名从
- 修改 Mapper XML (
- 验证层级:
- Controller 层:使用
@Validated注解,自动验证实体类上的注解 - Service 层:手动验证,确保数据不为空
- Mapper 层:SQL 中
subject_name字段必填
- Controller 层:使用
- 相关文件:
RuoYi-Vue-redis/ry-news-system/src/main/resources/mapper/study/StudySubjectMapper.xml- 已修改,subject_name字段必填RuoYi-Vue-redis/ry-news-system/src/main/java/com/ddnai/system/service/impl/study/StudySubjectServiceImpl.java- 已添加验证逻辑RuoYi-Vue-redis/ry-news-system/src/main/java/com/ddnai/system/domain/study/StudySubject.java- 已添加验证注解RuoYi-Vue-redis/ruoyi-ui/src/views/study/subject/index.vue- 已修复字段名匹配问题
- 状态:✅ 已解决
问题补充说明
重要提示:如果修改后仍然报错,可能是以下原因:
- 后端未重新编译:需要重新编译后端项目,确保
target/classes目录下的文件已更新mvn clean compile # 或 mvn clean package - 前端未刷新:清除浏览器缓存或强制刷新页面(Ctrl+F5)
- 服务未重启:修改后端代码后需要重启 Spring Boot 服务
问题总结
通过三层验证机制(Controller、Service、Mapper),确保 subject_name 字段在插入数据库前已经过验证,避免数据库层面的错误。这样可以在更早的阶段发现问题,提供更好的错误提示。
问题2
- 关联步骤:第三阶段-核心功能完善和UniApp开发
- 问题描述:
- 视频上传时,选择MP4格式不支持
- 选择科目时显示的是ID而不是科目名称
- 发生时间:2025-11-11
- 问题原因:
- 视频格式不支持:
FileUpload组件默认的fileType只包含文档格式,不包含视频格式- 课件上传页面没有根据课件类型动态设置允许的文件类型
el-upload组件缺少accept属性,浏览器文件选择器无法过滤视频文件
- 科目显示ID:
- 前端代码使用了
subject.name,但后端返回的字段是subjectName - 导致下拉框显示为
undefined或ID值
- 前端代码使用了
- 视频格式不支持:
- 解决方案:
- 修复视频上传:
- 在
courseware/index.vue中,根据课件类型动态设置fileType和fileSize - 视频类型:允许
['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv', 'webm'],大小限制500MB - 图文类型:允许文档和图片格式,大小限制50MB
- 在
FileUpload组件中添加accept属性,根据fileType动态生成MIME类型
- 在
- 修复科目显示:
- 在
courseware/index.vue和course/index.vue中,将:label="subject.name"改为:label="subject.subjectName"
- 在
- 修复视频上传:
- 相关文件:
RuoYi-Vue-redis/ruoyi-ui/src/views/study/courseware/index.vue- 已修复文件类型和科目显示RuoYi-Vue-redis/ruoyi-ui/src/views/study/course/index.vue- 已修复科目显示RuoYi-Vue-redis/ruoyi-ui/src/components/FileUpload/index.vue- 已添加accept属性支持
- 状态:✅ 已解决
问题3
- 关联步骤:第三阶段-核心功能完善和UniApp开发
- 问题描述:
- 课件上传后文件大小显示为0
- 课件上传后无法查看(视频和文档都需要查看功能)
- 发生时间:2025-11-11
- 问题原因:
- 文件大小显示为0:
- 文件上传接口
/common/upload返回的数据中没有包含文件大小(fileSize) FileUpload组件上传成功后,只保存了fileName和url,没有保存文件大小- 课件添加时,没有从上传结果中获取文件大小并保存到数据库
- 文件上传接口
- 无法查看课件:
- 课件列表页面只有"修改"和"删除"按钮,没有"查看"按钮
- 没有实现课件预览功能(视频、PDF、图片、文档等)
- 文件大小显示为0:
- 解决方案:
- 修复文件大小保存:
- 修改
CommonController.uploadFile方法,在返回结果中添加fileSize字段 - 修改
FileUpload组件,在上传成功后保存文件大小,并通过file-info事件传递给父组件 - 修改课件添加逻辑,监听
file-info事件,从上传结果中获取文件大小并设置到form.fileSize
- 修改
- 添加课件查看功能:
- 在课件列表的操作列中添加"查看"按钮
- 创建课件查看对话框,支持:
- 视频:使用
<video>标签播放 - PDF:使用
<iframe>标签预览 - 图片:使用
el-image组件预览(支持放大) - 其他文档:显示下载按钮
- 视频:使用
- 在编辑对话框中也添加"查看文件"按钮
- 显示文件信息(文件名、大小、描述)
- 修复文件大小保存:
- 相关文件:
RuoYi-Vue-redis/ry-news-admin/src/main/java/com/ddnai/web/controller/common/CommonController.java- 已添加文件大小返回RuoYi-Vue-redis/ruoyi-ui/src/components/FileUpload/index.vue- 已添加文件大小保存和事件触发RuoYi-Vue-redis/ruoyi-ui/src/views/study/courseware/index.vue- 已添加文件大小处理和查看功能
- 状态:✅ 已解决