diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/VlogUploadController.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/VlogUploadController.java index fbbe22d6b..23727f9d8 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/VlogUploadController.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/VlogUploadController.java @@ -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> page = new Page<>(current, size); // 构建查询参数 Map 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 validSortFields = Arrays.asList("CreateTime", "LikeCounts", "CommentsCounts", "Name", "Status"); + List 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 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);