今天在开发TPshop的手机新模板的消息页面,姑且记录一下。
首先,点击下方右上角,进入消息页面:
![](https://i-blog.csdnimg.cn/blog_migrate/40bc069f33d08654567e3dc20eb87cd4.png)
数据库中目前模拟了三条数据,有:
![](https://i-blog.csdnimg.cn/blog_migrate/1157b82885e4a480f4791b284723db35.png)
点击上图右上角,有:
这个 消息设置 功能是新增的,而且类型由原本的 系统通知 和 用户活动,拓展为下面六类。
![](https://i-blog.csdnimg.cn/blog_migrate/bbbda43dcad9688f6a37f43db476cb24.png)
实现这两个页面的功能之后,有效果如下:
点击取消 物流通知 和 我的资产,
![](https://i-blog.csdnimg.cn/blog_migrate/42898c7ba8faa045bcc119d9c04a7b78.png)
退回 消息中心,有:
可见 我的资产 消息已经不显示了,而 用户活动 本来就没有,也没显示。
![](https://i-blog.csdnimg.cn/blog_migrate/7ecf231561b2f2471aff3607f8d38d1d.png)
点击 消息设置 的 清空全部消息, 会把消息全部置为已读而没显示出来,并不会删除消息的数据,操作后自动跳到消息中心,结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/61b9dd553a19b7353c906f3f820ab14b.png)
上面功能比较简单,也把里面涉及到的主要代码片段摘出来,方便大家查看。
这个代码片段实现的是消息中心的展示内容:
主要注意点是要先查询关注的消息类型,筛选出未读的消息。
/**
* 获取用户的全部关注的消息
*/
public function getUserAllMaskMessage()
{
$this->checkPublicMessage();
$user_info = session('user');
$categorys = [];
for ($i = 0; $i < $this->message_category_num; $i++) {
if ($user_info['message_mask'] & (1 << $i)) {
$categorys[] = $i;
}
}
if (empty($categorys)) {
return [];
}
$user_system_message_no_read_where = array(
'user_id' => $user_info['user_id'],
'status' => 0,
'um.category' => ['in', $categorys]
);
$user_system_message_no_read = Db::name('user_message')
->alias('um')
->field('um.rec_id,um.user_id,um.category,um.message_id,um.status,m.send_time,m.type,m.message')
->join('__MESSAGE__ m','um.message_id = m.message_id','LEFT')
->where($user_system_message_no_read_where)
->select();
return $user_system_message_no_read;
}
这个实现的是设置关注的消息类型,因为点击按钮不需刷新整个页面,故用异步实现,节省存储空间,每个类型占用一个bit,下面对比特进行操作,暂时没想到更好更方便操作bit的方法。
public function ajax_set_notice()
{
switch (I('post.type')) {
case 'system':
$mask_offset = 0;
break;
case 'express':
$mask_offset = 1;
break;
case 'promotion':
$mask_offset = 2;
break;
case 'goods':
$mask_offset = 3;
break;
case 'asset':
$mask_offset = 4;
break;
case 'store':
$mask_offset = 5;
break;
default:
exit(json_encode(['status' => 1, 'msg' => 'no notice type']));
}
if (I('post.val')) {
$this->user['message_mask'] |= (1 << $mask_offset);
} else {
$this->user['message_mask'] &= ~(1 << $mask_offset);
}
M('users')->where('user_id', $this->user_id)->save(['message_mask' => $this->user['message_mask']]);
exit(json_encode(['status' => 0, 'msg' => '']));
}
-end-