商城分类
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