diff --git a/.jpb/persistence-units.xml b/.jpb/persistence-units.xml
new file mode 100644
index 00000000..85dbf08a
--- /dev/null
+++ b/.jpb/persistence-units.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index a7044284..97fce518 100644
--- a/README.md
+++ b/README.md
@@ -2,29 +2,89 @@ PassJava 项目全套学习教程连载中,[关注公众号](#公众号)第一
可落地的 Spring Cloud项目:`PassJava` https://github.com/Jackson0714/PassJava-Platform
+**此项目分为公开版和 VIP 版**
+VIP 版请加入我的星球获取。
+
+> VIP 版提供全功能的的代码仓库,预计代码量在 2W+ 以上。
+>
+> VIP 版提供新开发功能的文档,计划 80+ 讲。公开版目前更新了 30+讲,且不系统。
+>
+> VIP 版提供更加规范和系统的文档 🌹
+>
+> VIP 版提供技术支持💪🏻
+>
+> VIP 版提供正确学习项目的路线☀️
+
+
+
+
+
# PassJava 学习教程
-## 部署教程
+## 关于我
+
+🌈InfoQ 签约作者、蓝桥签约作者、阿里云社区博客专家、51CTO Top红人。
+
+🍭公众号:悟空聊架构,20000+ 技术爱好者关注。
+
+💪🏻擅长微服务、分布式、架构设计。
+
+🍎目前在一家上市公司从事基础架构建设工作。
+
+[我的 B站](https://space.bilibili.com/493005591?spm_id_from=333.999.0.0)
+
+
+### 技术支持
+
+💪🏻💪🏻💪🏻欢迎加入我的知识星球(下方扫码加入),提供`技术1v1解答`、简历修改、500人技术交流群。当然你也可以加我微信好友:passjava。
+
+
-- [Mac M1 部署项目](http://www.passjava.cn/#/01.项目简介/7.本地部署项目Mac版)
+**悟空的多个技术专题**:
+
+33 篇 SpringCloud 实战,回复PDF获取。
+
+8 篇分布式算法文章,回复分布式获取。
+
+7 篇JVM 专项训练,回复JVM获取。
+
+Elasticsearch 筋斗云版蓝皮书1.0,回复ES获取
+
+面试必备资料,关注公众号`悟空聊架构`即可获取。
+
+
+## Java 学习路线(赛亚人版)
+
+[🌈Java 学习路线(赛亚人版)](http://passjava.cn/#/01.%E9%A1%B9%E7%9B%AE%E7%AE%80%E4%BB%8B/9.Java%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF)
+
+## PassJava 部署教程
+
+### 1、Mac M1 部署项目
+
+[Mac M1 部署项目](http://www.passjava.cn/#/01.项目简介/7.本地部署项目Mac版):heavy_check_mark:
Windows 版正在更新中,可参考 Mac 版的部署教程。
前后端都在这个仓库:
+后台代码地址:https://github.com/Jackson0714/PassJava-Platform
+
+### 2、后端部署教程
-- 后台代码地址:https://github.com/Jackson0714/PassJava-Platform
+[后端部署教程](http://www.passjava.cn/#/01.PassJava/01.Introduction/7.%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E9%A1%B9%E7%9B%AEMac%E7%89%88):heavy_check_mark:
-:heavy_check_mark: [后端部署教程](http://www.passjava.cn/#/01.项目简介/7.本地部署项目Mac版)
+### 3、前端部署教程
-- 前端 Vue 代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal
+[前端部署教程](https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal):heavy_check_mark:
-:heavy_check_mark: [前端部署教程](https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal)
+前端 Vue 代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal
-- 小程序代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-miniApp
+### 小程序部署教程
-:heavy_check_mark: [小程序部署教程](https://github.com/Jackson0714/PassJava-Platform/blob/master/passjava-miniApp/README.md)
+[小程序部署教程](https://github.com/Jackson0714/PassJava-Platform/blob/master/passjava-miniApp/README.md):heavy_check_mark:
+
+小程序代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-miniApp
## 简介
@@ -36,7 +96,7 @@ Windows 版正在更新中,可参考 Mac 版的部署教程。
## 更好的阅读体验
- 文档地址:[http://www.passjava.cn](http://www.passjava.cn)
-- 备用地址1:[https://jackson0714.github.io/PassJava-Learning](https://jackson0714.github.io/PassJava-Learning/)
+- 备用地址1:[https://jackson0714.github.io/PassJava-Learning](https://jackson0714.github.io/PassJava-Learning/)
- 备用地址2:http://jayh2018.gitee.io/passjava-learning/#/README
## PassJava 教程连载目录
@@ -45,42 +105,364 @@ Windows 版正在更新中,可参考 Mac 版的部署教程。
- [打造一款 刷Java 知识的小程序](https://www.cnblogs.com/jackson0714/p/passJava1.html)
- [打造一款 刷Java 知识的小程序(二)](https://www.cnblogs.com/jackson0714/p/passJava2.html)
-- [01.五分钟搞懂分布式基础概念](http://www.passjava.cn/#/04.SpringCloud学习篇/01.分布式基础概念)
-- [02.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/05.安装部署篇/01.环境搭建篇)
-- [03.配置虚拟机网络](http://www.passjava.cn/#/05.安装部署篇/02.配置虚拟机网络)
-- [04.安装Docker](http://www.passjava.cn/#/05.安装部署篇/03.安装docker)
-- [05.Docker安装mysql](http://www.passjava.cn/#/05.安装部署篇/04.docker安装mysql)
-- [06.Docker安装redis](http://www.passjava.cn/#/05.安装部署篇/05.docker安装redis)
-- [07.本地开发环境配置](http://www.passjava.cn/#/05.安装部署篇/06.本地开发环境配置)
-- [08.配置Git](http://www.passjava.cn/#/05.安装部署篇/07.配置git)
-- [09.初始化项目和添加微服务](http://www.passjava.cn/#/02.PassJava架构篇/01.创建项目和添加模块)
+- [01.五分钟搞懂分布式基础概念](http://www.passjava.cn/#/03.Distributed/01.分布式基础概念)
+- [02.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)
+- [03.配置虚拟机网络](http://www.passjava.cn/#/01.PassJava/03.Deploy/02.配置虚拟机网络)
+- [04.安装Docker](http://www.passjava.cn/#/01.PassJava/03.Deploy/03.安装docker)
+- [05.Docker安装mysql](http://www.passjava.cn/#/01.PassJava/03.Deploy/04.docker安装mysql)
+- [06.Docker安装redis](http://www.passjava.cn/#/01.PassJava/03.Deploy/05.docker安装redis)
+- [07.本地开发环境配置](http://www.passjava.cn/#/01.PassJava/03.Deploy/06.本地开发环境配置)
+- [08.配置Git](http://www.passjava.cn/#/01.PassJava/03.Deploy/07.配置git)
+- [09.初始化项目和添加微服务](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/01.创建项目和添加模块)
- [10.PassJava-微服务划分图](http://www.passjava.cn/#/01.项目简介/3.微服务划分图)
-- [11.初始化数据库和表](http://www.passjava.cn/#/02.PassJava架构篇/02.创建数据库和表)
-- [12.搭建管理后台](http://www.passjava.cn/#/02.PassJava架构篇/03.搭建管理后台)
-- [13.自动生成前后端代码](http://www.passjava.cn/#/02.PassJava架构篇/04.自动生成前后端代码)
-- [14.整合MyBatis-Plus实现CRUD](http://www.passjava.cn/#/02.PassJava架构篇/05.整合MyBatis-Plus实现CRUD)
-- [15.生成所有微服务的CRUD代码](http://www.passjava.cn/#/02.PassJava架构篇/06.生成所有微服务的CRUD代码)
-- [16.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/02.PassJava架构篇/07.SpringCloudAlibaba组件简介)
-- [17.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/02.PassJava架构篇/08.SpringCloud整合Alibaba-Nacos组件)
-- [18.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/02.PassJava架构篇/09.SpringCloud整合OpenFeign组件)
-- [19.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/02.PassJava架构篇/10.SpringCloud整合Nacos配置中心)
-- [20.SpringCloud整合Gateway网关](http://www.passjava.cn/#/02.PassJava架构篇/11.SpringCloud整合Gateway网关)
-- [21.管理后台-题目类型功能](http://www.passjava.cn/#/06.PassJava业务篇/01.管理后台-题目类型功能)
-- [22.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/02.PassJava架构篇/12.SpringCloud整合OSS对象存储)
-- [23.整合统一异常处理](http://www.passjava.cn/#/02.PassJava架构篇/13.整合统一异常处理.md)
-- [24.Elasticsearch上篇(原理)](http://www.passjava.cn/#/02.PassJava架构篇/14.Elasticsearch原理.md)
-- [25.Elasticsearch中篇(实战)](http://www.passjava.cn/#/02.PassJava架构篇/15.Elasticsearch实战.md)
-- [26.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/02.PassJava架构篇/16.Elasticsearch集群部署.md)
-- [27.微服务架构中的链路追踪](http://www.passjava.cn/#/02.PassJava架构篇/17.微服务架构中的链路追踪.md)
-- [28.48张图手摸手教你性能压测](http://www.passjava.cn/#/02.PassJava架构篇/18.48张图手摸手教你性能压测.md)
-- [29.缓存实战(一)](http://www.passjava.cn/#/02.PassJava架构篇/19.缓存实战(一).md)
-- [30.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/02.PassJava架构篇/22.缓存实战(二)Redis分布式锁.md)
-- [31.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/02.PassJava架构篇/23.缓存实战(三)Redisson分布式锁.md)
-- [32.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/02.PassJava架构篇/24.缓存实战(四)SpringCache.md)
+- [11.初始化数据库和表](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/02.创建数据库和表)
+- [12.搭建管理后台](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/03.搭建管理后台)
+- [13.自动生成前后端代码](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/04.自动生成前后端代码)
+- [14.整合MyBatis-Plus实现CRUD](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/05.整合MyBatis-Plus实现CRUD)
+- [15.生成所有微服务的CRUD代码](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/06.生成所有微服务的CRUD代码)
+- [16.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/07.SpringCloudAlibaba组件简介)
+- [17.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/08.SpringCloud整合Alibaba-Nacos组件)
+- [18.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/09.SpringCloud整合OpenFeign组件)
+- [19.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/10.SpringCloud整合Nacos配置中心)
+- [20.SpringCloud整合Gateway网关](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/11.SpringCloud整合Gateway网关)
+- [21.管理后台-题目类型功能](http://www.passjava.cn/#/01.PassJava/04.PassJava_Business/01.管理后台-题目类型功能)
+- [22.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/12.SpringCloud整合OSS对象存储)
+- [23.整合统一异常处理](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/13.整合统一异常处理.md)
+- [24.Elasticsearch上篇(原理)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/14.Elasticsearch原理.md)
+- [25.Elasticsearch中篇(实战)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elasticsearch实战.md)
+- [26.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/16.Elasticsearch集群部署.md)
+- [27.微服务架构中的链路追踪](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/17.微服务架构中的链路追踪.md)
+- [28.48张图手摸手教你性能压测](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/18.48张图手摸手教你性能压测.md)
+- [29.缓存实战(一)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/19.缓存实战(一).md)
+- [30.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/22.缓存实战(二)Redis分布式锁.md)
+- [31.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/23.缓存实战(三)Redisson分布式锁.md)
+- [32.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/24.缓存实战(四)SpringCache.md)
## 小程序演示
-
+
+
+## 项目地址
+
+[PassJava](https://github.com/Jackson0714/PassJava-Platform)
+
+## 介绍
+
+- [PassJava 架构及功能概览](http://www.passjava.cn/#/01.项目简介/2.项目微服务架构图)
+- [PassJava 学习所需知识点](http://www.passjava.cn/#/01.项目简介/5.项目前置要求)
+
+## 架构篇
+
+> 手把手教你搭建一个PassJava 中使用的 SpringCloud框架
+
+- [01.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/07.SpringCloudAlibaba组件简介)
+- [02.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/08.SpringCloud整合Alibaba-Nacos组件)
+- [03.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/09.SpringCloud整合OpenFeign组件)
+- [04.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/10.SpringCloud整合Nacos配置中心)
+- [05.SpringCloud整合Gateway网关](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/11.SpringCloud整合Gateway网关)
+- [06.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/12.SpringCloud整合OSS对象存储)
+- [07.整合统一异常处理](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/13.整合统一异常处理)
+- [08.Elasticsearch上篇(原理)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/14.Elasticsearch原理)
+- [09.Elasticsearch中篇(实战)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elasticsearch实战.md)
+- [10.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/16.Elasticsearch集群部署.md)
+- [11.微服务架构中的链路追踪](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/17.微服务架构中的链路追踪.md)
+- [12.48张图手摸手教你性能压测](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/18.48张图手摸手教你性能压测.md)
+- [13.缓存实战(一)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/19.缓存实战(一).md)
+- [14.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/22.缓存实战(二)Redis分布式锁.md)
+- [15.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/23.缓存实战(三)Redisson分布式锁.md)
+- [16.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/24.缓存实战(四)SpringCache.md)
+
+
+## Java并发多线程
+
+> 从源码层面详细讲解并发多线程
+> 关注公众号:悟空聊架构,回复`多线程`获取离线版教程。
+
+- [01.反制面试官-14张原理图-再也不怕被问volatile!](http://www.passjava.cn/#/10.并发多线程/01.反制面试官-14张原理图-再也不怕被问volatile!.md)
+- [02.我跟老婆讲CAS原理,被鄙视太简单!15张图-源码调试](http://www.passjava.cn/#/10.并发多线程/02.我跟老婆讲CAS原理-被鄙视太简单-15张图-源码调试.md)
+- [03.Java并发必知必会第三弹:用积木讲解ABA原理](http://www.passjava.cn/#/10.并发多线程/03.Java并发必知必会第三弹:用积木讲解ABA原理.md)
+- [04.全网最细-21张图带你领略集合的线程不安全](http://www.passjava.cn/#/10.并发多线程/04.全网最细-21张图带你领略集合的线程不安全.md)
+- [05.5000字-24张图带你彻底理解Java中的21种锁](http://www.passjava.cn/#/10.并发多线程/05.5000字-24张图带你彻底理解Java中的21种锁.md)
+- [06.干货-45张图庖丁解牛18种Queue,你知道几种?](http://www.passjava.cn/#/10.并发多线程/06.干货-45张图庖丁解牛18种Queue,你知道几种.md)
+
+
+## 分布式
+
+关注公众号:悟空聊架构,回复`分布式`获取离线版教程。
+
+- [01.分布式基础概念](http://www.passjava.cn/#/03.Distributed/01.分布式基础概念.md)
+- [02.这三年被分布式坑惨了,曝光十大坑](http://www.passjava.cn/#/03.Distributed/02.分布式中的十种坑.md)
+- [03.用三国杀讲分布式算法,舒适了吧?](http://www.passjava.cn/#/03.Distributed/03.用三国杀讲分布式算法,舒适了吧?.md)
+- [04.用太极拳讲分布式理论,舒服!](http://www.passjava.cn/#/03.Distributed/04.用太极拳讲分布式理论,舒服!.md)
+- [05.诸葛VS庞统,拿下Paxos](http://www.passjava.cn/#/03.Distributed/05.诸葛VS庞统,拿下Paxos.md)
+- [06.用动图讲解分布式Raft](http://www.passjava.cn/#/03.Distributed/06.用动图讲解分布式Raft.md)
+- [07.韩信大招:一致性哈希](http://www.passjava.cn/#/03.Distributed/07.韩信大招:一致性哈希.md)
+- [08.Gossip协议](http://www.passjava.cn/#/03.Distributed/08.Gossip协议.md)
+- [09.QuorumNWR算法](http://www.passjava.cn/#/03.Distributed/09.QuorumNWR算法.md)
+- [10.区块链12问和Pow算法](http://www.passjava.cn/#/03.Distributed/10.区块链12问.md)
+- [11.Zookeeper中的ZAB协议](http://www.passjava.cn/#/03.Distributed/14.ZAB协议.md)
+
+## 架构设计
+
+- [01.微服务架构中的两款流量防卫兵](http://www.passjava.cn/#/04.Architecture/01.架构图解/01.微服务架构中的两款流量防卫兵.md)
+- [02.浅析扣减库存的方案设计](http://www.passjava.cn/#/04.Architecture/01.架构图解/02.浅析扣减库存的方案设计.md)
+- [03.订单系统中的补偿事务设计](http://www.passjava.cn/#/04.Architecture/01.架构图解/03.订单系统中的补偿事务设计.md)
+- [04.请警惕Elasticsearch的三大坑](http://www.passjava.cn/#/04.Architecture/01.架构图解/04.请警惕Elasticsearch的三大坑.md)
+- [05.B站崩了,聊聊高可用和异地多活](http://www.passjava.cn/#/04.Architecture/01.架构图解/05.B站崩了,聊聊高可用和异地多活.md)
+- [06.查漏补缺,DDD领域驱动设计2022-02-15](http://www.passjava.cn/#/15.DDD领域驱动设计/01.查漏补缺,DDD领域驱动设计.md)
+- [07.自研简易版任务调度框架2022-03-04](http://www.passjava.cn/#/04.Architecture/01.架构图解/06.自研简易版任务调度框架2022-03-04.md)
+- [96.闲鱼架构演进](http://www.passjava.cn/#/04.Architecture/01.架构图解/96.闲鱼架构演进.md)
+- [97.京东白条数据架构演进](http://www.passjava.cn/#/04.Architecture/01.架构图解/97.京东白条数据架构演进.md)
+- [98.春晚红包架构](http://www.passjava.cn/#/04.Architecture/01.架构图解/98.春晚红包架构.md)
+- [99.淘宝架构10年](http://www.passjava.cn/#/04.Architecture/01.架构图解/99.淘宝架构10年.md)
+
+
+## SpringCloud 架构剖析🔥🔥🔥
+
+- 注册中心Eureka
+ - [01.Eureka基本原理和简单使用](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/01.Eureka基本原理和简单使用.md)
+ - [02.Eureka本地集群搭建](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/02.Eureka本地集群搭建.md)
+ - [03.Eureka源码之启动过程](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/03.Eureka源码之启动过程.md)
+ - [04.Eureka源码之客户端注册](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/04.Eureka源码之客户端注册.md)
+ - [05.Eureka源码之服务端接收注册信息](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/05.Eureka源码之服务端接收注册信息.md)
+ - [06.Eureka源码之客户端首次获取注册表](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/06.Eureka源码之客户端首次获取注册表.md)
+ - [07.Eureka源码之客户端增量获取注册表](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/07.Eureka源码之客户端增量获取注册表.md)
+ - [08.Eureka源码之Server端的多级缓存机制](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/08.Eureka源码之Server端的多级缓存机制.md)
+ - [98.Eureka控制台参数说明](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/98.Eureka控制台参数说明.md)
+- 负载均衡Ribbon
+ - [01.Ribbon架构剖析](http://www.passjava.cn/#/02.SpringCloud/02.Ribbon负载均衡/01.Ribbon架构剖析.md)
+- 远程调用Feign
+ - [01.Feign远程调用基本原理和使用](http://www.passjava.cn/#/02.SpringCloud/03.Feign远程调用/01.Feign远程调用基本原理和使用.md)
+ - [02.Feign架构剖析](http://www.passjava.cn/#/02.SpringCloud/03.Feign远程调用/02.Feign架构剖析.md)
+- 熔断限流Hystrix
+ - [01.Hystrix架构剖析](http://www.passjava.cn/#/02.SpringCloud/04.Hystrix限流熔断器/01.Hystrix架构剖析.md)
+- Gateway网关
+ - [01.SpringCloud整合Gateway网关](02.SpringCloud/06.Gateway网关/01.SpringCloud整合Gateway网关.md)
+ - [02.深入浅入Gateway](http://www.passjava.cn/#/02.SpringCloud/06.Gateway网关/02.深入浅入Gateway.md)
+- Nacos配置注册中心
+ - [01.使用Nacos作为注册中心](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/01.使用Nacos作为注册中心和配置中心.md)
+ - [02.Nacos架构原理①:一条注册请求会经历什么?](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/02.Nacos架构原理①:一条注册请求会经历什么?.md)
+ - [03.Nacos架构原理②:揭秘AP架构——Distro一致性协议](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/03.Nacos架构原理②:揭秘AP架构——Distro一致性协议.md)
+- Sentinel限流
+ - [01.Hystrix和Sentinel选型对比](http://www.passjava.cn/#/02.SpringCloud/08.Sentinel限流/01.Hystrix和Sentinel选型对比.md)
+
+## 用故事讲解技术
+
+* 中间件选型
+ - [01.如果把4个「消息队列」都在一个群里,他们会聊什么?](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/01.中间件选型/01.如果消息队列都在一个群里,他们会聊什么?.md)
+ - [02.如果把4个「链路追踪」组件放到一个群里,他们会聊些什么?](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/01.中间件选型/02.链路追踪如何选型)
+* 高可用
+ * [01.东汉末年,他们把熔断限流玩到了极致](http://www.passjava.cn/#04.Architecture/03.用故事讲解技术/02.高可用/01.东汉末年,他们把熔断限流玩到了极致.md)
+ * [02.我是一个秒杀请求,正在逃离这颗星球](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/02.高可用/02.我是一个秒杀请求,正在逃离这颗星球.md)
+ * [03.为什么要除夕,原来是内存爆了](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/02.高可用/03.为什么要除夕,原来是内存爆了.md)
+
+
+## 面试必背
+- [01.Redis 面试题汇总 第一季](http://www.passjava.cn/#/88.Interview/01.Redis/Redis1.md)
+- [02.并发编程 面试突击](http://www.passjava.cn/#/88.Interview/02.Thread/Thread1.md)
+- [03.MySQL 面试突击](http://www.passjava.cn/#/88.Interview/03.Database/MySQL1.md)
+- [04.JVM 面试突击](http://www.passjava.cn/#/88.Interview/04.JVM/JVM1.md)
+- 05.设计模式
+ - [01.观察者模式ObserverPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/01.观察者模式ObserverPattern.md)
+ - [02.备忘录模式MementoPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/02.备忘录模式MementoPattern.md)
+ - [03.原型模式PrototypePattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/03.原型模式PrototypePattern.md)
+ -[04.中介者模式MediatorPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/04.中介者模式MediatorPattern.md)
+
+
+## 悟空学习群问题汇总
+- [01.悟空群聊问题20201026-删除binlog问题](http://www.passjava.cn/#/102.学习群问题汇总/01.20201026_删除binlog问题.md)
+- [02.悟空群聊问题20201028_导出报表问题](http://www.passjava.cn/#/102.学习群问题汇总/02.20201028_导出报表问题.md)
+- [03.悟空群聊问题20201030_List和ArrayList如何选择](http://www.passjava.cn/#/102.学习群问题汇总/03.20201030_List和ArrayList如何选择.md)
+## 群成员学习分享
+- [01.Nginx Location 正则](http://www.passjava.cn/#/104.群成员学习分享/01.NginxLocation正则.md)
+
+## JVM
+- [01.50+道JVM面试题+11张思维导图就是让你懂JVM](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/01.50+道JVM面试题+11张思维导图就是让你懂JVM.md)
+- [02.秒懂JVM的三大参数类型,就靠这十个小实验了](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/02.秒懂JVM的三大参数类型,就靠这十个小实验了.md)
+- [98.字节码指令表](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/98.字节码指令表.md)
+- [99.JVM参数列表](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/99.JVM参数列表.md)
+
+## 工具篇
+
+> 一些常用开发工具的使用
+
+- [01.自定义Markdown神器Typora的主题样式](https://juejin.im/post/6864745378558771214)
+- [02.使用docsify写开源文档](http://www.passjava.cn/#/99.tools/02.使用docsify写开源文档)
+- [03.Git同时上传到码云和github](https://juejin.im/post/6859388700858679303)
+- [04.图床神器配置](http://www.passjava.cn/#/99.tools/04.图床神器配置)
+- [05.我的常用工具](http://www.passjava.cn/#/99.tools/05.我的常用工具)
+- [06.Idea的十八般武艺](http://www.passjava.cn/#/99.tools/06.Idea的十八般武艺)
+- [07.画架构原理图,还是它好使](http://www.passjava.cn/#/99.tools/07.画架构原理图,还是它好使)
+- [08.添加Gitee密钥](http://www.passjava.cn/#/99.tools/08.添加Gitee密钥)
+- [09.给自己的博客docsify加上评论功能](http://www.passjava.cn/#/99.tools/09.给自己的博客docsify加上评论功能)
+- [91.Maven配置](http://www.passjava.cn/#/99.tools/91.Maven配置)
+- [92.Java环境问题](http://www.passjava.cn/#/99.tools/92.Java环境问题)
+- [93.IDEA快捷键](http://www.passjava.cn/#/99.tools/93.IDEA快捷键)
+- [94.Ubuntu16.04安装最新版nodejs](http://www.passjava.cn/#/99.tools/94.Ubuntu16_04安装最新版nodejs)
+- [95.VSCode快速生成Vue模板](http://www.passjava.cn/#/99.tools/95.VSCode快速生成Vue模板)
+- [96.HTML特殊符号](http://www.passjava.cn/#/99.tools/96.HTML特殊符号)
+- [97.IDEA设置代码彩虹颜色](http://www.passjava.cn/#/99.tools/97.IDEA设置代码彩虹颜色)
+- [98.IDEA调试Java多线程](http://www.passjava.cn/#/99.tools/98.IDEA调试Java多线程)
+- [99.IDEA调试Java源码](http://www.passjava.cn/#/99.tools/99.IDEA调试Java源码)
+
+## 业务篇
+
+> 全面解析 PassJava 中使用的数据库表结构和功能
+
+## SpringBoot 学习篇
+
+> PassJava 中一些功能的技术要点解析
+
+- [05.SpringBoot整合Jdbc](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-05-data-jdbc.md)
+- [06.SpringBoot整合Druid](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-06-data-druid.md)
+- [07.spring-boot-05-data-jdbc](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-07-data-mybatis.md)
+- [08.SpringBoot Mybatis逻辑删除](http://www.passjava.cn/#/03.SpringBoot学习篇/08.SpringBoot-Mybatis逻辑删除.md)
+- [09.Object划分](http://www.passjava.cn/#/03.SpringBoot学习篇/09.Object划分.md)
+
+## 部署篇
+
+> PassJava 开发及生产环境的搭建
+
+- [01.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)
+- [02.配置虚拟机网络](http://www.passjava.cn/#/01.PassJava/03.Deploy/02.配置虚拟机网络)
+- [03.安装Docker](http://www.passjava.cn/#/01.PassJava/03.Deploy/03.安装docker)
+- [04.Docker安装mysql](http://www.passjava.cn/#/01.PassJava/03.Deploy/04.docker安装mysql)
+- [05.Docker安装redis](http://www.passjava.cn/#/01.PassJava/03.Deploy/05.docker安装redis)
+- [06.本地开发环境配置](http://www.passjava.cn/#/01.PassJava/03.Deploy/06.本地开发环境配置)
+- [07.配置Git](http://www.passjava.cn/#/01.PassJava/03.Deploy/07.配置git)
+
+## LeetCode刷题
+- [LeetCode数组第一题](http://www.passjava.cn/#/92.LeetCode算法题/01.数组/001.两数之和-数组-LeetCode第1题)
+
+
+## 公众号
+
+PassJava 项目全套学习教程连载中,关注公众号「**PassJava666**」第一时间获取。
+
+PassJava 项目全套学习教程连载中,[关注公众号](#公众号)第一时间获取。
+
+可落地的 Spring Cloud项目:`PassJava` https://github.com/Jackson0714/PassJava-Platform
+
+# PassJava 学习教程
+
+## 关于我
+
+🌈InfoQ 签约作者、蓝桥签约作者、阿里云社区博客专家、51CTO Top红人。
+
+🍭公众号:悟空聊架构,20000+ 技术爱好者关注。
+
+💪🏻擅长微服务、分布式、架构设计。
+
+🍎目前在一家上市公司从事基础架构建设工作。
+
+[我的 B站](https://space.bilibili.com/493005591?spm_id_from=333.999.0.0)
+
+
+### 技术支持
+
+💪🏻💪🏻💪🏻欢迎加入我的知识星球(下方扫码加入),提供`技术1v1解答`、简历修改、500人技术交流群。当然你也可以加我微信好友:passjava。
+
+
+
+**悟空的多个技术专题**:
+
+33 篇 SpringCloud 实战,回复PDF获取。
+
+8 篇分布式算法文章,回复分布式获取。
+
+7 篇JVM 专项训练,回复JVM获取。
+
+Elasticsearch 筋斗云版蓝皮书1.0,回复ES获取
+
+面试必备资料,关注公众号`悟空聊架构`即可获取。
+
+
+## Java 学习路线(赛亚人版)
+
+[🌈Java 学习路线(赛亚人版)](http://passjava.cn/#/01.%E9%A1%B9%E7%9B%AE%E7%AE%80%E4%BB%8B/9.Java%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF)
+
+## PassJava 部署教程
+
+### 1、Mac M1 部署项目
+
+[Mac M1 部署项目](http://www.passjava.cn/#/01.项目简介/7.本地部署项目Mac版):heavy_check_mark:
+
+Windows 版正在更新中,可参考 Mac 版的部署教程。
+
+
+前后端都在这个仓库:
+
+后台代码地址:https://github.com/Jackson0714/PassJava-Platform
+
+### 2、后端部署教程
+
+[后端部署教程](http://www.passjava.cn/#/01.PassJava/01.Introduction/7.%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E9%A1%B9%E7%9B%AEMac%E7%89%88):heavy_check_mark:
+
+### 3、前端部署教程
+
+[前端部署教程](https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal):heavy_check_mark:
+
+前端 Vue 代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal
+
+### 小程序部署教程
+
+[小程序部署教程](https://github.com/Jackson0714/PassJava-Platform/blob/master/passjava-miniApp/README.md):heavy_check_mark:
+
+小程序代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-miniApp
+
+## 简介
+
+- PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。
+- PassJava 是一款Java`面试刷题`的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础。
+- PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目
+- 采用流行的技术,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,采用Docker容器化部署。
+
+## 更好的阅读体验
+
+- 文档地址:[http://www.passjava.cn](http://www.passjava.cn)
+- 备用地址1:[https://jackson0714.github.io/PassJava-Learning](https://jackson0714.github.io/PassJava-Learning/)
+- 备用地址2:http://jayh2018.gitee.io/passjava-learning/#/README
+
+## PassJava 教程连载目录
+
+关注公众号:悟空聊架构,回复 PDF 获取离线版教程。
+
+- [打造一款 刷Java 知识的小程序](https://www.cnblogs.com/jackson0714/p/passJava1.html)
+- [打造一款 刷Java 知识的小程序(二)](https://www.cnblogs.com/jackson0714/p/passJava2.html)
+- [01.五分钟搞懂分布式基础概念](http://www.passjava.cn/#/03.Distributed/01.分布式基础概念)
+- [02.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)
+- [03.配置虚拟机网络](http://www.passjava.cn/#/01.PassJava/03.Deploy/02.配置虚拟机网络)
+- [04.安装Docker](http://www.passjava.cn/#/01.PassJava/03.Deploy/03.安装docker)
+- [05.Docker安装mysql](http://www.passjava.cn/#/01.PassJava/03.Deploy/04.docker安装mysql)
+- [06.Docker安装redis](http://www.passjava.cn/#/01.PassJava/03.Deploy/05.docker安装redis)
+- [07.本地开发环境配置](http://www.passjava.cn/#/01.PassJava/03.Deploy/06.本地开发环境配置)
+- [08.配置Git](http://www.passjava.cn/#/01.PassJava/03.Deploy/07.配置git)
+- [09.初始化项目和添加微服务](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/01.创建项目和添加模块)
+- [10.PassJava-微服务划分图](http://www.passjava.cn/#/01.项目简介/3.微服务划分图)
+- [11.初始化数据库和表](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/02.创建数据库和表)
+- [12.搭建管理后台](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/03.搭建管理后台)
+- [13.自动生成前后端代码](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/04.自动生成前后端代码)
+- [14.整合MyBatis-Plus实现CRUD](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/05.整合MyBatis-Plus实现CRUD)
+- [15.生成所有微服务的CRUD代码](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/06.生成所有微服务的CRUD代码)
+- [16.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/07.SpringCloudAlibaba组件简介)
+- [17.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/08.SpringCloud整合Alibaba-Nacos组件)
+- [18.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/09.SpringCloud整合OpenFeign组件)
+- [19.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/10.SpringCloud整合Nacos配置中心)
+- [20.SpringCloud整合Gateway网关](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/11.SpringCloud整合Gateway网关)
+- [21.管理后台-题目类型功能](http://www.passjava.cn/#/01.PassJava/04.PassJava_Business/01.管理后台-题目类型功能)
+- [22.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/12.SpringCloud整合OSS对象存储)
+- [23.整合统一异常处理](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/13.整合统一异常处理.md)
+- [24.Elasticsearch上篇(原理)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/14.Elasticsearch原理.md)
+- [25.Elasticsearch中篇(实战)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elasticsearch实战.md)
+- [26.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/16.Elasticsearch集群部署.md)
+- [27.微服务架构中的链路追踪](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/17.微服务架构中的链路追踪.md)
+- [28.48张图手摸手教你性能压测](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/18.48张图手摸手教你性能压测.md)
+- [29.缓存实战(一)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/19.缓存实战(一).md)
+- [30.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/22.缓存实战(二)Redis分布式锁.md)
+- [31.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/23.缓存实战(三)Redisson分布式锁.md)
+- [32.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/24.缓存实战(四)SpringCache.md)
+
+## 小程序演示

@@ -97,68 +479,118 @@ Windows 版正在更新中,可参考 Mac 版的部署教程。
> 手把手教你搭建一个PassJava 中使用的 SpringCloud框架
-- [01.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/02.PassJava架构篇/07.SpringCloudAlibaba组件简介)
-- [02.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/02.PassJava架构篇/08.SpringCloud整合Alibaba-Nacos组件)
-- [03.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/02.PassJava架构篇/09.SpringCloud整合OpenFeign组件)
-- [04.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/02.PassJava架构篇/10.SpringCloud整合Nacos配置中心)
-- [05.SpringCloud整合Gateway网关](http://www.passjava.cn/#/02.PassJava架构篇/11.SpringCloud整合Gateway网关)
-- [06.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/02.PassJava架构篇/12.SpringCloud整合OSS对象存储)
-- [07.整合统一异常处理](http://www.passjava.cn/#/02.PassJava架构篇/13.整合统一异常处理)
-- [08.Elasticsearch上篇(原理)](http://www.passjava.cn/#/02.PassJava架构篇/14.Elasticsearch原理)
-- [09.Elasticsearch中篇(实战)](http://www.passjava.cn/#/02.PassJava架构篇/15.Elasticsearch实战.md)
-- [10.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/02.PassJava架构篇/16.Elasticsearch集群部署.md)
-- [11.微服务架构中的链路追踪](http://www.passjava.cn/#/02.PassJava架构篇/17.微服务架构中的链路追踪.md)
-- [12.48张图手摸手教你性能压测](http://www.passjava.cn/#/02.PassJava架构篇/18.48张图手摸手教你性能压测.md)
-- [13.缓存实战(一)](http://www.passjava.cn/#/02.PassJava架构篇/19.缓存实战(一).md)
-- [14.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/02.PassJava架构篇/22.缓存实战(二)Redis分布式锁.md)
-- [15.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/02.PassJava架构篇/23.缓存实战(三)Redisson分布式锁.md)
-- [16.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/02.PassJava架构篇/24.缓存实战(四)SpringCache.md)
+- [01.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/07.SpringCloudAlibaba组件简介)
+- [02.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/08.SpringCloud整合Alibaba-Nacos组件)
+- [03.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/09.SpringCloud整合OpenFeign组件)
+- [04.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/10.SpringCloud整合Nacos配置中心)
+- [05.SpringCloud整合Gateway网关](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/11.SpringCloud整合Gateway网关)
+- [06.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/12.SpringCloud整合OSS对象存储)
+- [07.整合统一异常处理](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/13.整合统一异常处理)
+- [08.Elasticsearch上篇(原理)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/14.Elasticsearch原理)
+- [09.Elasticsearch中篇(实战)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elasticsearch实战.md)
+- [10.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/16.Elasticsearch集群部署.md)
+- [11.微服务架构中的链路追踪](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/17.微服务架构中的链路追踪.md)
+- [12.48张图手摸手教你性能压测](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/18.48张图手摸手教你性能压测.md)
+- [13.缓存实战(一)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/19.缓存实战(一).md)
+- [14.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/22.缓存实战(二)Redis分布式锁.md)
+- [15.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/23.缓存实战(三)Redisson分布式锁.md)
+- [16.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/24.缓存实战(四)SpringCache.md)
+
## Java并发多线程
> 从源码层面详细讲解并发多线程
+> 关注公众号:悟空聊架构,回复`多线程`获取离线版教程。
+
+- [01.反制面试官-14张原理图-再也不怕被问volatile!](http://www.passjava.cn/#/10.并发多线程/01.反制面试官-14张原理图-再也不怕被问volatile!.md)
+- [02.我跟老婆讲CAS原理,被鄙视太简单!15张图-源码调试](http://www.passjava.cn/#/10.并发多线程/02.我跟老婆讲CAS原理-被鄙视太简单-15张图-源码调试.md)
+- [03.Java并发必知必会第三弹:用积木讲解ABA原理](http://www.passjava.cn/#/10.并发多线程/03.Java并发必知必会第三弹:用积木讲解ABA原理.md)
+- [04.全网最细-21张图带你领略集合的线程不安全](http://www.passjava.cn/#/10.并发多线程/04.全网最细-21张图带你领略集合的线程不安全.md)
+- [05.5000字-24张图带你彻底理解Java中的21种锁](http://www.passjava.cn/#/10.并发多线程/05.5000字-24张图带你彻底理解Java中的21种锁.md)
+- [06.干货-45张图庖丁解牛18种Queue,你知道几种?](http://www.passjava.cn/#/10.并发多线程/06.干货-45张图庖丁解牛18种Queue,你知道几种.md)
-- [01.反制面试官-14张原理图-再也不怕被问volatile!](https://juejin.im/post/6861885337568804871)
-- [02.我跟老婆讲CAS原理,被鄙视太简单!15张图 -源码调试 .md](https://juejin.im/post/6863799243182702599)
-- [03.Java并发必知必会第三弹:用积木讲解ABA原理.md](https://juejin.im/post/6864945088721027079)
-- [04.全网最细-21张图带你领略集合的线程不安全](https://juejin.im/post/6866444584688451591)
-- [05.5000字 | 24张图带你彻底理解Java中的21种锁](https://juejin.im/post/6867922895536914446)
-- [06.干货 | 45张图庖丁解牛18种Queue,你知道几种?](https://juejin.im/post/6870298844425371655)
## 分布式
关注公众号:悟空聊架构,回复`分布式`获取离线版教程。
-- [01.分布式基础概念](http://www.passjava.cn/#/92.分布式/01.分布式基础概念.md)
-- [02.这三年被分布式坑惨了,曝光十大坑](http://www.passjava.cn/#/92.分布式/02.分布式中的十种坑.md)
-- [03.用三国杀讲分布式算法,舒适了吧?](http://www.passjava.cn/#/92.分布式/03.用三国杀讲分布式算法,舒适了吧?.md)
-- [04.用太极拳讲分布式理论,舒服!](http://www.passjava.cn/#/92.分布式/04.用太极拳讲分布式理论,舒服!.md)
-- [05.诸葛VS庞统,拿下Paxos](http://www.passjava.cn/#/92.分布式/05.诸葛VS庞统,拿下Paxos.md)
-- [06.用动图讲解分布式Raft](http://www.passjava.cn/#/92.分布式/06.用动图讲解分布式Raft.md)
-- [07.韩信大招:一致性哈希](http://www.passjava.cn/#/92.分布式/07.韩信大招:一致性哈希.md)
-- [08.Gossip协议](http://www.passjava.cn/#/92.分布式/08.Gossip协议.md)
-- [09.QuorumNWR算法](http://www.passjava.cn/#/92.分布式/09.QuorumNWR算法.md)
-- [10.区块链12问和Pow算法](http://www.passjava.cn/#/92.分布式/10.区块链12问.md)
+- [01.分布式基础概念](http://www.passjava.cn/#/03.Distributed/01.分布式基础概念.md)
+- [02.这三年被分布式坑惨了,曝光十大坑](http://www.passjava.cn/#/03.Distributed/02.分布式中的十种坑.md)
+- [03.用三国杀讲分布式算法,舒适了吧?](http://www.passjava.cn/#/03.Distributed/03.用三国杀讲分布式算法,舒适了吧?.md)
+- [04.用太极拳讲分布式理论,舒服!](http://www.passjava.cn/#/03.Distributed/04.用太极拳讲分布式理论,舒服!.md)
+- [05.诸葛VS庞统,拿下Paxos](http://www.passjava.cn/#/03.Distributed/05.诸葛VS庞统,拿下Paxos.md)
+- [06.用动图讲解分布式Raft](http://www.passjava.cn/#/03.Distributed/06.用动图讲解分布式Raft.md)
+- [07.韩信大招:一致性哈希](http://www.passjava.cn/#/03.Distributed/07.韩信大招:一致性哈希.md)
+- [08.Gossip协议](http://www.passjava.cn/#/03.Distributed/08.Gossip协议.md)
+- [09.QuorumNWR算法](http://www.passjava.cn/#/03.Distributed/09.QuorumNWR算法.md)
+- [10.区块链12问和Pow算法](http://www.passjava.cn/#/03.Distributed/10.区块链12问.md)
+- [11.Zookeeper中的ZAB协议](http://www.passjava.cn/#/03.Distributed/14.ZAB协议.md)
## 架构设计
-- [01.微服务架构中的两款流量防卫兵](http://www.passjava.cn/#/89.架构图解/01.微服务架构中的两款流量防卫兵.md)
-- [02.浅析扣减库存的方案设计](http://www.passjava.cn/#/89.架构图解/02.浅析扣减库存的方案设计.md)
-- [03.订单系统中的补偿事务设计](http://www.passjava.cn/#/89.架构图解/03.订单系统中的补偿事务设计.md)
-- [04.请警惕Elasticsearch的三大坑](http://www.passjava.cn/#/89.架构图解/04.请警惕Elasticsearch的三大坑.md)
-- [05.B站崩了,聊聊高可用和异地多活](http://www.passjava.cn/#/89.架构图解/05.B站崩了,聊聊高可用和异地多活.md)
+- [01.微服务架构中的两款流量防卫兵](http://www.passjava.cn/#/04.Architecture/01.架构图解/01.微服务架构中的两款流量防卫兵.md)
+- [02.浅析扣减库存的方案设计](http://www.passjava.cn/#/04.Architecture/01.架构图解/02.浅析扣减库存的方案设计.md)
+- [03.订单系统中的补偿事务设计](http://www.passjava.cn/#/04.Architecture/01.架构图解/03.订单系统中的补偿事务设计.md)
+- [04.请警惕Elasticsearch的三大坑](http://www.passjava.cn/#/04.Architecture/01.架构图解/04.请警惕Elasticsearch的三大坑.md)
+- [05.B站崩了,聊聊高可用和异地多活](http://www.passjava.cn/#/04.Architecture/01.架构图解/05.B站崩了,聊聊高可用和异地多活.md)
+- [06.查漏补缺,DDD领域驱动设计2022-02-15](http://www.passjava.cn/#/15.DDD领域驱动设计/01.查漏补缺,DDD领域驱动设计.md)
+- [07.自研简易版任务调度框架2022-03-04](http://www.passjava.cn/#/04.Architecture/01.架构图解/06.自研简易版任务调度框架2022-03-04.md)
+- [96.闲鱼架构演进](http://www.passjava.cn/#/04.Architecture/01.架构图解/96.闲鱼架构演进.md)
+- [97.京东白条数据架构演进](http://www.passjava.cn/#/04.Architecture/01.架构图解/97.京东白条数据架构演进.md)
+- [98.春晚红包架构](http://www.passjava.cn/#/04.Architecture/01.架构图解/98.春晚红包架构.md)
+- [99.淘宝架构10年](http://www.passjava.cn/#/04.Architecture/01.架构图解/99.淘宝架构10年.md)
+
+
+## SpringCloud 架构剖析🔥🔥🔥
+
+- 注册中心Eureka
+ - [01.Eureka基本原理和简单使用](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/01.Eureka基本原理和简单使用.md)
+ - [02.Eureka本地集群搭建](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/02.Eureka本地集群搭建.md)
+ - [03.Eureka源码之启动过程](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/03.Eureka源码之启动过程.md)
+ - [04.Eureka源码之客户端注册](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/04.Eureka源码之客户端注册.md)
+ - [05.Eureka源码之服务端接收注册信息](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/05.Eureka源码之服务端接收注册信息.md)
+ - [06.Eureka源码之客户端首次获取注册表](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/06.Eureka源码之客户端首次获取注册表.md)
+ - [07.Eureka源码之客户端增量获取注册表](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/07.Eureka源码之客户端增量获取注册表.md)
+ - [08.Eureka源码之Server端的多级缓存机制](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/08.Eureka源码之Server端的多级缓存机制.md)
+ - [98.Eureka控制台参数说明](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/98.Eureka控制台参数说明.md)
+- 负载均衡Ribbon
+ - [01.Ribbon架构剖析](http://www.passjava.cn/#/02.SpringCloud/02.Ribbon负载均衡/01.Ribbon架构剖析.md)
+- 远程调用Feign
+ - [01.Feign远程调用基本原理和使用](http://www.passjava.cn/#/02.SpringCloud/03.Feign远程调用/01.Feign远程调用基本原理和使用.md)
+ - [02.Feign架构剖析](http://www.passjava.cn/#/02.SpringCloud/03.Feign远程调用/02.Feign架构剖析.md)
+- 熔断限流Hystrix
+ - [01.Hystrix架构剖析](http://www.passjava.cn/#/02.SpringCloud/04.Hystrix限流熔断器/01.Hystrix架构剖析.md)
+- Gateway网关
+ - [01.SpringCloud整合Gateway网关](02.SpringCloud/06.Gateway网关/01.SpringCloud整合Gateway网关.md)
+ - [02.深入浅入Gateway](http://www.passjava.cn/#/02.SpringCloud/06.Gateway网关/02.深入浅入Gateway.md)
+- Nacos配置注册中心
+ - [01.使用Nacos作为注册中心](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/01.使用Nacos作为注册中心和配置中心.md)
+ - [02.Nacos架构原理①:一条注册请求会经历什么?](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/02.Nacos架构原理①:一条注册请求会经历什么?.md)
+ - [03.Nacos架构原理②:揭秘AP架构——Distro一致性协议](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/03.Nacos架构原理②:揭秘AP架构——Distro一致性协议.md)
+- Sentinel限流
+ - [01.Hystrix和Sentinel选型对比](http://www.passjava.cn/#/02.SpringCloud/08.Sentinel限流/01.Hystrix和Sentinel选型对比.md)
## 用故事讲解技术
-- [01.如果消息队列都在一个群里,他们会聊什么?](http://www.passjava.cn/#/90.悟空群聊/1.如果消息队列都在一个群里,他们会聊什么?.md)
-- [02.我是一个秒杀请求,正在逃离这颗星球](http://www.passjava.cn/#/91.悟空讲故事/01.我是一个秒杀请求,正在逃离这颗星球.md)
-- [03.东汉末年,他们把熔断限流玩到了极致](http://www.passjava.cn/#/91.悟空讲故事/02.东汉末年,他们把熔断限流玩到了极致.md)
-- [04.为什么要除夕,原来是内存爆了](http://www.passjava.cn/#/91.悟空讲故事/04.为什么要除夕,原来是内存爆了.md)
-- [05.订单系统中的补偿事务设计](http://www.passjava.cn/#/91.悟空讲故事/05.订单系统中的补偿事务设计.md)
+* 中间件选型
+ - [01.如果把4个「消息队列」都在一个群里,他们会聊什么?](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/01.中间件选型/01.如果消息队列都在一个群里,他们会聊什么?.md)
+ - [02.如果把4个「链路追踪」组件放到一个群里,他们会聊些什么?](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/01.中间件选型/02.链路追踪如何选型)
+* 高可用
+ * [01.东汉末年,他们把熔断限流玩到了极致](http://www.passjava.cn/#04.Architecture/03.用故事讲解技术/02.高可用/01.东汉末年,他们把熔断限流玩到了极致.md)
+ * [02.我是一个秒杀请求,正在逃离这颗星球](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/02.高可用/02.我是一个秒杀请求,正在逃离这颗星球.md)
+ * [03.为什么要除夕,原来是内存爆了](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/02.高可用/03.为什么要除夕,原来是内存爆了.md)
## 面试必背
- [01.Redis 面试题汇总 第一季](http://www.passjava.cn/#/88.Interview/01.Redis/Redis1.md)
+- [02.并发编程 面试突击](http://www.passjava.cn/#/88.Interview/02.Thread/Thread1.md)
+- [03.MySQL 面试突击](http://www.passjava.cn/#/88.Interview/03.Database/MySQL1.md)
+- [04.JVM 面试突击](http://www.passjava.cn/#/88.Interview/04.JVM/JVM1.md)
+- 05.设计模式
+ - [01.观察者模式ObserverPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/01.观察者模式ObserverPattern.md)
+ - [02.备忘录模式MementoPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/02.备忘录模式MementoPattern.md)
+ - [03.原型模式PrototypePattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/03.原型模式PrototypePattern.md)
+ -[04.中介者模式MediatorPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/04.中介者模式MediatorPattern.md)
## 悟空学习群问题汇总
@@ -169,10 +601,10 @@ Windows 版正在更新中,可参考 Mac 版的部署教程。
- [01.Nginx Location 正则](http://www.passjava.cn/#/104.群成员学习分享/01.NginxLocation正则.md)
## JVM
-- [01.50+道JVM面试题+11张思维导图就是让你懂JVM](http://www.passjava.cn/#/09.JVM进阶/01.50+道JVM面试题+11张思维导图就是让你懂JVM.md)
-- [02.秒懂JVM的三大参数类型,就靠这十个小实验了](http://www.passjava.cn/#/09.JVM进阶/02.秒懂JVM的三大参数类型,就靠这十个小实验了.md)
-- [98.字节码指令表](http://www.passjava.cn/#/09.JVM进阶/98.字节码指令表.md)
-- [99.JVM参数列表](http://www.passjava.cn/#/09.JVM进阶/99.JVM参数列表.md)
+- [01.50+道JVM面试题+11张思维导图就是让你懂JVM](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/01.50+道JVM面试题+11张思维导图就是让你懂JVM.md)
+- [02.秒懂JVM的三大参数类型,就靠这十个小实验了](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/02.秒懂JVM的三大参数类型,就靠这十个小实验了.md)
+- [98.字节码指令表](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/98.字节码指令表.md)
+- [99.JVM参数列表](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/99.JVM参数列表.md)
## 工具篇
@@ -187,6 +619,7 @@ Windows 版正在更新中,可参考 Mac 版的部署教程。
- [07.画架构原理图,还是它好使](http://www.passjava.cn/#/99.tools/07.画架构原理图,还是它好使)
- [08.添加Gitee密钥](http://www.passjava.cn/#/99.tools/08.添加Gitee密钥)
- [09.给自己的博客docsify加上评论功能](http://www.passjava.cn/#/99.tools/09.给自己的博客docsify加上评论功能)
+- [91.Maven配置](http://www.passjava.cn/#/99.tools/91.Maven配置)
- [92.Java环境问题](http://www.passjava.cn/#/99.tools/92.Java环境问题)
- [93.IDEA快捷键](http://www.passjava.cn/#/99.tools/93.IDEA快捷键)
- [94.Ubuntu16.04安装最新版nodejs](http://www.passjava.cn/#/99.tools/94.Ubuntu16_04安装最新版nodejs)
@@ -214,13 +647,13 @@ Windows 版正在更新中,可参考 Mac 版的部署教程。
> PassJava 开发及生产环境的搭建
-- [01.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/05.安装部署篇/01.环境搭建篇)
-- [02.配置虚拟机网络](http://www.passjava.cn/#/05.安装部署篇/02.配置虚拟机网络)
-- [03.安装Docker](http://www.passjava.cn/#/05.安装部署篇/03.安装docker)
-- [04.Docker安装mysql](http://www.passjava.cn/#/05.安装部署篇/04.docker安装mysql)
-- [05.Docker安装redis](http://www.passjava.cn/#/05.安装部署篇/05.docker安装redis)
-- [06.本地开发环境配置](http://www.passjava.cn/#/05.安装部署篇/06.本地开发环境配置)
-- [07.配置Git](http://www.passjava.cn/#/05.安装部署篇/07.配置git)
+- [01.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)
+- [02.配置虚拟机网络](http://www.passjava.cn/#/01.PassJava/03.Deploy/02.配置虚拟机网络)
+- [03.安装Docker](http://www.passjava.cn/#/01.PassJava/03.Deploy/03.安装docker)
+- [04.Docker安装mysql](http://www.passjava.cn/#/01.PassJava/03.Deploy/04.docker安装mysql)
+- [05.Docker安装redis](http://www.passjava.cn/#/01.PassJava/03.Deploy/05.docker安装redis)
+- [06.本地开发环境配置](http://www.passjava.cn/#/01.PassJava/03.Deploy/06.本地开发环境配置)
+- [07.配置Git](http://www.passjava.cn/#/01.PassJava/03.Deploy/07.配置git)
## LeetCode刷题
- [LeetCode数组第一题](http://www.passjava.cn/#/92.LeetCode算法题/01.数组/001.两数之和-数组-LeetCode第1题)
diff --git "a/data/sql/01.\345\210\235\345\247\213\345\214\226\344\270\232\345\212\241\346\225\260\346\215\256\345\272\223.sql" "b/data/sql/01.\345\210\235\345\247\213\345\214\226\344\270\232\345\212\241\346\225\260\346\215\256\345\272\223.sql"
index bfe3f96d..fa7b8ef0 100644
--- "a/data/sql/01.\345\210\235\345\247\213\345\214\226\344\270\232\345\212\241\346\225\260\346\215\256\345\272\223.sql"
+++ "b/data/sql/01.\345\210\235\345\247\213\345\214\226\344\270\232\345\212\241\346\225\260\346\215\256\345\272\223.sql"
@@ -3,13 +3,14 @@ DROP DATABASE IF EXISTS `passjava_qms`;
DROP DATABASE IF EXISTS `passjava_sms`;
DROP DATABASE IF EXISTS `passjava_cms`;
DROP DATABASE IF EXISTS `passjava_chms`;
+DROP DATABASE IF EXISTS `passjava_auth`;
CREATE DATABASE passjava_ums CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE passjava_qms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE passjava_sms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE passjava_cms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE passjava_chms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-
+CREATE DATABASE passjava_auth CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE passjava_ums;
@@ -41,6 +42,7 @@ CREATE TABLE ums_member
del_flag TINYINT(1) DEFAULT 0 COMMENT '删除标记(0-正常,1-删除)',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
+ user_id VARCHAR(64) COMMENT '用户账户名',
PRIMARY KEY (id)
);
@@ -250,3 +252,24 @@ CREATE TABLE chms_access_token
ALTER TABLE chms_access_token COMMENT '渠道-认证表';
+
+USE passjava_auth;
+
+/*==============================================================*/
+/* Table: sys_user */
+/*==============================================================*/
+
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user` (
+ `username` varchar(50) NOT NULL,
+ `password` varchar(255) DEFAULT NULL,
+ `org_id` int DEFAULT NULL,
+ `enabled` bit(1) DEFAULT NULL,
+ `phone` varchar(20) DEFAULT NULL,
+ `email` varchar(50) DEFAULT NULL,
+ `create_time` datetime DEFAULT NULL,
+ `update_time` datetime DEFAULT NULL,
+ `id` int NOT NULL AUTO_INCREMENT,
+ `user_id` varchar(64) NOT NULL,
+ PRIMARY KEY (`id`,`user_id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
\ No newline at end of file
diff --git "a/data/sql/04.\346\217\222\345\205\245\344\270\232\345\212\241\346\225\260\346\215\256.sql" "b/data/sql/04.\346\217\222\345\205\245\344\270\232\345\212\241\346\225\260\346\215\256.sql"
new file mode 100644
index 00000000..4f9441ab
--- /dev/null
+++ "b/data/sql/04.\346\217\222\345\205\245\344\270\232\345\212\241\346\225\260\346\215\256.sql"
@@ -0,0 +1,24 @@
+use passjava_ums;
+
+BEGIN;
+INSERT INTO `ums_member` (`id`, `mini_openid`, `mp_openid`, `unionid`, `level_id`, `user_name`, `PASSWORD`, `nickname`, `phone`, `email`, `avatar`, `gender`, `birth`, `city`, `source_type`, `integration`, `register_time`, `del_flag`, `create_time`, `update_time`, `user_id`) VALUES (123, NULL, NULL, NULL, NULL, '悟空', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-08-12 16:22:53', '2022-08-12 16:22:53', 'wukong');
+COMMIT;
+
+
+use passjava_auth;
+
+BEGIN;
+INSERT INTO `sys_user` (`username`, `password`, `org_id`, `enabled`, `phone`, `email`, `create_time`, `update_time`, `id`, `user_id`) VALUES ('wukong', '$2a$10$IAHUqoKYSgu/P0l9CiraTOQ/SJottVw9uS.QX9AS.NpZsLmtP5QgW', 1, b'1', '15912345678', 'abc@qq.com', '2022-08-10 07:20:30', '2022-08-10 07:24:33', 1, 'wukong');
+COMMIT;
+
+
+USE passjava_qms;
+BEGIN;
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (1, 'javaBasic', 'Java基础', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (2, 'jvm', 'Java虚拟机', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (3, 'spring', 'Spring核心原理', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (4, 'bigData', '大数据', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (5, 'thread', '多线程', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+
+INSERT INTO `passjava_qms`.`qms_question` (`id`, `title`, `answer`, `LEVEL`, `display_order`, `sub_title`, `TYPE`, `ENABLE`, `del_flag`, `create_time`, `update_time`) VALUES (1, 'JVM垃圾回收机制', '垃圾自动回收', 1, 1, 'GC', 1, 1, 0, '2022-08-16 22:40:53', '2022-08-16 22:40:53');
+COMMIT;
\ No newline at end of file
diff --git a/passjava-auth/pom.xml b/passjava-auth/pom.xml
new file mode 100644
index 00000000..640c0d1a
--- /dev/null
+++ b/passjava-auth/pom.xml
@@ -0,0 +1,82 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.6.RELEASE
+
+
+ 4.0.0
+ com.jackson0714.passjava
+
+ passjava-auth
+ 0.0.1-SNAPSHOT
+ passjava-auth
+ 佳必过-认证服务
+
+
+ 1.8
+ Hoxton.SR3
+
+
+
+
+ com.jackson0714.passjava
+ passjava-common
+ 0.0.1-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ mysql
+ mysql-connector-java
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ com.jackson0714.passjava
+ passjava-jwt
+ 0.0.1-SNAPSHOT
+ compile
+
+
+ io.projectreactor
+ reactor-core
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/passjava-auth/src/main/java/com/jackson0714/passjava/auth/PassjavaAuthApplication.java b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/PassjavaAuthApplication.java
new file mode 100644
index 00000000..bb319ac0
--- /dev/null
+++ b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/PassjavaAuthApplication.java
@@ -0,0 +1,20 @@
+package com.jackson0714.passjava.auth;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+
+/**
+ * @author wukong
+ */
+@RefreshScope
+@EnableDiscoveryClient
+@SpringBootApplication(scanBasePackages = {"com.jackson0714.passjava"})
+public class PassjavaAuthApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PassjavaAuthApplication.class, args);
+ }
+
+}
diff --git a/passjava-auth/src/main/java/com/jackson0714/passjava/auth/controller/JwtAuthController.java b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/controller/JwtAuthController.java
new file mode 100644
index 00000000..90b51fb3
--- /dev/null
+++ b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/controller/JwtAuthController.java
@@ -0,0 +1,144 @@
+package com.jackson0714.passjava.auth.controller;
+
+import com.jackson0714.passjava.common.utils.SecurityUtils;
+import com.jackson0714.passjava.jwt.common.ResponseCodeEnum;
+import com.jackson0714.passjava.jwt.config.PassJavaJwtProperties;
+import com.jackson0714.passjava.auth.jpa.SysUser;
+import com.jackson0714.passjava.auth.jpa.SysUserRepository;
+import com.jackson0714.passjava.jwt.utils.PassJavaJwtTokenUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import reactor.core.publisher.Mono;
+import com.jackson0714.passjava.jwt.common.ResponseResult;
+
+/**
+ * 获取 JWT 令牌和刷新 JWT 令牌接口
+ *
+ * @author 悟空聊架构
+ * @site www.passjava.cn
+ * @date 2022-08-09
+ *
+ * @startuml
+ * @enduml
+ */
+@RestController
+@RequestMapping("/auth")
+//@ConditionalOnProperty(name = "passjava.gateway.jwt.useDefaultController", havingValue = "true")
+public class JwtAuthController {
+
+ @Resource
+ private PassJavaJwtProperties jwtProperties;
+ @Resource
+ private SysUserRepository sysUserRepository;
+ @Resource
+ private PassJavaJwtTokenUtil jwtTokenUtil;
+ @Resource
+ private PasswordEncoder passwordEncoder;
+
+ /**
+ * 使用用户名密码换 JWT 令牌
+ */
+ @PostMapping("/login")
+ public ResponseResult> login(@RequestBody Map map){
+ // 从请求体中获取用户名密码
+ String userId = map.get(jwtProperties.getUserParamName());
+ String password = map.get(jwtProperties.getPwdParamName());
+
+ // 如果用户名和密码为空
+ if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(password)){
+ return ResponseResult.error(ResponseCodeEnum.LOGIN_ERROR.getCode(), ResponseCodeEnum.LOGIN_ERROR.getMessage());
+ }
+ // 根据 userId 去数据库查找该用户
+ SysUser sysUser = sysUserRepository.findByUserId(userId);
+ if(sysUser != null){
+ // 将数据库的加密密码与用户明文密码做比对
+ boolean isAuthenticated = passwordEncoder.matches(password,
+ sysUser.getPassword());
+ // 如果密码匹配成功
+ if(isAuthenticated){
+ // 通过 jwtTokenUtil 生成 JWT 令牌和刷新令牌
+ Map tokenMap = jwtTokenUtil
+ .generateTokenAndRefreshToken(userId, sysUser.getUsername());
+ return ResponseResult.success(tokenMap);
+ }
+ // 如果密码匹配失败
+ return ResponseResult.error(ResponseCodeEnum.LOGIN_ERROR.getCode(), ResponseCodeEnum.LOGIN_ERROR.getMessage());
+ }
+ // 如果未找到用户
+ return ResponseResult.error(ResponseCodeEnum.LOGIN_ERROR.getCode(), ResponseCodeEnum.LOGIN_ERROR.getMessage());
+ }
+
+ /**
+ * 刷新JWT令牌,用旧的令牌换新的令牌
+ */
+ @GetMapping("/refreshtoken")
+ public Mono refreshToken(@RequestHeader("${passjava.jwt.header}") String token){
+ token = SecurityUtils.replaceTokenPrefix(token);
+
+ if (StringUtils.isEmpty(token)) {
+ return buildErrorResponse(ResponseCodeEnum.TOKEN_MISSION);
+ }
+
+ // 对Token解签名,并验证Token是否过期
+ boolean isJwtNotValid = jwtTokenUtil.isTokenExpired(token);
+ if(isJwtNotValid){
+ return buildErrorResponse(ResponseCodeEnum.TOKEN_INVALID);
+ }
+ // 验证 token 里面的 userId 是否为空
+
+ String userId = jwtTokenUtil.getUserIdFromToken(token);
+ String username = jwtTokenUtil.getUserNameFromToken(token);
+ if (StringUtils.isEmpty(userId)) {
+ return buildErrorResponse(ResponseCodeEnum.TOKEN_CHECK_INFO_FAILED);
+ }
+
+ // 这里为了保证 refreshToken 只能用一次,刷新后,会从 redis 中删除。
+ // 如果用的不是 redis 中的 refreshToken 进行刷新令牌,则不能刷新。
+ // 如果使用 redis 中已过期的 refreshToken 也不能刷新令牌。
+ boolean isRefreshTokenNotExisted = jwtTokenUtil.isRefreshTokenNotExistCache(token);
+ if(isRefreshTokenNotExisted){
+ return buildErrorResponse(ResponseCodeEnum.REFRESH_TOKEN_INVALID);
+ }
+
+ String us = jwtTokenUtil.getUserIdFromToken(token);
+ Map tokenMap = jwtTokenUtil.refreshTokenAndGenerateToken(userId, username);
+
+ return buildSuccessResponse(tokenMap);
+ }
+
+ /**
+ * 登出,删除 redis 中的 accessToken 和 refreshToken
+ * 只保证 refreshToken 不能使用,accessToken 还是能使用的。
+ * 如果用户拿到了之前的 accessToken,则可以一直使用到过期,但是因为 refreshToken 已经无法使用了,所以保证了 accessToken 的时效性。
+ * 下次登录时,需要重新获取新的 accessToken 和 refreshToken,这样才能利用 refreshToken 进行续期。
+ */
+ @PostMapping("/logout")
+ public Mono logout(@RequestParam("username") String username){
+
+ boolean logoutResult = jwtTokenUtil.removeToken(username);
+ if (logoutResult) {
+ buildSuccessResponse(ResponseCodeEnum.SUCCESS);
+ } else {
+ buildErrorResponse(ResponseCodeEnum.LOGOUT_ERROR);
+ }
+
+ return buildSuccessResponse(ResponseCodeEnum.SUCCESS);
+ }
+
+ private Mono buildErrorResponse(ResponseCodeEnum responseCodeEnum){
+ return Mono.create(callback -> callback.success(
+ ResponseResult.error(responseCodeEnum.getCode(), responseCodeEnum.getMessage())
+ ));
+ }
+
+ private Mono buildSuccessResponse(Object data){
+ return Mono.create(callback -> callback.success(ResponseResult.success(data)
+ ));
+ }
+
+}
diff --git a/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUser.java b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUser.java
new file mode 100644
index 00000000..1c16ea5a
--- /dev/null
+++ b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUser.java
@@ -0,0 +1,49 @@
+package com.jackson0714.passjava.auth.jpa;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * 系统用户表
+ *
+ * @author 悟空聊架构
+ * @site www.passjava.cn
+ * @date 2022-08-09
+ */
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name="sys_user")
+public class SysUser {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private String userId;
+
+ @Column
+ private String password;
+
+ @Column
+ private String username;
+
+ @Column
+ private Integer orgId;
+
+ @Column
+ private Boolean enabled;
+
+ @Column
+ private String phone;
+
+ @Column
+ private String email;
+
+ @Column
+ private Date createTime;
+}
diff --git a/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUserRepository.java b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUserRepository.java
new file mode 100644
index 00000000..d8bd65e7
--- /dev/null
+++ b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUserRepository.java
@@ -0,0 +1,23 @@
+package com.jackson0714.passjava.auth.jpa;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 系统用户 repository
+ *
+ * @author 悟空聊架构
+ * @site www.passjava.cn
+ * @date 2022-08-09
+ */
+@Repository("SysUserRepository")
+public interface SysUserRepository extends JpaRepository {
+
+ /**
+ * 注意这个方法的名称,JPA 会根据方法名自动生成 SQL 执行,完全不用自己写SQL
+ *
+ * @param userId 用户姓名
+ * @return SysUser
+ */
+ SysUser findByUserId(String userId);
+}
diff --git a/passjava-auth/src/main/resources/application.properties b/passjava-auth/src/main/resources/application.properties
new file mode 100644
index 00000000..fd47b1de
--- /dev/null
+++ b/passjava-auth/src/main/resources/application.properties
@@ -0,0 +1,5 @@
+spring.cloud.nacos.config.server-addr=127.0.0.1:8848
+spring.cloud.nacos.config.namespace=passjava-auth
+
+spring.application.name=passjava-auth
+server.port=10001
\ No newline at end of file
diff --git a/passjava-auth/src/main/resources/application.yml b/passjava-auth/src/main/resources/application.yml
new file mode 100644
index 00000000..681b0249
--- /dev/null
+++ b/passjava-auth/src/main/resources/application.yml
@@ -0,0 +1,17 @@
+spring:
+ profiles:
+ include: jwt
+ datasource:
+ url: jdbc:mysql://localhost:3306/passjava_auth?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+ username: root
+ password: abc123__
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ jpa:
+ hibernate:
+ ddl-auto: validate
+ database: mysql
+ show-sql: true
+
+logging:
+ level:
+ com.jackson0714.passjava: debug
\ No newline at end of file
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java
index 0b21f697..c814db6c 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java
@@ -12,16 +12,16 @@
import com.jackson0714.passjava.channel.entity.AccessTokenEntity;
import com.jackson0714.passjava.channel.service.AccessTokenService;
-import com.jackson0714.common.utils.PageUtils;
-import com.jackson0714.common.utils.R;
+import com.jackson0714.passjava.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.R;
/**
* 渠道-认证表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@RestController
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/ChannelController.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/ChannelController.java
index b92a3502..711782b6 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/ChannelController.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/ChannelController.java
@@ -12,16 +12,16 @@
import com.jackson0714.passjava.channel.entity.ChannelEntity;
import com.jackson0714.passjava.channel.service.ChannelService;
-import com.jackson0714.common.utils.PageUtils;
-import com.jackson0714.common.utils.R;
+import com.jackson0714.passjava.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.R;
/**
* 渠道-渠道表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@RestController
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/AccessTokenDao.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/AccessTokenDao.java
index 5667c845..2d8e5cfb 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/AccessTokenDao.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/AccessTokenDao.java
@@ -7,8 +7,8 @@
/**
* 渠道-认证表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@Mapper
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/ChannelDao.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/ChannelDao.java
index 9584bdfa..fd788e85 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/ChannelDao.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/ChannelDao.java
@@ -7,8 +7,8 @@
/**
* 渠道-渠道表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@Mapper
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/AccessTokenEntity.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/AccessTokenEntity.java
index b4c86c18..7ccb621c 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/AccessTokenEntity.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/AccessTokenEntity.java
@@ -11,8 +11,8 @@
/**
* 渠道-认证表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@Data
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/ChannelEntity.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/ChannelEntity.java
index 168c3121..76ada55a 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/ChannelEntity.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/ChannelEntity.java
@@ -11,8 +11,8 @@
/**
* 渠道-渠道表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@Data
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/AccessTokenService.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/AccessTokenService.java
index 9b3fecbf..11d4d9b7 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/AccessTokenService.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/AccessTokenService.java
@@ -1,7 +1,7 @@
package com.jackson0714.passjava.channel.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.jackson0714.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.PageUtils;
import com.jackson0714.passjava.channel.entity.AccessTokenEntity;
import java.util.Map;
@@ -9,8 +9,8 @@
/**
* 渠道-认证表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
public interface AccessTokenService extends IService {
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/ChannelService.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/ChannelService.java
index 0d067457..bce4447c 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/ChannelService.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/ChannelService.java
@@ -1,7 +1,7 @@
package com.jackson0714.passjava.channel.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.jackson0714.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.PageUtils;
import com.jackson0714.passjava.channel.entity.ChannelEntity;
import java.util.Map;
@@ -9,8 +9,8 @@
/**
* 渠道-渠道表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
public interface ChannelService extends IService {
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/AccessTokenServiceImpl.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/AccessTokenServiceImpl.java
index 15346f49..49735dad 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/AccessTokenServiceImpl.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/AccessTokenServiceImpl.java
@@ -5,8 +5,8 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.jackson0714.common.utils.PageUtils;
-import com.jackson0714.common.utils.Query;
+import com.jackson0714.passjava.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.Query;
import com.jackson0714.passjava.channel.dao.AccessTokenDao;
import com.jackson0714.passjava.channel.entity.AccessTokenEntity;
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/ChannelServiceImpl.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/ChannelServiceImpl.java
index 399c87b8..12481973 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/ChannelServiceImpl.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/ChannelServiceImpl.java
@@ -5,8 +5,8 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.jackson0714.common.utils.PageUtils;
-import com.jackson0714.common.utils.Query;
+import com.jackson0714.passjava.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.Query;
import com.jackson0714.passjava.channel.dao.ChannelDao;
import com.jackson0714.passjava.channel.entity.ChannelEntity;
diff --git a/passjava-common/pom.xml b/passjava-common/pom.xml
index 4cc930bc..29f841da 100644
--- a/passjava-common/pom.xml
+++ b/passjava-common/pom.xml
@@ -17,8 +17,8 @@
org.apache.maven.plugins
maven-compiler-plugin
- 7
- 7
+ 8
+ 8
@@ -92,18 +92,43 @@
3.3.1
compile
+
+ org.springframework
+ spring-web
+ 5.2.5.RELEASE
+ compile
+
+
+ org.springframework
+ spring-web
+ 5.2.5.RELEASE
+ compile
+
-
+
+
+ com.alibaba
+ transmittable-thread-local
+ 2.13.2
+
+
+ org.springframework
+ spring-webmvc
+ 5.2.5.RELEASE
+ compile
+
+
+
-
- org.springframework.cloud
- spring-cloud-starter-zipkin
-
+
+
+
+
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/config/WebMvcConfig.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/config/WebMvcConfig.java
new file mode 100644
index 00000000..0f44eef3
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/config/WebMvcConfig.java
@@ -0,0 +1,32 @@
+package com.jackson0714.passjava.common.config;
+
+import com.jackson0714.passjava.common.interceptor.HeaderInterceptor;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 拦截器配置
+ *
+ */
+public class WebMvcConfig implements WebMvcConfigurer
+{
+ /** 不需要拦截地址 */
+ public static final String[] excludeUrls = { "/login", "/logout", "/refresh" };
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry)
+ {
+ registry.addInterceptor(getHeaderInterceptor())
+ .addPathPatterns("/**")
+ .excludePathPatterns(excludeUrls)
+ .order(-10);
+ }
+
+ /**
+ * 自定义请求头拦截器
+ */
+ public HeaderInterceptor getHeaderInterceptor()
+ {
+ return new HeaderInterceptor();
+ }
+}
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/Constants.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/Constants.java
new file mode 100644
index 00000000..837e6c52
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/Constants.java
@@ -0,0 +1,124 @@
+package com.jackson0714.passjava.common.constant;
+
+/**
+ * 通用常量信息
+ *
+ */
+public class Constants
+{
+ /**
+ * UTF-8 字符集
+ */
+ public static final String UTF8 = "UTF-8";
+
+ /**
+ * GBK 字符集
+ */
+ public static final String GBK = "GBK";
+
+ /**
+ * RMI 远程方法调用
+ */
+ public static final String LOOKUP_RMI = "rmi:";
+
+ /**
+ * LDAP 远程方法调用
+ */
+ public static final String LOOKUP_LDAP = "ldap:";
+
+ /**
+ * LDAPS 远程方法调用
+ */
+ public static final String LOOKUP_LDAPS = "ldaps:";
+
+ /**
+ * http请求
+ */
+ public static final String HTTP = "http://";
+
+ /**
+ * https请求
+ */
+ public static final String HTTPS = "https://";
+
+ /**
+ * 成功标记
+ */
+ public static final Integer SUCCESS = 200;
+
+ /**
+ * 失败标记
+ */
+ public static final Integer FAIL = 500;
+
+ /**
+ * 登录成功状态
+ */
+ public static final String LOGIN_SUCCESS_STATUS = "0";
+
+ /**
+ * 登录失败状态
+ */
+ public static final String LOGIN_FAIL_STATUS = "1";
+
+ /**
+ * 登录成功
+ */
+ public static final String LOGIN_SUCCESS = "Success";
+
+ /**
+ * 注销
+ */
+ public static final String LOGOUT = "Logout";
+
+ /**
+ * 注册
+ */
+ public static final String REGISTER = "Register";
+
+ /**
+ * 登录失败
+ */
+ public static final String LOGIN_FAIL = "Error";
+
+ /**
+ * 当前记录起始索引
+ */
+ public static final String PAGE_NUM = "pageNum";
+
+ /**
+ * 每页显示记录数
+ */
+ public static final String PAGE_SIZE = "pageSize";
+
+ /**
+ * 排序列
+ */
+ public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+ /**
+ * 排序的方向 "desc" 或者 "asc".
+ */
+ public static final String IS_ASC = "isAsc";
+
+ /**
+ * 验证码有效期(分钟)
+ */
+ public static final long CAPTCHA_EXPIRATION = 2;
+
+ /**
+ * 资源映射路径 前缀
+ */
+ public static final String RESOURCE_PREFIX = "/profile";
+
+ /**
+ * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
+ */
+ public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
+
+ /**
+ * 定时任务违规的字符
+ */
+ public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
+ "org.springframework", "org.apache", "com.ruoyi.common.core.utils.file" };
+}
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/SecurityConstants.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/SecurityConstants.java
new file mode 100644
index 00000000..0bf30206
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/SecurityConstants.java
@@ -0,0 +1,44 @@
+package com.jackson0714.passjava.common.constant;
+
+/**
+ * 权限相关通用常量
+ *
+ * @author ruoyi
+ */
+public class SecurityConstants
+{
+ /**
+ * 用户ID字段
+ */
+ public static final String DETAILS_USER_ID = "userId";
+
+ /**
+ * 用户名字段
+ */
+ public static final String DETAILS_USERNAME = "username";
+
+ /**
+ * 授权信息字段
+ */
+ public static final String AUTHORIZATION_HEADER = "authorization";
+
+ /**
+ * 请求来源
+ */
+ public static final String FROM_SOURCE = "from-source";
+
+ /**
+ * 内部请求
+ */
+ public static final String INNER = "inner";
+
+ /**
+ * 用户标识
+ */
+ public static final String USER_KEY = "user_key";
+
+ /**
+ * 登录用户
+ */
+ public static final String LOGIN_USER = "login_user";
+}
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/TokenConstants.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/TokenConstants.java
new file mode 100644
index 00000000..904ce4eb
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/TokenConstants.java
@@ -0,0 +1,19 @@
+package com.jackson0714.passjava.common.constant;
+
+
+/**
+ * @author wukong
+ */
+public class TokenConstants
+{
+ /**
+ * 令牌自定义标识
+ */
+ public static final String AUTHENTICATION = "Authorization";
+
+ /**
+ * 令牌前缀
+ */
+ public static final String PREFIX = "Bearer ";
+
+}
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/context/SecurityContextHolder.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/context/SecurityContextHolder.java
new file mode 100644
index 00000000..8019e37a
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/context/SecurityContextHolder.java
@@ -0,0 +1,88 @@
+package com.jackson0714.passjava.common.context;
+
+import com.alibaba.ttl.TransmittableThreadLocal;
+import com.jackson0714.passjava.common.constant.SecurityConstants;
+import com.jackson0714.passjava.common.text.Convert;
+import com.jackson0714.passjava.common.utils.StringUtils;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 获取当前线程变量中的 用户id、用户名称、Token等信息
+ * 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
+ *
+ */
+public class SecurityContextHolder
+{
+ private static final TransmittableThreadLocal