pom.xml
@@ -22,9 +22,17 @@ <swagger.ui>2.9.2</swagger.ui> <tomcat.version>9.0.31</tomcat.version> <hutool.version>5.3.1</hutool.version> <mapstruct.version>1.3.1.Final</mapstruct.version> </properties> <dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> @@ -228,6 +236,27 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build> </project> src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
New file @@ -0,0 +1,15 @@ package cc.mrbird.febs.common.utils; import cc.mrbird.febs.video.entity.VideoMemberEntity; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; public class LoginUserUtil { public static VideoMemberEntity getLoginUser() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); return (VideoMemberEntity) request.getSession().getAttribute("member"); } } src/main/java/cc/mrbird/febs/video/controller/ApiVideoMemberController.java
New file @@ -0,0 +1,71 @@ package cc.mrbird.febs.video.controller; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.video.dto.ApiMyVideoCollectionDto; import cc.mrbird.febs.video.dto.ApiMyVideoHistoryDto; 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 io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @Slf4j @CrossOrigin("*") @RequiredArgsConstructor @RestController @RequestMapping(value = "/api/member") public class ApiVideoMemberController { private final IApiVideoMemberService memberService; @ApiOperation(value = "退出登录", notes = "退出登录") @PostMapping(value = "/logout") public FebsResponse logout() { return memberService.logout(); } @ApiOperation(value = "获取用户信息", notes = "获取用户信息") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiVideoMemberVo.class) }) @GetMapping(value = "/findMemberInfo") public FebsResponse findMemberInfo() { return memberService.findMemberInfo(); } @ApiOperation(value = "我的收藏") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiMyVideoCollectionVo.class) }) @PostMapping(value = "/myCollection") public FebsResponse myCollection(@RequestBody ApiMyVideoCollectionDto apiMyVideoCollectionDto) { return memberService.myCollection(apiMyVideoCollectionDto); } @ApiOperation(value = "观看历史") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiMyVideoHistoryVo.class) }) @PostMapping(value = "/myHistory") public FebsResponse myHistory(@RequestBody ApiMyVideoHistoryDto apiMyVideoHistoryDto) { return memberService.myHistory(apiMyVideoHistoryDto); } @ApiOperation(value = "视频VIP价格", notes = "视频VIP价格") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiVipCostVo.class) }) @GetMapping(value = "/vipCostInfo") public FebsResponse vipCostInfo() { return memberService.vipCostInfo(); } } src/main/java/cc/mrbird/febs/video/conversion/VideoMemberConversion.java
New file @@ -0,0 +1,15 @@ package cc.mrbird.febs.video.conversion; import cc.mrbird.febs.video.entity.VideoMemberEntity; import cc.mrbird.febs.video.vo.ApiVideoMemberVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @Mapper public abstract class VideoMemberConversion { public static final VideoMemberConversion INSTANCE = Mappers.getMapper(VideoMemberConversion.class); public abstract ApiVideoMemberVo entityToVo(VideoMemberEntity videoMemberEntity); } src/main/java/cc/mrbird/febs/video/dto/ApiMyVideoCollectionDto.java
New file @@ -0,0 +1,19 @@ package cc.mrbird.febs.video.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiMyVideoCollectionDto", description = "接收参数类") public class ApiMyVideoCollectionDto { @ApiModelProperty(value = "一页多少个", example = "10") private Integer pageSize; @ApiModelProperty(value = "页码", example = "1") private Integer pageNum; @ApiModelProperty(hidden = true) private Long memberId; } src/main/java/cc/mrbird/febs/video/dto/ApiMyVideoHistoryDto.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.video.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiMyVideoHistoryDto", description = "接收参数类") public class ApiMyVideoHistoryDto { @ApiModelProperty(value = "一页多少个", example = "10") private Integer pageSize; @ApiModelProperty(value = "页码", example = "1") private Integer pageNum; @ApiModelProperty(hidden = true) private Long memberId; } src/main/java/cc/mrbird/febs/video/entity/DataDictionaryCustom.java
New file @@ -0,0 +1,19 @@ package cc.mrbird.febs.video.entity; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("data_dictionary_custom") public class DataDictionaryCustom extends BaseEntity { private String type; private String code; private String value; private String description; } src/main/java/cc/mrbird/febs/video/mapper/DataDictionaryCustomMapper.java
New file @@ -0,0 +1,14 @@ package cc.mrbird.febs.video.mapper; import cc.mrbird.febs.video.entity.DataDictionaryCustom; import cc.mrbird.febs.video.vo.ApiVipCostVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; public interface DataDictionaryCustomMapper extends BaseMapper<DataDictionaryCustom> { List<ApiVipCostVo> selectApiVipCostByType(@Param("type") String type); } src/main/java/cc/mrbird/febs/video/mapper/VideoCollectionMapper.java
New file @@ -0,0 +1,17 @@ package cc.mrbird.febs.video.mapper; import cc.mrbird.febs.video.dto.ApiMyVideoCollectionDto; import cc.mrbird.febs.video.dto.ApiMyVideoHistoryDto; import cc.mrbird.febs.video.entity.VideoCollectionEntity; import cc.mrbird.febs.video.vo.ApiMyVideoCollectionVo; import cc.mrbird.febs.video.vo.ApiMyVideoHistoryVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Param; public interface VideoCollectionMapper extends BaseMapper<VideoCollectionEntity> { IPage<ApiMyVideoCollectionVo> selectApiVideoCollectionInPage(IPage<ApiMyVideoCollectionVo> page, @Param("record")ApiMyVideoCollectionDto apiMyVideoCollectionDto); IPage<ApiMyVideoHistoryVo> selectApiMyVideoHistoryInPage(IPage<ApiMyVideoHistoryVo> page, @Param("record")ApiMyVideoHistoryDto apiMyVideoHistoryDto); } src/main/java/cc/mrbird/febs/video/service/IApiVideoMemberService.java
@@ -1,6 +1,8 @@ package cc.mrbird.febs.video.service; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.video.dto.ApiMyVideoCollectionDto; import cc.mrbird.febs.video.dto.ApiMyVideoHistoryDto; import cc.mrbird.febs.video.dto.LoginDto; import cc.mrbird.febs.video.dto.RegisterDto; import cc.mrbird.febs.video.entity.VideoMemberEntity; @@ -11,4 +13,14 @@ FebsResponse register(RegisterDto registerDto); FebsResponse toLogin(LoginDto loginDto); FebsResponse logout(); FebsResponse findMemberInfo(); FebsResponse myCollection(ApiMyVideoCollectionDto apiMyVideoCollectionDto); FebsResponse myHistory(ApiMyVideoHistoryDto apiMyVideoHistoryDto); FebsResponse vipCostInfo(); } src/main/java/cc/mrbird/febs/video/service/impl/ApiVideoMemberServiceImpl.java
@@ -3,13 +3,24 @@ 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.ApiMyVideoCollectionDto; import cc.mrbird.febs.video.dto.ApiMyVideoHistoryDto; import cc.mrbird.febs.video.dto.LoginDto; import cc.mrbird.febs.video.dto.RegisterDto; import cc.mrbird.febs.video.entity.DataDictionaryCustom; import cc.mrbird.febs.video.entity.VideoMemberEntity; import cc.mrbird.febs.video.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.video.mapper.VideoCollectionMapper; import cc.mrbird.febs.video.mapper.VideoMemberMapper; 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; @@ -17,13 +28,15 @@ 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.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @@ -32,6 +45,8 @@ public class ApiVideoMemberServiceImpl extends ServiceImpl<VideoMemberMapper, VideoMemberEntity> implements IApiVideoMemberService { private final RedisUtils redisUtils; private final VideoCollectionMapper videoCollectionMapper; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; @Override public FebsResponse register(RegisterDto registerDto) { @@ -39,28 +54,17 @@ 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.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(); @@ -123,6 +127,45 @@ 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); return new FebsResponse().success().data(apiVideoMemberVo); } @Override public FebsResponse myCollection(ApiMyVideoCollectionDto apiMyVideoCollectionDto) { IPage<ApiMyVideoCollectionVo> page = new Page<>(apiMyVideoCollectionDto.getPageNum(), apiMyVideoCollectionDto.getPageSize()); Long id = LoginUserUtil.getLoginUser().getId(); apiMyVideoCollectionDto.setMemberId(id); IPage<ApiMyVideoCollectionVo> pages = videoCollectionMapper.selectApiVideoCollectionInPage(page, apiMyVideoCollectionDto); return new FebsResponse().success().data(pages); } @Override public FebsResponse myHistory(ApiMyVideoHistoryDto apiMyVideoHistoryDto) { IPage<ApiMyVideoHistoryVo> page = new Page<>(apiMyVideoHistoryDto.getPageNum(), apiMyVideoHistoryDto.getPageSize()); Long id = LoginUserUtil.getLoginUser().getId(); apiMyVideoHistoryDto.setMemberId(id); IPage<ApiMyVideoHistoryVo> pages = videoCollectionMapper.selectApiMyVideoHistoryInPage(page, apiMyVideoHistoryDto); return new FebsResponse().success().data(pages); } @Override public FebsResponse vipCostInfo() { List<ApiVipCostVo> dataDictionaryCustoms = dataDictionaryCustomMapper.selectApiVipCostByType("VIP_COST"); return new FebsResponse().success().data(dataDictionaryCustoms); } public String generateAsaToken(String token) { RSA rsa = new RSA(null, AppContants.PUBLIC_KEY); src/main/java/cc/mrbird/febs/video/vo/ApiMyVideoCollectionVo.java
New file @@ -0,0 +1,22 @@ package cc.mrbird.febs.video.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiMyVideoCollectionVo", description = "返回参数类") public class ApiMyVideoCollectionVo { @ApiModelProperty(value = "视频ID") private Long id; @ApiModelProperty(value = "标题") private String title; @ApiModelProperty(value = "简介") private String intro; @ApiModelProperty(value = "缩略图") private String thumb; } src/main/java/cc/mrbird/febs/video/vo/ApiMyVideoHistoryVo.java
New file @@ -0,0 +1,31 @@ package cc.mrbird.febs.video.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiMyVideoHistoryVo", description = "返回参数类") public class ApiMyVideoHistoryVo { @ApiModelProperty(value = "视频ID") private Long id; @ApiModelProperty(value = "标题") private String title; @ApiModelProperty(value = "简介") private String intro; @ApiModelProperty(value = "缩略图") private String thumb; @ApiModelProperty(value = "章节名称") private String name; @ApiModelProperty(value = "视频地址") private String videoUrl; @ApiModelProperty(value = "资源ID") private Long sourceId; } src/main/java/cc/mrbird/febs/video/vo/ApiVideoMemberVo.java
New file @@ -0,0 +1,105 @@ package cc.mrbird.febs.video.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiVideoMemberVo", description = "返回参数类") public class ApiVideoMemberVo { private Long id; /** * 账号 */ @ApiModelProperty(value = "账号") private String account; /** * 昵称 */ @ApiModelProperty(value = "昵称") private String name; /** * 头像 */ @ApiModelProperty(value = "头像") private String avatar; /** * 手机号 */ @ApiModelProperty(value = "手机号") private String phone; /** * 邮箱 */ @ApiModelProperty(value = "邮箱") private String email; /** * 邀请码 */ @ApiModelProperty(value = "邀请码") private String inviteId; /** * 父级邀请码 */ // @ApiModelProperty(value = "父级邀请码") // private String refererId; /** * 父级邀请码链 */ // @ApiModelProperty(value = "父级邀请码链") // private String refererIds; /** * 是否会员 1/是 2/否 */ @ApiModelProperty(value = "是否会员 1/是 2/否") private Integer isVip; /** * 是 */ public static final Integer ISVIP_STATUS_YES = 1; /** * 否 */ public static final Integer ISVIP_STATUS_NO = 2; /** * 账号状态 1/正常 2/禁用 */ @ApiModelProperty(value = "账号状态 1/正常 2/禁用") private Integer accountStatus; /** * 启用 */ public static final Integer ACCOUNT_STATUS_ENABLE = 1; /** * 禁用 */ public static final Integer ACCOUNT_STATUS_DISABLED = 2; /** * 账号类型 1/正常 2/测试 */ @ApiModelProperty(value = "账号类型 1/正常 2/测试") private Integer accountType; /** * 正常账号 */ public static final Integer ACCOUNT_TYPE_NORMAL = 1; /** * 测试账号 */ public static final Integer ACCOUNT_TYPE_TEST = 2; } src/main/java/cc/mrbird/febs/video/vo/ApiVipCostVo.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.video.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiVipMemberVo", description = "返回参数类") public class ApiVipCostVo { @ApiModelProperty(value = "编码") private String code; @ApiModelProperty(value = "价格") private String value; @ApiModelProperty(value = "描述") private String description; } src/main/resources/mapper/modules/DataDictionaryCustomMapper.xml
New file @@ -0,0 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.video.mapper.DataDictionaryCustomMapper"> <select id="selectApiVipCostByType" resultType="cc.mrbird.febs.video.vo.ApiVipCostVo"> select a.code code, a.value value, a.description description from data_dictionary_custom a where a.type = #{type} </select> </mapper> src/main/resources/mapper/modules/VideoCollectionMapper.xml
New file @@ -0,0 +1,41 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.video.mapper.VideoCollectionMapper"> <select id="selectApiVideoCollectionInPage" resultType="cc.mrbird.febs.video.vo.ApiMyVideoCollectionVo"> select a.video_id id, b.title title, b.intro intro, b.thumb thumb from video_collection a left join video_master_info b on a.video_id = b.id <where> <if test="record.memberId != null"> and a.member_id=#{record.memberId} </if> </where> order by a.created_time desc </select> <select id="selectApiMyVideoHistoryInPage" resultType="cc.mrbird.febs.video.vo.ApiMyVideoHistoryVo"> select a.video_id id, b.title title, b.intro intro, b.thumb thumb, c.name name, c.video_url videoUrl, c.source_id sourceId from video_history a left join video_master_info b on a.video_id = b.id left join video_master_items c on a.video_item_id = c.id <where> <if test="record.memberId != null"> and a.member_id=#{record.memberId} </if> </where> order by a.created_time desc </select> </mapper>