Quellcode durchsuchen

feat: 编辑课程小组规则,并完成简单的分表

mjh vor 4 Jahren
Ursprung
Commit
c9969a3b07
18 geänderte Dateien mit 291 neuen und 88 gelöschten Zeilen
  1. 12 1
      seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/group/GroupRuleVO.java
  2. 6 0
      seecoder-portal-server/pom.xml
  3. 3 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/SeecoderPortalServerApplication.java
  4. 1 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/Course.java
  5. 4 1
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/CourseProject.java
  6. 0 60
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/GroupRule.java
  7. 26 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/group/Group.java
  8. 85 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/group/GroupRule.java
  9. 3 4
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/mapper/group/GroupRuleMapper.java
  10. 3 11
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/CourseProjectRepository.java
  11. 27 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/group/GroupRepository.java
  12. 4 1
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/group/GroupRuleRepository.java
  13. 1 1
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/group/GroupRuleService.java
  14. 25 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/group/GroupService.java
  15. 10 3
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/ProjectServiceImpl.java
  16. 28 6
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/group/GroupRuleServiceImpl.java
  17. 41 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/group/GroupServiceImpl.java
  18. 12 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/group/GroupController.java

+ 12 - 1
seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/group/GroupRuleVO.java

@@ -7,6 +7,8 @@ import java.time.OffsetDateTime;
  * @author wind
  */
 public class GroupRuleVO {
+    private Long id;
+
     private Long courseId;
 
     private Integer maxSize;
@@ -15,6 +17,14 @@ public class GroupRuleVO {
 
     private OffsetDateTime createdTime;
 
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
     public Long getCourseId() {
         return courseId;
     }
@@ -50,7 +60,8 @@ public class GroupRuleVO {
     @Override
     public String toString() {
         return "GroupRuleVO{" +
-                "courseId=" + courseId +
+                "id=" + id +
+                ", courseId=" + courseId +
                 ", maxSize=" + maxSize +
                 ", maxNameLen=" + maxNameLen +
                 ", createdTime=" + createdTime +

+ 6 - 0
seecoder-portal-server/pom.xml

@@ -135,6 +135,12 @@
             <artifactId>PaasMonitor-client</artifactId>
             <version>${version}</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.4.2</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 3 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/SeecoderPortalServerApplication.java

@@ -1,7 +1,9 @@
 package cn.seecoder.seecoderportalserver;
 
 import cn.seecoder.seecoderportalserver.config.property.AliProperties;
+import cn.seecoder.seecoderportalserver.repository.group.GroupRepository;
 import cn.seecoder.seecoderportalserver.utility.OssUtil;
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -11,6 +13,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
  */
 @SpringBootApplication
 @EnableConfigurationProperties({AliProperties.class, OssUtil.class})
+@MapperScan("cn.seecoder.seecoderportalserver.repository")
 public class SeecoderPortalServerApplication {
     public static void main(String[] args) {
         SpringApplication.run(SeecoderPortalServerApplication.class, args);

+ 1 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/Course.java

@@ -7,6 +7,7 @@ import org.hibernate.annotations.CreationTimestamp;
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
 import java.time.OffsetDateTime;
+import java.util.Collection;
 
 @Entity
 @Table(name = "course")

+ 4 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/CourseProject.java

@@ -2,10 +2,13 @@ package cn.seecoder.seecoderportalserver.domain;
 
 import javax.persistence.*;
 
+/**
+ * @author wind
+ */
 @Entity
 @Table(name = "course_project")
 public class CourseProject {
-    @OneToOne
+    @ManyToOne
     @JoinColumn(name = "course_id", nullable = false,
             foreignKey = @ForeignKey(name = "course_project_course_id_fk"))
     private Course course;

+ 0 - 60
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/GroupRule.java

@@ -1,60 +0,0 @@
-package cn.seecoder.seecoderportalserver.domain;
-
-import org.hibernate.annotations.CreationTimestamp;
-
-import javax.persistence.*;
-import java.time.OffsetDateTime;
-
-/**
- * @author mjh
- */
-
-@Entity
-@Table(name = "group_rule")
-public class GroupRule {
-
-    @Id
-    private Long courseId;
-
-    @Column
-    private Integer maxSize;
-
-    @Column
-    private Integer maxNameLen;
-
-    @Column
-    @CreationTimestamp
-    private OffsetDateTime createdTime;
-
-    public Long getCourseId() {
-        return courseId;
-    }
-
-    public void setCourseId(Long courseId) {
-        this.courseId = courseId;
-    }
-
-    public Integer getMaxSize() {
-        return maxSize;
-    }
-
-    public void setMaxSize(Integer maxSize) {
-        this.maxSize = maxSize;
-    }
-
-    public Integer getMaxNameLen() {
-        return maxNameLen;
-    }
-
-    public void setMaxNameLen(Integer maxNameLen) {
-        this.maxNameLen = maxNameLen;
-    }
-
-    public OffsetDateTime getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setCreatedTime(OffsetDateTime createdTime) {
-        this.createdTime = createdTime;
-    }
-}

+ 26 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/group/Group.java

@@ -0,0 +1,26 @@
+package cn.seecoder.seecoderportalserver.domain.group;
+
+/**
+ * @author wind
+ */
+
+public class Group {
+    private Long id;
+    private String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 85 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/group/GroupRule.java

@@ -0,0 +1,85 @@
+package cn.seecoder.seecoderportalserver.domain.group;
+
+import cn.seecoder.seecoderportalserver.domain.Course;
+import org.hibernate.annotations.CreationTimestamp;
+
+import javax.persistence.*;
+import java.time.OffsetDateTime;
+
+/**
+ * @author mjh
+ */
+
+@Entity
+@Table(name = "group_rule")
+public class GroupRule {
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    @OneToOne
+    @JoinColumn(name = "course_id", nullable = false, unique = true,
+            foreignKey = @ForeignKey(name = "group_rule_course_id_fk"))
+    private Course course;
+
+    @Column(nullable = false)
+    private Integer maxSize;
+
+    @Column(nullable = false)
+    private Integer maxNameLen;
+
+    @Column(nullable = false)
+    @CreationTimestamp
+    private OffsetDateTime createdTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Course getCourse() {
+        return course;
+    }
+
+    public void setCourse(Course course) {
+        this.course = course;
+    }
+
+    public Integer getMaxSize() {
+        return maxSize;
+    }
+
+    public void setMaxSize(Integer maxSize) {
+        this.maxSize = maxSize;
+    }
+
+    public Integer getMaxNameLen() {
+        return maxNameLen;
+    }
+
+    public void setMaxNameLen(Integer maxNameLen) {
+        this.maxNameLen = maxNameLen;
+    }
+
+    public OffsetDateTime getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(OffsetDateTime createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    @Override
+    public String toString() {
+        return "GroupRule{" +
+                "id=" + id +
+                ", course=" + course +
+                ", maxSize=" + maxSize +
+                ", maxNameLen=" + maxNameLen +
+                ", createdTime=" + createdTime +
+                '}';
+    }
+}

+ 3 - 4
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/mapper/group/GroupRuleMapper.java

@@ -1,9 +1,8 @@
 package cn.seecoder.seecoderportalserver.mapper.group;
 
 import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
-import cn.seecoder.seecoderportalserver.domain.GroupRule;
+import cn.seecoder.seecoderportalserver.domain.group.GroupRule;
 import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
 
 /**
  * @author wind
@@ -15,12 +14,12 @@ public interface GroupRuleMapper {
      * @param groupRule po
      * @return vo
      */
-    GroupRuleVO groupRuleToGroupRuleVO(GroupRule groupRule);
+    GroupRuleVO toGroupRuleVO(GroupRule groupRule);
 
     /**
      * vo2po
      * @param groupRuleVO vo
      * @return po
      */
-    GroupRule groupRuleVOToGroupRule(GroupRuleVO groupRuleVO);
+    GroupRule toGroupRule(GroupRuleVO groupRuleVO);
 }

+ 3 - 11
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/CourseProjectRepository.java

@@ -9,6 +9,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
+/**
+ * @author wind
+ */
 public interface CourseProjectRepository extends JpaRepository<CourseProject, Integer> {
     /**
      * 根据课程id查找课程项目
@@ -18,15 +21,4 @@ public interface CourseProjectRepository extends JpaRepository<CourseProject, In
      */
     @Query(value = "select * from course_project where course_id = ?1", nativeQuery = true)
     List<CourseProject> findByCourse(Long courseId);
-
-
-    /**
-     * @param courseId
-     * @param projectId
-     * @return
-     */
-    @Transactional
-    @Modifying
-    @Query(value = "insert into course_project (project_id, course_id) values (?2, ?1)", nativeQuery = true)
-    void createCourseProject(Long courseId, Integer projectId);
 }

+ 27 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/group/GroupRepository.java

@@ -0,0 +1,27 @@
+package cn.seecoder.seecoderportalserver.repository.group;
+
+import cn.seecoder.seecoderportalserver.domain.group.Group;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author wind
+ */
+
+@Repository
+public interface GroupRepository extends BaseMapper<Group> {
+    /**
+     * 新建表
+     *
+     * @param name 表名
+     * @param len   名称长度
+     */
+    @Insert("create table ${name} (\n" +
+            "id integer not null,\n" +
+            "name varchar(${len}) not null,\n" +
+            "primary key (id)\n" +
+            ")")
+    void createTableByCourse(@Param("name") String name, @Param("len") String len);
+}

+ 4 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/group/GroupRuleRepository.java

@@ -1,11 +1,14 @@
 package cn.seecoder.seecoderportalserver.repository.group;
 
 import cn.seecoder.seecoderportalserver.domain.Course;
-import cn.seecoder.seecoderportalserver.domain.GroupRule;
+import cn.seecoder.seecoderportalserver.domain.group.GroupRule;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.Optional;
+
 /**
  * @author wind
  */
 public interface GroupRuleRepository extends JpaRepository<GroupRule, Long> {
+
 }

+ 1 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/group/GroupRuleService.java

@@ -1,7 +1,7 @@
 package cn.seecoder.seecoderportalserver.service.group;
 
 import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
-import cn.seecoder.seecoderportalserver.domain.GroupRule;
+import cn.seecoder.seecoderportalserver.domain.group.GroupRule;
 
 /**
  * @author wind

+ 25 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/group/GroupService.java

@@ -0,0 +1,25 @@
+package cn.seecoder.seecoderportalserver.service.group;
+
+
+import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
+
+/**
+ * @author wind
+ */
+public interface GroupService {
+    /**
+     * 根据课程新建表
+     *
+     * @param groupRuleVO 课程建组规则
+     * @return 表名称
+     */
+    String createTableByCourse(GroupRuleVO groupRuleVO);
+
+    /**
+     * 相关课程小组表是否存在
+     *
+     * @param courseId 课程id
+     * @return T/F
+     */
+    Boolean isTableExisted(Long courseId);
+}

+ 10 - 3
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/ProjectServiceImpl.java

@@ -2,6 +2,7 @@ package cn.seecoder.seecoderportalserver.serviceImpl;
 
 import cn.seecoder.seecoderportalserver.domain.Course;
 import cn.seecoder.seecoderportalserver.domain.CourseProject;
+import cn.seecoder.seecoderportalserver.mapper.CourseMapper;
 import cn.seecoder.seecoderportalserver.repository.CourseProjectRepository;
 import cn.seecoder.seecoderportalserver.security.SecurityUtils;
 import cn.seecoder.seecoderportalserver.service.CourseService;
@@ -21,11 +22,13 @@ import java.util.List;
 public class ProjectServiceImpl implements ProjectService {
     private final DevcloudService devcloudService;
     private final CourseService courseService;
+    private final CourseMapper courseMapper;
     private final CourseProjectRepository courseProjectRepository;
 
-    public ProjectServiceImpl(DevcloudService devcloudService, CourseService courseService, CourseProjectRepository courseProjectRepository) {
+    public ProjectServiceImpl(DevcloudService devcloudService, CourseService courseService, CourseMapper courseMapper, CourseProjectRepository courseProjectRepository) {
         this.devcloudService = devcloudService;
         this.courseService = courseService;
+        this.courseMapper = courseMapper;
         this.courseProjectRepository = courseProjectRepository;
     }
 
@@ -99,12 +102,16 @@ public class ProjectServiceImpl implements ProjectService {
     @Override
     public JSONObject createProject(JSONObject project) {
         JSONObject devcloudResult = devcloudService.createProject(project);
-        if(project.containsKey("courseId")){
-            courseProjectRepository.createCourseProject(project.getLong("courseId"),project.getInteger("id"));
+        if (project.containsKey("courseId")) {
+            CourseProject courseProject = new CourseProject();
+            courseProject.setProjectId(devcloudResult.getInteger("id"));
+            courseProject.setCourse(courseMapper.courseVOToCourse(courseService.findCourseById(project.getLong("courseId"))));
+            courseProjectRepository.save(courseProject);
         }
         return devcloudResult;
     }
 
+    @Override
     public JSONArray findProjectMembers(Integer id) {
         return devcloudService.getProjectMembers(id);
     }

+ 28 - 6
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/group/GroupRuleServiceImpl.java

@@ -1,11 +1,15 @@
 package cn.seecoder.seecoderportalserver.serviceImpl.group;
 
 import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
-import cn.seecoder.seecoderportalserver.domain.GroupRule;
+import cn.seecoder.seecoderportalserver.domain.group.GroupRule;
+import cn.seecoder.seecoderportalserver.mapper.CourseMapper;
 import cn.seecoder.seecoderportalserver.mapper.group.GroupRuleMapper;
 import cn.seecoder.seecoderportalserver.repository.group.GroupRuleRepository;
+import cn.seecoder.seecoderportalserver.security.SecurityUtils;
 import cn.seecoder.seecoderportalserver.service.CourseService;
 import cn.seecoder.seecoderportalserver.service.group.GroupRuleService;
+import cn.seecoder.seecoderportalserver.service.group.GroupService;
+import cn.seecoder.seecoderportalserver.web.rest.errors.CustomErrorException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -15,29 +19,47 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class GroupRuleServiceImpl implements GroupRuleService {
-    private final static Logger log = LoggerFactory.getLogger(GroupRuleService.class);
+    private final static Logger log = LoggerFactory.getLogger(GroupRuleServiceImpl.class);
     private final GroupRuleRepository groupRuleRepository;
     private final GroupRuleMapper groupRuleMapper;
     private final CourseService courseService;
+    private final CourseMapper courseMapper;
+    private final GroupService groupService;
 
-    public GroupRuleServiceImpl(GroupRuleRepository groupRuleRepository, GroupRuleMapper groupRuleMapper, CourseService courseService) {
+    public GroupRuleServiceImpl(GroupRuleRepository groupRuleRepository, GroupRuleMapper groupRuleMapper, CourseService courseService, CourseMapper courseMapper, GroupService groupService) {
         this.groupRuleRepository = groupRuleRepository;
         this.groupRuleMapper = groupRuleMapper;
         this.courseService = courseService;
+        this.courseMapper = courseMapper;
+        this.groupService = groupService;
     }
 
     @Override
     public GroupRuleVO editGroupRule(GroupRuleVO ruleVO) {
-        return null;
+        Long teacherId = courseService.findCourseById(ruleVO.getCourseId()).getTeacher().getId();
+        if (!SecurityUtils.getCurrentUser().getId().equals(teacherId)) {
+            throw CustomErrorException.unauthorizedUser();
+        }
+        GroupRule groupRule;
+        groupRule = groupRuleRepository.save(toGroupRule(ruleVO));
+        log.info("Edit Course Group Rule: {}", groupRule);
+        if (!groupService.isTableExisted(ruleVO.getCourseId())) {
+            groupService.createTableByCourse(ruleVO);
+        }
+        return toGroupRuleVO(groupRule);
     }
 
     @Override
     public GroupRuleVO toGroupRuleVO(GroupRule groupRule) {
-        return groupRuleMapper.groupRuleToGroupRuleVO(groupRule);
+        GroupRuleVO groupRuleVO = groupRuleMapper.toGroupRuleVO(groupRule);
+        groupRuleVO.setCourseId(groupRuleVO.getCourseId());
+        return groupRuleVO;
     }
 
     @Override
     public GroupRule toGroupRule(GroupRuleVO groupRuleVO) {
-        return groupRuleMapper.groupRuleVOToGroupRule(groupRuleVO);
+        GroupRule groupRule = groupRuleMapper.toGroupRule(groupRuleVO);
+        groupRule.setCourse(courseMapper.courseVOToCourse(courseService.findCourseById(groupRuleVO.getCourseId())));
+        return groupRule;
     }
 }

+ 41 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/group/GroupServiceImpl.java

@@ -0,0 +1,41 @@
+package cn.seecoder.seecoderportalserver.serviceImpl.group;
+
+import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
+import cn.seecoder.seecoderportalserver.repository.group.GroupRepository;
+import cn.seecoder.seecoderportalserver.service.group.GroupService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author wind
+ */
+@Service
+public class GroupServiceImpl implements GroupService {
+    private final static Logger log = LoggerFactory.getLogger(GroupServiceImpl.class);
+    private final GroupRepository groupRepository;
+
+    public GroupServiceImpl(GroupRepository groupRepository) {this.groupRepository = groupRepository;}
+
+    @Override
+    public String createTableByCourse(GroupRuleVO groupRuleVO) {
+        String tableName = getTableName(groupRuleVO.getCourseId());
+        groupRepository.createTableByCourse(tableName, groupRuleVO.getMaxNameLen().toString());
+        log.info("create table " + tableName);
+        return tableName;
+    }
+
+    @Override
+    public Boolean isTableExisted(Long courseId) {
+        try {
+            groupRepository.selectCount(null);
+            return true;
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+    private String getTableName(Long courseId){
+        return "course_groups_" + courseId;
+    }
+}

+ 12 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/group/GroupController.java

@@ -0,0 +1,12 @@
+package cn.seecoder.seecoderportalserver.web.rest.group;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author wind
+ */
+@RestController
+@RequestMapping("/api/group")
+public class GroupController {
+}