错误码第一版

pull/2/MERGE
benpaodeyouyusi 2020-05-09 21:19:17 +08:00
parent 016600ab2e
commit b24e45947b
21 changed files with 667 additions and 0 deletions

View File

@ -87,6 +87,11 @@ public enum SystemErrorCodeEnum implements ServiceExceptionUtil.Enumerable {
USER_ADDRESS_NOT_EXISTENT(1001004000, "用户地址不存在!"),
USER_ADDRESS_IS_DELETED(1001004001, "用户地址已被删除!"),
USER_GET_ADDRESS_NOT_EXISTS(1001004002, "获取的地址不存在!"),
// ========== 错误码模块 1002009000 ==========
ERROR_CODE_NOT_EXISTS(1002009000, "错误码不存在"),
ERROR_CODE_DUPLICATE(1002009001, "已经存在编码为【{}}】的错误码"),
ERROR_CAN_NOT_UPDATE_SYSTEM_TYPE_ERROR(1002004003, "不能修改类型为系统内置的错误码"),
;

View File

@ -0,0 +1,26 @@
package cn.iocoder.mall.system.biz.enums.errorcode;
/**
*
* @author ding
*/
public enum ErrorCodeTypeEnum {
/**
*
*/
SYSTEM(1),
/**
*
*/
CUSTOM(2);
private final Integer type;
ErrorCodeTypeEnum(Integer type) {
this.type = type;
}
public Integer getType() {
return type;
}
}

View File

@ -0,0 +1,31 @@
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,19 +1,32 @@
package cn.iocoder.mall.system.biz.config;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.system.biz.bo.errorcode.ErrorCodeBO;
import cn.iocoder.mall.system.biz.dataobject.errorcode.ErrorCodeDO;
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;
import java.util.List;
@Configuration
public class ServiceExceptionConfiguration {
// @Autowired
// private ErrorCodeService errorCodeService;
@EventListener(ApplicationReadyEvent.class) // 可参考 https://www.cnblogs.com/ssslinppp/p/7607509.html
public void initMessages() {
// List<ErrorCodeBO> list = errorCodeService.getErrorCodeList();
for (SystemErrorCodeEnum item : SystemErrorCodeEnum.values()) {
ServiceExceptionUtil.put(item.getCode(), item.getMessage());
}
// for (ErrorCodeBO bo : list) {
// ServiceExceptionUtil.put(bo.getCode(),bo.getMessage());
// }
}
}

View File

@ -0,0 +1,34 @@
package cn.iocoder.mall.system.biz.convert.errorcode;
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 org.mapstruct.Mapper;
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

@ -0,0 +1,31 @@
package cn.iocoder.mall.system.biz.dao.errorcode;
import cn.iocoder.mall.mybatis.query.QueryWrapperX;
import cn.iocoder.mall.system.biz.dataobject.errorcode.ErrorCodeDO;
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
import cn.iocoder.mall.system.biz.enums.errorcode.ErrorCodeTypeEnum;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* @author ding
*/
@Repository
public interface ErrorCodeMapper extends BaseMapper<ErrorCodeDO> {
default ErrorCodeDO selectByCode(Integer code){
//从db查询
ErrorCodeDO errorCodeDO = selectOne(new QueryWrapperX<ErrorCodeDO>().eqIfPresent("code", code));
if (null == errorCodeDO){
//从enum查询
for (SystemErrorCodeEnum item : SystemErrorCodeEnum.values()) {
if(code.equals(item.getCode())){
return new ErrorCodeDO().setCode(item.getCode()).
setId(0).setType(ErrorCodeTypeEnum.SYSTEM.getType());
}
}
}
return null;
}
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.mall.system.biz.dataobject.errorcode;
import cn.iocoder.mall.mybatis.dataobject.DeletableDO;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
*
*/
@TableName(value = "error_code")
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class ErrorCodeDO extends DeletableDO {
/**
*
*/
private Integer id;
/**
*
*/
private Integer code;
/**
*
*/
private String message;
/**
*
*/
private Integer type;
}

View File

@ -0,0 +1,21 @@
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;
}

View File

@ -0,0 +1,28 @@
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

@ -0,0 +1,17 @@
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

@ -0,0 +1,21 @@
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> codes;
}

View File

@ -0,0 +1,10 @@
package cn.iocoder.mall.system.biz.dto.errorcode;
import cn.iocoder.common.framework.vo.PageParam;
/**
* @author ding
*/
public class ErrorCodePageDTO extends PageParam {
}

View File

@ -0,0 +1,31 @@
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 {
/**
* ,id
*/
private Integer id;
@NotNull(message = "错误码编码不能为空")
private Integer code;
/**
*
*/
private String message;
/**
* {@link ErrorCodeTypeEnum}
*/
private Integer type;
}

View File

@ -0,0 +1,45 @@
package cn.iocoder.mall.system.biz.service.errorCode;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.errorcode.ErrorCodeBO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeAddDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeDeleteDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodePageDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeUpdateDTO;
import java.util.List;
/**
* @author ding
*/
public interface ErrorCodeService {
/**
* code
* @param code code
* @return
*/
ErrorCodeBO getErrorCode(Integer code);
List<ErrorCodeBO> getErrorCodeList();
PageResult<ErrorCodeBO> getErrorCodePage(ErrorCodePageDTO pageDTO);
/**
*
* @param errorCodeAddDTO
* @return
*/
Integer addErrorCode(ErrorCodeAddDTO errorCodeAddDTO);
/**
*
* @param errorCodeUpdateDTO
*/
void updateErrorCode(ErrorCodeUpdateDTO errorCodeUpdateDTO);
/**
*
* @param errorCodeDeleteDTO
*/
void deleteErrorCode(ErrorCodeDeleteDTO errorCodeDeleteDTO);
}

View File

@ -0,0 +1,112 @@
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.enums.DeletedStatusEnum;
import cn.iocoder.mall.mybatis.query.QueryWrapperX;
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.ErrorCodeAddDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeDeleteDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodePageDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeUpdateDTO;
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
import cn.iocoder.mall.system.biz.enums.errorcode.ErrorCodeTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @author ding
*/
@Service
public class ErrorCodeServiceImpl implements ErrorCodeService {
@Autowired
private ErrorCodeMapper errorCodeMapper;
@Override
public ErrorCodeBO getErrorCode(Integer code) {
return ErrorCodeConvert.INSTANCE.convert(errorCodeMapper.selectByCode(code));
}
@Override
public List<ErrorCodeBO> getErrorCodeList() {
List<ErrorCodeDO> list = errorCodeMapper.selectList(new QueryWrapperX<ErrorCodeDO>());
return ErrorCodeConvert.INSTANCE.convertList(list);
}
@Override
public PageResult<ErrorCodeBO> getErrorCodePage(ErrorCodePageDTO pageDTO) {
// List<ErrorCodeDO> list = errorCodeMapper.selectList(new QueryWrapperX<ErrorCodeDO>());
// List<>
return null;
}
@Override
public Integer addErrorCode(ErrorCodeAddDTO errorCodeAddDTO) {
// 校验错误码
checkDuplicateErrorCode(errorCodeAddDTO.getCode(), null);
// 保存到数据库
ErrorCodeDO errorCode = ErrorCodeConvert.INSTANCE.convert(errorCodeAddDTO);
errorCode.setType(ErrorCodeTypeEnum.CUSTOM.getType());
errorCode.setCreateTime(new Date());
errorCode.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
errorCodeMapper.insert(errorCode);
// TODO 插入操作日志
// 返回成功
return errorCode.getId();
}
@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);
}
// 更新到数据库,标记删除
errorCodeMapper.deleteById(errorCodeDO.getId());
// TODO: 2020-05-08 刷新对外提供的错误码列表
}
/**
*
*
*
*
* @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());
}
}
}

View File

@ -0,0 +1,70 @@
package cn.iocoder.mall.system.rest.controller.errorCode;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.errorcode.ErrorCodeBO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeAddDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeDeleteDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodePageDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeUpdateDTO;
import cn.iocoder.mall.system.biz.service.errorCode.ErrorCodeService;
import cn.iocoder.mall.system.rest.convert.errorcode.ErrorCodeConvert;
import cn.iocoder.mall.system.rest.request.errorcode.ErrorCodeAddRequest;
import cn.iocoder.mall.system.rest.request.errorcode.ErrorCodePageRequest;
import cn.iocoder.mall.system.rest.request.errorcode.ErrorCodePageResponse;
import cn.iocoder.mall.system.rest.request.errorcode.ErrorCodeUpdateRequest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
*
*
* @author youyusi
*/
@RestController
@RequestMapping(MallConstants.ROOT_PATH_ADMIN + "/errorCode")
@Api("错误码")
public class SystemErrorCodeController {
@Autowired
private ErrorCodeService errorCodeService;
@GetMapping("/page")
@ApiOperation(value = "错误码分页")
// @RequiresPermissions("system:errorCode:page")
public CommonResult<PageResult<ErrorCodePageResponse>> page(ErrorCodePageRequest request) {
ErrorCodePageDTO pageDTO = ErrorCodeConvert.INSTANCE.convert(request);
PageResult<ErrorCodeBO> pageResult = errorCodeService.getErrorCodePage(pageDTO);
return CommonResult.success(ErrorCodeConvert.INSTANCE.convertPage(pageResult));
}
@PostMapping("/add")
@ApiOperation(value = "创建错误码")
// @RequiresPermissions("system:errorCode:add")
public CommonResult<Integer> add(ErrorCodeAddRequest request) {
ErrorCodeAddDTO addDTO = ErrorCodeConvert.INSTANCE.convert(request);
return CommonResult.success(errorCodeService.addErrorCode(addDTO));
}
@PostMapping("/update")
@ApiOperation(value = "更新错误码")
// @RequiresPermissions("system:errorCode:update")
public CommonResult<Boolean> update(ErrorCodeUpdateRequest request) {
ErrorCodeUpdateDTO updateDTO = ErrorCodeConvert.INSTANCE.convert(request);
errorCodeService.updateErrorCode(updateDTO);
return CommonResult.success(true);
}
@PostMapping("/delete")
@ApiOperation(value = "删除错误码")
// @RequiresPermissions("system:errorCode:delete")
@ApiImplicitParam(name = "id", value = "错误码编号", required = true, example = "1")
public CommonResult<Boolean> delete(@RequestParam("id") Integer id) {
ErrorCodeDeleteDTO deleteDTO = new ErrorCodeDeleteDTO().setId(id);
errorCodeService.deleteErrorCode(deleteDTO);
return CommonResult.success(true);
}
}

View File

@ -0,0 +1,38 @@
package cn.iocoder.mall.system.rest.convert.errorcode;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.authorization.RoleBO;
import cn.iocoder.mall.system.biz.bo.errorcode.ErrorCodeBO;
import cn.iocoder.mall.system.biz.dto.authorization.RoleAddDTO;
import cn.iocoder.mall.system.biz.dto.authorization.RolePageDTO;
import cn.iocoder.mall.system.biz.dto.authorization.RoleUpdateDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeAddDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodePageDTO;
import cn.iocoder.mall.system.biz.dto.errorcode.ErrorCodeUpdateDTO;
import cn.iocoder.mall.system.rest.convert.authorization.AdminsRoleConvert;
import cn.iocoder.mall.system.rest.request.authorization.AdminsRoleAddRequest;
import cn.iocoder.mall.system.rest.request.authorization.AdminsRolePageRequest;
import cn.iocoder.mall.system.rest.request.authorization.AdminsRoleUpdateRequest;
import cn.iocoder.mall.system.rest.request.errorcode.ErrorCodeAddRequest;
import cn.iocoder.mall.system.rest.request.errorcode.ErrorCodePageRequest;
import cn.iocoder.mall.system.rest.request.errorcode.ErrorCodePageResponse;
import cn.iocoder.mall.system.rest.request.errorcode.ErrorCodeUpdateRequest;
import cn.iocoder.mall.system.rest.response.authorization.AdminsRolePageResponse;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* @author ding
*/
@Mapper
public interface ErrorCodeConvert {
ErrorCodeConvert INSTANCE = Mappers.getMapper(ErrorCodeConvert.class);
ErrorCodeAddDTO convert(ErrorCodeAddRequest bean);
ErrorCodeUpdateDTO convert(ErrorCodeUpdateRequest bean);
ErrorCodePageDTO convert(ErrorCodePageRequest bean);
PageResult<ErrorCodePageResponse> convertPage(PageResult<ErrorCodeBO> bean);
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.mall.system.rest.request.errorcode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
@ApiModel("管理员 - 错误码模块 - 添加错误码 Request")
@Data
@Accessors(chain = true)
public class ErrorCodeAddRequest {
@ApiModelProperty(value = "错误码信息", required = true, example = "系统管理员")
@NotEmpty(message = "错误码信息不能为空")
private String message;
@ApiModelProperty(value = "错误码编码", example = "SUPER_ADMIN")
@NotEmpty(message = "错误码编码不能为空")
private Integer code;
}

View File

@ -0,0 +1,15 @@
package cn.iocoder.mall.system.rest.request.errorcode;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author ding
*/
@ApiModel("管理员 - 错误码模块 - 错误码分页 Request")
@Data
@Accessors(chain = true)
public class ErrorCodePageRequest {
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.mall.system.rest.request.errorcode;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
*
* @author ding
*/
@ApiModel("管理员 - 错误码模块 - 查询错误码 Request")
@Data
@Accessors(chain = true)
public class ErrorCodePageResponse {
/**
*
*/
private Integer id;
/**
*
*/
private Integer code;
/**
*
*/
private String message;
/**
*
*/
private Date createTime;
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.mall.system.rest.request.errorcode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
*
* @author ding
*/
@ApiModel("管理员 - 错误码模块 - 修改错误码 Request")
@Data
@Accessors(chain = true)
public class ErrorCodeUpdateRequest {
@ApiModelProperty(value = "错误码编号", required = true, example = "1")
@NotNull(message = "错误码不能为空")
private Integer id;
@ApiModelProperty(value = "错误码信息", required = true, example = "系统管理员")
@NotEmpty(message = "错误码信息不能为空")
private String message;
@ApiModelProperty(value = "错误码编码", example = "SUPER_ADMIN")
@NotEmpty(message = "错误码编码不能为空")
private Integer code;
}