PassportController.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package com.care.client.controller;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.care.client.service.PassportService;
  4. import com.care.client.vo.MemberInitParams;
  5. import com.care.common.entity.CareMemberInfo;
  6. import com.care.common.service.CareMemberInfoService;
  7. import com.care.common.service.SmsSendService;
  8. import com.care.common.util.CheckUtils;
  9. import com.care.common.util.JwtUtils;
  10. import com.care.common.util.Result;
  11. import com.google.common.cache.Cache;
  12. import com.google.common.cache.CacheBuilder;
  13. import io.swagger.annotations.*;
  14. import org.apache.commons.codec.digest.DigestUtils;
  15. import org.apache.commons.lang3.StringUtils;
  16. import org.springframework.web.bind.annotation.*;
  17. import javax.annotation.Resource;
  18. import java.util.HashMap;
  19. import java.util.Map;
  20. import java.util.Random;
  21. import java.util.concurrent.TimeUnit;
  22. @Api(tags = "登录")
  23. @RestController
  24. @RequestMapping("/pinanbao")
  25. public class PassportController {
  26. @Resource
  27. private PassportService passportService;
  28. @Resource
  29. private SmsSendService smsSendService;
  30. @Resource
  31. private CareMemberInfoService careMemberInfoService;
  32. public final Cache<String, String> smsTimeoutCache = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build();
  33. @ApiOperation(value = "小程序登录", notes = "小程序授权登录,微信登录传参:loginType=wx,code; 密码登录:loginType=pwd, phone, password")
  34. @ApiParam(name = "params", value = "登录参数")
  35. @PostMapping("login")
  36. public Result<Object> login(@RequestBody MemberInitParams params) {
  37. CheckUtils.valueIsNull(params, "loginType");
  38. if ("wx".equalsIgnoreCase(params.getLoginType())) {
  39. CheckUtils.valueIsNull(params, "code");
  40. } else if ("pwd".equalsIgnoreCase(params.getLoginType())) {
  41. if (StringUtils.isBlank(params.getPhone())) {
  42. return Result.error("请输入手机号码");
  43. }
  44. if (StringUtils.isBlank(params.getPassword())) {
  45. return Result.error("请输入密码");
  46. }
  47. }
  48. return passportService.login(params);
  49. }
  50. @ApiOperation(value = "小程序登录", notes = "微信登录解密手机号")
  51. @PostMapping("decodePhoneNumber")
  52. public Result<Object> decodePhoneNumber(@RequestBody Map<String,String> body) {
  53. return passportService.decodePhoneNumber(body.get("code"),body.get("encryptedData"),body.get("iv"));
  54. }
  55. @ApiOperation(value = "新用户注册", notes = "新用户注册")
  56. @GetMapping("registerPhone")
  57. @ApiImplicitParams(value = {
  58. @ApiImplicitParam(paramType = "query", name = "phone", value = "电话号码"),
  59. @ApiImplicitParam(paramType = "query", name = "vcode", value = "验证码"),
  60. @ApiImplicitParam(paramType = "query", name = "password", value = "密码 "),
  61. })
  62. public Result<Object> registerPhone(@RequestHeader(value = "token") String token,
  63. @RequestParam(value = "phone", required = true) String phone,
  64. @RequestParam(value = "vcode", required = true) String vcode,
  65. @RequestParam(value = "password", required = true) String password) {
  66. if (StringUtils.isBlank(phone)) {
  67. return Result.error("请输入手机号");
  68. }
  69. if(careMemberInfoService.detailByPhone(phone) != null){
  70. return Result.error("该账号已经注册");
  71. }
  72. if (!StringUtils.equalsIgnoreCase(vcode, smsTimeoutCache.getIfPresent(phone))) {
  73. return Result.error("请输入正确的验证码");
  74. }
  75. if (StringUtils.isBlank(password)) {
  76. return Result.error("请输入密码");
  77. }
  78. if (StringUtils.isNotBlank(phone) && StringUtils.isNotBlank(password)) {
  79. CareMemberInfo careMemberInfo = new CareMemberInfo();
  80. careMemberInfo.setPhone(phone);
  81. careMemberInfo.setPassword(DigestUtils.md5Hex(password));
  82. careMemberInfo.setCreateTime(DateUtil.date());
  83. boolean flag = careMemberInfoService.save(careMemberInfo);
  84. if (flag) {
  85. return Result.success();
  86. }
  87. }
  88. return Result.error("注册失败");
  89. }
  90. @ApiOperation(value = " 获取验证码", notes = "获取验证码")
  91. @GetMapping("getVCode")
  92. @ApiImplicitParams(value = {
  93. @ApiImplicitParam(paramType = "query", name = "phone", value = "电话号码"),
  94. @ApiImplicitParam(paramType = "query", name = "type", value = "类型:1手机号注册,2密码重置,3修改注册手机号"),
  95. })
  96. public Result<String> getVCode(@RequestParam(value = "phone", required = true) String phone,
  97. @RequestParam(value = "type", required = true) String type) {
  98. String vcode = String.format("%04d",new Random().nextInt(9999));
  99. boolean flag = false;
  100. if("1".equals(type)){
  101. if(careMemberInfoService.detailByPhone(phone) != null){
  102. return Result.error("该手机号已经注册");
  103. }
  104. flag = smsSendService.sendSmsCode4RegisterPhone(phone, vcode);
  105. } else if("2".equals(type)){
  106. flag = smsSendService.sendSmsCode4ModifyPassword(phone, vcode);
  107. } else if("3".equals(type)){
  108. flag = smsSendService.sendSmsCode4ModifyPhone(phone, vcode);
  109. }
  110. if (flag) {
  111. smsTimeoutCache.put(phone, vcode);
  112. return Result.success();
  113. } else {
  114. return Result.error("获取验证码失败");
  115. }
  116. }
  117. @ApiOperation(value = "校验验证码", notes = "校验验证码")
  118. @GetMapping("checkVCode")
  119. @ApiImplicitParams(value = {
  120. @ApiImplicitParam(paramType = "query", name = "phone", value = "电话号码"),
  121. })
  122. public Result<String> checkVCode(@RequestParam(value = "phone", required = true) String phone,
  123. @RequestParam(value = "vcode", required = true) String vcode) {
  124. if(StringUtils.equalsIgnoreCase(vcode, smsTimeoutCache.getIfPresent(phone))){
  125. return Result.success();
  126. } else {
  127. return Result.error("请输入正确的验证码");
  128. }
  129. }
  130. @ApiOperation(value = "设置新密码", notes = "设置新密码, 传值:手机号,密码,确认密码,验证码")
  131. @ApiParam(name = "params", value = "登录参数")
  132. @PostMapping("changePwd")
  133. public Result<Object> changePwd(@RequestBody MemberInitParams params) {
  134. if (StringUtils.isBlank(params.getPhone())) {
  135. return Result.error("手机号码不能为空");
  136. }
  137. if (StringUtils.isBlank(params.getPassword())) {
  138. return Result.error("请输入密码");
  139. }
  140. if (StringUtils.isBlank(params.getPasswordAgain())) {
  141. return Result.error("请再次输入密码");
  142. }
  143. if (!params.getPassword().equals(params.getPasswordAgain())) {
  144. return Result.error("两次输入密码不一致");
  145. }
  146. if (StringUtils.isBlank(params.getVcode())) {
  147. return Result.error("验证码不能为空");
  148. }
  149. if (!StringUtils.equalsIgnoreCase(params.getVcode(), smsTimeoutCache.getIfPresent(params.getPhone()))) {
  150. return Result.error("验证码无效");
  151. }
  152. CareMemberInfo careMemberInfo = careMemberInfoService.detailByPhone(params.getPhone());
  153. if (careMemberInfo == null) {
  154. return Result.error("该手机号未注册");
  155. }
  156. boolean flag = passportService.changePwd(params.getPassword(), careMemberInfo.getId());
  157. if (flag) {
  158. return Result.success();
  159. }
  160. return Result.error("设置新密码失败");
  161. }
  162. @ApiOperation(value = "小程序登出", notes = "小程序登出")
  163. @PostMapping("logout")
  164. public Result<Object> logout(@RequestHeader String token) {
  165. passportService.logout(token);
  166. return Result.success();
  167. }
  168. }