mjh 4 tahun lalu
induk
melakukan
d55283f843

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

@@ -107,6 +107,7 @@ public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
                         "/api/project/findNonCourse",
                         "/api/project/findById",
                         "/api/project/findByCourse",
+                        "/api/project/updateState",
                         "/api/group",
                         "/api/group/one",
                         "/api/group/all",

+ 13 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/CourseProject.java

@@ -1,5 +1,7 @@
 package cn.seecoder.seecoderportalserver.domain;
 
+import org.hibernate.annotations.ColumnDefault;
+
 import javax.persistence.*;
 
 /**
@@ -17,6 +19,9 @@ public class CourseProject {
     @Column(unique = true, nullable = false)
     private Integer projectId;
 
+    @Column(nullable = false)
+    private Boolean isPublic;
+
     public Course getCourse() {
         return course;
     }
@@ -32,4 +37,12 @@ public class CourseProject {
     public void setProjectId(Integer projectId) {
         this.projectId = projectId;
     }
+
+    public Boolean getPublic() {
+        return isPublic;
+    }
+
+    public void setPublic(Boolean aPublic) {
+        isPublic = aPublic;
+    }
 }

+ 10 - 6
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/CourseProjectRepository.java

@@ -1,11 +1,7 @@
 package cn.seecoder.seecoderportalserver.repository;
 
-import cn.seecoder.seecoderportalserver.domain.Course;
 import cn.seecoder.seecoderportalserver.domain.CourseProject;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -19,6 +15,14 @@ public interface CourseProjectRepository extends JpaRepository<CourseProject, In
      * @param courseId 课程id
      * @return List,包含了当前课程下的所有项目id
      */
-    @Query(value = "select * from course_project where course_id = ?1", nativeQuery = true)
-    List<CourseProject> findByCourse(Long courseId);
+    List<CourseProject> findByCourse_Id(Long courseId);
+
+    /**
+     * 根据课程id与是否公开查找课程项目
+     *
+     * @param course_id Long
+     * @param isPublic Boolean
+     * @return List
+     */
+    List<CourseProject> findByCourse_IdAndIsPublic(Long course_id, Boolean isPublic);
 }

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

@@ -23,22 +23,6 @@ public interface GroupService {
      */
     GroupRuleVO editGroupRule(GroupRuleVO ruleVO);
 
-    /**
-     * 新建相关课程下小组表
-     *
-     * @param groupRuleVO 课程小组规则
-     * @return 表名称
-     */
-    String createGroupTable(GroupRuleVO groupRuleVO);
-
-    /**
-     * 新建相关课程下小组成员表
-     *
-     * @param courseId 课程Id
-     * @return 表名称
-     */
-    String createGroupMemberTable(Long courseId);
-
     /**
      * 创建小组
      *

+ 42 - 2
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/ProjectService.java

@@ -5,17 +5,42 @@ import com.alibaba.fastjson.JSONObject;
 
 import java.util.HashMap;
 
+/**
+ * @author wind
+ */
 public interface ProjectService {
+    /**
+     * 查找全部项目
+     *
+     * @return JSONArray from devcloud
+     */
     JSONArray findAllProjects();
 
+    /**
+     * 查找全部课程项目
+     *
+     * @return HashMap course: JSONArray
+     */
     HashMap<String, JSONArray> findCourseProjects();
 
+    /**
+     * 查找全部非课程项目
+     *
+     * @return JSONArray
+     */
     JSONArray findNonCourseProjects();
 
+    /**
+     * 根据Id查找项目
+     *
+     * @param id Integer projectId
+     * @return JSONObject project
+     */
     JSONObject findProjectById(Integer id);
 
     /**
-     * 根据courseId查找课程下的项目
+     * 根据课程id查找全部课程项目
+     *
      * @param courseId 课程id
      * @return JSONObject,public:课程下的公开项目,private:课程下的个人项目(因人而异)
      */
@@ -23,10 +48,25 @@ public interface ProjectService {
 
     /**
      * 新建项目
+     *
      * @param project 用户填写的项目信息,是否存在字段courseId表示是否为课程项目
      * @return JSONObject 新建完成的项目信息
      */
     JSONObject createProject(JSONObject project);
 
-    JSONArray findProjectMembers(Integer id);
+    /**
+     * 切换课程项目的公开或私有状态
+     *
+     * @param projectId Integer
+     * @return Boolean
+     */
+    Boolean switchCourseProjectState(Integer projectId);
+
+    /**
+     * fork公开项目
+     *
+     * @param projectId Integer
+     * @return JSONObject
+     */
+    JSONObject forkPublicProject(Integer projectId);
 }

+ 20 - 24
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/GroupServiceImpl.java

@@ -54,24 +54,6 @@ public class GroupServiceImpl implements GroupService {
         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());
-        log.info("Create Group Table " + tableName);
-        return tableName;
-    }
-
-    @Override
-    @Transactional(rollbackFor = RuntimeException.class)
-    public String createGroupMemberTable(Long courseId) {
-        String tableName = getGroupMemberTableName(courseId);
-        groupMemberRepository.createGroupMemberTable(tableName, getGroupTableName(courseId));
-        log.info("Create Group Member Table " + tableName);
-        return tableName;
-    }
-
     @Override
     @Transactional(rollbackFor = RuntimeException.class)
     public GroupVO createGroup(GroupVO groupVO) {
@@ -82,7 +64,7 @@ public class GroupServiceImpl implements GroupService {
         }
         // 验证尚未加入小组
         if (groupMemberRepository.findByUserId(getGroupMemberTableName(groupVO.getCourseId()), user.getId()) != null) {
-            throw CustomErrorException.groupMemberAlreadyExists("当前用户无法创建新的小组!");
+            throw CustomErrorException.groupMemberAlreadyExists();
         }
         // 创建小组
         Group group = groupMapper.toGroup(groupVO);
@@ -108,14 +90,14 @@ public class GroupServiceImpl implements GroupService {
         }
         // 验证尚未加入小组
         if (groupMemberRepository.findByUserId(tableName, user.getId()) != null) {
-            throw CustomErrorException.groupMemberAlreadyExists("当前用户无法加入其他小组!");
+            throw CustomErrorException.groupMemberAlreadyExists();
         }
         // 验证小组未满员
         GroupRule groupRule = groupRuleRepository.findByCourse_Id(groupMemberVO.getCourseId())
-                .orElseThrow(() -> CustomErrorException.groupRuleNotFound(null));
+                .orElseThrow(CustomErrorException::groupRuleNotFound);
         int currentSize = groupMemberRepository.findByGroupId(tableName, groupMemberVO.getGroupId()).size();
         if (currentSize == groupRule.getMaxSize()) {
-            throw CustomErrorException.groupAlreadyMaxSize(null);
+            throw CustomErrorException.groupAlreadyMaxSize();
         }
         // 添加小组成员
         GroupMember groupMember = groupMemberMapper.toGroupMember(groupMemberVO);
@@ -161,8 +143,8 @@ public class GroupServiceImpl implements GroupService {
         GroupRule groupRule;
         groupRule = groupRuleRepository.save(groupRuleMapper.toGroupRule(ruleVO));
         log.info("Edit Course Group Rule: {}", groupRule);
-        createGroupTable(ruleVO);
-        createGroupMemberTable(ruleVO.getCourseVO().getId());
+        log.info("Create Group Table: {}", createGroupTable(ruleVO));
+        log.info("Create Group Member Table: {}", createGroupMemberTable(ruleVO.getCourseVO().getId()));
         return groupRuleMapper.toGroupRuleVO(groupRule);
     }
 
@@ -186,4 +168,18 @@ public class GroupServiceImpl implements GroupService {
                         .collect(Collectors.toList()));
         return dto;
     }
+
+    @Transactional(rollbackFor = RuntimeException.class)
+    protected String createGroupTable(GroupRuleVO groupRuleVO) {
+        String tableName = getGroupTableName(groupRuleVO.getCourseVO().getId());
+        groupRepository.createGroupTable(tableName, groupRuleVO.getMaxNameLen().toString());
+        return tableName;
+    }
+
+    @Transactional(rollbackFor = RuntimeException.class)
+    protected String createGroupMemberTable(Long courseId) {
+        String tableName = getGroupMemberTableName(courseId);
+        groupMemberRepository.createGroupMemberTable(tableName, getGroupTableName(courseId));
+        return tableName;
+    }
 }

+ 24 - 12
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/ProjectServiceImpl.java

@@ -1,6 +1,5 @@
 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;
@@ -8,6 +7,7 @@ import cn.seecoder.seecoderportalserver.security.SecurityUtils;
 import cn.seecoder.seecoderportalserver.service.CourseService;
 import cn.seecoder.seecoderportalserver.service.ProjectService;
 import cn.seecoder.seecoderportalserver.service.subsystem.DevcloudService;
+import cn.seecoder.seecoderportalserver.web.rest.errors.CustomErrorException;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.stereotype.Service;
@@ -77,22 +77,23 @@ public class ProjectServiceImpl implements ProjectService {
 
     @Override
     public JSONObject findProjectsByCourse(Long courseId) {
-        List<CourseProject> courseProjectList = courseProjectRepository.findByCourse(courseId);
         JSONObject projects = new JSONObject();
         projects.put("public", new JSONArray());
         projects.put("private", new JSONArray());
-        for (CourseProject courseProject : courseProjectList) {
+        // public
+        List<CourseProject> publicProjects = courseProjectRepository.findByCourse_IdAndIsPublic(courseId, true);
+        for (CourseProject courseProject : publicProjects) {
+            projects.getJSONArray("public").add(findProjectById(courseProject.getProjectId()));
+        }
+        // private
+        List<CourseProject> privateProjects = courseProjectRepository.findByCourse_IdAndIsPublic(courseId, false);
+        for (CourseProject courseProject : privateProjects) {
             Integer projectId = courseProject.getProjectId();
-            Course course = courseProject.getCourse();
-            JSONArray members = findProjectMembers(projectId);
+            JSONArray members = devcloudService.getProjectMembers(projectId);
             for (Object o : members) {
                 JSONObject member = (JSONObject) o;
                 Long memberId = Long.parseLong(String.valueOf(member.get("id")));
-                // 项目成员包含课程教师,则说明项目为当前课程公开项目
-                // 项目成员包含当前用户,则说明项目为当前用户私有项目
-                if (memberId.equals(course.getTeacherId())) {
-                    projects.getJSONArray("public").add(findProjectById(projectId));
-                } else if (memberId.equals(SecurityUtils.getCurrentUser().getId())) {
+                if (memberId.equals(SecurityUtils.getCurrentUser().getId())) {
                     projects.getJSONArray("private").add(findProjectById(projectId));
                 }
             }
@@ -108,13 +109,24 @@ public class ProjectServiceImpl implements ProjectService {
             CourseProject courseProject = new CourseProject();
             courseProject.setProjectId(devcloudResult.getInteger("id"));
             courseProject.setCourse(courseMapper.courseVOToCourse(courseService.findCourseById(project.getLong("courseId"))));
+            courseProject.setPublic(false);
             courseProjectRepository.save(courseProject);
         }
         return devcloudResult;
     }
 
     @Override
-    public JSONArray findProjectMembers(Integer id) {
-        return devcloudService.getProjectMembers(id);
+    @Transactional(rollbackFor = RuntimeException.class)
+    public Boolean switchCourseProjectState(Integer projectId) {
+        CourseProject courseProject = courseProjectRepository.findById(projectId)
+                .orElseThrow(CustomErrorException::courseProjectNotFound);
+        courseProject.setPublic(!courseProject.getPublic());
+        courseProjectRepository.save(courseProject);
+        return courseProject.getPublic();
+    }
+
+    @Override
+    public JSONObject forkPublicProject(Integer projectId) {
+        return null;
     }
 }

+ 13 - 5
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/ProjectController.java

@@ -9,6 +9,9 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
 
+/**
+ * @author wind
+ */
 @RestController
 @RequestMapping("/api/project")
 public class ProjectController {
@@ -16,31 +19,31 @@ public class ProjectController {
 
     public ProjectController(ProjectService projectService) {this.projectService = projectService;}
 
-    @ApiOperation(value = "查找用户所有的Devcloud项目", httpMethod = "GET")
+    @ApiOperation(value = "查找全部项目", httpMethod = "GET")
     @GetMapping("/findAll")
     public OkResponse<JSONArray> findAllProjects() {
         return OkResponse.of(projectService.findAllProjects());
     }
 
-    @ApiOperation(value = "查找用户所有课程Devcloud项目", httpMethod = "GET")
+    @ApiOperation(value = "查找全部课程项目", httpMethod = "GET")
     @GetMapping("/findCourse")
     public OkResponse<HashMap<String, JSONArray>> findCourseProjects() {
         return OkResponse.of(projectService.findCourseProjects());
     }
 
-    @ApiOperation(value = "查找用户所有非课程Devcloud项目", httpMethod = "GET")
+    @ApiOperation(value = "查找全部非课程项目", httpMethod = "GET")
     @GetMapping("/findNonCourse")
     public OkResponse<JSONArray> findNonCourseProjects() {
         return OkResponse.of(projectService.findNonCourseProjects());
     }
 
-    @ApiOperation(value = "根据项目Id查找项目详情", httpMethod = "GET")
+    @ApiOperation(value = "根据id查找项目", httpMethod = "GET")
     @GetMapping("/findById")
     public OkResponse<JSONObject> findProjectById(@RequestParam Integer id) {
         return OkResponse.of(projectService.findProjectById(id));
     }
 
-    @ApiOperation(value = "根据课程Id查找课程下的项目", httpMethod = "GET")
+    @ApiOperation(value = "根据课程id查找全部课程项目", httpMethod = "GET")
     @GetMapping("findByCourse")
     public OkResponse<JSONObject> findProjectsByCourse(@RequestParam Long courseId) {
         return OkResponse.of(projectService.findProjectsByCourse(courseId));
@@ -52,4 +55,9 @@ public class ProjectController {
         return OkResponse.of(projectService.createProject(projectInfo));
     }
 
+    @ApiOperation(value = "修改项目状态", httpMethod = "PUT")
+    @PutMapping("/updateState")
+    public OkResponse<Boolean> updateCourseProjectState(@RequestParam Integer projectId){
+        return OkResponse.of(projectService.switchCourseProjectState(projectId));
+    }
 }

+ 10 - 6
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/errors/CustomErrorException.java

@@ -66,15 +66,19 @@ public class CustomErrorException extends RuntimeException {
         return new CustomErrorException("未授权用户!");
     }
 
-    public static CustomErrorException groupMemberAlreadyExists(String additional) {
-        return new CustomErrorException("小组成员记录已存在!" + (additional == null ? "" : additional));
+    public static CustomErrorException groupMemberAlreadyExists() {
+        return new CustomErrorException("小组成员记录已存在!");
     }
 
-    public static CustomErrorException groupRuleNotFound(String additional){
-        return new CustomErrorException("小组规则不存在!" + (additional == null ? "" : additional));
+    public static CustomErrorException groupRuleNotFound(){
+        return new CustomErrorException("小组规则不存在!");
     }
 
-    public static CustomErrorException groupAlreadyMaxSize(String additional){
-        return new CustomErrorException("当前小组已经满员!" + (additional == null ? "" : additional));
+    public static CustomErrorException groupAlreadyMaxSize(){
+        return new CustomErrorException("当前小组已经满员!");
+    }
+
+    public static CustomErrorException courseProjectNotFound(){
+        return new CustomErrorException("课程项目记录不存在!");
     }
 }