主要电商模式
B2B
B2B ( Business to Business)是指进行电子商务交易的供需双方都是商家(或企业、公司),她(他)们使用了互联网的技术或各种商务网络平台,完成商务交易的过程。电子商务是现代 B2B marketing的一种具体主要的表现形式。
案例:阿里巴巴、慧聪网
C2C
C2C即 Customer(Consumer) to Customer(Consumer),意思就是消费者个人间的电子商务行为。比如一个消费者有一台电脑,通过网络进行交易,把它出售给另外一个消费者,此种交易类型就称为C2C电子商务。
案例:淘宝、易趣、瓜子二手车
B2C
B2C是Business-to-Customer的缩写,而其中文简称为“商对客”。“商对客”是电子商务的一种模式,也就是通常说的直接面向消费者销售产品和服务商业零售模式。这种形式的电子商务一般以网络零售业为主,主要借助于互联网开展在线销售活动。B2C即企业通过互联网为消费者提供一个新型的购物环境——网上商店,消费者通过网络在网上购物、网上支付等消费行为。
案例:唯品会、乐蜂网
C2B
C2B(Consumer to Business,即消费者到企业),是互联网经济时代新的商业模式。这一模式改变了原有生产者(企业和机构)和消费者的关系,是一种消费者贡献价值(Create Value), 企业和机构消费价值(Consume Value)。
C2B模式和我们熟知的供需模式(DSM, Demand SupplyModel)恰恰相反,真正的C2B 应该先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产企业按需求组织生产。通常情况为消费者根据自身需求定制产品和价格,或主动参与产品设计、生产和定价,产品、价格等彰显消费者的个性化需求,生产企业进行定制化生产。
案例:海尔商城、 尚品宅配
O2O
O2O即Online To Offline(在线离线/线上到线下),是指将线下的商务机会与互联网结合,让互联网成为线下交易的平台,这个概念最早来源于美国。O2O的概念非常广泛,既可涉及到线上,又可涉及到线下,可以通称为O2O。主流商业管理课程均对O2O这种新型的商业模式有所介绍及关注。
案例:美团、饿了吗
F2C
F2C指的是Factory to customer,即从厂商到消费者的电子商务模式。 必应/必要
B2B2C
B2B2C是一种电子商务类型的网络购物商业模式,B是BUSINESS的简称,C是CUSTOMER的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子商务的企业,C则是表示消费者。
案例:京东商城、天猫商城
注:我们《畅购电商系统开发》课程采用B2C模式,之后的项目实战《品优购电商系统开发实战》采用B2B2C模式。
需求分析与系统设计
1. 需求分析
网站前台静态原型演示,打开资料\页面\前台\project-changgou-portal-fis3-master,首页index.html

网站管理后台静态原型演示:http://czpm.itcast.cn/青橙后台/#g=1&p=后台首页
打开资料\页面\后台\project-changgou-cmm-fis3-master\pages,首页all-medical-main.html
2.系统设计
商城属于B2C电商模式,运营商将自己的产品发布到网站上,会员注册后,在网站上将商品添加到购物车,并且下单,完成线上支付,用户还可以参与秒杀抢购。(队列模式) 普通商城—秒杀
前后端分离

技术架构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkPw1FV3-1607966175955)(image\1560087134452.png)]](https://img-blog.csdnimg.cn/20201215012250346.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
系统架构图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ThGtb0Yl-1607966175956)(image\1576632699671.png)]](https://img-blog.csdnimg.cn/20201215012356782.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)

3 框架搭建
3.1 环境准备
虚拟机说明
(1)VMware Workstation Pro安装centos7 镜像
(2)安装docker
(3)拉取mySQL镜像,并创建容器
(4)客户端连接mysql容器,建库建表(建库建表语句在资源文件夹中提供)
注意:1.检查软件的版本 12以上
2.畅购虚拟机地址:192.168.211.132 本地机器:192.168.211.1
3.1.2 数据库说明
虚拟机数据:
虚拟机IP:192.168.211.132
虚拟机账号:root 密码:123456
数据库端口:3306
数据库账号:root 密码:123456
数据库脚本:资料\数据库脚本
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yygnTthk-1607966175957)(image\1564094555825.png)]](https://img-blog.csdnimg.cn/20201215012545466.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
3.1.3 swagger接口文档
Swagger 是一款RESTFUL接口的、基于YAML、JSON语言的文档在线自动生成、代码自动生成的工具。用Swagger生成的接口文档可以充当前端人员和后端人员沟通的桥梁。目前在工作中Swagger使用的非常广泛。
在资料\swagger接口文档\swagger-ui-master中有一个start.bat启动即可使用已经配置好的Swagger文档了。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-prTHi3XA-1607966175959)(image\1575959854995.png)]](https://img-blog.csdnimg.cn/20201215012629488.png)
关于Swagger的安装配置,可以参考资料\swagger接口文档\配置文档。
安装好了后,浏览器输入:http://127.0.0.1:500/dist/index.html#/
效果如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-evsVlUdC-1607966175960)(image\1575959668113.png)]](https://img-blog.csdnimg.cn/20201215012646657.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
3.1.4 域名说明
畅购项目有多个系统,每个系统都拥有不同的域名。域名分布列表如下:(GOOGLE翻墙)
管理员后台:192.168.211.132 admin-changgou-java.itheima.net
搜索域名:192.168.211.132 search-changgou-java.itheima.net
网站门户:192.168.211.132 www-changgou-java.itheima.net
文件上传:192.168.211.132 file-changgou-java.itheima.net
用户中心:192.168.211.132 user-changgou-java.itheima.net
订单服务:192.168.211.132 order-changgou-java.itheima.net
统一认证服务:192.168.211.132 login-changgou-java.itheima.net
秒杀:192.168.211.132 seckill-changgou-java.itheima.net
商品详情页:192.168.211.132 item-changgou-java.itheima.net
支付服务:192.168.211.132 pay-changgou-java.itheima.net
图片存放地址:192.168.211.132 images-changgou-java.itheima.net
预留:192.168.211.132 data-changgou-java.itheima.net
域名对应的配置都在虚拟机中,以后每讲一个服务,都会配置对应的域名,今天会讲商品微服务,属于管理员后台功能,所以先配置管理员域名。
进入到/usr/local/openresty/nginx/conf
cd /usr/local/openresty/nginx/conf
修改nginx.conf文件,添加admin-changgou-java.itheima.net域名配置,代码如下:
vi nginx.conf
#网站后台
server {
listen 80;
server_name admin-changgou-java.itheima.net;
location / {
proxy_pass http://myip.com:18081;
}
}
./sbin/nginx -s reload(在nginx目录下执行)
其中myip.com指向服务器发布地址,在/etc/hosts中可以指定。
修改文件指令:
vi /etc/hosts
配置如下,添加myip.com域名的映解析:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ns5Z76US-1607966175961)(image\1576626730398.png)]](https://img-blog.csdnimg.cn/2020121501271588.png)
3.1.5 Nginx回顾
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
优点:
1.抗压能力强(并发处理5万)
2.占用资源少
3.运行稳定
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FyQbNDYO-1607966175962)(image\1576640183200.png)]](https://img-blog.csdnimg.cn/20201215012738411.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)

#服务配置,指定域名的请求服务配置
server {
#监听的端口
listen 80;
#配置指定域名的请求操作 localhost:指定了一个地址 127.0.0.1
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#要处理指定域名(server_name)的请求
# / 表示localhost域名下的所有请求
location / {
#所有的请求路由给IP为192.168.211.1的主机中的端口为18081的应用服务处理
proxy_pass http://192.168.211.1:18081;
}
}
域名与本地IP的配置
需要让指定的域名防止指定IP,在Windows下可以修改C:\Windows\System32\drivers\etc\hosts文件,添加映解析即可:
192.168.211.132 admin-changgou-java.itheima.net
3.2 项目结构说明
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nIBZOytJ-1607966175964)(image\1559113404367.png)]](https://img-blog.csdnimg.cn/2020121501280086.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
结构说明:
changgou-gateway
网关模块,根据网站的规模和需要,可以将综合逻辑相关的服务用网关路由组合到一起。在这里还可以做鉴权和限流相关操作。
changgou-service
微服务模块,该模块用于存放所有独立的微服务工程。dao service controller
changgou-service_api
对应工程的JavaBean、Feign、以及Hystrix配置,该工程主要对外提供依赖。
changgou-transaction-fescar
分布式事务模块,将分布式事务抽取到该工程中,任何工程如需要使用分布式事务,只需依赖该工程即可。
该工程名字后续升级后变成了changgou-transaction-seata
changgou-web
web服务工程,对应功能模块如需要调用多个微服务,可以将他们写入到该模块中,例如网站后台、网站前台等
3.3 公共工程搭建
3.3.1 父工程搭建
创建父工程 changgou-parent ,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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.changgou</groupId>
<artifactId>changgou-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<description>
畅购父工程
</description>
<!--SpringBoot2.1.4-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<!--跳过测试-->
<properties>
<skipTests>true</skipTests>
</properties>
<!--依赖包-->
<dependencies>
<!--测试包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<!--swagger文档-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
删除src文件夹
3.3.2 其他公共模块搭建
创建changgou-gateway、changgou-service、changgou-service-api、changgou-web工程,工程全部为pom工程,并将所有工程的src文件删除。
pom.xml中打pom包
<packaging>pom</packaging>
项目结构如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MOg5Ve4J-1607966175965)(image\1575961145114.png)]](https://img-blog.csdnimg.cn/20201215012827113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
3.4 Eureka微服务搭建
3.4.1 pom.xml依赖
创建模块changgou-eureka ,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>changgou_parent</artifactId>
<groupId>com.changgou</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>changgou_eureka</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
3.4.2 appliation.yml配置
创建配置文件application.yml
server:
port: 7001
eureka:
instance:
hostname: 127.0.0.1
client:
register-with-eureka: false #是否将自己注册到eureka中
fetch-registry: false #是否从eureka中获取信息
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3.4.3 启动类配置
创建包com.changgou 包下创建启动类EurekaApplication,代码如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vaDMrFj7-1607966175966)(image\1560411732580.png)]](https://img-blog.csdnimg.cn/20201215012904118.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
上图代码如下:
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class);
}
}
测试访问http://localhost:7001/,效果如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5YrcGiLc-1607966175967)(image\1560412105435.png)]](https://img-blog.csdnimg.cn/20201215012934952.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
3.5 公共模块搭建
3.5.1 pom.xml依赖
创建公共子模块changgou-common,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>changgou-parent</artifactId>
<groupId>com.itheima</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>changgou-common</artifactId>
<description>
工具工程,web工程可以依赖该工程
</description>
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- redis 使用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--微信支付-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--httpclient支持-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
</project>
公共子模块引入这些依赖后,其他微服务引入changgou-common后也自动引入了这些依赖
3.5.2 常用对象
创建com.changgou.util.StatusCode用于返回状态码封装。
/**
* 返回码
*/
public class StatusCode implements Serializable{
public static final int OK = 20000;//成功
public static final int ERROR = 20001;//失败
public static final int LOGINERROR = 20002;//用户名或密码错误
public static final int ACCESSERROR = 20003;//权限不足
public static final int REMOTEERROR = 20004;//远程调用失败
public static final int REPERROR = 20005;//重复操作
public static final int NOTFOUNDERROR = 20006;//没有对应的抢购数据
}
创建立类com.changgou.util.Result用于微服务返回结果给前端
public class Result<T> implements Serializable{
private boolean flag; //是否成功
private Integer code; //返回码
private String message; //返回消息
private T data; //返回数据
public Result(boolean flag, Integer code, String message, Object data) {
this.flag = flag;
this.code = code;
this.message = message;
this.data = (T) data;
}
public Result(boolean flag, Integer code, String message) {
this.flag = flag;
this.code = code;
this.message = message;
}
public Result() {
this.flag = true;
this.code = StatusCode.OK;
this.message = "操作成功!";
}
//get..set..toString..
}
当然,我们还可以将其他工具类都一起倒入到工程中,以后会用到,将资料\工具类中的所有类直接导入到com.changgou.util包下。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFqT3LLW-1607966175969)(image\1575962325621.png)]](https://img-blog.csdnimg.cn/20201215012956341.png)
3.6 数据访问工程搭建
创建公共模块changgou-common-db ,pom文件引入依赖
<?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>changgou-parent</artifactId>
<groupId>com.changgou</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>changgou-common-db</artifactId>
<description>
所有需要链接数据库的工程包的汇总
</description>
<!--依赖-->
<dependencies>
<!--对changgou-common的依赖-->
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--通用mapper起步依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</project>
这个公共模块是连接mysql数据库的公共微服务模块,所以需要连接mysql的微服务都继承自此工程。
3.7 商品微服务搭建
商品微服务主要是实现对商品的增删改查相关操作,以及商品相关信息的增删改查。
3.7.1 公共组件工程搭建
创建changgou-service-api子模块changgou-service-goods-api,并将资料\javabean\changgou-service-goods-api中的Pojo导入到工程中。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vPw3GhFm-1607966175971)(image\1560416099767.png)]](https://img-blog.csdnimg.cn/20201215013018362.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
修改父工程changgou-service-api的pom.xml,添加persistence-api和changgou-common的依赖,代码如下:
<dependencies>
<!--通用的common-->
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--每个工程都有Pojo,都需要用到该包对应的注解-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
3.7.2 微服务工程搭建
修改changgou-service的pom.xml引入changgou-common-db的依赖,代码如下:
<!--依赖-->
<dependencies>
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou-common-db</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在changgou-service中创建changgou-service-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>changgou-service</artifactId>
<groupId>com.changgou</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>changgou-service-goods</artifactId>
<!--依赖-->
<dependencies>
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou-service-goods-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
在resources下创建配置文件application.yml
server:
port: 18081
spring:
application:
name: goods
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.211.132:3306/changgou_goods?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
instance:
prefer-ip-address: true
在包com.changgou 包下创建启动类GoodsApplication,代码如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-souN1JDl-1607966175972)(image\1560416869439.png)]](https://img-blog.csdnimg.cn/20201215013107429.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
上图代码如下:
@SpringBootApplication
@EnableEurekaClient
@MapperScan(basePackages = {"com.changgou.goods.dao"})
public class GoodsApplication {
public static void main(String[] args) {
SpringApplication.run(GoodsApplication.class);
}
}
注意 :@MapperScan是tk.mybatis.spring.annotation包下的,用于扫描Mapper接口
启动changgou-service-goods 再访问<http://localhost:7001/>效果如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jvk4hUoq-1607966175974)(image\1564037101313.png)]](https://img-blog.csdnimg.cn/20201215013132211.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
通用Mapper的使用
1.引入依赖包
2.配置数据源
3.Dao接口需要继承Mapper<T>接口
4.配置通用Mapper的包扫描
5.使用:
直接使用通用Mapper中的增删改查方法实现数据库操作,操作数据库只需要传递对象即可,无需写SQL语句。
依赖的包:
<!--通用mapper起步依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
Dao继承Mapper<T>
public interface BrandMapper extends Mapper<Brand> {
}
Dao接口扫描
@SpringBootApplication
@EnableEurekaClient
@MapperScan(basePackages = "com.changgou.goods.dao") //Dao接口扫描
public class GoodsApplication {
public static void main(String[] args) {
ApplicationContext act = SpringApplication.run(GoodsApplication.class,args);
}
}
3.商品微服务-品牌增删改查
1. 需求分析
创建商品微服务,实现对品牌表的增删改查功能。具体包括
(1)查询全部列表数据
(2)根据ID查询实体数据
(3)增加
(4)修改
(5)删除
(6)条件查询
(7)分页查询
(8)分页+条件查询
(9)公共异常处理
2. 表结构分析
品牌表:tb_brand
| 字段名称 | 字段含义 | 字段类型 | 字段长度 | 备注 |
|---|---|---|---|---|
| id | 品牌id | INT | ||
| name | 品牌名称 | VARCHAR | ||
| image | 品牌图片地址 | VARCHAR | ||
| letter | 品牌的首字母 | CHAR | ||
| seq | 排序 | INT |
3. 代码实现
上面品牌表对应Brand实体类
@Table(name="tb_brand")
public class Brand implements Serializable{
@Id
private Integer id;//品牌id
private String name;//品牌名称
private String image;//品牌图片地址
private String letter;//品牌的首字母
private Integer seq;//排序
// getter and setter .....(省略)
}
@Table和@Id都是JPA注解,@Table用于配置表与实体类的映射关系,@Id用于标识主键属性。
3.1 品牌列表
(1)Dao创建
在changgou-service-goods微服务下创建com.changgou.goods.dao.BrandMapper接口,代码如下:
public interface BrandMapper extends Mapper<Brand> {
}
继承了Mapper接口,就自动实现了增删改查的常用方法。
(2)业务层
创建com.changgou.goods.service.BrandService接口,代码如下:
public interface BrandService {
/***
* 查询所有品牌
* @return
*/
List<Brand> findAll();
}
创建com.changgou.goods.service.impl.BrandServiceImpl实现类,代码如下:
@Service
public class BrandServiceImpl implements BrandService {
@Autowired
private BrandMapper brandMapper;
/**
* 全部数据
* @return
*/
@Override
public List<Brand> findAll(){
return brandMapper.selectAll();
}
}
(3)控制层
控制层 com.changgou.goods包下创建controller包 ,包下创建类
@RestController
@RequestMapping("/brand")
@CrossOrigin
public class BrandController {
@Autowired
private BrandService brandService;
/***
* 查询全部数据
* @return
*/
@GetMapping
public Result<Brand> findAll(){
List<Brand> brandList = brandService.findAll();
return new Result<Brand>(true, StatusCode.OK,"查询成功",brandList) ;
}
}
测试:http://admin-changgou-java.itheima.net/brand
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfFasca6-1607966175975)(image\1576033374526.png)]](https://img-blog.csdnimg.cn/20201215013339730.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
Swagger测试:

3.2 根据ID查询品牌
(1)业务层
修改com.changgou.goods.service.BrandService接口,添加根据ID查询品牌数据方法,代码如下:
/**
* 根据ID查询
* @param id
* @return
*/
Brand findById(Integer id);
修改com.changgou.goods.service.impl.BrandServiceImpl新增方法,代码如下:
/**
* 根据ID查询
* @param id
* @return
*/
@Override
public Brand findById(Integer id){
return brandMapper.selectByPrimaryKey(id);
}
(2)控制层
BrandController新增方法
/***
* 根据ID查询品牌数据
* @param id
* @return
*/
@GetMapping("/{id}")
public Result<Brand> findById(@PathVariable Integer id){
//根据ID查询
Brand brand = brandService.findById(id);
return new Result<Brand>(true,StatusCode.OK,"查询成功",brand);
}
测试:http://admin-changgou-java.itheima.net/brand/14026
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMXlQnG7-1607966175978)(image\1576033646478.png)]](https://img-blog.csdnimg.cn/20201215013637907.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
Swagger测试:

3.3 新增品牌
(1)业务层
修改com.changgou.goods.service.BrandService,新增方法
/***
* 新增品牌
* @param brand
*/
void add(Brand brand);
修改com.changgou.goods.service.impl.BrandServiceImpl,新增增加品牌方法代码如下:
/**
* 增加
* @param brand
*/
@Override
public void add(Brand brand){
brandMapper.insert(brand);
}
(2) 控制层
BrandController新增方法
/***
* 新增品牌数据
* @param brand
* @return
*/
@PostMapping
public Result add(@RequestBody Brand brand){
brandService.add(brand);
return new Result(true,StatusCode.OK,"添加成功");
}
测试:http://admin-changgou-java.itheima.net/brand
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pA2Mun4e-1607966175981)(image\1576033834856.png)]](https://img-blog.csdnimg.cn/20201215013806120.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
Swagger测试:

3.4 修改品牌
(1)业务层
需改com.changgou.goods.service.BrandService,添加修改品牌方法,代码如下:
/***
* 修改品牌数据
* @param brand
*/
void update(Brand brand);
修改com.changgou.goods.service.impl.BrandServiceImpl,添加修改品牌方法,代码如下:
/**
* 修改
* @param brand
*/
@Override
public void update(Brand brand){
brandMapper.updateByPrimaryKey(brand);
}
(2)控制层
BrandController新增方法
/***
* 修改品牌数据
* @param brand
* @param id
* @return
*/
@PutMapping(value="/{id}")
public Result update(@RequestBody Brand brand,@PathVariable Integer id){
//设置ID
brand.setId(id);
//修改数据
brandService.update(brand);
return new Result(true,StatusCode.OK,"修改成功");
}
测试:http://admin-changgou-java.itheima.net/brand/325417
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTKxEzDR-1607966175983)(image\1576034085279.png)]](https://img-blog.csdnimg.cn/20201215013925329.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
Swagger测试:

3.5 删除品牌
(1)业务层
修改com.changgou.goods.service.BrandService,添加删除品牌方法,代码如下:
/***
* 删除品牌
* @param id
*/
void delete(Integer id);
修改com.changgou.goods.service.impl.BrandServiceImpl,新增删除品牌方法,代码如下:
/**
* 删除
* @param id
*/
@Override
public void delete(Integer id){
brandMapper.deleteByPrimaryKey(id);
}
(2)控制层
BrandController新增方法
/***
* 根据ID删除品牌数据
* @param id
* @return
*/
@DeleteMapping(value = "/{id}" )
public Result delete(@PathVariable Integer id){
brandService.delete(id);
return new Result(true,StatusCode.OK,"删除成功");
}
测试:http://localhost:18081/brand/325415
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfVAyuTv-1607966175986)(image\1576034190382.png)]](https://img-blog.csdnimg.cn/20201215014036551.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
Swagger测试:

3.6 品牌列表条件查询
(1)业务层
修改com.changgou.goods.service.BrandService,增加根据条件搜索品牌方法,代码如下:
/***
* 多条件搜索品牌方法
* @param brand
* @return
*/
List<Brand> findList(Brand brand);
修改com.changgou.goods.service.impl.BrandServiceImpl,添加根据多条件搜索品牌方法的实现,代码如下:
/**
* 条件查询
* @param brand
* @return
*/
@Override
public List<Brand> findList(Brand brand){
//构建查询条件
Example example = createExample(brand);
//根据构建的条件查询数据
return brandMapper.selectByExample(example);
}
/**
* 构建查询对象
* @param brand
* @return
*/
public Example createExample(Brand brand){
Example example=new Example(Brand.class);
Example.Criteria criteria = example.createCriteria();
if(brand!=null){
// 品牌名称
if(!StringUtils.isEmpty(brand.getName())){
criteria.andLike("name","%"+brand.getName()+"%");
}
// 品牌图片地址
if(!StringUtils.isEmpty(brand.getImage())){
criteria.andLike("image","%"+brand.getImage()+"%");
}
// 品牌的首字母
if(!StringUtils.isEmpty(brand.getLetter())){
criteria.andLike("letter","%"+brand.getLetter()+"%");
}
// 品牌id
if(!StringUtils.isEmpty(brand.getLetter())){
criteria.andEqualTo("id",brand.getId());
}
// 排序
if(!StringUtils.isEmpty(brand.getSeq())){
criteria.andEqualTo("seq",brand.getSeq());
}
}
return example;
}
(2) 控制层
BrandController新增方法
/***
* 多条件搜索品牌数据
* @param brand
* @return
*/
@PostMapping(value = "/search" )
public Result<List<Brand>> findList(@RequestBody(required = false) Brand brand){
List<Brand> list = brandService.findList(brand);
return new Result<List<Brand>>(true,StatusCode.OK,"查询成功",list);
}
测试:http://admin-changgou-java.itheima.net/brand/search
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqM6D9Ry-1607966175988)(image\1576034415563.png)]](https://img-blog.csdnimg.cn/20201215014128927.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
Swagger测试:

3.7 品牌列表分页查询
PageHelper插件实现分页查询。
(1)业务层
修改com.changgou.goods.service.BrandService添加分页方法,代码如下:
/***
* 分页查询
* @param page
* @param size
* @return
*/
PageInfo<Brand> findPage(int page, int size);
修改com.changgou.goods.service.impl.BrandServiceImpl添加分页方法实现,代码如下:
/**
* 分页查询
* @param page
* @param size
* @return
*/
@Override
public PageInfo<Brand> findPage(int page, int size){
//静态分页
PageHelper.startPage(page,size);
//分页查询
return new PageInfo<Brand>(brandMapper.selectAll());
}
(2)控制层
BrandController新增方法
/***
* 分页搜索实现
* @param page:当前页
* @param size:每页显示多少条
* @return
*/
@GetMapping(value = "/search/{page}/{size}" )
public Result<PageInfo> findPage(@PathVariable int page, @PathVariable int size){
//分页查询
PageInfo<Brand> pageInfo = brandService.findPage(page, size);
return new Result<PageInfo>(true,StatusCode.OK,"查询成功",pageInfo);
}
测试:http://admin-changgou-java.itheima.net/brand/search/1/3
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OHBUS3PA-1607966175991)(image\1576034522052.png)]](https://img-blog.csdnimg.cn/20201215014237436.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
Swagger测试:

3.8 品牌列表条件+分页查询
(1)业务层
修改com.changgou.goods.service.BrandService,增加多条件分页查询方法,代码如下:
/***
* 多条件分页查询
* @param brand
* @param page
* @param size
* @return
*/
PageInfo<Brand> findPage(Brand brand, int page, int size);
修改com.changgou.goods.service.impl.BrandServiceImpl,添加多条件分页查询方法代码如下:
/**
* 条件+分页查询
* @param brand 查询条件
* @param page 页码
* @param size 页大小
* @return 分页结果
*/
@Override
public PageInfo<Brand> findPage(Brand brand, int page, int size){
//分页
PageHelper.startPage(page,size);
//搜索条件构建
Example example = createExample(brand);
//执行搜索
return new PageInfo<Brand>(brandMapper.selectByExample(example));
}
(2)控制层
BrandController新增方法
/***
* 分页搜索实现
* @param brand
* @param page
* @param size
* @return
*/
@PostMapping(value = "/search/{page}/{size}" )
public Result<PageInfo> findPage(@RequestBody(required = false) Brand brand, @PathVariable int page, @PathVariable int size){
//执行搜索
PageInfo<Brand> pageInfo = brandService.findPage(brand, page, size);
return new Result(true,StatusCode.OK,"查询成功",pageInfo);
}
测试:http://admin-changgou-java.itheima.net/brand/search/1/3
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBnr8kzg-1607966175994)(image\1576034643755.png)]](https://img-blog.csdnimg.cn/20201215014327660.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
Swagger测试:

3.9 公共异常处理
为了使我们的代码更容易维护,我们创建一个类集中处理异常,该异常类可以创建在changgou-common工程中,创建com.changgou.framework.exception.BaseExceptionHandler,代码如下:
@ControllerAdvice
public class BaseExceptionHandler {
/***
* 异常处理
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result error(Exception e) {
e.printStackTrace();
return new Result(false, StatusCode.ERROR, e.getMessage());
}
}
注意:@ControllerAdvice注解,全局捕获异常类,只要作用在@RequestMapping上,所有的异常都会被捕获。
页面效果
所有的页面已经在虚拟机中发布完成,我们只需要访问响应的页面即可。
登录页面http://admin-changgou-java.itheima.net/index.html,登录功能还未实现,随意输入即可登录,效果如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ByKcoYaT-1607966175996)(image\1576042492886.png)]](https://img-blog.csdnimg.cn/20201215014457507.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
品牌列表:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uFhQyCY-1607966175998)(image\1576042611997.png)]](https://img-blog.csdnimg.cn/20201215014518107.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
品牌搜索:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRf1Rk2d-1607966176000)(image\1576042661391.png)]](https://img-blog.csdnimg.cn/20201215014532857.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
添加品牌:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KJdkRcxz-1607966176001)(image\1576042718395.png)]](https://img-blog.csdnimg.cn/20201215014542906.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
修改品牌:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MF0FmeBU-1607966176003)(image\1576042803842.png)]](https://img-blog.csdnimg.cn/2020121501455358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)
删除品牌:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0hbcTL2R-1607966176004)(image\1576042909527.png)]](https://img-blog.csdnimg.cn/20201215014603515.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk0MjgzOA==,size_16,color_FFFFFF,t_70)