增加了单系统多子系统菜单功能

This commit is contained in:
wanggeng 2022-05-31 00:59:13 +08:00
parent c83e384daa
commit e642afd0e2
3 changed files with 156 additions and 13 deletions

View File

@ -6,6 +6,7 @@ import ink.wgink.interfaces.menu.IMenuBaseService;
import ink.wgink.interfaces.role.IRoleMenuBaseService;
import ink.wgink.login.base.consts.IUserCenterConst;
import ink.wgink.login.base.manager.ConfigManager;
import ink.wgink.login.base.util.MenuUtil;
import ink.wgink.pojo.bos.UserInfoBO;
import ink.wgink.pojo.dtos.menu.MenuDTO;
import ink.wgink.pojo.dtos.role.RoleSimpleDTO;
@ -14,6 +15,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
@ -32,6 +34,7 @@ import java.util.Map;
*/
@Controller
public class IndexRouteController {
private static final String SYSTEM_HOME_SPLIT = "__";
@Autowired
private SecurityComponent securityComponent;
@ -57,6 +60,12 @@ public class IndexRouteController {
*/
@GetMapping("default-main")
public ModelAndView defaultMain() {
return defaultMain(IMenuBaseService.MENU_UNIFIED_USER + SYSTEM_HOME_SPLIT + "default-home");
}
@GetMapping("default-main/{rootMenuId}")
public ModelAndView defaultMain(@PathVariable("rootMenuId") String rootMenuId) {
ModelAndView mv = new ModelAndView("default-main");
UserInfoBO userInfoBO = securityComponent.getCurrentUser();
mv.addObject("userUsername", userInfoBO.getUserUsername());
@ -81,14 +90,19 @@ public class IndexRouteController {
mv.addObject(IUserCenterConst.MENU_MODE, config.get(IUserCenterConst.MENU_MODE));
}
if (menuBaseService != null) {
// 所有系统菜单
List<MenuDTO> systems = menuBaseService.listByParentId("0");
List<MenuDTO> menus;
if (securityComponent.isAdmin()) {
// 管理员
List<String> menuIds = roleMenuBaseService.listMenuId(ISystemConstant.ADMIN);
if (menuIds.isEmpty()) {
menus = menuBaseService.listSystemMenu(IMenuBaseService.MENU_UNIFIED_USER);
menus = menuBaseService.listSystemMenu(rootMenuId);
// 移除菜单中的第一个斜杠保证跳转正常
systems = MenuUtil.listSystems(systems);
} else {
menus = menuBaseService.listSystemMenu(IMenuBaseService.MENU_UNIFIED_USER, menuIds);
menus = menuBaseService.listSystemMenu(rootMenuId, menuIds);
systems = MenuUtil.listSystems(systems, menuIds);
}
} else {
// 普通用户
@ -101,11 +115,24 @@ public class IndexRouteController {
roleIds.add(roleSimpleDTO.getRoleId());
}
List<String> menuIds = roleMenuBaseService.listMenuId(roleIds);
menus = menuBaseService.listSystemMenu(IMenuBaseService.MENU_UNIFIED_USER, menuIds);
menus = menuBaseService.listSystemMenu(rootMenuId, menuIds);
// 去除多余的系统
systems = MenuUtil.listSystems(systems, menuIds);
}
}
mv.addObject("menus", menus);
mv.addObject("systems", systems.isEmpty() ? null : systems);
}
String defaultHome = "default-home";
// 含有系统首页分隔符并且有内容
if (rootMenuId.contains(SYSTEM_HOME_SPLIT) && !rootMenuId.endsWith(SYSTEM_HOME_SPLIT)) {
String systemHomeUrl = rootMenuId.split(SYSTEM_HOME_SPLIT)[1];
if (!StringUtils.isBlank(systemHomeUrl)) {
defaultHome = systemHomeUrl;
}
}
mv.addObject("defaultHome", defaultHome);
return mv;
}

View File

@ -0,0 +1,89 @@
package ink.wgink.login.base.util;
import ink.wgink.pojo.dtos.menu.MenuDTO;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: MenuUtil
* @Description: 菜单工具
* @Author: wanggeng
* @Date: 2022/5/30 23:29
* @Version: 1.0
*/
public class MenuUtil {
public static List<MenuDTO> listSystems(List<MenuDTO> menuDTOS) {
if (menuDTOS == null || menuDTOS.isEmpty()) {
return new ArrayList<>();
}
List<MenuDTO> menus = new ArrayList<>();
for (int i = 0; i < menuDTOS.size(); i++) {
MenuDTO menuDTO = menuDTOS.get(i);
if (StringUtils.equals(menuDTO.getMenuUrl(), "javascript:void(0);")) {
continue;
}
menus.add(menuDTO);
}
removeMenuUrlFirstSlash(menus);
return menus;
}
/**
* 系统列表根节点为0的菜单
*
* @param menuDTOS 原菜单
* @param menuIds 筛选条件
* @return
*/
public static List<MenuDTO> listSystems(List<MenuDTO> menuDTOS, List<String> menuIds) {
if (menuDTOS == null || menuDTOS.isEmpty()) {
return new ArrayList<>();
}
if (menuIds == null || menuIds.isEmpty()) {
return new ArrayList<>();
}
List<MenuDTO> menus = new ArrayList<>();
for (int i = 0; i < menuDTOS.size(); i++) {
MenuDTO menuDTO = menuDTOS.get(i);
if (StringUtils.equals(menuDTO.getMenuUrl(), "javascript:void(0);")) {
continue;
}
boolean isExist = false;
for (String menuId : menuIds) {
if (StringUtils.equals(menuDTO.getMenuId(), menuId)) {
menus.add(menuDTO);
isExist = true;
break;
}
}
if (!isExist) {
menuDTOS.remove(i);
i--;
}
}
removeMenuUrlFirstSlash(menus);
return menus;
}
/**
* 删除菜单第一个斜杠
*
* @param menuDTOS
*/
public static void removeMenuUrlFirstSlash(List<MenuDTO> menuDTOS) {
if (menuDTOS == null) {
return;
}
for (MenuDTO menuDTO : menuDTOS) {
String menuUrl = menuDTO.getMenuUrl();
if (menuUrl.startsWith("/")) {
menuUrl = menuUrl.substring(1);
}
menuDTO.setMenuUrl(menuUrl);
}
}
}

View File

@ -12,21 +12,23 @@
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/default-main.css" media="all">
<style>
.system-nav-box {}
.system-nav-box .system-box {display:none;background-color: #fff;width: 260px;position: absolute;top: 50px;left: -50px;border: 1px solid #f6f6f6; overflow: hidden;}
.system-nav-box .system-box .system-item-list {width: 280px; max-height: 140px; overflow: auto;}
.system-nav-box .system-box .system-item-list .system-item {text-align: left; padding: 0 35px 0 15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom: 1px solid #f6f6f6;}
.system-nav-box .system-box .system-item-list .system-item:last-child {border-bottom: none;}
.system-nav-box .system-box .system-item-list .system-item i {}
</style>
<style th:if="${menuMode eq 'floatLeft'}">
.layui-side-menu-hidden {display: none;}
.layui-layout-admin .layui-layout-left, .layadmin-pagetabs, .layui-layout-admin .layui-body, .layui-layout-admin .layui-footer {left: 0px}
@media screen and (max-width: 992px) {
.layui-layout-admin .layui-side {
transform: none;
-webkit-transform: none;
width: 220px;
}
.layui-layout-admin .layui-side {transform: none;-webkit-transform: none;width: 220px;}
.layui-layout-admin .layui-layout-left,
.layadmin-pagetabs,
.layui-layout-admin .layui-body,
.layui-layout-admin .layui-footer {
left: 0;
}
.layui-layout-admin .layui-footer {left: 0;}
}
</style>
</head>
@ -46,6 +48,21 @@
<i class="layui-icon layui-icon-website"></i>
</a>
</li>
<li class="layui-nav-item layui-hide-xs system-nav-box" lay-unselect th:if="${systems ne null}">
<a href="javascript:void(0);" title="系统导航">
<i class="layui-icon layui-icon-app"></i>
</a>
<div class="system-box">
<div class="system-item-list">
<a th:href="${system.menuUrl}" class="system-item" th:title="${system.menuName}" th:each="system: ${systems}">
<span>
<i th:class="${system.menuIcon}"></i>
</span>
<span th:text="${system.menuName}"></span>
</a>
</div>
</div>
</li>
<li class="layui-nav-item" lay-unselect>
<a href="javascript:void(0);" layadmin-event="refresh" title="刷新">
<i class="layui-icon layui-icon-refresh-3"></i>
@ -169,7 +186,7 @@
</div>
</div>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
<script th:inline="javascript">
layui.config({
base: 'assets/layuiadmin/' //静态资源所在路径
}).extend({
@ -214,7 +231,7 @@
$('#LAY-changePassword').on('click', function() {
changePassword()
});
$('#defaultIFrame').attr('src', 'default-home');
$('#defaultIFrame').attr('src', [[${defaultHome}]]);
$('#LAY-logout').on('click', function() {
top.dialog.confirm('确认退出?', function() {
window.location.href = 'oauth/logout';
@ -241,6 +258,16 @@
}
});
/** 左浮动菜单 end **/
/**
* 系统导航
*/
$('.system-nav-box').on('mouseover', function() {
$('.system-box').show();
});
$('.system-nav-box').on('mouseout', function() {
$('.system-box').hide();
});
});
</script>
</body>