学习目标

  • 了解电商
  • 了解畅购架构
  • 了解畅购工程结构
  • 畅购工程搭建
  • 商品微服务搭建
  • 品牌增删改查[通用的mapper实现DAO的操作]

    1. 走进电商

    1.1 电商行业分析

    近年来,世界经济正向数字化转型,大力发展数字经济成为全球共识。党的十九大报告明确提出要建设“数字中国”“网络强国”,我国数字经济发展进入新阶段,市场规模位居全球第二,数字经济与实体经济深度融合,有力促进了供给侧结构性改革。电子商务是数字经济的重要组成部分,是数字经济最活跃、最集中的表现形式之一。2017年,在政府和市场共同推动下,我国电子商务发展更加注重效率、质量和创新,取得了一系列新的进展,在壮大数字经济、共建“一带一路”、助力乡村振兴、带动创新创业、促进经济转型升级等诸多方面发挥了重要作用,成为我国经济增长的新动力。
    第1章 框架搭建 - 图1
    第1章 框架搭建 - 图2
    2018天猫全天成交额记录
    第1章 框架搭建 - 图3

    1.2 电商系统技术特点

  • 技术新

  • 技术范围广
  • 分布式
  • 高并发、集群、负载均衡、高可用
  • 海量数据
  • 业务复杂
  • 系统安全

    1.3 主要电商模式

    B2B

    1. B2B Business to Business)是指进行电子商务交易的供需双方都是商家(或企业、公司),她(他)们使用了互联网的技术或各种商务网络平台,完成商务交易的过程。电子商务是现代 B2B marketing的一种具体主要的表现形式。
    2. 案例:阿里巴巴、慧聪网

    C2C

    1. C2C CustomerConsumer to CustomerConsumer),意思就是消费者个人间的电子商务行为。比如一个消费者有一台电脑,通过网络进行交易,把它出售给另外一个消费者,此种交易类型就称为C2C电子商务。
    2. 案例:淘宝、易趣、瓜子二手车

    B2C

    1. B2CBusiness-to-Customer的缩写,而其中文简称为“商对客”。“商对客”是电子商务的一种模式,也就是通常说的直接面向消费者销售产品和服务商业零售模式。这种形式的电子商务一般以网络零售业为主,主要借助于互联网开展在线销售活动。B2C即企业通过互联网为消费者提供一个新型的购物环境——网上商店,消费者通过网络在网上购物、网上支付等消费行为。
    2. 案例:唯品会、乐蜂网

    C2B

    1. C2BConsumer to Business,即消费者到企业),是互联网经济时代新的商业模式。这一模式改变了原有生产者(企业和机构)和消费者的关系,是一种消费者贡献价值(Create Value), 企业和机构消费价值(Consume Value)。
    2. C2B模式和我们熟知的供需模式(DSM, Demand SupplyModel)恰恰相反,真正的C2B 应该先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产企业按需求组织生产。通常情况为消费者根据自身需求定制产品和价格,或主动参与产品设计、生产和定价,产品、价格等彰显消费者的个性化需求,生产企业进行定制化生产。
    3. 案例:海尔商城、 尚品宅配

    O2O

    1. O2OOnline To Offline(在线离线/线上到线下),是指将线下的商务机会与互联网结合,让互联网成为线下交易的平台,这个概念最早来源于美国。O2O的概念非常广泛,既可涉及到线上,又可涉及到线下,可以通称为O2O。主流商业管理课程均对O2O这种新型的商业模式有所介绍及关注。
    2. 案例:美团、饿了吗

    F2C

    1. F2C指的是Factory to customer,即从厂商到消费者的电子商务模式。

    B2B2C

    1. B2B2C是一种电子商务类型的网络购物商业模式,BBUSINESS的简称,CCUSTOMER的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子商务的企业,C则是表示消费者。
    2. 案例:京东商城、天猫商城
    3. 注:我们《畅购电商系统开发》课程采用B2C模式,之后的项目实战《品优购电商系统开发实战》采用B2B2C模式。

    2. 畅购-需求分析与系统设计

    2.1 需求分析

    网站前台静态原型演示,打开资料\页面\前台\project-changgou-portal-fis3-master,首页index.html
    第1章 框架搭建 - 图4
    网站管理后台静态原型演示:
    第1章 框架搭建 - 图5
    第1章 框架搭建 - 图6
    线上地址:

    1. http://www-changgou-java.itheima.net/
    2. http://admin-changgou-java.itheima.net/

    2.2 系统设计

    畅购商城属于B2C电商模式,运营商将自己的产品发布到网站上,会员注册后,在网站上将商品添加到购物车,并且下单,完成线上支付,用户还可以参与秒杀抢购。

    2.2.1 前后端分离

    网站后台的部分采用前后端分离方式。
    以前的JavaWeb项目大多数都是java程序员又当爹又当妈,又搞前端,又搞后端。随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情。正所谓术业有专攻,一个人如果什么都会,那么他毕竟什么都不精。
    对于后端java工程师:
    把精力放在设计模式,spring+springmvc,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构,弹性计算架构,微服务架构,java性能优化,以及相关的项目管理等等。
    对于前端工程师:
    把精力放在html5,css3,vuejs,webpack,nodejs,Google V8引擎,javascript多线程,模块化,面向切面编程,设计模式,浏览器兼容性,性能优化等等。
    第1章 框架搭建 - 图7
    我们在本课程中提供与项目课程配套的管理后台的前端代码,但是不讲解前端的内容。这样我们会将更多的精力放在后端代码的开发上!

    1. SWAGGEr文档的使用:
    2. + 安装nodejs
    3. + 设置HS_HOME 环境变量
    4. HS_HOME = F:\courses\changgou\资\swagger\swagger-ui-master
    5. + 设置Path路径: 添加以下的路径
    6. %HS_HOME%\node_modules\.bin
    7. + cdF:\courses\changgou\资\swagger\swagger-ui-master
    8. + 执行命令
    9. hs -p 500
    10. + 浏览器中访问:
    11. http://127.0.0.1:500/dist/index.html

    2.2.2 技术选型

    第1章 框架搭建 - 图8

    2.2.3 系统架构图

    第1章 框架搭建 - 图9

    3 畅购-框架搭建

    3.1 环境准备

    (1)VMware Workstation Pro安装centos7 镜像
    (2)安装docker
    (3)拉取mySQL镜像,并创建容器
    (4)客户端连接mysql容器,建库建表(建库建表语句在资源文件夹中提供)
    步骤:
    (1)打开虚拟机:
    第1章 框架搭建 - 图10
    第1章 框架搭建 - 图11
    (2)点击启动,并选择 [已移动]
    第1章 框架搭建 - 图12
    (3)编辑网络编辑器:
    第1章 框架搭建 - 图13
    (4)使用时候,直接打开 输入用户名和密码即可
    虚拟机数据:

  • 虚拟机IP:192.168.211.132

  • 虚拟机账号:root 密码:123456
  • 数据库端口: 3306
  • 数据库账号:root 密码:123456

数据库脚本:资料\数据库脚本
第1章 框架搭建 - 图14

3.2 项目结构说明

第1章 框架搭建 - 图15
分析:

  1. + changgou-parent 管理所有的版本统一 pom
  2. +changgou-common 工具类 jar
  3. +changgou-common-db 微服务使用到的jar
  4. +changgou-service 聚合工程 管理微服务工程 pom
  5. + changgou-service-goods
  6. + changgou-service-order 依赖于API
  7. + changgou-service-user 依赖于api
  8. +changgou-service-api 聚合工程 统一管理fegin pojo pom
  9. +changgou-service-goods-api (有feign POJO) jar
  10. +changgou-service-order-api(有feign POJO) JAR
  11. +changgou-gateway 聚合工程 统一管理网关系统
  12. + changgou-gateway-admin 后台相关
  13. + changgou-gateway-web 前端相关
  14. + ....
  15. +changgou-euereka-server
  16. +changgou-web 聚合工程 统一管理web相关的微服务
  17. +changgou-web-item
  18. +changgou-web-manager: 调用订单微服务调用商品微服务 调用用户微服务聚合数据统一返回给页面。
  19. +....
  20. +...

结构说明:
changgou-gateway

  1. 网关模块,根据网站的规模和需要,可以将综合逻辑相关的服务用网关路由组合到一起。在这里还可以做鉴权和限流相关操作。

changgou-service

  1. 微服务模块,该模块用于存放所有独立的微服务工程。

changgou-service-api

  1. 对应工程的JavaBeanFeign、以及Hystrix配置,该工程主要对外提供依赖。

changgou-web

  1. web服务工程,对应功能模块如需要调用多个微服务,可以将他们写入到该模块中,例如网站后台、网站前台等

3.3 公共工程搭建

3.3.1 父工程搭建

创建父工程 changgou-parent ,pom.xml文件中增加配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.changgou</groupId>
  7. <artifactId>changgou-parent</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>2.1.4.RELEASE</version>
  13. </parent>
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. <maven.compiler.source>1.8</maven.compiler.source>
  17. <maven.compiler.target>1.8</maven.compiler.target>
  18. <skipTests>true</skipTests>
  19. </properties>
  20. <!--依赖包-->
  21. <dependencies>
  22. <!--测试包-->
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-test</artifactId>
  26. <scope>test</scope>
  27. </dependency>
  28. <!--fastjson-->
  29. <dependency>
  30. <groupId>com.alibaba</groupId>
  31. <artifactId>fastjson</artifactId>
  32. <version>1.2.51</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.plugin</groupId>
  36. <artifactId>spring-plugin-core</artifactId>
  37. <version>2.0.0.RELEASE</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.plugin</groupId>
  41. <artifactId>spring-plugin-metadata</artifactId>
  42. <version>2.0.0.RELEASE</version>
  43. </dependency>
  44. <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
  45. <dependency>
  46. <groupId>com.google.guava</groupId>
  47. <artifactId>guava</artifactId>
  48. <version>20.0</version>
  49. </dependency>
  50. <!--swagger文档依赖-->
  51. <dependency>
  52. <groupId>io.springfox</groupId>
  53. <artifactId>springfox-swagger2</artifactId>
  54. <version>2.9.2</version>
  55. <exclusions>
  56. <exclusion>
  57. <groupId>org.springframework.plugin</groupId>
  58. <artifactId>spring-plugin-core</artifactId>
  59. </exclusion>
  60. <exclusion>
  61. <groupId>org.springframework.plugin</groupId>
  62. <artifactId>spring-plugin-metadata</artifactId>
  63. </exclusion>
  64. <exclusion>
  65. <groupId>com.google.guava</groupId>
  66. <artifactId>guava</artifactId>
  67. </exclusion>
  68. </exclusions>
  69. </dependency>
  70. <dependency>
  71. <groupId>io.springfox</groupId>
  72. <artifactId>springfox-swagger-ui</artifactId>
  73. <version>2.9.2</version>
  74. </dependency>
  75. <!--鉴权-->
  76. <dependency>
  77. <groupId>io.jsonwebtoken</groupId>
  78. <artifactId>jjwt</artifactId>
  79. <version>0.9.0</version>
  80. </dependency>
  81. </dependencies>
  82. <dependencyManagement>
  83. <dependencies>
  84. <dependency>
  85. <groupId>org.springframework.cloud</groupId>
  86. <artifactId>spring-cloud-dependencies</artifactId>
  87. <version>Greenwich.SR1</version>
  88. <type>pom</type>
  89. <scope>import</scope>
  90. </dependency>
  91. </dependencies>
  92. </dependencyManagement>
  93. </project>

删除src文件夹

3.3.2 其他公共模块搭建

创建changgou-gateway、changgou-service、changgou-service-api、changgou-web工程,工程全部为pom工程,并将所有工程的src文件删除。
pom.xml中打pom包

  1. <packaging>pom</packaging>

项目结构如下:
第1章 框架搭建 - 图16

3.4 Eureka微服务搭建

3.4.1 pom.xml依赖

创建模块changgou-eureka ,pom.xml引入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>changgou-parent</artifactId>
  7. <groupId>com.changgou</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>changgou-eureka</artifactId>
  12. <!--eureka的服务端;注册中心-->
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  17. </dependency>
  18. </dependencies>
  19. </project>

3.4.2 appliation.yml配置

创建配置文件application.yml

  1. server:
  2. port: 7001
  3. eureka:
  4. instance:
  5. hostname: 127.0.0.1
  6. client:
  7. register-with-eureka: false #是否将自己注册到eureka中
  8. fetch-registry: false #是否从eureka中获取信息
  9. service-url:
  10. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  11. spring:
  12. application:
  13. name: eureka-server

3.4.3 启动类配置

创建包com.changgou 包下创建启动类EurekaApplication,代码如下:
第1章 框架搭建 - 图17
上图代码如下:

  1. @SpringBootApplication
  2. @EnableEurekaServer
  3. public class EurekaApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(EurekaApplication.class);
  6. }
  7. }

测试访问http://localhost:7001/,效果如下:
第1章 框架搭建 - 图18

3.5 公共模块搭建

3.5.1 pom.xml依赖

创建公共子模块changgou-common,pom.xml引入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>changgou-parent</artifactId>
  7. <groupId>com.changgou</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>changgou-common</artifactId>
  12. <dependencies>
  13. <!--web起步依赖-->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <!-- redis 使用-->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-data-redis</artifactId>
  22. </dependency>
  23. <!--eureka-client-->
  24. <dependency>
  25. <groupId>org.springframework.cloud</groupId>
  26. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  27. </dependency>
  28. <!--openfeign-->
  29. <dependency>
  30. <groupId>org.springframework.cloud</groupId>
  31. <artifactId>spring-cloud-starter-openfeign</artifactId>
  32. </dependency>
  33. <!--微信支付-->
  34. <dependency>
  35. <groupId>com.github.wxpay</groupId>
  36. <artifactId>wxpay-sdk</artifactId>
  37. <version>0.0.3</version>
  38. </dependency>
  39. <!--httpclient支持-->
  40. <dependency>
  41. <groupId>org.apache.httpcomponents</groupId>
  42. <artifactId>httpclient</artifactId>
  43. </dependency>
  44. </dependencies>
  45. </project>

公共子模块引入这些依赖后,其他微服务引入changgou-common后也自动引入了这些依赖

3.5.2 常用对象

创建entity包 ,在entity包下创建返回状态码实体类

  1. /**
  2. * 返回码
  3. */
  4. public class StatusCode {
  5. public static final int OK = 20000;//成功
  6. public static final int ERROR = 20001;//失败
  7. public static final int LOGINERROR = 20002;//用户名或密码错误
  8. public static final int ACCESSERROR = 20003;//权限不足
  9. public static final int REMOTEERROR = 20004;//远程调用失败
  10. public static final int REPERROR = 20005;//重复操作
  11. public static final int NOTFOUNDERROR = 20006;//没有对应的抢购数据
  12. }

包下建立类Result用于微服务返回结果给前端

  1. /**
  2. * 返回结果实体类
  3. */
  4. public class Result<T> {
  5. private boolean flag;//是否成功
  6. private Integer code;//返回码
  7. private String message;//返回消息
  8. private T data;//返回数据
  9. public Result(boolean flag, Integer code, String message, Object data) {
  10. this.flag = flag;
  11. this.code = code;
  12. this.message = message;
  13. this.data = (T) data;
  14. }
  15. public Result(boolean flag, Integer code, String message) {
  16. this.flag = flag;
  17. this.code = code;
  18. this.message = message;
  19. }
  20. public Result() {
  21. this.flag = true;
  22. this.code = StatusCode.OK;
  23. this.message = "操作成功!";
  24. }
  25. // getter and setter.....
  26. }

在entity包下建立类用于承载分页的数据结果

  1. /**
  2. * 分页结果类
  3. */
  4. public class PageResult<T> {
  5. private Long total;//总记录数
  6. private List<T> rows;//记录
  7. public PageResult(Long total, List<T> rows) {
  8. this.total = total;
  9. this.rows = rows;
  10. }
  11. public PageResult() {
  12. }
  13. //getter and setter ......
  14. }

当然,我们还可以将其他工具类都一起倒入到工程中,以后会用到,将资料\工具类中的所有类直接导入到entity包下。
第1章 框架搭建 - 图19

3.6 数据访问工程搭建

创建公共模块changgou-common-db ,pom文件引入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>changgou-parent</artifactId>
  7. <groupId>com.changgou</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>changgou-common-db</artifactId>
  12. <!--依赖-->
  13. <dependencies>
  14. <!--对changgou-common的依赖-->
  15. <dependency>
  16. <groupId>com.changgou</groupId>
  17. <artifactId>changgou-common</artifactId>
  18. <version>1.0-SNAPSHOT</version>
  19. </dependency>
  20. <!--通用mapper起步依赖-->
  21. <dependency>
  22. <groupId>tk.mybatis</groupId>
  23. <artifactId>mapper-spring-boot-starter</artifactId>
  24. <version>2.0.4</version>
  25. </dependency>
  26. <!--MySQL数据库驱动-->
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. </dependency>
  31. <!--mybatis分页插件-->
  32. <dependency>
  33. <groupId>com.github.pagehelper</groupId>
  34. <artifactId>pagehelper-spring-boot-starter</artifactId>
  35. <version>1.2.3</version>
  36. </dependency>
  37. </dependencies>
  38. </project>

这个公共模块是连接mysql数据库的公共微服务模块,所以需要连接mysql的微服务都继承自此工程。

3.7 商品微服务搭建

商品微服务主要是实现对商品的增删改查相关操作,以及商品相关信息的增删改查。

3.7.1 公共组件工程搭建

创建changgou-service-api子模块changgou-service-goods-api,并将资料\javabean\changgou-service-goods-api中的Pojo导入到工程中。
第1章 框架搭建 - 图20
修改父工程changgou-service-api的pom.xml,添加persistence-apichanggou-common的依赖,代码如下:

  1. <dependencies>
  2. <!--通用的common-->
  3. <dependency>
  4. <groupId>com.changgou</groupId>
  5. <artifactId>changgou-common</artifactId>
  6. <version>1.0-SNAPSHOT</version>
  7. </dependency>
  8. <!--每个工程都有Pojo,都需要用到该包对应的注解-->
  9. <dependency>
  10. <groupId>javax.persistence</groupId>
  11. <artifactId>persistence-api</artifactId>
  12. <version>1.0</version>
  13. <scope>compile</scope>
  14. </dependency>
  15. </dependencies>

3.7.2 微服务工程搭建

修改changgou-service的pom.xml引入changgou-common-db的依赖,代码如下:

  1. <!--依赖-->
  2. <dependencies>
  3. <dependency>
  4. <groupId>com.changgou</groupId>
  5. <artifactId>changgou-common-db</artifactId>
  6. <version>1.0-SNAPSHOT</version>
  7. </dependency>
  8. </dependencies>

在changgou-service中创建changgou-service-goods ,pom.xml引入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>changgou-service</artifactId>
  7. <groupId>com.changgou</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>changgou-service-goods</artifactId>
  12. <!--依赖-->
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.changgou</groupId>
  16. <artifactId>changgou-service-goods-api</artifactId>
  17. <version>1.0-SNAPSHOT</version>
  18. </dependency>
  19. </dependencies>
  20. </project>

在resources下创建配置文件application.yml

  1. server:
  2. port: 18081
  3. spring:
  4. application:
  5. name: goods
  6. datasource:
  7. driver-class-name: com.mysql.jdbc.Driver
  8. url: jdbc:mysql://192.168.211.132:3306/changgou_goods?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
  9. username: root
  10. password: 123456
  11. eureka:
  12. client:
  13. service-url:
  14. defaultZone: http://127.0.0.1:7001/eureka
  15. instance:
  16. prefer-ip-address: true
  17. feign:
  18. hystrix:
  19. enabled: true

在包com.changgou.goods 包下创建启动类GoodsApplication,代码如下:
第1章 框架搭建 - 图21
上图代码如下:

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @MapperScan(basePackages = {"com.changgou.goods.dao"})
  4. public class GoodsApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(GoodsApplication.class);
  7. }
  8. }

注意 :@MapperScan是tk.mybatis.spring.annotation包下的,用于扫描Mapper接口
启动changgou-service-goods 再访问<http://localhost:7001/>效果如下:
第1章 框架搭建 - 图22

4 商品微服务-品牌增删改查

4.1 需求分析

创建商品微服务,实现对品牌表的增删改查功能。具体包括
(1)查询全部列表数据
(2)根据ID查询实体数据
(3)增加
(4)修改
(5)删除
(6)条件查询
(7)分页查询
(8)分页+条件查询
(9)公共异常处理

4.2 表结构分析

品牌表:tb_brand

字段名称 字段含义 字段类型 字段长度 备注
id 品牌id INT
name 品牌名称 VARCHAR
image 品牌图片地址 VARCHAR
letter 品牌的首字母 CHAR
seq 排序 INT

4.3 代码实现

上面品牌表对应Brand实体类

  1. @Table(name="tb_brand")
  2. public class Brand implements Serializable{
  3. @Id
  4. private Integer id;//品牌id
  5. private String name;//品牌名称
  6. private String image;//品牌图片地址
  7. private String letter;//品牌的首字母
  8. private Integer seq;//排序
  9. // getter and setter .....(省略)
  10. }

@Table和@Id都是JPA注解,@Table用于配置表与实体类的映射关系,@Id用于标识主键属性。

4.3.1 品牌列表

(1)Dao创建
在changgou-service-goods微服务下创建com.changgou.goods.dao.BrandMapper接口,代码如下:

  1. public interface BrandMapper extends Mapper<Brand> {
  2. }

继承了Mapper接口,就自动实现了增删改查的常用方法。
(2)业务层
创建com.changgou.goods.service.BrandService接口,代码如下:

  1. public interface BrandService {
  2. /***
  3. * 查询所有品牌
  4. * @return
  5. */
  6. List<Brand> findAll();
  7. }

创建com.changgou.goods.service.impl.BrandServiceImpl实现类,代码如下:

  1. @Service
  2. public class BrandServiceImpl {
  3. @Autowired
  4. private BrandMapper brandMapper;
  5. /**
  6. * 全部数据
  7. * @return
  8. */
  9. public List<Brand> findAll(){
  10. return brandMapper.selectAll();
  11. }
  12. }

(3)控制层
控制层 com.changgou.goods包下创建controller包 ,包下创建类

  1. @RestController
  2. @RequestMapping("/brand")
  3. @CrossOrigin
  4. public class BrandController {
  5. @Autowired
  6. private BrandService brandService;
  7. /***
  8. * 查询全部数据
  9. * @return
  10. */
  11. @GetMapping
  12. public Result<Brand> findAll(){
  13. List<Brand> brandList = brandService.findAll();
  14. return new Result<Brand>(true, StatusCode.OK,"查询成功",brandList) ;
  15. }
  16. }

测试:http://localhost:18081/brand
第1章 框架搭建 - 图23

4.3.2 根据ID查询品牌

(1)业务层
修改com.changgou.goods.service.BrandService接口,添加根据ID查询品牌数据方法,代码如下:

  1. /**
  2. * 根据ID查询
  3. * @param id
  4. * @return
  5. */
  6. Brand findById(Integer id);

修改com.changgou.goods.service.impl.BrandServiceImpl新增方法,代码如下:

  1. /**
  2. * 根据ID查询
  3. * @param id
  4. * @return
  5. */
  6. @Override
  7. public Brand findById(Integer id){
  8. return brandMapper.selectByPrimaryKey(id);
  9. }

(2)控制层
BrandController新增方法

  1. /***
  2. * 根据ID查询品牌数据
  3. * @param id
  4. * @return
  5. */
  6. @GetMapping("/{id}")
  7. public Result<Brand> findById(@PathVariable Integer id){
  8. //根据ID查询
  9. Brand brand = brandService.findById(id);
  10. return new Result<Brand>(true,StatusCode.OK,"查询成功",brand);
  11. }

测试:http://localhost:18081/brand/14026
第1章 框架搭建 - 图24

4.3.3 新增品牌

(1)业务层
修改com.changgou.goods.service.BrandService,新增方法

  1. /***
  2. * 新增品牌
  3. * @param brand
  4. */
  5. void add(Brand brand);

修改com.changgou.goods.service.impl.BrandServiceImpl,新增增加品牌方法代码如下:

  1. /**
  2. * 增加
  3. * @param brand
  4. */
  5. @Override
  6. public void add(Brand brand){
  7. brandMapper.insertSelective(brand);
  8. }

(2) 控制层
BrandController新增方法

  1. /***
  2. * 新增品牌数据
  3. * @param brand
  4. * @return
  5. */
  6. @PostMapping
  7. public Result add(@RequestBody Brand brand){
  8. brandService.add(brand);
  9. return new Result(true,StatusCode.OK,"添加成功");
  10. }

测试:http://localhost:18081/brand
第1章 框架搭建 - 图25

4.3.4 修改品牌

(1)业务层
需改com.changgou.goods.service.BrandService,添加修改品牌方法,代码如下:

  1. /***
  2. * 修改品牌数据
  3. * @param brand
  4. */
  5. void update(Brand brand);

修改com.changgou.goods.service.impl.BrandServiceImpl,添加修改品牌方法,代码如下:

  1. /**
  2. * 修改
  3. * @param brand
  4. */
  5. @Override
  6. public void update(Brand brand){
  7. brandMapper.updateByPrimaryKeySelective(brand);
  8. }

(2)控制层
BrandController新增方法

  1. /***
  2. * 修改品牌数据
  3. * @param brand
  4. * @param id
  5. * @return
  6. */
  7. @PutMapping(value="/{id}")
  8. public Result update(@RequestBody Brand brand,@PathVariable Integer id){
  9. //设置ID
  10. brand.setId(id);
  11. //修改数据
  12. brandService.update(brand);
  13. return new Result(true,StatusCode.OK,"修改成功");
  14. }

测试:http://localhost:18081/brand/325415
第1章 框架搭建 - 图26

4.3.5 删除品牌

(1)业务层
修改com.changgou.goods.service.BrandService,添加删除品牌方法,代码如下:

  1. /***
  2. * 删除品牌
  3. * @param id
  4. */
  5. void delete(Integer id);

修改com.changgou.goods.service.impl.BrandServiceImpl,新增删除品牌方法,代码如下:

  1. /**
  2. * 删除
  3. * @param id
  4. */
  5. @Override
  6. public void delete(Integer id){
  7. brandMapper.deleteByPrimaryKey(id);
  8. }

(2)控制层
BrandController新增方法

  1. /***
  2. * 根据ID删除品牌数据
  3. * @param id
  4. * @return
  5. */
  6. @DeleteMapping(value = "/{id}" )
  7. public Result delete(@PathVariable Integer id){
  8. brandService.delete(id);
  9. return new Result(true,StatusCode.OK,"删除成功");
  10. }

测试:http://localhost:18081/brand/325415
第1章 框架搭建 - 图27

4.3.6 品牌列表条件查询

(1)业务层
修改com.changgou.goods.service.BrandService,增加根据条件搜索品牌方法,代码如下:

  1. /***
  2. * 多条件搜索品牌方法
  3. * @param brand
  4. * @return
  5. */
  6. List<Brand> findList(Brand brand);

修改com.changgou.goods.service.impl.BrandServiceImpl,添加根据多条件搜索品牌方法的实现,代码如下:

  1. /**
  2. * 条件查询
  3. * @param brand
  4. * @return
  5. */
  6. @Override
  7. public List<Brand> findList(Brand brand){
  8. //构建查询条件
  9. Example example = createExample(brand);
  10. //根据构建的条件查询数据
  11. return brandMapper.selectByExample(example);
  12. }
  13. /**
  14. * 构建查询对象
  15. * @param brand
  16. * @return
  17. */
  18. public Example createExample(Brand brand){
  19. Example example=new Example(Brand.class);
  20. Example.Criteria criteria = example.createCriteria();
  21. if(brand!=null){
  22. // 品牌名称
  23. if(!StringUtils.isEmpty(brand.getName())){
  24. criteria.andLike("name","%"+brand.getName()+"%");
  25. }
  26. // 品牌图片地址
  27. if(!StringUtils.isEmpty(brand.getImage())){
  28. criteria.andLike("image","%"+brand.getImage()+"%");
  29. }
  30. // 品牌的首字母
  31. if(!StringUtils.isEmpty(brand.getLetter())){
  32. criteria.andLike("letter","%"+brand.getLetter()+"%");
  33. }
  34. // 品牌id
  35. if(!StringUtils.isEmpty(brand.getLetter())){
  36. criteria.andEqualTo("id",brand.getId());
  37. }
  38. // 排序
  39. if(!StringUtils.isEmpty(brand.getSeq())){
  40. criteria.andEqualTo("seq",brand.getSeq());
  41. }
  42. }
  43. return example;
  44. }

(2) 控制层
BrandController新增方法

  1. /***
  2. * 多条件搜索品牌数据
  3. * @param brand
  4. * @return
  5. */
  6. @PostMapping(value = "/search" )
  7. public Result<List<Brand>> findList(@RequestBody(required = false) Brand brand){
  8. List<Brand> list = brandService.findList(brand);
  9. return new Result<List<Brand>>(true,StatusCode.OK,"查询成功",list);
  10. }

测试:http://localhost:18081/brand/search
第1章 框架搭建 - 图28

4.3.7 品牌列表分页查询

(1)业务层
修改com.changgou.goods.service.BrandService添加分页方法,代码如下:

  1. /***
  2. * 分页查询
  3. * @param page
  4. * @param size
  5. * @return
  6. */
  7. PageInfo<Brand> findPage(int page, int size);

修改com.changgou.goods.service.impl.BrandServiceImpl添加分页方法实现,代码如下:

  1. /**
  2. * 分页查询
  3. * @param page
  4. * @param size
  5. * @return
  6. */
  7. @Override
  8. public PageInfo<Brand> findPage(int page, int size){
  9. //静态分页
  10. PageHelper.startPage(page,size);
  11. //分页查询
  12. return new PageInfo<Brand>(brandMapper.selectAll());
  13. }

(2)控制层
BrandController新增方法

  1. /***
  2. * 分页搜索实现
  3. * @param page:当前页
  4. * @param size:每页显示多少条
  5. * @return
  6. */
  7. @GetMapping(value = "/search/{page}/{size}" )
  8. public Result<PageInfo> findPage(@PathVariable int page, @PathVariable int size){
  9. //分页查询
  10. PageInfo<Brand> pageInfo = brandService.findPage(page, size);
  11. return new Result<PageInfo>(true,StatusCode.OK,"查询成功",pageInfo);
  12. }

测试:http://localhost:18081/brand/search/1/3
第1章 框架搭建 - 图29

4.3.8 品牌列表条件+分页查询

(1)业务层
修改com.changgou.goods.service.BrandService,增加多条件分页查询方法,代码如下:

  1. /***
  2. * 多条件分页查询
  3. * @param brand
  4. * @param page
  5. * @param size
  6. * @return
  7. */
  8. PageInfo<Brand> findPage(Brand brand, int page, int size);

修改com.changgou.goods.service.impl.BrandServiceImpl,添加多条件分页查询方法代码如下:

  1. /**
  2. * 条件+分页查询
  3. * @param brand 查询条件
  4. * @param page 页码
  5. * @param size 页大小
  6. * @return 分页结果
  7. */
  8. @Override
  9. public PageInfo<Brand> findPage(Brand brand, int page, int size){
  10. //分页
  11. PageHelper.startPage(page,size);
  12. //搜索条件构建
  13. Example example = createExample(brand);
  14. //执行搜索
  15. return new PageInfo<Brand>(brandMapper.selectByExample(example));
  16. }

(2)控制层
BrandController新增方法

  1. /***
  2. * 分页搜索实现
  3. * @param brand
  4. * @param page
  5. * @param size
  6. * @return
  7. */
  8. @PostMapping(value = "/search/{page}/{size}" )
  9. public Result<PageInfo> findPage(@RequestBody(required = false) Brand brand, @PathVariable int page, @PathVariable int size){
  10. //执行搜索
  11. PageInfo<Brand> pageInfo = brandService.findPage(brand, page, size);
  12. return new Result(true,StatusCode.OK,"查询成功",pageInfo);
  13. }

测试:http://localhost:18081/brand/search/1/3
第1章 框架搭建 - 图30

4.3.9 公共异常处理

为了使我们的代码更容易维护,我们创建一个类集中处理异常,该异常类可以创建在changgou-common工程中,创建com.changgou.framework.exception.BaseExceptionHandler,代码如下:

  1. @ControllerAdvice
  2. public class BaseExceptionHandler {
  3. /***
  4. * 异常处理
  5. * @param e
  6. * @return
  7. */
  8. @ExceptionHandler(value = Exception.class)
  9. @ResponseBody
  10. public Result error(Exception e) {
  11. e.printStackTrace();
  12. return new Result(false, StatusCode.ERROR, e.getMessage());
  13. }
  14. }

注意:@ControllerAdvice注解,全局捕获异常类,只要作用在@RequestMapping上,所有的异常都会被捕获。