diff --git a/modules/cms/src/main/java/com/jeesite/modules/cms/entity/Category.java b/modules/cms/src/main/java/com/jeesite/modules/cms/entity/Category.java index f69027a0..e4c964b6 100644 --- a/modules/cms/src/main/java/com/jeesite/modules/cms/entity/Category.java +++ b/modules/cms/src/main/java/com/jeesite/modules/cms/entity/Category.java @@ -21,10 +21,11 @@ import java.util.List; /** * 栏目表Entity * @author 长春叭哥、ThinkGem - * @version 2018-10-15 + * @version 2023-4-10 */ @Table(name = "${_prefix}cms_category", alias = "a", columns = { - @Column(name = "category_code", attrName = "categoryCode", label = "栏目编码", isPK = true), @Column(includeEntity = TreeEntity.class), + @Column(includeEntity = TreeEntity.class), + @Column(name = "category_code", attrName = "categoryCode", label = "栏目编码", isPK = true), @Column(name = "category_name", attrName = "categoryName", label = "栏目名称", queryType = QueryType.LIKE, isTreeName = true), @Column(name = "site_code", attrName = "site.siteCode", label = "站点编码", queryType = QueryType.EQ), @Column(name = "module_type", attrName = "moduleType", label = "模块类型"), @Column(name = "image", attrName = "image", label = "栏目图片"), @@ -78,15 +79,15 @@ public class Category extends TreeEntity { private List roleCodeList = ListUtils.newArrayList(); // 根据角色查询有权限的栏目列表 public Category() { - this(null); + super(); } public Category(String id) { super(id); } - public Category(String id, Site site) { - super(id); + public Category(Site site) { + super(); this.setSite(site); } diff --git a/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleIndexService.java b/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleIndexService.java new file mode 100644 index 00000000..8420be23 --- /dev/null +++ b/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleIndexService.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + * No deletion without permission, or be held responsible to law. + */ +package com.jeesite.modules.cms.service; + +import com.jeesite.common.entity.Page; +import com.jeesite.modules.cms.entity.Article; + +import java.util.Map; + +/** + * 文章全文检索服务类 + * @author ThinkGem + * @version 2023-4-10 + */ +public interface ArticleIndexService { + + /** + * 保存索引 + * @author ThinkGem + */ + void save(Article article); + + /** + * 删除索引 + * @author ThinkGem + */ + void delete(Article article); + + /** + * 重建索引 + * @author ThinkGem + */ + void rebuild(Article article); + + /** + * 文章高级搜索 + * @param page 分页对象 + * @param qStr 搜索字符串 + * @param qand 包含的字符串 + * @param qnot 不包含的字符串 + * @param bd 开始日期 + * @param ed 结束日期 + * @author ThinkGem + */ + Page> searchPage(Page> page, String qStr, + String qand, String qnot, String bd, String ed, + Map params); +} \ No newline at end of file diff --git a/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleService.java b/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleService.java index 9545da4d..83614c1e 100644 --- a/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleService.java +++ b/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleService.java @@ -10,6 +10,7 @@ import com.jeesite.common.entity.Page; import com.jeesite.common.lang.DateUtils; import com.jeesite.common.lang.StringUtils; import com.jeesite.common.service.CrudService; +import com.jeesite.common.service.ServiceException; import com.jeesite.modules.cms.dao.ArticleDao; import com.jeesite.modules.cms.dao.ArticleDataDao; import com.jeesite.modules.cms.entity.Article; @@ -34,7 +35,7 @@ import java.util.concurrent.TimeUnit; /** * 文章表Service * @author 长春叭哥、ThinkGem - * @version 2020-7-24 + * @version 2023-4-10 */ @Service public class ArticleService extends CrudService { @@ -42,6 +43,8 @@ public class ArticleService extends CrudService { @Autowired private ArticleDataDao articleDataDao; @Autowired(required = false) + private ArticleIndexService articleIndexService; + @Autowired(required = false) private PageCacheService pageCacheService; private static ExecutorService updateExpiredWeightThreadPool = new ThreadPoolExecutor(5, 20, @@ -160,6 +163,10 @@ public class ArticleService extends CrudService { } // 保存上传图片 FileUploadUtils.saveFileUpload(article, article.getId(), "article_image"); + // 保存文章全文检索索引 + if (articleIndexService != null && Article.STATUS_NORMAL.equals(article.getStatus())) { + articleIndexService.save(article); + } // 清理首页、栏目和文章页面缓存 if (pageCacheService != null) { pageCacheService.clearCache(article); @@ -174,6 +181,14 @@ public class ArticleService extends CrudService { @Transactional public void updateStatus(Article article) { super.updateStatus(article); + // 保存文章全文检索索引 + if (articleIndexService != null) { + if (Article.STATUS_NORMAL.equals(article.getStatus())) { + articleIndexService.save(article); + } else { + articleIndexService.delete(article); + } + } // 清理首页、栏目和文章页面缓存 if (pageCacheService != null) { pageCacheService.clearCache(article); @@ -203,12 +218,27 @@ public class ArticleService extends CrudService { @Transactional public void delete(Article article) { super.delete(article); + // 保存文章全文检索索引 + if (articleIndexService != null) { + articleIndexService.delete(article); + } // 清理首页、栏目和文章页面缓存 if (pageCacheService != null) { pageCacheService.clearCache(article); } } + /** + * 重建索引 + * @author ThinkGem + */ + public void rebuildIndex(Article article) { + if (articleIndexService == null) { + throw new ServiceException(text("未安装全文检索模块")); + } + articleIndexService.rebuild(article); + } + /** * 文章高级搜索 * @param page 分页对象 @@ -217,10 +247,14 @@ public class ArticleService extends CrudService { * @param qnot 不包含的字符串 * @param bd 开始日期 * @param ed 结束日期 + * @author ThinkGem */ public Page> searchPage(Page> page, String qStr, String qand, String qnot, String bd, String ed, Map params) { - return page; + if (articleIndexService == null) { + throw new ServiceException(text("未安装全文检索模块")); + } + return articleIndexService.searchPage(page, qStr, qand, qnot, bd, ed, params); } } \ No newline at end of file diff --git a/modules/cms/src/main/java/com/jeesite/modules/cms/service/CategoryService.java b/modules/cms/src/main/java/com/jeesite/modules/cms/service/CategoryService.java index 095c7948..01fc54d5 100644 --- a/modules/cms/src/main/java/com/jeesite/modules/cms/service/CategoryService.java +++ b/modules/cms/src/main/java/com/jeesite/modules/cms/service/CategoryService.java @@ -4,8 +4,10 @@ */ package com.jeesite.modules.cms.service; +import com.jeesite.common.service.ServiceException; import com.jeesite.common.service.TreeService; import com.jeesite.modules.cms.dao.CategoryDao; +import com.jeesite.modules.cms.entity.Article; import com.jeesite.modules.cms.entity.Category; import com.jeesite.modules.cms.utils.CmsUtils; import com.jeesite.modules.file.utils.FileUploadUtils; @@ -18,11 +20,13 @@ import java.util.List; /** * 栏目表Service * @author 长春叭哥、ThinkGem - * @version 2020-7-24 + * @version 2023-4-10 */ @Service public class CategoryService extends TreeService { + @Autowired(required = false) + private ArticleIndexService articleIndexService; @Autowired(required = false) private PageCacheService pageCacheService; @@ -110,4 +114,15 @@ public class CategoryService extends TreeService { } } + /** + * 重建索引 + * @author ThinkGem + */ + public void rebuildIndex(Category category) { + if (articleIndexService == null) { + throw new ServiceException(text("未安装全文检索模块")); + } + articleIndexService.rebuild(new Article(category)); + } + } \ No newline at end of file diff --git a/modules/cms/src/main/java/com/jeesite/modules/cms/service/SiteService.java b/modules/cms/src/main/java/com/jeesite/modules/cms/service/SiteService.java index f254651e..c3353937 100644 --- a/modules/cms/src/main/java/com/jeesite/modules/cms/service/SiteService.java +++ b/modules/cms/src/main/java/com/jeesite/modules/cms/service/SiteService.java @@ -4,6 +4,9 @@ */ package com.jeesite.modules.cms.service; +import com.jeesite.common.service.ServiceException; +import com.jeesite.modules.cms.entity.Article; +import com.jeesite.modules.cms.entity.Category; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,11 +21,13 @@ import com.jeesite.modules.file.utils.FileUploadUtils; /** * 站点表Service * @author 长春叭哥、ThinkGem - * @version 2020-7-24 + * @version 2023-4-10 */ @Service public class SiteService extends CrudService { + @Autowired(required = false) + private ArticleIndexService articleIndexService; @Autowired(required = false) private PageCacheService pageCacheService; @@ -103,5 +108,16 @@ public class SiteService extends CrudService { super.delete(site); CmsUtils.removeCache("siteList"); } + + /** + * 重建索引 + * @author ThinkGem + */ + public void rebuildIndex(Site site) { + if (articleIndexService == null) { + throw new ServiceException(text("未安装全文检索模块")); + } + articleIndexService.rebuild(new Article(new Category(site))); + } } \ No newline at end of file diff --git a/modules/cms/src/main/java/com/jeesite/modules/cms/web/CategoryController.java b/modules/cms/src/main/java/com/jeesite/modules/cms/web/CategoryController.java index e7bf1bde..8fca8c62 100644 --- a/modules/cms/src/main/java/com/jeesite/modules/cms/web/CategoryController.java +++ b/modules/cms/src/main/java/com/jeesite/modules/cms/web/CategoryController.java @@ -9,6 +9,7 @@ import com.jeesite.common.collect.MapUtils; import com.jeesite.common.config.Global; import com.jeesite.common.idgen.IdGen; import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.lang.TimeUtils; import com.jeesite.common.web.BaseController; import com.jeesite.modules.cms.entity.Article; import com.jeesite.modules.cms.entity.Category; @@ -37,7 +38,7 @@ import java.util.Map; /** * 栏目表Controller * @author 长春叭哥、ThinkGem - * @version 2020-7-24 + * @version 2023-4-10 */ @Controller @RequestMapping(value = "${adminPath}/cms/category") @@ -246,6 +247,20 @@ public class CategoryController extends BaseController { return renderResult(Global.TRUE, text("删除栏目表成功!")); } + /** + * 重建索引 + * @author ThinkGem + */ + @RequiresPermissions("cms:category:rebuildIndex") + @ResponseBody + @RequestMapping(value = "rebuildIndex") + public String rebuildIndex(Category category) { + long start = System.currentTimeMillis(); + categoryService.rebuildIndex(category); + return renderResult(Global.TRUE, "重建索引成功! 用时" + + TimeUtils.formatTime(System.currentTimeMillis() - start) + "。"); + } + /** * 获取树结构数据 * @param excludeCode 排除的Code diff --git a/modules/cms/src/main/java/com/jeesite/modules/cms/web/SiteController.java b/modules/cms/src/main/java/com/jeesite/modules/cms/web/SiteController.java index 96a7e681..edaa3cd6 100644 --- a/modules/cms/src/main/java/com/jeesite/modules/cms/web/SiteController.java +++ b/modules/cms/src/main/java/com/jeesite/modules/cms/web/SiteController.java @@ -4,11 +4,17 @@ */ package com.jeesite.modules.cms.web; -import java.io.IOException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import com.jeesite.common.config.Global; +import com.jeesite.common.entity.Page; +import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.lang.TimeUtils; +import com.jeesite.common.web.BaseController; +import com.jeesite.common.web.CookieUtils; +import com.jeesite.modules.cms.entity.Site; +import com.jeesite.modules.cms.service.FileTempleteService; +import com.jeesite.modules.cms.service.SiteService; +import com.jeesite.modules.sys.utils.CorpUtils; +import com.jeesite.modules.sys.utils.UserUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -19,21 +25,14 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import com.jeesite.common.config.Global; -import com.jeesite.common.entity.Page; -import com.jeesite.common.lang.StringUtils; -import com.jeesite.common.web.BaseController; -import com.jeesite.common.web.CookieUtils; -import com.jeesite.modules.cms.entity.Site; -import com.jeesite.modules.cms.service.FileTempleteService; -import com.jeesite.modules.cms.service.SiteService; -import com.jeesite.modules.sys.utils.CorpUtils; -import com.jeesite.modules.sys.utils.UserUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; /** * 站点表Controller * @author 长春叭哥、ThinkGem - * @version 2020-7-24 + * @version 2023-4-10 */ @Controller @RequestMapping(value = "${adminPath}/cms/site") @@ -135,6 +134,20 @@ public class SiteController extends BaseController { siteService.delete(site); return renderResult(Global.TRUE, text("删除站点表成功!")); } + + /** + * 重建索引 + * @author ThinkGem + */ + @RequiresPermissions("cms:site:rebuildIndex") + @ResponseBody + @RequestMapping(value = "rebuildIndex") + public String rebuildIndex(Site site) { + long start = System.currentTimeMillis(); + siteService.rebuildIndex(site); + return renderResult(Global.TRUE, "重建索引成功! 用时" + + TimeUtils.formatTime(System.currentTimeMillis() - start) + "。"); + } /** * 选择站点 diff --git a/modules/cms/src/main/java/com/jeesite/modules/cmsfront/web/FrontController.java b/modules/cms/src/main/java/com/jeesite/modules/cmsfront/web/FrontController.java index a4bf5b6f..9f0de521 100644 --- a/modules/cms/src/main/java/com/jeesite/modules/cmsfront/web/FrontController.java +++ b/modules/cms/src/main/java/com/jeesite/modules/cmsfront/web/FrontController.java @@ -29,7 +29,7 @@ import java.util.List; /** * 网站Controller * @author ThinkGem、三片叶子、长春八哥 - * @version 2020-7-24 + * @version 2023-4-10 */ @Controller @RequestMapping(value = "${frontPath}") @@ -154,8 +154,8 @@ public class FrontController extends BaseController { else { // 文章模型 if ("article".equals(category.getModuleType())) { - Page
page = new Page
(pageNo, pageSize); - Article searchArticle= new Article(category); + Page
page = new Page<>(pageNo, pageSize); + Article searchArticle= new Article(category); searchArticle.setPage(page); page = articleService.findPage(searchArticle); model.addAttribute("page", page); diff --git a/modules/cms/src/main/resources/views/modules/cms/articleForm.html b/modules/cms/src/main/resources/views/modules/cms/articleForm.html index ab5f930b..445d21d8 100644 --- a/modules/cms/src/main/resources/views/modules/cms/articleForm.html +++ b/modules/cms/src/main/resources/views/modules/cms/articleForm.html @@ -33,7 +33,7 @@
- <#form:radio path="source" dictType="cms_source" class="form-control required" /> + <#form:radio path="source" dictType="cms_source" defaultValue="2" class="form-control required" />
diff --git a/modules/cms/src/main/resources/views/modules/cms/categoryList.html b/modules/cms/src/main/resources/views/modules/cms/categoryList.html index 6c8bb8d6..db739ee6 100644 --- a/modules/cms/src/main/resources/views/modules/cms/categoryList.html +++ b/modules/cms/src/main/resources/views/modules/cms/categoryList.html @@ -97,6 +97,9 @@ $('#dataGrid').dataGrid({ } actions.push(' '); actions.push(' '); + //<% if(hasPermi('cms:category:rebuildIndex')){ %> + actions.push(' '); + //<% } %> if (row.status == Global.STATUS_NORMAL){ actions.push(' '); } diff --git a/modules/cms/src/main/resources/views/modules/cms/siteList.html b/modules/cms/src/main/resources/views/modules/cms/siteList.html index 608d4f80..f8dd54d5 100644 --- a/modules/cms/src/main/resources/views/modules/cms/siteList.html +++ b/modules/cms/src/main/resources/views/modules/cms/siteList.html @@ -78,6 +78,9 @@ $('#dataGrid').dataGrid({ actions.push(' '); } actions.push(' '); + //<% if(hasPermi('cms:site:rebuildIndex')){ %> + actions.push(' '); + //<% } %> if (row.status == Global.STATUS_NORMAL){ actions.push(' '); } diff --git a/modules/cms/src/main/resources/views/modules/cmsfront/themes/default/search.html b/modules/cms/src/main/resources/views/modules/cmsfront/themes/default/search.html index 01a31a2c..3ba6bfc4 100644 --- a/modules/cms/src/main/resources/views/modules/cmsfront/themes/default/search.html +++ b/modules/cms/src/main/resources/views/modules/cmsfront/themes/default/search.html @@ -2,17 +2,18 @@ @@ -67,23 +68,28 @@ $(function(){