130 lines
4.8 KiB
Java
130 lines
4.8 KiB
Java
package com.upchina.rbac.service;
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import com.upchina.common.handler.BizException;
|
|
import com.upchina.common.query.OnlyIdQuery;
|
|
import com.upchina.common.result.ResponseStatus;
|
|
import com.upchina.common.vo.BackendUserVO;
|
|
import com.upchina.rbac.entity.Menu;
|
|
import com.upchina.rbac.entity.Permission;
|
|
import com.upchina.rbac.mapper.MenuMapper;
|
|
import com.upchina.rbac.mapper.PermissionMapper;
|
|
import com.upchina.rbac.query.ListMenuQuery;
|
|
import com.upchina.rbac.query.SaveMenuQuery;
|
|
import com.upchina.rbac.query.UpdateMenuQuery;
|
|
import com.upchina.rbac.vo.MenuVO;
|
|
import com.upchina.rbac.vo.PermissionVO;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import javax.annotation.Resource;
|
|
import java.util.Collections;
|
|
import java.util.Comparator;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.stream.Collectors;
|
|
|
|
@Service
|
|
public class MenuService {
|
|
|
|
@Resource
|
|
private MenuMapper menuMapper;
|
|
|
|
@Resource
|
|
private PermissionMapper permissionMapper;
|
|
|
|
@Transactional(readOnly = true)
|
|
public List<MenuVO> list(ListMenuQuery query, Integer userId, boolean buildTree) {
|
|
String keyword = query.getKeyword();
|
|
Integer roleId = query.getRoleId();
|
|
List<Menu> searchList;
|
|
List<MenuVO> searchVoList;
|
|
List<MenuVO> allVoList;
|
|
QueryWrapper<Menu> wrapper = Wrappers.query();
|
|
wrapper.orderByAsc("sort");
|
|
boolean isAll = false;
|
|
if (StringUtils.isNotEmpty(keyword)) {
|
|
wrapper.like("name", keyword).or().like("path", keyword);
|
|
searchList = menuMapper.selectList(wrapper);
|
|
} else if (userId != null) {
|
|
searchList = menuMapper.selectListByUserId(userId);
|
|
} else if (roleId != null) {
|
|
searchList = menuMapper.selectListByRoleId(roleId);
|
|
} else {
|
|
searchList = menuMapper.selectList(wrapper);
|
|
isAll = true;
|
|
}
|
|
searchVoList = searchList.stream().map(MenuVO::new).collect(Collectors.toList());
|
|
if (!buildTree) {
|
|
return searchVoList;
|
|
}
|
|
if (isAll) {
|
|
allVoList = searchVoList;
|
|
} else {
|
|
QueryWrapper allWrapper = Wrappers.query().orderByAsc("pid");
|
|
List<Menu> allList = menuMapper.selectList(allWrapper);
|
|
allVoList = allList.stream().map(MenuVO::new).collect(Collectors.toList());
|
|
}
|
|
|
|
// 填充权限
|
|
List<Permission> allPermissionList = permissionMapper.selectList(Wrappers.emptyWrapper());
|
|
Map<Integer, List<PermissionVO>> menuPermissionListMap = allPermissionList.stream().map(PermissionVO::new).collect(Collectors.groupingBy(PermissionVO::getMenuId));
|
|
allVoList.forEach(menuVO -> menuVO.setPermissions(menuPermissionListMap.get(menuVO.getId())));
|
|
|
|
List<MenuVO> rootList = Collections.emptyList();
|
|
if (!allVoList.isEmpty()) {
|
|
rootList = (List<MenuVO>) new MenuVO().buildTree(searchVoList, allVoList);
|
|
}
|
|
|
|
rootList.sort(Comparator.comparing(MenuVO::getSort));
|
|
if (userId != null) {
|
|
convertMenu(rootList);
|
|
}
|
|
return rootList;
|
|
}
|
|
|
|
@Transactional
|
|
public void save(SaveMenuQuery query, BackendUserVO backendUserVO) {
|
|
Menu menu = query.toPO();
|
|
menuMapper.insert(menu);
|
|
}
|
|
|
|
@Transactional
|
|
public void update(UpdateMenuQuery query, BackendUserVO backendUserVO) {
|
|
Menu menu = query.toPO();
|
|
int rows = menuMapper.updateById(menu);
|
|
if (rows == 0) throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
|
|
}
|
|
|
|
@Transactional
|
|
public void delete(OnlyIdQuery query, BackendUserVO backendUserVO) {
|
|
Integer id = query.getId();
|
|
Menu menu = menuMapper.selectById(id);
|
|
if (menu == null) {
|
|
throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
|
|
}
|
|
QueryWrapper<Menu> wrapper = Wrappers.query();
|
|
wrapper.eq("pid", id);
|
|
Long count = menuMapper.selectCount(wrapper);
|
|
if (count > 0) {
|
|
throw new BizException(ResponseStatus.CHILD_EXIST_ERROR);
|
|
}
|
|
menuMapper.deleteById(query.getId());
|
|
}
|
|
|
|
private void convertMenu(List<MenuVO> list) {
|
|
list.forEach(vo -> {
|
|
if (vo.getPid() == null || vo.getPid() <= 0) {
|
|
vo.setPath("/" + vo.getPath());
|
|
vo.setComponent(StringUtils.isEmpty(vo.getComponent()) ? "Layout" : vo.getComponent());
|
|
}
|
|
if (vo.getChildren() != null && !vo.getChildren().isEmpty()) {
|
|
vo.setRedirect("noredirect");
|
|
convertMenu(vo.getChildren());
|
|
}
|
|
});
|
|
}
|
|
}
|