Quellcode durchsuchen

教师页面后台逻辑,drools动态加载和分片刷新提高性能

menduo vor 6 Jahren
Ursprung
Commit
efa6e05d52
26 geänderte Dateien mit 630 neuen und 69 gelöschten Zeilen
  1. 12 42
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/DroolsConfiguration.java
  2. 21 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/DroolsDao.java
  3. 15 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/User2ThemeDao.java
  4. 37 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/DroolsRule.java
  5. 35 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/User2Theme.java
  6. 0 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ThemeService.java
  7. 14 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/User2ThemeService.java
  8. 20 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DemoInterface.java
  9. 9 10
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DemoService.java
  10. 122 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DroolsBaseService.java
  11. 20 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DroolsWithDBService.java
  12. 67 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DroolsWithDBServiceImpl.java
  13. 28 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/User2ThemeServiceImpl.java
  14. 16 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/util/DroolsUtils.java
  15. 56 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/DroolsManageController.java
  16. 8 10
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ThemeController.java
  17. 19 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/DroolsRuleVO.java
  18. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/ThemeDetailVO.java
  19. 27 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/DroolsRuleWrapper.java
  20. 12 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/ThemeVOWrapper.java
  21. 21 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/DroolsManagerLogic.java
  22. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ThemeLogic.java
  23. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CaseLogicImpl.java
  24. 57 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/DroolsManagerLogicImpl.java
  25. 9 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ThemeLogicImpl.java
  26. 1 1
      mooctest-site-server/src/main/resources/rules/UserHasTheCase.drl

+ 12 - 42
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/DroolsConfiguration.java

@@ -1,23 +1,27 @@
 package cn.iselab.mooctest.site.configure;
 
-import com.aliyun.oss.OSSClient;
-import com.aliyun.oss.model.PolicyConditions;
+import lombok.extern.slf4j.Slf4j;
+import org.kie.api.KieBase;
 import org.kie.api.KieServices;
-import org.kie.api.builder.KieBuilder;
-import org.kie.api.builder.KieFileSystem;
-import org.kie.api.builder.KieModule;
-import org.kie.api.builder.KieRepository;
+import org.kie.api.builder.KieScanner;
+import org.kie.api.builder.Message;
+import org.kie.api.builder.Results;
+import org.kie.api.io.ResourceType;
 import org.kie.api.runtime.KieContainer;
+import org.kie.api.runtime.KieSession;
 import org.kie.internal.io.ResourceFactory;
+import org.kie.internal.utils.KieHelper;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 import org.springframework.core.io.support.ResourcePatternResolver;
 
+import javax.annotation.PostConstruct;
 import java.io.IOException;
-import java.util.Arrays;
+import java.util.Map;
 
 /**
  * @program: mooctest-site
@@ -26,43 +30,9 @@ import java.util.Arrays;
  * @create: 2019-05-20 13:58
  **/
 @Configuration
+@Slf4j
 public class DroolsConfiguration {
-    private static final String RULES_PATH = "rules/";
 
-    @Bean
-    @ConditionalOnMissingBean(KieContainer.class)
-    public KieContainer kieContainer() throws IOException {
-        KieRepository kieRepository = getKieServices().getRepository();
-        new OSSClient().generatePostPolicy()
-        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
-        KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem()).buildAll();
-        KieModule kieModule = kieBuilder.getKieModule();
-        return getKieServices().newKieContainer(kieModule.getReleaseId());
-    }
-
-    @Bean
-    @ConditionalOnMissingBean(KieFileSystem.class)
-    public KieFileSystem kieFileSystem() throws IOException {
-        KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
-        System.out.println(Arrays.toString(getRulesFiles()));
-        for (Resource r: getRulesFiles()) {
-            System.out.println(r.getFilename());
-            kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH+r.getFilename(), "UTF-8"));
-        }
-
-        return kieFileSystem;
-
-    }
-
-
-    private KieServices getKieServices() {
-        return KieServices.Factory.get();
-    }
-
-    private Resource[] getRulesFiles() throws IOException {
-        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
-        return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
-    }
 
 
 }

+ 21 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/DroolsDao.java

@@ -0,0 +1,21 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.DroolsRule;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-05-29 19:51
+ **/
+@Repository
+public interface DroolsDao extends CrudRepository<DroolsRule, Long> {
+    List<DroolsRule> findAllByDeleted(boolean deleted);
+    List<DroolsRule> findAll();
+    DroolsRule findByBaseNameAndPackageNameAndRuleName(String baseName, String packageName, String ruleName);
+
+}

+ 15 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/User2ThemeDao.java

@@ -0,0 +1,15 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.User2Theme;
+import org.springframework.data.repository.CrudRepository;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-06-03 15:04
+ **/
+public interface User2ThemeDao extends CrudRepository<User2Theme,Long> {
+    User2Theme findByUserIdAndThemeId(long userId,long themeId);
+}
+

+ 37 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/DroolsRule.java

@@ -0,0 +1,37 @@
+package cn.iselab.mooctest.site.models;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-05-29 19:52
+ **/
+@Data
+@Table(name = "drools_rules")
+@Entity
+public class DroolsRule {
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "base_name")
+    private String baseName;
+
+    @Column(name = "package_name")
+    private String packageName;
+
+    @Column(name = "rule_name")
+    private String ruleName;
+
+    @Column(name = "rule")
+    private String rule;
+
+    @Column(name = "deleted")
+    private boolean deleted;
+
+}
+

+ 35 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/User2Theme.java

@@ -0,0 +1,35 @@
+package cn.iselab.mooctest.site.models;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-06-03 15:04
+ **/
+@Data
+@Entity
+@Table(name = "user_2_theme")
+@NoArgsConstructor
+@AllArgsConstructor
+public class User2Theme {
+    @Id
+    @GeneratedValue
+    private long id;
+
+    @Column(name = "user_id")
+    private long userId;
+
+    @Column(name = "theme_id")
+    private long themeId;
+
+    public User2Theme(long userId, long themeId) {
+        this.userId = userId;
+        this.themeId = themeId;
+    }
+}

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

@@ -29,6 +29,4 @@ public interface ThemeService {
     ThemeEntityRelations checkRelationBetweenThemeAndEntity(long themeId, long caseId, EntityTypeEnum entityTypeEnum);
     ThemeEntityRelations addEntity(ThemeEntityRelations themeEntityRelations);
     void rmEntity(long id);
-
-
 }

+ 14 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/User2ThemeService.java

@@ -0,0 +1,14 @@
+package cn.iselab.mooctest.site.service;
+
+import cn.iselab.mooctest.site.models.User2Theme;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-06-03 15:11
+ **/
+public interface User2ThemeService {
+    void createRelation(long userId, long themeId);
+    User2Theme findByUserIdAndThemeId(long userId, long themeId);
+}

+ 20 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DemoInterface.java

@@ -0,0 +1,20 @@
+package cn.iselab.mooctest.site.service.drools;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-06-01 13:56
+ **/
+@FunctionalInterface
+public interface DemoInterface {
+    void hello();
+    default void hello(String name) {
+        System.out.println("hello " + name);
+    }
+
+    static void bye() {
+        System.out.println("bye~");
+    }
+
+}

+ 9 - 10
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DemoService.java

@@ -2,17 +2,14 @@ package cn.iselab.mooctest.site.service.drools;
 
 import cn.iselab.mooctest.site.models.CaseExtends;
 import cn.iselab.mooctest.site.models.User;
-import org.drools.core.base.RuleNameEndsWithAgendaFilter;
-import org.drools.core.base.RuleNameEqualsAgendaFilter;
-import org.kie.api.runtime.KieContainer;
+import org.drools.core.base.RuleNameStartsWithAgendaFilter;
+import org.kie.api.KieBase;
+import org.kie.api.definition.KiePackage;
 import org.kie.api.runtime.KieSession;
-import org.kie.api.runtime.StatelessKieSession;
-import org.kie.api.runtime.rule.AgendaFilter;
-import org.kie.api.runtime.rule.Match;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Arrays;
+import java.util.Collection;
 
 /**
  * @program: mooctest-site
@@ -24,7 +21,7 @@ import java.util.Arrays;
 public class DemoService {
 
     @Autowired
-    private KieContainer kieContainer;
+    private DroolsBaseService droolsBaseService;
 
     public void demo() {
         User user = new User();
@@ -32,10 +29,12 @@ public class DemoService {
         user.setName("hello");
         CaseExtends caseExtends = new CaseExtends();
         caseExtends.setOwnerId(1L);
-        KieSession kieSession =kieContainer.newKieSession();
+        KieBase kieBase = droolsBaseService.getKieBase("hello");
+        KieSession kieSession =kieBase.newKieSession();
+        Collection<KiePackage> packages = kieBase.getKiePackages();
         kieSession.insert(user);
         kieSession.insert(caseExtends);
-        kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("UserHasTheCase"));
+        kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("test"));
         kieSession.dispose();
         //StatelessKieSession statelessKieSession = kieContainer.newStatelessKieSession("UserHasTheCaseKS");
         //statelessKieSession.execute(Arrays.asList(user,caseExtends));

+ 122 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DroolsBaseService.java

@@ -0,0 +1,122 @@
+package cn.iselab.mooctest.site.service.drools;
+
+
+import cn.iselab.mooctest.site.models.DroolsRule;
+import lombok.extern.slf4j.Slf4j;
+import org.kie.api.KieBase;
+import org.kie.api.builder.Message;
+import org.kie.api.builder.Results;
+import org.kie.api.io.ResourceType;
+import org.kie.internal.utils.KieHelper;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-05-29 13:38
+ **/
+@Slf4j
+public abstract class DroolsBaseService {
+
+    protected Map<String, KieBase> kieBaseMap;
+
+    /**
+     *
+     * 获取KieBase
+     * @param base
+     * @return
+     */
+    public KieBase getKieBase(String base) {
+        if(!kieBaseMap.containsKey(base)) {
+            throw new IllegalArgumentException("kieBase不存在");
+        }
+        return kieBaseMap.get(base);
+    }
+
+    /**
+     * 获取所有规则
+     * @return
+     */
+    public abstract Map<String,List<DroolsRule>> getAllRules();
+    public abstract Map<String,List<DroolsRule>> getRulesByBaseList(List<String> bases);
+
+
+    /**
+     * 刷新内存中的规则
+     */
+    public final void refreshAll() {
+        long start = System.currentTimeMillis();
+        log.info("drools规则刷新开始...");
+        Map<String,List<DroolsRule>> map = this.getAllRules();
+        Map<String,KieBase> newKieBaseMap = new ConcurrentHashMap<>();
+        for (String key: map.keySet()) {
+            KieHelper kieHelper = this.newKieHelper(map.get(key).stream().map(DroolsRule::getRule).collect(Collectors.toList()));
+            newKieBaseMap.put(key, kieHelper.build());
+        }
+        this.kieBaseMap = newKieBaseMap;
+        log.info("drools规则刷新结束...,用时:[{}]ms.",System.currentTimeMillis() - start);
+    }
+
+    /**
+     * 局部刷新某个或某几个kieBase
+     * @param bases
+     */
+    public final void refreshBase(List<String> bases) {
+        long start = System.currentTimeMillis();
+        log.info("drools规则刷新开始...");
+        Map<String,List<DroolsRule>> map = this.getRulesByBaseList(bases);
+        for(String base: bases) {
+            List<String> rules = map.get(base).stream().map(DroolsRule::getRule).collect(Collectors.toList());
+            kieBaseMap.put(base,newKieHelper(rules).build());
+        }
+        log.info("drools:[{}]规则刷新结束...,用时:[{}]ms.",Arrays.toString(bases.toArray()),System.currentTimeMillis() - start);
+    }
+
+
+    private KieHelper newKieHelper(List<String> rules) {
+        KieHelper kieHelper = new KieHelper();
+        for(String rule:rules) {
+            kieHelper.addContent(rule, ResourceType.DRL);
+        }
+        Results results = kieHelper.verify();
+        for (Message message : results.getMessages()) {
+            log.error(">> Message ({}): {}", message.getLevel(), message.getText());
+        }
+        if (results.hasMessages(Message.Level.ERROR)) {
+            //最好邮件通知
+            throw new IllegalStateException("KieBase has error can not update success!");
+        }
+        return kieHelper;
+    }
+
+
+
+
+
+    private static String loadRules() {
+        // 从数据库加载的规则
+        String drl = "package rules;\n" +
+                "import cn.iselab.mooctest.site.models.User;\n" +
+                "import cn.iselab.mooctest.site.models.CaseExtends;\n" +
+                "dialect  \"mvel\"\n" +
+                "\n" +
+                "rule \"test\"\n" +
+                "    when\n" +
+                "      $u: User();\n" +
+                "      $e: CaseExtends(ownerId == $u.id);\n" +
+                "    then\n" +
+                "     System.out.println(\"OK!\");\n" +
+                "     System.out.println($u.getName() +\"--可以看见case\");\n" +
+                "end";
+
+
+        return drl;
+
+    }
+}

+ 20 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DroolsWithDBService.java

@@ -0,0 +1,20 @@
+package cn.iselab.mooctest.site.service.drools;
+
+import cn.iselab.mooctest.site.models.DroolsRule;
+
+import java.util.List;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-05-29 20:09
+ **/
+public interface DroolsWithDBService {
+
+    void add(DroolsRule droolsRule);
+    List<DroolsRule> list();
+    void delete(DroolsRule droolsRule);
+    void update(DroolsRule droolsRule);
+
+}

+ 67 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/drools/DroolsWithDBServiceImpl.java

@@ -0,0 +1,67 @@
+package cn.iselab.mooctest.site.service.drools;
+
+import cn.iselab.mooctest.site.dao.DroolsDao;
+import cn.iselab.mooctest.site.models.DroolsRule;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-05-31 17:31
+ **/
+@Service
+@Slf4j
+public class DroolsWithDBServiceImpl extends DroolsBaseService implements DroolsWithDBService {
+
+    @Autowired
+    private DroolsDao droolsDao;
+
+    @PostConstruct
+    public void init() {
+        refreshAll();
+    }
+
+
+    @Override
+    public Map<String, List<DroolsRule>> getAllRules() {
+        return droolsDao.findAllByDeleted(false).stream()
+                .collect(Collectors.groupingBy(DroolsRule::getBaseName));
+    }
+
+    @Override
+    public Map<String, List<DroolsRule>> getRulesByBaseList(List<String> bases) {
+        return droolsDao.findAllByDeleted(false).stream()
+                .filter(droolsRule -> bases.contains(droolsRule.getBaseName()))
+                .collect(Collectors.groupingBy(DroolsRule::getBaseName));
+    }
+
+    @Override
+    public void add(DroolsRule droolsRule) {
+        droolsDao.save(droolsRule);
+    }
+
+    @Override
+    public List<DroolsRule> list() {
+        return droolsDao.findAll();
+    }
+
+    @Override
+    public void delete(DroolsRule droolsRule) {
+        droolsRule.setDeleted(true);
+        droolsDao.save(droolsRule);
+    }
+
+    @Override
+    public void update(DroolsRule droolsRule) {
+        droolsDao.save(droolsRule);
+    }
+}

+ 28 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/User2ThemeServiceImpl.java

@@ -0,0 +1,28 @@
+package cn.iselab.mooctest.site.service.impl;
+
+import cn.iselab.mooctest.site.dao.User2ThemeDao;
+import cn.iselab.mooctest.site.models.User2Theme;
+import cn.iselab.mooctest.site.service.User2ThemeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-06-03 15:13
+ **/
+@Service
+public class User2ThemeServiceImpl implements User2ThemeService {
+    @Autowired
+    private User2ThemeDao user2ThemeDao;
+    @Override
+    public void createRelation(long userId, long themeId) {
+        user2ThemeDao.save(new User2Theme(userId,themeId));
+    }
+
+    @Override
+    public User2Theme findByUserIdAndThemeId(long userId, long themeId) {
+        return user2ThemeDao.findByUserIdAndThemeId(userId,themeId);
+    }
+}

+ 16 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/util/DroolsUtils.java

@@ -0,0 +1,16 @@
+package cn.iselab.mooctest.site.util;
+
+import org.kie.api.KieBase;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-05-29 17:14
+ **/
+@Component
+public class DroolsUtils {
+
+}

+ 56 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/DroolsManageController.java

@@ -0,0 +1,56 @@
+package cn.iselab.mooctest.site.web.ctrl;
+
+import cn.iselab.mooctest.site.common.constant.UrlConstants;
+import cn.iselab.mooctest.site.service.drools.DemoService;
+import cn.iselab.mooctest.site.web.data.DroolsRuleVO;
+import cn.iselab.mooctest.site.web.data.response.ResponseVO;
+import cn.iselab.mooctest.site.web.data.response.ServerCode;
+import cn.iselab.mooctest.site.web.logic.DroolsManagerLogic;
+import cn.iselab.mooctest.site.web.response.ResponseMessage;
+import org.apache.shiro.authz.annotation.RequiresRoles;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-05-30 13:31
+ **/
+@RestController
+public class DroolsManageController {
+
+    @Autowired
+    private DemoService demoService;
+    @Autowired
+    private DroolsManagerLogic droolsManagerLogic;
+
+    @RequiresRoles("manager")
+    @RequestMapping(value = UrlConstants.API + "drools/demo", method = RequestMethod.GET)
+    public void demo() {
+        System.out.println("hello");
+        demoService.demo();
+    }
+
+    @RequiresRoles("manager")
+    @RequestMapping(value = UrlConstants.API + "drools/list", method = RequestMethod.GET)
+    public ResponseVO<List<DroolsRuleVO>> list() {
+        return new ResponseVO<>(ServerCode.SUCCESS,droolsManagerLogic.getDroolsRuleVOList());
+    }
+    @RequiresRoles("manager")
+    @RequestMapping(value = UrlConstants.API + "drools/refresh/all", method = RequestMethod.GET)
+    public  ResponseVO refreshAll() {
+        droolsManagerLogic.refreshAll();
+        return new ResponseVO(ServerCode.SUCCESS);
+    }
+
+    @RequiresRoles("manager")
+    @RequestMapping(value = UrlConstants.API + "drools/refresh", method = RequestMethod.POST)
+    public ResponseVO refresh(@RequestBody List<String> bases) {
+        droolsManagerLogic.refreshBaseList(bases);
+        return new ResponseVO(ServerCode.SUCCESS);
+    }
+
+}

+ 8 - 10
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ThemeController.java

@@ -2,17 +2,14 @@ package cn.iselab.mooctest.site.web.ctrl;
 
 import cn.iselab.mooctest.site.common.constant.Constants;
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
-import cn.iselab.mooctest.site.service.drools.DemoService;
 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.logic.ThemeLogic;
 import com.google.gson.Gson;
-import java.util.List;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
-import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -20,6 +17,8 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @program: mooctest-site
  * @mail: menduo96@gmail.com
@@ -134,13 +133,12 @@ public class ThemeController extends BaseSearchController {
         return null;
     }
 
-
-    @Autowired
-    private DemoService demoService;
-    @RequestMapping(value = UrlConstants.API + "theme/demo", method = RequestMethod.GET)
-    public void demo() {
-        System.out.println("hello");
-        demoService.demo();
+    @RequestMapping(value = UrlConstants.API + "theme/buy/{themeId}", method = RequestMethod.GET)
+    @RequiresPermissions(value = "theme:buy")
+    public ResponseVO buyTheme(@PathVariable("themeId")long themeId) {
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        themeLogic.buyTheme(userId,themeId);
+        return new ResponseVO(ServerCode.SUCCESS);
     }
 
 

+ 19 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/DroolsRuleVO.java

@@ -0,0 +1,19 @@
+package cn.iselab.mooctest.site.web.data;
+
+import lombok.Data;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-05-30 13:35
+ **/
+@Data
+public class DroolsRuleVO {
+    private Long id;
+    private String baseName;
+    private String packageName;
+    private String ruleName;
+    private String rule;
+    private boolean deleted;
+}

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

@@ -14,5 +14,6 @@ public class ThemeDetailVO {
     private String title;
     private long ownerId;
     private String introduce;
+    private boolean hasPurchase;
 
 }

+ 27 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/DroolsRuleWrapper.java

@@ -0,0 +1,27 @@
+package cn.iselab.mooctest.site.web.data.wrapper;
+
+import cn.iselab.mooctest.site.models.DroolsRule;
+import cn.iselab.mooctest.site.web.data.DroolsRuleVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-06-02 22:49
+ **/
+@Service
+public class DroolsRuleWrapper {
+    public DroolsRuleVO wrap(DroolsRule droolsRule) {
+        DroolsRuleVO droolsRuleVO = new DroolsRuleVO();
+        BeanUtils.copyProperties(droolsRule,droolsRuleVO);
+        return droolsRuleVO;
+    }
+
+    public DroolsRule unwrap(DroolsRuleVO droolsRuleVO) {
+        DroolsRule droolsRule = new DroolsRule();
+        BeanUtils.copyProperties(droolsRuleVO,droolsRule);
+        return droolsRule;
+    }
+}

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

@@ -3,9 +3,11 @@ package cn.iselab.mooctest.site.web.data.wrapper;
 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.service.User2ThemeService;
 import cn.iselab.mooctest.site.web.data.CourseVO;
 import cn.iselab.mooctest.site.web.data.ThemeDetailVO;
 import cn.iselab.mooctest.site.web.data.ThemeVO;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -28,6 +30,8 @@ public class ThemeVOWrapper {
     private PaperVOWrapper paperVOWrapper;
     @Autowired
     private CaseExtendsVOWrapper caseExtendsVOWrapper;
+    @Autowired
+    private User2ThemeService user2ThemeService;
 
     public ThemeDetail unWrapperThemeDetail(ThemeDetailVO themeDetailVO) {
         ThemeDetail themeDetail = new ThemeDetail();
@@ -37,10 +41,18 @@ public class ThemeVOWrapper {
 
     public ThemeDetailVO wrapperThemeDetail(ThemeDetail themeDetail) {
         ThemeDetailVO themeDetailVO = new ThemeDetailVO();
+        //是否购买了该主题
         BeanUtils.copyProperties(themeDetail,themeDetailVO);
+        themeDetailVO.setHasPurchase(varifyIfPurchase(themeDetail.getId()));
         return themeDetailVO;
     }
 
+    private boolean varifyIfPurchase(long themeDetailId) {
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        return user2ThemeService.findByUserIdAndThemeId(userId, themeDetailId) != null;
+    }
+
+
 
     public ThemeVO wrapper(Theme theme) {
         ThemeVO themeVO = new ThemeVO();

+ 21 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/DroolsManagerLogic.java

@@ -0,0 +1,21 @@
+package cn.iselab.mooctest.site.web.logic;
+
+import cn.iselab.mooctest.site.web.data.DroolsRuleVO;
+
+import java.util.List;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-06-02 13:56
+ **/
+public interface DroolsManagerLogic {
+
+    List<DroolsRuleVO> getDroolsRuleVOList();
+    void addDroolsRule(DroolsRuleVO droolsRuleVO);
+    void updateDroolsRule(DroolsRuleVO droolsRuleVO);
+    void deleteDroolsRule(long id);
+    void refreshAll();
+    void refreshBaseList(List<String> base);
+}

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

@@ -43,4 +43,6 @@ public interface ThemeLogic{
 
     boolean deleteRelationBetweenThemeAndExam(long themeId, long caseId);
 
+    void buyTheme(long userId,long themeId);
+
 }

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CaseLogicImpl.java

@@ -216,6 +216,7 @@ public class CaseLogicImpl implements CaseLogic {
         caseExtendsVOs.forEach(caseExtendsVO -> caseExtendsVO= visitControlService
             .setVOVisitControlAttr(caseExtendsVO,EntityTypeEnum.CASE,caseExtendsVO.getId()));
         //TODO 这里加个caseExtendsVO的规则校验,拿到userId,caseExtendsVO
+
         return caseExtendsVOs;
     }
 

+ 57 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/DroolsManagerLogicImpl.java

@@ -0,0 +1,57 @@
+package cn.iselab.mooctest.site.web.logic.impl;
+
+import cn.iselab.mooctest.site.service.drools.DroolsWithDBService;
+import cn.iselab.mooctest.site.service.drools.DroolsWithDBServiceImpl;
+import cn.iselab.mooctest.site.web.data.DroolsRuleVO;
+import cn.iselab.mooctest.site.web.data.wrapper.DroolsRuleWrapper;
+import cn.iselab.mooctest.site.web.logic.DroolsManagerLogic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @program: mooctest-site
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2019-06-02 22:45
+ **/
+@Service
+public class DroolsManagerLogicImpl implements DroolsManagerLogic {
+
+    @Autowired
+    private DroolsWithDBServiceImpl droolsWithDBService;
+    @Autowired
+    private DroolsRuleWrapper droolsRuleWrapper;
+
+    @Override
+    public List<DroolsRuleVO> getDroolsRuleVOList() {
+        return droolsWithDBService.list().stream().map(droolsRuleWrapper::wrap).collect(Collectors.toList());
+    }
+
+    @Override
+    public void addDroolsRule(DroolsRuleVO droolsRuleVO) {
+
+    }
+
+    @Override
+    public void updateDroolsRule(DroolsRuleVO droolsRuleVO) {
+
+    }
+
+    @Override
+    public void deleteDroolsRule(long id) {
+
+    }
+
+    @Override
+    public void refreshAll() {
+        droolsWithDBService.refreshAll();
+    }
+
+    @Override
+    public void refreshBaseList(List<String> bases) {
+        droolsWithDBService.refreshBase(bases);
+    }
+}

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

@@ -2,10 +2,7 @@ package cn.iselab.mooctest.site.web.logic.impl;
 
 import cn.iselab.mooctest.site.common.enums.EntityTypeEnum;
 import cn.iselab.mooctest.site.models.*;
-import cn.iselab.mooctest.site.service.CaseService;
-import cn.iselab.mooctest.site.service.ExamService;
-import cn.iselab.mooctest.site.service.PaperService;
-import cn.iselab.mooctest.site.service.ThemeService;
+import cn.iselab.mooctest.site.service.*;
 import cn.iselab.mooctest.site.web.data.*;
 import cn.iselab.mooctest.site.web.data.wrapper.CaseExtendsVOWrapper;
 import cn.iselab.mooctest.site.web.data.wrapper.ExamVOWrapper;
@@ -46,6 +43,8 @@ public class ThemeLogicImpl implements ThemeLogic {
     private ExamService examService;
     @Autowired
     private PaperService paperService;
+    @Autowired
+    private User2ThemeService user2ThemeService;
     @Override
     public ThemeDetailVO newThemeDetail(ThemeDetailVO themeDetailVO) {
         ThemeDetail themeDetail = themeVOWrapper.unWrapperThemeDetail(themeDetailVO);
@@ -171,4 +170,10 @@ public class ThemeLogicImpl implements ThemeLogic {
 
         return courseVOList;
     }
+
+    @Override
+    public void buyTheme(long userId, long themeId) {
+        if(user2ThemeService.findByUserIdAndThemeId(userId,themeId)==null)
+            user2ThemeService.createRelation(userId,themeId);
+    }
 }

+ 1 - 1
mooctest-site-server/src/main/resources/rules/UserHasTheCase.drl

@@ -4,7 +4,7 @@ dialect  "mvel"
 import cn.iselab.mooctest.site.models.User
 import cn.iselab.mooctest.site.models.CaseExtends
 
-rule "UserHasTheCase"
+rule "test1"
     no-loop true
     when
         $u: User()