From a09711c04e64f3f04c33a1ef5305fdfbfc9be05c Mon Sep 17 00:00:00 2001 From: Charles7c Date: Mon, 20 Mar 2023 21:56:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=EF=BC=9A=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E7=BB=86?= =?UTF-8?q?=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cnadmin/common/util/URLUtils.java | 43 +++++++++++++++++++ .../cnadmin/auth/model/vo/MetaVO.java | 18 ++++++++ .../auth/service/impl/LoginServiceImpl.java | 2 + .../src/views/system/menu/index.vue | 6 +-- .../controller/system/MenuController.java | 40 ++++++++++++++++- 5 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 continew-admin-common/src/main/java/top/charles7c/cnadmin/common/util/URLUtils.java diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/util/URLUtils.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/util/URLUtils.java new file mode 100644 index 00000000..9a0e95d5 --- /dev/null +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/util/URLUtils.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * 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. + */ + +package top.charles7c.cnadmin.common.util; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import cn.hutool.http.HttpUtil; + +/** + * URL(Uniform Resource Locator)统一资源定位符相关工具类 + * + * @author Charles7c + * @since 2023/3/20 21:27 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class URLUtils { + + /** + * 提供的 URL 是否为 HTTP URL(协议包括:"http","https") + * + * @param url + * URL + * @return 是否为 HTTP URL + */ + public static boolean isHttpUrl(String url) { + return HttpUtil.isHttp(url) || HttpUtil.isHttps(url); + } +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/vo/MetaVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/vo/MetaVO.java index 8ba35af2..28ff02b2 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/vo/MetaVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/vo/MetaVO.java @@ -47,4 +47,22 @@ public class MetaVO implements Serializable { */ @Schema(description = "菜单图标") private String icon; + + /** + * 是否隐藏 + */ + @Schema(description = "是否隐藏") + private Boolean hideInMenu; + + /** + * 是否缓存 + */ + @Schema(description = "是否缓存") + private Boolean ignoreCache; + + /** + * 是否需要登录才能访问 + */ + @Schema(description = "是否需要登录才能访问") + private Boolean requiresAuth = true; } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java index 42b44cbe..78cdaacd 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java @@ -121,6 +121,8 @@ public class LoginServiceImpl implements LoginService { MetaVO metaVO = new MetaVO(); metaVO.setLocale(m.getTitle()); metaVO.setIcon(m.getIcon()); + metaVO.setIgnoreCache(!m.getIsCache()); + metaVO.setHideInMenu(m.getIsHidden()); tree.putExtra("meta", metaVO); }); return BeanUtil.copyToList(treeList, RouteVO.class); diff --git a/continew-admin-ui/src/views/system/menu/index.vue b/continew-admin-ui/src/views/system/menu/index.vue index 20a3ec22..41831974 100644 --- a/continew-admin-ui/src/views/system/menu/index.vue +++ b/continew-admin-ui/src/views/system/menu/index.vue @@ -136,19 +136,19 @@ diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/MenuController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/MenuController.java index eff0e89d..8a840c5a 100644 --- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/MenuController.java +++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/MenuController.java @@ -20,10 +20,20 @@ import static top.charles7c.cnadmin.common.annotation.CrudRequestMapping.Api; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; + import top.charles7c.cnadmin.common.annotation.CrudRequestMapping; import top.charles7c.cnadmin.common.base.BaseController; +import top.charles7c.cnadmin.common.base.BaseRequest; +import top.charles7c.cnadmin.common.model.vo.R; +import top.charles7c.cnadmin.common.util.URLUtils; +import top.charles7c.cnadmin.common.util.validate.ValidationUtils; import top.charles7c.cnadmin.system.model.query.MenuQuery; import top.charles7c.cnadmin.system.model.request.MenuRequest; import top.charles7c.cnadmin.system.model.vo.MenuVO; @@ -38,4 +48,32 @@ import top.charles7c.cnadmin.system.service.MenuService; @Tag(name = "菜单管理 API") @RestController @CrudRequestMapping(value = "/system/menu", api = {Api.TREE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT}) -public class MenuController extends BaseController {} +public class MenuController extends BaseController { + + @Override + @SaCheckPermission("system:menu:add") + protected R add(@Validated(BaseRequest.Add.class) @RequestBody MenuRequest request) { + this.checkPath(request); + return super.add(request); + } + + @Override + @SaCheckPermission("system:menu:update") + protected R update(@Validated(BaseRequest.Update.class) @RequestBody MenuRequest request, @PathVariable Long id) { + this.checkPath(request); + return super.update(request, id); + } + + /** + * 检查路由地址格式 + * + * @param request + * 创建或修改信息 + */ + private void checkPath(MenuRequest request) { + Boolean isExternal = ObjectUtil.defaultIfNull(request.getIsExternal(), false); + String path = request.getPath(); + ValidationUtils.throwIf(isExternal && !URLUtils.isHttpUrl(path), "路由地址格式错误,请以 http:// 或 https:// 开头"); + ValidationUtils.throwIf(!isExternal && URLUtils.isHttpUrl(path), "路由地址格式错误"); + } +}