VOD: 视频共享点播服务实现

news2024/11/17 11:24:09

目录

一.项目背景及原理

1.背景

2.原理

二.技术栈及项目环境

 1.技术栈

2.项目环境

三. 模块划分

四.遇到的问题及其解决方法

1.查询视频模糊匹配问题

2.前端界面的修改

五.项目预览

六. 最终版代码


        前言: 这里实现一个视频点播服务, 可以用来上传视频, 下载视频, 删除视频等.

search_engine:搜索引擎实现-CSDN博客

一.项目背景及原理

1.背景

        目前, 视频点播VOD是非常流行的, 比如bilibili、抖音等, 都属于VOD, 我们可以自己上传视频, 也可以观看别人的视频.

        因此, 可以实现一个小型的VOD, 了解VOD的原理.

2.原理

① 数据管理: 对于用户上传的视频、图片数据等, 要对其进行存储, 因此需要在数据库中管理用户上传的视频信息.

② 业务处理: 处理用户请求, 例如上传、修改、删除等.

③ 前端界面: 显示向用户展示的内容, 并提供用户与VOD系统交互的界面.

二.技术栈及项目环境

 1.技术栈

        后端:C/C++(C++11), STL, cpp-httplib, mysql

        前端:html, css, js, jQuery, Ajax

2.项目环境

        CentOS 7, vim, g++, Makefile, VSCode, MySQL

三. 模块划分

四.遇到的问题及其解决方法

1.查询视频模糊匹配问题

        查询是分为准确查询和模糊查询的。想要准确的查询单个视频相对比较容易实现,可以直接判断数据库中是否存在该视频名字即可。但是如果用户只输入视频名字的一部分,那么想要查找到就需要考虑模糊匹配的问题了。

        这个其实也并不复杂,主要需要修改的就是调用的mysql语句:

select * from tb_video where name like '%%%s%%';

        采用模糊查询语句调用。

解决代码:

// 对mysql进行查询全部操作
bool SelectAll(Json::Value *videos)
{
    #define SELECTALL_VIDEO "select * from tb_video;"
    // 保护查询与保存结果到本地的过程
    mutex_.lock();
    // 查询
    bool ret = MysqlQuery(mysql_, SELECTALL_VIDEO);
    if(ret == false)
    {
        mutex_.unlock();
        return false;
    }
    // 获取查询结果集
    MYSQL_RES *res = mysql_store_result(mysql_);
    if(res == nullptr)
    {
        std::cout << "mysql store result failed\n";
        mutex_.unlock();
        return false;
    }
    mutex_.unlock();
    // 获取结果集的行数
    int num_rows = mysql_num_rows(res);
    for(int i = 0; i < num_rows; ++i)
    {
        // 获取结果集的行内容
        MYSQL_ROW row = mysql_fetch_row(res);
        Json::Value video;
        video["id"] = atoi(row[0]);
        video["name"] = row[1];
        video["info"] = row[2];
        video["video"] = row[3];
        video["image"] = row[4];
        // 插入到videos中
        videos->append(video);
    }

    // 自动释放内存
    mysql_free_result(res);
    return true;
}

// 查询所有视频, 以及模糊查询
// SelectAll这里包括SelectLike
static void SelectAll(const httplib::Request &req, httplib::Response &rsp)
{
    // 默认All查询
    bool select_flag = true;
    std::string search_key;
    if(req.has_param("search") == true)
    {
        // 模糊匹配Like
        select_flag = false;
        search_key = req.get_param_value("search");
    }
    Json::Value videos;
    if(select_flag == true)
    {
        // 查询所有视频
        if(tb_video->SelectAll(&videos) == false)
        {
            // 查询所有视频失败, 返回失败响应
            rsp.status = 500;
            rsp.body = R"({"result": false, "reason":"查询数据库指定视频信息失败"})";
            rsp.set_header("Content-Type", "application/json");
            return;
        }
    }
    else
    {
        // 模糊查询
        if(tb_video->SelectLike(search_key, &videos) == false)
        {
            // 模糊视频失败, 返回失败响应
            rsp.status = 500;
            rsp.body = R"({"result": false, "reason":"查询数据库匹配视频信息失败"})";
            rsp.set_header("Content-Type", "application/json");
            return;
        }
    }

    // 3. 组织响应正文(json格式的字符串)
    JsonUtil::Serialize(videos, &rsp.body);
    rsp.set_header("Content-Type", "application/json");
    return;
}

2.前端界面的修改

        对于前端这一方面,我的储备知识非常的少,并且此项目主要是为了将HTTP与数据库之间进行整合,用于练习学习过的操作系统、网络、数据库等知识的,因此这里就选择了一个开源的免费的视频点播界面的模板,仅对该模板进行修改,修改出一个自己想要的界面。

        虽然这里使用了模板,但是修改起来也不容易。因此学习了一些简单的HTML标签、CSS的语法和js一些操作。

        只不过在修改前端界面的过程中,依旧遇到了很多的问题,通过查阅相关资料,以及使用chatgpt、bing等工具进行修改。

五.项目预览

六. 最终版代码

gitee仓库:冰果滴/VOD

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot读取application.properties中文乱码问题

目录 1 前言&#xff1a; 2 本地环境中的解决方案&#xff08;以idea为例&#xff09; 3 全部解决方案 1 前言&#xff1a; 初用properties,读取java properties文件的时候如果value是中文&#xff0c;会出现乱码的问题。我们首先需要明了乱码问题的根源。在 Java 中&#x…

基于jsp,ssm物流快递管理系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分&#xff0c;功能介绍如下&#xff1a; 一、用户(前台)功能&#xff1a; 用…

Servlet 上下文参数

7)Servlet上下文对象&#xff1a;ServletContext生活中的例子&#xff1a;张三和李四在不远处窃窃私语&#xff0c;并且频繁的对着你坏笑。你肯定会跑过去问&#xff1a;你们俩在聊什么&#xff1f;注意&#xff1a;此处的聊什么&#xff0c;其实就是你在咨询他们聊天的上下文&…

九河云多云管理平台优劣势分析,使用评测!

多数情况下&#xff0c;仅依靠公有云不足以支撑企业发展。企业的某些特定需求还需要继续依赖私有云和传统IT服务。混合、多云架构往往是企业的唯一选择&#xff0c;但其设置和运行却非常复杂&#xff0c;为了管理混合架构&#xff0c;大多数企业已逐步转向多云模式&#xff0c;…

Spring Task(定时任务)框架

文章目录 一、Spring Task介绍二、cron表达式1.cron表达式介绍2.cron表达式在线生成器 三、fixedDelay四、fixedRate五、initialDelay六、Spring Task的使用1.导入maven坐标spring-context2.启动类添加注解EnableScheduling开启任务调度3.自定义定时任务类 一、Spring Task介绍…

Realtek 5G pcie网卡 RTL8126-CG简介

总shu&#xff1a;PCIE 5G网卡方案“RTL8126-CG”采用QFN56封装&#xff0c;面积8 x 8毫米&#xff0c;非常小巧&#xff0c;提供一个RJ-45网口、两个USB 3.x接口。它走的是PCIe 3.0 x1系统通道&#xff0c;搭配超五类网线&#xff0c;可以在长达100米的距离上提供满血的5Gbps网…

Jmeter性能测试入门之常用组件

一个jmeter的脚本通常包含线程组取样器断言定时器逻辑控制器配置元件监听器 线程组部分用法介绍&#xff1a; 【普通线程组】&#xff1a; **线程数&#xff1a;**可以理解为虚拟用户数 **Ramp-Up时间(秒)&#xff1a;**运行指定线程数需要的时间 **循环次数&#xff1a;**勾…

java基础+数据库基础+系统+JVM问题

的哎的哎 1、基础部分 java线程池 队列的选择 答&#xff1a; SingleThreadPool:适用于多个任务顺序执行的场景。 它使用的是LinkedBlockingQueue<>()&#xff0c;无界的阻塞队列&#xff0c;就意味着会有内存溢出的风险。 FixedThreadPool: 适用于任务量固定耗时长的…

QDDR究竟是什么?

QDDR究竟是什么? 在当今的高科技时代&#xff0c;我们经常遇到各种各样的缩写和术语&#xff0c;其中QDDR就是其中一个。那么&#xff0c;究竟什么是QDDR呢&#xff1f; QDDR&#xff0c;全称Quad Data Rate&#xff0c;是一种同步动态随机存储器&#xff08;SDRAM&#xff09…

验证链(CoVe)降低LLM中的幻觉10.31

验证链&#xff08;CoVE&#xff09;降低LLM中的幻觉 摘要1 引言2 相关工作3 验证链&#xff08;Chain-of-Verification&#xff09;3.1 生成基准回答3.2 计划验证3.3 执行验证3.4 最终验证的回答 4 实验&#xff08;直译&#xff09;4.1 任务4.1.1 WIKIDATA4.1.2 WIKI-CATEGOR…

应用于智慧矿山的皮带跑偏视频分析AI算法

一、引言 随着科技的发展&#xff0c;人工智能技术已经在各个领域得到广泛应用。而在智慧矿山领域&#xff0c;皮带跑偏视频分析是其中一个重要的应用方向。本文将详细介绍皮带跑偏视频分析AI算法的原理&#xff0c;以期为智慧矿山的发展提供有益的参考。 二、算法原理 1. 视…

【3妹教我学历史-秦朝史】2 秦穆公-韩原之战

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;2哥&#xff0c;今天下班这么早&#…

CT MR 三维重建可视化系统

前言 本文通过研究医学可视化的不同算法&#xff0c;在 vc环境下&#xff0c;以可视化软件包VTK 为平台&#xff0c;编程设计实现了三维建模系统&#xff0c;实现了 DICOM图像的三维重建。 材料与方法 使用符合 DICOM 标准的临床 CT、MRI图像数据&#xff0c;在 vc环境下&…

高等数学公式

目录 一.高中二.高数基础三.高数第一章 空间解析几何与向量代数2.向量代数6.二次曲面 第二章 多元函数的微分学第三章 重积分一、二重积分二、 三重积分直角坐标下三重积分的计算柱面坐标下三重积分的计算球面坐标下三重积分的计算曲面面积 第四章 曲线积分与曲面积分1、对弧长…

Qt常见类名关系整理

1、QAbstractItemModel与QAbstractItemView 模型的基类: The QAbstractItemModel class provides the abstract interface for item model classes. Inherited By: QAbstractListModel&#xff0c;QAbstractProxyModel,and QAbstractTableModel 视图的基类: The QAbstractIte…

代购商城源码是否可以定制开发?

定制开发&#xff0c;符合个性需求 代购商城源码是现代电子商务中的重要工具&#xff0c;它为代购商提供了建立在线店铺、管理产品和订单、处理支付和物流等功能。然而&#xff0c;对于不同的代购商而言&#xff0c;在源码的基础上进行个性化定制开发无疑是提升竞争力和用户体验…

高效办公必备:不同路径文件一键批量移动到同一目录的技巧

在高效办公中&#xff0c;文件的批量移动和管理是一项常见的任务。有时候&#xff0c;我们需要将文件从不同的路径移动到同一个目录中&#xff0c;以便于管理和查找。手动一个一个地移动文件不仅耗时而且容易出错。因此&#xff0c;掌握一键批量移动不同路径文件到同一目录的技…

【CSDN 每日一练 ★☆☆】【二叉树/递归】二叉树的最小深度

【CSDN 每日一练 ★☆☆】【二叉树/递归】二叉树的最小深度 二叉树 递归 题目 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 示例 1&#xff1a; 输入…

visio中没有的图标怎么找以及如何导入

1、收藏夹&#xff1a;再也不用担心找不到图标位置了 很多人也许都不知道&#xff0c;Visio自带一个收藏夹&#xff0c;类似于浏览器的书签栏&#xff0c;可以将常用的图标收藏起来&#xff08;通过拖拉的方式&#xff09;&#xff1a; 注意&#xff1a;收藏夹里面不仅可以收藏…

图数据库Neo4j——Neo4j简介、数据结构 Docker版本的部署安装 Cypher语句的入门

前言 MySQL是一种开源的关系型数据库管理系统&#xff0c;使用SQL作为其查询语言&#xff0c;常见的关系型数据库有MySQL、Oracle、SQL Server、PostgreSQL等。相关博客文章如下&#xff1a; 【合集】MySQL的入门进阶强化——从 普通人 到 超级赛亚人 的 华丽转身PostgreSQL数…