From 83eb1ecd817c1efdec1db4dae8b6e72b4ae6de69 Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Sun, 17 Jul 2022 00:36:36 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD](mast?= =?UTF-8?q?er):=20=E8=84=9A=E6=89=8B=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 整合了常用的脚手架文件 --- best-practice/sde/eladmin | 1 + best-practice/sde/fast-boot | 1 + best-practice/sde/guns | 1 + best-practice/sde/renren-security | 1 + best-practice/项目介绍.md | 25 ++++++ .../pom.xml | 6 +- .../custom-sharding-algortihm-example/pom.xml | 2 +- .../pom.xml | 8 +- dev-protocol-pay/.gitignore | 46 +++++++++++ dev-protocol-pay/README.md | 79 ++++++++++++++++++- 10 files changed, 161 insertions(+), 9 deletions(-) create mode 160000 best-practice/sde/eladmin create mode 160000 best-practice/sde/fast-boot create mode 160000 best-practice/sde/guns create mode 160000 best-practice/sde/renren-security create mode 100644 dev-protocol-pay/.gitignore 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..999cbca --- /dev/null +++ b/best-practice/sde/fast-boot @@ -0,0 +1 @@ +Subproject commit 999cbca2990bf00e095ded5ec507c40210cea933 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..7f699da 100644 --- a/dev-protocol-pay/README.md +++ b/dev-protocol-pay/README.md @@ -1,4 +1,81 @@ -## 支付模块的代码示例 +# 企业级支付全家桶设计和实战 + +## 1. 基本概念逻辑 + +### 1.1 主流支付渠道说明 + +- 种类 + - 微信支付 + - 支付宝 + +- 支付产品逻辑 + - 微信支付 + - 社交行为进行绑定的,有利于社交行为下的交易促成 + - 对北方比较友好,北方人用微信支付的根基比较重 + - 微商比较友好 + - 对小程序生态的付款比较友好 + - 支付宝支付 + - 对生活服务类和理财类比较友好 + - 对淘系下的支付行为比较友好 + - 在南方比较受到欢迎和推崇 + - 银联/云闪付 + - 线下比较多 + - 主要是有优惠相关的场景 + +- 市场份额 + - 支付宝 54% + - 微信支付 40% + - 银联支付 0.4% + - 京东/美团都有0.7%以上 + +- 不同支付场景使用不同的支付方式 + - 在微信小程序里面付款支付, 需要使用小程序支付接口 + - 在微信里面打开网页进行付款,要使用JSAPI支付接口 + - 在手机浏览器上面使用微信付款,要用H5支付接口 + - 如果选用微信扫码支付,需要调用Native支付接口 + +### 1.2 补充研究方向 + +- 各种支付的资质和通道?????? + - 有什么好的申请方式 + - 收费情况 + - 限制 + +## 2. 环境讲解 + +- 正常Java环境即可 + +## 3. 微信支付 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ### 1. 支付宝对接 From 9d278ff61af549c73fb5dbf2b98a1dad471bf65c Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Thu, 21 Jul 2022 22:38:27 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD](mast?= =?UTF-8?q?er):=20=E6=94=AF=E4=BB=98=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新了文档 --- dev-protocol-pay/README.md | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/dev-protocol-pay/README.md b/dev-protocol-pay/README.md index 7f699da..1098522 100644 --- a/dev-protocol-pay/README.md +++ b/dev-protocol-pay/README.md @@ -47,7 +47,42 @@ ## 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/ (这里可以切换多个你绑定的企业账号主体,) + - +- 注册微信公众平台账号(企业身份的) + - From 1110d2d3b0654a58190dd9e81413521a71bc094a Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Thu, 21 Jul 2022 22:50:02 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD](mast?= =?UTF-8?q?er):=20=E6=94=AF=E4=BB=98=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新了文档 --- best-practice/sde/fast-boot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/best-practice/sde/fast-boot b/best-practice/sde/fast-boot index 999cbca..e6e37ce 160000 --- a/best-practice/sde/fast-boot +++ b/best-practice/sde/fast-boot @@ -1 +1 @@ -Subproject commit 999cbca2990bf00e095ded5ec507c40210cea933 +Subproject commit e6e37cef41e56937020347e41b30357e9f1a7196 From be3c49e18365db23bfb29881b9dcfa02de0edfe4 Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Fri, 22 Jul 2022 11:32:58 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD](mast?= =?UTF-8?q?er):=20=E6=B7=BB=E5=8A=A0RocketMQ=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=8F=8A=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 简单添加了代码 --- mq/rocketmq/README.md | 17 ++++- mq/rocketmq/rocket-api/pom.xml | 39 ++++++++++ .../main/java/com/baiye/constants/Const.java | 9 +++ .../java/com/baiye/consumer/Consumer.java | 72 +++++++++++++++++++ .../java/com/baiye/producer/Producer.java | 49 +++++++++++++ pom.xml | 1 + 6 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 mq/rocketmq/rocket-api/pom.xml create mode 100644 mq/rocketmq/rocket-api/src/main/java/com/baiye/constants/Const.java create mode 100644 mq/rocketmq/rocket-api/src/main/java/com/baiye/consumer/Consumer.java create mode 100644 mq/rocketmq/rocket-api/src/main/java/com/baiye/producer/Producer.java 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