0

0

php怎么实现站内私信功能

藏色散人

藏色散人

发布时间:2021-09-10 10:28:59

|

3429人浏览过

|

来源于php中文网

原创

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

php怎么实现站内私信功能

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

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

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

一、背景

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

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

 

 

站内信的设计基调

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

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

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

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

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

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

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

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

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

     

     

 

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

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

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

 

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

 

二、需求描述

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

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

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

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

 

我们目前的需求是:

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

对用户真实性不做校验

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

6 管理员页面: 

更新用户

删除消息

统计数据

增加module

增加站内信类型

发送全站消息

四、系统流程

发送站内信

  1. 读取POST请求的request body

  2. 校验长度

  3. 插入数据库

  4. 返回

 

获取站内信列表

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

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

 

获取未读站内信数量

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

  2. 返回数量

 

批量已阅

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

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

 

全部已阅

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

批量删除

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

  2. 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),例如安全消息、活动消息、服务消息等,每一大类里,又可以划分子类,例如活动消息-优惠活动

 

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

天天团购系统
天天团购系统

天天团购系统是一套强大的开源团购程序,采用PHP+mysql开发,系统内置支付宝、财付通、GOOGLE地图等接口,支持短信发送团购券和实物团购快递发货等;另外可通过Ucenter模块,与网站已有系统无缝整合,实现用户同步注册、登陆、退出。 天天团购系统是一套创新的开源团购程序,拥有多达10项首创功能,同时支持虚拟和实物团购,内置类似淘宝的快递配送体系,并提供强大的抽奖、邀请返利等营销功能,让您轻松

下载

 

站内信发送表

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状态

 

阿里云的图标行为是:

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

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

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

 

 

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

 

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

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

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

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

 

 

隐藏浏览器进度条

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

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

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

20

2025.12.29

freeok看剧入口合集
freeok看剧入口合集

本专题整合了freeok看剧入口网址,阅读下面的文章了解更多网址。

65

2025.12.29

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2025.12.29

python中def的用法大全
python中def的用法大全

def关键字用于在Python中定义函数。其基本语法包括函数名、参数列表、文档字符串和返回值。使用def可以定义无参数、单参数、多参数、默认参数和可变参数的函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

python改成中文版教程大全
python改成中文版教程大全

Python界面可通过以下方法改为中文版:修改系统语言环境:更改系统语言为“中文(简体)”。使用 IDE 修改:在 PyCharm 等 IDE 中更改语言设置为“中文”。使用 IDLE 修改:在 IDLE 中修改语言为“Chinese”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

C++的Top K问题怎么解决
C++的Top K问题怎么解决

TopK问题可通过优先队列、partial_sort和nth_element解决:优先队列维护大小为K的堆,适合流式数据;partial_sort对前K个元素排序,适用于需有序结果且K较小的场景;nth_element基于快速选择,平均时间复杂度O(n),效率最高但不保证前K内部有序。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

12

2025.12.29

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

134

2025.12.29

抖音网页版入口在哪(最新版)
抖音网页版入口在哪(最新版)

抖音网页版可通过官网https://www.douyin.com进入,打开浏览器输入网址后,可选择扫码或账号登录,登录后同步移动端数据,未登录仅可浏览部分推荐内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

63

2025.12.29

快手直播回放在哪看教程
快手直播回放在哪看教程

快手直播回放需主播开启功能才可观看,主要通过三种路径查看:一是从“我”主页进入“关注”标签再进主播主页的“直播”分类;二是通过“历史记录”中的“直播”标签页找回;三是进入“个人信息查阅与下载”里的“直播回放”选项。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

18

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号