上一篇: 微服务(六)—— 注册中心模块(backend-server).
一、创建项目
首先创建一个SpringBoot项目,具体创建过程和 微服务(三)—— 用户模块(backend-user).一样。
二、项目结构
1.目录结构
和用户模块、产品模块一样,传统的Controller层、Service层、Dao层,数据库表对应的实体类是通过 MyBatis插件 逆向生成,详见微服务(三)—— MyBatis逆向工程模块(backend-generator).,所以Dao层是Mapper接口,和 resources/mappers/ShippingMapper.xml 生成一一映射的关系。
2.具体类介绍
(1) 首先看给前端提供接口的类ShippingController
package com.aiun.shipping.controller;
/**
* 收货地址
* @author lenovo
*/
@Api(tags = "收获地址相关接口")
@RestController
@RequestMapping("/shipping/")
public class ShippingController {
@Autowired
private IShippingService iShippingService;
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 增加收货地址
* @param request 请求
* @param shipping 地址信息
* @return 返回结果
*/
@PostMapping("add")
@ApiOperation(value = "增加收货地址")
public ServerResponse add(HttpServletRequest request, Shipping shipping) {
ServerResponse hasLogin = loginHasExpired(request);
if (hasLogin.isSuccess()) {
User user = (User) hasLogin.getData();
return iShippingService.add(user.getId(), shipping);
}
return hasLogin;
}
/**
* 删除收货地址
* @param request 请求
* @param shippingId 地址 id
* @return 返回结果
*/
@DeleteMapping("del")
@ApiOperation(value = "删除收货地址")
public ServerResponse del(HttpServletRequest request, Integer shippingId) {
ServerResponse hasLogin = loginHasExpired(request);
if (hasLogin.isSuccess()) {
User user = (User) hasLogin.getData();
return iShippingService.del(user.getId(), shippingId);
}
return hasLogin;
}
/**
* 更新收货地址
* @param request 请求
* @param shipping 地址信息
* @return 返回结果
*/
@PostMapping("update")
@ApiOperation(value = "更新收货地址")
public ServerResponse update(HttpServletRequest request, Shipping shipping) {
ServerResponse hasLogin = loginHasExpired(request);
if (hasLogin.isSuccess()) {
User user = (User) hasLogin.getData();
return iShippingService.update(user.getId(), shipping);
}
return hasLogin;
}
/**
* 查询收货地址
* @param request 请求
* @param shippingId 地址 id
* @return 地址信息
*/
@PostMapping("select")
@ApiOperation(value = "查询收货地址")
public ServerResponse<Shipping> select(HttpServletRequest request, Integer shippingId) {
ServerResponse hasLogin = loginHasExpired(request);
if (hasLogin.isSuccess()) {
User user = (User) hasLogin.getData();
return iShippingService.select(user.getId(), shippingId);
}
return hasLogin;
}
/**
* 查询某用户的所有收货地址,并分页
* @param pageNum 当前页
* @param pageSize 页大小
* @param request 请求
* @return
*/
@PostMapping("list")
@ApiOperation(value = "查询某用户的所有收货地址,并分页")
public ServerResponse<PageInfo> list(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
@RequestParam(value = "pageSize", defaultValue = "10") int pageSize,
HttpServletRequest request) {
ServerResponse hasLogin = loginHasExpired(request);
if (hasLogin.isSuccess()) {
User user = (User) hasLogin.getData();
return iShippingService.list(user.getId(), pageNum, pageSize);
}
return hasLogin;
}
/**
* 对外提供的服务
* 根据ID查询Shipping数据
* @param id 产品 id
* @return 产品信息类
*/
@GetMapping("{id}")
public Shipping findById(@PathVariable(name="id") Integer id) {
return iShippingService.findById(id);
}
/**
* 判断用户登录是否过期
* @param request 请求
* @return 结果
*/
private ServerResponse<User> loginHasExpired(HttpServletRequest request) {
String key = request.getHeader(UserConst.AUTHORITY);
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
String value = valueOperations.get(key);
if (StringUtils.isEmpty(value)) {
return ServerResponse.createByErrorMessage(ResponseCode.NEED_LOGIN.getCode(), ResponseCode.NEED_LOGIN.getDesc());
}
User user = JsonUtils.jsonStr2Object(value, User.class);
if (!key.equals(user.getUsername())) {
return ServerResponse.createByErrorMessage(ResponseCode.NEED_LOGIN.getCode(), ResponseCode.NEED_LOGIN.getDesc());
}
valueOperations.set(key, value, 1, TimeUnit.HOURS);
return ServerResponse.createBySuccess(user);
}
}
这个类里向前端提供后端数据的增、删、改、查接口,初次之外还用Redis做了一个用户登录状态的验证
(2)看Controller的调用层Service的实现类ShippingServiceImpl
package com.aiun.shipping.service.impl;
/**
* @author lenovo
*/
@Service("iShippingService")
public class ShippingServiceImpl implements IShippingService {
@Autowired
private ShippingMapper shippingMapper;
@Override
public ServerResponse add(Integer userId, Shipping shipping) {
shipping.setUserId(userId);
int rowCount = shippingMapper.insert(shipping);
if (rowCount > 0) {
Map resultMap