视频点播共享系统项目
视频点播共享系统
一、项目功能
搭建⼀个共享点播系统,服务器支持用户通过前端浏览器访问服务器,获取展示与观看和操作的界面,最终实现视频的上传以及观看和删改查等基础管理功能。
二、开发环境
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. 视频ID
2. 视频名称
3. 视频描述信息
4. 视频文件的URL路径(加上相对根目录实际上就是实际存储路径)
5. 视频封面图片的URL路径(只是链接,加上相对根目录才是实际的存储路径)
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
认识:
REST
是Representational State Transfer
的缩写,一个架构符合它为RESTful
架构。RESTful
架构可以充分的利用HTTP
协议的各种功能,就称HTTP
协议的最佳实践,正文通常采用JSON
格式RESTful API
是一种软件架构风格、设计风格,可以让软件更加清晰,更简洁,更有层次,可维护性更好.
restful
使用五种HTTP
方法,对应CRUD
(增删改查) 操作:
GET
表示查询获取POST
对应新增PUT
对应修改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;
}
原文地址:https://blog.csdn.net/s2501805787/article/details/145143007
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!