Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
sts网站
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liyang
sts网站
Commits
245baa70
Commit
245baa70
authored
Jan 09, 2026
by
RuoYi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加菜单路由地址和名称的校验规则
parent
cfe076eb
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
91 additions
and
14 deletions
+91
-14
SysMenuController.java
...va/com/ruoyi/web/controller/system/SysMenuController.java
+8
-0
SysMenuMapper.java
.../src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
+9
-0
ISysMenuService.java
...c/main/java/com/ruoyi/system/service/ISysMenuService.java
+8
-0
SysMenuServiceImpl.java
...ava/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
+60
-13
SysMenuMapper.xml
...system/src/main/resources/mapper/system/SysMenuMapper.xml
+6
-1
No files found.
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
View file @
245baa70
...
...
@@ -93,6 +93,10 @@ public class SysMenuController extends BaseController
{
return
error
(
"新增菜单'"
+
menu
.
getMenuName
()
+
"'失败,地址必须以http(s)://开头"
);
}
else
if
(!
menuService
.
checkRouteConfigUnique
(
menu
))
{
return
error
(
"新增菜单'"
+
menu
.
getMenuName
()
+
"'失败,路由名称或地址已存在"
);
}
menu
.
setCreateBy
(
getUsername
());
return
toAjax
(
menuService
.
insertMenu
(
menu
));
}
...
...
@@ -117,6 +121,10 @@ public class SysMenuController extends BaseController
{
return
error
(
"修改菜单'"
+
menu
.
getMenuName
()
+
"'失败,上级菜单不能选择自己"
);
}
else
if
(!
menuService
.
checkRouteConfigUnique
(
menu
))
{
return
error
(
"修改菜单'"
+
menu
.
getMenuName
()
+
"'失败,路由名称或地址已存在"
);
}
menu
.
setUpdateBy
(
getUsername
());
return
toAjax
(
menuService
.
updateMenu
(
menu
));
}
...
...
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
View file @
245baa70
...
...
@@ -122,4 +122,13 @@ public interface SysMenuMapper
* @return 结果
*/
public
SysMenu
checkMenuNameUnique
(
@Param
(
"menuName"
)
String
menuName
,
@Param
(
"parentId"
)
Long
parentId
);
/**
* 根据路由路径或名称查询菜单信息(用于唯一性校验)
*
* @param path 路由地址
* @param routeName 路由名称
* @return 匹配的菜单列表
*/
public
List
<
SysMenu
>
selectMenusByPathOrRouteName
(
@Param
(
"path"
)
String
path
,
@Param
(
"routeName"
)
String
routeName
);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
View file @
245baa70
...
...
@@ -141,4 +141,12 @@ public interface ISysMenuService
* @return 结果
*/
public
boolean
checkMenuNameUnique
(
SysMenu
menu
);
/**
* 校验路由组合是否唯一
*
* @param menu 菜单信息
* @return 结果
*/
public
boolean
checkRouteConfigUnique
(
SysMenu
menu
);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
View file @
245baa70
...
...
@@ -8,6 +8,8 @@ import java.util.LinkedList;
import
java.util.List
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
com.ruoyi.common.constant.Constants
;
...
...
@@ -32,8 +34,12 @@ import com.ruoyi.system.service.ISysMenuService;
@Service
public
class
SysMenuServiceImpl
implements
ISysMenuService
{
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
SysMenuServiceImpl
.
class
);
public
static
final
String
PREMISSION_STRING
=
"perms[\"{0}\"]"
;
public
static
final
Long
MENU_ROOT_ID
=
0L
;
@Autowired
private
SysMenuMapper
menuMapper
;
...
...
@@ -138,7 +144,7 @@ public class SysMenuServiceImpl implements ISysMenuService
{
menus
=
menuMapper
.
selectMenuTreeByUserId
(
userId
);
}
return
getChildPerms
(
menus
,
0
);
return
getChildPerms
(
menus
,
MENU_ROOT_ID
);
}
/**
...
...
@@ -193,7 +199,7 @@ public class SysMenuServiceImpl implements ISysMenuService
childrenList
.
add
(
children
);
router
.
setChildren
(
childrenList
);
}
else
if
(
menu
.
getParentId
().
intValue
()
==
0
&&
isInnerLink
(
menu
))
else
if
(
menu
.
getParentId
().
intValue
()
==
MENU_ROOT_ID
&&
isInnerLink
(
menu
))
{
router
.
setMeta
(
new
MetaVo
(
menu
.
getMenuName
(),
menu
.
getIcon
()));
router
.
setPath
(
"/"
);
...
...
@@ -345,6 +351,47 @@ public class SysMenuServiceImpl implements ISysMenuService
return
UserConstants
.
UNIQUE
;
}
/**
* 校验路由名称是否唯一
*
* @param menu 菜单信息
* @return 结果
*/
@Override
public
boolean
checkRouteConfigUnique
(
SysMenu
menu
)
{
Long
menuId
=
StringUtils
.
isNull
(
menu
.
getMenuId
())
?
-
1L
:
menu
.
getMenuId
();
Long
parentId
=
menu
.
getParentId
();
String
path
=
menu
.
getPath
();
String
routeName
=
StringUtils
.
isEmpty
(
menu
.
getRouteName
())
?
path
:
menu
.
getRouteName
();
List
<
SysMenu
>
sysMenuList
=
menuMapper
.
selectMenusByPathOrRouteName
(
path
,
routeName
);
for
(
SysMenu
sysMenu
:
sysMenuList
)
{
if
(
sysMenu
.
getMenuId
().
longValue
()
!=
menuId
.
longValue
())
{
Long
dbParentId
=
sysMenu
.
getParentId
();
String
dbPath
=
sysMenu
.
getPath
();
String
dbRouteName
=
StringUtils
.
isEmpty
(
sysMenu
.
getRouteName
())
?
dbPath
:
sysMenu
.
getRouteName
();
if
(
StringUtils
.
equalsAnyIgnoreCase
(
path
,
dbPath
)
&&
parentId
.
longValue
()
==
dbParentId
.
longValue
())
{
log
.
warn
(
"[同级路由冲突] 同级下已存在相同路由路径 '{}',冲突菜单:{}"
,
dbPath
,
sysMenu
.
getMenuName
());
return
UserConstants
.
NOT_UNIQUE
;
}
else
if
(
StringUtils
.
equalsAnyIgnoreCase
(
path
,
dbPath
)
&&
parentId
.
longValue
()
==
MENU_ROOT_ID
)
{
log
.
warn
(
"[根目录路由冲突] 根目录下路由 '{}' 必须唯一,已被菜单 '{}' 占用"
,
path
,
sysMenu
.
getMenuName
());
return
UserConstants
.
NOT_UNIQUE
;
}
else
if
(
StringUtils
.
equalsAnyIgnoreCase
(
routeName
,
dbRouteName
))
{
log
.
warn
(
"[路由名称冲突] 路由名称 '{}' 需全局唯一,已被菜单 '{}' 使用"
,
routeName
,
sysMenu
.
getMenuName
());
return
UserConstants
.
NOT_UNIQUE
;
}
}
}
return
UserConstants
.
UNIQUE
;
}
/**
* 获取路由名称
*
...
...
@@ -384,12 +431,12 @@ public class SysMenuServiceImpl implements ISysMenuService
{
String
routerPath
=
menu
.
getPath
();
// 内链打开外网方式
if
(
menu
.
getParentId
().
intValue
()
!=
0
&&
isInnerLink
(
menu
))
if
(
menu
.
getParentId
().
intValue
()
!=
MENU_ROOT_ID
&&
isInnerLink
(
menu
))
{
routerPath
=
innerLinkReplaceEach
(
routerPath
);
}
// 非外链并且是一级目录(类型为目录)
if
(
0
==
menu
.
getParentId
().
intValue
()
&&
UserConstants
.
TYPE_DIR
.
equals
(
menu
.
getMenuType
())
if
(
MENU_ROOT_ID
==
menu
.
getParentId
().
intValue
()
&&
UserConstants
.
TYPE_DIR
.
equals
(
menu
.
getMenuType
())
&&
UserConstants
.
NO_FRAME
.
equals
(
menu
.
getIsFrame
()))
{
routerPath
=
"/"
+
menu
.
getPath
();
...
...
@@ -415,7 +462,7 @@ public class SysMenuServiceImpl implements ISysMenuService
{
component
=
menu
.
getComponent
();
}
else
if
(
StringUtils
.
isEmpty
(
menu
.
getComponent
())
&&
menu
.
getParentId
().
intValue
()
!=
0
&&
isInnerLink
(
menu
))
else
if
(
StringUtils
.
isEmpty
(
menu
.
getComponent
())
&&
menu
.
getParentId
().
intValue
()
!=
MENU_ROOT_ID
&&
isInnerLink
(
menu
))
{
component
=
UserConstants
.
INNER_LINK
;
}
...
...
@@ -434,30 +481,30 @@ public class SysMenuServiceImpl implements ISysMenuService
*/
public
boolean
isMenuFrame
(
SysMenu
menu
)
{
return
menu
.
getParentId
().
intValue
()
==
0
&&
UserConstants
.
TYPE_MENU
.
equals
(
menu
.
getMenuType
())
return
menu
.
getParentId
().
intValue
()
==
MENU_ROOT_ID
&&
UserConstants
.
TYPE_MENU
.
equals
(
menu
.
getMenuType
())
&&
menu
.
getIsFrame
().
equals
(
UserConstants
.
NO_FRAME
);
}
/**
* 是否为
内链
组件
* 是否为
parent_view
组件
*
* @param menu 菜单信息
* @return 结果
*/
public
boolean
is
InnerLink
(
SysMenu
menu
)
public
boolean
is
ParentView
(
SysMenu
menu
)
{
return
menu
.
get
IsFrame
().
equals
(
UserConstants
.
NO_FRAME
)
&&
StringUtils
.
ishttp
(
menu
.
getPath
());
return
menu
.
get
ParentId
().
intValue
()
!=
MENU_ROOT_ID
&&
UserConstants
.
TYPE_DIR
.
equals
(
menu
.
getMenuType
());
}
/**
* 是否为
parent_view
组件
* 是否为
内链
组件
*
* @param menu 菜单信息
* @return 结果
*/
public
boolean
is
ParentView
(
SysMenu
menu
)
public
boolean
is
InnerLink
(
SysMenu
menu
)
{
return
menu
.
get
ParentId
().
intValue
()
!=
0
&&
UserConstants
.
TYPE_DIR
.
equals
(
menu
.
getMenuType
());
return
menu
.
get
IsFrame
().
equals
(
UserConstants
.
NO_FRAME
)
&&
StringUtils
.
ishttp
(
menu
.
getPath
());
}
/**
...
...
@@ -467,7 +514,7 @@ public class SysMenuServiceImpl implements ISysMenuService
* @param parentId 传入的父节点ID
* @return String
*/
public
List
<
SysMenu
>
getChildPerms
(
List
<
SysMenu
>
list
,
int
parentId
)
public
List
<
SysMenu
>
getChildPerms
(
List
<
SysMenu
>
list
,
long
parentId
)
{
List
<
SysMenu
>
returnList
=
new
ArrayList
<
SysMenu
>();
for
(
Iterator
<
SysMenu
>
iterator
=
list
.
iterator
();
iterator
.
hasNext
();)
...
...
ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
View file @
245baa70
...
...
@@ -130,7 +130,12 @@
<select
id=
"checkMenuNameUnique"
parameterType=
"SysMenu"
resultMap=
"SysMenuResult"
>
<include
refid=
"selectMenuVo"
/>
where menu_name=#{menuName} and parent_id = #{parentId} limit 1
where menu_name= #{menuName} and parent_id = #{parentId} limit 1
</select>
<select
id=
"selectMenusByPathOrRouteName"
parameterType=
"SysMenu"
resultMap=
"SysMenuResult"
>
<include
refid=
"selectMenuVo"
/>
where menu_type in ('M', 'C') and (path = #{path} or path = #{routeName} or route_name = #{path} or route_name = #{routeName})
</select>
<update
id=
"updateMenu"
parameterType=
"SysMenu"
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment