getUserId(); $inputData = $this->getJsonData(); $rules = [ 'to_user_id' => 'required|string', ]; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $toUserId = strval(data_get($inputData, 'to_user_id')); if ($userId == $toUserId) { return json_fail('自己不能关注自己'); } $toUserInfo = make(UserRepository::class)->getUserInfoFromCache($toUserId); if (!$toUserInfo) { return json_fail('用户关态异常'); } $favoriteKey = md5('favorite_' . $userId . '_' . $toUserId); $favoriteData = [ '_id' => $favoriteKey ]; $favorite = make(UserRelationModel::class)->db() ->countDocuments($favoriteData); $focusResult = false; if ($favorite) { //若已关注,则取消 make(UserRelationModel::class)->db()->deleteOne($favoriteData); } else { $focusResult = true; //若未关注,则关注 $favoriteData['from_user_id'] = $userId; $favoriteData['to_user_id'] = $toUserId; $favoriteData['date'] = Carbon::now()->toDateTimeString(); make(UserRelationModel::class)->db()->insertOne($favoriteData); } make(UserRepository::class)->delUserCache($userId); make(UserRepository::class)->delUserCache($toUserId); return json_success($focusResult); } /** * 关注列表(含关注和被关注) * @return mixed */ public function list(ValidatorFactoryInterface $validatorFactory) { $userId = $this->getUserId(); $inputData = $this->getJsonData(); $rules = [ 'type' => 'required|in:favorite,fans', 'page' => 'nullable|numeric', 'page_size' => 'nullable|numeric' ]; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $type = data_get($inputData, 'type'); $page = intval(data_get($inputData, 'page', 1)); $pageSize = intval(data_get($inputData, 'page_size', 10)); $skip = ($page -1) * $pageSize; if ($type == 'favorite') { $data = [ 'from_user_id' => $userId ]; } else { $data = [ 'to_user_id' => $userId ]; } $options = [ 'skip' => $skip, 'limit' => $pageSize, 'sort' => ['date' => -1], ]; $tmp = make(UserRelationModel::class)->db()->find($data, $options); $result['list'] = []; if ($tmp) { $ids = []; $needUserId = $type == 'favorite' ? 'to_user_id' : 'from_user_id'; foreach ($tmp->toArray() as $t) { $ids[] = $t[$needUserId]; } $result['list'] = UserModel::query() ->select(['code','nick','avatar']) ->whereIn('code', $ids) ->get(); if (!empty($result['list'])) { foreach ($result['list'] as $k => $v) { $result['list'][$k]['avatar'] = M3u8CacheRepository::getImageUrl($result['list'][$k]['avatar']); } } } return json_success($result); } /** * 我点赞过的视频分页列表. * @return mixed */ public function likeVideoList(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = [ 'is_long' => 'nullable|int', // 目前只有短视频,无视这个参数. 'page' => 'nullable|numeric', 'page_size' => 'nullable|numeric' ]; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $page = intval(data_get($inputData, 'page', 1)); $pageSize = intval(data_get($inputData, 'page_size', 10)); $skip = ($page -1) * $pageSize; $relationRepo = make(RelationRepository::class); $userCode = $this->getUserId(); $filters = [ 'uid' => $userCode, ]; $amountVideo = make(VideoLikeModel::class)->db() ->countDocuments($filters); $maxPages = ceil($amountVideo / $pageSize); $options = [ 'skip' => $skip, 'limit' => $pageSize, 'sort' => ['date' => -1] ]; $video_like = make(VideoLikeModel::class)->db() ->find(['uid' => $userCode], $options) ->toArray(); $result = [ 'current_page' => $page, 'data' => [], 'first_page_url' => '', 'from' => null, 'last_page' => $maxPages, 'last_page_url' => '', 'next_page_url' => null, 'path' => '', 'per_page' => $pageSize, 'prev_page_url' => '', 'to' => null, 'total' => $amountVideo, ]; $columns = ['id','title', 'cover', 'like', 'uid', 'coins', 'pay_type', 'mu', 'comment', 'watch', 'resolution', 'duration']; if (!empty($video_like)) { $arrIds = []; foreach ($video_like as $v) { $arrIds[] = $v['vid']; } $arrIds = array_slice($arrIds, 0, 100); // 最大100 $id_str = implode(',', $arrIds); $result2 = VideoModel::query() ->with(['category:type.id as type_id,type.title','user']) ->whereIn('id', $arrIds) ->where(['status' => 1]) ->orderByRaw('field(id,'. $id_str . ')') ->get($columns); if (!empty($result2->isNotEmpty())) { $result['data'] = $result2->toArray(); foreach ($result['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'] = M3u8CacheRepository::getImageUrl($v['user']['avatar']); // $v['user']['is_focus'] = $relationRepo->userIsFocusOtherUser($userCode, $v['user']['code']); } // $v['is_my_like'] = $relationRepo->userIsLikeVideo($userCode, $v['id']); if (!empty($v['category'])) { foreach ($v['category'] as $ck => $t) { unset($v['category'][$ck]['pivot']); } } } } } return json_success($result); } /** * 视频点赞/取消点赞 * @param ValidatorFactoryInterface $validatorFactory * @return mixed */ public function likeVideo(ValidatorFactoryInterface $validatorFactory) { $user_code = $this->getUserId(); $inputData = $this->getJsonData(); $rules = [ 'video_id' => 'required|int', ]; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $videoId = intval(data_get($inputData, 'video_id', 0)); $key = $user_code .'_'. $videoId; $_id = substr(md5($key), 8, 16); $data = [ '_id' => $_id ]; $count = make(VideoLikeModel::class)->db()->countDocuments($data); if ($count) { //若已关注,则取消 make(VideoLikeModel::class)->db()->deleteOne($data); make(QueueService::class) ->addVideoLikeJob( [ 'video_id' => $videoId, 'amount' => -1 ] ); $result = 0; } else { $videoInfo = VideoModel::query()->find($videoId, ['uid'])->toArray(); //若未关注,则关注 $data['uid'] = $user_code; $data['vid'] = $videoId; $data['date'] = Carbon::now()->toDateTimeString(); $data['video_user_uid'] = (string)$videoInfo['uid']; // 记录作者UID make(VideoLikeModel::class)->db()->insertOne($data); make(QueueService::class) ->addVideoLikeJob( [ 'video_id' => $videoId, 'amount' => 1 ] ); $result = 1; } make(UserRepository::class)->delUserCache($user_code); return json_success($result); } public function myInvitePages(ValidatorFactoryInterface $validatorFactory) { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $rules = [ 'page' => 'nullable|numeric', 'page_size' => 'nullable|numeric' ]; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $page = intval(data_get($inputData, 'page', 1)); $pageSize = intval(data_get($inputData, 'page_size', 10)); $lists = make(UserLevelRelationRepository::class)->userInvitePages($userCode, $page, $pageSize); return json_success($lists); } public function followUserPages(ValidatorFactoryInterface $validatorFactory) { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $rules = [ 'user_code' => 'required|max:16', 'page' => 'nullable|numeric', 'page_size' => 'nullable|numeric' ]; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $type = 'favorite'; $page = intval(data_get($inputData, 'page', 1)); $pageSize = intval(data_get($inputData, 'page_size', 10)); $page = format_page($page); if ($pageSize > 50) { $pageSize = CommonConstant::PAGE_SIZE; } $skip = ($page -1) * $pageSize; $data = [ 'from_user_id' => $inputData['user_code'], ]; $options = [ 'skip' => $skip, 'limit' => $pageSize, 'sort' => ['date' => -1], ]; $relationRepo = make(UserRelationModel::class); $amount = $relationRepo->db()->countDocuments($data); $lists = $relationRepo->db()->find($data, $options); $arrData = [ 'current_page' => $page, 'per_page' => $pageSize, 'total' => $amount, 'data' => [], ]; if (!empty($lists)) { $arrIds = []; foreach ($lists->toArray() as $v) { $arrIds[] = $v['to_user_id']; } $columns = ['id', 'code', 'nick', 'avatar']; $users = UserModel::query() ->whereIn('code', $arrIds) ->get($columns); if ($users->count()) { $users = $users->toArray(); foreach ($users as $v) { $videoCount = VideoModel::query()->where(['uid' => $v['code'], 'status' => 1])->count(); $arrData['data'][] = [ 'user_code' => $v['code'], 'nick' => $v['nick'], 'avatar' => M3u8CacheRepository::getImageUrl($v['avatar']), 'video_count' => $videoCount, ]; } } } return json_success($arrData); } }