系统消息
- 简介
客户需求是:后台发布了一个公告,每个用户在手机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