Преглед на файлове

优化菜单加载慢的问题,实际项目测试环境1核1兆服务器,首次登录,加载菜单时间太长,原因是获取菜单使用了子查询;已修改为循环方式,速度直接起飞

jian_fei_zhang преди 3 години
родител
ревизия
3b8acda134

+ 2 - 1
src/main/java/io/renren/modules/sys/entity/SysMenuEntity.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -80,6 +81,6 @@ public class SysMenuEntity implements Serializable {
 	private Boolean open;
 
 	@TableField(exist=false)
-	private List<?> list;
+	private List<SysMenuEntity> list=new ArrayList<>();
 
 }

+ 31 - 2
src/main/java/io/renren/modules/sys/service/impl/SysMenuServiceImpl.java

@@ -9,6 +9,7 @@
 package io.renren.modules.sys.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import io.renren.common.utils.Constant;
 import io.renren.common.utils.MapUtils;
@@ -20,8 +21,7 @@ import io.renren.modules.sys.service.SysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 
 @Service("sysMenuService")
@@ -69,6 +69,35 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuDao, SysMenuEntity> i
 		return getAllMenuList(menuIdList);
 	}
 
+	/**
+	 * 获取拥有的菜单列表
+	 * @param menuIdList
+	 * @return
+	 */
+	private List<SysMenuEntity> getMenuList(List<Long> menuIdList) {
+		// 查询拥有的所有菜单
+		List<SysMenuEntity> menus = this.baseMapper.selectList(new QueryWrapper<SysMenuEntity>()
+				.in(Objects.nonNull(menuIdList), "menu_id", menuIdList).in("type", 0, 1));
+		// 将id和菜单绑定
+		HashMap<Long, SysMenuEntity> menuMap = new HashMap<>(12);
+		for (SysMenuEntity s : menus) {
+			menuMap.put(s.getMenuId(), s);
+		}
+		// 使用迭代器,组装菜单的层级关系
+		Iterator<SysMenuEntity> iterator = menus.iterator();
+		while (iterator.hasNext()) {
+			SysMenuEntity menu = iterator.next();
+			SysMenuEntity parent = menuMap.get(menu.getParentId());
+			if (Objects.nonNull(parent)) {
+				parent.getList().add(menu);
+				// 将这个菜单从当前节点移除
+				iterator.remove();
+			}
+		}
+
+		return menus;
+	}
+
 	@Override
 	public void delete(Long menuId){
 		//删除菜单