视频点播共享系统项目

server/2025/1/18 2:00:35/
http://www.w3.org/2000/svg" style="display: none;">

视频点播共享系统

  • 一、项目功能
  • 二、开发环境
  • 三、技术特点
  • 四、项目模块
    • 1、数据管理模块
    • 2、网络通信模块
    • 3、业务处理模块
    • 4、前端界面模块
  • 四、项目实现
    • 1、服务端工具类实现
      • 1.1 服务端工具类实现-文件实用工具类设计
      • 1.2 服务端工具类实现-``Json``实用工具类设计
    • 2、服务端数据管理模块-视频数据表的设计
    • 3、服务端数据管理模块-数据管理类设计
    • 4、服务端业务处理模块-网络通信接口设计
    • 5、服务端业务处理模块-业务处理模块类的设计
    • 6、服务端业务处理模块-最终合并调试

一、项目功能

搭建⼀个共享点播系统,服务器支持用户通过前端浏览器访问服务器,获取展示与观看和操作的界面,最终实现视频的上传以及观看和删改查等基础管理功能。

二、开发环境

centos7.9
vim
g++
gdb
json
makefile

三、技术特点

Http服务器搭建,restful风格接口设计, json序列化,线程池,html+css+js基础

四、项目模块

1、数据管理模块

基于MYSQL进行数据管理,封装数据管理类进行数据统一访问

2、网络通信模块

搭建网络通信服务器,实现与客户端通信。

3、业务处理模块

基于HTTPLIB搭建HTTP服务器,使用restful风格进行接口设计处理客户端业务请求。

4、前端界面模块

基于基础的HTML+CSS+JS完成基于简单模板前端界面的修改与功能完成。

四、项目实现

1、服务端工具类实现

1.1 服务端工具类实现-文件实用工具类设计

在视频点播系统中因为涉及到文件上传,需要对上传的文件进行备份存储,因此首先设计封装文件操作类,这个类封装完毕之后,则在任意模块中对文件进行操作时都将变的简单化。

 1. 获取文件大小(属性) 2. 判断文件是否存在 3. 向文件写入数据 4. 从文件读取数据 5. 针对目录文件多⼀个创建目录
#ifndef _MY_UTIL_
#define _MY_UTIL_#include <iostream>
#include <string>
#include <fstream> 
#include <sstream>
#include <memory>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <jsoncpp/json/json.h>// 文件实用工具类
class FileUtil {public:FileUtil(const std::string name) : _name(name){}//构造bool Exists(){} // 判断文件是否存在size_t Size(){} // 获取文件大小bool GetContent(std::string *body){} // 获取文件数据到body中bool SetContent(const std::string &body){} // 向文件中写入数据bool CreateDirectory(){} // 针对目录时创建目录~FileUtil(){}//析构private:std::string _name; // 文件名称};

1.2 服务端工具类实现-Json实用工具类设计

使用Json库完成序列化和反序列化的功能。

 1. 实现序列化 2. 实现反序列化
// Json实用工具类class JsonUtil{public:JsonUtil(){} // 构造static bool Serialize(const Json::Value &value, std::string *body) // 序列化static bool UnSerialize(const std::string &body, Json::Value *value) // 反序列化~JsonUtil(){} //析构private:};
#endif

2、服务端数据管理模块-视频数据表的设计

在视频共享点播系统中,视频数据和图片数据都存储在文件中,所以需要在数据库中管理用户上传的每个视频信息。

 1. 视频ID2. 视频名称 3. 视频描述信息 4. 视频文件的URL路径(加上相对根目录实际上就是实际存储路径)5. 视频封面图片的URL路径(只是链接,加上相对根目录才是实际的存储路径)
mysql">drop database if exists vod_system;create database if not exists vod_system;use vod_system;create table if not exists tb_video( id int primary key auto_increment comment '视频ID',name varchar(32) comment '视频名称',info text comment '视频描述',video varchar(256) comment '视频⽂件url,加上静态资源根目录就是实际存储路径',image varchar(256) comment '封⾯图片文件url,加上静态资源根目录就是实际存储路径'
);

3、服务端数据管理模块-数据管理类设计

数据管理模块负责统一对于数据库中数据的增删改查管理,其他所有模块要进行数据的操作都通过数据管理模块完成。
然而,数据库中有可能存在很多张表,每张表中数据又有不同,要进行的数据操也各不相同,因此将数据的操作分摊到每一张表上,为每一张表中的数据操作都设计一个类,通过类实例化的对象来访问这张数据库表中的数据,这样的话当需要访问哪张表的时候,使用哪个类实例化的对象即可。

 1. 新增 2. 修改 3. 删除 4. 查询所有 5. 查询单个 6. 模糊匹配

视频信息在接口之间的传递因为字段数量可能很多,因此使用Json::Value
对象进行传递。

#ifndef _MY_DATA_
#define _MY_DATA_#include "util.hpp"
#include <unistd.h>
#include <stdlib.h>
#include <mysql/mysql.h>
#include <mutex>// id name info video image
// 定义插入语句宏,方便字符串操作
#define INSERT_VIDEO "insert tb_video values(null,'%s','%s','%s','%s');"
// 定义更新语句宏,方便字符串操作
#define UPDATE_VIDEO "update tb_video set name='%s',info='%s' where id=%d;"
// 定义删除语句宏,方便字符串操作
#define DELETE_VIDEO "delete from tb_video where id=%d;"
// 定义查找(all)语句宏,方便字符串操作
#define SELECTALL_VIDEO "select * from tb_video;"
// 定义查找(one)语句宏,方便字符串操作
#define SELECTONE_VIDEO "select * from tb_video where id=%d;"
// 定义查找(like)语句宏,方便字符串操作
#define SELECTLIKE_VIDEO "select * from tb_video where name like '%%%s%%';" // 通配符 %%%s%%-->% %s %// 用来连接的数据库信息类
class Database{public:Database( const char *user, const char *passwd, const unsigned int port):User(user),Passwd(passwd),Port(port){} // 构造const char *GetHost(){return Host;}const char *GetUser(){return User;}const char *GetPasswd(){return Passwd;}const char *GetDb(){return Db;}unsigned int GetPort(){return Port;}~Database(){} // 析构private:const char *Host = "127.0.0.1";const char *User = "root";const char *Passwd;const char *Db = "vod_system";unsigned int Port;};// 初始化句柄static MYSQL *MysqlInit(){}// 销毁句柄static void MysqlDestory(MYSQL *mysql){}// 执行语句static bool MysqlQuery(MYSQL *mysql, const std::string &sql){}// 视频信息表class TableVideo{public:TableVideo(){// 构造时初始化句柄_mysql = MysqlInit();if (_mysql == NULL)exit(1);} // 构造bool Insert(const Json::Value &video){} // 插入视频信息bool Update(int video_id, Json::Value &video){} // 更新视频信息bool Delete(int video_id){} // 删除视频信息bool SelectAll(Json::Value *videos){} // 查找全部视频bool SelectOne(int video_id, Json::Value *videos){} // 查找某一个视频bool SelectLike(const std::string &key, Json::Value *videos){} // 模糊查找~TableVideo(){// 析构时销毁句柄MysqlDestory(_mysql);} // 析构private:MYSQL *_mysql;     // 一个对象就是一个客户端,管理一张表std::mutex _mutex; // 防备操作对象在多线程中使用存在的线程安全问题};
#endif

4、服务端业务处理模块-网络通信接口设计

restful认识:

  1. RESTRepresentational State Transfer 的缩写,一个架构符合它为RESTful 架构。
  2. RESTful 架构可以充分的利用HTTP 协议的各种功能,就称HTTP 协议的最佳实践,正文通常采用JSON格式
  3. RESTful API 是一种软件架构风格、设计风格,可以让软件更加清晰,更简洁,更有层次,可维护性更好.

restful 使用五种HTTP 方法,对应CRUD(增删改查) 操作:

  1. GET 表示查询获取
  2. POST 对应新增
  3. PUT 对应修改
  4. DELETE 对应删除

5、服务端业务处理模块-业务处理模块类的设计

业务处理模块负责与客户端进行网络通信,接收客户端的请求,然后根据请求信息,明确客户端端用户的意图,进行业务处理,并进行对应的结果响应。
在视频共享点播系统中,业务处理主要包含两大功能:

1、网络通信功能的实现
2、业务功能处理的实现

其中网络通信功能的实现借助httplib库即可方便完成http服务器的搭建。
而业务处理模块所要完成的业务功能主要有:

客户端的视频数据和信息上传
客户端的视频列表展示(视频信息查询)
客户端的视频观看请求(视频数据的获取)
客户端的视频其他管理(修改,删除)功能

#include "database.hpp"
#include "util.hpp"
#include "httplib.h"#define WWWROOT "./www" // 定义根目录路径
#define VIDEO_ROOT "/video/"
#define IMAGE_ROOT "/image/"
data::TableVideo *tb_video = NULL;class Server{private:int _port;httplib::Server _srv;public:Server(int port) : _port(port) {}bool RunModule(){// 1.初始化操作-----初始化数据管理模块,创建指定的目录tb_video = new data::TableVideo();util::FileUtil(WWWROOT).CreateDirectory();std::string root = WWWROOT;std::string video_real_path = root + VIDEO_ROOT; // ./www/video/util::FileUtil(video_real_path).CreateDirectory();std::string image_real_path = root + IMAGE_ROOT; // ./www/image/util::FileUtil(image_real_path).CreateDirectory();// 2.搭建http服务器,并开始运行// a.设置静态资源根目录_srv.set_mount_point("/", WWWROOT);// b.添加请求与处理函数映射关系_srv.Post("/video", Insert);_srv.Delete("/video/(\\d+)", Delete);_srv.Put("/video/(\\d+)", Update);_srv.Get("/video/(\\d+)", SelectOne);_srv.Get("/videos", SelectAll);// c.启动服务器_srv.listen("0.0.0.0", _port);return true;}private:// 新增视频请求static void Insert(const httplib::Request &req, httplib::Response &rsp){}// 删除视频请求static void Delete(const httplib::Request &req, httplib::Response &rsp){}// 更新视频请求static void Update(const httplib::Request &req, httplib::Response &rsp){}// 查询某个视频请求static void SelectOne(const httplib::Request &req, httplib::Response &rsp){}// 查询所有视频请求static void SelectAll(const httplib::Request &req, httplib::Response &rsp){}};

6、服务端业务处理模块-最终合并调试

#include "Server.hpp"int main()
{service::Server server(9090);server.RunModule();return 0;
}

http://www.ppmy.cn/server/159227.html

相关文章

Tidb集群升级到8.5.0过程中服务器遇到的坑

TiDB 集群升级到8.5.0踩坑记&#xff1a;从 GLIBC_2.15 升级到 GLIBC_2.28YUM 仓库问题的全面解决 1. 引言 作为部门的负责人&#xff0c;我常常觉得自己是个“救火队员”。昨天 TiDB 集群又出问题了&#xff1a;查询卡顿、响应时间变长&#xff0c;重启之后问题依旧。临近下班…

20241130 RocketMQ本机安装与SpringBoot整合

目录 一、RocketMQ简介 ???1.1、核心概念 ???1.2、应用场景 ???1.3、架构设计 2、RocketMQ Server安装 3、RocketMQ可视化控制台安装与使用 4、SpringBoot整合RocketMQ实现消息发送和接收? ? ? ? ? 4.1、添加maven依赖 ???4.2、yaml配置 ???4.3、…

Mysql--实战篇--大数据量表的分页优化(自增长主键,子查询主键主查询全部,查询条件加索引,覆盖索引等)

当Mysql数据表存储大量数据时&#xff08;百万级别数据&#xff09;&#xff0c;分页查询的性能问题是一个常见的挑战。特别是当使用LIMIT和OFFSET时&#xff0c;随着OFFSET的增加&#xff0c;查询性能会显著下降。原因在于MySQL需要扫描并跳过前面的行&#xff0c;这会导致I/O…

.NET 9.0 的 Blazor Web App 项目中 Hash 变换(MD5、Pbkdf2) 使用备忘

一、生成 string 对应的 MD5 码 /// <summary>/// 生成 string 对应的 MD5 码/// </summary>/// <param name"s">需要转换的字符串 string<br/>/// 如果用于远程第三方认证&#xff0c;s username DateTime.Now.Ticks.ToString() 线下传递…

Flink开发中的优化方案

前言 在大数据处理领域&#xff0c;Apache Flink以其高吞吐量、低延迟和强大的状态管理能力&#xff0c;成为了实时流处理的首选框架。然而&#xff0c;随着数据量的不断增长和业务复杂性的提高&#xff0c;如何在Flink开发中实施有效的优化方案&#xff0c;成为了一个亟待解决…

【Leetcode 每日一题 - 扩展】3171. 找到按位或最接近 K 的子数组

问题背景 给你一个数组 n u m s nums nums 和一个整数 k k k。你需要找到 n u m s nums nums 的一个 子数组 &#xff0c;满足子数组中所有元素按位或运算 O R OR OR 的值与 k k k 的 绝对差 尽可能 小 。换言之&#xff0c;你需要选择一个子数组 n u m s [ l . . r ] n…

接口自动化入门 : Http的请求头,请求体,响应码解忻!

在进行接口自动化测试时&#xff0c;你需要了解Http的请求头、请求体和响应码的解析。 本文从3个方面介绍这篇文章 一、Http的请求头 二、请求体 三、响应码解忻 一、Http的请求头 HTTP 请求头是 HTTP 请求中的一部分&#xff0c;用于向服务器传递附加的信息。它包含在 HTTP …

2025 年将是统一网络安全的一年

到 2025 年&#xff0c;网络安全将不再只是 IT 团队专属的技术主题&#xff0c;而是将日益成为董事会层面的优先事项。随着网络攻击的频率和严重性不断增加&#xff0c;董事会将需要能够让他们了解组织安全状况的平台。 Armis 首席执行官 Yevgeny Dibrov 认为&#xff0c;统一网…