微信小程序 实现朋友圈+评论+点赞

380 阅读1分钟

需求:

  • 登录用户的好友列表
  • 查看用户好友发布的所有动态
  • 可以评论用户发表的动态
  • 展示动态下的评论
  • 可以对用户发表的动态进行点赞/取消点赞、分享、举报
  • 可以发布动态

发布动态(文字、图文、列表)

/*
 * 发布动态
 */
public function store(Request $request)
{
    //接收数据
    $params = $request->all();
    //获取用户id
    $params['user_id'] = (new TokenServe())->checkToken($request->header('token'));
    //发布动态 将数据添加入库
    Message::create($params);
    return ['code'=>200,'msg'=>'发布成功','data'=>[]];
}

用户好友列表+动态+评论+点赞

```
/**
 * @param Request $request
 * @return array
 * 动态列表+评论+是否点赞
 */
public function index(Request $request)
{
    //获取token
    $token = $request->header('token');
    //检测token是否合法 并获取用户id
    $user_id = (new TokenServe())->checkToken($token);
    //查询该用户的好友
    $userData = FriendList::where('user_id', $user_id)->get();
    //取出该用户好友的所有id
    $friends_id = $userData->pluck('friend_id')->toArray();
    //通过该用户好友的id来判断是否 对方是否跟该用户是好友
    $friendData = FriendList::whereIn('user_id', $friends_id)->get();
    //数据处理
    $user_friends_id = [];
    foreach ($friendData as $k => $v) {
        if ($v->friend_id == $user_id) {
            array_push($user_friends_id, $v->user_id);
        }
    }
    array_push($user_friends_id, $user_id);
    //查询好友及自己的动态
    $data = Message::with('user')
        ->whereIn('user_id', $user_friends_id)
        ->where('is_private', 0)
        ->orderBy('created_at', 'desc')
        ->paginate(4);
    //查询该用户点过赞的动态
    $like_data = MessageLike::where('user_id',$user_id)->get();
    $like_message_ids = $like_data->pluck('message_id');
    //模型关联查询出所有的动态评论
    $comment_data = MessageComment::with('user')->get();
    //总页数
    $last_page = $data->lastPage();
    //数据处理
    $arr = [];
    foreach ($data as $k => $v) {
        if ($v->resource_type == 1) {
            $resource_path = explode(',', $v->resource_path);
        } else {
            $resource_path = $v->resource_path;
        }
        if ($v->address != '') {
            $address = mb_substr($v->address, 0, 10) . '...';
        } else {
            $address = $v->address;
        }
        if ($v->label_id != null){
            //查询该条动态的标签
            $label = MessageLabel::whereIn('id',explode(',',$v->label_id))->get();
        }else{
            $label = null;
        }
        array_push($arr, [
            'id' => $v->id,
            'address' => $address,
            'content' => $v->content,
            'resource_path' => $resource_path,
            'resource_type' => $v->resource_type,
            'label' => $label,
            'created_at' => (new TimeServe())->time($v->created_at),
            'avatar_url' => $v->user->avatar_url,
            'nickname' => $v->user->nickname,
            'user_id' => $v->user->id,
            'title' => $v->title,
        ]);
    }
    //处理数据 将该动态的评论数据放到该条动态下
    foreach ($arr as $k => $v)
    {
        $arr[$k]['comment'] = [];
        foreach ($comment_data as $kk => $vv)
        {
            if ($v['id'] == $vv->message_id)
            {
                array_push($arr[$k]['comment'],$vv);
            }
        }
    }
    return ['code' => 200, 'msg' => '请求成功', 'data' => ['data'=>$arr,'like_message_id'=>$like_message_ids,'last_page'=>$last_page]];
}

点赞+取消点赞

/*
 * 动态点赞
 */
public function like(Request $request)
{
    //接收点赞的动态id
    $message_id = $request->get('message_id');
    //接收是哪个用户点赞的
    $user_id = (new TokenServe())->checkToken($request->header('token'));
    //查询该用户是否给该动态点过赞
    $res = MessageLike::where(['message_id'=>$message_id,'user_id'=>$user_id])->get()->toArray();
    if (empty($res)){
        //没点过赞 则点赞
        MessageLike::create(['message_id'=>$message_id,'user_id'=>$user_id]);
    }else{
        //点过赞 则取消点赞
        MessageLike::where(['message_id'=>$message_id,'user_id'=>$user_id])->delete();
    }
}

发表评论

/**
 * @param Request $request
 * @return array
 * 评论
 */
public function messageComment(Request $request)
{
    //接收评论的内容
    $params = $request->all();
    //获取评论的用户
    $params['user_id'] = (new TokenServe())->checkToken($request->header('token'));
    //添加入库
    MessageComment::create($params);
    return ['code'=>200,'msg'=>'评论成功','data'=>[]];
}

到这里就差不多完成了,细节需要自己优化,前端页面需要自己编写