1
0

menu.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import BaseController from '../../base';
  2. import { AdminRoute } from '../../../decorator/router_register';
  3. import * as _ from 'lodash';
  4. import { CreateMenuDto, InfoMenuDto, DeleteMenuDto, UpdateMenuDto } from '../../../dto/admin/sys/menu';
  5. export default class SysMenuController extends BaseController {
  6. /**
  7. * @api {get} /admin/sys/menu/list 获取所有菜单
  8. * @apiGroup 系统菜单
  9. * @apiUse Auth
  10. * @apiUse BaseRes
  11. */
  12. @AdminRoute('/sys/menu/list', 'get')
  13. async list() {
  14. this.res(
  15. {
  16. data: await this.service.admin.sys.menu.getMenus(this.ctx.token.uid),
  17. },
  18. );
  19. }
  20. /**
  21. * @api {post} /admin/sys/menu/add 增加菜单
  22. * @apiGroup 系统菜单
  23. * @apiUse Auth
  24. * @apiUse BaseRes
  25. * @apiParam {Number} type 菜单类别
  26. * @apiParam {Number} parentId 父级菜单,无则为-1
  27. * @apiParam {String} name 菜单名称
  28. * @apiParam {Number} orderNum 排序
  29. * @apiParam {String} router 路由地址
  30. * @apiParam {Boolean} isShow 是否显示
  31. * @apiParam {Boolean} keepalive 开启keepalive
  32. * @apiParam {String} icon 对应svg图标文件名称
  33. * @apiParam {String} perms 权限
  34. * @apiParam {String} viewPath vue文件路径
  35. */
  36. @AdminRoute('/sys/menu/add', 'post')
  37. async add() {
  38. const dto = await this.ctx.validate<CreateMenuDto>(CreateMenuDto);
  39. if (dto.type === 2 && dto.parentId === -1) {
  40. // 无法直接创建权限,必须有ParentId
  41. this.res({ code: 10005 });
  42. return;
  43. }
  44. if (dto.type === 1 && dto.parentId !== -1) {
  45. const parent = await this.service.admin.sys.menu.getMenuItemInfo(dto.parentId);
  46. if (!parent) {
  47. throw new Error('父节点菜单不存在!');
  48. }
  49. if (parent && parent.type === 1) {
  50. // 当前新增为菜单但父节点也为菜单时为非法操作
  51. this.res({
  52. code: 10006,
  53. });
  54. return;
  55. }
  56. }
  57. const insertData: any = { ...dto };
  58. if (dto.parentId === -1) {
  59. insertData.parentId = null;
  60. }
  61. const saveData = await this.service.admin.sys.menu.save(insertData);
  62. if (dto.type === 3) {
  63. // 如果是权限发生更改,则刷新所有在线用户的权限
  64. await this.service.admin.sys.menu.refreshOnlineUserPerms();
  65. }
  66. this.res({
  67. data: saveData,
  68. });
  69. }
  70. /**
  71. * @api {post} /admin/sys/menu/update 更新菜单
  72. * @apiGroup 系统菜单
  73. * @apiUse Auth
  74. * @apiUse BaseRes
  75. * @apiParam {Number} type 菜单类别
  76. * @apiParam {Number} parentId 父级菜单,无则为-1
  77. * @apiParam {String} name 菜单名称
  78. * @apiParam {Number} orderNum 排序
  79. * @apiParam {String} router 路由地址
  80. * @apiParam {Boolean} isShow 是否显示
  81. * @apiParam {Boolean} keepalive 开启keepalive
  82. * @apiParam {String} icon 对应svg图标文件名称
  83. * @apiParam {String} perms 权限
  84. * @apiParam {String} viewPath vue文件路径
  85. * @apiParam {Number} menuId 菜单编号
  86. */
  87. @AdminRoute('/sys/menu/update', 'post')
  88. async update() {
  89. const dto = await this.ctx.validate<UpdateMenuDto>(UpdateMenuDto);
  90. // if (dto.type === 2 && dto.parentId === -1) {
  91. // // 无法直接创建权限,必须有ParentId
  92. // this.res({ code: 10005 });
  93. // return;
  94. // }
  95. const originMenu = await this.service.admin.sys.menu.getMenuItemInfo(dto.menuId);
  96. if (originMenu && (originMenu.type !== dto.type)) {
  97. // 节点类型发生变化则直接返回
  98. this.res({
  99. code: 10007,
  100. });
  101. return;
  102. }
  103. // if (dto.type === 1 && dto.parentId !== -1) {
  104. // const parent = await this.service.admin.sys.menu.getMenuItemInfo(dto.parentId);
  105. // if (!parent) {
  106. // throw new Error('父节点菜单不存在!');
  107. // }
  108. // if (parent && parent.type === 1) {
  109. // // 当前新增为菜单但父节点也为菜单时为非法操作
  110. // this.res({
  111. // code: 10006,
  112. // });
  113. // return;
  114. // }
  115. // }
  116. const updateData: any = { ...dto };
  117. if (dto.parentId === -1) {
  118. updateData.parentId = null;
  119. }
  120. // update id
  121. updateData.id = dto.menuId;
  122. const saveData = await this.service.admin.sys.menu.save(updateData);
  123. // 如果是权限发生更改,则刷新所有在线用户权限
  124. await this.service.admin.sys.menu.refreshOnlineUserPerms();
  125. this.res({
  126. data: saveData,
  127. });
  128. }
  129. /**
  130. * @api {post} /admin/sys/menu/delete 删除菜单
  131. * @apiGroup 系统菜单
  132. * @apiUse Auth
  133. * @apiUse BaseRes
  134. * @apiParam {Number} menuId 菜单编号
  135. */
  136. @AdminRoute('/sys/menu/delete', 'post')
  137. async delete() {
  138. const dto = await this.ctx.validate<DeleteMenuDto>(DeleteMenuDto);
  139. // 如果有子目录,一并删除
  140. const childMenus = await this.service.admin.sys.menu.findChildMenus(dto.menuId);
  141. await this.service.admin.sys.menu.deleteMenuItem(_.flattenDeep([ dto.menuId, childMenus ]));
  142. await this.service.admin.sys.menu.refreshOnlineUserPerms();
  143. this.res({ data: dto.menuId });
  144. }
  145. /**
  146. * @api {get} /admin/sys/menu/info 获取菜单信息
  147. * @apiGroup 系统菜单
  148. * @apiUse Auth
  149. * @apiUse BaseRes
  150. * @apiParam {String} menuId 菜单编号
  151. */
  152. @AdminRoute('/sys/menu/info', 'get')
  153. async info() {
  154. const dto = await this.ctx.validate<InfoMenuDto>(InfoMenuDto, this.getQuery());
  155. const data = await this.service.admin.sys.menu.getMenuItemAndParentInfo(parseInt(dto.menuId));
  156. this.res({
  157. data,
  158. });
  159. }
  160. }