feat(video): 添加视频查看权限控制功能
All checks were successful
ZhenTu-BE/pipeline/head This commit looks good

- 新增视频查看权限相关数据结构和接口
- 实现用户视频查看记录的创建和更新逻辑
- 添加视频查看权限的检查和记录功能
-优化分布式环境下的并发控制
This commit is contained in:
2025-09-18 18:42:53 +08:00
parent 7820a282d9
commit 7a35551a7b
5 changed files with 645 additions and 1 deletions

View File

@@ -0,0 +1,119 @@
package com.ycwl.basic.model.mobile.video.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 视频查看权限响应DTO
* 包含用户查看视频的权限信息和限制详情
*/
@Data
public class VideoViewPermissionDTO {
/**
* 是否可以查看
*/
@JsonProperty("canView")
private Boolean canView;
/**
* 是否无限制查看
*/
private Boolean isUnlimited;
/**
* 当前查看次数
*/
private Integer currentViewCount;
/**
* 最大查看次数(0表示无限制)
*/
private Integer maxViewCount;
/**
* 时间限制(秒,0表示无限制)
*/
private Integer timeLimit;
/**
* 剩余完整查看次数
*/
private Integer remainingViews;
/**
* 权限信息描述
*/
private String message;
/**
* 是否为限时查看模式
*/
private Boolean isTimeLimitMode;
public VideoViewPermissionDTO() {
this.canView = true;
this.isUnlimited = false;
this.currentViewCount = 0;
this.maxViewCount = 0;
this.timeLimit = 0;
this.remainingViews = 0;
this.isTimeLimitMode = false;
}
/**
* 创建无限制查看的权限对象
*/
public static VideoViewPermissionDTO createUnlimitedPermission(Integer currentViewCount) {
VideoViewPermissionDTO dto = new VideoViewPermissionDTO();
dto.setCanView(true);
dto.setIsUnlimited(true);
dto.setCurrentViewCount(currentViewCount);
dto.setMessage("无限制查看");
return dto;
}
/**
* 创建完整查看权限对象
*/
public static VideoViewPermissionDTO createFullViewPermission(Integer currentViewCount, Integer maxViewCount) {
VideoViewPermissionDTO dto = new VideoViewPermissionDTO();
dto.setCanView(true);
dto.setIsUnlimited(false);
dto.setCurrentViewCount(currentViewCount);
dto.setMaxViewCount(maxViewCount);
dto.setRemainingViews(Math.max(0, maxViewCount - currentViewCount));
dto.setMessage("完整查看模式,剩余" + dto.getRemainingViews() + "");
return dto;
}
/**
* 创建限时查看权限对象
*/
public static VideoViewPermissionDTO createTimeLimitPermission(Integer currentViewCount, Integer maxViewCount, Integer timeLimit) {
VideoViewPermissionDTO dto = new VideoViewPermissionDTO();
dto.setCanView(true);
dto.setIsUnlimited(false);
dto.setIsTimeLimitMode(true);
dto.setCurrentViewCount(currentViewCount);
dto.setMaxViewCount(maxViewCount);
dto.setTimeLimit(timeLimit);
dto.setRemainingViews(0);
dto.setMessage("限时查看模式,每次可查看" + timeLimit + "");
return dto;
}
/**
* 创建禁止查看权限对象
*/
public static VideoViewPermissionDTO createNoPermission(Integer currentViewCount, Integer maxViewCount) {
VideoViewPermissionDTO dto = new VideoViewPermissionDTO();
dto.setCanView(false);
dto.setIsUnlimited(false);
dto.setCurrentViewCount(currentViewCount);
dto.setMaxViewCount(maxViewCount);
dto.setRemainingViews(0);
dto.setMessage("已达到查看次数限制,无法继续观看");
return dto;
}
}

View File

@@ -0,0 +1,57 @@
package com.ycwl.basic.model.pc.video.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* 用户视频查看记录实体
* 记录用户查看vlog视频的次数和时间
*/
@Data
@TableName("user_video_view_record")
public class UserVideoViewEntity {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 视频ID
*/
private Long videoId;
/**
* 景区ID
*/
private Long scenicId;
/**
* 完整查看次数
*/
private Integer viewCount;
/**
* 最后查看时间
*/
private Date lastViewTime;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}