Browse Source

feat: 学生查找个人课程小组&教师查找课程下全部课程小组

mjh 4 years ago
parent
commit
95289bf88b

+ 38 - 0
seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/dto/GroupDTO.java

@@ -0,0 +1,38 @@
+package cn.seecoder.seecoderportalcommon.vo.dto;
+
+import cn.seecoder.seecoderportalcommon.vo.UserVO;
+import cn.seecoder.seecoderportalcommon.vo.group.GroupVO;
+
+import java.util.List;
+
+/**
+ * @author wind
+ */
+public class GroupDTO {
+    private GroupVO groupVO;
+    private List<UserVO> members;
+
+    public GroupVO getGroupVO() {
+        return groupVO;
+    }
+
+    public void setGroupVO(GroupVO groupVO) {
+        this.groupVO = groupVO;
+    }
+
+    public List<UserVO> getMembers() {
+        return members;
+    }
+
+    public void setMembers(List<UserVO> members) {
+        this.members = members;
+    }
+
+    @Override
+    public String toString() {
+        return "GroupDTO{" +
+                "groupVO=" + groupVO +
+                ", members=" + members +
+                '}';
+    }
+}

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

@@ -108,6 +108,9 @@ public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
                         "/api/project/findById",
                         "/api/project/findByCourse",
                         "/api/group",
+                        "/api/group/one",
+                        "/api/group/all",
+                        "/api/group/member/add",
                         "/api/group/rule"
                 )
                 .permitAll() // authenticate

+ 9 - 7
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/group/GroupMemberRepository.java

@@ -7,13 +7,15 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * @author wind
  */
 @Repository
 public interface GroupMemberRepository extends BaseMapper<GroupMember> {
     /**
-     * 新建相关课程下小组成员表
+     * 新建课程小组成员表
      *
      * @param name      String 表名称
      * @param groupName String 小组表名称
@@ -26,7 +28,7 @@ public interface GroupMemberRepository extends BaseMapper<GroupMember> {
     void createGroupMemberTable(@Param("name") String name, @Param("groupName") String groupName);
 
     /**
-     * 根据userId查找小组和用户的关系
+     * 根据userId查找课程小组成员
      *
      * @param name   String 表名称
      * @param userId Long
@@ -36,7 +38,7 @@ public interface GroupMemberRepository extends BaseMapper<GroupMember> {
     GroupMember findByUserId(@Param("name") String name, @Param("userId") Long userId);
 
     /**
-     * 新建小组与用户的关系
+     * 新建课程小组成员
      *
      * @param name  String
      * @param group Group
@@ -45,12 +47,12 @@ public interface GroupMemberRepository extends BaseMapper<GroupMember> {
     void createGroupMember(@Param("name") String name, @Param("vo") GroupMember group);
 
     /**
-     * 查找小组成员数量
+     * 根据groupId查找所有课程小组成员
      *
      * @param name String 表名称
      * @param groupId Long
-     * @return int
+     * @return List
      */
-    @Select("select count(*) from ${name} where group_id=${groupId}")
-    int countGroupMembers(@Param("name") String name, @Param("groupId") Long groupId);
+    @Select("select * from ${name} where group_id=${groupId}")
+    List<GroupMember> findByGroupId(@Param("name") String name, @Param("groupId") Long groupId);
 }

+ 16 - 4
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/group/GroupRepository.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.*;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * @author wind
  */
@@ -35,11 +37,21 @@ public interface GroupRepository extends BaseMapper<Group> {
     void createGroup(@Param("name") String name, @Param("group") Group group);
 
     /**
-     * 删除小组
+     * 根据Id查找课程小组
+     *
+     * @param name String 表名
+     * @param id Long
+     * @return Group
+     */
+    @Select("select * from ${name} where id=${id}")
+    Group findGroupById(@Param("name") String name, @Param("id") Long id);
+
+    /**
+     * 查找全部课程小组
      *
      * @param name String 表名称
-     * @param id   Long
+     * @return List
      */
-    @Delete("delete from ${name} where id=${id}")
-    void deleteGroup(@Param("name") String name, @Param("id") Long id);
+    @Select("select * from ${name}")
+    List<Group> findAll(@Param("name") String name);
 }

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

@@ -1,11 +1,15 @@
 package cn.seecoder.seecoderportalserver.service;
 
 
+import cn.seecoder.seecoderportalcommon.vo.dto.GroupDTO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupMemberVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupVO;
 import cn.seecoder.seecoderportalserver.domain.group.Group;
 import cn.seecoder.seecoderportalserver.domain.group.GroupRule;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 /**
  * @author wind
@@ -50,4 +54,20 @@ public interface GroupService {
      * @return GroupMemberVO
      */
     GroupMemberVO addGroupMember(GroupMemberVO groupMemberVO);
+
+    /**
+     * 查找某个课程小组
+     *
+     * @param courseId Long
+     * @return GroupDTO
+     */
+    GroupDTO findGroup(Long courseId);
+
+    /**
+     * 查找课程下的全部小组
+     *
+     * @param courseId Long
+     * @return List
+     */
+    List<GroupDTO> findAllGroupsByCourse(Long courseId);
 }

+ 60 - 14
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/GroupServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.seecoder.seecoderportalserver.serviceImpl;
 
+import cn.seecoder.seecoderportalcommon.vo.dto.GroupDTO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupMemberVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupVO;
@@ -16,10 +17,16 @@ import cn.seecoder.seecoderportalserver.security.DomainUserDetails;
 import cn.seecoder.seecoderportalserver.security.SecurityUtils;
 import cn.seecoder.seecoderportalserver.service.CourseService;
 import cn.seecoder.seecoderportalserver.service.GroupService;
+import cn.seecoder.seecoderportalserver.service.UserService;
 import cn.seecoder.seecoderportalserver.web.rest.errors.CustomErrorException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author wind
@@ -34,8 +41,9 @@ public class GroupServiceImpl implements GroupService {
     private final GroupMemberRepository groupMemberRepository;
     private final GroupMemberMapper groupMemberMapper;
     private final CourseService courseService;
+    private final UserService userService;
 
-    public GroupServiceImpl(GroupRepository groupRepository, GroupMapper groupMapper, GroupRuleRepository groupRuleRepository, GroupRuleMapper groupRuleMapper, GroupMemberRepository groupMemberRepository, GroupMemberMapper groupMemberMapper, CourseService courseService) {
+    public GroupServiceImpl(GroupRepository groupRepository, GroupMapper groupMapper, GroupRuleRepository groupRuleRepository, GroupRuleMapper groupRuleMapper, GroupMemberRepository groupMemberRepository, GroupMemberMapper groupMemberMapper, CourseService courseService, UserService userService) {
         this.groupRepository = groupRepository;
         this.groupMapper = groupMapper;
         this.groupRuleRepository = groupRuleRepository;
@@ -43,9 +51,11 @@ public class GroupServiceImpl implements GroupService {
         this.groupMemberRepository = groupMemberRepository;
         this.groupMemberMapper = groupMemberMapper;
         this.courseService = courseService;
+        this.userService = userService;
     }
 
     @Override
+    @Transactional(rollbackFor = RuntimeException.class)
     public String createGroupTable(GroupRuleVO groupRuleVO) {
         String tableName = getGroupTableName(groupRuleVO.getCourseVO().getId());
         groupRepository.createGroupTable(tableName, groupRuleVO.getMaxNameLen().toString());
@@ -54,6 +64,7 @@ public class GroupServiceImpl implements GroupService {
     }
 
     @Override
+    @Transactional(rollbackFor = RuntimeException.class)
     public String createGroupMemberTable(Long courseId) {
         String tableName = getGroupMemberTableName(courseId);
         groupMemberRepository.createGroupMemberTable(tableName, getGroupTableName(courseId));
@@ -62,6 +73,7 @@ public class GroupServiceImpl implements GroupService {
     }
 
     @Override
+    @Transactional(rollbackFor = RuntimeException.class)
     public GroupVO createGroup(GroupVO groupVO) {
         DomainUserDetails user = SecurityUtils.getCurrentUser();
         // 验证选课
@@ -77,21 +89,16 @@ public class GroupServiceImpl implements GroupService {
         groupRepository.createGroup(getGroupTableName(groupVO.getCourseId()), group);
         log.info("Create Group: {}", group);
         // 添加小组成员(当前用户)
-        try {
-            GroupMemberVO groupMemberVO = new GroupMemberVO();
-            groupMemberVO.setUserId(user.getId());
-            groupMemberVO.setGroupId(group.getId());
-            groupMemberVO.setCourseId(groupVO.getCourseId());
-            addGroupMember(groupMemberVO);
-        } catch (RuntimeException e) {
-            log.error(e.getMessage());
-            groupRepository.deleteGroup(getGroupTableName(groupVO.getCourseId()), group.getId());
-            log.info("Delete Group: {}", group);
-        }
+        GroupMemberVO groupMemberVO = new GroupMemberVO();
+        groupMemberVO.setUserId(user.getId());
+        groupMemberVO.setGroupId(group.getId());
+        groupMemberVO.setCourseId(groupVO.getCourseId());
+        addGroupMember(groupMemberVO);
         return groupMapper.toGroupVO(group);
     }
 
     @Override
+    @Transactional(rollbackFor = RuntimeException.class)
     public GroupMemberVO addGroupMember(GroupMemberVO groupMemberVO) {
         String tableName = getGroupMemberTableName(groupMemberVO.getCourseId());
         DomainUserDetails user = SecurityUtils.getCurrentUser();
@@ -106,8 +113,8 @@ public class GroupServiceImpl implements GroupService {
         // 验证小组未满员
         GroupRule groupRule = groupRuleRepository.findByCourse_Id(groupMemberVO.getCourseId())
                 .orElseThrow(() -> CustomErrorException.groupRuleNotFound(null));
-        int currentSize = groupMemberRepository.countGroupMembers(tableName, groupMemberVO.getGroupId());
-        if(currentSize == groupRule.getMaxSize()){
+        int currentSize = groupMemberRepository.findByGroupId(tableName, groupMemberVO.getGroupId()).size();
+        if (currentSize == groupRule.getMaxSize()) {
             throw CustomErrorException.groupAlreadyMaxSize(null);
         }
         // 添加小组成员
@@ -118,6 +125,32 @@ public class GroupServiceImpl implements GroupService {
     }
 
     @Override
+    public GroupDTO findGroup(Long courseId) {
+        DomainUserDetails user = SecurityUtils.getCurrentUser();
+        if (!courseService.checkSelection(user.getId(), courseId)) {
+            throw CustomErrorException.courseSelectionNotFound();
+        }
+        GroupMember groupMember = groupMemberRepository.findByUserId(
+                getGroupMemberTableName(courseId),
+                user.getId());
+        Group group = groupRepository.findGroupById(
+                getGroupTableName(courseId),
+                groupMember.getGroupId());
+        return generateGroupDTO(courseId, group);
+    }
+
+    @Override
+    public List<GroupDTO> findAllGroupsByCourse(Long courseId) {
+        List<GroupDTO> groupDTOList = new ArrayList<>();
+        List<Group> groups = groupRepository.findAll(getGroupTableName(courseId));
+        for (Group group : groups) {
+            groupDTOList.add(generateGroupDTO(courseId, group));
+        }
+        return groupDTOList;
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
     public GroupRuleVO editGroupRule(GroupRuleVO ruleVO) {
         Long teacherId = courseService
                 .findCourseById(ruleVO.getCourseVO().getId())
@@ -140,4 +173,17 @@ public class GroupServiceImpl implements GroupService {
     private String getGroupMemberTableName(Long courseId) {
         return "group_member_" + courseId;
     }
+
+    private GroupDTO generateGroupDTO(Long courseId, Group group) {
+        List<GroupMember> members = groupMemberRepository.findByGroupId(
+                getGroupMemberTableName(courseId),
+                group.getId());
+        GroupDTO dto = new GroupDTO();
+        dto.setGroupVO(groupMapper.toGroupVO(group));
+        dto.setMembers(
+                members.stream()
+                        .map(member -> userService.findUserById(member.getUserId()))
+                        .collect(Collectors.toList()));
+        return dto;
+    }
 }

+ 2 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/ProjectServiceImpl.java

@@ -11,6 +11,7 @@ import cn.seecoder.seecoderportalserver.service.subsystem.DevcloudService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.HashMap;
 import java.util.List;
@@ -100,6 +101,7 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Override
+    @Transactional(rollbackFor = RuntimeException.class)
     public JSONObject createProject(JSONObject project) {
         JSONObject devcloudResult = devcloudService.createProject(project);
         if (project.containsKey("courseId")) {

+ 14 - 4
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/GroupController.java

@@ -1,14 +1,14 @@
 package cn.seecoder.seecoderportalserver.web.rest;
 
+import cn.seecoder.seecoderportalcommon.vo.dto.GroupDTO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupMemberVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupVO;
 import cn.seecoder.seecoderportalserver.service.GroupService;
 import cn.seecoder.seecoderportalserver.utility.OkResponse;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * @author wind
@@ -36,4 +36,14 @@ public class GroupController {
     public OkResponse<GroupMemberVO> addGroupMember(@RequestBody GroupMemberVO groupMemberVO){
         return OkResponse.of(groupService.addGroupMember(groupMemberVO));
     }
+
+    @GetMapping
+    public OkResponse<GroupDTO> findGroup(@RequestParam Long courseId){
+        return OkResponse.of(null);
+    }
+
+    @GetMapping("/all")
+    public OkResponse<List<GroupDTO>> findAllGroupsByCourse(@RequestParam Long courseId){
+        return OkResponse.of(null);
+    }
 }