云商城--业务+架构学习和环境准备

云商城业务+架构学习和环境准备

B2B:Business to Business,交易双方的身份都是商家,也就是商家将商品卖给商家,类似采购、批发类购物,国内代表性网站阿里巴巴批发网

C2C:Customer to Customer,交易双方都可以是个人,比如淘宝网

O2O:Online To Offline,线上线下模式,典型的代表饿了么,在线上支付了,在线下获取商品

B2B2C:大型的电商平台,允许商家入驻,允许会员在平台买卖商品,京东和天猫都属于这类型网站

1.云商城业务场景

1.1 业务学习

​ 云商城是基于SpringCloud Alibaba技术栈研发的B2C电商平台,平台拥有核心的电商业务功能。运营商在后台管理商品,前台能通过搜索引擎实时搜索到最新商品,用户注册后可以直接在平台购买商品,并通过微信支付实现线上支付。用户还能参与平台秒杀抢购,并实现线上支付秒杀商品

1.2 功能学习

1.商品管理

在这里插入图片描述

2.商城首页

在这里插入图片描述

3.海量商品实时搜索

在这里插入图片描述

4.商品及时秒杀

在这里插入图片描述

5.购物车管理

在这里插入图片描述

6.在线微信支付

在这里插入图片描述

2.商城架构设计

在这里插入图片描述

云商城采用了微服务技术架构,采用了当前主流的SpringCloud Alibaba技术栈,从接入层、网关层、服务层、数据同步、服务治理、数据处理、第三方接口多个方面进行了精心设计

具体流程:LVS四层负载,抗压能力更强(LVS一般能到达400万并发),然后lvs会把请求路由给nginx七层负载(抗压能力能达到5万)经过了nginx,然后通过网关gateway(路由、限流、鉴权),然后路由到不同的服务(取决于我们的业务),利用分布式事务解决数据不一致性问题,涉及到的数据库包括MySQL、redis、es

在这里插入图片描述

3.云商城表结构

在这里插入图片描述

3.1 商品数据库

品牌表:brand

CREATE TABLE `brand` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '品牌id',`name` varchar(100) NOT NULL COMMENT '品牌名称',`image` varchar(1000) DEFAULT '' COMMENT '品牌图片地址',`initial` varchar(1) DEFAULT '' COMMENT '品牌的首字母',`sort` int(11) DEFAULT NULL COMMENT '排序',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=325475 DEFAULT CHARSET=utf8 COMMENT='品牌表';

商品分类表:category

CREATE TABLE `category` (`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID',`name` varchar(50) DEFAULT NULL COMMENT '分类名称',`sort` int(11) DEFAULT NULL COMMENT '排序',`parent_id` int(20) DEFAULT NULL COMMENT '上级ID',#这个parent_id就是id,自己查自己,自关联表PRIMARY KEY (`id`),KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11177 DEFAULT CHARSET=utf8 COMMENT='商品类目';

品牌分类关联表:category_brand

CREATE TABLE `category_brand` (`category_id` int(11) NOT NULL COMMENT '分类ID',`brand_id` int(11) NOT NULL COMMENT '品牌ID',PRIMARY KEY (`brand_id`,`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

商品属性表:sku_attribute

CREATE TABLE `sku_attribute` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',`name` varchar(50) DEFAULT NULL COMMENT '属性名称',`options` varchar(2000) DEFAULT NULL COMMENT '属性选项',`sort` int(11) DEFAULT NULL COMMENT '排序',`category_id` varchar(100) DEFAULT NULL COMMENT '分类ID集合',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=140 DEFAULT CHARSET=utf8;

商品SPU表:spu

CREATE TABLE `spu` (`id` varchar(60) NOT NULL COMMENT '主键',`name` varchar(100) DEFAULT NULL COMMENT 'SPU名',`intro` varchar(200) DEFAULT NULL COMMENT '商品简介',`brand_id` int(11) DEFAULT NULL COMMENT '品牌ID',`category_one_id` int(20) DEFAULT NULL COMMENT '一级分类',`category_two_id` int(10) DEFAULT NULL COMMENT '二级分类',`category_three_id` int(10) DEFAULT NULL COMMENT '三级分类',`images` varchar(1000) DEFAULT NULL COMMENT '图片列表',`after_sales_service` varchar(50) DEFAULT NULL COMMENT '售后服务',`content` longtext COMMENT '介绍',`attribute_list` varchar(3000) DEFAULT NULL COMMENT '规格列表',`is_marketable` int(1) DEFAULT '0' COMMENT '是否上架,0已下架,1已上架',`is_delete` int(1) DEFAULT '0' COMMENT '是否删除,0:未删除,1:已删除',`status` int(1) DEFAULT '0' COMMENT '审核状态,0:未审核,1:已审核,2:审核不通过',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

商品SKU表:sku

CREATE TABLE `sku` (`id` varchar(60) NOT NULL COMMENT '商品id',`name` varchar(200) NOT NULL COMMENT 'SKU名称',`price` int(20) NOT NULL DEFAULT '1' COMMENT '价格(分)',`num` int(10) DEFAULT '100' COMMENT '库存数量',`image` varchar(200) DEFAULT NULL COMMENT '商品图片',`images` varchar(2000) DEFAULT NULL COMMENT '商品图片列表',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`spu_id` varchar(60) DEFAULT NULL COMMENT 'SPUID',`category_id` int(10) DEFAULT NULL COMMENT '类目ID',`category_name` varchar(200) DEFAULT NULL COMMENT '类目名称',`brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名称',`sku_attribute` varchar(200) DEFAULT NULL COMMENT '规格',`status` int(1) DEFAULT '1' COMMENT '商品状态 1-正常,2-下架,3-删除',PRIMARY KEY (`id`),KEY `cid` (`category_id`),KEY `status` (`status`),KEY `updated` (`update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

3.2 订单数据库

订单表:order

CREATE TABLE `order` (`id` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '订单id',`total_num` int(11) DEFAULT NULL COMMENT '数量合计',`moneys` int(11) DEFAULT NULL COMMENT '金额合计',`pay_type` varchar(1) COLLATE utf8_bin DEFAULT NULL COMMENT '支付类型,1、在线支付、0 货到付款',`create_time` datetime DEFAULT NULL COMMENT '订单创建时间',`update_time` datetime DEFAULT NULL COMMENT '订单更新时间',`pay_time` datetime DEFAULT NULL COMMENT '付款时间',`consign_time` datetime DEFAULT NULL COMMENT '发货时间',`end_time` datetime DEFAULT NULL COMMENT '交易完成时间',`username` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '用户名称',`recipients` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人',`recipients_mobile` varchar(12) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人手机',`recipients_address` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人地址',`weixin_transaction_id` varchar(30) COLLATE utf8_bin DEFAULT NULL COMMENT '交易流水号',`order_status` int(1) COLLATE utf8_bin DEFAULT NULL COMMENT '订单状态,0:未完成,1:已完成,2:已退货',`pay_status` int(1) COLLATE utf8_bin DEFAULT NULL COMMENT '支付状态,0:未支付,1:已支付,2:支付失败',`is_delete` int(1) COLLATE utf8_bin DEFAULT NULL COMMENT '是否删除',PRIMARY KEY (`id`),KEY `create_time` (`create_time`),KEY `status` (`order_status`),KEY `payment_type` (`pay_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

订单明细表:order_sku

CREATE TABLE `order_sku` (`id` varchar(50) COLLATE utf8_bin NOT NULL COMMENT 'ID',`category_one_id` int(11) DEFAULT NULL COMMENT '1级分类',`category_two_id` int(11) DEFAULT NULL COMMENT '2级分类',`category_three_id` int(11) DEFAULT NULL COMMENT '3级分类',`spu_id` varchar(60) COLLATE utf8_bin DEFAULT NULL COMMENT 'SPU_ID',`sku_id` varchar(60) COLLATE utf8_bin DEFAULT NULL COMMENT 'SKU_ID',`order_id` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '订单ID',`name` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '商品名称',`price` int(20) DEFAULT NULL COMMENT '单价',`num` int(10) DEFAULT NULL COMMENT '数量',`money` int(20) DEFAULT NULL COMMENT '总金额',`image` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '图片地址',PRIMARY KEY (`id`),KEY `item_id` (`sku_id`),KEY `order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

3.3 秒杀数据库

秒杀商品表:seckill_goods

CREATE TABLE `seckill_goods` (`id` varchar(60) NOT NULL,`sup_id` varchar(60) DEFAULT NULL COMMENT 'spu ID',`sku_id` varchar(60) DEFAULT NULL COMMENT 'sku ID',`name` varchar(100) DEFAULT NULL COMMENT '标题',`images` varchar(150) DEFAULT NULL COMMENT '商品图片',`price` int(20) DEFAULT NULL COMMENT '原价格',`seckill_price` double(20,0) DEFAULT NULL COMMENT '秒杀价格',`create_time` datetime DEFAULT NULL COMMENT '添加日期',`start_time` datetime DEFAULT NULL COMMENT '开始时间',`end_time` datetime DEFAULT NULL COMMENT '结束时间',`num` int(11) DEFAULT NULL COMMENT '秒杀商品数',`store_count` int(11) DEFAULT NULL COMMENT '剩余库存数',`content` varchar(2000) DEFAULT NULL COMMENT '描述',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

秒杀订单表:seckill_order

CREATE TABLE `seckill_order` (`id` varchar(60) NOT NULL COMMENT '主键',`seckill_goods_id` varchar(60) DEFAULT NULL COMMENT '秒杀商品ID',`money` int(10) DEFAULT NULL COMMENT '支付金额',`username` varchar(50) DEFAULT NULL COMMENT '用户',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`pay_time` datetime DEFAULT NULL COMMENT '支付时间',`status` int(1) DEFAULT NULL COMMENT '状态,0未支付,1已支付',`weixin_transaction_id` varchar(30) DEFAULT NULL COMMENT '交易流水',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.4 用户数据库

省份表:provinces

CREATE TABLE `provinces` (`provinceid` varchar(20) NOT NULL COMMENT '省份ID',`province` varchar(50) NOT NULL COMMENT '省份名称',PRIMARY KEY (`provinceid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='省份信息表';

城市表:cities

CREATE TABLE `cities` (`cityid` varchar(20) NOT NULL COMMENT '城市ID',`city` varchar(50) NOT NULL COMMENT '城市名称',`provinceid` varchar(20) NOT NULL COMMENT '省份ID',PRIMARY KEY (`cityid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='行政区域地州市信息表';

区域表:areas

CREATE TABLE `areas` (`areaid` varchar(20) NOT NULL COMMENT '区域ID',`area` varchar(50) NOT NULL COMMENT '区域名称',`cityid` varchar(20) NOT NULL COMMENT '城市ID',PRIMARY KEY (`areaid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='行政区域县区信息表';

收件信息表:address

CREATE TABLE `address` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) DEFAULT NULL COMMENT '用户名',`provinceid` varchar(20) DEFAULT NULL COMMENT '省',`cityid` varchar(20) DEFAULT NULL COMMENT '市',`areaid` varchar(20) DEFAULT NULL COMMENT '县/区',`phone` varchar(20) DEFAULT NULL COMMENT '电话',`address` varchar(200) DEFAULT NULL COMMENT '详细地址',`contact` varchar(50) DEFAULT NULL COMMENT '联系人',`is_default` int(1) DEFAULT NULL COMMENT '是否是默认 1默认 0否',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8;

4.工程搭建

4.1 环境准备

在这里插入图片描述

这里需要用到数据库MySQL和注册中心Nacos,数据库和注册中心全部已经安装在了虚拟机中.

虚拟机ip:192.168.100.130虚拟机账号:root账号密码:pcb数据库账号:root数据库密码:123456Nacos   url   http://192.168.100.130:8848/nacos账号:nacos密码:nacos

基于Docker安装Nacos:

docker run -d -p 8848:8848 -e MODE=standalone -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /opt/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server

安装好了后,访问http://192.168.100.130:8848/nacos 账号密码都是nacos

基于Docker安装MySQL:

docker run -di --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

4.2 工程结构分析

在这里插入图片描述

4.3 公共工程搭建

4.3.1 父工程搭建(顶级)

工程坐标:

<groupId>com.gupaoedu.vip.mall</groupId>
<artifactId>gupaoedu-vip-mall</artifactId>
<version>0.0.1-SNAPSHOT</version>

我们选择用Spring Initializr创建父工程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择需要的应用场景

在这里插入图片描述

整理下pom.xml,在pom.xml中只留部分包,其他包是创建微服务时需要(所有模块都要用的包)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.10.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.gupaoedu.vip.mall</groupId><artifactId>gupaoedu-vip-mall</artifactId><version>0.0.1-SNAPSHOT</version><name>gupaoedu-vip-mall</name><!--父工程--><packaging>pom</packaging><description>云商城</description><properties><java.version>1.8</java.version><spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version></properties><dependencies><!--lombok,方便创建Bean对象和日志操作--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--Test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--热部署插件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency></dependencies><dependencyManagement><dependencies><!--alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
4.3.2 子项目父工程创建

我们可以按照功能分类,给每类工程创建一个父工程,方便管理(建maven模块)

mall-api:存储所有数据库表对应的Bean和Feign接口
mall-gateway:存储所有微服务网关
mall-service:存储所有微服务工程
mall-util:存储公共工程
mall-web:存储所有和页面渲染有关的工程

mall-api的pom.xml:

<?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"><parent><artifactId>gupaoedu-vip-mall</artifactId><groupId>com.gupaoedu.vip.mall</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><artifactId>mall-api</artifactId><description>存放所有JavaBean和Feign接口</description>
</project>

mall-gateway的pom.xml:

<?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"><parent><artifactId>gupaoedu-vip-mall</artifactId><groupId>com.gupaoedu.vip.mall</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><artifactId>mall-gateway</artifactId><description>存放微服网关集群</description></project>

mall-service的pom.xml:

<?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"><parent><artifactId>gupaoedu-vip-mall</artifactId><groupId>com.gupaoedu.vip.mall</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><artifactId>mall-service</artifactId><description>所有的应用服务</description>
</project>

mall-util的pom.xml:

<?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"><parent><artifactId>gupaoedu-vip-mall</artifactId><groupId>com.gupaoedu.vip.mall</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><artifactId>mall-util</artifactId><description>存放所有公共工程</description>
</project>

mall-web的pom.xml:

<?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"><parent><artifactId>gupaoedu-vip-mall</artifactId><groupId>com.gupaoedu.vip.mall</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><artifactId>mall-web</artifactId><description>存放所有和页面渲染有关的工程,不建议放在service中,所有service只提供基于RESTful的服务</description>
</project>
4.3.3 公共工程创建

在这里插入图片描述

4.3.3.1 公共依赖汇总

service中以后要创建微服务工程操作数据库,我们可以把所有service需要用到的包以及所有service需要初始化的对象放到一个独立的工程中,以后哪个工程要用,直接依赖即可。

mall-util中创建mall-service-dependency,pom.xml依赖如下:

<?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"><parent><artifactId>mall-util</artifactId><groupId>com.gupaoedu.vip.mall</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>mall-service-dependency</artifactId><description>所有service工程依赖的包汇总以及初始化工具包</description><dependencies><!--web包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--MyBatis Plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.2</version></dependency><!--MySQL--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--Nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>
</project>
4.3.3.2 公共工具包

我们需要用到的工具包也可以单独放到一个工程中,每次要用,直接依赖即可

mall-util中创建mall-common,我们在工程中创建2个对象:

用于指定响应状态码的枚举对象:com.gupaoedu.mall.util.RespCode

public enum RespCode {SUCCESS(200, "操作成功"),ERROR(500, "操作失败"),SYSTEM_ERROR(501, "系统错误");private Integer code;private String message;RespCode(Integer code, String message) {this.code = code;this.message = message;}RespCode() {}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;}
}

用于响应用户信息封装的对象:com.gupaoedu.mall.util.RespResult

public class RespResult<T> implements Serializable {//响应数据结果集private T data;/*** 状态码* 200 操作成功* 500 操作失败*/private Integer code;/**** 响应信息*/private String message;public RespResult() {}public RespResult(RespCode resultCode) {this.code = resultCode.getCode();this.message = resultCode.getMessage();}public RespResult(T data, RespCode resultCode) {this.data = data;this.code = resultCode.getCode();this.message = resultCode.getMessage();}public static RespResult ok() {return new RespResult(null, RespCode.SUCCESS);}public static RespResult ok(Object data) {return new RespResult(data, RespCode.SUCCESS);}public static RespResult error() {return new RespResult(null, RespCode.ERROR);}public static RespResult error(String message) {return secByError(RespCode.ERROR.getCode(),message);}//自定义异常public static RespResult secByError(Integer code,String message) {RespResult err = new RespResult();err.setCode(code);err.setMessage(message);return err;}public static RespResult error(RespCode resultCode) {return new RespResult(resultCode);}public T getData() {return data;}public void setData(T data) {this.data = data;}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;}
}
4.3.3.3 依赖管理

service工程一定会依赖mall-service-dependencymall-common,我们可以修改mall-service将这两个工程添加到依赖中:

<dependencies><!--依赖mall-service-dependency--><dependency><groupId>com.gupaoedu.vip.mall</groupId><artifactId>mall-service-dependency</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!--依赖mall-common--><dependency><groupId>com.gupaoedu.vip.mall</groupId><artifactId>mall-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
</dependencies>

5.品牌管理实现

5.1 集成MyBatisPlus

5.1.1 MyBatis Plus介绍

MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

MyBatis Plus特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
5.1.2 MyBatisPlus集成

1)引入依赖包

mall-service-dependency中引入如下依赖(这个依赖包之前已经引入了,这里无需再次引入):

<!--MyBatis Plus-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.2</version>
</dependency>

mall-api中引入如下依赖(编写JavaBean会用到MyBatis Plus的相关注解,引入依赖防止程序编译不通过):

<!--MyBatis Plus-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.2</version><scope>provided</scope>
</dependency>

2)创建goods-api工程

mall-api中创建子工程goods-api,用于创建shop_goods数据库表对应的实体Bean和Feign接口

pom.xml:

<?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"><parent><artifactId>mall-api</artifactId><groupId>com.gupaoedu.vip.mall</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>goods-api</artifactId><description>shop_goods数据库表对应的JavaBean</description>
</project>

goods-api中创建com.gupaoedu.vip.mall.goods.Brand,代码如下:

javaBean与数据库表的对应

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("brand")  //MyBatisPlus表映射注解
public class Brand {//品牌ID//MyBatisPlus主键策略注解@TableId(type = IdType.AUTO)private Integer id;//品牌名字private String name;//品牌图片private String image;//品牌首字母private String initial;//品牌排序private Integer sort;
}

主键生成策略

AUTO数据库ID自增
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUTinsert前自行set主键值
ASSIGN_ID分配ID(主键类型为Number(Long和Integer)或String),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法)
ID_WORKER分布式全局唯一ID 长整型类型(please use ASSIGN_ID) ,已过时
UUID32位UUID字符串,已过时
ID_WORKER_STR分布式全局唯一ID 字符串类型(please use ASSIGN_ID) ,已过时

3)商品微服务

mall-service中创建mall-goods-service微服务,用于操作shop_goods数据库

pom.xml代码如下:

<?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"><parent><artifactId>mall-service</artifactId><groupId>com.gupaoedu.vip.mall</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>mall-goods-service</artifactId><description>shop_goods微服务</description><dependencies><!--goods-api依赖,需要brand实体类--><dependency><groupId>com.gupaoedu.vip.mall</groupId><artifactId>goods-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>
</project>

创建bootstrap.yml,配置如下:

server:port: 8081
spring:application:name: mall-goods #服务名datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/shop_goods?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: 123456cloud:nacos:config:file-extension: yamlserver-addr: 192.168.1.11:8848discovery:#Nacos的注册地址server-addr: 192.168.1.11:8848
# ====================MybatisPlus====================
mybatis-plus:mapper-locations: mapper/*.xmltype-aliases-package: com.gupaoedu.vip.mall.*.model  #javaBean取别名的位置configuration:map-underscore-to-camel-case: true  #驼峰命名法,eg:t_userlog-impl: org.apache.ibatis.logging.stdout.StdOutImpl#日志配置
logging:pattern:console: "%msg%n"

配置说明:

type-aliases-package:指定JavaBean的别名包,和MyBatis用法一样
mapper-locations:复杂的操作可能需要自己写SQL,SQL可以写到xml文件中,这里指定和Dao对应的xml文件,此时我们需要在resources中创建一个mapper目录
map-underscore-to-camel-case:开启驼峰功能,数据库表列名如果有_,可以自动按驼峰命名规则转换
log-impl:日志开启,方便测试

创建启动类com.gupaoedu.vip.mall.MallGoodsServiceApplication

/*** 商品服务启动类*/
@SpringBootApplication
@MapperScan(basePackages = {"com.gupaoedu.vip.mall.goods.mapper"})
public class MallGoodsApplication {public static void main(String[] args) {SpringApplication.run(MallGoodsApplication.class,args);}
}

此时启动程序,查看Nacos控制台:< http://192.168.1.11:8848/nacos/index.html> 账号和密码都是nacos,效果如下:

在这里插入图片描述

5.2 MyBatisPlus操作

我们创建一个品牌操作的功能,实现品牌增删改查,分别创建modelmapperservicecontroller

MyBatisPlus提供了很多通用方法:

mapper(接口)->extends BaseMapper【增删改查】
service(接口)->extends IService【增删改查】
serviceImpl->extends ServiceImpl【增删改查】
5.2.1 Mapper创建

mall-goods-service创建com.gupaoedu.vip.mall.goods.mapper.BrandMapper接口,代码如下:

public interface BrandMapper extends BaseMapper<Brand> {
}

代码说明:BaseMapper中已经存在了很多常见数据库操作方法,可以大幅提升开发速度

5.2.2 Service创建

mall-goods-service创建com.gupaoedu.vip.mall.goods.service.BrandService接口,代码如下:

public interface BrandService extends IService<Brand>{
}

mall-goods-service创建com.gupaoedu.vip.mall.goods.service.impl.BrandServiceImpl实现类,代码如下:

@Service
public class BrandServiceImpl extends ServiceImpl<BrandMapper,Brand> implements BrandService {}

代码说明:IServiceServiceImpl中已经创建好了很多常用的增删改查方法,我们写常用的增删改查,几乎不用写方法

5.2.3 增删改功能

增删改功能在IServiceServiceImpl中已经全部存在, 不需要额外添加方法,只需要在Controller调用即可

mall-goods-service创建com.gupaoedu.vip.mall.goods.controller.BrandController,代码如下:

注意:@PathVariable 映射 URL 绑定的占位符,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中

@RestController
@RequestMapping(value = "/brand")
public class BrandController {@Autowiredprivate BrandService brandService;/**** 增加品牌  http://localhost:8081/brand*/@PostMappingpublic RespResult add(@RequestBody Brand brand){// 增加品牌brandService.save(brand);return RespResult.ok();}/***** 修改*/@PutMappingpublic RespResult update(@RequestBody Brand brand){//修改品牌brandService.updateById(brand);return RespResult.ok();}/***** 删除品牌*/@DeleteMapping("/{id}")public RespResult delete(@PathVariable(value = "id") Integer id){//删除品牌brandService.removeById(id);return RespResult.ok();}
}

使用postman测试增删改,增删改mp提供了很多的方法,不需要自己去写,查询有条件查询,需要自己手写

在这里插入图片描述

5.2.4 条件查询/分页

条件查询需要封装条件信息,MyBatis Plus提供了条件封装对象Wrapper(它的子类QueryWrapper可以直接使用),我们可以用它的子类QueryWrapper实现封装查询条件

6.2.4.1 条件查询

BrandService中创建如下方法:

List<Brand> queryList(Brand brand);

BrandServiceImpl中创建条件查询方法实现(不要忘了注入brandMapper):

/*** 多条件查询*/
@Override
public List<Brand> queryList(Brand brand) {// 多条件构造器QueryWrapper<Brand> queryWrapper = new QueryWrapper<Brand>();if(!StringUtils.isEmpty(brand.getName())){queryWrapper.like("name",brand.getName());}if(!StringUtils.isEmpty(brand.getName())){queryWrapper.eq("initial",brand.getInitial());}return brandMapper.selectList(queryWrapper);
}

注意:like:表示模糊查询;eq:表示等值查询

BrandController中创建条件查询方法:

/*** 条件查询*/
@PostMapping(value = "/list")
public RespResult<List<Brand>> list(@RequestBody(required = false) Brand brand){// 查询List<Brand> brands = brandService.queryList(brand);return RespResult.ok(brands);
}
6.2.4.2 分页查询

BrandService中创建如下方法:

Page<Brand> queryPageList(Long currentPage,Long size,Brand brand);

BrandServiceImpl中创建条件查询方法实现(不要忘了注入brandMapper):

/**** 分页查询*/@Overridepublic Page<Brand> queryPageList(Brand brand, Long currentPage, Long size) {//条件包装对象QueryWrapper<Brand> queryWrapper = new QueryWrapper<Brand>();//根据name查询品牌queryWrapper.like("name",brand.getName());return brandMapper.selectPage(new Page<Brand>(currentPage,size),queryWrapper);}

BrandController中创建条件查询方法:

/*** 条件分页查询*/
@PostMapping(value = "/list/{page}/{size}")
public RespResult<Page<Brand>> list(@PathVariable(value = "page")Long currentPage,@PathVariable(value = "size")Long size,@RequestBody(required = false) Brand brand){// 分页查询Page<Brand> brandPage = brandService.queryPageList(currentPage,size,brand);return RespResult.ok(brandPage);
}

测试结果如下:

在这里插入图片描述

注意:mp的分页查询,需要写分页拦截器,不然就不起作用

package com.gupaoedu.vip.mall.config;@Configuration
public class StartConfig {/***** 分页插件(分页拦截器),必须写拦截器,不然mp的分页功能不生效*/@Beanpublic PaginationInterceptor paginationInterceptor(){PaginationInterceptor pageInterceptor = new PaginationInterceptor();// 设置数据类型pageInterceptor.setDbType(DbType.MYSQL);return pageInterceptor;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vk-unicloud如何简单实现邮箱发送验证码?

以下代码是云函数发送验证码api&#xff0c;直接复制改个人参数&#xff1a; 其中"user"和"pass"使用自己的账号数据&#xff0c;如何拿到看以下步骤&#xff1a; 网易邮箱6.0版&#xff1a;登录--点击设置--点击POP3/SMTP/IMAP--点击开启服务&#xff1…

机器视觉系统中的重要配件--棱镜

在一套机器视觉系统中&#xff0c;人们一直比较注中工业相机、工业镜头及光源等重要的视觉器件&#xff0c;而小配件通常被忽视&#xff0c;虽然只是配角&#xff0c;但是却起着重要作用。以下以茉丽特镜头为例。 在构建视觉系统当中&#xff0c;遇到某个方向空间不足时&#x…

射频到底是什么

背景: 由于工作中wifi&#xff0c; gps 等等&#xff0c;经常使用到射频这个概念&#xff0c;一直很模糊&#xff0c;于是特此了解并记录一下。 概念理解&#xff1a; 射频可以理解为发射一个信号&#xff0c;该信号本质上是交流电所产生的电磁波&#xff0c; 一般通过这种方…

Flink-CDC 全面解析

Flink-CDC 全面解析 一、CDC 概述 &#xff08;一&#xff09;什么是 CDC CDC 即 Change Data Capture&#xff08;变更数据获取&#xff09;&#xff0c;其核心要义在于严密监测并精准捕获数据库内发生的各种变动情况&#xff0c;像数据的插入、更新以及删除操作&#xff0…

PHP语言的字符串处理

PHP语言的字符串处理 引言 字符串是编程中最基本的数据类型之一&#xff0c;通常用于存储和操作文本数据。在PHP语言中&#xff0c;对字符串的处理非常灵活且强大。无论是简单的字符操作&#xff0c;还是复杂的模式匹配&#xff0c;PHP都提供了丰富的函数和工具来满足不同的需…

PHP的扩展Imagick的安装

windows下的安装 下载&#xff1a;Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows​​​​​​​ 下载&#xff1a;ghostscript&#xff08;PDF提取图片时用到&#xff0c;不处理PDF可以不安装&#xff09; Ghostscript : Downloads 安装扩展 Imagick解压后&…

THREE.js的VideoTexture以及CanvasTexture在部分浏览器以及小程序webview中纯黑不起作用的解决办法

黑色是因为video没有自动播放导致的。 而且video必须设置muted&#xff08;静音&#xff09;属性&#xff0c;否则视频都无法播放&#xff1b; 如果不设置muted,也可以用设置x5-video-player-type"h5" 替代&#xff08;意为兼容qq浏览器&#xff0c;解决在小程序中黑…

【redis】ubuntu18安装redis7

在Ubuntu 18下安装Redis7可以通过以下两种方法实现&#xff1a;手动编译安装和使用APT进行安装。 Ubuntu 18系统的环境和版本&#xff1a; $ cat /proc/version Linux version 4.15.0-213-generic (builddlcy02-amd64-079) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)…

Java实现迭代器模式

一、简介 1、定义 迭代器模式(Iterator Pattern)是一种面向集合对象而生的行为设计模式。对于集合对象而言&#xff0c;会涉及对集合的添加和删除操作&#xff0c;也要支持遍历集合元素的操作。可以把遍历操作放在集合对象中&#xff0c;但这样做&#xff0c;集合对象就承担太…

uniapp中h5使用地图

export function loadTMap(key) {return new Promise(function(resolve, reject) {window.init function() {// resolve(qq) //注意这里resolve(TMap) //注意这里}var script document.createElement("script");script.type "text/javascript";// scrip…

获取地图文档中的图层列表

大多数情况下,获取地图文档中的图层列表是地理处理脚本中的首要工作之一.获取图层列表后,脚本可以循环遍历每个图层并执行某些类型的处理.制图模块中的ListLayers()函数提供获取图层列表的功能.本节将学习如何获得地图文档中的图层列表. 操作方法: 1.在arcgis中打开地图文件 …

软件系统安全逆向分析-混淆对抗

1. 概述 在一般的软件中&#xff0c;我们逆向分析时候通常都不能直接看到软件的明文源代码&#xff0c;或多或少存在着混淆对抗的操作。下面&#xff0c;我会实践操作一个例子从无从下手到攻破目标。 花指令对抗虚函数表RC4 2. 实战-donntyousee 题目载体为具有漏洞的小型软…

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

【权限管理】Apache Shiro学习教程

Apache Shiro 是一个功能强大且灵活的安全框架&#xff0c;主要用于身份认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、会话管理&#xff08;Session Management&#xff09;和加密&#xff08;Cryptography&#xff09;。它旨在为…

Spring事件发布与监听

Spring事件机制详解&#xff1a;事件发布与监听 在Spring框架中&#xff0c;事件机制基于发布-订阅模式&#xff0c;允许组件之间进行解耦。发布者发布事件&#xff0c;监听者订阅并响应这些事件。Spring事件机制的核心在于ApplicationEvent和ApplicationListener&#xff0c;…

ClickHouse vs StarRocks 选型对比

一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了&#xff0c;Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件&#xff0c;发明各种的解决方案技术栈&#xff0c;一方面确实帮助很多用户解决了问题&#xff0c;但另一方面因为繁杂的技术栈与高昂的维护成本&…

Win11家庭版转专业版

Win11家庭版转专业版&#xff08;亲测有效&#xff09; 第一步 【断网】输入这个密钥&#xff1a; R8NJ8-9X7PV-C7RCR-F3J9X-KQBP6 第二步 点击下一步会自动重启 第三步 【联网】输入这个密钥&#xff1a; F3NWX-VFMFC-MHYYF-BCJ3K-QV66Y 注意 两次输入密钥的地方一致 …

TypeScript语言的网络编程

TypeScript语言的网络编程 引言 在现代软件开发中&#xff0c;网络编程是一个不可或缺的部分。随着互联网的快速发展&#xff0c;网络应用程序越来越普遍&#xff0c;涉及到从简单的个人网站到复杂的企业级应用。TypeScript作为一种强类型的JavaScript超集&#xff0c;近年来…

在高德地图上加载3DTilesLayer图层模型/天地瓦片

1. 引入必要的库 Three.js&#xff1a;一个用于创建和显示3D图形的JavaScript库。vuemap/three-layer&#xff1a;一个Vue插件&#xff0c;它允许你在高德地图中添加Three.js图层。vuemap/layer-3dtiles&#xff1a;一个用于处理3D Tiles格式数据的Vue插件&#xff0c;可以用来…

Linux 高级路由 —— 筑梦之路

Linux 高级路由详解 本文将基于您提供的 Linux 高级路由极简教程 文章&#xff0c;深入探讨 Linux 高级路由的概念、配置方法以及应用场景。 一、什么是 Linux 高级路由&#xff1f; Linux 高级路由是指利用 Linux 内核提供的强大网络功能&#xff0c;实现超越传统路由表和默…