Ver Fonte

修改,简化除作业外的其他部分。

GuardOfDawn há 7 anos atrás
pai
commit
2396971294
27 ficheiros alterados com 267 adições e 395 exclusões
  1. 0 8
      src/main/java/nju/seec/SEECdemo/data/dao/CourseDAO.java
  2. 0 8
      src/main/java/nju/seec/SEECdemo/data/dao/GroupDAO.java
  3. 0 19
      src/main/java/nju/seec/SEECdemo/data/dao/UserDAO.java
  4. 0 51
      src/main/java/nju/seec/SEECdemo/data/entity/Course.java
  5. 0 54
      src/main/java/nju/seec/SEECdemo/data/entity/Group.java
  6. 0 4
      src/main/java/nju/seec/SEECdemo/data/entity/Problem.java
  7. 7 7
      src/main/java/nju/seec/SEECdemo/data/entity/assignment/Code.java
  8. 5 6
      src/main/java/nju/seec/SEECdemo/data/entity/assignment/CodeResult.java
  9. 0 79
      src/main/java/nju/seec/SEECdemo/data/user/User.java
  10. 0 9
      src/main/java/nju/seec/SEECdemo/logic/service/UserService.java
  11. 0 66
      src/main/java/nju/seec/SEECdemo/logic/service/impl/UserServiceImpl.java
  12. 15 13
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/AssignmentPaperBuilder.java
  13. 13 3
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/CodeServiceImpl.java
  14. 0 22
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/CourseServiceStub.java
  15. 0 12
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/QuestionServiceStub.java
  16. 16 0
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/mock/MockCourse.java
  17. 24 0
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/mock/MockGroup.java
  18. 18 0
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/mock/MockQuestion.java
  19. 25 0
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/mock/MockUser.java
  20. 20 0
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/stub/CourseServiceStub.java
  21. 28 0
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/stub/GroupServiceStub.java
  22. 20 0
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/stub/QuestionServiceStub.java
  23. 28 0
      src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/stub/UserServiceStub.java
  24. 12 6
      src/main/java/nju/seec/SEECdemo/logic/vo/CodeWorkVO.java
  25. 0 27
      src/main/java/nju/seec/SEECdemo/logic/vo/UserVO.java
  26. 35 0
      src/main/java/nju/seec/SEECdemo/util/ExecutorConfiguration.java
  27. 1 1
      src/main/java/nju/seec/SEECdemo/web/dto/CodeWorkDTO.java

+ 0 - 8
src/main/java/nju/seec/SEECdemo/data/dao/CourseDAO.java

@@ -1,8 +0,0 @@
-package nju.seec.SEECdemo.data.dao;
-
-import nju.seec.SEECdemo.data.entity.Course;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface CourseDAO extends JpaRepository<Course, Integer> {
-    Course findById(int courseId);
-}

+ 0 - 8
src/main/java/nju/seec/SEECdemo/data/dao/GroupDAO.java

@@ -1,8 +0,0 @@
-package nju.seec.SEECdemo.data.dao;
-
-import nju.seec.SEECdemo.data.entity.Group;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface GroupDAO extends JpaRepository<Group, Integer> {
-    Group findById(int id);
-}

+ 0 - 19
src/main/java/nju/seec/SEECdemo/data/dao/UserDAO.java

@@ -1,19 +0,0 @@
-package nju.seec.SEECdemo.data.dao;
-
-import nju.seec.SEECdemo.data.user.User;
-import nju.seec.SEECdemo.util.enums.UserRole;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface UserDAO extends JpaRepository<User, Integer> {
-	User findById(int id);
-
-	User findByUsername(String username);
-
-	User findByEmail(String email);
-
-	Page<User> findAllByUsernameLike(String search, Pageable pageable);
-
-	Integer countByRole(UserRole role);
-}

+ 0 - 51
src/main/java/nju/seec/SEECdemo/data/entity/Course.java

@@ -1,51 +0,0 @@
-package nju.seec.SEECdemo.data.entity;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import nju.seec.SEECdemo.data.entity.assignment.Code;
-import nju.seec.SEECdemo.data.user.User;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
-
-import javax.persistence.*;
-import java.util.HashSet;
-import java.util.Set;
-
-@Data
-@EqualsAndHashCode(exclude = {"codeSet", "groupSet", "creator"})
-@ToString(exclude = {"codeSet", "groupSet", "creator"})
-@Entity
-@Table(name = "ENTITY_COURSE")
-public class Course {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "id")
-    private Integer id;
-
-    @Basic
-    @Column(name = "name", nullable = false)
-    private String name;
-
-    @ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
-    @JoinColumn(name = "creator", referencedColumnName = "id")
-    private User creator;
-
-    @OneToMany(targetEntity = Code.class, mappedBy = "course", cascade = CascadeType.REMOVE)
-    @LazyCollection(LazyCollectionOption.EXTRA)
-    private Set<Code> codeSet = new HashSet<>();
-
-    @ManyToMany(targetEntity = User.class, cascade = CascadeType.DETACH)
-    @JoinTable(name = "LINK_USER_COURSE",
-            joinColumns = @JoinColumn(name = "course", referencedColumnName = "id"),
-            inverseJoinColumns = @JoinColumn(name = "user", referencedColumnName = "id")
-    )
-    @LazyCollection(LazyCollectionOption.EXTRA)
-    private Set<User> memberSet = new HashSet<>();
-
-    @OneToMany(targetEntity = Group.class, mappedBy = "course", cascade = CascadeType.REMOVE)
-    @LazyCollection(LazyCollectionOption.EXTRA)
-    private Set<Group> groupSet = new HashSet<>();
-
-}

+ 0 - 54
src/main/java/nju/seec/SEECdemo/data/entity/Group.java

@@ -1,54 +0,0 @@
-package nju.seec.SEECdemo.data.entity;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import nju.seec.SEECdemo.data.entity.assignment.CodeResult;
-import nju.seec.SEECdemo.data.user.User;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
-
-import javax.persistence.*;
-import java.util.HashSet;
-import java.util.Set;
-
-@Data
-@EqualsAndHashCode(exclude = {"course", "memberSet", "resultSet"})
-@ToString(exclude = {"course", "memberSet", "resultSet"})
-@Entity
-@Table(name = "ENTITY_GROUP")
-public class Group {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "id")
-    private Integer id;
-
-    @Basic
-    @Column(name = "name", nullable = false)
-    private String name;
-
-    @Basic
-    @Column(name = "namespace", nullable = false)
-    private Integer namespace;
-
-    @Basic
-    @Column(name = "fullPath", nullable = false)
-    private String fullPath;
-
-    @ManyToMany(targetEntity = User.class, cascade = CascadeType.DETACH)
-    @JoinTable(name = "LINK_USER_GROUP",
-            joinColumns = @JoinColumn(name = "groupId", referencedColumnName = "id"),
-            inverseJoinColumns = @JoinColumn(name = "user", referencedColumnName = "id")
-    )
-    @LazyCollection(LazyCollectionOption.EXTRA)
-    private Set<User> memberSet = new HashSet<>();
-
-    @ManyToOne(targetEntity = Course.class, fetch = FetchType.LAZY)
-    @JoinColumn(name = "course", referencedColumnName = "id")
-    private Course course;
-
-    @OneToMany(targetEntity = CodeResult.class, mappedBy = "group", cascade = CascadeType.REMOVE)
-    @LazyCollection(LazyCollectionOption.EXTRA)
-    private Set<CodeResult> resultSet = new HashSet<>();
-
-}

+ 0 - 4
src/main/java/nju/seec/SEECdemo/data/entity/Problem.java

@@ -1,4 +0,0 @@
-package nju.seec.SEECdemo.data.entity;
-
-public class Problem {
-}

+ 7 - 7
src/main/java/nju/seec/SEECdemo/data/entity/assignment/Code.java

@@ -3,7 +3,7 @@ package nju.seec.SEECdemo.data.entity.assignment;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import nju.seec.SEECdemo.data.entity.Course;
+import nju.seec.SEECdemo.logic.service.impl.assignment.mock.MockCourse;
 import nju.seec.SEECdemo.util.enums.AssignmentStatus;
 import nju.seec.SEECdemo.util.enums.AssignmentType;
 import org.hibernate.annotations.LazyCollection;
@@ -14,8 +14,8 @@ import java.util.HashSet;
 import java.util.Set;
 
 @Data
-@EqualsAndHashCode(exclude = {"course", "resultSet"})
-@ToString(exclude = {"course", "resultSet"})
+@EqualsAndHashCode(exclude = {"resultSet"})
+@ToString(exclude = {"resultSet"})
 @Entity
 @Table(name = "ENTITY_CODE")
 public class Code {
@@ -42,7 +42,7 @@ public class Code {
 
     @Basic
     @Column(name = "question", nullable = false)
-    private int questionId;
+    private Long questionId;
 
     @Basic
     @Column(name = "hash")
@@ -52,9 +52,9 @@ public class Code {
     @Column(name = "uuid", nullable = false)
     private String uuid;
 
-    @ManyToOne(targetEntity = Course.class, fetch = FetchType.LAZY)
-    @JoinColumn(name = "course", referencedColumnName = "id")
-    private Course course;
+    @Basic
+    @Column(name = "course", nullable = false)
+    private int courseId;
 
     @OneToMany(targetEntity = CodeResult.class, mappedBy = "code", cascade = CascadeType.REMOVE)
     @LazyCollection(LazyCollectionOption.EXTRA)

+ 5 - 6
src/main/java/nju/seec/SEECdemo/data/entity/assignment/CodeResult.java

@@ -4,15 +4,14 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import nju.seec.SEECdemo.data.convertor.ScoreDetailSetConverter;
-import nju.seec.SEECdemo.data.entity.Group;
 
 import javax.persistence.*;
 import java.util.HashSet;
 import java.util.Set;
 
 @Data
-@EqualsAndHashCode(exclude = {"code", "group"})
-@ToString(exclude = {"code", "group"})
+@EqualsAndHashCode(exclude = {"code"})
+@ToString(exclude = {"code"})
 @Entity
 @Table(name = "ENTITY_CODE_RESULT")
 public class CodeResult {
@@ -25,9 +24,9 @@ public class CodeResult {
     @JoinColumn(name = "code", referencedColumnName = "id")
     private Code code;
 
-    @ManyToOne(targetEntity = Group.class, fetch = FetchType.LAZY)
-    @JoinColumn(name = "groupId", referencedColumnName = "id")
-    private Group group;
+    @Basic
+    @Column(name = "groupId")
+    private Integer groupId;
 
     @Basic
     @Column(name = "buildJob")

+ 0 - 79
src/main/java/nju/seec/SEECdemo/data/user/User.java

@@ -1,79 +0,0 @@
-package nju.seec.SEECdemo.data.user;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import nju.seec.SEECdemo.data.entity.assignment.Code;
-import nju.seec.SEECdemo.data.entity.Course;
-import nju.seec.SEECdemo.data.entity.Group;
-import nju.seec.SEECdemo.util.enums.UserRole;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
-import org.springframework.data.annotation.CreatedDate;
-import org.springframework.data.jpa.domain.support.AuditingEntityListener;
-
-import javax.persistence.*;
-import java.time.LocalDateTime;
-import java.util.HashSet;
-import java.util.Set;
-
-@Data
-@EqualsAndHashCode(exclude = { "groupSet", "teaching", "courseSet"})
-@ToString(exclude = { "groupSet", "teaching", "courseSet"})
-@Entity
-@Table(name = "ENTITY_USER", indexes = {@Index(columnList = "username"), @Index(columnList = "email")})
-@EntityListeners(AuditingEntityListener.class)
-public class User {
-	@Id
-	@Column(name = "id")
-	private Integer id;
-
-	@Basic
-	@Column(name = "username", nullable = false)
-	private String username;
-
-	@Basic
-	@Column(name = "password", nullable = false)
-	private String password;
-
-	@Basic
-	@Column(name = "email", nullable = false)
-	private String email;
-
-	@Basic
-	@Column(name = "namespace", nullable = false)
-	private Integer namespace;
-
-	@Basic
-	@Column(name = "token", nullable = false)
-	private String token;
-
-	@Enumerated(EnumType.STRING)
-	@Column(name = "role", nullable = false)
-	private UserRole role;
-
-	@Basic
-	@Column(name = "created_at", nullable = false)
-	@CreatedDate
-	private LocalDateTime createdAt;
-
-    @OneToMany(targetEntity = Course.class, mappedBy = "creator", cascade = CascadeType.REMOVE)
-    @LazyCollection(LazyCollectionOption.EXTRA)
-    private Set<Course> teaching = new HashSet<>();
-
-	@ManyToMany(targetEntity = Course.class, cascade = CascadeType.DETACH)
-	@JoinTable(name = "LINK_USER_COURSE",
-			joinColumns = @JoinColumn(name = "user", referencedColumnName = "id"),
-			inverseJoinColumns = @JoinColumn(name = "course", referencedColumnName = "id")
-	)
-	@LazyCollection(LazyCollectionOption.EXTRA)
-	private Set<Course> courseSet = new HashSet<>();
-
-	@ManyToMany(targetEntity = Group.class, cascade = CascadeType.DETACH)
-	@JoinTable(name = "LINK_USER_GROUP",
-			joinColumns = @JoinColumn(name = "user", referencedColumnName = "id"),
-			inverseJoinColumns = @JoinColumn(name = "groupId", referencedColumnName = "id")
-	)
-	@LazyCollection(LazyCollectionOption.EXTRA)
-	private Set<Group> groupSet = new HashSet<>();
-}

+ 0 - 9
src/main/java/nju/seec/SEECdemo/logic/service/UserService.java

@@ -1,9 +0,0 @@
-package nju.seec.SEECdemo.logic.service;
-
-import nju.seec.SEECdemo.logic.vo.UserVO;
-import nju.seec.SEECdemo.util.enums.UserRole;
-import org.hibernate.service.spi.ServiceException;
-
-public interface UserService {
-    public UserVO register(String username, String email, String password, UserRole role) throws ServiceException;
-}

+ 0 - 66
src/main/java/nju/seec/SEECdemo/logic/service/impl/UserServiceImpl.java

@@ -1,66 +0,0 @@
-package nju.seec.SEECdemo.logic.service.impl;
-
-import nju.seec.SEECdemo.data.dao.UserDAO;
-import nju.seec.SEECdemo.data.user.User;
-import nju.seec.SEECdemo.logic.api.GitlabApi;
-import nju.seec.SEECdemo.logic.api.vo.GitlabUser;
-import nju.seec.SEECdemo.logic.service.UserService;
-import nju.seec.SEECdemo.logic.vo.UserVO;
-import nju.seec.SEECdemo.util.ToolKit;
-import nju.seec.SEECdemo.util.enums.UserRole;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.gitlab4j.api.GitLabApiException;
-import org.hibernate.service.spi.ServiceException;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
-import org.springframework.ui.ModelMap;
-
-@Service
-public class UserServiceImpl implements UserService {
-	private static final Sort PAGE_SORT = Sort.by(Sort.Direction.ASC, "id");
-
-	private final UserDAO userDAO;
-	private final GitlabApi gitlabApi;
-
-	@Autowired
-	public UserServiceImpl(UserDAO userDAO , GitlabApi gitlabApi) {
-		this.userDAO = userDAO;
-		this.gitlabApi = gitlabApi;
-	}
-
-	public UserVO register(String username, String email, String password, UserRole role) throws ServiceException {
-		User user = userDAO.findByUsername(username);
-		if(user!=null){
-			System.out.println("用户名已被使用:"+username);
-			return null;
-		}
-		user = userDAO.findByEmail(email);
-		if(user!=null){
-			System.out.println("邮箱已被使用:"+email);
-			return null;
-		}
-		String realPassword = password == null ? ToolKit.randomPassword() : password;
-		GitlabUser gitlabUser;
-		try {
-			gitlabUser = gitlabApi.createUser(username, email, realPassword);
-		} catch (GitLabApiException e) {
-			throw new ServiceException("创建GitLab用户时发生异常[" + e.getMessage() + "]");
-		}
-		user = new User();
-		BeanUtils.copyProperties(gitlabUser, user);
-		user.setUsername(username);
-		user.setEmail(email);
-		user.setPassword(DigestUtils.sha256Hex(realPassword));
-		user.setRole(role);
-		ModelMap model = new ModelMap();
-		model.addAttribute("username", username);
-		if (password == null) {
-			model.addAttribute("password", realPassword);
-		}
-		model.addAttribute("role", role);
-		return new UserVO(userDAO.save(user));
-	}
-
-}

+ 15 - 13
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/AssignmentPaperBuilder.java

@@ -4,9 +4,12 @@ import nju.seec.SEECdemo.data.dao.assignment.CodeDAO;
 import nju.seec.SEECdemo.data.dao.assignment.CodeResultDAO;
 import nju.seec.SEECdemo.data.entity.assignment.Code;
 import nju.seec.SEECdemo.data.entity.assignment.CodeResult;
-import nju.seec.SEECdemo.data.entity.Group;
+import nju.seec.SEECdemo.logic.service.impl.assignment.mock.MockGroup;
 import nju.seec.SEECdemo.logic.api.GitlabApi;
 import nju.seec.SEECdemo.logic.api.JenkinsApi;
+import nju.seec.SEECdemo.logic.service.impl.assignment.mock.MockQuestion;
+import nju.seec.SEECdemo.logic.service.impl.assignment.stub.GroupServiceStub;
+import nju.seec.SEECdemo.logic.service.impl.assignment.stub.QuestionServiceStub;
 import nju.seec.SEECdemo.logic.storage.StorageProvider;
 import nju.seec.SEECdemo.util.enums.AssignmentStatus;
 import org.apache.commons.io.FileUtils;
@@ -21,9 +24,6 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
 
 @Component
 public class AssignmentPaperBuilder {
@@ -37,10 +37,11 @@ public class AssignmentPaperBuilder {
     private final StorageProvider storageProvider;
 
     private final QuestionServiceStub questionServiceStub;
+    private final GroupServiceStub groupServiceStub;
 
     @Autowired
     public AssignmentPaperBuilder(GitlabApi gitlabApi, GitHelper helper, JenkinsApi jenkinsApi, CodeDAO codeDAO, CodeResultDAO codeResultDAO, StorageProvider storageProvider,
-                                  QuestionServiceStub questionServiceStub){
+                                  QuestionServiceStub questionServiceStub, GroupServiceStub groupServiceStub){
         this.gitlabApi = gitlabApi;
         this.helper = helper;
         this.jenkinsApi = jenkinsApi;
@@ -48,6 +49,7 @@ public class AssignmentPaperBuilder {
         this.codeResultDAO = codeResultDAO;
         this.storageProvider = storageProvider;
         this.questionServiceStub = questionServiceStub;
+        this.groupServiceStub = groupServiceStub;
     }
 
     @Transactional
@@ -59,21 +61,21 @@ public class AssignmentPaperBuilder {
             releaseQuestion(code.getQuestionId(), tempDir);
             code.setInitHash(helper.push(tempDir, code.getUuid()));
             // 为群组创建项目,并将组员加入到项目中
-            for(Group group:code.getCourse().getGroupSet()){
-                int projectId = gitlabApi.forkProject(group.getMemberSet().iterator().next().getId(), code.getId(), group.getNamespace());
+            for(MockGroup group: groupServiceStub.getGroupListByCourse(code.getCourseId())){
+                int projectId = gitlabApi.forkProject(group.getMemberSet().iterator().next(), code.getId(), group.getNamespace());
                 CodeResult codeResult = new CodeResult();
                 codeResult.setId(projectId);
-                codeResult.setGroup(group);
+                codeResult.setGroupId(group.getId());
                 codeResult.setCode(code);
                 // TODO
                 // 创建jenkins上的构建job
-                String buildJob = group.getName() + "-" + projectId + "-build";
+                String buildJob = projectId + "-build";
                 jenkinsApi.createBuildJob(buildJob);
                 codeResult.setBuildJob(buildJob);
                 // 调用kube Api创建该项目的应用空间,并记录其id
 
                 // 创建jenkins上的测试job
-                String testJob = group.getName() + "-" + projectId + "-test";
+                String testJob = projectId + "-test";
                 jenkinsApi.createTestJob(testJob);
                 codeResult.setTestJob(testJob);
                 codeResultDAO.save(codeResult);
@@ -88,10 +90,10 @@ public class AssignmentPaperBuilder {
         }
     }
 
-    private void releaseQuestion(int questionId, File codeDir) throws IOException {
+    private void releaseQuestion(Long questionId, File codeDir) throws IOException {
         FileUtils.cleanDirectory(codeDir);
-        String problemName = questionServiceStub.getQuestionUniqueName(questionId);
-        byte[] content = storageProvider.fetch(problemName + ".zip");
+        MockQuestion question = questionServiceStub.getQuestion(questionId);
+        byte[] content = storageProvider.fetch(question.getUniqueName() + ".zip");
         ByteArrayInputStream inputStream = new ByteArrayInputStream(content);
         ZipUtil.unpack(inputStream, codeDir);
     }

+ 13 - 3
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/CodeServiceImpl.java

@@ -4,13 +4,20 @@ import nju.seec.SEECdemo.data.dao.assignment.CodeDAO;
 import nju.seec.SEECdemo.data.entity.assignment.Code;
 import nju.seec.SEECdemo.logic.api.GitlabApi;
 import nju.seec.SEECdemo.logic.service.CodeService;
+import nju.seec.SEECdemo.logic.service.impl.assignment.stub.CourseServiceStub;
+import nju.seec.SEECdemo.logic.service.impl.assignment.stub.GroupServiceStub;
 import nju.seec.SEECdemo.logic.vo.CodeWorkVO;
 import nju.seec.SEECdemo.util.AsyncWrapper;
 import nju.seec.SEECdemo.util.ToolKit;
+import nju.seec.SEECdemo.util.enums.AssignmentStatus;
 import nju.seec.SEECdemo.web.dto.CodeWorkDTO;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.gitlab4j.api.GitLabApiException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.io.IOException;
+
 @Component
 public class CodeServiceImpl implements CodeService {
 
@@ -19,15 +26,17 @@ public class CodeServiceImpl implements CodeService {
     private final AssignmentPaperBuilder assignmentPaperBuilder;
     private final AsyncWrapper asyncWrapper;
     private final CourseServiceStub courseServiceStub;
+    private final GroupServiceStub groupServiceStub;
 
     @Autowired
     public CodeServiceImpl(CodeDAO assignmentDAO, GitlabApi gitlabApi, AssignmentPaperBuilder assignmentPaperBuilder,
-                           AsyncWrapper asyncWrapper, CourseServiceStub courseServiceStub){
+                           AsyncWrapper asyncWrapper, CourseServiceStub courseServiceStub, GroupServiceStub groupServiceStub){
         this.assignmentDAO = assignmentDAO;
         this.gitlabApi = gitlabApi;
         this.assignmentPaperBuilder = assignmentPaperBuilder;
         this.asyncWrapper = asyncWrapper;
         this.courseServiceStub = courseServiceStub;
+        this.groupServiceStub = groupServiceStub;
     }
 
 
@@ -38,14 +47,15 @@ public class CodeServiceImpl implements CodeService {
         assignment.setDescription(codeWorkDTO.getDescription());
         assignment.setQuestionId(codeWorkDTO.getQuestion());
         assignment.setUuid(ToolKit.randomUUID());
-        assignment.setCourse(courseServiceStub.getCourse(courseId));
+        assignment.setCourseId(courseId);
         try {
             assignment.setId(gitlabApi.createProject(assignment.getUuid()));
         } catch (Exception e) {
             System.out.println("创建作业时发生异常" + ToolKit.format(e));
         }
         asyncWrapper.asyncInvoke(() -> assignmentPaperBuilder.buildCodePaper(assignment.getId()), 2000);
-        return new CodeWorkVO(assignmentDAO.save(assignment));
+        return new CodeWorkVO(assignmentDAO.save(assignment), courseServiceStub.getCourse(courseId).getName(),
+                groupServiceStub.getGroupListByCourse(courseId));
     }
 
 

+ 0 - 22
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/CourseServiceStub.java

@@ -1,22 +0,0 @@
-package nju.seec.SEECdemo.logic.service.impl.assignment;
-
-import nju.seec.SEECdemo.data.dao.CourseDAO;
-import nju.seec.SEECdemo.data.entity.Course;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Component
-public class CourseServiceStub {
-
-    @Autowired
-    private final CourseDAO courseDAO;
-
-    public CourseServiceStub(CourseDAO courseDAO){
-        this.courseDAO = courseDAO;
-    }
-
-    public Course getCourse(int courseId){
-        return courseDAO.findById(courseId);
-    }
-
-}

+ 0 - 12
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/QuestionServiceStub.java

@@ -1,12 +0,0 @@
-package nju.seec.SEECdemo.logic.service.impl.assignment;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class QuestionServiceStub {
-
-    public String getQuestionUniqueName(long questionId){
-        return "64-three-sum";
-    }
-
-}

+ 16 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/mock/MockCourse.java

@@ -0,0 +1,16 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment.mock;
+
+import lombok.Data;
+
+@Data
+public class MockCourse {
+    private Integer id;
+    private String name;
+    private Integer creator;
+
+    public MockCourse(Integer id, String name, Integer creator) {
+        this.id = id;
+        this.name = name;
+        this.creator = creator;
+    }
+}

+ 24 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/mock/MockGroup.java

@@ -0,0 +1,24 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment.mock;
+
+import lombok.Data;
+import java.util.HashSet;
+import java.util.Set;
+
+@Data
+public class MockGroup {
+    private Integer id;
+    private String name;
+    private Integer namespace;
+    private String fullPath;
+    private Set<Integer> memberSet = new HashSet<>();
+    private Integer courseId;
+
+    public MockGroup(Integer id, String name, Integer namespace, String fullPath, Set<Integer> memberSet, Integer courseId) {
+        this.id = id;
+        this.name = name;
+        this.namespace = namespace;
+        this.fullPath = fullPath;
+        this.memberSet = memberSet;
+        this.courseId = courseId;
+    }
+}

+ 18 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/mock/MockQuestion.java

@@ -0,0 +1,18 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment.mock;
+
+import lombok.Data;
+
+@Data
+public class MockQuestion {
+    private Long id;
+    private String name;
+
+    public MockQuestion(Long id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public String getUniqueName(){
+        return this.id + "-" + this.name;
+    }
+}

+ 25 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/mock/MockUser.java

@@ -0,0 +1,25 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment.mock;
+
+import lombok.Data;
+import nju.seec.SEECdemo.util.enums.UserRole;
+
+@Data
+public class MockUser {
+    private Integer id;
+    private String username;
+    private String password;
+    private String email;
+    private UserRole role;
+    private Integer namespace;
+    private String token;
+
+    public MockUser(Integer id, String username, String password, String email, UserRole role, Integer namespace, String token) {
+        this.id = id;
+        this.username = username;
+        this.password = password;
+        this.email = email;
+        this.role = role;
+        this.namespace = namespace;
+        this.token = token;
+    }
+}

+ 20 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/stub/CourseServiceStub.java

@@ -0,0 +1,20 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment.stub;
+
+import nju.seec.SEECdemo.logic.service.impl.assignment.mock.MockCourse;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class CourseServiceStub {
+
+    private static List<MockCourse> courseList = new ArrayList(){{
+       add(new MockCourse(1, "软工二", 3));
+    }};
+
+    public MockCourse getCourse(int courseId){
+        return courseList.stream().filter(c -> c.getId()==courseId).findFirst().get();
+    }
+
+}

+ 28 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/stub/GroupServiceStub.java

@@ -0,0 +1,28 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment.stub;
+
+import nju.seec.SEECdemo.logic.service.impl.assignment.mock.MockGroup;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class GroupServiceStub {
+
+    private static List<MockGroup> groupList = new ArrayList(){{
+        add(new MockGroup(8, "softwareII", 8, "softwareII", new HashSet<Integer>(){{
+            add(5);
+            add(6);
+        }}, 1));
+    }};
+
+    public List<MockGroup> getGroupListByCourse(int courseId){
+        return groupList.stream().filter(g -> g.getCourseId()==courseId).collect(Collectors.toList());
+    }
+
+    public MockGroup getGroup(int groupId){
+        return groupList.stream().filter(g -> g.getId()==groupId).findFirst().get();
+    }
+}

+ 20 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/stub/QuestionServiceStub.java

@@ -0,0 +1,20 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment.stub;
+
+import nju.seec.SEECdemo.logic.service.impl.assignment.mock.MockQuestion;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class QuestionServiceStub {
+
+    private static List<MockQuestion> questionList = new ArrayList(){{
+        add(new MockQuestion(64L, "three-sum"));
+    }};
+
+    public MockQuestion getQuestion(Long questionId){
+        return questionList.stream().filter(q -> q.getId()==questionId).findFirst().get();
+    }
+
+}

+ 28 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/stub/UserServiceStub.java

@@ -0,0 +1,28 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment.stub;
+
+import nju.seec.SEECdemo.logic.service.impl.assignment.mock.MockUser;
+import nju.seec.SEECdemo.util.enums.UserRole;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class UserServiceStub {
+
+    private static List<MockUser> userList = new ArrayList(){{
+        add(new MockUser(3, "TeaCherZ", "tEAcHERz123456", "zhangyi1994vector@163.com", UserRole.TEACHER,
+                4, "YYdRhe1dbEdPxSwQ9ddL"));
+
+        add(new MockUser(5, "qaz321", "123456789", "abc@qq.com", UserRole.STUDENT,
+                6, "bMvEuzDEQ4R25-Mk9qLx"));
+
+        add(new MockUser(6, "wsx321", "123456789", "mf1732176@smail.nju.edu.cn", UserRole.STUDENT,
+                7, "xsscdoUxvbyt2enC2SA6"));
+    }};
+
+    public MockUser getUser(int userId){
+        return userList.stream().filter(u -> u.getId()==userId).findFirst().get();
+    }
+
+}

+ 12 - 6
src/main/java/nju/seec/SEECdemo/logic/vo/CodeWorkVO.java

@@ -3,11 +3,13 @@ package nju.seec.SEECdemo.logic.vo;
 import lombok.Data;
 import nju.seec.SEECdemo.data.entity.assignment.Code;
 import nju.seec.SEECdemo.data.entity.assignment.CodeResult;
-import nju.seec.SEECdemo.data.entity.Group;
+import nju.seec.SEECdemo.logic.service.impl.assignment.mock.MockGroup;
 import nju.seec.SEECdemo.util.enums.AssignmentStatus;
 import org.springframework.beans.BeanUtils;
 
+import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 @Data
 public class CodeWorkVO {
@@ -18,9 +20,13 @@ public class CodeWorkVO {
     private String courseName;
     private Set<NestedRecord> records;
 
-    public CodeWorkVO(Code assignment){
+    public CodeWorkVO(Code assignment, String courseName, List<MockGroup> groupList){
         BeanUtils.copyProperties(assignment, this);
-        this.courseName = assignment.getCourse().getName();
+        this.courseName = courseName;
+        this.records = assignment.getResultSet().stream().map(c->{
+            MockGroup group = groupList.stream().filter(g->g.getId()==c.getGroupId()).findFirst().get();
+            return new NestedRecord(c, group);
+        }).collect(Collectors.toSet());
     }
 
     @Data
@@ -28,9 +34,9 @@ public class CodeWorkVO {
         private Integer id;
         private NestedGroup group;
 
-        public NestedRecord(CodeResult assignmentResult){
+        public NestedRecord(CodeResult assignmentResult, MockGroup group){
             this.id = assignmentResult.getId();
-            this.group = new NestedGroup(assignmentResult.getGroup());
+            this.group = new NestedGroup(group);
         }
     }
 
@@ -39,7 +45,7 @@ public class CodeWorkVO {
         private Integer id;
         private String name;
 
-        public NestedGroup(Group group){
+        public NestedGroup(MockGroup group){
             this.id = group.getId();
             this.name = group.getName();
         }

+ 0 - 27
src/main/java/nju/seec/SEECdemo/logic/vo/UserVO.java

@@ -1,27 +0,0 @@
-package nju.seec.SEECdemo.logic.vo;
-
-import lombok.Data;
-import nju.seec.SEECdemo.data.user.User;
-import nju.seec.SEECdemo.util.enums.UserRole;
-import org.springframework.beans.BeanUtils;
-
-import java.time.LocalDateTime;
-
-@Data
-public class UserVO {
-	private Integer id;
-	private String username;
-	private String email;
-	private UserRole role;
-
-	private UserVO() {
-		this.id = 0;
-		this.username = "管理员";
-	}
-
-	public UserVO(User user) {
-		BeanUtils.copyProperties(user, this);
-	}
-
-	public static final UserVO ADMIN = new UserVO();
-}

+ 35 - 0
src/main/java/nju/seec/SEECdemo/util/ExecutorConfiguration.java

@@ -0,0 +1,35 @@
+package nju.seec.SEECdemo.util;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@EnableScheduling
+@EnableAsync
+@Configuration
+public class ExecutorConfiguration {
+	private static final int PROCESSOR_THREAD = Runtime.getRuntime().availableProcessors();
+	private static final int MAX_THREAD = 16;
+
+	@Bean
+	public ScheduledExecutorService scheduledExecutor() {
+		return Executors.newScheduledThreadPool(Math.min(2 * PROCESSOR_THREAD, MAX_THREAD));
+	}
+
+	@Bean
+	public TaskExecutor taskExecutor() {
+		ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+		taskExecutor.setCorePoolSize(Math.min(2 * PROCESSOR_THREAD, MAX_THREAD));
+		taskExecutor.setMaxPoolSize(Math.min(4 * PROCESSOR_THREAD, MAX_THREAD));
+		taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+		taskExecutor.initialize();
+		return taskExecutor;
+	}
+}

+ 1 - 1
src/main/java/nju/seec/SEECdemo/web/dto/CodeWorkDTO.java

@@ -6,5 +6,5 @@ import lombok.Data;
 public class CodeWorkDTO {
     private String name;
     private String description;
-    private int question;
+    private Long question;
 }