package com.dtb.portal.controller; import com.alibaba.fastjson.JSONObject; import com.dtb.portal.config.interceptor.LoginClassAnnotation; import com.dtb.portal.controller.view.RestResponse; import com.dtb.portal.entity.SysUser; import com.dtb.portal.service.impl.SysUserServiceImpl; import com.dtb.portal.util.WxPhoneNumberUtils; import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @Slf4j @RestController @Api(tags = {"登录控制器"}, value = "LoginController") @LoginClassAnnotation public class LoginController { @Autowired private RedisTemplate redisTemplate; @Autowired private SysUserServiceImpl userService; @ApiOperation("登录") @GetMapping("/login") @ApiImplicitParams({ @ApiImplicitParam(name = "accountName", required = true, value = "用户名"), @ApiImplicitParam(name = "password", required = true, value = "密码"), }) public RestResponse login(@RequestParam(name = "accountName", required = true) String accountName, @RequestParam(name = "password", required = false) String password, HttpServletRequest request) { SysUser sysUser = userService.login(accountName, password); return RestResponse.ok(sysUser); } @ApiOperation("登出") @GetMapping("/logout") public RestResponse logout(HttpServletRequest request) { return RestResponse.ok(); } /* @ApiOperation("生成验证码") @GetMapping("generateCode") RestResponse> getCodeImage() { return RestResponse.ok(getRandomCodeImage()); }*/ @ApiOperation(value = "APP微信登录") @RequestMapping(value = "loginByWxApp", method = RequestMethod.GET) @ApiImplicitParams({ @ApiImplicitParam(name = "code", required = true, value = "微信登录code"), @ApiImplicitParam(name = "avatarUrl", required = false, value = "头像URL"), @ApiImplicitParam(name = "nickName", required = false, value = "昵称") }) public RestResponse loginByWxApp( @RequestParam(value = "code", required = true) String code, @RequestParam(value = "avatarUrl", required = false) String avatarUrl, @RequestParam(value = "nickName", required = false) String nickName) { log.info("收到APP微信登录请求 - code: {}, nickName: {}", code, nickName); try { SysUser sysUser = userService.loginByWxApp(code, avatarUrl, nickName); log.info("APP微信登录成功 - userId: {}, openId: {}", sysUser.getId(), sysUser.getOpenId()); return RestResponse.ok(sysUser); } catch (Exception e) { log.error("APP微信登录失败 - code: {}, error: {}", code, e.getMessage()); throw e; } } @ApiOperation(value = "小程序微信登录") @RequestMapping(value = "loginByWxMini", method = RequestMethod.GET) @ApiImplicitParams({ @ApiImplicitParam(name = "code", required = true, value = "微信登录code"), @ApiImplicitParam(name = "phoneCode", required = true, value = "手机号code") }) public RestResponse loginByWxMini( @RequestParam(value = "code", required = true) String code, @RequestParam(value = "phoneCode", required = true) String phoneCode) { log.info("收到小程序微信登录请求 - code: {}, phoneCode: {}", code, phoneCode); try { SysUser sysUser = userService.loginByWxMini(code, phoneCode); log.info("小程序微信登录成功 - userId: {}, openId: {}", sysUser.getId(), sysUser.getOpenId()); return RestResponse.ok(sysUser); } catch (Exception e) { log.error("小程序微信登录失败 - code: {}, phoneCode: {}, error: {}", code, phoneCode, e.getMessage()); throw e; } } @ApiOperation(value = "发送短信验证码") @ApiImplicitParams({ @ApiImplicitParam(name = "phone", required = true, value = "手机号") }) @RequestMapping(value = "sendSms", method = RequestMethod.GET) public RestResponse sendSms(@RequestParam(value = "phone") String phone) { userService.sendSms(phone); return RestResponse.ok(); } @ApiOperation(value = "短信验证码登录") @ApiImplicitParams({ @ApiImplicitParam(name = "phone", required = true, value = "手机号"), @ApiImplicitParam(name = "checkCode", required = true, value = "验证码"), @ApiImplicitParam(name = "openId", required = false, value = "微信openId") }) @RequestMapping(value = "loginBySms", method = RequestMethod.GET) public RestResponse loginBySms(@RequestParam(value = "phone") String phone, @RequestParam(value = "checkCode") String checkCode, @RequestParam(value = "openId", required = false) String openId) { SysUser sysUser = userService.loginBySms(phone, checkCode, openId); // newUser 字段已在 service 层设置 return RestResponse.ok(sysUser); } @ApiOperation(value = "绑定手机号") @ApiImplicitParams({ @ApiImplicitParam(name = "id", required = true, value = "用户id"), @ApiImplicitParam(name = "phone", required = true, value = "手机号"), @ApiImplicitParam(name = "checkCode", required = true, value = "验证码") }) @RequestMapping(value = "bindPhone", method = RequestMethod.GET) public RestResponse bindPhone( @RequestParam(value = "id") String id, @RequestParam(value = "phone") String phone, @RequestParam(value = "checkCode") String checkCode) { SysUser sysUser = userService.bindPhone(id, phone, checkCode); return RestResponse.ok(sysUser); } @RequestMapping(value = "forgotPasswordByPhone", method = RequestMethod.GET) public RestResponse forgotPasswordByPhone( @RequestParam(value = "phone") String phone, @RequestParam(value = "password") String password, @RequestParam(value = "checkCode") String checkCode) { SysUser sysUser = userService.forgotPasswordByPhone(phone,password, checkCode); return RestResponse.ok(sysUser); } @RequestMapping(value = "forgotPassword", method = RequestMethod.GET) public RestResponse forgotPassword( @RequestParam(value = "phone") String phone) { SysUser sysUser = userService.forgotPassword(phone); return RestResponse.ok(sysUser); } @ApiOperation(value = "微信手机号登录") @ApiImplicitParams({ @ApiImplicitParam(name = "phoneCode", required = true, value = "微信获取手机号的code"), @ApiImplicitParam(name = "loginCode", required = true, value = "微信登录获取openId的code") }) @RequestMapping(value = "loginByWxPhoneNumber", method = RequestMethod.GET) public RestResponse loginByWxPhoneNumber( @RequestParam(value = "phoneCode", required = true) String phoneCode, @RequestParam(value = "loginCode", required = true) String loginCode) { log.info("收到微信手机号登录请求 - phoneCode: {}, loginCode: {}", phoneCode, loginCode); try { SysUser sysUser = userService.loginByWxPhoneNumber(phoneCode, loginCode); log.info("微信手机号登录成功 - userId: {}, phone: {}", sysUser.getId(), sysUser.getPhone()); return RestResponse.ok(sysUser); } catch (Exception e) { log.error("微信手机号登录失败 - phoneCode: {}, loginCode: {}, 错误: {}", phoneCode, loginCode, e.getMessage()); throw e; } } @ApiOperation(value = "调试微信手机号code") @ApiImplicitParams({ @ApiImplicitParam(name = "code", required = true, value = "微信获取手机号的code") }) @RequestMapping(value = "debugWxPhoneCode", method = RequestMethod.GET) public RestResponse debugWxPhoneCode( @RequestParam(value = "code", required = true) String code) { String appId = userService.getWxAppId(); String appSecret = userService.getWxAppSecret(); JSONObject debugInfo = WxPhoneNumberUtils.debugCode(appId, appSecret, code); return RestResponse.ok(debugInfo); } @ApiOperation(value = "调试APP微信配置") @RequestMapping(value = "debugWxAppConfig", method = RequestMethod.GET) public RestResponse debugWxAppConfig() { JSONObject debug = new JSONObject(); try { String appId = userService.getWxAppAppId(); String appSecret = userService.getWxAppAppSecret(); debug.put("appId", appId); debug.put("appSecret", "***" + appSecret.substring(appSecret.length() - 4)); // 只显示最后4位 // 测试获取access_token String url = String.format( "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appId, appSecret); JSONObject result = WxPhoneNumberUtils.httpGet(url); debug.put("test_result", result); return RestResponse.ok(debug); } catch (Exception e) { debug.put("error", e.getMessage()); return RestResponse.ok(debug); } } }