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


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

      以上为需求。

    二.前端

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

    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();
        }
    }
  • 相关阅读:
    RQNOJ 342 最不听话的机器人:网格dp
    RQNOJ 329 刘翔!加油!:01背包
    RQNOJ 57 找啊找啊找GF:01背包
    RQNOJ 202 奥运火炬登珠峰:01背包
    RQNOJ 201 奥运大包围:LIS + 拼链成环
    2017SN多校D1T2 note:dp
    2017SN多校D1T1 loveletter:模拟
    HDU 2157 How many ways??:矩阵快速幂【i到j共经过k个节点的方法数】
    poj 3764 The xor-longest Path
    bzoj 1192 鬼谷子的钱袋
  • 原文地址:https://www.cnblogs.com/mengsx/p/5190124.html
Copyright © 2020-2023  润新知