HM-RocketMQ2.4【案例环境搭建】
1 数据库
1)优惠券表
Field | Type | Comment |
---|---|---|
coupon_id | bigint(50) NOT NULL | 优惠券ID |
coupon_price | decimal(10,2) NULL | 优惠券金额 |
user_id | bigint(50) NULL | 用户ID |
order_id | bigint(32) NULL | 订单ID |
is_used | int(1) NULL | 是否使用 0未使用 1已使用 |
used_time | timestamp NULL | 使用时间 |
CREATE TABLE `trade_coupon` (
`coupon_id` bigint(50) NOT NULL COMMENT '优惠券ID',
`coupon_price` decimal(10,2) DEFAULT NULL COMMENT '优惠券金额',
`user_id` bigint(50) DEFAULT NULL COMMENT '用户ID',
`order_id` bigint(32) DEFAULT NULL COMMENT '订单ID',
`is_used` int(1) DEFAULT NULL COMMENT '是否使用 0未使用 1已使用',
`used_time` timestamp NULL DEFAULT NULL COMMENT '使用时间',
PRIMARY KEY (`coupon_id`),
KEY `FK_trade_coupon` (`user_id`),
KEY `FK_trade_coupon2` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2)商品表
Field | Type | Comment |
---|---|---|
goods_id | bigint(50) NOT NULL | 主键 |
goods_name | varchar(255) NULL | 商品名称 |
goods_number | int(11) NULL | 商品库存 |
goods_price | decimal(10,2) NULL | 商品价格 |
goods_desc | varchar(255) NULL | 商品描述 |
add_time | timestamp NULL | 添加时间 |
CREATE TABLE `trade_goods` (
`goods_id` bigint(50) NOT NULL AUTO_INCREMENT,
`goods_name` varchar(255) DEFAULT NULL COMMENT '商品名称',
`goods_number` int(11) DEFAULT NULL COMMENT '商品库存',
`goods_price` decimal(10,2) DEFAULT NULL COMMENT '商品价格',
`goods_desc` varchar(255) DEFAULT NULL COMMENT '商品描述',
`add_time` timestamp NULL DEFAULT NULL COMMENT '添加时间',
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=345959443973935105 DEFAULT CHARSET=utf8;
3)订单表
Field | Type | Comment |
---|---|---|
order_id | bigint(50) NOT NULL | 订单ID |
user_id | bigint(50) NULL | 用户ID |
order_status | int(1) NULL | 订单状态 0未确认 1已确认 2已取消 3无效 4退款 |
pay_status | int(1) NULL | 支付状态 0未支付 1支付中 2已支付 |
shipping_status | int(1) NULL | 发货状态 0未发货 1已发货 2已退货 |
address | varchar(255) NULL | 收货地址 |
consignee | varchar(255) NULL | 收货人 |
goods_id | bigint(50) NULL | 商品ID |
goods_number | int(11) NULL | 商品数量 |
goods_price | decimal(10,2) NULL | 商品价格 |
goods_amount | decimal(10,0) NULL | 商品总价 |
shipping_fee | decimal(10,2) NULL | 运费 |
order_amount | decimal(10,2) NULL | 订单价格 |
coupon_id | bigint(50) NULL | 优惠券ID |
coupon_paid | decimal(10,2) NULL | 优惠券 |
money_paid | decimal(10,2) NULL | 已付金额 |
pay_amount | decimal(10,2) NULL | 支付金额 |
add_time | timestamp NULL | 创建时间 |
confirm_time | timestamp NULL | 订单确认时间 |
pay_time | timestamp NULL | 支付时间 |
CREATE TABLE `trade_order` (
`order_id` bigint(50) NOT NULL COMMENT '订单ID',
`user_id` bigint(50) DEFAULT NULL COMMENT '用户ID',
`order_status` int(1) DEFAULT NULL COMMENT '订单状态 0未确认 1已确认 2已取消 3无效 4退款',
`pay_status` int(1) DEFAULT NULL COMMENT '支付状态 0未支付 1支付中 2已支付',
`shipping_status` int(1) DEFAULT NULL COMMENT '发货状态 0未发货 1已发货 2已收货',
`address` varchar(255) DEFAULT NULL COMMENT '收货地址',
`consignee` varchar(255) DEFAULT NULL COMMENT '收货人',
`goods_id` bigint(50) DEFAULT NULL COMMENT '商品ID',
`goods_number` int(11) DEFAULT NULL COMMENT '商品数量',
`goods_price` decimal(10,2) DEFAULT NULL COMMENT '商品价格',
`goods_amount` decimal(10,0) DEFAULT NULL COMMENT '商品总价',
`shipping_fee` decimal(10,2) DEFAULT NULL COMMENT '运费',
`order_amount` decimal(10,2) DEFAULT NULL COMMENT '订单价格',
`coupon_id` bigint(50) DEFAULT NULL COMMENT '优惠券ID',
`coupon_paid` decimal(10,2) DEFAULT NULL COMMENT '优惠券',
`money_paid` decimal(10,2) DEFAULT NULL COMMENT '已付金额',
`pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额',
`add_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`confirm_time` timestamp NULL DEFAULT NULL COMMENT '订单确认时间',
`pay_time` timestamp NULL DEFAULT NULL COMMENT '支付时间',
PRIMARY KEY (`order_id`),
KEY `FK_trade_order` (`user_id`),
KEY `FK_trade_order2` (`goods_id`),
KEY `FK_trade_order3` (`coupon_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4)订单商品日志表
Field | Type | Comment |
---|---|---|
goods_id | int(11) NOT NULL | 商品ID |
order_id | varchar(32) NOT NULL | 订单ID |
goods_number | int(11) NULL | 库存数量 |
log_time | datetime NULL | 记录时间 |
CREATE TABLE `trade_goods_number_log` (
`goods_id` bigint(50) NOT NULL COMMENT '商品ID',
`order_id` bigint(50) NOT NULL COMMENT '订单ID',
`goods_number` int(11) DEFAULT NULL COMMENT '库存数量',
`log_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`goods_id`,`order_id`),
KEY `FK_trade_goods_number_log2` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5)用户表
Field | Type | Comment |
---|---|---|
user_id | bigint(50) NOT NULL | 用户ID |
user_name | varchar(255) NULL | 用户姓名 |
user_password | varchar(255) NULL | 用户密码 |
user_mobile | varchar(255) NULL | 手机号 |
user_score | int(11) NULL | 积分 |
user_reg_time | timestamp NULL | 注册时间 |
user_money | decimal(10,0) NULL | 用户余额 |
CREATE TABLE `trade_user` (
`user_id` bigint(50) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`user_name` varchar(255) DEFAULT NULL COMMENT '用户姓名',
`user_password` varchar(255) DEFAULT NULL COMMENT '用户密码',
`user_mobile` varchar(255) DEFAULT NULL COMMENT '手机号',
`user_score` int(11) DEFAULT NULL COMMENT '积分',
`user_reg_time` timestamp NULL DEFAULT NULL COMMENT '注册时间',
`user_money` decimal(10,0) DEFAULT NULL COMMENT '用户余额',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=345963634385633281 DEFAULT CHARSET=utf8;
6)用户余额日志表
Field | Type | Comment |
---|---|---|
user_id | bigint(50) NOT NULL | 用户ID |
order_id | bigint(50) NOT NULL | 订单ID |
money_log_type | int(1) NOT NULL | 日志类型 1订单付款 2 订单退款 |
use_money | decimal(10,2) NULL | 操作金额 |
create_time | timestamp NULL | 日志时间 |
CREATE TABLE `trade_user_money_log` (
`user_id` bigint(50) NOT NULL COMMENT '用户ID',
`order_id` bigint(50) NOT NULL COMMENT '订单ID',
`money_log_type` int(1) NOT NULL COMMENT '日志类型 1订单付款 2 订单退款',
`use_money` decimal(10,2) DEFAULT NULL,
`create_time` timestamp NULL DEFAULT NULL COMMENT '日志时间',
PRIMARY KEY (`user_id`,`order_id`,`money_log_type`),
KEY `FK_trade_user_money_log2` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7)订单支付表
Field | Type | Comment |
---|---|---|
pay_id | bigint(50) NOT NULL | 支付编号 |
order_id | bigint(50) NULL | 订单编号 |
pay_amount | decimal(10,2) NULL | 支付金额 |
is_paid | int(1) NULL | 是否已支付 1否 2是 |
CREATE TABLE `trade_pay` (
`pay_id` bigint(50) NOT NULL COMMENT '支付编号',
`order_id` bigint(50) DEFAULT NULL COMMENT '订单编号',
`pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额',
`is_paid` int(1) DEFAULT NULL COMMENT '是否已支付 1否 2是',
PRIMARY KEY (`pay_id`),
KEY `FK_trade_pay` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
8)MQ消息生产表
Field | Type | Comment |
---|---|---|
id | varchar(100) NOT NULL | 主键 |
group_name | varchar(100) NULL | 生产者组名 |
msg_topic | varchar(100) NULL | 消息主题 |
msg_tag | varchar(100) NULL | Tag |
msg_key | varchar(100) NULL | Key |
msg_body | varchar(500) NULL | 消息内容 |
msg_status | int(1) NULL | 0:未处理;1:已经处理 |
create_time | timestamp NOT NULL | 记录时间 |
CREATE TABLE `trade_mq_producer_temp` (
`id` varchar(100) NOT NULL,
`group_name` varchar(100) DEFAULT NULL,
`msg_topic` varchar(100) DEFAULT NULL,
`msg_tag` varchar(100) DEFAULT NULL,
`msg_key` varchar(100) DEFAULT NULL,
`msg_body` varchar(500) DEFAULT NULL,
`msg_status` int(1) DEFAULT NULL COMMENT '0:未处理;1:已经处理',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
9)MQ消息消费表
Field | Type | Comment |
---|---|---|
msg_id | varchar(50) NULL | 消息ID |
group_name | varchar(100) NOT NULL | 消费者组名 |
msg_tag | varchar(100) NOT NULL | Tag |
msg_key | varchar(100) NOT NULL | Key |
msg_body | varchar(500) NULL | 消息体 |
consumer_status | int(1) NULL | 0:正在处理;1:处理成功;2:处理失败 |
consumer_times | int(1) NULL | 消费次数 |
consumer_timestamp | timestamp NULL | 消费时间 |
remark | varchar(500) NULL | 备注 |
CREATE TABLE `trade_mq_consumer_log` (
`msg_id` varchar(50) DEFAULT NULL,
`group_name` varchar(100) NOT NULL,
`msg_tag` varchar(100) NOT NULL,
`msg_key` varchar(100) NOT NULL,
`msg_body` varchar(500) DEFAULT NULL,
`consumer_status` int(1) DEFAULT NULL COMMENT '0:正在处理;1:处理成功;2:处理失败',
`consumer_times` int(1) DEFAULT NULL,
`consumer_timestamp` timestamp NULL DEFAULT NULL,
`remark` varchar(500) DEFAULT NULL,
PRIMARY KEY (`group_name`,`msg_tag`,`msg_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
10) .sql导入
/*
SQLyog Ultimate v8.32
MySQL - 5.5.49 : Database - shop_project
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`shop_project` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `shop_project`;
/*Table structure for table `trade_coupon` */
DROP TABLE IF EXISTS `trade_coupon`;
CREATE TABLE `trade_coupon` (
`coupon_id` bigint(50) NOT NULL COMMENT '优惠券ID',
`coupon_price` decimal(10,2) DEFAULT NULL COMMENT '优惠券金额',
`user_id` bigint(50) DEFAULT NULL COMMENT '用户ID',
`order_id` bigint(32) DEFAULT NULL COMMENT '订单ID',
`is_used` int(1) DEFAULT NULL COMMENT '是否使用 0未使用 1已使用',
`used_time` timestamp NULL DEFAULT NULL COMMENT '使用时间',
PRIMARY KEY (`coupon_id`),
KEY `FK_trade_coupon` (`user_id`),
KEY `FK_trade_coupon2` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `trade_coupon` */
/*Table structure for table `trade_goods` */
DROP TABLE IF EXISTS `trade_goods`;
CREATE TABLE `trade_goods` (
`goods_id` bigint(50) NOT NULL AUTO_INCREMENT,
`goods_name` varchar(255) DEFAULT NULL COMMENT '商品名称',
`goods_number` int(11) DEFAULT NULL COMMENT '商品库存',
`goods_price` decimal(10,2) DEFAULT NULL COMMENT '商品价格',
`goods_desc` varchar(255) DEFAULT NULL COMMENT '商品描述',
`add_time` timestamp NULL DEFAULT NULL COMMENT '添加时间',
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=345959443973935105 DEFAULT CHARSET=utf8;
/*Data for the table `trade_goods` */
insert into `trade_goods`(`goods_id`,`goods_name`,`goods_number`,`goods_price`,`goods_desc`,`add_time`) values (345959443973935104,'华为P30',999,'5000.00','夜间拍照更美','2019-07-09 20:38:00');
/*Table structure for table `trade_goods_number_log` */
DROP TABLE IF EXISTS `trade_goods_number_log`;
CREATE TABLE `trade_goods_number_log` (
`goods_id` bigint(50) NOT NULL COMMENT '商品ID',
`order_id` bigint(50) NOT NULL COMMENT '订单ID',
`goods_number` int(11) DEFAULT NULL COMMENT '库存数量',
`log_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`goods_id`,`order_id`),
KEY `FK_trade_goods_number_log2` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `trade_goods_number_log` */
/*Table structure for table `trade_mq_consumer_log` */
DROP TABLE IF EXISTS `trade_mq_consumer_log`;
CREATE TABLE `trade_mq_consumer_log` (
`msg_id` varchar(50) DEFAULT NULL,
`group_name` varchar(100) NOT NULL,
`msg_tag` varchar(100) NOT NULL,
`msg_key` varchar(100) NOT NULL,
`msg_body` varchar(500) DEFAULT NULL,
`consumer_status` int(1) DEFAULT NULL COMMENT '0:正在处理;1:处理成功;2:处理失败',
`consumer_times` int(1) DEFAULT NULL,
`consumer_timestamp` timestamp NULL DEFAULT NULL,
`remark` varchar(500) DEFAULT NULL,
PRIMARY KEY (`group_name`,`msg_tag`,`msg_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `trade_mq_consumer_log` */
/*Table structure for table `trade_mq_producer_temp` */
DROP TABLE IF EXISTS `trade_mq_producer_temp`;
CREATE TABLE `trade_mq_producer_temp` (
`id` varchar(100) NOT NULL,
`group_name` varchar(100) DEFAULT NULL,
`msg_topic` varchar(100) DEFAULT NULL,
`msg_tag` varchar(100) DEFAULT NULL,
`msg_key` varchar(100) DEFAULT NULL,
`msg_body` varchar(500) DEFAULT NULL,
`msg_status` int(1) DEFAULT NULL COMMENT '0:未处理;1:已经处理',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `trade_mq_producer_temp` */
/*Table structure for table `trade_order` */
DROP TABLE IF EXISTS `trade_order`;
CREATE TABLE `trade_order` (
`order_id` bigint(50) NOT NULL COMMENT '订单ID',
`user_id` bigint(50) DEFAULT NULL COMMENT '用户ID',
`order_status` int(1) DEFAULT NULL COMMENT '订单状态 0未确认 1已确认 2已取消 3无效 4退款',
`pay_status` int(1) DEFAULT NULL COMMENT '支付状态 0未支付 1支付中 2已支付',
`shipping_status` int(1) DEFAULT NULL COMMENT '发货状态 0未发货 1已发货 2已收货',
`address` varchar(255) DEFAULT NULL COMMENT '收货地址',
`consignee` varchar(255) DEFAULT NULL COMMENT '收货人',
`goods_id` bigint(50) DEFAULT NULL COMMENT '商品ID',
`goods_number` int(11) DEFAULT NULL COMMENT '商品数量',
`goods_price` decimal(10,2) DEFAULT NULL COMMENT '商品价格',
`goods_amount` decimal(10,0) DEFAULT NULL COMMENT '商品总价',
`shipping_fee` decimal(10,2) DEFAULT NULL COMMENT '运费',
`order_amount` decimal(10,2) DEFAULT NULL COMMENT '订单价格',
`coupon_id` bigint(50) DEFAULT NULL COMMENT '优惠券ID',
`coupon_paid` decimal(10,2) DEFAULT NULL COMMENT '优惠券',
`money_paid` decimal(10,2) DEFAULT NULL COMMENT '已付金额',
`pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额',
`add_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`confirm_time` timestamp NULL DEFAULT NULL COMMENT '订单确认时间',
`pay_time` timestamp NULL DEFAULT NULL COMMENT '支付时间',
PRIMARY KEY (`order_id`),
KEY `FK_trade_order` (`user_id`),
KEY `FK_trade_order2` (`goods_id`),
KEY `FK_trade_order3` (`coupon_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `trade_order` */
/*Table structure for table `trade_pay` */
DROP TABLE IF EXISTS `trade_pay`;
CREATE TABLE `trade_pay` (
`pay_id` bigint(50) NOT NULL COMMENT '支付编号',
`order_id` bigint(50) DEFAULT NULL COMMENT '订单编号',
`pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额',
`is_paid` int(1) DEFAULT NULL COMMENT '是否已支付 1否 2是',
PRIMARY KEY (`pay_id`),
KEY `FK_trade_pay` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `trade_pay` */
/*Table structure for table `trade_user` */
DROP TABLE IF EXISTS `trade_user`;
CREATE TABLE `trade_user` (
`user_id` bigint(50) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`user_name` varchar(255) DEFAULT NULL COMMENT '用户姓名',
`user_password` varchar(255) DEFAULT NULL COMMENT '用户密码',
`user_mobile` varchar(255) DEFAULT NULL COMMENT '手机号',
`user_score` int(11) DEFAULT NULL COMMENT '积分',
`user_reg_time` timestamp NULL DEFAULT NULL COMMENT '注册时间',
`user_money` decimal(10,0) DEFAULT NULL COMMENT '用户余额',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=345963634385633281 DEFAULT CHARSET=utf8;
/*Data for the table `trade_user` */
insert into `trade_user`(`user_id`,`user_name`,`user_password`,`user_mobile`,`user_score`,`user_reg_time`,`user_money`) values (345963634385633280,'刘备','123L','18888888888L',100,'2019-07-09 13:37:03','900');
/*Table structure for table `trade_user_money_log` */
DROP TABLE IF EXISTS `trade_user_money_log`;
CREATE TABLE `trade_user_money_log` (
`user_id` bigint(50) NOT NULL COMMENT '用户ID',
`order_id` bigint(50) NOT NULL COMMENT '订单ID',
`money_log_type` int(1) NOT NULL COMMENT '日志类型 1订单付款 2 订单退款',
`use_money` decimal(10,2) DEFAULT NULL,
`create_time` timestamp NULL DEFAULT NULL COMMENT '日志时间',
PRIMARY KEY (`user_id`,`order_id`,`money_log_type`),
KEY `FK_trade_user_money_log2` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `trade_user_money_log` */
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
2 初始化项目
2.1 工程概览
-
pom
- 父工程:shop-parent
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.irun2u</groupId> <artifactId>shop-parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <properties> <rocketmq-spring-boot-starter-version>2.0.3</rocketmq-spring-boot-starter-version> </properties> <dependencies> <!--dubbo--> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!--spring-boot-stater--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <artifactId>log4j-to-slf4j</artifactId> <groupId>org.apache.logging.log4j</groupId> </exclusion> </exclusions> </dependency> <!--zookeeper--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.10</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <!--Test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!--RocketMQ--> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>${rocketmq-spring-boot-starter-version}</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.6</version> </dependency> </dependencies> <modules> <module>../shop-order-web</module> <module>../shop-coupon-service</module> <module>../shop-user-service</module> <module>../shop-order-service</module> <module>../shop-pay-web</module> <module>../shop-pojo</module> <module>../shop-common</module> <module>../shop-api</module> <module>../shop-goods-service</module> <module>../shop-pay-service</module> </modules> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <target>1.8</target> <source>1.8</source> </configuration> </plugin> </plugins> </build> </project>
-
jar
- 实体类:shop-pojo
- 接口层:shop-api
- 工具工程:shop-common
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.irun2u</groupId> <artifactId>shop-common</artifactId> <version>1.0-SNAPSHOT</version> <parent> <artifactId>shop-parent</artifactId> <groupId>com.irun2u</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../shop-parent/pom.xml</relativePath> </parent> </project>
-
war
- 订单系统:shop-order-web
- 支付系统:shop-pay-web
- 优惠券服务:shop-coupon-service
- 订单服务:shop-order-service
- 支付服务:shop-pay-service
- 商品服务:shop-goods-service
- 用户服务:shop-user-service
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.irun2u</groupId>
<artifactId>shop-order-service</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<artifactId>shop-parent</artifactId>
<groupId>com.irun2u</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../shop-parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.irun2u</groupId>
<artifactId>shop-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.irun2u</groupId>
<artifactId>shop-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.irun2u</groupId>
<artifactId>shop-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--mybatis-springboot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.irun2u</groupId>
<artifactId>shop-order-web</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<artifactId>shop-parent</artifactId>
<groupId>com.irun2u</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../shop-parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.irun2u</groupId>
<artifactId>shop-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.irun2u</groupId>
<artifactId>shop-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--spring-webmvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
2.2 实例项目导入
2.3 服务关系
3 MyBatis逆向工程
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/shop_project"
userId="root"
password="root">
</jdbcConnection>
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="yycg"
password="yycg">
</jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.itheima.shop.pojo"
targetProject="D:\Workspace-java\idea\Workspaces\Mybatis-Reverse\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.itheima.shop.mapper"
targetProject="D:\Workspace-java\idea\Workspaces\Mybatis-Reverse\src\main\resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.itheima.shop.mapper"
targetProject="D:\Workspace-java\idea\Workspaces\Mybatis-Reverse\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table schema="" tableName="trade_coupon"></table>
<table schema="" tableName="trade_goods"></table>
<table schema="" tableName="trade_goods_number_log"></table>
<table schema="" tableName="trade_order"></table>
<table schema="" tableName="trade_pay"></table>
<table schema="" tableName="trade_user"></table>
<table schema="" tableName="trade_user_money_log"></table>
<table schema="" tableName="trade_mq_consumer_log"></table>
<table schema="" tableName="trade_mq_producer_temp"></table>
<!-- 有些表的字段需要指定java类型
<table schema="" tableName="">
<columnOverride column="" javaType="" />
</table> -->
</context>
</generatorConfiguration>
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class GeneratorSqlmap {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("D:\\Workspace-java\\idea\\Workspaces\\Mybatis-Reverse\\src\\main\\resources\\generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
public static void main(String[] args) throws Exception {
try {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用Mybatis逆向工程针对数据表生成CURD持久层代码
将实体类剪切到shop-pojo工程
在服务层工程中导入对应的Mapper类和对应配置文件
例如:
4 公共类
4.1 ID生成器
IDWorker:Twitter雪花算法
package com.irun2u.utils;
/**
* @Author: haifei
* @Date: 2022/11/24 15:50
*/
public class IDWorker {
/**
* 起始的时间戳
*/
private final static long START_STMP = 1480166465631L;
/**
* 每一部分占用的位数
*/
private final static long SEQUENCE_BIT = 12; //序列号占用的位数
private final static long MACHINE_BIT = 5; //机器标识占用的位数
private final static long DATACENTER_BIT = 5;//数据中心占用的位数
/**
* 每一部分的最大值
*/
private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
/**
* 每一部分向左的位移
*/
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
private long datacenterId; //数据中心
private long machineId; //机器标识
private long sequence = 0L; //序列号
private long lastStmp = -1L;//上一次时间戳
public IDWorker(long datacenterId, long machineId) {
if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
}
if (machineId > MAX_MACHINE_NUM || machineId < 0) {
throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
}
this.datacenterId = datacenterId;
this.machineId = machineId;
}
/**
* 产生下一个ID
*
* @return
*/
public synchronized long nextId() {
long currStmp = getNewstmp();
if (currStmp < lastStmp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
}
if (currStmp == lastStmp) {
//相同毫秒内,序列号自增
sequence = (sequence + 1) & MAX_SEQUENCE;
//同一毫秒的序列数已经达到最大
if (sequence == 0L) {
currStmp = getNextMill();
}
} else {
//不同毫秒内,序列号置为0
sequence = 0L;
}
lastStmp = currStmp;
return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分
| datacenterId << DATACENTER_LEFT //数据中心部分
| machineId << MACHINE_LEFT //机器标识部分
| sequence; //序列号部分
}
private long getNextMill() {
long mill = getNewstmp();
while (mill <= lastStmp) {
mill = getNewstmp();
}
return mill;
}
private long getNewstmp() {
return System.currentTimeMillis();
}
public static void main(String[] args) {
IDWorker idWorker = new IDWorker(2, 3);
for (int i = 0; i < 10; i++) {
System.out.println(idWorker.nextId());
}
/**
* 793158251691913216
* 793158251691913217
* 793158251691913218
* 793158251691913219
* 793158251691913220
* 793158251691913221
* 793158251691913222
* 793158251691913223
* 793158251691913224
* 793158251691913225
*/
}
}
4.2 异常处理类
CustomerException:自定义异常类
CastException:异常抛出类
package com.irun2u.exception;
/**
* @Author: haifei
* @Date: 2022/11/24 15:50
*/
import com.irun2u.constant.ShopCode;
import lombok.extern.slf4j.Slf4j;
/**
* 异常抛出类
*/
@Slf4j
public class CastException {
public static void cast(ShopCode shopCode) {
log.error(shopCode.toString());
throw new CustomerException(shopCode);
}
}
package com.irun2u.exception;
/**
* @Author: haifei
* @Date: 2022/11/24 15:51
*/
import com.irun2u.constant.ShopCode;
/**
* 自定义异常
*/
public class CustomerException extends RuntimeException{
private ShopCode shopCode;
public CustomerException(ShopCode shopCode) {
this.shopCode = shopCode;
}
}
4.3 常量类
ShopCode:系统状态类
package com.irun2u.constant;
/**
* @Author: haifei
* @Date: 2022/11/24 15:49
*/
public enum ShopCode {
//正确
SHOP_SUCCESS(true, 1, "正确"),
//错误
SHOP_FAIL(false, 0, "错误"),
//付款
SHOP_USER_MONEY_PAID(true, 1, "付款"),
//退款
SHOP_USER_MONEY_REFUND(true, 2, "退款"),
//订单未确认
SHOP_ORDER_NO_CONFIRM(false, 0, "订单未确认"),
//订单已确认
SHOP_ORDER_CONFIRM(true, 1, "订单已经确认"),
//订单已取消
SHOP_ORDER_CANCEL(false, 2, "订单已取消"),
//订单已取消
SHOP_ORDER_INVALID(false, 3, "订单无效"),
//订单已取消
SHOP_ORDER_RETURNED(false, 4, "订单已退货"),
//订单已付款
SHOP_ORDER_PAY_STATUS_NO_PAY(true,0,"订单未付款"),
//订单已付款
SHOP_ORDER_PAY_STATUS_PAYING(true,1,"订单正在付款"),
//订单已付款
SHOP_ORDER_PAY_STATUS_IS_PAY(true,2,"订单已付款"),
//消息正在处理
SHOP_MQ_MESSAGE_STATUS_PROCESSING(true, 0, "消息正在处理"),
//消息处理成功
SHOP_MQ_MESSAGE_STATUS_SUCCESS(true, 1, "消息处理成功"),
//消息处理失败
SHOP_MQ_MESSAGE_STATUS_FAIL(false, 2, "消息处理失败"),
//请求参数有误
SHOP_REQUEST_PARAMETER_VALID(false, -1, "请求参数有误"),
//优惠券已经使用
SHOP_COUPON_ISUSED(true, 1, "优惠券已经使用"),
//优惠券未使用
SHOP_COUPON_UNUSED(false, 0, "优惠券未使用"),
//快递运费不正确
SHOP_ORDER_STATUS_UPDATE_FAIL(false, 10001, "订单状态修改失败"),
//快递运费不正确
SHOP_ORDER_SHIPPINGFEE_INVALID(false, 10002, "订单运费不正确"),
//订单总价格不合法
SHOP_ORDERAMOUNT_INVALID(false, 10003, "订单总价格不正确"),
//订单保存失败
SHOP_ORDER_SAVE_ERROR(false, 10004, "订单保存失败"),
//订单确认失败
SHOP_ORDER_CONFIRM_FAIL(false, 10005, "订单确认失败"),
//商品不存在
SHOP_GOODS_NO_EXIST(false, 20001, "商品不存在"),
//订单价格非法
SHOP_GOODS_PRICE_INVALID(false, 20002, "商品价格非法"),
//商品库存不足
SHOP_GOODS_NUM_NOT_ENOUGH(false, 20003, "商品库存不足"),
//扣减库存失败
SHOP_REDUCE_GOODS_NUM_FAIL(false, 20004, "扣减库存失败"),
//库存记录为空
SHOP_REDUCE_GOODS_NUM_EMPTY(false, 20005, "扣减库存失败"),
//用户账号不能为空
SHOP_USER_IS_NULL(false, 30001, "用户账号不能为空"),
//用户信息不存在
SHOP_USER_NO_EXIST(false, 30002, "用户不存在"),
//余额扣减失败
SHOP_USER_MONEY_REDUCE_FAIL(false, 30003, "余额扣减失败"),
//已经退款
SHOP_USER_MONEY_REFUND_ALREADY(true, 30004, "订单已经退过款"),
//优惠券不不存在
SHOP_COUPON_NO_EXIST(false, 40001, "优惠券不存在"),
//优惠券不合法
SHOP_COUPON_INVALIED(false, 40002, "优惠券不合法"),
//优惠券使用失败
SHOP_COUPON_USE_FAIL(false, 40003, "优惠券使用失败"),
//余额不能小于0
SHOP_MONEY_PAID_LESS_ZERO(false, 50001, "余额不能小于0"),
//余额非法
SHOP_MONEY_PAID_INVALID(false, 50002, "余额非法"),
//Topic不能为空
SHOP_MQ_TOPIC_IS_EMPTY(false, 60001, "Topic不能为空"),
//消息体不能为空
SHOP_MQ_MESSAGE_BODY_IS_EMPTY(false, 60002, "消息体不能为空"),
//消息发送失败
SHOP_MQ_SEND_MESSAGE_FAIL(false,60003,"消息发送失败"),
//支付订单未找到
SHOP_PAYMENT_NOT_FOUND(false,70001,"支付订单未找到"),
//支付订单已支付
SHOP_PAYMENT_IS_PAID(false,70002,"支付订单已支付"),
//订单付款失败
SHOP_PAYMENT_PAY_ERROR(false,70002,"订单支付失败");
Boolean success;
Integer code;
String message;
ShopCode() {
}
ShopCode(Boolean success, Integer code, String message) {
this.success = success;
this.code = code;
this.message = message;
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "ShopCode{" +
"success=" + success +
", code=" + code +
", message='" + message + '\'' +
'}';
}
}
4.4 响应实体类
Result:封装响应状态和响应信息
package com.irun2u.entity;
/**
* @Author: haifei
* @Date: 2022/11/24 15:52
*/
import java.io.Serializable;
/**
* 结果实体类
*/
public class Result implements Serializable {
private Boolean success;
private String message;
public Result() {
}
public Result(Boolean success, String message) {
this.success = success;
this.message = message;
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "Result{" +
"success=" + success +
", message='" + message + '\'' +
'}';
}
}