实现视频交互系统中的“喜欢的视频列表”和“视频详情”功能

在构建视频交互系统时,添加"喜欢的视频列表"和"视频详情"功能能极大提升用户体验。本文将详细介绍如何在Node.js环境中使用Express框架和Mongoose来实现这两个功能。

喜欢的视频列表展示

实现喜欢的视频列表功能主要涉及到路由的设置、控制器的编写以及对数据库的查询操作。

1. 新建路由

首先,我们需要在Express的路由文件中定义一个新的路由,用于获取"喜欢的视频列表"。

js 复制代码
router
  .get('/likeList', verifyToken(), videoController.likeList)

这里的verifyToken()是一个中间件,用于验证用户的登录状态。

2. 编写Controller

在控制器文件中,我们添加likeList函数来处理视频列表的获取逻辑。

js 复制代码
exports.likeList = async (req, res) => {
  const { pageNum = 1, pageSize = 10 } = req.body;
  let likes = await VideoLike.find({
    like: 1,
    user: req.user.userinfo._id
  }).skip((pageNum - 1) * pageSize)
    .limit(pageSize)
    .populate('video', "_id title vodVideoId user");

  let likeCount = await VideoLike.countDocuments({
    like: 1,
    user: req.user.userinfo._id
  });
  res.status(200).json({ likes, likeCount });
}

这段代码主要实现了分页查询和关联查询的功能,通过Mongoose的populate方法关联查询了视频的详细信息。

3. Postman测试

使用Postman对新建的接口进行测试,确保其返回正确的数据格式和内容。

补全视频详情逻辑

接下来,我们需要完善视频详情页的功能,包括喜欢、不喜欢和订阅的状态显示。

1. 补全视频详情逻辑

在视频详情的控制器中,我们补全了之前缺失的逻辑。

js 复制代码
javascriptCopy code
exports.video = async (req, res) => {
  const { videoId } = req.params;
  let videoInfo = await Video
    .findById(videoId)
    .populate('user', '_id username cover');

  videoInfo = videoInfo.toJSON();
  videoInfo.isLike = false;
  videoInfo.isDislike = false;
  videoInfo.isSubscribe = false;

  if (req.user.userinfo) {
    const userId = req.user.userinfo._id;
    if (await VideoLike.findOne({ user: userId, video: videoId, like: 1 })) {
      videoInfo.isLike = true;
    }
    if (await VideoLike.findOne({ user: userId, video: videoId, like: -1 })) {
      videoInfo.isDislike = true;
    }
    if (await Subscribe.findOne({ user: userId, channel: videoInfo.user._id })) {
      videoInfo.isSubscribe = true;
    }
  }

  res.status(200).json(videoInfo);
}

2. Postman验证

再次使用Postman来验证补全后的视频详情接口,确保各状态正确反映。

总结

通过本文的指导,你可以在自己的视频交互系统中实现类似的"喜欢的视频列表"和"视频详情"功能。这些功能不仅提升了用户体验,还增加了应用的交互性。

相关推荐
豌豆花下猫2 小时前
Python 3.14 新特性盘点,更新了些什么?
后端·python·ai
caihuayuan52 小时前
Vue生命周期&脚手架工程&Element-UI
java·大数据·spring boot·后端·课程设计
明月与玄武5 小时前
Spring Boot中的拦截器!
java·spring boot·后端
菲兹园长5 小时前
SpringBoot统一功能处理
java·spring boot·后端
muxue1785 小时前
go语言封装、继承与多态:
开发语言·后端·golang
开心码农1号5 小时前
Go语言中 源文件开头的 // +build 注释的用法
开发语言·后端·golang
北极象6 小时前
Go主要里程碑版本及其新增特性
开发语言·后端·golang
哎哟喂_!6 小时前
深入理解 Node.js 模块化(CommonJS):原理、用法与避坑指南
node.js
lyrhhhhhhhh6 小时前
Spring框架(1)
java·后端·spring
阿里小阿希6 小时前
解决 pnpm dev 运行报错的坎坷历程
前端·node.js