【7.6.0】【sys】【menu】更新新增菜单的校验和pids填充

pull/55/MERGE
fengshuonan 2023-06-15 10:15:25 +08:00
parent d0b5a768e8
commit edcdc9f996
4 changed files with 198 additions and 10 deletions

View File

@ -0,0 +1,92 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.sys.api.enums;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.rule.base.ReadableEnum;
import lombok.Getter;
/**
* 10-20-30-40-
*
* @author fengshuonan
* @since 2023/6/15 9:45
*/
@Getter
public enum MenuTypeEnum implements ReadableEnum<MenuTypeEnum> {
/**
*
*/
BACKEND_MENU(10, "后台菜单"),
/**
*
*/
FRONT_VUE(20, "纯前台路由界面"),
/**
*
*/
INNER_URL(30, "内部链接"),
/**
*
*/
OUT_URL(40, "外部链接");
private final Integer code;
private final String message;
MenuTypeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
@Override
public Object getKey() {
return this.code;
}
@Override
public Object getName() {
return this.message;
}
@Override
public MenuTypeEnum parseToEnum(String originValue) {
if (ObjectUtil.isEmpty(originValue)) {
return null;
}
for (MenuTypeEnum value : MenuTypeEnum.values()) {
if (value.code.equals(Convert.toInt(originValue))) {
return value;
}
}
return null;
}
}

View File

@ -21,7 +21,27 @@ public enum SysMenuExceptionEnum implements AbstractExceptionEnum {
/**
*
*/
MENU_CODE_REPEAT(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10002", "当前应用下菜单编码存在重复,请更换编码");
MENU_CODE_REPEAT(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10002", "当前应用下菜单编码存在重复,请更换编码"),
/**
*
*/
URL_CANT_EMPTY(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10003", "路由地址不能为空"),
/**
*
*/
COMPONENT_PATH_CANT_EMPTY(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10004", "组件代码路径不能为空"),
/**
*
*/
HIDDEN_FLAG_CANT_EMPTY(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10005", "是否隐藏不能为空"),
/**
*
*/
LINK_URL_CANT_EMPTY(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10006", "链接地址不能为空");
/**
*

View File

@ -1,7 +1,9 @@
package cn.stylefeng.roses.kernel.sys.modular.menu.factory;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.sys.api.enums.MenuTypeEnum;
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu;
import cn.stylefeng.roses.kernel.sys.modular.menu.enums.SysMenuExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.menu.pojo.request.SysMenuRequest;
@ -26,21 +28,67 @@ public class MenuValidateFactory {
SysMenuService sysMenuService = SpringUtil.getBean(SysMenuService.class);
// 同应用下菜单编码不能重复
// 1. 校验同应用下菜单编码不能重复
Long menuId = sysMenuRequest.getMenuId();
// 如果是新增菜单
if (menuId == null) {
String menuCode = sysMenuRequest.getMenuCode();
LambdaQueryWrapper<SysMenu> sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysMenuLambdaQueryWrapper.eq(SysMenu::getMenuCode, menuCode);
long alreadyCount = sysMenuService.count(sysMenuLambdaQueryWrapper);
if (alreadyCount > 0) {
throw new ServiceException(SysMenuExceptionEnum.MENU_CODE_REPEAT);
String menuCode = sysMenuRequest.getMenuCode();
LambdaQueryWrapper<SysMenu> sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysMenuLambdaQueryWrapper.eq(SysMenu::getMenuCode, menuCode);
sysMenuLambdaQueryWrapper.eq(SysMenu::getAppId, sysMenuRequest.getAppId());
// 如果是编辑菜单,则排除当前这个菜单的查询
if (menuId != null) {
sysMenuLambdaQueryWrapper.ne(SysMenu::getMenuId, menuId);
}
long alreadyCount = sysMenuService.count(sysMenuLambdaQueryWrapper);
if (alreadyCount > 0) {
throw new ServiceException(SysMenuExceptionEnum.MENU_CODE_REPEAT);
}
// 2. 校验vue组件相关的配置是否必填
Integer menuType = sysMenuRequest.getMenuType();
// 2.1 如果是后台菜单,校验路由地址、组件代码路径、是否隐藏参数
if (MenuTypeEnum.BACKEND_MENU.getKey().equals(menuType)) {
if (ObjectUtil.isEmpty(sysMenuRequest.getAntdvRouter())) {
throw new ServiceException(SysMenuExceptionEnum.URL_CANT_EMPTY);
}
if (ObjectUtil.isEmpty(sysMenuRequest.getAntdvComponent())) {
throw new ServiceException(SysMenuExceptionEnum.COMPONENT_PATH_CANT_EMPTY);
}
if (ObjectUtil.isEmpty(sysMenuRequest.getAntdvVisible())) {
throw new ServiceException(SysMenuExceptionEnum.HIDDEN_FLAG_CANT_EMPTY);
}
}
// 2.2 如果是纯前端路由,则判断路由地址和组件代码路径
else if (MenuTypeEnum.FRONT_VUE.getKey().equals(menuType)) {
if (ObjectUtil.isEmpty(sysMenuRequest.getAntdvRouter())) {
throw new ServiceException(SysMenuExceptionEnum.URL_CANT_EMPTY);
}
if (ObjectUtil.isEmpty(sysMenuRequest.getAntdvComponent())) {
throw new ServiceException(SysMenuExceptionEnum.COMPONENT_PATH_CANT_EMPTY);
}
}
// 2.3 如果是内部链接,判断路由地址和连接地址
else if (MenuTypeEnum.INNER_URL.getKey().equals(menuType)) {
if (ObjectUtil.isEmpty(sysMenuRequest.getAntdvRouter())) {
throw new ServiceException(SysMenuExceptionEnum.URL_CANT_EMPTY);
}
if (ObjectUtil.isEmpty(sysMenuRequest.getAntdvLinkUrl())) {
throw new ServiceException(SysMenuExceptionEnum.LINK_URL_CANT_EMPTY);
}
}
// 2.4 如果是外部链接,则判断外部链接地址
else if (MenuTypeEnum.OUT_URL.getKey().equals(menuType)) {
if (ObjectUtil.isEmpty(sysMenuRequest.getAntdvComponent())) {
throw new ServiceException(SysMenuExceptionEnum.COMPONENT_PATH_CANT_EMPTY);
}
}
}
}

View File

@ -3,6 +3,8 @@ package cn.stylefeng.roses.kernel.sys.modular.menu.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.rule.constants.SymbolConstant;
import cn.stylefeng.roses.kernel.rule.constants.TreeConstants;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.sys.modular.app.service.SysAppService;
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu;
@ -45,6 +47,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
BeanUtil.copyProperties(sysMenuRequest, sysMenu);
// 组装pids集合
String pids = this.createPids(sysMenuRequest.getMenuParentId());
sysMenu.setMenuPids(pids);
this.save(sysMenu);
}
@ -177,4 +181,28 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
return queryWrapper;
}
/**
* pids
* <p>
* pidpids = [-1],
* <p>
* pidpids = pids,[pid],
*
* @author fengshuonan
* @since 2023/6/15 10:09
*/
private String createPids(Long pid) {
if (pid.equals(TreeConstants.DEFAULT_PARENT_ID)) {
return SymbolConstant.LEFT_SQUARE_BRACKETS + TreeConstants.DEFAULT_PARENT_ID + SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA;
} else {
//获取父菜单
SysMenuRequest sysMenuRequest = new SysMenuRequest();
sysMenuRequest.setMenuId(pid);
SysMenu parentMenu = this.querySysMenu(sysMenuRequest);
// 组装pids
return parentMenu.getMenuPids() + SymbolConstant.LEFT_SQUARE_BRACKETS + pid + SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA;
}
}
}