【B2C-爱购物商城】 开发文档 day01

版权声明:★Study hard and make progress every day.☺★ https://blog.csdn.net/qq_38225558/article/details/86170949

商城分类

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

猜你喜欢

转载自blog.csdn.net/qq_38225558/article/details/86170949