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

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

  以上为需求。

二.前端

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

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

 

posted @ 2016-02-15 15:15  阿拉蕾家的小铁匠  阅读(482)  评论(0编辑  收藏  举报