package cc.mrbird.febs.system.service.impl; import cc.mrbird.febs.common.authentication.ShiroRealm; import cc.mrbird.febs.common.entity.MenuTree; import cc.mrbird.febs.common.utils.TreeUtil; import cc.mrbird.febs.system.entity.Menu; import cc.mrbird.febs.system.mapper.MenuMapper; import cc.mrbird.febs.system.service.IMenuService; import cc.mrbird.febs.system.service.IRoleMenuService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; /** * @author MrBird */ @Service @RequiredArgsConstructor @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class MenuServiceImpl extends ServiceImpl implements IMenuService { private final IRoleMenuService roleMenuService; private final ShiroRealm shiroRealm; @Override public List findUserPermissions(String username) { return this.baseMapper.findUserPermissions(username); } @Override public MenuTree findUserMenus(String username) { List menus = this.baseMapper.findUserMenus(username); List> trees = this.convertMenus(menus); return TreeUtil.buildMenuTree(trees); } @Override public MenuTree findMenus(Menu menu) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(menu.getMenuName())) { queryWrapper.lambda().like(Menu::getMenuName, menu.getMenuName()); } queryWrapper.lambda().orderByAsc(Menu::getOrderNum); List menus = this.baseMapper.selectList(queryWrapper); List> trees = this.convertMenus(menus); return TreeUtil.buildMenuTree(trees); } @Override public List findMenuList(Menu menu) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(menu.getMenuName())) { queryWrapper.lambda().like(Menu::getMenuName, menu.getMenuName()); } queryWrapper.lambda().orderByAsc(Menu::getMenuId); return this.baseMapper.selectList(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public void createMenu(Menu menu) { menu.setCreateTime(new Date()); this.setMenu(menu); this.baseMapper.insert(menu); } @Override @Transactional(rollbackFor = Exception.class) public void updateMenu(Menu menu) { menu.setModifyTime(new Date()); this.setMenu(menu); this.baseMapper.updateById(menu); shiroRealm.clearCache(); } @Override @Transactional(rollbackFor = Exception.class) public void deleteMenus(String menuIds) { String[] menuIdsArray = menuIds.split(StringPool.COMMA); this.delete(Arrays.asList(menuIdsArray)); shiroRealm.clearCache(); } private List> convertMenus(List menus) { List> trees = new ArrayList<>(); menus.forEach(menu -> { MenuTree tree = new MenuTree<>(); tree.setId(String.valueOf(menu.getMenuId())); tree.setParentId(String.valueOf(menu.getParentId())); tree.setTitle(menu.getMenuName()); tree.setIcon(menu.getIcon()); tree.setHref(menu.getUrl()); tree.setData(menu); trees.add(tree); }); return trees; } private void setMenu(Menu menu) { if (menu.getParentId() == null) { menu.setParentId(Menu.TOP_NODE); } if (Menu.TYPE_BUTTON.equals(menu.getType())) { menu.setUrl(null); menu.setIcon(null); } } private void delete(List menuIds) { List list = new ArrayList<>(menuIds); removeByIds(menuIds); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Menu::getParentId, menuIds); List menus = baseMapper.selectList(queryWrapper); if (CollectionUtils.isNotEmpty(menus)) { List menuIdList = new ArrayList<>(); menus.forEach(m -> menuIdList.add(String.valueOf(m.getMenuId()))); list.addAll(menuIdList); this.roleMenuService.deleteRoleMenusByMenuId(list); this.delete(menuIdList); } else { this.roleMenuService.deleteRoleMenusByMenuId(list); } } }