php如何实现站内私信功能

发布时间:2021-09-10 10:43:11 作者:chen
来源:亿速云 阅读:192

本篇内容介绍了“php如何实现站内私信功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!


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

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

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

一、背景

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

站内信的设计基调

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

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

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

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

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



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

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

二、需求描述

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

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

我们目前的需求是:

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

对用户真实性不做校验

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

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

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

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

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

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

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

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

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

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

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

站内信发送表

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 发送站内信

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

八、优化

九、关键功能点设计

右上角的图标行为

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

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

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

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

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

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

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

“php如何实现站内私信功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. 外链站内跳转代码
  2. Android如何实现集成google登录并获取性别等隐私信息

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:微信公众平台开发消息回复的示例分析

下一篇:怎么通过重启路由的方法切换IP地址

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》