Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

292 строки
7.7 KiB

  1. const Base = require('../../base');
  2. module.exports = class extends Base {
  3. // 角色列表页面
  4. async indexAction() {
  5. this.assign('currentPage', 'sys-role');
  6. this.assign('pageTitle', '角色权限');
  7. this.assign('breadcrumb', [
  8. { name: '系统管理', url: '/admin/system/user.html' },
  9. { name: '角色权限' }
  10. ]);
  11. // 权限树数据
  12. this.assign('permissionTree', await this.getPermissionTree());
  13. this.assign('adminUser', this.adminUser || {});
  14. return this.display();
  15. }
  16. // 获取角色列表接口
  17. async listAction() {
  18. const { keyword, page = 1, pageSize = 20 } = this.get();
  19. const where = { is_deleted: 0 };
  20. if (keyword) {
  21. where.name = ['like', `%${keyword}%`];
  22. }
  23. const list = await this.model('admin_role')
  24. .where(where)
  25. .order('sort ASC, id ASC')
  26. .page(page, pageSize)
  27. .countSelect();
  28. return this.success(list);
  29. }
  30. // 获取所有角色(下拉用)
  31. async allAction() {
  32. const list = await this.model('admin_role')
  33. .where({ is_deleted: 0, status: 1 })
  34. .order('sort ASC')
  35. .select();
  36. return this.success(list);
  37. }
  38. // 获取单个角色
  39. async detailAction() {
  40. const { id } = this.get();
  41. if (!id) return this.fail('参数错误');
  42. const role = await this.model('admin_role')
  43. .where({ id, is_deleted: 0 })
  44. .find();
  45. if (think.isEmpty(role)) {
  46. return this.fail('角色不存在');
  47. }
  48. // 解析 permissions JSON 字符串为数组
  49. try {
  50. role.permissions = JSON.parse(role.permissions || '[]');
  51. } catch (e) {
  52. role.permissions = [];
  53. }
  54. return this.success(role);
  55. }
  56. // 新增角色
  57. async addAction() {
  58. const { name, code, description, is_default = 0, sort = 0 } = this.post();
  59. if (!name) {
  60. return this.fail('角色名称不能为空');
  61. }
  62. // 检查名称是否存在
  63. const exist = await this.model('admin_role')
  64. .where({ name, is_deleted: 0 })
  65. .find();
  66. if (!think.isEmpty(exist)) {
  67. return this.fail('角色名称已存在');
  68. }
  69. const data = {
  70. name,
  71. code: code || '',
  72. description: description || '',
  73. permissions: JSON.stringify([]),
  74. is_default: is_default ? 1 : 0,
  75. sort: sort || 0,
  76. create_by: this.adminUser?.id || 0
  77. };
  78. const id = await this.model('admin_role').add(data);
  79. await this.log('add', '角色管理', `新增角色「${name}」`);
  80. return this.success({ id });
  81. }
  82. // 编辑角色
  83. async editAction() {
  84. const { id, name, code, description, is_default, sort } = this.post();
  85. if (!id) return this.fail('参数错误');
  86. const role = await this.model('admin_role')
  87. .where({ id, is_deleted: 0 })
  88. .find();
  89. if (think.isEmpty(role)) {
  90. return this.fail('角色不存在');
  91. }
  92. // 默认角色不能编辑
  93. if (role.is_default === 1) {
  94. return this.fail('默认角色不能编辑');
  95. }
  96. // 检查名称是否重复
  97. if (name && name !== role.name) {
  98. const exist = await this.model('admin_role')
  99. .where({ name, is_deleted: 0, id: ['!=', id] })
  100. .find();
  101. if (!think.isEmpty(exist)) {
  102. return this.fail('角色名称已存在');
  103. }
  104. }
  105. const data = {
  106. name: name || role.name,
  107. code: code !== undefined ? code : role.code,
  108. description: description !== undefined ? description : role.description,
  109. is_default: is_default !== undefined ? (is_default ? 1 : 0) : role.is_default,
  110. sort: sort !== undefined ? sort : role.sort,
  111. update_by: this.adminUser?.id || 0
  112. };
  113. await this.model('admin_role').where({ id }).update(data);
  114. await this.log('edit', '角色管理', `编辑角色「${name || role.name}」(ID:${id})`);
  115. return this.success();
  116. }
  117. // 分配权限
  118. async assignPermissionsAction() {
  119. const { id, permissions } = this.post();
  120. if (!id) return this.fail('参数错误');
  121. const role = await this.model('admin_role')
  122. .where({ id, is_deleted: 0 })
  123. .find();
  124. if (think.isEmpty(role)) {
  125. return this.fail('角色不存在');
  126. }
  127. await this.model('admin_role')
  128. .where({ id })
  129. .update({
  130. permissions: JSON.stringify(permissions || []),
  131. update_by: this.adminUser?.id || 0
  132. });
  133. await this.log('edit', '角色管理', `分配权限「${role.name}」(ID:${id})`);
  134. return this.success();
  135. }
  136. // 删除角色
  137. async deleteAction() {
  138. const { id } = this.post();
  139. if (!id) return this.fail('参数错误');
  140. const role = await this.model('admin_role')
  141. .where({ id, is_deleted: 0 })
  142. .find();
  143. if (think.isEmpty(role)) {
  144. return this.fail('角色不存在');
  145. }
  146. // 默认角色不能删除
  147. if (role.is_default === 1) {
  148. return this.fail('默认角色不能删除');
  149. }
  150. // 检查是否有用户使用该角色
  151. const userCount = await this.model('admin_user')
  152. .where({ role_id: id, is_deleted: 0 })
  153. .count();
  154. if (userCount > 0) {
  155. return this.fail(`该角色下有 ${userCount} 个用户,无法删除`);
  156. }
  157. await this.model('admin_role')
  158. .where({ id })
  159. .update({
  160. is_deleted: 1,
  161. update_by: this.adminUser?.id || 0
  162. });
  163. await this.log('delete', '角色管理', `删除角色「${role.name}」(ID:${id})`);
  164. return this.success();
  165. }
  166. // 批量删除
  167. async batchDeleteAction() {
  168. const { ids } = this.post();
  169. if (!ids || !ids.length) return this.fail('参数错误');
  170. // 检查是否包含默认角色
  171. const defaultCount = await this.model('admin_role')
  172. .where({ id: ['in', ids], is_default: 1, is_deleted: 0 })
  173. .count();
  174. if (defaultCount > 0) {
  175. return this.fail('选中的角色包含默认角色,无法删除');
  176. }
  177. // 检查是否有用户使用这些角色
  178. const userCount = await this.model('admin_user')
  179. .where({ role_id: ['in', ids], is_deleted: 0 })
  180. .count();
  181. if (userCount > 0) {
  182. return this.fail(`选中的角色下有 ${userCount} 个用户,无法删除`);
  183. }
  184. await this.model('admin_role')
  185. .where({ id: ['in', ids] })
  186. .update({
  187. is_deleted: 1,
  188. update_by: this.adminUser?.id || 0
  189. });
  190. await this.log('delete', '角色管理', `批量删除角色(IDs:${ids.join(',')})`);
  191. return this.success();
  192. }
  193. // 获取权限树配置
  194. async getPermissionTree() {
  195. return [
  196. {
  197. name: '患者管理', key: 'patient',
  198. children: [
  199. { name: '查看', key: 'patient:view' },
  200. { name: '新增', key: 'patient:add' },
  201. { name: '编辑', key: 'patient:edit' },
  202. { name: '导出', key: 'patient:export' },
  203. { name: '审核', key: 'patient:audit' },
  204. { name: '删除', key: 'patient:delete' }
  205. ]
  206. },
  207. {
  208. name: '瘤种管理', key: 'tag',
  209. children: [
  210. { name: '查看', key: 'tag:view' },
  211. { name: '新增', key: 'tag:add' },
  212. { name: '编辑', key: 'tag:edit' },
  213. { name: '删除', key: 'tag:delete' }
  214. ]
  215. },
  216. {
  217. name: '内容管理', key: 'content',
  218. children: [
  219. { name: '查看', key: 'content:view' },
  220. { name: '新增', key: 'content:add' },
  221. { name: '编辑', key: 'content:edit' },
  222. { name: '删除', key: 'content:delete' }
  223. ]
  224. },
  225. {
  226. name: '系统管理', key: 'setting:system',
  227. children: [
  228. { name: '用户管理', key: 'setting:system:user' },
  229. { name: '角色权限', key: 'setting:system:role' },
  230. { name: '操作日志', key: 'setting:system:log' },
  231. { name: '短信记录', key: 'setting:system:sms' }
  232. ]
  233. }
  234. ];
  235. }
  236. };