Jelajahi Sumber

修复冲突

guochao 5 tahun lalu
induk
melakukan
81447124d5
24 mengubah file dengan 384 tambahan dan 99 penghapusan
  1. 22 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/CourseVisibility.java
  2. 22 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/ProductType.java
  3. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Case2DimensionDao.java
  4. 18 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ParticipantCourseDao.java
  5. 17 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Product2EntityDao.java
  6. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ThemeDetailDao.java
  7. 5 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Case2Dimension.java
  8. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Config.java
  9. 31 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ParticipantCourse.java
  10. 29 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Product2Entity.java
  11. 4 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ThemeDetail.java
  12. 4 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ThemeEntityRelations.java
  13. 5 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ThemeService.java
  14. 18 6
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CaseServiceImpl.java
  15. 17 9
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/EmailServiceImpl.java
  16. 40 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/ThemeServiceImpl.java
  17. 23 43
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ThemeController.java
  18. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/CourseResourceVO.java
  19. 1 21
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/ThemeDetailVO.java
  20. 21 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/ThemeVOWrapper.java
  21. 7 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ThemeLogic.java
  22. 12 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ProductProcessLogicImpl.java
  23. 81 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ThemeLogicImpl.java
  24. 3 1
      mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/logic/impl/ThemeLogicImplTest.java

+ 22 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/CourseVisibility.java

@@ -0,0 +1,22 @@
+package cn.iselab.mooctest.site.common.enums;
+
+import lombok.Getter;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2020-02-12 00:11
+ */
+public enum CourseVisibility {
+
+    OPEN(0),
+    PART_OPEN(1),
+    NONE_OPEN(2);
+
+    @Getter
+    private int visibility;
+
+    CourseVisibility(int visibility){
+        this.visibility = visibility;
+    }
+}

+ 22 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/ProductType.java

@@ -0,0 +1,22 @@
+package cn.iselab.mooctest.site.common.enums;
+
+import lombok.Getter;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2020-02-09 21:30
+ */
+public enum ProductType {
+
+    THEME("THEME");
+
+    @Getter
+    private String type;
+
+    ProductType(String type){
+        this.type = type;
+    }
+
+
+}

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Case2DimensionDao.java

@@ -7,5 +7,5 @@ import java.util.List;
 
 public interface Case2DimensionDao extends CrudRepository<Case2Dimension, Long> {
 
-    List<Case2Dimension> findByTestType(int testType);
+    List<Case2Dimension> findByTestTypeAndTargetType(Integer testType, Long targetType);
 }

+ 18 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ParticipantCourseDao.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.ParticipantCourse;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2020-02-12 21:54
+ */
+@Transactional
+public interface ParticipantCourseDao extends PagingAndSortingRepository<ParticipantCourse, Long>, JpaSpecificationExecutor<ParticipantCourse> {
+    List<ParticipantCourse> findAllByParticipantId(Long participantId);
+}

+ 17 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Product2EntityDao.java

@@ -0,0 +1,17 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.Product2Entity;
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.stereotype.Component;
+
+import java.util.Optional;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2020-02-09 21:15
+ */
+@Component
+public interface Product2EntityDao extends PagingAndSortingRepository<Product2Entity, Long> {
+    Optional<Product2Entity> findByEntityIdAndEntityType(Long entityId, String entityType);
+}

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ThemeDetailDao.java

@@ -38,4 +38,5 @@ public interface ThemeDetailDao extends PagingAndSortingRepository<ThemeDetail,L
     @Query("update ThemeDetail t set t.status = :status where t.id= :id")
     void updateStatusById(@Param("id") Long id, @Param("status") int status);
 
+    List<ThemeDetail> findAllByVisibilityIsNot(int visibility);
 }

+ 5 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Case2Dimension.java

@@ -8,14 +8,17 @@ import java.io.Serializable;
 
 @Data
 @Entity
-@Table(name="case_2_dimension")
+@Table(name = "case_2_dimension")
 public class Case2Dimension implements Serializable {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
+    @Column(name = "target_type")
+    private Long targetType;
+
     @Column(name = "test_type")
-    private int testType;
+    private Integer testType;
 
     @Column(name = "dimension_id")
     private Long dimensionId;

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Config.java

@@ -17,6 +17,7 @@ import javax.persistence.Table;
 public class Config {
 
     public static final String CONFIG_KEY_ANNOUNCEMENT = "announcement";
+    public static final String CONFIG_KEY_ADMIN_EMAILS = "adminEmails";
 
     @Id
     private String name;

+ 31 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ParticipantCourse.java

@@ -0,0 +1,31 @@
+package cn.iselab.mooctest.site.models;
+
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2020-02-12 21:49
+ */
+@Entity
+@Data
+@Table(name = "course_group_user")
+public class ParticipantCourse {
+
+    @Id
+    private Long id;
+
+    @Column(name = "title")
+    private String title;
+
+    @Column(name = "group_id")
+    private Long groupId;
+
+    @Column(name = "participant_id")
+    private Long participantId;
+}

+ 29 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Product2Entity.java

@@ -0,0 +1,29 @@
+package cn.iselab.mooctest.site.models;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2020-02-09 21:09
+ */
+@Data
+@Entity
+@Table(name = "product_2_entity")
+public class Product2Entity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(name = "entity_id")
+    private Long entityId;
+
+    @Column(name = "product_id")
+    private Long productId;
+
+    @Column(name = "entity_type")
+    private String entityType;
+}

+ 4 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ThemeDetail.java

@@ -1,6 +1,7 @@
 package cn.iselab.mooctest.site.models;
 
 import lombok.Data;
+import org.hibernate.annotations.ColumnDefault;
 
 import javax.persistence.*;
 import java.sql.Timestamp;
@@ -58,4 +59,7 @@ public class ThemeDetail {
 
     @Column(name = "is_deleted")
     private int isDeleted;
+    @Column(name = "visibility")
+    private int visibility;
+
 }

+ 4 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ThemeEntityRelations.java

@@ -34,12 +34,16 @@ public class ThemeEntityRelations {
     @Column(name = "sort_id")
     private int sortId;
 
+    @Column(name = "is_previewable")
+    private boolean previewable;
+
     public ThemeEntityRelations(long themeId, long entityId, EntityTypeEnum entityType, int sortId) {
         this.themeId = themeId;
         this.entityId = entityId;
         this.entityType = entityType;
         this.sortId = sortId;
     }
+
     public ThemeEntityRelations(long themeId, long entityId, EntityTypeEnum entityType) {
         this.themeId = themeId;
         this.entityId = entityId;

+ 5 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ThemeService.java

@@ -27,7 +27,7 @@ public interface ThemeService {
     Page<ThemeDetail> getThemeDetails(Pageable pageable, String keyword, int type);
     Page<ThemeDetail> getThemeDetailsByOwnerId(Long ownerId, String keyword, Pageable pageable);
     Page<CourseResource> getThemeCourseResources(Pageable pageable, String keyword);
-    Iterable<ThemeDetail> getThemeDetails();
+    List<ThemeDetail> getThemeDetails();
     List<ThemeDetail> getThemeDetailList();
     List<ThemeDetail> getThemeDetailByIds(Long[] ids);
     List<ThemeDetail> getThemeDetailListByOwnerId(Long ownerId);
@@ -37,7 +37,7 @@ public interface ThemeService {
     ThemeEntityRelations createRelationBetweenThemeAndEntity(long themeId, long caseId, EntityTypeEnum entityTypeEnum);
     boolean deleteEntityRelationByThemeId(Long themeId);
     boolean deleteRelationBetweenThemeAndEntity(long themeId, long caseId, EntityTypeEnum entityTypeEnum);
-    ThemeEntityRelations checkRelationBetweenThemeAndEntity(long themeId, long caseId, EntityTypeEnum entityTypeEnum);
+    ThemeEntityRelations checkRelationBetweenThemeAndEntity(long themeId, long entityId, EntityTypeEnum entityTypeEnum);
     ThemeEntityRelations addEntity(ThemeEntityRelations themeEntityRelations);
     void rmEntity(long id);
 
@@ -54,4 +54,7 @@ public interface ThemeService {
     Integer updateStatus(ThemeDetail themeDetail);
 
     boolean canBeDeleted(Long themeId);
+    ThemeEntityRelations createEntityRelation(long themeId, long entityId, EntityTypeEnum entityType);
+    List<ThemeDetail> getPlatformThemeDetails();
+    List<ThemeDetail> getCourseByParticipant(Long participantId);
 }

+ 18 - 6
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CaseServiceImpl.java

@@ -7,9 +7,6 @@ import cn.iselab.mooctest.site.service.CaseService;
 import cn.iselab.mooctest.site.service.Entity2TagService;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-import java.util.HashMap;
-import java.util.List;
-
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,11 +15,14 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.domain.Specifications;
 import org.springframework.stereotype.Service;
+
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -47,6 +47,9 @@ public class CaseServiceImpl implements CaseService {
     private DimensionDao dimensionDao;
 
     @Autowired
+    private TargetDao targetDao;
+
+    @Autowired
     private Entity2TagService entity2TagService;
 
     @Override
@@ -146,15 +149,24 @@ public class CaseServiceImpl implements CaseService {
     @Override
     public List<Dimension> getCase2Dimension(long caseId) {
         List<Dimension> dimensions = new ArrayList<>();
-        try{
+        try {
             int testType = Integer.parseInt(getCaseProperties(caseId).get("testType"));
-            List<Case2Dimension> case2Dimensions = case2DimensionDao.findByTestType(testType);
+            CaseExtends caseExtends = getCaseById(caseId);
+            Long targetType = null;
+            if (caseExtends != null) {
+                Long targetId = caseExtends.getAppId();
+                if (targetId != null) {
+                    Target target = targetDao.findOne(targetId);
+                    targetType = target.getTargetType();
+                }
+            }
+            List<Case2Dimension> case2Dimensions = case2DimensionDao.findByTestTypeAndTargetType(testType, targetType);
             List<Long> dimensionIds = case2Dimensions.stream().map(Case2Dimension::getDimensionId).collect(Collectors.toList());
             for (long id : dimensionIds) {
                 Dimension item = dimensionDao.findById(id);
                 dimensions.add(item);
             }
-        }catch (NullPointerException e){
+        } catch (NullPointerException e) {
             log.info("过去老数据没有testType导致NullPointerException");
         }
         return dimensions;

+ 17 - 9
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/EmailServiceImpl.java

@@ -1,8 +1,10 @@
 package cn.iselab.mooctest.site.service.impl;
 
 import cn.iselab.mooctest.site.common.constant.Constants;
+import cn.iselab.mooctest.site.dao.ConfigDao;
 import cn.iselab.mooctest.site.data.OrderDTO;
 import cn.iselab.mooctest.site.data.UserDTOForMT;
+import cn.iselab.mooctest.site.models.Config;
 import cn.iselab.mooctest.site.models.User;
 import cn.iselab.mooctest.site.service.BaseService;
 import cn.iselab.mooctest.site.service.EmailService;
@@ -17,11 +19,15 @@ import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.runtime.RuntimeConstants;
 import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * @author guoyc
@@ -33,9 +39,10 @@ public class EmailServiceImpl extends BaseService implements EmailService {
     @Value("${host}")
     private String host;
 
-    private static VelocityEngine ve = new VelocityEngine();
+    @Autowired
+    private ConfigDao configDao;
 
-    private static ArrayList<String> adminEmails = new ArrayList<>();
+    private static VelocityEngine ve = new VelocityEngine();
 
     static {
         ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
@@ -43,10 +50,6 @@ public class EmailServiceImpl extends BaseService implements EmailService {
         ve.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.Log4JLogChute");
         ve.setProperty("runtime.log.logsystem.log4j.logger", "velocity");
         ve.init();
-        adminEmails.add("zychen@nju.edu.cn");
-        adminEmails.add("chrong.fang@gmail.com");
-        adminEmails.add("xujianfeng@mooctest.com");
-        adminEmails.add("huangyong@mooctest.com");
     }
 
     private static Template forgetPasswordTpl = ve.getTemplate("tpl/mail/forget_password.vm", "UTF-8");
@@ -58,6 +61,11 @@ public class EmailServiceImpl extends BaseService implements EmailService {
     private static Template payResulAdmintTpl = ve.getTemplate("tpl/mail/pay_result_admin.vm", "UTF-8");
     private static Template getHelpEmailTpl = ve.getTemplate("tpl/mail/get_help.vm", "UTF-8");
 
+    private ArrayList<String> getAdminEmails() {
+        String emailListStr = configDao.findByName(Config.CONFIG_KEY_ADMIN_EMAILS).getValue();
+        return new ArrayList<String>(Arrays.asList(emailListStr.split(";")));
+    }
+
     @Override
     public boolean sendForgetPasswordEmail(UserDTOForMT user) {
         try {
@@ -126,7 +134,7 @@ public class EmailServiceImpl extends BaseService implements EmailService {
             StringWriter stringWriter = new StringWriter();
             arrearsTpl.merge(context, stringWriter);
 
-            sms.send(adminEmails, subject, stringWriter.toString());
+            sms.send(getAdminEmails(), subject, stringWriter.toString());
             return true;
         } catch (Exception e) {
             LOG.error("", e);
@@ -185,7 +193,7 @@ public class EmailServiceImpl extends BaseService implements EmailService {
 
             StringWriter stringWriterAdmin = new StringWriter();
             payResulAdmintTpl.merge(contextAdmin, stringWriterAdmin);
-            smsAdmin.send(adminEmails, subjectAdmin, stringWriterAdmin.toString());
+            smsAdmin.send(getAdminEmails(), subjectAdmin, stringWriterAdmin.toString());
             return true;
         } catch (Exception e) {
             LOG.error("", e);
@@ -207,7 +215,7 @@ public class EmailServiceImpl extends BaseService implements EmailService {
             StringWriter stringWriter = new StringWriter();
             getHelpEmailTpl.merge(context, stringWriter);
 
-            sms.send(adminEmails, subject, stringWriter.toString());
+            sms.send(getAdminEmails(), subject, stringWriter.toString());
             return true;
         } catch (Exception e) {
             LOG.error("", e);

+ 40 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/ThemeServiceImpl.java

@@ -3,12 +3,18 @@ package cn.iselab.mooctest.site.service.impl;
 import cn.iselab.mooctest.site.common.enums.EntityTypeEnum;
 import cn.iselab.mooctest.site.dao.CourseResourceDao;
 import cn.iselab.mooctest.site.dao.StudyRecordDao;
+import cn.iselab.mooctest.site.common.constant.OwningPartyConstants;
+import cn.iselab.mooctest.site.common.enums.CourseVisibility;
+import cn.iselab.mooctest.site.common.enums.EntityTypeEnum;
+import cn.iselab.mooctest.site.dao.CourseResourceDao;
+import cn.iselab.mooctest.site.dao.ParticipantCourseDao;
 import cn.iselab.mooctest.site.dao.ThemeDetailDao;
 import cn.iselab.mooctest.site.dao.ThemeEntityRelationsDao;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.ThemeService;
 import cn.iselab.mooctest.site.web.data.CourseVO;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
+import com.google.common.collect.Lists;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.client.HttpResponseException;
@@ -26,6 +32,10 @@ import javax.persistence.criteria.Root;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @program: mooctest-site
@@ -45,7 +55,8 @@ public class ThemeServiceImpl implements ThemeService {
     private CourseResourceDao courseResourceDao;
     @Autowired
     private StudyRecordDao studyRecordDao;
-
+    @Autowired
+    private ParticipantCourseDao participantCourseDao;
 
     @Override
     public ThemeDetail createThemeDetail(ThemeDetail themeDetail) {
@@ -155,7 +166,7 @@ public class ThemeServiceImpl implements ThemeService {
     }
 
     @Override
-    public Iterable<ThemeDetail> getThemeDetails() {
+    public List<ThemeDetail> getThemeDetails() {
         return themeDetailDao.findAll();
     }
 
@@ -203,6 +214,19 @@ public class ThemeServiceImpl implements ThemeService {
 //        }
     }
 
+    @Override
+    public ThemeEntityRelations createEntityRelation(long themeId, long entityId, EntityTypeEnum entityType) {
+        ThemeEntityRelations themeEntityRelations = checkRelationBetweenThemeAndEntity(themeId, entityId, entityType);
+        if(themeEntityRelations !=null) {
+            log.error(String.format("themeId:{%s}-entityId:{%s}-type:{%s} 已经建立关联",themeId, entityId, entityType.toString()));
+            throw new NullPointerException("该theme中不存在该" + entityType.toString());
+        }else {
+            themeEntityRelations = new ThemeEntityRelations(themeId, entityId, entityType);
+            return themeEntityRelationsDao.save(themeEntityRelations);
+        }
+    }
+
+
 
     @Override
     public void createStudyViewRecord(Long themeId, Long courseId, Long userId, EntityTypeEnum entityType) {
@@ -225,6 +249,18 @@ public class ThemeServiceImpl implements ThemeService {
     }
 
     @Override
+    public List<ThemeDetail> getPlatformThemeDetails() {
+        return themeDetailDao.findAllByVisibilityIsNot(CourseVisibility.NONE_OPEN.getVisibility());
+    }
+
+    @Override
+    public List<ThemeDetail> getCourseByParticipant(Long participantId) {
+        List<ParticipantCourse> participantCourses = participantCourseDao.findAllByParticipantId(participantId);
+        List<Long> ids = participantCourses.stream().map(ParticipantCourse::getId).collect(Collectors.toList());
+        return Lists.newArrayList(themeDetailDao.findAllById(ids));
+    }
+
+    @Override
     public ThemeEntityRelations createRelationBetweenThemeAndEntity(long themeId, long caseId, EntityTypeEnum entityTypeEnum) {
         ThemeEntityRelations themeEntityRelations = checkRelationBetweenThemeAndEntity(themeId,caseId,entityTypeEnum);
         if(themeEntityRelations !=null) {
@@ -255,8 +291,8 @@ public class ThemeServiceImpl implements ThemeService {
     }
 
     @Override
-    public ThemeEntityRelations checkRelationBetweenThemeAndEntity(long themeId, long caseId, EntityTypeEnum entityTypeEnum) {
-        return themeEntityRelationsDao.findByThemeIdAndEntityIdAndEntityType(themeId,caseId,entityTypeEnum);
+    public ThemeEntityRelations checkRelationBetweenThemeAndEntity(long themeId, long entityId, EntityTypeEnum entityTypeEnum) {
+        return themeEntityRelationsDao.findByThemeIdAndEntityIdAndEntityType(themeId,entityId,entityTypeEnum);
     }
 
     @Override

+ 23 - 43
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ThemeController.java

@@ -305,54 +305,23 @@ public class ThemeController extends BaseSearchController {
         String keyword = searchConditionVO.getKeyword();
         Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
         log.info("userId: {}获取课程列表,参数:{}",userId,searchConditionVO.toString());
-        Page<ThemeDetailVO> themeDetailVOS = themeLogic.getThemeList(pageable,keyword,0);
-        return new ResponseVO<>(ServerCode.SUCCESS,themeDetailVOS);
-    }
-
-    /**
-     * 获取与用户相关的所有课程
-     * @param searchCondition
-     * @return
-     */
-    @GetMapping(value = UrlConstants.API + "get/courses")
-    public ResponseVO<Page<ThemeDetailVO>> getAllCourses(@RequestParam(name = "searchCondition") String searchCondition) {
-        Page<ThemeDetailVO> themeDetailVOS;
-        Gson gson = new Gson();
-        SearchConditionVO searchConditionVO = gson.fromJson(searchCondition, SearchConditionVO.class);
-        Pageable pageable = this.getPageable(searchConditionVO);
-        String keyword = searchConditionVO.getKeyword();
-        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
-        log.info("userId: {}获取课程列表,参数:{}",userId,searchConditionVO.toString());
-        // 教师身份获取开设的课程
-        themeDetailVOS = themeLogic.getThemeDetailListByOwnerId(userId, keyword, pageable);
-        List<ThemeDetailVO> themeDetailVOSContent = themeDetailVOS.getContent();
-
-        // 学生身份加入的课程
-        List<Long> groupIdList = groupLogic.getUserGroups(userId).stream().map(GroupVO::getId).collect(Collectors.toList());
-        List<List<Theme2Group>> theme2GroupListLists = groupIdList.stream().map(groupId -> themeLogic.getThemeListByGroup(groupId)).collect(Collectors.toList());
-        List<Long> themeIdList = new ArrayList<>();
-        for(List<Theme2Group> theme2GroupList : theme2GroupListLists){
-            for(Theme2Group theme2Group : theme2GroupList){
-                themeIdList.add(theme2Group.getThemeId());
-            }
-        }
-        List<ThemeDetailVO> themeDetailVOList = themeIdList.stream().map(themeId -> themeLogic.getThemeDetailByThemeId(themeId)).filter(themeDetailVO -> themeDetailVO.getIsDeleted() == 0).collect(Collectors.toList());
-
-        if(themeDetailVOSContent.size() == 0){
-            themeDetailVOS = new PageImpl<ThemeDetailVO>(themeDetailVOList, pageable, themeDetailVOList.size());
-        }else{
-            for(ThemeDetailVO themeDetailVO : themeDetailVOList){
-                themeDetailVOSContent.add(themeDetailVO);
-            }
-            themeDetailVOS = new PageImpl<ThemeDetailVO>(themeDetailVOSContent, pageable, themeDetailVOSContent.size());
+        List<ThemeDetailVO> result = themeLogic.getThemeList(pageable, keyword);
+        int start = (int)pageable.getOffset();
+        int end = (start + pageable.getPageSize()) > result.size() ? result.size() : (start + pageable.getPageSize());
+        if (start > end) {
+            Page<ThemeDetailVO> resultPage = new PageImpl<>(result.subList(0,
+                    result.size() < pageable.getOffset()?result.size(): (int) pageable.getOffset()),pageable,result.size());
+            return new ResponseVO<>(20000,"分页信息超过最大值,已返回第一页的数据",resultPage);
         }
-        return new ResponseVO<>(ServerCode.SUCCESS,themeDetailVOS);
+        Page<ThemeDetailVO> resultPage = new PageImpl<>(result.subList(start,end),pageable,result.size());
+        return new ResponseVO<>(ServerCode.SUCCESS,resultPage);
     }
 
     @GetMapping(value = UrlConstants.API + "course/{courseId}")
     public ResponseVO<CourseVO> course(@PathVariable("courseId")Long courseId) {
         Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
-        CourseVO courseVO = themeLogic.getCourse(courseId, userId);
+//        CourseVO courseVO = themeLogic.getCourse(courseId, userId);
+        CourseVO courseVO = themeLogic.getCourse(courseId);
         if(courseVO.getThemeDetailVO().getType() != 0) {
             log.info("这个不是一个课程:{}, 访问用户为:{}",courseId ,userId);
             return new ResponseVO<>(ServerCode.ENTITY_NOT_A_COURSE,null);
@@ -360,8 +329,19 @@ public class ThemeController extends BaseSearchController {
         return new ResponseVO<>(ServerCode.SUCCESS, courseVO);
     }
 
+    @GetMapping(value = UrlConstants.API + "course/{courseId}/resource/{resourceId}")
+    public ResponseVO<CourseResourceVO> resource(@PathVariable("courseId")Long courseId,@PathVariable("resourceId")Long resourceId) {
+        CourseResourceVO courseResourceVO = themeLogic.getCourseResource(courseId, resourceId);
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        log.info("访问resource:{},用户为:{}",resourceId ,userId);
+        if(courseResourceVO == null) {
+            return new ResponseVO<>(ServerCode.ENTITY_NOT_A_COURSE_RESOURCE, null);
+        }
+        return new ResponseVO<>(ServerCode.SUCCESS, courseResourceVO);
+    }
+
     @GetMapping(value = UrlConstants.API + "course/resource/{resourceId}")
-    public ResponseVO<CourseResourceVO> resource(@PathVariable("resourceId")Long resourceId) {
+    public ResponseVO<CourseResourceVO> getResource(@PathVariable("resourceId")Long resourceId) {
         CourseResourceVO courseResourceVO = themeLogic.getCourseResourceById(resourceId);
         Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
         log.info("访问resource:{},用户为:{}",resourceId ,userId);

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/CourseResourceVO.java

@@ -20,4 +20,5 @@ public class CourseResourceVO extends EntityVO {
     private String sliderImagesPath;
     private Integer sliderImagesCount;
     private String description;
+    private Boolean previewable;
 }

+ 1 - 21
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/ThemeDetailVO.java

@@ -25,27 +25,7 @@ public class ThemeDetailVO {
     private boolean hasPurchase;
     private int publicStatus;
     private int type;
+    private int visibility;
     private int isDeleted;
     List<EntityVO> entityVOList;
-
-    @Override
-    public String toString() {
-        return "ThemeDetailVO{" +
-                "id=" + id +
-                ", title='" + title + '\'' +
-                ", ownerId=" + ownerId +
-                ", introduce='" + introduce + '\'' +
-                ", beginTime=" + beginTime +
-                ", endTime=" + endTime +
-                ", status=" + status +
-                ", groupId=" + groupId +
-                ", groupName='" + groupName + '\'' +
-                ", courseType=" + courseType +
-                ", hasPurchase=" + hasPurchase +
-                ", publicStatus=" + publicStatus +
-                ", type=" + type +
-                ", isDeleted=" + isDeleted +
-                ", entityVOList=" + entityVOList +
-                '}';
-    }
 }

+ 21 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/ThemeVOWrapper.java

@@ -4,11 +4,20 @@ import cn.iselab.mooctest.site.common.enums.EntityTypeEnum;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.GroupService;
 import cn.iselab.mooctest.site.service.Theme2GroupService;
+import cn.iselab.mooctest.site.common.enums.ProductType;
+import cn.iselab.mooctest.site.dao.Product2EntityDao;
+import cn.iselab.mooctest.site.models.Exam;
+import cn.iselab.mooctest.site.models.Theme;
+import cn.iselab.mooctest.site.models.ThemeDetail;
+import cn.iselab.mooctest.site.models.ThemeEntityRelations;
 import cn.iselab.mooctest.site.service.User2ThemeService;
 import cn.iselab.mooctest.site.web.data.*;
 import com.google.common.collect.Lists;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.util.SystemOutLogger;
+import com.google.common.collect.Maps;
+import com.oracle.tools.packager.Log;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,8 +36,8 @@ import java.util.stream.Collectors;
  * @author: menduo
  * @create: 2019-04-28 12:16
  **/
-@Service
 @Slf4j
+@Service
 public class ThemeVOWrapper {
 
     @Autowired
@@ -47,6 +56,9 @@ public class ThemeVOWrapper {
     @Autowired
     private User2ThemeService user2ThemeService;
 
+    @Autowired
+    private Product2EntityDao product2EntityDao;
+
     public ThemeDetail unWrapperThemeDetail(ThemeDetailVO themeDetailVO) {
         ThemeDetail themeDetail = new ThemeDetail();
         themeDetail.setBeginTime(new Timestamp(themeDetailVO.getBeginTime()));
@@ -61,9 +73,10 @@ public class ThemeVOWrapper {
         themeDetailVO.setEndTime(themeDetail.getEndTime().getTime());
         BeanUtils.copyProperties(themeDetail,themeDetailVO);
         //是否购买了该主题
-        if(themeDetail.getPublicStatus() != 0) {
+        if(themeDetail.getPublicStatus() == 0) {
             themeDetailVO.setHasPurchase(varifyIfPurchase(themeDetail.getId()));
         }
+
         Theme2Group theme2Group = theme2GroupService.findByThemeId(themeDetail.getId());
         if(theme2Group != null){
             Group group = groupService.getGroupById(theme2Group.getGroupId());
@@ -76,11 +89,15 @@ public class ThemeVOWrapper {
         return themeDetailVO;
     }
 
-    private boolean varifyIfPurchase(long themeDetailId) {
+    public boolean varifyIfPurchase(long themeDetailId) {
         Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
         return user2ThemeService.findByUserIdAndThemeId(userId, themeDetailId) != null;
     }
 
+    public boolean checkIfProduct(long themeDetailId) {
+        return product2EntityDao.findByEntityIdAndEntityType(themeDetailId, ProductType.THEME.getType()).isPresent();
+    }
+
 
 
     public ThemeVO wrapper(Theme theme) {
@@ -135,6 +152,7 @@ public class ThemeVOWrapper {
                         courseExamVO.setSortedId(themeEntityRelations.getSortId());
                         courseExamVO.setEntityId(themeEntityRelations.getEntityId());
                         courseExamVO.setEntityType(themeEntityRelations.getEntityType());
+                        courseExamVO.setPreviewable(themeEntityRelations.isPreviewable());
                     }).collect(Collectors.toList());
             entityVOS.addAll(courseResourceVOs);
         }

+ 7 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ThemeLogic.java

@@ -32,6 +32,8 @@ public interface ThemeLogic{
     //list themes
     Page<ThemeDetailVO> getThemeList(Pageable pageable, String keyword, int type);
 
+    List<ThemeDetailVO> getThemeList(Pageable pageable, String keyword);
+
     Page<ThemeDetailVO> getThemeDetailListByOwnerId(Long ownerId, String keyword, Pageable pageable);
 
     // list themeCourseResource
@@ -45,6 +47,8 @@ public interface ThemeLogic{
 
     ThemeVO getTheme(Long id);
 
+    CourseVO getCourse(Long id);
+
     CourseVO getCourse(Long id, Long userId);
 
     Page<CourseVO> getCoursesByThemeIds(Long[] themeIdListByCourse, Pageable pageable, long total, int type);
@@ -80,4 +84,7 @@ public interface ThemeLogic{
     ThemeDetailVO getThemeDetailByThemeId(Long themeId);
 
     ThemeDetailVO deleteThemeDetailById(Long themeId);
+
+    CourseResourceVO getCourseResource(long courseId, long resourceId);
+
 }

+ 12 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ProductProcessLogicImpl.java

@@ -1,8 +1,8 @@
 package cn.iselab.mooctest.site.web.logic.impl;
 
 import cn.iselab.mooctest.site.dao.User2SalesPackageDao;
-import cn.iselab.mooctest.site.service.OpenId2UserIdService;
-import cn.iselab.mooctest.site.service.User2ThemeService;
+import cn.iselab.mooctest.site.models.Theme2Group;
+import cn.iselab.mooctest.site.service.*;
 import cn.iselab.mooctest.site.web.logic.ProductProcessLogic;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -27,6 +27,11 @@ public class ProductProcessLogicImpl implements ProductProcessLogic {
     @Autowired
     private User2SalesPackageDao user2SalesPackageDao;
 
+    @Autowired
+    private GroupService groupService;
+
+    @Autowired
+    private Theme2GroupService theme2GroupService;
 
     @Override
     public boolean sendProduct(JSONObject productDetails) {
@@ -39,8 +44,12 @@ public class ProductProcessLogicImpl implements ProductProcessLogic {
                 JSONObject entity = entities.getJSONObject(i);
                 switch (entity.getString("entityType")){//根据不同Type进行不同处理
                     case "THEME":
-                        if (user2ThemeService.findByUserIdAndThemeId(userId, entity.getLong("entityId"))==null)
+                        if (user2ThemeService.findByUserIdAndThemeId(userId, entity.getLong("entityId"))==null) {
                             user2ThemeService.createRelation(userId, entity.getLong("entityId"));//关联不存在则建立关联
+                            Theme2Group theme2Group = theme2GroupService.findByThemeId(entity.getLong("entityId"));
+                            if (theme2Group != null && !groupService.isUserInGroup(userId, theme2Group.getGroupId()))
+                                groupService.addUserIntoGroup(userId, theme2Group.getGroupId());
+                        }
                         break;
                     case "USERPACKAGE":
                         break;

+ 81 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ThemeLogicImpl.java

@@ -1,6 +1,7 @@
 package cn.iselab.mooctest.site.web.logic.impl;
 
 import cn.iselab.mooctest.site.common.enums.EntityType;
+import cn.iselab.mooctest.site.common.enums.CourseVisibility;
 import cn.iselab.mooctest.site.common.enums.EntityTypeEnum;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.*;
@@ -9,12 +10,15 @@ import cn.iselab.mooctest.site.web.data.*;
 import cn.iselab.mooctest.site.web.data.response.ResponseVO;
 import cn.iselab.mooctest.site.web.data.response.ServerCode;
 import cn.iselab.mooctest.site.web.data.wrapper.*;
+import cn.iselab.mooctest.site.web.exception.HttpForbiddenException;
+import cn.iselab.mooctest.site.web.exception.HttpNotFoundException;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
 import cn.iselab.mooctest.site.web.exception.HttpNotFoundException;
 import cn.iselab.mooctest.site.web.logic.OSSLogic;
 import cn.iselab.mooctest.site.web.logic.ThemeLogic;
 import com.google.common.collect.Lists;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.crypto.hash.Hash;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -74,6 +78,7 @@ public class ThemeLogicImpl implements ThemeLogic {
     private OSSLogic ossLogic;
     @Autowired
     private CourseResourceService courseResourceService;
+
     @Autowired
     private CourseResourceVOWrapper courseResourceVOWrapper;
     @Autowired
@@ -220,6 +225,11 @@ public class ThemeLogicImpl implements ThemeLogic {
         }
     }
 
+    @Override
+    public Page<ThemeDetailVO> getThemeList(Pageable pageable, String keyword, int type) {
+        return null;
+    }
+
     @Async("generateUpload2Oss")
     protected void uploadImages2Oss(String localDir,String parentDir){
         File file = new File(localDir);
@@ -242,9 +252,18 @@ public class ThemeLogicImpl implements ThemeLogic {
     }
 
     @Override
-    public Page<ThemeDetailVO> getThemeList(Pageable pageable, String keyword, int type) {
-        Page<ThemeDetail> themeDetails = themeService.getThemeDetails(pageable, keyword, type);
-        return themeDetails.map(themeVOWrapper::wrapperThemeDetail);
+    public List<ThemeDetailVO> getThemeList(Pageable pageable, String keyword) {
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        List<ThemeDetail> themeDetailList = themeService.getPlatformThemeDetails();
+        themeDetailList.addAll(themeService.getCourseByParticipant(userId).stream()
+                .filter(themeDetail -> themeDetail.getVisibility()== CourseVisibility.NONE_OPEN.getVisibility())
+                .collect(Collectors.toList()));
+        List<ThemeDetailVO> result = themeDetailList.stream()
+                .filter(themeDetail -> themeDetail.getTitle().contains(keyword))
+                .map(themeVOWrapper::wrapperThemeDetail)
+                .collect(Collectors.toList());
+
+        return result;
     }
 
     @Override
@@ -343,6 +362,15 @@ public class ThemeLogicImpl implements ThemeLogic {
     @Override
     public CourseVO getCourse(Long id, Long userId) {
         ThemeDetail themeDetail = themeService.getThemeDetailById(id);
+        userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        //检查用户查看权限
+        if (themeDetail.getVisibility()==CourseVisibility.NONE_OPEN.getVisibility()){
+            Theme2Group t2g = theme2GroupService.findByThemeId(themeDetail.getId());
+            if (!groupService.isUserInGroup(userId,t2g.getGroupId())
+                    && !userId.equals(themeDetail.getOwnerId())){
+                throw new HttpForbiddenException(String.format("User Cannot Access This Course, UserId: %s", userId));
+            }
+        }
         //根据id查询,然后过滤存map
         List<ThemeEntityRelations> themeEntityRelations = themeService.getThemeEntityRelations(id);
         Theme theme = new Theme();
@@ -367,6 +395,38 @@ public class ThemeLogicImpl implements ThemeLogic {
         return courseVO;
     }
 
+    @Override
+    public CourseVO getCourse(Long id) {
+        ThemeDetail themeDetail = themeService.getThemeDetailById(id);
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        //检查用户查看权限
+        if (themeDetail.getVisibility()==CourseVisibility.NONE_OPEN.getVisibility()){
+            Theme2Group t2g = theme2GroupService.findByThemeId(themeDetail.getId());
+            if (!groupService.isUserInGroup(userId,t2g.getGroupId())
+                    && !userId.equals(themeDetail.getOwnerId())){
+                throw new HttpForbiddenException(String.format("User Cannot Access This Course, UserId: %s", userId));
+            }
+        }
+        //根据id查询,然后过滤存map
+        List<ThemeEntityRelations> themeEntityRelations = themeService.getThemeEntityRelations(id);
+        Theme theme = new Theme();
+        theme.setThemeDetail(themeDetail);
+        Map<EntityTypeEnum, List<ThemeEntityRelations>> map = themeEntityRelations.stream().collect(Collectors.groupingBy(ThemeEntityRelations::getEntityType));
+        for (EntityTypeEnum key: map.keySet()) {
+            List<ThemeEntityRelations> tmp = map.get(key);
+            if (key == EntityTypeEnum.EXAM) {
+                List<Exam> examList = examService.getTasks(map.get(key).stream().map(ThemeEntityRelations::getEntityId).collect(Collectors.toList()));
+                theme.setExamList(examList);
+            } else if (key == EntityTypeEnum.COURSE_RESOURCE) {
+                List<Long> courseIds = map.get(key).stream().map(ThemeEntityRelations::getEntityId).collect(Collectors.toList());
+                List<CourseResource> courseResourceList = courseResourceService.getCourseResourceById(courseIds);
+                theme.setCourseResourceList(courseResourceList);
+            }
+        }
+        return themeVOWrapper.wrapTheme2CourseVO(theme,themeEntityRelations);
+    }
+
+
     // 获取themeIds的所有主题课程信息
     @Override
     public Page<CourseVO> getCoursesByThemeIds(Long[] ids, Pageable pageable, long total, int type) {
@@ -454,8 +514,12 @@ public class ThemeLogicImpl implements ThemeLogic {
 
     @Override
     public List<CourseVO> getCourses() {
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
         List<CourseVO> courseVOList = Lists.newArrayList();
-        Iterable<ThemeDetail> themeDetailList = themeService.getThemeDetails();
+        List<ThemeDetail> themeDetailList = themeService.getPlatformThemeDetails();
+        themeDetailList.addAll(themeService.getCourseByParticipant(userId).stream()
+                .filter(themeDetail -> themeDetail.getVisibility()== CourseVisibility.NONE_OPEN.getVisibility())
+                .collect(Collectors.toList()));
         for (ThemeDetail t: themeDetailList) {
             //主题课程类型 存储 exam或者
             List<Exam> examList = themeService.getThemeEntityRelations(t.getId(),EntityTypeEnum.EXAM).
@@ -482,6 +546,19 @@ public class ThemeLogicImpl implements ThemeLogic {
     }
 
     @Override
+    public CourseResourceVO getCourseResource(long courseId, long resourceId) {
+        ThemeEntityRelations themeEntityRelations = themeService
+                .checkRelationBetweenThemeAndEntity(courseId, resourceId, EntityTypeEnum.COURSE_RESOURCE);
+        if (themeEntityRelations == null)
+            throw new HttpNotFoundException("This Course does't contain this resource");
+        if(themeVOWrapper.checkIfProduct(courseId) && !themeVOWrapper.varifyIfPurchase(courseId) && !themeEntityRelations.isPreviewable()){
+            throw new HttpForbiddenException("This Course should buy and resource can't preview");
+        }
+        CourseResource courseResource = courseResourceService.getCourseResourceByResourceId(resourceId);
+        return courseResourceVOWrapper.wrap(courseResource);
+    }
+
+    @Override
     public ThemeInfoVO getThemeInfoByThemeId(Long themeId) {
         ThemeInfoVO themeInfoVO = new ThemeInfoVO();
         ThemeDetail themeDetail = themeService.getThemeDetailById(themeId);

+ 3 - 1
mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/logic/impl/ThemeLogicImplTest.java

@@ -80,9 +80,11 @@ public class ThemeLogicImplTest {
     public void test_getCourseResourceById() {
         CourseResource courseResource = new CourseResource();
         CourseResourceVO courseResourceVO = new CourseResourceVO();
+        ThemeEntityRelations themeEntityRelations = new ThemeEntityRelations();
         when(courseResourceService.getCourseResourceByResourceId(1L)).thenReturn(courseResource);
         when(courseResourceVOWrapper.wrap(courseResource)).thenReturn(courseResourceVO);
-        CourseResourceVO courseResource1 = themeLogic.getCourseResourceById(1L);
+        when(themeService.checkRelationBetweenThemeAndEntity(1L, 1L, EntityTypeEnum.COURSE_RESOURCE)).thenReturn(themeEntityRelations);
+        CourseResourceVO courseResource1 = themeLogic.getCourseResource(1L,1L);
         assertEquals(courseResource.getId(),courseResource1.getId());
     }
 }