存储视频观看记录明细___面向动作的编程思想

一. 项目中,为了对视频网站节目的观看明细做出各种统计,需要维护一份每个视频每个用户的观看详情:即用户从观看开始点,结束点,拖曳点,等。

  以上为需求。

二.前端

一个视频节目从打开到关闭,最多会有四种动作发生:

1开始(开始播放):事件(参数:开始时间)

2暂停(暂停):事件(参数:开始时间)

3拖曳(从当前向前或向后拖动):事件(参数:拖曳动作起始时间,拖曳至时间)

4停止(从当前停止播放,跳转到最开始):事件(参数:停止时间)

播放器代码如下:

    //拖曳:传拖曳起点,终点时间
	function onSeek(second){
		$.post(‘index.php?r=video/videorecordseek‘,
		{
			fromtime:parseInt(window.Player.playTime()),
			totime:second
		});
	}
	//暂停:传暂停时间
	function onSwitchInPauseSate(){
		$.post(‘index.php?r=video/videorecordpause‘,
		{
			time:parseInt(window.Player.playTime())
		});
	}
	//停止:传停止时间
	function onStop(){
		$.post(‘index.php?r=video/videorecordstop‘,
		{
			time:parseInt(window.Player.playTime())
		});
	}
	//开始:传开始时间
	function onStart(){
	   	$.post(‘index.php?r=video/videorecordstart‘,
		{
			time:parseInt(window.Player.playTime())
		});
	}

三. 后台数据存储表设计

创建视频存储记录数据表VideoDetail。包括视频号,用户号,记录开始时间,记录时长,记录结束原因,sessionkey等。

下面按代码来注释具体4种动作的前置和后置动作可能及处理。

四 .后台代码

//开始播放
//开始播放之前无论是什么动作,均执行新增一条记录的操作
public function actionVideorecordstart()
{
    $starttime=$_POST[‘time‘];

    $session=Yii::$app->session;
    $session->open();

    $datenow=time();
    //新生成一个缓存的KEY
    $sessionkey=$sessionid.$videoid.$userid.$datenow;
    $session[‘videotime‘]=$sessionkey;

    if ((!isset($session[‘videotimetype‘]))||($session[‘videotimetype‘]!=‘start‘))
    {
        //如果type不存在或者值不为开始,则置为开始
        $session[‘videotimetype‘]=‘start‘;
        //新生成一条记录
        $model=new VideoDetail();
        model->userid=$userid;
        $model->starttime=$starttime;
        $model->videoid=$videoid;
        $model->timecreated=date(‘y-m-d H:i:s‘,time());
        $model->sessionkey=$sessionkey;
        $model->save();
    }
}
//停止播放
//停止播放之前无论是什么动作,都结束一条播放记录,且结束原因为1
public function actionVideorecordstop()
{

    $stoptime=$_POST[‘time‘];
    $session=Yii::$app->session;
    $session->open();
    //如果type存在且值为开始,则结束一条播放记录
    if ((isset($session[‘videotimetype‘])&&($session[‘videotimetype‘]==‘start‘)))
    {
        $sessionkey=$session[‘videotime‘];
        $session[‘videotimetype‘]=‘stop‘;
        $model=VideoDetail::findOne([‘sessionkey‘=>$sessionkey]);

        $model->updateAttributes([‘endtime‘=>$stoptime,
        ‘time‘=>$tool->typeofsecond($stoptime-$model->starttime),
        ‘endreason‘=>1,
        ]);
    }
}
//暂停
//暂停播放之前如果是播放,结束一条播放记录,且结束原因为2
public function actionVideorecordpause()
{

    $pausetime=$_POST[‘time‘];
    $session=Yii::$app->session;
    $session->open();
    //暂停之前正在播放
    if ((isset($session[‘videotimetype‘])&&($session[‘videotimetype‘]==‘start‘)))
    {

        $sessionkey=$session[‘videotime‘];
        $session[‘videotimetype‘]=‘pause‘;

        $model=VideoDetail::findOne([‘sessionkey‘=>$sessionkey]);

        $model->updateAttributes([‘endtime‘=>$pausetime,
                ‘time‘=>$tool->typeofsecond($pausetime-$model->starttime),
                ‘endreason‘=>2,
                ]);
    }
}
//暂停
public function actionVideorecordseek()
{

    $fromtime=$_POST[‘fromtime‘];
    $totime=$_POST[‘totime‘];
    $session=Yii::$app->session;
    $session->open();

    $datenow=time();

    //拖曳之前正在播放,则结束一条记录,结束原因为3,并新增一条新的记录
    if ((isset($session[‘videotimetype‘])&&($session[‘videotimetype‘]==‘start‘)))
    {
        $sessionkey=$session[‘videotime‘];
        $session[‘videotimetype‘]=‘start‘;
        $model=VideoDetail::findOne([‘sessionkey‘=>$sessionkey]);

        $model->updateAttributes([‘endtime‘=>$fromtime
                ‘time‘=>$fromtime-$model->starttime,
                ‘endreason‘=>3,
                ]);

        $sessionkeynew=$sessionid.$videoid.$userid.$datenow;
        $session[‘videotime‘]=$sessionkeynew;

        $model=new VideoDetail();
        $model->userid=$userid;
        $model->starttime=$tool->typeofsecond($totime);
        $model->videoid=$videoid;
        $model->timecreated=date(‘y-m-d H:i:s‘,time());
        $model->sessionkey=$sessionkeynew;

        $model->save();
    }
    //拖曳之前正在暂停,保持暂停状态
    //if ((isset($session[‘videotimetype‘])&&($session[‘videotimetype‘]==‘pause‘)))
    //{
    //    $session[‘videotimetype‘]=‘pause‘;
    //}
    //拖曳之前正在停止,拖曳之后可能为播放或者暂停状态,(播放器不稳定,数据统计时不计入结束时间为null的)
    if ((isset($session[‘videotimetype‘])&&($session[‘videotimetype‘]==‘stop‘)))
    {
        $session[‘videotimetype‘]=‘start‘;
        $sessionkeystart=$sessionid.$videoid.$userid.$datenow;
        $session[‘videotime‘]=$sessionkeystart;
        $model=new VideoDetail();
        $model->userid=$userid;
        $model->starttime=$totime;
        $model->videoid=$videoid;
        $model->timecreated=date(‘y-m-d H:i:s‘,time());
        $model->sessionkey=$sessionkeystart;
        $model->save();
    }
}
时间: 2024-08-11 14:17:01

存储视频观看记录明细___面向动作的编程思想的相关文章

python/面向过程的编程思想及举例

python基础--面向过程的编程思想及举例 面向过程的编程思想 1.面向过程的编程思想及举例 写程序时: 要先想功能,分步实现 2. os模块中walk输出目录中文件路径 os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. Send可以传多个值,但是必须是元组类型 面向过程的编程思想 像流水线,代码简洁,体系结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

python基础——面向过程的编程思想及举例

面向过程的编程思想 1.面向过程的编程思想及举例 写程序时: 要先想功能,分步实现 2. os模块中walk输出目录中文件路径 os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. Send可以传多个值,但是必须是元组类型 面向过程的编程思想 像流水线,代码简洁,体系结构 实现对一个目录下面(包含子目录下面)有一行包含过滤字符串就输出其文件名的绝对路径 C:\python_fullstack_wen\day24\wen """ import ti

面向过程的编程思想

1.面向过程的编程思想 核心是'过程'二字,过程即解决问题的步骤,即先干什么,在干什么.... 基于面向过程编写程序就好比在设计一条流水线,,是一种机械式的思维方式. 2 总结优缺点: 优点:复杂的问题流程化,进而简单化 缺点:修改一个阶段,其他阶段都有可能需要作出修改,牵一发而动全身,即扩展性极差. 应用:用于扩展性要求低的场景 原文地址:https://www.cnblogs.com/lx3822/p/8684673.html

编程思想:面向对象和面向过程

感觉写的不够深入,不过基本可行,转载自:http://www.cnblogs.com/BeiGuo-FengGuang/p/5935763.html 何谓面向对象?何谓面向过程?对于这编程界的两大思想,一直贯穿在我们学习和工作当中.我们知道面向过程和面向对象,但要让我们讲出来个所以然,又感觉是不知从何说起,最后可能也只会说出一句就是那样啦,你知道啦.而这种茫然,其实就是对这两大编程思想的迷糊之处.本文通过学生到校报道注册的实例,阐述了面向过程和面向对象两大思想.希望能对你的学习和工作有所帮助.

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)  (1)框架搭建    (2):数据库访问层的设计Demo 前言:这篇博客在数据访问层的基础上面我们继续学习对这个Demo的开发,希望大家都好好理解一下这个Demo的架构,到最后我实现权限的时候我就简单的说一下搭建过程就OK了,因为这个Demo的思想就是按照权限的设计方式去设计的,下面我们开始介绍面向接口的编程思想,如果感觉好的话可以

AOP面向方面(切面)编程

1.引言 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块.于是出现了以系统模块化特性的面向对象程序设计技术.模块化的面向对象编程极度极地提高了软件系统的可读性.复用性和可扩展性.向对象方法的焦点在于选择对象作为模块的主要单元,并将对象与系统的所有行为联系起来.对象成为问题领域和计算过程的主要元素.但面向对象技术并没有从本质上解决软件系统的可复用性.创建软件系统时,现实问题中存在着许多横切关注点,比如安全性检查.日志记录.性能监控,异常

游戏设计模式——面向数据编程思想

前言:随着软件需求的日益复杂发展,远古时期面的向过程编程思想才渐渐萌生了面向对象编程思想. 当人们发现面向对象在应对高层软件的种种好处时,越来越沉醉于面向对象,热衷于研究如何更加优雅地抽象出对象. 然而现代开发中渐渐发现面向对象编程层层抽象造成臃肿,导致运行效率降低,而这是性能要求高的游戏编程领域不想看到的. 于是现代游戏编程中,面向数据编程的思想越来越被接受(例如Unity2018更新的ECS框架就是一种面向数据思想的框架). 面向数据编程是什么? 先来一个简单的比较: 面向过程思想:考虑解决

面向函数范式编程(Functional programming)

函数编程(简称FP)不只代指Haskell Scala等之类的语言,还表示一种编程思维,软件思考方式,也称面向函数编程. 编程的本质是组合,组合的本质是范畴Category,而范畴是函数的组合. 首先,什么是函数式编程,这并没有唯一定义,它只是广泛聚合了一些编程风格的特性,我们可以将它与面向对象编程OOP进行对比, 两者区别是,OOP主要聚焦于数据的区别,而FP则注重数据结构的一致性. 面向对象: 数据和对数据的操作紧紧耦合 .对象隐藏它们操作的实现细节,其他对象调用这些操作只需要通过接口. .

【C++系列小结】面向过程的编程风格

前言 编程语言有面向过程和面向对象之分,因此编程风格也有所谓的面向过程的编程和面向对象的编程,而且语言的性质不会限制编程的风格. 这里主要说一下面向过程的编程. "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想. C语言是面向过程的编程语言,但是依然可以写出面向对象的程序,同样C++也当然可以写出面向过程的程序咯. 如果我们把所有的程序代码都写在一个main函数里面,那么这个程序显然会显得很不和谐吧.理想一点的做法是我们把一些看起来和main函数逻辑上关