diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java index 82499da7..1b288b3a 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java @@ -25,10 +25,7 @@ import org.linlinjava.litemall.core.util.IpUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime; @@ -171,9 +168,12 @@ public class WxAuthController { /** - * 请求验证码 + * 请求注册验证码 * - * @param body 手机号码{mobile} + * TODO + * 这里需要一定机制防止短信验证码被滥用 + * + * @param body 手机号码 { mobile } * @return */ @PostMapping("regCaptcha") @@ -312,6 +312,49 @@ public class WxAuthController { return ResponseUtil.ok(result); } + + /** + * 请求验证码 + * + * TODO + * 这里需要一定机制防止短信验证码被滥用 + * + * @param body 手机号码 { mobile: xxx, type: xxx } + * @return + */ + @PostMapping("captcha") + public Object captcha(@LoginUser Integer userId, @RequestBody String body) { + if(userId == null){ + return ResponseUtil.unlogin(); + } + String phoneNumber = JacksonUtil.parseString(body, "mobile"); + String captchaType = JacksonUtil.parseString(body, "type"); + if (StringUtils.isEmpty(phoneNumber)) { + return ResponseUtil.badArgument(); + } + if (!RegexUtil.isMobileExact(phoneNumber)) { + return ResponseUtil.badArgumentValue(); + } + if (StringUtils.isEmpty(captchaType)) { + return ResponseUtil.badArgument(); + } + + if (!notifyService.isSmsEnable()) { + return ResponseUtil.fail(AUTH_CAPTCHA_UNSUPPORT, "小程序后台验证码服务不支持"); + } + String code = CharUtil.getRandomNum(6); + // TODO + // 根据type发送不同的验证码 + notifyService.notifySmsTemplate(phoneNumber, NotifyType.CAPTCHA, new String[]{code}); + + boolean successful = CaptchaCodeManager.addToCache(phoneNumber, code); + if (!successful) { + return ResponseUtil.fail(AUTH_CAPTCHA_FREQUENCY, "验证码未超时1分钟,不能发送"); + } + + return ResponseUtil.ok(); + } + /** * 账号密码重置 * @@ -328,7 +371,10 @@ public class WxAuthController { * 失败则 { errno: XXX, errmsg: XXX } */ @PostMapping("reset") - public Object reset(@RequestBody String body, HttpServletRequest request) { + public Object reset(@LoginUser Integer userId, @RequestBody String body, HttpServletRequest request) { + if(userId == null){ + return ResponseUtil.unlogin(); + } String password = JacksonUtil.parseString(body, "password"); String mobile = JacksonUtil.parseString(body, "mobile"); String code = JacksonUtil.parseString(body, "code"); @@ -363,6 +409,108 @@ public class WxAuthController { return ResponseUtil.ok(); } + /** + * 账号手机号码重置 + * + * @param body 请求内容 + * { + * password: xxx, + * mobile: xxx + * code: xxx + * } + * 其中code是手机验证码,目前还不支持手机短信验证码 + * @param request 请求对象 + * @return 登录结果 + * 成功则 { errno: 0, errmsg: '成功' } + * 失败则 { errno: XXX, errmsg: XXX } + */ + @PostMapping("resetPhone") + public Object resetPhone(@LoginUser Integer userId, @RequestBody String body, HttpServletRequest request) { + if(userId == null){ + return ResponseUtil.unlogin(); + } + String password = JacksonUtil.parseString(body, "password"); + String mobile = JacksonUtil.parseString(body, "mobile"); + String code = JacksonUtil.parseString(body, "code"); + + if (mobile == null || code == null || password == null) { + return ResponseUtil.badArgument(); + } + + //判断验证码是否正确 + String cacheCode = CaptchaCodeManager.getCachedCaptcha(mobile); + if (cacheCode == null || cacheCode.isEmpty() || !cacheCode.equals(code)) + return ResponseUtil.fail(AUTH_CAPTCHA_UNMATCH, "验证码错误"); + + List userList = userService.queryByMobile(mobile); + LitemallUser user = null; + if (userList.size() > 1) { + return ResponseUtil.fail(AUTH_MOBILE_REGISTERED, "手机号已注册"); + } + user = userService.findById(userId); + + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + if (!encoder.matches(password, user.getPassword())) { + return ResponseUtil.fail(AUTH_INVALID_ACCOUNT, "账号密码不对"); + } + + user.setMobile(mobile); + if (userService.updateById(user) == 0) { + return ResponseUtil.updatedDataFailed(); + } + + return ResponseUtil.ok(); + } + + /** + * 账号信息更新 + * + * @param body 请求内容 + * { + * password: xxx, + * mobile: xxx + * code: xxx + * } + * 其中code是手机验证码,目前还不支持手机短信验证码 + * @param request 请求对象 + * @return 登录结果 + * 成功则 { errno: 0, errmsg: '成功' } + * 失败则 { errno: XXX, errmsg: XXX } + */ + @PostMapping("profile") + public Object profile(@LoginUser Integer userId, @RequestBody String body, HttpServletRequest request) { + if(userId == null){ + return ResponseUtil.unlogin(); + } + String avatar = JacksonUtil.parseString(body, "avatar"); + Byte gender = JacksonUtil.parseByte(body, "gender"); + String nickname = JacksonUtil.parseString(body, "nickname"); + + LitemallUser user = userService.findById(userId); + if(!StringUtils.isEmpty(avatar)){ + user.setAvatar(avatar); + } + if(gender != null){ + user.setGender(gender); + } + if(!StringUtils.isEmpty(nickname)){ + user.setNickname(nickname); + } + + if (userService.updateById(user) == 0) { + return ResponseUtil.updatedDataFailed(); + } + + return ResponseUtil.ok(); + } + + /** + * 微信手机号码绑定 + * + * @param userId + * @param body + * @return + */ @PostMapping("bindPhone") public Object bindPhone(@LoginUser Integer userId, @RequestBody String body) { if (userId == null) { @@ -387,4 +535,20 @@ public class WxAuthController { } return ResponseUtil.ok(); } + + @GetMapping("info") + public Object info(@LoginUser Integer userId) { + if (userId == null) { + return ResponseUtil.unlogin(); + } + + LitemallUser user = userService.findById(userId); + Map data = new HashMap(); + data.put("nickName", user.getNickname()); + data.put("avatar", user.getAvatar()); + data.put("gender", user.getGender()); + data.put("mobile", user.getMobile()); + + return ResponseUtil.ok(data); + } }