diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java index 7910299..a273374 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java @@ -28,4 +28,8 @@ public class SmsResult { * 可自行转换为 SDK 对应的 SendSmsResponse */ private String response; + /** + * uuid + */ + private String uuid; } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java new file mode 100644 index 0000000..72e94dc --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java @@ -0,0 +1,31 @@ +package com.cyl.h5.controller; + +import com.cyl.h5.pojo.dto.LoginDTO; +import com.cyl.h5.pojo.request.RegisterRequest; +import com.cyl.h5.pojo.response.RegisterResponse; +import com.cyl.h5.pojo.vo.LoginResVO; +import com.cyl.h5.service.H5MemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 14:52 + **/ +@RestController +@RequestMapping() +public class H5MemberController { + + @Autowired + private H5MemberService service; + + @PostMapping("/no-auth/h5/member/register") + public ResponseEntity register(@RequestBody RegisterRequest request){ + return ResponseEntity.ok(service.register(request)); + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/LoginDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/LoginDTO.java new file mode 100644 index 0000000..9778b48 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/LoginDTO.java @@ -0,0 +1,14 @@ +package com.cyl.h5.pojo.dto; + +import lombok.Data; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 14:58 + **/ +@Data +public class LoginDTO { + private String account; + private String password; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java new file mode 100644 index 0000000..38a4eca --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java @@ -0,0 +1,26 @@ +package com.cyl.h5.pojo.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/19 16:31 + **/ +@Data +public class RegisterRequest { + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("uuid") + private String uuid; + + @ApiModelProperty("验证码") + private String code; + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java new file mode 100644 index 0000000..a4e630f --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java @@ -0,0 +1,21 @@ +package com.cyl.h5.pojo.response; + +import com.cyl.ums.domain.Member; +import lombok.Data; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/19 16:38 + **/ +@Data +public class RegisterResponse { + + private boolean result; + + private String message; + + private String token; + + private Member member; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java new file mode 100644 index 0000000..39fc824 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -0,0 +1,77 @@ +package com.cyl.h5.service; + +import com.cyl.h5.pojo.request.RegisterRequest; +import com.cyl.h5.pojo.response.RegisterResponse; +import com.cyl.ums.domain.Member; +import com.cyl.ums.mapper.MemberMapper; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 15:01 + **/ +@Service +@Slf4j +public class H5MemberService { + + @Autowired + private MemberMapper memberMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 注册 + * @param request 注册请求体 + * @return 结果 + */ + public RegisterResponse register(RegisterRequest request){ + log.info("request:{}", request); + RegisterResponse response = new RegisterResponse(); + response.setResult(false); + if (StringUtils.isEmpty(request.getMobile())){ + response.setMessage("手机号不能为空"); + return response; + } + if (StringUtils.isEmpty(request.getPassword())){ + response.setMessage("密码不能为空"); + return response; + } + int len = request.getPassword().length(); + if (len < 8 || len > 20){ + response.setMessage("密码长度为8-20位"); + return response; + } + //校验 验证码 + String key = request.getUuid() + "_" + request.getMobile(); + String code = redisCache.getCacheObject(key); + log.info("code:{}", code); + if (null == code){ + response.setMessage("验证码已过期"); + return response; + }else if (!code.equals(request.getCode())){ + response.setMessage("验证码错误"); + return response; + } + //删除缓存 + redisCache.deleteObject(key); + //创建会员 + Member member = new Member(); + member.setPhone(request.getMobile()); + member.setPassword(SecurityUtils.encryptPassword(request.getPassword())); + member.setNickname("用户" + request.getMobile()); + member.setCreateTime(LocalDateTime.now()); + memberMapper.insert(member); + response.setResult(true); + response.setMessage("注册成功"); + return response; + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java b/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java new file mode 100644 index 0000000..6c26ab1 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java @@ -0,0 +1,30 @@ +package com.cyl.sms; + +import com.cyl.sms.service.SmsService; +import com.ruoyi.common.core.domain.model.SmsResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/19 15:39 + **/ +@RestController +@RequestMapping("/no-auth/sms") +public class SmsController { + + @Autowired + private SmsService smsService; + + /** + * 阿里云短信服务 + */ + @GetMapping("/sendAliyun/{phones}") + public ResponseEntity sendAliyun(@PathVariable String phones){ + return smsService.sendAliyun(phones); + } + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java b/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java new file mode 100644 index 0000000..c43c5b2 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java @@ -0,0 +1,79 @@ +package com.cyl.sms.service; + +import com.ruoyi.common.config.properties.SmsProperties; +import com.ruoyi.common.core.domain.model.SmsResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.sms.AliyunSmsTemplate; +import com.ruoyi.common.core.sms.SmsTemplate; +import com.ruoyi.common.utils.SmsUtils; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/19 16:28 + **/ +@Service +@Slf4j +public class SmsService { + + @Autowired + private RedisCache redisCache; + + @Autowired + private SmsProperties smsProperties; + + private final String templateId = "SMS_146125046"; + + public ResponseEntity sendAliyun(String phones){ + if (!smsProperties.getEnabled()){ + return ResponseEntity.ok( + SmsResult.builder() + .isSuccess(false) + .message("当前系统没有开启短信服务") + .build() + ); + + } + if (StringUtils.isEmpty(phones)){ + return ResponseEntity.ok( + SmsResult.builder() + .isSuccess(false) + .message("手机号不能为空") + .build() + ); + } + byte[] decodedBytes = Base64.getDecoder().decode(phones); + phones = new String(decodedBytes); + log.info("base64解码后的手机号为:{}", phones); + String code = SmsUtils.createRandom(true, 4); + Map map = new HashMap<>(); + map.put("code", code); + SmsTemplate smsTemplate = new AliyunSmsTemplate(smsProperties); + SmsResult send = smsTemplate.send(phones, templateId, map); + // 验证码存redis,当前只用于注册和登录,手机号只有一个 + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + send.setUuid(uuid); + try{ + redisCache.setCacheObject(uuid + "_" + phones, code, 5, TimeUnit.MINUTES); + }catch (Exception e){ + return ResponseEntity.ok( + SmsResult.builder() + .isSuccess(false) + .message("服务繁忙,请稍后再试") + .build() + ); + } + return ResponseEntity.ok(send); + } +}