评论功能

This commit is contained in:
曹佳豪 2025-06-13 10:59:37 +08:00
parent ff26d17d11
commit 983617947a

View File

@ -1,11 +1,9 @@
package com.wzj.soopin.content.controller.admin;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tencentcloudapi.vod.v20180717.models.*;
import com.wzj.soopin.content.domain.base.BaseInfoProperties;
import com.wzj.soopin.content.domain.bo.VlogBO;
import com.wzj.soopin.content.result.GraceJSONResult;
import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.content.service.VlogUploadService;
@ -49,13 +47,31 @@ public class VlogUploadController extends BaseInfoProperties {
private IFansService fansService;
@ApiOperation("获取腾讯云点播视频列表")
@PostMapping("/list")
@GetMapping("/list")
public GraceJSONResult getVodList(
@RequestBody VlogBO vlogBO) {
@ApiParam(value = "当前页码", defaultValue = "1") @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
@ApiParam(value = "每页记录数", defaultValue = "10") @RequestParam(value = "size", required = false, defaultValue = "10") Integer size,
@ApiParam(value = "手机号(模糊查询)") @RequestParam(required = false) String mobile,
@ApiParam(value = "用户昵称(模糊查询)") @RequestParam(required = false) String nickname,
@ApiParam(value = "视频标题(模糊查询)") @RequestParam(required = false) String title,
@ApiParam(value = "文件状态") @RequestParam(required = false) String[] status,
@ApiParam(value = "文件类型") @RequestParam(required = false) String[] categories,
@ApiParam(value = "媒体文件来源") @RequestParam(required = false) String[] sourceTypes,
@ApiParam(value = "媒体文件封装格式") @RequestParam(required = false) String[] mediaTypes,
@ApiParam(value = "文件名") @RequestParam(required = false) String[] names,
@ApiParam(value = "文件名前缀") @RequestParam(required = false) String[] namePrefixes,
@ApiParam(value = "文件描述") @RequestParam(required = false) String[] descriptions,
@ApiParam(value = "标签") @RequestParam(required = false) String[] tags,
@ApiParam(value = "分类ID") @RequestParam(required = false) Long[] classIds,
@ApiParam(value = "存储地区") @RequestParam(required = false) String[] storageRegions,
@ApiParam(value = "创建时间范围-开始时间") @RequestParam(required = false) String startTime,
@ApiParam(value = "创建时间范围-结束时间") @RequestParam(required = false) String endTime,
@ApiParam(value = "排序字段", defaultValue = "CreateTime", allowableValues = "CreateTime,LikeCounts,CommentsCounts,Name,Status")
@RequestParam(required = false, defaultValue = "CreateTime") String sortField,
@ApiParam(value = "排序方式", defaultValue = "Asc", allowableValues = "Asc,Desc")
@RequestParam(required = false, defaultValue = "Asc") String sortOrder,
@ApiParam(value = "需要返回的信息类型") @RequestParam(required = false) String[] filters) {
try {
Integer current = (int)vlogBO.getCurrent();
Integer size = (int)vlogBO.getSize();
// 验证分页参数
if (current < 1) {
current = 1;
@ -64,77 +80,52 @@ public class VlogUploadController extends BaseInfoProperties {
size = 10;
}
// 根据VlogBO的orders确定排序类型
Integer sortType = 0; // 默认为按审核状态排序
String tencentCloudSortField = "CreateTime"; // 腾讯云默认排序字段
String tencentCloudSortOrder = "Asc"; // 腾讯云默认排序方式
if (vlogBO.getOrders() != null && !vlogBO.getOrders().isEmpty()) {
OrderItem orderItem = vlogBO.getOrders().get(0); // 取第一个排序项
String column = orderItem.getColumn();
boolean asc = orderItem.isAsc();
if ("status".equalsIgnoreCase(column)) {
sortType = 0;
} else if ("commentsCounts".equalsIgnoreCase(column)) {
sortType = 1;
} else if ("likeCounts".equalsIgnoreCase(column)) {
sortType = 2;
} else if ("CreateTime".equalsIgnoreCase(column) || "Name".equalsIgnoreCase(column)) {
// 如果是腾讯云支持的排序字段则直接传递给腾讯云API
tencentCloudSortField = column;
tencentCloudSortOrder = asc ? "Asc" : "Desc";
}
}
// 如果有模糊查询条件或有时间区间条件则只查询数据库
if (StringUtils.isNotBlank(vlogBO.getMobile())
|| StringUtils.isNotBlank(vlogBO.getNickname())
|| StringUtils.isNotBlank(vlogBO.getTitle())
|| StringUtils.isNotBlank(vlogBO.getStartTime())
|| StringUtils.isNotBlank(vlogBO.getEndTime())
|| (vlogBO.getStatusFilter() != null && vlogBO.getStatusFilter().length > 0)) {
// 如果有模糊查询条件或有时间区间条件,则只查询数据库
if (StringUtils.isNotBlank(mobile)
|| StringUtils.isNotBlank(nickname)
|| StringUtils.isNotBlank(title)
|| StringUtils.isNotBlank(startTime)
|| StringUtils.isNotBlank(endTime)
|| (status != null && status.length > 0)) {
// 创建分页对象
Page<Map<String, Object>> page = new Page<>(current, size);
// 构建查询参数
Map<String, Object> params = new HashMap<>();
if (StringUtils.isNotBlank(vlogBO.getMobile())) {
params.put("mobile", vlogBO.getMobile());
if (StringUtils.isNotBlank(mobile)) {
params.put("mobile", mobile);
}
if (StringUtils.isNotBlank(vlogBO.getNickname())) {
params.put("nickname", vlogBO.getNickname());
if (StringUtils.isNotBlank(nickname)) {
params.put("nickname", nickname);
}
if (StringUtils.isNotBlank(vlogBO.getTitle())) {
params.put("title", vlogBO.getTitle());
if (StringUtils.isNotBlank(title)) {
params.put("title", title);
}
if (vlogBO.getStatusFilter() != null && vlogBO.getStatusFilter().length > 0) {
params.put("status", vlogBO.getStatusFilter()[0]); // 取第一个状态值
if (status != null && status.length > 0) {
params.put("status", status[0]); // 取第一个状态值
}
params.put("sortType", sortType); // 添加排序类型参数
// 时间格式转换
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
if (StringUtils.isNotBlank(vlogBO.getStartTime())) {
if (StringUtils.isNotBlank(startTime)) {
try {
Instant instant = Instant.parse(vlogBO.getStartTime().replace("\"", ""));
Instant instant = Instant.parse(startTime.replace("\"", ""));
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
String formatted = zdt.format(formatter);
params.put("startTime", formatted);
} catch (Exception e) {
log.error("开始时间格式错误: {}", vlogBO.getStartTime());
log.error("开始时间格式错误: {}", startTime);
return GraceJSONResult.errorMsg("开始时间格式错误请使用yyyy-MM-dd HH:mm:ss格式");
}
}
if (StringUtils.isNotBlank(vlogBO.getEndTime())) {
if (StringUtils.isNotBlank(endTime)) {
try {
Instant instant = Instant.parse(vlogBO.getEndTime().replace("\"", ""));
Instant instant = Instant.parse(endTime.replace("\"", ""));
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
String formatted = zdt.format(formatter);
params.put("endTime", formatted);
} catch (Exception e) {
log.error("结束时间格式错误: {}", vlogBO.getEndTime());
log.error("结束时间格式错误: {}", endTime);
return GraceJSONResult.errorMsg("结束时间格式错误请使用yyyy-MM-dd HH:mm:ss格式");
}
}
@ -161,7 +152,18 @@ public class VlogUploadController extends BaseInfoProperties {
// 打印分页参数
log.info("分页参数 - 当前页码: {}, 每页记录数: {}, 偏移量: {}", current, size, offset);
log.info("排序参数 - 排序类型: {}, 腾讯云排序字段: {}, 腾讯云排序方式: {}", sortType, tencentCloudSortField, tencentCloudSortOrder);
log.info("排序参数 - 排序字段: {}, 排序方式: {}", sortField, sortOrder);
// 验证排序参数
List<String> validSortFields = Arrays.asList("CreateTime", "LikeCounts", "CommentsCounts", "Name", "Status");
List<String> validSortOrders = Arrays.asList("Asc", "Desc");
if (!validSortFields.contains(sortField)) {
return GraceJSONResult.errorMsg("无效的排序字段,支持的字段有:" + String.join(",", validSortFields));
}
if (!validSortOrders.contains(sortOrder)) {
return GraceJSONResult.errorMsg("无效的排序方式,只能是 Asc(升序) 或 Desc(降序)");
}
// 创建请求对象
SearchMediaRequest req = new SearchMediaRequest();
@ -170,39 +172,39 @@ public class VlogUploadController extends BaseInfoProperties {
req.setOffset(offset);
req.setLimit((long) size);
// 设置腾讯云API的排序 (只对腾讯云支持的字段有效)
// 设置排序
SortBy sort = new SortBy();
sort.setField(tencentCloudSortField);
sort.setOrder(tencentCloudSortOrder);
sort.setField(sortField);
sort.setOrder(sortOrder);
req.setSort(sort);
// 设置过滤条件
if (vlogBO.getCategories() != null && vlogBO.getCategories().length > 0) {
req.setCategories(vlogBO.getCategories());
if (categories != null && categories.length > 0) {
req.setCategories(categories);
}
if (vlogBO.getSourceTypes() != null && vlogBO.getSourceTypes().length > 0) {
req.setSourceTypes(vlogBO.getSourceTypes());
if (sourceTypes != null && sourceTypes.length > 0) {
req.setSourceTypes(sourceTypes);
}
if (vlogBO.getNames() != null && vlogBO.getNames().length > 0) {
req.setNames(vlogBO.getNames());
if (names != null && names.length > 0) {
req.setNames(names);
}
if (vlogBO.getNamePrefixes() != null && vlogBO.getNamePrefixes().length > 0) {
req.setNamePrefixes(vlogBO.getNamePrefixes());
if (namePrefixes != null && namePrefixes.length > 0) {
req.setNamePrefixes(namePrefixes);
}
if (vlogBO.getDescriptions() != null && vlogBO.getDescriptions().length > 0) {
req.setDescriptions(vlogBO.getDescriptions());
if (descriptions != null && descriptions.length > 0) {
req.setDescriptions(descriptions);
}
if (vlogBO.getTags() != null && vlogBO.getTags().length > 0) {
req.setTags(vlogBO.getTags());
if (tags != null && tags.length > 0) {
req.setTags(tags);
}
if (vlogBO.getClassIds() != null && vlogBO.getClassIds().length > 0) {
req.setClassIds(vlogBO.getClassIds());
if (classIds != null && classIds.length > 0) {
req.setClassIds(classIds);
}
if (vlogBO.getStorageRegions() != null && vlogBO.getStorageRegions().length > 0) {
req.setStorageRegions(vlogBO.getStorageRegions());
if (storageRegions != null && storageRegions.length > 0) {
req.setStorageRegions(storageRegions);
}
if (vlogBO.getFilters() != null && vlogBO.getFilters().length > 0) {
req.setFilters(vlogBO.getFilters());
if (filters != null && filters.length > 0) {
req.setFilters(filters);
}
// 调用腾讯云API获取视频列表
@ -255,43 +257,6 @@ public class VlogUploadController extends BaseInfoProperties {
mediaList.add(mediaMap);
}
}
// 根据sortType进行内存排序
if (sortType != null) {
switch (sortType) {
case 0: // 按审核状态排序
mediaList.sort((a, b) -> {
String statusA = (String) a.get("status");
String statusB = (String) b.get("status");
// 定义状态优先级未审核 > 复审核 > 通过 > 不通过
Map<String, Integer> statusPriority = new HashMap<>();
statusPriority.put("PROCESSING", 0); // 未审核
statusPriority.put("REVIEWING", 1); // 复审核
statusPriority.put("NORMAL", 2); // 通过
statusPriority.put("REJECTED", 3); // 不通过
int priorityA = statusPriority.getOrDefault(statusA, 999);
int priorityB = statusPriority.getOrDefault(statusB, 999);
return priorityA - priorityB;
});
break;
case 1: // 按评论数排序
mediaList.sort((a, b) -> {
Integer commentsA = (Integer) a.getOrDefault("commentsCounts", 0);
Integer commentsB = (Integer) b.getOrDefault("commentsCounts", 0);
return commentsB.compareTo(commentsA); // 从高到低排序
});
break;
case 2: // 按点赞数排序
mediaList.sort((a, b) -> {
Integer likesA = (Integer) a.getOrDefault("likeCounts", 0);
Integer likesB = (Integer) b.getOrDefault("likeCounts", 0);
return likesB.compareTo(likesA); // 从高到低排序
});
break;
}
}
result.put("records", mediaList); // 改为 records 以匹配前端预期
return GraceJSONResult.ok(result);