111 lines
3.9 KiB
Java
111 lines
3.9 KiB
Java
/**
|
|
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
|
* <p>
|
|
* 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
|
|
* <p>
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
* <p>
|
|
* 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 org.springblade.system.service.impl;
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import lombok.AllArgsConstructor;
|
|
import org.springblade.core.secure.BladeUser;
|
|
import org.springblade.core.tool.node.ForestNodeMerger;
|
|
import org.springblade.core.tool.support.Kv;
|
|
import org.springblade.core.tool.utils.Func;
|
|
import org.springblade.system.dto.MenuDTO;
|
|
import org.springblade.system.entity.Menu;
|
|
import org.springblade.system.entity.RoleMenu;
|
|
import org.springblade.system.mapper.MenuMapper;
|
|
import org.springblade.system.service.IMenuService;
|
|
import org.springblade.system.service.IRoleMenuService;
|
|
import org.springblade.system.vo.MenuVO;
|
|
import org.springblade.system.wrapper.MenuWrapper;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
|
|
/**
|
|
* 服务实现类
|
|
*
|
|
* @author Chill
|
|
* @since 2018-12-24
|
|
*/
|
|
@Service
|
|
@AllArgsConstructor
|
|
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
|
|
|
|
IRoleMenuService roleMenuService;
|
|
|
|
@Override
|
|
public IPage<MenuVO> selectMenuPage(IPage<MenuVO> page, MenuVO menu) {
|
|
return page.setRecords(baseMapper.selectMenuPage(page, menu));
|
|
}
|
|
|
|
@Override
|
|
public List<MenuVO> routes(String roleId) {
|
|
List<Menu> allMenus = baseMapper.allMenu();
|
|
List<Menu> roleMenus = baseMapper.roleMenu(Func.toIntList(roleId));
|
|
List<Menu> routes = new LinkedList<>(roleMenus);
|
|
roleMenus.forEach(roleMenu -> recursion(allMenus, routes, roleMenu));
|
|
routes.sort(Comparator.comparing(Menu::getSort));
|
|
MenuWrapper menuWrapper = new MenuWrapper();
|
|
List<Menu> collect = routes.stream().filter(x -> Func.equals(x.getCategory(), 1)).collect(Collectors.toList());
|
|
return menuWrapper.listNodeVO(collect);
|
|
}
|
|
|
|
public void recursion(List<Menu> allMenus, List<Menu> routes, Menu roleMenu) {
|
|
Optional<Menu> menu = allMenus.stream().filter(x -> Func.equals(x.getId(), roleMenu.getParentId())).findFirst();
|
|
if (menu.isPresent() && !routes.contains(menu.get())) {
|
|
routes.add(menu.get());
|
|
recursion(allMenus, routes, menu.get());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public List<MenuVO> buttons(String roleId) {
|
|
List<Menu> buttons = baseMapper.buttons(Func.toIntList(roleId));
|
|
MenuWrapper menuWrapper = new MenuWrapper();
|
|
return menuWrapper.listNodeVO(buttons);
|
|
}
|
|
|
|
@Override
|
|
public List<MenuVO> tree() {
|
|
return ForestNodeMerger.merge(baseMapper.tree());
|
|
}
|
|
|
|
@Override
|
|
public List<MenuVO> grantTree() {
|
|
return ForestNodeMerger.merge(baseMapper.grantTree());
|
|
}
|
|
|
|
@Override
|
|
public List<String> roleTreeKeys(String roleIds) {
|
|
List<RoleMenu> roleMenus = roleMenuService.list(Wrappers.<RoleMenu>query().lambda().in(RoleMenu::getRoleId, Func.toIntList(roleIds)));
|
|
return roleMenus.stream().map(roleMenu -> Func.toStr(roleMenu.getMenuId())).collect(Collectors.toList());
|
|
}
|
|
|
|
@Override
|
|
public List<Kv> authRoutes(BladeUser user) {
|
|
if (Func.isEmpty(user)) {
|
|
return null;
|
|
}
|
|
List<MenuDTO> routes = baseMapper.authRoutes(Func.toIntList(user.getRoleId()));
|
|
List<Kv> list = new ArrayList<>();
|
|
routes.forEach(route -> list.add(Kv.init().set(route.getPath(), Kv.init().set("authority", Func.toStrArray(route.getAlias())))));
|
|
return list;
|
|
}
|
|
|
|
}
|