# treasure
**Repository Path**: xxsoftware/treasure
## Basic Information
- **Project Name**: treasure
- **Description**: treasure
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 75
- **Created**: 2023-07-20
- **Last Updated**: 2023-07-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
2020-05-05~至今
## 1 初衷
积累,成长
## 2 分支规划
+ `master` 微服务架构 业务场景模拟,学习案例
+ `study` 单体架构、学习案例
+ `scene` 单体架构、最佳实践、插件化、模块化、配置化
## 3 简介
`Treasure`是一个`Java`技术生态项目
+ 开源可免费商用
+ 为兴趣而开源为、学习而开源、为技术而开源
+ 学习成长过程中一些技术点、整合工作中积累的一些心得
+ 面试中一些业务场景模拟及解决方案一些常见、通用业务的解决方案
+ 合理应用设计模式进行一些业务代码的重构优化
+ 常用小轮子的积累、一些更优雅的编码实现
+ 常用、通用业务场景starter封装、日常使用自研小工具(同步更新阿里云制品仓库)
## 4 模块
### 4.1 scene分支
~~~
com.dingwen
├── scene // 综合场景启动器使用示例
│ └── pom.xml // Maven依赖
├── starter // 启动器集
│ └── logv-spring-boot-starter // 依赖管理模块
│ └── logv-spring-boot-starter // 日志文件查看启动器
│ └── enums-spring-boot-starter // 枚举场景启动器
│ └── screw-spring-boot-starter // 数据库文档生成场景启动器
│ └── api-docs-spring-boot-starter // API文档再封装场景启动器
│ └── dic-spring-boot-starter // 字典场景启动器
│ └── config-spring-boot-starter // 系统配置场景启动器
│ └── webplus-spring-boot-starter // Web再封装场景启动器
│ └── quartz-spring-boot-starter // Quartz定时任务场景启动器
│ └── file-spring-boot-starter // 文件场景启动器
│ └── // Mongodb场景启动器
│ └── // 数据脱敏场景启动器
│ └── // JWT场景启动器
│ └── // Security场景启动器
│ └── // XXLJOB场景启动器
│ └── // 文件预览场景启动器
│ └── // 监控场景启动器
│ └── // 审核场景启动器
│ └── // ...
├── pom.xml // Maven依赖
~~~
### 4.2 study分支
~~~
com.dingwen
├── treasure-canal-client // canal客户端 [80]
├── treasure-kettle // kettle集成企业级解决方案 [9999]
├── treasure-websocket // websocket方案 [8081] [8080]
├── treasure-sms4j // 通用短信解决方案 [8080]
├── pom.xml // Maven依赖
~~~
### 4.3 master分支
~~~
com.cdn
com.dingwen
├── treasure-auth // 认证服务 [20902]
├── treasure-business // 业务服务 [20903]
├── treasure-admin // 监控服务 [20901]
├── treasure-common // 通用模块
│ └── common-pom // 依赖管理模块
│ └── common-base // 基础模块
│ └── common-beansearcher // 对象搜索
│ └── common-config // 基础配置
│ └── common-core // 核心模块
│ └── common-jpa // 持久层JPA
│ └── common-jwt // JWT令牌
│ └── common-knifej // 接口文档
│ └── common-model // 通用MODEL
│ └── common-mongodb // MongoDB
│ └── common-mybatisplus // 持久层Mybatisplus
│ └── common-rabbitmq // RabbitMQ
│ └── common-redis // Redis
│ └── common-security // 安全模块
│ └── common-sensitive // 自定义注解实现数据脱敏
│ └── common-web // WEB模块
│ └── common-tkmybatis // tkmybatis模块
│ └── common-minio // minio文件存储
│ └── common-easyexcel // excel 文件导入导出
│ └── common-influxdb // 时序数据库案例
│ └── common-open-api // open api 案例
│ └── open-api-baidu-map // 百度地图
│ └── open-api-sms // 阿里云短信
│ └── open-api-tx // 天行数据基础服务
│ └── open-api-wechat-pub // 微信公众号
│ └── open-api-baidu-map // 百度地图
│ └── open-api-tianxing-rainbow // 天行数据彩虹屁
├── treasure-gateway // 网关服务 [20904]
├── treasure-log // 日志服务 [20905]
├── treasure-manage // 后台管理 [20906]
├── treasure-file-generate // 文件生成服务 [20907]
├── treasure-task-quartz // 定时任务(Quarzt实现) [20908]
├── treasure-file // 文件服务 [20909]
├── treasure-code-generate // 代码生成服务 [20910]
├── treasure-slow-sql // 慢SQL [20911]
├── logs // 日志
├── sql // sql
├── img // 图片
├── pom.xml // 公共依赖
~~~
## 5 架构图
> 参考若依

## 6 概览
### 6.1 API文档
[在线文档](https://www.apifox.cn/apidoc/shared-2d9191fd-dfd4-45a3-bc29-57500b3a5f1b)
## 7 技术点
| | | | | | | | | | |
|-----------|---------------------|------------|-----------------|--------------|-----------|---------|-----|-----|------------------|
| Redis | Mysql | MongoDB | Canal | | | | | | Alibaba Druid |
| Spring | SpringMVC | SpringBoot | Spring Security | | | | | | SpringBoot Admin |
| Mybatis | MybatisPlus | TK Mybatis | | | | | | | JPA |
| Mapstruct | MapstructPlus | Hutool | Screw | BeanSearcher | EasyExcel | knife4j | | | p6spy |
| | | | | | | | | | Maven |
| | | | | | | | | | Quartz |
| Nacos | SpringCloud Alibaba | GateWay | Feign | Hystrix | | | | | Ribbon |
| RabbitMQ | RocketMQ | | | | | | | | Kafka |
| | | | | | | | | | ELK |
| Thymeleaf | | | | | | | | | Layui |
| Minio | | | | | | | | | JWT |
## 8 核心Starter封装
> Maven增加一下配置即可
```xml
rdc-releases
62c3e2f6a908b6a4db54fa26
5V8N7KJ]rvtt
rdc-snapshots
62c3e2f6a908b6a4db54fa26
5V8N7KJ]rvtt
mirror
central,jcenter,!rdc-releases,!rdc-snapshots
mirror
https://maven.aliyun.com/nexus/content/groups/public
rdc
rdc-releases::default::https://packages.aliyun.com/maven/repository/2380560-release-WXL1gl/
rdc-snapshots::default::https://packages.aliyun.com/maven/repository/2380560-snapshot-vKCASA/
rdc
```
### 8.1 日志文件查看启动器
> 基于Websocket、SpringBoot2.x、layui实现的可配置的Web版日志查看器
#### 8.1.1 核心功能
+ 可选基础目录生成文件树
+ 日志文件编码配置化
+ 追加新日志自动滚动
#### 8.1.2 优化点
+ 日志查看页增加文件下载
+ 文件树按照创建时间降序
+ 大量的日志输出导致内存飙升
+ 大量的客户端链接导致CPU飙高
+ UI美化
+ 异常提示完善
#### 8.1.3 使用
##### 8.1.3.1 引入依赖
```xml
com.dingwen
logv-spring-boot-starter
1.0.0-SNAPSHOT
```
##### 8.1.3.2 启动项配置
> 配置表扫描
```java
@SpringBootApplication(scanBasePackages = "com.dingwen")
```
> 配置接口文档放行、线程池、监控项
```yml
dingwen:
treasure:
# webplus
webplus:
debug: true
handlers:
- handler: "doc.html"
locations: "classpath:/META-INF/resources/"
- handler: "swagger-ui.html"
locations: "classpath:/META-INF/resources/"
- handler: "/webjars/**"
locations: "classpath:/META-INF/resources/webjars/"
# async
async:
logPrint: true
pool:
- core: 8
max: 16
keepAliveTime: 60
queueCapacity: 2000
poolNamePrefix: treasure-async-
poolBeanName: logvExecutor
poolPolicy: CallerRunsPolicy
# 监控项
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
shutdown:
enabled: true
```
#### 8.1.3 访问地址
> 默认启动端口: `2023`
+ [首页](http://127.0.0.1:2023/common/logv/manager.html)
+ [接口文档](http://127.0.0.1:2023/doc.htm)
#### 8.1.4 概览
### 8.2 高效的通用枚举处理启动器
> 从前端到服务乃至数据库到枚举解决方案,零代码,开箱即用
> 已加缓存,速度杆杆滴
#### 8.2.1 主要功能
+ 统一枚举实现
+ 统一枚举响应
+ 统一枚举MVC转换
+ 统一枚举序列化
+ 统一枚举反序列化
+ 统一枚举接口实现
+ 获取所有枚举时支持分页
+ 统一异常处理
#### 8.2.3 内置接口
+ 获取服务端所有枚举 `/common/enums`
+ 分页查询枚举 `/common/enums/page`
+ 指定枚举类全路径查询执行枚举 `/common/enums/{enumClassName}`
### 8.2.4 使用
> 枚举持久化依赖各自持久层实现。
> MybatisPlus 3.5.2后版本只需要在实体类中存储数据库值的字段标注
> `@EnumValue`即可
#### 8.2.5 引入依赖
```xml
com.dingwen
enums-spring-boot-starter
1.0.0-SNAPSHOT
```
#### 8.2.6 创建自己到枚举
```java
package com.dingwen.treasure.mybatisplus.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
import com.dingwen.treasure.enums.core.IBaseEnum;
/**
* 逻辑删除
* @author dingwen
* @date 2022/6/14
*/
@Getter
@AllArgsConstructor
public enum LogicDelete implements IBaseEnum {
/**
* 已删除
*/
DELETED(0, "删除"),
/**
*存在
*/
EXISTED(1, "存在");
/**
* 状态值
*/
@EnumValue
private final Integer code;
/**
* 状态描述
*/
private final String desc;
}
```
#### 8.2.7 配置项
```yml
dingwen:
treasure:
# enums
enums:
# 枚举类扫描包
packagepath: "com.dingwen"
# 枚举类所在类路径
classpath: "/**/*.class"
```
#### 8.2.8 注意点
> IBaseEnum中已提供枚举比较方法以及转换方法可直接使用
#### 8.2.9 概览
### 8.3 数据库文档生成启动器
> 基于Screw、Freemarker实现的支持word,markdown,html文件生成的数据库文档生器
#### 8.3.1 核心功能
+ 包含可配置的详细注释生成
+ 表名称,前缀,后缀等细粒度可配置化
+ 文档名称,标题可配置化
+ 同时支持work,markdown,html版本数据库设计文档
#### 8.3.3 使用
##### 8.3.3.1 引入依赖
```xml
com.dingwen
screw-spring-boot-starter
1.0.0-SNAPSHOT
```
##### 8.3.3.2 启动项配置
> 配置表扫描
```java
@SpringBootApplication(scanBasePackages = "com.dingwen")
```
> 配置文档参数
```yml
dingwen:
treasure:
# 数据库文档生成
screw:
# 数据源连接地址
jdbcUrl: ${spring.datasource.dynamic.datasource.master.url}
# 数据源用户名
username: ${spring.datasource.dynamic.datasource.master.username}
# 数据源连接密码
password: ${spring.datasource.dynamic.datasource.master.password}
# 驱动类名称
driverClassName: ${spring.datasource.dynamic.datasource.master.driver-class-name}
# 是否读取表注释信息
tableRemark: true
# 文档版本号
docVersion: 1.0.0
# 文件输出目录
fileOutputDir: @project.name@/src/main/resources/static
```
#### 8.3.3 访问地址
+ [首页](http://127.0.0.1:8080/treasure_doc_1.0.0.html)
#### 8.3.4 概览
 |
 |
## 9 核心服务
### 9.1 treasure-business
> 业务场景模拟,最佳实践
+ RabbitMQ保证顺序、可靠投递、可靠消费`MessageController`
+ 执行次数、耗时优化工具`MarketingController`
+ JavaScript动态规则校验`JavaScriptController`
+ 基于Redis实现接口限流`RateLimiterController`
+ 多线程异步多任务进度条`ProgressBarTaskController`
+ 行政区划截取替代优化实现`AreaUtilController`
+ 自定义线程池、异步任务`AsyncController`
+ 批量插入方案优化对比`BatchSaveController`
+ `CompletableFuture`案例`CompletableFutureController`
+ 后台跨域处理方式一`CorsController`
+ Validate自定义注解进行个性化规则校验 `CustomValidateController`
+ 自定义注解实现数据脱敏`DesensitizationController`
+ jackson反序列化自定义对象`DeserializerController`
+ 自定义注解动态查询数据库进行字典翻译`DictionaryController`
+ 自定义注解实现通用缓存逻辑 `EasyCacheController`
+ 枚举类型序列化和反序列化 `EnumConvertController`
+ 全局异常处理 `ExceptionController`
+ 国际化 `LocaleController`
+ 设计模式-状态模式案例(活动营销状态流转)`MarketingController`
+ Mybatis-PLus 案例 `MybatisPlusController`
+ 自定义注解实现操作日志记录 `OperationLogRecordController`
+ 设计模式-观察者模式案例-创建订单`OrderController`
+ 异步短信,请求削峰 `OweFeeController`
+ 设计模式-简单工厂+模版方法+策略模式+函数式接口`PayController`
+ 自定义注解实现防止重复提交`ReSubmitController`
+ Redis`setnx`版分布式锁案例
+ `ResponseBodyAdvice`实现统一返回 `ResponseBodyAdviceController`
+ 开放接口对接-短信 `SmsController`
+ `feign`调用案例`TaskFeignController`
+ 设计模式-责任链-任务生成案例`TaskGenerateController`
+ 后端枚举类型统一翻译 `EnumController`
+ 自定义注解实现加解密、脱敏 `SensitiveController`
+ 微信公众号定制消息推送`WechatPubController`
#### 9.1.1 RabbitMQ全链路顺序、可靠消费,100%不丢失
> API入口:`MessageController`
+ 生产者进行可靠性消息投递
+ 消费者手动确认
+ 消息落库(状态管理、消费顺序控制)
+ 定时任务补偿
##### 9.1.1.1 流程图

#### 9.1.2优化工具类
> 参考Spring StopWatch 的拓展优化,精确计算执行耗时,执行次数,方便进行优化
> `OptimizeUtilController`
```java
/**
* OptimizeUtilController: 优化工具测试
* @author dingwen
* @date 2022/8/28
*/
@Api(tags = "优化工具API")
@RestController
@Slf4j
@RequestMapping("optimize")
@RequiredArgsConstructor
public class OptimizeUtilController {
@ApiOperation(value = "API使用测试")
@GetMapping
public void test() {
optimizeApi();
}
@SneakyThrows(Throwable.class)
private void optimizeApi() {
OptimizeUtil.start("任务1");
TimeUnit.SECONDS.sleep(1);
OptimizeUtil.stop("任务1");
for (int i = 0; i < 100; i++) {
OptimizeUtil.start("任务2");
for (int j = 0; j < 1000; j++) {
OptimizeUtil.start("任务2-1");
OptimizeUtil.stop("任务2-1");
}
OptimizeUtil.stop("任务2");
}
OptimizeUtil.print("任务2");
OptimizeUtil.print();
}
}
```

#### 9.1.3 复杂规则校验
> Redis + JVM 双缓存
```js
// 测试js
function add(op1, op2) {
return op1 + op2
}
add(a, b)
```
##### 9.1.3.1 整体思路、功能点

> 通过Java调用JavaScript进行规则校验,实现复杂且灵活可配置的规则校验功能`JavaScriptController`
+ 服务启动即进行规则缓存、脚本预编译
+ 多线程进行规则校验
+ 异步、实时返回结果
+ 灵活配置的特定业务特定规则
##### 9.1.3.2 表结构
###### 9.1.3.2.1 业务规则校验配置表(business_rule)
| | | | |
|------------------|----------|-----|-------------------------------------|
| 名称 | 类型 | 长度 | 备注 |
| rule_id | bigint | | 主键自增雪花id |
| rule_name | varchar | 100 | 校验规则名称 |
| rule_description | varchar | 200 | 规则描述 |
| rule_state | smallint | | 规则状态:0禁用 1启用 |
| rule_content | varchar | 255 | 规则内容(JavaScript) |
| field_name | varchar | 255 | 校验字段名称(所需要多个字段逗号分隔) |
| rule_code | varchar | 100 | 规则Code(保留字段) |
| rule_type | smallint | | 规则类型:0必填 1长度 2必填+长度 3敏感词 4正则 |
| business_id | bigint | | 业务Id |
| create_time | datetime | | 创建时间(由MybatisPlus自动填充) |
| update_time | datetime | | 修改时间(由MybatisPlus自动填充) |
| deleted | smallint | | 逻辑删除标识,1:存在,2:已删除 |
| version | smallint | | 版本号(乐观锁) |
| create_by | varchar | 100 | 创建者(也可基于Security、MybatisPlus实现自动填充) |
| update_by | varchar | 100 | 更新者(也可基于Security、MybatisPlus实现自动填充) |
| remark | varchar | 255 | 备注(保留字段) |
#### 9.1.4 Redis限流
> 基于`setnx`,通过自定义注解+脚本实现限流(参考若依实现)
+ 指定key + 凭借key
+ 基于方法
+ 基于IP
+ 指定时间、次数
```java
/**
* redis限流实现API
*
* @author dingwen
* @date 2022/11/17
*/
@Api(tags = "redis限流实现API")
@RestController
@RequestMapping("redis")
public class RateLimiterController {
@ApiOperation("redis限流测试")
@RateLimiter(time = 1, count = 2)
@GetMapping("/rate")
public Result rateLimiterSimpleTest() {
return ResultGenerator.genSuccessResult();
}
}
```
#### 9.1.5 多线程任务进度条实现
> 基于`CompletableFuture`和`redis`的多线程任务进度条实现,后端异步进行任务,前端轮询调用进度条进度查询
> + `redis`
>
+ `setnx` 检查任务key是否存在,任务是否在进行中
> + `hash` 存储任务进度信息
>
+ 指定哈希键值的`increment`
> + `CompletableFuture`
>
+ `whenComplete` 子任务完成时更新任务进度
> + `exceptionally` 发生异常时更新任务进度
> + `AbstractProgressBarTask` 抽象任务进度条组件,囊括进度条功能,子类继承实现业务逻辑即可
##### 9.1.5.1 API调用
```java
/**
* 进度条任务API
*
* @author dingwen
* @date 2022/12/07
*/
@Api(tags = "进度条任务API")
@RestController
@RequestMapping("bar")
public class ProgressBarTaskController {
@Resource(name = "testProgressBarTask")
private TestProgressBarTask testProgressBarTask;
@ApiOperation(value = "提交进度条任务")
@ApiImplicitParams({
@ApiImplicitParam(name = "taskId", value = "任务id"),
@ApiImplicitParam(name = "taskType", value = "任务类型")
})
@PutMapping()
public Result submit(@RequestParam("taskId") String taskId, @RequestParam("taskType") String taskType) {
TaskType taskTypeByCode = EnumUtil.getEnumByCode(TaskType.class, taskType);
return ResultGenerator.genSuccessResult(
testProgressBarTask.execute(
taskId,
taskTypeByCode,
100,
100
)
);
}
@ApiOperation(value = "查询任务进度")
@ApiImplicitParams({
@ApiImplicitParam(name = "taskId", value = "任务id"),
@ApiImplicitParam(name = "taskType", value = "任务类型")
})
@GetMapping("/{taskId}")
public Result queryProgress(@PathVariable("taskId") String taskId,
@RequestParam("taskType") String taskType) {
TaskType taskTypeByCode = EnumUtil.getEnumByCode(TaskType.class, taskType);
return ResultGenerator.genSuccessResult(testProgressBarTask.queryProcess(taskId, taskTypeByCode));
}
}
```
##### 9.1.5.2 功能概览
#### 9.1.6 自定义注解实现加解密、脱敏 `SensitiveController`
+ 枚举类`SensitiveEnum`
+ 实体 `SensitiveEntity`
+ 自定义注解
+ SensitiveDecode 解密
+ SensitiveEncode 加密
+ SensitiveField 字段标识
+ SensitiveInfoUtil 加解密、脱敏工具类
+ AesEncryptUtil AES工具类
##### 9.1.6.1 功能概览
#### 9.1.7 阿里云短信对接 `SmsController`
##### 9.1.7.1 功能概览
#### 9.1.8 微信公众号定制消息推送`WechatPubController`
> 开放平台对接(基于Spring提供定时任务实现):
> + 天行数据
> + 百度地图
> + 微信公众号平台
#### 9.1.9 common-influxdb
> 时序数据库案例
> + [官网](https://docs.influxdata.com/)
> + 接口 `IotDataService`
### 9.2 treasure-slow-sql
#### 9.2.1 深分页查询优化
```sql
SELECT *
FROM sys_user
WHERE id > #{offset} LIMIT 0,#{pageSize};
```
```java
/**
* 优化Api
* @author dingwen
* @date 2022/8/5
*/
@Api(tags = "优化API")
@RestController
@Slf4j
@RequestMapping("optimize")
@Validated
public class OptimizeController {
@Resource
private SysUserService userService;
/**
* 适用于自增id
* 数据总条数:4301000
* 自带查询分页性能:
*
* - 第 1 页 10 条关闭count查询优化耗时:4秒
* - 第 100,00 页 100 条关闭count查询优化耗时:5秒
* - 第 100,000 页 100 条关闭count查询优化耗时:5秒
*
* - 第 1 页 10 条打开count查询优化耗时:4秒
* - 第 100,00 页 100 条打开count查询优化耗时:4秒
* - 第 100,000 页 100 条打开count查询优化耗时:4秒
*
*
* 优化后性能:
*
* - 第 1 页 10 条耗时:30~80毫秒
* - 第 100,00 页 100 条耗时:30~80毫秒
* - 第 100,000 页 100 条耗时:30~80秒
*
*
* 再进行统计总记录条数时会遇到瓶颈,正确的处理方式应该是杜绝深分页,不会有用户往下翻到地100页
* 一般选择50页即可
*
* @param pageDto 页面dto
*/
@PostMapping("/deep-page")
@ApiOperation("深分页查询优化")
public Result> deepPage(@RequestBody PageDto pageDto) {
Long current = pageDto.getCurrent();
Long pageSize = pageDto.getPageSize();
Page page = new Page<>(current, pageSize);
// 可以选择关闭count查询优化,解决一对多时分页查询总计记录条数不正确问题
page.setOptimizeCountSql(Boolean.TRUE);
//return ResultUtil.genResult(userService.page(page));
return ResultGenerator.genSuccessResult(userService.optimizeSelectPage(current, pageSize));
}
}
```
### 9.3 treasure-kettle
> 企业级的数据中台ETL处理服务,提供数据的定时抽取、转换、加载整体解决方案
#### 9.3.1 下载安装
> 官网:http://community.pentaho.com/projects/data-integration
> Carte接口文档:https://help.hitachivantara.com/Documentation
#### 9.3.2 组成部分
+ spoon
> window客户端设计器。windows平台可以直接使用官方程序,linux or mac os 平台建议使用网页版本的spoon
+ pan:执行转换(命令行方式+操作系统定时任务)
+ kitchen: (命令行方式+操作系统定时任务)
+ carte: kettle服务,rest接口提供服务(支持主从)
#### 9.3.3 资源库
+ 文件资源库
+ 数据库资源库: 创建数据库,使用`spoon`配置连接后可自动创建表结构,共计46张表

#### 9.3.4 方案思路
> Java集成定时远程调用和远程服务方式调用以及使用`spoon`客户端进行远程调用需要启动`carte`。
> carte.sh指定配置文件启动,单机考虑一主一从。默认用户密码(cluster),可在启动文件中配置
##### 9.3.4.1Java集成定时远程调用
> 远程调用执行
> + id: master ip
> + port: master port
> + dataRepositoryName: 数据库资源库名称
> + user: 集群名称(master中配置)
> + password: 集群密码(master中配置)
> + transName: 转换文件名称
> + jobName: 作业文件名称
> + path: 路径
```shell
# 转换执行
https://{ip}:{port}/kettle/executeTrans/?rep={dataRepositoryName}&user={userName}&pass={password}&trans={path/transName.ktr}
# 作业执行
https://{ip}:{port}/kettle/executeJob/?rep={dataRepositoryName}&user={userName}&pass={password}&job={path/jobName.kjb}
# 查看状态监控
https://{ip}:{port}/kettle/status
```
##### 9.3.4.2 远程服务方式调用
> 依赖于`carte`服务,可以采用`spoon`客户端触发远程作业,进行定时调用。(无需代码,配置即可实现)
##### 9.3.4.3 spoon 客户端
> windows平台可以直接使用官方程序,linux or mac os 平台建议使用网页版本的spoon
```shell
docker search hiromuhota/webspoon
docker run -d -p 8080:8080 --name spoon hiromuhota/webspoon
```

#### 9.3.5 其他
##### 9.3.5.1 Kettle自带监控页面


##### 9.3.5.2 SpringBoot2.X和Kettle9整合
```shell
# 手动添加如下依赖
mvn install:install-file -DgroupId=组织名称 -DartifactId=坐标 -Dversion=9.3.0.0-428 -Dpackaging=jar -Dfile= jar包名称
```
### 9.4 treasure-task-quartz
#### 9.4.1 整体介绍
> 基于`quartz`
>
的定时任务实现,API灵活控制,精确日志记录,分布式部署完整的解决方案。注意:当次解决方案在分布式应用场景中时,确保任务不重复执行依赖与`quartz`
> 持久化到数据库依赖数据库悲观锁实现。
#### 9.4.2 特点
> + 分布式部署保障不重复执行不漏跑
> + 模版方法:代码可重用性
> + 实时接口调用控制任务执行、停止
> + 接口调用修改任务信息
> + 执行日志记录
#### 9.4.3 表设计
+ `QRTZ_BLOB_TRIGGERS`
+ `QRTZ_CALENDARS`
+ `QRTZ_CRON_TRIGGERS`
+ `QRTZ_FIRED_TRIGGERS`
+ `QRTZ_JOB_DETAILS`
+ `QRTZ_LOCKS`
+ `QRTZ_PAUSED_TRIGGER_GRPS`
+ `QRTZ_SCHEDULER_STATE`
+ `QRTZ_SIMPLE_TRIGGERS`
+ `QRTZ_SIMPROP_TRIGGERS`
+ `QRTZ_TRIGGERS`
##### 9.4.3.1 定时任务信息表`quartz_info`
| 名称 | 类型 | 长度 | 备注 |
|--------------------|----------|-----|-------------------|
| id | bigint | | 数据库自雪花id |
| code | varchar | 255 | 定时任务code标识 |
| create_time | datetime | | 创建时间 |
| cron_expression | varchar | 255 | cron表达式 |
| fail | int | | 失败次数 |
| full_class_name | varchar | 255 | 定时任务执行类 全类名,Job类 |
| job_data_map | varchar | 255 | jobDataMap json格式 |
| job_group_name | varchar | 255 | job组名称 |
| job_name | varchar | 255 | job 名称 |
| name | varchar | 255 | 定时任务名称 |
| state | int | | 是否启用 1-启用 0-禁用 |
| success | int | | 成功执行次数 |
| trigger_group_name | varchar | 255 | 触发器组名称 |
| trigger_name | varchar | 255 | 触发器名称 |
| update_time | datetime | | 更新时间 |
##### 9.4.3.2 定时任务日志表 `quartz_log`
| 名称 | 类型 | 长度 | 备注 |
|----------------|----------|-----|---------------------------|
| id | bigint | | 数据库自雪花id |
| quartz_id | bigint | | 任务id关联 |
| activate_time | datetime | | 激活时间 |
| consumer_time | int | | 任务耗时 |
| execute_result | int | | 执行结果:
1: 成功
0: 失败 |
| remark | varchar | 255 | 备注 |
### 9.5 treasure-manage
> 常用后台管理实现
### 9.6 treasure-common
> 公共模块
> + base: 基础、通用
> + config: 配置
> + core:核心通用组件
> + jpa:jpa场景
> + mybatisplus mybatisplus场景
> + web: web场景
> + knife4j: API文档
> + rabbitmq: RabbitMQ 应用场景
> + redis: Redis 应用场景
### 9.7 treasure-admin
> 基于`SpringBoot Admin`整合`Spring Security`的监控实现,目前暴露所有端点,权限账户信息通过`nacos`配置指定
```yaml
spring:
security:
user:
name: actuator
password: actuator
```
> TODO
> + 自定义info、metrics、health、endpoint
> + 邮件、钉钉预警
### 9.8 其他临时文档
+ business
> 优雅代码业务组件实现(MybatisPlus)
> 特色业务场景
> + 线程池案例
> + 批量save
> + 自定义MVC反序列化方式
> + 缓存业务场景自定义注解:@EasyCache
> + 国际化
> + 状态模式+简单工厂模式实现:多阶段灵活控制状态流转
设计模式六大原则:
+ 单一职责
+ 接口隔离(Servlet filter)
+ 依赖倒置
+ 迪米特(最少知道原则)
+ 里氏替换 (父类抽象方法应保持行为一致,非抽象方法不应去重写)
+ 开闭原则
+ 合成复用
+
状态模式: 对象不同的状态导致不同的行为
+ 主要角色:
+ 抽象状态(接口或抽象类)
+ 具体状态(抽象状态的子类或实现类)
+ 环境类 (状态持有着,依据不同的状态出发不同的行为)

> + MybatisPlus:乐观锁、逻辑删除、自动枚举转换、多数据源、Model、自动填充、分页等其他通用API
> + 观察者模式:(事件对象、监听)下订单走库存以及日志,以事件驱动
> + 支付案例:简单工厂 + 模版方法 + 策略模式 + 函数式接口

+ 责任链模式:为请求创建了一个接收者对象的处理链,,对请求的发送者和接收者进行解耦


> + 基于redis、redisson的分布式锁
> + 防止重复提交自定义注解:@ReSubmit
> + (解决数据库和缓存不一致的问题)系统配置:db、redis、自定义缓存(利用redis发布订阅实现三级缓存)
> + 基于Mybatis的通用crudController封装已经整合API文档
> + 全局统一返回
> + 全局异常处理
> + 优雅DTO、VO、BO、PO转换
> + feign调用(整合hystrix实现服务降级)
> + 系统配置实现(三级分布式缓存)redis 发布订阅实现跨内存刷新
> + AOP 切面实现方法调用前后入参、返回值、耗时等调试日志(全局所有controller)、基于配置灵活开启关闭
> + 消息队列业务模拟(保证顺序消费、保证不重复消费、消息可靠投递、消息可靠消费)
> + 操作日志(AOP+Sprint EL 实现同步ElasticSearch)参考美团2021年技术年报实现、基于配置灵活开启关闭
> TODO
> + redisson 分布式锁
> + 规范转换Bean mapstruct
> + 基于JPA的通用crudController封装
> + 通用crudController封装 mongoDB
+ gateway
> 网关,基于`nacos`的可配置白名单
> TODO
> + 统一请求日志
> + 认证
> + 服务间其他信息
+ pdf
> 基于`freemarker`模版实现的后端生成PDF或在线预览功能
+ manage
> 后台管理模块
> 特色业务场景
> + 消息队列业务模拟(顺序消费、不重复消费、可靠消费) 死信队列、延时队列
+ auth
> 认证模块
> TODO
> + 权限
> + RBAC
> + 参考若依实现
> + 菜单、路由
> TODO
> + 文件上传minio
+ API文档
+ knife4j
+ business-service: 地址:http://127.0.0.1:20908/doc.html
+ task-service: 地址:http://127.0.0.1:20902/doc.html
+ 用户名:`test`
+ 密码:`123`
+ 监控面板
+ spring-boot-admin、spring-boot-starter-security
+ 地址:http://127.0.0.1:20906/login
+ 用户名:`actuator`
+ 密码:`actuator`
+ 国际化
+ 监控
+ 定时任务
+ API文档
+ Aop
+ ReSubmit(防止重复提交)
+ EasyCache (缓存)
+ 通用业务组件
+ 简单工厂 + 策略模式
+ 模版方法
+ Spring 高级
+ 观察者模式(监听、事件机制)
+ 自动注入Map
+ 监控自定义 预警(钉钉、邮件)
+ Mybatis Plus
+ 多数据源
+ 逻辑删除
+ 乐观锁
+ Model
+ lambda
+ 通用枚举
+ 联合主键`@MppMultiId`、`IMppService`、`MppBaseMapper`
+ 自动填充新增时间、修改时间
+ Mysql
+ 枚举类型
+ Json 类型
+ 分布式锁
+ 分布式事务
+ Sentinel
+ 链路追踪
+ 定时任务 Quartz
+ 设计模式:模版方法
+ Jpa 实现
+ 基于数据库悲观锁实现分布式锁,支持多节点部署
+ 保证不重复执行
+ 保证不漏执行
+ Rabbitmq
+ 可靠消费
+ 可靠投递
+ 顺序消费
+ 全局异常处理
+ 权限
> 参考若依实现
+ SSO
+ 系统配置
+ 通用日志
+ 操作日志
+ 系统日志
> 参考美团技术年报、若依。初步实现思路:Aop及Spring EL 表达式实现日志数据组装,通过RabbitMq将数据同步到ElasticSearch
+ MongoDB
+ WebFlux
+ canal
+ 依赖优化
+ 规范转换Bean mapstruct
+ 全局异常
+ 权限(market、ruoyi)
+ 系统配置
+ Redis 实现分布式锁
+ 状态模式
+ 状态直接可以存在相互依赖关系
+ 状态之间可以相互转换,可以反复
+ 策略模式
+ 多种算法行为选择一个就能满足
+ 算法独立
+ 自定义MVC反序列化进行Java Bean 数据封装
+ 文件存储
+ 短信
+ spring 批处理 batch
+ 网关统一日志
+ 统一系统配置
> redis & JVM 两级缓存,使用 redis 发布订阅实现,支持分布式
+ JDBC 批处理
+ DTO、VO、BO 转换
+ 定时任务BUG
+ @EnableAspectJAutoProxy
> 在SpringBoot2已经无效,需要通过,`spring.aop.proxy-target-class=false`
> 指定为JDK方式实现,默认值为true,即采用CGLIB实现
+ TODO
+ 分布式定时任务框架 xxl_job
+ 分布式事务
+ 分布式锁
+ 并发编程
+ SQL优化
+ 脚本
+ 容器化
+ ELK
+ 日志配置
+ 启动初始化
+ `ApplicationRunner`
+ `CommandLineRunner`
+ http://127.0.0.1:20900 网关
+ 分布式文件存储 minio
+ 调试日志(入参、返回值、耗时)es
+ 后端渲染生产PDF (freemarker)
+ mybatis 场景整合 (动态标签等常用技巧备忘)
+ 文件预览
+ excel 通用封装 (基于 hutool 、 poi) 参考若依
+ sql 优化
+ JVM
+ SQL 窗口函数
+ 参数范围校验注解
+ 字典
+ 高德地图
+ 日志配置
+ 枚举
+ 序列化、反序列化
+ excel
+ docker 部署
+ 若依数据权限
> 存储过程没有返回值 procedure call
> 必须有返回值 function 直接调用
+ token 刷新
+ 全局拦截器
+ nacos 刷新
+ 慢sql监控
+ 用户在线统计
+ 站内信息
+ 字典 aop
+ 观察者模式
+ 状态模式
+ 享元模式
+ 单例模式
+ 构建者模式
+ 原型模式
+ mongodb 索引优化
+ lambda return
+ 常量定义
+ feign 调用 localDatetime反序列化问题
+ 工厂方法模式 应用场景
+ 抽象工厂模式 应用场景
+ JUC 中断三种方式
+ 工作流
+ validator 分组校验
+ 字典
+ 根据字典配置动态生成枚举类型
+ 字典动态翻译
+ 文件视频格式等问题预览
+ 依赖模块优化
+ 消息可靠性
+ juc
+ spring cloud
+ kkfile
+ ffmepg
+ 可靠消费 不丢失 重复 实战
+ 缓存双写实战
+ 代码生成
+ 动态数据源 druid 监控
+ 数据权限 租户 若依
+ xss
+ author2
+ mapstruct
+ HashMap
+ ConcurrentHashMap
+ druid 数据源
+ 跨域(Cross Origin Resource Sharing)
+ 发生在前端
+ 浏览器的同源策略:协议、主机、端口
+ 三种后端解决方式
+ @CrossOrigin
+ Cross Filter
+ WebMvcConfigure
+ UML:Unified Modeling Language
+ 类图(两个矩形:顶类名称,上属性,下方法)
+ 属性: 权限 名称: 类型
+ 方法: 权限 方法名称(参数列表): 返回值类型
+ 权限:
+ ` ` default
+ `-` private
+ `+` public
+ `#` protected
+ 关系:
+ 关联关系:
+ 引用:实线实心三角形箭头指向被引用的一方
+ 双向关联:实线
+ 自关联: 实线实心三角形箭头指向自己
+ 聚合关系:整体和部分的关系,强烈的聚合关系,部分可以离开整体
+ 实线空心菱形指向整体
+ 组合关系: 整体和部分的关系,更强烈的聚合关系,部分不可以离开整体(头、嘴)
+ 实线实心菱形指向整体
+ 依赖关系: 耦合度最弱的一种关联关系(调用,引用)
+ 虚线虚线箭头指向被依赖的类
+ 继承关系(泛化关系)
+ 实线空心三角形指向父类
+ 实现关系
+ 虚线空心三角形箭头指向接口
+ nullSafeEquals
+ 枚举优化
+ redis 队列、map
+ 大文件上传、切片、多线程、断点续传
+ Spring cache
+ @Cacheable
+ InitializingBean
+ xss
+ @CacheEvict
+ @EventListener
+ 微服务 过滤器认证 market
+ treasure 开放平台
+ 交换平台
+ webservice
+ websocket
+ pig4
+ nacos内置
+ 数据权限
+ 代码生成
+ js 规则引擎
+ webflux
+ security 方式认证授权
+ 开放平台 4种授权 三方登录
+ xss
+ @inner
+ webservice
+ websocket
+ @PositiveOrZero
+ base controller
+ redis 限流
+ 通用返回优化
+ 自增主键,分页优化方案
git config --local http.postBuffer 157286400
+ ER
+ 详细设计
+ 技术文档
+ @Configuration(proxyBeanMethods = false)
+ true: 走代理,配置类中各个方法相互依赖
+ false: 不走代理,配置类中各个方法不依赖,可提高性能
+ pom优化
+ kettle
+ 缓存
+ 上下文待优化
+ 登录待优化
+ TokenService待优化
+ StringJoiner
+ 数据脱敏考虑隐私权限、用户权限
+ 数据权限
+ 开放平台
+ 集成三方登录
+ 短信、天气
+ 本地缓存
+ 如何停止一个线程
+ rpc
+ docker 部署
+ 脚本 启动等
+ influxdb 时序数据库
+ navicat 模型
+ java -jar -Dfile.encoding=utf-8 -DTREASURE_NACOS_NAMESPACE=treasure treasure-business.jar
+ docker build -t treasure-business:v1.0 .
+ docker run -p 20903:20903 --name treasure-business -d treasure-business:v1.0
+ 开放平台 oauth
+ 第三放登录
+ 高德地图导入行政区划
+ 若依数据权限 【PLus】
+ 验证码登录
+ 枚举
+ 若依 @Anonymous
+ 异常国际化处理
+ git 指定某次提交合并到指定分支【先切换到目标分支 在执行git cherry-pick 8888189f】
+ `XXXController`
> 功能动词
+ `obtainXXX`获得
+ `discardXXX`删除
+ `XXXManager`、`IXXXManager`、`IXXXManagerImpl`【Optional】
> 功能动词+For使用场景
+ `obtainDeptTree`【获得部门树】
+ `XXXService`、`IXXXService`、`IXXXServiceImpl` 【Optional】
> 功能动词+By条件+For使用场景
+ `queryDeptById`【通过部门id查询部门信息】
+ `queryDeptsForMini` 【小程序端查询部门列表】
+ `queryDeptsForWeb` 【Web端查询部门列表】
+ `queryDeptPage` 【部门列表分页查询】
+ `modifyDept`【修改部门信息】
+ `createDept`【创建一个部门】
+ `createDepts`【创建多个部门】
+ `removeDeptById`【通过部门id删除部门】
+ `removeDeptByIds`【通过部门ids删除部门】
+ `XXXMapper`
+ `insertDept` 【插入一个部门】
+ `insertDepts` 【批量插入部门】
+ `updateDeptById` 【通过部门id修改部门信息】
+ `deleteDeptById`【通过部门id删除部门】
+ `deleteDeptByIds`【通过部门ids删除部门】
+ `selectDeptsByRLikeName` 【通过部门名称右模糊查询部门列表】
+ `selectDeptPage` 【分页查询部门列表】
+ `XXXProcessor` 处理
+ `XXXHolder` 持有
+ `XXXFactory` 工厂
+ `XXXProvider` 提供者
+ `XXXRegistor` 注册
+ `XXXEngine` 核心处理逻辑
+ `XXXTask` 任务
+ `XXXContext` 上下文
+ `XXXHandler`、`XXXCallback`、`XXXTrigger`、`XXXListener`
+ `XXXAware` 感知
+ `XXXMetric`指标
+ `XXXPool`池
+ `XXXChain` 链
+ `XXXFilter` 过滤
+ `XXXInterceptor` 拦截器
+ `XXXEvaluator` 判断条件是否成立
+ `XXXStrategy` 策略
+ `XXXAdapter`适配器
+ `XXXEvent` 事件
+ `XXXBuilder` 构建
+ `XXXTemplate` 模版
+ `XXXProxy` 代理
+ `XXXConverter` 转换
+ `XXXRessolver`解析
+ `XXXParser`解析器
+ `XXXUtils` 工具类
+ `XXXHelper` 帮助类
+ `XXXConstant` 常量
+ `XXXGenerator` 生成
## 10 后续计划
+ 通用业务场景拆分封装
+ Cloud系、Dubbo系
+ 监控、告警
+ 前端部分
+ Vue3
+ Uniapp
+ Flutter
+ ELK
+ 容器化
## 10 联系我
