From 19befbb8b6ba0f12f7fec0e597edd0f9bce3ec0f Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Tue, 12 Jul 2022 11:39:35 +0800
Subject: [PATCH] Merge branch 'master' of http://120.27.238.55:7000/r/farmer-cms

---
 src/main/java/com/xcong/farmer/cms/modules/core/controller/CmsCoreController.java          |   14 
 src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java                |    3 
 src/main/java/com/xcong/farmer/cms/modules/system/entity/ArticleEntity.java                |    8 
 src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeWebSetInfoVo.java             |   31 +
 src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminWebSetController.java    |   31 +
 src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java                            |   13 
 src/main/java/com/xcong/farmer/cms/modules/core/service/ICmsCoreService.java               |    2 
 src/main/java/com/xcong/farmer/cms/modules/system/dto/SetWebSettingDto.java                |   40 +
 src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java             |   20 
 src/main/java/com/xcong/farmer/cms/modules/core/service/impl/CmsCoreServiceImpl.java       |   57 ++
 src/main/java/com/xcong/farmer/cms/core/tag/model/TimeTag.java                             |   28 +
 src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ColumnServiceImpl.java      |   19 
 src/main/resources/mapper/ColumnMapper.xml                                                 |    3 
 src/main/resources/application-test.yml                                                    |    2 
 src/main/java/com/xcong/farmer/cms/modules/system/service/IWebSettingService.java          |   12 
 src/main/java/com/xcong/farmer/cms/core/template/Configuration.java                        |    6 
 src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ArticleServiceImpl.java     |   14 
 src/test/java/com/xcong/farmer/cms/ArticleTest.java                                        |   28 +
 src/test/java/com/xcong/farmer/cms/KssframeworkApplicationTests.java                       |    2 
 src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminColumnController.java    |    4 
 src/main/java/com/xcong/farmer/cms/conversion/WebSettingConversion.java                    |   20 
 src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java                 |   76 +-
 src/main/java/com/xcong/farmer/cms/modules/system/service/IReleaseService.java             |   11 
 src/main/java/com/xcong/farmer/cms/utils/GroovySingleton.java                              |   27 +
 src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ReleaseServiceImpl.java     |  161 +++++-
 src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java                           |    7 
 src/main/java/com/xcong/farmer/cms/modules/system/entity/ColumnEntity.java                 |   15 
 src/main/java/com/xcong/farmer/cms/core/tag/data/ArticleData.java                          |   40 +
 src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/WebSettingServiceImpl.java  |   50 ++
 src/main/java/com/xcong/farmer/cms/modules/system/mapper/ArticleMapper.java                |    2 
 src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/CmsTemplateServiceImpl.java |   93 ++-
 src/main/java/com/xcong/farmer/cms/core/node/Template.java                                 |   22 
 src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java                |   13 
 src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java                                 |   87 +--
 src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeColumnInfoVo.java             |    3 
 src/main/java/com/xcong/farmer/cms/core/handler/ArticleDataParserHandler.java              |   47 +
 src/main/java/com/xcong/farmer/cms/configurations/properties/CmsProperties.java            |   18 
 src/main/resources/mapper/ArticleMapper.xml                                                |   30 +
 src/main/java/com/xcong/farmer/cms/common/utils/FileUtils.java                             |    6 
 src/main/java/com/xcong/farmer/cms/core/handler/ColumnDataParserHandler.java               |   11 
 src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java                  |   15 
 src/main/java/com/xcong/farmer/cms/modules/system/entity/WebSettingEntity.java             |   67 ++
 src/test/java/com/xcong/farmer/cms/TemplateTest.java                                       |   52 ++
 /dev/null                                                                                  |   79 ---
 src/main/java/com/xcong/farmer/cms/conversion/ArticleConversion.java                       |    2 
 src/main/resources/mapper/WebSetMapper.xml                                                 |   27 +
 src/main/java/com/xcong/farmer/cms/modules/system/mapper/ColumnMapper.java                 |    2 
 src/main/java/com/xcong/farmer/cms/modules/system/mapper/WebSetMapper.java                 |   11 
 src/main/resources/application.yml                                                         |   12 
 49 files changed, 1,024 insertions(+), 319 deletions(-)

diff --git a/src/main/java/com/xcong/farmer/cms/common/utils/FileUtils.java b/src/main/java/com/xcong/farmer/cms/common/utils/FileUtils.java
index 32d768d..17c62ad 100644
--- a/src/main/java/com/xcong/farmer/cms/common/utils/FileUtils.java
+++ b/src/main/java/com/xcong/farmer/cms/common/utils/FileUtils.java
@@ -22,10 +22,14 @@
 
     public static String path(String path, String fileName) {
         File file = new File(path);
-        if (!file.isDirectory()){
+        if (file.exists() && !file.isDirectory()){
             return "";
         }
 
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+
         String dir = path(path);
         return dir + fileName;
     }
diff --git a/src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java b/src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java
index 8b5873f..5e2896e 100644
--- a/src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java
+++ b/src/main/java/com/xcong/farmer/cms/configurations/CmsConfig.java
@@ -3,11 +3,15 @@
 import com.xcong.farmer.cms.configurations.properties.CmsProperties;
 import com.xcong.farmer.cms.core.template.TemplateConfiguration;
 import com.xcong.farmer.cms.core.template.TemplateLoader;
+import com.xcong.farmer.cms.modules.system.entity.DataDictionaryCustom;
+import com.xcong.farmer.cms.modules.system.mapper.DataDictionaryCustomMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
 
 /**
  * @author wzy
@@ -23,7 +27,8 @@
     @Bean
     public TemplateConfiguration templateConfiguration() {
         log.info("CMS管理系统");
-        TemplateConfiguration cfg = new TemplateConfiguration(cmsProperties.getTemplatePath(), cmsProperties.getStaticPath(), cmsProperties.getOutputPath(), cmsProperties.getBaseUrl(), cmsProperties.getStaticUrl());
+
+        TemplateConfiguration cfg = new TemplateConfiguration(cmsProperties.getTemplatePath(), cmsProperties.getStaticPath(), cmsProperties.getOutputPath(), cmsProperties.getApiUrl(), cmsProperties.getStaticUrl());
         TemplateLoader loader = new TemplateLoader(cfg);
         cfg.templateLoader(loader);
         return cfg;
diff --git a/src/main/java/com/xcong/farmer/cms/configurations/properties/CmsProperties.java b/src/main/java/com/xcong/farmer/cms/configurations/properties/CmsProperties.java
index 22b0fc9..440a51c 100644
--- a/src/main/java/com/xcong/farmer/cms/configurations/properties/CmsProperties.java
+++ b/src/main/java/com/xcong/farmer/cms/configurations/properties/CmsProperties.java
@@ -3,19 +3,35 @@
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
 
 @Data
 @Configuration
 @ConfigurationProperties(prefix = "cms")
 public class CmsProperties {
 
+    /**
+     * 模板保存地址
+     */
     private String templatePath;
 
+    /**
+     * 静态文件保存地址
+     */
     private String staticPath;
 
+    /**
+     * html输出地址
+     */
     private String outputPath;
 
+    /**
+     * 静态文件访问地址
+     */
     private String staticUrl;
 
-    private String baseUrl;
+    /**
+     * api请求地址
+     */
+    private String apiUrl;
 }
diff --git a/src/main/java/com/xcong/farmer/cms/conversion/ArticleConversion.java b/src/main/java/com/xcong/farmer/cms/conversion/ArticleConversion.java
index cdb6610..9b65930 100644
--- a/src/main/java/com/xcong/farmer/cms/conversion/ArticleConversion.java
+++ b/src/main/java/com/xcong/farmer/cms/conversion/ArticleConversion.java
@@ -18,7 +18,9 @@
     @Mapping(source = "visits", target = "views")
     @Mapping(source = "mainDiagram", target = "thumb")
     @Mapping(source = "releaseTime", target = "createTime")
+    @Mapping(source = "authorBelong", target = "company")
     @Mapping(source = "articleDetails", target = "content")
     @Mapping(source = "uploadFile", target = "filePath")
+    @Mapping(source = "remark", target = "description")
     public abstract ArticleData entityToData(ArticleEntity article);
 }
diff --git a/src/main/java/com/xcong/farmer/cms/conversion/WebSettingConversion.java b/src/main/java/com/xcong/farmer/cms/conversion/WebSettingConversion.java
new file mode 100644
index 0000000..b358a51
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/conversion/WebSettingConversion.java
@@ -0,0 +1,20 @@
+package com.xcong.farmer.cms.conversion;
+
+import com.xcong.farmer.cms.modules.system.dto.SetWebSettingDto;
+import com.xcong.farmer.cms.modules.system.entity.WebSettingEntity;
+import com.xcong.farmer.cms.modules.system.vo.AdminSeeWebSetInfoVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * @author wzy
+ * @date 2022-07-11
+ **/
+@Mapper
+public abstract class WebSettingConversion {
+    public static WebSettingConversion INSTANCE = Mappers.getMapper(WebSettingConversion.class);
+
+    public abstract WebSettingEntity dtoToEntity(SetWebSettingDto setWebSettingDto);
+
+    public abstract AdminSeeWebSetInfoVo entityToVo(WebSettingEntity webSettingEntity);
+}
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
index b5b5b7f..1beb535 100644
--- a/src/main/java/com/xcong/farmer/cms/core/handler/ArticleDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/ArticleDataParserHandler.java
@@ -2,11 +2,15 @@
 
 
 import com.alibaba.fastjson.JSONObject;
+import com.xcong.farmer.cms.configurations.properties.CmsProperties;
+import com.xcong.farmer.cms.conversion.ArticleConversion;
 import com.xcong.farmer.cms.core.node.AttrNode;
+import com.xcong.farmer.cms.core.tag.data.ArticleData;
 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 lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -17,25 +21,48 @@
  * @author wzy
  * @date 2022-06-24
  **/
+@Slf4j
 public class ArticleDataParserHandler implements DataParserHandler {
 
     private final ArticleMapper articleMapper = SpringContextHolder.getBean(ArticleMapper.class);
-
     @Override
     public void dataParser(AttrNode node) {
-        System.out.println("ArticleDataParserHandler");
+        log.info("######文章解析########");
+        String baseUrl = (String) node.getSystemDataValue("baseUrl");
+
         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);
+        ArticleData articleData = ArticleConversion.INSTANCE.entityToData(data);
 
-        Map map = JSONObject.parseObject(JSONObject.toJSONString(data), Map.class);
-//        Map<String, Object> map = new HashMap<>();
-//        map.put("title", "这是单个文章标题");
+        ArticleEntity prevEntity = articleMapper.selectPrevOrNextArticle(data.getId(), data.getColumnId(), 1);
+        if (prevEntity != null) {
+            ArticleData prev = ArticleConversion.INSTANCE.entityToData(prevEntity);
+            if (prevEntity.getType() == 2) {
+                prev.setUrl(prevEntity.getArticleUrl());
+            } else {
+                prev.setUrl(baseUrl + prevEntity.getPath() + "/" + prevEntity.getId() + ".html");
+            }
 
-        map.put("prev", prev);
-        map.put("next", next);
-        node.setData(map);
+            articleData.setPrev(prev);
+        } else {
+            articleData.setPrev(new ArticleData());
+        }
+
+        ArticleEntity nextEntity = articleMapper.selectPrevOrNextArticle(data.getId(), data.getColumnId(), 2);
+        if (nextEntity != null) {
+            ArticleData next = ArticleConversion.INSTANCE.entityToData(nextEntity);
+            if (nextEntity.getType() == 2) {
+                next.setUrl(nextEntity.getArticleUrl());
+            } else {
+                next.setUrl(baseUrl + nextEntity.getPath() + "/" + nextEntity.getId() + ".html");
+            }
+
+            articleData.setNext(next);
+        } else {
+            articleData.setNext(new ArticleData());
+        }
+
+        node.setData(articleData);
     }
 }
diff --git a/src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java
index 9135964..df2f1e9 100644
--- a/src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/ArticlesDataParserHandler.java
@@ -27,20 +27,19 @@
 public class ArticlesDataParserHandler implements DataParserHandler  {
 
     private ArticleMapper articleMapper = SpringContextHolder.getBean(ArticleMapper.class);
-    private CmsProperties cmsProperties = SpringContextHolder.getBean(CmsProperties.class);
 
     @Override
     public void dataParser(AttrNode node) {
         log.info("文章列表解析");
         Long companyId = (Long) node.getSystemDataValue("companyId");
-        Articles param = (Articles) node.getParam();
+        String companyCode = (String) node.getSystemDataValue("companyCode");
+        String baseUrl = (String) node.getSystemDataValue("baseUrl");
 
+        Articles param = (Articles) node.getParam();
         ArticleEntity article = new ArticleEntity();
         Page<ArticleEntity> page = new Page<>(Integer.parseInt(param.getPage()), Integer.parseInt(param.getLimit()));
         if (StrUtil.isEmpty(param.getColId())) {
-
             article.setColumnCode(param.getCode());
-
         } else {
             List<String> colIdsStr = StrUtil.split(param.getColId(), ',');
             List<Long> colIds = new ArrayList<>();
@@ -51,24 +50,31 @@
             article.setColumnIds(colIds);
         }
         article.setCompanyId(companyId);
+
+        if (StrUtil.isNotBlank(param.getType())) {
+            if ("hot".equals(param.getType())) {
+                article.setIsTop(1);
+            }
+        }
+
         IPage<ArticleEntity> listPage = articleMapper.selectArticleInPage(page, article);
 
         List<ArticleData> list = new ArrayList<>();
         for (ArticleEntity record : listPage.getRecords()) {
-            ArticleData articleData = entityToData(record);
+            ArticleData articleData = entityToData(record, baseUrl);
             list.add(articleData);
         }
 
         node.setData(list);
     }
 
-    public ArticleData entityToData(ArticleEntity article) {
+    public ArticleData entityToData(ArticleEntity article, String baseUrl) {
         ArticleData articleData = ArticleConversion.INSTANCE.entityToData(article);
 
         if (article.getType() == 2) {
             articleData.setUrl(article.getArticleUrl());
         } else {
-            articleData.setUrl(cmsProperties.getBaseUrl() + article.getPath() + "/" + article.getId() + ".html");
+            articleData.setUrl(baseUrl + article.getPath() + "/" + article.getId() + ".html");
         }
 
 
diff --git a/src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java
index 94a06e2..7e27891 100644
--- a/src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/ChildDataParserHandler.java
@@ -25,6 +25,9 @@
         String obj = param.getObj();
 
         Object o = parserData.get(obj);
+        if (o == null) {
+            return;
+        }
         Object state = JSONObject.parseObject(JSONObject.toJSONString(o)).get("state");
         List children = JSONObject.parseObject(JSONObject.toJSONString(state)).getObject("children", List.class);
         attrNode.setData(children);
diff --git a/src/main/java/com/xcong/farmer/cms/core/handler/ColumnDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/ColumnDataParserHandler.java
index 99705b7..2a2643f 100644
--- a/src/main/java/com/xcong/farmer/cms/core/handler/ColumnDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/ColumnDataParserHandler.java
@@ -26,12 +26,13 @@
 
     private ColumnMapper columnMapper = SpringContextHolder.getBean(ColumnMapper.class);
     private ArticleMapper articleMapper = SpringContextHolder.getBean(ArticleMapper.class);
-    private CmsProperties cmsProperties = SpringContextHolder.getBean(CmsProperties.class);
 
+    private String baseUrl = "";
     @Override
     public void dataParser(AttrNode attrNode) {
         log.info("栏目解析");
         Long companyId = (Long) attrNode.getSystemDataValue("companyId");
+        baseUrl = (String) attrNode.getSystemDataValue("baseUrl");
 
         Column param = (Column) attrNode.getParam();
 
@@ -42,7 +43,7 @@
         }
         ColumnData columnData = columnToData(columnEntity);
         if (columnEntity.getParentId() == 0L) {
-            List<ColumnEntity> child = columnMapper.selectColumnByParentId(columnEntity.getId(), companyId);
+            List<ColumnEntity> child = columnMapper.selectColumnByParentId(columnEntity.getId(), companyId, 1);
             if (CollUtil.isNotEmpty(child)) {
                 List<ColumnData> list = new ArrayList<>();
                 for (ColumnEntity entity : child) {
@@ -59,14 +60,14 @@
     public ColumnData columnToData(ColumnEntity column) {
         ColumnData columnData = ColumnConversion.INSTANCE.entityToData(column);
 
-        columnData.setUrl(cmsProperties.getBaseUrl() + column.getPath());
+        columnData.setUrl(baseUrl + column.getPath());
         if (column.getType() == 2) {
             if (column.getTargetType() == 1) {
                 ArticleEntity article = this.articleMapper.selectArticleById(Long.parseLong(column.getTargetUrl()));
-                columnData.setUrl(cmsProperties.getBaseUrl() + article.getPath() + "/" + article.getId() + ".html");
+                columnData.setUrl(baseUrl + article.getPath() + "/" + article.getId() + ".html");
             } else if (column.getTargetType() == 2) {
                 ColumnEntity columnEntity = this.columnMapper.selectByCodeAndCompanyId(column.getTargetUrl(), column.getCompanyId());
-                columnData.setUrl(cmsProperties.getBaseUrl() + columnEntity.getPath());
+                columnData.setUrl(baseUrl + columnEntity.getPath());
             } else {
                 columnData.setUrl(column.getTargetUrl());
             }
diff --git a/src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java
index b50a231..fbb19e3 100644
--- a/src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/NavDataParserHandler.java
@@ -28,14 +28,15 @@
 
     private ColumnMapper columnMapper = SpringContextHolder.getBean(ColumnMapper.class);
     private ArticleMapper articleMapper = SpringContextHolder.getBean(ArticleMapper.class);
-    private CmsProperties cmsProperties = SpringContextHolder.getBean(CmsProperties.class);
 
+    private String baseUrl = "";
     @Override
     public void dataParser(AttrNode node) {
         log.info("导航栏解析");
         Long companyId = (Long) node.getSystemDataValue("companyId");
+        baseUrl = (String) node.getSystemDataValue("baseUrl");
 
-        List<ColumnEntity> columns = columnMapper.selectColumnByParentId(0L, companyId);
+        List<ColumnEntity> columns = columnMapper.selectColumnByParentId(0L, companyId, 1);
 
         if (CollUtil.isEmpty(columns)) {
             return;
@@ -45,14 +46,14 @@
 
         NavData index = new NavData();
         index.setTitle("首页");
-        index.setUrl(cmsProperties.getBaseUrl());
+        index.setUrl(baseUrl);
         index.setCode("index");
         list.add(index);
 
         for (ColumnEntity column : columns) {
             NavData navData = columnToNav(column);
 
-            List<ColumnEntity> child = columnMapper.selectColumnByParentId(column.getId(), companyId);
+            List<ColumnEntity> child = columnMapper.selectColumnByParentId(column.getId(), companyId, 1);
             if (CollUtil.isNotEmpty(child)) {
                 List<NavData> childNavData = columnsToNavs(child);
                 navData.setChildren(childNavData);
@@ -75,14 +76,14 @@
     public NavData columnToNav(ColumnEntity column) {
         NavData navData = ColumnConversion.INSTANCE.columnToNav(column);
 
-        navData.setUrl(cmsProperties.getBaseUrl() + column.getPath());
+        navData.setUrl(baseUrl + column.getPath());
         if (column.getType() == 2) {
             if (column.getTargetType() == 1) {
                 ArticleEntity article = this.articleMapper.selectArticleById(Long.parseLong(column.getTargetUrl()));
-                navData.setUrl(cmsProperties.getBaseUrl() + article.getPath() + "/" + article.getId() + ".html");
+                navData.setUrl(baseUrl + article.getPath() + "/" + article.getId() + ".html");
             } else if (column.getTargetType() == 2) {
                 ColumnEntity columnEntity = this.columnMapper.selectByCodeAndCompanyId(column.getTargetUrl(), column.getCompanyId());
-                navData.setUrl(cmsProperties.getBaseUrl() + columnEntity.getPath());
+                navData.setUrl(baseUrl + columnEntity.getPath());
             } else {
                 navData.setUrl(column.getTargetUrl());
             }
diff --git a/src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java
index 4b97d98..e49892f 100644
--- a/src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java
@@ -27,57 +27,59 @@
 public class PageDataParserHandler implements DataParserHandler {
 
     private ArticleMapper articleMapper = SpringContextHolder.getBean(ArticleMapper.class);
-    private CmsProperties cmsProperties = SpringContextHolder.getBean(CmsProperties.class);
     @Override
     public void dataParser(AttrNode attrNode) {
         log.info("分页解析");
-        Template.HAS_PAGING = true;
+        synchronized (this) {
+            Template.HAS_PAGING = true;
+            String baseUrl = (String) attrNode.getSystemDataValue("baseUrl");
 
-        Long companyId = (Long) attrNode.getSystemDataValue("companyId");
-        Pagination param = (Pagination) attrNode.getParam();
+            Long companyId = (Long) attrNode.getSystemDataValue("companyId");
+            Pagination param = (Pagination) attrNode.getParam();
 
-        Page<ArticleEntity> page = new Page<>(Integer.parseInt(param.getPage()), Integer.parseInt(param.getLimit()));
-        ArticleEntity article = new ArticleEntity();
-        article.setColumnCode(param.getCode());
-        article.setCompanyId(companyId);
-        IPage<ArticleEntity> pageList = articleMapper.selectArticleInPage(page, article);
+            Page<ArticleEntity> page = new Page<>(Integer.parseInt(param.getPage()), Integer.parseInt(param.getLimit()));
+            ArticleEntity article = new ArticleEntity();
+            article.setColumnCode(param.getCode());
+            article.setCompanyId(companyId);
+            IPage<ArticleEntity> pageList = articleMapper.selectArticleInPage(page, article);
 
-        PageData pageData = new PageData();
-        pageData.setTotalPage((int) pageList.getPages());
-        pageData.setIndex(Integer.parseInt(param.getPage()));
-        pageData.setTotalCnt((int) pageList.getSize());
+            PageData pageData = new PageData();
+            pageData.setTotalPage((int) pageList.getPages());
+            pageData.setIndex(Integer.parseInt(param.getPage()));
+            pageData.setTotalCnt((int) pageList.getSize());
 
-        if (CollUtil.isNotEmpty(pageList.getRecords())) {
-            String path = cmsProperties.getBaseUrl() + "/" + param.getCode();
-            String filename = "index_{}.html";
+            if (CollUtil.isNotEmpty(pageList.getRecords())) {
+                String path = baseUrl + "/" + param.getCode();
+                String filename = "index_{}.html";
 
-            List<PageChildData> list = new ArrayList<>();
-            int pageNo = Integer.parseInt(param.getPage());
+                List<PageChildData> list = new ArrayList<>();
+                int pageNo = Integer.parseInt(param.getPage());
 
-            // 计算出页面显示分页的最大和最小值
-            int[] startAndEnd = pageStartAndEnd(pageNo, (int) pageList.getPages(), Integer.parseInt(param.getSize()));
-            for (int i = startAndEnd[0]; i <= startAndEnd[1] ; i++) {
-                PageChildData child = new PageChildData();
-                child.setIndex(i);
-                if (pageNo == 1) {
-                    child.setPath(path + "/index.html");
-                } else {
-                    child.setPath(path + "/" + StrUtil.format(filename, i));
+                // 计算出页面显示分页的最大和最小值
+                int[] startAndEnd = pageStartAndEnd(pageNo, (int) pageList.getPages(), Integer.parseInt(param.getSize()));
+                for (int i = startAndEnd[0]; i <= startAndEnd[1]; i++) {
+                    PageChildData child = new PageChildData();
+                    child.setIndex(i);
+                    if (pageNo == 1) {
+                        child.setPath(path + "/index.html");
+                    } else {
+                        child.setPath(path + "/" + StrUtil.format(filename, i));
+                    }
+                    list.add(child);
                 }
-                list.add(child);
+
+                pageData.setChildren(list);
+            } else {
+                pageData.setNext("javascript:void(0)");
+                pageData.setPrev("javascript:void(0)");
             }
 
-            pageData.setChildren(list);
-        } else {
-            pageData.setNext("javascript:void(0)");
-            pageData.setPrev("javascript:void(0)");
-        }
+            if (Integer.parseInt(param.getPage()) >= pageList.getPages()) {
+                Template.HAS_PAGING = false;
+            }
 
-        if (Integer.parseInt(param.getPage()) == pageList.getPages()) {
-            Template.HAS_PAGING = false;
+            attrNode.setData(pageData);
         }
-
-        attrNode.setData(pageData);
     }
 
     /**
diff --git a/src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java b/src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
index c85e75e..436b082 100644
--- a/src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
+++ b/src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
@@ -2,20 +2,28 @@
 
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.xcong.farmer.cms.core.handler.DataParserHandler;
 import com.xcong.farmer.cms.core.tag.TagsEnum;
+import com.xcong.farmer.cms.core.tag.model.TimeTag;
 import com.xcong.farmer.cms.core.template.Configuration;
 import com.xcong.farmer.cms.core.template.TemplateConfiguration;
+import com.xcong.farmer.cms.utils.GroovySingleton;
 import groovy.lang.Binding;
 import groovy.lang.GroovyShell;
+import groovy.lang.Script;
 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.time.format.DateTimeFormatter;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Matcher;
@@ -72,32 +80,7 @@
         return false;
     }
 
-    public void staticPath() {
-        // 设置img的链接访问
-        if ("img".equals(this.element.tagName())) {
-            String src = this.element.attr("src");
-            if (StrUtil.isNotBlank(STATIC_URL)) {
-                this.element.attr("src", STATIC_URL + src);
-            }
-        }
-
-        if ("link".equals(this.element.tagName())) {
-            String src = this.element.attr("href");
-            if (StrUtil.isNotBlank(STATIC_URL)) {
-                this.element.attr("href", STATIC_URL + src);
-            }
-        }
-
-        if ("script".equals(this.element.tagName())) {
-            String src = this.element.attr("src");
-            if (StrUtil.isNotBlank(STATIC_URL)) {
-                this.element.attr("src", STATIC_URL + src);
-            }
-        }
-    }
-
     public void parser() {
-        staticPath();
         // 判断是否为最小节点,如果是且没有特殊标签,则跳过清空
         if (!isNeedEmpty()) {
             return;
@@ -145,6 +128,7 @@
             }
         }
 
+
         runDataInject();
     }
 
@@ -158,15 +142,17 @@
             String key = attribute.getKey().replaceAll("\\$", "");
             String value = attribute.getValue();
 
+            String result = attrValueFormat(value);
             // @{} 为java表达式; ${}为需要注入的数据项
             if (value.startsWith("@{")) {
-                value = value.replaceAll("\\@\\{", "").replaceAll("}", "");
+                value = result.replaceAll("\\@\\{", "").replaceAll("}", "");
                 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();
-                    binding.setProperty(fieldKey, data);
-                    binding.setVariable(fieldKey + ".index", 1);
+                    binding.setProperty(fieldKey, data.get("state"));
+                    int index = (int) data.get("index");
+                    binding.setVariable( "index", index);
                 }
                 GroovyShell shell = new GroovyShell(binding);
                 String evaluate = (String) shell.evaluate(value);
@@ -174,9 +160,14 @@
                 this.element.removeAttr("class");
                 this.element.attr("class", evaluate);
             } else if (value.contains( "${")) {
-                String result = attrValueFormat(value);
                 if ("text".equals(key)) {
                     this.element.text(result);
+                } else if ("html".equals(key)) {
+                    this.element.html(result);
+                } else if ("time".equals(key)) {
+                    TimeTag time = parserTag(result, TimeTag.class);
+                    String timeStr = DateUtil.format(DateUtil.parse(time.getDate(), DatePattern.NORM_DATETIME_PATTERN), time.getFormat());
+                    this.element.text(timeStr);
                 } else {
                     this.element.attr(key, result);
                 }
@@ -191,24 +182,8 @@
         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;
-//            }
-//
-//            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());
-//                    }
-//                }
-//            }
 
+            GroovyShell groovyShell = GroovySingleton.getSingleton();
             Binding binding = new Binding();
             for (Map.Entry<String, Object> entry : this.parserData.entrySet()) {
                 String fieldKey = entry.getKey();
@@ -220,12 +195,20 @@
                 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());
+            synchronized (this) {
+                Script parse = groovyShell.parse(group);
+                parse.setBinding(binding);
+                Object evaluate = parse.run();
+                if (evaluate instanceof Date) {
+                    evaluate = DateUtil.format((Date) evaluate, DatePattern.NORM_DATETIME_PATTERN);
+                }
+
+                if (evaluate == null) {
+                    targetData.put(group, "");
+                } else {
+                    targetData.put(group, evaluate.toString());
+                }
+                groovyShell.getClassLoader().clearCache();
             }
         }
 
diff --git a/src/main/java/com/xcong/farmer/cms/core/node/Template.java b/src/main/java/com/xcong/farmer/cms/core/node/Template.java
index e1ef6e0..ab9b54e 100644
--- a/src/main/java/com/xcong/farmer/cms/core/node/Template.java
+++ b/src/main/java/com/xcong/farmer/cms/core/node/Template.java
@@ -31,7 +31,7 @@
 
     // 页面中包含的标签
     public static Set<String> TAGS;
-    public static boolean HAS_PAGING = false;
+    public volatile static boolean HAS_PAGING = false;
 
     public Template() {
         TAGS = new HashSet<>();
@@ -70,8 +70,20 @@
             if (!new Integer(1).equals(page)) {
                 this.name = name + "_" + page;
             }
-        } else {
-
+        } else if ("search".equals(templateType)){
+            Object templateName = system.get("templateName");
+            if (templateName != null) {
+                this.name = String.valueOf(templateName);
+            } else {
+                this.name = "search";
+            }
+        } else if ("message".equals(templateType)) {
+            Object templateName = system.get("templateName");
+            if (templateName != null) {
+                this.name = String.valueOf(templateName);
+            } else {
+                this.name = "message";
+            }
         }
 
     }
@@ -97,7 +109,7 @@
             sb.append(partNode.getHtml());
         }
         document = Jsoup.parse(sb.toString());
-        String outPath = path(outputPath);
+        String outPath = path(outputPath) + system.get("companyCode");
 
         String html = document.html();
         try {
@@ -107,7 +119,7 @@
                 file.mkdirs();
             }
 
-            FileOutputStream outputStream = new FileOutputStream(path +this.name + suffix);
+            FileOutputStream outputStream = new FileOutputStream(path + this.name + suffix);
             outputStream.write(html.getBytes());
             outputStream.close();
         } catch (IOException e) {
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/data/ArticleData.java b/src/main/java/com/xcong/farmer/cms/core/tag/data/ArticleData.java
index d0d345d..37f9d8f 100644
--- a/src/main/java/com/xcong/farmer/cms/core/tag/data/ArticleData.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/data/ArticleData.java
@@ -28,11 +28,43 @@
 
     private String views;
 
+    private String company;
+
     private String filePath;
 
     private List<String> images;
 
     private String url;
+
+    private String description;
+
+    private ArticleData next;
+
+    private ArticleData prev;
+
+    public String getCompany() {
+        return company;
+    }
+
+    public void setCompany(String company) {
+        this.company = company;
+    }
+
+    public ArticleData getNext() {
+        return next;
+    }
+
+    public void setNext(ArticleData next) {
+        this.next = next;
+    }
+
+    public ArticleData getPrev() {
+        return prev;
+    }
+
+    public void setPrev(ArticleData prev) {
+        this.prev = prev;
+    }
 
     public String getFilePath() {
         return filePath;
@@ -121,4 +153,12 @@
     public void setViews(String views) {
         this.views = views;
     }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
 }
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java
index 509e369..d7cc322 100644
--- a/src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Articles.java
@@ -28,6 +28,11 @@
 
     private String field;
 
+    /**
+     * hot-热点
+     */
+    private String type;
+
     public String getColId() {
         return colId;
     }
@@ -67,4 +72,12 @@
     public void setField(String field) {
         this.field = field;
     }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 }
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/model/TimeTag.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/TimeTag.java
new file mode 100644
index 0000000..069d80f
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/TimeTag.java
@@ -0,0 +1,28 @@
+package com.xcong.farmer.cms.core.tag.model;
+
+/**
+ * @author wzy
+ * @date 2022-07-09
+ **/
+public class TimeTag {
+
+    private String date;
+
+    private String format;
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getFormat() {
+        return format;
+    }
+
+    public void setFormat(String format) {
+        this.format = format;
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/core/template/Configuration.java b/src/main/java/com/xcong/farmer/cms/core/template/Configuration.java
index 766240b..ade1636 100644
--- a/src/main/java/com/xcong/farmer/cms/core/template/Configuration.java
+++ b/src/main/java/com/xcong/farmer/cms/core/template/Configuration.java
@@ -6,7 +6,7 @@
 
 public abstract class Configuration {
 
-    protected static String BASE_URL;
+    protected static String API_URL;
     protected static String STATIC_URL;
     protected static String staticPath;
     protected static String templatePath;
@@ -15,11 +15,11 @@
     public Configuration() {
     }
 
-    public Configuration(String templatePath, String staticPath, String outputPath, String baseUrl, String staticUrl) {
+    public Configuration(String templatePath, String staticPath, String outputPath, String apiUrl, String staticUrl) {
         Configuration.staticPath = staticPath;
         Configuration.templatePath = templatePath;
         Configuration.outputPath = outputPath;
-        Configuration.BASE_URL = baseUrl;
+        Configuration.API_URL = apiUrl;
         Configuration.STATIC_URL = staticUrl;
     }
 
diff --git a/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java b/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
index 7dbc81c..22ac0dc 100644
--- a/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
+++ b/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
@@ -1,7 +1,9 @@
 package com.xcong.farmer.cms.core.template;
 
+import com.xcong.farmer.cms.common.utils.FileUtils;
 import com.xcong.farmer.cms.core.node.PartNode;
 import com.xcong.farmer.cms.core.node.Template;
+import lombok.extern.slf4j.Slf4j;
 import org.jsoup.nodes.Document;
 
 import java.io.File;
@@ -14,6 +16,7 @@
  * @author wzy
  * @date 2022-07-01
  **/
+@Slf4j
 public class TemplateConfiguration extends Configuration{
 
     private TemplateLoader templateLoader;
@@ -30,9 +33,13 @@
         if (this.templateLoader == null) {
             throw new RuntimeException("TemplateLoader do not able to be null");
         }
+        map.put("apiUrl", API_URL);
 
+        String companyCode = (String) map.get("companyCode");
+
+        log.info("解析开始执行--#类型:{}#--#模板名称:{}#--#ID:{}#", map.get("templateType"), templateName, map.get("id"));
         this.templateLoader.data(map);
-        Template template = template(templateName);
+        Template template = template(FileUtils.path(templatePath, companyCode), templateName);
         template.output(outputPath);
 
         // 判断是否有分页,有则执行。从第二页开始
@@ -40,13 +47,13 @@
         while(Template.HAS_PAGING) {
             map.put("page", i);
             this.templateLoader.data(map);
-            Template pageTemplate = template(templateName);
+            Template pageTemplate = template(FileUtils.path(templatePath, companyCode), templateName);
             pageTemplate.output(outputPath);
             i++;
         }
     }
 
-    public Template template(String templateName) {
+    public Template template(String templatePath, String templateName) {
         return template(new File(path(templatePath) + templateName));
     }
 
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
index 0212677..f65150f 100644
--- 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
@@ -4,6 +4,7 @@
 import com.xcong.farmer.cms.modules.core.service.ICmsCoreService;
 import com.xcong.farmer.cms.modules.system.service.IArticleService;
 import com.xcong.farmer.cms.modules.system.service.IReleaseService;
+import com.xcong.farmer.cms.modules.system.util.LoginUserUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -17,7 +18,7 @@
  **/
 @Slf4j
 @RestController
-@RequestMapping(value = "/cms")
+@RequestMapping(value = "/api")
 @Api(value = "CmsCoreController", tags = "CMS核心类")
 public class CmsCoreController {
 
@@ -27,21 +28,26 @@
     @ApiOperation(value = "发布文章", notes = "发布文章")
     @PostMapping(value = "releaseArticle/{id}")
     public Result releaseArticle(@PathVariable("id") Long id) {
-        releaseService.releaseArticle(id);
+        Long companyId = LoginUserUtil.getCompanyId();
+        releaseService.releaseArticle(id, companyId);
         return Result.ok("success");
     }
 
     @ApiOperation(value = "发布栏目", notes = "发布栏目")
     @PostMapping(value = "releaseColumn/{type}/{id}")
     public Result releaseColumn(@PathVariable("id") Long id, @PathVariable("type") Integer type) {
-        releaseService.releaseColumn(id, type);
+        Long companyId = LoginUserUtil.getCompanyId();
+        releaseService.releaseColumn(id, type, companyId);
         return Result.ok("success");
     }
 
     @ApiOperation(value = "发布首页", notes = "发布首页")
     @PostMapping(value = "/releaseIndex")
     public Result releaseIndex() {
-        releaseService.releaseIndex();
+        Long companyId = LoginUserUtil.getCompanyId();
+        releaseService.releaseIndex(companyId, true);
         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
index 08b0e1e..9eceba7 100644
--- 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
@@ -38,4 +38,6 @@
 
     void indexProcess(Map<String, Object> map, String templateName);
 
+    void process(Map<String, Object> map, String templateType, String templateName);
+
 }
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
index a405ee4..21dd11e 100644
--- 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
@@ -4,6 +4,7 @@
 import cn.hutool.core.util.StrUtil;
 import com.xcong.farmer.cms.core.template.TemplateConfiguration;
 import com.xcong.farmer.cms.modules.core.service.ICmsCoreService;
+import com.xcong.farmer.cms.modules.system.mapper.WebSetMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -28,17 +29,26 @@
     @Autowired
     private TemplateConfiguration cfg;
 
+    @Autowired
+    private WebSetMapper webSetMapper;
+
 
     @Override
     public void articleProcess(Map<String, Object> data, String templateName, String templatePath) {
         data.put("templateType", "article");
         data.put("templatePath", templatePath);
         data.put("templateName", data.get("id"));
+        globalData(data);
         if (StrUtil.isEmpty(templateName)) {
             templateName = "defualt.article.html";
         }
 
-        cfg.process(data, templateName);
+        try {
+            cfg.process(data, templateName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("发布文章出错", e);
+        }
     }
 
     @Override
@@ -69,19 +79,60 @@
     public void columnProcess(Map<String, Object> data, String templateName) {
         data.put("templateType", "column");
         data.put("page", 1);
+        globalData(data);
         if (StrUtil.isEmpty(templateName)) {
             templateName = "defualt.list.html";
         }
 
-        cfg.process(data, templateName);
+        try {
+            cfg.process(data, templateName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("发布栏目错误", e);
+        }
     }
 
     @Override
     public void indexProcess(@NotNull Map<String, Object> data, String templateName) {
+        data.put("templateType", "index");
+        globalData(data);
         if (StrUtil.isEmpty(templateName)) {
             templateName = "index.html";
         }
 
-        cfg.process(data, templateName);
+        try {
+            cfg.process(data, templateName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("发布首页错误", e);
+        }
+    }
+
+    @Override
+    public void process(Map<String, Object> data, String templateType, String templateName) {
+        data.put("templateType", templateType);
+        globalData(data);
+
+        if ("search".equals(templateType) && StrUtil.isBlank(templateName)) {
+            templateName = "search.html";
+        }
+
+        if ("message".equals(templateType) && StrUtil.isBlank(templateName)) {
+            templateName = "message.html";
+        }
+
+        try {
+            cfg.process(data, templateName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("发布错误", e);
+        }
+    }
+
+    private void globalData(Map<String, Object> data) {
+        Long companyId = (Long) data.get("companyId");
+        Map<String, String> globalSetting = webSetMapper.selectSiteGlobalSetting(companyId);
+
+        data.putAll(globalSetting);
     }
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminColumnController.java b/src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminColumnController.java
index 2ae35b5..c90acb6 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminColumnController.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminColumnController.java
@@ -4,6 +4,7 @@
 import com.xcong.farmer.cms.modules.system.dto.*;
 import com.xcong.farmer.cms.modules.system.service.IColumnService;
 import com.xcong.farmer.cms.modules.system.service.IReleaseService;
+import com.xcong.farmer.cms.modules.system.util.LoginUserUtil;
 import com.xcong.farmer.cms.modules.system.vo.AdminColumnVo;
 import com.xcong.farmer.cms.modules.system.vo.AdminSeeColumnInfoVo;
 import com.xcong.farmer.cms.modules.system.vo.WebColumnVo;
@@ -76,7 +77,8 @@
     @ApiOperation(value = "发布栏目", notes = "发布栏目")
     @PostMapping(value = "/release")
     public Result release(@RequestBody @Valid ReleaseColumnDto releaseColumnDto) {
-        releaseService.releaseColumn(releaseColumnDto.getId(), releaseColumnDto.getType());
+        Long companyId = LoginUserUtil.getCompanyId();
+        releaseService.releaseColumn(releaseColumnDto.getId(), releaseColumnDto.getType(), companyId);
         return Result.ok("发布成功");
     }
 
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminWebSetController.java b/src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminWebSetController.java
index 22e733e..9016746 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminWebSetController.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/controller/AdminWebSetController.java
@@ -1,10 +1,15 @@
 package com.xcong.farmer.cms.modules.system.controller;
 
 import com.xcong.farmer.cms.common.response.Result;
-import com.xcong.farmer.cms.modules.system.dto.AdminUpdateWebSetDto;
-import com.xcong.farmer.cms.modules.system.service.IWebSetService;
+import com.xcong.farmer.cms.modules.system.dto.SetWebSettingDto;
+import com.xcong.farmer.cms.modules.system.service.IReleaseService;
+import com.xcong.farmer.cms.modules.system.service.IWebSettingService;
+import com.xcong.farmer.cms.modules.system.util.LoginUserUtil;
+import com.xcong.farmer.cms.modules.system.vo.AdminSeeWebSetInfoVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
@@ -18,17 +23,31 @@
 public class AdminWebSetController {
 
     @Resource
-    private IWebSetService iWebSetService;
+    private IWebSettingService iWebSetService;
+
+    @Resource
+    private IReleaseService releaseService;
 
     @ApiOperation(value = "查看网页设置", notes = "查看网页设置")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = AdminSeeWebSetInfoVo.class)
+    })
     @GetMapping(value = "/seeWebSetInfo")
     public Result seeWebSetInfo() {
-        return iWebSetService.seeWebSetInfo();
+        return iWebSetService.getWebSetting();
     }
 
     @ApiOperation(value = "更新网页设置", notes = "更新网页设置")
     @PostMapping(value = "/updateWebSet")
-    public Result updateWebSet(@RequestBody @Valid AdminUpdateWebSetDto adminUpdateWebSetDto) {
-        return iWebSetService.updateWebSet(adminUpdateWebSetDto);
+    public Result updateWebSet(@RequestBody @Valid SetWebSettingDto setWebSettingDto) {
+        return iWebSetService.setWebSetting(setWebSettingDto);
+    }
+
+    @ApiOperation(value = "发布全站", notes = "发布全站")
+    @PostMapping(value = "/releaseAll")
+    public Result releaseAll() {
+        Long companyId = LoginUserUtil.getCompanyId();
+        releaseService.releaseAll(companyId);
+        return Result.ok("发布成功");
     }
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/dto/AdminUpdateWebSetDto.java b/src/main/java/com/xcong/farmer/cms/modules/system/dto/AdminUpdateWebSetDto.java
deleted file mode 100644
index d22e9a0..0000000
--- a/src/main/java/com/xcong/farmer/cms/modules/system/dto/AdminUpdateWebSetDto.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.xcong.farmer.cms.modules.system.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-
-@Data
-@ApiModel(value = "AdminUpdateWebSetDto", description = "参数接收类")
-public class AdminUpdateWebSetDto {
-
-    @ApiModelProperty(value = "ID")
-    private Long id;
-
-    @ApiModelProperty(value = "网页标题")
-    @NotBlank(message = "请输入网页标题")
-    private String webTitle;
-
-    @ApiModelProperty(value = "网页关键字")
-    @NotBlank(message = "请输入网页关键字")
-    private String webKeyword;
-
-    @ApiModelProperty(value = "网页描述")
-    private String webRemark;
-
-    @ApiModelProperty(value = "网页LOGO")
-    private String webPic;
-}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/dto/SetWebSettingDto.java b/src/main/java/com/xcong/farmer/cms/modules/system/dto/SetWebSettingDto.java
new file mode 100644
index 0000000..e339339
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/dto/SetWebSettingDto.java
@@ -0,0 +1,40 @@
+package com.xcong.farmer.cms.modules.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "AdminUpdateWebSetDto", description = "参数接收类")
+public class SetWebSettingDto {
+
+    @ApiModelProperty(value = "ID")
+    private Long id;
+
+    @ApiModelProperty(value = "网页标题")
+    @NotBlank(message = "请输入网页标题")
+    private String title;
+
+    @ApiModelProperty(value = "网页关键字")
+    private String seoTitle;
+
+    @ApiModelProperty(value = "网页描述")
+    private String seoDescription;
+
+    @ApiModelProperty(value = "网页描述")
+    private String seoKeyword;
+
+    @ApiModelProperty(value = "网页LOGO")
+    private String logoUrl;
+
+    @ApiModelProperty(value = "首页模板")
+    private String indexTemplate;
+
+    @ApiModelProperty(value = "搜索模板")
+    private String searchTemplate;
+
+    @ApiModelProperty(value = "在线留言模板")
+    private String msgTemplate;
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/entity/ArticleEntity.java b/src/main/java/com/xcong/farmer/cms/modules/system/entity/ArticleEntity.java
index 318d444..70d85ee 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/entity/ArticleEntity.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/entity/ArticleEntity.java
@@ -85,6 +85,11 @@
     //内容类型 1:文章 2:图片 3:文件 4:音频"
     private Integer contentType;
 
+    /**
+     * 更新前栏目编码
+     */
+    private Long beforeColumnId;
+
     @TableField(exist = false)
     private String columnCode;
 
@@ -103,4 +108,7 @@
     @TableField(exist = false)
     private String timeType;
 
+    @TableField(exist = false)
+    private Integer releaseType;
+
 }
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 90fa975..f8c87d3 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
@@ -60,4 +60,19 @@
 
     @TableField(exist = false)
     private List<Long> ids;
+
+    /**
+     * 更新前栏目ID
+     */
+    private Long beforeParentId;
+
+    /**
+     * 更新前栏目编码
+     */
+    private String beforeColumnCode;
+
+    /**
+     * 发布状态 1-已发布 2-未发布
+     */
+    private Integer releaseState;
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/entity/WebSetEntity.java b/src/main/java/com/xcong/farmer/cms/modules/system/entity/WebSetEntity.java
deleted file mode 100644
index 451d831..0000000
--- a/src/main/java/com/xcong/farmer/cms/modules/system/entity/WebSetEntity.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.xcong.farmer.cms.modules.system.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-/**
- * 网页配置表
- */
-@Data
-@TableName("t_web_set")
-public class WebSetEntity {
-    //ID
-
-    @TableId(value = "id",type = IdType.AUTO)
-    private Long id;
-    //网页标题
-    private String webTitle;
-    //网页关键字
-    private String webKeyword;
-    //网页描述
-    private String webRemark;
-    //网页LOGO
-    private String webPic;
-    //所属ID
-    private Long companyId;
-}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/entity/WebSettingEntity.java b/src/main/java/com/xcong/farmer/cms/modules/system/entity/WebSettingEntity.java
new file mode 100644
index 0000000..631923e
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/entity/WebSettingEntity.java
@@ -0,0 +1,67 @@
+package com.xcong.farmer.cms.modules.system.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 网页配置表
+ */
+@Data
+@TableName("t_web_setting")
+public class WebSettingEntity {
+    //ID
+
+    @TableId(value = "id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 网站标题
+     */
+    private String title;
+
+    /**
+     * seo标题
+     */
+    private String seoTitle;
+
+    /**
+     * seo关键词
+     */
+    private String seoKeyword;
+
+    /**
+     * seo描述
+     */
+    private String seoDescription;
+
+    /**
+     * logo地址
+     */
+    private String logoUrl;
+
+    /**
+     * 首页模板
+     */
+    private String indexTemplate;
+
+    /**
+     * 搜索模板
+     */
+    private String searchTemplate;
+
+    /**
+     * 在线留言模板
+     */
+    private String msgTemplate;
+
+    private Long companyId;
+
+    @TableField(exist = false)
+    private String companyCode;
+
+    @TableField(exist = false)
+    private String companyUrl;
+}
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 a5ca4ce..d15896e 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
@@ -27,4 +27,6 @@
     IPage<WebArticleVo> selectWebArticleInPage(Page<WebArticleVo> page, @Param("record") ArticleEntity articleEntity);
 
     List<Long> selectArticleIdsByColumnId(@Param("columnId") Long columnId, @Param("companyId") Long companyId, @Param("type") Integer type);
+
+    List<ArticleEntity> selectArticleByColumnId(@Param("columnId") Long columnId, @Param("companyId") Long companyId, @Param("type") Integer type);
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/mapper/ColumnMapper.java b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/ColumnMapper.java
index 7c2327d..0ddbb20 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/mapper/ColumnMapper.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/ColumnMapper.java
@@ -18,7 +18,7 @@
 
     ColumnEntity selectByCodeAndCompanyId(@Param("code") String code, @Param("companyId") Long companyId);
 
-    List<ColumnEntity> selectColumnByParentId(@Param("parentId") Long parentId, @Param("companyId") Long companyId);
+    List<ColumnEntity> selectColumnByParentId(@Param("parentId") Long parentId, @Param("companyId") Long companyId, @Param("isNav") Integer isNav);
 
     IPage<ColumnEntity> selectColumnInPage(Page<ColumnEntity> page, @Param("record") ColumnEntity column);
 
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/mapper/WebSetMapper.java b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/WebSetMapper.java
index a927324..fa83417 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/mapper/WebSetMapper.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/mapper/WebSetMapper.java
@@ -1,7 +1,14 @@
 package com.xcong.farmer.cms.modules.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xcong.farmer.cms.modules.system.entity.WebSetEntity;
+import com.xcong.farmer.cms.modules.system.entity.WebSettingEntity;
+import org.apache.ibatis.annotations.Param;
 
-public interface WebSetMapper extends BaseMapper<WebSetEntity> {
+import java.util.Map;
+
+public interface WebSetMapper extends BaseMapper<WebSettingEntity> {
+
+    WebSettingEntity selectByCompanyId(@Param("companyId") Long companyId);
+
+    Map<String, String> selectSiteGlobalSetting(@Param("companyId") Long companyId);
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/IReleaseService.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/IReleaseService.java
index 6d3f296..2af8ed0 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/service/IReleaseService.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/service/IReleaseService.java
@@ -3,9 +3,14 @@
 public interface IReleaseService {
 
 
-    void releaseArticle(Long id);
+    void releaseArticle(Long id, Long companyId);
 
-    void releaseColumn(Long id, int type);
+    void releaseColumn(Long id, int type, Long companyId);
 
-    void releaseIndex();
+    void releaseColumns(int type, Long companyId);
+
+    void releaseIndex(Long companyId, boolean hasSearch);
+
+    void releaseAll(Long companyId);
+
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/IWebSetService.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/IWebSetService.java
deleted file mode 100644
index cc4e59f..0000000
--- a/src/main/java/com/xcong/farmer/cms/modules/system/service/IWebSetService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.xcong.farmer.cms.modules.system.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.xcong.farmer.cms.common.response.Result;
-import com.xcong.farmer.cms.modules.system.dto.AdminUpdateWebSetDto;
-import com.xcong.farmer.cms.modules.system.entity.WebSetEntity;
-
-public interface IWebSetService extends IService<WebSetEntity> {
-    Result seeWebSetInfo();
-
-    Result updateWebSet(AdminUpdateWebSetDto adminUpdateWebSetDto);
-}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/IWebSettingService.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/IWebSettingService.java
new file mode 100644
index 0000000..081cac9
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/service/IWebSettingService.java
@@ -0,0 +1,12 @@
+package com.xcong.farmer.cms.modules.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xcong.farmer.cms.common.response.Result;
+import com.xcong.farmer.cms.modules.system.dto.SetWebSettingDto;
+import com.xcong.farmer.cms.modules.system.entity.WebSettingEntity;
+
+public interface IWebSettingService extends IService<WebSettingEntity> {
+    Result getWebSetting();
+
+    Result setWebSetting(SetWebSettingDto adminUpdateWebSetDto);
+}
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 eaf6ad1..13427ba 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
@@ -115,6 +115,9 @@
         String atlas = adminAddArticleDto.getAtlas();
             articleEntity.setAtlas(atlas);
         Date releaseTime = adminAddArticleDto.getReleaseTime();
+        if (releaseTime == null) {
+            releaseTime = new Date();
+        }
             articleEntity.setReleaseTime(releaseTime);
         Integer isTop = adminAddArticleDto.getIsTop();
         articleEntity.setIsTop(isTop);
@@ -178,7 +181,12 @@
         if(ObjectUtil.isEmpty(columnEntity)){
             return Result.fail("请选择文章栏目");
         }
+
+        if (!articleEntity.getColumnId().equals(columnId) && articleEntity.getBeforeColumnId() == -1) {
+            articleEntity.setBeforeColumnId(articleEntity.getColumnId());
+        }
         articleEntity.setColumnId(columnId);
+
         Integer visits = adminUpdateArticleDto.getVisits() == null ? 0 : adminUpdateArticleDto.getVisits();
         articleEntity.setVisits(visits);
         String mainDiagram = adminUpdateArticleDto.getMainDiagram();
@@ -199,6 +207,7 @@
         articleEntity.setArticleUrl(adminUpdateArticleDto.getArticleUrl());
         articleEntity.setType(adminUpdateArticleDto.getType());
         articleEntity.setContentType(adminUpdateArticleDto.getContentType());
+
         String authorBelong = adminUpdateArticleDto.getAuthorBelong();
         articleEntity.setAuthorBelong(authorBelong);
         this.baseMapper.updateById(articleEntity);
@@ -229,6 +238,8 @@
         }
         articleEntity.setReleaseStatus(ArticleEntity.RELEASE_STATUS_NO);
         this.baseMapper.updateById(articleEntity);
+
+        releaseService.releaseColumn(articleEntity.getColumnId(), 2, articleEntity.getCompanyId());
         return Result.ok("操作成功");
     }
 
@@ -295,6 +306,7 @@
 
     @Override
     public Result updateStatusOn(Long id) {
+        Long companyId = LoginUserUtil.getCompanyId();
         ArticleEntity articleEntity = this.baseMapper.selectById(id);
         if(ObjectUtil.isEmpty(articleEntity)){
             return Result.fail("文章不存在");
@@ -302,7 +314,7 @@
         articleEntity.setReleaseStatus(ArticleEntity.RELEASE_STATUS_YES);
         this.baseMapper.updateById(articleEntity);
 
-        releaseService.releaseArticle(articleEntity.getId());
+        releaseService.releaseArticle(articleEntity.getId(), companyId);
         return Result.ok("操作成功");
     }
 
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/CmsTemplateServiceImpl.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/CmsTemplateServiceImpl.java
index 5c20554..4c2a1bc 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/CmsTemplateServiceImpl.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/CmsTemplateServiceImpl.java
@@ -15,17 +15,22 @@
 import com.xcong.farmer.cms.modules.system.dto.AdminSaveTemplateInfoDto;
 import com.xcong.farmer.cms.modules.system.dto.TemplateListDto;
 import com.xcong.farmer.cms.modules.system.entity.CmsTemplateEntity;
+import com.xcong.farmer.cms.modules.system.entity.CompanyEntity;
 import com.xcong.farmer.cms.modules.system.mapper.CmsTemplateMapper;
+import com.xcong.farmer.cms.modules.system.mapper.CompanyMapper;
 import com.xcong.farmer.cms.modules.system.service.ICmsTemplateService;
 import com.xcong.farmer.cms.modules.system.util.LoginUserUtil;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
@@ -43,6 +48,10 @@
     @Autowired
     private CmsProperties properties;
 
+    @Autowired
+    private CompanyMapper companyMapper;
+
+
     private List<String> fileSuffix = Arrays.asList(".zip", ".html");
 
     @Override
@@ -50,6 +59,11 @@
         String templatePath = properties.getTemplatePath();
         String staticPath = properties.getStaticPath();
         Long companyId = LoginUserUtil.getCompanyId();
+        CompanyEntity company = companyMapper.selectById(companyId);
+
+        String companyCode = company.getCode();
+        templatePath = FileUtils.path(templatePath, companyCode);
+        staticPath = FileUtils.path(staticPath, companyCode);
 
         String filename = upload.getOriginalFilename();
         String suffix = filename.substring(filename.lastIndexOf("."));
@@ -88,46 +102,59 @@
                         continue;
                     }
 
-                    Document parse = Jsoup.parse(templateFile, null);
-                    String attr = parse.head().attr("name");
-                    CmsTemplateEntity cmsTemplate = new CmsTemplateEntity();
-                    cmsTemplate.setCompanyId(companyId);
-                    if (name.endsWith(".list.html")) {
-                        cmsTemplate.setType(2);
-                    } else if (name.endsWith(".article.html")) {
-                        cmsTemplate.setType(3);
-                    } else {
-                        cmsTemplate.setType(1);
-                    }
-                    cmsTemplate.setName(StrUtil.isNotBlank(attr) ? attr : templateFile.getName());
-                    cmsTemplate.setPath(templateFile.getName());
-
-                    this.baseMapper.insert(cmsTemplate);
+                    insertTemplate(templateFile, companyId, companyCode);
                 }
-
             }
 
             if (".html".equals(suffix)) {
                 FileUtil.touch(file);
 
-                Document parse = Jsoup.parse(file, null);
-                String attr = parse.head().attr("name");
-                CmsTemplateEntity cmsTemplate = new CmsTemplateEntity();
-                cmsTemplate.setCompanyId(companyId);
-                if (file.getName().endsWith(".list.html")) {
-                    cmsTemplate.setType(2);
-                } else if (file.getName().endsWith(".article.html")) {
-                    cmsTemplate.setType(3);
-                } else {
-                    cmsTemplate.setType(1);
-                }
-                cmsTemplate.setName(StrUtil.isNotBlank(attr) ? attr : file.getName());
-                cmsTemplate.setPath(file.getName());
-
-                this.baseMapper.insert(cmsTemplate);
+                insertTemplate(file, companyId, companyCode);
             }
         } catch (IOException e) {
             e.printStackTrace();
+            throw new GlobalException("模板上传失败");
+        }
+    }
+
+    private void insertTemplate(File file, Long companyId, String companyCode) throws IOException {
+        Document parse = Jsoup.parse(file, null);
+        String attr = parse.head().attr("name");
+
+        staticPathParser(parse, "img", "src", companyCode);
+        staticPathParser(parse, "link", "href", companyCode);
+        staticPathParser(parse, "script", "src", companyCode);
+
+        FileOutputStream outputStream = new FileOutputStream(file);
+        outputStream.write(parse.html().getBytes());
+        outputStream.close();
+
+        CmsTemplateEntity cmsTemplate = new CmsTemplateEntity();
+        cmsTemplate.setCompanyId(companyId);
+        if (file.getName().endsWith(".list.html")) {
+            cmsTemplate.setType(2);
+        } else if (file.getName().endsWith(".article.html")) {
+            cmsTemplate.setType(3);
+        } else {
+            cmsTemplate.setType(1);
+        }
+        cmsTemplate.setName(StrUtil.isNotBlank(attr) ? attr : file.getName());
+        cmsTemplate.setPath(file.getName());
+
+        this.baseMapper.insert(cmsTemplate);
+    }
+
+    private void staticPathParser(Document document, String tagName, String attrKey, String companyCode) {
+        Elements elements = document.getElementsByTag(tagName);
+        if (elements.isEmpty()) {
+            return;
+        }
+
+        for (Element element : elements) {
+            String attr = element.attr(attrKey);
+            if (StrUtil.isNotBlank(attr) && !attr.contains("http://") && !attr.contains("https://")) {
+                element.attr(attrKey, cmsProperties.getStaticUrl() + companyCode + "/" + attr);
+            }
         }
     }
 
@@ -162,8 +189,10 @@
     @Override
     public Result viewTemplateInfo(Long id) {
         Result result = new Result();
+
+        CompanyEntity companyEntity = companyMapper.selectById(LoginUserUtil.getCompanyId());
         CmsTemplateEntity cmsTemplateEntity = this.baseMapper.selectById(id);
-        String templatePath = cmsProperties.getTemplatePath();
+        String templatePath = FileUtils.path(cmsProperties.getTemplatePath(), companyEntity.getCode());
         String pathName = FileUtils.path(templatePath, cmsTemplateEntity.getPath());
 
         byte[] bytes = new byte[0];
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ColumnServiceImpl.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ColumnServiceImpl.java
index 7510d74..7498eb2 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ColumnServiceImpl.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ColumnServiceImpl.java
@@ -164,14 +164,21 @@
         adminSeeColumnInfoVo.setType(columnEntity.getType());
         adminSeeColumnInfoVo.setTargetType(columnEntity.getTargetType());
         adminSeeColumnInfoVo.setContentType(columnEntity.getContentType());
+
+        CompanyEntity companyEntity = companyMapper.selectById(LoginUserUtil.getCompanyId());
+
         if (columnEntity.getType() == 2) {
             if (columnEntity.getTargetType() == 1) {
                 ArticleEntity articleEntity = articleMapper.selectById(Long.parseLong(columnEntity.getTargetUrl()));
                 adminSeeColumnInfoVo.setTargetName(articleEntity.getTitle());
+                adminSeeColumnInfoVo.setUrl(companyEntity.getWebAddress() + columnEntity.getPath() + "/" + columnEntity.getTargetUrl() + ".html");
             } else if (columnEntity.getTargetType() == 2) {
                 ColumnEntity column = this.baseMapper.selectByCodeAndCompanyId(columnEntity.getTargetUrl(), LoginUserUtil.getCompanyId());
                 adminSeeColumnInfoVo.setTargetName(column.getColumnName());
+                adminSeeColumnInfoVo.setUrl(companyEntity.getWebAddress() + column.getPath());
             }
+        } else {
+            adminSeeColumnInfoVo.setUrl(companyEntity.getWebAddress() + columnEntity.getPath());
         }
         adminSeeColumnInfoVo.setTargetUrl(columnEntity.getTargetUrl());
         return Result.ok(adminSeeColumnInfoVo);
@@ -202,7 +209,13 @@
         if(CollUtil.isNotEmpty(columnEntities) && columnEntities.size() > 1){
             return Result.fail("栏目编码不能重复");
         }
+
+        // 判断是否编辑了栏目编码且此时栏目处于已发布的状态,然后保存之前的编码。因为如果是未发布状态,多次保存的话,容易覆盖真正的最开始的栏目编码
+        if (!columnEntity.getColumnCode().equals(columnCode) && columnEntity.getReleaseState() == 1) {
+            columnEntity.setBeforeColumnCode(columnCode);
+        }
         columnEntity.setColumnCode(columnCode);
+
         String remark = adminUpdateColumnDto.getRemark();
             columnEntity.setRemark(remark);
         String pic = adminUpdateColumnDto.getPic();
@@ -212,6 +225,11 @@
             columnEntity.setOrderNum(orderNum);
         }
         Long parentId = adminUpdateColumnDto.getParentId();
+        // 同栏目编码
+        if (!columnEntity.getParentId().equals(parentId) && columnEntity.getReleaseState() == 1) {
+            columnEntity.setBeforeParentId(columnEntity.getParentId());
+        }
+
         if(ObjectUtil.isEmpty(parentId)){
             columnEntity.setParentId(ColumnEntity.PARENTID_DEFAULT);
             columnEntity.setPath("/" + columnEntity.getColumnCode());
@@ -228,6 +246,7 @@
         columnEntity.setTargetUrl(adminUpdateColumnDto.getTargetUrl());
         columnEntity.setIsNav(adminUpdateColumnDto.getIsNav());
         columnEntity.setContentType(adminUpdateColumnDto.getContentType());
+        columnEntity.setReleaseState(2);
         this.baseMapper.updateById(columnEntity);
         return Result.ok("更新成功");
     }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ReleaseServiceImpl.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ReleaseServiceImpl.java
index d156360..2c01d97 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ReleaseServiceImpl.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/ReleaseServiceImpl.java
@@ -4,8 +4,11 @@
 import com.xcong.farmer.cms.modules.core.service.ICmsCoreService;
 import com.xcong.farmer.cms.modules.system.entity.ArticleEntity;
 import com.xcong.farmer.cms.modules.system.entity.ColumnEntity;
+import com.xcong.farmer.cms.modules.system.entity.WebSettingEntity;
 import com.xcong.farmer.cms.modules.system.mapper.ArticleMapper;
 import com.xcong.farmer.cms.modules.system.mapper.ColumnMapper;
+import com.xcong.farmer.cms.modules.system.mapper.CompanyMapper;
+import com.xcong.farmer.cms.modules.system.mapper.WebSetMapper;
 import com.xcong.farmer.cms.modules.system.service.IReleaseService;
 import com.xcong.farmer.cms.modules.system.util.LoginUserUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -13,6 +16,7 @@
 import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
@@ -22,6 +26,7 @@
 
 /**
  * @author wzy
+ * @TODO 发布时,index存在重复发布的情况,可优化。用线程notify唤醒。
  * @date 2022-07-05
  **/
 @Slf4j
@@ -37,34 +42,125 @@
     @Autowired
     private ICmsCoreService cmsCoreService;
 
-    private final Executor executor = new ThreadPoolExecutor(5, 10, 600, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
+    @Autowired
+    private WebSetMapper webSetMapper;
+
+    private final Executor executor = new ThreadPoolExecutor(5, 20, 600, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
 
     @Override
-    public void releaseArticle(Long id) {
-        Long companyId = LoginUserUtil.getCompanyId();
+    public void releaseArticle(Long id, Long companyId) {
         ArticleEntity article = articleMapper.selectById(id);
         ColumnEntity column = columnMapper.selectById(article.getColumnId());
 
-        Map<String, Object> data = new HashMap<>();
+        Long beforeColumnId = article.getBeforeColumnId();
+        article.setBeforeColumnId(-1L);
+        articleMapper.updateById(article);
+
+        Map<String, Object> data = new Hashtable<>();
         data.put("id", article.getId());
         data.put("companyId", companyId);
 
-        executor.execute(()->{
+        executor.execute(() -> {
             log.info("执行文章发布");
             cmsCoreService.articleProcess(data, column.getArticleTemplate(), column.getPath());
-            this.releaseColumn(column.getId(), 1);
+            this.releaseColumn(column.getId(), 1, companyId);
             if (column.getParentId() != 0L) {
-                releaseColumn(column.getParentId(), 1);
+                releaseColumn(column.getParentId(), 1, companyId);
             }
-            this.releaseIndex();
+
+            if (beforeColumnId != null && !article.getColumnId().equals(beforeColumnId)) {
+                ColumnEntity beforeColumn = columnMapper.selectById(beforeColumnId);
+                this.releaseColumn(beforeColumnId, 1, companyId);
+                if (beforeColumn.getParentId() != 0L) {
+                    this.releaseColumn(beforeColumn.getParentId(), 1, companyId);
+                }
+            }
+
+            this.releaseIndex(companyId, false);
         });
     }
 
     @Override
-    public void releaseColumn(Long id, int type) {
-        Long companyId = LoginUserUtil.getCompanyId();
+    public void releaseColumn(Long id, int type, Long companyId) {
         ColumnEntity columnEntity = columnMapper.selectById(id);
-        Map<String, Object> map = new HashMap<>();
+        Map<String, Object> map = buildColumnData(columnEntity);
+
+        executor.execute(() -> {
+            List<ArticleEntity> articles = articleMapper.selectArticleByColumnId(columnEntity.getId(), companyId, type);
+            if (CollUtil.isNotEmpty(articles)) {
+                for (ArticleEntity article : articles) {
+                    if (article.getReleaseStatus() == 0) {
+                        article.setReleaseStatus(1);
+                        articleMapper.updateById(article);
+                    }
+
+                    if (article.getType() == 1) {
+                        map.put("id", article.getId());
+                        cmsCoreService.articleProcess(map, columnEntity.getArticleTemplate(), columnEntity.getPath());
+                    }
+                }
+            }
+
+            map.put("id", columnEntity.getId());
+            cmsCoreService.columnProcess(map, columnEntity.getListTemplate());
+            if (columnEntity.getParentId() != 0L) {
+                ColumnEntity parentColumn = columnMapper.selectById(columnEntity.getParentId());
+                Map<String, Object> parentMap = buildColumnData(parentColumn);
+                parentMap.put("id", parentColumn.getId());
+                cmsCoreService.columnProcess(parentMap, parentColumn.getListTemplate());
+            }
+
+            releaseIndex(companyId, false);
+        });
+
+        if (type != 1) {
+            executor.execute(() -> {
+                if (columnEntity.getParentId() == 0L) {
+                    List<ColumnEntity> columns = columnMapper.selectColumnByParentId(columnEntity.getId(), companyId, 2);
+                    if (CollUtil.isNotEmpty(columns)) {
+                        for (ColumnEntity column : columns) {
+                            List<ArticleEntity> articles = articleMapper.selectArticleByColumnId(column.getId(), companyId, type);
+                            if (CollUtil.isNotEmpty(articles)) {
+                                for (ArticleEntity article : articles) {
+                                    if (article.getReleaseStatus() == 0) {
+                                        article.setReleaseStatus(1);
+                                        articleMapper.updateById(article);
+                                    }
+
+                                    if (article.getType() == 1) {
+                                        map.put("id", article.getId());
+                                        cmsCoreService.articleProcess(map, column.getArticleTemplate(), column.getPath());
+                                    }
+                                }
+                            }
+
+                            Map<String, Object> data = buildColumnData(column);
+                            cmsCoreService.columnProcess(data, column.getListTemplate());
+                        }
+                    }
+                }
+
+                releaseIndex(companyId, false);
+            });
+
+        }
+    }
+
+    @Override
+    public void releaseColumns(int type, Long companyId) {
+        List<ColumnEntity> columns = columnMapper.selectColumnByParentId(0L, companyId, 2);
+
+        if (CollUtil.isEmpty(columns)) {
+            return;
+        }
+
+        for (ColumnEntity column : columns) {
+            releaseColumn(column.getId(), type, companyId);
+        }
+    }
+
+    private Map<String, Object> buildColumnData(ColumnEntity columnEntity) {
+        Map<String, Object> map = new Hashtable<>();
         map.put("id", columnEntity.getId());
         map.put("code", columnEntity.getColumnCode());
         if (columnEntity.getParentId() == 0L) {
@@ -73,43 +169,34 @@
             ColumnEntity parent = columnMapper.selectById(columnEntity.getParentId());
             map.put("parentCode", parent.getColumnCode());
         }
+        map.put("columnTitle", columnEntity.getColumnName());
         map.put("templatePath", columnEntity.getPath());
+        map.put("companyId", columnEntity.getCompanyId());
+        return map;
+    }
+
+    @Override
+    public void releaseIndex(Long companyId, boolean hasSearch) {
+        Map<String, Object> map = new HashMap<>();
         map.put("companyId", companyId);
 
-        if (type != 1) {
+        WebSettingEntity webSetting = webSetMapper.selectByCompanyId(companyId);
+
+        cmsCoreService.indexProcess(map, webSetting.getIndexTemplate());
+        if (hasSearch) {
             executor.execute(() -> {
-                if (columnEntity.getParentId() == 0L) {
-                    List<ColumnEntity> columns = columnMapper.selectColumnByParentId(columnEntity.getParentId(), companyId);
-                    if (CollUtil.isNotEmpty(columns)) {
-                        for (ColumnEntity column : columns) {
-                            map.put("id", column.getId());
-                            cmsCoreService.columnProcess(map, column.getListTemplate());
-
-                            List<Long> ids = articleMapper.selectArticleIdsByColumnId(column.getId(), companyId,type);
-                            cmsCoreService.articlesProcess(map, ids, column.getArticleTemplate(), column.getPath());
-                        }
-                    }
-                }
-
-                List<Long> ids = articleMapper.selectArticleIdsByColumnId(columnEntity.getId(), companyId, type);
-                cmsCoreService.articlesProcess(map, ids, columnEntity.getArticleTemplate(), columnEntity.getPath());
-
-                releaseIndex();
-            });
-
-            executor.execute(() -> {
-                cmsCoreService.columnProcess(map, columnEntity.getListTemplate());
-                releaseIndex();
+                cmsCoreService.process(map, "search", webSetting.getSearchTemplate());
+                cmsCoreService.process(map, "message", webSetting.getMsgTemplate());
             });
         }
     }
 
     @Override
-    public void releaseIndex() {
+    public void releaseAll(Long companyId) {
         Map<String, Object> map = new HashMap<>();
-        Long companyId = LoginUserUtil.getCompanyId();
         map.put("companyId", companyId);
 
-        cmsCoreService.indexProcess(map, null);
+        releaseColumns(4, companyId);
+        releaseIndex(companyId, true);
     }
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/WebSetServiceImpl.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/WebSetServiceImpl.java
deleted file mode 100644
index ed8d8bc..0000000
--- a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/WebSetServiceImpl.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.xcong.farmer.cms.modules.system.service.Impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.xcong.farmer.cms.common.response.Result;
-import com.xcong.farmer.cms.modules.system.dto.AdminUpdateWebSetDto;
-import com.xcong.farmer.cms.modules.system.entity.UserEntity;
-import com.xcong.farmer.cms.modules.system.entity.WebSetEntity;
-import com.xcong.farmer.cms.modules.system.mapper.WebSetMapper;
-import com.xcong.farmer.cms.modules.system.service.IWebSetService;
-import com.xcong.farmer.cms.modules.system.util.LoginUserUtil;
-import com.xcong.farmer.cms.modules.system.vo.AdminSeeWebSetInfoVo;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.core.collection.CollUtil;
-
-@Service
-@Slf4j
-public class WebSetServiceImpl extends ServiceImpl<WebSetMapper, WebSetEntity> implements IWebSetService {
-    @Override
-    public Result seeWebSetInfo() {
-        UserEntity userlogin = LoginUserUtil.getLoginUser();
-        long companyId = userlogin.getCompanyId() == null ? UserEntity.USER_BELONG_TOP : userlogin.getCompanyId();
-        AdminSeeWebSetInfoVo adminSeeWebSetInfoVo = new AdminSeeWebSetInfoVo();
-        QueryWrapper<WebSetEntity> objectQueryWrapper = new QueryWrapper<>();
-        objectQueryWrapper.eq("company_id",companyId);
-        List<WebSetEntity> webSetEntities = this.baseMapper.selectList(objectQueryWrapper);
-        if(CollUtil.isNotEmpty(webSetEntities)){
-            WebSetEntity webSetEntity = webSetEntities.get(0);
-            adminSeeWebSetInfoVo.setId(webSetEntity.getId());
-            adminSeeWebSetInfoVo.setWebTitle(webSetEntity.getWebTitle());
-            adminSeeWebSetInfoVo.setWebKeyword(webSetEntity.getWebKeyword());
-            adminSeeWebSetInfoVo.setWebRemark(webSetEntity.getWebRemark());
-            adminSeeWebSetInfoVo.setWebPic(webSetEntity.getWebPic());
-        }
-        return Result.ok(adminSeeWebSetInfoVo);
-    }
-
-    @Override
-    public Result updateWebSet(AdminUpdateWebSetDto adminUpdateWebSetDto) {
-        UserEntity userlogin = LoginUserUtil.getLoginUser();
-        long companyId = userlogin.getCompanyId() == null ? UserEntity.USER_BELONG_TOP : userlogin.getCompanyId();
-        String webTitle = adminUpdateWebSetDto.getWebTitle();
-        String webKeyword = adminUpdateWebSetDto.getWebKeyword();
-        Long id = adminUpdateWebSetDto.getId() == null ? 0L : adminUpdateWebSetDto.getId();
-        QueryWrapper<WebSetEntity> objectQueryWrapper = new QueryWrapper<>();
-        objectQueryWrapper.eq("company_id",companyId);
-        WebSetEntity webSetEntity = this.baseMapper.selectOne(objectQueryWrapper);
-        if(ObjectUtil.isEmpty(webSetEntity)){
-            WebSetEntity webSetEntityAdd = new WebSetEntity();
-            webSetEntityAdd.setWebTitle(webTitle);
-            webSetEntityAdd.setWebKeyword(webKeyword);
-            String webRemark = adminUpdateWebSetDto.getWebRemark();
-            if(StrUtil.isNotEmpty(webRemark)){
-                webSetEntityAdd.setWebRemark(webRemark);
-            }
-            String webPic = adminUpdateWebSetDto.getWebPic();
-            if(StrUtil.isNotEmpty(webPic)){
-                webSetEntityAdd.setWebPic(webPic);
-            }
-            webSetEntityAdd.setCompanyId(companyId);
-            this.baseMapper.insert(webSetEntityAdd);
-            return Result.ok("保存成功");
-        }
-        webSetEntity.setWebTitle(webTitle);
-        webSetEntity.setWebKeyword(webKeyword);
-        String webRemark = adminUpdateWebSetDto.getWebRemark();
-            webSetEntity.setWebRemark(webRemark);
-        String webPic = adminUpdateWebSetDto.getWebPic();
-            webSetEntity.setWebPic(webPic);
-        this.baseMapper.updateById(webSetEntity);
-        return Result.ok("保存成功");
-    }
-}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/WebSettingServiceImpl.java b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/WebSettingServiceImpl.java
new file mode 100644
index 0000000..644e05d
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/service/Impl/WebSettingServiceImpl.java
@@ -0,0 +1,50 @@
+package com.xcong.farmer.cms.modules.system.service.Impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xcong.farmer.cms.common.response.Result;
+import com.xcong.farmer.cms.conversion.WebSettingConversion;
+import com.xcong.farmer.cms.modules.system.dto.SetWebSettingDto;
+import com.xcong.farmer.cms.modules.system.entity.UserEntity;
+import com.xcong.farmer.cms.modules.system.entity.WebSettingEntity;
+import com.xcong.farmer.cms.modules.system.mapper.WebSetMapper;
+import com.xcong.farmer.cms.modules.system.service.IWebSettingService;
+import com.xcong.farmer.cms.modules.system.util.LoginUserUtil;
+import com.xcong.farmer.cms.modules.system.vo.AdminSeeWebSetInfoVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+public class WebSettingServiceImpl extends ServiceImpl<WebSetMapper, WebSettingEntity> implements IWebSettingService {
+    @Override
+    public Result getWebSetting() {
+        Long companyId = LoginUserUtil.getCompanyId();
+        WebSettingEntity webSetting = this.baseMapper.selectByCompanyId(companyId);
+        if (webSetting == null) {
+            webSetting = new WebSettingEntity();
+        }
+
+        AdminSeeWebSetInfoVo adminSeeWebSetInfoVo = WebSettingConversion.INSTANCE.entityToVo(webSetting);
+        return Result.ok(adminSeeWebSetInfoVo);
+    }
+
+    @Override
+    public Result setWebSetting(SetWebSettingDto setWebSettingDto) {
+        Long companyId = LoginUserUtil.getCompanyId();
+
+        WebSettingEntity webSetting = WebSettingConversion.INSTANCE.dtoToEntity(setWebSettingDto);
+        webSetting.setCompanyId(companyId);
+        if (setWebSettingDto.getId() == null) {
+            WebSettingEntity hasExist = this.baseMapper.selectByCompanyId(companyId);
+            if (hasExist != null) {
+                webSetting.setId(hasExist.getId());
+                this.baseMapper.updateById(webSetting);
+            } else {
+                this.baseMapper.insert(webSetting);
+            }
+        } else {
+            this.baseMapper.updateById(webSetting);
+        }
+        return Result.ok("保存成功");
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeColumnInfoVo.java b/src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeColumnInfoVo.java
index c75d84a..ec74019 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeColumnInfoVo.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeColumnInfoVo.java
@@ -52,4 +52,7 @@
     @ApiModelProperty(value = "内容类型 1:文章 2:图片 3:文件 4:音频")
     private Integer contentType;
 
+    @ApiModelProperty(value = "栏目地址")
+    private String url;
+
 }
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeWebSetInfoVo.java b/src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeWebSetInfoVo.java
index 3073ff3..ce9ccfb 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeWebSetInfoVo.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/vo/AdminSeeWebSetInfoVo.java
@@ -1,5 +1,6 @@
 package com.xcong.farmer.cms.modules.system.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -12,14 +13,32 @@
     private Long id;
 
     @ApiModelProperty(value = "网页标题")
-    private String webTitle;
+    private String title;
 
-    @ApiModelProperty(value = "网页关键字")
-    private String webKeyword;
+    @ApiModelProperty(value = "seo关键字")
+    private String seoKeyword;
 
-    @ApiModelProperty(value = "网页描述")
-    private String webRemark;
+    @ApiModelProperty(value = "seo描述")
+    private String seoRemark;
+
+    @ApiModelProperty(value = "seo描述")
+    private String seoDescription;
 
     @ApiModelProperty(value = "网页LOGO")
-    private String webPic;
+    private String logoUrl;
+
+    @ApiModelProperty(value = "首页模板")
+    private String indexTemplate;
+
+    @ApiModelProperty(value = "搜索模板")
+    private String searchTemplate;
+
+    @ApiModelProperty(value = "在线留言模板")
+    private String msgTemplate;
+
+    @ApiModelProperty(value = "公司编码")
+    private String companyCode;
+
+    @ApiModelProperty(value = "公司URL")
+    private String companyUrl;
 }
diff --git a/src/main/java/com/xcong/farmer/cms/utils/GroovySingleton.java b/src/main/java/com/xcong/farmer/cms/utils/GroovySingleton.java
new file mode 100644
index 0000000..744de71
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/utils/GroovySingleton.java
@@ -0,0 +1,27 @@
+package com.xcong.farmer.cms.utils;
+
+import groovy.lang.Binding;
+import groovy.lang.GroovyShell;
+
+/**
+ * @author wzy
+ * @date 2022-07-08
+ **/
+public class GroovySingleton {
+    private volatile static GroovyShell groovyShell;
+
+    private GroovySingleton (){}
+
+    public static GroovyShell getSingleton() {
+        if (groovyShell == null) {
+            synchronized (GroovySingleton.class) {
+                if (groovyShell == null) {
+                    Binding binding = new Binding();
+                    groovyShell = new GroovyShell(binding);
+                }
+            }
+        }
+        return groovyShell;
+    }
+
+}
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index a444118..3c2ef33 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -93,7 +93,7 @@
     path: /home/javaweb/webresource/uploadeFile/image/
 
 cms:
-  base-url: http://120.27.238.55:8000/cms/output
+  api-url: http://120.27.238.55:8878
   static-url: http://120.27.238.55:8000/cms/static/
   template-path: /home/javaweb/webresource/cms/template
   static-path: /home/javaweb/webresource/cms/static
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index fb5980a..6adb6f3 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -78,6 +78,8 @@
       max-request-size: 100MB
 mybatis-plus:
   mapper-locations: classpath:mapper/*.xml
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
 
 app:
@@ -97,9 +99,9 @@
     path: /image/
 
 cms:
-  base-url: http://localhost
-  static-url: http://localhost/
-  template-path: /Users/helius/Desktop/template
-  static-path: /Users/helius/Desktop/static
-  output-path: /Users/helius/Desktop/web/output
+  api-url: http://120.27.238.55:8878
+  static-url: http://120.27.238.55:8000/cms/static/
+  template-path: /Users/helius/Desktop/template-online/template
+  static-path: /Users/helius/Desktop/template-online/static
+  output-path: /Users/helius/Desktop/template-online/output
 
diff --git a/src/main/resources/mapper/ArticleMapper.xml b/src/main/resources/mapper/ArticleMapper.xml
index 32631ff..02ee778 100644
--- a/src/main/resources/mapper/ArticleMapper.xml
+++ b/src/main/resources/mapper/ArticleMapper.xml
@@ -48,14 +48,17 @@
     <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}
+        where (a.column_id=b.id or a.column_id=b.parent_id) and a.column_id=#{columnId} and release_status=1
+        and del_status = 1
         <!--上一篇-->
         <if test="type == 1">
-            order by a.id
+            and #{id} > a.id
+            order by a.id desc
         </if>
         <!--下一篇-->
         <if test="type == 2">
-            order by a.id desc
+            and a.id > #{id}
+            order by a.id
         </if>
         limit 1
     </select>
@@ -76,7 +79,7 @@
         inner join t_column b on a.column_id=b.id
         inner join t_column c on b.parent_id=c.id or c.id=b.id
         <where>
-            a.company_id=#{record.companyId} and a.del_status = 1
+            a.company_id=#{record.companyId} and a.del_status = 1 and release_status = 1
             <if test="record.columnCode != null and record.columnCode != ''">
                 and c.column_code=#{record.columnCode}
             </if>
@@ -86,7 +89,11 @@
                     ${item}
                 </foreach>
             </if>
+            <if test="record.isTop != null and record.isTop != ''">
+                and a.is_top=#{record.isTop}
+            </if>
         </where>
+        order by release_time desc
     </select>
 
     <select id="selectWebArticleInPage" resultType="com.xcong.farmer.cms.modules.system.vo.WebArticleVo">
@@ -122,8 +129,21 @@
     </select>
 
     <select id="selectArticleIdsByColumnId" resultType="java.lang.Long">
+        select a.id from t_article a
+        where a.column_id=#{columnId} and a.company_id=#{companyId} and a.del_status = 1
+        <if test="type != 4">
+            <if test="type == 2">
+                and release_status=1
+            </if>
+            <if test="type == 3">
+                and release_status=0
+            </if>
+        </if>
+    </select>
+
+    <select id="selectArticleByColumnId" resultType="com.xcong.farmer.cms.modules.system.entity.ArticleEntity">
         select * from t_article a
-        where a.column_id=#{columnId} and a.company_id=#{companyId}
+        where a.column_id=#{columnId} and a.company_id=#{companyId} and a.del_status = 1
         <if test="type != 4">
             <if test="type == 2">
                 and release_status=1
diff --git a/src/main/resources/mapper/ColumnMapper.xml b/src/main/resources/mapper/ColumnMapper.xml
index 9301d93..e4022c0 100644
--- a/src/main/resources/mapper/ColumnMapper.xml
+++ b/src/main/resources/mapper/ColumnMapper.xml
@@ -37,6 +37,9 @@
     <select id="selectColumnByParentId" resultType="com.xcong.farmer.cms.modules.system.entity.ColumnEntity">
         select * from t_column
         where parent_id=#{parentId} and company_id=#{companyId}
+        <if test="isNav == 1">
+            and is_nav=1
+        </if>
     </select>
 
     <select id="selectColumnInPage" resultType="com.xcong.farmer.cms.modules.system.entity.ColumnEntity">
diff --git a/src/main/resources/mapper/WebSetMapper.xml b/src/main/resources/mapper/WebSetMapper.xml
new file mode 100644
index 0000000..c802dc4
--- /dev/null
+++ b/src/main/resources/mapper/WebSetMapper.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.WebSetMapper">
+
+    <select id="selectByCompanyId" resultType="com.xcong.farmer.cms.modules.system.entity.WebSettingEntity">
+        select
+           a.*,
+            b.web_address companyUrl,
+            b.code companyCode
+        from t_web_setting a, t_company b
+        where a.company_id=#{companyId} and a.company_id=b.id
+    </select>
+
+    <select id="selectSiteGlobalSetting" resultType="java.util.Map">
+        select
+            a.title title,
+            a.seo_title seoTitle,
+            a.seo_keyword seoKeyword,
+            a.seo_description seoDescription,
+            a.logo_url logo,
+            b.web_address baseUrl,
+            b.code companyCode
+        from t_web_setting a, t_company b
+        where a.company_id=#{companyId} and a.company_id=b.id
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/test/java/com/xcong/farmer/cms/ArticleTest.java b/src/test/java/com/xcong/farmer/cms/ArticleTest.java
new file mode 100644
index 0000000..12778d0
--- /dev/null
+++ b/src/test/java/com/xcong/farmer/cms/ArticleTest.java
@@ -0,0 +1,28 @@
+package com.xcong.farmer.cms;
+
+import com.xcong.farmer.cms.modules.system.entity.ArticleEntity;
+import com.xcong.farmer.cms.modules.system.mapper.ArticleMapper;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * @author wzy
+ * @date 2022-07-11
+ **/
+@SpringBootTest
+public class ArticleTest {
+
+    @Autowired
+    private ArticleMapper articleMapper;
+
+    @Test
+    public void articleColumnIdUpdateTest() {
+        Long columnId = 83L;
+        ArticleEntity article = articleMapper.selectById(88L);
+
+        article.setBeforeColumnId(-1L);
+        articleMapper.updateById(article);
+    }
+
+}
diff --git a/src/test/java/com/xcong/farmer/cms/KssframeworkApplicationTests.java b/src/test/java/com/xcong/farmer/cms/KssframeworkApplicationTests.java
index a571fb4..888ee4a 100644
--- a/src/test/java/com/xcong/farmer/cms/KssframeworkApplicationTests.java
+++ b/src/test/java/com/xcong/farmer/cms/KssframeworkApplicationTests.java
@@ -108,7 +108,7 @@
     public void viewTemplateInfo() {
         Long id = 4L;
         CmsTemplateEntity cmsTemplateEntity = cmsTemplateMapper.selectById(id);
-        String htmlUrl = cmsProperties.getBaseUrl() + cmsProperties.getTemplatePath();
+        String htmlUrl = "" + cmsProperties.getTemplatePath();
         File uploadDir = new File(htmlUrl);
         if (!uploadDir.isDirectory()) {
             uploadDir.mkdir();
diff --git a/src/test/java/com/xcong/farmer/cms/TemplateTest.java b/src/test/java/com/xcong/farmer/cms/TemplateTest.java
new file mode 100644
index 0000000..f072ef2
--- /dev/null
+++ b/src/test/java/com/xcong/farmer/cms/TemplateTest.java
@@ -0,0 +1,52 @@
+package com.xcong.farmer.cms;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * @author wzy
+ * @date 2022-07-09
+ **/
+@SpringBootTest
+public class TemplateTest {
+
+    String baseUrl = "http://120.27.238.55:8000/cms/static/";
+
+    @Test
+    public void staticFileTest() throws IOException {
+        File file = new File("/Users/helius/Desktop/template-online/index-test.html");
+        Document parse = Jsoup.parse(file, "utf-8");
+
+        staticPathParser(parse, "img", "src");
+        staticPathParser(parse, "href", "link");
+        staticPathParser(parse, "script", "src");
+
+        FileOutputStream outputStream = new FileOutputStream(file);
+        outputStream.write(parse.html().getBytes());
+        outputStream.close();
+    }
+
+    public void staticPathParser(Document document, String tagName, String attrKey) {
+        Elements elements = document.getElementsByTag(tagName);
+        if (elements.isEmpty()) {
+            return;
+        }
+
+        for (Element element : elements) {
+            String attr = element.attr(attrKey);
+            if (StrUtil.isNotBlank(attr) && !attr.contains("http://") && !attr.contains("https://")) {
+                element.attr(attrKey, baseUrl + attr);
+            }
+        }
+    }
+}

--
Gitblit v1.9.1