namespace app\api\controller;
use think\Controller;
use think\Cache;
use think\Error;
use think\Exception;
use think\Log;
use think\Request;
use app\api\common\RedisKeyConts;
use app\api\common\OutJson;
use app\api\common\Hint;
use app\api\common\Helper;
use app\api\model\VideoModel;
use app\api\model\SlideModel;
use app\api\model\UserPraiseModel;
use app\api\model\UserCollectionModel;
class Homepage extends Common
{
public function __construct()
{
parent::__construct();
$this->videoDao = new VideoModel();
}
public function getNewList(Request $request)
{
$wr_applet = $request->post('wr_applet' , 0);
$page = $request->post('page' , 1);
$limit = 10;
$uid = $request->post('uid' , 0);
if (empty($wr_applet) || empty($page) || $wr_applet != Hint::WR_APPLET)
OutJson::outJsonNoData(Hint::PARAM_ERROR);
$videoIdtablePrefix = RedisKeyConts::$sortSetKey['mi_new_video_id_'];
$videoInfoTablePrefix = RedisKeyConts::$hastKey['mi_new_video_info_'];
$sortCluser = self::$redis->ZREVRANGE($videoIdtablePrefix , ($page - 1)*$limit , ($page - 1)*$limit+$limit-1);
if (!empty($sortCluser)) {
$resultVideoList = $this->formatVideoListData($sortCluser ,$videoInfoTablePrefix ,$page ,$limit , $videoIdtablePrefix ,$uid);
OutJson::outJsonResult(Hint::SUCCESS , $resultVideoList);
}else{
$this->getMysqlVideoList($page ,$limit , $videoIdtablePrefix ,$videoInfoTablePrefix);
}
}
public function formatVideoListData($sortCluser ,$videoInfoTablePrefix ,$page ,$limit , $videoIdtablePrefix ,$uid )
{
$videoPraiseNumTablePrefix = RedisKeyConts::$hastKey['mi_new_video_praise_num_'];
$videoPlayNumTablePrefix = RedisKeyConts::$hastKey['mi_new_video_play_num_'];
$pieTablePrefix = RedisKeyConts::$hastKey['mi_new_user_video_praise_history_'];
$cloTablePrefix = RedisKeyConts::$hastKey['mi_new_user_video_collect_history_'];
$resultVideoList = [];
foreach ($sortCluser as $key => $value) {
$setTable = Helper::getSplitTable($videoInfoTablePrefix , $value , 10);
$resultVideoList[$key] = unserialize(self::$redis->hget($setTable,$value));
$resultVideoList[$key]['video_praise_num'] = $this->getSingleVideoFieldInfo($value ,$videoPraiseNumTablePrefix ,'video_praise_num');
$resultVideoList[$key]['video_play_num'] = $this->getSingleVideoFieldInfo($value ,$videoPlayNumTablePrefix ,'video_play_num');
$resultVideoList[$key]['check_praise'] = 0;
$resultVideoList[$key]['check_collect'] = 0;
if(!empty($uid)){
$resultVideoList[$key]['check_praise'] = $this->getUserAtPresentVideoCheck( $pieTablePrefix, $value , $uid);
$resultVideoList[$key]['check_collect'] = $this->getUserAtPresentVideoCheck($cloTablePrefix , $value , $uid);
}
$resultVideoList[$key]['ls_time'] = date('Y-m-d',$value['ls_time']);
}
if (empty($resultVideoList)) {
Log::write( date('Y-m-d H:i:s').'get sort set article_id exist , hset article_id null' , implode(',',$sortCluser) );
$this->unsetSortSetArticleId($sortCluser);
$this->getMysqlVideoList($page ,$limit , $videoIdtablePrefix ,$videoInfoTablePrefix);
}
return $resultVideoList;
}
public function unsetSortSetArticleId($sortCluser)
{
$articleColTable = RedisKeyConts::$hastKey['mi_new_video_id_'];
foreach ($sortCluser as $k=>$v)
{
self::$redis->zrem($articleColTable , $v);
}
}
public function getMysqlVideoList($page ,$limit , $videoIdtablePrefix ,$videoInfoTablePrefix )
{
$where = [
'status'=>1,
'is_index'=>0
];
$offset = ($page-1) * $limit;
$order_by = ['sort'=>'asc' , 'ls_time'=>'desc'];
$videoList = $this->videoDao->getPageVideoList( $where , $order_by ,$offset , $limit);
if (!empty($videoList)) {
foreach($videoList as $key=>$value){
self::$redis->zadd($videoIdtablePrefix , time()+$key , $value['id']);
$setTable = Helper::getSplitTable($videoInfoTablePrefix , $value['id'] , 10);
self::$redis->hset($setTable , $value['id'] , serialize($value));
}
OutJson::outJsonResult(Hint::SUCCESS , $videoList);
} else {
OutJson::outJsonNoData(Hint::HOMEPAGE_VIDEO_LIST_NULL);
}
}
public function getSingleVideoFieldInfo($id , $videoFieldTablePrefix , $field)
{
$videoFieldTablePrefix = Helper::getSplitTable($videoFieldTablePrefix , $id , 10);
$rdsVideoFieldNum = self::$redis->hget($videoFieldTablePrefix , $id);
if (empty($rdsVideoFieldNum))
{
$rdsVideoFieldNum = $this->videoDao->getVideoInfo($id)[$field];
$rdsVideoFieldNum = $rdsVideoFieldNum == 0 ? rand(1 , 1000) : $rdsVideoFieldNum ;
self::$redis->hsetnx( $videoFieldTablePrefix, $id , $rdsVideoFieldNum);
}
return $rdsVideoFieldNum;
}
public function getUserAtPresentVideoCheck( $checkTablePrefix , $video_id , $uid)
{
$tablePrefix = RedisKeyConts::$hastKey[$checkTablePrefix];
$setTable = Helper::getSplitTable($tablePrefix , $uid , 10);
$hisResult= self::$redis->hget($setTable , $uid.'_video_'.$video_id);
return $hisResult = $hisResult == '' || 0 ? 0 : $hisResult;
}
public function addVideoClick(Request $request)
{
$wr_applet = $request->post('wr_applet' , 0);
$video_id = $request->post('video_id' , 0);
$uid = $request->post('uid' , 0);
if (empty($wr_applet) || empty($video_id) || empty($uid) || $wr_applet != Hint::WR_APPLET)
OutJson::outJsonNoData(Hint::PARAM_ERROR);
$videoTablePrefix = RedisKeyConts::$hastKey['mi_new_video_play_num_'];
$videoTable = Helper::getSplitTable($videoTablePrefix , $video_id , 10);
if (self::$redis->HEXISTS($videoTable , $video_id)) {
self::$redis->HINCRBY($videoTable , $video_id , 1);
}else{
self::$redis->hset( $videoTable, $video_id , 1);
}
$videoClickTablePrefix = RedisKeyConts::$hastKey['mi_new_video_click_update'];
self::$redis->Hsetnx($videoClickTablePrefix , $video_id , $video_id);
if(!self::$redis->EXISTS($videoClickTablePrefix)){
self::$redis->expire($videoClickTablePrefix , RedisKeyConts::$expireTime[$videoClickTablePrefix]);
}
OutJson::outJsonResult(Hint::SUCCESS);
}
public function addMinusVideoPraise(Request $request)
{
$wr_applet = $request->post('wr_applet' , 0);
$video_id = $request->post('video_id' , 0);
$uid = $request->post('uid' , 0);
$is_type = intval($request->post('is_type' , 1));
if (empty($wr_applet) || empty($video_id) || empty($uid) || $wr_applet != Hint::WR_APPLET)
OutJson::outJsonNoData(Hint::PARAM_ERROR);
$videoPraiseNumTablePrefix = RedisKeyConts::$hastKey['mi_new_video_praise_num_'];
$videoPraise = Helper::getSplitTable($videoPraiseNumTablePrefix , $video_id , 10);
$userVideoPraiseHistoryPrefix = RedisKeyConts::$hastKey['mi_new_user_video_praise_history_'];
$userVideoPraiseHistoryTable = Helper::getSplitTable($userVideoPraiseHistoryPrefix , $uid , 10);
if($is_type == 1){
if (self::$redis->HEXISTS($videoPraise , $video_id)) {
self::$redis->HINCRBY($videoPraise , $video_id , 1);
}else{
self::$redis->hset( $videoPraise, $video_id , 1);
self::$redis->expire($videoPraise , RedisKeyConts::$expireTime[$videoPraiseNumTablePrefix]);
}
self::$redis->hset($userVideoPraiseHistoryTable , $uid.'_video_'.$video_id ,1);
}else{
if (self::$redis->HEXISTS($videoPraise , $video_id)) {
self::$redis->HINCRBY($videoPraise , $video_id , -1);
self::$redis->Hdel($userVideoPraiseHistoryTable , $uid.'_video_'.$video_id);
}
}
$videoClickUpdateTablePrefix = RedisKeyConts::$hastKey['mi_new_video_praise_update'];
self::$redis->Hsetnx($videoPraiseNumTablePrefix , $video_id , $video_id);
if(!self::$redis->EXISTS($videoClickUpdateTablePrefix)){
self::$redis->expire($videoClickUpdateTablePrefix , RedisKeyConts::$expireTime[$videoClickUpdateTablePrefix]);
}
OutJson::outJsonResult(Hint::SUCCESS);
}
public function userClickVideoCollect(Request $request)
{
$wr_applet = $request->post('wr_applet' , 0);
$video_id = $request->post('video_id' , 0);
$uid = $request->post('uid' , 0);
$is_type = $request->post('is_type' , 1);
if (empty($wr_applet) || empty($video_id) || empty($uid) || $wr_applet != Hint::WR_APPLET)
OutJson::outJsonNoData(Hint::PARAM_ERROR);
$userVideoCollectHistoryPrefix = RedisKeyConts::$hastKey['mi_new_user_video_collect_history_'];
$userVideoPraiseHistoryTable = Helper::getSplitTable($userVideoCollectHistoryPrefix , $uid , 10);
try{
if($is_type == 1){
self::$redis->Hsetnx($userVideoPraiseHistoryTable , $uid.'_video_'.$video_id , 1);
}else{
self::$redis->hdel($userVideoPraiseHistoryTable , $uid.'_video_'.$video_id);
$userCollectionModel = new UserCollectionModel();
$userCollectionModel->updateUserVideoCollect( $uid ,$video_id , $is_type);
}
OutJson::outJsonNoData(Hint::SUCCESS);
}catch (\Exception $e){
Log::write('userClickVideoCollect Exception' , array('uid'=>$uid , 'video'=>$video_id , 'is_type'=>$is_type));
}
}
}