瀏覽代碼

feat:实现听力作业的上传和更新功能

lalala 1 年之前
父節點
當前提交
d04800777f
共有 21 個文件被更改,包括 472 次插入 和 5 次删除
  1. 7 2
      application.yaml
  2. 1 1
      src/main/java/com/njuzr/eaibackend/controller/AssignmentController.java
  3. 73 0
      src/main/java/com/njuzr/eaibackend/controller/AudioController.java
  4. 1 0
      src/main/java/com/njuzr/eaibackend/controller/FileController.java
  5. 53 0
      src/main/java/com/njuzr/eaibackend/controller/ListeningAssignmentController.java
  6. 3 0
      src/main/java/com/njuzr/eaibackend/dto/AssignmentDTO.java
  7. 3 0
      src/main/java/com/njuzr/eaibackend/dto/AssignmentQueryDTO.java
  8. 2 0
      src/main/java/com/njuzr/eaibackend/dto/AssignmentUpdateDTO.java
  9. 23 0
      src/main/java/com/njuzr/eaibackend/dto/ListeningAssignmentDTO.java
  10. 30 0
      src/main/java/com/njuzr/eaibackend/enums/AssignmentType.java
  11. 3 0
      src/main/java/com/njuzr/eaibackend/mapper/AssignmentMapper.java
  12. 14 0
      src/main/java/com/njuzr/eaibackend/mapper/ListeningAssignmentMapper.java
  13. 2 0
      src/main/java/com/njuzr/eaibackend/po/Assignment.java
  14. 0 1
      src/main/java/com/njuzr/eaibackend/po/Course.java
  15. 38 0
      src/main/java/com/njuzr/eaibackend/po/ListeningAssignment.java
  16. 21 0
      src/main/java/com/njuzr/eaibackend/service/ListeningAssignmentService.java
  17. 3 0
      src/main/java/com/njuzr/eaibackend/service/impl/AssignmentServiceImpl.java
  18. 165 0
      src/main/java/com/njuzr/eaibackend/service/impl/ListeningAssignmentServiceImpl.java
  19. 5 1
      src/main/java/com/njuzr/eaibackend/vo/AssignmentVO.java
  20. 2 0
      src/main/java/com/njuzr/eaibackend/vo/CourseVO.java
  21. 23 0
      src/main/java/com/njuzr/eaibackend/vo/ListeningAssignmentVo.java

+ 7 - 2
application.yaml

@@ -5,12 +5,16 @@ spring:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     username: root
-    password: eai123456
-    url: jdbc:mysql://139.196.252.184:3306/eai?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true
+    password: abc123
+    url: jdbc:mysql://127.0.0.1:3306/eai?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true
   data:
     mongodb:
       uri: mongodb://admin:eai123456@139.196.252.184:27017/eai?authSource=admin
       authentication-database: admin
+    redis:
+      host: 139.196.252.184
+      port: 6378
+      password: eai123456
   mail:
     host: smtp.163.com
     port: 25
@@ -68,3 +72,4 @@ proxy:
   port: 8123
 
 
+

+ 1 - 1
src/main/java/com/njuzr/eaibackend/controller/AssignmentController.java

@@ -95,7 +95,7 @@ public class AssignmentController {
     }
 
     @PreAuthorize("hasRole('TEACHER')")
-    @PutMapping
+    @PostMapping("/update")
     public MyResponse updateAssignment(
             @AuthenticationPrincipal MyUserDetails user,
             @RequestParam Long assignmentId,

+ 73 - 0
src/main/java/com/njuzr/eaibackend/controller/AudioController.java

@@ -0,0 +1,73 @@
+package com.njuzr.eaibackend.controller;
+
+import com.njuzr.eaibackend.utils.OssUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * @author Liululin
+ * @date 2025/1/21 - 18:54
+ */
+@RestController
+@Slf4j
+@RequestMapping("/api/audio")
+public class AudioController {
+    private final OssUtil ossUtil;
+
+    @Autowired
+    public AudioController(OssUtil ossUtil) {
+        this.ossUtil = ossUtil;
+    }
+
+    /**
+     * 上传音频文件
+     * @param file MultipartFile 音频文件
+     * @return 上传后的文件 URL
+     * @throws IOException 上传失败时抛出
+     */
+    @PostMapping
+    public MyResponse uploadAudio(@RequestParam("file") MultipartFile file) throws IOException {
+        // 校验文件格式
+        String originalFilename = file.getOriginalFilename();
+        if (originalFilename == null ||
+                (!originalFilename.endsWith(".mp3") && !originalFilename.endsWith(".wav"))) {
+            return MyResponse.error(500,"文件格式不支持,仅支持 mp3 和 wav 格式");
+        }
+
+        // 定义存储路径
+        String filePath = "audio/" + originalFilename;
+
+        // 上传文件到 OSS
+        String url = ossUtil.uploadFile(file.getInputStream(), filePath);
+        log.info("url:" + url);
+        // 返回文件 URL
+        return MyResponse.success(url);
+    }
+
+    /**
+     * 获取音频文件列表
+     * @return 文件列表
+     */
+    @GetMapping
+    public MyResponse getAudioFiles() {
+        // 获取 OSS 中 audio 目录下的文件列表
+        return MyResponse.success(ossUtil.listFiles());
+    }
+
+    /**
+     * 删除指定音频文件
+     * @param filePath 文件路径
+     * @return 删除结果
+     */
+    @DeleteMapping
+    public MyResponse deleteAudio(@RequestParam String filePath) {
+        // 删除文件
+        ossUtil.deleteFile(filePath);
+        return MyResponse.success("音频文件删除成功");
+    }
+}
+

+ 1 - 0
src/main/java/com/njuzr/eaibackend/controller/FileController.java

@@ -30,6 +30,7 @@ public class FileController {
     public MyResponse upload(@RequestParam("file") MultipartFile file) throws IOException {
         String filePath = "uploads/" + file.getOriginalFilename();
         String url = ossUtil.uploadFile(file.getInputStream(), filePath);
+        log.info("url:" + url);
         return MyResponse.success(url);
     }
 

+ 53 - 0
src/main/java/com/njuzr/eaibackend/controller/ListeningAssignmentController.java

@@ -0,0 +1,53 @@
+package com.njuzr.eaibackend.controller;
+import com.njuzr.eaibackend.dto.AssignmentUpdateDTO;
+import com.njuzr.eaibackend.dto.ListeningAssignmentDTO;
+import com.njuzr.eaibackend.po.MyUserDetails;
+import com.njuzr.eaibackend.service.impl.ListeningAssignmentServiceImpl;
+import com.njuzr.eaibackend.vo.ListeningAssignmentVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author Liululin
+ * @date 2025/1/21 - 15:19
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/assignment/listening")
+public class ListeningAssignmentController {
+
+    @Autowired
+    ListeningAssignmentServiceImpl listeningAssignmentService;
+
+    @PreAuthorize("hasRole('TEACHER')")
+    @PostMapping
+    public MyResponse createAssignment(
+            @AuthenticationPrincipal MyUserDetails user,
+            @RequestParam Long courseId,
+            @Validated @RequestBody ListeningAssignmentDTO listeningAssignmentDTO
+    ) {
+        listeningAssignmentService.createListeningAssignment(user, courseId, listeningAssignmentDTO);
+        return MyResponse.success("创建听力任务成功!");
+    }
+
+    @GetMapping("/byAssignment/{assignmentId}")
+    public MyResponse getAssignmentById(
+            @PathVariable Long assignmentId
+    ) {
+        return MyResponse.success(listeningAssignmentService.findAssignmentById(assignmentId));
+    }
+
+    @PreAuthorize("hasRole('TEACHER')")
+    @PostMapping("/update")
+    public MyResponse updateAssignment(
+            @AuthenticationPrincipal MyUserDetails user,
+            @RequestParam Long assignmentId,
+            @RequestBody ListeningAssignmentVo listeningAssignmentVo
+    ) {
+        return MyResponse.success(listeningAssignmentService.updateAssignment(user, assignmentId, listeningAssignmentVo));
+    }
+}

+ 3 - 0
src/main/java/com/njuzr/eaibackend/dto/AssignmentDTO.java

@@ -32,4 +32,7 @@ public class AssignmentDTO {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     @NotNull(message = "结束时间不能缺失")
     private Date endTime;
+
+    @NotNull(message = "作业类型不能缺失")
+    private String type;
 }

+ 3 - 0
src/main/java/com/njuzr/eaibackend/dto/AssignmentQueryDTO.java

@@ -1,6 +1,7 @@
 package com.njuzr.eaibackend.dto;
 
 import com.njuzr.eaibackend.enums.AssignmentStatus;
+import com.njuzr.eaibackend.enums.AssignmentType;
 import lombok.Data;
 
 /**
@@ -20,4 +21,6 @@ public class AssignmentQueryDTO {
     private String assignmentName;
 
     private AssignmentStatus status;
+
+    private AssignmentType type;
 }

+ 2 - 0
src/main/java/com/njuzr/eaibackend/dto/AssignmentUpdateDTO.java

@@ -28,4 +28,6 @@ public class AssignmentUpdateDTO {
 
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
+
+    private String type;
 }

+ 23 - 0
src/main/java/com/njuzr/eaibackend/dto/ListeningAssignmentDTO.java

@@ -0,0 +1,23 @@
+package com.njuzr.eaibackend.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * @author Liululin
+ * @date 2025/1/20 - 20:24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ListeningAssignmentDTO extends AssignmentDTO{
+    private List<String> audios;
+    private List<String> questions;
+    private Integer playCount;
+    private Boolean isCorrectRequired;
+    private Integer questionCount;
+    private String answers;
+}

+ 30 - 0
src/main/java/com/njuzr/eaibackend/enums/AssignmentType.java

@@ -0,0 +1,30 @@
+package com.njuzr.eaibackend.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+
+/**
+ * @author Liululin
+ * @date 2025/1/21 - 15:00
+ */
+public enum AssignmentType {
+    WRITING(0, "WRITING"),
+    LISTENING(1, "LISTENING"),
+    SPEAKING(2, "SPEAKING");
+
+    @EnumValue
+    private final int code;
+    private final String status;
+
+    AssignmentType(int code, String status) {
+        this.code = code;
+        this.status = status;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+}

+ 3 - 0
src/main/java/com/njuzr/eaibackend/mapper/AssignmentMapper.java

@@ -3,6 +3,7 @@ package com.njuzr.eaibackend.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.njuzr.eaibackend.po.Assignment;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Options;
 
 /**
  * @author: Leonezhurui
@@ -12,4 +13,6 @@ import org.apache.ibatis.annotations.Mapper;
 
 @Mapper
 public interface AssignmentMapper extends BaseMapper<Assignment> {
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(Assignment assignment);
 }

+ 14 - 0
src/main/java/com/njuzr/eaibackend/mapper/ListeningAssignmentMapper.java

@@ -0,0 +1,14 @@
+package com.njuzr.eaibackend.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.njuzr.eaibackend.po.ListeningAssignment;
+import org.apache.ibatis.annotations.Mapper;
+
+
+/**
+ * @author Liululin
+ * @date 2025/1/21 - 15:23
+ */
+@Mapper
+public interface ListeningAssignmentMapper extends BaseMapper<ListeningAssignment> {
+}

+ 2 - 0
src/main/java/com/njuzr/eaibackend/po/Assignment.java

@@ -37,4 +37,6 @@ public class Assignment {
     private Date endTime;
 
     private Date createTime;
+
+    private String type; //记录作业类型
 }

+ 0 - 1
src/main/java/com/njuzr/eaibackend/po/Course.java

@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 import java.util.Date;
-import java.util.List;
 
 /**
  * @author: Leonezhurui

+ 38 - 0
src/main/java/com/njuzr/eaibackend/po/ListeningAssignment.java

@@ -0,0 +1,38 @@
+package com.njuzr.eaibackend.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.data.mongodb.core.aggregation.ArrayOperators;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Liululin
+ * @date 2025/1/20 - 20:09
+ */
+
+@Data
+@TableName("listening_assignment")
+public class ListeningAssignment{
+    @TableId(type = IdType.AUTO)
+    private Long listeningAssignmentId;
+
+    private Long assignmentId; // assignment_id的外键
+
+    private String audios;
+
+    private String questions;
+
+    private Integer playCount;
+
+    private Boolean isCorrectRequired;
+
+    private Integer questionCount;
+
+    private String answers;
+}

+ 21 - 0
src/main/java/com/njuzr/eaibackend/service/ListeningAssignmentService.java

@@ -0,0 +1,21 @@
+package com.njuzr.eaibackend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.njuzr.eaibackend.dto.AssignmentUpdateDTO;
+import com.njuzr.eaibackend.dto.ListeningAssignmentDTO;
+import com.njuzr.eaibackend.po.ListeningAssignment;
+import com.njuzr.eaibackend.po.MyUserDetails;
+import com.njuzr.eaibackend.vo.AssignmentVO;
+import com.njuzr.eaibackend.vo.ListeningAssignmentVo;
+
+/**
+ * @author Liululin
+ * @date 2025/1/21 - 15:20
+ */
+public interface ListeningAssignmentService extends IService<ListeningAssignment> {
+    void createListeningAssignment(MyUserDetails user, Long courseId, ListeningAssignmentDTO listeningAssignmentDTO);
+
+     ListeningAssignmentVo findAssignmentById(Long assignmentId);
+
+    ListeningAssignmentVo updateAssignment(MyUserDetails user, Long assignmentId, ListeningAssignmentVo listeningAssignmentVo);
+}

+ 3 - 0
src/main/java/com/njuzr/eaibackend/service/impl/AssignmentServiceImpl.java

@@ -119,6 +119,9 @@ public class AssignmentServiceImpl implements AssignmentService {
         if (assignmentQueryDTO.getAssignmentName() != null) { // 模糊匹配作业名字
             wrapper.like("assignment_name", assignmentQueryDTO.getAssignmentName());
         }
+        if(assignmentQueryDTO.getType() != null){
+            wrapper.eq("type",assignmentQueryDTO.getType().getStatus());
+        }
         if (assignmentQueryDTO.getStatus() != null) {
             AssignmentStatus status = assignmentQueryDTO.getStatus();
             if (status == AssignmentStatus.NOT_STARTED) {

+ 165 - 0
src/main/java/com/njuzr/eaibackend/service/impl/ListeningAssignmentServiceImpl.java

@@ -0,0 +1,165 @@
+package com.njuzr.eaibackend.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.njuzr.eaibackend.dto.AssignmentDTO;
+import com.njuzr.eaibackend.dto.AssignmentUpdateDTO;
+import com.njuzr.eaibackend.dto.ListeningAssignmentDTO;
+import com.njuzr.eaibackend.enums.AssignmentStatus;
+import com.njuzr.eaibackend.enums.Role;
+import com.njuzr.eaibackend.exception.MyException;
+import com.njuzr.eaibackend.mapper.AssignmentMapper;
+import com.njuzr.eaibackend.mapper.CourseMapper;
+import com.njuzr.eaibackend.mapper.ListeningAssignmentMapper;
+import com.njuzr.eaibackend.mapper.UserMapper;
+import com.njuzr.eaibackend.po.Assignment;
+import com.njuzr.eaibackend.po.Course;
+import com.njuzr.eaibackend.po.ListeningAssignment;
+import com.njuzr.eaibackend.po.MyUserDetails;
+import com.njuzr.eaibackend.service.ListeningAssignmentService;
+import com.njuzr.eaibackend.utils.ConvertUtil;
+import com.njuzr.eaibackend.vo.AssignmentVO;
+import com.njuzr.eaibackend.vo.ListeningAssignmentVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author Liululin
+ * @date 2025/1/21 - 15:21
+ */
+@Service
+@Slf4j
+public class ListeningAssignmentServiceImpl extends ServiceImpl<ListeningAssignmentMapper, ListeningAssignment> implements ListeningAssignmentService  {
+
+    @Autowired
+    CourseMapper courseMapper;
+    @Autowired
+    AssignmentMapper assignmentMapper;
+    @Autowired
+    UserMapper userMapper;
+    @Override
+    public void createListeningAssignment(MyUserDetails user, Long courseId, ListeningAssignmentDTO listeningAssignmentDTO) {
+        Course course = courseMapper.selectById(courseId);
+        if (course == null)
+            throw MyException.create(HttpStatus.BAD_REQUEST, "课程不存在");
+
+        if (user.getRole() != Role.ADMIN && !course.getTeacherIds().contains(String.valueOf(user.getId())))
+            throw MyException.create(HttpStatus.BAD_REQUEST, "无权限创建");
+        Assignment assignment = new Assignment();
+        BeanUtils.copyProperties(listeningAssignmentDTO, assignment);
+        assignment.setCourseId(courseId);
+        assignment.setTeacherId(user.getId());
+        try {
+            assignmentMapper.insert(assignment);
+            Long assignmentId = assignment.getAssignmentId();
+            log.info("assignmentId:" + assignmentId);
+            ListeningAssignment listeningAssignment = new ListeningAssignment();
+            listeningAssignment.setAssignmentId(assignmentId);
+            BeanUtils.copyProperties(listeningAssignmentDTO, listeningAssignment);
+            if(listeningAssignmentDTO.getAudios() != null){
+                listeningAssignment.setAudios(ConvertUtil.listToString(listeningAssignmentDTO.getAudios()));
+            }
+            if(listeningAssignmentDTO.getQuestions() != null){
+                listeningAssignment.setQuestions(ConvertUtil.listToString(listeningAssignmentDTO.getQuestions()));
+            }
+            baseMapper.insert(listeningAssignment);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "创建作业失败");
+        }
+    }
+
+    @Override
+    public ListeningAssignmentVo findAssignmentById(Long assignmentId) {
+        QueryWrapper<Assignment> wrapper = new QueryWrapper<>();
+        wrapper.eq("assignment_id", assignmentId);
+        Assignment assignment = assignmentMapper.selectOne(wrapper);
+        if (assignment == null)
+            throw MyException.create(HttpStatus.BAD_REQUEST, "作业不存在");
+        QueryWrapper<ListeningAssignment> listeningAssignmentQueryWrapper = new QueryWrapper<>();
+        listeningAssignmentQueryWrapper.eq("assignment_id", assignmentId);
+        ListeningAssignment listeningAssignment = baseMapper.selectOne(listeningAssignmentQueryWrapper);
+        return convertToVO(assignment, listeningAssignment);
+    }
+
+    @Override
+    public ListeningAssignmentVo updateAssignment(MyUserDetails user, Long assignmentId, ListeningAssignmentVo listeningAssignmentVo) {
+        Assignment assignment = assignmentMapper.selectById(assignmentId);
+        if (!Objects.equals(assignment.getTeacherId(), user.getId()))
+            throw MyException.create(HttpStatus.BAD_REQUEST, "无权限更新");
+        Assignment newAssignment = new Assignment();
+        BeanUtils.copyProperties(listeningAssignmentVo, newAssignment);
+        if(listeningAssignmentVo.getAttachments() != null){
+            newAssignment.setAttachments(ConvertUtil.listToString(listeningAssignmentVo.getAttachments()));
+        }
+        newAssignment.setAssignmentId(assignmentId);
+        ListeningAssignment listeningAssignment = new ListeningAssignment();
+        BeanUtils.copyProperties(listeningAssignmentVo, listeningAssignment);
+        listeningAssignment.setAssignmentId(assignmentId);
+        if(listeningAssignmentVo.getQuestions() != null){
+            listeningAssignment.setQuestions(ConvertUtil.listToString(listeningAssignmentVo.getQuestions()));
+        }
+        if (listeningAssignmentVo.getAudios() != null) {
+            listeningAssignment.setAudios(ConvertUtil.listToString(listeningAssignmentVo.getAudios()));
+        }
+        try {
+            int code1 =  assignmentMapper.updateById(newAssignment);
+            UpdateWrapper<ListeningAssignment> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.eq("assignment_id",assignmentId);
+            int code2 = baseMapper.update(listeningAssignment, updateWrapper);
+            if ((code1 | code2) == 0)
+                throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "服务器更新失败");
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "服务器更新失败");
+        }
+        return listeningAssignmentVo;
+    }
+
+    private ListeningAssignmentVo convertToVO(Assignment assignment,ListeningAssignment listeningAssignment) {
+        ListeningAssignmentVo res = new ListeningAssignmentVo();
+        BeanUtils.copyProperties(assignment, res);
+        BeanUtils.copyProperties(listeningAssignment, res);
+        if (assignment.getAttachments() != null) {
+            res.setAttachments(ConvertUtil.stringToList(assignment.getAttachments(), String::valueOf));
+        }
+        if(listeningAssignment.getAudios() != null){
+            res.setAudios(ConvertUtil.stringToList(listeningAssignment.getAudios(), String::valueOf));
+        }
+        if(listeningAssignment.getQuestions() != null){
+            res.setQuestions(ConvertUtil.stringToList(listeningAssignment.getQuestions(), String::valueOf));
+        }
+        res.setStatus(calculateStatus(res.getStartTime(), res.getEndTime()));
+        // 组装老师姓名
+        res.setTeacherName(userMapper.selectNameById(assignment.getTeacherId()));
+        return res;
+    }
+
+    private Assignment convertToPO(AssignmentUpdateDTO assignmentDTO) {
+        Assignment assignment = new Assignment();
+        BeanUtils.copyProperties(assignmentDTO, assignment);
+        if (assignmentDTO.getAttachments() != null)
+            assignment.setAttachments(ConvertUtil.listToString(assignmentDTO.getAttachments()));
+        return assignment;
+    }
+
+    private AssignmentStatus calculateStatus(Date startTime, Date endTime) {
+        Date now = new Date();
+        if (now.before(startTime)) {
+            return AssignmentStatus.NOT_STARTED;
+        } else if (now.after(endTime)) {
+            return AssignmentStatus.FINISHED;
+        } else {
+            return AssignmentStatus.PROCEEDING;
+        }
+    }
+
+
+
+}

+ 5 - 1
src/main/java/com/njuzr/eaibackend/vo/AssignmentVO.java

@@ -1,5 +1,6 @@
 package com.njuzr.eaibackend.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.njuzr.eaibackend.enums.AssignmentStatus;
 import lombok.Data;
 
@@ -29,12 +30,15 @@ public class AssignmentVO {
     private String teacherName; // 发布作业的老师的姓名
 
     private Long courseId; // 哪个课程下的assignment
-
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     private Date startTime;
 
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
 
     private Date createTime;
 
     private AssignmentStatus status; // 根据startTime和endTime计算出来的status,共有三种:未开始、进行中、已结束
+
+    private String type;
 }

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

@@ -31,6 +31,8 @@ public class CourseVO { // 不需要把选课码放出来
 
     private String targetGrade;
 
+    private String enrollCode;
+
     private Date startTime;
 
     private Date endTime;

+ 23 - 0
src/main/java/com/njuzr/eaibackend/vo/ListeningAssignmentVo.java

@@ -0,0 +1,23 @@
+package com.njuzr.eaibackend.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * @author Liululin
+ * @date 2025/2/4 - 15:33
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ListeningAssignmentVo extends AssignmentVO{
+    private List<String> audios;
+    private List<String> questions;
+    private Integer playCount;
+    private Boolean isCorrectRequired;
+    private Integer questionCount;
+    private String answers;
+}