# base-components **Repository Path**: drakelee1221/base-components ## Basic Information - **Project Name**: base-components - **Description**: base components - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 2 - **Created**: 2018-12-11 - **Last Updated**: 2025-01-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 配置说明 #### pom.xml 添加以下配置 ```xml com.drakelee.base base-components v2023-SNAPSHOT ``` ```xml devops-central central https://cqwk-maven.pkg.coding.net/repository/devops/central/ true true always ``` ##### 程序启动的必要配置文件:application.yml ,需放置在classpath中(Spring 已默认不推荐加载bootstrap.yml了) >参考 application_demo.yml 该文件中为启动时的必要配置。 >一些常用的配置项,参考demo_base_config.yml ##### 配置加密(如无特殊需要,无需配置) >先使用 SecretHelper.encrypt 静态方法来加密需要的配置信息,加密后的值需要使用 {cipher} 开头,如: >aaa.key={cipher}加密后的值 ```yaml #SecretHelper.encrypt加密时key和salt可以为空(有默认值),如果使用了自定义的key和salt,则需要配置以下内容到配置文件中 encrypt: # salt 的每个字符必须是 16进制的 hex character salt: ABC key: 1234567 ``` ##### 启动类方式 SpringBootApplicationRunner,当前项目的扫描包请至少包含三级,例 ```java @SpringBootApplication(scanBasePackages = "com.demo.app.**") public class TestBootApplication { public static void main(String[] args) { SpringBootApplicationRunner.run(TestBootApplication.class, ServerPort.random(), BannerPrinter.create(), args); } } ``` --- # 各模块说明 ### [support](support) :基础支持模块,包含常量、接口定义、通用配置、工具类、启动事件等 - ClassInfo 高性能反射工具,SnowflakeIdGenerator 雪花ID实现,接口参数自动效验实现,ConvertUtil 高性能类型转换工具等 --- ### [common](common) :加载各种基础配置,申明基础服务等 - 通过 BaseEnvironment 和 EnvBootChecker 设置一些低优先级的默认配置 - BasePriorityAutoConfiguration 配置各种启动事件、统一线程池管理等 - BaseIdGeneratorAutoConfiguration 配置全局唯一ID生成器 - ApplicationCustomConfiguration 配置跨域、全局异常处理等 - SystemLogConfiguration 配置系统日志AOP - SystemEventNotifierConfiguration 配置系统事件通知 - ServletActuatorSecurityConfiguration 配置Actuator和Security --- ### [transaction](transaction):事务配置管理,声明式事务,事务生命周期事件管理(支持分布式全局事务) --- ### [transaction-global](transaction-global):分布式事务配置管理(暂支持 seata ) --- ### [log4jdbc](log4jdbc):jdbc代理日志打印,支持sql打印、参数打印、耗时打印等 - 配置参考 base_config_demo.yml 中的 spring.datasource ### [database-jpa](database-jpa):Spring JPA 增强 ```java //创建以下配置类,例: @Configuration(proxyBeanMethods = false) @EnableTransactionManagement @EntityScan("com.xxx.yyy.domain") @EnableJpaRepositories( value = "com.xxx.yyy.database.dao", repositoryBaseClass = GenericJpaDaoImpl.class ) public class CustomJpaConfiguration extends AbstractJpaConfiguration{ } ``` ```java //实体类参考: import com.base.components.common.constants.db.Domain; import com.base.components.common.doc.annotation.Param; import com.base.components.common.id.jpa.JpaId; import jakarta.persistence.*; import org.hibernate.annotations.DynamicUpdate; import java.io.Serial; @Entity @Table(name = "t_tags") @DynamicUpdate public class Tags implements Domain { @Serial private static final long serialVersionUID = 1L; @Id @JpaId @GeneratedValue(generator = JPA_ID_GENERATOR_NAME) @Column(name = "id", nullable = false) @Param(value = "id", required = true) private String id; @Column(name = "create_time", nullable = false) @Param(value = "创建时间", required = true) private java.util.Date createTime; @Column(name = "status", nullable = false) @Param(value = "状态; 0=禁用,1=启用", required = true) private Integer status = 0; @Column(name = "tag_name", nullable = false) @Param(value = "标签名", required = true) private String tagName = ""; } ``` - AsyncJpaRepositoryConfiguration 异步加载JPA Repository配置 - GenericJpaDao 抽象JPA Dao,支持分页、排序、条件查询、条件更新、条件删除、条件统计等 - JpaService 抽象JPA Service,将GenericJpaDao方法封装至Service中 - DynamicSqlBuilder 动态SQL生成器,可根据JOIN表依赖关系对SQL进行优化,支持SQL动态参数化 --- ### [database-mybatis](database-mybatis):MyBatis 增强,提供Mybatis-plus和tk-mybatis组件支持 --- ### [cache](cache):统一封装缓存管理,支持Redis(分布式)、Caffeine(本地单机) - CacheManager 缓存管理实现 - TokenManager 令牌管理实现 - CacheLock 分布式锁实现 - 订阅发布模型,ChannelMessageSender 发布消息, BaseAsyncChannelMessageListener 订阅消息 - DictionaryCacheService 字典缓存服务 --- ### [rpc](rpc):RPC远程调用配置(feign实现) ```java //添加自定义配置类如下实例: @Configuration(proxyBeanMethods = false) //扫描feign接口目录 @EnableFeignClients(basePackages = {"com.xxx.app.rpc.client"}) @AutoConfigureBefore(BaseRpcConfiguration.class) public class CustomRpcConfiguration {} ``` - AbstractErrorDecoderHandler 统一异常处理 - TokenProcessHeaderInvocation token上下游传递 - XForwardedHeaderInvocation 通过x-forwarded-for将客户端IP上下游传递 - BaseRpcConfiguration 配置调用链路追踪、日志打印、异常处理等 --- ### [gateway](gateway):微服务网关配置(SpringCloud Gateway实现) - OpenApiGatewayConfiguration 配置OpenApi文档网关配置 --- ### [oss](oss):OSS对象存储配置(支持阿里云、七牛云、本地) - OssService 统一OSS接口,包含鉴权、上传下载等方法 - OssUploadTokenController 统一获取上传凭证接口 --- ### [oss-vod](oss-vod):视频点播配置(支持阿里云) - AliVodController 视频点播接口 - OssVodPlayAuthValidation 自定义鉴权接口 --- ### [task](task):基于Quartz的任务调度,支持Groovy动态脚本、支持分布式部署 ``` 作业调用类需继承 com.base.components.common.service.task.BaseTaskHandler 。 需添加数据库表: CREATE TABLE `sys_task` ( `id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '作业名称', `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '描述', `target_class` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '执行完整类名', `target_class_script` varchar(5000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '执行类代码', `cron_expression` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '格式; [秒] [分] [小时] [日] [月] [周] [年],如:2016年1月10日13点24分0秒 为 0 24 13 10 1 ? 2016', `arguments_map` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '传递到执行方法的参数, 如:{\"a\":1}', `last_server` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '最后执行的作业服务器端', `last_time` datetime(0) NULL DEFAULT NULL COMMENT '最后执行时间', `disabled` bit(1) NOT NULL DEFAULT b'0' COMMENT '已禁用; 0=否,1=是', `locking` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否锁定中; 0=否,1=是,一般为一个作业服务端调用时锁定并排它', `create_time` datetime(0) NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, INDEX `disabled`(`disabled`) USING BTREE, INDEX `locking`(`locking`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统调度作业' ROW_FORMAT = Dynamic; CREATE TABLE `sys_task_log` ( `id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `task_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', `task_name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '作业名称', `execute_over_time` datetime(0) NOT NULL COMMENT '执行完成时间', `task_fire_time` datetime(0) NOT NULL COMMENT '作业触发时间', `execute_success` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否完整执行并未抛异常', `execute_exceptions` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '异常信息', `execute_server_host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '执行作业服务端', `result_message` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '完成返回信息', PRIMARY KEY (`id`) USING BTREE, INDEX `task_id`(`task_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统调度作业日志' ROW_FORMAT = Dynamic; ``` - SysTaskClient 调度管理接口 --- ### [elasticsearch](elasticsearch):Elasticsearch配置 ```java //继承配置类 BaseElasticSearchConfig ,并指定 repository 包路径 @Configuration(proxyBeanMethods = false) @EnableElasticsearchRepositories( basePackages = "com.xxx.xxx.elasticsearch.repository", repositoryBaseClass = GenericElasticsearchRepositoryImpl.class ) public class ElasticsearchConfiguration extends BaseElasticSearchConfig {} ``` ```java //实体类参考: @Entity @Table(name = "t_xxx_domain") @Document(indexName = EsIndex.INDEX_PREFIX + "xxx_domain") public class XxxDomain implements Domain { @Serial private static final long serialVersionUID = 1L; @Id @JpaId @GeneratedValue(generator = JPA_ID_GENERATOR_NAME) @Column(name = "id", nullable = false) @Param(value = "id", required = true) private String id; @Column(name = "tag_name", nullable = false) @Param(value = "名称", required = true) private String name = ""; } ``` - 对Query API进行封装,参考 com.base.components.elasticsearch.constants.Search - GenericElasticsearchRepository 通用Repository封装,可根据@Table、@Column同步数据库 - TrackTotalHits 使用此注解的索引实体,分页时不限制行数,但性能有所下降 --- ### [monitor-server](monitor-server):监控服务配置(spring boot admin) - 如需作为spring boot admin client,还需要依赖: ```xml de.codecentric spring-boot-admin-starter-client ``` - AdminServerHttpSecurityProcessor 配置Spring Security - DingTalkMonitorNotifier 钉钉监控通知 --- ### [doc](doc):OpenApi文档配置 - 配置文件:BaseOpenApiProperties,配置前缀:base.open-api,默认UI地址:/doc.html - 使用 com.base.components.common.doc.annotation.Param 对实体字段或参数进行描述 - 接口文档参考: ```java import com.base.components.common.doc.*; import com.base.components.common.doc.annotation.*; import com.base.components.common.doc.type.*; import com.base.components.common.dto.page.DataPage; import com.base.components.common.dto.sys.PageParamMap; import com.base.components.common.dto.sys.ParamMap; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @Tag(name = "测试示例") @RestController public class DocController { @Operation(summary = "Post接口,Payload参数") @ApiExtension(author = "作者", update = "2019-06-09 13:32:22", token = @Token) @RequestBodyModel(baseModel = UserInfo.class, value ={ @Param(name = "f1",value = "动态字符f1", example = "xxx", required = true), @Param(name = "f2",value = "动态数字f2", example = "1", dataType = Integer.class), @Param(name = "obj",value = "动态对象obj", dataType = ObjectType.class), @Param(name = "obj.id",value = "动态对象obj字段id", required = true), @Param(name = "list[]",value = "动态列表list", dataType = ArrayType.class), @Param(name = "list[].name",value = "动态列表list字段name"), @Param(name = "tagList[]" ,value = "标签列表", dataType = ArrayType.class, genericType = Tags.class), @Param(name = "tag" ,value = "标签对象", dataType = Tags.class), @Param(name = "password" ,value = "UserInfo隐藏字段password", hidden = true), }) @ReturnModel(baseModel = UserInfo.class) @PostMapping(value = "/demo", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity postDemo(@RequestBody ParamMap paramMap){ return ResponseEntity.ok().build(); } @Operation(summary = "Get接口") @ApiExtension(author = "作者", update = "2019-06-09 13:32:22",token = @Token) @RequestModel({ @Param(name = "id",value = "id", requestScope = Scope.PATH, required = true), @Param(name = "name" ,value = "name"), @Param(name = "pageNum", value = "当前页数; 默认1", dataType = Integer.class), @Param(name = "pageSize", value = "每页行数; 默认30", dataType = Integer.class) }) @ReturnModel(baseModel = DataPage.class, value = { @Param(name = "list[]", value = "数据列表", dataType = ArrayType.class, genericType = UserInfo.class) }) @GetMapping(value = "/demo/{id}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity demo(@PathVariable("id") String id, @RequestParam PageParamMap paramMap){ return ResponseEntity.ok().build(); } } ``` --- ### [code-tool](code-tool):代码生成工具 - 参考application.yml配置: ```yaml server.port: 9999 spring: application: name: "code-tool" datasource: driver-class-name: net.sf.log4jdbc.DriverSpy name: 'demo_dev' username: 'root' password: '123456' url: jdbc:log4jdbc:mysql://127.0.0.1:3306/${spring.datasource.name}?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8 freemarker: suffix: ".ftl" #如需修改模板,在对应位置覆盖模板文件即可;如:classpath: templates/common/DomainMybatisAndJPA.tmpl ```