Skip to content

开发手册

搭建脚手架

脚手架代码地址

http://61.169.126.130:58000/bigdata/magus-cli/magus-cli-service

启动参数
  • 由于使用了jdk17以及seata。后端服务启动时需要添加jvm启动参数:

    java
    --add-opens=java.base/java.lang=ALL-UNNAMED
    --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
setting文件
java
<!-- Nexus私服 -->
<profiles>
    <profile>
        <ID>nexus-magus</id>
        <repositories>
            <repository>
                <ID>nexus-magus</id>
                <name>Magus Repository</name>
                <url>http://61.169.126.130:58081/repository/maven-public/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <Snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
		    		<repository>
            		<ID>repsy</id>
               	<name>tomcat-cluster-redis-session-manager-repo</name>
                <url>https://repo.repsy.io/mvn/ranmanic/tomcat-session-manager</url>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <ID>nexus-magus</id>
                <name>Magus Plugin Repository</name>
                <url>http://61.169.126.130:58081/repository/maven-public/</url>
								<releases>
                    <enabled>true</enabled>
                </releases>
                <Snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    </profile>
</profiles>

web应用生成代码

在web版中完成功能组设计

功能组设计详细说明请移步web版开发手册中。

生成代码
  1. 打开【低代码开发平台】应用中的【应用发布】功能;
  2. 在右侧页面中的左侧应用树上选择要生成代码功能组的所属应用,右侧将展示选中应用下的所有功能组;
  3. 点击需要生成代码功能组数据的【下载代码】按钮;
  4. 在打开的下载代码页面上,填写【网关路由】信息,点击【下载前端代码】,生成前端代码文件;
  5. 在打开的下载代码页面上,点击【下载后端代码】,填写后端代码package包名,生成后端代码文件;
  6. 解压得到的代码文件压缩包,将解压得到的代码文件按照对应的目录结构移动到脚手架项目中,即可运行。

应用编码

普通应用开发

entity
分库及分包说明:

​ 数据库表结构的生成,默认会把所有@Entity注解修饰的类生成出对应的表结构。在没有特别包名的情况下,所有entity包下的实体类对应的表结构将被创建到每一个子库中。

​ 如需将部分表结构生成到主库中,请在entity包下创建下级包名:master / slave。此时,master包下的实体类对应的表结构将被生成到主库中,slave包下的实体类对应的表结构将被生成到子库中。

主库:

java
package com.xx.entity.master;

子库:

java
package com.xx.entity.slave;

​ 如所有实体对应的表结构均需生成到子库中,则不需要额外添加包名,直接在entity包下创建实体类即可。

java
package com.xx.entity;

​ 推荐将与租户关联的数据均放到slave子库中。

注解含义及属性说明:
注解用途用法
@Entity实体类
@Table表结构名称@Table(name = "demo")
@Column表结构字段名称@Column(name = "id", length = 36)
@Schemaapi文档字段解释@Schema(description = "id")
公共父类说明:
  • BaseEntity

    所有实体类的公共父类,包含了主键和逻辑删除两个基本字段。

    字段类型对应表结构字段含义
    idStringid主键
    deletedBooleandeleted逻辑删除;0=未删除;1=已删除
    java
    @Data
    @Entity
    @Schema
    @EqualsAndHashCode(callSuper = true)
    @Table(name = "demo")
    public class Demo extends BaseEntity {
    
        @Column(name = "name", length = 36)
        @Schema(description = "名称")
        private String name;
      
    }
  • BaseAuditingEntity

    审计父类,继承了BaseEntity,并包含了常用的审计字段,创建人、创建时间、更新人、更新时间以及版本号。

    字段类型对应表结构字段含义
    createByStringcreate_by_创建人 默认操作用户
    createDateDatecreate_date_创建时间
    lastModifiedByStringlast_modified_by_更新人 默认操作用户
    lastModifiedDateDatelast_modified_date_更新时间
    forceModifiedVersionLongforce_modified_version_版本号
    java
    @Data
    @Entity
    @Schema
    @EqualsAndHashCode(callSuper = true)
    @Table(name = "demo")
    public class Demo extends BaseAuditingEntity {
    
        @Column(name = "name", length = 36)
        @Schema(description = "名称")
        private String name;
      
    }
  • BaseTreeEntity

    树形结构父类,继承了BaseEntity,并包含了层级、序列号、父级对象。

    字段类型对应表结构字段含义
    levelIntegerlevel_层级
    seqStringseq_序列号
    parentTparent_id_父级对象 由jpa经parent_id_字段关联查询
    java
    @Data
    @Entity
    @Schema
    @EqualsAndHashCode(callSuper = true)
    @Table(name = "demo")
    public class Demo extends BaseTreeEntity {
    
        @Column(name = "name", length = 36)
        @Schema(description = "名称")
        private String name;
      
    }
  • BaseTreeAuditingEntity

    树形结构审计父类,继承了BaseEntity,并包含了层级、序列号、父级对象、创建人、创建时间、更新人、更新时间以及版本号。

    字段类型对应表结构字段含义
    levelIntegerlevel_层级
    seqStringseq_序列号
    parentTparent_id_父级对象 由jpa经parent_id_字段关联查询
    createByStringcreate_by_创建人 默认操作用户
    createDateDatecreate_date_创建时间
    lastModifiedByStringlast_modified_by_更新人 默认操作用户
    lastModifiedDateDatelast_modified_date_更新时间
    forceModifiedVersionLongforce_modified_version_版本号
    java
    @Data
    @Entity
    @Schema
    @EqualsAndHashCode(callSuper = true)
    @Table(name = "demo")
    public class Demo extends BaseTreeAuditingEntity {
    
        @Column(name = "name", length = 36)
        @Schema(description = "名称")
        private String name;
      
    }
dto
注解含义及属性说明:
注解用途用法
@Schemaapi文档字段解释@Schema(description = "id")
公共父类说明:
  • BaseRsp

    基础返回格式父类,用于约束返回对象。

    java
    @Data
    @Schema
    @EqualsAndHashCode(callSuper = true)
    public class DemoRsp extends BaseRsp {
      
    		@Schema(description = "id")
        private String id;
      
      	@Schema(description = "名称")
        private String name;
      
    }
  • BaseSearchReq

    分页查询父类,可直接用于page接口中的参数,也可被分页参数对象继承,便于做统一的分页处理。

    字段类型默认值含义
    pageint1页码 取值范围 page>1
    sizeint20每页条数 取值范围 1<Size<500
    attrString-排序的字段名
    sortStringASC排序方式 ASC / DESC
    java
    @Data
    @Schema
    @EqualsAndHashCode(callSuper = true)
    public class DemoSearchReq extends BaseSearchReq {
    
        @Schema(description = "名称")
        private String name;
    
    }
repository
公共父类及分库实现说明:
  • MasterRepository

    操作主库的repository父类。当操作的实体类对应的表结构在数据库的master主库中时,对应的repository接口需要继承MasterRepository。

    java
    public interface DemoRepository extends MasterRepository<Demo, String> {}
  • SlaveRepository

    操作子库的repository父类。当操作的实体类对应的表结构在数据库的slave子库中时,对应的repository接口需要继承SlaveRepository。

    java
    public interface DemoRepository extends SlaveRepository<Demo, String> {}
service
公共父类说明:
  • BaseService

    service层的接口父类

  • BaseServiceImpl

    service层的实现类父类

  • ResourceServiceImpl

    service层的资源授权实现类父类

支持方法可调用方法
查询ID为参数的单条数据Optional<T> findById(ID id);
查询符合查询条件的单条数据Optional<T> findOne(@Nullable Specification<T> spec);
查询所有数据List<T> findAll();
查询ID为参数的所有数据List<T> findAllById(Iterable<ID> ids);
查询所有数据并排序List<T> findAll(Sort sort);
分页查询Page<T> findAll(Pageable pageable);
查询符合查询条件的所有数据List<T> findAll(@Nullable Specification<T> spec);
分页查询符合查询条件的所有数据Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);
查询符合查询条件的所有数据并排序List<T> findAll(@Nullable Specification<T> spec, Sort sort);
查询全部数据条数long count();
查询符合查询条件的数据条数long count(@Nullable Specification<T> spec);
验证ID为参数的数据是否存在boolean existsById(ID id);
刷新缓冲区数据void flush();
保存或更新<S extends T> S save(S entity);
保存或更新,并刷新缓冲区<S extends T> S saveAndFlush(S entity);
批量保存或更新<S extends T> List<S> saveAll(Iterable<S> entities);
批量保存或更新,并刷新缓冲区<S extends T> List<S> saveAllAndFlush(Iterable<S> entities);
通过对象删除单条数据void delete(T entity);
通过ID删除单条数据void deleteById(ID id);
删除全部数据void deleteAll();
通过对象集合删除集合中的所有数据void deleteAll(Iterable<? extends T> entities);
通过ID集合删除所有ID符合条件的数据void deleteAllById(Iterable<? extends ID> ids);
批量删除全部数据void deleteAllInBatch();
通过对象集合批量删除集合中的所有数据void deleteAllInBatch(Iterable<T> entities);
通过ID集合批量删除所有ID符合条件的数据void deleteAllByIdInBatch(Iterable<ID> ids);
java
public interface DemoService extends BaseService<Demo, String> {
}
java
@Service
public class DemoServiceImpl extends ResourceServiceImpl<Demo, String> implements DemoService {
}
分页查询方法示例:
java
public Page<Demo> page(DemoSearchReq searchReq) {
  	List<SearchFilter> searchFilters = new ArrayList<>();
    if (StringUtils.isNotBlank(searchReq.getName())) {
       searchFilters.add(SearchFilter.like(Demo::getName, searchReq.getName()));
    }

    PageRequest page = PageUtils.page(searchReq);
    Specification<Demo> buildAndSpec = JpaSearchUtils.buildAndSpec(searchFilters);

    return this.demoRepository.findAll(buildAndSpec, page);
}
findById查询方法示例:
java
public Demo findOne(String id) {
		Optional<Demo> optional = this.findById(id);
    if (optional.isEmpty()) {
        throw new BaseException(ResultEnum.RESULT_ERROR_OBJ_NOT_EXIST);
    }
    return optional.get();
}
controller
注解含义及属性说明:
注解用途用法
@AppInfo应用信息
@AppGroupInfo功能组信息
@AppFunctionInfo接口信息
@Tagcontroller层api文档注释@Tag(name = "示例接口")
@Operation接口方法层api文档注释@Operation(summary = "分页查询")
@ParamCheck参数校验
应用及功能组信息注解用法:
  • @AppInfo

    属性类型默认值含义
    nameString-名称
    enNameString-英文名称
    keyString-code
    sortint10排序
    prodMenubooleantrue是否生成菜单
    compCodeString默认所有租户可见租户code 若配置此属性,则该应用仅对应租户可见
  • @AppGroupInfo

    属性类型默认值含义
    nameString-名称
    enNameString-英文名称
    keyString-code
    parentKeyString默认为应用code父级code
    appKeyString-所属应用code
    pageString-功能组页面路由
    sortint10排序
    prodMenubooleantrue是否生成菜单
    procDefKeyString默认为空流程key 若配置此属性,则该功能组数据生成后交由对应流程流转
  • @AppFunctionInfo

    属性类型默认值含义
    nameString-名称
    groupKeyString-所属功能组code
    httpMethodMethodType默认按照接口上的Mapping注解获取接口请求方式
    urlString默认由controller和接口的Mapping注解拼接获取接口地址
    isAuthzbooleantrue是否需要校验权限
    functionsString[]-所属功能集合key
  • @AppFunctionInfo中的functions属性说明:

    functions属性的设立,意为将接口与功能权限进行切割,由以往的接口授权改为功能授权,避免用户在授权某个功能时,因不确定需要哪些接口而导致功能授权不完整;同时也解决了某个功能修改后新增的接口需要再次授权的问题,减少用户的学习成本,提升用户体验。

    命名需严格按照下述规范

    1. 前半部分为 SystemModule 中约定的功能组名称
    2. 后半部分为 AuthTypeEnum 中约定的功能类型code

    示例:

    java
    功能组code:demo-app:demo-group
    功能组的查询功能:demo-app:demo-group:find

    推荐使用常量池的方式编写,便于重复使用

    应用编码常量示例:

    java
    public class DemoModule {
    
        public static final String APP_KEY = "demo-app";
    
        public static final String GROUP_KEY = "demo-app:demo-group";
    
    }

    功能集合常量示例:

    java
    public class PageAssembly {
    	
      	public static final String GROUP_FIND = "demo-app:demo-group:find";
    		public static final String GROUP_UPSERT = "demo-app:demo-group:upsert";
    		public static final String GROUP_DELETE = "demo-app:demo-group:delete";
      
    }
接口返回对象包装类:

为了前后端统一接口的数据返回格式,方便开发与接口管理。framework中定义了四种返回对象以供使用。

特别说明:返回对象的范型约束中要求传递的对象必须继承BaseRsp。

java
public class DemoRsp extends BaseRsp {}
  • PageRsp 用于返回分页对象

    java
    return new PageRsp<>(baseSearchReq, totalNum, list);
  • ListRsp 用于返回数组对象

    java
    return new ListRsp<>(list);
  • DataRsp 用于返回单个对象

    java
    return new DataRsp<>(result);
  • CommonRsp 用于无返回内容

    java
    return new CommonRsp();
接口示例:
java
@Tag(name = "示例接口")
@RestController
@RequestMapping("/demo")
@AppInfo(key = DemoModule.APP_KEY, name = "示例应用", enName = "", remark = "示例应用")
@AppGroupInfo(key = DemoModule.GROUP_KEY, page = "/demo-group/page", name = "示例功能组", enName = "demo", appKey = DemoModule.APP_KEY)
public class ExressInfoController {

		@Autowired
    private DemoService demoService;
    
    @PostMapping("/page")
    @Operation(summary = "分页查询")
    @AppFunctionInfo(url = "/demo/page", name = "分页查询", groupKey = DemoModule.GROUP_KEY, functions = {PageAssembly.GROUP_FIND, PageAssembly.GROUP_UPSERT, PageAssembly.GROUP_DELETE})
    public PageRsp<Demo> page(@RequestBody DemoSearchReq searchReq) {
        Page<Demo> result = demoService.page(searchReq);
        return new PageRsp<>(searchReq, result.getTotalElements(), result.getContent());
    }
    
}
分布式事务支持
@GlobalTransactional

@GlobalTransactional注解为seata分布式事务注解,用于与@Transactional注解一致。

由于framework中分库的实现逻辑不支持使用@Transactional注解,在所有需要事务支持的位置,请使用@GlobalTransactional注解。

请不要在controller层和service层中使用@Transactional注解,否则会导致数据操作时找不到对应的表结构。

特别说明:

由于jpa对update和delete方法的执行要求必须添加@Transactional事务,我们可以在repository中的update和delete方法上添加@Transactional注解来解决这个问题。

异常
说明

基础的异常类:com.magus.cloud.framework.common.exception.BaseException

枚举:

  1. 基础枚举

    com.magus.cloud.framework.common.exception.ResultEnum

    java
    ## 部分基础枚举示例,详细可进入ResultEnum了解
    /**
     * 200 成功
     */
    RESULT_SUCCESS(200, ResultCode.SUCCESS, "result.success"),
    
    /**
     * 400 参数错误
     */
    RESULT_ERROR_PARAM(400, ResultCode.FAIL_BUSINESS, "result.error.param"),
    
    /**
     * 401 未授权
     */
    RESULT_UNAUTHORIZED(401, ResultCode.FAIL_SYSTEM, "result.error.unauthorized"),
    
    /**
     * 403 权限不足
     */
    RESULT_DENIED_PERMISSION(403, ResultCode.FAIL_SYSTEM, "result.error.unauthenticated"),
  2. 自定义枚举

    java
    public enum XxxResultEnum implements ResultEnumBase {
    
        /**
         * 商品不存在
         */
        RESULT_ERROR_GOOD_NOT_EXIST(10_000_001, ResultCode.FAIL_BUSINESS, "xxx.error.good.not.exist"),
        ;
        private ResultEnumObject bizResultEnumObject;// 枚举值对象
    
        private ProcessResultEnum(Integer bizCode, ResultCode resultCode, String message) {
            bizResultEnumObject = new ResultEnumObject(bizCode, resultCode, message);
        }
    
        @Override
        public ResultEnumObject getBizResultEnumObject() {
            return this.bizResultEnumObject;
        }
    }

    注:以上面为例,message未做国际化处理(xxx.error.good.not.exist)

    国际化处理:

    • resource包下创建国际化包 resource.i18n.xxx(xxx自定义)

    • 在xxx下创建配置 message.propertiesmessage_en.properties

    • 在 message.properties(中文) 和 message_en.properties (英文)创建中英文的国际化

      java
      ## message.properties下配置中文国际化
      xxx.error.good.not.exist=商品不存在
      
      ## message_en.properties下配置中文国际化
      xxx.error.good.not.exist=Good is not exist
使用示例
java
throw new BaseException(XxxResultEnum.RESULT_ERROR_GOOD_NOT_EXIST);
常用工具类

这里举例了常用的实体类和实体类中的方法,详细可下载代码了解

1. BeanConvertUtils
  • com.magus.cloud.framework.common.utils.BeanConvertUtils#copyProperties:ABean 转换成 BBean

    java
    ABean a = new ABean();
    BBean b = BeanConvertUtils.copyProperties(a, BBean.class);
  • com.magus.cloud.framework.common.utils.BeanConvertUtils#copyList:List<ABean> 转换成 List<BBean>

    java
    List<ABean> aList = new ABean();
    List<BBean> bList = BeanConvertUtils.copyList(aList, BBean.class);
2. ColumnUtils
  • com.magus.cloud.framework.common.utils.ColumnUtils#getFieldName:获取Entity类中标识 @Column 的字段的名称

    java
    String fieldName = ColumnUtils.getFieldName(ABean::getId)
  • com.magus.cloud.framework.common.utils.ColumnUtils#getColumnName:获取Entity类中标识 @Column 的字段

    java
    Column columnName = ColumnUtils.getColumnName(ABean.class, ABean::getId, Column.class);
3. DateUtils
  • com.magus.cloud.framework.common.utils.DateUtils#dateToLocalDateTime:Date 转 LocalDateTime

    java
    LocalDateTime date = DateUtils.dateToLocalDateTime(new Date());
  • com.magus.cloud.framework.common.utils.DateUtils#getSecondsToTargetTime:获取当前时间到目标时间的秒数

    java
    long second = DateUtils.getSecondsToTargetTime(LocalDateTime.now());
4. FileUtils
  • com.magus.cloud.framework.common.utils.FileUtils#file2MultipartFile:本地文件转网络文件
5. IpUtils
  • com.magus.cloud.framework.common.utils.IpUtils#getIP:获取客户端真实IP

  • com.magus.cloud.framework.common.utils.IpUtils#textToNumericFormatV4:将IPv4地址转换成字节

6. JsonUtils
  • com.magus.cloud.framework.common.utils.JsonUtils#readValue:将字符串转换成目标实体类
  • com.magus.cloud.framework.common.utils.JsonUtils#readValueList:将字符串转换成目标实体类数组
  • com.magus.cloud.framework.common.utils.JsonUtils#toJsonStr:转换成字符串
7. LoginUserUtils
  • com.magus.cloud.framework.common.utils.LoginUserUtils#getBaseUser:获取登录用户信息
  • com.magus.cloud.framework.common.utils.LoginUserUtils#getLoginId:获取登录用户id
8. RandomUtils
  • com.magus.cloud.framework.common.utils.RandomUtils#randomNumeric:随机生成纯数字的字符串
  • com.magus.cloud.framework.common.utils.RandomUtils#randomAlphabetic:随机生成字母字符串
  • com.magus.cloud.framework.common.utils.RandomUtils#randomAlphanumeric:随机生成字母、数字混合的字符串
9. ServletUtils
  • com.magus.cloud.framework.common.utils.ServletUtils#getRequest:获取request
  • com.magus.cloud.framework.common.utils.ServletUtils#getResponse:获取response
10. SpringContextUtils
  • com.magus.cloud.framework.common.utils.SpringContextUtils#getBean:获取实体类
11. StringExpressUtils
  • com.magus.cloud.framework.common.utils.StringExpressUtils#replaceByMap:常用于表达式变量替换,保证mapping中的字符只被替换一次。
12. TreeBuildUtils
  • com.magus.cloud.framework.common.utils.TreeBuildUtils#buildTree(java.util.Collection<? extends com.magus.cloud.framework.common.domain.base.BaseTreeNode>, java.lang.String):构建树结构,自定义顶级节点
  • com.magus.cloud.framework.common.utils.TreeBuildUtils#buildTree(java.util.Collection<? extends com.magus.cloud.framework.common.domain.base.BaseTreeNode>):构建树结构,自底向上
配置参数
公共配置
参数解释备注
framework.data-init是否初始化数据默认true
framework.menu-init是否初始化菜单默认true
framework.res-check是否启用资源权限校验默认true
framework.subbranch是否启用分库模式默认true
framework.slave-name分库模式下,子库库名前缀默认magus_slave_
framework.doc-init.enable是否初始化minio存储默认false
framework.doc-init.end-pointminio存储地址
framework.doc-init.portminio存储端口
framework.doc-init.access-keyminio用户名
framework.doc-init.secret-keyminio密码
framework.doc-init.bucket-nameminio文件桶名称
framework.doc-init.expiryminio超时时间默认60
framework.doc-init.useSSLminio是否使用ssl证书默认false
framework.rtdb.enabled是否开启rtdb
framework.rtdb.host地址
framework.rtdb.port端口
framework.rtdb.username用户名
framework.rtdb.password密码
framework.rtdb.poolsize连接池大小
framework.rtdb.db-name数据库名称
framework.rtdb.driver-class-name驱动名称
网关配置
参数解释备注
security.enable是否开启功能权限默认true
security.ignore.urls权限校验白名单列表数组格式
授权中心
参数解释备注
framework.auth.login授权中心登录页面地址
framework.auth.encrypt是否开启密码加密
framework.auth.accessTokenTime授权token有效时长
framework.auth.refreshTokenTime刷新token有效时长
framework.auth.clients第三方应用信息数组格式
framework.auth.clients.id第三方应用ID
framework.auth.clients.secret第三方应用密钥
framework.auth.clients.uri第三方应用回调地址数组格式
公共模块
java
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.magus.cloud</groupId>
            <artifactId>framework-dependencies</artifactId>
            <version>5.0.0-SNAPSHOT</version>
            <Scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>
  • framework-common

  • framework-core

  • framework-initial

  • framework-mq

  • framework-redis

  • framework-persistence-jpa

  • framework-openfeign

  • framework-rtdb

  • framework-stomp

  • framework-pdf

流程应用开发

entity
分库及分包说明:

​ 数据库表结构的生成,默认会把所有@Entity注解修饰的类生成出对应的表结构。在没有特别包名的情况下,所有entity包下的实体类对应的表结构将被创建到每一个子库中。

​ 如需将部分表结构生成到主库中,请在entity包下创建下级包名:master / slave。此时,master包下的实体类对应的表结构将被生成到主库中,slave包下的实体类对应的表结构将被生成到子库中。

主库:

java
package com.xx.entity.master;

子库:

java
package com.xx.entity.slave;

​ 如所有实体对应的表结构均需生成到子库中,则不需要额外添加包名,直接在entity包下创建实体类即可。

java
package com.xx.entity;

​ 推荐将与租户关联的数据均放到slave子库中。

注解含义及属性说明:
注解用途用法
@Entity实体类
@Table表结构名称@Table(name = "demo")
@Column表结构字段名称@Column(name = "id", length = 36)
@Schemaapi文档字段解释@Schema(description = "id")
公共父类说明:
  • BaseEntity

    所有实体类的公共父类,包含了主键和逻辑删除两个基本字段。

    字段类型对应表结构字段含义
    idStringid主键
    deletedBooleandeleted逻辑删除;0=未删除;1=已删除
    java
    @Data
    @Entity
    @Schema
    @EqualsAndHashCode(callSuper = true)
    @Table(name = "demo")
    public class Demo extends BaseEntity {
    
        @Column(name = "name", length = 36)
        @Schema(description = "名称")
        private String name;
      
    }
  • BaseAuditingEntity

    审计父类,继承了BaseEntity,并包含了常用的审计字段,创建人、创建时间、更新人、更新时间以及版本号。

    字段类型对应表结构字段含义
    createByStringcreate_by_创建人 默认操作用户
    createDateDatecreate_date_创建时间
    lastModifiedByStringlast_modified_by_更新人 默认操作用户
    lastModifiedDateDatelast_modified_date_更新时间
    forceModifiedVersionLongforce_modified_version_版本号
    java
    @Data
    @Entity
    @Schema
    @EqualsAndHashCode(callSuper = true)
    @Table(name = "demo")
    public class Demo extends BaseAuditingEntity {
    
        @Column(name = "name", length = 36)
        @Schema(description = "名称")
        private String name;
      
    }
  • BaseTreeEntity

    树形结构父类,继承了BaseEntity,并包含了层级、序列号、父级对象。

    字段类型对应表结构字段含义
    levelIntegerlevel_层级
    seqStringseq_序列号
    parentTparent_id_父级对象 由jpa经parent_id_字段关联查询
    java
    @Data
    @Entity
    @Schema
    @EqualsAndHashCode(callSuper = true)
    @Table(name = "demo")
    public class Demo extends BaseTreeEntity {
    
        @Column(name = "name", length = 36)
        @Schema(description = "名称")
        private String name;
      
    }
  • BaseTreeAuditingEntity

    树形结构审计父类,继承了BaseEntity,并包含了层级、序列号、父级对象、创建人、创建时间、更新人、更新时间以及版本号。

    字段类型对应表结构字段含义
    levelIntegerlevel_层级
    seqStringseq_序列号
    parentTparent_id_父级对象 由jpa经parent_id_字段关联查询
    createByStringcreate_by_创建人 默认操作用户
    createDateDatecreate_date_创建时间
    lastModifiedByStringlast_modified_by_更新人 默认操作用户
    lastModifiedDateDatelast_modified_date_更新时间
    forceModifiedVersionLongforce_modified_version_版本号
    java
    @Data
    @Entity
    @Schema
    @EqualsAndHashCode(callSuper = true)
    @Table(name = "demo")
    public class Demo extends BaseTreeAuditingEntity {
    
        @Column(name = "name", length = 36)
        @Schema(description = "名称")
        private String name;
      
    }
dto
注解含义及属性说明:
注解用途用法
@Schemaapi文档字段解释@Schema(description = "id")
公共父类说明:
  • BaseRsp

    基础返回格式父类,用于约束返回对象。

    java
    @Data
    @Schema
    @EqualsAndHashCode(callSuper = true)
    public class DemoRsp extends BaseRsp {
      
    		@Schema(description = "id")
        private String id;
      
      	@Schema(description = "名称")
        private String name;
      
    }
  • BaseSearchReq

    分页查询父类,可直接用于page接口中的参数,也可被分页参数对象继承,便于做统一的分页处理。

    字段类型默认值含义
    pageint1页码 取值范围 page>1
    sizeint20每页条数 取值范围 1<Size<500
    attrString-排序的字段名
    sortStringASC排序方式 ASC / DESC
    java
    @Data
    @Schema
    @EqualsAndHashCode(callSuper = true)
    public class DemoSearchReq extends BaseSearchReq {
    
        @Schema(description = "名称")
        private String name;
    
    }
流程信息字段
  • rsp

    字段类型默认值含义
    instanceIdString-流程定义ID
    procFlagBoolean-当前业务数据是否可编辑
    instanceInfoProcessInstanceRsp-流程定义信息

    注:

    1. procFlag值为true时,表示当前业务数据允许编辑;反之,则表示当前业务数据不允许编辑。
    2. instanceInfo的类型为com.magus.cloud.camunda.base.dto.rsp.ProcessInstanceRsp,其对象定义在 magus-camunda-base 模块中。
    java
    @Data
    @Schema
    @EqualsAndHashCode(callSuper = true)
    public class DemoRsp extends BaseRsp {
    
        @Schema(description = "id")
        private String id;
    
        @Schema(description = "流程定义ID")
        private String instanceId;
    
        @Schema(description = "是否可编辑")
        private Boolean procFlag;
    
        @Schema(description = "流程定义信息")
        private ProcessInstanceRsp instanceInfo;
    
        private List<DemoDetailRsp> demoDetails;
    
    }
  • req

    字段类型默认值含义
    localProcInstIdString-流程实例ID
    appendixIdsList<String>-附件ID 数组格式
    pageUriString-页面uri路径

    注:

    1. appendixIds字段为附件ID的集合,可为空。
    2. pageUri为数据的详情页面的uri路径。
    java
    @Data
    @Schema
    public class DemoReq {
    
        @Schema(description = "id")
        private String id;
    
        private List<DemoDetailReq> demoDetails = Collections.emptyList();
    
        @Schema(description = "localProcInstId")
        private String localProcInstId;
    
        @Schema(description = "附件ID")
        private List<String> appendixIds;
    
        @Schema(description = "页面路由")
        private String pageUri;
    
    }
repository
公共父类及分库实现说明:
  • MasterRepository

    操作主库的repository父类。当操作的实体类对应的表结构在数据库的master主库中时,对应的repository接口需要继承MasterRepository。

    java
    public interface DemoRepository extends MasterRepository<Demo, String> {}
  • SlaveRepository

    操作子库的repository父类。当操作的实体类对应的表结构在数据库的slave子库中时,对应的repository接口需要继承SlaveRepository。

    java
    public interface DemoRepository extends SlaveRepository<Demo, String> {}
service
公共父类说明:
  • BaseService

    service层的接口父类

  • BaseServiceImpl

    service层的实现类父类

  • ResourceServiceImpl

    service层的资源授权实现类父类

支持方法可调用方法
查询ID为参数的单条数据Optional<T> findById(ID id);
查询符合查询条件的单条数据Optional<T> findOne(@Nullable Specification<T> spec);
查询所有数据List<T> findAll();
查询ID为参数的所有数据List<T> findAllById(Iterable<ID> ids);
查询所有数据并排序List<T> findAll(Sort sort);
分页查询Page<T> findAll(Pageable pageable);
查询符合查询条件的所有数据List<T> findAll(@Nullable Specification<T> spec);
分页查询符合查询条件的所有数据Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);
查询符合查询条件的所有数据并排序List<T> findAll(@Nullable Specification<T> spec, Sort sort);
查询全部数据条数long count();
查询符合查询条件的数据条数long count(@Nullable Specification<T> spec);
验证ID为参数的数据是否存在boolean existsById(ID id);
刷新缓冲区数据void flush();
保存或更新<S extends T> S save(S entity);
保存或更新,并刷新缓冲区<S extends T> S saveAndFlush(S entity);
批量保存或更新<S extends T> List<S> saveAll(Iterable<S> entities);
批量保存或更新,并刷新缓冲区<S extends T> List<S> saveAllAndFlush(Iterable<S> entities);
通过对象删除单条数据void delete(T entity);
通过ID删除单条数据void deleteById(ID id);
删除全部数据void deleteAll();
通过对象集合删除集合中的所有数据void deleteAll(Iterable<? extends T> entities);
通过ID集合删除所有ID符合条件的数据void deleteAllById(Iterable<? extends ID> ids);
批量删除全部数据void deleteAllInBatch();
通过对象集合批量删除集合中的所有数据void deleteAllInBatch(Iterable<T> entities);
通过ID集合批量删除所有ID符合条件的数据void deleteAllByIdInBatch(Iterable<ID> ids);
java
public interface DemoService extends BaseService<Demo, String> {
}
java
@Service
public class DemoServiceImpl extends ResourceServiceImpl<Demo, String> implements DemoService {
}
获取流程信息:
java
@Autowired
private ProcessInstanceRestApi instanceRestApi;
@Autowired
private ProcessDefinitionRestApi definitionRestApi;
  • ProcessInstanceRestApi

    获取流程实例信息,接口详情参考API文档。

    方法参数用途
    DataRsp<ProcessInstanceRsp> findByBusinessId(@RequestParam("businessId") String businessId);businessId:业务数据ID通过业务数据ID获取对应的流程实例信息
    ListRsp<ProcessInstanceRsp> listInBusinessId(@RequestBody List<String> businessIds);businessIds:业务数据ID集合通过 业务数据ID批量获取对应的流程实例信息
    CommonRsp draft(@RequestBody ProcessApplyReq req);ProcessApplyReq:流程草稿数据保存流程草稿数据
    CommonRsp update(@RequestBody ProcessApplyReq req);ProcessApplyReq:流程草稿数据更新流程草稿信息
    CommonRsp submit(@PathVariable("id") String id, @RequestBody Map<String, Object> variables);id:流程实例ID variables:业务数据流程申请提交
    CommonRsp deleteByBusinessIdIn(@RequestBody List<String> businessIds);businessIds:业务数据ID集合通过业务数据ID批量删除对应的流程数据
  • ProcessDefinitionRestApi

    获取流程定义信息,接口详情参考API文档。

    方法参数用途
    DataRsp<ProcessDefinitionRsp> findUpProcessByProcDefKey(@PathVariable("procDefKey") String procDefKey);procDefKey:流程定义key通过流程定义key获取启动的流程定义信息
分页查询方法示例:
java
public Page<Demo> page(DemoSearchReq searchReq) {
  	List<SearchFilter> searchFilters = new ArrayList<>();
    if (StringUtils.isNotBlank(searchReq.getName())) {
       searchFilters.add(SearchFilter.like(Demo::getName, searchReq.getName()));
    }

    PageRequest page = PageUtils.page(searchReq);
    Specification<Demo> buildAndSpec = JpaSearchUtils.buildAndSpec(searchFilters);
    // jpa查询业务数据
	  Page<Demo> page = this.demoRepository.findAll(buildAndSpec, page);
	  List<DemoRsp> list = BeanConvertUtils.copyList(page.getContent(), DemoRsp.class);

  	// 通过业务数据查询流程相关数据并转为前端需要的数据结构
  	ListRsp<ProcessInstanceRsp> instanceList = instanceRestApi.listInBusinessId(list.stream().map(Demo::getId).toList());
    Map<String, ProcessInstanceRsp> instanceMap = instanceList.getList().stream().collect(Collectors.toMap(ProcessInstanceRsp::getBusinessId, Function.identity()));
  	list.forEach(item -> {
        item.setInstanceId(instanceMap.get(item.getId()).getId());
        item.setProcFlag(StringUtils.isBlank(instanceMap.get(item.getId()).getProcInstId()));
    });
		return new PageImpl<>(list, page.getPageable(), page.getTotalElements());
}
findById查询方法示例:
java
public Demo findOne(String id) {
		Optional<Demo> optional = this.findById(id);
    if (optional.isEmpty()) {
        throw new BaseException(ResultEnum.RESULT_ERROR_OBJ_NOT_EXIST);
    }
	  DemoRsp demoRsp = BeanConvertUtils.copyProperties(optional.get(), DemoRsp.class);
  	// 查询流程关联数据
  	ProcessInstanceRsp result = instanceRestApi.findByBusinessId(expensesInfo.getId()).getData();
    demoRsp.setInstanceInfo(result);
    return demoRsp;
}
upsert保存或更新方法示例:
java
public Demo upsert(DemoReq demoReq) {
  	// 验证是否已有流程实例数据
		ProcessInstanceRsp process = null;
    if (StringUtils.isNotBlank(demoReq.getId())) {
				process = instanceRestApi.findByBusinessId(demoReq.getId()).getData();
        if (process != null && ProcessStatusEnum.PENDING.getCode().equals(process.getStatus())) {
        		throw new BaseException(ResultEnum.RESULT_ERROR_NOT_ALLOW_OPERATION);
        }
		}
  	// 保存业务数据
    Demo demo = BeanConvertUtils.copyProperties(demoReq, Demo.class);
    this.save(demo);

  	// 提交流程信息
    ProcessApplyReq req = new ProcessApplyReq();
    req.setAppendixIds(demoReq.getAppendixIds());
    req.setPageUri(demoReq.getPageUri());
    req.setBusinessTableName(Demo.class.getAnnotation(Table.class).name());
    req.setBusinessDataId(demo.getId());
  	// process流程信息不存在时,draft接口保存草稿信息
  	// process流程信息存在时,update接口更新草稿信息
    if (StringUtils.isNotBlank(demoReq.getId()) && process != null) {
        req.setId(process.getId());
        instanceRestApi.update(req);
		} else {
        instanceRestApi.draft(req);
    }
    return demo;
}
删除业务数据方法示例:
java
public void deleteAll(List<String> ids) {
  	List<Demo> demos = this.findAllById(ids);
    if (CollectionUtils.isEmpty(demos)) {
    		throw new BaseException(ResultEnum.RESULT_ERROR_OBJ_NOT_EXIST);
    }
  	// 先删除流程实例,再删除业务数据。原因:流程实例若已启动,则不允许删除,所以先判断是否可以正常删除流程实例
  	instanceRestApi.deleteByBusinessIdIn(ids);
    this.deleteAll(demos);
}
启动流程方法示例:
java
public void startInstance(DemoReq demoReq) {
  	Demo demo = upsert(demoReq);
  	// 获取业务数据对应的流程实例信息
    ProcessInstanceRsp processInstance = instanceRestApi.findByBusinessId(demo.getId()).getData();
    Map<String, Object> variables = JpaUtils.entity2Column(Demo.getClass(), demo);
  	// 调用submit接口启动流程实例
    instanceRestApi.submit(processInstance.getId(), variables);
}
获取流程定义信息方法示例:
java
public ProcessDefinitionRsp definition() {
  	// 通过AppGroupInfo注解中的流程定义key获取流程定义信息
		DataRsp<AppGroupRsp> groupRsp = groupRestApi.findByCode(DemoController.class.getAnnotation(AppGroupInfo.class).key());
    ListRsp<ProcessDefinitionRsp> list = definitionRestApi.listByProcDefKey(groupRsp.getData().getProcDefKey());
    return list.getList().stream().filter(ProcessDefinitionRsp::getState).findFirst().get();
}
controller
注解含义及属性说明:
注解用途用法
@AppInfo应用信息
@AppGroupInfo功能组信息
@AppFunctionInfo接口信息
@Tagcontroller层api文档注释@Tag(name = "示例接口")
@Operation接口方法层api文档注释@Operation(summary = "分页查询")
@ParamCheck参数校验
应用及功能组信息注解用法:
  • @AppInfo

    属性类型默认值含义
    nameString-名称
    enNameString-英文名称
    keyString-code
    sortint10排序
    prodMenubooleantrue是否生成菜单
    compCodeString默认所有租户可见租户code 若配置此属性,则该应用仅对应租户可见
  • @AppGroupInfo

    属性类型默认值含义
    nameString-名称
    enNameString-英文名称
    keyString-code
    parentKeyString默认为应用code父级code
    appKeyString-所属应用code
    pageString-功能组页面路由
    sortint10排序
    prodMenubooleantrue是否生成菜单
    procDefKeyString默认为空流程key 若配置此属性,则该功能组数据生成后交由对应流程流转
  • @AppFunctionInfo

    属性类型默认值含义
    nameString-名称
    groupKeyString-所属功能组code
    httpMethodMethodType默认按照接口上的Mapping注解获取接口请求方式
    urlString默认由controller和接口的Mapping注解拼接获取接口地址
    isAuthzbooleantrue是否需要校验权限
    functionsString[]-所属功能集合key
  • @AppFunctionInfo中的functions属性说明:

    functions属性的设立,意为将接口与功能权限进行切割,由以往的接口授权改为功能授权,避免用户在授权某个功能时,因不确定需要哪些接口而导致功能授权不完整;同时也解决了某个功能修改后新增的接口需要再次授权的问题,减少用户的学习成本,提升用户体验。

    命名需严格按照下述规范

    1. 前半部分为 SystemModule 中约定的功能组名称
    2. 后半部分为 AuthTypeEnum 中约定的功能类型code

    示例:

    java
    功能组code:demo-app:demo-group
    功能组的查询功能:demo-app:demo-group:find

    推荐使用常量池的方式编写,便于重复使用

    应用编码常量示例:

    java
    public class DemoModule {
    
        public static final String APP_KEY = "demo-app";
    
        public static final String GROUP_KEY = "demo-app:demo-group";
    
    }

    功能集合常量示例:

    java
    public class PageAssembly {
    	
      	public static final String GROUP_FIND = "demo-app:demo-group:find";
    		public static final String GROUP_UPSERT = "demo-app:demo-group:upsert";
    		public static final String GROUP_DELETE = "demo-app:demo-group:delete";
      
    }
接口返回对象包装类:

为了前后端统一接口的数据返回格式,方便开发与接口管理。framework中定义了四种返回对象以供使用。

特别说明:返回对象的范型约束中要求传递的对象必须继承BaseRsp。

java
public class DemoRsp extends BaseRsp {}
  • PageRsp 用于返回分页对象

    java
    return new PageRsp<>(baseSearchReq, totalNum, list);
  • ListRsp 用于返回数组对象

    java
    return new ListRsp<>(list);
  • DataRsp 用于返回单个对象

    java
    return new DataRsp<>(result);
  • CommonRsp 用于无返回内容

    java
    return new CommonRsp();
接口示例:
java
@Tag(name = "示例接口")
@RestController
@RequestMapping("/demo")
@AppInfo(key = DemoModule.APP_KEY, name = "示例应用", enName = "", remark = "示例应用")
@AppGroupInfo(key = DemoModule.GROUP_KEY, page = "/demo-group/page", name = "示例功能组", enName = "demo", appKey = DemoModule.APP_KEY, procDefKey = "demo_process_key")
public class ExressInfoController {

		@Autowired
    private DemoService demoService;
    
    @PostMapping("/page")
    @Operation(summary = "分页查询")
    @AppFunctionInfo(url = "/demo/page", name = "分页查询", groupKey = DemoModule.GROUP_KEY, functions = {PageAssembly.GROUP_FIND, PageAssembly.GROUP_UPSERT, PageAssembly.GROUP_DELETE})
    public PageRsp<Demo> page(@RequestBody DemoSearchReq searchReq) {
        Page<Demo> result = demoService.page(searchReq);
        return new PageRsp<>(searchReq, result.getTotalElements(), result.getContent());
    }
  
  	// ... 省略增删改查接口
  
  	@PostMapping("/submit")
    @Operation(summary = "流程提交")
    @AppFunctionInfo(url = "/demo/submit", name = "流程提交", groupKey = DemoModule.GROUP_KEY, functions = {PageAssembly.GROUP_UPSERT})
    public CommonRsp submit(@RequestBody DemoReq demoReq) {
        demoService.startInstance(demoReq);
        return new CommonRsp();
    }

    @GetMapping("/process/definition")
    @Operation(summary = "流程信息")
    @AppFunctionInfo(url = "/demo/process/definition", name = "流程信息", groupKey = DemoModule.GROUP_KEY, functions = {PageAssembly.GROUP_FIND})
    public DataRsp<ProcessDefinitionRsp> definition() {
        ProcessDefinitionRsp definition = demoService.definition();
        return new DataRsp<>(definition);
    }
    
}
分布式事务支持
@GlobalTransactional

@GlobalTransactional注解为seata分布式事务注解,用于与@Transactional注解一致。

由于framework中分库的实现逻辑不支持使用@Transactional注解,在所有需要事务支持的位置,请使用@GlobalTransactional注解。

请不要在controller层和service层中使用@Transactional注解,否则会导致数据操作时找不到对应的表结构。

特别说明:

由于jpa对update和delete方法的执行要求必须添加@Transactional事务,我们可以在repository中的update和delete方法上添加@Transactional注解来解决这个问题。

异常
说明

基础的异常类:com.magus.cloud.framework.common.exception.BaseException

枚举:

  1. 基础枚举

    com.magus.cloud.framework.common.exception.ResultEnum

    java
    ## 部分基础枚举示例,详细可进入ResultEnum了解
    /**
     * 200 成功
     */
    RESULT_SUCCESS(200, ResultCode.SUCCESS, "result.success"),
    
    /**
     * 400 参数错误
     */
    RESULT_ERROR_PARAM(400, ResultCode.FAIL_BUSINESS, "result.error.param"),
    
    /**
     * 401 未授权
     */
    RESULT_UNAUTHORIZED(401, ResultCode.FAIL_SYSTEM, "result.error.unauthorized"),
    
    /**
     * 403 权限不足
     */
    RESULT_DENIED_PERMISSION(403, ResultCode.FAIL_SYSTEM, "result.error.unauthenticated"),
  2. 自定义枚举

    java
    public enum XxxResultEnum implements ResultEnumBase {
    
        /**
         * 商品不存在
         */
        RESULT_ERROR_GOOD_NOT_EXIST(10_000_001, ResultCode.FAIL_BUSINESS, "xxx.error.good.not.exist"),
        ;
        private ResultEnumObject bizResultEnumObject;// 枚举值对象
    
        private ProcessResultEnum(Integer bizCode, ResultCode resultCode, String message) {
            bizResultEnumObject = new ResultEnumObject(bizCode, resultCode, message);
        }
    
        @Override
        public ResultEnumObject getBizResultEnumObject() {
            return this.bizResultEnumObject;
        }
    }

    注:以上面为例,message未做国际化处理(xxx.error.good.not.exist)

    国际化处理:

    • resource包下创建国际化包 resource.i18n.xxx(xxx自定义)

    • 在xxx下创建配置 message.propertiesmessage_en.properties

    • 在 message.properties(中文) 和 message_en.properties (英文)创建中英文的国际化

      java
      ## message.properties下配置中文国际化
      xxx.error.good.not.exist=商品不存在
      
      ## message_en.properties下配置中文国际化
      xxx.error.good.not.exist=Good is not exist
使用示例
java
throw new BaseException(XxxResultEnum.RESULT_ERROR_GOOD_NOT_EXIST);
常用工具类

这里举例了常用的实体类和实体类中的方法,详细可下载代码了解

1. BeanConvertUtils
  • com.magus.cloud.framework.common.utils.BeanConvertUtils#copyProperties:ABean 转换成 BBean

    java
    ABean a = new ABean();
    BBean b = BeanConvertUtils.copyProperties(a, BBean.class);
  • com.magus.cloud.framework.common.utils.BeanConvertUtils#copyList:List<ABean> 转换成 List<BBean>

    java
    List<ABean> aList = new ABean();
    List<BBean> bList = BeanConvertUtils.copyList(aList, BBean.class);
2. ColumnUtils
  • com.magus.cloud.framework.common.utils.ColumnUtils#getFieldName:获取Entity类中标识 @Column 的字段的名称

    java
    String fieldName = ColumnUtils.getFieldName(ABean::getId)
  • com.magus.cloud.framework.common.utils.ColumnUtils#getColumnName:获取Entity类中标识 @Column 的字段

    java
    Column columnName = ColumnUtils.getColumnName(ABean.class, ABean::getId, Column.class);
3. DateUtils
  • com.magus.cloud.framework.common.utils.DateUtils#dateToLocalDateTime:Date 转 LocalDateTime

    java
    LocalDateTime date = DateUtils.dateToLocalDateTime(new Date());
  • com.magus.cloud.framework.common.utils.DateUtils#getSecondsToTargetTime:获取当前时间到目标时间的秒数

    java
    long second = DateUtils.getSecondsToTargetTime(LocalDateTime.now());
4. FileUtils
  • com.magus.cloud.framework.common.utils.FileUtils#file2MultipartFile:本地文件转网络文件
5. IpUtils
  • com.magus.cloud.framework.common.utils.IpUtils#getIP:获取客户端真实IP

  • com.magus.cloud.framework.common.utils.IpUtils#textToNumericFormatV4:将IPv4地址转换成字节

6. JsonUtils
  • com.magus.cloud.framework.common.utils.JsonUtils#readValue:将字符串转换成目标实体类
  • com.magus.cloud.framework.common.utils.JsonUtils#readValueList:将字符串转换成目标实体类数组
  • com.magus.cloud.framework.common.utils.JsonUtils#toJsonStr:转换成字符串
7. LoginUserUtils
  • com.magus.cloud.framework.common.utils.LoginUserUtils#getBaseUser:获取登录用户信息
  • com.magus.cloud.framework.common.utils.LoginUserUtils#getLoginId:获取登录用户id
8. RandomUtils
  • com.magus.cloud.framework.common.utils.RandomUtils#randomNumeric:随机生成纯数字的字符串
  • com.magus.cloud.framework.common.utils.RandomUtils#randomAlphabetic:随机生成字母字符串
  • com.magus.cloud.framework.common.utils.RandomUtils#randomAlphanumeric:随机生成字母、数字混合的字符串
9. ServletUtils
  • com.magus.cloud.framework.common.utils.ServletUtils#getRequest:获取request
  • com.magus.cloud.framework.common.utils.ServletUtils#getResponse:获取response
10. SpringContextUtils
  • com.magus.cloud.framework.common.utils.SpringContextUtils#getBean:获取实体类
11. StringExpressUtils
  • com.magus.cloud.framework.common.utils.StringExpressUtils#replaceByMap:常用于表达式变量替换,保证mapping中的字符只被替换一次。
12. TreeBuildUtils
  • com.magus.cloud.framework.common.utils.TreeBuildUtils#buildTree(java.util.Collection<? extends com.magus.cloud.framework.common.domain.base.BaseTreeNode>, java.lang.String):构建树结构,自定义顶级节点
  • com.magus.cloud.framework.common.utils.TreeBuildUtils#buildTree(java.util.Collection<? extends com.magus.cloud.framework.common.domain.base.BaseTreeNode>):构建树结构,自底向上
配置参数
公共配置
参数解释备注
framework.data-init是否初始化数据默认true
framework.menu-init是否初始化菜单默认true
framework.res-check是否启用资源权限校验默认true
framework.subbranch是否启用分库模式默认true
framework.slave-name分库模式下,子库库名前缀默认magus_slave_
framework.doc-init.enable是否初始化minio存储默认false
framework.doc-init.end-pointminio存储地址
framework.doc-init.portminio存储端口
framework.doc-init.access-keyminio用户名
framework.doc-init.secret-keyminio密码
framework.doc-init.bucket-nameminio文件桶名称
framework.doc-init.expiryminio超时时间默认60
framework.doc-init.useSSLminio是否使用ssl证书默认false
framework.rtdb.enabled是否开启rtdb
framework.rtdb.host地址
framework.rtdb.port端口
framework.rtdb.username用户名
framework.rtdb.password密码
framework.rtdb.poolsize连接池大小
framework.rtdb.db-name数据库名称
framework.rtdb.driver-class-name驱动名称
网关配置
参数解释备注
security.enable是否开启功能权限默认true
security.ignore.urls权限校验白名单列表数组格式
授权中心
参数解释备注
framework.auth.login授权中心登录页面地址
framework.auth.encrypt是否开启密码加密
framework.auth.accessTokenTime授权token有效时长
framework.auth.refreshTokenTime刷新token有效时长
framework.auth.clients第三方应用信息数组格式
framework.auth.clients.id第三方应用ID
framework.auth.clients.secret第三方应用密钥
framework.auth.clients.uri第三方应用回调地址数组格式
公共模块
java
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.magus.cloud</groupId>
            <artifactId>framework-dependencies</artifactId>
            <version>5.0.0-SNAPSHOT</version>
            <Scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>
  • framework-common

  • framework-core

  • framework-initial

  • framework-mq

  • framework-redis

  • framework-persistence-jpa

  • framework-openfeign

  • framework-rtdb

  • framework-stomp

  • framework-pdf