mirror of
https://gitee.com/youlaitech/youlai-mall.git
synced 2024-12-23 05:00:25 +08:00
feat(MenuController.java): 菜单重构以及整合Spring Cache Redis
This commit is contained in:
parent
766cd27740
commit
0fccad91e7
@ -3,6 +3,7 @@ package com.youlai.admin.pojo.vo;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -29,12 +30,12 @@ public class RouteVO {
|
||||
private Meta meta;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class Meta {
|
||||
public static class Meta {
|
||||
private String title;
|
||||
private String icon;
|
||||
private List<String> roles;
|
||||
}
|
||||
private List<RouteVO> children;
|
||||
|
||||
}
|
||||
|
@ -1,115 +1,101 @@
|
||||
package com.youlai.admin.controller;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.youlai.admin.pojo.entity.SysMenu;
|
||||
import com.youlai.admin.pojo.vo.MenuVO;
|
||||
import com.youlai.admin.pojo.vo.RouteVO;
|
||||
import com.youlai.admin.pojo.vo.TreeVO;
|
||||
import com.youlai.admin.service.ISysMenuService;
|
||||
import com.youlai.admin.service.ISysRoleMenuService;
|
||||
import com.youlai.common.enums.QueryModeEnum;
|
||||
import com.youlai.common.result.Result;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiImplicitParams;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author xianrui
|
||||
* 菜单控制器
|
||||
*
|
||||
* @author <a href="mailto:xianrui0365@163.com">xianrui</a>
|
||||
* @date 2020-11-06
|
||||
*/
|
||||
@Api(tags = "菜单接口")
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/menus")
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
@RequiredArgsConstructor
|
||||
public class MenuController {
|
||||
|
||||
private ISysMenuService iSysMenuService;
|
||||
private final ISysMenuService menuService;
|
||||
|
||||
@ApiOperation(value = "菜单列表")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "name", value = "菜单名称", paramType = "query", dataType = "String"),
|
||||
@ApiImplicitParam(name = "roleId", value = "角色ID", paramType = "query", dataType = "Long"),
|
||||
@ApiImplicitParam(name = "queryMode", value = "查询模式", paramType = "query", dataType = "QueryModeEnum")
|
||||
})
|
||||
@GetMapping
|
||||
public Result list(String queryMode, String name) {
|
||||
@ApiOperation(value = "菜单表格(Table)层级列表")
|
||||
@ApiImplicitParam(name = "name", value = "菜单名称", paramType = "query", dataType = "String")
|
||||
@GetMapping("/table")
|
||||
public Result getMenuTableList(String name) {
|
||||
List<MenuVO> menuList = menuService.listTable(name);
|
||||
return Result.success(menuList);
|
||||
}
|
||||
|
||||
QueryModeEnum queryModeEnum = QueryModeEnum.getByCode(queryMode);
|
||||
|
||||
LambdaQueryWrapper<SysMenu> baseQuery = new LambdaQueryWrapper<SysMenu>()
|
||||
.orderByAsc(SysMenu::getSort)
|
||||
.orderByDesc(SysMenu::getGmtModified)
|
||||
.orderByDesc(SysMenu::getGmtCreate);
|
||||
List list;
|
||||
switch (queryModeEnum) {
|
||||
case LIST:
|
||||
baseQuery = baseQuery.like(StrUtil.isNotBlank(name), SysMenu::getName, name);
|
||||
list = iSysMenuService.listMenuVO(baseQuery);
|
||||
break;
|
||||
case TREE:
|
||||
list = iSysMenuService.listTreeVO(baseQuery);
|
||||
break;
|
||||
default:
|
||||
list = iSysMenuService.list(baseQuery);
|
||||
break;
|
||||
}
|
||||
return Result.success(list);
|
||||
@ApiOperation(value = "菜单下拉(Select)层级列表")
|
||||
@GetMapping("/select")
|
||||
public Result getMenuSelectList() {
|
||||
List<TreeVO> menuList = menuService.listSelect();
|
||||
return Result.success(menuList);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "菜单路由(Route)层级列表")
|
||||
@GetMapping("/route")
|
||||
public Result getMenuRouteList() {
|
||||
List<RouteVO> menuList = menuService.listRoute();
|
||||
return Result.success(menuList);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "菜单详情")
|
||||
@ApiImplicitParam(name = "id", value = "菜单id", required = true, paramType = "path", dataType = "Long")
|
||||
@GetMapping("/{id}")
|
||||
public Result detail(@PathVariable Integer id) {
|
||||
SysMenu menu = iSysMenuService.getById(id);
|
||||
SysMenu menu = menuService.getById(id);
|
||||
return Result.success(menu);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "新增菜单")
|
||||
@ApiImplicitParam(name = "menu", value = "实体JSON对象", required = true, paramType = "body", dataType = "SysMenu")
|
||||
@PostMapping
|
||||
@CacheEvict(cacheNames = "admin",key = "'routeList'")
|
||||
public Result add(@RequestBody SysMenu menu) {
|
||||
boolean status = iSysMenuService.save(menu);
|
||||
boolean status = menuService.save(menu);
|
||||
return Result.judge(status);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改菜单")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "id", value = "菜单id", required = true, paramType = "path", dataType = "Long"),
|
||||
@ApiImplicitParam(name = "menu", value = "实体JSON对象", required = true, paramType = "body", dataType = "SysMenu")
|
||||
})
|
||||
@PutMapping(value = "/{id}")
|
||||
@CacheEvict(cacheNames = "admin",key = "'routeList'")
|
||||
public Result update(
|
||||
@PathVariable Integer id,
|
||||
@RequestBody SysMenu menu) {
|
||||
boolean status = iSysMenuService.updateById(menu);
|
||||
boolean status = menuService.updateById(menu);
|
||||
return Result.judge(status);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "删除菜单")
|
||||
@ApiImplicitParam(name = "ids", value = "id集合字符串,以,分割", required = true, paramType = "query", dataType = "String")
|
||||
@DeleteMapping("/{ids}")
|
||||
@CacheEvict(cacheNames = "admin",key = "'routeList'")
|
||||
public Result delete(@PathVariable("ids") String ids) {
|
||||
boolean status = iSysMenuService.removeByIds(Arrays.asList(ids.split(",")));
|
||||
boolean status = menuService.removeByIds(Arrays.asList(ids.split(",")));
|
||||
return Result.judge(status);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改菜单")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "path", dataType = "Long"),
|
||||
@ApiImplicitParam(name = "menu", value = "实体JSON对象", required = true, paramType = "body", dataType = "SysMenu")
|
||||
})
|
||||
@ApiOperation(value = "选择性修改菜单")
|
||||
@PatchMapping(value = "/{id}")
|
||||
@CacheEvict(cacheNames = "admin",key = "'routeList'")
|
||||
public Result patch(@PathVariable Integer id, @RequestBody SysMenu menu) {
|
||||
LambdaUpdateWrapper<SysMenu> updateWrapper = new LambdaUpdateWrapper<SysMenu>().eq(SysMenu::getId, id);
|
||||
updateWrapper.set(menu.getVisible() != null, SysMenu::getVisible, menu.getVisible());
|
||||
boolean result = iSysMenuService.update(updateWrapper);
|
||||
boolean result = menuService.update(updateWrapper);
|
||||
return Result.judge(result);
|
||||
}
|
||||
}
|
||||
|
@ -1,37 +0,0 @@
|
||||
package com.youlai.admin.controller;
|
||||
|
||||
import com.youlai.admin.pojo.vo.RouteVO;
|
||||
import com.youlai.admin.service.ISysMenuService;
|
||||
import com.youlai.common.result.Result;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author xianrui
|
||||
* @date 2021/6/1 22:40
|
||||
*/
|
||||
@Api(tags = "路由接口")
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/routes")
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
public class RouteController {
|
||||
|
||||
private ISysMenuService iSysMenuService;
|
||||
|
||||
@ApiOperation(value = "路由列表")
|
||||
@GetMapping
|
||||
public Result list() {
|
||||
List<RouteVO> list = iSysMenuService.listRoute();
|
||||
return Result.success(list);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.youlai.admin.service;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.youlai.admin.pojo.entity.SysMenu;
|
||||
import com.youlai.admin.pojo.vo.MenuVO;
|
||||
@ -9,15 +8,35 @@ import com.youlai.admin.pojo.vo.RouteVO;
|
||||
import com.youlai.admin.pojo.vo.TreeVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author haoxr
|
||||
* @date 2020-11-06
|
||||
*/
|
||||
public interface ISysMenuService extends IService<SysMenu> {
|
||||
|
||||
List<MenuVO> listMenuVO(LambdaQueryWrapper<SysMenu> baseQuery);
|
||||
|
||||
List<TreeVO> listTreeVO(LambdaQueryWrapper<SysMenu> baseQuery);
|
||||
/**
|
||||
* 菜单表格(Table)层级列表
|
||||
*
|
||||
* @param name 菜单名称
|
||||
* @return
|
||||
*/
|
||||
List<MenuVO> listTable(String name);
|
||||
|
||||
|
||||
/**
|
||||
* 菜单下拉(Select)层级列表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<TreeVO> listSelect();
|
||||
|
||||
|
||||
/**
|
||||
* 菜单路由(Route)层级列表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<RouteVO> listRoute();
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package com.youlai.admin.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.youlai.admin.common.constant.SystemConstants;
|
||||
@ -12,6 +13,7 @@ import com.youlai.admin.mapper.SysMenuMapper;
|
||||
import com.youlai.admin.pojo.vo.TreeVO;
|
||||
import com.youlai.admin.service.ISysMenuService;
|
||||
import com.youlai.common.constant.GlobalConstants;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -20,61 +22,80 @@ import java.util.Optional;
|
||||
|
||||
|
||||
/**
|
||||
* @author xianrui
|
||||
* 菜单业务类
|
||||
*
|
||||
* @author <a href="mailto:xianrui0365@163.com">xianrui</a>
|
||||
* @date 2020-11-06
|
||||
*/
|
||||
@Service
|
||||
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {
|
||||
|
||||
/**
|
||||
* 菜单表格(Table)层级列表
|
||||
*
|
||||
* @param name 菜单名称
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<MenuVO> listMenuVO(LambdaQueryWrapper<SysMenu> baseQuery) {
|
||||
List<SysMenu> menuList = this.baseMapper.selectList(baseQuery);
|
||||
List<MenuVO> list = recursionForTree(SystemConstants.ROOT_MENU_ID, menuList);
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TreeVO> listTreeVO(LambdaQueryWrapper<SysMenu> baseQuery) {
|
||||
List<SysMenu> menuList = this.list(baseQuery);
|
||||
List<TreeVO> list = recursionForTreeSelect(SystemConstants.ROOT_MENU_ID, menuList);
|
||||
return list;
|
||||
public List<MenuVO> listTable(String name) {
|
||||
List<SysMenu> menuList = this.list(
|
||||
new LambdaQueryWrapper<SysMenu>()
|
||||
.like(StrUtil.isNotBlank(name), SysMenu::getName, name)
|
||||
.orderByAsc(SysMenu::getSort)
|
||||
);
|
||||
List<MenuVO> tableList = recursionTableList(SystemConstants.ROOT_MENU_ID, menuList);
|
||||
return tableList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 递归生成表格数据
|
||||
* 递归生成菜单表格层级列表
|
||||
*
|
||||
* @param parentId
|
||||
* @param menuList
|
||||
* @param parentId 父级ID
|
||||
* @param menuList 菜单列表
|
||||
* @return
|
||||
*/
|
||||
public static List<MenuVO> recursionForTree(Long parentId, List<SysMenu> menuList) {
|
||||
List<MenuVO> list = new ArrayList<>();
|
||||
private static List<MenuVO> recursionTableList(Long parentId, List<SysMenu> menuList) {
|
||||
List<MenuVO> menuTableList = new ArrayList<>();
|
||||
Optional.ofNullable(menuList).orElse(new ArrayList<>())
|
||||
.stream()
|
||||
.filter(menu -> menu.getParentId().equals(parentId))
|
||||
.forEach(menu -> {
|
||||
MenuVO menuVO = new MenuVO();
|
||||
BeanUtil.copyProperties(menu, menuVO);
|
||||
List<MenuVO> children = recursionForTree(menu.getId(), menuList);
|
||||
List<MenuVO> children = recursionTableList(menu.getId(), menuList);
|
||||
|
||||
if (CollectionUtil.isNotEmpty(children)) {
|
||||
menuVO.setChildren(children);
|
||||
}
|
||||
list.add(menuVO);
|
||||
menuTableList.add(menuVO);
|
||||
});
|
||||
return list;
|
||||
return menuTableList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 递归生成部门树形下拉数据
|
||||
* 菜单下拉(Select)层级列表
|
||||
*
|
||||
* @param parentId
|
||||
* @param menuList
|
||||
* @return
|
||||
*/
|
||||
public static List<TreeVO> recursionForTreeSelect(Long parentId, List<SysMenu> menuList) {
|
||||
List<TreeVO> list = new ArrayList<>();
|
||||
@Override
|
||||
public List<TreeVO> listSelect() {
|
||||
List<SysMenu> menuList = this.list(new LambdaQueryWrapper<SysMenu>().orderByAsc(SysMenu::getSort));
|
||||
List<TreeVO> menuSelectList = recursionSelectList(SystemConstants.ROOT_MENU_ID, menuList);
|
||||
return menuSelectList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 递归生成菜单下拉层级列表
|
||||
*
|
||||
* @param parentId 父级ID
|
||||
* @param menuList 菜单列表
|
||||
* @return
|
||||
*/
|
||||
private static List<TreeVO> recursionSelectList(Long parentId, List<SysMenu> menuList) {
|
||||
List<TreeVO> menuSelectList = new ArrayList<>();
|
||||
Optional.ofNullable(menuList).orElse(new ArrayList<>())
|
||||
.stream()
|
||||
.filter(menu -> menu.getParentId().equals(parentId))
|
||||
@ -82,40 +103,52 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||
TreeVO treeVO = new TreeVO();
|
||||
treeVO.setId(menu.getId());
|
||||
treeVO.setLabel(menu.getName());
|
||||
List<TreeVO> children = recursionForTreeSelect(menu.getId(), menuList);
|
||||
List<TreeVO> children = recursionSelectList(menu.getId(), menuList);
|
||||
if (CollectionUtil.isNotEmpty(children)) {
|
||||
treeVO.setChildren(children);
|
||||
}
|
||||
list.add(treeVO);
|
||||
menuSelectList.add(treeVO);
|
||||
});
|
||||
return list;
|
||||
return menuSelectList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 菜单路由(Route)层级列表
|
||||
* <p>
|
||||
* 读多写少,缓存至Redis
|
||||
*
|
||||
* @return
|
||||
* @Cacheable cacheNames:缓存名称,不同缓存的数据是彼此隔离; key: 缓存Key。
|
||||
*/
|
||||
@Override
|
||||
@Cacheable(cacheNames = "admin", key = "'routeList'")
|
||||
public List<RouteVO> listRoute() {
|
||||
List<SysMenu> menuList = this.baseMapper.listRoute();
|
||||
List<RouteVO> list = recursionRoute(SystemConstants.ROOT_MENU_ID, menuList);
|
||||
return list;
|
||||
}
|
||||
|
||||
// 递归生成路由
|
||||
|
||||
/**
|
||||
* 递归生成菜单路由层级列表
|
||||
*
|
||||
* @param parentId 父级ID
|
||||
* @param menuList 菜单列表
|
||||
* @return
|
||||
*/
|
||||
private List<RouteVO> recursionRoute(Long parentId, List<SysMenu> menuList) {
|
||||
List<RouteVO> list = new ArrayList<>();
|
||||
Optional.ofNullable(menuList).ifPresent(menus -> menus.stream().filter(menu -> menu.getParentId().equals(parentId))
|
||||
.forEach(menu -> {
|
||||
RouteVO routeVO = new RouteVO();
|
||||
|
||||
routeVO.setName(menu.getId() + ""); // 根据name路由跳转 this.$router.push({path:xxx})
|
||||
routeVO.setPath(menu.getPath()); // 根据path路由跳转 this.$router.push({name:xxx})
|
||||
routeVO.setRedirect(menu.getRedirect());
|
||||
routeVO.setComponent(menu.getComponent());
|
||||
routeVO.setRedirect(menu.getRedirect());
|
||||
routeVO.setMeta(routeVO.new Meta(
|
||||
menu.getName(),
|
||||
menu.getIcon(),
|
||||
menu.getRoles()
|
||||
));
|
||||
RouteVO.Meta meta = new RouteVO.Meta(menu.getName(), menu.getIcon(), menu.getRoles());
|
||||
routeVO.setMeta(meta);
|
||||
// 菜单显示隐藏
|
||||
routeVO.setHidden(!GlobalConstants.STATUS_YES.equals(menu.getVisible()));
|
||||
List<RouteVO> children = recursionRoute(menu.getId(), menuList);
|
||||
|
Loading…
Reference in New Issue
Block a user