package com.ruoyi.study.service.impl; import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.gson.Gson; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.RedisConstants; import com.ruoyi.common.core.exception.GlobalException; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.study.domain.TUser; import com.ruoyi.study.dto.AppUserQuery; import com.ruoyi.study.mapper.TUserMapper; import com.ruoyi.study.service.ITUserService; import com.ruoyi.study.utils.ALiSendSms; import com.ruoyi.study.utils.HWSendSms; import com.ruoyi.study.vo.AppUserVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; /** *

* 用户表 服务实现类 *

* * @author 无关风月 * @since 2024-04-26 */ @Service public class TUserServiceImpl extends ServiceImpl implements ITUserService { @Resource private RedisTemplate redisTemplate; @Resource private TokenService tokenService; @Override public List listAll(AppUserQuery query, PageInfo pageInfo) { return this.baseMapper.listAll(query, pageInfo); } @Autowired private HWSendSms hwSendSms; @Override public Boolean phoneCode(String phone) throws Exception { // 生成随机 6位数字 验证码 String phoneCode = RandomUtil.randomNumbers(6); String regex = Constants.PHONE; // 编译正则表达式 Pattern pattern = Pattern.compile(regex); // 创建Matcher对象 Matcher matcher = pattern.matcher(phone); // 判断是否匹配 if (!matcher.matches()) { throw new GlobalException("手机号不合法!"); } // 判断redis中是否存在手机验证码 Object phoneCodeRedis = redisTemplate.opsForValue().get(RedisConstants.PHONE_CODE + phone); if (phoneCodeRedis == null) { // 将手机验证码 key: reg:用户输入的手机号码 value: 随机验证码:时间戳 phoneCodeRedis = phoneCode; } else { // redis有验证码,获取redis中value的时间戳,判断是否过期 long oldTime = Long.parseLong(String.valueOf(phoneCodeRedis).split(":")[1]); // 没有超过1分钟的重发时间 if (System.currentTimeMillis() - oldTime < (long) Constants.SIXTY * Constants.ONE_THOUSAND) { throw new GlobalException("操作频繁,稍后重试!!!"); } else { phoneCode = String.valueOf(phoneCodeRedis).split(":")[0]; } } ALiSendSms sendSmsDemo = new ALiSendSms(); try { // 使用刚创建的短信模板发送短信 sendSmsDemo.sendSms(phone, "SMS_333505709", "{\"code\":\""+phoneCode+"\"}"); } catch (Exception e) { e.printStackTrace(); } /* * 保存信息到redis * key为 --> phone_code:手机号码 (phone_code表示该业务为 验证码登录) * value为 --> 随机验证码:时间戳 (时间戳用于计算是否超过1分钟的重发时间) */ redisTemplate.opsForValue().set(RedisConstants.PHONE_CODE + phone, phoneCode + ":" + System.currentTimeMillis(), 5, TimeUnit.MINUTES); String sendMessage = "验证码发送成功,您的验证码为:" + phoneCode + ",该验证码三分钟内有效,请及时完成登陆"; // todo 发送此消息 System.out.println(sendMessage); return true; } @Override public Boolean isVip() { TUser user = lambdaQuery().eq(TUser::getId, tokenService.getLoginUserStudy().getUserid()) .eq(TUser::getDisabled, 0).eq(TUser::getState,1).one(); // 是否为vip 逻辑 if (null == user) { return false; } // vip过期时间,字段为空也表示 当前用户不是vip Date vipEndTime = user.getVipEndTime(); return null != vipEndTime && System.currentTimeMillis() <= vipEndTime.getTime(); } @Override public void updateOne(Integer id, Date vipEndTime,Date vipPayTime) { this.baseMapper.updateOne(id,vipPayTime,vipPayTime); } }