SysUserController.java 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
  1. package com.jiayue.ssi.controller;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.lang.Validator;
  4. import cn.hutool.core.util.IdcardUtil;
  5. import cn.hutool.core.util.NumberUtil;
  6. import cn.hutool.crypto.SmUtil;
  7. import cn.hutool.json.JSONUtil;
  8. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.jiayue.ssi.annotation.AgainVerify;
  11. import com.jiayue.ssi.annotation.OperateLog;
  12. import com.jiayue.ssi.annotation.PreventReplay;
  13. import com.jiayue.ssi.backenum.ApproveOperaterEnum;
  14. import com.jiayue.ssi.backenum.ApproveStatusEnum;
  15. import com.jiayue.ssi.backenum.AuditType;
  16. import com.jiayue.ssi.backenum.BusinessType;
  17. import com.jiayue.ssi.config.SendMailUtil;
  18. import com.jiayue.ssi.constant.ApproveConstants;
  19. import com.jiayue.ssi.constant.CacheConstants;
  20. import com.jiayue.ssi.constant.CustomException;
  21. import com.jiayue.ssi.constant.SecretKeyConstants;
  22. import com.jiayue.ssi.dto.ActiveUserDto;
  23. import com.jiayue.ssi.entity.*;
  24. import com.jiayue.ssi.service.*;
  25. import com.jiayue.ssi.service.impl.SysPermissionService;
  26. import com.jiayue.ssi.util.*;
  27. import io.jsonwebtoken.Claims;
  28. import lombok.extern.slf4j.Slf4j;
  29. import org.apache.commons.lang3.StringUtils;
  30. import org.apache.commons.lang3.time.DateFormatUtils;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.security.access.prepost.PreAuthorize;
  33. import org.springframework.security.core.Authentication;
  34. import org.springframework.security.core.context.SecurityContextHolder;
  35. import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
  36. import org.springframework.web.bind.annotation.*;
  37. import javax.servlet.http.HttpServletRequest;
  38. import javax.servlet.http.HttpServletResponse;
  39. import java.util.*;
  40. import java.util.stream.Collectors;
  41. /**
  42. * 用户信息接口
  43. *
  44. * @author xsl
  45. * @since 2023/03/13
  46. */
  47. @RestController
  48. @RequestMapping("/sysUserController")
  49. @Slf4j
  50. public class SysUserController {
  51. @Autowired
  52. SysUserService sysUserService;
  53. @Autowired
  54. SendMailUtil sendMailUtil;
  55. @Autowired
  56. SysPermissionService sysPermissionService;
  57. @Autowired
  58. SysUserRoleService sysUserRoleService;
  59. @Autowired
  60. SysApproveService sysApproveService;
  61. @Autowired
  62. SysRoleService sysRoleService;
  63. @Autowired
  64. SysPolicyService sysPolicyService;
  65. @Autowired
  66. JwtTokenUtil jwtTokenUtil;
  67. /**
  68. * 获取用户分页信息
  69. *
  70. * @return 用户信息
  71. */
  72. @GetMapping(value = "/getAll")
  73. @PreAuthorize("@ss.hasPermi('system:user:list')")
  74. @OperateLog(title = "用户管理", businessType = BusinessType.QUERY, auditType = AuditType.SYS,operdesc = "用户查询")
  75. @PreventReplay
  76. public ResponseVO getAll(String username, String phonenumber,
  77. String status) throws CustomException {
  78. try {
  79. if (StringUtils.isNotEmpty(username)) {
  80. if (username.length() > 20) {
  81. return ResponseVO.fail("用户账号长度不能超过20个字符!");
  82. }
  83. }
  84. if (StringUtils.isNotEmpty(phonenumber)) {
  85. if (phonenumber.length() > 11) {
  86. return ResponseVO.fail("手机号码长度不能超过11个字符!");
  87. }
  88. }
  89. // 查询全部
  90. List<SysUser> sysUserList = sysUserService.queryAllUserByDecrypt();
  91. // 根据查询条件过滤结果
  92. if (StringUtils.isNotEmpty(username)) {
  93. sysUserList = sysUserList.stream().filter(user -> username.equals(user.getUsername())).collect(Collectors.toList());
  94. }
  95. if (StringUtils.isNotEmpty(phonenumber)) {
  96. sysUserList = sysUserList.stream().filter(user -> phonenumber.equals(user.getPhonenumber())).collect(Collectors.toList());
  97. }
  98. if (StringUtils.isNotEmpty(status)) {
  99. sysUserList = sysUserList.stream().filter(user -> status.equals(user.getStatus())).collect(Collectors.toList());
  100. }
  101. SysRole sysRole = sysRoleService.selectRoleListByUserId();
  102. if ("YWGL".equals(sysRole.getRoleKey())){
  103. // 业务管理员员
  104. sysUserList = sysUserList.stream().filter(user -> "1".equals(user.getUsertype())).collect(Collectors.toList());
  105. }
  106. return ResponseVO.success(sysUserList);
  107. } catch (Exception e) {
  108. throw new CustomException("获取所有用户异常", e);
  109. }
  110. }
  111. /**
  112. * 获取当前用户信息
  113. *
  114. * @return 用户信息
  115. */
  116. @GetMapping(value = "/getCurrentUser")
  117. public ResponseVO getCurrentUser() throws CustomException {
  118. try {
  119. SysUser sysUser = SecurityContextUtil.getSysUser();
  120. // 权限集合
  121. Set<String> permissions = sysPermissionService.getMenuPermission(sysUser.getId());
  122. Map<String, Object> map = new HashMap<>();
  123. sysUser.setMailbox(SM2CryptUtils.decrypt(sysUser.getMailbox(), SecretKeyConstants.SERVER_PRIVATE_KEY));
  124. sysUser.setPhonenumber(SM2CryptUtils.decrypt(sysUser.getPhonenumber(), SecretKeyConstants.SERVER_PRIVATE_KEY));
  125. sysUser.setNickname(SM2CryptUtils.decrypt(sysUser.getNickname(), SecretKeyConstants.SERVER_PRIVATE_KEY));
  126. sysUser.setIdcard(SM2CryptUtils.decrypt(sysUser.getIdcard(), SecretKeyConstants.SERVER_PRIVATE_KEY));
  127. map.put("sysUser", sysUser);
  128. map.put("permissions", permissions);
  129. return ResponseVO.success(map);
  130. } catch (Exception e) {
  131. throw new CustomException("获取当前用户异常", e);
  132. }
  133. }
  134. /**
  135. * 新增用户
  136. */
  137. @PostMapping(value = "/addUser")
  138. @AgainVerify
  139. @OperateLog(title = "用户管理", businessType = BusinessType.INSERT, auditType = AuditType.SYS,operdesc = "新增用户")
  140. @PreAuthorize("@ss.hasPermi('system:user:add')")
  141. @PreventReplay
  142. public ResponseVO addUser(@RequestBody SysUser user) throws CustomException {
  143. try {
  144. String username="";
  145. SysApprove sysApprove = new SysApprove();
  146. if (StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getUsername().trim())) {
  147. return ResponseVO.fail("用户账号不能为空!");
  148. }
  149. else {
  150. username = user.getUsername();
  151. if (username.contains(" ")){
  152. return ResponseVO.fail("账号中不能含有空格!");
  153. }
  154. String regExp = "^[^0-9][\\w_]{4,19}$";
  155. if (!username.matches(regExp)) {
  156. return ResponseVO.fail("用户账号长度必须是5-20位,只能包含字母、数字和下划线,不能数字开头!");
  157. }
  158. sysApprove.setUsername(username);
  159. }
  160. if (!IdcardUtil.isValidCard(user.getIdcard())) {
  161. return ResponseVO.fail("身份证无效!");
  162. }
  163. // sm2加密身份证
  164. sysApprove.setIdcard(SM2CryptUtils.encrypt(user.getIdcard(), SecretKeyConstants.SERVER_PUBLIC_KEY));
  165. if (StringUtils.isEmpty(user.getPhonenumber())) {
  166. return ResponseVO.fail("手机号码不能为空!");
  167. } else if (!Validator.isMobile(user.getPhonenumber())) {
  168. return ResponseVO.fail("请输入正确的手机号码!");
  169. }
  170. // 加密手机号
  171. sysApprove.setPhonenumber(SM2CryptUtils.encrypt(user.getPhonenumber(), SecretKeyConstants.SERVER_PUBLIC_KEY));
  172. if (StringUtils.isEmpty(user.getNickname()) || StringUtils.isEmpty(user.getNickname().trim())) {
  173. return ResponseVO.fail("姓名不能为空!");
  174. } else {
  175. String nickName = user.getNickname().trim();
  176. if (nickName.length() > 30) {
  177. return ResponseVO.fail("姓名长度不能超过30个字符!");
  178. }
  179. // 加密姓名
  180. sysApprove.setNickname(SM2CryptUtils.encrypt(nickName, SecretKeyConstants.SERVER_PUBLIC_KEY));
  181. }
  182. if (StringUtils.isEmpty(user.getMailbox())) {
  183. return ResponseVO.fail("邮箱不能为空!");
  184. } else if (!Validator.isEmail(user.getMailbox())) {
  185. return ResponseVO.fail("请输入正确的邮箱地址!");
  186. } else if (user.getMailbox().length() > 50) {
  187. return ResponseVO.fail("邮箱长度不能超过50个字符!");
  188. }
  189. // 加密邮箱
  190. sysApprove.setMailbox(SM2CryptUtils.encrypt(user.getMailbox(), SecretKeyConstants.SERVER_PUBLIC_KEY));
  191. if (user.getExpDate()!=null){
  192. // 判断临时账号有效期不能超过30天
  193. Calendar calendar = Calendar.getInstance();
  194. // 将当前日期增加30天
  195. calendar.add(Calendar.DAY_OF_MONTH, 29);
  196. // 获取增加30天后的日期
  197. Date endDate = calendar.getTime();
  198. if (!user.getExpDate().before(endDate)){
  199. return ResponseVO.fail("账号有效期不能超过30天!");
  200. }
  201. sysApprove.setExpDate(user.getExpDate());
  202. }
  203. // 新增时先判断审批表里待审批-新增中是否存在相同账号、身份证
  204. QueryWrapper<SysApprove> wrapper = new QueryWrapper<>();
  205. // 新增操作类型
  206. wrapper.eq("operation", "0");
  207. // 待审批
  208. wrapper.eq("approve_status", "0");
  209. List<SysApprove> sysApproveList = sysApproveService.list(wrapper);
  210. for (SysApprove sysApprove1:sysApproveList){
  211. String approveUsername = sysApprove1.getUsername();
  212. String approveIdcard = SM2CryptUtils.decrypt(sysApprove1.getIdcard(), SecretKeyConstants.SERVER_PRIVATE_KEY);
  213. String approvePhonenumber = SM2CryptUtils.decrypt(sysApprove1.getPhonenumber(), SecretKeyConstants.SERVER_PRIVATE_KEY);
  214. String approveMailbox = SM2CryptUtils.decrypt(sysApprove1.getMailbox(), SecretKeyConstants.SERVER_PRIVATE_KEY);
  215. if (username.equals(approveUsername)){
  216. return ResponseVO.fail("账号"+username + "在待审批,不能再次新增!");
  217. }
  218. if (user.getIdcard().equals(approveIdcard)){
  219. return ResponseVO.fail("身份证"+user.getIdcard() + "在待审批中,不能再次新增!");
  220. }
  221. if (user.getPhonenumber().equals(approvePhonenumber)){
  222. return ResponseVO.fail("手机号码"+user.getPhonenumber() + "在待审批中,不能再次新增!");
  223. }
  224. if (user.getMailbox().equals(approveMailbox)){
  225. return ResponseVO.fail("用户邮箱"+user.getMailbox() + "在待审批中,不能再次新增!");
  226. }
  227. }
  228. List<SysUser> sysUserList = sysUserService.queryAllUserByDecrypt();
  229. for (SysUser sysUser:sysUserList){
  230. if (username.equals(sysUser.getUsername())){
  231. return ResponseVO.fail("账号"+username + "存在,不能再次新增!");
  232. }
  233. if (user.getIdcard().equals(sysUser.getIdcard())){
  234. return ResponseVO.fail("身份证"+user.getIdcard() + "存在,不能再次新增!");
  235. }
  236. if (user.getPhonenumber().equals(sysUser.getPhonenumber())){
  237. return ResponseVO.fail("手机号码"+user.getPhonenumber() + "存在,不能再次新增!");
  238. }
  239. if (user.getMailbox().equals(sysUser.getMailbox())){
  240. return ResponseVO.fail("用户邮箱"+user.getMailbox() + "存在,不能再次新增!");
  241. }
  242. }
  243. sysApprove.setUsertype(user.getUsertype());
  244. sysApprove.setStatus("0");
  245. // 用户新增插入审批表
  246. sysApprove.setModuleName(ApproveConstants.MODULE_NAME_USER);
  247. sysApprove.setOperation(String.valueOf(ApproveOperaterEnum.INSERT.getCode()));
  248. sysApprove.setApproveStatus(String.valueOf(ApproveStatusEnum.DSP.getCode()));
  249. sysApprove.setEntityName("SysUser");
  250. boolean bo = sysApproveService.save(sysApprove);
  251. if (bo) {
  252. return ResponseVO.success("添加用户信息成功,请联系审核管理员进行审核!");
  253. } else {
  254. log.error("添加用户信息失败");
  255. return ResponseVO.fail("添加用户信息失败");
  256. }
  257. } catch (Exception e) {
  258. throw new CustomException("添加用户信息异常", e);
  259. }
  260. }
  261. /**
  262. * 更新用户
  263. *
  264. * @param user 参数
  265. * @return 执行结果
  266. */
  267. @PostMapping(value = "/updateUser")
  268. @AgainVerify
  269. @OperateLog(title = "用户管理", businessType = BusinessType.UPDATE, auditType = AuditType.SYS,operdesc = "修改用户")
  270. @PreAuthorize("@ss.hasPermi('system:user:edit')")
  271. @PreventReplay
  272. public ResponseVO updateUser(@RequestBody SysUser user) throws CustomException {
  273. try {
  274. SysUser existUser = sysUserService.getById(user.getId());
  275. if (existUser == null) {
  276. return ResponseVO.fail("id为空不能修改!");
  277. }
  278. // 获取审批表是否存在此操作
  279. QueryWrapper<SysApprove> wrapper = new QueryWrapper<>();
  280. // 条件:待审批
  281. wrapper.eq("approve_status", ApproveStatusEnum.DSP.getCode());
  282. // 条件:删除操作
  283. wrapper.eq("master_id", user.getId());
  284. // 条件:实体名
  285. wrapper.eq("entity_name", "SysUser");
  286. List<SysApprove> list = sysApproveService.list(wrapper);
  287. if (list.size() > 0) {
  288. return ResponseVO.fail("此记录存在未审批的操作,不能进行修改!");
  289. }
  290. String username = "";
  291. SysApprove sysApprove = new SysApprove();
  292. if (StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getUsername().trim())) {
  293. return ResponseVO.fail("用户账号不能为空!");
  294. } else{
  295. username = user.getUsername().trim();
  296. if (username.contains(" ")){
  297. return ResponseVO.fail("账号中不能含有空格!");
  298. }
  299. String regExp = "^[^0-9][\\w_]{4,19}$";
  300. if (!username.matches(regExp)){
  301. return ResponseVO.fail("用户账号长度必须是5-20位,只能包含字母、数字和下划线,不能数字开头!");
  302. }
  303. sysApprove.setUsername(username);
  304. }
  305. if (!IdcardUtil.isValidCard(user.getIdcard())) {
  306. return ResponseVO.fail("身份证无效!");
  307. }
  308. // sm2加密身份证
  309. sysApprove.setIdcard(SM2CryptUtils.encrypt(user.getIdcard(), SecretKeyConstants.SERVER_PUBLIC_KEY));
  310. if (StringUtils.isEmpty(user.getMailbox())) {
  311. return ResponseVO.fail("邮箱不能为空!");
  312. } else if (!Validator.isEmail(user.getMailbox())) {
  313. return ResponseVO.fail("请输入正确的邮箱地址!");
  314. } else if (user.getMailbox().length() > 50) {
  315. return ResponseVO.fail("邮箱长度不能超过50个字符!");
  316. }
  317. // 加密邮箱
  318. sysApprove.setMailbox(SM2CryptUtils.encrypt(user.getMailbox(), SecretKeyConstants.SERVER_PUBLIC_KEY));
  319. if (StringUtils.isEmpty(user.getPhonenumber())) {
  320. return ResponseVO.fail("手机号码不能为空!");
  321. } else if (!Validator.isMobile(user.getPhonenumber())) {
  322. return ResponseVO.fail("请输入正确的手机号码!");
  323. }
  324. // 加密手机号
  325. sysApprove.setPhonenumber(SM2CryptUtils.encrypt(user.getPhonenumber(), SecretKeyConstants.SERVER_PUBLIC_KEY));
  326. if (StringUtils.isEmpty(user.getNickname()) || StringUtils.isEmpty(user.getNickname().trim())) {
  327. return ResponseVO.fail("姓名不能为空!");
  328. } else {
  329. String nickName = user.getNickname().trim();
  330. if (nickName.length() > 30) {
  331. return ResponseVO.fail("姓名长度不能超过30个字符!");
  332. }
  333. // 加密姓名
  334. sysApprove.setNickname(SM2CryptUtils.encrypt(nickName, SecretKeyConstants.SERVER_PUBLIC_KEY));
  335. }
  336. // 新增时先判断审批表里待审批
  337. QueryWrapper<SysApprove> wrapper1 = new QueryWrapper<>();
  338. // 新增操作类型
  339. wrapper1.eq("operation", "0");
  340. // 待审批
  341. wrapper1.eq("approve_status", "0");
  342. List<SysApprove> sysApproveList1 = sysApproveService.list(wrapper1);
  343. for (SysApprove sysApprove1:sysApproveList1){
  344. String approvePhonenumber = SM2CryptUtils.decrypt(sysApprove1.getPhonenumber(), SecretKeyConstants.SERVER_PRIVATE_KEY);
  345. String approveMailbox = SM2CryptUtils.decrypt(sysApprove1.getMailbox(), SecretKeyConstants.SERVER_PRIVATE_KEY);
  346. if (user.getPhonenumber().equals(approvePhonenumber)){
  347. return ResponseVO.fail("手机号码"+user.getPhonenumber() + "在待审批新增操作中存在,不能修改!");
  348. }
  349. if (user.getMailbox().equals(approveMailbox)){
  350. return ResponseVO.fail("用户邮箱"+user.getMailbox() + "在待审批新增操作中存在,不能修改!");
  351. }
  352. }
  353. List<SysUser> sysUserList = sysUserService.queryAllUserByDecrypt();
  354. for (SysUser sysUser:sysUserList){
  355. if (user.getPhonenumber().equals(sysUser.getPhonenumber()) && user.getId().longValue()!=sysUser.getId().longValue()){
  356. return ResponseVO.fail("手机号码"+user.getPhonenumber() + "存在,不能修改!");
  357. }
  358. if (user.getMailbox().equals(sysUser.getMailbox()) && user.getId().longValue()!=sysUser.getId().longValue()){
  359. return ResponseVO.fail("用户邮箱"+user.getMailbox() + "存在,不能修改!");
  360. }
  361. }
  362. if (user.getExpDate()==null) {
  363. user.setExpDate(null);
  364. }
  365. else{
  366. // 判断临时账号有效期不能超过30天
  367. Calendar calendar = Calendar.getInstance();
  368. // 将当前日期增加30天
  369. calendar.add(Calendar.DAY_OF_MONTH, 29);
  370. // 获取增加30天后的日期
  371. Date endDate = calendar.getTime();
  372. if (!user.getExpDate().before(endDate)){
  373. return ResponseVO.fail("账号有效期不能超过30天!");
  374. }
  375. sysApprove.setExpDate(user.getExpDate());
  376. }
  377. sysApprove.setUsertype(user.getUsertype());
  378. sysApprove.setStatus(user.getStatus());
  379. sysApprove.setMasterId(String.valueOf(user.getId()));
  380. // 将修改前信息存入
  381. sysApprove.setParameterContent(JSONUtil.parse(existUser).toString());
  382. // 用户新增插入审批表
  383. sysApprove.setModuleName(ApproveConstants.MODULE_NAME_USER);
  384. sysApprove.setOperation(String.valueOf(ApproveOperaterEnum.UPDATE.getCode()));
  385. sysApprove.setApproveStatus(String.valueOf(ApproveStatusEnum.DSP.getCode()));
  386. sysApprove.setEntityName("SysUser");
  387. // 更改用户表signstr为1
  388. boolean bo = sysUserService.addUserByApprove(user.getId(),sysApprove);
  389. if (bo) {
  390. return ResponseVO.success("修改用户信息成功,等待审核管理员进行审核!");
  391. } else {
  392. log.error("修改用户信息失败");
  393. return ResponseVO.fail("修改用户信息失败");
  394. }
  395. } catch (Exception e) {
  396. throw new CustomException("修改用户信息异常", e);
  397. }
  398. }
  399. /**
  400. * 初始密码发送邮箱
  401. */
  402. @PostMapping(value = "/resetPassword")
  403. @AgainVerify
  404. @OperateLog(title = "用户管理", businessType = BusinessType.RESETPWD, auditType = AuditType.SYS,operdesc = "初始/重置密码发送邮箱")
  405. @PreAuthorize("@ss.hasPermi('system:user:send')")
  406. @PreventReplay
  407. public ResponseVO resetPassword(String id) {
  408. if (StringUtils.isEmpty(id)) {
  409. return ResponseVO.fail("重置密码缺失id!");
  410. }
  411. // 获取审批表是否存在此操作
  412. QueryWrapper<SysApprove> wrapper = new QueryWrapper<>();
  413. // 条件:待审批
  414. wrapper.eq("approve_status", ApproveStatusEnum.DSP.getCode());
  415. // 条件:删除操作
  416. wrapper.eq("master_id", id);
  417. // 条件:实体名
  418. wrapper.eq("entity_name", "SysUser");
  419. List<SysApprove> list = sysApproveService.list(wrapper);
  420. if (list.size() > 0) {
  421. return ResponseVO.fail("此记录存在未审批的操作,不能初始/重置密码!");
  422. }
  423. // id获取用户
  424. SysUser sysUser = sysUserService.getById(id);
  425. if (sysUser == null) {
  426. return ResponseVO.fail("重置密码失败!");
  427. }
  428. SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
  429. // 生成8位初始密码
  430. String randomPwd = RandomRulePwd.createPwd(sysPolicy.getPasswordRule(),8);
  431. log.info("发送邮箱初始/重置密码\r\n" +
  432. "↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓邮箱内容↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓"+
  433. "\r\n 账号:"+sysUser.getUsername()+" 初始/重置密码:"+randomPwd+" \r\n" +
  434. "↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑邮箱内容↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
  435. // log.info("发送邮箱重置密码后台输出======> 用户名:"+sysUser.getUsername()+" 初始/重置密码:"+randomPwd);
  436. // SM3加密密码
  437. String sm3password = SmUtil.sm3(randomPwd).toUpperCase();
  438. // 再对密码sm2
  439. String sm2password = SM2CryptUtils.encrypt(sm3password,SecretKeyConstants.SERVER_PUBLIC_KEY);
  440. boolean bo = sysUserService.resetPassword(Integer.parseInt(id), sm2password,sm3password,sm2password);
  441. if (!bo) {
  442. return ResponseVO.fail("密码生成失败!");
  443. }
  444. try {
  445. // String[] mailArray = {AesUtils.decryptStr(sysUser.getMailbox())};
  446. // sendMailUtil.executeSendMail(mailArray, "系统登录密码", "密码:" + randomPwd);
  447. } catch (Exception e) {
  448. // log.error("用户名:"+sysUser.getUsername()+",邮箱验证码发送失败!",e);
  449. return ResponseVO.fail("发送邮箱失败");
  450. }
  451. return ResponseVO.success();
  452. }
  453. /**
  454. * 删除用户信息
  455. */
  456. @PostMapping(value = "/delUser")
  457. @AgainVerify
  458. @OperateLog(title = "用户管理", businessType = BusinessType.DELETE, auditType = AuditType.SYS,operdesc = "删除用户")
  459. @PreAuthorize("@ss.hasPermi('system:user:remove')")
  460. @PreventReplay
  461. public ResponseVO delete(String id) throws CustomException {
  462. try {
  463. if (StringUtils.isEmpty(id)) {
  464. return ResponseVO.fail("id不能为空!");
  465. }
  466. // id获取用户
  467. SysUser sysUser = sysUserService.getById(id);
  468. if (sysUser == null) {
  469. return ResponseVO.fail("id为空不能删除用户!");
  470. }
  471. // 获取审批表是否存在此操作
  472. QueryWrapper<SysApprove> wrapper = new QueryWrapper<>();
  473. // 条件:待审批
  474. wrapper.eq("approve_status", ApproveStatusEnum.DSP.getCode());
  475. // 条件:删除操作
  476. wrapper.eq("master_id", id);
  477. // 条件:实体名
  478. wrapper.eq("entity_name", "SysUser");
  479. List<SysApprove> list = sysApproveService.list(wrapper);
  480. if (list.size() > 0) {
  481. return ResponseVO.fail("此记录存在未审批的操作,不能进行删除!");
  482. }
  483. boolean bo = sysUserService.removeUserById(sysUser);
  484. if (bo) {
  485. return ResponseVO.success("【删除用户】已进入审批,审批通过后实现真正删除!");
  486. } else {
  487. log.error("删除用户信息失败");
  488. return ResponseVO.fail("删除用户信息失败");
  489. }
  490. } catch (Exception e) {
  491. throw new CustomException("删除用户信息异常", e);
  492. }
  493. }
  494. /**
  495. * 修改密码
  496. */
  497. @PostMapping(value = "/updatePassword")
  498. @OperateLog(title = "用户管理", businessType = BusinessType.PWDUPDATE, auditType = AuditType.SYS,operdesc = "修改个人密码")
  499. @PreventReplay
  500. public ResponseVO updatePassword(String id, String oldPassword, String newPassword, String confirmPassword) throws CustomException {
  501. try {
  502. oldPassword = oldPassword.trim();
  503. newPassword = newPassword.trim();
  504. confirmPassword = confirmPassword.trim();
  505. if (StringUtils.isEmpty(id)) {
  506. return ResponseVO.fail("修改密码缺失id!");
  507. }
  508. // 获取审批表是否存在此操作
  509. QueryWrapper<SysApprove> wrapper = new QueryWrapper<>();
  510. // 条件:待审批
  511. wrapper.eq("approve_status", ApproveStatusEnum.DSP.getCode());
  512. // 条件:删除操作
  513. wrapper.eq("master_id", id);
  514. // 条件:实体名
  515. wrapper.eq("entity_name", "SysUser");
  516. List<SysApprove> list = sysApproveService.list(wrapper);
  517. if (list.size() > 0) {
  518. return ResponseVO.fail("此记录存在未审批的操作,不能进行修改!");
  519. }
  520. // id获取用户
  521. SysUser sysUser = sysUserService.getById(id);
  522. if (sysUser == null) {
  523. return ResponseVO.fail("找不到用户,修改密码失败!");
  524. }
  525. if (newPassword == null) {
  526. // 返回密码长度问题
  527. return ResponseVO.fail("密码长度需要8~20位之间!");
  528. }
  529. if (StringUtils.isEmpty(oldPassword)) {
  530. return ResponseVO.fail("旧密码不能为空!");
  531. }
  532. if (StringUtils.isEmpty(newPassword)) {
  533. return ResponseVO.fail("新密码不能为空!");
  534. } else if (StringUtils.isEmpty(confirmPassword)) {
  535. return ResponseVO.fail("确认密码不能为空!");
  536. } else if (!newPassword.equals(confirmPassword)) {
  537. return ResponseVO.fail("新密码两次输入的密码不一致!");
  538. }
  539. if (newPassword.contains(" ")){
  540. return ResponseVO.fail("新密码中不能含有空格!");
  541. }
  542. // 对新密码规则验证
  543. if (newPassword.contains(sysUser.getUsername())) {
  544. return ResponseVO.fail("密码不能含有账号!");
  545. }
  546. String oldpwd = SM2CryptUtils.decrypt(sysUser.getPassword(),SecretKeyConstants.SERVER_PRIVATE_KEY);
  547. if (SmUtil.sm3(newPassword).toUpperCase().equals(oldpwd)) {
  548. return ResponseVO.fail("新密码不能与上次密码相同!");
  549. }
  550. SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
  551. String ruleInfo = PasswordRuleUtil.ruleRegx(sysPolicy.getPasswordRule(),newPassword);
  552. if (!"true".equals(ruleInfo)){
  553. return ResponseVO.fail(ruleInfo);
  554. }
  555. // 验证旧密码是否正确
  556. if (!oldpwd.equals(SmUtil.sm3(oldPassword).toUpperCase())){
  557. return ResponseVO.fail("旧密码不正确!");
  558. }
  559. // 新密码加密
  560. String sm3newpwd = SmUtil.sm3(newPassword).toUpperCase();
  561. // 再次sm2加密
  562. String sm2password = SM2CryptUtils.encrypt(sm3newpwd,SecretKeyConstants.SERVER_PUBLIC_KEY);
  563. sysUser.setPassword(sm2password);
  564. sysUser.setCheckPassword(sm3newpwd);
  565. sysUser.setBakPassword(sm2password);
  566. sysUser.setLastUpdatePwdTime(new Date());
  567. boolean bo = sysUserService.updateById(sysUser);
  568. if (!bo) {
  569. return ResponseVO.fail("修改密码失败!");
  570. }
  571. return ResponseVO.success();
  572. } catch (Exception e) {
  573. throw new CustomException("修改密码异常", e);
  574. }
  575. }
  576. /**
  577. * 解锁用户信息
  578. */
  579. @PostMapping(value = "/relockUser")
  580. @AgainVerify
  581. @OperateLog(title = "用户管理", businessType = BusinessType.UNLOCK, auditType = AuditType.SYS,operdesc = "用户账号解锁")
  582. @PreAuthorize("@ss.hasPermi('system:user:relock')")
  583. @PreventReplay
  584. public ResponseVO relockUser(String id,String expDate) throws CustomException {
  585. try {
  586. if (StringUtils.isEmpty(id)) {
  587. return ResponseVO.fail("id不能为空!");
  588. }
  589. // 获取审批表是否存在此操作
  590. QueryWrapper<SysApprove> wrapper = new QueryWrapper<>();
  591. // 条件:待审批
  592. wrapper.eq("approve_status", ApproveStatusEnum.DSP.getCode());
  593. // 条件:删除操作
  594. wrapper.eq("master_id", id);
  595. // 条件:实体名
  596. wrapper.eq("entity_name", "SysUser");
  597. List<SysApprove> list = sysApproveService.list(wrapper);
  598. if (list.size() > 0) {
  599. return ResponseVO.fail("此记录存在未审批的操作,不能进行解锁!");
  600. }
  601. // id获取用户
  602. SysUser sysUser = sysUserService.getById(id);
  603. if (sysUser == null) {
  604. return ResponseVO.fail("不能解锁用户!");
  605. }
  606. if (!"1".equals(sysUser.getStatus())) {
  607. return ResponseVO.fail("只能对【锁定】状态的进行解锁!");
  608. }
  609. if (StringUtils.isNotBlank(expDate)){
  610. Date eDate = DateUtil.parseDate(expDate);
  611. // 判断临时账号有效期不能超过30天
  612. Calendar calendar = Calendar.getInstance();
  613. // 将当前日期增加30天
  614. calendar.add(Calendar.DAY_OF_MONTH, 29);
  615. // 获取增加30天后的日期
  616. Date endDate = calendar.getTime();
  617. if (!eDate.before(endDate)){
  618. return ResponseVO.fail("账号截止日期不能超过30天!");
  619. }
  620. }
  621. boolean bo = sysUserService.relockUserById(Integer.parseInt(id),expDate);
  622. if (bo) {
  623. return ResponseVO.success("解锁成功");
  624. } else {
  625. log.error("解锁失败");
  626. return ResponseVO.fail("解锁失败");
  627. }
  628. } catch (Exception e) {
  629. throw new CustomException("解锁异常", e);
  630. }
  631. }
  632. /**
  633. * 用户授权角色
  634. */
  635. @PostMapping("/authRole")
  636. @AgainVerify
  637. @PreAuthorize("@ss.hasPermi('system:user:role')")
  638. @OperateLog(title = "用户管理", businessType = BusinessType.GRANT, auditType = AuditType.SYS,operdesc = "用户授权角色")
  639. @PreventReplay
  640. public ResponseVO authRole(String userId, String roleId) throws CustomException {
  641. try {
  642. if (StringUtils.isEmpty(userId)) {
  643. return ResponseVO.fail("id不能为空!");
  644. }
  645. // id获取用户
  646. SysUser sysUser = sysUserService.getById(userId);
  647. if (sysUser == null) {
  648. return ResponseVO.fail("id为空不能授权用户!");
  649. }
  650. // id获取用户
  651. SysRole sysRole = sysRoleService.getById(roleId);
  652. if (sysRole == null) {
  653. return ResponseVO.fail("角色id为空不能授权用户!");
  654. }
  655. // 获取审批表是否存在此操作
  656. QueryWrapper<SysApprove> wrapper = new QueryWrapper<>();
  657. // 条件:待审批
  658. wrapper.eq("approve_status", ApproveStatusEnum.DSP.getCode());
  659. // 条件:删除操作
  660. wrapper.eq("master_id", userId);
  661. // 条件:实体名
  662. wrapper.eq("entity_name", "SysUser");
  663. List<SysApprove> list = sysApproveService.list(wrapper);
  664. if (list.size() > 0) {
  665. return ResponseVO.fail("此记录存在未审批的操作,不能进行修改!");
  666. }
  667. SysApprove sysApprove = new SysApprove();
  668. sysApprove.setMasterId(userId);
  669. sysApprove.setUsername(sysUser.getUsername());
  670. sysApprove.setRoleId(roleId);
  671. sysApprove.setParameterContent("授权用户账号:"+sysUser.getUsername()+",分配角色:"+sysRole.getRoleName());
  672. // 用户新增插入审批表
  673. sysApprove.setModuleName(ApproveConstants.MODULE_NAME_USER);
  674. sysApprove.setOperation(String.valueOf(ApproveOperaterEnum.APPROVE.getCode()));
  675. sysApprove.setApproveStatus(String.valueOf(ApproveStatusEnum.DSP.getCode()));
  676. sysApprove.setEntityName("SysUser");
  677. // 更改用户表signstr为1
  678. boolean bo = sysUserService.addUserByApprove(Long.parseLong(userId),sysApprove);
  679. if (bo) {
  680. return ResponseVO.success("授权用户信息成功,等待审核管理员进行审核!");
  681. } else {
  682. log.error("授权用户信息失败");
  683. return ResponseVO.fail("授权用户信息失败");
  684. }
  685. } catch (Exception e) {
  686. throw new CustomException("分配角色异常", e);
  687. }
  688. // return ResponseVO.success("分配角色成功");
  689. }
  690. /**
  691. * 根据用户ID获取角色
  692. *
  693. * @param userId
  694. * @return
  695. */
  696. @GetMapping("/getUserRole")
  697. @PreventReplay
  698. public ResponseVO getUserRole(Long userId) throws CustomException {
  699. try {
  700. if (userId == null) {
  701. return ResponseVO.fail("用户id不能为空!");
  702. }
  703. QueryWrapper<SysUserRole> wrapper = new QueryWrapper<>();
  704. wrapper.eq("user_id", userId);
  705. SysUserRole sysUserRole = sysUserRoleService.getOne(wrapper);
  706. return ResponseVO.success(sysUserRole);
  707. } catch (Exception e) {
  708. throw new CustomException("获取用户角色异常", e);
  709. }
  710. }
  711. /**
  712. * 检测用户密码是否符合规则
  713. *
  714. * @return 用户信息
  715. */
  716. @GetMapping(value = "/validatePasswordRule")
  717. public ResponseVO validatePasswordRule() throws CustomException {
  718. try {
  719. SysUser sysUser = SecurityContextUtil.getSysUser();
  720. String upwd = CacheConstants.usernamePasswordMap.get(sysUser.getUsername());
  721. SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
  722. String ruleInfo = PasswordRuleUtil.ruleRegx(sysPolicy.getPasswordRule(),upwd);
  723. return ResponseVO.success(ruleInfo);
  724. } catch (Exception e) {
  725. throw new CustomException("检测用户密码是否符合规则异常", e);
  726. }
  727. }
  728. /**
  729. * 注销用户信息
  730. */
  731. @PostMapping(value = "/logOffUser")
  732. @AgainVerify
  733. @OperateLog(title = "用户管理", businessType = BusinessType.DELETE, auditType = AuditType.SYS,operdesc = "注销用户账号")
  734. @PreAuthorize("@ss.hasPermi('system:user:logoff')")
  735. @PreventReplay
  736. public ResponseVO logOffUser(String id) throws CustomException {
  737. try {
  738. if (StringUtils.isEmpty(id)) {
  739. return ResponseVO.fail("id不能为空!");
  740. }
  741. // id获取用户
  742. SysUser sysUser = sysUserService.getById(id);
  743. if (sysUser == null) {
  744. return ResponseVO.fail("id为空不能删除用户!");
  745. }
  746. // 获取审批表是否存在此操作
  747. QueryWrapper<SysApprove> wrapper = new QueryWrapper<>();
  748. // 条件:待审批
  749. wrapper.eq("approve_status", ApproveStatusEnum.DSP.getCode());
  750. // 条件:删除操作
  751. wrapper.eq("master_id", id);
  752. // 条件:实体名
  753. wrapper.eq("entity_name", "SysUser");
  754. List<SysApprove> list = sysApproveService.list(wrapper);
  755. if (list.size() > 0) {
  756. return ResponseVO.fail("此记录存在未审批的操作,不能注销!");
  757. }
  758. // 根据id改变状态为注销,提交到审核
  759. SysApprove sysApprove = new SysApprove();
  760. sysApprove.setUsername(sysUser.getUsername());
  761. sysApprove.setNickname(sysUser.getNickname());
  762. sysApprove.setIdcard(sysUser.getIdcard());
  763. sysApprove.setMailbox(sysUser.getMailbox());
  764. sysApprove.setPhonenumber(sysUser.getPhonenumber());
  765. sysApprove.setUsertype(sysUser.getUsertype());
  766. sysApprove.setStatus(sysUser.getStatus());
  767. sysApprove.setMasterId(String.valueOf(sysUser.getId()));
  768. sysApprove.setParameterContent(JSONUtil.parse(sysUser).toString());
  769. // 用户新增插入审批表
  770. sysApprove.setModuleName(ApproveConstants.MODULE_NAME_USER);
  771. sysApprove.setOperation(String.valueOf(ApproveOperaterEnum.DELETE.getCode()));
  772. sysApprove.setApproveStatus(String.valueOf(ApproveStatusEnum.DSP.getCode()));
  773. sysApprove.setEntityName("SysUser");
  774. boolean bo = sysUserService.addUserByApprove(Long.parseLong(id),sysApprove);
  775. if (bo) {
  776. return ResponseVO.success("注销用户成功,等待审核管理员进行审核!");
  777. } else {
  778. log.error("注销用户失败");
  779. return ResponseVO.fail("注销用户失败");
  780. }
  781. } catch (Exception e) {
  782. throw new CustomException("注销用户异常", e);
  783. }
  784. }
  785. /**
  786. * 获取用户分页信息(查询在线用户使用 其中屏蔽了状态为注销的用户)
  787. *
  788. * @return 用户信息
  789. */
  790. @GetMapping(value = "/getUserByHealthy")
  791. @PreAuthorize("@ss.hasPermi('monitor:onLine:list')")
  792. @OperateLog(title = "在线用户管理", businessType = BusinessType.QUERY, auditType = AuditType.SYS,operdesc = "在线用户查询")
  793. @PreventReplay
  794. public ResponseVO getUserByHealthy(String currentPage, String pageSize, String onLineStatus) throws CustomException {
  795. try {
  796. Integer cp;
  797. if (StringUtils.isNotEmpty(currentPage)) {
  798. if (NumberUtil.isInteger(currentPage)) {
  799. cp = Integer.parseInt(currentPage);
  800. } else {
  801. return ResponseVO.fail("currentPage不是整数!");
  802. }
  803. } else {
  804. return ResponseVO.fail("currentPage不能是空!");
  805. }
  806. Integer ps;
  807. if (StringUtils.isNotEmpty(pageSize)) {
  808. if (NumberUtil.isInteger(pageSize)) {
  809. ps = Integer.parseInt(pageSize);
  810. } else {
  811. return ResponseVO.fail("pageSize不是整数!");
  812. }
  813. } else {
  814. return ResponseVO.fail("pageSize不能是空!");
  815. }
  816. QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
  817. wrapper.ne("status", "2");
  818. if (StringUtils.isNotEmpty(onLineStatus)) {
  819. wrapper.eq("online_status", onLineStatus);
  820. }
  821. Page<SysUser> result = sysUserService.page(new Page<>(cp, ps), wrapper);
  822. return ResponseVO.success(result);
  823. } catch (Exception e) {
  824. throw new CustomException("获取用户异常", e);
  825. }
  826. }
  827. /**
  828. * 验证心跳是否存活
  829. */
  830. @GetMapping(value = "/establishHeart")
  831. public ResponseVO establishHeart(HttpServletRequest request, HttpServletResponse response) throws CustomException {
  832. try {
  833. return ResponseVO.success();
  834. } catch (Exception e) {
  835. throw new CustomException("建立心跳异常", e);
  836. }
  837. }
  838. }