From 52f8596ae22dc63b1704af7bc109d444702fe8c1 Mon Sep 17 00:00:00 2001 From: yanx <123190875@qq.com> Date: Mon, 1 Dec 2025 15:59:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=89=A9=E5=B1=95=E6=A0=87=E7=AD=BE):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A8=E6=80=81=E6=8C=87=E4=BB=A4=E6=A0=87?= =?UTF-8?q?=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、新增动态指令标签DynamicCommand,结合Spring中bean,运用策略模式实现更为复杂业务需求。 --- .../cms/biz/IDynamicCommandService.java | 22 +++++++ .../biz/impl/DefaultCommandServiceImpl.java | 31 +++++++++ .../cms/config/FreemarkerWebConfig.java | 34 ++++++++++ .../cms/tags/DynamicCommandDirective.java | 63 +++++++++++++++++++ 4 files changed, 150 insertions(+) create mode 100644 src/main/java/net/mingsoft/cms/biz/IDynamicCommandService.java create mode 100644 src/main/java/net/mingsoft/cms/biz/impl/DefaultCommandServiceImpl.java create mode 100644 src/main/java/net/mingsoft/cms/config/FreemarkerWebConfig.java create mode 100644 src/main/java/net/mingsoft/cms/tags/DynamicCommandDirective.java diff --git a/src/main/java/net/mingsoft/cms/biz/IDynamicCommandService.java b/src/main/java/net/mingsoft/cms/biz/IDynamicCommandService.java new file mode 100644 index 00000000..23368edd --- /dev/null +++ b/src/main/java/net/mingsoft/cms/biz/IDynamicCommandService.java @@ -0,0 +1,22 @@ +package net.mingsoft.cms.biz; + +import java.util.Map; + +/** + * @ClassName net.mingsoft.cms.biz.IDynamicCommandService + * @Description + * @Author yanx + * @Date 2025/12/1 + **/ +public interface IDynamicCommandService { + + /** + * 根据动态标签策略,查询数据动态命令 + * @param params + * @return + */ + default Map doFind(Map params){ + return null; + } + +} diff --git a/src/main/java/net/mingsoft/cms/biz/impl/DefaultCommandServiceImpl.java b/src/main/java/net/mingsoft/cms/biz/impl/DefaultCommandServiceImpl.java new file mode 100644 index 00000000..0f11a307 --- /dev/null +++ b/src/main/java/net/mingsoft/cms/biz/impl/DefaultCommandServiceImpl.java @@ -0,0 +1,31 @@ +package net.mingsoft.cms.biz.impl; + +import net.mingsoft.cms.biz.IDynamicCommandService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ClassName net.mingsoft.cms.biz.impl.DefaultCommandServiceImpl + * @Description + * @Author yanx + * @Date 2025/12/1 + **/ +@Service("defaultCommandService") +public class DefaultCommandServiceImpl implements IDynamicCommandService { + + @Override + public Map doFind(Map params) { + /** + * 从params中找到自定义参数,执行逻辑返回数据给动态指令即可 + */ + return new HashMap<>(){{ + put("value1", ""); + put("value2", ""); + }}; + } +} diff --git a/src/main/java/net/mingsoft/cms/config/FreemarkerWebConfig.java b/src/main/java/net/mingsoft/cms/config/FreemarkerWebConfig.java new file mode 100644 index 00000000..f39b97c3 --- /dev/null +++ b/src/main/java/net/mingsoft/cms/config/FreemarkerWebConfig.java @@ -0,0 +1,34 @@ +package net.mingsoft.cms.config; + +import net.mingsoft.cms.tags.DynamicCommandDirective; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +/** + * @ClassName net.mingsoft.cms.config.FreemarkerWebConfig + * @Description + * @Author yanx + * @Date 2025/12/1 + **/ +@Configuration +public class FreemarkerWebConfig { + + @Autowired + private freemarker.template.Configuration configuration; + + @Bean + public DynamicCommandDirective dynamicCommandDirective(){ + return new DynamicCommandDirective(); + } + + @PostConstruct + public void init(){ + configuration.setSharedVariable("dynamicCommand", dynamicCommandDirective()); + } + +} diff --git a/src/main/java/net/mingsoft/cms/tags/DynamicCommandDirective.java b/src/main/java/net/mingsoft/cms/tags/DynamicCommandDirective.java new file mode 100644 index 00000000..5df6963d --- /dev/null +++ b/src/main/java/net/mingsoft/cms/tags/DynamicCommandDirective.java @@ -0,0 +1,63 @@ +package net.mingsoft.cms.tags; + +import cn.hutool.extra.spring.SpringUtil; +import freemarker.core.Environment; +import freemarker.ext.beans.BeansWrapper; +import freemarker.ext.beans.BeansWrapperBuilder; +import freemarker.template.*; +import net.mingsoft.cms.biz.IDynamicCommandService; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Map; +import java.util.Objects; + +/** + * 动态指令: 当出现更为复杂页面(或模块化更细情况)时候,可以使用动态指令进行数据查询,并返回数据给页面进行显示。以满足需求。 + * 比如场景: + * 某个栏目模块首页中某个小div中内容,由管理端数据库单个或多个表数据维护(非cms_content中内容)。 + * + * 此动态指令亦可与CustomTag、IncludeExTag放一起,再次更新至ms-mdiy.jar,亦可在此项目中直接运行 + * @ClassName net.mingsoft.cms.tags.DynamicCommandDirective + * @Description + * @Author yanx + * @Date 2025/12/1 + **/ + +/** + * 使用方法: + * 1、在freemarker模板中: + * 2、在工程中定义beanName=dynamicCommandService的java类,实现IDynamicCommandService接口;参见 @DefaultCommandServiceImpl示例 + * 3、前端从field.value1, field.value2...获取数据并在dynamicCommand标签之间写逻辑并渲染页面即可 + * 配置参数: + */ +public class DynamicCommandDirective implements TemplateDirectiveModel { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private BeansWrapper build = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS).build(); + /** + * 动态指令变量名 + */ + private final String VARIABLE_NAME = "field"; + + + @Override + public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException { + String beanName = Objects.toString(map.get("bean")); + if (StringUtils.isBlank(beanName)){ + logger.info("please config bean strategy"); + return; + } + IDynamicCommandService dynamicCommandService = SpringUtil.getBean(beanName, IDynamicCommandService.class); + Map dynamicDatas = dynamicCommandService.doFind(map); + environment.setVariable(VARIABLE_NAME, build.wrap(dynamicDatas)); + if (templateDirectiveBody != null){ + templateDirectiveBody.render(environment.getOut()); + }else { + throw new RuntimeException("missing body"); + } + } +} -- Gitee