自学内容网 自学内容网

视频点播共享系统项目

一、项目功能

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

二、开发环境

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认识:

  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;
}

原文地址:https://blog.csdn.net/s2501805787/article/details/145143007

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!