电商系统开发实战-用户微服务基础模块开发
1.用户微服务项目开发之收货地址查询接口开发
1.1 配置文件配置 application.yml
server:
port: 9001
spring:
application:
name: sundablog-user-service
#数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/xdclass_user?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: sunda
password: 1314520abcD!
redis:
host: 127.0.0.1
port: 6379
password: rg81jYx9Yb6F2QSU
#配置plus打印sql日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#设置日志级别,ERROR/WARN/INFO/DEBUG,默认是INFO以上才显示
logging:
level:
root: INFO
1.2 启动类
@SpringBootApplication
@MapperScan("com.sundablog.mapper")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class);
}
}
1.3 接口类
public interface AddressService {
/**
* 根据ID查询地址信息
* @param id
* @return
*/
AddressDO detail(long id);
}
1.4接口实现类
@Service
public class AddressServiceImpl implements AddressService {
@Resource
private AddressMapper addressMapper;
@Override
public AddressDO detail(long id) {
return addressMapper.selectOne(new QueryWrapper<AddressDO>().eq("id", id));
}
}
1.5 控制器类
@Api(tags = "用户地址模块")
@RestController
@RequestMapping("/api/address/v1/")
public class AddressController {
@Resource
private AddressService addressService;
@ApiOperation("根据id查询地址接口")
@GetMapping("find")
public JsonData detai(Long addressId){
AddressDO detail = addressService.detail(addressId);
return JsonData.buildSuccess(detail);
}
}
1.6 Postman 请求测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1MxR0WlM-1622166627505)(https://image.sundablog.com/image-20210526115149301_1622001206729.png)]
2.微服务项目整合SwaggerUI3.0生成文档
2.1 common项目 新增SwaggerUI3.0依赖,parent项目已经声明了版本
<!--swagger ui接口文档依赖-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
2.2 SwaggerConfiguration配置类开发
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Component
@EnableOpenApi
@Data
public class SwaggerConfiguration {
@Bean
public Docket webApiDoc(){
return new Docket(DocumentationType.OAS_30)
.groupName("用户端接口文档")
.pathMapping("/")
// 定义是否开启swagger,false为关闭,可以通过变量控制,线上关闭
.enable(true)
//配置api文档元信息
.apiInfo(apiInfo())
// 选择哪些接口作为swagger的doc发布
.select()
.apis(RequestHandlerSelectors.basePackage("com.sundablog"))
//正则匹配请求路径,并分配至当前分组
.paths(PathSelectors.ant("/api/**"))
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("电商平台")
.description("微服务接口文档")
.contact(new Contact("孙达博客", "https://www.sundablog.com", "18211102099@163.com"))
.version("1.0")
.build();
}
}
2.3访问地址
访问地址 http://localhost:9001/swagger-ui/index.html#/
3. 统一接口响应协议-响应工具类封装
3.1 统一业务状态码 BizCodeEnum开发
public enum BizCodeEnum {
/**
* 通用操作码
*/
OPS_REPEAT(110001,"重复操作"),
/**
*验证码
*/
CODE_TO_ERROR(240001,"接收号码不合规"),
CODE_LIMITED(240002,"验证码发送过快"),
CODE_ERROR(240003,"验证码错误"),
CODE_CAPTCHA(240101,"图形验证码错误"),
/**
* 账号
*/
ACCOUNT_REPEAT(250001,"账号已经存在"),
ACCOUNT_UNREGISTER(250002,"账号不存在"),
ACCOUNT_PWD_ERROR(250003,"账号或者密码错误");
private int code;
private String message;
private BizCodeEnum(int code,String message){
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
public void setCode(int code) {
this.code = code;
}
public void setMessage(String message) {
this.message = message;
}
}
3.2 接口统一JsonData工具类开发
import com.sundablog.enums.BizCodeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class JsonData {
/**
* 状态码 0 表示成功,1表示处理中,-1表示失败
*/
private Integer code;
/**
* 数据
*/
private Object data;
/**
* 描述
*/
private String msg;
/**
* 成功,传入数据
* @return
*/
public static JsonData buildSuccess() {
return new JsonData(0, null, null);
}
/**
* 成功,传入数据
* @param data
* @return
*/
public static JsonData buildSuccess(Object data) {
return new JsonData(0, data, null);
}
/**
* 失败,传入描述信息
* @param msg
* @return
*/
public static JsonData buildError(String msg) {
return new JsonData(-1, null, msg);
}
/**
* 自定义状态码和错误信息
* @param code
* @param msg
* @return
*/
public static JsonData buildCodeAndMsg(int code, String msg) {
return new JsonData(code, null, msg);
}
/**
* 传入枚举,返回信息
* @param codeEnum
* @return
*/
public static JsonData buildResult(BizCodeEnum codeEnum){
return JsonData.buildCodeAndMsg(codeEnum.getCode(),codeEnum.getMessage());
}
}
4.自定义全局异常+处理器handler开发
4.1自定义全局异常
@Data
public class BizException extends RuntimeException{
private Integer code;
private String msg;
public BizException(Integer code, String message) {
super(message);
this.code = code;
this.msg = message;
}
public BizException(BizCodeEnum bizCodeEnum) {
super(bizCodeEnum.getMessage());
this.code = bizCodeEnum.getCode();
this.msg = bizCodeEnum.getMessage();
}
}
4.2 自定义异常处理器
@ControllerAdvice
@Slf4j
public class ExceptionHandle {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public JsonData Handle(Exception e) {
if (e instanceof BizException) {
BizException bizException = (BizException) e;
log.info("[业务异常]{}", e);
return JsonData.buildCodeAndMsg(bizException.getCode(), bizException.getMsg());
} else {
log.info("[系统异常]{}", e);
return JsonData.buildError("全局异常,未知错误");
}
}
}
4.3 集成Spring Boot Test单元测试和sql日志打印
4.3.1 common项目添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
4.3.2 sundablog-user-service项目新建测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = UserApplication.class)
@Slf4j
public class AddressTest {
@Resource
private AddressService addressService;
@Test
public void testAddressDetail(){
AddressDO addressDO = addressService.detail(2);
log.info(addressDO.toString());
Assert.assertNotNull(addressDO);
}
}
4.3.3 Mybatis plus配置控制台打印日志
#配置plus打印sql日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl