// +---------------------------------------------------------------------- namespace App\Services\Api; use App\Models\PostModel; use App\Models\PostRecordModel; use App\Services\BaseService; use App\Services\RedisService; /** * 动态评论/点赞-服务类 * @author laravel开发员 * @since 2020/11/11 * @package App\Services\Api */ class PostRecordService extends BaseService { // 静态对象 protected static $instance = null; /** * 构造函数 * @author laravel开发员 * @since 2020/11/11 */ public function __construct() { $this->model = new PostRecordModel(); } /** * 静态入口 */ public static function make() { if (!self::$instance) { self::$instance = new static(); } return self::$instance; } /** * @param $params * @param int $pageSize * @return array */ public function getDataList($params, $pageSize = 15) { $query = $this->getQuery($params); $query->orderBy('posts_records.id','desc'); $list = $query->select(['posts_records.*'])->paginate($pageSize > 0 ? $pageSize : 9999999); $list = $list? $list->toArray() :[]; return [ 'pageSize'=> $pageSize, 'total'=>isset($list['total'])? $list['total'] : 0, 'list'=> isset($list['data'])? $list['data'] : [] ]; } /** * 查询 * @param $params * @return mixed */ public function getQuery($params) { $where = ['posts_records.reply_id'=>0,'posts_records.mark' => 1]; $status = isset($params['status'])? $params['status'] : 0; $type = isset($params['type'])? $params['type'] : 0; $userId = isset($params['user_id'])? $params['user_id'] : 0; $sourceId = isset($params['source_id'])? $params['source_id'] : 0; if($status>0){ $where['posts_records.status'] = $status; } if($userId>0){ $where['posts_records.user_id'] = $userId; } if($sourceId>0){ $where['posts_records.source_id'] = $sourceId; } if($type>0){ $where['posts_records.type'] = $type; } return $this->model->with(['user','replyUser','replys'])->from('posts_records') ->where($where) ->where(function ($query) use($params){ $keyword = isset($params['keyword'])? $params['keyword'] : ''; if($keyword){ $query->where('posts_records.title','like',"%{$keyword}%") ->orWhere('posts_records.tags','like',"%{$keyword}%"); } $tag = isset($params['tag'])? $params['tag'] : ''; if($tag){ $query->where('posts_records.tags','like',"%{$tag},%"); } }); } /** * 评论 * @param $userId * @param $params * @return array|false */ public function submit($userId, $params) { $sourceId = isset($params['source_id']) ? intval($params['source_id']) : 0; $replyId = isset($params['reply_id']) ? intval($params['reply_id']) : 0; $replyUid = isset($params['reply_uid']) ? intval($params['reply_uid']) : 0; $description = isset($params['content']) && $params['content']? trim($params['content']) : ''; $albums = isset($params['albums']) ? get_format_images($params['albums'], 'url') : ''; if(empty($sourceId)){ $this->error = '请选择评论的动态'; return false; } if(empty($description)){ $this->error = '评论内容不能为空'; return false; } if($userId<=0){ $this->error = '请先登录'; $this->errorCode = 403; return false; } $cacheKey = "caches:members:comment_{$userId}_{$sourceId}"; if(RedisService::get($cacheKey.'_lock')){ $this->error = '请不要频繁提交'; return false; } RedisService::set($cacheKey, $params, rand(20,30)); $info = PostModel::with(['user'])->where(['id'=>$sourceId,'mark'=>1])->first(); $postUserId = isset($info['user_id'])?$info['user_id']:0; $userInfo = isset($info['user'])?$info['user']:[]; if (empty($info) || $sourceId<=0 || $postUserId<=0) { RedisService::clear($cacheKey.'_lock'); $this->error = '该动态已不存在'; return false; } $replyInfo = $this->model->with(['user'])->where(['id'=>$replyId,'mark'=>1])->first(); if ($replyId>0 && empty($replyInfo)) { RedisService::clear($cacheKey.'_lock'); $this->error = '回复内容不存在'; return false; } $data = [ 'source_id'=>$sourceId, 'reply_id'=>$replyId, 'reply_uid'=>$replyUid, 'user_id'=> $userId, 'albums'=> $albums, 'type'=>1, 'create_time'=>time(), 'description'=> $description, 'status'=> 1, ]; if(!$cid = $this->model->insertGetId($data)){ $this->error = $replyId>0?'回复失败':'评论失败'; } $nickname = isset($userInfo['nickname'])?$userInfo['nickname']:''; $msgData = [ 'from_uid'=> $userId, 'type'=> 4, 'title'=>'互动消息', 'description'=> $replyId? "回复{$nickname}评论了您的动态评论": "用户{$nickname}评论了您的动态", 'content'=> json_encode(['source_id'=>$sourceId,'cid'=>$cid,'page'=>'/pagesSub/pages/posts/detail?id='.$sourceId.'&replyId='.$replyId]), 'msg_type'=>4, ]; // 互动消息 MessageService::make()->pushMessage($postUserId, $msgData); $this->error = $replyId>0?'回复成功':'评论成功'; $info = $this->model->where(['id'=> $cid])->with(['user','replyUser'])->first(); return $info; } /** * 点赞 * @param $userId * @param $params * @return array|false */ public function like($userId, $params) { $sourceId = isset($params['source_id']) ? intval($params['source_id']) : 0; $status = isset($params['status']) && $params['status']? intval($params['status']) : 1; $info = PostModel::with(['user'])->where(['id'=>$sourceId,'mark'=>1])->first(); $postUserId = isset($info['user_id'])?$info['user_id']:0; $userInfo = isset($info['user'])?$info['user']:[]; if (empty($info) || $sourceId<=0 || $postUserId<=0) { $this->error = '该内容已不存在'; return false; } if (!in_array($status,[1,2])) { $this->error = '操作状态错误'; return false; } $record = $this->model->where(['source_id'=>$sourceId,'user_id'=>$userId,'type'=>2,'mark'=>1])->first(); $recordId = isset($record['id'])?$record['id'] : 0; $data = [ 'source_id'=>$sourceId, 'user_id'=>$userId, 'type'=>2, 'create_time'=>time(), 'description'=> '点赞', 'status'=> $status, ]; $nickname = isset($userInfo['nickname'])?$userInfo['nickname']:''; $msgData = [ 'from_uid'=> $userId, 'type'=> 4, 'title'=>'互动消息', 'description'=> "用户{$nickname}点赞了您的笔记", 'msg_type'=>1, ]; if($recordId){ $this->model->where(['id'=>$recordId])->update(['status'=>$status,'update_time'=>time()]); // 互动消息 if($status == 1){ MessageService::make()->pushMessage($postUserId, $msgData); } $count = $this->model->where(['source_id'=>$sourceId,'type'=> 2,'status'=>1,'mark'=>1])->count('id'); $this->error = $status==1? '点赞成功':'取消点赞成功'; RedisService::keyDel("caches:social:info_{$sourceId}*"); $this->errorData = $status==2? ['count'=>$count,'data'=>[]] : ['count'=>$count,'data'=>['id' => $sourceId,'user_id'=>$userId,'status'=>$status]]; return true; }else{ if(!$sourceId = $this->model->insertGetId($data)){ $this->error = $status==1? '点赞失败':'取消点赞失败'; return false; } // 互动消息 if($status == 1){ MessageService::make()->pushMessage($postUserId, $msgData); } $this->error = $status==1? '点赞成功':'取消点赞成功'; RedisService::keyDel("caches:social:info_{$sourceId}*"); $count = $this->model->where(['source_id'=>$sourceId,'type'=> 2,'status'=>1,'mark'=>1])->count('id'); $this->errorData = $status==2? ['count'=>$count,'data'=>[]] : ['count'=>$count,'data'=>['id' => $sourceId,'user_id'=>$userId,'status'=>$status]]; return true; } } /** * 删除 * @return array */ public function delete() { $this->model->where('mark',0)->where('create_time','<=', 600)->delete(); return parent::delete(); // TODO: Change the autogenerated stub } }