package cc.mrbird.febs.video.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.ShareCodeUtil; import cc.mrbird.febs.video.dto.LoginDto; import cc.mrbird.febs.video.dto.RegisterDto; import cc.mrbird.febs.video.entity.VideoMemberEntity; import cc.mrbird.febs.video.mapper.VideoMemberMapper; import cc.mrbird.febs.video.service.IApiVideoMemberService; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; @Slf4j @Service @RequiredArgsConstructor public class ApiVideoMemberServiceImpl extends ServiceImpl implements IApiVideoMemberService { private final RedisUtils redisUtils; @Override public FebsResponse register(RegisterDto registerDto) { VideoMemberEntity videoMember = this.baseMapper.selectInfoByAccount(registerDto.getAccount()); if (videoMember != null) { throw new FebsException("该账号已被占用"); } videoMember = new VideoMemberEntity(); videoMember.setPassword(SecureUtil.md5(registerDto.getPassword())); // 判断账号类型 if (AppContants.ACCOUNT_TYPE_MOBILE.equals(registerDto.getType())) { videoMember.setPhone(registerDto.getAccount()); } else { videoMember.setEmail(registerDto.getAccount()); } videoMember.setName(registerDto.getAccount()); videoMember.setAccountStatus(VideoMemberEntity.ACCOUNT_STATUS_ENABLE); videoMember.setAccountType(VideoMemberEntity.ACCOUNT_TYPE_NORMAL); videoMember.setIsVip(VideoMemberEntity.ISVIP_STATUS_NO); this.baseMapper.insert(videoMember); String inviteId = ShareCodeUtil.toSerialCode(videoMember.getId()); videoMember.setInviteId(inviteId); //推荐人和推荐人链 boolean flag = false; String parentId = videoMember.getRefererId(); if (StrUtil.isBlank(parentId)) { flag = true; } String ids = ""; while (!flag) { if (StrUtil.isBlank(ids)) { ids += parentId; } else { ids += ("," + parentId); } VideoMemberEntity parentMember = this.baseMapper.selectInfoByInviteId(parentId); if (parentMember == null) { break; } parentId = parentMember.getRefererId(); if (StrUtil.isBlank(parentMember.getRefererId())) { flag = true; } } if (StrUtil.isNotBlank(ids)) { videoMember.setRefererIds(ids); } this.baseMapper.updateById(videoMember); return new FebsResponse().success().message("注册成功"); } @Override public FebsResponse toLogin(LoginDto loginDto) { String md5Pwd = SecureUtil.md5(loginDto.getPassword()); VideoMemberEntity videoMember = this.baseMapper.selectInfoByAccountAndPwd(loginDto.getAccount(), md5Pwd); if (videoMember == null) { throw new FebsException("用户不存在或账号密码错误"); } if (videoMember.ACCOUNT_STATUS_DISABLED.equals(videoMember.getAccountStatus())) { throw new FebsException("该账号存在异常, 暂限制登录"); } String redisKey = AppContants.APP_LOGIN_PREFIX + videoMember.getId(); String existToken = redisUtils.getString(redisKey); if (StrUtil.isNotBlank(existToken)) { Object o = redisUtils.get(existToken); if (ObjectUtil.isNotEmpty(o)) { redisUtils.del(existToken); } } String token = IdUtil.simpleUUID(); redisUtils.set(token, JSONObject.toJSONString(videoMember), 360000); redisUtils.set(redisKey, token, 360000); Map authInfo = new HashMap<>(); authInfo.put("token", token); authInfo.put("rasToken", generateAsaToken(token)); return new FebsResponse().success().data(authInfo); } public String generateAsaToken(String token) { RSA rsa = new RSA(null, AppContants.PUBLIC_KEY); return rsa.encryptBase64(token + "_" + System.currentTimeMillis(), KeyType.PublicKey); } }