sys_role.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from typing import List, Optional
  4. from flask import g
  5. from sqlalchemy import func, select, update, insert, delete
  6. from ruoyi_common.base.model import ExtraModel
  7. from ruoyi_common.domain.entity import SysRole
  8. from ruoyi_admin.ext import db
  9. from ruoyi_common.sqlalchemy.model import ColumnEntityList
  10. from ruoyi_common.sqlalchemy.transaction import Transactional
  11. from ruoyi_system.domain.po import SysDeptPo, SysRolePo, SysUserPo, SysUserRolePo
  12. class SysRoleMapper:
  13. """
  14. 角色数据访问层
  15. """
  16. default_fields = {
  17. "role_id", "role_name", "role_key", "role_sort", "data_scope", \
  18. "menu_check_strictly", "dept_check_strictly", "status", "del_flag", \
  19. "create_time", "remark"
  20. }
  21. default_columns = ColumnEntityList(SysRolePo, default_fields)
  22. default_select = select(*default_columns).distinct() \
  23. .outerjoin(SysUserRolePo, SysUserRolePo.role_id == SysRolePo.role_id) \
  24. .outerjoin(SysUserPo,SysUserPo.user_id == SysUserRolePo.user_id) \
  25. .outerjoin(SysDeptPo,SysDeptPo.dept_id == SysUserPo.dept_id)
  26. @classmethod
  27. def select_role_list(cls, role: SysRole) -> List[SysRole]:
  28. """
  29. 根据条件,查询角色列表
  30. Args:
  31. role: SysRole: 角色查询条件
  32. Returns:
  33. List[SysRole]: 角色列表
  34. """
  35. criterions = [SysRolePo.del_flag=="0"]
  36. if role.role_id and role.role_id != 0:
  37. criterions.append(SysRolePo.role_id==role.role_id)
  38. if role.role_name:
  39. criterions.append(SysRolePo.role_name.like(f"%{role.role_name}%"))
  40. if role.role_key:
  41. criterions.append(SysRolePo.role_key.like(f"%{role.role_key}%"))
  42. if role.status:
  43. criterions.append(SysRolePo.status==role.status)
  44. if "criterian_meta" in g and g.criterian_meta.extra:
  45. extra:ExtraModel = g.criterian_meta.extra
  46. if extra.start_time and extra.end_time:
  47. criterions.append(SysRolePo.create_time >= extra.start_time)
  48. criterions.append(SysRolePo.create_time <= extra.end_time)
  49. if "criterian_meta" in g and g.criterian_meta.scope:
  50. criterions.append(g.criterian_meta.scope)
  51. stmt = cls.default_select.where(*criterions)
  52. if "criterian_meta" in g and g.criterian_meta.page:
  53. g.criterian_meta.page.stmt = stmt
  54. rows = db.session.execute(stmt).all()
  55. eos = list()
  56. for row in rows:
  57. role = cls.default_columns.cast(row,SysRole)
  58. eos.append(role)
  59. return eos
  60. @classmethod
  61. def select_role_permission_by_user_id(cls, user_id: int) -> List[SysRole]:
  62. """
  63. 根据用户ID,查询角色
  64. Args:
  65. user_id: int: 用户ID
  66. Returns:
  67. List[SysRole]: 角色列表
  68. """
  69. criterions = [SysRolePo.del_flag=="0"]
  70. criterions.append(SysUserRolePo.user_id==user_id)
  71. stmt = cls.default_select.where(*criterions)
  72. rows = db.session.execute(stmt).all()
  73. eos = list()
  74. for row in rows:
  75. role = cls.default_columns.cast(row,SysRole)
  76. eos.append(role)
  77. return eos
  78. @classmethod
  79. def select_role_all(cls) -> List[SysRole]:
  80. """
  81. 查询所有角色
  82. Returns:
  83. List[SysRole]: 角色列表
  84. """
  85. stmt = cls.default_select
  86. rows = db.session.execute(stmt).all()
  87. eos = list()
  88. for row in rows:
  89. role = cls.default_columns.cast(row,SysRole)
  90. eos.append(role)
  91. return eos
  92. @classmethod
  93. def select_role_list_by_user_name(cls, user_name: str) -> List[SysRole]:
  94. """
  95. 根据用户名,查询角色列表
  96. Args:
  97. user_name: str: 用户名
  98. Returns:
  99. List[SysRole]: 角色列表
  100. """
  101. criterions = [SysRolePo.del_flag=="0"]
  102. criterions.append(SysUserPo.user_name==user_name)
  103. stmt = cls.default_select.where(*criterions)
  104. rows = db.session.execute(stmt).all()
  105. eos = list()
  106. for row in rows:
  107. role = cls.default_columns.cast(row,SysRole)
  108. eos.append(role)
  109. return eos
  110. @classmethod
  111. def select_role_list_by_user_id(cls, user_id: int) -> List[int]:
  112. """
  113. 根据用户ID,查询角色选择框列表
  114. Args:
  115. user_id: int: 用户ID
  116. Returns:
  117. List[int]: 角色ID列表
  118. """
  119. stmt = select(SysRolePo.role_id).select_from(SysRolePo) \
  120. .outerjoin(SysUserRolePo, SysUserRolePo.role_id == SysRolePo.role_id) \
  121. .outerjoin(SysUserPo, SysUserPo.user_id == SysUserRolePo.user_id) \
  122. .where(SysUserPo.user_id==user_id)
  123. return db.session.execute(stmt).scalars().all()
  124. @classmethod
  125. def select_role_by_id(cls, role_id: int) -> Optional[SysRole]:
  126. """
  127. 根据角色ID,查询角色
  128. Args:
  129. role_id: int: 角色ID
  130. Returns:
  131. Optional[SysRole]: 角色
  132. """
  133. stmt = cls.default_select.where(SysRolePo.role_id==role_id)
  134. row = db.session.execute(stmt).one_or_none()
  135. return cls.default_columns.cast(row,SysRole) if row else None
  136. @classmethod
  137. def count_user_role_by_role_id(cls, role_id: int) -> int:
  138. """
  139. 根据角色ID,查询角色使用数量
  140. Args:
  141. role_id: int: 角色ID
  142. Returns:
  143. int: 角色使用数量
  144. """
  145. stmt = select(func.count()).select_from(SysUserRolePo) \
  146. .where(SysUserRolePo.role_id==role_id)
  147. return db.session.execute(stmt).scalar() or 0
  148. @classmethod
  149. def check_role_name_unique(cls, role_name:str) -> Optional[SysRole]:
  150. """
  151. 检查角色名称是否唯一
  152. Args:
  153. role_name: str: 角色名称
  154. Returns:
  155. Optional[SysRole]: 角色
  156. """
  157. criterions = [SysRolePo.del_flag=="0"]
  158. criterions.append(SysRolePo.role_name==role_name)
  159. stmt = cls.default_select.where(*criterions).limit(1)
  160. row = db.session.execute(stmt).one_or_none()
  161. return cls.default_columns.cast(row,SysRole) if row else None
  162. @classmethod
  163. def check_role_key_unique(cls, role_key:str) -> Optional[SysRolePo]:
  164. """
  165. 校验角色权限是否唯一
  166. Args:
  167. role_key: str: 角色权限
  168. Returns:
  169. Optional[SysRolePo]: 角色
  170. """
  171. criterions = [SysRolePo.del_flag=="0"]
  172. criterions.append(SysRolePo.role_key==role_key)
  173. stmt = cls.default_select.where(*criterions).limit(1)
  174. row = db.session.execute(stmt).one_or_none()
  175. return cls.default_columns.cast(row,SysRole) if row else None
  176. @classmethod
  177. @Transactional(db.session)
  178. def insert_role(cls, role: SysRole) -> int:
  179. """
  180. 新增角色信息
  181. Args:
  182. role: SysRole: 角色信息
  183. Returns:
  184. int: 新增记录的ID
  185. """
  186. fields = {
  187. "role_id", "role_name", "role_key", "role_sort", "data_scope", \
  188. "menu_check_strictly", "dept_check_strictly", "status", "remark", \
  189. "create_by", "create_time"
  190. }
  191. data = role.model_dump(
  192. include=fields,
  193. exclude_unset=True,
  194. exclude_none=True
  195. )
  196. stmt = insert(SysRolePo).values(data)
  197. out = db.session.execute(stmt).inserted_primary_key
  198. return out[0] if out else 0
  199. @classmethod
  200. @Transactional(db.session)
  201. def update_role(cls, role: SysRole) -> int:
  202. """
  203. 修改角色信息
  204. Args:
  205. role: SysRole: 角色信息
  206. Returns:
  207. int: 修改数量
  208. """
  209. fields = {
  210. "role_name", "role_key", "role_sort", "data_scope", \
  211. "menu_check_strictly", "dept_check_strictly", "status", "remark", \
  212. "update_by", "update_time"
  213. }
  214. data = role.model_dump(
  215. include=fields,exclude_unset=True,exclude_none=True
  216. )
  217. stmt = update(SysRolePo) \
  218. .where(SysRolePo.role_id==role.role_id) \
  219. .values(data)
  220. return db.session.execute(stmt).rowcount
  221. @classmethod
  222. @Transactional(db.session)
  223. def delete_role_by_id(cls, role_id: int) -> int:
  224. """
  225. 根据角色ID,删除角色
  226. Args:
  227. role_id: int: 角色ID
  228. Returns:
  229. int: 删除数量
  230. """
  231. stmt = update(SysRolePo).where(SysRolePo.role_id==role_id) \
  232. .values(del_flag="2")
  233. return db.session.execute(stmt).rowcount
  234. @classmethod
  235. @Transactional(db.session)
  236. def delete_role_by_ids(cls, role_ids: List[int]) -> int:
  237. """
  238. 批量删除角色信息
  239. Args:
  240. role_ids: List[int]: 角色ID列表
  241. Returns:
  242. int: 删除数量
  243. """
  244. stmt = update(SysRolePo).where(SysRolePo.role_id.in_(role_ids)) \
  245. .values(del_flag="2")
  246. return db.session.execute(stmt).rowcount
  247. @classmethod
  248. def delete_user_role_by_user_id(cls, user_id):
  249. """
  250. 通过用户ID,删除用户
  251. Args:
  252. user_id: int: 用户ID
  253. """
  254. stmt = delete(SysUserRolePo).where(SysUserRolePo.user_id==user_id)
  255. return db.session.execute(stmt).rowcount