user.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from typing import List, Optional
  4. from flask_login import login_required
  5. from pydantic import BeforeValidator, Field
  6. from typing_extensions import Annotated
  7. from werkzeug.datastructures import FileStorage
  8. from ruoyi_common.base.model import AjaxResponse, TableResponse
  9. from ruoyi_common.base.transformer import ids_to_list
  10. from ruoyi_common.constant import UserConstants
  11. from ruoyi_common.descriptor.serializer import BaseSerializer, JsonSerializer
  12. from ruoyi_common.descriptor.validator import FileDownloadValidator, \
  13. FileUploadValidator, QueryValidator, BodyValidator, PathValidator
  14. from ruoyi_common.domain.entity import SysUser, SysRole
  15. from ruoyi_common.domain.enum import BusinessType
  16. from ruoyi_common.utils import security_util as SecurityUtil
  17. from ruoyi_common.utils.base import ExcelUtil
  18. from ruoyi_framework.descriptor.log import Log
  19. from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
  20. from ruoyi_system.domain.entity import SysPost
  21. from ruoyi_system.service import SysUserService
  22. from ruoyi_system.service.sys_post import SysPostService
  23. from ruoyi_system.service.sys_role import SysRoleService
  24. from ... import reg
  25. @reg.api.route("/system/user/list", methods=["GET"])
  26. @QueryValidator(is_page=True)
  27. @PreAuthorize(HasPerm("system:user:list"))
  28. @JsonSerializer()
  29. def system_user_list(dto: SysUser):
  30. '''
  31. 获取用户列表
  32. '''
  33. rows = SysUserService.select_user_list(dto)
  34. table_response = TableResponse(rows=rows)
  35. return table_response
  36. @reg.api.route("/system/user/", methods=["GET"])
  37. @reg.api.route("/system/user/<int:id>", methods=["GET"])
  38. @PathValidator()
  39. @PreAuthorize(HasPerm("system:user:query"))
  40. @JsonSerializer()
  41. def system_get_user(id: Optional[int] = None):
  42. '''
  43. 获取用户详情
  44. '''
  45. SysUserService.check_user_data_scope(id)
  46. ajax_response = AjaxResponse.from_success()
  47. roles: List[SysRole] = SysRoleService.select_role_all()
  48. posts: List[SysPost] = SysPostService.select_post_all()
  49. if not SecurityUtil.is_admin(id):
  50. roles = [role for role in roles if not role.is_admin()]
  51. setattr(ajax_response, "roles", roles)
  52. setattr(ajax_response, "posts", posts)
  53. if id:
  54. user = SysUserService.select_user_by_id(id)
  55. setattr(ajax_response, "data", user)
  56. post_ids = SysPostService.select_post_list_by_user_id(id)
  57. setattr(ajax_response, "postIds", post_ids)
  58. setattr(ajax_response, "role_ids", user.role_ids)
  59. return ajax_response
  60. @reg.api.route("/system/user", methods=["POST"])
  61. @BodyValidator()
  62. @PreAuthorize(HasPerm("system:user:add"))
  63. @Log(title="用户管理", business_type=BusinessType.INSERT)
  64. @JsonSerializer()
  65. def system_create_user(dto: SysUser):
  66. '''
  67. 新增用户
  68. '''
  69. if SysUserService.check_user_name_unique(dto) \
  70. == UserConstants.NOT_UNIQUE:
  71. return AjaxResponse.from_error(
  72. f"新增用户'{dto.user_name}'失败,登录账号已存在"
  73. )
  74. elif dto.phonenumber \
  75. and SysUserService.check_phone_unique(dto) \
  76. == UserConstants.NOT_UNIQUE:
  77. return AjaxResponse.from_error(
  78. f"新增用户'{dto.phonenumber}'失败,手机号码已存在"
  79. )
  80. elif dto.email \
  81. and SysUserService.check_email_unique(dto) \
  82. == UserConstants.NOT_UNIQUE:
  83. return AjaxResponse.from_error(
  84. f"新增用户'{dto.email}'失败,邮箱已存在"
  85. )
  86. dto.create_by_user(SecurityUtil.get_username())
  87. flag = SysUserService.insert_user(dto)
  88. ajax_response = AjaxResponse.from_success() if flag else AjaxResponse.from_error()
  89. return ajax_response
  90. @reg.api.route("/system/user", methods=["PUT"])
  91. @BodyValidator()
  92. @PreAuthorize(HasPerm("system:user:edit"))
  93. @Log(title="用户管理", business_type=BusinessType.UPDATE)
  94. @JsonSerializer()
  95. def system_update_user(dto: SysUser):
  96. '''
  97. 修改用户
  98. '''
  99. SysUserService.check_user_allowed(dto)
  100. SysUserService.check_user_data_scope(dto.user_id)
  101. if dto.phonenumber \
  102. and SysUserService.check_phone_unique(dto) \
  103. == UserConstants.NOT_UNIQUE:
  104. return AjaxResponse.from_error(
  105. f"新增用户'{dto.phonenumber}'失败,手机号码已存在"
  106. )
  107. elif dto.email \
  108. and SysUserService.check_email_unique(dto.email) \
  109. == UserConstants.NOT_UNIQUE:
  110. return AjaxResponse.from_error(
  111. f"新增用户'{dto.email}'失败,邮箱已存在"
  112. )
  113. dto.update_by_user(SecurityUtil.get_username())
  114. flag = SysUserService.update_user(dto)
  115. ajax_response = AjaxResponse.from_success() if flag else AjaxResponse.from_error()
  116. return ajax_response
  117. @reg.api.route("/system/user/<ids>", methods=["DELETE"])
  118. @PathValidator()
  119. @PreAuthorize(HasPerm("system:user:remove"))
  120. @Log(title="用户管理", business_type=BusinessType.DELETE)
  121. @JsonSerializer()
  122. def system_delete_users(
  123. ids: Annotated[List[int], BeforeValidator(ids_to_list)]
  124. ):
  125. '''
  126. 删除用户
  127. '''
  128. if SecurityUtil.get_user_id() in ids:
  129. return AjaxResponse.from_error("当前用户不能删除")
  130. flag = SysUserService.delete_users_by_ids(ids)
  131. ajax_response = AjaxResponse.from_success() if flag > 0 else AjaxResponse.from_error()
  132. return ajax_response
  133. @reg.api.route("/system/user/export", methods=["POST"])
  134. @FileDownloadValidator()
  135. @PreAuthorize(HasPerm("system:user:export"))
  136. @Log(title="用户管理", business_type=BusinessType.EXPORT)
  137. @BaseSerializer()
  138. def system_user_export(dto: SysUser):
  139. '''
  140. 导出用户数据
  141. '''
  142. rows = SysUserService.select_user_list(dto)
  143. excel_util = ExcelUtil(SysUser)
  144. return excel_util.export_response(rows, "用户数据")
  145. @reg.api.route("/system/user/importData", methods=["POST"])
  146. @FileUploadValidator()
  147. @PreAuthorize(HasPerm("system:user:import"))
  148. @Log(title="用户管理", business_type=BusinessType.IMPORT)
  149. @JsonSerializer()
  150. def system_user_importdata(
  151. file: List[FileStorage],
  152. update_support: Annotated[bool, BeforeValidator(lambda x: x != "0")]
  153. ):
  154. '''
  155. 导入用户模板
  156. '''
  157. file = file[0]
  158. excel_util = ExcelUtil(SysUser)
  159. datas = excel_util.import_file(file, sheetname="用户数据")
  160. msg = SysUserService.import_user(datas, update_support)
  161. return AjaxResponse.from_success(msg=msg)
  162. @reg.api.route("/system/user/importTemplate", methods=["POST"])
  163. @login_required
  164. @BaseSerializer()
  165. def system_user_importtemplate():
  166. '''
  167. 导出模板
  168. '''
  169. excel_util = ExcelUtil(SysUser)
  170. return excel_util.import_template_response(sheetname="用户数据")
  171. @reg.api.route("/system/user/resetPwd", methods=["PUT"])
  172. @BodyValidator()
  173. @PreAuthorize(HasPerm("system:user:resetPwd"))
  174. @Log(title="用户管理", business_type=BusinessType.UPDATE)
  175. @JsonSerializer()
  176. def system_update_user_resetpwd(dto: SysUser):
  177. '''
  178. 重置密码
  179. '''
  180. SysUserService.check_user_allowed(dto)
  181. SysUserService.check_user_data_scope(dto.user_id)
  182. dto.password = SecurityUtil.encrypt_password(dto.password)
  183. dto.update_by_user(SecurityUtil.get_username())
  184. flag = SysUserService.reset_pwd(dto)
  185. ajax_response = AjaxResponse.from_success() if flag else AjaxResponse.from_error()
  186. return ajax_response
  187. @reg.api.route("/system/user/changeStatus", methods=["PUT"])
  188. @BodyValidator()
  189. @PreAuthorize(HasPerm("system:user:edit"))
  190. @Log(title="用户管理", business_type=BusinessType.UPDATE)
  191. @JsonSerializer()
  192. def system_update_user_changestatus(dto: SysUser):
  193. '''
  194. 修改用户状态
  195. '''
  196. SysUserService.check_user_allowed(dto)
  197. SysUserService.check_user_data_scope(dto.user_id)
  198. dto.update_by_user(SecurityUtil.get_username())
  199. flag = SysUserService.update_user_status(dto)
  200. ajax_response = AjaxResponse.from_success() if flag else AjaxResponse.from_error()
  201. return ajax_response
  202. @reg.api.route("/system/user/authRole/<int:id>", methods=["GET"])
  203. @PathValidator()
  204. @PreAuthorize(HasPerm("system:user:query"))
  205. @JsonSerializer()
  206. def system_get_user_authrole(id: int):
  207. '''
  208. 获取用户授权角色
  209. '''
  210. sysuser: SysUser = SysUserService.select_user_by_id(id)
  211. roles: List[SysRole] = SysRoleService.select_role_list_by_user_id(id)
  212. if not sysuser.is_admin():
  213. roles = [role for role in roles if not role.is_admin()]
  214. ajax_response = AjaxResponse.from_success() if sysuser else AjaxResponse.from_error()
  215. setattr(ajax_response, "user", sysuser)
  216. setattr(ajax_response, "roles", roles)
  217. return ajax_response
  218. @reg.api.route("/system/user/authRole", methods=["PUT"])
  219. @BodyValidator()
  220. @PreAuthorize(HasPerm("system:user:edit"))
  221. @Log(title="用户管理", business_type=BusinessType.GRANT)
  222. @JsonSerializer()
  223. def system_update_user_authrole(
  224. user_id: Annotated[int, Field(gt=0)],
  225. role_ids: Annotated[List[int], Field(default_factory=List)]
  226. ):
  227. '''
  228. 授权用户角色
  229. '''
  230. SysUserService.check_user_data_scope(user_id)
  231. SysUserService.update_user_roles(user_id, role_ids)
  232. return AjaxResponse.from_success()