zoukankan      html  css  js  c++  java
  • 存储视频观看记录明细___面向动作的编程思想

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

      以上为需求。

    二.前端

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

    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();
        }
    }
  • 相关阅读:
    linux-gcc 编译时头文件和库文件搜索路径
    程序自启动位置(8种方法,注册表有6处)
    谷歌、flick网站图片 一次性下载 javaWeb项目 多线程下载,
    部署vc2008开发的程序(vcredist_x86是其中一个办法)
    vs2012-vs2013编译出来的程序不能在xp上运行解决方法
    openssl编译
    libcurl编译
    qt 国际化(翻译时会触发changeEvent)
    uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
    qtcreator增加doxygen注释
  • 原文地址:https://www.cnblogs.com/mengsx/p/5190124.html
Copyright © 2011-2022 走看看