Ver Fonte

fix: 将教师姓名显示逻辑移至后端;使用并行流优化VO转换速度。

201250038 há 1 ano atrás
pai
commit
7378637c1e

+ 7 - 5
src/main/java/com/njuzr/eaibackend/mapper/UserMapper.java

@@ -1,13 +1,8 @@
 package com.njuzr.eaibackend.mapper;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.njuzr.eaibackend.po.User;
-import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Select;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
@@ -46,4 +41,11 @@ public interface UserMapper extends BaseMapper<User> {
      */
     @Transactional
     int batchInsert(List<User> users);
+
+    /**
+     * 通过用户ID查询用户名字
+     * @param id
+     * @return 姓名
+     */
+    String selectNameById(Long id);
 }

+ 23 - 11
src/main/java/com/njuzr/eaibackend/service/impl/AssignmentServiceImpl.java

@@ -40,8 +40,8 @@ import java.util.Objects;
 public class AssignmentServiceImpl implements AssignmentService {
 
     private final AssignmentMapper assignmentMapper;
+
     private final CourseMapper courseMapper;
-    private final EngagementMapper engagementMapper;
 
     private final StudentAssignmentMapper studentAssignmentMapper;
 
@@ -51,10 +51,15 @@ public class AssignmentServiceImpl implements AssignmentService {
 
     private final FileUtil fileUtil = new FileUtil();
 
-    public AssignmentServiceImpl(AssignmentMapper assignmentMapper, CourseMapper courseMapper, EngagementMapper engagementMapper, StudentAssignmentMapper studentAssignmentMapper, UserMapper userMapper, OssUtil ossUtil) {
+    public AssignmentServiceImpl(AssignmentMapper assignmentMapper,
+                                 CourseMapper courseMapper,
+                                 StudentAssignmentMapper studentAssignmentMapper,
+                                 UserMapper userMapper,
+                                 OssUtil ossUtil,
+                                 CourseServiceImpl courseServiceImpl,
+                                 CourseStudentMapper courseStudentMapper) {
         this.assignmentMapper = assignmentMapper;
         this.courseMapper = courseMapper;
-        this.engagementMapper = engagementMapper;
         this.studentAssignmentMapper = studentAssignmentMapper;
         this.userMapper = userMapper;
         this.ossUtil = ossUtil;
@@ -184,7 +189,7 @@ public class AssignmentServiceImpl implements AssignmentService {
         // 2通过FileUtil创建一个空的docx文件
         InputStream inputStream = fileUtil.createEmptyDocx();
 
-        String filePath = assignmentId+"_"+studentId+".docx";
+        String filePath = assignmentId + "_" + studentId + ".docx";
         // 3通过OssUtil工具类上传空文件,注意给其命名为`assignmentId/studentId.docx`,并得到文件链接
         String fileName = ossUtil.uploadEnduringFile(inputStream, filePath);
         engagement.setFileUrl(fileName);
@@ -203,6 +208,7 @@ public class AssignmentServiceImpl implements AssignmentService {
 
     /**
      * 根据两个外键,搜索学生参与作业的情况(需要在mysql中设置索引)
+     *
      * @param studentId
      * @param assignmentId
      * @return
@@ -217,9 +223,7 @@ public class AssignmentServiceImpl implements AssignmentService {
 
     @Override
     public IPage<EngagementVO> findEngagementPage(Page<Engagement> page, Long assignmentId) {
-
         IPage<Engagement> engagements = studentAssignmentMapper.findEngagementByAssignmentId(page, assignmentId);
-
         return PageMapperUtil.convert(engagements, this::convertToVO);
     }
 
@@ -245,15 +249,16 @@ public class AssignmentServiceImpl implements AssignmentService {
         EngagementDetailVO detailVO = ModelMapperUtil.map(engagement, EngagementDetailVO.class);
         detailVO.setUserVO(ModelMapperUtil.map(student, UserVO.class));
         detailVO.setAssignmentVO(convertToVO(assignment));
-        detailVO.setFileKey(assignmentId+"_"+studentId+"_"+engagement.getVersion());
+        detailVO.setFileKey(assignmentId + "_" + studentId + "_" + engagement.getVersion());
 
-        log.info("请求到详细信息:"+detailVO.toString());
+        log.info("请求到详细信息:" + detailVO.toString());
 
         return detailVO;
     }
 
     /**
      * 作业提交,更新文件版本和作业状态
+     *
      * @param studentId
      * @param assignmentId
      */
@@ -263,7 +268,7 @@ public class AssignmentServiceImpl implements AssignmentService {
         if (engagement == null)
             throw MyException.create(HttpStatus.BAD_REQUEST, "参与作业情况不存在");
         int originalVersion = engagement.getVersion();
-        engagement.setVersion(originalVersion+1);
+        engagement.setVersion(originalVersion + 1);
         engagement.setStatus(AssignmentCompletionStatus.SUBMITTED);
         try {
             int code = studentAssignmentMapper.updateById(engagement);
@@ -278,6 +283,7 @@ public class AssignmentServiceImpl implements AssignmentService {
 
     /**
      * 作业暂存,更新文件版本,不修改作业状态
+     *
      * @param studentId
      * @param assignmentId
      */
@@ -287,7 +293,7 @@ public class AssignmentServiceImpl implements AssignmentService {
         if (engagement == null)
             throw MyException.create(HttpStatus.BAD_REQUEST, "参与作业情况不存在");
         int originalVersion = engagement.getVersion();
-        engagement.setVersion(originalVersion+1);
+        engagement.setVersion(originalVersion + 1);
         try {
             int code = studentAssignmentMapper.updateById(engagement);
             if (code == 0)
@@ -348,12 +354,18 @@ public class AssignmentServiceImpl implements AssignmentService {
         if (assignment.getAttachments() != null)
             res.setAttachments(ConvertUtil.stringToList(assignment.getAttachments(), String::valueOf));
         res.setStatus(calculateStatus(res.getStartTime(), res.getEndTime()));
+        // 组装老师姓名
+        res.setTeacherName(userMapper.selectNameById(assignment.getTeacherId()));
         return res;
     }
 
     private EngagementVO convertToVO(Engagement engagement) {
         EngagementVO res = ModelMapperUtil.map(engagement, EngagementVO.class);
-        res.setFileKey(res.getAssignmentId()+"_"+res.getStudentId()+"_"+res.getVersion());
+        // 组装文件key
+        res.setFileKey(res.getAssignmentId() + "_" + res.getStudentId() + "_" + res.getVersion());
+        // 组装学生姓名
+        String studentName = userMapper.selectNameById(engagement.getStudentId());
+        res.setStudentName(studentName);
         return res;
     }
 

+ 10 - 2
src/main/java/com/njuzr/eaibackend/service/impl/CourseServiceImpl.java

@@ -30,7 +30,9 @@ import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author: Leonezhurui
@@ -280,9 +282,15 @@ public class CourseServiceImpl implements CourseService {
         CourseVO res = new CourseVO();
         BeanUtils.copyProperties(course, res);
         res.setTeacherIds(ConvertUtil.stringToList(course.getTeacherIds(), Long::valueOf));
-        if (course.getCourseImages() != null)
+        // 组装教师名字
+        List<String> teacherNames = new ArrayList<>();
+        for (Long teacherId : res.getTeacherIds()) {
+            teacherNames.add(userMapper.selectNameById(teacherId));
+        }
+        res.setTeacherNames(teacherNames);
+        if (course.getCourseImages() != null) {
             res.setCourseImages(ConvertUtil.stringToList(course.getCourseImages(), String::valueOf));
-
+        }
         return res;
     }
 

+ 1 - 1
src/main/java/com/njuzr/eaibackend/utils/PageMapperUtil.java

@@ -23,7 +23,7 @@ public class PageMapperUtil {
      */
     public static <T, V> Page<V> convert(IPage<T> sourcePage, Function<T, V> converter) {
         Page<V> targetPage = new Page<>();
-        targetPage.setRecords(sourcePage.getRecords().stream().map(converter).collect(Collectors.toList()));
+        targetPage.setRecords(sourcePage.getRecords().parallelStream().map(converter).collect(Collectors.toList()));
         targetPage.setTotal(sourcePage.getTotal());
         targetPage.setCurrent(sourcePage.getCurrent());
         targetPage.setSize(sourcePage.getSize());

+ 2 - 0
src/main/java/com/njuzr/eaibackend/vo/AssignmentVO.java

@@ -26,6 +26,8 @@ public class AssignmentVO {
 
     private Long teacherId; // 发布作业的老师的Id
 
+    private String teacherName; // 发布作业的老师的姓名
+
     private Long courseId; // 哪个课程下的assignment
 
     private Date startTime;

+ 2 - 0
src/main/java/com/njuzr/eaibackend/vo/CourseVO.java

@@ -25,6 +25,8 @@ public class CourseVO { // 不需要把选课码放出来
 
     private List<Long> teacherIds; // 序列化好的字符串
 
+    private List<String> teacherNames;
+
     private List<String> courseImages; // 序列化好的字符串
 
     private String targetGrade;

+ 1 - 0
src/main/java/com/njuzr/eaibackend/vo/EngagementVO.java

@@ -14,6 +14,7 @@ public class EngagementVO {
     private Long id;
     private Long assignmentId;
     private Long studentId;
+    private String studentName;
     private Double score;
     private String remark;
     private String fileUrl; // 学生作业的oss链接

+ 6 - 0
src/main/resources/mapper/UserMapper.xml

@@ -37,4 +37,10 @@
         SET password=#{newPassword}
         WHERE id=#{id}
     </update>
+
+    <select id="selectNameById" resultType="String">
+        select name
+        from users
+        where id = #{id}
+    </select>
 </mapper>