增加了mongo-menu模块

This commit is contained in:
wanggeng 2022-05-25 01:19:02 +08:00
parent f5816eb60b
commit 7f592e05b0
12 changed files with 508 additions and 23 deletions

View File

@ -0,0 +1,17 @@
package ink.wgink.interfaces.init;
/**
* @ClassName: IInitMongoData
* @Description: 初始化mongo数据
* @Author: wanggeng
* @Date: 2022/5/24 20:57
* @Version: 1.0
*/
public interface IInitMongoData {
/**
* 初始化 mongo 数据
*/
void init();
}

View File

@ -125,4 +125,23 @@ public interface IMenuBaseService {
*/
List<String> listMenuIdByUser(Map<String, Object> params);
/**
* 系统菜单列表
*
* @param systemMenuId 系统菜单
* @return
*/
List<MenuDTO> listSystemMenu(String systemMenuId);
/**
* 系统菜单列表
*
* @param systemMenuId 系统菜单ID
* @param selectedMenuIds 选中的菜单ID
* @return
*/
List<MenuDTO> listSystemMenu(String systemMenuId, List<String> selectedMenuIds);
}

View File

@ -0,0 +1,68 @@
package ink.wgink.interfaces.menu;
import ink.wgink.pojo.dtos.menu.MenuDTO;
import java.util.List;
/**
* @ClassName: IMongoMenuService
* @Description: mongo菜单
* @Author: wanggeng
* @Date: 2022/5/24 20:54
* @Version: 1.0
*/
public interface IMongoMenuService {
/**
* 更新全部系统菜单
*/
void updateAllSystemMenu();
/**
* 删除
*
* @param menuIds
*/
void delete(List<String> menuIds);
/**
* 更新
*
* @param menuId
*/
void update(String menuId);
/**
* 详情
*
* @param menuId
* @return
*/
MenuDTO get(String menuId);
/**
* 详情
*
* @param menuCode
* @return
*/
MenuDTO getByCode(String menuCode);
/**
* 系统子菜单列表
*
* @param systemMenuId 系统菜单ID
* @return
*/
List<MenuDTO> listSystemSubMenus(String systemMenuId);
/**
* 系统子菜单列表
*
* @param systemMenuId 系统菜单ID
* @param selectedMenuIds 选择的菜单ID
* @return
*/
List<MenuDTO> listSystemSubMenus(String systemMenuId, List<String> selectedMenuIds);
}

View File

@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
@ -161,7 +162,7 @@ public class MenuDTO implements Serializable {
}
public List<MenuDTO> getSubMenus() {
return subMenus;
return subMenus == null ? new ArrayList<>() : subMenus;
}
public void setSubMenus(List<MenuDTO> subMenus) {

View File

@ -86,9 +86,9 @@ public class IndexRouteController {
// 管理员
List<String> menuIds = roleMenuBaseService.listMenuId(ISystemConstant.ADMIN);
if (menuIds.isEmpty()) {
menus = menuBaseService.listAllByParentId(IMenuBaseService.MENU_UNIFIED_USER);
menus = menuBaseService.listSystemMenu(IMenuBaseService.MENU_UNIFIED_USER);
} else {
menus = menuBaseService.listAllByParentIdAndIds(IMenuBaseService.MENU_UNIFIED_USER, menuIds);
menus = menuBaseService.listSystemMenu(IMenuBaseService.MENU_UNIFIED_USER, menuIds);
}
} else {
// 普通用户
@ -101,7 +101,7 @@ public class IndexRouteController {
roleIds.add(roleSimpleDTO.getRoleId());
}
List<String> menuIds = roleMenuBaseService.listMenuId(roleIds);
menus = menuBaseService.listAllByParentIdAndIds(IMenuBaseService.MENU_UNIFIED_USER, menuIds);
menus = menuBaseService.listSystemMenu(IMenuBaseService.MENU_UNIFIED_USER, menuIds);
}
}
mv.addObject("menus", menus);

View File

@ -51,13 +51,13 @@ public class OAuth2ClientMenuServiceImpl extends DefaultBaseService implements I
menuIds = roleMenuBaseService.listMenuId(ISystemConstant.ADMIN);
// 管理员菜单为空加载全部
if (menuIds.isEmpty()) {
return menuBaseService.listAllByParentId(oAuth2ClientPO.getMenuId());
return menuBaseService.listSystemMenu(oAuth2ClientPO.getMenuId());
}
} else {
// 其他角色菜单
menuIds = roleMenuBaseService.listMenuId(roleIds);
}
return menuBaseService.listAllByParentIdAndIds(oAuth2ClientPO.getMenuId(), menuIds);
return menuBaseService.listSystemMenu(oAuth2ClientPO.getMenuId(), menuIds);
}
}

View File

@ -1,5 +1,6 @@
package ink.wgink.mongo.login.startup;
package ink.wgink.mongo.login.init;
import ink.wgink.interfaces.init.IInitMongoData;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.properties.ServerProperties;
import ink.wgink.service.user.service.IUserService;
@ -8,24 +9,22 @@ import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName: MongoLoginStartUp
* @Description: mongo启动
* @ClassName: InitLoginUser
* @Description: 初始化登录用户
* @Author: wanggeng
* @Date: 2022/5/19 16:25
* @Date: 2022/5/24 20:59
* @Version: 1.0
*/
@Component
public class MongoLoginStartUp implements ApplicationRunner {
public class InitMongoLoginUser implements IInitMongoData {
private static final Logger LOG = LoggerFactory.getLogger(MongoLoginStartUp.class);
private static final Logger LOG = LoggerFactory.getLogger(InitMongoLoginUser.class);
@Autowired
private ServerProperties serverProperties;
@Autowired
@ -34,24 +33,24 @@ public class MongoLoginStartUp implements ApplicationRunner {
private IUserService userService;
@Override
public void run(ApplicationArguments args) throws Exception {
public void init() {
if (serverProperties.getMasterNode()) {
LOG.debug("master-node: {}" + serverProperties.getMasterNode());
LOG.debug("MASTER-NODE: {}" + serverProperties.getMasterNode());
CachedThreadPoolUtil.execute(() -> {
// 初始化所有账号内容
System.out.println("**************************");
System.out.println("** LoginUser Init Start **");
System.out.println("**************************");
System.out.println("***************************");
System.out.println("** LOGIN USER INIT START **");
System.out.println("***************************");
long startTime = System.currentTimeMillis();
Map<String, Object> params = new HashMap<>(0);
userService.listPO(params).forEach(userPO -> {
mongoLoginUserService.update(UserUtil.createLoginUser(userPO));
});
long endTime = System.currentTimeMillis();
System.out.println("**************************");
System.out.println("** LoginUser Init End **");
System.out.println("**************************");
LOG.debug("LoginUser init used time: {}ms", (endTime - startTime) / 1000L);
System.out.println("*************************");
System.out.println("** LOGIN USER INIT END **");
System.out.println("*************************");
LOG.debug("LOGIN USER INIT USED TIME: {}ms", (endTime - startTime) / 1000L);
});
}
}

28
mongo-menu/pom.xml Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>wg-basic</artifactId>
<groupId>ink.wgink</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mongo-menu</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ink.wgink</groupId>
<artifactId>service-menu</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,240 @@
package ink.wgink.mongo.menu.service.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.menu.IMongoMenuService;
import ink.wgink.module.menu.service.IMenuService;
import ink.wgink.pojo.dtos.menu.MenuDTO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @ClassName: MongoMenuServiceImpl
* @Description: mongo菜单为了提升首页菜单的加载速度
* @Author: wanggeng
* @Date: 2022/5/24 20:55
* @Version: 1.0
*/
@Service
public class MongoMenuServiceImpl extends DefaultBaseService implements IMongoMenuService {
private static final String COLLECTION_NAME = "systemMenu";
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private IMenuService menuService;
@Override
public void updateAllSystemMenu() {
// 清空集合
mongoTemplate.dropCollection(COLLECTION_NAME);
List<MenuDTO> systemMenus = menuService.listByParentId("0");
systemMenus.forEach(systemMenu -> {
List<MenuDTO> subSystemMenus = menuService.listAllByParentId(systemMenu.getMenuId());
systemMenu.setSubMenus(subSystemMenus);
mongoTemplate.save(systemMenu, COLLECTION_NAME);
});
}
@Override
public void delete(List<String> menuIds) {
menuIds = new ArrayList<>(menuIds);
List<MenuDTO> menuDTOS = mongoTemplate.findAll(MenuDTO.class, COLLECTION_NAME);
for (MenuDTO systemMenu : menuDTOS) {
IsFinished isFinished = new IsFinished();
removeMenu(systemMenu, menuIds, isFinished);
updateSystemMenu(systemMenu);
}
}
@Override
public void update(String menuId) {
MenuDTO menuDTO = menuService.get(menuId);
if (menuDTO == null) {
throw new SearchException("菜单更新失败,新增菜单不存在");
}
// 得到根节点菜单编码
String systemMenuCode = menuDTO.getMenuCode().substring(0, 4);
MenuDTO systemMenuDTO = getByCode(systemMenuCode);
if (systemMenuDTO == null) {
throw new SearchException("菜单更新失败,系统菜单不存在");
}
IsFinished isFinished = new IsFinished();
// 重新获取上级菜单带子集
MenuDTO parentMenuDTO = menuService.getAll(menuDTO.getMenuParentId());
if (parentMenuDTO == null) {
throw new SearchException("菜单更新失败,新增菜单上级菜单不存在");
}
// 递归找到要更新的节点
setUpdateMenu(systemMenuDTO, parentMenuDTO, isFinished);
updateSystemMenu(systemMenuDTO);
}
@Override
public MenuDTO get(String menuId) {
return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("menuId").is(menuId)), MenuDTO.class, COLLECTION_NAME);
}
@Override
public MenuDTO getByCode(String menuCode) {
return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("menuCode").is(menuCode)), MenuDTO.class, COLLECTION_NAME);
}
@Override
public List<MenuDTO> listSystemSubMenus(String systemMenuId) {
MenuDTO menuDTO = get(systemMenuId);
if (menuDTO == null) {
throw new SearchException("系统菜单不存在");
}
return menuDTO.getSubMenus();
}
@Override
public List<MenuDTO> listSystemSubMenus(String systemMenuId, List<String> selectedMenuIds) {
MenuDTO systemMenuDTO = get(systemMenuId);
if (systemMenuDTO == null) {
throw new SearchException("系统菜单不存在");
}
IsFinished isFinished = new IsFinished();
return listSelectedMenu(systemMenuDTO, selectedMenuIds, isFinished);
}
/**
* 递归获取选中的菜单列表
*
* @param menu
* @param selectedMenuIds
* @param isFinished
* @return
*/
private List<MenuDTO> listSelectedMenu(MenuDTO menu, List<String> selectedMenuIds, IsFinished isFinished) {
List<MenuDTO> selectedMenus = new ArrayList<>();
for (MenuDTO subMenu : menu.getSubMenus()) {
boolean isSelected = false;
for (int i = 0; i < selectedMenuIds.size(); i++) {
if (StringUtils.equals(subMenu.getMenuId(), selectedMenuIds.get(i))) {
isSelected = true;
i--;
break;
}
}
// 菜单被选中
if (isSelected) {
MenuDTO menuDTO = new MenuDTO();
BeanUtils.copyProperties(subMenu, menuDTO);
List<MenuDTO> subSelectedMenus = listSelectedMenu(subMenu, selectedMenuIds, isFinished);
menuDTO.setSubMenus(subSelectedMenus);
selectedMenus.add(subMenu);
}
if (selectedMenuIds.isEmpty()) {
isFinished.setFinished(true);
}
if (isFinished.getFinished()) {
return selectedMenus;
}
}
return selectedMenus;
}
/**
* 删除系统菜单
*
* @param menuIds
*/
public void deleteSystemMenu(List<String> menuIds) {
mongoTemplate.remove(new Query().addCriteria(Criteria.where("menuId").in(menuIds)), COLLECTION_NAME);
}
/**
* 移除菜单
*
* @param menuDTO
* @param removeMenuIds
* @param isFinished
*/
private void removeMenu(MenuDTO menuDTO, List<String> removeMenuIds, IsFinished isFinished) {
List<MenuDTO> subMenus = menuDTO.getSubMenus();
for (int i = 0; i < subMenus.size(); i++) {
MenuDTO subMenu = subMenus.get(i);
boolean isRemove = false;
for (int j = 0; j < removeMenuIds.size(); j++) {
if (StringUtils.equals(subMenu.getMenuId(), removeMenuIds.get(j))) {
// 存在
subMenus.remove(i);
removeMenuIds.remove(j);
j--;
isRemove = true;
break;
}
}
if (removeMenuIds.isEmpty()) {
isFinished.setFinished(true);
return;
}
if (isFinished.getFinished()) {
return;
}
if (!isRemove) {
removeMenu(subMenu, removeMenuIds, isFinished);
}
}
}
/**
* 更新系统菜单
*
* @param systemMenuDTO
*/
private void updateSystemMenu(MenuDTO systemMenuDTO) {
// 删除原有
deleteSystemMenu(Arrays.asList(systemMenuDTO.getMenuId()));
mongoTemplate.save(systemMenuDTO, COLLECTION_NAME);
}
/**
* 更新菜单
*
* @param parentMenu
* @param updateMenu
* @param isFinished
*/
private void setUpdateMenu(MenuDTO parentMenu, MenuDTO updateMenu, IsFinished isFinished) {
if (StringUtils.equals(parentMenu.getMenuId(), updateMenu.getMenuId())) {
BeanUtils.copyProperties(updateMenu, parentMenu);
isFinished.setFinished(true);
return;
}
List<MenuDTO> subMenus = parentMenu.getSubMenus();
for (MenuDTO subMenu : subMenus) {
setUpdateMenu(subMenu, updateMenu, isFinished);
if (isFinished.getFinished()) {
return;
}
}
}
/**
* 是否完成
*/
private class IsFinished {
private Boolean isFinished = false;
public Boolean getFinished() {
return isFinished;
}
public void setFinished(Boolean finished) {
isFinished = finished;
}
}
}

View File

@ -0,0 +1,49 @@
package ink.wgink.mongo.menu.service.init;
import ink.wgink.interfaces.init.IInitMongoData;
import ink.wgink.interfaces.menu.IMongoMenuService;
import ink.wgink.properties.ServerProperties;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @ClassName: InitMongoMenu
* @Description: 初始化mongo菜单
* @Author: wanggeng
* @Date: 2022/5/24 21:14
* @Version: 1.0
*/
@Component
public class InitMongoMenu implements IInitMongoData {
private static final Logger LOG = LoggerFactory.getLogger(InitMongoMenu.class);
@Autowired
private IMongoMenuService mongoMenuService;
@Autowired
private ServerProperties serverProperties;
@Override
public void init() {
if (serverProperties.getMasterNode()) {
LOG.debug("MASTER-NODE: {}" + serverProperties.getMasterNode());
CachedThreadPoolUtil.execute(() -> {
// 初始化所有账号内容
System.out.println("****************************");
System.out.println("** SYSTEM MENU INIT START **");
System.out.println("****************************");
long startTime = System.currentTimeMillis();
mongoMenuService.updateAllSystemMenu();
long endTime = System.currentTimeMillis();
System.out.println("***************************");
System.out.println("** SYSTEM MENU INIT END **");
System.out.println("***************************");
LOG.debug("SYSTEM MENU INIT USED TIME: {}ms", (endTime - startTime) / 1000L);
});
}
}
}

View File

@ -2,6 +2,7 @@ package ink.wgink.module.menu.service;
import ink.wgink.interfaces.menu.IMenuBaseService;
import ink.wgink.module.menu.pojo.vos.MenuVO;
import ink.wgink.pojo.dtos.menu.MenuDTO;
import java.util.List;
@ -80,4 +81,18 @@ public interface IMenuService extends IMenuBaseService {
*/
void remove(String token, List<String> ids);
/**
* 详情
*
* @param menuId
* @return
*/
MenuDTO get(String menuId);
/**
* 详情带子集
* @param menuId
* @return
*/
MenuDTO getAll(String menuId);
}

View File

@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.menu.IMongoMenuService;
import ink.wgink.module.menu.dao.IMenuDao;
import ink.wgink.module.menu.pojo.vos.MenuVO;
import ink.wgink.module.menu.service.IMenuService;
@ -34,6 +35,8 @@ public class MenuServiceImpl extends DefaultBaseService implements IMenuService
@Autowired
private IMenuDao menuDao;
@Autowired(required = false)
private IMongoMenuService mongoMenuService;
@Override
public String saveAndReturnIdByParentIdAndNameAndUrl(String menuParentId, String menuName, String menuUrl) {
@ -159,6 +162,9 @@ public class MenuServiceImpl extends DefaultBaseService implements IMenuService
setAppSaveInfo(token, params);
}
menuDao.save(params);
if (mongoMenuService != null) {
mongoMenuService.update(menuId);
}
return menuId;
}
@ -177,6 +183,30 @@ public class MenuServiceImpl extends DefaultBaseService implements IMenuService
setAppUpdateInfo(token, params);
}
menuDao.remove(params);
if (mongoMenuService != null) {
mongoMenuService.delete(ids);
}
}
@Override
public MenuDTO get(String menuId) {
Map<String, Object> params = getHashMap(2);
params.put("menuId", menuId);
return get(params);
}
@Override
public MenuDTO getAll(String menuId) {
MenuDTO menuDTO = get(menuId);
if (menuDTO == null) {
return null;
}
List<MenuDTO> menuDTOs = listAllByParentId(menuId);
menuDTO.setSubMenus(menuDTOs);
if (!menuDTOs.isEmpty()) {
menuDTO.setParent(true);
}
return menuDTO;
}
@Override
@ -194,6 +224,9 @@ public class MenuServiceImpl extends DefaultBaseService implements IMenuService
setAppUpdateInfo(token, params);
}
menuDao.update(params);
if (mongoMenuService != null) {
mongoMenuService.update(menuId);
}
}
@Override
@ -201,6 +234,22 @@ public class MenuServiceImpl extends DefaultBaseService implements IMenuService
return menuDao.listIdByUser(params);
}
@Override
public List<MenuDTO> listSystemMenu(String systemMenuId) {
if (mongoMenuService != null) {
return mongoMenuService.listSystemSubMenus(systemMenuId);
}
return listAllByParentId(systemMenuId);
}
@Override
public List<MenuDTO> listSystemMenu(String systemMenuId, List<String> selectedMenuIds) {
if (mongoMenuService != null) {
return mongoMenuService.listSystemSubMenus(systemMenuId, selectedMenuIds);
}
return listAllByParentIdAndIds(systemMenuId, selectedMenuIds);
}
/**
* 递归查询子菜单
*