MenuController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. /**
  2. * BladeX Commercial License Agreement
  3. * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
  4. * <p>
  5. * Use of this software is governed by the Commercial License Agreement
  6. * obtained after purchasing a license from BladeX.
  7. * <p>
  8. * 1. This software is for development use only under a valid license
  9. * from BladeX.
  10. * <p>
  11. * 2. Redistribution of this software's source code to any third party
  12. * without a commercial license is strictly prohibited.
  13. * <p>
  14. * 3. Licensees may copyright their own code but cannot use segments
  15. * from this software for such purposes. Copyright of this software
  16. * remains with BladeX.
  17. * <p>
  18. * Using this software signifies agreement to this License, and the software
  19. * must not be used for illegal purposes.
  20. * <p>
  21. * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
  22. * not liable for any claims arising from secondary or illegal development.
  23. * <p>
  24. * Author: Chill Zhuang (bladejava@qq.com)
  25. */
  26. package org.springblade.modules.system.controller;
  27. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  28. import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
  29. import io.swagger.v3.oas.annotations.Operation;
  30. import io.swagger.v3.oas.annotations.Parameter;
  31. import io.swagger.v3.oas.annotations.Parameters;
  32. import io.swagger.v3.oas.annotations.enums.ParameterIn;
  33. import io.swagger.v3.oas.annotations.media.Schema;
  34. import io.swagger.v3.oas.annotations.tags.Tag;
  35. import jakarta.validation.Valid;
  36. import lombok.AllArgsConstructor;
  37. import org.springblade.core.boot.ctrl.BladeController;
  38. import org.springblade.core.cache.utils.CacheUtil;
  39. import org.springblade.core.launch.constant.AppConstant;
  40. import org.springblade.core.mp.support.Condition;
  41. import org.springblade.core.secure.BladeUser;
  42. import org.springblade.core.secure.annotation.PreAuth;
  43. import org.springblade.core.tenant.annotation.NonDS;
  44. import org.springblade.core.tool.api.R;
  45. import org.springblade.core.tool.constant.RoleConstant;
  46. import org.springblade.core.tool.node.TreeNode;
  47. import org.springblade.core.tool.support.Kv;
  48. import org.springblade.core.tool.utils.Func;
  49. import org.springblade.modules.system.pojo.entity.Menu;
  50. import org.springblade.modules.system.pojo.entity.TopMenu;
  51. import org.springblade.modules.system.service.IMenuService;
  52. import org.springblade.modules.system.service.ITopMenuService;
  53. import org.springblade.modules.system.pojo.vo.CheckedTreeVO;
  54. import org.springblade.modules.system.pojo.vo.GrantTreeVO;
  55. import org.springblade.modules.system.pojo.vo.MenuVO;
  56. import org.springblade.modules.system.wrapper.MenuWrapper;
  57. import org.springframework.web.bind.annotation.*;
  58. import java.util.List;
  59. import java.util.Map;
  60. import static org.springblade.core.cache.constant.CacheConstant.MENU_CACHE;
  61. /**
  62. * 控制器
  63. *
  64. * @author Chill
  65. */
  66. @NonDS
  67. @RestController
  68. @AllArgsConstructor
  69. @RequestMapping(AppConstant.APPLICATION_SYSTEM_NAME + "/menu")
  70. @Tag(name = "菜单", description = "菜单")
  71. public class MenuController extends BladeController {
  72. private final IMenuService menuService;
  73. private final ITopMenuService topMenuService;
  74. /**
  75. * 详情
  76. */
  77. @GetMapping("/detail")
  78. @ApiOperationSupport(order = 1)
  79. @Operation(summary = "详情", description = "传入menu")
  80. public R<MenuVO> detail(Menu menu) {
  81. Menu detail = menuService.getOne(Condition.getQueryWrapper(menu));
  82. return R.data(MenuWrapper.build().entityVO(detail));
  83. }
  84. /**
  85. * 列表
  86. */
  87. @GetMapping("/list")
  88. @Parameters({
  89. @Parameter(name = "code", description = "菜单编号", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
  90. @Parameter(name = "name", description = "菜单名称", in = ParameterIn.QUERY, schema = @Schema(type = "string"))
  91. })
  92. @ApiOperationSupport(order = 2)
  93. @Operation(summary = "列表", description = "传入menu")
  94. public R<List<MenuVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> menu) {
  95. List<Menu> list = menuService.list(Condition.getQueryWrapper(menu, Menu.class).lambda().orderByAsc(Menu::getSort));
  96. return R.data(MenuWrapper.build().listNodeVO(list));
  97. }
  98. /**
  99. * 懒加载列表
  100. */
  101. @GetMapping("/lazy-list")
  102. @Parameters({
  103. @Parameter(name = "code", description = "菜单编号", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
  104. @Parameter(name = "name", description = "菜单名称", in = ParameterIn.QUERY, schema = @Schema(type = "string"))
  105. })
  106. @ApiOperationSupport(order = 3)
  107. @Operation(summary = "懒加载列表", description = "传入menu")
  108. public R<List<MenuVO>> lazyList(Long parentId, @Parameter(hidden = true) @RequestParam Map<String, Object> menu,BladeUser bladeUser) {
  109. menu.put("clientId",bladeUser.getClientId());
  110. List<MenuVO> list = menuService.lazyList(parentId, menu);
  111. return R.data(MenuWrapper.build().listNodeLazyVO(list));
  112. }
  113. /**
  114. * 菜单列表
  115. */
  116. @GetMapping("/menu-list")
  117. @Parameters({
  118. @Parameter(name = "code", description = "菜单编号", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
  119. @Parameter(name = "name", description = "菜单名称", in = ParameterIn.QUERY, schema = @Schema(type = "string"))
  120. })
  121. @ApiOperationSupport(order = 4)
  122. @Operation(summary = "菜单列表", description = "传入menu")
  123. public R<List<MenuVO>> menuList(@Parameter(hidden = true) @RequestParam Map<String, Object> menu) {
  124. List<Menu> list = menuService.list(Condition.getQueryWrapper(menu, Menu.class).lambda().eq(Menu::getCategory, 1).orderByAsc(Menu::getSort));
  125. return R.data(MenuWrapper.build().listNodeVO(list));
  126. }
  127. /**
  128. * 懒加载菜单列表
  129. */
  130. @GetMapping("/lazy-menu-list")
  131. @Parameters({
  132. @Parameter(name = "code", description = "菜单编号", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
  133. @Parameter(name = "name", description = "菜单名称", in = ParameterIn.QUERY, schema = @Schema(type = "string"))
  134. })
  135. @PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
  136. @ApiOperationSupport(order = 5)
  137. @Operation(summary = "懒加载菜单列表", description = "传入menu")
  138. public R<List<MenuVO>> lazyMenuList(Long parentId, @Parameter(hidden = true) @RequestParam Map<String, Object> menu) {
  139. List<MenuVO> list = menuService.lazyMenuList(parentId, menu);
  140. return R.data(MenuWrapper.build().listNodeLazyVO(list));
  141. }
  142. /**
  143. * 新增或修改
  144. */
  145. @PostMapping("/submit")
  146. @ApiOperationSupport(order = 6)
  147. @Operation(summary = "新增或修改", description = "传入menu")
  148. public R submit(@Valid @RequestBody Menu menu,BladeUser bladeUser) {
  149. if(Func.isNull(bladeUser.getClientId()) && Func.isEmpty(bladeUser.getClientId())){
  150. bladeUser.setClientId("saber3");
  151. }else{
  152. menu.setSysType(bladeUser.getClientId());
  153. }
  154. if (menuService.submit(menu)) {
  155. CacheUtil.clear(MENU_CACHE);
  156. CacheUtil.clear(MENU_CACHE, Boolean.FALSE);
  157. // 返回懒加载树更新节点所需字段
  158. Kv kv = Kv.create().set("id", String.valueOf(menu.getId()));
  159. return R.data(kv);
  160. }
  161. return R.fail("操作失败");
  162. }
  163. /**
  164. * 删除
  165. */
  166. @PostMapping("/remove")
  167. @ApiOperationSupport(order = 7)
  168. @Operation(summary = "删除", description = "传入ids")
  169. public R remove(@Parameter(name = "主键集合", required = true) @RequestParam String ids) {
  170. CacheUtil.clear(MENU_CACHE);
  171. CacheUtil.clear(MENU_CACHE, Boolean.FALSE);
  172. return R.status(menuService.removeMenu(ids));
  173. }
  174. /**
  175. * 前端菜单数据
  176. */
  177. @GetMapping("/routes")
  178. @ApiOperationSupport(order = 8)
  179. @Operation(summary = "前端菜单数据", description = "前端菜单数据")
  180. public R<List<MenuVO>> routes(BladeUser user, Long topMenuId) {
  181. List<MenuVO> list = menuService.routes((user == null) ? null : user.getRoleId(), topMenuId,user.getClientId());
  182. return R.data(list);
  183. }
  184. /**
  185. * 前端菜单数据
  186. */
  187. @GetMapping("/routes-ext")
  188. @ApiOperationSupport(order = 9)
  189. @Operation(summary = "前端菜单数据", description = "前端菜单数据")
  190. public R<List<MenuVO>> routesExt(BladeUser user, Long topMenuId) {
  191. List<MenuVO> list = menuService.routesExt(user.getRoleId(), topMenuId);
  192. return R.data(list);
  193. }
  194. /**
  195. * 前端按钮数据
  196. */
  197. @GetMapping("/buttons")
  198. @ApiOperationSupport(order = 10)
  199. @Operation(summary = "前端按钮数据", description = "前端按钮数据")
  200. public R<List<MenuVO>> buttons(BladeUser user) {
  201. List<MenuVO> list = menuService.buttons(user.getRoleId(),user.getClientId());
  202. return R.data(list);
  203. }
  204. /**
  205. * 获取菜单树形结构
  206. */
  207. @GetMapping("/tree")
  208. @ApiOperationSupport(order = 11)
  209. @Operation(summary = "树形结构", description = "树形结构")
  210. public R<List<TreeNode>> tree(BladeUser bladeUser) {
  211. List<TreeNode> tree = menuService.tree(bladeUser.getClientId());
  212. return R.data(tree);
  213. }
  214. /**
  215. * 获取权限分配树形结构
  216. */
  217. @GetMapping("/grant-tree")
  218. @ApiOperationSupport(order = 12)
  219. @Operation(summary = "权限分配树形结构", description = "权限分配树形结构")
  220. public R<GrantTreeVO> grantTree(BladeUser user) {
  221. GrantTreeVO vo = new GrantTreeVO();
  222. vo.setMenu(menuService.grantTree(user));
  223. vo.setDataScope(menuService.grantDataScopeTree(user));
  224. vo.setApiScope(menuService.grantApiScopeTree(user));
  225. return R.data(vo);
  226. }
  227. /**
  228. * 获取权限分配树形结构
  229. */
  230. @GetMapping("/role-tree-keys")
  231. @ApiOperationSupport(order = 13)
  232. @Operation(summary = "角色所分配的树", description = "角色所分配的树")
  233. public R<CheckedTreeVO> roleTreeKeys(String roleIds) {
  234. CheckedTreeVO vo = new CheckedTreeVO();
  235. vo.setMenu(menuService.roleTreeKeys(roleIds));
  236. vo.setDataScope(menuService.dataScopeTreeKeys(roleIds));
  237. vo.setApiScope(menuService.apiScopeTreeKeys(roleIds));
  238. return R.data(vo);
  239. }
  240. /**
  241. * 获取顶部菜单树形结构
  242. */
  243. @GetMapping("/grant-top-tree")
  244. @ApiOperationSupport(order = 14)
  245. @Operation(summary = "顶部菜单树形结构", description = "顶部菜单树形结构")
  246. public R<GrantTreeVO> grantTopTree(BladeUser user) {
  247. GrantTreeVO vo = new GrantTreeVO();
  248. vo.setMenu(menuService.grantTopTree(user));
  249. return R.data(vo);
  250. }
  251. /**
  252. * 获取顶部菜单树形结构
  253. */
  254. @GetMapping("/top-tree-keys")
  255. @ApiOperationSupport(order = 15)
  256. @Operation(summary = "顶部菜单所分配的树", description = "顶部菜单所分配的树")
  257. public R<CheckedTreeVO> topTreeKeys(String topMenuIds) {
  258. CheckedTreeVO vo = new CheckedTreeVO();
  259. vo.setMenu(menuService.topTreeKeys(topMenuIds));
  260. return R.data(vo);
  261. }
  262. /**
  263. * 顶部菜单数据
  264. */
  265. @GetMapping("/top-menu")
  266. @ApiOperationSupport(order = 16)
  267. @Operation(summary = "顶部菜单数据", description = "顶部菜单数据")
  268. public R<List<TopMenu>> topMenu(BladeUser user) {
  269. if (Func.isEmpty(user)) {
  270. return null;
  271. }
  272. List<TopMenu> list = topMenuService.list(Wrappers.<TopMenu>query().lambda().orderByAsc(TopMenu::getSort));
  273. return R.data(list);
  274. }
  275. /**
  276. * 获取配置的角色权限
  277. */
  278. @GetMapping("auth-routes")
  279. @ApiOperationSupport(order = 17)
  280. @Operation(summary = "菜单的角色权限")
  281. public R<List<Kv>> authRoutes(BladeUser user) {
  282. if (Func.isEmpty(user)) {
  283. return null;
  284. }
  285. return R.data(menuService.authRoutes(user));
  286. }
  287. }