LoginController.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package com.dtb.portal.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.dtb.portal.config.interceptor.LoginClassAnnotation;
  4. import com.dtb.portal.controller.view.RestResponse;
  5. import com.dtb.portal.entity.SysUser;
  6. import com.dtb.portal.service.impl.SysUserServiceImpl;
  7. import com.dtb.portal.util.WxPhoneNumberUtils;
  8. import io.swagger.annotations.*;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.beans.factory.annotation.Value;
  12. import org.springframework.data.redis.core.RedisTemplate;
  13. import org.springframework.web.bind.annotation.*;
  14. import javax.servlet.http.HttpServletRequest;
  15. @Slf4j
  16. @RestController
  17. @Api(tags = {"登录控制器"}, value = "LoginController")
  18. @LoginClassAnnotation
  19. public class LoginController {
  20. @Autowired
  21. private RedisTemplate<String, String> redisTemplate;
  22. @Autowired
  23. private SysUserServiceImpl userService;
  24. @ApiOperation("登录")
  25. @GetMapping("/login")
  26. @ApiImplicitParams({
  27. @ApiImplicitParam(name = "accountName", required = true, value = "用户名"),
  28. @ApiImplicitParam(name = "password", required = true, value = "密码"),
  29. })
  30. public RestResponse<SysUser> login(@RequestParam(name = "accountName", required = true) String accountName,
  31. @RequestParam(name = "password", required = false) String password, HttpServletRequest request) {
  32. SysUser sysUser = userService.login(accountName, password);
  33. return RestResponse.ok(sysUser);
  34. }
  35. @ApiOperation("登出")
  36. @GetMapping("/logout")
  37. public RestResponse<?> logout(HttpServletRequest request) {
  38. return RestResponse.ok();
  39. }
  40. /* @ApiOperation("生成验证码")
  41. @GetMapping("generateCode")
  42. RestResponse<Map<String, Object>> getCodeImage() {
  43. return RestResponse.ok(getRandomCodeImage());
  44. }*/
  45. @ApiOperation(value = "APP微信登录")
  46. @RequestMapping(value = "loginByWxApp", method = RequestMethod.GET)
  47. @ApiImplicitParams({
  48. @ApiImplicitParam(name = "code", required = true, value = "微信登录code"),
  49. @ApiImplicitParam(name = "avatarUrl", required = false, value = "头像URL"),
  50. @ApiImplicitParam(name = "nickName", required = false, value = "昵称")
  51. })
  52. public RestResponse<SysUser> loginByWxApp(
  53. @RequestParam(value = "code", required = true) String code,
  54. @RequestParam(value = "avatarUrl", required = false) String avatarUrl,
  55. @RequestParam(value = "nickName", required = false) String nickName) {
  56. log.info("收到APP微信登录请求 - code: {}, nickName: {}", code, nickName);
  57. try {
  58. SysUser sysUser = userService.loginByWxApp(code, avatarUrl, nickName);
  59. log.info("APP微信登录成功 - userId: {}, openId: {}", sysUser.getId(), sysUser.getOpenId());
  60. return RestResponse.ok(sysUser);
  61. } catch (Exception e) {
  62. log.error("APP微信登录失败 - code: {}, error: {}", code, e.getMessage());
  63. throw e;
  64. }
  65. }
  66. @ApiOperation(value = "小程序微信登录")
  67. @RequestMapping(value = "loginByWxMini", method = RequestMethod.GET)
  68. @ApiImplicitParams({
  69. @ApiImplicitParam(name = "code", required = true, value = "微信登录code"),
  70. @ApiImplicitParam(name = "phoneCode", required = true, value = "手机号code")
  71. })
  72. public RestResponse<SysUser> loginByWxMini(
  73. @RequestParam(value = "code", required = true) String code,
  74. @RequestParam(value = "phoneCode", required = true) String phoneCode) {
  75. log.info("收到小程序微信登录请求 - code: {}, phoneCode: {}", code, phoneCode);
  76. try {
  77. SysUser sysUser = userService.loginByWxMini(code, phoneCode);
  78. log.info("小程序微信登录成功 - userId: {}, openId: {}", sysUser.getId(), sysUser.getOpenId());
  79. return RestResponse.ok(sysUser);
  80. } catch (Exception e) {
  81. log.error("小程序微信登录失败 - code: {}, phoneCode: {}, error: {}", code, phoneCode, e.getMessage());
  82. throw e;
  83. }
  84. }
  85. @ApiOperation(value = "发送短信验证码")
  86. @ApiImplicitParams({
  87. @ApiImplicitParam(name = "phone", required = true, value = "手机号")
  88. })
  89. @RequestMapping(value = "sendSms", method = RequestMethod.GET)
  90. public RestResponse<Object> sendSms(@RequestParam(value = "phone") String phone) {
  91. userService.sendSms(phone);
  92. return RestResponse.ok();
  93. }
  94. @ApiOperation(value = "短信验证码登录")
  95. @ApiImplicitParams({
  96. @ApiImplicitParam(name = "phone", required = true, value = "手机号"),
  97. @ApiImplicitParam(name = "checkCode", required = true, value = "验证码"),
  98. @ApiImplicitParam(name = "openId", required = false, value = "微信openId")
  99. })
  100. @RequestMapping(value = "loginBySms", method = RequestMethod.GET)
  101. public RestResponse<SysUser> loginBySms(@RequestParam(value = "phone") String phone,
  102. @RequestParam(value = "checkCode") String checkCode,
  103. @RequestParam(value = "openId", required = false) String openId) {
  104. SysUser sysUser = userService.loginBySms(phone, checkCode, openId);
  105. // newUser 字段已在 service 层设置
  106. return RestResponse.ok(sysUser);
  107. }
  108. @ApiOperation(value = "绑定手机号")
  109. @ApiImplicitParams({
  110. @ApiImplicitParam(name = "id", required = true, value = "用户id"),
  111. @ApiImplicitParam(name = "phone", required = true, value = "手机号"),
  112. @ApiImplicitParam(name = "checkCode", required = true, value = "验证码")
  113. })
  114. @RequestMapping(value = "bindPhone", method = RequestMethod.GET)
  115. public RestResponse<SysUser> bindPhone(
  116. @RequestParam(value = "id") String id,
  117. @RequestParam(value = "phone") String phone,
  118. @RequestParam(value = "checkCode") String checkCode) {
  119. SysUser sysUser = userService.bindPhone(id, phone, checkCode);
  120. return RestResponse.ok(sysUser);
  121. }
  122. @RequestMapping(value = "forgotPasswordByPhone", method = RequestMethod.GET)
  123. public RestResponse<SysUser> forgotPasswordByPhone(
  124. @RequestParam(value = "phone") String phone,
  125. @RequestParam(value = "password") String password,
  126. @RequestParam(value = "checkCode") String checkCode) {
  127. SysUser sysUser = userService.forgotPasswordByPhone(phone,password, checkCode);
  128. return RestResponse.ok(sysUser);
  129. }
  130. @RequestMapping(value = "forgotPassword", method = RequestMethod.GET)
  131. public RestResponse<SysUser> forgotPassword(
  132. @RequestParam(value = "phone") String phone) {
  133. SysUser sysUser = userService.forgotPassword(phone);
  134. return RestResponse.ok(sysUser);
  135. }
  136. @ApiOperation(value = "微信手机号登录")
  137. @ApiImplicitParams({
  138. @ApiImplicitParam(name = "phoneCode", required = true, value = "微信获取手机号的code"),
  139. @ApiImplicitParam(name = "loginCode", required = true, value = "微信登录获取openId的code")
  140. })
  141. @RequestMapping(value = "loginByWxPhoneNumber", method = RequestMethod.GET)
  142. public RestResponse<SysUser> loginByWxPhoneNumber(
  143. @RequestParam(value = "phoneCode", required = true) String phoneCode,
  144. @RequestParam(value = "loginCode", required = true) String loginCode) {
  145. log.info("收到微信手机号登录请求 - phoneCode: {}, loginCode: {}", phoneCode, loginCode);
  146. try {
  147. SysUser sysUser = userService.loginByWxPhoneNumber(phoneCode, loginCode);
  148. log.info("微信手机号登录成功 - userId: {}, phone: {}", sysUser.getId(), sysUser.getPhone());
  149. return RestResponse.ok(sysUser);
  150. } catch (Exception e) {
  151. log.error("微信手机号登录失败 - phoneCode: {}, loginCode: {}, 错误: {}", phoneCode, loginCode, e.getMessage());
  152. throw e;
  153. }
  154. }
  155. @ApiOperation(value = "调试微信手机号code")
  156. @ApiImplicitParams({
  157. @ApiImplicitParam(name = "code", required = true, value = "微信获取手机号的code")
  158. })
  159. @RequestMapping(value = "debugWxPhoneCode", method = RequestMethod.GET)
  160. public RestResponse<Object> debugWxPhoneCode(
  161. @RequestParam(value = "code", required = true) String code) {
  162. String appId = userService.getWxAppId();
  163. String appSecret = userService.getWxAppSecret();
  164. JSONObject debugInfo = WxPhoneNumberUtils.debugCode(appId, appSecret, code);
  165. return RestResponse.ok(debugInfo);
  166. }
  167. @ApiOperation(value = "调试APP微信配置")
  168. @RequestMapping(value = "debugWxAppConfig", method = RequestMethod.GET)
  169. public RestResponse<Object> debugWxAppConfig() {
  170. JSONObject debug = new JSONObject();
  171. try {
  172. String appId = userService.getWxAppAppId();
  173. String appSecret = userService.getWxAppAppSecret();
  174. debug.put("appId", appId);
  175. debug.put("appSecret", "***" + appSecret.substring(appSecret.length() - 4)); // 只显示最后4位
  176. // 测试获取access_token
  177. String url = String.format(
  178. "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",
  179. appId, appSecret);
  180. JSONObject result = WxPhoneNumberUtils.httpGet(url);
  181. debug.put("test_result", result);
  182. return RestResponse.ok(debug);
  183. } catch (Exception e) {
  184. debug.put("error", e.getMessage());
  185. return RestResponse.ok(debug);
  186. }
  187. }
  188. }