package com.care.client.controller; import cn.hutool.core.date.DateUtil; import com.care.client.service.PassportService; import com.care.client.vo.MemberInitParams; import com.care.common.entity.CareMemberInfo; import com.care.common.service.CareMemberInfoService; import com.care.common.service.SmsSendService; import com.care.common.util.CheckUtils; import com.care.common.util.JwtUtils; import com.care.common.util.Result; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import io.swagger.annotations.*; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.TimeUnit; @Api(tags = "登录") @RestController @RequestMapping("/pinanbao") public class PassportController { @Resource private PassportService passportService; @Resource private SmsSendService smsSendService; @Resource private CareMemberInfoService careMemberInfoService; public final Cache smsTimeoutCache = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build(); @ApiOperation(value = "小程序登录", notes = "小程序授权登录,微信登录传参:loginType=wx,code; 密码登录:loginType=pwd, phone, password") @ApiParam(name = "params", value = "登录参数") @PostMapping("login") public Result login(@RequestBody MemberInitParams params) { CheckUtils.valueIsNull(params, "loginType"); if ("wx".equalsIgnoreCase(params.getLoginType())) { CheckUtils.valueIsNull(params, "code"); } else if ("pwd".equalsIgnoreCase(params.getLoginType())) { if (StringUtils.isBlank(params.getPhone())) { return Result.error("请输入手机号码"); } if (StringUtils.isBlank(params.getPassword())) { return Result.error("请输入密码"); } } return passportService.login(params); } @ApiOperation(value = "小程序登录", notes = "微信登录解密手机号") @PostMapping("decodePhoneNumber") public Result decodePhoneNumber(@RequestBody Map body) { return passportService.decodePhoneNumber(body.get("code"),body.get("encryptedData"),body.get("iv")); } @ApiOperation(value = "新用户注册", notes = "新用户注册") @GetMapping("registerPhone") @ApiImplicitParams(value = { @ApiImplicitParam(paramType = "query", name = "phone", value = "电话号码"), @ApiImplicitParam(paramType = "query", name = "vcode", value = "验证码"), @ApiImplicitParam(paramType = "query", name = "password", value = "密码 "), }) public Result registerPhone(@RequestHeader(value = "token") String token, @RequestParam(value = "phone", required = true) String phone, @RequestParam(value = "vcode", required = true) String vcode, @RequestParam(value = "password", required = true) String password) { if (StringUtils.isBlank(phone)) { return Result.error("请输入手机号"); } if(careMemberInfoService.detailByPhone(phone) != null){ return Result.error("该账号已经注册"); } if (!StringUtils.equalsIgnoreCase(vcode, smsTimeoutCache.getIfPresent(phone))) { return Result.error("请输入正确的验证码"); } if (StringUtils.isBlank(password)) { return Result.error("请输入密码"); } if (StringUtils.isNotBlank(phone) && StringUtils.isNotBlank(password)) { CareMemberInfo careMemberInfo = new CareMemberInfo(); careMemberInfo.setPhone(phone); careMemberInfo.setPassword(DigestUtils.md5Hex(password)); careMemberInfo.setCreateTime(DateUtil.date()); boolean flag = careMemberInfoService.save(careMemberInfo); if (flag) { return Result.success(); } } return Result.error("注册失败"); } @ApiOperation(value = " 获取验证码", notes = "获取验证码") @GetMapping("getVCode") @ApiImplicitParams(value = { @ApiImplicitParam(paramType = "query", name = "phone", value = "电话号码"), @ApiImplicitParam(paramType = "query", name = "type", value = "类型:1手机号注册,2密码重置,3修改注册手机号"), }) public Result getVCode(@RequestParam(value = "phone", required = true) String phone, @RequestParam(value = "type", required = true) String type) { String vcode = String.format("%04d",new Random().nextInt(9999)); boolean flag = false; if("1".equals(type)){ if(careMemberInfoService.detailByPhone(phone) != null){ return Result.error("该手机号已经注册"); } flag = smsSendService.sendSmsCode4RegisterPhone(phone, vcode); } else if("2".equals(type)){ flag = smsSendService.sendSmsCode4ModifyPassword(phone, vcode); } else if("3".equals(type)){ flag = smsSendService.sendSmsCode4ModifyPhone(phone, vcode); } if (flag) { smsTimeoutCache.put(phone, vcode); return Result.success(); } else { return Result.error("获取验证码失败"); } } @ApiOperation(value = "校验验证码", notes = "校验验证码") @GetMapping("checkVCode") @ApiImplicitParams(value = { @ApiImplicitParam(paramType = "query", name = "phone", value = "电话号码"), }) public Result checkVCode(@RequestParam(value = "phone", required = true) String phone, @RequestParam(value = "vcode", required = true) String vcode) { if(StringUtils.equalsIgnoreCase(vcode, smsTimeoutCache.getIfPresent(phone))){ return Result.success(); } else { return Result.error("请输入正确的验证码"); } } @ApiOperation(value = "设置新密码", notes = "设置新密码, 传值:手机号,密码,确认密码,验证码") @ApiParam(name = "params", value = "登录参数") @PostMapping("changePwd") public Result changePwd(@RequestBody MemberInitParams params) { if (StringUtils.isBlank(params.getPhone())) { return Result.error("手机号码不能为空"); } if (StringUtils.isBlank(params.getPassword())) { return Result.error("请输入密码"); } if (StringUtils.isBlank(params.getPasswordAgain())) { return Result.error("请再次输入密码"); } if (!params.getPassword().equals(params.getPasswordAgain())) { return Result.error("两次输入密码不一致"); } if (StringUtils.isBlank(params.getVcode())) { return Result.error("验证码不能为空"); } if (!StringUtils.equalsIgnoreCase(params.getVcode(), smsTimeoutCache.getIfPresent(params.getPhone()))) { return Result.error("验证码无效"); } CareMemberInfo careMemberInfo = careMemberInfoService.detailByPhone(params.getPhone()); if (careMemberInfo == null) { return Result.error("该手机号未注册"); } boolean flag = passportService.changePwd(params.getPassword(), careMemberInfo.getId()); if (flag) { return Result.success(); } return Result.error("设置新密码失败"); } @ApiOperation(value = "小程序登出", notes = "小程序登出") @PostMapping("logout") public Result logout(@RequestHeader String token) { passportService.logout(token); return Result.success(); } }