php怎么实现站内私信功能

php实现站内私信功能的方法:1、读取POST请求的request body;2、调用子模块,插入发送给全站或所属用户组的站内信;3、获取未读站内信数量;4、检查messageId是不是属于当前用户;5、实现批量删除即可。

php怎么实现站内私信功能

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

php怎么实现站内私信功能?

PHP实现站内信设计思路与方案

一、背景

立即学习“PHP免费学习笔记(深入)”;

当前使用运维平台的用户进行沟通时,更多的是依赖微信和邮件通知,而运维平台作为一个整体的产品,也需要能够进行内部沟通的一种服务 – 站内信。

 

 

站内信的设计基调

站内信的设计基调取决于用户如何使用站内信:

用户不会守着运维平台这个页面,等待消息通知,查看消息内容,然后跳转到要操作的页面。 

也就是说站内信不是第一入口,站内信的实时性意义也不大。

同很多社交网站不同(Facebook,知乎,微博等),用户会守在社交网站的主页面,不断刷新新内容,同时检查新消息(主要是个人私信、别人的回复等,也绝不是为了检查系统通知消息)

用户会根据邮件通知,决定是否要进入运维平台进行操作

如果邮件特别多,例如同时有多个工单需要用户处理,用户也会在工单平台提供的“我的待办”页面进行所有工作。

如果邮件被误删了,没有邮件链接直接进入要操作的模块 

那么或者通过索要链接/单号的方式,前往指定页面

或者直接在相关模块进行搜索

 

 

 

上面的描述都意味着用户基本不会使用站内信,那么在什么样的场合会使用站内信呢?

不发邮件,只发站内信的消息通知,例如全站通知、编辑操作、Comment操作等

当具体模块没有详细的操作记录时,可以通过查看站内信的发生时间

 

当前只有产品消息通知,消息展示也没有进行归类聚合,以后增加全站通知、mention、like、comment等类型的站内信时,就需要考虑按类型进行消息聚合了。

 

二、需求描述

站内信通常需要解决两个需求:

用户对用户的站内信,管理员对用户的站内信:即一对一发送

管理员对多用户、用户组、全站的站内信:即一对多发送

(还有一种是用户对产品的站内信,例如对某个模块的反馈、疑问之类的)

 

我们目前的需求是:

1管理员对多用户发送站内信 

对用户真实性不做校验

对标题长度、内容长度进行限制(分别是45个字节、150个字节,对应中文字符15个、50个)

对收件人的拼音长度进行限制(最长50个字节)

 【推荐学习:《PHP视频教程》】

2 用户可以查看自己的站内信 

按“全部、已读、未读”过滤

按消息来源分类:工单平台、资源管理、自动装机、漏洞平台、故障平台。。。

 

3 用户可以删除、批量删除站内信

4 用户可以已阅、批量已阅、全部标记为已读 站内信

5 运维平台页面顶部的消息图标 

展示未读消息数,超过99显示 99+

鼠标放上去,会有下拉框,展示最近10条未读消息(展示“时间”,“消息来源”,“标题”)

下拉框的底部有两个按钮:“更多”,加载更多未读消息;“查看全部”,跳转到站内信列表页面(最好另开一个窗口)

点击下拉框里的未读消息,通过弹出框展示详情;然后在未读列表里删除该记录,在数据库里标记为已读,消息图标的未读消息数量减一

 

6 管理员页面: 

更新用户

删除消息

统计数据

增加module

增加站内信类型

发送全站消息

四、系统流程

发送站内信

读取POST请求的request body

校验长度

插入数据库

返回

 

获取站内信列表

调用子模块,插入发送给全站或我所属用户组的站内信

根据查询条件,返回数据库数据

 

获取未读站内信数量

调用子模块,插入发送给全站或我所属用户组的站内信

返回数量

 

批量已阅

检查messageId是不是属于当前用户

inbox_message表里把 read 置为1,修改update_time

 

全部已阅

update inbox_message set “read”=1, “update_time”=now where “receiver_name”=currentUser() and “read” = 0

登录后复制

批量删除

检查messageId是不是属于当前用户

inbox_message表里把 deleted 置为1,修改update_time

 

全部删除

update inbox_message set “deleted”=1, “update_time”=now where “receiver_name”=currentUser() and “deleted” = 0

登录后复制

 

五、数据库设计

站内信内容表

CREATE TABLE `inbox_message_text` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `title` varchar(128) NOT NULL DEFAULT '',  `content` longtext NOT NULL,  `create_time` datetime NOT NULL,  `update_time` datetime NOT NULL,  `send_type` tinyint(4) NOT NULL DEFAULT '0',  `creator_name` varchar(255) NOT NULL DEFAULT '',  `deleted` tinyint(4) NOT NULL DEFAULT '0',  `module_id` bigint(20) NOT NULL,  `link` varchar(255) NOT NULL DEFAULT '',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

登录后复制

站内信本身除了消息来源(module_name),还有一个纬度的描述,叫消息类型(message_type),例如安全消息、活动消息、服务消息等,每一大类里,又可以划分子类,例如活动消息-优惠活动

 

消息来源和消息类型可以是正交关系,即工单平台也可以有活动消息;消息来源也可以是消息类型的一种,称为“产品消息”

 

站内信发送表

CREATE TABLE `inbox_message` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `message_text_id` bigint(20) NOT NULL,  `receiver_name` varchar(255) NOT NULL DEFAULT '',  `read` tinyint(4) NOT NULL DEFAULT '0',  `deleted` tinyint(4) NOT NULL DEFAULT '0',  `create_time` datetime NOT NULL,  `update_time` datetime NOT NULL,  PRIMARY KEY (`id`),  KEY `inbox_message_receiver_name_deleted_read_id` (`receiver_name`,`deleted`,`read`,`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

登录后复制

消息来源表

CREATE TABLE `inbox_module` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `code` varchar(128) NOT NULL DEFAULT '',  `name` varchar(128) NOT NULL DEFAULT '',  `create_time` datetime NOT NULL,  `update_time` datetime NOT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `code` (`code`),  UNIQUE KEY `name` (`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

登录后复制

六、API设计

发送站内信:POST /v1/message

request body Content-Type: application/json

{    "title": "工单审批",    "content": "XXX提交了变更申请,请审批",    "to": "sunzhongyuan,shenli,wangya",    "module_name": "工单平台",    "link": "xxx"}

登录后复制

response

{    "code": 200,    "data": 32,    "msg": "OK"}

登录后复制

获取站内信列表:GET /v1/message User-Id: xxx

http://127.0.0.1:10085/v1/message?query=message_text_id.module_id.name:xxx&limit=1

登录后复制

{    "code": 200,    "data": {        "data": [            {                "id": 1,                "message_text": {                    "id": 1,                    "title": "title 2",                    "content": "content 2",                    "create_time": "2018-01-12 11:13:48",                    "update_time": "2018-01-12 11:13:48",                    "send_type": 1,                    "creator_name": "sysadmin",                    "deleted": 0,                    "link": "xxx",                    "Messages": null,                    "module": {                        "id": 4,                        "code": "secure",                        "name": "xxx",                        "create_time": "2018-01-11 15:38:01",                        "update_time": "2018-01-11 15:38:01",                        "MessageTexts": null                    }                },                "receiver_name": "xxx",                "read": 0,                "deleted": 0,                "create_time": "2018-01-12 11:13:48",                "update_time": "2018-01-12 11:13:48"            }        ],        "total": 2    },    "msg": "OK"}

登录后复制

已阅、批量已阅站内信:PUT /v1/read_messages/:messageIds

response

{    "code": 200,    "data": "OK",    "msg": "OK"}

登录后复制

全部已阅 PUT:/v1/read_all_messages

response 同上

 

删除、批量删除站内信:PUT /v1/delete_messages/:messageIds

response 同上

 

全部删除站内信:PUT /v1/delete_all_messages

response 同上

 

获取消息来源列表:GET /v1/module

response

{    "code": 200,    "data": [        {            "id": 1,            "code": "worksheet",            "name": "工单平台",            "create_time": "2018-01-11 15:21:38",            "update_time": "2018-01-11 15:21:38",            "MessageTexts": null        },        {            "id": 2,            "code": "cmdb",            "name": "资源管理",            "create_time": "2018-01-11 15:22:28",            "update_time": "2018-01-11 15:22:28",            "MessageTexts": null        },        ...    ],    "msg": "OK"}

登录后复制

 

七、测试注意点

1 发送站内信 

纯接口

收件用户以逗号分割,真实性不做校验

收件用户有长度校验,50个字节

title content 有长度校验,分别是45,150个字节

module_name 是一个列表,必须从这里选一个

2 其他接口都可以通过前端页面测试

 

八、优化

未读列表可以加上粗体显示,已读则是普通字体

对站内信进行分类,打上不同纬度的标签,方便过滤、搜索、屏蔽

用户可以设置允许接收的站内信的消息来源

管理员可以对全站消息、全站人员、全站的消息属性进行增删改查,比如撤销某个站内信,让所有人都看不见

管理员可以统计站内信的发送数量、各产品的使用情况、消息被读的比例、消息被读的时间、消息被读的方式(点开还是批量操作),等

 

九、关键功能点设计

右上角的图标行为

1 点击图标,展示最近的N条未读消息 

展示下拉框

实时获取最近N条未读消息

N可以为5~10,具体数值取决于下拉框的高度限制

当未读数不足N时,下拉框能自适应高度

如果没有未读消息,展示”暂无新消息”

停止每10秒的获取未读消息数接口

 

2 下拉框里,展示消息来源、时间(相对现在的时间:10分钟前)、title 

向下滑动下拉框,展示更多未读消息(只获取id小于已展示消息列表里的最小id,即不获取点击图标后新来的消息)

 

3 点击下拉框里的某一个消息 

下拉框不消失

依然停止每10秒的获取未读消息数接口

未读消息数减1

未读消息列表删除当前消息(slice)

展示弹出框

 

4 弹出框展示消息的来源、时间(绝对时间)、title、content

5 关闭弹出框或者点击外围: 

弹出框消失

下拉框不消失

可以继续点击某一个未读消息

 

6 再次点击下拉框和图标的外围 

下拉框消失

清空已有的未读消息列表

恢复每10秒的获取未读消息数接口

 

7 再次点击图标,重新回到#1状态

 

阿里云的图标行为是:

刷新页面的时候才会请求一次未读消息数,之后不再定时刷新(当然也可能是刷新时间间隔比较长,没发现;又或者采用了 socket 的方式,建立了一个长链接)

hover图标,即显示未读消息的下拉框

点击图标,进入站内信管理页面,默认是“未读消息”

 

 

4 点击未读消息,新开一个Tab,展示该消息的详情(detail页面),原Tab内容不变,即没有未读数减一,也没从下拉框里删除刚点击的消息

 

5 最多展示5条消息,只要不刷新页面,就一直是这5条

6 没有滚动更多的功能,只有查看更多,点击进入站内信管理页面,默认是“未读消息” 

和点击图标的区别是:点击图标直接当前页面跳转到站内信管理页面,点击“查看更多”会新建一个Tab

7 多了一个“消息接受管理”的按钮,当前页面跳转到站内信管理页面,但是默认即“基本接收管理” 

 

 

隐藏浏览器进度条

每10秒的获取未读消息数接口,会触发浏览器展示进度条,导致分散用户注意力,要把这个进度条隐藏掉。 

其他刷新页面的行为不受影响。

以上就是php怎么实现站内私信功能的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2109234.html

(0)
上一篇 2025年2月24日 15:28:52
下一篇 2025年2月18日 02:38:33

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • PHP中通过缓存技术实现多级缓存的应用实践

    随着互联网的迅速发展,大量应用和网站需要处理大量的数据和请求。为了提高响应速度和减轻服务器负载,使用缓存技术已经成为了常态。而在php中,通过缓存技术实现多级缓存已成为一种重要的优化手段。 本文将介绍PHP中多级缓存的应用实践,具体包括以下…

    数据库 2025年2月24日
    200
  • PHP中缓存技术对于高并发下的应用程序性能提升效果分析

    随着互联网的快速发展,越来越多的应用程序需要支持高并发访问,而php作为一种常用的web开发语言,其性能优化一直是一个热门话题。其中,缓存技术便成为了提高应用程序性能的重要手段之一。本文将对php中缓存技术对于高并发下的应用程序性能提升效果…

    数据库 2025年2月24日
    200
  • 在PHP应用中使用APC缓存技术优化HTTP头部的处理

    随着web应用的规模和复杂度的不断增加,优化服务器响应成为了极为重要的任务。其中,优化http头部的处理是一项非常有效的优化手段,可以减少http响应大小,加快页面加载速度。在php应用中,使用apc缓存技术可以优化http头部的处理,提高…

    数据库 2025年2月24日
    200
  • PHP缓存技术对网站性能提升的作用

    随着互联网的高速发展,网站业务量和用户数量不断攀升。如何保障网站的稳定性和访问速度,成为了每个网站开发者和管理员必须面对的挑战。其中,缓存技术是提高网站性能的重要手段之一。本文将重点介绍php缓存技术对网站性能提升的作用。 一、缓存技术的定…

    数据库 2025年2月24日
    200
  • 大流量场景下的PHP编程数据库优化实践

    随着互联网技术的发展与普及,日益庞大的用户流量对于网站或应用的稳定性和响应速度提出了更高的要求。在这样的大流量场景下,数据库的性能及其优化显得尤为重要。php作为一种常用的web编程语言,其对数据库的操作与优化也显得十分关键。本文将对大流量…

    数据库 2025年2月24日
    200
  • php怎么实现聊天室思路

    php实现聊天室的思路是:1、创建表;2、设置“connect.php”连接数据库;3、创建用户聊天界面文件“client.php”;4、实现查询有无客服回复信息;5、设置客服聊天页面“server.php”;6、发送信息给用户即可。 本文…

    2025年2月24日
    200
  • php怎么隐藏中间字符

    php隐藏中间字符的方法:1、通过“function func_substr_replace(){…}”方法隐藏中间部分数字;2、通过“function substr_cut($user_name){…}”方法隐藏中…

    2025年2月24日
    200
  • php array怎么根据值删除

    php array根据值删除的方法:1、通过foreach遍历后用unset删除;2、通过array_flip之后用unset删除;3、通过array_search删除;4、使用array_keys搜索指定的值再循环删除。 本文操作环境:w…

    2025年2月24日
    200
  • php hex怎么转ascii

    在php中可以通过hex2bin()函数把十六进制值的字符串转换为ASCII字符,其语法如“hex2bin(string)”,参数string表示要转换的十六进制值。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 …

    2025年2月24日
    200
  • php怎么删除数组元素,让键值重新排列

    方法:1、使用array_splice()函数从数组指定位置开始删除指定个数的元素,语法“array_splice($arr,位置,格式)”;2、删除数组元素后,使用sort()或rsort()函数对数组元素进行升序或降序排序。 本教程操作…

    2025年2月24日
    200

发表回复

登录后才能评论