From 525dc60d3c79ede0513cbfde071a6b70b70075a3 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Tue, 20 Jun 2023 17:48:24 +0800 Subject: [PATCH] =?UTF-8?q?H5=E7=9A=84=E7=99=BB=E5=BD=95=E3=80=81=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/core/config/H5MemberInterceptor.java | 68 +++++++++ .../com/ruoyi/web/core/config/MvcConfig.java | 23 ++++ .../src/main/resources/application.yml | 1 + .../com/fjp/lc/test/service/ServiceTest.java | 26 ++++ .../com/ruoyi/common/constant/Constants.java | 3 + .../common/core/domain/model/LoginMember.java | 13 ++ .../framework/config/SecurityConfig.java | 1 + .../framework/web/service/TokenService.java | 47 +++++++ .../java/com/cyl/h5/config/SecurityUtil.java | 17 +++ .../cyl/h5/controller/H5MemberController.java | 22 ++- .../pojo/request/H5AccountLoginRequest.java | 9 ++ .../cyl/h5/pojo/request/H5LoginRequest.java | 9 ++ .../h5/pojo/request/H5SmsLoginRequest.java | 11 ++ .../cyl/h5/pojo/response/H5LoginResponse.java | 13 ++ .../h5/pojo/response/RegisterResponse.java | 3 - .../com/cyl/h5/service/H5MemberService.java | 130 ++++++++++++++++-- .../java/com/cyl/ums/pojo/vo/MemberVO.java | 3 - 17 files changed, 378 insertions(+), 21 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MvcConfig.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginMember.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/config/SecurityUtil.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5AccountLoginRequest.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5LoginRequest.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5SmsLoginRequest.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/H5LoginResponse.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java new file mode 100644 index 0000000..8ad40f2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java @@ -0,0 +1,68 @@ +package com.ruoyi.web.core.config; + +import com.cyl.ums.domain.Member; +import com.cyl.ums.service.MemberService; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.model.LoginMember; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.framework.config.LocalDataUtil; +import com.ruoyi.framework.web.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Configuration +public class H5MemberInterceptor extends HandlerInterceptorAdapter { + + @Autowired + private TokenService tokenService; + @Autowired + private MemberService memberService; + + private static String[] WHITE_PATHS = { + "/h5/sms/login", + "/h5/account/login", + "/h5/register", + "/h5/validate" + }; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String requestUri = request.getRequestURI(); + boolean flag = true; + if (!requestUri.startsWith("/h5/")) { + return super.preHandle(request, response, handler); + } + + for (String s : WHITE_PATHS) { + if (requestUri.startsWith(s)) { + flag = false; + break; + } + } + if (!flag) { + return super.preHandle(request, response, handler); + } + LoginMember loginMember = tokenService.getLoginMember(request); + if (loginMember == null) { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + tokenService.verifyMemberToken(loginMember); + //获取会员信息 + Member member = memberService.selectById(loginMember.getMemberId()); + if (member == null || member.getStatus() == 0) { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + //将会员信息存放至全局 + LocalDataUtil.setVar(Constants.MEMBER_INFO, member); + + return super.preHandle(request, response, handler); + } + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MvcConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MvcConfig.java new file mode 100644 index 0000000..dc8ca76 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MvcConfig.java @@ -0,0 +1,23 @@ +package com.ruoyi.web.core.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +@Slf4j +public class MvcConfig extends WebMvcConfigurerAdapter { + + @Bean + public H5MemberInterceptor memberInterceptor() { + return new H5MemberInterceptor(); + } + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(memberInterceptor()); + } +} diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 7ae7707..dbb6af2 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -121,6 +121,7 @@ token: secret: abcdefghijkomnopqrstuvwxyx # 令牌有效期(默认30分钟) expireTime: 30 + memberExpireTime: 30 # mybatis-plus 配置 mybatis-plus: # 搜索指定包别名 diff --git a/ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java b/ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java index 9518cde..2c7f6f3 100644 --- a/ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java +++ b/ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java @@ -2,6 +2,11 @@ package com.fjp.lc.test.service; import com.cyl.ums.service.MemberCartService; import com.ruoyi.RuoYiApplication; +import com.ruoyi.common.config.properties.SmsProperties; +import com.ruoyi.common.core.sms.AliyunSmsTemplate; +import com.ruoyi.common.core.sms.SmsTemplate; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -9,14 +14,35 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; +import java.util.HashMap; +import java.util.Map; + @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = RuoYiApplication.class) @ActiveProfiles("dev") +@Slf4j public class ServiceTest { @Autowired private MemberCartService memberCartService; + + @Autowired + private SmsProperties smsProperties; + @Test public void test1() { memberCartService.mineCartNum(); } + + @Test + public void test2(){ + System.out.println(smsProperties); + if (!smsProperties.getEnabled()) { + throw new RuntimeException("没有开启短信服务"); + } + Map map = new HashMap<>(1); + map.put("code", "1234"); + SmsTemplate smsTemplate = new AliyunSmsTemplate(smsProperties); + Object send = smsTemplate.send("15706259078", "SMS_146125046", map); + log.info("短信发送结果:" + send); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index f41bf11..33e4af3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -68,6 +68,8 @@ public class Constants * 登录用户 redis key */ public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + public static final String LOGIN_MEMBER_TOKEN_KEY = "login_member_tokens:"; + public static final String MEMBER_INFO = "member_info"; /** * 防重提交 redis key @@ -98,6 +100,7 @@ public class Constants * 令牌前缀 */ public static final String LOGIN_USER_KEY = "login_user_key"; + public static final String LOGIN_MEMBER_KEY = "login_member_key"; /** * 用户ID diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginMember.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginMember.java new file mode 100644 index 0000000..50b4ebc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginMember.java @@ -0,0 +1,13 @@ +package com.ruoyi.common.core.domain.model; + +import lombok.Data; + +@Data +public class LoginMember { + + private Long memberId; + private String token; + private Long loginTime; + private Long expireTime; + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 9474d4f..ec958b5 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -107,6 +107,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter "/**/*.js", "/profile/**" ).permitAll() + .antMatchers("/h5/**").permitAll() .antMatchers("/no-auth/**").permitAll() .antMatchers("/common/download**").anonymous() .antMatchers("/common/download/resource**").anonymous() diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java index bf28e0f..844f779 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -4,6 +4,8 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; + +import com.ruoyi.common.core.domain.model.LoginMember; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -40,6 +42,10 @@ public class TokenService @Value("${token.expireTime}") private int expireTime; + //单位 天 + @Value("${token.memberExpireTime}") + private int memberExpireTime; + protected static final long MILLIS_SECOND = 1000; protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; @@ -76,6 +82,22 @@ public class TokenService return null; } + public LoginMember getLoginMember(HttpServletRequest request) { + // 获取请求携带的令牌 + String token = getToken(request); + if (StringUtils.isNotEmpty(token)) { + try { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_MEMBER_KEY); + String userKey = Constants.LOGIN_MEMBER_TOKEN_KEY + uuid; + return redisCache.getCacheObject(userKey); + } catch (Exception e) { + } + } + return null; + } + /** * 设置用户身份信息 */ @@ -117,6 +139,15 @@ public class TokenService return createToken(claims); } + public String createMemberToken(LoginMember loginMember){ + String token = IdUtils.fastUUID(); + loginMember.setToken(token); + refreshMemberToken(loginMember); + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_MEMBER_KEY, token); + return createToken(claims); + } + /** * 验证令牌有效期,相差不足20分钟,自动刷新缓存 * @@ -133,6 +164,14 @@ public class TokenService } } + public void verifyMemberToken(LoginMember loginUser) { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { + refreshMemberToken(loginUser); + } + } + /** * 刷新令牌有效期 * @@ -147,6 +186,14 @@ public class TokenService redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); } + public void refreshMemberToken(LoginMember loginUser) { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + memberExpireTime * 24 * 60 * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = Constants.LOGIN_MEMBER_TOKEN_KEY + loginUser.getToken(); + redisCache.setCacheObject(userKey, loginUser, memberExpireTime, TimeUnit.DAYS); + } + /** * 设置用户代理信息 * diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/config/SecurityUtil.java b/ruoyi-mall/src/main/java/com/cyl/h5/config/SecurityUtil.java new file mode 100644 index 0000000..f14cd9e --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/config/SecurityUtil.java @@ -0,0 +1,17 @@ +package com.cyl.h5.config; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.ums.domain.Member; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.config.LocalDataUtil; +import org.springframework.stereotype.Service; + +@Service +public class SecurityUtil { + + public static Member getLocalMember() { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + return member; + } + +} 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 index f730e1e..7849e50 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java @@ -3,14 +3,16 @@ package com.cyl.h5.controller; import com.cyl.h5.pojo.request.RegisterRequest; import com.cyl.h5.pojo.response.RegisterResponse; import com.cyl.h5.pojo.response.ValidatePhoneResponse; +import com.cyl.h5.pojo.response.H5LoginResponse; import com.cyl.h5.service.H5MemberService; +import com.cyl.ums.pojo.vo.MemberVO; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/no-auth/h5/member") +@RequestMapping("/h5") public class H5MemberController { @Autowired @@ -27,4 +29,22 @@ public class H5MemberController { public ResponseEntity validate(@PathVariable String phone){ return ResponseEntity.ok(service.validate(phone)); } + + @ApiOperation("手机号密码登录") + @PostMapping("/account/login") + public ResponseEntity accountLogin(@RequestBody String data){ + return ResponseEntity.ok(service.accountLogin(data)); + } + + @ApiOperation("sms登录") + @PostMapping("/sms/login") + public ResponseEntity smsLogin(@RequestBody String data){ + return ResponseEntity.ok(service.smsLogin(data)); + } + + @ApiOperation("获取会员信息") + @GetMapping("/member/info") + public ResponseEntity getMemberInfo(){ + return ResponseEntity.ok(service.getMemberInfo()); + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5AccountLoginRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5AccountLoginRequest.java new file mode 100644 index 0000000..e4ed87a --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5AccountLoginRequest.java @@ -0,0 +1,9 @@ +package com.cyl.h5.pojo.request; + +import lombok.Data; + +@Data +public class H5AccountLoginRequest extends H5LoginRequest{ + /** 密码 */ + private String password; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5LoginRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5LoginRequest.java new file mode 100644 index 0000000..557b207 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5LoginRequest.java @@ -0,0 +1,9 @@ +package com.cyl.h5.pojo.request; + +import lombok.Data; + +@Data +public class H5LoginRequest { + /** 账号即手机号 */ + private String mobile; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5SmsLoginRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5SmsLoginRequest.java new file mode 100644 index 0000000..4655ec1 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5SmsLoginRequest.java @@ -0,0 +1,11 @@ +package com.cyl.h5.pojo.request; + +import lombok.Data; + +@Data +public class H5SmsLoginRequest extends H5LoginRequest { + /** 验证码 */ + private String code; + /** uuid */ + private String uuid; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/H5LoginResponse.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/H5LoginResponse.java new file mode 100644 index 0000000..7273f5d --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/H5LoginResponse.java @@ -0,0 +1,13 @@ +package com.cyl.h5.pojo.response; + +import lombok.Data; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 14:54 + **/ +@Data +public class H5LoginResponse { + private String token; +} 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 index f6a0572..8d6a854 100644 --- 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 @@ -1,12 +1,9 @@ package com.cyl.h5.pojo.response; -import com.cyl.ums.domain.Member; import lombok.Data; @Data public class RegisterResponse { /** token */ 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 index 8f2ab52..4d9905a 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -1,18 +1,29 @@ package com.cyl.h5.service; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.h5.pojo.request.H5AccountLoginRequest; +import com.cyl.h5.pojo.request.H5SmsLoginRequest; import com.cyl.h5.pojo.request.RegisterRequest; import com.cyl.h5.pojo.response.RegisterResponse; import com.cyl.h5.pojo.response.ValidatePhoneResponse; +import com.cyl.h5.pojo.response.H5LoginResponse; import com.cyl.ums.domain.Member; import com.cyl.ums.mapper.MemberMapper; +import com.cyl.ums.pojo.vo.MemberVO; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.model.LoginMember; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.LocalDataUtil; +import com.ruoyi.framework.web.service.TokenService; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.util.Base64Utils; import java.time.LocalDateTime; import java.util.Base64; @@ -27,6 +38,9 @@ public class H5MemberService { @Autowired private RedisCache redisCache; + @Autowired + private TokenService tokenService; + /** * 注册 * @param request 注册请求体 @@ -34,25 +48,19 @@ public class H5MemberService { */ public RegisterResponse register(RegisterRequest request){ RegisterResponse response = new RegisterResponse(); - //校验 验证码 - String key = request.getUuid() + "_" + request.getMobile(); - String code = redisCache.getCacheObject(key); - log.info("code:{}", code); - if (null == code){ - throw new RuntimeException("验证码已过期"); - }else if (!code.equals(request.getCode())){ - throw new RuntimeException("验证码错误"); - } - //删除缓存 - redisCache.deleteObject(key); + //校验验证码 + this.validateVerifyCode(request.getUuid(), request.getMobile(), request.getCode()); //创建会员 Member member = new Member(); member.setPhone(request.getMobile()); member.setPassword(SecurityUtils.encryptPassword(request.getPassword())); - member.setNickname("用户" + request.getMobile()); + member.setNickname("用户" + request.getMobile().substring(7,11)); + member.setStatus(Constants.MEMBER_ACCOUNT_STATUS.NORMAL); member.setCreateTime(LocalDateTime.now()); memberMapper.insert(member); - //TODO 返回封装了token和member信息的response + //注册成功直接返回token了 + H5LoginResponse loginResponse = getLoginResponse(member.getId()); + response.setToken(loginResponse.getToken()); return response; } @@ -70,4 +78,98 @@ public class H5MemberService { response.setMessage("该手机号可用"); return response; } + + /** + * 账号密码登录 + * @param data + * @return + */ + public H5LoginResponse accountLogin(String data) { + if (StringUtils.isEmpty(data)){ + throw new RuntimeException(Constants.LOGIN_INFO.WRONG); + } + // 解码 转 对象 + H5AccountLoginRequest request = JSON.parseObject(new String(Base64Utils.decodeFromString(data)), H5AccountLoginRequest.class); + log.info("account login request:{}", JSONUtil.toJsonStr(request)); + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("phone", request.getMobile()); + Member member = memberMapper.selectOne(qw); + if (member == null){ + throw new RuntimeException(Constants.LOGIN_INFO.WRONG); + } + validateMemberStatus(member); + //check 密码 + if (!SecurityUtils.matchesPassword(request.getPassword(), member.getPassword())){ + throw new RuntimeException(Constants.LOGIN_INFO.WRONG); + } + return getLoginResponse(member.getId()); + } + + public H5LoginResponse smsLogin(String data){ + if (StringUtils.isEmpty(data)){ + throw new RuntimeException(Constants.LOGIN_INFO.WRONG); + } + H5SmsLoginRequest request = JSON.parseObject(new String(Base64Utils.decodeFromString(data)), H5SmsLoginRequest.class); + //校验验证码 + this.validateVerifyCode(request.getUuid(), request.getMobile(), request.getCode()); + //查会员 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("phone", request.getMobile()); + Member member = memberMapper.selectOne(qw); + if (member == null){ + throw new RuntimeException(Constants.LOGIN_INFO.TO_REGISTER); + } + //校验会员状态 + validateMemberStatus(member); + return getLoginResponse(member.getId()); + } + + /** + * 校验会员状态 + * @param member 会员信息 + */ + private void validateMemberStatus(Member member) { + if (Constants.MEMBER_ACCOUNT_STATUS.FORBIDDEN == member.getStatus()){ + throw new RuntimeException(Constants.LOGIN_INFO.FORBIDDEN); + } + } + + /** + * 校验验证码有效性 + * @param uuid 唯一标识 + * @param phone 手机号 + * @param inputCode 输入的验证码 + */ + private void validateVerifyCode(String uuid, String phone, String inputCode){ + String key = uuid + "_" + phone; + String redisCode = redisCache.getCacheObject(key); + if (redisCode == null){ + throw new RuntimeException(Constants.VERIFY_CODE_INFO.EXPIRED); + }else if (!redisCode.equals(inputCode)){ + throw new RuntimeException(Constants.VERIFY_CODE_INFO.WRONG); + } + //删除缓存 + redisCache.deleteObject(key); + } + + /** + * 封装登录响应 + * @param memberId 登录会员id + * @return 结果 + */ + private H5LoginResponse getLoginResponse(Long memberId){ + LoginMember loginMember = new LoginMember(); + loginMember.setMemberId(memberId); + String token = tokenService.createMemberToken(loginMember); + H5LoginResponse response = new H5LoginResponse(); + response.setToken(token); + return response; + } + + public MemberVO getMemberInfo() { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + MemberVO memberVO = new MemberVO(); + BeanUtils.copyProperties(member, memberVO); + return memberVO; + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java index 0df9d81..7a25392 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java @@ -19,9 +19,6 @@ public class MemberVO extends BaseAudit { /** 昵称 */ @Excel(name = "昵称") private String nickname; - /** 密码 */ - @Excel(name = "密码") - private String password; /** 手机号码 */ @Excel(name = "手机号码") private String phone;