From 186d18c160c0eaaf5c8cc8b2c9007108deb30a2a Mon Sep 17 00:00:00 2001 From: thinkgem Date: Tue, 11 Mar 2025 15:27:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=86=85=E5=AE=B9=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=95=B0=E6=8D=AE=E5=88=B0=E5=90=91=E9=87=8F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=9A=84=E9=9B=86=E6=88=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/cms/service/ArticleService.java | 18 ++++++++++ .../cms/service/ArticleVectorStore.java | 36 +++++++++++++++++++ .../modules/cms/service/CategoryService.java | 13 +++++++ .../modules/cms/service/SiteService.java | 13 +++++++ .../modules/cms/web/CategoryController.java | 11 ++++++ .../modules/cms/web/SiteController.java | 17 ++++++--- .../src/main/resources/config/jeesite-cms.yml | 4 ++- .../views/modules/cms/categoryList.html | 7 ++-- .../resources/views/modules/cms/siteList.html | 5 ++- 9 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleVectorStore.java 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 b48bd6ea..a35d237d 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 @@ -44,6 +44,8 @@ public class ArticleService extends CrudService { @Autowired(required = false) private ArticleIndexService articleIndexService; @Autowired(required = false) + private ArticleVectorStore articleVectorStore; + @Autowired(required = false) private PageCacheService pageCacheService; private static final ExecutorService updateExpiredWeightThreadPool = new ThreadPoolExecutor(5, 20, @@ -166,6 +168,10 @@ public class ArticleService extends CrudService { if (articleIndexService != null && Article.STATUS_NORMAL.equals(article.getStatus())) { articleIndexService.save(article); } + // 保存文章到向量数据库 + if (articleVectorStore != null && Article.STATUS_NORMAL.equals(article.getStatus())) { + articleVectorStore.save(article); + } // 清理首页、栏目和文章页面缓存 if (pageCacheService != null) { pageCacheService.clearCache(article); @@ -188,6 +194,14 @@ public class ArticleService extends CrudService { articleIndexService.delete(article); } } + // 保存文章到向量数据库 + if (articleVectorStore != null) { + if (Article.STATUS_NORMAL.equals(article.getStatus())) { + articleVectorStore.save(article); + } else { + articleVectorStore.delete(article); + } + } // 清理首页、栏目和文章页面缓存 if (pageCacheService != null) { pageCacheService.clearCache(article); @@ -221,6 +235,10 @@ public class ArticleService extends CrudService { if (articleIndexService != null) { articleIndexService.delete(article); } + // 保存文章到向量数据库 + if (articleVectorStore != null) { + articleVectorStore.delete(article); + } // 清理首页、栏目和文章页面缓存 if (pageCacheService != null) { pageCacheService.clearCache(article); diff --git a/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleVectorStore.java b/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleVectorStore.java new file mode 100644 index 00000000..7720bb50 --- /dev/null +++ b/modules/cms/src/main/java/com/jeesite/modules/cms/service/ArticleVectorStore.java @@ -0,0 +1,36 @@ +/** + * 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 + */ +public interface ArticleVectorStore { + + /** + * 保存索引 + * @author ThinkGem + */ + void save(Article article); + + /** + * 删除索引 + * @author ThinkGem + */ + void delete(Article article); + + /** + * 重建向量库 + * @author ThinkGem + */ + String rebuild(Article article); + +} \ 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 ebec66f0..3dc22770 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 @@ -27,6 +27,8 @@ public class CategoryService extends TreeService { @Autowired(required = false) private ArticleIndexService articleIndexService; @Autowired(required = false) + private ArticleVectorStore articleVectorStore; + @Autowired(required = false) private PageCacheService pageCacheService; /** @@ -125,4 +127,15 @@ public class CategoryService extends TreeService { return articleIndexService.rebuild(new Article(category)); } + /** + * 重建向量数据库 + * @author ThinkGem + */ + public String rebuildVectorStore(Category category) { + if (articleVectorStore == null) { + return text("您好,系统未安装全文检索模块"); + } + return articleVectorStore.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 49c785bc..8ff3b909 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 @@ -27,6 +27,8 @@ public class SiteService extends CrudService { @Autowired(required = false) private ArticleIndexService articleIndexService; @Autowired(required = false) + private ArticleVectorStore articleVectorStore; + @Autowired(required = false) private PageCacheService pageCacheService; /** @@ -120,5 +122,16 @@ public class SiteService extends CrudService { } return articleIndexService.rebuild(new Article(new Category(site))); } + + /** + * 重建向量数据库 + * @author ThinkGem + */ + public String rebuildVectorStore(Site site) { + if (articleVectorStore == null) { + return text("您好,系统未安装内容管理AI模块"); + } + return articleVectorStore.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 118a355a..7c23fe66 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 @@ -256,6 +256,17 @@ public class CategoryController extends BaseController { return renderResult(Global.TRUE, categoryService.rebuildIndex(category)); } + /** + * 重建向量数据库 + * @author ThinkGem + */ + @RequiresPermissions("cms:category:rebuildVectorStore") + @ResponseBody + @RequestMapping(value = "rebuildVectorStore") + public String rebuildVectorStore(Category category) { + return renderResult(Global.TRUE, categoryService.rebuildVectorStore(category)); + } + /** * 获取树结构数据 * @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 c7acdb48..b9661c91 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 @@ -8,12 +8,12 @@ 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 jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -24,8 +24,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** @@ -144,6 +142,17 @@ public class SiteController extends BaseController { public String rebuildIndex(Site site) { return renderResult(Global.TRUE, siteService.rebuildIndex(site)); } + + /** + * 重建向量数据库 + * @author ThinkGem + */ + @RequiresPermissions("cms:site:rebuildVectorStore") + @ResponseBody + @RequestMapping(value = "rebuildVectorStore") + public String rebuildVectorStore(Site site) { + return renderResult(Global.TRUE, siteService.rebuildVectorStore(site)); + } /** * 选择站点 diff --git a/modules/cms/src/main/resources/config/jeesite-cms.yml b/modules/cms/src/main/resources/config/jeesite-cms.yml index 95f039f4..8117b224 100644 --- a/modules/cms/src/main/resources/config/jeesite-cms.yml +++ b/modules/cms/src/main/resources/config/jeesite-cms.yml @@ -20,5 +20,7 @@ j2cache: #spring: # elasticsearch: # enabled: true -# uris: http://Win11:9200 +# uris: http://127.0.0.1:9200 # connection-timeout: 120s +# username: elastic +# password: elastic 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 f8bcca64..c7bdd1f8 100644 --- a/modules/cms/src/main/resources/views/modules/cms/categoryList.html +++ b/modules/cms/src/main/resources/views/modules/cms/categoryList.html @@ -85,7 +85,7 @@ $('#dataGrid').dataGrid({ {header:'${text("展现方式")}', name:'showModes', index:'a.show_modes', width:150, fixed:true, align:"center", formatter: function(val, obj, row, act){ return js.getDictLabel("#{@DictUtils.getDictListJson('cms_show_modes')}", val, '未知', true); }}, - {header:'${text("操作")}', name:'actions', width:150, formatter: function(val, obj, row, act){ + {header:'${text("操作")}', name:'actions', width:180, formatter: function(val, obj, row, act){ var actions = []; //# if(hasPermi('cms:category:edit')){ actions.push(' '); @@ -98,7 +98,10 @@ $('#dataGrid').dataGrid({ actions.push(' '); actions.push(' '); //# if(hasPermi('cms:category:rebuildIndex')){ - actions.push(' '); + actions.push(' '); + //# } + //# if(hasPermi('cms:category:rebuildVectorStore')){ + 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 92aa2063..83e0f4d3 100644 --- a/modules/cms/src/main/resources/views/modules/cms/siteList.html +++ b/modules/cms/src/main/resources/views/modules/cms/siteList.html @@ -67,7 +67,7 @@ $('#dataGrid').dataGrid({ return js.getDictLabel("#{@DictUtils.getDictListJson('sys_search_status')}", val, '${text("未知")}', true); }}, {header:'${text("创建时间")}', name:'createDate', index:'a.create_date', width:150, align:"center"}, - {header:'${text("操作")}', name:'actions', width:150, formatter: function(val, obj, row, act){ + {header:'${text("操作")}', name:'actions', width:160, formatter: function(val, obj, row, act){ var actions = []; //# if(hasPermi('cms:site:edit')){ actions.push(' '); @@ -81,6 +81,9 @@ $('#dataGrid').dataGrid({ //# if(hasPermi('cms:site:rebuildIndex')){ actions.push(' '); //# } + //# if(hasPermi('cms:site:rebuildVectorStore')){ + actions.push(' '); + //# } if (row.status == Global.STATUS_NORMAL){ actions.push(' '); }