diff --git a/blade-common/pom.xml b/blade-common/pom.xml
index d48104b3a..dea99a54b 100644
--- a/blade-common/pom.xml
+++ b/blade-common/pom.xml
@@ -5,7 +5,7 @@
BladeX-Biz
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
diff --git a/blade-example-api/blade-dubbo-provider-api/pom.xml b/blade-example-api/blade-dubbo-provider-api/pom.xml
index 0a9e8e382..16c1c77b0 100644
--- a/blade-example-api/blade-dubbo-provider-api/pom.xml
+++ b/blade-example-api/blade-dubbo-provider-api/pom.xml
@@ -5,7 +5,7 @@
blade-example-api
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
diff --git a/blade-example-api/pom.xml b/blade-example-api/pom.xml
index 0aed9c518..34e79aa10 100644
--- a/blade-example-api/pom.xml
+++ b/blade-example-api/pom.xml
@@ -5,13 +5,13 @@
BladeX-Biz
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
blade-example-api
${project.artifactId}
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
pom
BladeX 微服务范例API集合
diff --git a/blade-example/blade-dubbo-consumer/pom.xml b/blade-example/blade-dubbo-consumer/pom.xml
index 06b579661..d82b291f6 100644
--- a/blade-example/blade-dubbo-consumer/pom.xml
+++ b/blade-example/blade-dubbo-consumer/pom.xml
@@ -5,7 +5,7 @@
blade-example
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
diff --git a/blade-example/blade-dubbo-provider/pom.xml b/blade-example/blade-dubbo-provider/pom.xml
index b4b9237c4..e599da95e 100644
--- a/blade-example/blade-dubbo-provider/pom.xml
+++ b/blade-example/blade-dubbo-provider/pom.xml
@@ -5,7 +5,7 @@
blade-example
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
diff --git a/blade-example/blade-seata-order/README.md b/blade-example/blade-seata-order/README.md
new file mode 100644
index 000000000..d8e10fddf
--- /dev/null
+++ b/blade-example/blade-seata-order/README.md
@@ -0,0 +1,30 @@
+-- 创建 order库、业务表、undo_log表
+create database seata_order;
+use seata_order;
+
+DROP TABLE IF EXISTS `tb_order`;
+CREATE TABLE `tb_order` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `user_id` varchar(255) DEFAULT NULL,
+ `commodity_code` varchar(255) DEFAULT NULL,
+ `count` int(11) DEFAULT 0,
+ `money` int(11) DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE `undo_log`
+(
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
+ `branch_id` BIGINT(20) NOT NULL,
+ `xid` VARCHAR(100) NOT NULL,
+ `context` VARCHAR(128) NOT NULL,
+ `rollback_info` LONGBLOB NOT NULL,
+ `log_status` INT(11) NOT NULL,
+ `log_created` DATETIME NOT NULL,
+ `log_modified` DATETIME NOT NULL,
+ `ext` VARCHAR(100) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
+) ENGINE = InnoDB
+ AUTO_INCREMENT = 1
+ DEFAULT CHARSET = utf8;
\ No newline at end of file
diff --git a/blade-example/blade-seata-order/pom.xml b/blade-example/blade-seata-order/pom.xml
new file mode 100644
index 000000000..97ad9e822
--- /dev/null
+++ b/blade-example/blade-seata-order/pom.xml
@@ -0,0 +1,30 @@
+
+
+
+ blade-example
+ org.springblade
+ 2.1.0.RELEASE
+
+ 4.0.0
+
+ blade-seata-order
+ ${project.artifactId}
+ ${bladex.project.version}
+ jar
+
+
+
+ org.springblade
+ blade-core-boot
+ ${bladex.tool.version}
+
+
+ org.springblade
+ blade-starter-transaction
+ ${bladex.tool.version}
+
+
+
+
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/SeataOrderApplication.java b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/SeataOrderApplication.java
new file mode 100644
index 000000000..a252b61a0
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/SeataOrderApplication.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.seata.order;
+
+import org.springblade.core.cloud.feign.EnableBladeFeign;
+import org.springblade.core.launch.BladeApplication;
+import org.springblade.core.transaction.annotation.SeataCloudApplication;
+
+/**
+ * Order启动器
+ *
+ * @author Chill
+ */
+@EnableBladeFeign
+@SeataCloudApplication
+public class SeataOrderApplication {
+
+ public static void main(String[] args) {
+ BladeApplication.run("blade-seata-order", SeataOrderApplication.class, args);
+ }
+
+}
+
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/controller/OrderController.java b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/controller/OrderController.java
new file mode 100644
index 000000000..930856872
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/controller/OrderController.java
@@ -0,0 +1,34 @@
+package org.springblade.seata.order.controller;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springblade.seata.order.service.IOrderService;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * OrderController
+ *
+ * @author Chill
+ */
+@RestController
+@RequestMapping("order")
+@AllArgsConstructor
+public class OrderController {
+
+ private IOrderService orderService;
+
+ /**
+ * 创建订单
+ *
+ * @param userId 用户id
+ * @param commodityCode 商品代码
+ * @param count 数量
+ * @return boolean
+ */
+ @RequestMapping("/create")
+ public R createOrder(String userId, String commodityCode, Integer count) {
+ return R.status(orderService.createOrder(userId, commodityCode, count));
+ }
+
+}
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/entity/Order.java b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/entity/Order.java
new file mode 100644
index 000000000..8ccac26af
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/entity/Order.java
@@ -0,0 +1,31 @@
+package org.springblade.seata.order.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * Order
+ *
+ * @author Chill
+ */
+@Data
+@Accessors(chain = true)
+@TableName("tb_order")
+public class Order implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+ private String userId;
+ private String commodityCode;
+ private Integer count;
+ private BigDecimal money;
+
+}
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/feign/IStorageClient.java b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/feign/IStorageClient.java
new file mode 100644
index 000000000..1312d8b69
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/feign/IStorageClient.java
@@ -0,0 +1,25 @@
+package org.springblade.seata.order.feign;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * StorageClient
+ *
+ * @author Chill
+ */
+@FeignClient(name = "blade-seata-storage", fallback = StorageClientFallback.class)
+public interface IStorageClient {
+
+ /**
+ * 减库存
+ *
+ * @param commodityCode 商品代码
+ * @param count 数量
+ * @return boolean
+ */
+ @GetMapping("/deduct")
+ int deduct(@RequestParam("commodityCode") String commodityCode, @RequestParam("count") Integer count);
+
+}
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/feign/StorageClientFallback.java b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/feign/StorageClientFallback.java
new file mode 100644
index 000000000..6bfaeef7f
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/feign/StorageClientFallback.java
@@ -0,0 +1,18 @@
+package org.springblade.seata.order.feign;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * StorageClientFallback
+ *
+ * @author Chill
+ */
+@Component
+public class StorageClientFallback implements IStorageClient {
+
+ @Override
+ public int deduct(String commodityCode, Integer count) {
+ return -1;
+ }
+
+}
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/mapper/OrderMapper.java b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/mapper/OrderMapper.java
new file mode 100644
index 000000000..078c9808f
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/mapper/OrderMapper.java
@@ -0,0 +1,12 @@
+package org.springblade.seata.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.seata.order.entity.Order;
+
+/**
+ * OrderMapper
+ *
+ * @author Chill
+ */
+public interface OrderMapper extends BaseMapper {
+}
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/mapper/OrderMapper.xml b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/mapper/OrderMapper.xml
new file mode 100644
index 000000000..da6e86c06
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/mapper/OrderMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/service/IOrderService.java b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/service/IOrderService.java
new file mode 100644
index 000000000..81a3a4d3b
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/service/IOrderService.java
@@ -0,0 +1,23 @@
+package org.springblade.seata.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.seata.order.entity.Order;
+
+/**
+ * IOrderService
+ *
+ * @author Chill
+ */
+public interface IOrderService extends IService {
+
+ /**
+ * 创建订单
+ *
+ * @param userId 用户id
+ * @param commodityCode 商品代码
+ * @param count 数量
+ * @return boolean
+ */
+ boolean createOrder(String userId, String commodityCode, Integer count);
+
+}
diff --git a/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/service/impl/OrderServiceImpl.java b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/service/impl/OrderServiceImpl.java
new file mode 100644
index 000000000..388d75fb0
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/java/org/springblade/seata/order/service/impl/OrderServiceImpl.java
@@ -0,0 +1,48 @@
+package org.springblade.seata.order.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.seata.spring.annotation.GlobalTransactional;
+import lombok.AllArgsConstructor;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.seata.order.entity.Order;
+import org.springblade.seata.order.feign.IStorageClient;
+import org.springblade.seata.order.mapper.OrderMapper;
+import org.springblade.seata.order.service.IOrderService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+
+/**
+ * OrderServiceImpl
+ *
+ * @author Chill
+ */
+@Service
+@AllArgsConstructor
+public class OrderServiceImpl extends ServiceImpl implements IOrderService {
+
+ private IStorageClient storageClient;
+
+ @Override
+ @GlobalTransactional
+ @Transactional(rollbackFor = Exception.class)
+ public boolean createOrder(String userId, String commodityCode, Integer count) {
+ int maxCount = 100;
+ BigDecimal orderMoney = new BigDecimal(count).multiply(new BigDecimal(5));
+ Order order = new Order()
+ .setUserId(userId)
+ .setCommodityCode(commodityCode)
+ .setCount(count)
+ .setMoney(orderMoney);
+ int cnt1 = baseMapper.insert(order);
+ int cnt2 = storageClient.deduct(commodityCode, count);
+ if (cnt2 < 0) {
+ throw new ServiceException("创建订单失败");
+ } else if (count > maxCount) {
+ throw new ServiceException("超过订单最大值,创建订单失败");
+ }
+ return cnt1 > 0 && cnt2 > 0;
+ }
+
+}
diff --git a/blade-example/blade-seata-order/src/main/resources/application-dev.yml b/blade-example/blade-seata-order/src/main/resources/application-dev.yml
new file mode 100644
index 000000000..ed2ec0831
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/resources/application-dev.yml
@@ -0,0 +1,10 @@
+#服务器端口
+server:
+ port: 8501
+
+#数据源配置
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/seata_order?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
+ username: root
+ password: root
diff --git a/blade-example/blade-seata-order/src/main/resources/registry.conf b/blade-example/blade-seata-order/src/main/resources/registry.conf
new file mode 100644
index 000000000..da0dda80b
--- /dev/null
+++ b/blade-example/blade-seata-order/src/main/resources/registry.conf
@@ -0,0 +1,20 @@
+registry {
+ # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
+ type = "nacos"
+
+ nacos {
+ serverAddr = "localhost"
+ namespace = ""
+ cluster = "default"
+ }
+}
+
+config {
+ # file、nacos 、apollo、zk、consul、etcd3
+ type = "nacos"
+
+ nacos {
+ serverAddr = "localhost"
+ namespace = ""
+ }
+}
diff --git a/blade-example/blade-seata-storage/README.md b/blade-example/blade-seata-storage/README.md
new file mode 100644
index 000000000..62575a7b1
--- /dev/null
+++ b/blade-example/blade-seata-storage/README.md
@@ -0,0 +1,33 @@
+-- 创建 storage库、业务表、undo_log表
+create database seata_storage;
+use seata_storage;
+
+DROP TABLE IF EXISTS `tb_storage`;
+CREATE TABLE `tb_storage` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `commodity_code` varchar(255) DEFAULT NULL,
+ `count` int(11) DEFAULT 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY (`commodity_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE `undo_log`
+(
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
+ `branch_id` BIGINT(20) NOT NULL,
+ `xid` VARCHAR(100) NOT NULL,
+ `context` VARCHAR(128) NOT NULL,
+ `rollback_info` LONGBLOB NOT NULL,
+ `log_status` INT(11) NOT NULL,
+ `log_created` DATETIME NOT NULL,
+ `log_modified` DATETIME NOT NULL,
+ `ext` VARCHAR(100) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
+) ENGINE = InnoDB
+ AUTO_INCREMENT = 1
+ DEFAULT CHARSET = utf8;
+
+-- 初始化库存模拟数据
+INSERT INTO seata_storage.tb_storage (id, commodity_code, count) VALUES (1, 'product-1', 9999999);
+INSERT INTO seata_storage.tb_storage (id, commodity_code, count) VALUES (2, 'product-2', 0);
\ No newline at end of file
diff --git a/blade-example/blade-seata-storage/pom.xml b/blade-example/blade-seata-storage/pom.xml
new file mode 100644
index 000000000..1a9cee45a
--- /dev/null
+++ b/blade-example/blade-seata-storage/pom.xml
@@ -0,0 +1,31 @@
+
+
+
+ blade-example
+ org.springblade
+ 2.1.0.RELEASE
+
+ 4.0.0
+
+ blade-seata-storage
+ ${project.artifactId}
+ ${bladex.project.version}
+ jar
+
+
+
+ org.springblade
+ blade-core-boot
+ ${bladex.tool.version}
+
+
+ org.springblade
+ blade-starter-transaction
+ ${bladex.tool.version}
+
+
+
+
+
diff --git a/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/SeataStorageApplication.java b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/SeataStorageApplication.java
new file mode 100644
index 000000000..10c719f69
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/SeataStorageApplication.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.seata.storage;
+
+import org.springblade.core.cloud.feign.EnableBladeFeign;
+import org.springblade.core.launch.BladeApplication;
+import org.springblade.core.transaction.annotation.SeataCloudApplication;
+
+/**
+ * Storage启动器
+ *
+ * @author Chill
+ */
+@EnableBladeFeign
+@SeataCloudApplication
+public class SeataStorageApplication {
+
+ public static void main(String[] args) {
+ BladeApplication.run("blade-seata-storage", SeataStorageApplication.class, args);
+ }
+
+}
+
diff --git a/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/controller/StorageController.java b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/controller/StorageController.java
new file mode 100644
index 000000000..0033d2832
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/controller/StorageController.java
@@ -0,0 +1,30 @@
+package org.springblade.seata.storage.controller;
+
+import lombok.AllArgsConstructor;
+import org.springblade.seata.storage.service.IStorageService;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * StorageController
+ *
+ * @author Chill
+ */
+@RestController
+@AllArgsConstructor
+public class StorageController {
+
+ private IStorageService storageService;
+
+ /**
+ * 减库存
+ *
+ * @param commodityCode 商品代码
+ * @param count 数量
+ */
+ @RequestMapping(path = "/deduct")
+ public int deduct(String commodityCode, Integer count) {
+ return storageService.deduct(commodityCode, count);
+ }
+
+}
diff --git a/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/entity/Storage.java b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/entity/Storage.java
new file mode 100644
index 000000000..73e4935e4
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/entity/Storage.java
@@ -0,0 +1,24 @@
+package org.springblade.seata.storage.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * storage
+ *
+ * @author Chill
+ */
+@Data
+@TableName("tb_storage")
+public class Storage implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private Long id;
+ private String commodityCode;
+ private Long count;
+
+}
diff --git a/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/mapper/StorageMapper.java b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/mapper/StorageMapper.java
new file mode 100644
index 000000000..800ac0172
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/mapper/StorageMapper.java
@@ -0,0 +1,12 @@
+package org.springblade.seata.storage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.seata.storage.entity.Storage;
+
+/**
+ * StorageMapper
+ *
+ * @author Chill
+ */
+public interface StorageMapper extends BaseMapper {
+}
diff --git a/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/mapper/StorageMapper.xml b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/mapper/StorageMapper.xml
new file mode 100644
index 000000000..c2c8a9a33
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/mapper/StorageMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/IStorageService.java b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/IStorageService.java
new file mode 100644
index 000000000..1b2fe400a
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/IStorageService.java
@@ -0,0 +1,22 @@
+package org.springblade.seata.storage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.seata.storage.entity.Storage;
+
+/**
+ * IStorageService
+ *
+ * @author Chill
+ */
+public interface IStorageService extends IService {
+
+ /**
+ * 减库存
+ *
+ * @param commodityCode 商品代码
+ * @param count 数量
+ * @return boolean
+ */
+ int deduct(String commodityCode, int count);
+
+}
diff --git a/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/impl/StorageServiceImpl.java b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/impl/StorageServiceImpl.java
new file mode 100644
index 000000000..fc1eaccdc
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/impl/StorageServiceImpl.java
@@ -0,0 +1,30 @@
+package org.springblade.seata.storage.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.seata.storage.entity.Storage;
+import org.springblade.seata.storage.mapper.StorageMapper;
+import org.springblade.seata.storage.service.IStorageService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * StorageServiceImpl
+ *
+ * @author Chill
+ */
+@Service
+public class StorageServiceImpl extends ServiceImpl implements IStorageService {
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int deduct(String commodityCode, int count) {
+ Storage storage = baseMapper.selectOne(Wrappers.query().lambda().eq(Storage::getCommodityCode, commodityCode));
+ if (storage.getCount() < count) {
+ throw new RuntimeException("超过库存数,扣除失败!");
+ }
+ storage.setCount(storage.getCount() - count);
+ return baseMapper.updateById(storage);
+ }
+
+}
diff --git a/blade-example/blade-seata-storage/src/main/resources/application-dev.yml b/blade-example/blade-seata-storage/src/main/resources/application-dev.yml
new file mode 100644
index 000000000..35d9cb440
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/resources/application-dev.yml
@@ -0,0 +1,10 @@
+#服务器端口
+server:
+ port: 8502
+
+#数据源配置
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/seata_storage?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
+ username: root
+ password: root
diff --git a/blade-example/blade-seata-storage/src/main/resources/registry.conf b/blade-example/blade-seata-storage/src/main/resources/registry.conf
new file mode 100644
index 000000000..da0dda80b
--- /dev/null
+++ b/blade-example/blade-seata-storage/src/main/resources/registry.conf
@@ -0,0 +1,20 @@
+registry {
+ # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
+ type = "nacos"
+
+ nacos {
+ serverAddr = "localhost"
+ namespace = ""
+ cluster = "default"
+ }
+}
+
+config {
+ # file、nacos 、apollo、zk、consul、etcd3
+ type = "nacos"
+
+ nacos {
+ serverAddr = "localhost"
+ namespace = ""
+ }
+}
diff --git a/blade-example/pom.xml b/blade-example/pom.xml
index a6d5c2073..dc81b3ff3 100644
--- a/blade-example/pom.xml
+++ b/blade-example/pom.xml
@@ -5,19 +5,21 @@
BladeX-Biz
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
blade-example
${project.artifactId}
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
pom
BladeX 微服务范例集合
blade-dubbo-consumer
blade-dubbo-provider
+ blade-seata-order
+ blade-seata-storage
diff --git a/blade-gateway/pom.xml b/blade-gateway/pom.xml
index 2f08404ec..db47224dd 100644
--- a/blade-gateway/pom.xml
+++ b/blade-gateway/pom.xml
@@ -5,7 +5,7 @@
BladeX-Biz
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java b/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java
index 3fa268e8c..dd8c574ea 100644
--- a/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java
+++ b/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java
@@ -46,6 +46,7 @@ public class AuthProvider {
defaultSkipUrl.add("/process/resource-view");
defaultSkipUrl.add("/process/diagram-view");
defaultSkipUrl.add("/manager/check-upload");
+ defaultSkipUrl.add("/order/create");
defaultSkipUrl.add("/error/**");
defaultSkipUrl.add("/assets/**");
}
diff --git a/blade-service-api/blade-demo-api/pom.xml b/blade-service-api/blade-demo-api/pom.xml
index 928bfbf43..cdc20aa77 100644
--- a/blade-service-api/blade-demo-api/pom.xml
+++ b/blade-service-api/blade-demo-api/pom.xml
@@ -5,7 +5,7 @@
blade-service-api
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
diff --git a/blade-service-api/pom.xml b/blade-service-api/pom.xml
index 434714911..1a2d4464f 100644
--- a/blade-service-api/pom.xml
+++ b/blade-service-api/pom.xml
@@ -5,14 +5,14 @@
BladeX-Biz
org.springblade
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
blade-service-api
${project.artifactId}
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
pom
BladeX 微服务API集合
diff --git a/blade-service/blade-demo/pom.xml b/blade-service/blade-demo/pom.xml
index 242e267a6..7030309b2 100644
--- a/blade-service/blade-demo/pom.xml
+++ b/blade-service/blade-demo/pom.xml
@@ -6,7 +6,7 @@
org.springblade
blade-service
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
4.0.0
diff --git a/blade-service/pom.xml b/blade-service/pom.xml
index 4517f5533..695efd88c 100644
--- a/blade-service/pom.xml
+++ b/blade-service/pom.xml
@@ -7,12 +7,12 @@
org.springblade
BladeX-Biz
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
blade-service
${project.artifactId}
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
pom
BladeX 微服务集合
diff --git a/pom.xml b/pom.xml
index 2c8b42fef..37473eafe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,17 +5,17 @@
org.springblade
BladeX-Biz
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
pom
- 2.0.7.RELEASE
- 2.0.7.RELEASE
+ 2.1.0.RELEASE
+ 2.1.0.RELEASE
1.8
2.9.2
1.5.21
- 1.9.4
+ 1.9.6
3.1.0
4.0.1
1.6.0
@@ -26,14 +26,14 @@
2.1.0.RELEASE
2.7.3
- 2.1.7.RELEASE
- Greenwich.SR2
- Cairo-SR7
+ 2.1.8.RELEASE
+ Greenwich.SR3
+ Cairo-SR8
192.168.0.157
http://${docker.registry.url}:2375
- 1.2.0
+ 1.1.0
diff --git a/script/docker/.env b/script/docker/.env
index 1a47e057f..8488464fc 100644
--- a/script/docker/.env
+++ b/script/docker/.env
@@ -1,2 +1,2 @@
REGISTER=192.168.0.157/blade
-TAG=2.0.7.RELEASE
+TAG=2.1.0.RELEASE