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.LoginUserUtil; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.ShareCodeUtil; import cc.mrbird.febs.video.conversion.VideoMemberConversion; import cc.mrbird.febs.video.dto.*; import cc.mrbird.febs.video.entity.AppVersion; import cc.mrbird.febs.video.entity.DataDictionaryCustom; import cc.mrbird.febs.video.entity.VideoMemberEntity; import cc.mrbird.febs.video.entity.VideoVipInfoEntity; import cc.mrbird.febs.video.mapper.*; import cc.mrbird.febs.video.service.IApiVideoMemberService; import cc.mrbird.febs.video.vo.ApiMyVideoCollectionVo; import cc.mrbird.febs.video.vo.ApiMyVideoHistoryVo; import cc.mrbird.febs.video.vo.ApiVideoMemberVo; import cc.mrbird.febs.video.vo.ApiVipCostVo; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.collection.CollUtil; 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @Service @RequiredArgsConstructor public class ApiVideoMemberServiceImpl extends ServiceImpl implements IApiVideoMemberService { private final RedisUtils redisUtils; private final VideoCollectionMapper videoCollectionMapper; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final AppVersionMapper appVersionMapper; private final VideoVipInfoMapper videoVipInfoMapper; @Override public FebsResponse register(RegisterDto registerDto) { VideoMemberEntity videoMember = this.baseMapper.selectInfoByAccount(registerDto.getAccount()); if (videoMember != null) { throw new FebsException("该账号已被占用"); } videoMember = new VideoMemberEntity(); if(StrUtil.isNotEmpty(registerDto.getInviteId())){ VideoMemberEntity videoMemberEntity = this.baseMapper.selectInfoByInviteId(registerDto.getInviteId()); if (ObjectUtil.isEmpty(videoMemberEntity)) { throw new FebsException("邀请码不存在"); } videoMember.setRefererId(registerDto.getInviteId()); } videoMember.setPassword(SecureUtil.md5(registerDto.getPassword())); videoMember.setAccount(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); } @Override public FebsResponse logout() { Long id = LoginUserUtil.getLoginUser().getId(); redisUtils.del(AppContants.APP_LOGIN_PREFIX + id); return new FebsResponse().success().message("退出登录"); } @Override public FebsResponse findMemberInfo() { Long id = LoginUserUtil.getLoginUser().getId(); VideoMemberEntity videoMemberEntity = this.baseMapper.selectById(id); ApiVideoMemberVo apiVideoMemberVo = VideoMemberConversion.INSTANCE.entityToVo(videoMemberEntity); List videoVipInfoEntities = videoVipInfoMapper.selectVideoVipInfoByMemberIdAndState(id, 1); if(CollUtil.isNotEmpty(videoVipInfoEntities)){ VideoVipInfoEntity videoVipInfoEntity = videoVipInfoEntities.get(0); apiVideoMemberVo.setExpireTime(videoVipInfoEntity.getExpireTime()); apiVideoMemberVo.setVipType(videoVipInfoEntity.getVipType()); } return new FebsResponse().success().data(apiVideoMemberVo); } @Override public FebsResponse myCollection(ApiMyVideoCollectionDto apiMyVideoCollectionDto) { IPage page = new Page<>(apiMyVideoCollectionDto.getPageNum(), apiMyVideoCollectionDto.getPageSize()); Long id = LoginUserUtil.getLoginUser().getId(); apiMyVideoCollectionDto.setMemberId(id); IPage pages = videoCollectionMapper.selectApiVideoCollectionInPage(page, apiMyVideoCollectionDto); return new FebsResponse().success().data(pages); } @Override public FebsResponse myHistory(ApiMyVideoHistoryDto apiMyVideoHistoryDto) { IPage page = new Page<>(apiMyVideoHistoryDto.getPageNum(), apiMyVideoHistoryDto.getPageSize()); Long id = LoginUserUtil.getLoginUser().getId(); apiMyVideoHistoryDto.setMemberId(id); IPage pages = videoCollectionMapper.selectApiMyVideoHistoryInPage(page, apiMyVideoHistoryDto); return new FebsResponse().success().data(pages); } @Override public FebsResponse vipCostInfo() { List dataDictionaryCustoms = dataDictionaryCustomMapper.selectApiVipCostByType("VIP_COST"); return new FebsResponse().success().data(dataDictionaryCustoms); } @Override public List findAppVersion() { return appVersionMapper.selectList(null); } @Override public FebsResponse updateName(ApiUpdateNameDto apiUpdateNameDto) { Long id = LoginUserUtil.getLoginUser().getId(); VideoMemberEntity videoMemberEntity = this.baseMapper.selectById(id); if(StrUtil.isNotEmpty(apiUpdateNameDto.getName())){ videoMemberEntity.setName(apiUpdateNameDto.getName()); } if(StrUtil.isNotEmpty(apiUpdateNameDto.getAvatar())){ videoMemberEntity.setAvatar(apiUpdateNameDto.getAvatar()); } this.baseMapper.updateById(videoMemberEntity); return new FebsResponse().success().message("成功"); } public String generateAsaToken(String token) { RSA rsa = new RSA(null, AppContants.PUBLIC_KEY); return rsa.encryptBase64(token + "_" + System.currentTimeMillis(), KeyType.PublicKey); } }