__handlePropertyHandler(__CLASS__); } public function index() { $userCode = $this->getUserId(); $inputData = $this->getJsonData(); $configRepo = make(ConfigRepoistory::class); $videoService = make(VideoService::class); $adList = $videoService->getAdList(AdConstrant::MESSAGE_INDEX); $ad = null; if (!empty($adList[0])) { $link = M3u8CacheRepository::getLinkUrl($adList[0]['link'], ['user_code' => $userCode]); $ad = ['position' => $adList[0]['position'], 'title' => $adList[0]['title'], 'cover' => !empty($adList[0]['cover']) ? M3u8CacheRepository::getImageUrl($adList[0]['cover']) : '', 'link' => $link, 'scheme' => $adList[0]['scheme'], 'type' => $adList[0]['type'], 'play' => !empty($adList[0]['play']) ? M3u8CacheRepository::getM3u8Url($adList[0]['play']) : '', 'resolution' => $adList[0]['resolution'] ?? '']; if (!empty($ad['link'])) { $ad['link'] = M3u8CacheRepository::getLinkUrl($ad['link'], ['user_code' => $userCode]); } } $kefuUrl = $configRepo->get('server_link', 'sys', ''); if (strripos($kefuUrl, '?')) { $kefuUrl .= '&user_code=' . $userCode; } else { $kefuUrl .= '?user_code=' . $userCode; } // 系统消息的第一条,包含统计 $sysMsg = make(MessageRepository::class)->firstSys($userCode); $arrData = ['ad' => $ad, 'kefu' => ['url' => $kefuUrl, 'description' => '亲,有什么可以帮助您的?'], 'sys' => $sysMsg, 'talk' => null]; // 私聊消息 $shopsMsg = make(MessageRepository::class)->firstSys($userCode, 'user'); $arrData['count_unread'] = $shopsMsg['count_unread']; return json_success($arrData); } /** * 系统消息分页. * @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' => ['$last' => '$struct_type'], 'from_uid' => ['$last' => '$from_uid'], 'from_nick' => ['$last' => '$from_nick'], 'from_avatar' => ['$last' => '$from_avatar'], 'content' => ['$last' => '$content'], 'created_at' => ['$last' => '$created_at']]], ['$sort' => ["created_at" => -1]], ['$limit' => $pageSize * $page], ['$skip' => ($page - 1) * $pageSize]]); $res = $result->toArray(); if (!empty($res)) { foreach ($res as &$val) { $content = json_decode($val['content'], true); $message = structureHandle($content['message'], $val['struct_type']); $val['message'] = json_encode($message); $val['created_at'] = mongoIsoDateToCarbonTime($val['created_at'])->toDateTimeString(); $val['from_avatar'] = M3u8CacheRepository::getImageUrl($val['from_avatar']); $val['msg_type'] = $val['struct_type']; unset($val['_id'], $val['content'], $val['struct_type']); } } return json_success($res); } /** * 我的页面红点数量 * @return mixed */ public function myRed() { $result = []; $userCode = $this->getUserId(); // 系统消息的第一条,包含统计 $sysMsg = make(MessageRepository::class)->firstSys($userCode); $result['count_sys_unread'] = $sysMsg['count_unread']; // 私聊消息 $shopsMsg = make(MessageRepository::class)->firstSys($userCode, 'user'); $result['count_p2p_unread'] = $shopsMsg['count_unread']; return json_success($result); } }