每个用户对系统消息的读、删除(不是瞬间并发,但是达到每个用户都有这个系统消息,用户的系统消息可以删除)

31 篇文章 1 订阅
14 篇文章 0 订阅

系统消息

  1. 简介
    客户需求是:后台发布了一个公告,每个用户在手机app端必须出现这个公告,第一次想法是,建立一个表专门存储系统消息,但是如果用户足够多的时候,并发量特别大,一千个用户,连续发布两条系统消息,并发会出现问题(服务器不太好),所以必须找到一个解决方法。我的解决办法是:发布的一个系统消息,我存储在系统消息表,当用户点击查看的时候我才将这条新的数据插入到用户读的消息表中。这样只有用户点击的时候,才会进行插入操作。这样服务器压力低了,服务器不会崩掉。瞬时并发就不会有。还有一个注意操作,当用户删除的时候,你读的信息列表必须是不存在的。下一条增加的系统消息必须添加读的列表里。下面看具体代码
    读消息
这里包含新增加的还有系统的
public function message(){
        $uid = input('uid');
        $type = input('type');
        $p = input('p');
        $p  ?   $p  :   $p = 1;
        $pagesize = input('pagesize');
        $pagesize   ?   $pagesize   :   $pagesize = 10;
        $type ?    $type = $type    :   $type = 1;
        switch ($type){
            case 1://系统消息
                $map['a.is_delete'] = '0';
                $map['b.user_id'] = $uid;
                $map['b.is_del'] = '0';
                $check = Db::name('read_system')->where(['user_id'=>$uid,'is_del'=>'0'])->find();
                if($check){
                    $a = json_decode($check['system_id']);
                    if(empty($a)){
                        $arr = [];
                        $page = '0';
                    }else{
                        foreach ($a as $k=>$v){
                            $notice = Db::name('system_notice')->field('id,is_read,intime,content as message,title')->where(['is_delete'=>'0','id'=>$v])->find();
                            $arr[] = $notice;
                        }
                        $count = count($arr);
                        $page = ceil($count/$pagesize);
                    }
                }else{
                    $check = Db::name('read_system')->where(['user_id'=>$uid])->find();
                    if($check['is_del']=='1'){
                        $res = Db::name('system_notice')->field('id,is_read,intime,content as message,title')->where(['is_delete'=>'0'])->select();
                        foreach ($res as $k=>$v){
                            if(strtotime($v['intime']) > $check['update_time']){
                                  $id = $v['id'];
                                  $a = Db::name('system_notice')->field('id,is_read,intime,content as message,title')->where(['is_delete'=>'0','id'=>$id])->find();
                                  $arr[] = $a;
                                  $count = count($arr);
                                  $page = ceil($count/$pagesize);
                            }else{
                                $arr = [];
                                $page = '0';
                            }

                        }

                    }else{
                        $res = Db::name('system_notice')->field('id,is_read,intime,content as message,title')->where(['is_delete'=>'0'])->select();
                        $count = Db::name('system_notice')->where(['is_delete'=>'0'])->count();
                        $page = ceil($count/$pagesize);
                        foreach ($res as $key=>$val){
                            $arr[] = $val;
                        }
                    }


                }
                break;
            case 3://其他消息
                $map['member_id'] = $uid;
                $map['type'] = '3';
                $count = Db::name('message')->where($map)->count();
                $page = ceil($count/$pagesize);
                $arr = Db::name('message')->field('message,intime,order_id')
                    ->where($map)->limit(($p-1)*$pagesize,$pagesize)->order('intime desc')->select();
                if(!empty($arr)){
                    Db::name('message')->where($map)->update(['is_read'=>'2']);
                }
                break;
        }
        success(['page'=>$page,'list'=>$arr]);

    }

读系统消息
这里读系统消息,一个是系统消息列表里面的,另一个是如果系统消息新增加的

 /**
     * 读系统消息
     */
    public function read_state(){
        $uid = input('uid');
        $system_id = input('id');
        $data['is_read'] = '1';
        $data['user_id'] = $uid;
        $data['create_time'] = time();
        $re = Db::name('read_system')->where(['user_id'=>$uid])->find();
        $a = json_decode($re['system_id']);
        $res = in_array($system_id,$a);
        if(!$re){
            if(!$res){
                $re = Db::name('system_notice')->where(['is_delete'=>'0'])->select();
                foreach ($re as $k=>$v){
                    $arr[] = $v['id'];
                }
                $data['system_id'] = json_encode($arr);
                $res = Db::name('read_system')->insert($data);
                if($res){
                    success('已读成功');
                }else{
                    error('已读失败');
                }
            }
        }else{
            $re1 = in_array($system_id,$a);
            if(!$re1){
                $re = Db::name('read_system')->where(['user_id'=>$uid])->find();
                if($re['is_del']=='1'){
                    $arr[] = $system_id;
                    $d['system_id'] = json_encode($arr);
                    $da['is_del'] = '0';
                    $res = Db::name('read_system')->where(['user_id'=>$uid])->update($d);
                    if($res){
                        success('已读成功');
                    }else{
                        error('已读失败');
                    }
                }else{
                    $arr[] = $system_id;
                    $arr = array_merge($a,$arr);
                    $data['system_id'] = json_encode($arr);
                    $data['is_del'] = '0';
                    $res = Db::name('read_system')->where(['user_id'=>$uid])->update($data);
                    if($res){
                        success('已读成功');
                    }else{
                        error('已读失败');
                    }
                }

            }else{
                    success('已读成功');
            }

        }


    }

删除系统消息

 /**
     * 对系统消息删除
     */
    public function del_system(){
        $id = input('ids');
        $uid = input('uid');
        empty($id) ? error('参数错误') : true;
        $res = Db::name('read_system')->where(['user_id'=>$uid])->find();
        $a = json_decode($res['system_id']);
        foreach ($a as $k=>$v){
            if($id !== $v){
                $arr[] = $v;
            }
        }
        $data['system_id'] = json_encode($arr);
        $data['update_time'] = time();
        $res = Db::name('read_system')->where(['user_id'=>$uid])->update($data);
        if($res){
            $system_id = Db::name('read_system')->where(['user_id'=>$uid])->value('system_id');
            if($system_id == 'null'){
                Db::name('read_system')->where(['user_id'=>$uid])->update(['is_del'=>'1']);
            }
            success('删除成功');
        }else{
            error('删除失败');
        }

    }

博主辛苦,请打赏
这里写图片描述
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值