diff --git a/kernel-s-system/pom.xml b/kernel-s-system/pom.xml
index b312588bf..12d2f9a37 100644
--- a/kernel-s-system/pom.xml
+++ b/kernel-s-system/pom.xml
@@ -24,6 +24,8 @@
system-business-role
system-business-menu
system-business-notice
+ system-integration-beetl
+ system-integration-rest
system-spring-boot-starter
diff --git a/kernel-s-system/system-integration-beetl/README.md b/kernel-s-system/system-integration-beetl/README.md
new file mode 100644
index 000000000..d16c31051
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/README.md
@@ -0,0 +1 @@
+针对前后端不分离版本项目,前端使用beetl渲染的集成
\ No newline at end of file
diff --git a/kernel-s-system/system-integration-beetl/pom.xml b/kernel-s-system/system-integration-beetl/pom.xml
new file mode 100644
index 000000000..d1efc1115
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/pom.xml
@@ -0,0 +1,66 @@
+
+
+ 4.0.0
+
+
+ cn.stylefeng.roses
+ kernel-s-system
+ 7.0.4
+ ../pom.xml
+
+
+ system-integration-beetl
+
+ jar
+
+
+
+
+
+ cn.stylefeng.roses
+ system-spring-boot-starter
+ ${roses.version}
+
+
+
+
+
+ cn.stylefeng.roses
+ dict-spring-boot-starter
+ ${roses.version}
+
+
+
+
+
+ cn.stylefeng.roses
+ i18n-spring-boot-starter
+ ${roses.version}
+
+
+
+
+ cn.stylefeng.roses
+ monitor-spring-boot-starter
+ ${roses.version}
+
+
+
+
+ cn.stylefeng.roses
+ ds-container-api
+ ${roses.version}
+
+
+
+
+ com.ibeetl
+ beetl
+ ${beetl.version}
+
+
+
+
+
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/CustomErrorView.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/CustomErrorView.java
new file mode 100644
index 000000000..f39c4f6d6
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/CustomErrorView.java
@@ -0,0 +1,18 @@
+package cn.stylefeng.roses.kernel.system.integration;
+
+import org.beetl.ext.spring.BeetlSpringView;
+
+/**
+ * 错误页面的默认跳转(例如请求404的时候,默认走这个视图解析器)
+ *
+ * @author fengshuonan
+ * @date 2017-05-21 11:34
+ */
+public class CustomErrorView extends BeetlSpringView {
+
+ @Override
+ public String getContentType() {
+ return "text/html;charset=UTF-8";
+ }
+
+}
\ No newline at end of file
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/BeetlAutoConfiguration.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/BeetlAutoConfiguration.java
new file mode 100644
index 000000000..4ae1f06e8
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/BeetlAutoConfiguration.java
@@ -0,0 +1,77 @@
+package cn.stylefeng.roses.kernel.system.integration.config;
+
+import cn.stylefeng.roses.kernel.auth.api.LoginUserApi;
+import cn.stylefeng.roses.kernel.system.integration.core.CustomBeetlGroupUtilConfiguration;
+import cn.stylefeng.roses.kernel.system.integration.core.expander.BeetlConfigExpander;
+import org.beetl.core.resource.ClasspathResourceLoader;
+import org.beetl.ext.spring.BeetlSpringViewResolver;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+/**
+ * Beetl模板引擎的配置
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:34
+ */
+@Configuration
+public class BeetlAutoConfiguration {
+
+ @Value("${spring.mvc.view.prefix}")
+ private String prefix;
+
+ /**
+ * Beetl的自定义配置
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:34
+ */
+ @Bean(initMethod = "init")
+ public CustomBeetlGroupUtilConfiguration customBeetlGroupUtilConfiguration(LoginUserApi loginUserApi) {
+ CustomBeetlGroupUtilConfiguration customBeetlGroupUtilConfiguration = new CustomBeetlGroupUtilConfiguration(loginUserApi);
+
+ // 设置beetl的资源加载器
+ customBeetlGroupUtilConfiguration.setResourceLoader(new ClasspathResourceLoader(BeetlAutoConfiguration.class.getClassLoader(), prefix));
+
+ // 设置beetl的配置
+ customBeetlGroupUtilConfiguration.setConfigProperties(createBeetlProperties());
+
+ return customBeetlGroupUtilConfiguration;
+ }
+
+ /**
+ * beetl的视图解析器
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:34
+ */
+ @Bean
+ public BeetlSpringViewResolver beetlViewResolver(CustomBeetlGroupUtilConfiguration customBeetlGroupUtilConfiguration) {
+ BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
+ beetlSpringViewResolver.setConfig(customBeetlGroupUtilConfiguration);
+ beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");
+ beetlSpringViewResolver.setOrder(0);
+ return beetlSpringViewResolver;
+ }
+
+ /**
+ * 组装beetl初始化需要的properties
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:33
+ */
+ private Properties createBeetlProperties() {
+ Properties properties = new Properties();
+ properties.setProperty("DELIMITER_STATEMENT_START", BeetlConfigExpander.getDelimiterStatementStart());
+ properties.setProperty("DELIMITER_STATEMENT_END", BeetlConfigExpander.getDelimiterStatementEnd());
+ properties.setProperty("HTML_TAG_FLAG", BeetlConfigExpander.getHtmlTagFlag());
+ properties.setProperty("RESOURCE.tagRoot", BeetlConfigExpander.getResourceTagRoot());
+ properties.setProperty("RESOURCE.tagSuffix", BeetlConfigExpander.getResourceTagSuffix());
+ properties.setProperty("RESOURCE.autoCheck", BeetlConfigExpander.getResourceAutoCheck());
+ return properties;
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/BeetlErrorViewAutoConfiguration.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/BeetlErrorViewAutoConfiguration.java
new file mode 100644
index 000000000..52349b920
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/BeetlErrorViewAutoConfiguration.java
@@ -0,0 +1,31 @@
+package cn.stylefeng.roses.kernel.system.integration.config;
+
+import cn.stylefeng.roses.kernel.system.integration.CustomErrorView;
+import cn.stylefeng.roses.kernel.system.integration.core.CustomBeetlGroupUtilConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 错误界面自动配置,一般用于404响应
+ *
+ * @author fengshuonan
+ * @date 2021/5/17 11:16
+ */
+@Configuration
+public class BeetlErrorViewAutoConfiguration {
+
+ /**
+ * 默认错误页面,返回json
+ *
+ * @author fengshuonan
+ * @date 2020/12/16 15:47
+ */
+ @Bean("error")
+ public CustomErrorView error(CustomBeetlGroupUtilConfiguration customBeetlGroupUtilConfiguration) {
+ CustomErrorView customErrorView = new CustomErrorView();
+ customErrorView.setUrl("/404.html");
+ customErrorView.setGroupTemplate(customBeetlGroupUtilConfiguration.getGroupTemplate());
+ return customErrorView;
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/CustomBeetlGroupUtilConfiguration.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/CustomBeetlGroupUtilConfiguration.java
new file mode 100644
index 000000000..e05f180b3
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/CustomBeetlGroupUtilConfiguration.java
@@ -0,0 +1,51 @@
+package cn.stylefeng.roses.kernel.system.integration.core;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.stylefeng.roses.kernel.auth.api.LoginUserApi;
+import cn.stylefeng.roses.kernel.i18n.util.QuickTranslateUtil;
+import cn.stylefeng.roses.kernel.system.api.expander.SystemConfigExpander;
+import cn.stylefeng.roses.kernel.system.integration.core.tag.SysDictCheckBoxTag;
+import cn.stylefeng.roses.kernel.system.integration.core.tag.SysDictRadioTag;
+import cn.stylefeng.roses.kernel.system.integration.core.tag.SysDictSelectTag;
+import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
+
+/**
+ * beetl拓展配置,绑定一些工具类,方便在模板中直接调用
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 11:18
+ */
+public class CustomBeetlGroupUtilConfiguration extends BeetlGroupUtilConfiguration {
+
+ private final LoginUserApi loginUserApi;
+
+ public CustomBeetlGroupUtilConfiguration(LoginUserApi loginUserApi) {
+ this.loginUserApi = loginUserApi;
+ }
+
+ @Override
+ public void initOther() {
+
+ // 获取当前用户的接口
+ groupTemplate.registerFunctionPackage("loginUser", loginUserApi);
+
+ // 对象工具类
+ groupTemplate.registerFunctionPackage("objectUtil", ObjectUtil.class);
+
+ // 获取基本信息的工具
+ groupTemplate.registerFunctionPackage("constants", SystemConfigExpander.class);
+
+ // 多语言
+ groupTemplate.registerFunctionPackage("translate", QuickTranslateUtil.class);
+
+ // 下拉选字典
+ groupTemplate.registerTag("dict_select", SysDictSelectTag.class);
+
+ // 单选字典
+ groupTemplate.registerTag("dict_radio", SysDictRadioTag.class);
+
+ // 多选字典
+ groupTemplate.registerTag("dict_checkbox", SysDictCheckBoxTag.class);
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/consts/BeetlConstants.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/consts/BeetlConstants.java
new file mode 100644
index 000000000..52e209677
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/consts/BeetlConstants.java
@@ -0,0 +1,46 @@
+package cn.stylefeng.roses.kernel.system.integration.core.consts;
+
+/**
+ * beetl模板引擎的常量
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:20
+ */
+public interface BeetlConstants {
+
+ /**
+ * 默认边界符开始
+ *
+ * beetl默认的是 '<%'
+ */
+ String DEFAULT_DELIMITER_STATEMENT_START = "@";
+
+ /**
+ * 默认beetl边界符的结束
+ *
+ * beetl默认的是 '%>'
+ */
+ String DEFAULT_DELIMITER_STATEMENT_END = "null";
+
+ /**
+ * 自定义标签文件Root目录
+ */
+ String DEFAULT_RESOURCE_TAG_ROOT = "common/tags";
+
+ /**
+ * 自定义标签文件后缀
+ */
+ String DEFAULT_RESOURCE_TAG_SUFFIX = "tag";
+
+ /**
+ * 是否检测文件变化,开发用true合适,但线上要改为false
+ */
+ String DEFAULT_RESOURCE_AUTO_CHECK = "false";
+
+ /**
+ * 默认beetl 支持HTML标签
+ *
+ * beetl默认的是 '#'
+ */
+ String DEFAULT_HTML_TAG_FLAG = "tag:";
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/consts/DictTagConstants.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/consts/DictTagConstants.java
new file mode 100644
index 000000000..2d905c28a
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/consts/DictTagConstants.java
@@ -0,0 +1,77 @@
+package cn.stylefeng.roses.kernel.system.integration.core.consts;
+
+/**
+ * 字典html属性常量
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 21:06
+ */
+
+public interface DictTagConstants {
+
+ /**
+ * html组件 id
+ */
+ String ID = "id";
+
+ /**
+ * html组件 name
+ */
+ String NAME = "name";
+
+ /**
+ * html组件 type
+ */
+ String TYPE = "type";
+
+ /**
+ * 字典类型编码
+ */
+ String DICT_TYPE_CODE = "dictTypeCode";
+
+ /**
+ * layui元素的风格
+ */
+ String LAY_SKIN = "laySkin";
+
+ /**
+ * layui事件过滤器
+ */
+ String LAY_FILTER = "layFilter";
+
+ /**
+ * layui校验
+ */
+ String LAY_VERIFY = "layVerify";
+
+ /**
+ * select控件提示name
+ */
+ String HEAD_NAME = "headName";
+
+ /**
+ * select控件提示value
+ */
+ String HEAD_VALUE = "headValue";
+
+ /**
+ * select控件提示类型::1-全部,2-请选择
+ */
+ String HEAD_TYPE = "headType";
+
+ /**
+ * 默认值
+ */
+ String DEFAULT_VALUE = "defaultValue";
+
+ /**
+ * 工作流相关
+ */
+ String WORKFLOW_FORM = "workflowForm";
+
+ /**
+ * 工作流相关
+ */
+ String ITEM_NAME = "itemName";
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/enums/SelectTagHeadTypeEnum.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/enums/SelectTagHeadTypeEnum.java
new file mode 100644
index 000000000..20399d676
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/enums/SelectTagHeadTypeEnum.java
@@ -0,0 +1,67 @@
+package cn.stylefeng.roses.kernel.system.integration.core.enums;
+
+import lombok.Getter;
+
+/**
+ * 字典下拉选头类型
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 20:36
+ */
+@Getter
+public enum SelectTagHeadTypeEnum {
+
+ /**
+ * 全部
+ */
+ ALL("1", "全部"),
+
+ /**
+ * 请选择
+ */
+ SELECT("2", "请选择");
+
+ private final String code;
+
+ private final String name;
+
+ SelectTagHeadTypeEnum(String code, String name) {
+ this.code = code;
+ this.name = name;
+ }
+
+ /**
+ * 根据code获取枚举
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 20:36
+ */
+ public static SelectTagHeadTypeEnum codeToEnum(String code) {
+ if (null != code) {
+ for (SelectTagHeadTypeEnum e : SelectTagHeadTypeEnum.values()) {
+ if (e.getCode().equals(code)) {
+ return e;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 编码转化成中文含义
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 20:36
+ */
+ public static String codeToName(String code) {
+ if (null != code) {
+ for (SelectTagHeadTypeEnum e : SelectTagHeadTypeEnum.values()) {
+ if (e.getCode().equals(code)) {
+ return e.getName();
+ }
+ }
+ }
+ return "未知";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/expander/BeetlConfigExpander.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/expander/BeetlConfigExpander.java
new file mode 100644
index 000000000..da81e00b5
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/expander/BeetlConfigExpander.java
@@ -0,0 +1,74 @@
+package cn.stylefeng.roses.kernel.system.integration.core.expander;
+
+import cn.stylefeng.roses.kernel.config.api.context.ConfigContext;
+import cn.stylefeng.roses.kernel.system.integration.core.consts.BeetlConstants;
+
+/**
+ * Beetl模板引擎相关配置
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 11:36
+ */
+public class BeetlConfigExpander {
+
+ /**
+ * 边界符开始符号
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:27
+ */
+ public static String getDelimiterStatementStart() {
+ return ConfigContext.me().getSysConfigValueWithDefault("DELIMITER_STATEMENT_START", String.class, BeetlConstants.DEFAULT_DELIMITER_STATEMENT_START);
+ }
+
+ /**
+ * beetl边界符的结束符号
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:27
+ */
+ public static String getDelimiterStatementEnd() {
+ return ConfigContext.me().getSysConfigValueWithDefault("DELIMITER_STATEMENT_END", String.class, BeetlConstants.DEFAULT_DELIMITER_STATEMENT_END);
+ }
+
+ /**
+ * 自定义标签文件Root目录
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:27
+ */
+ public static String getResourceTagRoot() {
+ return ConfigContext.me().getSysConfigValueWithDefault("RESOURCE_TAG_ROOT", String.class, BeetlConstants.DEFAULT_RESOURCE_TAG_ROOT);
+ }
+
+ /**
+ * 自定义标签文件后缀
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:27
+ */
+ public static String getResourceTagSuffix() {
+ return ConfigContext.me().getSysConfigValueWithDefault("RESOURCE_TAG_SUFFIX", String.class, BeetlConstants.DEFAULT_RESOURCE_TAG_SUFFIX);
+ }
+
+ /**
+ * 是否检测文件变化,开发用true合适,但线上要改为false
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 12:27
+ */
+ public static String getResourceAutoCheck() {
+ return ConfigContext.me().getSysConfigValueWithDefault("RESOURCE_AUTO_CHECK", String.class, BeetlConstants.DEFAULT_RESOURCE_AUTO_CHECK);
+ }
+
+ /**
+ * 自定义支持HTML标签
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 21:06
+ */
+ public static String getHtmlTagFlag() {
+ return ConfigContext.me().getSysConfigValueWithDefault("HTML_TAG_FLAG", String.class, BeetlConstants.DEFAULT_HTML_TAG_FLAG);
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictBaseTag.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictBaseTag.java
new file mode 100644
index 000000000..2e3f3fd37
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictBaseTag.java
@@ -0,0 +1,182 @@
+package cn.stylefeng.roses.kernel.system.integration.core.tag;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.stylefeng.roses.kernel.dict.modular.entity.SysDict;
+import cn.stylefeng.roses.kernel.dict.modular.entity.SysDictType;
+import cn.stylefeng.roses.kernel.dict.modular.service.DictService;
+import cn.stylefeng.roses.kernel.dict.modular.service.DictTypeService;
+import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
+import cn.stylefeng.roses.kernel.system.integration.core.consts.DictTagConstants;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.beetl.core.tag.GeneralVarTagBinding;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * beetl字典标签基类
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 18:45
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SysDictBaseTag extends GeneralVarTagBinding {
+
+ public DictService dictService = SpringUtil.getBean(DictService.class);
+
+ public DictTypeService dictTypeService = SpringUtil.getBean(DictTypeService.class);
+
+ /**
+ * html组件 id
+ */
+ public String id;
+
+ /**
+ * html组件 name
+ */
+ public String name;
+
+ /**
+ * html组件 type
+ */
+ public String type;
+
+ /**
+ * 字典类型编码
+ */
+ public String dictTypeCode;
+
+ /**
+ * layui元素的风格
+ */
+ public String laySkin;
+
+ /**
+ * layui事件过滤器
+ */
+ public String layFilter;
+
+ /**
+ * layui校验
+ */
+ public String layVerify;
+
+ /**
+ * select控件提示name
+ */
+ public String headName;
+
+ /**
+ * select控件提示value
+ */
+ public String headValue;
+
+ /**
+ * select控件提示类型::1-全部,2-请选择
+ */
+ public String headType;
+
+ /**
+ * 默认值
+ */
+ public String defaultValue;
+
+ /**
+ * 工作流相关
+ */
+ public String workflowForm;
+
+ /**
+ * 工作流相关
+ */
+ public String itemName;
+
+ /**
+ * 初始化绑定属性
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 23:49
+ */
+ public void initAttr() {
+ Map attrs = this.getAttributes();
+ if (attrs.size() > 0) {
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.ID))) {
+ this.setId(attrs.get(DictTagConstants.ID).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.NAME))) {
+ this.setName(attrs.get(DictTagConstants.NAME).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.TYPE))) {
+ this.setType(attrs.get(DictTagConstants.TYPE).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.DICT_TYPE_CODE))) {
+ this.setDictTypeCode(attrs.get(DictTagConstants.DICT_TYPE_CODE).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.LAY_SKIN))) {
+ this.setLaySkin(attrs.get(DictTagConstants.LAY_SKIN).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.LAY_FILTER))) {
+ this.setLayFilter(attrs.get(DictTagConstants.LAY_FILTER).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.LAY_VERIFY))) {
+ this.setLayVerify(attrs.get(DictTagConstants.LAY_VERIFY).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.HEAD_NAME))) {
+ this.setHeadName(attrs.get(DictTagConstants.HEAD_NAME).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.HEAD_VALUE))) {
+ this.setHeadValue(attrs.get(DictTagConstants.HEAD_VALUE).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.HEAD_TYPE))) {
+ this.setHeadType(attrs.get(DictTagConstants.HEAD_TYPE).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.DEFAULT_VALUE))) {
+ this.setDefaultValue(attrs.get(DictTagConstants.DEFAULT_VALUE).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.WORKFLOW_FORM))) {
+ this.setWorkflowForm(attrs.get(DictTagConstants.WORKFLOW_FORM).toString());
+ }
+ if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.ITEM_NAME))) {
+ this.setItemName(attrs.get(DictTagConstants.ITEM_NAME).toString());
+ }
+ }
+ }
+
+ @Override
+ public void render() {
+
+ }
+
+ /**
+ * 获取字典类型
+ *
+ * @return 字典类型
+ * @author liuhanqing
+ * @date 2021/1/16 23:46
+ */
+ public SysDictType getDictType() {
+ // 根据字典类型编码去查询字典类型
+ LambdaQueryWrapper dictTypeQueryWrapper = new LambdaQueryWrapper<>();
+ dictTypeQueryWrapper.eq(SysDictType::getDictTypeCode, this.getDictTypeCode());
+ dictTypeQueryWrapper.ne(SysDictType::getDelFlag, YesOrNotEnum.Y.getCode());
+ return dictTypeService.getOne(dictTypeQueryWrapper);
+ }
+
+ /**
+ * @return 根据字典类型返回字典集合
+ * @author liuhanqing
+ * @date 2021/1/16 23:46
+ */
+ public List getDictList() {
+ // 查询字典列表
+ LambdaQueryWrapper dictQueryWrapper = new LambdaQueryWrapper<>();
+ dictQueryWrapper.eq(SysDict::getDictTypeCode, this.getDictTypeCode());
+ dictQueryWrapper.ne(SysDict::getDelFlag, YesOrNotEnum.Y.getCode());
+ dictQueryWrapper.orderByAsc(SysDict::getDictSort);
+ return dictService.list(dictQueryWrapper);
+ }
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictCheckBoxTag.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictCheckBoxTag.java
new file mode 100644
index 000000000..bd886ea27
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictCheckBoxTag.java
@@ -0,0 +1,70 @@
+package cn.stylefeng.roses.kernel.system.integration.core.tag;
+
+import cn.hutool.core.util.StrUtil;
+import cn.stylefeng.roses.kernel.dict.modular.entity.SysDict;
+import cn.stylefeng.roses.kernel.dict.modular.entity.SysDictType;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * checkbox字典组件
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 19:06
+ */
+@Slf4j
+public class SysDictCheckBoxTag extends SysDictBaseTag {
+
+ @Override
+ public void render() {
+ // 初始属性
+ initAttr();
+ StringBuilder sb = new StringBuilder();
+ // 当字典类型编码不为空
+ if (StrUtil.isNotBlank(this.getDictTypeCode())) {
+ // 根据字典类型编码去查询字典类型
+ SysDictType dictType = getDictType();
+ // 判断字典类型不为空
+ if (dictType != null) {
+ List lst = getDictList();
+ // 默认选中值
+ String defaultValue = this.getDefaultValue();
+ // 循环字典列表
+ for (SysDict option : lst) {
+ // 生成input的id
+ String id = this.getType() + "_" + this.getName() + "_" + option.getDictCode();
+ // 拼接html
+ sb.append(" ");
+ }
+ }
+ }
+ try {
+ this.ctx.byteWriter.writeString(sb.toString());
+ } catch (IOException e) {
+ log.error("checkbox字典初始化异常:",e);
+ }
+ }
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictRadioTag.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictRadioTag.java
new file mode 100644
index 000000000..91e1e25d5
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictRadioTag.java
@@ -0,0 +1,77 @@
+package cn.stylefeng.roses.kernel.system.integration.core.tag;
+
+import cn.hutool.core.util.StrUtil;
+import cn.stylefeng.roses.kernel.dict.modular.entity.SysDict;
+import cn.stylefeng.roses.kernel.dict.modular.entity.SysDictType;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * radio字典组件
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 19:59
+ */
+@Slf4j
+public class SysDictRadioTag extends SysDictBaseTag {
+ @Override
+ public void render() {
+ // 初始属性
+ initAttr();
+ StringBuilder sb = new StringBuilder();
+ // 当字典类型编码不为空
+ if (StrUtil.isNotBlank(this.getDictTypeCode())) {
+ // 根据字典类型编码去查询字典类型
+ SysDictType dictType = getDictType();
+ // 判断字典类型不为空
+ if (dictType != null) {
+ List lst = getDictList();
+ // 默认选中值
+ String defaultValue = this.getDefaultValue();
+ int index = 0;
+ for (SysDict option : lst) {
+ // 生成input的id
+ String id = this.getType() + "_" + this.getName() + "_" + option.getDictCode();
+ // 拼接html
+ sb.append(" ");
+ index++;
+ }
+ }
+ }
+ try {
+ this.ctx.byteWriter.writeString(sb.toString());
+ } catch (IOException e) {
+ log.error("select字典初始化异常:", e);
+ }
+ }
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictSelectTag.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictSelectTag.java
new file mode 100644
index 000000000..728b868fd
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/core/tag/SysDictSelectTag.java
@@ -0,0 +1,96 @@
+package cn.stylefeng.roses.kernel.system.integration.core.tag;
+
+import cn.hutool.core.util.StrUtil;
+import cn.stylefeng.roses.kernel.dict.modular.entity.SysDict;
+import cn.stylefeng.roses.kernel.dict.modular.entity.SysDictType;
+import cn.stylefeng.roses.kernel.system.integration.core.enums.SelectTagHeadTypeEnum;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * select字典组件
+ *
+ * @author liuhanqing
+ * @date 2021/1/16 19:37
+ */
+@Slf4j
+public class SysDictSelectTag extends SysDictBaseTag {
+
+ @Override
+ public void render() {
+ // 初始属性
+ initAttr();
+ StringBuilder sb = new StringBuilder();
+ // 当字典类型编码不为空
+ if (StrUtil.isNotBlank(this.getDictTypeCode())) {
+ sb.append("");
+ }
+ try {
+ this.ctx.byteWriter.writeString(sb.toString());
+ } catch (IOException e) {
+ log.error("select字典初始化异常:",e);
+ }
+ }
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/api/ApiViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/api/ApiViewController.java
new file mode 100644
index 000000000..bcc9d86f7
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/api/ApiViewController.java
@@ -0,0 +1,28 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.api;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * API文档管理
+ *
+ * @author fengshuonan
+ * @date 2021/1/14 21:05
+ */
+@Controller
+@ApiResource(name = "API文档管理")
+public class ApiViewController {
+
+ /**
+ * 编辑应用界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 13:37
+ */
+ @GetResource(name = "API文档界面", path = "/view/api")
+ public String apiIndex() {
+ return "/modular/system/api/api.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/app/AppViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/app/AppViewController.java
new file mode 100644
index 000000000..d206eb009
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/app/AppViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.app;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 应用管理界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 13:32
+ */
+@Controller
+@ApiResource(name = "应用管理界面")
+public class AppViewController {
+
+ /**
+ * 应用管理首页
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 13:32
+ */
+ @GetResource(name = "应用管理首页", path = "/view/app")
+ public String appIndex() {
+ return "/modular/system/app/app.html";
+ }
+
+ /**
+ * 新增应用界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 13:37
+ */
+ @GetResource(name = "新增应用界面", path = "/view/app/add")
+ public String appAdd() {
+ return "/modular/system/app/app_add.html";
+ }
+
+ /**
+ * 编辑应用界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 13:37
+ */
+ @GetResource(name = "编辑应用界面", path = "/view/app/edit")
+ public String appEdit() {
+ return "/modular/system/app/app_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/common/CommonViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/common/CommonViewController.java
new file mode 100644
index 000000000..c91d5001e
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/common/CommonViewController.java
@@ -0,0 +1,46 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.common;
+
+import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
+import cn.stylefeng.roses.kernel.rule.exception.enums.defaults.DefaultBusinessExceptionEnum;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import cn.stylefeng.roses.kernel.system.integration.modular.system.common.pojo.CommonTreeRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+
+import javax.validation.Valid;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+/**
+ * 通用界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 20:18
+ */
+@Controller
+@Slf4j
+@ApiResource(name = "通用界面")
+public class CommonViewController {
+
+ /**
+ * 通用的树列表选择器
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 20:19
+ */
+ @GetResource(name = "通用的树列表选择器", path = "/view/common/tree")
+ public String commonTreeSelect(@Valid CommonTreeRequest commonTreeRequest, Model model) {
+ try {
+ model.addAttribute("formName", URLDecoder.decode(commonTreeRequest.getFormName(), "UTF-8"));
+ model.addAttribute("formId", URLDecoder.decode(commonTreeRequest.getFormId(), "UTF-8"));
+ model.addAttribute("treeUrl", URLDecoder.decode(commonTreeRequest.getTreeUrl(), "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ log.error("解析url的参数出错!", e);
+ throw new ServiceException("guns-standalone-beetl", DefaultBusinessExceptionEnum.SYSTEM_RUNTIME_ERROR);
+ }
+ return "/component/tree_dlg.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/common/pojo/CommonTreeRequest.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/common/pojo/CommonTreeRequest.java
new file mode 100644
index 000000000..7e729cd17
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/common/pojo/CommonTreeRequest.java
@@ -0,0 +1,34 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.common.pojo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 通用树选择器界面的请求参数
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 20:20
+ */
+@Data
+public class CommonTreeRequest {
+
+ /**
+ * 传递给上级页面的哪个字段,例如 parent.MenuInfoDlg.data.pcodeName
+ */
+ @NotBlank(message = "fromName不能为空")
+ private String formName;
+
+ /**
+ * 传递给上级页面的哪个id值,例如 parent.MenuInfoDlg.data.pid
+ */
+ @NotBlank(message = "formId不能为空")
+ private String formId;
+
+ /**
+ * 渲染出数据的url,例如/menu/selectMenuTreeList
+ */
+ @NotBlank(message = "tree渲染的url参数不能为空")
+ private String treeUrl;
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/config/ConfigViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/config/ConfigViewController.java
new file mode 100644
index 000000000..f32c1ee70
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/config/ConfigViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.config;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 系统配置相关页面渲染
+ *
+ * @author jiawei
+ * @date 2021/1/10 14:28
+ */
+@Controller
+@ApiResource(name = "系统配置相关页面")
+public class ConfigViewController {
+
+ /**
+ * 系统配置-首页-视图
+ *
+ * @author jiawei
+ * @date 2021/1/4 13:33
+ */
+ @GetResource(name = "系统配置-列表-视图", path = "/view/config")
+ public String indexView() {
+ return "/modular/system/config/config.html";
+ }
+
+ /**
+ * 系统配置—新增-视图
+ *
+ * @author jiawei
+ * @date 2021/1/4 13:34
+ */
+ @GetResource(name = "系统配置—新增-视图", path = "/view/config/addView")
+ public String addView() {
+ return "/modular/system/config/sysConfig_add.html";
+ }
+
+ /**
+ * 系统配置-修改-视图
+ *
+ * @author jiawei
+ * @date 2021/1/4 13:35
+ */
+ @GetResource(name = "系统配置-修改-视图", path = "/view/config/editView")
+ public String editView() {
+ return "/modular/system/config/sysConfig_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dashboard/DashboardViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dashboard/DashboardViewController.java
new file mode 100644
index 000000000..29b6ff132
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dashboard/DashboardViewController.java
@@ -0,0 +1,39 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.dashboard;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 工作台和分析页界面渲染
+ *
+ * @author fengshuonan
+ * @date 2020/12/29 21:29
+ */
+@Controller
+@ApiResource(name = "工作台和分析页面")
+public class DashboardViewController {
+
+ /**
+ * 工作台
+ *
+ * @author fengshuonan
+ * @date 2018/12/24 22:43
+ */
+ @GetResource(name = "工作台", path = "/view/dashboard/workplace", requiredPermission = false)
+ public String platform() {
+ return "/modular/system/dashboard/board_platform.html";
+ }
+
+ /**
+ * 分析页面
+ *
+ * @author fengshuonan
+ * @date 2020/12/29 21:27
+ */
+ @GetResource(name = "分析页面", path = "/view/dashboard/analysis", requiredPermission = false)
+ public String analyse() {
+ return "/modular/system/dashboard/board_analyse.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dataCenter/dataCenterViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dataCenter/dataCenterViewController.java
new file mode 100644
index 000000000..2bbe50fee
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dataCenter/dataCenterViewController.java
@@ -0,0 +1,39 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.dataCenter;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 数据中心视图控制器
+ *
+ * @author linjinfeng
+ * @date 2021/3/29 10:00
+ */
+@Controller
+@ApiResource(name = "数据中心导入导出相关的界面渲染")
+public class dataCenterViewController {
+
+ /**
+ * 基础数据-导出中心-视图
+ *
+ * @author linjinfeng
+ * @date 2021/3/29 10:00
+ */
+ @GetResource(name = "基础数据-导出中心-视图", path = "/view/export")
+ public String exportView() {
+ return "/modular/system/dataCenter/exportCenter.html";
+ }
+
+ /**
+ * 基础数据-导入中心-视图
+ *
+ * @author linjinfeng
+ * @date 2021/3/29 10:00
+ */
+ @GetResource(name = "基础数据-导出中心-视图", path = "/view/import")
+ public String importView() {
+ return "/modular/system/dataCenter/importCenter.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/datasource/DataSourceViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/datasource/DataSourceViewController.java
new file mode 100644
index 000000000..649ecf433
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/datasource/DataSourceViewController.java
@@ -0,0 +1,40 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.datasource;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 多数据源界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/23 21:45
+ */
+@Controller
+@ApiResource(name = "多数据源界面")
+public class DataSourceViewController {
+
+ /**
+ * 多数据源列表界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/23 21:45
+ */
+ @GetResource(name = "多数据源列表界面", path = "/view/datasource")
+ public String indexView() {
+ return "/modular/system/datasource/datasource.html";
+ }
+
+ /**
+ * 多数据源新增界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/23 21:59
+ */
+ @GetResource(name = "多数据源新增界面", path = "/view/datasource/add")
+ public String addView() {
+ return "/modular/system/datasource/datasource_add.html";
+ }
+
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dict/DictTypeViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dict/DictTypeViewController.java
new file mode 100644
index 000000000..4fe53e073
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dict/DictTypeViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.dict;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 字典类型视图控制器
+ *
+ * @author huangyao
+ * @date 2021/1/6 20:53
+ **/
+@Controller
+@ApiResource(name = "字典类型管理相关的界面渲染")
+public class DictTypeViewController {
+
+ /**
+ * 字典管理-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+ @GetResource(name = "字典类型管理-列表-视图", path = "/view/dictType")
+ public String indexView() {
+ return "/modular/system/dict/dictType.html";
+ }
+
+ /**
+ * 字典类型管理-添加-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+ @GetResource(name = "字典类型管理-添加-视图", path = "/view/dictType/addView")
+ public String addView() {
+ return "/modular/system/dict/dictType_add.html";
+ }
+
+ /**
+ * 字典类型管理-编辑-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+ @GetResource(name = "字典类型管理-编辑-视图", path = "/view/dictType/editView")
+ public String editView() {
+ return "/modular/system/dict/dictType_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dict/DictViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dict/DictViewController.java
new file mode 100644
index 000000000..848cd6b7e
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/dict/DictViewController.java
@@ -0,0 +1,62 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.dict;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 字典视图控制器
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+@Controller
+@ApiResource(name = "字典管理相关的界面渲染")
+public class DictViewController {
+
+ /**
+ * 字典管理-列表-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+ @GetResource(name = "字典管理-列表-视图", path = "/view/dict")
+ public String indexView() {
+ return "/modular/system/dict/dict.html";
+ }
+
+ /**
+ * 字典管理-添加-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+ @GetResource(name = "字典管理-添加-视图", path = "/view/dict/addView")
+ public String addView() {
+ return "/modular/system/dict/dict_add.html";
+ }
+
+ /**
+ * 字典管理-添加系统配置字典-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+ @GetResource(name = "字典管理-添加系统配置字典-视图", path = "/view/dict/addConfigView")
+ public String addConfigView() {
+ return "/modular/system/dict/dict_add_config.html";
+ }
+
+
+ /**
+ * 字典管理-编辑-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+ @GetResource(name = "字典管理-编辑-视图", path = "/view/dict/editView")
+ public String editView() {
+ return "/modular/system/dict/dict_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/error/ErrorViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/error/ErrorViewController.java
new file mode 100644
index 000000000..7ea8c3e4c
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/error/ErrorViewController.java
@@ -0,0 +1,30 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.error;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+
+/**
+ * 错误页面的跳转
+ *
+ * @author fengshuonan
+ * @date 2021/1/1 21:20
+ */
+@Controller
+@ApiResource(name = "错误页面的跳转")
+public class ErrorViewController {
+
+ /**
+ * 跳转到session超时页面
+ *
+ * @author fengshuonan
+ * @date 2021/1/1 21:21
+ */
+ @GetResource(name = "跳转到session超时页面", path = "/view/global/sessionError", requiredPermission = false, requiredLogin = false)
+ public String errorPageInfo(Model model) {
+ model.addAttribute("tips", "登陆超时,请您重新登陆!");
+ return "/login.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/file/FileViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/file/FileViewController.java
new file mode 100644
index 000000000..2176e890a
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/file/FileViewController.java
@@ -0,0 +1,39 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.file;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 文件管理界面
+ *
+ * @author lgq
+ * @date 2021/1/9
+ */
+@Controller
+@ApiResource(name = "文件管理界面")
+public class FileViewController {
+
+ /**
+ * 文件管理首页
+ *
+ * @author lgq
+ * @date 2021/1/9
+ */
+ @GetResource(name = "文件管理首页", path = "/view/file")
+ public String fileIndex() {
+ return "/modular/system/fileInfo/file_info.html";
+ }
+
+ /**
+ * 文件详情页面
+ *
+ * @author lgq
+ * @date 2021/1/9
+ */
+ @GetResource(name = "文件详情页面", path = "/view/fileInfoDetails")
+ public String details() {
+ return "/modular/system/fileInfo/file_info_details.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/i18n/TranslationViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/i18n/TranslationViewController.java
new file mode 100644
index 000000000..beaea9d2f
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/i18n/TranslationViewController.java
@@ -0,0 +1,61 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.i18n;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 多语言界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/24 19:15
+ */
+@Controller
+@ApiResource(name = "多语言界面")
+public class TranslationViewController {
+
+ /**
+ * 多语言主界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/24 19:15
+ */
+ @GetResource(name = "文件管理首页", path = "/view/i18n")
+ public String index() {
+ return "/modular/system/i18n/translation.html";
+ }
+
+ /**
+ * 多语言新增界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/24 19:16
+ */
+ @GetResource(name = "多语言新增界面", path = "/view/i18n/add")
+ public String add() {
+ return "/modular/system/i18n/translation_add.html";
+ }
+
+ /**
+ * 多语言编辑界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/24 19:16
+ */
+ @GetResource(name = "文件管理首页", path = "/view/i18n/edit")
+ public String edit() {
+ return "/modular/system/i18n/translation_edit.html";
+ }
+
+ /**
+ * 多语言增加语种界面
+ *
+ * @author chenjinlong
+ * @date 2021/1/22 16:09
+ */
+ @GetResource(name = "多语言增加语种界面", path = "/view/i18n/addTranslationView")
+ public String addTranslationView() {
+ return "/modular/system/i18n/dict_add_translation.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/index/controller/IndexViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/index/controller/IndexViewController.java
new file mode 100644
index 000000000..cfaee710e
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/index/controller/IndexViewController.java
@@ -0,0 +1,89 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.index.controller;
+
+import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import cn.stylefeng.roses.kernel.system.integration.modular.system.index.service.IndexService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+
+import javax.annotation.Resource;
+
+/**
+ * 首页相关的界面渲染
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 16:23
+ */
+@Controller
+@ApiResource(name = "首页相关的界面渲染")
+public class IndexViewController {
+
+ @Resource
+ private IndexService indexService;
+
+ /**
+ * 首页界面
+ *
+ * @author fengshuonan
+ * @date 2020/12/13 17:19
+ */
+ @GetResource(name = "首页界面", path = "/", requiredLogin = false, requiredPermission = false, viewFlag = true)
+ public String indexView(Model model) {
+
+ // 当前用户已经登录,跳转到首页
+ if (LoginContext.me().hasLogin()) {
+ model.addAllAttributes(indexService.createIndexRenderAttributes());
+ return "/index.html";
+ }
+
+ // 当前用户没有登录,跳转到登录页面
+ return "/login.html";
+ }
+
+ /**
+ * 个人中心界面
+ *
+ * @author fengshuonan
+ * @date 2020/12/29 21:53
+ */
+ @GetResource(name = "个人中心界面", path = "/view/personal", requiredPermission = false)
+ public String personal(Model model) {
+ model.addAllAttributes(indexService.createPersonInfoRenderAttributes());
+ return "/modular/system/index/personal_info.html";
+ }
+
+ /**
+ * 锁屏界面
+ *
+ * @author fengshuonan
+ * @date 2020/12/29 21:34
+ */
+ @GetResource(name = "锁屏界面", path = "/view/lock", requiredPermission = false)
+ public String lock() {
+ return "/modular/system/index/lock_screen.html";
+ }
+
+ /**
+ * 主题切换界面
+ *
+ * @author fengshuonan
+ * @date 2020/12/29 21:42
+ */
+ @GetResource(name = "主题切换界面", path = "/view/theme", requiredPermission = false)
+ public String theme() {
+ return "/modular/system/index/theme.html";
+ }
+
+ /**
+ * 修改密码界面
+ *
+ * @author fengshuonan
+ * @date 2020/12/29 21:42
+ */
+ @GetResource(name = "修改密码界面", path = "/view/changePassword", requiredPermission = false)
+ public String changePassword() {
+ return "/modular/system/index/change_password.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/index/service/IndexService.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/index/service/IndexService.java
new file mode 100644
index 000000000..159e19f60
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/index/service/IndexService.java
@@ -0,0 +1,145 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.index.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
+import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
+import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo;
+import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
+import cn.stylefeng.roses.kernel.message.api.MessageApi;
+import cn.stylefeng.roses.kernel.message.api.enums.MessageReadFlagEnum;
+import cn.stylefeng.roses.kernel.message.api.pojo.request.MessageRequest;
+import cn.stylefeng.roses.kernel.system.api.pojo.menu.layui.LayuiAppIndexMenusVO;
+import cn.stylefeng.roses.kernel.system.api.pojo.menu.layui.LayuiIndexMenuTreeNode;
+import cn.stylefeng.roses.kernel.system.modular.menu.service.SysMenuService;
+import cn.stylefeng.roses.kernel.system.modular.organization.entity.HrOrganization;
+import cn.stylefeng.roses.kernel.system.modular.organization.service.HrOrganizationService;
+import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 首页相关数据组装服务
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 18:25
+ */
+@Service
+public class IndexService {
+
+ @Resource
+ private SysMenuService sysMenuService;
+
+ @Resource
+ private SysUserService sysUserService;
+
+ @Resource
+ private HrOrganizationService hrOrganizationService;
+
+ @Resource
+ private MessageApi messageApi;
+
+ /**
+ * 获取首页需要渲染的参数
+ *
+ * @author fengshuonan
+ * @date 2021/1/1 18:27
+ */
+ public Map createIndexRenderAttributes() {
+
+ HashMap renderMap = new HashMap<>();
+
+ LoginUser loginUser = LoginContext.me().getLoginUser();
+ SimpleUserInfo simpleUserInfo = loginUser.getSimpleUserInfo();
+
+ // 渲染首页的菜单
+ List layuiAppIndexMenus = sysMenuService.getLayuiIndexMenus();
+
+ // 将个人信息菜单单独去除掉
+ this.removePersonalMenu(layuiAppIndexMenus);
+
+ renderMap.put("layuiAppIndexMenus", layuiAppIndexMenus);
+
+ // 获取首页的头像
+ renderMap.put("avatar", sysUserService.getUserAvatarUrl(simpleUserInfo.getAvatar()));
+
+ // 获取人员姓名
+ renderMap.put("name", simpleUserInfo.getRealName());
+
+ // 获取登录用户ws-url
+ renderMap.put("wsUrl", loginUser.getWsUrl());
+
+ // 未读消息数量
+ MessageRequest messageRequest = new MessageRequest();
+ messageRequest.setReadFlag(MessageReadFlagEnum.UNREAD.getCode());
+ renderMap.put("msgUnReadCount", messageApi.queryCountCurrentUser(messageRequest));
+
+ return renderMap;
+ }
+
+ /**
+ * 创建个人中心页面需要渲染的值
+ *
+ * @author fengshuonan
+ * @date 2021/1/1 18:38
+ */
+ public Map createPersonInfoRenderAttributes() {
+
+ HashMap renderMap = new HashMap<>();
+ renderMap.put("roleName", "角色空");
+ renderMap.put("orgName", "组织架构空");
+
+ // 添加用户基本信息字段
+ LoginUser loginUser = LoginContext.me().getLoginUser();
+ SimpleUserInfo simpleUserInfo = loginUser.getSimpleUserInfo();
+ renderMap.putAll(BeanUtil.beanToMap(simpleUserInfo));
+
+ // 角色名称
+ List simpleRoleInfoList = loginUser.getSimpleRoleInfoList();
+ if (ObjectUtil.isNotEmpty(simpleRoleInfoList)) {
+ String roleName = simpleRoleInfoList.get(0).getRoleName();
+ renderMap.put("roleName", roleName);
+ }
+
+ // 组织机构名称
+ Long organizationId = loginUser.getOrganizationId();
+ HrOrganization hrOrganization = hrOrganizationService.getById(organizationId);
+ if (hrOrganization != null) {
+ renderMap.put("orgName", hrOrganization.getOrgName());
+ }
+
+ // 渲染头像的url
+ renderMap.put("avatar", sysUserService.getUserAvatarUrl(simpleUserInfo.getAvatar()));
+
+ return renderMap;
+ }
+
+ /**
+ * 去除个人信息菜单显示
+ *
+ * @author fengshuonan
+ * @date 2021/5/14 16:30
+ */
+ private void removePersonalMenu(List layuiAppIndexMenusVOS) {
+
+ ArrayList menus = new ArrayList<>();
+
+ for (LayuiAppIndexMenusVO layuiAppIndexMenusVO : layuiAppIndexMenusVOS) {
+ if (layuiAppIndexMenusVO.getAppCode().equals("system")) {
+ List layuiIndexMenuTreeNodes = layuiAppIndexMenusVO.getLayuiIndexMenuTreeNodes();
+ for (LayuiIndexMenuTreeNode layuiIndexMenuTreeNode : layuiIndexMenuTreeNodes) {
+ if (!layuiIndexMenuTreeNode.getMenuName().equals("个人信息")) {
+ menus.add(layuiIndexMenuTreeNode);
+ }
+ }
+ layuiAppIndexMenusVO.setLayuiIndexMenuTreeNodes(menus);
+ }
+ }
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/log/LogViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/log/LogViewController.java
new file mode 100644
index 000000000..b984bc47e
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/log/LogViewController.java
@@ -0,0 +1,39 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.log;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 业务日志视图控制器
+ *
+ * @author chenjinlong
+ * @date 2021/1/13 19:45
+ */
+@Controller
+@ApiResource(name = "操作日志管理相关的界面渲染")
+public class LogViewController {
+
+ /**
+ * 操作日志管理列表
+ *
+ * @author TSQ
+ * @date 2021/1/5 15:18
+ */
+ @GetResource(name = "操作日志管理列表", path = "/view/log")
+ public String indexView() {
+ return "/modular/system/log/log.html";
+ }
+
+ /**
+ * 业务日志详情-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/13 19:45
+ */
+ @GetResource(name = "业务日志详情-视图", path = "/view/log/detailView")
+ public String detailView() {
+ return "/modular/system/log/log_detail.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/log/LoginLogViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/log/LoginLogViewController.java
new file mode 100644
index 000000000..f6991df54
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/log/LoginLogViewController.java
@@ -0,0 +1,28 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.log;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 登陆日志管理控制器界面渲染
+ *
+ * @author TSQ
+ * @date 2021/1/5 14:42
+ */
+@Controller
+@ApiResource(name = "登陆日志管理相关的界面渲染")
+public class LoginLogViewController {
+
+ /**
+ * 登陆日志管理列表
+ *
+ * @author TSQ
+ * @date 2021/1/5 15:17
+ */
+ @GetResource(name = "登陆日志管理列表", path = "/view/loginLog")
+ public String indexView() {
+ return "/modular/system/log/login_log.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/login/LoginViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/login/LoginViewController.java
new file mode 100644
index 000000000..1e5565cb2
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/login/LoginViewController.java
@@ -0,0 +1,33 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.login;
+
+import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 登录相关的界面渲染
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 16:23
+ */
+@Controller
+@ApiResource(name = "登录相关的接口")
+public class LoginViewController {
+
+ /**
+ * 登录界面
+ *
+ * @author fengshuonan
+ * @date 2020/12/27 17:10
+ */
+ @GetResource(name = "登录界面", path = "/view/login", requiredPermission = false, requiredLogin = false)
+ public String login() {
+ if (LoginContext.me().hasLogin()) {
+ return "redirect:/";
+ } else {
+ return "/login.html";
+ }
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/menu/MenuButtonViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/menu/MenuButtonViewController.java
new file mode 100644
index 000000000..701f1afc2
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/menu/MenuButtonViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.menu;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 菜单按钮管理界面
+ *
+ * @author luojie
+ * @date 2021/1/9 16:11
+ */
+@Controller
+@ApiResource(name = "菜单按钮管理界面")
+public class MenuButtonViewController {
+
+ /**
+ * 菜单按钮管理首页
+ *
+ * @author luojie
+ * @date 2021/1/9 16:13
+ */
+ @GetResource(name = "菜单管理首页", path = "/view/menuButton")
+ public String menuIndex() {
+ return "/modular/system/menu/button.html";
+ }
+
+ /**
+ * 新增菜单按钮界面
+ *
+ * @author luojie
+ * @date 2021/1/9 13:56
+ */
+ @GetResource(name = "新增菜单按钮界面", path = "/view/menuButton/add")
+ public String menuAdd() {
+ return "/modular/system/menu/button_add.html";
+ }
+
+ /**
+ * 修改菜单按钮界面
+ *
+ * @author luojie
+ * @date 2021/1/9 14:14
+ */
+ @GetResource(name = "修改菜单按钮界面", path = "/view/menuButton/edit")
+ public String menuEdit() {
+ return "/modular/system/menu/button_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/menu/MenuViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/menu/MenuViewController.java
new file mode 100644
index 000000000..b03c0e213
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/menu/MenuViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.menu;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 菜单管理界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 16:43
+ */
+@Controller
+@ApiResource(name = "菜单管理界面")
+public class MenuViewController {
+
+ /**
+ * 菜单管理首页
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 13:32
+ */
+ @GetResource(name = "菜单管理首页", path = "/view/menu")
+ public String menuIndex() {
+ return "/modular/system/menu/menu.html";
+ }
+
+ /**
+ * 新增菜单界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 13:37
+ */
+ @GetResource(name = "新增菜单界面", path = "/view/menu/add")
+ public String menuAdd() {
+ return "/modular/system/menu/menu_add.html";
+ }
+
+ /**
+ * 修改菜单界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/6 13:37
+ */
+ @GetResource(name = "修改菜单界面", path = "/view/menu/edit")
+ public String menuEdit() {
+ return "/modular/system/menu/menu_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/message/MessageViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/message/MessageViewController.java
new file mode 100644
index 000000000..ce123e594
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/message/MessageViewController.java
@@ -0,0 +1,68 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.message;
+
+import cn.stylefeng.roses.kernel.message.api.MessageApi;
+import cn.stylefeng.roses.kernel.message.api.enums.MessageReadFlagEnum;
+import cn.stylefeng.roses.kernel.message.api.pojo.request.MessageRequest;
+import cn.stylefeng.roses.kernel.message.api.pojo.response.MessageResponse;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 系统消息相关的界面渲染
+ *
+ * @author liuhanqing
+ * @date 2021/1/11 19:37
+ */
+@Controller
+@ApiResource(name = "系统消息相关的界面渲染")
+public class MessageViewController {
+
+ @Resource
+ private MessageApi messageApi;
+
+ /**
+ * 系统消息界面
+ *
+ * @author liuhanqing
+ * @date 2021/1/10 17:42
+ */
+ @GetResource(name = "系统消息界面", path = "/view/message", requiredPermission = false)
+ public String message(Model model) {
+ MessageRequest messageRequest = new MessageRequest();
+ messageRequest.setReadFlag(MessageReadFlagEnum.UNREAD.getCode());
+ Integer messageCount = messageApi.queryCountCurrentUser(messageRequest);
+ List messageList = messageApi.queryListCurrentUser(messageRequest);
+ model.addAttribute("msgUnReadCount", messageCount);
+ model.addAttribute("msgUnReadList", messageList);
+ return "/modular/system/index/message.html";
+ }
+
+ /**
+ * 我的消息界面
+ *
+ * @author liuhanqing
+ * @date 2021/1/12 20:22
+ */
+ @GetResource(name = "我的消息界面", path = "/view/message_list", requiredPermission = false)
+ public String indexView() {
+ return "/modular/system/message/message_list.html";
+ }
+
+ /**
+ * 我的消息界面
+ *
+ * @author liuhanqing
+ * @date 2021/1/12 20:22
+ */
+ @GetResource(name = "我的消息界面", path = "/view/message_view", requiredPermission = false)
+ public String view(Model model) {
+ model.addAttribute("openType", "view");
+ return "/modular/system/message/message_view.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/monitor/MonitorController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/monitor/MonitorController.java
new file mode 100644
index 000000000..4474ab27b
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/monitor/MonitorController.java
@@ -0,0 +1,47 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.monitor;
+
+import cn.stylefeng.roses.kernel.monitor.system.holder.SystemHardwareInfoHolder;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+
+import javax.annotation.Resource;
+
+/**
+ * 项目监控
+ *
+ * @author chenli
+ * @date 2020/12/30 16:40
+ */
+@Controller
+@ApiResource(name = "项目监控")
+public class MonitorController {
+
+ @Resource
+ private SystemHardwareInfoHolder systemHardwareInfoHolder;
+
+ /**
+ * 系统硬件信息页面
+ *
+ * @author fengshuonan
+ * @date 2018/12/24 22:43
+ */
+ @GetResource(name = "服务器监控", path = "/view/monitor/systemInfo")
+ public String systemInfo(Model model) {
+ model.addAttribute("server", systemHardwareInfoHolder.getSystemHardwareInfo());
+ return "/modular/system/monitor/systemInfo.html";
+ }
+
+ /**
+ * druid sql监控页面
+ *
+ * @author chenli
+ * @date 2021/1/4 16:32
+ */
+ @GetResource(name = "SQL监控", path = "/view/monitor/druid")
+ public String druidInfo() {
+ return "/modular/system/monitor/druid.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/notice/NoticeViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/notice/NoticeViewController.java
new file mode 100644
index 000000000..d32e2d815
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/notice/NoticeViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.notice;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 通知管理界面
+ *
+ * @author liuhanqing
+ * @date 2021/1/8 20:55
+ */
+@Controller
+@ApiResource(name = "通知管理界面")
+public class NoticeViewController {
+
+ /**
+ * 通知管理首页
+ *
+ * @author liuhanqing
+ * @date 2021/1/8 20:55
+ */
+ @GetResource(name = "通知管理列表", path = "/view/notice")
+ public String roleIndex() {
+ return "/modular/system/notice/notice.html";
+ }
+
+ /**
+ * 新增通知界面
+ *
+ * @author liuhanqing
+ * @date 2021/1/8 20:57
+ */
+ @GetResource(name = "新增通知界面", path = "/view/notice/add")
+ public String roleAdd() {
+ return "/modular/system/notice/notice_add.html";
+ }
+
+ /**
+ * 编辑通知界面
+ *
+ * @author liuhanqing
+ * @date 2021/1/8 20:57
+ */
+ @GetResource(name = "编辑通知界面", path = "/view/notice/edit")
+ public String roleEdit() {
+ return "/modular/system/notice/notice_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/online/OnlineUserViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/online/OnlineUserViewController.java
new file mode 100644
index 000000000..226c1ac91
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/online/OnlineUserViewController.java
@@ -0,0 +1,28 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.online;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 在线用户查看界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/11 22:02
+ */
+@Controller
+@ApiResource(name = "在线用户查看界面")
+public class OnlineUserViewController {
+
+ /**
+ * 在线用户查看界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/11 22:03
+ */
+ @GetResource(name = "在线用户查看界面", path = "/view/onlineUser")
+ public String onlineUser() {
+ return "/modular/system/onlineUser/online_user.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/organization/OrganizationViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/organization/OrganizationViewController.java
new file mode 100644
index 000000000..2e2972b7a
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/organization/OrganizationViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.organization;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 组织机构管理控制器界面
+ *
+ * @author chenjinlong
+ * @date 2020/12/28 9:28
+ */
+@Controller
+@ApiResource(name = "组织机构管理控制器界面")
+public class OrganizationViewController {
+
+ /**
+ * 机构管理-首页-视图
+ *
+ * @author chenjinlong
+ * @date 2020/11/04 11:07
+ */
+ @GetResource(name = "机构管理-首页-视图", path = "/view/organization")
+ public String indexView() {
+ return "/modular/system/organization/organization.html";
+ }
+
+ /**
+ * 机构管理—新增-视图
+ *
+ * @author chenjinlong
+ * @date 2020/11/04 11:07
+ */
+ @GetResource(name = "机构管理—新增-视图", path = "/view/organization/addView")
+ public String addView() {
+ return "/modular/system/organization/organization_add.html";
+ }
+
+ /**
+ * 机构管理_修改_视图
+ *
+ * @author chenjinlong
+ * @date 2020/11/04 11:07
+ */
+ @GetResource(name = "机构管理-修改-视图", path = "/view/organization/editView")
+ public String editView() {
+ return "/modular/system/organization/organization_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/package-info.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/package-info.java
new file mode 100644
index 000000000..e1c4ae53c
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * 这个包是Guns框架自带业务的代码
+ */
+package cn.stylefeng.roses.kernel.system.integration.modular.system;
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/position/PositionViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/position/PositionViewController.java
new file mode 100644
index 000000000..138664945
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/position/PositionViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.position;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 职位管理控制器
+ *
+ * @author chenjinlong
+ * @date 2020/12/28 9:28
+ */
+@Controller
+@ApiResource(name = "职位管理相关的界面渲染")
+public class PositionViewController {
+
+ /**
+ * 职位管理-首页-视图
+ *
+ * @author chenjinlong
+ * @date 2020/11/04 11:07
+ */
+ @GetResource(name = "职位管理-首页-视图", path = "/view/position")
+ public String indexView() {
+ return "/modular/system/position/position.html";
+ }
+
+ /**
+ * 职位管理-首页-视图
+ *
+ * @author chenjinlong
+ * @date 2020/11/04 11:07
+ */
+ @GetResource(name = "职位管理-首页-视图", path = "/view/position/addView")
+ public String addView() {
+ return "/modular/system/position/position_add.html";
+ }
+
+ /**
+ * 职位管理-首页-视图
+ *
+ * @author chenjinlong
+ * @date 2020/11/04 11:07
+ */
+ @GetResource(name = "职位管理-首页-视图", path = "/view/position/editView")
+ public String editView() {
+ return "/modular/system/position/position_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/resource/ResourceViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/resource/ResourceViewController.java
new file mode 100644
index 000000000..5f54a7ba3
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/resource/ResourceViewController.java
@@ -0,0 +1,39 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.resource;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 资源管理界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/8 21:59
+ */
+@Controller
+@ApiResource(name = "资源管理界面")
+public class ResourceViewController {
+
+ /**
+ * 资源管理首页
+ *
+ * @author fengshuonan
+ * @date 2021/1/8 21:59
+ */
+ @GetResource(name = "资源管理首页", path = "/view/resource")
+ public String resourceIndex() {
+ return "/modular/system/resource/resource.html";
+ }
+
+ /**
+ * 资源管理详情
+ *
+ * @author fengshuonan
+ * @date 2021/1/8 22:23
+ */
+ @GetResource(name = "资源管理详情", path = "/view/resource/detail")
+ public String resourceDetail() {
+ return "/modular/system/resource/resource_detail.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/role/RoleViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/role/RoleViewController.java
new file mode 100644
index 000000000..7847a45ff
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/role/RoleViewController.java
@@ -0,0 +1,83 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.role;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 角色管理界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/8 20:55
+ */
+@Controller
+@ApiResource(name = "角色管理界面")
+public class RoleViewController {
+
+ /**
+ * 角色管理首页
+ *
+ * @author fengshuonan
+ * @date 2021/1/8 20:55
+ */
+ @GetResource(name = "应用管理首页", path = "/view/role")
+ public String roleIndex() {
+ return "/modular/system/role/role.html";
+ }
+
+ /**
+ * 新增角色界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/8 20:57
+ */
+ @GetResource(name = "新增角色界面", path = "/view/role/add")
+ public String roleAdd() {
+ return "/modular/system/role/role_add.html";
+ }
+
+ /**
+ * 编辑角色界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/8 20:57
+ */
+ @GetResource(name = "编辑角色界面", path = "/view/role/edit")
+ public String roleEdit() {
+ return "/modular/system/role/role_edit.html";
+ }
+
+ /**
+ * 修改数据范围界面
+ *
+ * @author fengshuonan
+ * @date 2021/1/8 20:57
+ */
+ @GetResource(name = "修改数据范围界面", path = "/view/role/editDataScope")
+ public String roleEditDataScope() {
+ return "/modular/system/role/role_edit_data_scope.html";
+ }
+
+ /**
+ * 分配接口界面
+ *
+ * @author majianguo
+ * @date 2021/1/9 11:43
+ */
+ @GetResource(name = "分配接口界面", path = "/view/role/assignApi")
+ public String roleAssignApi() {
+ return "/modular/system/role/role_assign_api.html";
+ }
+
+ /**
+ * 分配菜单和按钮界面
+ *
+ * @author majianguo
+ * @date 2021/1/9 11:45
+ */
+ @GetResource(name = "分配菜单界面", path = "/view/role/assignMenuAndButtons")
+ public String roleAssignMenuButton() {
+ return "/modular/system/role/role_assign_menu_button.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/timer/TimersViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/timer/TimersViewController.java
new file mode 100644
index 000000000..196a44554
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/timer/TimersViewController.java
@@ -0,0 +1,50 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.timer;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 定时控制器
+ *
+ * @author youyongkun
+ * @date 2021/1/6 3:56 下午
+ */
+@Controller
+@ApiResource(name = "定时管理相关的界面渲染")
+public class TimersViewController {
+
+ /**
+ * 定时管理-首页-视图
+ *
+ * @author youyongkun
+ * @date 2021/1/6 4:28 下午
+ */
+ @GetResource(name = "定时管理-首页-视图", path = "/view/sysTimers")
+ public String indexView() {
+ return "/modular/system/timers/timers.html";
+ }
+
+ /**
+ * 定时管理-添加-视图
+ *
+ * @author youyongkun
+ * @date 2021/1/6 4:28 下午
+ */
+ @GetResource(name = "定时管理-添加-视图", path = "/view/sysTimers/addView")
+ public String addView() {
+ return "/modular/system/timers/timers_add.html";
+ }
+
+ /**
+ * 定时管理-修改-视图
+ *
+ * @author youyongkun
+ * @date 2021/1/6 4:28 下午
+ */
+ @GetResource(name = "定时管理-修改-视图", path = "/view/sysTimers/editView")
+ public String editView() {
+ return "/modular/system/timers/timers_edit.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/user/UserViewController.java b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/user/UserViewController.java
new file mode 100644
index 000000000..570f66938
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/system/integration/modular/system/user/UserViewController.java
@@ -0,0 +1,83 @@
+package cn.stylefeng.roses.kernel.system.integration.modular.system.user;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * 用户管理控制器
+ *
+ * @author chenjinlong
+ * @date 2021/1/7 19:09
+ */
+@Controller
+@ApiResource(name = "用户管理界面渲染")
+public class UserViewController {
+
+ /**
+ * 用户管理-首页-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/7 19:09
+ */
+ @GetResource(name = "用户管理-首页-视图", path = "/view/user")
+ public String indexView() {
+ return "/modular/system/user/user.html";
+ }
+
+ /**
+ * 用户管理—新增-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/7 19:09
+ */
+ @GetResource(name = "用户管理—新增-视图", path = "/view/user/addView")
+ public String addView() {
+ return "/modular/system/user/user_add.html";
+ }
+
+ /**
+ * 用户管理_修改_视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/7 19:09
+ */
+ @GetResource(name = "用户管理-修改-视图", path = "/view/user/editView")
+ public String editView() {
+ return "/modular/system/user/user_edit.html";
+ }
+
+ /**
+ * 用户管理-角色-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/7 19:09
+ */
+ @GetResource(name = "用户管理-角色-视图", path = "/view/user/roleView")
+ public String roleView() {
+ return "/modular/system/user/user_role.html";
+ }
+
+ /**
+ * 用户管理-注册-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/7 19:09
+ */
+ @GetResource(name = "用户管理-注册-视图", path = "/register", requiredPermission = false, requiredLogin = false)
+ public String registerView() {
+ return "/register.html";
+ }
+
+ /**
+ * 用户管理-找回密码-视图
+ *
+ * @author chenjinlong
+ * @date 2021/1/7 19:09
+ */
+ @GetResource(name = "用户管理-找回密码-视图", path = "/forget", requiredPermission = false, requiredLogin = false)
+ public String forgetView() {
+ return "/forget.html";
+ }
+
+}
diff --git a/kernel-s-system/system-integration-beetl/src/main/resources/META-INF/spring.factories b/kernel-s-system/system-integration-beetl/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..dfb3c7138
--- /dev/null
+++ b/kernel-s-system/system-integration-beetl/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,3 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ cn.stylefeng.roses.kernel.system.integration.config.BeetlErrorViewAutoConfiguration,\
+ cn.stylefeng.roses.kernel.system.integration.config.BeetlAutoConfiguration
diff --git a/kernel-s-system/system-integration-rest/README.md b/kernel-s-system/system-integration-rest/README.md
new file mode 100644
index 000000000..e41ab5038
--- /dev/null
+++ b/kernel-s-system/system-integration-rest/README.md
@@ -0,0 +1 @@
+针对前后端分离版本项目,前端使用vue渲染的集成
\ No newline at end of file
diff --git a/kernel-s-system/system-integration-rest/pom.xml b/kernel-s-system/system-integration-rest/pom.xml
new file mode 100644
index 000000000..1a17e8868
--- /dev/null
+++ b/kernel-s-system/system-integration-rest/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+
+
+ cn.stylefeng.roses
+ kernel-s-system
+ 7.0.4
+ ../pom.xml
+
+
+ system-integration-rest
+
+ jar
+
+
+
+
+
+ cn.stylefeng.roses
+ system-spring-boot-starter
+ ${roses.version}
+
+
+
+
+
diff --git a/kernel-s-system/system-integration-rest/src/main/java/cn/stylefeng/roses/kernel/system/integration/ErrorStaticJsonView.java b/kernel-s-system/system-integration-rest/src/main/java/cn/stylefeng/roses/kernel/system/integration/ErrorStaticJsonView.java
new file mode 100644
index 000000000..ad590dcfd
--- /dev/null
+++ b/kernel-s-system/system-integration-rest/src/main/java/cn/stylefeng/roses/kernel/system/integration/ErrorStaticJsonView.java
@@ -0,0 +1,35 @@
+package cn.stylefeng.roses.kernel.system.integration;
+
+import cn.stylefeng.roses.kernel.rule.pojo.response.ErrorResponseData;
+import cn.stylefeng.roses.kernel.rule.util.ResponseRenderUtil;
+import org.springframework.web.servlet.View;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * 当请求404的时候返回的错误界面
+ *
+ * @author fengshuonan
+ * @date 2021/5/17 10:45
+ */
+public class ErrorStaticJsonView implements View {
+
+ @Override
+ public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+ if (response.isCommitted()) {
+ // response已经提交不能响应
+ return;
+ }
+
+ ErrorResponseData errorResponseData = new ErrorResponseData("404", "请求资源不存在");
+ ResponseRenderUtil.renderJsonResponse(response, errorResponseData);
+ }
+
+ @Override
+ public String getContentType() {
+ return "text/html";
+ }
+
+}
\ No newline at end of file
diff --git a/kernel-s-system/system-integration-rest/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/RestErrorViewAutoConfiguration.java b/kernel-s-system/system-integration-rest/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/RestErrorViewAutoConfiguration.java
new file mode 100644
index 000000000..7fb854158
--- /dev/null
+++ b/kernel-s-system/system-integration-rest/src/main/java/cn/stylefeng/roses/kernel/system/integration/config/RestErrorViewAutoConfiguration.java
@@ -0,0 +1,27 @@
+package cn.stylefeng.roses.kernel.system.integration.config;
+
+import cn.stylefeng.roses.kernel.system.integration.ErrorStaticJsonView;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 错误界面自动配置,一般用于404响应
+ *
+ * @author fengshuonan
+ * @date 2021/5/17 11:16
+ */
+@Configuration
+public class RestErrorViewAutoConfiguration {
+
+ /**
+ * 默认错误页面,返回json
+ *
+ * @author fengshuonan
+ * @date 2020/12/16 15:47
+ */
+ @Bean("error")
+ public ErrorStaticJsonView error() {
+ return new ErrorStaticJsonView();
+ }
+
+}
diff --git a/kernel-s-system/system-integration-rest/src/main/resources/META-INF/spring.factories b/kernel-s-system/system-integration-rest/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..50ea01f2b
--- /dev/null
+++ b/kernel-s-system/system-integration-rest/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ cn.stylefeng.roses.kernel.system.integration.config.RestErrorViewAutoConfiguration
diff --git a/pom.xml b/pom.xml
index 844023328..953dd9c0d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -129,6 +129,7 @@
1.6.2
3.0.7
5.7.1
+ 3.3.2.RELEASE