package com.oying.modules.system.rest; import cn.hutool.core.collection.CollectionUtil; import com.oying.modules.system.domain.Menu; import com.oying.modules.system.domain.dto.MenuQueryCriteria; import com.oying.modules.system.domain.dto.MenuVo; import com.oying.utils.R; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import com.oying.annotation.Log; import com.oying.exception.BadRequestException; import com.oying.modules.system.service.MenuService; import com.oying.utils.PageResult; import com.oying.utils.PageUtil; import com.oying.utils.SecurityUtils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.stream.Collectors; /** * @author Z * @date 2018-12-03 */ @RestController @RequiredArgsConstructor @Api(tags = "系统:菜单管理") @RequestMapping("/api/menus") public class MenuController { private final MenuService menuService; private static final String ENTITY_NAME = "menu"; @ApiOperation("导出菜单数据") @GetMapping(value = "/download") @PreAuthorize("@el.check('menu:list')") public void exportMenu(HttpServletResponse response, MenuQueryCriteria criteria) throws Exception { menuService.download(menuService.queryAll(criteria, false), response); } @GetMapping(value = "/build") @ApiOperation("获取前端所需菜单") public ResponseEntity buildMenus() { List menuList = menuService.findByUser(SecurityUtils.getCurrentUserId()); List menus = menuService.buildTree(menuList); return new ResponseEntity<>(R.success(menuService.buildMenus(menus)), HttpStatus.OK); } @ApiOperation("返回全部的菜单") @GetMapping(value = "/lazy") @PreAuthorize("@el.check('menu:list','roles:list')") public ResponseEntity queryAllMenu(@RequestParam Long pid) { return new ResponseEntity<>(R.success(menuService.getMenus(pid)), HttpStatus.OK); } @ApiOperation("根据菜单ID返回所有子节点ID,包含自身ID") @GetMapping(value = "/child") @PreAuthorize("@el.check('menu:list','roles:list')") public ResponseEntity childMenu(@RequestParam Long id) { Set menuSet = new HashSet<>(); List menuList = menuService.getMenus(id); menuSet.add(menuService.getById(id)); menuSet = menuService.getChildMenus(menuList, menuSet); Set ids = menuSet.stream().map(Menu::getId).collect(Collectors.toSet()); return new ResponseEntity<>(R.success(ids), HttpStatus.OK); } @GetMapping @ApiOperation("查询菜单") @PreAuthorize("@el.check('menu:list')") public ResponseEntity queryMenu(MenuQueryCriteria criteria) throws Exception { List menuList = menuService.queryAll(criteria, true); return new ResponseEntity<>(R.success(PageUtil.toPage(menuList)), HttpStatus.OK); } @ApiOperation("查询菜单:根据ID获取同级与上级数据") @PostMapping("/superior") @PreAuthorize("@el.check('menu:list')") public ResponseEntity getMenuSuperior(@RequestBody List ids) { Set menus = new LinkedHashSet<>(); if (CollectionUtil.isNotEmpty(ids)) { for (Long id : ids) { Menu menu = menuService.findById(id); List menuList = menuService.getSuperior(menu, new ArrayList<>()); for (Menu data : menuList) { if (data.getId().equals(menu.getPid())) { data.setSubCount(data.getSubCount() - 1); } } menus.addAll(menuList); } // 编辑菜单时不显示自己以及自己下级的数据,避免出现PID数据环形问题 menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); return new ResponseEntity<>(R.success(menuService.buildTree(new ArrayList<>(menus))), HttpStatus.OK); } return new ResponseEntity<>(R.success(menuService.getMenus(null)), HttpStatus.OK); } @Log("新增菜单") @ApiOperation("新增菜单") @PostMapping @PreAuthorize("@el.check('menu:add')") public ResponseEntity createMenu(@Validated @RequestBody Menu resources) { if (resources.getId() != null) { throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID"); } menuService.create(resources); return new ResponseEntity<>(R.success(), HttpStatus.CREATED); } @Log("修改菜单") @ApiOperation("修改菜单") @PutMapping @PreAuthorize("@el.check('menu:edit')") public ResponseEntity updateMenu(@Validated(Menu.Update.class) @RequestBody Menu resources) { menuService.update(resources); return new ResponseEntity<>(R.success(), HttpStatus.NO_CONTENT); } @Log("删除菜单") @ApiOperation("删除菜单") @DeleteMapping @PreAuthorize("@el.check('menu:del')") public ResponseEntity deleteMenu(@RequestBody Set ids) { Set menuSet = new HashSet<>(); for (Long id : ids) { List menuList = menuService.getMenus(id); menuSet.add(menuService.getById(id)); menuSet = menuService.getChildMenus(menuList, menuSet); } menuService.delete(menuSet); return new ResponseEntity<>(R.success(), HttpStatus.OK); } }