178 lines
8.9 KiB
Markdown
178 lines
8.9 KiB
Markdown
# 第三阶段问题记录
|
||
|
||
## 问题记录格式
|
||
使用双链形式连接步骤文档,例如:[[第三阶段-核心功能完善和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` 方法使用了条件判断 `<if test="subjectName != null and subjectName != ''">`
|
||
- 当 `subjectName` 为空或 null 时,SQL 语句中不会包含 `subject_name` 字段
|
||
- 但数据库表 `subject` 中的 `subject_name` 字段是必填的(NOT NULL 且没有默认值)
|
||
- 因此当 `subjectName` 为空时,插入操作会失败
|
||
- **解决方案**:
|
||
1. **修改 Mapper XML** (`StudySubjectMapper.xml`):
|
||
- 将 `subject_name` 字段从条件判断中移除,设为必填字段
|
||
- 确保插入 SQL 始终包含 `subject_name` 字段
|
||
```xml
|
||
<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>
|
||
```
|
||
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. **添加课件查看功能**:
|
||
- 在课件列表的操作列中添加"查看"按钮
|
||
- 创建课件查看对话框,支持:
|
||
- **视频**:使用 `<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` - 已添加文件大小处理和查看功能
|
||
- **状态**:✅ 已解决
|
||
|