role.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import BaseService from '../../base';
  2. import * as _ from 'lodash';
  3. import { In, Not } from 'typeorm';
  4. import { CreateRoleDto, UpdateRoleDto } from '../../../dto/admin/sys/role';
  5. /**
  6. * 系统-角色
  7. */
  8. export default class SysRoleService extends BaseService {
  9. /**
  10. * 列举所有角色:除去超级管理员
  11. */
  12. async list() {
  13. const result = await this.getRepo().admin.sys.Role.find({ id: Not(this.config.rootRoleId) });
  14. return result;
  15. }
  16. /**
  17. * 列举所有角色条数:除去超级管理员
  18. */
  19. async count() {
  20. const count = await this.getRepo().admin.sys.Role.count({ id: Not(this.config.rootRoleId) });
  21. return count;
  22. }
  23. /**
  24. * 根据角色获取角色信息
  25. */
  26. async info(rid: number) {
  27. const roleInfo = await this.getRepo().admin.sys.Role.findOne({ id: rid });
  28. const menus = await this.getRepo().admin.sys.RoleMenu.find({ roleId: rid });
  29. const depts = await this.getRepo().admin.sys.RoleDepartment.find({ roleId: rid });
  30. return { roleInfo, menus, depts };
  31. }
  32. /**
  33. * 根据角色Id数组删除
  34. */
  35. async delete(roleIds: number[]) {
  36. if (_.includes(roleIds, this.config.rootRoleId)) {
  37. throw new Error('Not Support Delete Root');
  38. }
  39. await this.ctx.ormManager.transaction(async manager => {
  40. await manager.delete(this.getEntity().admin.sys.Role, roleIds);
  41. await manager.delete(this.getEntity().admin.sys.RoleMenu, { roleId: In(roleIds) });
  42. await manager.delete(this.getEntity().admin.sys.RoleDepartment, { roleId: In(roleIds) });
  43. // TODO:需要连同用户一并删除
  44. });
  45. }
  46. /**
  47. * 增加角色
  48. */
  49. async add(param: CreateRoleDto, uid: number) {
  50. const { name, label, remark, menus, depts } = param;
  51. const role = await this.getRepo().admin.sys.Role.insert({ name, label, remark, userId: String(uid) });
  52. const { identifiers } = role;
  53. const roleId = parseInt(identifiers[0].id);
  54. if (menus && menus.length > 0) {
  55. // 关联菜单
  56. const insertRows = menus.map(m => {
  57. return {
  58. roleId,
  59. menuId: m,
  60. };
  61. });
  62. await this.getRepo().admin.sys.RoleMenu.insert(insertRows);
  63. }
  64. if (depts && depts.length > 0) {
  65. // 关联部门
  66. const insertRows = depts.map(d => {
  67. return {
  68. roleId,
  69. departmentId: d,
  70. };
  71. });
  72. await this.getRepo().admin.sys.RoleDepartment.insert(insertRows);
  73. }
  74. return { roleId };
  75. }
  76. /**
  77. * 更新角色信息
  78. */
  79. async update(param: UpdateRoleDto) {
  80. const { roleId, name, label, remark, menus, depts } = param;
  81. const role = await this.getRepo().admin.sys.Role.save({ id: roleId, name, label, remark });
  82. const originDeptRows = await this.getRepo().admin.sys.RoleDepartment.find({ roleId });
  83. const originMenuRows = await this.getRepo().admin.sys.RoleMenu.find({ roleId });
  84. const originMenuIds = originMenuRows.map(e => { return e.menuId; });
  85. const originDeptIds = originDeptRows.map(e => { return e.departmentId; });
  86. // 开始对比差异
  87. const insertMenusRowIds = _.difference(menus, originMenuIds);
  88. const deleteMenusRowIds = _.difference(originMenuIds, menus);
  89. const insertDeptRowIds = _.difference(depts, originDeptIds);
  90. const deleteDeptRowIds = _.difference(originDeptIds, depts);
  91. // using transaction
  92. await this.ctx.ormManager.transaction(async manager => {
  93. // 菜单
  94. if (insertMenusRowIds.length > 0) {
  95. // 有条目更新
  96. const insertRows = insertMenusRowIds.map(e => {
  97. return {
  98. roleId,
  99. menuId: e,
  100. };
  101. });
  102. await manager.insert(this.getEntity().admin.sys.RoleMenu, insertRows as any);
  103. }
  104. if (deleteMenusRowIds.length > 0) {
  105. // 有条目需要删除
  106. const realDeleteRowIds = _.filter(originMenuRows, e => {
  107. return _.includes(deleteMenusRowIds, e.menuId);
  108. }).map(e => { return (e as any).id; });
  109. await manager.delete(this.getEntity().admin.sys.RoleMenu, realDeleteRowIds);
  110. }
  111. // 部门
  112. if (insertDeptRowIds.length > 0) {
  113. // 有条目更新
  114. const insertRows = insertDeptRowIds.map(e => {
  115. return {
  116. roleId,
  117. departmentId: e,
  118. };
  119. });
  120. await manager.insert(this.getEntity().admin.sys.RoleDepartment, insertRows as any);
  121. }
  122. if (deleteDeptRowIds.length > 0) {
  123. // 有条目需要删除
  124. const realDeleteRowIds = _.filter(originDeptRows, e => {
  125. return _.includes(deleteDeptRowIds, e.departmentId);
  126. }).map(e => { return (e as any).id; });
  127. await manager.delete(this.getEntity().admin.sys.RoleDepartment, realDeleteRowIds);
  128. }
  129. });
  130. return role;
  131. }
  132. /**
  133. * 分页加载角色信息
  134. */
  135. async page(page: number, count: number) {
  136. const result = await this.getRepo().admin.sys.Role.find({
  137. where: {
  138. id: Not(this.config.rootRoleId),
  139. },
  140. order: {
  141. id: 'ASC',
  142. },
  143. take: count,
  144. skip: page * count,
  145. });
  146. return result;
  147. }
  148. /**
  149. * 根据用户id查找角色信息
  150. */
  151. async getRoleIdByUser(id: number) {
  152. const result = await this.getRepo().admin.sys.UserRole.find({
  153. where: {
  154. userId: id,
  155. },
  156. });
  157. if (!_.isEmpty(result)) {
  158. return _.map(result, v => {
  159. return v.roleId;
  160. });
  161. }
  162. return [];
  163. }
  164. /**
  165. * 根据角色ID列表查找关联用户ID
  166. */
  167. async countUserIdByRole(ids: number[]) {
  168. if (_.includes(ids, this.config.rootRoleId)) {
  169. throw new Error('Not Support Delete Root');
  170. }
  171. return await this.getRepo().admin.sys.UserRole.count({ roleId: In(ids) });
  172. }
  173. /**
  174. * 所有按钮
  175. */
  176. async role_menu() {
  177. return await this.getRepo().admin.sys.Menu.find({
  178. select: [ 'id', 'parentId', 'name', 'type' ],
  179. order: { id: 'ASC' },
  180. });
  181. }
  182. /**
  183. * 通过roleId获取menu
  184. */
  185. async menu_by_roleid(roleId: number) {
  186. const roleMenus = await this.getRepo().admin.sys.RoleMenu.find({
  187. select: [ 'menuId' ],
  188. where: { roleId },
  189. order: { menuId: 'ASC' },
  190. });
  191. return roleMenus.map(item => item.menuId);
  192. }
  193. }