继续迁移用户收件地址的代码

This commit is contained in:
YunaiV
2020-07-23 19:02:33 +08:00
parent 6ae48b6543
commit 84d4e604b1
82 changed files with 1242 additions and 1875 deletions

View File

@@ -18,9 +18,8 @@ public interface UserErrorCodeConstants {
ErrorCode USER_SMS_CODE_SEND_TOO_FAST = new ErrorCode(1001001205, "短信发送过于频率");
// ========== 用户地址 ==========
ErrorCode USER_ADDRESS_NOT_EXISTENT = new ErrorCode(1001004000, "用户地址不存在!");
ErrorCode USER_ADDRESS_IS_DELETED = new ErrorCode(1001004001, "用户地址已被删除!");
ErrorCode USER_GET_ADDRESS_NOT_EXISTS = new ErrorCode(1001004002, "获取的地址不存在!");
ErrorCode USER_ADDRESS_NOT_FOUND = new ErrorCode(1001004000, "用户地址不存在!");
ErrorCode USER_GET_ADDRESS_NOT_EXISTS = new ErrorCode(1001004001, "获取的地址不存在!");
// ========== 用户信息模块 1004004100 ==========
ErrorCode USER_NOT_EXISTS = new ErrorCode(1004004100, "用户不存在");

View File

@@ -0,0 +1,62 @@
package cn.iocoder.mall.userservice.rpc.address;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressCreateReqDTO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressRespDTO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressUpdateReqDTO;
import java.util.List;
/**
* 用户收件地址 Rpc 接口
*/
public interface UserAddressRpc {
/**
* 创建用户收件地址
*
* @param createDTO 创建用户收件地址 DTO
* @return 用户收件地址编号
*/
CommonResult<Integer> createUserAddress(UserAddressCreateReqDTO createDTO);
/**
* 更新用户收件地址
*
* @param updateDTO 更新用户收件地址 DTO
*/
CommonResult<Boolean> updateUserAddress(UserAddressUpdateReqDTO updateDTO);
/**
* 删除用户收件地址
*
* @param userAddressId 用户收件地址编号
*/
CommonResult<Boolean> deleteUserAddress(Integer userAddressId);
/**
* 获得用户收件地址
*
* @param userAddressId 用户收件地址编号
* @return 用户收件地址
*/
CommonResult<UserAddressRespDTO> getUserAddress(Integer userAddressId);
/**
* 获得用户收件地址列表
*
* @param userAddressIds 用户收件地址编号列表
* @return 用户收件地址列表
*/
CommonResult<List<UserAddressRespDTO>> listUserAddresses(List<Integer> userAddressIds);
/**
* 获取指定用户的收件地址列表
*
* @param userId 用户编号
* @param type 地址类型
* @return 收件地址列表
*/
CommonResult<List<UserAddressRespDTO>> listUserAddresses(Integer userId, Integer type);
}

View File

@@ -0,0 +1,58 @@
package cn.iocoder.mall.userservice.rpc.address.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 用户收件地址创建 Request DTO
*/
@Data
@Accessors(chain = true)
public class UserAddressCreateReqDTO implements Serializable {
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 收件人名称
*/
@NotEmpty(message = "收件人名称不能为空")
private String name;
/**
* 手机号
*/
@NotEmpty(message = "手机号不能为空")
private String mobile;
/**
* 省份编号
*/
@NotNull(message = "省份编号不能为空")
private Integer provinceCode;
/**
* 城市编号
*/
@NotNull(message = "城市编号不能为空")
private Integer cityCode;
/**
* 区域编号
*/
@NotNull(message = "区域编号不能为空")
private Integer countyCode;
/**
* 收件详细地址
*/
@NotEmpty(message = "收件详细地址不能为空")
private String detailAddress;
/**
* 地址类型
*/
@NotNull(message = "地址类型不能为空")
private Integer type;
}

View File

@@ -0,0 +1,57 @@
package cn.iocoder.mall.userservice.rpc.address.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 用户收件地址 Response DTO
*/
@Data
@Accessors(chain = true)
public class UserAddressRespDTO implements Serializable {
/**
* 收件地址编号
*/
private Integer id;
/**
* 用户编号
*/
private Integer userId;
/**
* 收件人名称
*/
private String name;
/**
* 手机号
*/
private String mobile;
/**
* 省份编号
*/
private Integer provinceCode;
/**
* 城市编号
*/
private Integer cityCode;
/**
* 区域编号
*/
private Integer countyCode;
/**
* 收件详细地址
*/
private String detailAddress;
/**
* 地址类型
*/
private Integer type;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,70 @@
package cn.iocoder.mall.userservice.rpc.address.dto;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.common.framework.validator.Mobile;
import cn.iocoder.mall.userservice.enums.address.UserAddressType;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 用户收件地址更新 Request DTO
*/
@Data
@Accessors(chain = true)
public class UserAddressUpdateReqDTO implements Serializable {
/**
* 收件地址编号
*/
@NotNull(message = "收件地址编号不能为空")
private Integer id;
/**
* 用户编号
*
* TODO 正在讨论
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 收件人名称
*/
@NotEmpty(message = "收件人名称不能为空")
private String name;
/**
* 手机号
*/
@NotEmpty(message = "手机号不能为空")
@Mobile
private String mobile;
/**
* 省份编号
*/
@NotNull(message = "省份编号不能为空")
private Integer provinceCode;
/**
* 城市编号
*/
@NotNull(message = "城市编号不能为空")
private Integer cityCode;
/**
* 区域编号
*/
@NotNull(message = "区域编号不能为空")
private Integer countyCode;
/**
* 收件详细地址
*/
@NotEmpty(message = "收件详细地址不能为空")
private String detailAddress;
/**
* 地址类型
*/
@NotNull(message = "地址类型不能为空")
@InEnum(value = UserAddressType.class, message = "地址类型必须是 {value}")
private Integer type;
}

View File

@@ -64,6 +64,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
@@ -78,18 +79,6 @@
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>javax.el</groupId>-->
<!-- <artifactId>javax.el-api</artifactId>-->
<!-- <version>3.0.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>javax.el</groupId>-->
<!-- <artifactId>javax.el-api</artifactId>-->
<!-- <version>3.0.1-b06</version>-->
<!-- </dependency>-->
</dependencies>
</project>

View File

@@ -0,0 +1,36 @@
package cn.iocoder.mall.userservice.convert.address;
import cn.iocoder.mall.userservice.dal.mysql.dataobject.address.UserAddressDO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressCreateReqDTO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressRespDTO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressUpdateReqDTO;
import cn.iocoder.mall.userservice.service.address.bo.UserAddressBO;
import cn.iocoder.mall.userservice.service.address.bo.UserAddressCreateBO;
import cn.iocoder.mall.userservice.service.address.bo.UserAddressUpdateBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface UserAddressConvert {
UserAddressConvert INSTANCE = Mappers.getMapper(UserAddressConvert.class);
UserAddressDO convert(UserAddressCreateBO bean);
UserAddressBO convert(UserAddressDO bean);
UserAddressDO convert(UserAddressUpdateBO bean);
List<UserAddressBO> convertList(List<UserAddressDO> list);
UserAddressCreateBO convert(UserAddressCreateReqDTO bean);
UserAddressUpdateBO convert(UserAddressUpdateReqDTO bean);
UserAddressRespDTO convert(UserAddressBO bean);
List<UserAddressRespDTO> convertList02(List<UserAddressBO> list);
}

View File

@@ -2,6 +2,7 @@ package cn.iocoder.mall.userservice.dal.mysql.dataobject.address;
import cn.iocoder.mall.mybatis.core.dataobject.DeletableDO;
import cn.iocoder.mall.userservice.enums.address.UserAddressType;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -9,13 +10,16 @@ import lombok.experimental.Accessors;
/**
* 用户收件地址
*
* idx_userId 索引基于 {@link #userId} 字段
*
* @author Sin
* @time 2019-04-06 13:22
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class UsersUserAddressDO extends DeletableDO {
@TableName("user_address")
public class UserAddressDO extends DeletableDO {
/**
* 编号

View File

@@ -0,0 +1,19 @@
package cn.iocoder.mall.userservice.dal.mysql.mapper.address;
import cn.iocoder.mall.mybatis.core.query.QueryWrapperX;
import cn.iocoder.mall.userservice.dal.mysql.dataobject.address.UserAddressDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
import javax.annotation.Nullable;
import java.util.List;
@Repository
public interface UserAddressMapper extends BaseMapper<UserAddressDO> {
default List<UserAddressDO> selectListByUserIdAndType(Integer userId, @Nullable Integer type) {
return selectList(new QueryWrapperX<UserAddressDO>().eq("userId", userId)
.eqIfPresent("type", type));
}
}

View File

@@ -0,0 +1,86 @@
package cn.iocoder.mall.userservice.manager.address;
import cn.iocoder.mall.userservice.convert.address.UserAddressConvert;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressCreateReqDTO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressRespDTO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressUpdateReqDTO;
import cn.iocoder.mall.userservice.service.address.UserAddressService;
import cn.iocoder.mall.userservice.service.address.bo.UserAddressBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 用户收件地址 Manager
*/
@Service
public class UserAddressManager {
@Autowired
private UserAddressService userAddressService;
/**
* 创建用户收件地址
*
* @param createDTO 创建用户收件地址 DTO
* @return 用户收件地址
*/
public Integer createUserAddress(UserAddressCreateReqDTO createDTO) {
UserAddressBO userAddressBO = userAddressService.createUserAddress(UserAddressConvert.INSTANCE.convert(createDTO));
return userAddressBO.getId();
}
/**
* 更新用户收件地址
*
* @param updateDTO 更新用户收件地址 DTO
*/
public void updateUserAddress(UserAddressUpdateReqDTO updateDTO) {
userAddressService.updateUserAddress(UserAddressConvert.INSTANCE.convert(updateDTO));
}
/**
* 删除用户收件地址
*
* @param userAddressId 用户收件地址编号
*/
public void deleteUserAddress(Integer userAddressId) {
userAddressService.deleteUserAddress(userAddressId);
}
/**
* 获得用户收件地址
*
* @param userAddressId 用户收件地址编号
* @return 用户收件地址
*/
public UserAddressRespDTO getUserAddress(Integer userAddressId) {
UserAddressBO userAddressBO = userAddressService.getUserAddress(userAddressId);
return UserAddressConvert.INSTANCE.convert(userAddressBO);
}
/**
* 获得用户收件地址列表
*
* @param userAddressIds 用户收件地址编号列表
* @return 用户收件地址列表
*/
public List<UserAddressRespDTO> listUserAddresses(List<Integer> userAddressIds) {
List<UserAddressBO> userAddressBOs = userAddressService.listUserAddresses(userAddressIds);
return UserAddressConvert.INSTANCE.convertList02(userAddressBOs);
}
/**
* 获取指定用户的收件地址列表
*
* @param userId 用户编号
* @param type 地址类型
* @return 收件地址列表
*/
public List<UserAddressRespDTO> listUserAddresses(Integer userId, Integer type) {
List<UserAddressBO> userAddressBOs = userAddressService.listUserAddresses(userId, type);
return UserAddressConvert.INSTANCE.convertList02(userAddressBOs);
}
}

View File

@@ -0,0 +1,56 @@
package cn.iocoder.mall.userservice.rpc.address;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.userservice.manager.address.UserAddressManager;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressCreateReqDTO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressRespDTO;
import cn.iocoder.mall.userservice.rpc.address.dto.UserAddressUpdateReqDTO;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 用户收件地址 Rpc 实现类
*/
@DubboService(version = "${dubbo.provider.UserAddressRpc.version}")
public class UserAddressRpcImpl implements UserAddressRpc {
@Autowired
private UserAddressManager userAddressManager;
@Override
public CommonResult<Integer> createUserAddress(UserAddressCreateReqDTO createDTO) {
return success(userAddressManager.createUserAddress(createDTO));
}
@Override
public CommonResult<Boolean> updateUserAddress(UserAddressUpdateReqDTO updateDTO) {
userAddressManager.updateUserAddress(updateDTO);
return success(true);
}
@Override
public CommonResult<Boolean> deleteUserAddress(Integer userAddressId) {
userAddressManager.deleteUserAddress(userAddressId);
return success(true);
}
@Override
public CommonResult<UserAddressRespDTO> getUserAddress(Integer userAddressId) {
return success(userAddressManager.getUserAddress(userAddressId));
}
@Override
public CommonResult<List<UserAddressRespDTO>> listUserAddresses(List<Integer> userAddressIds) {
return success(userAddressManager.listUserAddresses(userAddressIds));
}
@Override
public CommonResult<List<UserAddressRespDTO>> listUserAddresses(Integer userId, Integer type) {
return success(userAddressManager.listUserAddresses(userId, type));
}
}

View File

@@ -7,7 +7,7 @@ import cn.iocoder.mall.userservice.rpc.sms.dto.UserVerifySmsCodeReqDTO;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service(version = "${dubbo.provider.UserSmsCodeRpc.version}", validation = "false")
@Service(version = "${dubbo.provider.UserSmsCodeRpc.version}")
public class UserSmsCodeRpcImpl implements UserSmsCodeRpc {
@Autowired

View File

@@ -0,0 +1,130 @@
package cn.iocoder.mall.userservice.service.address;
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.mall.userservice.convert.address.UserAddressConvert;
import cn.iocoder.mall.userservice.dal.mysql.dataobject.address.UserAddressDO;
import cn.iocoder.mall.userservice.dal.mysql.mapper.address.UserAddressMapper;
import cn.iocoder.mall.userservice.enums.address.UserAddressType;
import cn.iocoder.mall.userservice.service.address.bo.UserAddressBO;
import cn.iocoder.mall.userservice.service.address.bo.UserAddressCreateBO;
import cn.iocoder.mall.userservice.service.address.bo.UserAddressUpdateBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.mall.userservice.enums.UserErrorCodeConstants.USER_ADDRESS_NOT_FOUND;
/**
* 用户收件地址 Service
*/
@Service
@Validated
public class UserAddressService {
@Autowired
private UserAddressMapper userAddressMapper;
/**
* 创建用户收件地址
*
* @param createBO 创建用户收件地址 BO
* @return 用户收件地址
*/
@Transactional
public UserAddressBO createUserAddress(@Valid UserAddressCreateBO createBO) {
// 如果添加的是默认收件地址,则将原默认地址修改为非默认
if (UserAddressType.DEFAULT.getType().equals(createBO.getType())) {
List<UserAddressDO> addressDOs = userAddressMapper.selectListByUserIdAndType(
createBO.getUserId(), UserAddressType.DEFAULT.getType());
if (!CollectionUtils.isEmpty(addressDOs)) {
addressDOs.forEach(userAddressDO -> userAddressMapper.updateById(new UserAddressDO()
.setId(userAddressDO.getId()).setType(UserAddressType.DEFAULT.getType())));
}
}
// 插入到数据库
UserAddressDO userAddressDO = UserAddressConvert.INSTANCE.convert(createBO);
userAddressMapper.insert(userAddressDO);
// 返回
return UserAddressConvert.INSTANCE.convert(userAddressDO);
}
/**
* 更新用户收件地址
*
* @param updateBO 更新用户收件地址 BO
*/
@Transactional
public void updateUserAddress(@Valid UserAddressUpdateBO updateBO) {
// 校验更新的用户收件地址是否存在
if (userAddressMapper.selectById(updateBO.getId()) == null) {
throw ServiceExceptionUtil.exception(USER_ADDRESS_NOT_FOUND);
}
// 如果修改的是默认收件地址,则将原默认地址修改为非默认
if (UserAddressType.DEFAULT.getType().equals(updateBO.getType())) {
List<UserAddressDO> addressDOs = userAddressMapper.selectListByUserIdAndType(
updateBO.getUserId(), UserAddressType.DEFAULT.getType());
if (!CollectionUtils.isEmpty(addressDOs)) {
addressDOs.stream().filter(userAddressDO -> userAddressDO.getId().equals(updateBO.getId())) // 过滤掉更新的收件地址
.forEach(userAddressDO -> userAddressMapper.updateById(new UserAddressDO()
.setId(userAddressDO.getId()).setType(UserAddressType.DEFAULT.getType())));
}
}
// 更新到数据库
UserAddressDO updateObject = UserAddressConvert.INSTANCE.convert(updateBO);
userAddressMapper.updateById(updateObject);
}
/**
* 删除用户收件地址
*
* @param userAddressId 用户收件地址编号
*/
public void deleteUserAddress(Integer userAddressId) {
// 校验删除的用户收件地址是否存在
if (userAddressMapper.selectById(userAddressId) == null) {
throw ServiceExceptionUtil.exception(USER_ADDRESS_NOT_FOUND);
}
// 标记删除
userAddressMapper.deleteById(userAddressId);
}
/**
* 获得用户收件地址
*
* @param userAddressId 用户收件地址编号
* @return 用户收件地址
*/
public UserAddressBO getUserAddress(Integer userAddressId) {
UserAddressDO userAddressDO = userAddressMapper.selectById(userAddressId);
return UserAddressConvert.INSTANCE.convert(userAddressDO);
}
/**
* 获得用户收件地址列表
*
* @param userAddressIds 用户收件地址编号列表
* @return 用户收件地址列表
*/
public List<UserAddressBO> listUserAddresses(List<Integer> userAddressIds) {
List<UserAddressDO> userAddressDOs = userAddressMapper.selectBatchIds(userAddressIds);
return UserAddressConvert.INSTANCE.convertList(userAddressDOs);
}
/**
* 获取指定用户的收件地址列表
*
* @param userId 用户编号
* @param type 地址类型
* @return 收件地址列表
*/
public List<UserAddressBO> listUserAddresses(Integer userId, Integer type) {
List<UserAddressDO> userAddressDOs = userAddressMapper.selectListByUserIdAndType(userId, type);
return UserAddressConvert.INSTANCE.convertList(userAddressDOs);
}
}

View File

@@ -0,0 +1,64 @@
package cn.iocoder.mall.userservice.service.address.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 用户收件地址 BO
*/
@Data
@Accessors(chain = true)
public class UserAddressBO {
/**
* 收件地址编号
*/
private Integer id;
/**
* 用户编号
*/
private Integer userId;
/**
* 收件人名称
*/
private String name;
/**
* 手机号
*/
private String mobile;
/**
* 省份编号
*/
private Integer provinceCode;
/**
* 城市编号
*/
private Integer cityCode;
/**
* 区域编号
*/
private Integer countyCode;
/**
* 收件详细地址
*/
private String detailAddress;
/**
* 地址类型
*/
private Integer type;
/**
* 创建时间
*/
private Date createTime;
/**
* 最后更新时间
*/
private Date updateTime;
/**
* 删除状态
*/
private Integer deleted;
}

View File

@@ -0,0 +1,59 @@
package cn.iocoder.mall.userservice.service.address.bo;
import cn.iocoder.common.framework.validator.Mobile;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 用户收件地址创建 BO
*/
@Data
@Accessors(chain = true)
public class UserAddressCreateBO {
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 收件人名称
*/
@NotEmpty(message = "收件人名称不能为空")
private String name;
/**
* 手机号
*/
@NotEmpty(message = "手机号不能为空")
@Mobile
private String mobile;
/**
* 省份编号
*/
@NotNull(message = "省份编号不能为空")
private Integer provinceCode;
/**
* 城市编号
*/
@NotNull(message = "城市编号不能为空")
private Integer cityCode;
/**
* 区域编号
*/
@NotNull(message = "区域编号不能为空")
private Integer countyCode;
/**
* 收件详细地址
*/
@NotEmpty(message = "收件详细地址不能为空")
private String detailAddress;
/**
* 地址类型
*/
@NotNull(message = "地址类型不能为空")
private Integer type;
}

View File

@@ -0,0 +1,62 @@
package cn.iocoder.mall.userservice.service.address.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 用户收件地址更新 BO
*/
@Data
@Accessors(chain = true)
public class UserAddressUpdateBO {
/**
* 收件地址编号
*/
@NotNull(message = "收件地址编号不能为空")
private Integer id;
/**
* 用户编号
*/
@NotNull(message = "用户编号不能为空")
private Integer userId;
/**
* 收件人名称
*/
@NotEmpty(message = "收件人名称不能为空")
private String name;
/**
* 手机号
*/
@NotEmpty(message = "手机号不能为空")
private String mobile;
/**
* 省份编号
*/
@NotNull(message = "省份编号不能为空")
private Integer provinceCode;
/**
* 城市编号
*/
@NotNull(message = "城市编号不能为空")
private Integer cityCode;
/**
* 区域编号
*/
@NotNull(message = "区域编号不能为空")
private Integer countyCode;
/**
* 收件详细地址
*/
@NotEmpty(message = "收件详细地址不能为空")
private String detailAddress;
/**
* 地址类型
*/
@NotNull(message = "地址类型不能为空")
private Integer type;
}