黑馬暢購商城---1.項目介紹-環境搭建

第1章 框架搭建

學習目標

  • 瞭解電商
  • 瞭解暢購架構
  • 瞭解暢購工程結構
  • 暢購工程搭建
  • 商品微服務搭建
  • 品牌增刪改查

1. 走進電商

1.1 電商行業分析

近年來,世界經濟正向數字化轉型,大力發展數字經濟成爲全球共識。黨的十九大報告明確提出要建設“數字中國”“網絡強國”,我國數字經濟發展進入新階段,市場規模位居全球第二,數字經濟與實體經濟深度融合,有力促進了供給側結構性改革。電子商務是數字經濟的重要組成部分,是數字經濟最活躍、最集中的表現形式之一。2017年,在政府和市場共同推動下,我國電子商務發展更加註重效率、質量和創新,取得了一系列新的進展,在壯大數字經濟、共建“一帶一路”、助力鄉村振興、帶動創新創業、促進經濟轉型升級等諸多方面發揮了重要作用,成爲我國經濟增長的新動力。
2017年,我國電子商務交易規模繼續擴大,並保持高速增長態勢。國家統計局數據顯示,2017年全國電子商務交易額達29.16萬億元,同比增長11.7%;網上零售額7.18萬億元,同比增長32.2%。我國電子商務優勢進一步擴大,網絡零售規模全球最大、產業創新活力世界領先。數據顯示,截止2017年底,全國網絡購物用戶規模達5.33億,同比增長14.3%;非銀行支付機構發生網絡支付金額達143.26萬億元,同比增長44.32%;全國快遞服務企業業務量累計完成400.6億件,同比增長28%;電子商務直接從業人員和間接帶動就業達4250萬人。

 

2018天貓全天成交額記錄

1.2 電商系統技術特點

 

  • 技術新

  • 技術範圍廣

  • 分佈式

  • 高併發、集羣、負載均衡、高可用

  • 海量數據

  • 業務複雜

  • 系統安全

1.3 主要電商模式

B2B

1
2
3
B2B ( Business to Business)是指進行電子商務交易的供需雙方都是商家(或企業、公司),她(他)們使用了互聯網的技術或各種商務網絡平臺,完成商務交易的過程。電子商務是現代 B2B marketing的一種具體主要的表現形式。

案例:阿里巴巴、慧聰網

C2C

1
2
3
C2C即 Customer(Consumer) to Customer(Consumer),意思就是消費者個人間的電子商務行爲。比如一個消費者有一臺電腦,通過網絡進行交易,把它出售給另外一個消費者,此種交易類型就稱爲C2C電子商務。

案例:淘寶、易趣、瓜子二手車

B2C

1
2
3
B2C是Business-to-Customer的縮寫,而其中文簡稱爲“商對客”。“商對客”是電子商務的一種模式,也就是通常說的直接面向消費者銷售產品和服務商業零售模式。這種形式的電子商務一般以網絡零售業爲主,主要藉助於互聯網開展在線銷售活動。B2C即企業通過互聯網爲消費者提供一個新型的購物環境——網上商店,消費者通過網絡在網上購物、網上支付等消費行爲。

案例:唯品會、樂蜂網

C2B

1
2
3
4
5
C2B(Consumer to Business,即消費者到企業),是互聯網經濟時代新的商業模式。這一模式改變了原有生產者(企業和機構)和消費者的關係,是一種消費者貢獻價值(Create Value), 企業和機構消費價值(Consume Value)。

C2B模式和我們熟知的供需模式(DSM, Demand SupplyModel)恰恰相反,真正的C2B 應該先有消費者需求產生而後有企業生產,即先有消費者提出需求,後有生產企業按需求組織生產。通常情況爲消費者根據自身需求定製產品和價格,或主動參與產品設計、生產和定價,產品、價格等彰顯消費者的個性化需求,生產企業進行定製化生產。

案例:海爾商城、 尚品宅配

O2O

1
2
3
O2O即Online To Offline(在線離線/線上到線下),是指將線下的商務機會與互聯網結合,讓互聯網成爲線下交易的平臺,這個概念最早來源於美國。O2O的概念非常廣泛,既可涉及到線上,又可涉及到線下,可以通稱爲O2O。主流商業管理課程均對O2O這種新型的商業模式有所介紹及關注。

案例:美團、餓了嗎

F2C

F2C指的是Factory to customer,即從廠商到消費者的電子商務模式。

B2B2C

1
2
3
4
B2B2C是一種電子商務類型的網絡購物商業模式,B是BUSINESS的簡稱,C是CUSTOMER的簡稱,第一個B指的是商品或服務的供應商,第二個B指的是從事電子商務的企業,C則是表示消費者。

案例:京東商城、天貓商城
注:我們《暢購電商系統開發》課程採用B2C模式,之後的項目實戰《品優購電商系統開發實戰》採用B2B2C模式。

2. 暢購-需求分析與系統設計

 

  •  

2.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.2 系統設計

暢購商城屬於B2C電商模式,運營商將自己的產品發佈到網站上,會員註冊後,在網站上將商品添加到購物車,並且下單,完成線上支付,用戶還可以參與秒殺搶購。

2.2.1 前後端分離

網站後臺的部分採用前後端分離方式。

以前的JavaWeb項目大多數都是java程序員又當爹又當媽,又搞前端,又搞後端。隨着時代的發展,漸漸的許多大中小公司開始把前後端的界限分的越來越明確,前端工程師只管前端的事情,後端工程師只管後端的事情。正所謂術業有專攻,一個人如果什麼都會,那麼他畢竟什麼都不精。

對於後端java工程師:

把精力放在設計模式,spring+springmvc,linux,mysql事務隔離與鎖機制,mongodb,http/tcp,多線程,分佈式架構,彈性計算架構,微服務架構,java性能優化,以及相關的項目管理等等。

對於前端工程師:

把精力放在html5,css3,vuejs,webpack,nodejs,Google V8引擎,javascript多線程,模塊化,面向切面編程,設計模式,瀏覽器兼容性,性能優化等等。

我們在本課程中提供與項目課程配套的管理後臺的前端代碼,但是不講解前端的內容。這樣我們會將更多的精力放在**後端代碼**的開發上!

2.2.2 技術架構

2.2.3 系統架構圖

3 暢購-框架搭建

3.1 環境準備

(1)VMware Workstation Pro安裝centos7 鏡像

(2)安裝docker

(3)拉取mySQL鏡像,並創建容器

(4)客戶端連接mysql容器,建庫建表(建庫建表語句在資源文件夾中提供)

虛擬機數據:

  • 虛擬機IP:192.168.211.132

  • 虛擬機賬號:root 密碼:123456

  • 數據庫端口:3306
  • 數據庫賬號:root 密碼:123456

數據庫腳本:資料\數據庫腳本

3.2 項目結構說明

結構說明:

changgou-gateway

網關模塊,根據網站的規模和需要,可以將綜合邏輯相關的服務用網關路由組合到一起。在這裏還可以做鑑權和限流相關操作。

changgou-service

微服務模塊,該模塊用於存放所有獨立的微服務工程。

changgou-service_api

對應工程的JavaBean、Feign、以及Hystrix配置,該工程主要對外提供依賴。

changgou-transaction-fescar

分佈式事務模塊,將分佈式事務抽取到該工程中,任何工程如需要使用分佈式事務,只需依賴該工程即可。

changgou-web

web服務工程,對應功能模塊如需要調用多個微服務,可以將他們寫入到該模塊中,例如網站後臺、網站前臺等

3.3 公共工程搭建

3.3.1 父工程搭建

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <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>

        <!--
            http://localhost:9011/swagger-ui.html
        -->
    </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>

項目結構如下:

3.4 Eureka微服務搭建

3.4.1 pom.xml依賴

創建模塊changgou-eureka ,pom.xml引入依賴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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

1
2
3
4
5
6
7
8
9
10
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,代碼如下:

上圖代碼如下:

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class);
    }
}

測試訪問http://localhost:7001/,效果如下:

3.5 公共模塊搭建

3.5.1 pom.xml依賴

創建公共子模塊changgou-common,pom.xml引入依賴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?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</artifactId>

    <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>
        </dependency>
        <!--httpclient支持-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
    </dependencies>
</project>

公共子模塊引入這些依賴後,其他微服務引入changgou-common後也自動引入了這些依賴

3.5.2 常用對象

創建entity包 ,在entity包下創建返回狀態碼實體類

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 返回碼
 */
public class StatusCode {
    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;//沒有對應的搶購數據
}

包下建立類Result用於微服務返回結果給前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * 返回結果實體類
 */
public class Result<T> {
    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 = "操作成功!";
    }

    // getter and setter.....
}

在entity包下建立類用於承載分頁的數據結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 分頁結果類
 */
public class PageResult<T> {

    private Long total;//總記錄數
    private List<T> rows;//記錄

    public PageResult(Long total, List<T> rows) {
        this.total = total;
        this.rows = rows;
    }

    public PageResult() {
    }

    //getter and setter ......
}

當然,我們還可以將其他工具類都一起倒入到工程中,以後會用到,將資料\工具類中的所有類直接導入到entity包下。

3.6 數據訪問工程搭建

創建公共模塊changgou-common-db ,pom文件引入依賴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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>

    <!--依賴-->
    <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導入到工程中。

修改父工程changgou-service-api的pom.xml,添加persistence-apichanggou-common的依賴,代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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的依賴,代碼如下:

1
2
3
4
5
6
7
8
<!--依賴-->
<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引入依賴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
feign:
  hystrix:
    enabled: true
mybatis:
  configuration:
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mapper/*Mapper.xml
  type-aliases-package: com.changgou.goods.pojo

在包com.changgou.goods 包下創建啓動類GoodsApplication,代碼如下:

上圖代碼如下:

1
2
3
4
5
6
7
8
@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/>效果如下:

==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
2
3
4
5
6
7
8
9
10
11
@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用於標識主鍵屬性。

4.3.1 品牌列表

(1)Dao創建

在changgou-service-goods微服務下創建com.changgou.goods.dao.BrandMapper接口,代碼如下:

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

繼承了Mapper接口,就自動實現了增刪改查的常用方法。

(2)業務層

創建com.changgou.goods.service.BrandService接口,代碼如下:

1
2
3
4
5
6
7
8
public interface BrandService {

    /***
     * 查詢所有品牌
     * @return
     */
    List<Brand> findAll();
}

創建com.changgou.goods.service.impl.BrandServiceImpl實現類,代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class BrandServiceImpl {

    @Autowired
    private BrandMapper brandMapper;

    /**
     * 全部數據
     * @return
     */
    public List<Brand> findAll(){
        return brandMapper.selectAll();
    }
}

(3)控制層

控制層 com.changgou.goods包下創建controller包 ,包下創建類

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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://localhost:18081/brand

4.3.2 根據ID查詢品牌

(1)業務層

修改com.changgou.goods.service.BrandService接口,添加根據ID查詢品牌數據方法,代碼如下:

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

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

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

(2)控制層

BrandController新增方法

1
2
3
4
5
6
7
8
9
10
11
/***
 * 根據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://localhost:18081/brand/14026

4.3.3 新增品牌

(1)業務層

修改com.changgou.goods.service.BrandService,新增方法

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

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

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

(2) 控制層

BrandController新增方法

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

測試:http://localhost:18081/brand

4.3.4 修改品牌

(1)業務層

需改com.changgou.goods.service.BrandService,添加修改品牌方法,代碼如下:

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

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

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

(2)控制層

BrandController新增方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/***
 * 修改品牌數據
 * @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://localhost:18081/brand/325415

4.3.5 刪除品牌

(1)業務層

修改com.changgou.goods.service.BrandService,添加刪除品牌方法,代碼如下:

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

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

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

(2)控制層

BrandController新增方法

1
2
3
4
5
6
7
8
9
10
/***
 * 根據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

4.3.6 品牌列表條件查詢

(1)業務層

修改com.changgou.goods.service.BrandService,增加根據條件搜索品牌方法,代碼如下:

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

修改com.changgou.goods.service.impl.BrandServiceImpl,添加根據多條件搜索品牌方法的實現,代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
 * 條件查詢
 * @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新增方法

1
2
3
4
5
6
7
8
9
10
/***
 * 多條件搜索品牌數據
 * @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://localhost:18081/brand/search

4.3.7 品牌列表分頁查詢

(1)業務層

修改com.changgou.goods.service.BrandService添加分頁方法,代碼如下:

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

修改com.changgou.goods.service.impl.BrandServiceImpl添加分頁方法實現,代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * 分頁查詢
 * @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新增方法

1
2
3
4
5
6
7
8
9
10
11
12
/***
 * 分頁搜索實現
 * @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://localhost:18081/brand/search/1/3

4.3.8 品牌列表條件+分頁查詢

(1)業務層

修改com.changgou.goods.service.BrandService,增加多條件分頁查詢方法,代碼如下:

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

修改com.changgou.goods.service.impl.BrandServiceImpl,添加多條件分頁查詢方法代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * 條件+分頁查詢
 * @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新增方法

1
2
3
4
5
6
7
8
9
10
11
12
13
/***
 * 分頁搜索實現
 * @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://localhost:18081/brand/search/1/3

4.3.9 公共異常處理

爲了使我們的代碼更容易維護,我們創建一個類集中處理異常,該異常類可以創建在changgou-common工程中,創建com.changgou.framework.exception.BaseExceptionHandler,代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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上,所有的異常都會被捕獲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章