最终效果
数据库表设计
用户地址单独为一张表,因为一个用户可能会设置多个收货地址
编写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*/@Servicepublic class AddressServiceImpl implements AddressService {@Autowiredprivate UserAddressMapper userAddressMapper;@Autowiredprivate Sid sid;@Transactional(propagation = Propagation.SUPPORTS)@Overridepublic List<UserAddress> queryAll(String userId) {UserAddress ua = new UserAddress();ua.setUserId(userId);return userAddressMapper.select(ua);}@Transactional(propagation = Propagation.REQUIRED)@Overridepublic 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;}//定义主键IdString 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)@Overridepublic 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)@Overridepublic void deleteUserAddress(String userId, String addressId) {UserAddress address = new UserAddress();address.setId(addressId);address.setUserId(userId);userAddressMapper.delete(address);}@Transactional(propagation = Propagation.REQUIRED)@Overridepublic 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")@RestControllerpublic class AddressController {/*** 用户在确认订单页面,可以针对收货地址做如下操作:* 1、查询用户所有收货地址列表* 2、新增地址* 3、删除地址* 4、修改地址* 5、设置默认地址*/@Autowiredprivate 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();}}
