第一下载redis包
"predis/predis": "^1.1", <?php /** * 点赞 */ namespace app\like\service; use app\common\DataService; use app\common\Redis; class LikeService { const LIKE_TYPE_ALL = 4; //全部 const LIKE_USER_GIVE_SHOW_CHINESENAME = '赞了您这条'; const LIKE_USER_RECEIVE_SHOW_CHINESENAME = '我点赞了这条'; const BLOG_CHINESENAME = '资讯'; /** * 点赞资讯 * @param int $userId 用户ID * @param int $blogId 资讯ID */ public function addLikeBlog($userId, $blogId, $sys) { $blogInfo = $this->_getBlogInfo($blogId, $sys); if (!$blogInfo) return false; if ($blogInfo['author_id']) { //(资讯创建人)我收到点赞全部列表 $key = $this->_getMyAllReceiveLikeListKey($blogInfo['author_id'], $sys); Redis::getInstance()->redisZadd($key, time(), $blogId . ':blog:' . $userId . ':likeuserid'); } //资讯点赞列表 $key = $this->_getBlogListKey($blogId, $sys); Redis::getInstance()->redisZadd($key, time(), $userId); //我的点赞资讯列表 $key = $this->_getMyLikeBlogListKey($userId, $sys); Redis::getInstance()->redisZadd($key, time(), $blogId); //我发出点赞全部列表 $key = $this->_getMyAllGiveLikeListKey($userId, $sys); Redis::getInstance()->redisZadd($key, time(), $blogId . ":blog"); return true; } /** * 取消点赞资讯 * @param int $userId 用户ID * @param int $BlogId 资讯ID */ public function unLikeBlog($userId, $blogId, $sys) { $blogInfo = $this->_getBlogInfo($blogId, $sys); if (!$blogInfo) return false; if ($blogInfo['author_id']) { //(资讯创建人)我收到点赞全部列表 $key = $this->_getMyAllReceiveLikeListKey($blogInfo['author_id'], $sys); Redis::getInstance()->redisZrem($key, $blogId . ':blog:' . $userId . ':likeuserid'); } //资讯点赞列表 $key = $this->_getBlogListKey($blogId, $sys); Redis::getInstance()->redisZrem($key, $userId); //我的点赞资讯列表 $key = $this->_getMyLikeBlogListKey($userId, $sys); Redis::getInstance()->redisZrem($key, $blogId); //我的点赞全部列表 $key = $this->_getMyAllGiveLikeListKey($userId, $sys); Redis::getInstance()->redisZrem($key, $blogId . ":blog"); return true; } /** * 判断资讯是否被点赞 * @param int $userId 登录用户ID * @param int $blogId 资讯ID */ public function isLikeBlog($userId, $blogId, $sys) { $key = $this->_getMyLikeBlogListKey($userId, $sys); $score = Redis::getInstance()->redisZscore($key, $blogId); if (empty($score)) { return false; } return true; } /** * 获取资讯点赞数量 */ public function getBlogLikeCount($blogId, $sys) { $key = $this->_getBlogListKey($blogId, $sys); $count = (int)Redis::getInstance()->redisZcard($key); return ['count' => $count]; } /** * 获取资讯评论点赞排序,从高到低排序 * 返回排序好后评论id数组 */ public function getBlogCommentLikeSort($blogId, $sys) { $key = $this->_getCommentTypeListKey($blogId, 'blog', $sys); $list = Redis::getInstance()->redisZRevRange($key, 0, -1, ['WITHSCORES']); return $list; } /** * 获取我发出的点赞列表 * @param int $type 1 帖子 2 资讯 3评论 4全部 */ public function getMyAllGiveLikeList($userId, $sys, $type, $pageNo = 1, $pageCount = 10) { switch ($type) { case self::LIKE_TYPE_BLOG: $key = $this->_getMyLikeBlogListKey($userId, $sys); break; default: $key = $this->_getMyAllGiveLikeListKey($userId, $sys); break; } $list = Redis::getInstance()->redisZRevRange($key, 0, -1); $list = isset($list['data']) ? $list['data'] : []; //只展示显示每页数量 $result = array_slice($list, ($pageNo - 1) * $pageCount, $pageCount); $data = []; if ($type == self::LIKE_TYPE_ALL) { //获取全部信息 foreach ($result as $k => $value) { $detail = explode(':', $value); //适应前端数据格式 $score = Redis::getInstance()->redisZscore($key, $value); $likeTime = date("Y-m-d H:i:s", $score); $likeTime = DataService::getInstance()->_handleCreateTimeTwo($likeTime); $data[$k]['likeTime'] = $likeTime; $data[$k]['titleId'] = $detail[0]; $data[$k]['commentId'] = 0; $data[$k]['comment'] = ''; if (isset($detail[1]) && $detail[1] == 'blog') { $blogInfo = $this->_getBlogInfo($detail[0], $sys); $blogAuthorId = isset($blogInfo['author_id']) ? $blogInfo['author_id'] : 0; $authorInfo = $this->_getAuthorInfo($blogAuthorId, $sys); $data[$k]['sourceUserId'] = $blogAuthorId; $data[$k]['sourceUserNickName'] = isset($authorInfo['author_name']) ? $authorInfo['author_name'] : ''; $data[$k]['sourceUserHeadimgurl'] = isset($authorInfo['author_headimgurl']) ? $authorInfo['author_headimgurl'] : ''; $data[$k]['likeShowName'] = self::LIKE_USER_RECEIVE_SHOW_CHINESENAME . self::BLOG_CHINESENAME; //点赞来源类型id,1帖子2资讯 $data[$k]['likeSourceTypeId'] = self::LIKE_TYPE_BLOG; $data[$k]['likeTypeName'] = self::BLOG_CHINESENAME; $data[$k]['title'] = isset($blogInfo['title']) ? $blogInfo['title'] : ''; //评论创建者信息设置为空 $data[$k]['commentUserId'] = 0; $data[$k]['commentUserNickName'] = ''; $data[$k]['commentUserHeadimgurl'] = ''; } } } $count = count($data); $pagerInfo = [ "total" => $count, "page_no" => $pageNo, "page_count" => $pageCount, "page_total" => ceil($count / $pageCount) ]; return ["code" => _MSG_SYSTEM_SUCCESS, "msg" => "查询成功", "data" => ["page_info" => $pagerInfo, "list" => $data]]; } /** * 获取我收到的点赞列表 * @param int $type 1 帖子 2 资讯 3评论 4全部 */ public function getMyAllReceiveLikeList($userId, $sys, $type, $pageNo = 1, $pageCount = 10) { switch ($type) { case self::LIKE_TYPE_BLOG: $key = $this->_getMyLikeBlogListKey($userId, $sys); break; default: $key = $this->_getMyAllReceiveLikeListKey($userId, $sys); break; } $list = Redis::getInstance()->redisZRevRange($key, 0, -1); $list = isset($list['data']) ? $list['data'] : []; //只展示显示每页数量 $result = array_slice($list, ($pageNo - 1) * $pageCount, $pageCount); $data = []; if ($type == self::LIKE_TYPE_ALL) { //获取全部信息 foreach ($result as $k => $value) { $detail = explode(':', $value); //适应前端数据格式 $score = Redis::getInstance()->redisZscore($key, $value); $likeTime = date("Y-m-d H:i:s", $score); $likeTime = DataService::getInstance()->_handleCreateTimeTwo($likeTime); $data[$k]['likeTime'] = $likeTime; $data[$k]['titleId'] = $detail[0]; $data[$k]['commentId'] = 0; $data[$k]['comment'] = ''; if (isset($detail[1]) && $detail[1] == 'blog') { $blogInfo = $this->_getBlogInfo($detail[0], $sys); $blogAuthorId = isset($blogInfo['author_id']) ? $blogInfo['author_id'] : 0; $authorInfo = $this->_getAuthorInfo($blogAuthorId, $sys); $data[$k]['sourceUserId'] = $blogAuthorId; $data[$k]['sourceUserNickName'] = isset($authorInfo['author_name']) ? $authorInfo['author_name'] : ''; $data[$k]['sourceUserHeadimgurl'] = isset($authorInfo['author_headimgurl']) ? $authorInfo['author_headimgurl'] : ''; $data[$k]['likeShowName'] = self::LIKE_USER_GIVE_SHOW_CHINESENAME . self::BLOG_CHINESENAME; //点赞来源类型id,1帖子2资讯 $data[$k]['likeSourceTypeId'] = self::LIKE_TYPE_BLOG; $data[$k]['likeTypeName'] = self::BLOG_CHINESENAME; $data[$k]['title'] = isset($blogInfo['title']) ? $blogInfo['title'] : ''; //评论创建者信息 $data[$k]['commentUserId'] = 0; $data[$k]['commentUserNickName'] = ''; $data[$k]['commentUserHeadimgurl'] = ''; } //点赞者信息 $userInfo = $this->_getUserInfo($detail[2], $sys); $data[$k]['userId'] = $detail[2]; $data[$k]['userNickName'] = isset($userInfo['nickname']) ? $userInfo['nickname'] : ''; $data[$k]['userHeadimgurl'] = isset($userInfo['headimgurl']) ? $userInfo['headimgurl'] : ''; } } $count = count($data); $pagerInfo = [ "total" => $count, "page_no" => $pageNo, "page_count" => $pageCount, "page_total" => ceil($count / $pageCount) ]; return ["code" => _MSG_SYSTEM_SUCCESS, "msg" => "查询成功", "data" => ["page_info" => $pagerInfo, "list" => $data]]; } /** * 获取资讯点赞列表的key */ private function _getBlogListKey($blogId, $sys) { return "Like:{$sys}:blog:{$blogId}"; } /** * 获取我的点赞资讯的key */ private function _getMyLikeBlogListKey($userId, $sys) { return "Like:{$sys}:users:blogs:{$userId}"; } /** * 获取我的全部发出点赞列表的key * Like:343:users:all:give:1 * 在343系统下用户id=1全部发出点赞列表(value=2:blog(文章id为2),score=time时间戳) */ private function _getMyAllGiveLikeListKey($userId, $sys) { return "Like:{$sys}:users:all:give:{$userId}"; } /** * 获取我的全部收到点赞列表的key * Like:343:users:all:receive:1 * 在343系统下用户id=1全部收到点赞列表(value=2:blog(文章id为2),score=time时间戳) */ private function _getMyAllReceiveLikeListKey($userId, $sys) { return "Like:{$sys}:users:all:receive:{$userId}"; } /** * 获取资讯信息 */ private function _getBlogInfo($blogId, $sys) { if (empty($blogId)) { return []; } $blogInfo = BlogInstanceModel::getInstance()->getOneById($blogId, $sys); return $blogInfo['data']; } }