From f32a53f5534aa9f9a8591e8b197bb1f8acd9e6c0 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Sun, 03 Jul 2022 21:42:36 +0800
Subject: [PATCH] fix cms core

---
 src/main/java/com/xcong/farmer/cms/core/tag/model/Ad.java                                |    2 
 src/main/java/com/xcong/farmer/cms/core/tag/model/Article.java                           |    2 
 src/main/java/com/xcong/farmer/cms/modules/core/controller/CmsCoreController.java        |   32 ++
 src/main/java/com/xcong/farmer/cms/modules/system/entity/DataDictionaryCustom.java       |   22 +
 src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java              |    4 
 src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java                         |   25 ++
 src/main/java/com/xcong/farmer/cms/modules/system/entity/ColumnEntity.java               |   22 +
 src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java                          |    2 
 src/main/java/com/xcong/farmer/cms/modules/system/mapper/ArticleMapper.java              |    3 
 src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java              |   45 +--
 src/main/java/com/xcong/farmer/cms/modules/core/service/ICmsCoreService.java             |   28 ++
 src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java                               |   92 ++++++-
 src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java           |    4 
 src/main/java/com/xcong/farmer/cms/core/handler/ArticleDataParserHandler.java            |   41 +++
 src/main/java/com/xcong/farmer/cms/core/node/PartNode.java                               |   11 
 src/main/java/com/xcong/farmer/cms/configurations/security/WebSecurityConfig.java        |    1 
 src/main/java/com/xcong/farmer/cms/core/tag/model/Columns.java                           |    2 
 src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java                                |   60 +++++
 src/main/java/com/xcong/farmer/cms/core/template/TemplateLoader.java                     |   49 ++++
 src/main/java/com/xcong/farmer/cms/core/tag/model/Column.java                            |    2 
 src/main/resources/mapper/DataDictionaryCustomMapper.xml                                 |   27 ++
 src/main/java/com/xcong/farmer/cms/modules/core/service/impl/CmsCoreServiceImpl.java     |   44 +++
 src/main/java/com/xcong/farmer/cms/modules/system/mapper/CmsTemplateMapper.java          |    7 
 src/main/resources/mapper/ArticleMapper.xml                                              |   14 +
 src/main/java/com/xcong/farmer/cms/core/tag/model/Nav.java                               |    2 
 src/main/java/com/xcong/farmer/cms/core/handler/TemplateCodeDataParserHandler.java       |    4 
 src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java                |    4 
 src/main/java/com/xcong/farmer/cms/modules/system/service/IArticleService.java           |    2 
 /dev/null                                                                                |   66 -----
 src/main/java/com/xcong/farmer/cms/core/template/Configuration.java                      |    4 
 src/main/java/com/xcong/farmer/cms/modules/core/Test.java                                |    8 
 src/main/resources/mapper/CmsTemplateMapper.xml                                          |    5 
 src/main/java/com/xcong/farmer/cms/modules/system/entity/CmsTemplateEntity.java          |   25 ++
 src/main/java/com/xcong/farmer/cms/core/template/Template.java                           |   11 
 src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ArticleServiceImpl.java   |   13 +
 src/main/java/com/xcong/farmer/cms/core/handler/DataParserHandler.java                   |   10 
 src/main/java/com/xcong/farmer/cms/core/tag/model/Child.java                             |    2 
 src/main/java/com/xcong/farmer/cms/core/tag/model/Include.java                           |    2 
 src/main/java/com/xcong/farmer/cms/modules/system/mapper/DataDictionaryCustomMapper.java |   18 +
 39 files changed, 569 insertions(+), 148 deletions(-)

diff --git a/src/main/java/com/xcong/farmer/cms/cms/handler/ArticleDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/cms/handler/ArticleDataParserHandler.java
deleted file mode 100644
index 9e54a40..0000000
--- a/src/main/java/com/xcong/farmer/cms/cms/handler/ArticleDataParserHandler.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.xcong.farmer.cms.cms.handler;
-
-
-import com.xcong.farmer.cms.cms.node.AttrNode;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author wzy
- * @date 2022-06-24
- **/
-public class ArticleDataParserHandler implements DataParserHandler {
-
-    @Override
-    public void dataParser(AttrNode node) {
-        System.out.println("ArticleDataParserHandler");
-        Map<String, Object> map = new HashMap<>();
-        map.put("title", "这是单个文章标题");
-        node.setData(map);
-    }
-}
diff --git a/src/main/java/com/xcong/farmer/cms/cms/handler/DataParserHandler.java b/src/main/java/com/xcong/farmer/cms/cms/handler/DataParserHandler.java
deleted file mode 100644
index 7a3ee0d..0000000
--- a/src/main/java/com/xcong/farmer/cms/cms/handler/DataParserHandler.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.xcong.farmer.cms.cms.handler;
-
-
-import com.xcong.farmer.cms.cms.node.AttrNode;
-
-public interface DataParserHandler {
-
-    void dataParser(AttrNode attrNode);
-
-}
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/TagsEnum.java b/src/main/java/com/xcong/farmer/cms/cms/tag/TagsEnum.java
deleted file mode 100644
index e782e0e..0000000
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/TagsEnum.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.xcong.farmer.cms.cms.tag;
-
-/**
- * @author wzy
- * @date 2022-06-20
- **/
-public enum TagsEnum {
-    INCLUDE("@include", "com.xcong.farmer.cms.cms.tag.model.Include", "com.xcong.farmer.cms.cms.handler.TemplateCodeDataParserHandler",  1),
-    NAV("@nav", "com.xcong.farmer.cms.cms.tag.model.Nav", "com.xcong.farmer.cms.cms.handler.NavDataParserHandler", 2),
-    ARTICLES("@articles", "com.xcong.farmer.cms.cms.tag.model.Articles", "com.xcong.farmer.cms.cms.handler.ArticlesDataParserHandler",2),
-    ARTICLE("@article", "com.xcong.farmer.cms.cms.tag.model.Article", "com.xcong.farmer.cms.cms.handler.ArticleDataParserHandler",2),
-    CHILD("@child", "com.xcong.farmer.cms.cms.tag.model.Child", "com.xcong.farmer.cms.cms.handler.ChildDataParserHandler",2);
-//    AD("@ad", "com.xcong.farmer.cms.cms.tag.model.Ad", "",2),
-//    COLUMNS("@columns", "com.xcong.farmer.cms.cms.tag.model.Columns", "",2),
-//    COLUMN("@column", "com.xcong.farmer.cms.cms.tag.model.Column", "",2);
-
-    private String name;
-
-    private String className;
-
-    private String handler;
-
-    // 标签类型 1-模板标签  2-数据标签
-    // 模板标签 : 该标签可以变为通用模板,在各个页面引入
-    // 数据模板 : 该标签需要注入数据
-    private int type;
-
-    TagsEnum(String name, String className, String handler, int type) {
-        this.name = name;
-        this.className = className;
-        this.type = type;
-        this.handler = handler;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getClassName() {
-        return className;
-    }
-
-    public int getType() {
-        return type;
-    }
-
-    public String getHandler() {
-        return handler;
-    }
-
-    public static TagsEnum getEnumByName(String name) {
-        for (TagsEnum value : values()) {
-            if (name.equals(value.getName())) {
-                return value;
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/src/main/java/com/xcong/farmer/cms/cms/template/TemplateLoader.java b/src/main/java/com/xcong/farmer/cms/cms/template/TemplateLoader.java
deleted file mode 100644
index 154732e..0000000
--- a/src/main/java/com/xcong/farmer/cms/cms/template/TemplateLoader.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.xcong.farmer.cms.cms.template;
-
-import cn.hutool.core.collection.CollUtil;
-import com.xcong.farmer.cms.cms.node.AttrNode;
-import com.xcong.farmer.cms.cms.node.PartNode;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class TemplateLoader {
-
-    private Configuration cfg;
-    private List<Template> templates = new ArrayList<>();
-
-    public TemplateLoader() {}
-
-    public TemplateLoader(Configuration cfg) {
-        this.cfg = cfg;
-    }
-
-    public Template template(File file) {
-        Document document = null;
-        try {
-            document = Jsoup.parse(file, "utf-8");
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        if (document == null) {
-            throw new NullPointerException();
-        }
-
-        Template template = new Template();
-        template.setDocument(document);
-        template.setName(file.getName());
-
-        template.parser();
-        return template;
-    }
-
-    public List<Template> templates(String templatePath) {
-        File files = new File(templatePath);
-        if (files.listFiles() == null) {
-            return null;
-        }
-
-        for (File file : files.listFiles()) {
-            if (file.isDirectory()) {
-                continue;
-            }
-            templates.add(template(file));
-        }
-
-        return templates;
-    }
-
-    public List<Template> templates() {
-        return templates(cfg.getTemplatePath());
-    }
-}
diff --git a/src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java b/src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java
new file mode 100644
index 0000000..cfbfc5b
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java
@@ -0,0 +1,25 @@
+package com.xcong.farmer.cms.configurations;
+
+import com.xcong.farmer.cms.core.template.TemplateConfiguration;
+import com.xcong.farmer.cms.core.template.TemplateLoader;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author wzy
+ * @date 2022-07-03
+ **/
+@Slf4j
+@Configuration
+public class CmsConfig {
+
+    @Bean
+    public TemplateConfiguration templateConfiguration() {
+        log.info("CMS管理系统");
+        TemplateConfiguration cfg = new TemplateConfiguration("/Users/helius/Desktop/court-web", "", "/Users/helius/Desktop/web/output");
+        TemplateLoader loader = new TemplateLoader(cfg);
+        cfg.templateLoader(loader);
+        return cfg;
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/configurations/security/WebSecurityConfig.java b/src/main/java/com/xcong/farmer/cms/configurations/security/WebSecurityConfig.java
index e3de21a..0f63511 100644
--- a/src/main/java/com/xcong/farmer/cms/configurations/security/WebSecurityConfig.java
+++ b/src/main/java/com/xcong/farmer/cms/configurations/security/WebSecurityConfig.java
@@ -43,6 +43,7 @@
                 .authorizeRequests()
                 .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                 .antMatchers("/login").permitAll()
+                .antMatchers("/cms/**").permitAll()
                 .antMatchers("/html").permitAll()
                 .antMatchers("/swagger**/**").permitAll()
                 .antMatchers("/webjars/**").permitAll()
diff --git a/src/main/java/com/xcong/farmer/cms/core/handler/ArticleDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/ArticleDataParserHandler.java
new file mode 100644
index 0000000..b5b5b7f
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/ArticleDataParserHandler.java
@@ -0,0 +1,41 @@
+package com.xcong.farmer.cms.core.handler;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.farmer.cms.core.node.AttrNode;
+import com.xcong.farmer.cms.core.tag.model.Article;
+import com.xcong.farmer.cms.modules.system.entity.ArticleEntity;
+import com.xcong.farmer.cms.modules.system.mapper.ArticleMapper;
+import com.xcong.farmer.cms.utils.SpringContextHolder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author wzy
+ * @date 2022-06-24
+ **/
+public class ArticleDataParserHandler implements DataParserHandler {
+
+    private final ArticleMapper articleMapper = SpringContextHolder.getBean(ArticleMapper.class);
+
+    @Override
+    public void dataParser(AttrNode node) {
+        System.out.println("ArticleDataParserHandler");
+        Article tag = (Article) node.getParam();
+        ArticleEntity data = articleMapper.selectById(tag.getId());
+
+        ArticleEntity prev = articleMapper.selectPrevOrNextArticle(data.getId(), data.getColumnId(), 1);
+        ArticleEntity next = articleMapper.selectPrevOrNextArticle(data.getId(), data.getColumnId(), 2);
+
+        Map map = JSONObject.parseObject(JSONObject.toJSONString(data), Map.class);
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("title", "这是单个文章标题");
+
+        map.put("prev", prev);
+        map.put("next", next);
+        node.setData(map);
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/cms/handler/ArticlesDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java
similarity index 89%
rename from src/main/java/com/xcong/farmer/cms/cms/handler/ArticlesDataParserHandler.java
rename to src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java
index 69a2178..acfed60 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/handler/ArticlesDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java
@@ -1,6 +1,6 @@
-package com.xcong.farmer.cms.cms.handler;
+package com.xcong.farmer.cms.core.handler;
 
-import com.xcong.farmer.cms.cms.node.AttrNode;
+import com.xcong.farmer.cms.core.node.AttrNode;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/src/main/java/com/xcong/farmer/cms/cms/handler/ChildDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java
similarity index 90%
rename from src/main/java/com/xcong/farmer/cms/cms/handler/ChildDataParserHandler.java
rename to src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java
index 5f78333..72c52e1 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/handler/ChildDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java
@@ -1,8 +1,8 @@
-package com.xcong.farmer.cms.cms.handler;
+package com.xcong.farmer.cms.core.handler;
 
 
 import com.alibaba.fastjson.JSONObject;
-import com.xcong.farmer.cms.cms.node.AttrNode;
+import com.xcong.farmer.cms.core.node.AttrNode;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/com/xcong/farmer/cms/core/handler/DataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/DataParserHandler.java
new file mode 100644
index 0000000..b681dd7
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/DataParserHandler.java
@@ -0,0 +1,10 @@
+package com.xcong.farmer.cms.core.handler;
+
+
+import com.xcong.farmer.cms.core.node.AttrNode;
+
+public interface DataParserHandler {
+
+    void dataParser(AttrNode attrNode);
+
+}
diff --git a/src/main/java/com/xcong/farmer/cms/cms/handler/NavDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java
similarity index 91%
rename from src/main/java/com/xcong/farmer/cms/cms/handler/NavDataParserHandler.java
rename to src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java
index 222da87..35e5f18 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/handler/NavDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java
@@ -1,6 +1,6 @@
-package com.xcong.farmer.cms.cms.handler;
+package com.xcong.farmer.cms.core.handler;
 
-import com.xcong.farmer.cms.cms.node.AttrNode;
+import com.xcong.farmer.cms.core.node.AttrNode;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/src/main/java/com/xcong/farmer/cms/cms/handler/TemplateCodeDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/TemplateCodeDataParserHandler.java
similarity index 73%
rename from src/main/java/com/xcong/farmer/cms/cms/handler/TemplateCodeDataParserHandler.java
rename to src/main/java/com/xcong/farmer/cms/core/handler/TemplateCodeDataParserHandler.java
index 10b89d6..5640737 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/handler/TemplateCodeDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/TemplateCodeDataParserHandler.java
@@ -1,6 +1,6 @@
-package com.xcong.farmer.cms.cms.handler;
+package com.xcong.farmer.cms.core.handler;
 
-import com.xcong.farmer.cms.cms.node.AttrNode;
+import com.xcong.farmer.cms.core.node.AttrNode;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java b/src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
similarity index 67%
rename from src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java
rename to src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
index adf7a84..ce47824 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java
+++ b/src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
@@ -1,17 +1,18 @@
-package com.xcong.farmer.cms.cms.node;
+package com.xcong.farmer.cms.core.node;
 
 
+import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.xcong.farmer.cms.cms.handler.DataParserHandler;
-import com.xcong.farmer.cms.cms.tag.TagsEnum;
-import com.xcong.farmer.cms.cms.tag.model.Articles;
-import com.xcong.farmer.cms.cms.template.Configuration;
+import com.xcong.farmer.cms.core.handler.DataParserHandler;
+import com.xcong.farmer.cms.core.tag.TagsEnum;
+import com.xcong.farmer.cms.core.template.Configuration;
 import groovy.lang.Binding;
 import groovy.lang.GroovyShell;
 import org.apache.commons.text.StringSubstitutor;
 import org.jsoup.nodes.Attribute;
 import org.jsoup.nodes.Attributes;
 import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -28,11 +29,14 @@
     private Object data;
     // 用于给这个标签attr注入的数据
     private Map<String, Object> parserData;
+    private Map<String, Object> systemData;
+
     // Tag参数 {id=[1,2,3], page=1, limit=5, field=art}
     private Object param;
 
     private Element element;
     private Element originalElement;
+    private boolean processContinue = true;
 
     public AttrNode() {
     }
@@ -64,7 +68,30 @@
         System.out.println(1);
     }
 
+    private boolean isNeedEmpty() {
+        Elements children = this.element.children();
+        if (CollUtil.isNotEmpty(children)) {
+            return true;
+        }
+        Attributes attributes = this.element.attributes();
+        if (CollUtil.isEmpty(attributes)) {
+            return false;
+        }
+
+        for (Attribute attribute : attributes) {
+            if (attribute.getKey().contains("@") || attribute.getKey().contains("$")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public void parser() {
+        // 判断是否为最小节点,如果是且没有特殊标签,则跳过清空
+        if (!isNeedEmpty()) {
+            return;
+        }
+
         this.element.empty();
         Attributes attributes = this.element.attributes();
         if (attributes.isEmpty()) {
@@ -101,6 +128,9 @@
             }
 
             this.tag = tagsEnum.getName();
+            if (this.data == null) {
+                this.processContinue = false;
+            }
         }
 
         runDataInject();
@@ -127,9 +157,10 @@
 
                 this.element.removeAttr("class");
                 this.element.attr("class", evaluate);
-            } else if (value.startsWith("${")) {
+            } else if (value.contains( "${")) {
 
                 String result = attrValueFormat(value);
+                System.out.println(result);
                 if ("text".equals(key)) {
                     this.element.text(result);
                 } else {
@@ -146,22 +177,41 @@
         Map<String, String> targetData = new HashMap<>();
         while (matcher.find()) {
             String group = matcher.group();
-            String splitValue = group.replaceAll("\\$\\{", "").replaceAll("}", "");
-            String[] split = splitValue.split("\\.");
-            if (split.length == 0) {
-                continue;
-            }
+//            String splitValue = group.replaceAll("\\$\\{", "").replaceAll("}", "");
+//            String[] split = splitValue.split("\\.");
+//            if (split.length == 0) {
+//                continue;
+//            }
+//
+//            for (Map.Entry<String, Object> entry : this.parserData.entrySet()) {
+//                String fieldKey = entry.getKey();
+//                Map<String, Object> data = (Map<String, Object>) entry.getValue();
+//                JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(data.get("state")));
+//
+//                for (Map.Entry<String, Object> map : jsonObject.entrySet()) {
+//                    if (map.getValue() instanceof String) {
+//                        targetData.put(fieldKey + "." + map.getKey(), (String) map.getValue());
+//                    }
+//                }
+//            }
 
+            Binding binding = new Binding();
             for (Map.Entry<String, Object> entry : this.parserData.entrySet()) {
                 String fieldKey = entry.getKey();
                 Map<String, Object> data = (Map<String, Object>) entry.getValue();
-                JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(data.get("state")));
+                binding.setProperty(fieldKey, data.get("state"));
+            }
 
-                for (Map.Entry<String, Object> map : jsonObject.entrySet()) {
-                    if (map.getValue() instanceof String) {
-                        targetData.put(fieldKey + "." + map.getKey(), (String) map.getValue());
-                    }
-                }
+            if (systemData != null) {
+                binding.setProperty("system", systemData);
+            }
+
+            GroovyShell shell = new GroovyShell(binding);
+            Object evaluate = shell.evaluate(group);
+            if (evaluate == null) {
+                targetData.put(group, "");
+            } else {
+                targetData.put(group, evaluate.toString());
             }
         }
 
@@ -200,4 +250,12 @@
     public String getTag() {
         return tag;
     }
+
+    public boolean processContinue() {
+        return processContinue;
+    }
+
+    public void systemData(Map<String, Object> systemData) {
+        this.systemData = systemData;
+    }
 }
diff --git a/src/main/java/com/xcong/farmer/cms/cms/node/PartNode.java b/src/main/java/com/xcong/farmer/cms/core/node/PartNode.java
similarity index 91%
rename from src/main/java/com/xcong/farmer/cms/cms/node/PartNode.java
rename to src/main/java/com/xcong/farmer/cms/core/node/PartNode.java
index 3866f09..cad2a97 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/node/PartNode.java
+++ b/src/main/java/com/xcong/farmer/cms/core/node/PartNode.java
@@ -1,8 +1,8 @@
-package com.xcong.farmer.cms.cms.node;
+package com.xcong.farmer.cms.core.node;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
-import com.xcong.farmer.cms.cms.template.Configuration;
+import com.xcong.farmer.cms.core.template.Configuration;
 import org.jsoup.nodes.Element;
 
 import java.util.HashMap;
@@ -14,10 +14,12 @@
     private Element element;
     private Element originalElement;
     private String html;
+    private Map<String, Object> system;
 
-    public PartNode(Element element) {
+    public PartNode(Element element, Map<String, Object> data) {
         this.element = element.clone();
         this.originalElement = element;
+        this.system = data;
     }
 
     public void parser() {
@@ -26,6 +28,7 @@
 
     public String parser(Element element, Map<String, Object> tagDataMap) {
         AttrNode attrNode = new AttrNode(element, tagDataMap);
+        attrNode.systemData(this.system);
         attrNode.parser();
 //        attrNode.runDataInject();
 
@@ -38,7 +41,7 @@
 
             if (parseData == null) {
                 // 特殊处理。 如果有子节点标签@child,但数据中没有子节点数据,则将该子节点直接删除即直接返回空字符串
-                if (!"@child".equals(attrNode.getTag())) {
+                if (attrNode.processContinue()) {
                     for (Element children : element.children()) {
                         String html = parser(children, tagDataMap);
                         result.append(html);
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java b/src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java
new file mode 100644
index 0000000..24e8f20
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java
@@ -0,0 +1,60 @@
+package com.xcong.farmer.cms.core.tag;
+
+/**
+ * @author wzy
+ * @date 2022-06-20
+ **/
+public enum TagsEnum {
+//    INCLUDE("@include", "com.xcong.farmer.cms.core.tag.model.Include", "com.xcong.farmer.cms.core.handler.TemplateCodeDataParserHandler",  1),
+    NAV("@nav", "com.xcong.farmer.cms.core.tag.model.Nav", "com.xcong.farmer.cms.core.handler.NavDataParserHandler", 2),
+    ARTICLES("@articles", "com.xcong.farmer.cms.core.tag.model.Articles", "com.xcong.farmer.cms.core.handler.ArticlesDataParserHandler",2),
+    ARTICLE("@article", "com.xcong.farmer.cms.core.tag.model.Article", "com.xcong.farmer.cms.core.handler.ArticleDataParserHandler",2),
+    CHILD("@child", "com.xcong.farmer.cms.core.tag.model.Child", "com.xcong.farmer.cms.core.handler.ChildDataParserHandler",2),
+//    AD("@ad", "com.xcong.farmer.cms.core.tag.model.Ad", "",2),
+//    COLUMNS("@columns", "com.xcong.farmer.cms.core.tag.model.Columns", "",2),
+    COLUMN("@column", "com.xcong.farmer.cms.core.tag.model.Column", "",2);
+
+    private String name;
+
+    private String className;
+
+    private String handler;
+
+    // 标签类型 1-模板标签  2-数据标签
+    // 模板标签 : 该标签可以变为通用模板,在各个页面引入
+    // 数据模板 : 该标签需要注入数据
+    private int type;
+
+    TagsEnum(String name, String className, String handler, int type) {
+        this.name = name;
+        this.className = className;
+        this.type = type;
+        this.handler = handler;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public String getHandler() {
+        return handler;
+    }
+
+    public static TagsEnum getEnumByName(String name) {
+        for (TagsEnum value : values()) {
+            if (name.equals(value.getName())) {
+                return value;
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Ad.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Ad.java
similarity index 88%
rename from src/main/java/com/xcong/farmer/cms/cms/tag/model/Ad.java
rename to src/main/java/com/xcong/farmer/cms/core/tag/model/Ad.java
index 4e0f869..779dbf2 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Ad.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Ad.java
@@ -1,4 +1,4 @@
-package com.xcong.farmer.cms.cms.tag.model;
+package com.xcong.farmer.cms.core.tag.model;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Article.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Article.java
similarity index 89%
rename from src/main/java/com/xcong/farmer/cms/cms/tag/model/Article.java
rename to src/main/java/com/xcong/farmer/cms/core/tag/model/Article.java
index a0c72c1..2e865ae 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Article.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Article.java
@@ -1,4 +1,4 @@
-package com.xcong.farmer.cms.cms.tag.model;
+package com.xcong.farmer.cms.core.tag.model;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Articles.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java
similarity index 93%
rename from src/main/java/com/xcong/farmer/cms/cms/tag/model/Articles.java
rename to src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java
index e93e0ef..002f9ce 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Articles.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java
@@ -1,4 +1,4 @@
-package com.xcong.farmer.cms.cms.tag.model;
+package com.xcong.farmer.cms.core.tag.model;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Child.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Child.java
similarity index 89%
rename from src/main/java/com/xcong/farmer/cms/cms/tag/model/Child.java
rename to src/main/java/com/xcong/farmer/cms/core/tag/model/Child.java
index 7ae44fa..fae1d79 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Child.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Child.java
@@ -1,4 +1,4 @@
-package com.xcong.farmer.cms.cms.tag.model;
+package com.xcong.farmer.cms.core.tag.model;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Column.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Column.java
similarity index 93%
rename from src/main/java/com/xcong/farmer/cms/cms/tag/model/Column.java
rename to src/main/java/com/xcong/farmer/cms/core/tag/model/Column.java
index 18b0146..4937df2 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Column.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Column.java
@@ -1,4 +1,4 @@
-package com.xcong.farmer.cms.cms.tag.model;
+package com.xcong.farmer.cms.core.tag.model;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Columns.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Columns.java
similarity index 61%
rename from src/main/java/com/xcong/farmer/cms/cms/tag/model/Columns.java
rename to src/main/java/com/xcong/farmer/cms/core/tag/model/Columns.java
index ed62f0b..1609a6e 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Columns.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Columns.java
@@ -1,4 +1,4 @@
-package com.xcong.farmer.cms.cms.tag.model;
+package com.xcong.farmer.cms.core.tag.model;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Include.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Include.java
similarity index 89%
rename from src/main/java/com/xcong/farmer/cms/cms/tag/model/Include.java
rename to src/main/java/com/xcong/farmer/cms/core/tag/model/Include.java
index 47e9c6a..4d5da63 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Include.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Include.java
@@ -1,4 +1,4 @@
-package com.xcong.farmer.cms.cms.tag.model;
+package com.xcong.farmer.cms.core.tag.model;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Nav.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Nav.java
similarity index 82%
rename from src/main/java/com/xcong/farmer/cms/cms/tag/model/Nav.java
rename to src/main/java/com/xcong/farmer/cms/core/tag/model/Nav.java
index 45e5707..a02713b 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/tag/model/Nav.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Nav.java
@@ -1,4 +1,4 @@
-package com.xcong.farmer.cms.cms.tag.model;
+package com.xcong.farmer.cms.core.tag.model;
 
 /**
  * @author wzy
diff --git a/src/main/java/com/xcong/farmer/cms/cms/template/Configuration.java b/src/main/java/com/xcong/farmer/cms/core/template/Configuration.java
similarity index 96%
rename from src/main/java/com/xcong/farmer/cms/cms/template/Configuration.java
rename to src/main/java/com/xcong/farmer/cms/core/template/Configuration.java
index 76a24e6..f2c97b0 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/template/Configuration.java
+++ b/src/main/java/com/xcong/farmer/cms/core/template/Configuration.java
@@ -1,6 +1,4 @@
-package com.xcong.farmer.cms.cms.template;
-
-import com.xcong.farmer.cms.cms.node.AttrNode;
+package com.xcong.farmer.cms.core.template;
 
 import java.lang.reflect.Field;
 import java.util.HashMap;
diff --git a/src/main/java/com/xcong/farmer/cms/cms/template/Template.java b/src/main/java/com/xcong/farmer/cms/core/template/Template.java
similarity index 82%
rename from src/main/java/com/xcong/farmer/cms/cms/template/Template.java
rename to src/main/java/com/xcong/farmer/cms/core/template/Template.java
index f0a20f0..2b389e0 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/template/Template.java
+++ b/src/main/java/com/xcong/farmer/cms/core/template/Template.java
@@ -1,7 +1,7 @@
-package com.xcong.farmer.cms.cms.template;
+package com.xcong.farmer.cms.core.template;
 
 import cn.hutool.core.collection.CollUtil;
-import com.xcong.farmer.cms.cms.node.PartNode;
+import com.xcong.farmer.cms.core.node.PartNode;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
@@ -22,6 +22,7 @@
     private Document document;
 
     private Map<String, Map<String, Object>> params = new HashMap<>();
+    private Map<String, Object> system;
 
     private List<PartNode> partNodes = new ArrayList<>();
 
@@ -29,7 +30,7 @@
         Elements children = document.body().children();
         if (CollUtil.isNotEmpty(children)) {
             for (Element child : children) {
-                PartNode partNode = new PartNode(child);
+                PartNode partNode = new PartNode(child, this.system);
                 partNode.parser();
 
                 this.add(partNode);
@@ -68,4 +69,8 @@
     public void putParams(String key, Map<String, Object> value) {
         this.params.put(key, value);
     }
+
+    public void systemData(Map<String, Object> data) {
+        this.system = data;
+    }
 }
diff --git a/src/main/java/com/xcong/farmer/cms/cms/template/TemplateConfiguration.java b/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
similarity index 67%
rename from src/main/java/com/xcong/farmer/cms/cms/template/TemplateConfiguration.java
rename to src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
index 4162af3..b951adb 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/template/TemplateConfiguration.java
+++ b/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
@@ -1,8 +1,8 @@
-package com.xcong.farmer.cms.cms.template;
+package com.xcong.farmer.cms.core.template;
 
 import cn.hutool.core.collection.CollUtil;
-import com.xcong.farmer.cms.cms.node.PartNode;
-import com.xcong.farmer.cms.cms.tag.TagsEnum;
+import com.xcong.farmer.cms.core.node.PartNode;
+import com.xcong.farmer.cms.core.tag.TagsEnum;
 import org.jsoup.nodes.Document;
 
 import java.io.File;
@@ -28,25 +28,15 @@
         this.templateLoader = templateLoader;
     }
 
-    public void process() {
+    public void process(Map<String, Object> map, String templateName) {
         if (this.templateLoader == null) {
             throw new RuntimeException("TemplateLoader do not able to be null");
         }
 
-        List<Template> templates = templateLoader.templates();
-
-        if (CollUtil.isEmpty(templates)) {
-            return;
-        }
-
-        for (Template template : templates) {
-            output(template);
-        }
+        this.templateLoader.data(map);
+        output(template(templateName));
     }
 
-    public List<Template> templates() {
-        return this.templateLoader.templates();
-    }
 
     public Template template(String templateName) {
         return template(new File(path(this.templatePath) + templateName));
@@ -60,21 +50,14 @@
         return this.templateLoader.template(file);
     }
 
-    public void columnProcess(Long id, String templateName) {
-        Template template = template(templateName);
-    }
-
-    public void columnProcess(String code, String templateName) {
-
-    }
-
-    public void articleProcess(Long id, String templateName) {
-        Map<String, Map<String, Object>> map = new HashMap<>();
-
-        Map<String, Object> data = new HashMap<>();
-        data.put("id", id);
-        map.put(TagsEnum.ARTICLE.getName(), data);
-    }
+//    public void columnProcess(Map<String, Object> data, String templateName) {
+//        process;
+//    }
+//
+//
+//    public void articleProcess(Map<String, Object> data, String templateName) {
+//        process(data, templateName);
+//    }
 
     public void output(Template template) {
         Document document = template.getDocument();
diff --git a/src/main/java/com/xcong/farmer/cms/core/template/TemplateLoader.java b/src/main/java/com/xcong/farmer/cms/core/template/TemplateLoader.java
new file mode 100644
index 0000000..6eb9068
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/core/template/TemplateLoader.java
@@ -0,0 +1,49 @@
+package com.xcong.farmer.cms.core.template;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class TemplateLoader {
+
+    private Configuration cfg;
+    private List<Template> templates = new ArrayList<>();
+    private Map<String, Object> systemData;
+
+    public TemplateLoader() {}
+
+    public TemplateLoader(Configuration cfg) {
+        this.cfg = cfg;
+    }
+
+    public Template template(File file) {
+        Document document = null;
+        try {
+            document = Jsoup.parse(file, "utf-8");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        if (document == null) {
+            throw new NullPointerException();
+        }
+
+        Template template = new Template();
+        template.setDocument(document);
+        template.setName(file.getName());
+        template.systemData(this.systemData);
+
+        template.parser();
+        return template;
+    }
+
+    public void data(Map<String, Object> systemData) {
+        this.systemData = systemData;
+    }
+
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/core/Test.java b/src/main/java/com/xcong/farmer/cms/modules/core/Test.java
new file mode 100644
index 0000000..ef70753
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/core/Test.java
@@ -0,0 +1,8 @@
+package com.xcong.farmer.cms.modules.core;
+
+/**
+ * @author wzy
+ * @date 2022-07-03
+ **/
+public class Test {
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/core/controller/CmsCoreController.java b/src/main/java/com/xcong/farmer/cms/modules/core/controller/CmsCoreController.java
new file mode 100644
index 0000000..23bc571
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/core/controller/CmsCoreController.java
@@ -0,0 +1,32 @@
+package com.xcong.farmer.cms.modules.core.controller;
+
+import com.xcong.farmer.cms.common.response.Result;
+import com.xcong.farmer.cms.modules.core.service.ICmsCoreService;
+import com.xcong.farmer.cms.modules.system.service.IArticleService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author wzy
+ * @date 2022-07-03
+ **/
+@Slf4j
+@RestController
+@RequestMapping(value = "/cms")
+@Api(value = "CmsCoreController", tags = "CMS核心类")
+public class CmsCoreController {
+
+    @Autowired
+    private IArticleService articleService;
+
+    @ApiOperation(value = "发布文章", notes = "发布文章")
+    @PostMapping(value = "releaseArticle/{id}")
+    public Result releaseArticle(@PathVariable("id") Long id) {
+        articleService.releaseArticle(id);
+        return Result.ok("success");
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/core/service/ICmsCoreService.java b/src/main/java/com/xcong/farmer/cms/modules/core/service/ICmsCoreService.java
new file mode 100644
index 0000000..0611e81
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/core/service/ICmsCoreService.java
@@ -0,0 +1,28 @@
+package com.xcong.farmer.cms.modules.core.service;
+
+public interface ICmsCoreService {
+
+    /**
+     * 文章编译
+     *
+     * @param id
+     * @param templateName
+     */
+    void articleProcess(Long id, String templateName);
+
+    /**
+     * 栏目编译
+     * @param code 栏目代码
+     * @param templateName 模板名称
+     * @param columnOnly 是否只编译当前栏目列表页(如果false,则会编译栏目下所有子栏目或者所有文章)
+     */
+    void columnProcess(String code, String templateName, boolean columnOnly);
+
+    /**
+     * 栏目编译
+     * @param id 栏目ID
+     * @param templateName 模板名称
+     * @param columnOnly 是否只编译当前栏目列表页(如果false,则会编译栏目下所有子栏目或者所有文章)
+     */
+    void columnProcess(Long id, String templateName, boolean columnOnly);
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/core/service/impl/CmsCoreServiceImpl.java b/src/main/java/com/xcong/farmer/cms/modules/core/service/impl/CmsCoreServiceImpl.java
new file mode 100644
index 0000000..5a2579b
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/core/service/impl/CmsCoreServiceImpl.java
@@ -0,0 +1,44 @@
+package com.xcong.farmer.cms.modules.core.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.xcong.farmer.cms.core.template.TemplateConfiguration;
+import com.xcong.farmer.cms.modules.core.service.ICmsCoreService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author wzy
+ * @date 2022-07-03
+ **/
+@Slf4j
+@Service
+public class CmsCoreServiceImpl implements ICmsCoreService {
+
+    @Autowired
+    private TemplateConfiguration cfg;
+
+    @Override
+    public void articleProcess(Long id, String templateName) {
+        Map<String, Object> data = new HashMap<>();
+        data.put("id", id);
+
+        if (StrUtil.isEmpty(templateName)) {
+            templateName = "artile.defualt.html";
+        }
+        cfg.process(data, templateName);
+    }
+
+    @Override
+    public void columnProcess(String code, String templateName, boolean article) {
+
+    }
+
+    @Override
+    public void columnProcess(Long id, String templateName, boolean article) {
+
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/entity/CmsTemplateEntity.java b/src/main/java/com/xcong/farmer/cms/modules/system/entity/CmsTemplateEntity.java
new file mode 100644
index 0000000..8d8dfa1
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/entity/CmsTemplateEntity.java
@@ -0,0 +1,25 @@
+package com.xcong.farmer.cms.modules.system.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.farmer.cms.common.system.base.BaseEntity;
+import lombok.Data;
+
+/**
+ * @author wzy
+ * @date 2022-07-03
+ **/
+@Data
+@TableName("cms_template")
+public class CmsTemplateEntity extends BaseEntity {
+
+    private String name;
+
+    private String path;
+
+    private String code;
+
+    /**
+     * 类型 1-文件 2-代码
+     */
+    private Integer type;
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/entity/ColumnEntity.java b/src/main/java/com/xcong/farmer/cms/modules/system/entity/ColumnEntity.java
index e13666a..99d1b6b 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/entity/ColumnEntity.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/entity/ColumnEntity.java
@@ -9,24 +9,30 @@
  */
 @Data
 @TableName("t_column")
-public class ColumnEntity  extends BaseEntity {
+public class ColumnEntity extends BaseEntity {
     /**
      * 导航栏 - 默认上级类目ID
      */
     public static final Long PARENTID_DEFAULT = 0L;
 
-    //栏目名称
+    // 栏目名称
     private String columnName;
-    //栏目编码
+    // 栏目编码
     private String columnCode;
-    //描述
+    // 描述
     private String remark;
-    //排序
+    // 排序
     private Integer orderNum;
-    //图片
+    // 图片
     private String pic;
-    //上级类目ID
+    // 上级类目ID
     private Long parentId;
-    //所属ID
+    // 所属ID
     private Long companyId;
+
+    // 列表页模板
+    private String listTemplate;
+
+    // 文章页模板
+    private String articleTemplate;
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/entity/DataDictionaryCustom.java b/src/main/java/com/xcong/farmer/cms/modules/system/entity/DataDictionaryCustom.java
new file mode 100644
index 0000000..e437402
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/entity/DataDictionaryCustom.java
@@ -0,0 +1,22 @@
+package com.xcong.farmer.cms.modules.system.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.farmer.cms.common.system.base.BaseEntity;
+import lombok.Data;
+
+/**
+ * @author wzy
+ * @date 2021-09-25
+ **/
+@Data
+@TableName("data_dictionary_custom")
+public class DataDictionaryCustom extends BaseEntity {
+
+    private String type;
+
+    private String code;
+
+    private String value;
+
+    private String description;
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/mapper/ArticleMapper.java b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/ArticleMapper.java
index 277dfb8..d8709fa 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/mapper/ArticleMapper.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/ArticleMapper.java
@@ -6,6 +6,7 @@
 import com.xcong.farmer.cms.modules.system.entity.ArticleEntity;
 import com.xcong.farmer.cms.modules.system.vo.AdminArticleVo;
 import com.xcong.farmer.cms.modules.system.vo.AdminSeeArticleInfoVo;
+import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 
 public interface ArticleMapper extends BaseMapper<ArticleEntity> {
@@ -13,4 +14,6 @@
     IPage<AdminArticleVo> selectAdminArticleInPage(Page<AdminArticleVo> page, @Param("record")ArticleEntity articleEntity);
 
     AdminSeeArticleInfoVo selectAdminArticleByid(@Param("id")Long id);
+
+    ArticleEntity selectPrevOrNextArticle(@Param("id") Long id, @Param("columnId") Long columnId, @Param("type") Integer type);
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/mapper/CmsTemplateMapper.java b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/CmsTemplateMapper.java
new file mode 100644
index 0000000..64d67fb
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/CmsTemplateMapper.java
@@ -0,0 +1,7 @@
+package com.xcong.farmer.cms.modules.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xcong.farmer.cms.modules.system.entity.CmsTemplateEntity;
+
+public interface CmsTemplateMapper extends BaseMapper<CmsTemplateEntity> {
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/mapper/DataDictionaryCustomMapper.java b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/DataDictionaryCustomMapper.java
new file mode 100644
index 0000000..e82bf6b
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/DataDictionaryCustomMapper.java
@@ -0,0 +1,18 @@
+package com.xcong.farmer.cms.modules.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.farmer.cms.modules.system.entity.DataDictionaryCustom;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DataDictionaryCustomMapper extends BaseMapper<DataDictionaryCustom> {
+
+    List<DataDictionaryCustom> selectDicByType(String type);
+
+    DataDictionaryCustom selectDicDataByTypeAndCode(@Param("type") String type, @Param("code") String code);
+
+    int updateDicValueByTypeAndCode(@Param("type") String type, @Param("code") String code, @Param("value") String value);
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/IArticleService.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/IArticleService.java
index 1113a5e..595af44 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/service/IArticleService.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/service/IArticleService.java
@@ -29,4 +29,6 @@
     Result updateIstop(Long id);
 
     Result updateIstopOff(Long id);
+
+    void releaseArticle(Long id);
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ArticleServiceImpl.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ArticleServiceImpl.java
index d2dcdc1..601c2bc 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ArticleServiceImpl.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ArticleServiceImpl.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xcong.farmer.cms.common.response.Result;
+import com.xcong.farmer.cms.modules.core.service.ICmsCoreService;
 import com.xcong.farmer.cms.modules.system.dto.AdminAddArticleDto;
 import com.xcong.farmer.cms.modules.system.dto.AdminArticleDto;
 import com.xcong.farmer.cms.modules.system.dto.AdminDeleteDto;
@@ -21,6 +22,7 @@
 import com.xcong.farmer.cms.modules.system.vo.AdminArticleVo;
 import com.xcong.farmer.cms.modules.system.vo.AdminSeeArticleInfoVo;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -39,6 +41,9 @@
 
     @Resource
     private ColumnMapper columnMapper;
+
+    @Autowired
+    private ICmsCoreService cmsCoreService;
 
     @Override
     public Result getArticleInPage(AdminArticleDto adminArticleDto) {
@@ -231,4 +236,12 @@
         this.baseMapper.updateById(articleEntity);
         return Result.ok("操作成功");
     }
+
+    @Override
+    public void releaseArticle(Long id) {
+        ArticleEntity article = this.baseMapper.selectById(id);
+
+        ColumnEntity column = columnMapper.selectById(article.getColumnId());
+        cmsCoreService.articleProcess(article.getId(), column.getArticleTemplate());
+    }
 }
diff --git a/src/main/resources/mapper/ArticleMapper.xml b/src/main/resources/mapper/ArticleMapper.xml
index 37193fb..3d8f282 100644
--- a/src/main/resources/mapper/ArticleMapper.xml
+++ b/src/main/resources/mapper/ArticleMapper.xml
@@ -33,4 +33,18 @@
         t_article a where id = #{id}
     </select>
 
+    <select id="selectPrevOrNextArticle" resultType="com.xcong.farmer.cms.modules.system.entity.ArticleEntity">
+        select *
+        from t_article a, t_column b
+        where a.id!=#{id} and (a.column_id=b.id or a.column_id=b.parent_id) and a.column_id=#{columnId}
+        <!--上一篇-->
+        <if test="type == 1">
+            order by a.id
+        </if>
+        <!--下一篇-->
+        <if test="type == 2">
+            order by a.id desc
+        </if>
+        limit 1
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/CmsTemplateMapper.xml b/src/main/resources/mapper/CmsTemplateMapper.xml
new file mode 100644
index 0000000..3b8d2c5
--- /dev/null
+++ b/src/main/resources/mapper/CmsTemplateMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.farmer.cms.modules.system.mapper.CmsTemplateMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/DataDictionaryCustomMapper.xml b/src/main/resources/mapper/DataDictionaryCustomMapper.xml
new file mode 100644
index 0000000..fda4d0e
--- /dev/null
+++ b/src/main/resources/mapper/DataDictionaryCustomMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.farmer.cms.modules.system.mapper.DataDictionaryCustomMapper">
+
+    <select id="selectDicByType" resultType="com.xcong.farmer.cms.modules.system.entity.DataDictionaryCustom">
+        select * from data_dictionary_custom where type=#{type}
+    </select>
+
+    <select id="selectDicDataByTypeAndCode" resultType="com.xcong.farmer.cms.modules.system.entity.DataDictionaryCustom">
+        select * from data_dictionary_custom a
+        where a.type=#{type} and a.code=#{code}
+    </select>
+
+    <update id="updateDicValueByTypeAndCode">
+        update data_dictionary_custom
+        set value=#{value}
+        <where>
+            1=1
+            <if test="code != null and code != ''">
+                and code = #{code}
+            </if>
+            <if test="type != null and type != ''">
+                and type = #{type}
+            </if>
+        </where>
+    </update>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1