diff --git a/best-practice/sde/eladmin b/best-practice/sde/eladmin
new file mode 160000
index 0000000..40177c6
--- /dev/null
+++ b/best-practice/sde/eladmin
@@ -0,0 +1 @@
+Subproject commit 40177c6c8dc8e542f046e3f6c95c356280035871
diff --git a/best-practice/sde/fast-boot b/best-practice/sde/fast-boot
new file mode 160000
index 0000000..e6e37ce
--- /dev/null
+++ b/best-practice/sde/fast-boot
@@ -0,0 +1 @@
+Subproject commit e6e37cef41e56937020347e41b30357e9f1a7196
diff --git a/best-practice/sde/guns b/best-practice/sde/guns
new file mode 160000
index 0000000..9f51525
--- /dev/null
+++ b/best-practice/sde/guns
@@ -0,0 +1 @@
+Subproject commit 9f51525ef0f7703360f4267642f14e8e0c542bc4
diff --git a/best-practice/sde/renren-security b/best-practice/sde/renren-security
new file mode 160000
index 0000000..0f4860a
--- /dev/null
+++ b/best-practice/sde/renren-security
@@ -0,0 +1 @@
+Subproject commit 0f4860a23607bdbfdf6a28414daa6b7ece0979a2
diff --git a/best-practice/项目介绍.md b/best-practice/项目介绍.md
index e69de29..23c2643 100644
--- a/best-practice/项目介绍.md
+++ b/best-practice/项目介绍.md
@@ -0,0 +1,25 @@
+# 最佳实践
+
+## 目录介绍
+
+- sde(Scaffold Development Evironment) 脚手架整合
+ - eladmin
+ - SpringBoot, SpringData Jpa、 JWT、Spring Security、Redis、Vue的前后端分离框架
+ - fast-boot
+ - SpringBoot、SpringSecurity、Mybatis-Plus
+ - guns
+ - SpringBoot、BootStrap
+ - renren-security
+ - SpringBoot、Shiro、MyBatis-Plus
+
+
+
+- TODO 未来把 支付模块 广告模块 电商模块
+- SCRM CRM CDP 等系统集成进来作为一个Demo级别的项目进行存在
+
+
+
+
+
+
+
diff --git a/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/mixed-feature-example/sharding-readwrite-splitting-example/pom.xml b/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/mixed-feature-example/sharding-readwrite-splitting-example/pom.xml
index 043ee1b..fde4963 100644
--- a/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/mixed-feature-example/sharding-readwrite-splitting-example/pom.xml
+++ b/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/mixed-feature-example/sharding-readwrite-splitting-example/pom.xml
@@ -32,8 +32,8 @@
sharding-readwrite-splitting-raw-jdbc-example
sharding-readwrite-splitting-spring-boot-jpa-example
- sharding-readwrite-splitting-spring-boot-mybatis-example
- sharding-readwrite-splitting-spring-namespace-jpa-example
- sharding-readwrite-splitting-spring-namespace-mybatis-example
+
+
+
diff --git a/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/single-feature-example/extension-example/custom-sharding-algortihm-example/pom.xml b/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/single-feature-example/extension-example/custom-sharding-algortihm-example/pom.xml
index fad84d9..725c525 100644
--- a/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/single-feature-example/extension-example/custom-sharding-algortihm-example/pom.xml
+++ b/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/single-feature-example/extension-example/custom-sharding-algortihm-example/pom.xml
@@ -30,7 +30,7 @@
pom
- class-based-sharding-algorithm-example
+
spi-based-sharding-algorithm-example
diff --git a/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/single-feature-example/extension-example/custom-sharding-algortihm-example/spi-based-sharding-algorithm-example/pom.xml b/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/single-feature-example/extension-example/custom-sharding-algortihm-example/spi-based-sharding-algorithm-example/pom.xml
index 61b8f64..cc1032b 100644
--- a/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/single-feature-example/extension-example/custom-sharding-algortihm-example/spi-based-sharding-algorithm-example/pom.xml
+++ b/database/shardingsphere/dev-protocol-shardingsphere-base/shardingsphere-jdbc-example/single-feature-example/extension-example/custom-sharding-algortihm-example/spi-based-sharding-algorithm-example/pom.xml
@@ -30,9 +30,9 @@
pom
- spi-based-sharding-raw-jdbc-example
- spi-based-sharding-spring-boot-mybatis-example
- spi-based-sharding-spring-namespace-jpa-example
- spi-based-sharding-spring-boot-jpa-example
+
+
+
+
diff --git a/dev-protocol-pay/.gitignore b/dev-protocol-pay/.gitignore
new file mode 100644
index 0000000..d4beec9
--- /dev/null
+++ b/dev-protocol-pay/.gitignore
@@ -0,0 +1,46 @@
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+### Maven template
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
diff --git a/dev-protocol-pay/README.md b/dev-protocol-pay/README.md
index b2e2389..1098522 100644
--- a/dev-protocol-pay/README.md
+++ b/dev-protocol-pay/README.md
@@ -1,4 +1,116 @@
-## 支付模块的代码示例
+# 企业级支付全家桶设计和实战
+
+## 1. 基本概念逻辑
+
+### 1.1 主流支付渠道说明
+
+- 种类
+ - 微信支付
+ - 支付宝
+
+- 支付产品逻辑
+ - 微信支付
+ - 社交行为进行绑定的,有利于社交行为下的交易促成
+ - 对北方比较友好,北方人用微信支付的根基比较重
+ - 微商比较友好
+ - 对小程序生态的付款比较友好
+ - 支付宝支付
+ - 对生活服务类和理财类比较友好
+ - 对淘系下的支付行为比较友好
+ - 在南方比较受到欢迎和推崇
+ - 银联/云闪付
+ - 线下比较多
+ - 主要是有优惠相关的场景
+
+- 市场份额
+ - 支付宝 54%
+ - 微信支付 40%
+ - 银联支付 0.4%
+ - 京东/美团都有0.7%以上
+
+- 不同支付场景使用不同的支付方式
+ - 在微信小程序里面付款支付, 需要使用小程序支付接口
+ - 在微信里面打开网页进行付款,要使用JSAPI支付接口
+ - 在手机浏览器上面使用微信付款,要用H5支付接口
+ - 如果选用微信扫码支付,需要调用Native支付接口
+
+### 1.2 补充研究方向
+
+- 各种支付的资质和通道??????
+ - 有什么好的申请方式
+ - 收费情况
+ - 限制
+
+## 2. 环境讲解
+
+- 正常Java环境即可
+
+## 3. 微信支付
+
+### 3.1 微信支付的种类
+
+- 付款码支付场景
+ - 线下消费的时候,商家通过扫码器(200-300元),扫描你的付款码完成免密支付
+ - 把显示的付款条码值进行输入,可以类似实现这种功能
+ - 付款码和收款码的区别?
+ - 手续费是没有去别的,付款码会有机器设备带来的一些开支
+ - 付款码可以接入商户系统,而收款码无法接入商户系统
+ - 付款码支付的接入商户系统,数据会保存在商户的管理系统后台,对交易明细进行一个良好的保存
+ - 小商贩不需要进行付款码,收款码即可,方便快捷
+- JSAPI支付场景
+ - 如果用户在微信内置的浏览器里面下单支付,调用微信的JSAPI支付接口即可
+ - 使用JS代码检测用户支付的环境
+- H5支付场景
+ - 如果用户在手机内置浏览器里面,打开电商网站下单支付,需要调用的是H5支付接口
+- Native支付场景
+ - PC端进行对接的方式
+ - 使用JS代码检测用户支付的环境
+- 小程序支付场景
+ - 如果用户在微信小程序上面下单支付,那么就需要调用微信小程序支付接口
+ - 或者展示一个收款码,进行转账即可
+- APP支付场景
+ - 如果用户在第三方APP上面下单支付,那么就需要调用微信平台的APP支付接口
+ - 门槛比较高
+- 刷脸支付场景
+ - 大型刷脸设备在(5000-6000左右),小型的在(1500-2000)左右
+ - 了解即可
+
+### 3.2 开发准备
+- 下载开发IDE
+ - https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
+- 注册微信开发者账号
+ - https://mp.weixin.qq.com/ (这里可以切换多个你绑定的企业账号主体,)
+ -
+- 注册微信公众平台账号(企业身份的)
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
### 1. 支付宝对接
diff --git a/mq/rocketmq/README.md b/mq/rocketmq/README.md
index 80b39b4..a79bdfa 100644
--- a/mq/rocketmq/README.md
+++ b/mq/rocketmq/README.md
@@ -70,7 +70,22 @@
- 可以集成控制台,修改控制台即可
- 集成SpringBoot也在这里
-## 2. RocketMQ 生产者核心研究
+## 2. RocketMQ 基本入门
+
+### 2.1 生产者的使用及使用控制台查消息
+1. 创建生产者对象 DefaultMQProducer (必须要对生产者组的名称进行配置)
+2. 设置 NamesrvAddr
+3. 设置一些需要配置的参数
+4. 启动生产者服务
+5. 创建消息并发送
+
+### 2.2 消费者的使用及Broker重试机制
+1. 创建消费者对象 DefaultMQPushConsumer
+2. 设置NamesrvAddr及其消费位置ConsumerFromWhere
+3. 进行订阅主题 subscribe
+4. 注册监听并消费 registerMessageListener
+
+### 2.3 RocketMQ - 四种集群环境构建详解
diff --git a/mq/rocketmq/rocket-api/pom.xml b/mq/rocketmq/rocket-api/pom.xml
new file mode 100644
index 0000000..47d62e6
--- /dev/null
+++ b/mq/rocketmq/rocket-api/pom.xml
@@ -0,0 +1,39 @@
+
+
+
+ dev-protocol
+ org.example
+ 1.0-SNAPSHOT
+ ../../../pom.xml
+
+ 4.0.0
+
+ rocket-api
+
+
+ 8
+ 8
+
+ 4.3.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.apache.rocketmq
+ rocketmq-client
+ ${rocketmq.version}
+
+
+
+
\ No newline at end of file
diff --git a/mq/rocketmq/rocket-api/src/main/java/com/baiye/constants/Const.java b/mq/rocketmq/rocket-api/src/main/java/com/baiye/constants/Const.java
new file mode 100644
index 0000000..d90564d
--- /dev/null
+++ b/mq/rocketmq/rocket-api/src/main/java/com/baiye/constants/Const.java
@@ -0,0 +1,9 @@
+package com.baiye.constants;
+
+public class Const {
+
+ /**
+ * namesrv 的地址
+ */
+ public static final String NAMESRV_ADDR = "127.0.0.1:9876";
+}
diff --git a/mq/rocketmq/rocket-api/src/main/java/com/baiye/consumer/Consumer.java b/mq/rocketmq/rocket-api/src/main/java/com/baiye/consumer/Consumer.java
new file mode 100644
index 0000000..b79139b
--- /dev/null
+++ b/mq/rocketmq/rocket-api/src/main/java/com/baiye/consumer/Consumer.java
@@ -0,0 +1,72 @@
+package com.baiye.consumer;
+
+import com.baiye.constants.Const;
+import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
+import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
+import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
+import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
+import org.apache.rocketmq.common.message.MessageExt;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 消费者 Demo
+ */
+public class Consumer {
+
+ public static void main(String[] args) throws MQClientException {
+ DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_consumer_name");
+
+ consumer.setNamesrvAddr(Const.NAMESRV_ADDR);
+
+ // 设置从什么地方开始消费
+ consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
+
+ consumer.subscribe(
+ "test-topic",
+ "*"
+ );
+
+ consumer.registerMessageListener((MessageListenerConcurrently) (msgs, consumeConcurrentlyContext) -> {
+ MessageExt messageExt = msgs.get(0);
+
+ try {
+ String topic = messageExt.getTopic();
+ String tags = messageExt.getTags();
+ String keys = messageExt.getKeys();
+
+ // FIXME: 2022/7/21 模拟消息消费出现异常的情况
+ if ("key1".equals(keys)) {
+ System.out.println(" 消息消费失败 ... ");
+ int a = 1 / 0;
+ }
+ String msgBody = new String(messageExt.getBody(), StandardCharsets.UTF_8);
+
+ System.out.println("topic = " + topic);
+ System.out.println("tags = " + tags);
+ System.out.println("keys = " + keys);
+ System.out.println("msgBody = " + msgBody);
+ } catch (Exception e) {
+ e.printStackTrace();
+
+ // FIXME: 2022/7/21 允许消息最大重试次数是多少次,我这里指定为3次
+ int reconsumeTimes = messageExt.getReconsumeTimes();
+ System.out.println("reconsumeTimes = " + reconsumeTimes);
+ if (3 == reconsumeTimes) {
+ // FIXME: 2022/7/21 记录日志,做补偿处理
+ return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+ }
+
+ return ConsumeConcurrentlyStatus.RECONSUME_LATER;
+ }
+
+ return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+ });
+
+ consumer.start();
+
+ System.out.println(" consumer start ... ");
+
+ }
+}
diff --git a/mq/rocketmq/rocket-api/src/main/java/com/baiye/producer/Producer.java b/mq/rocketmq/rocket-api/src/main/java/com/baiye/producer/Producer.java
new file mode 100644
index 0000000..65a968d
--- /dev/null
+++ b/mq/rocketmq/rocket-api/src/main/java/com/baiye/producer/Producer.java
@@ -0,0 +1,49 @@
+package com.baiye.producer;
+
+import com.baiye.constants.Const;
+import org.apache.rocketmq.client.exception.MQBrokerException;
+import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.client.producer.DefaultMQProducer;
+import org.apache.rocketmq.client.producer.SendResult;
+import org.apache.rocketmq.common.message.Message;
+import org.apache.rocketmq.remoting.exception.RemotingException;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 生产者 Demo
+ */
+public class Producer {
+
+ public static void main(String[] args) throws MQClientException, MQBrokerException, RemotingException, InterruptedException {
+
+ DefaultMQProducer producer = new DefaultMQProducer("test_producer_name");
+
+ producer.setNamesrvAddr(Const.NAMESRV_ADDR);
+
+ producer.start();
+
+ for (int i = 0; i < 10; i++) {
+ // 创建消息
+ Message message = new Message(
+ // 主题
+ "test-topic",
+ // 过滤
+ "TAG-A",
+ // 用户自定义的key, 唯一标识
+ "TAG-a",
+ // 消息内容
+ ("Hello RocketMQ" + i).getBytes(StandardCharsets.UTF_8)
+ );
+
+ // 发送消息
+ SendResult sendResult = producer.send(message);
+
+ // 消息发送结果
+ System.out.println(sendResult);
+ }
+
+ // 发送消息完毕进行关闭
+ producer.shutdown();
+ }
+}
diff --git a/pom.xml b/pom.xml
index ff2481d..d816f1e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,6 +33,7 @@
longpolling/demo/demo1/dev-protocol-disruptor-netty-common
utils/dev-protocol-id
database/shardingsphere/dev-protocol-shardingsphere-base
+ mq/rocketmq/rocket-api