thinkphp5实现朋友圈(三)

话说这篇博客真的是贼鸡儿长,我保证这个功能实现不难的,真的不难的..........算了,不说废话了,还是继续写吧

写了动态以后就是评论动态了,没啥特别的,还是数据的存储。
public function comment()
{
    //数据接收
    $res = input('post.');

    //用户名,动态编号,评论内容,图片,评论谁,时间
    $user = $res["user"];
    $num = $res["num"];
    $dt = $res["dt"];
    $pic = 0;  //这里图片直接默认值为0,,因为评论不可能会有图片
    $zan = $res["pin"];  //如果是评论动态则前端传值为0
    $time = $res['time'];

    $data = ['user' => $user, 'num' => $num, 'dt' => $dt, 'pic' => $pic, 'zan' => $zan, 'time' => $time];
    $res = Db::table("comment")
        ->insert($data);
    if (!!$res) {
        echo "评论动态成功!";
        exit;
    } else {
        echo "评论动态失败";
        exit;
    }

}

好了,到了这里可能就是代码实现过程最难的部分了,不虚,其实也不是非常难的,熟悉了框架还有理解了数据表的关系实现起来还是阔以的
这里先水一波思路,我们平时刷票圈,首先是看到好友的动态,所以我们要先去好友表搜一下有谁是我的好友,然后呢,再去动态那一张表,搜一下好友的动态,然后还有他们的评论,如果评论他们动态的人同时也是你的好友,也就是公共好友,把数据拿出来,大概过程就是这样,贴波代码(代码很长,不慌,还是很容易理解的)
public function read()
{
    
    //获取数据
    $res = input('post.');

    //用户名,监听次数,flag
    $user = $res["user"];
    //这个监听次数的设置是为了不用一次发很多数据给前端,如果用户看完了发过去的动态还想继续看,后台就继续发数据
    $count = $res["count"];
    //这个flag是方便后台下次遍历进行的操作
    $now = $res["now"];
    $get_dt = [];

    //寻找朋友
    $fri = Db::table("friend")
        ->where('user', $user)
        ->column('friend');
    $j = 0;  //$j是用来记录动态数的,如果够了20条就跳出循环,传数据给前端

    //第一次看动态
    if ($count == "1") {
        //分页选择动态
        $res = Db::table("comment")//第一次看动态时,找出数据库有多少条动态,从编号最大开始倒序遍历
        ->order('num', 'desc')
            ->limit(1)
            ->select();
        $max_num = $res[0]["num"];  //动态数
        for ($i = $max_num; $i > 0; $i--)//倒序遍历20条(这样设置就是为了不用一次发送太多数据给前端导致加载太慢)
        {
            $pri1 = Db::table("comment")//用户名
            ->where('num', $i)
                ->column('user');
            $pri2 = Db::table("comment")//动态内容
            ->where('num', $i)
                ->column('dt');
            $pri3 = Db::table("comment")//图片
            ->where('num', $i)
                ->column('pic');
            $pri4 = Db::table("comment")//赞或评论谁
            ->where('num', $i)
                ->column('zan');
            $pri5 = Db::table("comment")//时间
            ->where('num', $i)
                ->column('time');
            $case = count($pri1);  //记录一条动态内的信息数量
            
            $k = 0;
            if ($pri1[0] === $user)  //发动态人是用户自己
            {
                $tx = Db::table("user")  //获取头像的路径
                    ->where('username', $pri1[0])
                    ->value('portrait');
                //用户头像,用户名,用户内容,用户图片,点赞数,时间
                $get_dt[$j][$k]["tx"] = $tx;
                $get_dt[$j][$k]["user"] = $pri1[0];
                $get_dt[$j][$k]["text"] = $pri2[0];
                $get_dt[$j][$k]["pic"] = $pri3[0];
                $get_dt[$j][$k]["zan"] = $pri4[0];
                $get_dt[$j][$k]["time"] = $pri5[0];
                $get_dt[$j][$k]["num"] = $i;
                $get_dt[$j][$k]["cnt"] = $case-1;
                $k++;
                for ($h = 1; $h < $case; $h++) {
                    //用户名,动态内容,评论谁,时间
                    $get_dt[$j][$k]["user"] = $pri1[$h];
                    $get_dt[$j][$k]["text"] = $pri2[$h];
                    $get_dt[$j][$k]["zan"] = $pri4[$h];
                    $get_dt[$j][$k]["time"] = $pri5[$h];
                    $k++;
                }
                $j++;
            } elseif (in_array($pri1[0], $fri))  //发动态的人是用户的朋友
            {
                $tx = Db::table("user")  //获取头像的路径
                    ->where('username', $pri1[0])
                    ->value('portrait');
                //用户头像,用户名,用户内容,用户图片,点赞数,时间
                $get_dt[$j][$k]["tx"] = $tx;
                $get_dt[$j][$k]["user"] = $pri1[0];
                $get_dt[$j][$k]["text"] = $pri2[0];
                $get_dt[$j][$k]["pic"] = $pri3[0];
                $get_dt[$j][$k]["zan"] = $pri4[0];
                $get_dt[$j][$k]["time"] = $pri5[0];
                $get_dt[$j][$k]["num"] = $i;
                $get_dt[$j][$k]["cnt"] = $case-1;
                $k++;
                for ($h = 1; $h < $case; $h++) {
                    //回复评论两方都是用户的好友就可以把数据添加进去
                    //用户名,动态内容,评论谁,时间
                    if (in_array($pri1[$h], $fri) && in_array($pri4[$h], $fri)) {
                        $get_dt[$j][$k]["user"] = $pri1[$h];
                        $get_dt[$j][$k]["text"] = $pri2[$h];
                        $get_dt[$j][$k]["zan"] = $pri4[$h];
                        $get_dt[$j][$k]["time"] = $pri5[$h];
                        $k++;
                    }
                }
                $j++;
            } else  //发动态的人不是用户或者他朋友
            {
                continue;
            }
            $max_num--;
            if ($j === 20) {
                break;
            }
            $now = $max_num;
        }
    } else {
        for ($i = $now; $i > 0; $i--)//不是第一次看动态的话,从前端传的flag开始倒序遍历20条
        {
            $pri1 = Db::table("comment")//用户名
            ->where('num', $i)
                ->column('user');
            $pri2 = Db::table("comment")//动态内容
            ->where('num', $i)
                ->column('dt');
            $pri3 = Db::table("comment")//图片
            ->where('num', $i)
                ->column('pic');
            $pri4 = Db::table("comment")//赞或评论谁
            ->where('num', $i)
                ->column('zan');
            $pri5 = Db::table("comment")//时间
            ->where('num', $i)
                ->column('time');
            $case = count($pri1);  //记录一条动态内的信息数量
            
            $k = 0;
            if ($pri1[0] === $user)  //发动态人是用户自己
            {
                $tx = Db::table("user")  //获得头像路径
                    ->where('username', $pri1[0])
                    ->value('portrait');
                //索引,用户头像,用户名,用户内容,用户图片,点赞数,时间
                $get_dt[$j][$k]["tx"] = $tx;
                $get_dt[$j][$k]["user"] = $pri1[0];
                $get_dt[$j][$k]["text"] = $pri2[0];
                $get_dt[$j][$k]["pic"] = $pri3[0];
                $get_dt[$j][$k]["zan"] = $pri4[0];
                $get_dt[$j][$k]["time"] = $pri5[0];
                $k++;
                for ($h = 1; $h < $case; $h++) {
                    $get_dt[$j][$k]["user"] = $pri1[$h];
                    $get_dt[$j][$k]["text"] = $pri2[$h];
                    $get_dt[$j][$k]["time"] = $pri5[$h];
                    $k++;
                }
                $j++;
            } elseif (in_array($pri1[0], $fri))  //发动态的人是用户的朋友
            {
                $tx = Db::table("user")  //获得头像路径
                    ->where('username', $pri1[0])
                    ->value('portrait');
                //索引,用户头像,用户名,用户内容,用户图片,点赞数,时间
                $get_dt[$j][$k]["tx"] = $tx;
                $get_dt[$j][$k]["user"] = $pri1[0];
                $get_dt[$j][$k]["text"] = $pri2[0];
                $get_dt[$j][$k]["pic"] = $pri3[0];
                $get_dt[$j][$k]["zan"] = $pri4[0];
                $get_dt[$j][$k]["time"] = $pri5[0];
                $k++;
                for ($h = 1; $h < $case; $h++) {
                    //回复评论两方都是用户的好友就可以把数据添加进去
                    //用户,评论谁,内容,时间
                    if (in_array($pri1[$h], $fri) && in_array($pri4[$h], $fri)) {
                        $get_dt[$j][$k]["user"] = $pri1[$h];
                        $get_dt[$j][$k]["text"] = $pri2[$h];
                        $get_dt[$j][$k]["zan"] = $pri4[$h];
                        $get_dt[$j][$k]["time"] = $pri5[$h];
                        $k++;
                    }
                }
                $j++;
            } else  //发动态的人不是用户或者他朋友
            {
                continue;
            }
            $now--;
            if ($j === 20) {
                break;
            }
        }
    }
    //将数据装成json对象传给前端
    echo json_encode([
        "data" => $get_dt,
        "now" => $now
    ]);
}
到了这里,票圈也总算是写完了,基本功能还是都能实现的了,剩下的一些安全性问题和安卓端等的兼容性问题就以后再慢慢学习解决了

猜你喜欢

转载自blog.csdn.net/xiaorouji/article/details/80086635