视频点播系统

项目名称:视频点播系统
项目描述: 一个用户可以通过浏览器上传视频,且对自己上传的视频进行管理,而其他用户可以通过浏览器观看视频
概要设计: 采用不太严谨的MVC框架
  model:数据管理模块--对数据进行统一管理,外界只能通过这个模块访问数据
  view: 前端界面模块--提供前端界面实现与用户的交互
  controller:业务处理模块--接收前端请求进行处理完成用户的需求

技术调研: socket, http, tcp, json, mysql, html, css, js
详细设计:
  数据管理模块: 向外提供统一的数据管理接口
    1.数据的存储:MySQL数据库–免费,远程以及统一接口–安全便于扩展
      数据库表的设计:
        视频信息表: 视频id,视频名称,视频描述,上传时间,视频文件路径,封面图片路径
    2. 封装实现数据库访问类
      视频信息的增,删,改,查 (所有,单个)
  前端界面模块: 实现前端界面能够与用户进行交互
    1. 完成前端HTML界面的编写
  业务处理模块: 接收前端请求进行业务处理最终响应
    1. http服务器的搭建: 实现与前端的网络通信–接受客户请求
      使用httplib库实现http服务器搭建
    2. 请求与响应的网络通信接口设计
      1. 静态页面请求: 首页,播放页面

      2. 动态数据请求: 视频数据信息的增删改查
        采用restful风格网络通信接口设计
          1. 基于http,正文数据使用xml或者json格式进行序列化
          2. 定义了四种操作类型:
            新增-POST,删除-DELETE,修改-PUT,获取-GET
        1. 新增视频信息
        POST /video HTTP/1.1    HTTP/1.1 200 OK
        ……           ……
        {name: “变形金刚”……}    HTTP/1.1 500 SERVER ERROR
                     ……
                     {result:false, reason:“mysql err”}
        2. 删除视频信息
        DELETE /video/1 HTTP/1.1    HTTP/1.1 200 OK
        ……             ……
        3. 修改视频信息
        PUT /video/1 HTTP/1.1    HTTP/1.1 200 OK
        ……
        {name:"", desc:""}
        4. 获取所有视频信息
        GET /video HTTP/1.1      HTTP/1.1 200 OK
        ……            ……
                      [{视频1信息}, {视频2信息}……]
        5. 获取单个视频信息
        GET /video/1 HTTP/1.1    HTTP/1.1 200 OK
        ……           ……
                     {id:…, name:…, desc:…, vp:…}
因为上传视频使用json格式比较麻烦,因此使用原生的HTML文件上传操作
编写一个简单的HTML表单数据


服务端响应如下

原生的文件上传,正文中分为多个表单数据域,每个域表示的是不同的提交的表单项(视频文件数据,封面图片数据,视频名称,视频描述)
收到请求进行解析
  1. 将视频文件数据,以及图片数据存储到对应的文件中
  2. 将视频路径,图片路径,视频名称,描述存储到数据库


具体实现:
数据管理模块:
  1. 数据存储: mysql
    1. 安装mysql服务
      mysql数据库是一个C/S架构的服务:服务器进行数据的统一管理,客户端进行远程访问操作
      mysql数据库是一个关系型数据库
    数据库的基本操作:sql
      注意事项:
        每条语句通过英文分号作为结尾; 库表字段命名不能直接使用关键字,不能使用纯数字;sql语句并不区分大小写
      库的操作:
        创建: create database if not exists db_name;
        查看所有数据库: show databases;
        选择使用的数据库: use db_name;
        查看选中的数据库: select database();
        删除库: drop database db_name;
      表的操作:
        mysql的数据类型: int-整型; DECIMAL(M,D)-浮点型; varchar(size)-字符型; datetime-日期
        表中的字段约束:
          not null: 非空约束--约束一个字段不能为NULL;
          unique: 唯一约束--约束一个字段的所有值不能重复;
          primary key: 主键约束--非空且唯一,创建主键索引
          auto_increment: 扩展属性--自增属性--只能用于整型主键
        表的创建: create table if not exists tb_name(
               id int primary key auto_increment,
               name varchar(32) not null,
               ch decimal(4, 2),
               bir datetime);
        查看库中所有表: show tables;
        查看指定表结构: desc tb_name;
        修改表结构: alter table tb_name add sn int unique;
        删除表: drop table tb_name;
      表中数据的操作: 增删改查
        新增: insert tb_name values(null, "zhangsan", 88.999, "2022-01-10 12:00:00");
        查询:
          全列查询: select * from tb_name;
          指定列查询: select name, ch from tb_name;
          排序查询: select * from tb_name order by ch desc/asc;
          分页查询: select * from tb_name order by ch asc limit 3 offset 3;
          条件查询: where
            关系表达式
            select * from tb_name where ch < 80;
            select * from tb_name where ch between 75 and 85;
            select * from tb_name where name in ("李四","赵六");
            select from tb_name where ch is NULL;
            select * from tb_name where name like "赵%";
            逻辑表达式: 与或非--and or not;
            select * from tb_name where ch > 75 and ch < 85;
        修改: update
          update tb_name set ch=95, bir="2020-...", where name="赵六";
        删除:
          delete from tb_name where name="赵六";


数据库表的访问类的实现
  1. 了解mysql的C语言库接口
    1. 定义mysql句柄
    2. 初始化mysql句柄
    3. 链接mysql服务器
    4. 设置客户端字符编码集
    5. 切换选择数据库
    6. 执行语句(库,表,数据操作--sql语句的执行)
      增,删,改--只要语句执行成功,就表示完成了,查--需要执行语句成功后对数据进行操作
        1. 将查询结果保存到本地
        2. 获取保存的结果集中的数据条数和列数
        3.遍历逐条取出结果集中的每一条数据
        4. 释放结果集
    7. 关闭句柄,释放资源
    8. 获取某个接口执行失败原因的接口



jsoncpp的基本使用: 实现json格式的序列化与反序列化功能   json数据类型: 对象-{},字符串,整数,布尔,数组-[]   学生对象: 学号,姓名,年龄,婚否,三科成绩 [ {"学号":1001,"姓名":"张三","年龄":18,"婚否"=false,"成绩":[88,77,99]} {"学号":1002,"姓名":"李四","年龄":20,"婚否"=false,"成绩":[88,77,99]} ] Json::Value--中间数据对象;   val["学号"]=1001; Json::Writer--序列化对象--将Json::Value中的各个数据序列化为字符串   StyledWriter/FastWriter   std::string StyledWriter::write(val) Json::Reader--反序列化对象--将一个json格式字符串转换为json::Value   Reader::parse(const std::string &str, Json::value &val)


httplib搭建http服务器:
  httplib是一个简单的http库
  作用: 让用户使用简单的三两行代码实现http服务器以及客户端的搭建,并且让用户不需要将心思放到服务器的搭建上而是放到具体的业务上
  组成:
    Server类: 服务端类--用于搭建服务器,实现网络通信
      解析http请求,组织http响应
    Request类: 将http请求数据解析后就能得到这个类的对象,包含了一次http请求中的所有信息
    Response类: 响应信息类,通常其中的数据需要用户自己添加

线程处理流程:
  1. 接收请求数据,按照http格式进行解析(请求方法,资源路径,查询字符串,头部字段,正文信息)
  2. 实例化一个Request对象–填充
  3. 根据请求信息(method + path)在route表寻找处理方法
  4. 找到了则调用这个函数
    1. 传入填充完的Request对象
    2. 传入一个Response对象
    函数内部根据请求完成业务处理,填充Response
  5. 将填充在Response中的响应信息组织成为http响应发送给客户端


目前存在问题:
  1. 上传的视频文件重名
    当前做法: 直接覆盖式写入
    预想做法: 每个用户上传的文件名都以一种独一无二的形式命名防止覆盖
      例如:时间戳 + 用户名 + 某种算法->>唯一文件名
  2. 上传的文件冗余重复(名字可能不同, 但是数据实际上相同)
    当前做法: 继续冗余
    预想做法: 计算每个文件的MD5值存放到视频信息数据库中
      每个上传的视频文件都要计算MD5,然后到数据库中查找有没有相同MD5的文件,如果有则直接将url路径拿过来就行,不用存放冗余文件
MD5: 是一种信息摘要算法,常用于文件数据的唯一标识,针对一个文件的数据进行大量指定算法的运算得到一个MD5值;文件内容稍有差别数据都大不相同
前端界面模块: HTML + css + js
  html: 标签化语言,实现浏览器对于最粗糙的界面的渲染
  css: 层叠样式语言,实现对HTML进行样式美化
  js: JavaScript脚本语言,实现让界面动态渲染vue.js

一个关于视频播放的小项目相关推荐

  1. [Electron]仿写一个课堂随机点名小项目

    自从前几个月下了抖音,无聊闲暇时就打会打开抖音,因为打开它有种莫名其妙打开了全世界的感觉... 无意中看到这个小视频:随机点名 于是仿写了一个课堂点名小项目,算是对Electron的一个简单的认识,有 ...

  2. 美团拍店,一个“顺道”赚钱的小项目,去饭店的路上,饭钱有了

    断更了,这几天每天都在路上,来来回回的,也没有闲下来的时候,前几天推荐大家一个相片搬运的项目,叫蚂蚁路客,有反馈说确实能赚点零花钱,但是实在是太少了,再加上天冷,这大冬天的出去一趟不够费事的,问我有没 ...

  3. 徒弟做了一个Python的实战小项目——银行系统

    国际惯例:实践是检验真理的唯一标准. 众所周知,在编程过程中理论知识再充实也需要通过项目的炼金石.下面给大家看一下我徒弟做的一个小项目实战要求,是做一个银行系统,就是我们去银行办业务时候会有个自助的A ...

  4. 小想法 | 开源一个自己的Python小项目「Park at ease」停车场管理系统

    Park at ease 停车场管理系统 基于Python实现 Park Management System Based on Python- print('Hello, this is Park_a ...

  5. 一个上手简单的小项目:抖音评论截流卖资料

    这个项目,就是在抖音上关注各种知识类博主,然后评论截流,引流到微信卖资料. Q:需要准备什么? A:一部手机,一个手机k,一个抖音浩. Q:数据上网还是连WIFI? A:3个以下的话,数据还是WIFI ...

  6. 钉钉python 自动发消息软件_利用Python自动发送钉钉数据消息,一个简单的上手小项目...

    现在大部分公司都使用钉钉作为内部的主要沟通工具,钉钉消息基本都上都能快速有效的被阅读,打开率会比邮件高上不少.所以准备使用钉钉来播报平台每日的成交额,并附上一些鼓励的话和图片.起到一个激励团队的作用 ...

  7. 黑马程序员--一个划拳的小项目代码

    ---------------------- Windows Phone 7手机开发..Net培训.期待与您交流! ---------------------- 代码如下: using System; ...

  8. 一个JavaSE的金牌榜小项目,启蒙+提高【重点:Tomcat 8.5 +mysql 5.7+jdk1.8】

    环境:Tomcat 8.5 +mysql 5.7+jdk1.8 这个作业是我们Java课程的考核项目,想在把分享给大家.菜鸟在启航 MVC+servlet+jsp+mysql

  9. 安卓入门系列-09一个实战小项目(备忘录Memo)

    一个简单的安卓平台下的备忘录 背景 之前已经介绍了不少的控件(TextView和ListView等等)以及开发中最常见的组件(Activity)(Service的权重在我心中没有Activity重要, ...

最新文章

  1. SQL Server select语句执行顺序
  2. python需要下载哪些插件-python需要装哪些工具包
  3. 离散化+unique()+二分查找
  4. 发现还是 True Image Server v8.1.941 比较好用
  5. 伪代码就是计算机语言 正确吗,伪代码实例绍.ppt
  6. 微信收费事件背后被广泛忽略的技术细节
  7. 2月26 ubuntu系统备份还原到相同电脑、另一台电脑
  8. Atitit 音频技术简史艾提拉著 目录 1. 2014年1月16日,谷歌发布音乐时间轴 2 2. 时代发展 2 2.1. 机械录音 电声录音时代 四.数码录音时代 2 3. 【音频录音技术】 2
  9. 哥德巴赫猜想-中文维基百科
  10. 20220626-JAVA高德地图天气API调用总结
  11. 微信小程序体验版分享的坑
  12. 网络相关知识(重点讲解KB和Kbps,让你理清这两者关系)
  13. 单链表之寻找中间结点
  14. 深入源码分析springboot lettuce的shutdown-timeout
  15. L2TP协议及AVP
  16. CommandArgument属性 绑定参数
  17. List Set Map 集合不可修改
  18. 2021年危险化学品生产单位安全生产管理人员试题及解析及危险化学品生产单位安全生产管理人员模拟考试
  19. Visual Studio 2019版本运行报错解决方案
  20. 阻抗矩阵的对称分量计算

热门文章

  1. 一支笔的测试点_一支笔的测试
  2. 外设篇:NandFlash和iNand
  3. 正则表达式中级应用(java语言版)
  4. 学习 《模型思维》-斯科特·佩奇 笔记 9.26
  5. js中用正则表达式判断字符串中是否包含中文和英文
  6. 冯诺依曼机与现代计算机的比较
  7. 《经营的本质》2-“战略的本质”读后感及读书笔记
  8. 都说it是吃青春饭的,那些35岁左右的it女技术人员(测试)都在做啥呢?转行了吗?
  9. Android项目gen目下没有R.class文…
  10. git文件共享_与Git共享文件