1. 程式人生 > >【B2C-愛購物商城】 開發文件 day01

【B2C-愛購物商城】 開發文件 day01

商城分類

B2B 公司對公司性質的銷售方式,比如阿里巴巴。  批發
B2C 公司對個質的銷售方式,比如天貓,京東 能把控質量,樹立良好品牌形象
C2C 個人對個人的銷售方式,比如淘寶網。  發展比較快
B2C2C 既支援自營,也支援入住天貓,京東等 主力模式

我們的選擇:b2c -> c2c -> b2c2

愛購網是什麼?

愛購網上商城是為xxx公司開發b2c商城,原來該公司是做yyy線下銷售的,銷售渠道有限。後來它們為了拓寬銷售渠道,增加銷售額,委託我們公司開發這個商城系統。


1)會員可以在商城瀏覽商品、下訂單,以及參加各種活動。
2)管理員、運營可以在平臺後臺管理系統中管理商品、訂單、會員等。
3)客服可以在後臺管理系統中處理使用者的詢問以及投訴。
4)希望未來3到5年可以支援百萬使用者的併發使用

架構:

整體使用前後端分離【後端:springcloud微服務架構+前臺:vue】

官網圖:

   

後端專案原型搭建

maven結構:


環境搭建 - 頂級父工程 

pom檔案 - 匯入依賴

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    <springboot.version>2.0.5.RELEASE</springboot.version>
</properties>

<!--管理springboot和springcloud的版本-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${springboot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Eureka - 

pom檔案 - 匯入依賴

<dependencies>
    <!--springboot支援-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!--Eureka服務端支援-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

配置檔案 

spring:
  application:
    name: aigou-eureka
server:
  port: 7001
eureka:
  instance:
    hostname: eureka
  client:
    registerWithEureka: false #是否要註冊到eureka
    fetchRegistry: false #表示是否從Eureka Server獲取註冊資訊
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #單機配置

入口類

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication_7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication_7001.class,args);
    }
}

Zuul - 

pom檔案 - 匯入依賴:

<dependencies>
    <!-- springboot支援 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- springboot測試 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!-- eureka客戶端支援 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- Zuul閘道器支援 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    <!--swagger支援-->
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
</dependencies>

配置檔案 

server:
  port: 9527
spring:
  application:
    name: aigou-zuul-gateway
eureka:
  client:
    service-url:
     defaultZone: http://localhost:7001/eureka  #告訴服務提供者要把服務註冊到哪兒 #單機環境
  instance:
    instance-id: gateway-9527.com #Eureka狀態那一列顯示的名字
    prefer-ip-address: true #顯示客戶端真實ip
zuul:
  routes:  #這一坨用來配置讓我們的服務名不暴露,用別名plat代替,並且使用服務名不能訪問,只能使用別名才能訪問!
    plat.serviceId: aigou-plat #注意:前面的plat是隨便寫的,但後面的serviceId不能隨便寫!!!
    plat.path: /plat/** #以/user/開頭的所有路徑都轉發給user-provider
  ignored-services: "*" #可以一個一個配置,但是很麻煩,-》因此用*來通配-代替
  prefix: "/services" #加上統一字首

入口類:

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy  //啟用閘道器
public class ZuulGatewayApplication_9527 {
    public static void main(String[] args) {
        SpringApplication.run(ZuulGatewayApplication_9527.class,args);
    }
}

基礎模組 - 

基礎模組工具 -    - basic子工程

//Ajax請求響應物件的類
public class AjaxResult {
    private boolean success = true;
    private String message = "操作成功!";
    private Object resultObj;//返回到前臺物件
    // TODO 現在的方式:
    //AjaxResult.me  -》成功
    //AjaxResult.me().setMessage()  -》成功
    //AjaxResult.me.setSuccess(false).setMessage("失敗") -》失敗
    public static AjaxResult me(){
        return new AjaxResult();
    }
/*  TODO 以前的方式:
    //成功
    public AjaxResult() { }
    //失敗並且有提示
    public AjaxResult(String message) {
        this.success = false;
        this.message = message;
    }*/
    public boolean isSuccess() {
        return success;
    }
    public AjaxResult setSuccess(boolean success) {
        this.success = success;
        return this;
    }
    public String getMessage() {
        return message;
    }
    public AjaxResult setMessage(String message) {
        this.message = message;
        return this;
    }
    public Object getResultObj(){
        return resultObj;
    }
    public AjaxResult setResultObj(Object resultObj){
        this.resultObj = resultObj;
        return this;
    }
}

平臺服務搭建 -  -父工程

子工程 - 

pom檔案:

<dependencies>
    <!--公共依賴-依賴介面部分(介面依賴basic_util部分)-->
    <dependency>
        <groupId>com.zhengqing</groupId>
        <artifactId>plat_interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--springboot支援-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!--eureka客戶端支援 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--引入swagger支援-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
</dependencies>

配置檔案 

server:
  port: 8001
spring:
  application:
    name: aigou-plat
eureka:
  client:
    service-url:
     defaultZone: http://localhost:7001/eureka  #告訴服務提供者要把服務註冊到哪兒 #單機環境
  instance:
    prefer-ip-address: true #顯示客戶端真實ip

入口類

@SpringBootApplication
@EnableEurekaClient
public class PlatApplication_8001 {
    public static void main(String[] args) {
        SpringApplication.run(PlatApplication_8001.class);
    }
}

員工服務編寫 - 模擬

@RestController
public class LoginController {
    /**
     * 引數: Employee
     * 返回值:登入是否成功 AjaxResult
     */
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    //以後傳遞物件前大都要用json物件{},[],後臺通過@RequestBody
    public AjaxResult login(@RequestBody Employee employee){
        //模擬:只有使用者名稱為admin,密碼為admin才能登陸
        if ("admin".equals(employee.getName())&&"admin".equals(employee.getPassword())){
            return AjaxResult.me();
        }
        return AjaxResult.me().setSuccess(false).setMessage("使用者名稱或密碼不正確!");
    }
}

啟動測試:

介面測試工具Postman 

安裝 - 雙擊即可

     

簡單使用 - ①為建立組   ②為遍寫json資料+post請求  ③為傳送請求

介面文件Swagger

依賴:   -  前面8001操作中已經匯入  -這裡知道要匯入哪些就好

<!--引入swagger支援-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

1> 本專案配置 

@Configuration
@EnableSwagger2
public class Swagger2 {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //對外暴露服務的包,以controller的方式暴露,所以就是controller的包.
                .apis(RequestHandlerSelectors.basePackage("com.zhengqing.aigou.controller"))
                .paths(PathSelectors.any())
                .build();
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("平臺服務api")
                .description("平臺服務介面文件說明")
                .contact(new Contact("鄭清", "", "[email protected]"))
                .version("1.0")
                .build();
    }
}

本專案訪問:http://127.0.0.1:8001/swagger-ui.html

2> 閘道器配置  

需求:前端開發每次都要記錄每個服務ip不好,期望只記憶閘道器ip就ok

pom檔案依賴 - 前面以及匯入 - 這裡知道即可

<!--swagger支援-->
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

配置:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo());
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("分散式購物系統")
                .description("購物系統介面文件說明")
                .termsOfServiceUrl("http://localhost:8081")
                .contact(new Contact("鄭清", "", "[email protected]"))
                .version("1.0")
                .build();
    }
}
@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {
    @Override
    public List<SwaggerResource> get() {
        List resources = new ArrayList<>();
        //plat,user等都是閘道器中配置路徑,而且如果有字首,需要加上
        resources.add(swaggerResource("平臺服務系統", "/services/plat/v2/api-docs", "2.0"));
        resources.add(swaggerResource("使用者系統", "/services/user/v2/api-docs", "2.0"));
        resources.add(swaggerResource("基礎系統", "/services/common/v2/api-docs", "2.0"));
        return resources;
    }
    private SwaggerResource swaggerResource(String name, String location, String version) {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(name);
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion(version);
        return swaggerResource;
    }
}

測試:http://127.0.0.1:9527/swagger-ui.html


原始碼和文件:https://pan.baidu.com/s/1d3U9l--oIpJ1Mr3JEZ4vcg