guoyu/Test/其他/问题/第三阶段-问题.md

8.9 KiB
Raw Blame History

第三阶段问题记录

问题记录格式

使用双链形式连接步骤文档,例如:第三阶段-核心功能完善和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. 根本原因:前端表单使用的字段名与后端实体类不匹配
      • 前端使用:namecode
      • 后端期望:subjectNamesubjectCode
      • 导致提交时 subjectNamenull,后端接收不到数据
    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 字段
      <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 为空,抛出异常,避免执行到数据库插入
      @Override
      public int insertSubject(StudySubject subject)
      {
          // 验证必填字段
          if (StringUtils.isEmpty(subject.getSubjectName()))
          {
              throw new RuntimeException("学科名称不能为空");
          }
          return subjectMapper.insertSubject(subject);
      }
      
    3. 添加实体类验证注解 (StudySubject.java)
      • getSubjectName() 方法上添加 @NotBlank 注解
      • 添加 @Size 注解限制长度
      @NotBlank(message = "学科名称不能为空")
      @Size(min = 0, max = 50, message = "学科名称不能超过50个字符")
      public String getSubjectName()
      {
          return subjectName;
      }
      
    4. 修复前端字段名 (ruoyi-ui/src/views/study/subject/index.vue)
      • 将表单字段名从 namecode 改为 subjectNamesubjectCode
      • 修改查询参数、表单数据、表格列、验证规则等所有相关字段名
      // 修改前
      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 目录下的文件已更新
    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 中,根据课件类型动态设置 fileTypefileSize
      • 视频类型:允许 ['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv', 'webm']大小限制500MB
      • 图文类型允许文档和图片格式大小限制50MB
      • FileUpload 组件中添加 accept 属性,根据 fileType 动态生成MIME类型
    2. 修复科目显示
      • courseware/index.vuecourse/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 组件上传成功后,只保存了 fileNameurl,没有保存文件大小
      • 课件添加时,没有从上传结果中获取文件大小并保存到数据库
    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 - 已添加文件大小处理和查看功能
  • 状态 已解决