最终效果
数据库表设计
用户地址单独为一张表,因为一个用户可能会设置多个收货地址
编写service
package com.shiers.service;
import com.shiers.pojo.UserAddress;
import com.shiers.pojo.bo.AddressBO;
import java.util.List;
/**
* Demo class
*
* @author shierS
* @date 2021/5/29
*/
public interface AddressService {
/**
* 根据用户Id查询用户收货地址列表
* @param userId
* @return
*/
public List<UserAddress> queryAll(String userId);
/**
* 用于新增用户地址
* @param addressBO
*/
public void addNewUserAddress(AddressBO addressBO);
/**
* 用户修改地址
* @param addressBO
*/
public void updateUserAddress(AddressBO addressBO);
/**
* 根据用户id和地址id,删除对应的地址信息
* @param userId
* @param addressId
*/
public void deleteUserAddress(String userId,String addressId);
/**
* 根据用户id和地址id,设置默认地址
* @param userId
* @param addressId
*/
public void updateUserAddressToBeDefault(String userId,String addressId);
}
package com.shiers.service.impl;
import com.shiers.enums.YesOrNo;
import com.shiers.mapper.UserAddressMapper;
import com.shiers.pojo.UserAddress;
import com.shiers.pojo.bo.AddressBO;
import com.shiers.service.AddressService;
import org.n3r.idworker.Sid;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
* Demo class
*
* @author shierS
* @date 2021/5/29
*/
@Service
public class AddressServiceImpl implements AddressService {
@Autowired
private UserAddressMapper userAddressMapper;
@Autowired
private Sid sid;
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<UserAddress> queryAll(String userId) {
UserAddress ua = new UserAddress();
ua.setUserId(userId);
return userAddressMapper.select(ua);
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void addNewUserAddress(AddressBO addressBO) {
//1、判断当前用户是否存在地址,如果没有,则新增为默认地址
Integer isDefault = 0;
List<UserAddress> addressList = this.queryAll(addressBO.getUserId());
if (addressList == null || addressList.isEmpty() || addressList.size() == 0) {
isDefault = 1;
}
//定义主键Id
String addressId = sid.nextShort();
//2、保存地址到数据库
UserAddress newAddress = new UserAddress();
//将addressBO中对应的属性字段填充到newAddress中
BeanUtils.copyProperties(addressBO,newAddress);
//填充剩余字段
newAddress.setId(addressId);
newAddress.setIsDefault(isDefault);
newAddress.setCreatedTime(new Date());
newAddress.setUpdatedTime(new Date());
userAddressMapper.insert(newAddress);
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void updateUserAddress(AddressBO addressBO) {
String addressId = addressBO.getAddressId();
UserAddress pendingAddress = new UserAddress();
BeanUtils.copyProperties(addressBO,pendingAddress);
pendingAddress.setId(addressId);
pendingAddress.setUpdatedTime(new Date());
userAddressMapper.updateByPrimaryKeySelective(pendingAddress);
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void deleteUserAddress(String userId, String addressId) {
UserAddress address = new UserAddress();
address.setId(addressId);
address.setUserId(userId);
userAddressMapper.delete(address);
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void updateUserAddressToBeDefault(String userId, String addressId) {
//1.查找默认地址设置为不默认
UserAddress queryAddress = new UserAddress();
queryAddress.setUserId(userId);
queryAddress.setIsDefault(YesOrNo.YES.type);
//将为默认地址的数据都查询出来,主要是为了放置数据紊乱,有多个默认地址出现,这样可以解决数据紊乱,为一种保险措施
List<UserAddress> list = userAddressMapper.select(queryAddress);
for (UserAddress ua : list) {
ua.setIsDefault(YesOrNo.NO.type);
userAddressMapper.updateByPrimaryKeySelective(ua);
}
//2.根据地址id修改为默认地址
UserAddress defaultAddress = new UserAddress();
defaultAddress.setId(addressId);
defaultAddress.setUserId(userId);
defaultAddress.setIsDefault(YesOrNo.YES.type);
userAddressMapper.updateByPrimaryKeySelective(defaultAddress);
}
}
编写Controller
package com.shiers.controller;
import com.shiers.pojo.UserAddress;
import com.shiers.pojo.bo.AddressBO;
import com.shiers.service.AddressService;
import com.shiers.utils.MobileEmailUtils;
import com.shiers.utils.MyJSONResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
/**
* Demo classO
*
* @author shierS
* @date 2021/5/21
*/
@Api(value = "地址相关" ,tags = {"地址相关API接口"})
@RequestMapping("address")
@RestController
public class AddressController {
/**
* 用户在确认订单页面,可以针对收货地址做如下操作:
* 1、查询用户所有收货地址列表
* 2、新增地址
* 3、删除地址
* 4、修改地址
* 5、设置默认地址
*/
@Autowired
private AddressService addressService;
@ApiOperation(value = "根据用户id查询收货地址列表",notes = "根据用户id查询收货地址列表",httpMethod = "POST")
@PostMapping("/list")
public MyJSONResult list(@RequestParam String userId){
if (StringUtils.isBlank(userId)){
return MyJSONResult.errorMsg("");
}
List<UserAddress> list = addressService.queryAll(userId);
return MyJSONResult.ok(list);
}
@ApiOperation(value = "用户新增地址",notes = "用户新增地址",httpMethod = "POST")
@PostMapping("/add")
public MyJSONResult add(@RequestBody AddressBO addressBO) {
MyJSONResult checkRes = checkAddress(addressBO);
if (checkRes.getStatus() != 200) {
return checkRes;
}
addressService.addNewUserAddress(addressBO);
return MyJSONResult.ok();
}
private MyJSONResult checkAddress(AddressBO addressBO) {
String receiver = addressBO.getReceiver();
if (StringUtils.isBlank(receiver)) {
return MyJSONResult.errorMsg("收货人不能为空");
}
if (receiver.length() > 12) {
return MyJSONResult.errorMsg("收货人姓名不能太长");
}
String mobile = addressBO.getMobile();
if (StringUtils.isBlank(mobile)) {
return MyJSONResult.errorMsg("收货人手机号不能为空");
}
if (mobile.length() != 11) {
return MyJSONResult.errorMsg("收货人手机号长度不正确");
}
boolean isMobileOk = MobileEmailUtils.checkMobileIsOk(mobile);
if (!isMobileOk) {
return MyJSONResult.errorMsg("收货人手机号格式不正确");
}
String province = addressBO.getProvince();
String city = addressBO.getCity();
String district = addressBO.getDistrict();
String detail = addressBO.getDetail();
if (StringUtils.isBlank(province) ||
StringUtils.isBlank(city) ||
StringUtils.isBlank(district) ||
StringUtils.isBlank(detail)) {
return MyJSONResult.errorMsg("收货地址信息不能为空");
}
return MyJSONResult.ok();
}
@ApiOperation(value = "用户修改地址",notes = "用户修改地址",httpMethod = "POST")
@PostMapping("/update")
public MyJSONResult update(@RequestBody AddressBO addressBO) {
if (StringUtils.isBlank(addressBO.getAddressId())){
return MyJSONResult.errorMsg("修改地址错误:addressId不能为空");
}
MyJSONResult checkRes = checkAddress(addressBO);
if (checkRes.getStatus() != 200) {
return checkRes;
}
addressService.updateUserAddress(addressBO);
return MyJSONResult.ok();
}
@ApiOperation(value = "用户删除地址",notes = "用户删除地址",httpMethod = "POST")
@PostMapping("/delete")
public MyJSONResult delete(
@RequestParam String userId,
@RequestParam String addressId) {
if (StringUtils.isBlank(userId) || StringUtils.isBlank(addressId) ){
return MyJSONResult.errorMsg("");
}
addressService.deleteUserAddress(userId,addressId);
return MyJSONResult.ok();
}
@ApiOperation(value = "用户设置默认地址",notes = "用户设置默认地址",httpMethod = "POST")
@PostMapping("/setDefalut")
public MyJSONResult setDefalut(
@RequestParam String userId,
@RequestParam String addressId) {
if (StringUtils.isBlank(userId) || StringUtils.isBlank(addressId) ){
return MyJSONResult.errorMsg("");
}
addressService.updateUserAddressToBeDefault(userId,addressId);
return MyJSONResult.ok();
}
}