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