sys_role.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from typing import List, Literal, Optional
  4. from ruoyi_common.constant import UserConstants
  5. from ruoyi_common.domain.entity import SysRole
  6. from ruoyi_common.sqlalchemy.transaction import Transactional
  7. from ruoyi_common.exception import ServiceException
  8. from ruoyi_common.utils import security_util as SecurityUtil
  9. from ruoyi_system.domain.entity import SysRoleDept, SysRoleMenu, SysUserRole
  10. from ruoyi_system.mapper import SysRoleDeptMapper,SysRoleMenuMapper, \
  11. SysUserRoleMapper,SysRoleMapper
  12. from ruoyi_system.service.sys_dept import SysDeptService
  13. from ruoyi_framework.descriptor.datascope import DataScope
  14. from ruoyi_admin.ext import db
  15. class SysRoleService:
  16. @classmethod
  17. @DataScope(dept=True)
  18. def select_role_list(cls, query:SysRole) -> List[SysRole]:
  19. """
  20. 根据条件,查询角色数据
  21. Args:
  22. query (SysRole): 包含查询条件的传输对象
  23. Returns:
  24. List[SysRole]: 角色列表
  25. """
  26. return SysRoleMapper.select_role_list(query)
  27. @classmethod
  28. def select_role_all(cls) -> List[SysRole]:
  29. """
  30. 查询所有角色数据
  31. Args:
  32. query (SysRole): 包含查询条件的传输对象
  33. Returns:
  34. List[SysRole]: 角色列表
  35. """
  36. return SysRoleMapper.select_role_all()
  37. @classmethod
  38. def select_roles_by_user_id(cls, user_id:int) -> List[SysRole]:
  39. """
  40. 根据用户ID查询角色列表
  41. Args:
  42. user_id(int): 用户ID
  43. Returns:
  44. List[SysRole]: 角色列表
  45. """
  46. eos: List[SysRole] = SysRoleMapper.select_role_permission_by_user_id(user_id)
  47. scoped_roles: List[SysRole] = cls.select_role_list(None)
  48. for role in scoped_roles:
  49. if role.role_id in [eo.role_id for eo in eos]:
  50. role.flag = True
  51. return scoped_roles
  52. @classmethod
  53. def select_role_permission_by_user_id(cls, user_id:int) -> List[str]:
  54. """
  55. 根据用户ID,查询角色权限
  56. Args:
  57. user_id(int): 用户ID
  58. Returns:
  59. List[str]: 角色权限列表
  60. """
  61. eos = SysRoleMapper.select_role_permission_by_user_id(user_id)
  62. permset = set()
  63. for eo in eos:
  64. permset = permset | set(eo.role_key.strip().split(","))
  65. return list(permset)
  66. @classmethod
  67. def select_role_list_by_user_id(cls, user_id:int) -> List[SysRole]:
  68. """
  69. 根据用户ID,查询角色选择框列表
  70. Args:
  71. user_id(int): 用户ID
  72. Returns:
  73. List[SysRole]: 角色选择框列表
  74. """
  75. user_eos:List[SysRole] = SysRoleMapper. \
  76. select_role_permission_by_user_id(user_id)
  77. eos:List[SysRole] = cls.select_role_list(SysRole())
  78. for eo in eos:
  79. for user_eo in user_eos:
  80. if eo.role_id == user_eo.role_id:
  81. eo.flag = True
  82. break
  83. return eos
  84. @classmethod
  85. def select_role_by_id(cls, role_id:int) -> Optional[SysRole]:
  86. """
  87. 根据角色ID,查询角色
  88. Args:
  89. role_id(int): 角色ID
  90. Returns:
  91. SysRole: 角色信息
  92. """
  93. role = SysRoleMapper.select_role_by_id(role_id)
  94. if role:
  95. role.menu_ids = SysRoleMenuMapper.select_menu_ids_by_role_id(role_id)
  96. role.dept_ids = list(SysDeptService.select_dept_list_by_role_id(role_id)) \
  97. if role.data_scope == "2" else []
  98. return role
  99. @classmethod
  100. def check_role_name_unique(cls, role: SysRole) -> Literal['0', '1']:
  101. """
  102. 校验角色名称是否唯一
  103. Args:
  104. role(SysRole): 角色信息
  105. Returns:
  106. Literal['0', '1'] : 唯一性校验结果, 0:唯一, 1:不唯一
  107. """
  108. eo:SysRole = SysRoleMapper.check_role_name_unique(role.role_name)
  109. if eo and eo.role_id != role.role_id:
  110. return UserConstants.NOT_UNIQUE
  111. return UserConstants.UNIQUE
  112. @classmethod
  113. def check_role_key_unique(cls, role: SysRole) -> Literal['0', '1']:
  114. """校验角色权限是否唯一
  115. Args:
  116. role(SysRole): 角色信息
  117. Returns:
  118. Literal['0', '1'] : 唯一性校验结果, 0:唯一, 1:不唯一
  119. """
  120. eo: SysRole = SysRoleMapper.check_role_key_unique(role.role_key)
  121. if eo and eo.role_id != role.role_id:
  122. return UserConstants.NOT_UNIQUE
  123. return UserConstants.UNIQUE
  124. @classmethod
  125. def check_role_allowed(cls, role: SysRole):
  126. """
  127. 校验角色是否允许操作
  128. Args:
  129. role(SysRole): 角色信息
  130. Raises:
  131. ServiceException: 超级管理员角色不允许操作
  132. """
  133. if role and role.role_id and role.is_admin():
  134. raise ServiceException("不允许操作超级管理员角色")
  135. @classmethod
  136. def check_role_data_scope(cls, role_id: int):
  137. """
  138. 校验角色是否有数据权限
  139. Args:
  140. role_id(int): 角色ID
  141. Raises:
  142. ServiceException: 超级管理员角色不允许操作
  143. """
  144. if not SecurityUtil.is_admin(SecurityUtil.get_user_id()):
  145. role = SysRole(role_id=role_id)
  146. roles: List[SysRole] = cls.select_role_list(role)
  147. if not roles:
  148. raise ServiceException("没有权限访问角色数据")
  149. @classmethod
  150. def count_user_role_by_role_id(cls, role_id:int) -> int:
  151. """
  152. 通过角色ID查询角色使用数量
  153. Args:
  154. role_id(int): 角色ID
  155. Returns:
  156. int: 角色使用数量
  157. """
  158. return SysRoleMapper.count_user_role_by_role_id(role_id)
  159. @classmethod
  160. @Transactional(db.session)
  161. def insert_role(cls, role:SysRole) -> int:
  162. """
  163. 新增角色信息
  164. Args:
  165. role(SysRole): 角色信息
  166. Returns:
  167. int: 新增角色ID
  168. """
  169. last_id = SysRoleMapper.insert_role(role)
  170. role.role_id = last_id
  171. return cls.insert_role_menu(role)
  172. @classmethod
  173. @Transactional(db.session)
  174. def update_role(cls, role:SysRole) -> bool:
  175. """
  176. 修改保存角色信息
  177. Args:
  178. role(SysRole): 角色信息
  179. Returns:
  180. bool: 修改结果
  181. """
  182. SysRoleMapper.update_role(role)
  183. SysRoleMenuMapper.delete_role_menu_by_role_id(role.role_id)
  184. return cls.insert_role_menu(role) > 0
  185. @classmethod
  186. @Transactional(db.session)
  187. def update_role_status(cls, role:SysRole) -> bool:
  188. """
  189. 修改角色状态
  190. Args:
  191. role(SysRole): 角色信息
  192. Returns:
  193. bool: 修改结果
  194. """
  195. return SysRoleMapper.update_role(role) > 0
  196. @classmethod
  197. @Transactional(db.session)
  198. def auth_data_scope(cls, role:SysRole) -> bool:
  199. """
  200. 修改数据权限信息
  201. Args:
  202. role(SysRole): 角色信息
  203. Returns:
  204. bool: 修改结果(True 表示成功)
  205. """
  206. # 1. 先更新角色本身的数据范围等信息
  207. SysRoleMapper.update_role(role)
  208. # 2. 清理原有角色-部门关联
  209. SysRoleDeptMapper.delete_role_dept_by_role_id(role.role_id)
  210. # 3. 只有“自定义数据权限”(通常为 '2') 时才维护角色-部门表
  211. # 其他类型的数据范围(全部、本部门、本部门及以下、仅本人)都不需要 sys_role_dept 记录
  212. if role.data_scope == "2" and role.dept_ids:
  213. num = cls.insert_role_dept(role)
  214. return num > 0
  215. # 非自定义范围,即使没有部门记录也视为成功
  216. return True
  217. @classmethod
  218. @Transactional(db.session)
  219. def insert_role_menu(cls, role: SysRole) -> int:
  220. """
  221. 新增角色菜单信息
  222. Args:
  223. role(SysRole): 角色信息
  224. Returns:
  225. int: 新增角色菜单数量
  226. """
  227. menus = []
  228. for menu_id in role.menu_ids:
  229. menu = SysRoleMenu(role_id=role.role_id, menu_id=menu_id)
  230. menus.append(menu)
  231. if len(menus) > 0:
  232. SysRoleMenuMapper.batch_role_menu(menus)
  233. return len(menus)
  234. @classmethod
  235. @Transactional(db.session)
  236. def insert_role_dept(cls, role: SysRole):
  237. """
  238. 新增角色部门信息
  239. Args:
  240. role(SysRole): 角色信息
  241. Returns:
  242. int: 新增角色部门数量
  243. """
  244. depts = []
  245. for dept_id in role.dept_ids:
  246. dept = SysRoleDept(role_id=role.role_id, dept_id=dept_id)
  247. depts.append(dept)
  248. if len(depts) > 0:
  249. SysRoleDeptMapper.batch_role_dept(depts)
  250. return len(depts)
  251. @classmethod
  252. @Transactional(db.session)
  253. def delete_role_by_id(cls, role_id:int) -> bool:
  254. """
  255. 通过角色ID删除角色
  256. Args:
  257. role_id(int): 角色ID
  258. Returns:
  259. bool: 删除结果
  260. """
  261. SysRoleMenuMapper.delete_role_menu_by_role_id(role_id)
  262. SysRoleDeptMapper.delete_role_dept_by_role_id(role_id)
  263. return SysRoleMapper.delete_role_by_id(role_id) > 0
  264. @classmethod
  265. @Transactional(db.session)
  266. def delete_role_by_ids(cls, role_ids:List[int]) -> bool:
  267. """
  268. 批量删除角色信息
  269. Args:
  270. role_ids(List[int]): 角色ID列表
  271. Returns:
  272. bool: 删除结果
  273. """
  274. for role_id in role_ids:
  275. cls.check_role_allowed(SysRole(role_id=role_id))
  276. # cls.check_role_data_scope(role_id) # todo
  277. role: SysRole = cls.select_role_by_id(role_id)
  278. if cls.count_user_role_by_role_id(role_id) > 0:
  279. raise ServiceException("角色{}已分配用户,不能删除".format(role.role_name))
  280. SysRoleMenuMapper.delete_role_menu(role_ids)
  281. SysRoleDeptMapper.delete_role_dept(role_ids)
  282. return SysRoleMapper.delete_role_by_ids(role_ids) > 0
  283. @classmethod
  284. @Transactional(db.session)
  285. def delete_auth_user(cls, user_role:SysUserRole) -> bool:
  286. """
  287. 取消授权用户角色
  288. Args:
  289. user_role(SysUserRole): 用户角色信息
  290. Returns:
  291. bool: 取消授权结果
  292. """
  293. return SysUserRoleMapper.delete_user_role_info(user_role) > 0
  294. @classmethod
  295. @Transactional(db.session)
  296. def delete_auth_users(cls, role_id, user_ids) -> bool:
  297. """
  298. 批量取消授权用户角色
  299. Args:
  300. role_id(int): 角色ID
  301. user_ids(List[int]): 用户ID列表
  302. Returns:
  303. bool: 取消授权结果
  304. """
  305. return SysUserRoleMapper.delete_user_role_infos(role_id, user_ids) > 0
  306. @classmethod
  307. @Transactional(db.session)
  308. def insert_auth_users(cls, role_id, user_ids) -> bool:
  309. """
  310. 批量选择授权用户角色
  311. Args:
  312. role_id(int): 角色ID
  313. user_ids(List[int]): 用户ID列表
  314. Returns:
  315. bool: 选择授权结果
  316. """
  317. user_roles = [SysUserRole(user_id=user_id, role_id=role_id) \
  318. for user_id in user_ids]
  319. num = SysUserRoleMapper.batch_user_role(user_roles)
  320. return num > 0