Parcourir la source

Merge branch 'dev' of Yumin/EDUServer into master

王育民 il y a 5 ans
Parent
commit
6ae756eb17
25 fichiers modifiés avec 640 ajouts et 52 suppressions
  1. 46 4
      src/main/java/cn/minbb/edu/controller/rest/CourseController.java
  2. 6 1
      src/main/java/cn/minbb/edu/controller/rest/SignController.java
  3. 29 0
      src/main/java/cn/minbb/edu/controller/rest/StageController.java
  4. 60 0
      src/main/java/cn/minbb/edu/controller/rest/SubjectController.java
  5. 98 0
      src/main/java/cn/minbb/edu/controller/rest/UserController.java
  6. 11 1
      src/main/java/cn/minbb/edu/controller/web/CourseController.java
  7. 15 0
      src/main/java/cn/minbb/edu/model/Course.java
  8. 38 0
      src/main/java/cn/minbb/edu/model/Stage.java
  9. 44 0
      src/main/java/cn/minbb/edu/model/Subject.java
  10. 29 0
      src/main/java/cn/minbb/edu/model/User.java
  11. 8 0
      src/main/java/cn/minbb/edu/model/repository/CourseRepository.java
  12. 7 0
      src/main/java/cn/minbb/edu/model/repository/StageRepository.java
  13. 10 0
      src/main/java/cn/minbb/edu/model/repository/SubjectRepository.java
  14. 12 0
      src/main/java/cn/minbb/edu/service/CourseService.java
  15. 15 0
      src/main/java/cn/minbb/edu/service/StageService.java
  16. 17 0
      src/main/java/cn/minbb/edu/service/SubjectService.java
  17. 34 0
      src/main/java/cn/minbb/edu/service/impl/CourseServiceImpl.java
  18. 44 0
      src/main/java/cn/minbb/edu/service/impl/StageServiceImpl.java
  19. 49 0
      src/main/java/cn/minbb/edu/service/impl/SubjectServiceImpl.java
  20. 1 1
      src/main/java/cn/minbb/edu/service/impl/UserServiceImpl.java
  21. 1 1
      src/main/java/cn/minbb/edu/system/Const.java
  22. 6 38
      src/main/java/cn/minbb/edu/task/InitDataRunner.java
  23. 46 0
      src/main/java/cn/minbb/edu/util/CollectionUtil.java
  24. 3 3
      src/main/resources/application-pro.properties
  25. 11 3
      src/main/resources/templates/course-create.html

+ 46 - 4
src/main/java/cn/minbb/edu/controller/rest/CourseController.java

@@ -2,12 +2,17 @@ package cn.minbb.edu.controller.rest;
 
 import cn.minbb.edu.data.ResponseResult;
 import cn.minbb.edu.model.Course;
+import cn.minbb.edu.model.User;
 import cn.minbb.edu.service.CourseService;
+import cn.minbb.edu.service.SubjectService;
 import cn.minbb.edu.service.UserService;
+import cn.minbb.edu.util.CollectionUtil;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("app/course")
@@ -15,11 +20,13 @@ public class CourseController {
 
     private UserService userService;
     private CourseService courseService;
+    private SubjectService subjectService;
 
     @Autowired
-    public CourseController(UserService userService, CourseService courseService) {
+    public CourseController(UserService userService, CourseService courseService, SubjectService subjectService) {
         this.userService = userService;
         this.courseService = courseService;
+        this.subjectService = subjectService;
     }
 
     @GetMapping("")
@@ -31,17 +38,52 @@ public class CourseController {
 
     @PostMapping("hot")
     public ResponseResult<Course> courseHot() {
-        return ResponseResult.ok(true).code(1).dataset(courseService.findAll());
+        List<Course> courseList = courseService.findTop6Hot();
+        int count = courseService.countAllHot();
+        return ResponseResult.ok(true).code(1).message(String.format("%s", count)).dataset(courseList);
     }
 
     @PostMapping("excellent")
     public ResponseResult<Course> courseExcellent() {
-        List<Course> courseList = courseService.findAll();
-        return ResponseResult.ok(true).code(1).message(courseList.size() + "").dataset(courseList);
+        List<Course> courseList = courseService.findTop6Excellent();
+        int count = courseService.countAllExcellent();
+        return ResponseResult.ok(true).code(1).message(String.format("%s", count)).dataset(courseList);
     }
 
     @PostMapping("all")
     public ResponseResult<Course> courseAll() {
         return ResponseResult.ok(true).code(1).dataset(courseService.findAll());
     }
+
+    @PostMapping("user/all")
+    public ResponseResult<Course> userAll(@RequestBody String userData) {
+        User userClient = JSONObject.parseObject(userData, User.class);
+        User user = userService.findUserById(userClient.getId());
+        List<Course> courseList = courseService.findAllByIdIn(CollectionUtil.stringToIntList(user.getCourseIds()));
+        return ResponseResult.ok(true).code(1).message("查询到 " + courseList.size() + "门课程").dataset(courseList);
+    }
+
+    @PostMapping("user/add")
+    public ResponseResult<Course> userAdd(@RequestBody Map<String, Object> dataMap) {
+        User userClient = JSONObject.parseObject(JSONObject.toJSONString(dataMap.get("user")), User.class);
+        User user = userService.findUserById(userClient.getId());
+        Course course = JSONObject.parseObject(JSONObject.toJSONString(dataMap.get("course")), Course.class);
+        List<Integer> courseIdList = CollectionUtil.stringToIntList(user.getCourseIds());
+        if (!courseIdList.contains(course.getId())) courseIdList.add(course.getId());
+        user.setCourseIds(CollectionUtil.intListToString(courseIdList));
+        userService.save(user);
+        return ResponseResult.ok(true).code(1).message("加入我的课程成功").dataNone();
+    }
+
+    @PostMapping("user/remove")
+    public ResponseResult<Course> userRemove(@RequestBody Map<String, Object> dataMap) {
+        User userClient = JSONObject.parseObject(JSONObject.toJSONString(dataMap.get("user")), User.class);
+        User user = userService.findUserById(userClient.getId());
+        Course course = JSONObject.parseObject(JSONObject.toJSONString(dataMap.get("course")), Course.class);
+        List<Integer> courseIdList = CollectionUtil.stringToIntList(user.getCourseIds());
+        if (courseIdList.contains(course.getId())) courseIdList.remove(course.getId());
+        user.setCourseIds(CollectionUtil.intListToString(courseIdList));
+        userService.save(user);
+        return ResponseResult.ok(true).code(1).message("移除成功").dataNone();
+    }
 }

+ 6 - 1
src/main/java/cn/minbb/edu/controller/rest/SignController.java

@@ -3,6 +3,7 @@ package cn.minbb.edu.controller.rest;
 import cn.minbb.edu.data.ResponseResult;
 import cn.minbb.edu.model.User;
 import cn.minbb.edu.model.UserRole;
+import cn.minbb.edu.service.StageService;
 import cn.minbb.edu.service.UserRoleService;
 import cn.minbb.edu.service.UserService;
 import com.alibaba.fastjson.JSONObject;
@@ -19,11 +20,13 @@ public class SignController {
 
     private UserService userService;
     private UserRoleService userRoleService;
+    private StageService stageService;
 
     @Autowired
-    public SignController(UserService userService, UserRoleService userRoleService) {
+    public SignController(UserService userService, UserRoleService userRoleService, StageService stageService) {
         this.userService = userService;
         this.userRoleService = userRoleService;
+        this.stageService = stageService;
     }
 
     @PostMapping(value = "login")
@@ -41,6 +44,8 @@ public class SignController {
         } else {
             if (password.equals(user.getPassword())) {
                 // OK
+                Integer stageId = user.getStageId();
+                if (null != stageId) user.setVoStage(stageService.findOneById(user.getStageId()));
                 result.setCode(1);
                 result.setSuccess(true);
                 result.setMessage("登录成功");

+ 29 - 0
src/main/java/cn/minbb/edu/controller/rest/StageController.java

@@ -0,0 +1,29 @@
+package cn.minbb.edu.controller.rest;
+
+import cn.minbb.edu.data.ResponseResult;
+import cn.minbb.edu.model.Stage;
+import cn.minbb.edu.service.StageService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("app/stage")
+public class StageController {
+
+    private StageService stageService;
+
+    @Autowired
+    public StageController(StageService stageService) {
+        this.stageService = stageService;
+    }
+
+    @PostMapping("all")
+    public ResponseResult<Stage> subjectAll() {
+        List<Stage> stageList = stageService.findAll();
+        return ResponseResult.ok(true).code(1).message("").dataset(stageList);
+    }
+}

+ 60 - 0
src/main/java/cn/minbb/edu/controller/rest/SubjectController.java

@@ -0,0 +1,60 @@
+package cn.minbb.edu.controller.rest;
+
+import cn.minbb.edu.data.ResponseResult;
+import cn.minbb.edu.model.Subject;
+import cn.minbb.edu.model.User;
+import cn.minbb.edu.service.CourseService;
+import cn.minbb.edu.service.SubjectService;
+import cn.minbb.edu.service.UserService;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+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 java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("app/subject")
+public class SubjectController {
+
+    private UserService userService;
+    private CourseService courseService;
+    private SubjectService subjectService;
+
+    @Autowired
+    public SubjectController(UserService userService, CourseService courseService, SubjectService subjectService) {
+        this.userService = userService;
+        this.courseService = courseService;
+        this.subjectService = subjectService;
+    }
+
+    @PostMapping("")
+    public ResponseResult<Subject> subject(@RequestBody Map<String, Integer> idMap) {
+        Integer id = idMap.get("id");
+        if (null == id) {
+            return ResponseResult.ok(false).code(-1).message("ID不能为空").dataNone();
+        } else {
+            Subject subject = subjectService.findOneById(id);
+            subject.setVoCourseList(courseService.findAllBySubjectId(id));
+            return ResponseResult.ok(true).code(1).message("").data(subject);
+        }
+    }
+
+    @PostMapping("all")
+    public ResponseResult<Subject> subjectAll() {
+        List<Subject> subjectList = subjectService.findAll();
+        return ResponseResult.ok(true).code(1).message("").dataset(subjectList);
+    }
+
+    @PostMapping("user")
+    public ResponseResult<Subject> subjectForUser(@RequestBody String userData) {
+        User userClient = JSONObject.parseObject(userData, User.class);
+        User user = userService.findUserById(userClient.getId());
+        List<Subject> subjectList = user.getSubjectList();
+        if (null == subjectList || subjectList.isEmpty()) subjectList = subjectService.findAll();
+        return ResponseResult.ok(true).code(1).message("").dataset(subjectList);
+    }
+}

+ 98 - 0
src/main/java/cn/minbb/edu/controller/rest/UserController.java

@@ -0,0 +1,98 @@
+package cn.minbb.edu.controller.rest;
+
+import cn.minbb.edu.data.ResponseResult;
+import cn.minbb.edu.model.Subject;
+import cn.minbb.edu.model.User;
+import cn.minbb.edu.service.StageService;
+import cn.minbb.edu.service.SubjectService;
+import cn.minbb.edu.service.UserService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("app/user")
+public class UserController {
+
+    private UserService userService;
+    private SubjectService subjectService;
+    private StageService stageService;
+
+    @Autowired
+    public UserController(UserService userService, SubjectService subjectService, StageService stageService) {
+        this.userService = userService;
+        this.subjectService = subjectService;
+        this.stageService = stageService;
+    }
+
+    @PostMapping("auto/login")
+    public ResponseResult<User> userAutoLogin(@RequestBody User userClient) {
+        User user = userService.findUserByUsername(userClient.getUsername());
+        Integer stageId = user.getStageId();
+        if (null != stageId) user.setVoStage(stageService.findOneById(stageId));
+        return ResponseResult.ok(true).code(1).message("登录成功").data(user);
+    }
+
+    @PostMapping("info")
+    public ResponseResult<User> userInfo(@RequestBody String userJson) {
+        User userClient = JSONObject.parseObject(userJson, User.class);
+        if (null == userClient) {
+            return ResponseResult.ok(false).code(-1).message("用户名不存在").dataNone();
+        } else {
+            User user = userService.findUserById(userClient.getId());
+            if (null != user) {
+                String name = userClient.getName();
+                String nickname = userClient.getNickname();
+                String signature = userClient.getSignature();
+                String email = userClient.getEmail();
+                String phone = userClient.getPhone();
+                String qq = userClient.getQq();
+                String avatar = userClient.getAvatar();
+                String school = userClient.getSchool();
+                Integer stageId = userClient.getStageId();
+                if (null != name) user.setName(name);
+                if (null != nickname) user.setNickname(nickname);
+                if (null != signature) user.setSignature(signature);
+                if (null != email) user.setEmail(email);
+                if (null != phone) user.setPhone(phone);
+                if (null != qq) user.setQq(qq);
+                if (null != avatar) user.setAvatar(avatar);
+                if (null != school) user.setSchool(school);
+                if (null != stageId) user.setStageId(stageId);
+                User vo = userService.save(user);
+                stageId = vo.getStageId();
+                if (null != stageId) vo.setVoStage(stageService.findOneById(stageId));
+                return ResponseResult.ok(true).code(1).message("修改成功").data(vo);
+            } else {
+                return ResponseResult.ok(false).code(-1).message("用户不存在").dataNone();
+            }
+        }
+    }
+
+    @PostMapping("stage")
+    public ResponseResult<User> userStage(@RequestBody Map<String, Object> paramsMap) {
+        User user = JSONObject.parseObject(JSONObject.toJSONString(paramsMap.get("user")), User.class);
+        JSONArray stageArray = JSONArray.parseArray(JSONObject.toJSONString(paramsMap.get("stage")));
+        if (null == user || null == stageArray) {
+            return ResponseResult.ok(false).code(-1).message("参数不足").dataNone();
+        }
+        List<Integer> stageIds = new ArrayList<>(stageArray.size());
+        stageArray.forEach(o -> stageIds.add((Integer) o));
+        List<Subject> subjectList = subjectService.findAllByIdIn(stageIds);
+        User userServer = userService.findUserByUsername(user.getUsername());
+        if (null == userServer) {
+            return ResponseResult.ok(false).code(-1).message("用户不存在").dataNone();
+        } else {
+            userServer.setSubjectList(subjectList);
+            return ResponseResult.ok(true).code(1).message("OK").data(userService.save(userServer));
+        }
+    }
+}

+ 11 - 1
src/main/java/cn/minbb/edu/controller/web/CourseController.java

@@ -1,8 +1,10 @@
 package cn.minbb.edu.controller.web;
 
 import cn.minbb.edu.model.Course;
+import cn.minbb.edu.model.Subject;
 import cn.minbb.edu.model.User;
 import cn.minbb.edu.service.CourseService;
+import cn.minbb.edu.service.SubjectService;
 import cn.minbb.edu.service.UserService;
 import cn.minbb.edu.storage.FileService;
 import cn.minbb.edu.storage.StorageProperties;
@@ -26,17 +28,20 @@ public class CourseController {
 
     private UserService userService;
     private CourseService courseService;
+    private SubjectService subjectService;
     private FileService fileService;
 
     @Autowired
-    public CourseController(UserService userService, CourseService courseService, FileService fileService) {
+    public CourseController(UserService userService, CourseService courseService, SubjectService subjectService, FileService fileService) {
         this.userService = userService;
         this.courseService = courseService;
+        this.subjectService = subjectService;
         this.fileService = fileService;
     }
 
     @GetMapping(value = "create")
     public ModelAndView courseCreatePage(ModelAndView modelAndView, HttpServletRequest request) {
+        modelAndView.addObject("subjectList", subjectService.findAll());
         modelAndView.setViewName("course-create");
         return modelAndView;
     }
@@ -44,6 +49,7 @@ public class CourseController {
     @PostMapping(value = "create")
     public ModelAndView courseCreate(
             @RequestParam("name") String name,
+            @RequestParam("subject") String subjectName,
             @RequestParam("introduction") String introduction,
             @RequestParam("remark") String remark,
             @RequestParam("cover") MultipartFile cover,
@@ -60,6 +66,8 @@ public class CourseController {
                 String videoFilenameStore = filenamePrefix + videoFilename.substring(videoFilename.lastIndexOf("."));
                 fileService.storeToFolder(cover, coverFilenameStore, StorageProperties.Folder.IMAGES);
                 fileService.storeToFolder(video, videoFilenameStore, StorageProperties.Folder.VIDEOS);
+                // 查询学科
+                Subject subject = subjectService.findOneByName(subjectName);
                 Course course = new Course();
                 course.setName(name);
                 course.setIntroduction(introduction);
@@ -67,6 +75,8 @@ public class CourseController {
                 course.setCover(Const.STORAGE_HOST + "images/" + coverFilenameStore);
                 course.setVideo(Const.STORAGE_HOST + "videos/" + videoFilenameStore);
                 course.setTeacherId(userId);
+                if (null != subject) course.setSubjectId(subject.getId());
+                else course.setSubjectId(0);
                 courseService.save(course);
             }
         }

+ 15 - 0
src/main/java/cn/minbb/edu/model/Course.java

@@ -49,6 +49,21 @@ public class Course implements Serializable {
     @Column(name = "remark", columnDefinition = "VARCHAR(255) COMMENT '备注'")
     private String remark;
 
+    @Getter
+    @Setter
+    @Column(name = "count_hot", nullable = false, columnDefinition = "INT COMMENT '热门'")
+    private Integer countHot;
+
+    @Getter
+    @Setter
+    @Column(name = "count_excellent", nullable = false, columnDefinition = "INT COMMENT '优秀'")
+    private Integer countExcellent;
+
+    @Getter
+    @Setter
+    @Column(name = "subject_id", nullable = false, columnDefinition = "INT COMMENT '关联学科'")
+    private Integer subjectId;
+
     @Getter
     @Setter
     @Column(name = "teacher_id", nullable = false, columnDefinition = "INT COMMENT '关联用户(教师)'")

+ 38 - 0
src/main/java/cn/minbb/edu/model/Stage.java

@@ -0,0 +1,38 @@
+package cn.minbb.edu.model;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.hibernate.annotations.CreationTimestamp;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "stage")
+@NoArgsConstructor
+public class Stage implements Serializable {
+
+    @Getter
+    @Setter
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", nullable = false, columnDefinition = "INT COMMENT '学习阶段实体'")
+    private Integer id;
+
+    @Getter
+    @Setter
+    @Column(name = "name", nullable = false, columnDefinition = "VARCHAR(32) COMMENT '阶段名称'")
+    private String name;
+
+    @Getter
+    @Setter
+    @Column(name = "created_at", columnDefinition = "DATETIME COMMENT '创建时间'")
+    @CreationTimestamp
+    private Date createdAt;
+
+    public Stage(String name) {
+        this.name = name;
+    }
+}

+ 44 - 0
src/main/java/cn/minbb/edu/model/Subject.java

@@ -0,0 +1,44 @@
+package cn.minbb.edu.model;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.hibernate.annotations.CreationTimestamp;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Entity
+@Table(name = "subject")
+@NoArgsConstructor
+public class Subject implements Serializable {
+
+    @Getter
+    @Setter
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", nullable = false, columnDefinition = "INT COMMENT '学科实体'")
+    private Integer id;
+
+    @Getter
+    @Setter
+    @Column(name = "name", nullable = false, columnDefinition = "VARCHAR(32) COMMENT '学科名称'")
+    private String name;
+
+    @Getter
+    @Setter
+    @Column(name = "created_at", columnDefinition = "DATETIME COMMENT '创建时间'")
+    @CreationTimestamp
+    private Date createdAt;
+
+    @Getter
+    @Setter
+    @Transient
+    private List<Course> voCourseList;
+
+    public Subject(String name) {
+        this.name = name;
+    }
+}

+ 29 - 0
src/main/java/cn/minbb/edu/model/User.java

@@ -82,6 +82,16 @@ public class User implements UserDetails {
     @Column(name = "school", columnDefinition = "VARCHAR(64) COMMENT '学校'")
     private String school;
 
+    @Getter
+    @Setter
+    @Column(name = "stage_id", columnDefinition = "INT COMMENT '关联学习阶段'")
+    private Integer stageId;
+
+    @Getter
+    @Setter
+    @Column(name = "course_ids", columnDefinition = "VARCHAR(255) COMMENT '关联课程集合'")
+    private String courseIds;
+
     @Getter
     @Setter
     @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
@@ -91,6 +101,15 @@ public class User implements UserDetails {
     )
     private Set<UserRole> userRoleSet;
 
+    @Getter
+    @Setter
+    @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
+    @JoinTable(name = "user_subject",
+            joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
+            inverseJoinColumns = {@JoinColumn(name = "subject_id", referencedColumnName = "id")}
+    )
+    private List<Subject> subjectList;
+
     @Getter
     @Setter
     @Column(name = "is_account_non_expired", nullable = false, columnDefinition = "TINYINT DEFAULT '1' COMMENT '帐户未过期'")
@@ -127,6 +146,16 @@ public class User implements UserDetails {
     @Column(name = "version", columnDefinition = "INTEGER COMMENT '版本号'")
     public Integer version;
 
+    @Getter
+    @Setter
+    @Transient
+    private Stage voStage;
+
+    @Getter
+    @Setter
+    @Transient
+    private Course voCourse;
+
     public User(@NotNull String name, @NotNull String username, @NotNull String password) {
         this.name = name;
         this.username = username;

+ 8 - 0
src/main/java/cn/minbb/edu/model/repository/CourseRepository.java

@@ -1,7 +1,15 @@
 package cn.minbb.edu.model.repository;
 
 import cn.minbb.edu.model.Course;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.List;
+
 public interface CourseRepository extends JpaRepository<Course, Integer> {
+    List<Course> findAllByIdIn(List<Integer> ids);
+
+    List<Course> findTop6ByIsEnabledTrue(Sort sort);
+
+    int countByIsEnabledTrue(Sort sort);
 }

+ 7 - 0
src/main/java/cn/minbb/edu/model/repository/StageRepository.java

@@ -0,0 +1,7 @@
+package cn.minbb.edu.model.repository;
+
+import cn.minbb.edu.model.Stage;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface StageRepository extends JpaRepository<Stage, Integer> {
+}

+ 10 - 0
src/main/java/cn/minbb/edu/model/repository/SubjectRepository.java

@@ -0,0 +1,10 @@
+package cn.minbb.edu.model.repository;
+
+import cn.minbb.edu.model.Subject;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface SubjectRepository extends JpaRepository<Subject, Integer> {
+    List<Subject> findAllByIdIn(List<Integer> ids);
+}

+ 12 - 0
src/main/java/cn/minbb/edu/service/CourseService.java

@@ -12,4 +12,16 @@ public interface CourseService {
     List<Course> findAll();
 
     List<Course> findAllByUserId(Integer userId);
+
+    List<Course> findAllBySubjectId(Integer subjectId);
+
+    List<Course> findAllByIdIn(List<Integer> ids);
+
+    List<Course> findTop6Hot();
+
+    List<Course> findTop6Excellent();
+
+    int countAllHot();
+
+    int countAllExcellent();
 }

+ 15 - 0
src/main/java/cn/minbb/edu/service/StageService.java

@@ -0,0 +1,15 @@
+package cn.minbb.edu.service;
+
+import cn.minbb.edu.model.Stage;
+
+import java.util.List;
+
+public interface StageService {
+    Stage save(Stage stage);
+
+    Stage findOneById(Integer id);
+
+    Stage findOneByName(String name);
+
+    List<Stage> findAll();
+}

+ 17 - 0
src/main/java/cn/minbb/edu/service/SubjectService.java

@@ -0,0 +1,17 @@
+package cn.minbb.edu.service;
+
+import cn.minbb.edu.model.Subject;
+
+import java.util.List;
+
+public interface SubjectService {
+    Subject save(Subject subject);
+
+    Subject findOneById(Integer id);
+
+    Subject findOneByName(String name);
+
+    List<Subject> findAll();
+
+    List<Subject> findAllByIdIn(List<Integer> ids);
+}

+ 34 - 0
src/main/java/cn/minbb/edu/service/impl/CourseServiceImpl.java

@@ -22,6 +22,8 @@ public class CourseServiceImpl implements CourseService {
 
     @Override
     public Course save(Course course) {
+        course.setCountHot(0);
+        course.setCountExcellent(0);
         course.setIsEnabled(true);
         return courseRepository.save(course);
     }
@@ -45,4 +47,36 @@ public class CourseServiceImpl implements CourseService {
         course.setTeacherId(userId);
         return courseRepository.findAll(Example.of(course), SortTools.createdAtDown());
     }
+
+    @Override
+    public List<Course> findAllBySubjectId(Integer subjectId) {
+        Course course = new Course(true);
+        course.setSubjectId(subjectId);
+        return courseRepository.findAll(Example.of(course), SortTools.createdAtDown());
+    }
+
+    @Override
+    public List<Course> findAllByIdIn(List<Integer> ids) {
+        return courseRepository.findAllByIdIn(ids);
+    }
+
+    @Override
+    public List<Course> findTop6Hot() {
+        return courseRepository.findTop6ByIsEnabledTrue(SortTools.basicDescSort("countHot"));
+    }
+
+    @Override
+    public List<Course> findTop6Excellent() {
+        return courseRepository.findTop6ByIsEnabledTrue(SortTools.basicDescSort("countExcellent"));
+    }
+
+    @Override
+    public int countAllHot() {
+        return courseRepository.countByIsEnabledTrue(SortTools.basicDescSort("countHot"));
+    }
+
+    @Override
+    public int countAllExcellent() {
+        return courseRepository.countByIsEnabledTrue(SortTools.basicDescSort("countExcellent"));
+    }
 }

+ 44 - 0
src/main/java/cn/minbb/edu/service/impl/StageServiceImpl.java

@@ -0,0 +1,44 @@
+package cn.minbb.edu.service.impl;
+
+import cn.minbb.edu.model.Stage;
+import cn.minbb.edu.model.repository.StageRepository;
+import cn.minbb.edu.service.StageService;
+import cn.minbb.edu.util.SortTools;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class StageServiceImpl implements StageService {
+
+    private StageRepository stageRepository;
+
+    @Autowired
+    public StageServiceImpl(StageRepository stageRepository) {
+        this.stageRepository = stageRepository;
+    }
+
+    @Override
+    public Stage save(Stage stage) {
+        return stageRepository.save(stage);
+    }
+
+    @Override
+    public Stage findOneById(Integer id) {
+        Stage stage = new Stage();
+        stage.setId(id);
+        return stageRepository.findOne(Example.of(stage)).orElse(null);
+    }
+
+    @Override
+    public Stage findOneByName(String name) {
+        return stageRepository.findOne(Example.of(new Stage(name))).orElse(null);
+    }
+
+    @Override
+    public List<Stage> findAll() {
+        return stageRepository.findAll(SortTools.createdAtDown());
+    }
+}

+ 49 - 0
src/main/java/cn/minbb/edu/service/impl/SubjectServiceImpl.java

@@ -0,0 +1,49 @@
+package cn.minbb.edu.service.impl;
+
+import cn.minbb.edu.model.Subject;
+import cn.minbb.edu.model.repository.SubjectRepository;
+import cn.minbb.edu.service.SubjectService;
+import cn.minbb.edu.util.SortTools;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class SubjectServiceImpl implements SubjectService {
+
+    private SubjectRepository subjectRepository;
+
+    @Autowired
+    public SubjectServiceImpl(SubjectRepository subjectRepository) {
+        this.subjectRepository = subjectRepository;
+    }
+
+    @Override
+    public Subject save(Subject subject) {
+        return subjectRepository.save(subject);
+    }
+
+    @Override
+    public Subject findOneById(Integer id) {
+        Subject subject = new Subject();
+        subject.setId(id);
+        return subjectRepository.findOne(Example.of(subject)).orElse(null);
+    }
+
+    @Override
+    public Subject findOneByName(String name) {
+        return subjectRepository.findOne(Example.of(new Subject(name))).orElse(null);
+    }
+
+    @Override
+    public List<Subject> findAll() {
+        return subjectRepository.findAll(SortTools.createdAtDown());
+    }
+
+    @Override
+    public List<Subject> findAllByIdIn(List<Integer> ids) {
+        return subjectRepository.findAllByIdIn(ids);
+    }
+}

+ 1 - 1
src/main/java/cn/minbb/edu/service/impl/UserServiceImpl.java

@@ -43,7 +43,7 @@ public class UserServiceImpl implements UserService {
     public User findUserById(Integer id) {
         User user = new User();
         user.setId(id);
-        return userRepository.findOne(Example.of(user)).orElse(null);
+        return null == id ? null : userRepository.findOne(Example.of(user)).orElse(null);
     }
 
     @Override

+ 1 - 1
src/main/java/cn/minbb/edu/system/Const.java

@@ -6,5 +6,5 @@ public class Const {
     }
 
     public static final String ACTIVE = "ACTIVE";
-    public static final String STORAGE_HOST = "http://123.207.151.92:8080/file/";
+    public static final String STORAGE_HOST = "http://my.minbb.cn:8080/file/";
 }

+ 6 - 38
src/main/java/cn/minbb/edu/task/InitDataRunner.java

@@ -1,10 +1,7 @@
 package cn.minbb.edu.task;
 
-import cn.minbb.edu.model.Banner;
 import cn.minbb.edu.model.UserRole;
-import cn.minbb.edu.service.BannerService;
-import cn.minbb.edu.service.CourseService;
-import cn.minbb.edu.service.UserRoleService;
+import cn.minbb.edu.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.ApplicationArguments;
@@ -12,22 +9,24 @@ import org.springframework.boot.ApplicationRunner;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
-
 @Order(1)
 @Component
 public class InitDataRunner implements ApplicationRunner {
 
     private Logger logger = LoggerFactory.getLogger(InitDataRunner.class);
 
+    private UserService userService;
     private UserRoleService userRoleService;
     private CourseService courseService;
     private BannerService bannerService;
+    private SubjectService subjectService;
 
-    public InitDataRunner(UserRoleService userRoleService, CourseService courseService, BannerService bannerService) {
+    public InitDataRunner(UserService userService, UserRoleService userRoleService, CourseService courseService, BannerService bannerService, SubjectService subjectService) {
+        this.userService = userService;
         this.userRoleService = userRoleService;
         this.courseService = courseService;
         this.bannerService = bannerService;
+        this.subjectService = subjectService;
     }
 
     @Override
@@ -39,36 +38,5 @@ public class InitDataRunner implements ApplicationRunner {
                 userRoleService.saveOne(new UserRole(role, role.getDescription()));
             }
         }
-        // 检查主页轮播 - 初始化轮播数据
-        List<Banner> bannerList = bannerService.findAll();
-        if (bannerList.isEmpty()) {
-            Banner banner1 = new Banner();
-            banner1.setTitle("一一一");
-            banner1.setSubtitle("一一一一一一一一一一一一一一一一一一一一一");
-            banner1.setAction("现在去学习");
-            banner1.setCover("");
-            banner1.setPath("");
-            banner1.setRemark("一");
-            banner1.setUserId(1);
-            bannerService.save(banner1);
-            Banner banner2 = new Banner();
-            banner2.setTitle("二二二");
-            banner2.setSubtitle("二二二二二二二二二二二二二二二二二二二二二");
-            banner2.setAction("了解更多");
-            banner2.setCover("");
-            banner2.setPath("");
-            banner2.setRemark("二");
-            banner2.setUserId(1);
-            bannerService.save(banner2);
-            Banner banner3 = new Banner();
-            banner3.setTitle("三三三");
-            banner3.setSubtitle("三三三三三三三三三三三三三三三三三三三三三");
-            banner3.setAction("了解更多");
-            banner3.setCover("");
-            banner3.setPath("");
-            banner3.setRemark("三");
-            banner3.setUserId(1);
-            bannerService.save(banner3);
-        }
     }
 }

+ 46 - 0
src/main/java/cn/minbb/edu/util/CollectionUtil.java

@@ -0,0 +1,46 @@
+package cn.minbb.edu.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class CollectionUtil {
+
+    public static List<Integer> stringToIntList(String listString) {
+        if (null == listString || listString.isEmpty()) {
+            return new ArrayList<>();
+        } else {
+            List<Integer> list = new ArrayList<>();
+            String temp = listString.substring(1, listString.length() - 1);
+            if (temp.isEmpty()) return new ArrayList<>();
+            String[] split = temp.split(",");
+            for (String s : split) {
+                list.add(Integer.parseInt(s.trim()));
+            }
+            return list;
+        }
+    }
+
+    public static Integer[] stringToIntArray(String arrayString) {
+        if (null == arrayString || arrayString.isEmpty()) {
+            return new Integer[]{};
+        } else {
+            String temp = arrayString.substring(1, arrayString.length() - 1);
+            if (temp.isEmpty()) return new Integer[]{};
+            String[] split = temp.split(",");
+            Integer[] array = new Integer[split.length];
+            for (int i = 0; i < split.length; i++) {
+                array[i] = Integer.parseInt(split[i].trim());
+            }
+            return array;
+        }
+    }
+
+    public static String intListToString(List<Integer> intList) {
+        return Arrays.toString(intList.toArray());
+    }
+
+    public static String intArrayToString(int[] intArray) {
+        return Arrays.toString(intArray);
+    }
+}

+ 3 - 3
src/main/resources/application-pro.properties

@@ -1,6 +1,6 @@
 # Éú²ú»·¾³
 server.servlet.context-path=/
 # MySQL
-spring.datasource.url=jdbc:mysql://www.minbb.cn:3306/edu?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
-spring.datasource.username=Yumin
-spring.datasource.password=Wang19970305
+spring.datasource.url=jdbc:mysql://rm-uf64guljnha668n05io.mysql.rds.aliyuncs.com:3306/edu?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+spring.datasource.username=zzuli
+spring.datasource.password=Zzuli123

+ 11 - 3
src/main/resources/templates/course-create.html

@@ -22,9 +22,17 @@
             <div class="col-md-12">
                 <h4 class="mb-3">课程信息</h4>
                 <form method="post" action="/course/create" enctype="multipart/form-data">
-                    <div class="mb-3">
-                        <label for="name">课程名称</label>
-                        <input class="form-control" id="name" name="name" type="text" placeholder="不超过六十个字" required autofocus/>
+                    <div class="row">
+                        <div class="col-sm-12 col-md-8 mb-3">
+                            <label for="name">课程名称</label>
+                            <input class="form-control" id="name" name="name" type="text" placeholder="不超过六十个字" required autofocus/>
+                        </div>
+                        <div class="col-sm-12 col-md-4 mb-3">
+                            <label for="subject">所属学科</label>
+                            <select class="form-control" id="subject" name="subject" required style="height: 33px;">
+                                <option th:each="subject : ${subjectList}" th:text="${subject.getName()}"></option>
+                            </select>
+                        </div>
                     </div>
                     <div class="mb-3">
                         <label for="introduction">课程介绍</label>