提交 30e2d087 authored 作者: YunaiV's avatar YunaiV

增加环境搭建文档

上级 4e926d8d
...@@ -26,7 +26,10 @@ ...@@ -26,7 +26,10 @@
> 一起交流,Get 知识。 > 一起交流,Get 知识。
* 我们迫切希望更多的参与进来,可以加入「交流群」,一起骚聊。 * 我们迫切希望更多的参与进来,可以加入「交流群」,一起骚聊。
* [《Onemall 电商开源项目 —— 应用分层》](http://www.iocoder.cn/Onemall/Application-layer/?vip&onemall) * [《Onemall 电商开源项目 —— 应用分层》](http://www.iocoder.cn/Onemall/Application-layer/?onemall)
* [《Onemall 电商开源项目 —— 搭建调试环境》](http://www.iocoder.cn/Onemall/build-debugger-environment/?onemall)
* 前端项目地址:<https://github.com/YunaiV/onemall-web>
# 演示 # 演示
...@@ -95,7 +98,7 @@ ...@@ -95,7 +98,7 @@
## 搭建环境 ## 搭建环境
[搭建调试环境](https://gitee.com/zhijiantianya/onemall/blob/master/docs/setup/quick-start.md) [搭建调试环境](http://www.iocoder.cn/Onemall/build-debugger-environment/)
## 架构图 ## 架构图
......
...@@ -28,7 +28,6 @@ public interface GlobalErrorCodeConstants { ...@@ -28,7 +28,6 @@ public interface GlobalErrorCodeConstants {
ErrorCode UNKNOWN = new ErrorCode(999, "未知错误"); ErrorCode UNKNOWN = new ErrorCode(999, "未知错误");
static boolean isMatch(Integer code) { static boolean isMatch(Integer code) {
return code != null return code != null
&& code >= SUCCESS.getCode() && code <= UNKNOWN.getCode(); && code >= SUCCESS.getCode() && code <= UNKNOWN.getCode();
......
...@@ -15,7 +15,7 @@ import java.util.concurrent.ConcurrentMap; ...@@ -15,7 +15,7 @@ import java.util.concurrent.ConcurrentMap;
* 目的在于,格式化异常信息提示。 * 目的在于,格式化异常信息提示。
* 考虑到 String.format 在参数不正确时会报错,因此使用 {} 作为占位符,并使用 {@link #doFormat(int, String, Object...)} 方法来格式化 * 考虑到 String.format 在参数不正确时会报错,因此使用 {} 作为占位符,并使用 {@link #doFormat(int, String, Object...)} 方法来格式化
* *
* 因为 {@link #messages} 里面默认是没有异常信息提示的模板的,所以需要使用方自己初始化进去。目前想到的有几种方式: * 因为 {@link #MESSAGES} 里面默认是没有异常信息提示的模板的,所以需要使用方自己初始化进去。目前想到的有几种方式:
* *
* 1. 异常提示信息,写在枚举类中,例如说,cn.iocoder.oceans.user.api.constants.ErrorCodeEnum 类 + ServiceExceptionConfiguration * 1. 异常提示信息,写在枚举类中,例如说,cn.iocoder.oceans.user.api.constants.ErrorCodeEnum 类 + ServiceExceptionConfiguration
* 2. 异常提示信息,写在 .properties 等等配置文件 * 2. 异常提示信息,写在 .properties 等等配置文件
...@@ -29,29 +29,29 @@ public class ServiceExceptionUtil { ...@@ -29,29 +29,29 @@ public class ServiceExceptionUtil {
/** /**
* 错误码提示模板 * 错误码提示模板
*/ */
private static ConcurrentMap<Integer, String> messages = new ConcurrentHashMap<>(); private static final ConcurrentMap<Integer, String> MESSAGES = new ConcurrentHashMap<>();
public static void putAll(Map<Integer, String> messages) { public static void putAll(Map<Integer, String> messages) {
ServiceExceptionUtil.messages.putAll(messages); ServiceExceptionUtil.MESSAGES.putAll(messages);
} }
public static void put(Integer code, String message) { public static void put(Integer code, String message) {
ServiceExceptionUtil.messages.put(code, message); ServiceExceptionUtil.MESSAGES.put(code, message);
} }
public static void delete(Integer code, String message) { public static void delete(Integer code, String message) {
ServiceExceptionUtil.messages.remove(code, message); ServiceExceptionUtil.MESSAGES.remove(code, message);
} }
// ========== 和 ServiceException 的集成 ========== // ========== 和 ServiceException 的集成 ==========
public static ServiceException exception(ErrorCode errorCode) { public static ServiceException exception(ErrorCode errorCode) {
String messagePattern = messages.getOrDefault(errorCode.getCode(), errorCode.getMessage()); String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMessage());
return exception0(errorCode.getCode(), messagePattern); return exception0(errorCode.getCode(), messagePattern);
} }
public static ServiceException exception(ErrorCode errorCode, Object... params) { public static ServiceException exception(ErrorCode errorCode, Object... params) {
String messagePattern = messages.getOrDefault(errorCode.getCode(), errorCode.getMessage()); String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMessage());
return exception0(errorCode.getCode(), messagePattern, params); return exception0(errorCode.getCode(), messagePattern, params);
} }
...@@ -62,7 +62,7 @@ public class ServiceExceptionUtil { ...@@ -62,7 +62,7 @@ public class ServiceExceptionUtil {
* @return 异常 * @return 异常
*/ */
public static ServiceException exception(Integer code) { public static ServiceException exception(Integer code) {
return exception0(code, messages.get(code)); return exception0(code, MESSAGES.get(code));
} }
/** /**
...@@ -73,7 +73,7 @@ public class ServiceExceptionUtil { ...@@ -73,7 +73,7 @@ public class ServiceExceptionUtil {
* @return 异常 * @return 异常
*/ */
public static ServiceException exception(Integer code, Object... params) { public static ServiceException exception(Integer code, Object... params) {
return exception0(code, messages.get(code), params); return exception0(code, MESSAGES.get(code), params);
} }
public static ServiceException exception0(Integer code, String messagePattern, Object... params) { public static ServiceException exception0(Integer code, String messagePattern, Object... params) {
......
...@@ -37,7 +37,7 @@ public class RedisKeyDefine { ...@@ -37,7 +37,7 @@ public class RedisKeyDefine {
* *
* 如果是使用分布式锁,设置为 {@link java.util.concurrent.locks.Lock} 类型 * 如果是使用分布式锁,设置为 {@link java.util.concurrent.locks.Lock} 类型
*/ */
private final Class valueType; private final Class<?> valueType;
/** /**
* 过期时间 * 过期时间
* *
...@@ -45,7 +45,7 @@ public class RedisKeyDefine { ...@@ -45,7 +45,7 @@ public class RedisKeyDefine {
*/ */
private final Duration timeout; private final Duration timeout;
public RedisKeyDefine(String keyTemplate, KeyTypeEnum keyType, Class valueType, Duration timeout) { public RedisKeyDefine(String keyTemplate, KeyTypeEnum keyType, Class<?> valueType, Duration timeout) {
this.keyTemplate = keyTemplate; this.keyTemplate = keyTemplate;
this.keyType = keyType; this.keyType = keyType;
this.valueType = valueType; this.valueType = valueType;
...@@ -60,7 +60,7 @@ public class RedisKeyDefine { ...@@ -60,7 +60,7 @@ public class RedisKeyDefine {
return keyType; return keyType;
} }
public Class getValueType() { public Class<?> getValueType() {
return valueType; return valueType;
} }
......
...@@ -11,13 +11,10 @@ import javax.validation.constraints.NotEmpty; ...@@ -11,13 +11,10 @@ import javax.validation.constraints.NotEmpty;
public class DataDictSimpleVO { public class DataDictSimpleVO {
@ApiModelProperty(value = "大类枚举值", required = true, example = "gender") @ApiModelProperty(value = "大类枚举值", required = true, example = "gender")
@NotEmpty(message = "大类枚举值不能为空")
private String enumValue; private String enumValue;
@ApiModelProperty(value = "小类数值", required = true, example = "1") @ApiModelProperty(value = "小类数值", required = true, example = "1")
@NotEmpty(message = "小类数值不能为空")
private String value; private String value;
@ApiModelProperty(value = "展示名", required = true, example = "男") @ApiModelProperty(value = "展示名", required = true, example = "男")
@NotEmpty(message = "展示名不能为空")
private String displayName; private String displayName;
} }
...@@ -15,6 +15,7 @@ public class UserUpdateStatusReqVO { ...@@ -15,6 +15,7 @@ public class UserUpdateStatusReqVO {
@ApiModelProperty(value = "用户编号", required = true) @ApiModelProperty(value = "用户编号", required = true)
@NotNull(message = "用户编号不能为空") @NotNull(message = "用户编号不能为空")
private Integer userId; private Integer userId;
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举")
@NotNull(message = "状态不能为空") @NotNull(message = "状态不能为空")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
......
...@@ -6,13 +6,18 @@ import cn.iocoder.mall.managementweb.controller.pay.vo.transaction.PayTransactio ...@@ -6,13 +6,18 @@ import cn.iocoder.mall.managementweb.controller.pay.vo.transaction.PayTransactio
import cn.iocoder.mall.managementweb.controller.pay.vo.transaction.PayTransactionRespVO; import cn.iocoder.mall.managementweb.controller.pay.vo.transaction.PayTransactionRespVO;
import cn.iocoder.mall.managementweb.convert.pay.transaction.PayTransactionConvert; import cn.iocoder.mall.managementweb.convert.pay.transaction.PayTransactionConvert;
import cn.iocoder.mall.payservice.rpc.transaction.dto.PayTransactionRespDTO; import cn.iocoder.mall.payservice.rpc.transaction.dto.PayTransactionRespDTO;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Stream;
@Service @Service
public class PayTransactionService { public class PayTransactionService {
@Autowired @Resource
private PayTransactionClient payTransactionClient; private PayTransactionClient payTransactionClient;
public PageResult<PayTransactionRespVO> pagePayTransaction(PayTransactionPageReqVO pageReqVO) { public PageResult<PayTransactionRespVO> pagePayTransaction(PayTransactionPageReqVO pageReqVO) {
......
...@@ -7,7 +7,7 @@ import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionAssignAdminRol ...@@ -7,7 +7,7 @@ import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionAssignAdminRol
import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionAssignRoleResourceDTO; import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionAssignRoleResourceDTO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionCheckDTO; import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionCheckDTO;
import cn.iocoder.mall.systemservice.service.permission.PermissionService; import cn.iocoder.mall.systemservice.service.permission.PermissionService;
import cn.iocoder.mall.systemservice.service.permission.ResourceService; import cn.iocoder.mall.systemservice.service.permission.ResourceServiceImpl;
import cn.iocoder.mall.systemservice.service.permission.RoleService; import cn.iocoder.mall.systemservice.service.permission.RoleService;
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceBO; import cn.iocoder.mall.systemservice.service.permission.bo.ResourceBO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -31,7 +31,7 @@ public class PermissionManager { ...@@ -31,7 +31,7 @@ public class PermissionManager {
@Autowired @Autowired
private RoleService roleService; private RoleService roleService;
@Autowired @Autowired
private ResourceService resourceService; private ResourceServiceImpl resourceService;
/** /**
* 获得角色拥有的资源编号 * 获得角色拥有的资源编号
......
...@@ -4,7 +4,7 @@ import cn.iocoder.mall.systemservice.convert.permission.ResourceConvert; ...@@ -4,7 +4,7 @@ import cn.iocoder.mall.systemservice.convert.permission.ResourceConvert;
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceCreateDTO; import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceCreateDTO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO; import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
import cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO; import cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO;
import cn.iocoder.mall.systemservice.service.permission.ResourceService; import cn.iocoder.mall.systemservice.service.permission.ResourceServiceImpl;
import cn.iocoder.mall.systemservice.service.permission.RoleService; import cn.iocoder.mall.systemservice.service.permission.RoleService;
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceBO; import cn.iocoder.mall.systemservice.service.permission.bo.ResourceBO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -20,7 +20,7 @@ import java.util.List; ...@@ -20,7 +20,7 @@ import java.util.List;
public class ResourceManager { public class ResourceManager {
@Autowired @Autowired
private ResourceService resourceService; private ResourceServiceImpl resourceService;
@Autowired @Autowired
private RoleService roleService; private RoleService roleService;
......
package cn.iocoder.mall.systemservice.service.permission; package cn.iocoder.mall.systemservice.service.permission;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import cn.iocoder.mall.systemservice.convert.permission.ResourceConvert;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.ResourceDO;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.RoleResourceDO;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.ResourceMapper;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.RoleResourceMapper;
import cn.iocoder.mall.systemservice.enums.SystemErrorCodeConstants;
import cn.iocoder.mall.systemservice.enums.permission.ResourceIdEnum;
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceBO;
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceCreateBO;
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceUpdateBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeConstants.*;
/** /**
* 资源 Service * 资源 Service 接口
*/ */
@Service public interface ResourceService {
@Validated
public class ResourceService {
@Autowired
private ResourceMapper resourceMapper;
@Autowired
private RoleResourceMapper roleResourceMapper;
/**
* 创建资源
*
* @param createBO 创建资源 BO
* @return 资源
*/
public ResourceBO createResource(@Valid ResourceCreateBO createBO) {
// 校验父资源存在
checkParentResource(createBO.getPid(), null);
// 校验资源(自己)
checkResource(createBO.getPid(), createBO.getName(), null);
// 插入数据库
ResourceDO resourceDO = ResourceConvert.INSTANCE.convert(createBO);
initResourceProperty(resourceDO);
resourceMapper.insert(resourceDO);
// 返回
return ResourceConvert.INSTANCE.convert(resourceDO);
}
/**
* 更新资源
*
* @param updateBO 更新资源 BO
*/
public void updateResource(@Valid ResourceUpdateBO updateBO) {
// 校验更新的资源是否存在
if (resourceMapper.selectById(updateBO.getId()) == null) {
throw ServiceExceptionUtil.exception(RESOURCE_NOT_EXISTS);
}
// 校验父资源存在
checkParentResource(updateBO.getPid(), updateBO.getId());
// 校验资源(自己)
checkResource(updateBO.getPid(), updateBO.getName(), updateBO.getId());
// 更新到数据库
ResourceDO updateObject = ResourceConvert.INSTANCE.convert(updateBO);
initResourceProperty(updateObject);
resourceMapper.updateById(updateObject);
}
/**
* 删除资源
*
* @param resourceId 资源编号
*/
public void deleteResource(Integer resourceId) {
// 校验更新的资源是否存在
if (resourceMapper.selectById(resourceId) == null) {
throw ServiceExceptionUtil.exception(SystemErrorCodeConstants.RESOURCE_NOT_EXISTS);
}
// 校验是否还有子资源
if (resourceMapper.selectCountByPid(resourceId) > 0) {
throw ServiceExceptionUtil.exception(SystemErrorCodeConstants.RESOURCE_EXISTS_CHILDREN);
}
// 校验删除的资源是否存在
if (resourceMapper.selectById(resourceId) == null) {
throw ServiceExceptionUtil.exception(RESOURCE_NOT_EXISTS);
}
// 标记删除
resourceMapper.deleteById(resourceId);
// 删除授予给角色的权限
roleResourceMapper.deleteByResourceId(resourceId);
}
/**
* 获得资源
*
* @param resourceId 资源编号
* @return 资源
*/
public ResourceBO getResource(Integer resourceId) {
ResourceDO resourceDO = resourceMapper.selectById(resourceId);
return ResourceConvert.INSTANCE.convert(resourceDO);
}
/**
* 获得资源列表
*
* @param resourceIds 资源编号列表
* @return 资源列表
*/
public List<ResourceBO> listResources(List<Integer> resourceIds) {
List<ResourceDO> resourceDOs = resourceMapper.selectBatchIds(resourceIds);
return ResourceConvert.INSTANCE.convertList(resourceDOs);
}
/**
* 获得资源全列表
*
* @return 资源全列表
*/
public List<ResourceBO> listResources() {
List<ResourceDO> resourceDOs = resourceMapper.selectList(null);
return ResourceConvert.INSTANCE.convertList(resourceDOs);
}
/**
* 获得指定类型的资源列表
*
* @param type 资源类型,允许空
* @return 资源列表
*/
public List<ResourceBO> listResourcesByType(Integer type) {
List<ResourceDO> resourceDOs = resourceMapper.selectListByType(type);
return ResourceConvert.INSTANCE.convertList(resourceDOs);
}
/**
* 获得角色拥有的资源列表
*
* @param roleIds 角色编号
* @param type 资源类型,允许空
* @return 资源列表
*/
public List<ResourceBO> listRoleResourcesByType(Collection<Integer> roleIds, Integer type) {
List<RoleResourceDO> roleResourceDOs = roleResourceMapper.selectListByRoleIds(roleIds);
if (CollectionUtils.isEmpty(roleResourceDOs)) {
return Collections.emptyList();
}
List<ResourceDO> resourceDOs = resourceMapper.selectListByIdsAndType(
CollectionUtils.convertSet(roleResourceDOs, RoleResourceDO::getResourceId), type);
return ResourceConvert.INSTANCE.convertList(resourceDOs);
}
/**
* 校验父资源是否合法
*
* 1. 不能设置自己为父资源
* 2. 父资源不存在
* 3. 父资源必须是 {@link ResourceTypeEnum#MENU} 菜单类型
*
* @param pid 父资源编号
* @param childId 当前资源编号
*/
private void checkParentResource(Integer pid, Integer childId) {
if (pid == null || ResourceIdEnum.ROOT.getId().equals(pid)) {
return;
}
// 不能设置自己为父资源
if (pid.equals(childId)) {
throw ServiceExceptionUtil.exception(RESOURCE_PARENT_ERROR);
}
ResourceDO resource = resourceMapper.selectById(pid);
// 父资源不存在
if (resource == null) {
throw ServiceExceptionUtil.exception(RESOURCE_PARENT_NOT_EXISTS);
}
// 父资源必须是菜单类型
if (!ResourceTypeEnum.MENU.getType().equals(resource.getType())) {
throw ServiceExceptionUtil.exception(RESOURCE_PARENT_NOT_MENU);
}
}
/**
* 校验资源是否合法
*
* 1. 校验相同父资源编号下,是否存在相同的资源名
*
* @param name 资源名字
* @param pid 父资源编号
* @param id 资源编号
*/
private void checkResource(Integer pid, String name, Integer id) {
ResourceDO resource = resourceMapper.selectByPidAndName(pid, name);
if (resource == null) {
return;
}
// 如果 id 为空,说明不用比较是否为相同 id 的资源
if (id == null) {
throw ServiceExceptionUtil.exception(RESOURCE_NAME_DUPLICATE);
}
if (!resource.getId().equals(id)) {
throw ServiceExceptionUtil.exception(RESOURCE_NAME_DUPLICATE);
}
}
/**
* 初始化资源的通用属性。
*
* 例如说,只有菜单类型的资源,才设置 icon
*
* @param resource 资源
*/
private void initResourceProperty(ResourceDO resource) {
// 资源为按钮类型时,无需 route、icon、view 属性,进行置空
if (ResourceTypeEnum.BUTTON.getType().equals(resource.getType())) {
resource.setRoute(null);
resource.setIcon(null);
resource.setView(null);
}
}
} }
package cn.iocoder.mall.systemservice.service.permission;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import cn.iocoder.mall.systemservice.convert.permission.ResourceConvert;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.ResourceDO;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.permission.RoleResourceDO;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.ResourceMapper;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.permission.RoleResourceMapper;
import cn.iocoder.mall.systemservice.enums.SystemErrorCodeConstants;
import cn.iocoder.mall.systemservice.enums.permission.ResourceIdEnum;
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceBO;
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceCreateBO;
import cn.iocoder.mall.systemservice.service.permission.bo.ResourceUpdateBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeConstants.*;
/**
* 资源 Service
*/
@Service
@Validated
public class ResourceServiceImpl implements ResourceService {
@Autowired
private ResourceMapper resourceMapper;
@Autowired
private RoleResourceMapper roleResourceMapper;
/**
* 创建资源
*
* @param createBO 创建资源 BO
* @return 资源
*/
public ResourceBO createResource(@Valid ResourceCreateBO createBO) {
// 校验父资源存在
checkParentResource(createBO.getPid(), null);
// 校验资源(自己)
checkResource(createBO.getPid(), createBO.getName(), null);
// 插入数据库
ResourceDO resourceDO = ResourceConvert.INSTANCE.convert(createBO);
initResourceProperty(resourceDO);
resourceMapper.insert(resourceDO);
// 返回
return ResourceConvert.INSTANCE.convert(resourceDO);
}
/**
* 更新资源
*
* @param updateBO 更新资源 BO
*/
public void updateResource(@Valid ResourceUpdateBO updateBO) {
// 校验更新的资源是否存在
if (resourceMapper.selectById(updateBO.getId()) == null) {
throw ServiceExceptionUtil.exception(RESOURCE_NOT_EXISTS);
}
// 校验父资源存在
checkParentResource(updateBO.getPid(), updateBO.getId());
// 校验资源(自己)
checkResource(updateBO.getPid(), updateBO.getName(), updateBO.getId());
// 更新到数据库
ResourceDO updateObject = ResourceConvert.INSTANCE.convert(updateBO);
initResourceProperty(updateObject);
resourceMapper.updateById(updateObject);
}
/**
* 删除资源
*
* @param resourceId 资源编号
*/
public void deleteResource(Integer resourceId) {
// 校验更新的资源是否存在
if (resourceMapper.selectById(resourceId) == null) {
throw ServiceExceptionUtil.exception(SystemErrorCodeConstants.RESOURCE_NOT_EXISTS);
}
// 校验是否还有子资源
if (resourceMapper.selectCountByPid(resourceId) > 0) {
throw ServiceExceptionUtil.exception(SystemErrorCodeConstants.RESOURCE_EXISTS_CHILDREN);
}
// 校验删除的资源是否存在
if (resourceMapper.selectById(resourceId) == null) {
throw ServiceExceptionUtil.exception(RESOURCE_NOT_EXISTS);
}
// 标记删除
resourceMapper.deleteById(resourceId);
// 删除授予给角色的权限
roleResourceMapper.deleteByResourceId(resourceId);
}
/**
* 获得资源
*
* @param resourceId 资源编号
* @return 资源
*/
public ResourceBO getResource(Integer resourceId) {
ResourceDO resourceDO = resourceMapper.selectById(resourceId);
return ResourceConvert.INSTANCE.convert(resourceDO);
}
/**
* 获得资源列表
*
* @param resourceIds 资源编号列表
* @return 资源列表
*/
public List<ResourceBO> listResources(List<Integer> resourceIds) {
List<ResourceDO> resourceDOs = resourceMapper.selectBatchIds(resourceIds);
return ResourceConvert.INSTANCE.convertList(resourceDOs);
}
/**
* 获得资源全列表
*
* @return 资源全列表
*/
public List<ResourceBO> listResources() {
List<ResourceDO> resourceDOs = resourceMapper.selectList(null);
return ResourceConvert.INSTANCE.convertList(resourceDOs);
}
/**
* 获得指定类型的资源列表
*
* @param type 资源类型,允许空
* @return 资源列表
*/
public List<ResourceBO> listResourcesByType(Integer type) {
List<ResourceDO> resourceDOs = resourceMapper.selectListByType(type);
return ResourceConvert.INSTANCE.convertList(resourceDOs);
}
/**
* 获得角色拥有的资源列表
*
* @param roleIds 角色编号
* @param type 资源类型,允许空
* @return 资源列表
*/
public List<ResourceBO> listRoleResourcesByType(Collection<Integer> roleIds, Integer type) {
List<RoleResourceDO> roleResourceDOs = roleResourceMapper.selectListByRoleIds(roleIds);
if (CollectionUtils.isEmpty(roleResourceDOs)) {
return Collections.emptyList();
}
List<ResourceDO> resourceDOs = resourceMapper.selectListByIdsAndType(
CollectionUtils.convertSet(roleResourceDOs, RoleResourceDO::getResourceId), type);
return ResourceConvert.INSTANCE.convertList(resourceDOs);
}
/**
* 校验父资源是否合法
*
* 1. 不能设置自己为父资源
* 2. 父资源不存在
* 3. 父资源必须是 {@link ResourceTypeEnum#MENU} 菜单类型
*
* @param pid 父资源编号
* @param childId 当前资源编号
*/
private void checkParentResource(Integer pid, Integer childId) {
if (pid == null || ResourceIdEnum.ROOT.getId().equals(pid)) {
return;
}
// 不能设置自己为父资源
if (pid.equals(childId)) {
throw ServiceExceptionUtil.exception(RESOURCE_PARENT_ERROR);
}
ResourceDO resource = resourceMapper.selectById(pid);
// 父资源不存在
if (resource == null) {
throw ServiceExceptionUtil.exception(RESOURCE_PARENT_NOT_EXISTS);
}
// 父资源必须是菜单类型
if (!ResourceTypeEnum.MENU.getType().equals(resource.getType())) {
throw ServiceExceptionUtil.exception(RESOURCE_PARENT_NOT_MENU);
}
}
/**
* 校验资源是否合法
*
* 1. 校验相同父资源编号下,是否存在相同的资源名
*
* @param name 资源名字
* @param pid 父资源编号
* @param id 资源编号
*/
private void checkResource(Integer pid, String name, Integer id) {
ResourceDO resource = resourceMapper.selectByPidAndName(pid, name);
if (resource == null) {
return;
}
// 如果 id 为空,说明不用比较是否为相同 id 的资源
if (id == null) {
throw ServiceExceptionUtil.exception(RESOURCE_NAME_DUPLICATE);
}
if (!resource.getId().equals(id)) {
throw ServiceExceptionUtil.exception(RESOURCE_NAME_DUPLICATE);
}
}
/**
* 初始化资源的通用属性。
*
* 例如说,只有菜单类型的资源,才设置 icon
*
* @param resource 资源
*/
private void initResourceProperty(ResourceDO resource) {
// 资源为按钮类型时,无需 route、icon、view 属性,进行置空
if (ResourceTypeEnum.BUTTON.getType().equals(resource.getType())) {
resource.setRoute(null);
resource.setIcon(null);
resource.setView(null);
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论