错误码的 Starter 的初始化,完成

This commit is contained in:
YunaiV
2020-07-20 19:18:27 +08:00
parent 0df486a677
commit 187b17ed01
50 changed files with 1249 additions and 611 deletions

View File

@@ -1,31 +0,0 @@
package cn.iocoder.mall.system.biz.bo.errorcode;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 错误码模块 - 错误码信息 BO
* @author ding
*/
@Data
@Accessors(chain = true)
public class ErrorCodeBO {
/**
* 错误码编号
*/
private Integer id;
/**
* 错误码编码
*/
private Integer code;
/**
* 错误码错误信息
*/
private String message;
/**
* 添加时间
*/
private Date createTime;
}

View File

@@ -1,28 +0,0 @@
package cn.iocoder.mall.system.biz.config;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@MapperScan("cn.iocoder.mall.system.biz.dao") // 扫描对应的 Mapper 接口
@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理。为什么使用 proxyTargetClass 参数,参见 https://blog.csdn.net/huang_550/article/details/76492600
public class DatabaseConfiguration {
// 数据库连接池 Druid
@Bean
public ISqlInjector sqlInjector() {
return new DefaultSqlInjector(); // MyBatis Plus 逻辑删除
}
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor(); // MyBatis Plus 分页插件
}
}

View File

@@ -1,32 +0,0 @@
package cn.iocoder.mall.system.biz.config;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
import cn.iocoder.mall.system.biz.service.errorcode.ErrorCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
@Configuration
public class ServiceExceptionConfiguration {
// TODO FROM 芋艿 to 鱿鱼须:这块的实现,微信一起沟通下哈。大体是说,要调用 RPC 接口,不然别的模块无法使用哟。最终,我们是要做成 starter提供给各个模块用。
@Autowired
private ErrorCodeService errorCodeService;
@EventListener(ApplicationReadyEvent.class) // 可参考 https://www.cnblogs.com/ssslinppp/p/7607509.html
public void initMessages() {
// TODO FROM 芋艿 to 芋艿:暂时注释掉,有问题的。
// errorCodeService.deleteSyStemErrorCode(SystemErrorCodeEnum.ADMIN_NOT_FOUND.getGroup());
// errorCodeService.addSystemErrorCodeList(SystemErrorCodeEnum.values());
for (SystemErrorCodeEnum item : SystemErrorCodeEnum.values()) {
ServiceExceptionUtil.put(item.getCode(), item.getMessage());
}
// TODO FROM 芋艿 to 芋艿:暂时注释掉,有问题的。
// for (ErrorCodeBO bo : errorCodeService.getErrorCodeByGroup(SystemErrorCodeEnum.ADMIN_NOT_FOUND.getGroup())) {
// ServiceExceptionUtil.put(bo.getCode(),bo.getMessage());
// }
}
}

View File

@@ -1,37 +0,0 @@
package cn.iocoder.mall.system.biz.convert.errorcode;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.errorcode.ErrorCodeBO;
import cn.iocoder.mall.system.biz.dataobject.errorcode.ErrorCodeDO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeAddDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeUpdateDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* @author ding
*/
@Mapper
public interface ErrorCodeConvert {
ErrorCodeConvert INSTANCE = Mappers.getMapper(ErrorCodeConvert.class);
ErrorCodeDO convert(ErrorCodeDTO bean);
ErrorCodeBO convert(ErrorCodeDO bean);
List<ErrorCodeBO> convertList(List<ErrorCodeDO> beans);
@Mapping(source = "records", target = "list")
PageResult<ErrorCodeBO> convertPage(IPage<ErrorCodeDO> page);
ErrorCodeDO convert(ErrorCodeAddDTO bean);
ErrorCodeDO convert(ErrorCodeUpdateDTO bean);
}

View File

@@ -1,47 +0,0 @@
package cn.iocoder.mall.system.biz.dao.errorcode;
import cn.iocoder.mall.mybatis.core.query.QueryWrapperX;
import cn.iocoder.mall.system.biz.dataobject.authorization.RoleDO;
import cn.iocoder.mall.system.biz.dataobject.authorization.RoleResourceDO;
import cn.iocoder.mall.system.biz.dataobject.errorcode.ErrorCodeDO;
import cn.iocoder.mall.system.biz.dto.authorization.RolePageDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodePageDTO;
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
import cn.iocoder.mall.system.biz.enums.errorcode.ErrorCodeTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.List;
/**
* @author ding
*/
@Repository
public interface ErrorCodeMapper extends BaseMapper<ErrorCodeDO> {
default ErrorCodeDO selectByCode(Integer code){
return selectOne(new QueryWrapperX<ErrorCodeDO>().eqIfPresent("code", code));
}
default IPage<ErrorCodeDO> selectPage(ErrorCodePageDTO errorCodePageDTO) {
return selectPage(new Page<>(errorCodePageDTO.getPageNo(), errorCodePageDTO.getPageSize()),
new QueryWrapperX<ErrorCodeDO>().likeIfPresent("message", errorCodePageDTO.getMessage()));
}
default List<ErrorCodeDO> selectListByIds(Collection<Integer> ids) {
return selectList(new QueryWrapperX<ErrorCodeDO>().inIfPresent("id", ids));
}
default List<ErrorCodeDO> selectByGroup(Integer group) {
return selectList(new QueryWrapperX<ErrorCodeDO>().eqIfPresent("group", group));
}
default int deleteSyStemErrorCode(int group){
return delete(new QueryWrapper<ErrorCodeDO>().eq("group", group));
}
}

View File

@@ -1,29 +0,0 @@
package cn.iocoder.mall.system.biz.dto.errorcode;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 角色模块 - 添加角色 DTO
*/
@Data
@Accessors(chain = true)
public class ErrorCodeAddDTO {
@NotNull(message = "错误码编码")
private Integer code;
@NotEmpty(message = "错误码错误信息")
private String message;
@NotNull(message = "错误码分组id")
private Integer group;
/**
* 错误码备注
*/
private String remark;
}

View File

@@ -1,28 +0,0 @@
package cn.iocoder.mall.system.biz.dto.errorcode;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author ding
*/
@Data
@Accessors(chain = true)
public class ErrorCodeDTO {
/**
* 错误码编号
*/
private Integer id;
/**
* 错误码编码
*/
private Integer code;
/**
* 错误码错误信息
*/
private String message;
/**
* 错误码类型
*/
private Integer type;
}

View File

@@ -1,17 +0,0 @@
package cn.iocoder.mall.system.biz.dto.errorcode;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
/**
* 只可以删除自定义错误码
* @author ding
*/
@Data
@Accessors(chain = true)
public class ErrorCodeDeleteDTO {
@NotNull(message = "错误码编号不能为空")
private Integer id;
}

View File

@@ -1,21 +0,0 @@
package cn.iocoder.mall.system.biz.dto.errorcode;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Collection;
/**
* todo 考虑是否删除
* @author ding
*/
@Data
@Accessors(chain = true)
public class ErrorCodeGetListDTO {
/**
* 错误码编号数组
*
* 如果传入空,则不进行错误码编号的过滤
*/
private Collection<Integer> ids;
}

View File

@@ -1,15 +0,0 @@
package cn.iocoder.mall.system.biz.dto.errorcode;
import cn.iocoder.common.framework.vo.PageParam;
import lombok.Data;
/**
* @author ding
*/
@Data
public class ErrorCodePageDTO extends PageParam {
/**
* 错误码信息
*/
private String message;
}

View File

@@ -1,40 +0,0 @@
package cn.iocoder.mall.system.biz.dto.errorcode;
import cn.iocoder.mall.system.biz.enums.errorcode.ErrorCodeTypeEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
/**
* @author ding
*/
@Data
@Accessors(chain = true)
public class ErrorCodeUpdateDTO {
// TODO FROM 芋艿 to 鱿鱼丝:必要的参数校验噢
@NotNull(message = "错误码id不能为空")
private Integer id;
@NotNull(message = "错误码编码不能为空")
private Integer code;
/**
* 错误码错误信息
*/
private String message;
/**
* 错误码类型 {@link ErrorCodeTypeEnum}
*/
private Integer type;
/**
* 错误码分组
*/
private Integer group;
/**
* 错误码备注
*/
private String remark;
}

View File

@@ -1,81 +0,0 @@
package cn.iocoder.mall.system.biz.service.errorcode;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.errorcode.ErrorCodeBO;
import cn.iocoder.mall.system.biz.dataobject.errorcode.ErrorCodeDO;
import cn.iocoder.mall.system.biz.dto.errorcode.*;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @author ding
*/
public interface ErrorCodeService extends IService<ErrorCodeDO>{
/**
* 根据code查询错误码
* @param code code
* @return 错误码信息
*/
ErrorCodeBO getErrorCode(Integer code);
/**
* 从db取出错误码列表数据
* @return db错误码列表
*/
List<ErrorCodeBO> getErrorCodeList(ErrorCodeGetListDTO errorCodeGetListDTO);
/**
* 取出所有错误码列表数据
* @param group 分组标示
* @return 所有错误码列表
*/
List<ErrorCodeBO> getErrorCodeByGroup(Integer group);
/**
* 分页取出所有错误码列表数据
* @param pageDTO 分页数据
* @return 错误码列表
*/
PageResult<ErrorCodeBO> getErrorCodePage(ErrorCodePageDTO pageDTO);
/**
* 新增
* @param errorCodeAddDTO 错误码信息,默认类型为自定义错误码
* @return
*/
Integer addErrorCode(ErrorCodeAddDTO errorCodeAddDTO);
/**
* 批量添加错误码信息
* @param list 错误码集合
* @return
*/
Boolean addErrorCodeList(List<ErrorCodeAddDTO> list);
/**
* 批量添加错误码信息,项目启动时初始化错误码信息。
* @param enumerable 错误码枚举类
* @return 是否成功
*/
Boolean addSystemErrorCodeList(ServiceExceptionUtil.Enumerable[] enumerable);
/**
* 更新错误码,系统内置错误码是不允许更新
* @param errorCodeUpdateDTO 错误码信息
*/
void updateErrorCode(ErrorCodeUpdateDTO errorCodeUpdateDTO);
/**
* 删除错误码
* @param errorCodeDeleteDTO 只允许删除自定义错误码
*/
void deleteErrorCode(ErrorCodeDeleteDTO errorCodeDeleteDTO);
/**
* 删除分组下的错误码,只提供给服务初始化时候
* @param group 分组
*/
void deleteSyStemErrorCode(int group);
}

View File

@@ -1,155 +0,0 @@
package cn.iocoder.mall.system.biz.service.errorcode;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.mybatis.core.enums.DeletedStatusEnum;
import cn.iocoder.mall.system.biz.bo.errorcode.ErrorCodeBO;
import cn.iocoder.mall.system.biz.convert.errorcode.ErrorCodeConvert;
import cn.iocoder.mall.system.biz.dao.errorcode.ErrorCodeMapper;
import cn.iocoder.mall.system.biz.dataobject.errorcode.ErrorCodeDO;
import cn.iocoder.mall.system.biz.dto.errorcode.*;
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
import cn.iocoder.mall.system.biz.enums.errorcode.ErrorCodeTypeEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author ding
*/
@Service
public class ErrorCodeServiceImpl extends ServiceImpl<ErrorCodeMapper, ErrorCodeDO> implements ErrorCodeService {
@Autowired
private ErrorCodeMapper errorCodeMapper;
@Override
public ErrorCodeBO getErrorCode(Integer code) {
return ErrorCodeConvert.INSTANCE.convert(errorCodeMapper.selectByCode(code));
}
@Override
public List<ErrorCodeBO> getErrorCodeList(ErrorCodeGetListDTO errorCodeGetListDTO) {
return ErrorCodeConvert.INSTANCE.convertList(errorCodeMapper.selectListByIds(errorCodeGetListDTO.getIds()));
}
@Override
public List<ErrorCodeBO> getErrorCodeByGroup(Integer group) {
List<ErrorCodeDO> list = errorCodeMapper.selectByGroup(group);
// TODO FROM 芋艿 to 鱿鱼丝:这块微信交流一波哈。
return ErrorCodeConvert.INSTANCE.convertList(list);
}
@Override
public PageResult<ErrorCodeBO> getErrorCodePage(ErrorCodePageDTO pageDTO) {
IPage<ErrorCodeDO> list = errorCodeMapper.selectPage(pageDTO);
return ErrorCodeConvert.INSTANCE.convertPage(list);
}
@Override
public Integer addErrorCode(ErrorCodeAddDTO errorCodeAddDTO) {
// 校验错误码
checkDuplicateErrorCode(errorCodeAddDTO.getCode(), null);
// 保存到数据库
ErrorCodeDO errorCode = ErrorCodeConvert.INSTANCE.convert(errorCodeAddDTO);
errorCode.setCreateTime(new Date());
errorCode.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
errorCodeMapper.insert(errorCode);
// TODO 插入操作日志
// 返回成功
return errorCode.getId();
}
@Override
public Boolean addErrorCodeList(List<ErrorCodeAddDTO> list) {
List<ErrorCodeDO> doList = new ArrayList<>();
for (ErrorCodeAddDTO errorCodeAddDTO:list
) {
// 校验错误码
checkDuplicateErrorCode(errorCodeAddDTO.getCode(), null);
ErrorCodeDO errorCode = ErrorCodeConvert.INSTANCE.convert(errorCodeAddDTO);
errorCode.setCreateTime(new Date());
errorCode.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
doList.add(errorCode);
}
// TODO 插入操作日志
return this.saveBatch(doList);
}
@Override
public Boolean addSystemErrorCodeList(ServiceExceptionUtil.Enumerable[] enumerable) {
List<ErrorCodeDO> doList = new ArrayList<>();
for (ServiceExceptionUtil.Enumerable errorCodeEnum : enumerable){
ErrorCodeDO errorCode = new ErrorCodeDO().setCode(errorCodeEnum.getCode()).
setMessage(errorCodeEnum.getMessage()).setType(ErrorCodeTypeEnum.SYSTEM.getType())
.setGroup(errorCodeEnum.getGroup());
errorCode.setCreateTime(new Date());
errorCode.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
doList.add(errorCode);
}
// TODO 插入操作日志
return this.saveBatch(doList);
}
@Override
public void updateErrorCode(ErrorCodeUpdateDTO errorCodeUpdateDTO) {
// 校验错误码是否存在
ErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(errorCodeUpdateDTO.getCode());
if (errorCodeDO == null) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ERROR_CODE_NOT_EXISTS);
}
// 内置错误码,写死在枚举类中,不允许修改
if (ErrorCodeTypeEnum.SYSTEM.getType().equals(errorCodeDO.getType())) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ERROR_CAN_NOT_UPDATE_SYSTEM_TYPE_ERROR);
}
// 校验角色的唯一字段是否重复
checkDuplicateErrorCode(errorCodeDO.getCode(), errorCodeDO.getId());
// 更新到数据库
ErrorCodeDO updateRole = ErrorCodeConvert.INSTANCE.convert(errorCodeUpdateDTO);
errorCodeMapper.updateById(updateRole);
// TODO 插入操作日志
}
@Override
public void deleteErrorCode(ErrorCodeDeleteDTO errorCodeDeleteDTO) {
// 校验错误码是否存在
ErrorCodeDO errorCodeDO = errorCodeMapper.selectById(errorCodeDeleteDTO.getId());
if (errorCodeDO == null) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ERROR_CODE_NOT_EXISTS);
}
// 内置错误码,不允许删除
if (ErrorCodeTypeEnum.SYSTEM.getType().equals(errorCodeDO.getType())) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ERROR_CAN_NOT_UPDATE_SYSTEM_TYPE_ERROR);
}
// 更新到数据库,标记删除
errorCodeMapper.deleteById(errorCodeDO.getId());
ServiceExceptionUtil.delete(errorCodeDO.getCode(),errorCodeDO.getMessage());
}
@Override
public void deleteSyStemErrorCode(int group) {
errorCodeMapper.deleteSyStemErrorCode(group);
}
/**
* 校验错误码的唯一字段是否重复
*
* 是否存在相同编码的错误码
*
* @param code 错误码编码
* @param id 错误码编号
*/
private void checkDuplicateErrorCode(Integer code, Integer id) {
ErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(code);
if (errorCodeDO != null && !errorCodeDO.getId().equals(id)) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ERROR_CODE_DUPLICATE, errorCodeDO.getCode());
}
}
}