Appearance
开发手册
搭建脚手架
脚手架代码地址
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版开发手册中。
生成代码
- 打开【低代码开发平台】应用中的【应用发布】功能;
- 在右侧页面中的左侧应用树上选择要生成代码功能组的所属应用,右侧将展示选中应用下的所有功能组;
- 点击需要生成代码功能组数据的【下载代码】按钮;
- 在打开的下载代码页面上,填写【网关路由】信息,点击【下载前端代码】,生成前端代码文件;
- 在打开的下载代码页面上,点击【下载后端代码】,填写后端代码package包名,生成后端代码文件;
- 解压得到的代码文件压缩包,将解压得到的代码文件按照对应的目录结构移动到脚手架项目中,即可运行。
应用编码
普通应用开发
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) |
@Schema | api文档字段解释 | @Schema(description = "id") |
公共父类说明:
BaseEntity
所有实体类的公共父类,包含了主键和逻辑删除两个基本字段。
字段 类型 对应表结构字段 含义 id String id 主键 deleted Boolean deleted 逻辑删除;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,并包含了常用的审计字段,创建人、创建时间、更新人、更新时间以及版本号。
字段 类型 对应表结构字段 含义 createBy String create_by_ 创建人 默认操作用户 createDate Date create_date_ 创建时间 lastModifiedBy String last_modified_by_ 更新人 默认操作用户 lastModifiedDate Date last_modified_date_ 更新时间 forceModifiedVersion Long force_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,并包含了层级、序列号、父级对象。
字段 类型 对应表结构字段 含义 level Integer level_ 层级 seq String seq_ 序列号 parent T parent_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,并包含了层级、序列号、父级对象、创建人、创建时间、更新人、更新时间以及版本号。
字段 类型 对应表结构字段 含义 level Integer level_ 层级 seq String seq_ 序列号 parent T parent_id_ 父级对象 由jpa经parent_id_字段关联查询 createBy String create_by_ 创建人 默认操作用户 createDate Date create_date_ 创建时间 lastModifiedBy String last_modified_by_ 更新人 默认操作用户 lastModifiedDate Date last_modified_date_ 更新时间 forceModifiedVersion Long force_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
注解含义及属性说明:
注解 | 用途 | 用法 |
---|---|---|
@Schema | api文档字段解释 | @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接口中的参数,也可被分页参数对象继承,便于做统一的分页处理。
字段 类型 默认值 含义 page int 1 页码 取值范围 page>1 size int 20 每页条数 取值范围 1<Size<500 attr String - 排序的字段名 sort String ASC 排序方式 ASC / DESC java@Data @Schema @EqualsAndHashCode(callSuper = true) public class DemoSearchReq extends BaseSearchReq { @Schema(description = "名称") private String name; }
repository
公共父类及分库实现说明:
MasterRepository
操作主库的repository父类。当操作的实体类对应的表结构在数据库的master主库中时,对应的repository接口需要继承MasterRepository。
javapublic interface DemoRepository extends MasterRepository<Demo, String> {}
SlaveRepository
操作子库的repository父类。当操作的实体类对应的表结构在数据库的slave子库中时,对应的repository接口需要继承SlaveRepository。
javapublic 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 | 接口信息 | |
@Tag | controller层api文档注释 | @Tag(name = "示例接口") |
@Operation | 接口方法层api文档注释 | @Operation(summary = "分页查询") |
@ParamCheck | 参数校验 |
应用及功能组信息注解用法:
@AppInfo
属性 类型 默认值 含义 name String - 名称 enName String - 英文名称 key String - code sort int 10 排序 prodMenu boolean true 是否生成菜单 compCode String 默认所有租户可见 租户code 若配置此属性,则该应用仅对应租户可见 @AppGroupInfo
属性 类型 默认值 含义 name String - 名称 enName String - 英文名称 key String - code parentKey String 默认为应用code 父级code appKey String - 所属应用code page String - 功能组页面路由 sort int 10 排序 prodMenu boolean true 是否生成菜单 procDefKey String 默认为空 流程key 若配置此属性,则该功能组数据生成后交由对应流程流转 @AppFunctionInfo
属性 类型 默认值 含义 name String - 名称 groupKey String - 所属功能组code httpMethod MethodType 默认按照接口上的Mapping注解获取 接口请求方式 url String 默认由controller和接口的Mapping注解拼接获取 接口地址 isAuthz boolean true 是否需要校验权限 functions String[] - 所属功能集合key @AppFunctionInfo中的functions属性说明:
functions属性的设立,意为将接口与功能权限进行切割,由以往的接口授权改为功能授权,避免用户在授权某个功能时,因不确定需要哪些接口而导致功能授权不完整;同时也解决了某个功能修改后新增的接口需要再次授权的问题,减少用户的学习成本,提升用户体验。
命名需严格按照下述规范
- 前半部分为 SystemModule 中约定的功能组名称
- 后半部分为 AuthTypeEnum 中约定的功能类型code
示例:
java功能组code:demo-app:demo-group 功能组的查询功能:demo-app:demo-group:find
推荐使用常量池的方式编写,便于重复使用
应用编码常量示例:
javapublic class DemoModule { public static final String APP_KEY = "demo-app"; public static final String GROUP_KEY = "demo-app:demo-group"; }
功能集合常量示例:
javapublic 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 用于返回分页对象
javareturn new PageRsp<>(baseSearchReq, totalNum, list);
ListRsp 用于返回数组对象
javareturn new ListRsp<>(list);
DataRsp 用于返回单个对象
javareturn new DataRsp<>(result);
CommonRsp 用于无返回内容
javareturn 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
枚举:
基础枚举
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"),
自定义枚举
javapublic 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.properties
和
message_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
javaABean a = new ABean(); BBean b = BeanConvertUtils.copyProperties(a, BBean.class);
com.magus.cloud.framework.common.utils.BeanConvertUtils#copyList:List<ABean> 转换成 List<BBean>
javaList<ABean> aList = new ABean(); List<BBean> bList = BeanConvertUtils.copyList(aList, BBean.class);
2. ColumnUtils
com.magus.cloud.framework.common.utils.ColumnUtils#getFieldName:获取Entity类中标识 @Column 的字段的名称
javaString fieldName = ColumnUtils.getFieldName(ABean::getId)
com.magus.cloud.framework.common.utils.ColumnUtils#getColumnName:获取Entity类中标识 @Column 的字段
javaColumn columnName = ColumnUtils.getColumnName(ABean.class, ABean::getId, Column.class);
3. DateUtils
com.magus.cloud.framework.common.utils.DateUtils#dateToLocalDateTime:Date 转 LocalDateTime
javaLocalDateTime date = DateUtils.dateToLocalDateTime(new Date());
com.magus.cloud.framework.common.utils.DateUtils#getSecondsToTargetTime:获取当前时间到目标时间的秒数
javalong 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-point | minio存储地址 | |
framework.doc-init.port | minio存储端口 | |
framework.doc-init.access-key | minio用户名 | |
framework.doc-init.secret-key | minio密码 | |
framework.doc-init.bucket-name | minio文件桶名称 | |
framework.doc-init.expiry | minio超时时间 | 默认60 |
framework.doc-init.useSSL | minio是否使用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) |
@Schema | api文档字段解释 | @Schema(description = "id") |
公共父类说明:
BaseEntity
所有实体类的公共父类,包含了主键和逻辑删除两个基本字段。
字段 类型 对应表结构字段 含义 id String id 主键 deleted Boolean deleted 逻辑删除;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,并包含了常用的审计字段,创建人、创建时间、更新人、更新时间以及版本号。
字段 类型 对应表结构字段 含义 createBy String create_by_ 创建人 默认操作用户 createDate Date create_date_ 创建时间 lastModifiedBy String last_modified_by_ 更新人 默认操作用户 lastModifiedDate Date last_modified_date_ 更新时间 forceModifiedVersion Long force_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,并包含了层级、序列号、父级对象。
字段 类型 对应表结构字段 含义 level Integer level_ 层级 seq String seq_ 序列号 parent T parent_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,并包含了层级、序列号、父级对象、创建人、创建时间、更新人、更新时间以及版本号。
字段 类型 对应表结构字段 含义 level Integer level_ 层级 seq String seq_ 序列号 parent T parent_id_ 父级对象 由jpa经parent_id_字段关联查询 createBy String create_by_ 创建人 默认操作用户 createDate Date create_date_ 创建时间 lastModifiedBy String last_modified_by_ 更新人 默认操作用户 lastModifiedDate Date last_modified_date_ 更新时间 forceModifiedVersion Long force_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
注解含义及属性说明:
注解 | 用途 | 用法 |
---|---|---|
@Schema | api文档字段解释 | @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接口中的参数,也可被分页参数对象继承,便于做统一的分页处理。
字段 类型 默认值 含义 page int 1 页码 取值范围 page>1 size int 20 每页条数 取值范围 1<Size<500 attr String - 排序的字段名 sort String ASC 排序方式 ASC / DESC java@Data @Schema @EqualsAndHashCode(callSuper = true) public class DemoSearchReq extends BaseSearchReq { @Schema(description = "名称") private String name; }
流程信息字段
rsp
字段 类型 默认值 含义 instanceId String - 流程定义ID procFlag Boolean - 当前业务数据是否可编辑 instanceInfo ProcessInstanceRsp - 流程定义信息 注:
- procFlag值为true时,表示当前业务数据允许编辑;反之,则表示当前业务数据不允许编辑。
- 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
字段 类型 默认值 含义 localProcInstId String - 流程实例ID appendixIds List<String> - 附件ID 数组格式 pageUri String - 页面uri路径 注:
- appendixIds字段为附件ID的集合,可为空。
- 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。
javapublic interface DemoRepository extends MasterRepository<Demo, String> {}
SlaveRepository
操作子库的repository父类。当操作的实体类对应的表结构在数据库的slave子库中时,对应的repository接口需要继承SlaveRepository。
javapublic 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 | 接口信息 | |
@Tag | controller层api文档注释 | @Tag(name = "示例接口") |
@Operation | 接口方法层api文档注释 | @Operation(summary = "分页查询") |
@ParamCheck | 参数校验 |
应用及功能组信息注解用法:
@AppInfo
属性 类型 默认值 含义 name String - 名称 enName String - 英文名称 key String - code sort int 10 排序 prodMenu boolean true 是否生成菜单 compCode String 默认所有租户可见 租户code 若配置此属性,则该应用仅对应租户可见 @AppGroupInfo
属性 类型 默认值 含义 name String - 名称 enName String - 英文名称 key String - code parentKey String 默认为应用code 父级code appKey String - 所属应用code page String - 功能组页面路由 sort int 10 排序 prodMenu boolean true 是否生成菜单 procDefKey String 默认为空 流程key 若配置此属性,则该功能组数据生成后交由对应流程流转 @AppFunctionInfo
属性 类型 默认值 含义 name String - 名称 groupKey String - 所属功能组code httpMethod MethodType 默认按照接口上的Mapping注解获取 接口请求方式 url String 默认由controller和接口的Mapping注解拼接获取 接口地址 isAuthz boolean true 是否需要校验权限 functions String[] - 所属功能集合key @AppFunctionInfo中的functions属性说明:
functions属性的设立,意为将接口与功能权限进行切割,由以往的接口授权改为功能授权,避免用户在授权某个功能时,因不确定需要哪些接口而导致功能授权不完整;同时也解决了某个功能修改后新增的接口需要再次授权的问题,减少用户的学习成本,提升用户体验。
命名需严格按照下述规范
- 前半部分为 SystemModule 中约定的功能组名称
- 后半部分为 AuthTypeEnum 中约定的功能类型code
示例:
java功能组code:demo-app:demo-group 功能组的查询功能:demo-app:demo-group:find
推荐使用常量池的方式编写,便于重复使用
应用编码常量示例:
javapublic class DemoModule { public static final String APP_KEY = "demo-app"; public static final String GROUP_KEY = "demo-app:demo-group"; }
功能集合常量示例:
javapublic 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 用于返回分页对象
javareturn new PageRsp<>(baseSearchReq, totalNum, list);
ListRsp 用于返回数组对象
javareturn new ListRsp<>(list);
DataRsp 用于返回单个对象
javareturn new DataRsp<>(result);
CommonRsp 用于无返回内容
javareturn 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
枚举:
基础枚举
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"),
自定义枚举
javapublic 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.properties
和
message_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
javaABean a = new ABean(); BBean b = BeanConvertUtils.copyProperties(a, BBean.class);
com.magus.cloud.framework.common.utils.BeanConvertUtils#copyList:List<ABean> 转换成 List<BBean>
javaList<ABean> aList = new ABean(); List<BBean> bList = BeanConvertUtils.copyList(aList, BBean.class);
2. ColumnUtils
com.magus.cloud.framework.common.utils.ColumnUtils#getFieldName:获取Entity类中标识 @Column 的字段的名称
javaString fieldName = ColumnUtils.getFieldName(ABean::getId)
com.magus.cloud.framework.common.utils.ColumnUtils#getColumnName:获取Entity类中标识 @Column 的字段
javaColumn columnName = ColumnUtils.getColumnName(ABean.class, ABean::getId, Column.class);
3. DateUtils
com.magus.cloud.framework.common.utils.DateUtils#dateToLocalDateTime:Date 转 LocalDateTime
javaLocalDateTime date = DateUtils.dateToLocalDateTime(new Date());
com.magus.cloud.framework.common.utils.DateUtils#getSecondsToTargetTime:获取当前时间到目标时间的秒数
javalong 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-point | minio存储地址 | |
framework.doc-init.port | minio存储端口 | |
framework.doc-init.access-key | minio用户名 | |
framework.doc-init.secret-key | minio密码 | |
framework.doc-init.bucket-name | minio文件桶名称 | |
framework.doc-init.expiry | minio超时时间 | 默认60 |
framework.doc-init.useSSL | minio是否使用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