guoyu/log/问题/第三阶段-问题.md

178 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第三阶段问题记录
## 问题记录格式
使用双链形式连接步骤文档,例如:[[第三阶段-核心功能完善和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` - 已添加文件大小处理和查看功能
- **状态**:✅ 已解决