package com.ruoyi.account.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.account.mapper.AppUserMapper;
|
import com.ruoyi.account.api.model.AppUser;
|
import com.ruoyi.account.service.AppUserService;
|
import com.ruoyi.account.util.weChat.WeChatUtil;
|
import com.ruoyi.account.vo.*;
|
import com.ruoyi.common.core.web.domain.AjaxResult;
|
import com.ruoyi.common.redis.service.RedisService;
|
import com.ruoyi.common.security.service.TokenService;
|
import com.ruoyi.system.api.vo.LoginUser;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author luodangjia
|
* @since 2024-11-21
|
*/
|
@Service
|
public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> implements AppUserService {
|
|
@Resource
|
private WeChatUtil weChatUtil;
|
|
@Resource
|
private TokenService tokenService;
|
|
@Resource
|
private RedisService redisService;
|
|
|
/**
|
* 小程序一键登录
|
* @param appletLogin
|
* @return
|
*/
|
@Override
|
public AjaxResult appletLogin(AppletLogin appletLogin) {
|
//使用jscode获取微信openid
|
Map<String, Object> map = weChatUtil.code2Session(appletLogin.getJscode());
|
Integer errcode = Integer.valueOf(map.get("errcode").toString());
|
if(0 != errcode){
|
return AjaxResult.error(map.get("msg").toString());
|
}
|
String openid = map.get("openid").toString();
|
//查询用户是否注册,没有注册则跳转到注册页面
|
AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getWxOpenid, openid).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0));
|
if(null == appUser){
|
LoginVo loginVo = new LoginVo();
|
loginVo.setSkipPage(2);
|
return AjaxResult.success(loginVo);
|
}
|
//账户被冻结,给出提示
|
if(2 == appUser.getStatus()){
|
return AjaxResult.error("账户已被冻结,请联系管理员!");
|
}
|
LoginVo loginVo = new LoginVo();
|
loginVo.setSkipPage(1);
|
loginVo.setFirstTime(false);
|
loginVo.setPhone(appUser.getPhone());
|
//构建token
|
LoginUser loginUser = new LoginUser();
|
loginUser.setUserId(appUser.getId());
|
loginUser.setName(appUser.getName());
|
Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser);
|
loginVo.setToken(tokenApplet.get("access_token").toString());
|
loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString()));
|
return AjaxResult.success(loginVo);
|
}
|
|
|
/**
|
* 手机号码登录
|
* @param mobileLogin
|
* @return
|
*/
|
@Override
|
public AjaxResult<LoginVo> mobileLogin(MobileLogin mobileLogin) {
|
//校验验证码
|
String code = redisService.getCacheObject(mobileLogin.getPhone());
|
if(null == code || !code.equals(mobileLogin.getCode())){
|
return AjaxResult.error("验证码错误");
|
}
|
|
//查询用户是否注册,没有注册则跳转到注册页面
|
AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, mobileLogin.getPhone()).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0));
|
if(null == appUser){
|
LoginVo loginVo = new LoginVo();
|
loginVo.setSkipPage(2);
|
return AjaxResult.success(loginVo);
|
}
|
//账户被冻结,给出提示
|
if(2 == appUser.getStatus()){
|
return AjaxResult.error("账户已被冻结,请联系管理员!");
|
}
|
LoginVo loginVo = new LoginVo();
|
loginVo.setSkipPage(1);
|
loginVo.setFirstTime(false);
|
loginVo.setPhone(appUser.getPhone());
|
//构建token
|
LoginUser loginUser = new LoginUser();
|
loginUser.setUserId(appUser.getId());
|
loginUser.setName(appUser.getName());
|
Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser);
|
loginVo.setToken(tokenApplet.get("access_token").toString());
|
loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString()));
|
return AjaxResult.success(loginVo);
|
}
|
|
|
/**
|
* 获取短信验证码
|
* @param smsCode
|
* @return
|
*/
|
@Override
|
public AjaxResult getSMSCode(SMSCode smsCode) {
|
//校验验证码获取评率(1分钟5次)
|
String key = smsCode.getType() + "&" + smsCode.getPhone();
|
Map<String, Object> cacheMap = redisService.getCacheMap(key);
|
if(null != cacheMap){
|
Integer number = Integer.valueOf(cacheMap.get("number").toString()) + 1;
|
Long startTime = Long.valueOf(cacheMap.get("startTime").toString());
|
if(number > 5 && (System.currentTimeMillis() - startTime) < 60000){
|
return AjaxResult.error("获取验证码太频繁,请稍后重试!");
|
}
|
if(number <= 5){
|
cacheMap.put("number", number);
|
}else{
|
cacheMap.put("number", 1);
|
cacheMap.put("startTime", System.currentTimeMillis());
|
}
|
}else{
|
cacheMap = new HashMap<>();
|
cacheMap.put("number", 1);
|
cacheMap.put("startTime", System.currentTimeMillis());
|
}
|
//存储计数器到缓存中,5分钟有效期
|
redisService.setCacheMap(key, cacheMap, 300);
|
|
//开始构建验证码内容
|
String code = "";
|
for (int i = 0; i < 6; i++) {
|
code += Double.valueOf(Math.random() * 10).intValue();
|
}
|
//发送短信 todo 待对接短信
|
return AjaxResult.success();
|
}
|
|
|
/**
|
* 注册账号
|
* @param registerAccount
|
* @return
|
*/
|
@Override
|
public AjaxResult<LoginVo> registerAccount(RegisterAccount registerAccount) {
|
return null;
|
}
|
}
|