role.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. import json
  2. from flask import request, jsonify, current_app
  3. from flask_restx import Resource, Namespace, reqparse
  4. from sqlalchemy import select, insert, update, delete, func
  5. from sqlalchemy.orm import Session
  6. from app.defines import StatesCode, Module, OperationType
  7. from app.modle.role import Role
  8. from app.modle.users import User
  9. from app.utils.jwt_util import login_required
  10. from app.utils.save_log import save_log
  11. from app.utils.util import to_dict
  12. ns = Namespace('role', description='角色管理接口')
  13. role_list = reqparse.RequestParser(bundle_errors=True)
  14. role_list.add_argument(name='page_size', type=int, location='args', required=False, help='每页记录数量,默认:20')
  15. role_list.add_argument(name='page', type=int, location='args', required=False, help='页数')
  16. @ns.route('/role_list')
  17. class GetUserListApi(Resource):
  18. method_decorators = [login_required]
  19. @ns.doc(id='get_role_list', description='获取角色列表')
  20. @ns.expect(role_list)
  21. def get(self):
  22. """获取角色列表"""
  23. page_size = int(request.args.get('page_size', 20))
  24. page = int(request.args.get('page', 1))
  25. with Session(current_app.engine) as session:
  26. stmt = select(Role).offset(page_size * (page - 1)).limit(page_size)
  27. results = session.execute(stmt).scalars().all()
  28. save_log(request, Module.ROLE, OperationType.INQUIRE, StatesCode.SUCCESS)
  29. return jsonify(code=StatesCode.SUCCESS, message='成功', data=to_dict(results))
  30. role = reqparse.RequestParser(bundle_errors=True)
  31. role.add_argument(name='role_id', type=int, location='form', required=False, help='角色id')
  32. role.add_argument(name='role_name', type=str, location='form', required=False, help='角色名称')
  33. role.add_argument(name='role_describe', type=str, location='form', required=False, help='角色描述')
  34. role.add_argument(name='role_permission', type=str, location='form', required=False, help='角色权限')
  35. role_id = reqparse.RequestParser(bundle_errors=True)
  36. role_id.add_argument(name='role_id', type=int, location='args', required=False, help='角色id')
  37. @ns.route('/role')
  38. class RoleApi(Resource):
  39. method_decorators = [login_required]
  40. @ns.doc(id='get_role', description='获取角色')
  41. @ns.expect(role_id)
  42. def get(self):
  43. """获取角色"""
  44. role_id = request.args.get('role_id')
  45. if role_id is None:
  46. return jsonify(code=StatesCode.UNKNOWN_ERROR, message="角色id不能为空")
  47. with Session(current_app.engine) as session:
  48. stmt = select(Role).where(Role.id == role_id)
  49. results = session.execute(stmt).scalars().all()
  50. save_log(request, Module.ROLE, OperationType.INQUIRE, StatesCode.SUCCESS)
  51. return {"code": StatesCode.SUCCESS, "message": "成功", "data": to_dict(results)}
  52. @ns.doc(id='add_role', description='添加角色')
  53. @ns.expect(role)
  54. def post(self):
  55. """添加角色"""
  56. role_name = request.form.get('role_name')
  57. role_describe = request.form.get('role_describe')
  58. role_permission = request.form.get('role_permission')
  59. if role_name is None:
  60. return jsonify(code=StatesCode.UNKNOWN_ERROR, message="角色名不能为空")
  61. if role_permission:
  62. role_permission = json.loads(role_permission)
  63. with Session(current_app.engine) as session:
  64. stmt = insert(Role).values(
  65. role_name=role_name,
  66. role_describe=role_describe,
  67. role_permission=role_permission
  68. )
  69. session.execute(stmt)
  70. session.commit()
  71. save_log(request, Module.ROLE, OperationType.ADD, StatesCode.SUCCESS)
  72. return jsonify(code=StatesCode.SUCCESS, message='成功')
  73. @ns.doc(id='modify_role', description='修改角色')
  74. @ns.expect(role)
  75. def put(self):
  76. """修改角色"""
  77. role_id = request.form.get('role_id')
  78. role_name = request.form.get('role_name')
  79. role_describe = request.form.get('role_describe')
  80. role_permission = request.form.get('role_permission')
  81. if role_name is None or role_id is None:
  82. return jsonify(code=StatesCode.UNKNOWN_ERROR, message="角色名和角色id不能为空")
  83. if role_permission:
  84. role_permission = json.loads(role_permission)
  85. with Session(current_app.engine) as session:
  86. stmt = update(Role).where(Role.id == role_id).values(
  87. role_name=role_name,
  88. role_describe=role_describe,
  89. role_permission=role_permission
  90. )
  91. session.execute(stmt)
  92. session.commit()
  93. save_log(request, Module.ROLE, OperationType.UPDATE, StatesCode.SUCCESS)
  94. return jsonify(code=StatesCode.SUCCESS, message="添加角色成功")
  95. @ns.doc(id='delete_role', description='删除角色')
  96. @ns.expect(role)
  97. def delete(self):
  98. """删除角色"""
  99. role_id = request.form.get('role_id')
  100. if role_id is None:
  101. return jsonify(code=StatesCode.UNKNOWN_ERROR, message="角色名和角色id不能为空")
  102. # 查询用户,用户的角色为当前角色,无法删除角色
  103. with Session(current_app.engine) as session:
  104. stmt = select(func.count(User.role)).where(User.role == role_id)
  105. results = session.execute(stmt).scalars().first()
  106. if results > 0:
  107. return jsonify(code=StatesCode.UNKNOWN_ERROR, message="该角色组存在用户,无法删除")
  108. else:
  109. stmt = delete(Role).where(Role.id == role_id)
  110. session.execute(stmt)
  111. session.commit()
  112. save_log(request, Module.ROLE, OperationType.DELETE, StatesCode.SUCCESS)
  113. return jsonify(code=StatesCode.SUCCESS, message="删除角色成功")
  114. get_member = reqparse.RequestParser(bundle_errors=True)
  115. get_member.add_argument(name='role_id', type=int, location='args', required=False, help='角色id')
  116. del_member = reqparse.RequestParser(bundle_errors=True)
  117. del_member.add_argument(name='user_id', type=int, location='form', required=False, help='用户id')
  118. batch_del_member = reqparse.RequestParser(bundle_errors=True)
  119. batch_del_member.add_argument(name='users_id', type=str, location='form', required=False, help='用户ids')
  120. @ns.route('/member')
  121. class RoleMemberApi(Resource):
  122. method_decorators = [login_required]
  123. @ns.doc(id='get_role_member', description='获取角色成员')
  124. @ns.expect(get_member)
  125. def get(self):
  126. """获取角色成员"""
  127. role_id = request.args.get('role_id')
  128. if role_id is None:
  129. return jsonify(code=StatesCode.UNKNOWN_ERROR, message='角色id不能为空')
  130. with Session(current_app.engine) as session:
  131. stmt = select(User).where(User.role == role_id)
  132. results = session.execute(stmt).scalars().all()
  133. save_log(request, Module.ROLE, OperationType.INQUIRE, StatesCode.SUCCESS)
  134. return jsonify(code=StatesCode.SUCCESS, message='成功', data=to_dict(results))
  135. @ns.doc(id='delete_role_member', description='移除角色成员')
  136. @ns.expect(del_member)
  137. def put(self):
  138. """移除角色成员"""
  139. user_id = request.form.get('user_id')
  140. if user_id is None:
  141. return jsonify(code=StatesCode.UNKNOWN_ERROR, message='用户id不能为空')
  142. with Session(current_app.engine) as session:
  143. stmt = update(User).where(User.id == user_id).values(role=None)
  144. session.execute(stmt)
  145. session.commit()
  146. save_log(request, Module.ROLE, OperationType.DELETE, StatesCode.SUCCESS)
  147. return jsonify(code=StatesCode.SUCCESS, message="移除成功")
  148. # class BatchDeleteRoleMember(Resource):
  149. @ns.doc(id='batch_delete_role_member', description='批量移除角色成员')
  150. @ns.expect(batch_del_member)
  151. def delete(self):
  152. """批量移除角色成员"""
  153. users_id = request.form.get('users_id')
  154. if users_id is not None:
  155. users_id = json.loads(users_id)
  156. else:
  157. return jsonify(code=StatesCode.UNKNOWN_ERROR, message='用户id不能为空')
  158. values = []
  159. for user_id in users_id:
  160. values.append({"id": user_id, "role": None})
  161. with Session(current_app.engine) as session:
  162. session.execute(
  163. update(User),
  164. values
  165. )
  166. session.commit()
  167. save_log(request, Module.ROLE, OperationType.BATCH_DELETE, StatesCode.SUCCESS)
  168. return jsonify(code=StatesCode.SUCCESS, message='批量移除成功')