__handlePropertyHandler(__CLASS__); } public function home() { $userCode = $this->getUserId(); $videoService = make(VideoService::class); $adList1 = $videoService->getAdList(AdConstrant::PERFECT_HOME1); $ads1 = null; if (!empty($adList1)) { $ads1 = []; foreach ($adList1 as $v) { $linkUrl = $v['link']; if (!empty($linkUrl)) { $linkUrl = M3u8CacheRepository::getLinkUrl($linkUrl, ['user_code' => $userCode]); } $ads1[] = ['title' => $v['title'], 'cover' => !empty($v['cover']) ? M3u8CacheRepository::getImageUrl($v['cover']) : '', 'link' => $linkUrl, 'scheme' => $v['scheme']]; } } $creatorRepo = make(CreatorRepository::class); $topCreators = $creatorRepo->getTopUsersByIncome(); $result = ['top_creators' => $topCreators, 'ads1' => $ads1, 'top10' => [], 'cates' => []]; $categoryRepo = make(CategoryRepository::class); $top10Position = CategoryConstant::POSITION_JINGPING_TOP; $topCates = $categoryRepo->findAllByPosition($top10Position); if (!empty($topCates['0']['alias_name'])) { $top10Alias = $topCates['0']['alias_name']; $top10Num = $topCates['0']['show_num'] ?? 10; $top10Videos = $categoryRepo->getVideos($top10Alias, $top10Num); if (!empty($top10Videos)) { foreach ($top10Videos as &$v) { $v['mu'] = ''; // 列表干掉m3u8地址. // $v['mu'] = !empty($v['mu']) ? M3u8CacheRepository::getVideoInnerUrl($v['mu'], $userCode, $v['id'], 'video') : ''; } } $result['top10'] = $top10Videos; } $channelPosition = CategoryConstant::POSTION_JINGPING_CHANNEL; $channelCates = $categoryRepo->findAllByPosition($channelPosition); if (!empty($channelCates)) { foreach ($channelCates as $item) { $channelAliasName = $item['alias_name']; $showNum = $item['show_num'] ?? 10; $channelName = $item['name']; $videoItems = $categoryRepo->getVideos($channelAliasName, $showNum); if (!empty($videoItems)) { foreach ($videoItems as &$v) { $v['mu'] = ''; // 列表干掉m3u8地址. // $v['mu'] = !empty($v['mu']) ? M3u8CacheRepository::getVideoInnerUrl($v['mu'], $userCode, $v['id'], 'video') : ''; } } $result['cates'][] = ['name' => $channelName, 'alias_name' => $channelAliasName, 'items' => $videoItems]; } } return json_success($result); } public function homeCases() { $userCode = $this->getUserId(); $videoService = make(VideoService::class); $adList1 = $videoService->getAdList(AdConstrant::PERFECT_HOME1); $ads1 = null; if (!empty($adList1)) { $ads1 = []; foreach ($adList1 as $v) { $linkUrl = $v['link']; if (!empty($linkUrl)) { $linkUrl = M3u8CacheRepository::getLinkUrl($linkUrl, ['user_code' => $userCode]); } $ads1[] = ['title' => $v['title'], 'cover' => !empty($v['cover']) ? M3u8CacheRepository::getImageUrl($v['cover']) : '', 'link' => $linkUrl, 'scheme' => $v['scheme']]; } } $result = ['ads1' => $ads1, 'cates' => []]; $categoryRepo = make(CategoryRepository::class); $channelPosition = CategoryConstant::POSTION_JINGXIAN; $channelCates = $categoryRepo->findAllByPosition($channelPosition); if (!empty($channelCates)) { foreach ($channelCates as $item) { $channelAliasName = $item['alias_name']; $channelName = $item['name']; $result['cates'][] = ['name' => $channelName, 'alias_name' => $channelAliasName]; } } return json_success($result); } /** * 系统消息分页. * @return mixed */ public function sysPages() { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $previousDate = isset($inputData['previous_date']) ? trim($inputData['previous_date']) : ''; if (empty($previousDate)) { $previousDate = Carbon::now()->toDateTimeString(); } $limitNum = 20; $result = ['previous_date' => $previousDate, 'data' => null]; $items = make(MessageRepository::class)->previousSysPages($userCode, $previousDate, $limitNum, true); if (!empty($items)) { $result['data'] = $items; } return json_success($result); } /** * 标记消息为已读. * @return mixed|void */ public function doRead() { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $msgId = isset($inputData['msg_id']) ? trim($inputData['msg_id']) : ''; if (empty($msgId)) { return json_fail('参数有误1'); } if (!preg_match('/^[a-z0-9]{16,32}$/i', $msgId)) { return json_fail('参数有误2'); } $result = make(MessageRepository::class)->doRead($msgId, $userCode); if (!$result) { return json_fail('不能正确操作已读'); } return json_success(['result' => 'success']); } /** * 删除自己的消息. * @return mixed */ public function deleteMyself() { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $msgIds = isset($inputData['msg_ids']) ? trim($inputData['msg_ids']) : ''; $receiveUid = $userCode; if (empty($msgIds)) { return json_fail('缺少参数1'); } $arrMsgIds = []; if (is_string($msgIds)) { if (stripos($msgIds, ',') !== false) { $arrMsgIds = explode(',', $msgIds); } else { $arrMsgIds[] = $msgIds; } } else { $arrMsgIds = $msgIds; } $result = make(MessageRepository::class)->slientDelete($arrMsgIds, $userCode); if (!$result) { return json_fail('删除消息有误.'); } return json_success(['result' => 'success']); } /** * 被关注分页列表 */ public function followedPages() { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $validatorFactory = make(ValidatorFactoryInterface::class); $rules = ['page' => 'nullable|int', 'page_size' => 'nullable|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $page = $inputData['page'] ?? 1; $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE; if ($pageSize > 100) { $pageSize = CommonConstant::PAGE_SIZE; } $page = format_page($page); $pageSize = intval($pageSize); $relationRepo = make(UserRelationModel::class); $filters = ['to_user_id' => $userCode]; $amount = $relationRepo->db()->countDocuments($filters); $skip = ($page - 1) * $pageSize; $options = ['skip' => $skip, 'limit' => $pageSize, 'sort' => ['date' => -1]]; $temItems = $relationRepo->db()->find($filters, $options)->toArray(); $data = []; $result = ['current_page' => $page, 'per_page' => $pageSize, 'total' => $amount, 'data' => []]; if (!empty($temItems)) { foreach ($temItems as $item) { $fromUserCode = $item['from_user_id']; $fromUser = UserModel::query()->where('code', $fromUserCode)->first(['id', 'code', 'nick', 'avatar']); if ($fromUser) { $fromUser = $fromUser->toArray(); $fromUser['avatar'] = M3u8CacheRepository::getImageUrl($fromUser['avatar']); $fromUser['date'] = Carbon::parse($item['date'])->toDateTimeString(); unset($fromUser['id']); $data[] = $fromUser; } } } $result['data'] = $data; return json_success($result); } /** * 被点赞视频分页列表 */ public function likedPages() { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $validatorFactory = make(ValidatorFactoryInterface::class); $rules = ['page' => 'nullable|int', 'page_size' => 'nullable|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $page = $inputData['page'] ?? 1; $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE; if ($pageSize > 100) { $pageSize = CommonConstant::PAGE_SIZE; } $page = format_page($page); $pageSize = intval($pageSize); $relationRepo = make(VideoLikeModel::class); $filters = ['uid' => $userCode]; $amount = $relationRepo->db()->countDocuments($filters); $skip = ($page - 1) * $pageSize; $options = ['skip' => $skip, 'limit' => $pageSize, 'sort' => ['date' => -1]]; $temItems = $relationRepo->db()->find($filters, $options)->toArray(); $data = []; $result = ['current_page' => $page, 'per_page' => $pageSize, 'total' => $amount, 'data' => []]; $cacheVideo = []; if (!empty($temItems)) { $videoColumns = ['id', 'uid', 'title', 'cover']; foreach ($temItems as $item) { $fromUserCode = $item['uid']; $videoId = $item['vid']; if (empty($cacheVideo[$videoId])) { $videoInfo = VideoModel::query()->where(['status' => 1])->find($videoId, $videoColumns); if (empty($videoInfo)) { break; } $videoInfo = $videoInfo->toArray(); $cacheVideo[$videoId] = $videoInfo; } else { $videoInfo = $cacheVideo[$videoId]; } $fromUser = UserModel::query()->where('code', $fromUserCode)->first(['id', 'code', 'nick', 'avatar']); if ($fromUser) { $fromUser = $fromUser->toArray(); $fromUser['avatar'] = M3u8CacheRepository::getImageUrl($fromUser['avatar']); $fromUser['date'] = Carbon::parse($item['date'])->toDateTimeString(); $fromUser['video'] = ['id' => $videoInfo['id'], 'title' => $videoInfo['title'], 'cover' => M3u8CacheRepository::getImageUrl($videoInfo['cover']), 'uid' => $videoInfo['uid']]; unset($fromUser['id']); $data[] = $fromUser; } } } $result['data'] = $data; return json_success($result); } /** * 被评论分页列表 */ public function commentedPages() { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $validatorFactory = make(ValidatorFactoryInterface::class); $rules = ['page' => 'nullable|int', 'page_size' => 'nullable|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $page = $inputData['page'] ?? 1; $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE; if ($pageSize > 100) { $pageSize = CommonConstant::PAGE_SIZE; } $page = format_page($page); $pageSize = intval($pageSize); if ($pageSize <= 0) { $pageSize = CommonConstant::PAGE_SIZE; } $columns = ['id', 'user_id', 'module', 'svalue', 'content', 'created_at']; $items = CommentModel::query()->where(['module_user_uid' => $userCode])->orderByDesc('created_at')->paginate($pageSize, $columns, 'page', $page); $result = $items->toArray(); $cacheData = ['video' => []]; if (!empty($result['data'])) { $videoColumns = ['id', 'uid', 'title', 'cover']; foreach ($result['data'] as $k => &$v) { $fromUserCode = $v['user_id']; $moduleInfo = []; if ($v['module'] == 'video') { $videoId = $v['svalue']; if (empty($cacheData['video'][$videoId])) { $videoInfo = VideoModel::query()->where(['status' => 1])->find($videoId, $videoColumns); if (!empty($videoInfo)) { $videoInfo = $videoInfo->toArray(); $cacheData['video'][$videoId] = $videoInfo; } } else { $videoInfo = $cacheData['video'][$videoId]; } $moduleInfo = [ 'module' => $v['module'], 'id' => !empty($videoInfo['id']) ? (string) $videoInfo['id'] : '', // 强语言,统一转换字符串. 'title' => !empty($videoInfo['title']) ? $videoInfo['title'] : '视频已下架', 'cover' => !empty($videoInfo['cover']) ? M3u8CacheRepository::getImageUrl($videoInfo['cover']) : '', 'uid' => !empty($videoInfo['uid']) ? $videoInfo['uid'] : '', ]; } $fromUser = UserModel::query()->where('code', $fromUserCode)->first(['id', 'code', 'nick', 'avatar']); if ($fromUser) { $fromUser = $fromUser->toArray(); $fromUser['avatar'] = M3u8CacheRepository::getImageUrl($fromUser['avatar']); $fromUser['date'] = $v['created_at']; $fromUser['module_info'] = $moduleInfo; unset($fromUser['id']); } else { $fromUser = null; } $result['data'][$k] = $fromUser; } } return json_success($result); } /** * 私聊用户列表 * * @param ValidatorFactoryInterface $validatorFactory * @return mixed */ public function privateChatLists(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['page' => 'required|integer', 'page_size' => 'required|integer']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE; if ($pageSize > 500) { $pageSize = CommonConstant::PAGE_SIZE; } $page = format_page($inputData['page'] ?? 1); $result = make(MessageModel::class)->db()->aggregate([['$match' => ['receive_uid' => $this->getUserId(), 'from_type' => 'user']], ['$group' => ["_id" => ['from_uid' => '$from_uid'], 'struct_type' => ['$first' => '$struct_type'], 'from_uid' => ['$first' => '$from_uid'], 'from_nick' => ['$first' => '$from_nick'], 'from_avatar' => ['$first' => '$from_avatar'], 'content' => ['$first' => '$content'], 'created_at' => ['$first' => '$created_at']]], ['$sort' => ["created_at" => -1]], ['$limit' => $pageSize * $page], ['$skip' => ($page - 1) * $pageSize]]); $res = $result->toArray(); if (!empty($res)) { foreach ($res as &$val) { $val['created_at'] = mongoIsoDateToCarbonTime($val['created_at'])->toDateTimeString(); $val['from_avatar'] = M3u8CacheRepository::getImageUrl($val['from_avatar']); unset($val['_id']); } } return json_success($res); } /** * 分类别名下的视频分页(有缓存) * @return mixed * @throws \Psr\SimpleCache\InvalidArgumentException */ public function videoPagesByCategoryName() { $userCode = $this->getUserId(); $validatorFactory = make(ValidatorFactoryInterface::class); $inputData = $this->getJsonData(); $rules = ['page' => 'nullable|int', 'page_size' => 'nullable|int', 'cate_alias_name' => 'required']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $page = $inputData['page'] ?? 1; $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE; if ($pageSize > 100) { $pageSize = CommonConstant::PAGE_SIZE; } $page = format_page($page); $pageSize = intval($pageSize); $videoRepo = make(VideoRepository::class); $cateAliasName = data_get($inputData, 'cate_alias_name', ''); $arrData = []; $lists = $videoRepo->pagesByCategoryAlias($cateAliasName, $page, $pageSize); if (!empty($lists['data'])) { $relationRepo = make(RelationRepository::class); $videoService = make(VideoService::class); $arrAds = $videoService->getAdList(AdConstrant::VIDEO_HOME); $adStep = 1; $configRepo = make(ConfigRepoistory::class); $stepDelimiter = intval($configRepo->get('ad_delimiter_num', 'sys', 10)); // 间隔视频几个出现视频. foreach ($lists['data'] as $k => $v) { $v['mu'] = ''; // 列表干掉m3u8地址. // $v['mu'] = M3u8CacheRepository::getVideoInnerUrl($v['mu'], $userCode, $v['id'], 'video'); $v['cover'] = M3u8CacheRepository::getImageUrl($v['cover']); if (!empty($v['user'])) { $v['user']['avatar'] = !empty($v['user']['avatar']) ? M3u8CacheRepository::getImageUrl($v['user']['avatar']) : ''; } // if (!empty($v['user'])) { // $v['user']['is_focus'] = $relationRepo->userIsFocusOtherUser($userCode, $v['user']['code']); // } // $v['is_my_like'] = $relationRepo->userIsLikeVideo($userCode, $v['id']); $arrData[] = ['type' => 'v', 'video' => $v]; if ($k != 0 && $adStep % $stepDelimiter == 0 && !empty($arrAds)) { $tmpArrPlay = $videoRepo->getRandAdFromAds($arrAds); $tmpArrPlay['cover'] = !empty($tmpArrPlay['cover']) ? M3u8CacheRepository::getImageUrl($tmpArrPlay['cover']) : ''; if (!empty($tmpArrPlay['link'])) { $tmpArrPlay['link'] = M3u8CacheRepository::getLinkUrl($tmpArrPlay['link'], ['user_code' => $userCode]); } if (!empty($tmpArrPlay['play'])) { $tmpArrPlay['play'] = M3u8CacheRepository::getVideoInnerUrl($tmpArrPlay['play'], $userCode, $tmpArrPlay['id'], 'ad'); } unset($tmpArrPlay['id']); $arrData[] = ['type' => 'a', 'video' => $tmpArrPlay]; } $adStep++; } $lists['data'] = $arrData; } return json_success($lists); } }