| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459 |
- <?php
- namespace Modules\Api\Controllers;
- use App\Constants\AdConstrant;
- use App\Constants\CategoryConstant;
- use App\Constants\CommonConstant;
- use App\Model\CommentModel;
- use App\Model\Mongo\MessageModel;
- use App\Model\Mongo\UserRelationModel;
- use App\Model\Mongo\VideoLikeModel;
- use App\Model\UserModel;
- use App\Model\VideoModel;
- use App\Repositories\CategoryRepository;
- use App\Repositories\CommentRepository;
- use App\Repositories\ConfigRepoistory;
- use App\Repositories\CreatorRepository;
- use App\Repositories\MessageRepository;
- use App\Repositories\RelationRepository;
- use App\Repositories\Utils\M3u8CacheRepository;
- use App\Repositories\VideoRepository;
- use Carbon\Carbon;
- use Hyperf\Validation\Contract\ValidatorFactoryInterface;
- use Modules\Api\Services\VideoService;
- class PerfectController extends BaseController
- {
- use \Hyperf\Di\Aop\ProxyTrait;
- use \Hyperf\Di\Aop\PropertyHandlerTrait;
- function __construct()
- {
- if (method_exists(parent::class, '__construct')) {
- parent::__construct(...func_get_args());
- }
- $this->__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);
- }
- }
|