Browse Source

feat[litemall-wx-api]: 增加注册码接口和账号更新接口

Junling Bu 6 years ago
parent
commit
8abfce1b62

+ 171 - 7
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 {
 
 
     /**
-     * 请求验证码
+     * 请求注册验证码
+     *
+     * TODO
+     * 这里需要一定机制防止短信验证码被滥用
      *
-     * @param body 手机号码{mobile}
+     * @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<LitemallUser> 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<Object, Object> data = new HashMap<Object, Object>();
+        data.put("nickName", user.getNickname());
+        data.put("avatar", user.getAvatar());
+        data.put("gender", user.getGender());
+        data.put("mobile", user.getMobile());
+
+        return ResponseUtil.ok(data);
+    }
 }