SysUserController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. package com.backendsys.modules.system.controller;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.backendsys.exception.CustException;
  4. import com.backendsys.modules.common.aspect.SysLog;
  5. import com.backendsys.modules.common.config.security.enums.SecurityEnum;
  6. import com.backendsys.modules.common.config.security.utils.SecurityUtil;
  7. import com.backendsys.modules.common.utils.Result;
  8. import com.backendsys.modules.system.entity.SysUserDTO;
  9. import com.backendsys.modules.system.entity.SysUserRoleInfo;
  10. import com.backendsys.modules.system.service.SysUserService;
  11. import com.backendsys.utils.response.PageEntity;
  12. import io.swagger.v3.oas.annotations.Operation;
  13. import io.swagger.v3.oas.annotations.Parameter;
  14. import io.swagger.v3.oas.annotations.tags.Tag;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.security.access.prepost.PreAuthorize;
  17. import org.springframework.validation.annotation.Validated;
  18. import org.springframework.web.bind.annotation.*;
  19. import java.util.List;
  20. @Validated
  21. @RestController
  22. @Tag(name = "系统用户")
  23. public class SysUserController {
  24. /**
  25. * TODO 1.手机号码字段,需要经过验证码校验,不能用 updateUserInfo 改 (待修改)
  26. * TODO 2.审核用户,需要单独的表做审核记录,不能直接改字段
  27. */
  28. @Autowired
  29. private SecurityUtil securityUtil;
  30. @Autowired
  31. private SysUserService sysUserService;
  32. @Operation(summary = "获取系统用户列表")
  33. @PreAuthorize("@sr.hasPermission('3.2')")
  34. @GetMapping("/api/system/user/getUserList")
  35. public Result getUserList(SysUserDTO sysUserDTO) {
  36. return Result.success().put("data", sysUserService.selectUserList(sysUserDTO));
  37. }
  38. @Operation(summary = "获取系统用户列表 (在线的)")
  39. @PreAuthorize("@sr.hasPermission('3.1')")
  40. @GetMapping("/api/system/user/getUserOnlineList")
  41. public Result getUserOnlineList(SysUserDTO sysUserDTO) {
  42. return Result.success().put("data", sysUserService.selectUserOnlineList(sysUserDTO));
  43. }
  44. /**
  45. * 权限:
  46. * - 查询用户信息 (3.2.1)
  47. * - 查询他人用户信息 (3.2.1.2)
  48. */
  49. @Operation(summary = "获取系统用户详情")
  50. @PreAuthorize("@sr.hasPermission('3.2.1')")
  51. @GetMapping("/api/system/user/getUserDetail")
  52. public Result getUserDetail(@Parameter(description = "用户ID") Long user_id) {
  53. // 查询自身的用户信息 (不传参数)
  54. user_id = (user_id == null) ? SecurityUtil.getUserId() : user_id;
  55. // 查询他人的用户信息
  56. // - 查询自己 (无需权限)
  57. // - 查询他人 (需要权限或超级管理员)
  58. if (user_id != SecurityUtil.getUserId() && !securityUtil.hasPermission("3.2.1.2")) {
  59. throw new CustException(SecurityEnum.NOAUTH);
  60. }
  61. return Result.success().put("data", sysUserService.selectUserInfoSimple(user_id));
  62. }
  63. @SysLog("创建系统用户")
  64. @Operation(summary = "创建系统用户")
  65. @PreAuthorize("@sr.hasPermission('3.2.2')")
  66. @PostMapping("/api/system/user/createUser")
  67. public Result createUser(@Validated(SysUserDTO.Create.class) @RequestBody SysUserDTO sysUserDTO) {
  68. return Result.success().put("data", sysUserService.insertUser(sysUserDTO));
  69. }
  70. /**
  71. * 权限:
  72. * - 编辑用户信息权限 (3.2.3)
  73. * - 编辑他人用户信息权限 (3.2.3.2)
  74. */
  75. @SysLog("编辑系统用户信息")
  76. @Operation(summary = "编辑系统用户信息")
  77. @PreAuthorize("@sr.hasPermission('3.2.3')")
  78. @PutMapping("/api/system/user/updateUserInfo")
  79. public Result updateUserInfo(@Validated(SysUserDTO.Update.class) @RequestBody SysUserDTO sysUserDTO) {
  80. // - 不传 user_id 时,修改目标为 当前用户
  81. Long user_id = sysUserDTO.getUser_id();
  82. if (ObjectUtil.isEmpty(user_id)) {
  83. user_id = SecurityUtil.getUserId();
  84. sysUserDTO.setUser_id(user_id);
  85. } else if (SecurityUtil.getUserId() != 1L && user_id == 1L) {
  86. throw new CustException("不能编辑超管账号");
  87. }
  88. // 编辑他人的用户信息
  89. // - 编辑自己 (无需权限)
  90. // - 编辑他人 (需要子权限或超级管理员)
  91. if (user_id != SecurityUtil.getUserId() && !securityUtil.hasPermission("3.2.3.2")) {
  92. throw new CustException(SecurityEnum.NOAUTH);
  93. }
  94. // 防止手动更新字段
  95. sysUserDTO.setLast_login_time(null);
  96. sysUserDTO.setLast_login_ip(null);
  97. return Result.success().put("data", sysUserService.updateUserInfo(sysUserDTO));
  98. }
  99. @SysLog("编辑系统用户角色绑定")
  100. @Operation(summary = "编辑系统用户角色绑定")
  101. @PreAuthorize("@sr.hasPermission('3.2.3.5')")
  102. @PutMapping("/api/system/user/updateUserRoleInfo")
  103. public Result updateUserRoleInfo(@Validated(SysUserRoleInfo.Update.class) @RequestBody SysUserRoleInfo sysUserRoleInfo) {
  104. // - 不传 user_id 时,修改目标为 当前用户
  105. Long user_id = sysUserRoleInfo.getUser_id();
  106. if (ObjectUtil.isEmpty(user_id)) {
  107. user_id = SecurityUtil.getUserId();
  108. sysUserRoleInfo.setUser_id(user_id);
  109. } else if (!SecurityUtil.getUserId().equals(1L) && user_id.equals(1L)) {
  110. throw new CustException("不能编辑超管账号");
  111. }
  112. return Result.success().put("data", sysUserService.updateUserRoleInfo(sysUserRoleInfo));
  113. }
  114. @SysLog("编辑系统用户密码")
  115. @Operation(summary = "编辑系统用户密码")
  116. @PreAuthorize("@sr.hasPermission('3.2.3.3')")
  117. @PutMapping("/api/system/user/updateUserPassword")
  118. public Result updateUserPassword(@Validated(SysUserDTO.UpdatePassword.class) @RequestBody SysUserDTO sysUserDTO) {
  119. // - 不传 user_id 时,修改目标为 当前用户
  120. Long user_id = sysUserDTO.getUser_id();
  121. if (ObjectUtil.isEmpty(user_id)) {
  122. user_id = SecurityUtil.getUserId();
  123. sysUserDTO.setUser_id(user_id);
  124. } else if (!SecurityUtil.getUserId().equals(1L) && user_id.equals(1L)) {
  125. throw new CustException("不能编辑超管账号");
  126. }
  127. // 编辑他人的用户信息
  128. // - 编辑自己 (无需权限)
  129. // - 编辑他人 (需要子权限或超级管理员)
  130. if (user_id != SecurityUtil.getUserId() && !securityUtil.hasPermission("3.2.3.2")) {
  131. throw new CustException(SecurityEnum.NOAUTH);
  132. }
  133. return Result.success().put("data", sysUserService.updateUserPassword(sysUserDTO));
  134. }
  135. @SysLog("重置系统用户密码")
  136. @Operation(summary = "重置系统用户密码")
  137. @PreAuthorize("@sr.hasPermission('3.2.3.4')")
  138. @PutMapping("/api/system/user/resetUserPassword")
  139. public Result resetUserPassword(@Validated(SysUserDTO.ResetPassword.class) @RequestBody SysUserDTO sysUserDTO) {
  140. // 判断不可为超级管理员(首位)
  141. Long user_id = sysUserDTO.getUser_id();
  142. if (user_id != null && user_id == 1L) throw new CustException("不能重置超管账号密码");
  143. // 判断是否为自身重置,自身密码不能重置,只能修改
  144. Long self_user_id = SecurityUtil.getUserId();
  145. Long request_user_id = sysUserDTO.getUser_id();
  146. if (request_user_id != null && self_user_id == request_user_id) {
  147. throw new CustException("不能重置自身密码,请自行修改密码");
  148. }
  149. return Result.success().put("data", sysUserService.resetUserPassword(sysUserDTO));
  150. }
  151. @SysLog("删除系统用户")
  152. @Operation(summary = "删除系统用户")
  153. @PreAuthorize("@sr.hasPermission('3.2.4')")
  154. @DeleteMapping("/api/system/user/deleteUser")
  155. public Result deleteUser(@Validated(SysUserDTO.Delete.class) @RequestBody SysUserDTO sysUserDTO) {
  156. Long user_id = sysUserDTO.getUser_id();
  157. List<Long> user_ids = sysUserDTO.getUser_ids();
  158. if (user_id == null && (user_ids == null || user_ids.size() == 0)) throw new CustException("user_id 或 user_ids 必填");
  159. if (user_id != null && user_id == 1L) throw new CustException("不能删除超管账号");
  160. if (user_ids != null && user_ids.contains(SecurityUtil.getUserId()) && user_id != SecurityUtil.getUserId()) throw new CustException("不能删除自己的账号");
  161. if (user_ids != null && user_ids.contains(1L) && user_id != 1L) throw new CustException("不能删除超管账号");
  162. return Result.success().put("data", sysUserService.deleteUser(sysUserDTO));
  163. }
  164. @SysLog("审核用户")
  165. @Operation(summary = "审核用户")
  166. @PreAuthorize("@sr.hasPermission('3.2.6')")
  167. @PutMapping("/api/system/user/auditUser")
  168. public Result auditUser(@Validated(SysUserDTO.Audit.class) @RequestBody SysUserDTO sysUserDTO) {
  169. Long user_id = sysUserDTO.getUser_id();
  170. if (user_id != null && user_id == 1L) throw new CustException("不能审核超管账号");
  171. if (user_id != null && user_id == SecurityUtil.getUserId()) throw new CustException("不能审核自己的账号");
  172. return Result.success().put("data", sysUserService.auditUser(sysUserDTO));
  173. }
  174. @SysLog("踢出系统用户")
  175. @Operation(summary = "踢出系统用户")
  176. @PreAuthorize("@sr.hasPermission('3.2.7')")
  177. @PostMapping("/api/system/user/kickUser")
  178. public Result kickUser(@Validated(SysUserDTO.Kick.class) @RequestBody SysUserDTO sysUserDTO) {
  179. Long user_id = sysUserDTO.getUser_id();
  180. if (user_id != null && user_id == 1L) throw new CustException("不能踢出超管账号");
  181. if (user_id != null && user_id == SecurityUtil.getUserId()) throw new CustException("不能踢出自己的账号");
  182. return Result.success().put("data", sysUserService.kickUser(user_id));
  183. }
  184. /**
  185. * 权限:
  186. * - 查询用户权限 (3.4.1)
  187. * - 查询他人用户权限 (3.4.1.2)
  188. */
  189. @Operation(summary = "获取系统用户权限")
  190. @PreAuthorize("@sr.hasPermission('3.4.1')")
  191. @GetMapping("/api/system/user/getUserPermission")
  192. public Result getUserPermission(@Parameter(description = "用户ID") Long user_id) {
  193. // 查询自身的用户信息 (不传参数)
  194. user_id = (user_id == null) ? SecurityUtil.getUserId() : user_id;
  195. // 查询他人的用户信息
  196. // - 查询自己 (无需权限)
  197. // - 查询他人 (需要子权限或超级管理员)
  198. if (!user_id.equals(SecurityUtil.getUserId()) && !securityUtil.hasPermission("3.4.1.2")) {
  199. throw new CustException(SecurityEnum.NOAUTH);
  200. }
  201. return Result.success().put("data", sysUserService.selectUserPermission(user_id));
  202. }
  203. /**
  204. * 权限:
  205. * - 查询用户菜单 (3.5.1)
  206. * - 查询他人用户菜单 (3.5.1.2)
  207. */
  208. @Operation(summary = "获取系统用户菜单")
  209. @PreAuthorize("@sr.hasPermission('3.5.1')")
  210. @GetMapping("/api/system/user/getUserMenu")
  211. public Result getUserMenu(@Parameter(description = "用户ID") Long user_id) {
  212. // 查询自身的用户信息 (不传参数)
  213. user_id = (user_id == null) ? SecurityUtil.getUserId() : user_id;
  214. // 查询他人的用户信息
  215. // - 查询自己 (无需权限)
  216. // - 查询他人 (需要子权限或超级管理员)
  217. if (!user_id.equals(SecurityUtil.getUserId()) && !securityUtil.hasPermission("3.4.1.2")) {
  218. throw new CustException(SecurityEnum.NOAUTH);
  219. }
  220. return Result.success().put("data", sysUserService.selectUserMenu(user_id));
  221. }
  222. }