微信小程序--聊天室小程序(云开发)
微信小程序 -- 聊天室小程序(云开发)
从微信小程序开发社区更新watch接口之后,一直在构思这个项目。项目已经完成很久,但是一直都没有空写一篇博客记录展示一下。
开源地址
wx-cloud-im: 基于微信云开发 cloudbase 构建聊天小程序 提供即时通讯
技术栈
![]() |
![]() |
|---|---|
| 云开发 | NodeJS |
功能实现
- 即时消息监听推送
使用
watch接口(见附录),对数据库信息变动进行监听,实现 订阅-发布 形式的消息推送,同时在小程序端也完成了消息推送聊天界面变化的动画实现
- 文本内容安全核验
使用微信小程序
openapi对文本内容安全进行校验
- 图片内容安全核验及重复性检查
将图片转为
Buffer形式上传,并进行内容安全校验,同时计算Buffer的MD5值,实现重复性检查
- 历史消息查询
通过对
scroll-view的ID锚点的计算,达到平滑切换信息的效果
- 小黑屋功能:禁止用户发言
无法通过内容安全校验的信息会被记录下来,管理员可以调用
cloud-user-black云函数对对应用户进行封禁,同时计时器自动每天触发一次,用户到达封禁日期期限自动解除发言限制
- 消息位置锚定
scroll-view
新消息和历史消息平滑的动画效果
效果预览

数据表设计
chat-users 聊天室用户信息表
| 字段 | 说明 | 类型 |
|---|---|---|
| _id | 数据库记录唯一ID | string |
| openid | 用户唯一身份识别ID | string |
| userInfo | 用户头像 昵称 地址等信息 | object |
chat-users-ban 聊天室小黑屋信息表
| 字段 | 说明 | 类型 |
|---|---|---|
| _id | 数据库记录唯一ID | string |
| ban_date | 禁言时长 单位天 | number |
| _createTime | 记录创建时间 | string |
| _updateTime | 记录更新时间 | string |
chat-msgs 消息记录表
| 字段 | 说明 | 类型 |
|---|---|---|
| _id | 数据库记录唯一ID | string |
| roomId | 会话房间号 | number |
| openid | 消息发送者openid | string |
| msgType | 消息类型 目前有 text image | string |
| content | 消息内容 text :对应消息内容 image:对应图片地址 | string |
| userInfo | 用户头像 昵称 地址等信息 | object |
| _createTime | 消息创建时间 | string |
chat-msgs-ban 非法消息记录表(内容/图片安全校验不通过)
| 字段 | 说明 | 类型 |
|---|---|---|
| _id | 数据库记录唯一ID | string |
| roomId | 会话房间号 | number |
| openid | 消息发送者openid | string |
| msgType | 消息类型 目前有 text image | string |
| content | 消息内容 text :对应消息内容 image:对应图片地址 | string |
| userInfo | 用户头像 昵称 地址等信息 | object |
| _createTime | 消息创建时间 | string |
拓展开发
项目提供的聊天室Demo为单聊天室模式,默认roomId = 1。为如果想要做成多用户聊天不同的形式,如QQ,只需要做如下几个步骤
自定义数据集合,为不同用户之间聊天分配不同的
roomId引用组件时传入不同
roomId即可<chat-box roomId="{{roomId}}"></chat-box>
调用消息发送云函数时,传入
roomId
TIPS
建议复用index/index.js页面,只需跳转该页面时,携带roomId参数,并赋值给data中的roomId即可
onLoad: function (options){
this.setData({
roomId:options.roomId
})
}
附录
watch
监听集合中符合查询条件的数据的更新事件。使用 watch 时,支持 where, orderBy, limit,不支持 field。
参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
| onChange | function | 是 | 成功回调,回调传入的参数 snapshot 是变更快照,snapshot 定义见下方 | |
| onError | function | 是 | 失败回调 |
返回值
Watcher 对象
| 属性 | 类型 | 说明 |
|---|---|---|
| close | function | 关闭监听,无需参数,返回 Promise,会在关闭完成时 resolve |
参数说明
snapshot 说明
| 字段 | 类型 | 说明 |
|---|---|---|
| docChanges | ChangeEvent[] | 更新事件数组 |
| docs | object[] | 数据快照,表示此更新事件发生后查询语句对应的查询结果 |
| type | string | 快照类型,仅在第一次初始化数据时有值为 init |
| id | number | 变更事件 id |
ChangeEvent 说明
| 字段 | 类型 | 说明 |
|---|---|---|
| id | number | 更新事件 id |
| queueType | string | 列表更新类型,表示更新事件对监听列表的影响,枚举值,定义见 QueueType |
| dataType | string | 数据更新类型,表示记录的具体更新类型,枚举值,定义见 DataType |
| docId | string | 更新的记录 id |
| doc | object | 更新的完整记录 |
| updatedFields | object | 所有更新的字段及字段更新后的值,key 为更新的字段路径,value 为字段更新后的值,仅在 update 操作时有此信息 |
| removedFields | string[] | 所有被删除的字段,仅在 update 操作时有此信息 |
QueueType 枚举值
| 枚举值 | 说明 |
|---|---|
| init | 初始化列表 |
| update | 列表中的记录内容有更新,但列表包含的记录不变 |
| enqueue | 记录进入列表 |
| dequeue | 记录离开列表 |
DataType 枚举值
| 枚举值 | 说明 |
|---|---|
| init | 初始化数据 |
| update | 记录内容更新,对应 update 操作 |
| replace | 记录内容被替换,对应 set 操作 |
| add | 记录新增,对应 add 操作 |
| remove | 记录被删除,对应 remove 操作 |
返回值说明
返回值 Watcher 上只有一个 close 方法,可以用于关闭监听。
orderBy 与 limit
从 2.9.2 起,在监听时支持使用 orderBy 和 limit,如果不传或版本号低于 2.9.2,则默认按 id 降序排列(等同于 orderBy('id', 'desc')),limit 默认不存在即取所有数据。
示例代码:根据查询条件监听*
const db = wx.cloud.database()
const watcher = db.collection('todos')
// 按 progress 降序
.orderBy('progress', 'desc')
// 取按 orderBy 排序之后的前 10 个
.limit(10)
// 筛选语句
.where({
// 填入当前用户 openid,或如果使用了安全规则,则 {openid} 即代表当前用户 openid
_openid: '{openid}'
})
// 发起监听
.watch({
onChange: function(snapshot) {
console.log('snapshot', snapshot)
},
onError: function(err) {
console.error('the watch closed because of error', err)
}
})
示例代码:监听一个记录的变化
const db = wx.cloud.database()
const watcher = db.collection('todos').doc('x').watch({
onChange: function(snapshot) {
console.log('snapshot', snapshot)
},
onError: function(err) {
console.error('the watch closed because of error', err)
}
})
示例代码:关闭监听
const db = wx.cloud.database()
const watcher = db.collection('todos').where({
_openid: 'xxx' // 填入当前用户 openid
}).watch({
onChange: function(snapshot) {
console.log('snapshot', snapshot)
},
onError: function(err) {
console.error('the watch closed because of error', err)
}
})
// ...
// 关闭
await watcher.close()
微信小程序--聊天室小程序(云开发)的更多相关文章
- 【总结】学习Socket编写的聊天室小程序
1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ...
- 用c写一个小的聊天室程序
1.聊天室程序——客户端 客户端我也用了select进行I/O复用,同时监控是否有来自socket的消息和标准输入,近似可以完成对键盘的中断使用. 其中select的监控里,STDOUT和STDIN是 ...
- [Java小程序]聊天室——Socket和ServerSocket的使用
这段小代码是因为担任Java助教给刚学习Java的本科大二的小学弟小学妹们指导,他们的实验作业就是编写一个Java聊天室客户端和服务器,为了避免出纰漏,自己事先写了一下. 客户端Ui代码: packa ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- [Java]直播方案----[接入环信聊天室]+[腾讯云直播]
辛辛苦苦写的,转载请注明一下,这点信任我想还是有的吧,谢谢了. http://www.cnblogs.com/applerosa/p/7162268.html 之前做了直播,一直没时间写,好不容易闲下 ...
- 基于Netty的RPC架构学习笔记(十二):借助spring实现业务分离、聊天室小项目、netty3和4、5的不同、业务线程池以及消息串行化
文章目录 借助spring实现业务分离(
- 技本功丨收藏!斜杠青年与你共探微信小程序云开发(下篇)
2019年2月26日,人们为了一个杯子疯了一天. 星巴克猫爪杯,一场已经与猫无关了的“圣杯战争“.网上的倒卖价格,已炒至近千元! 求而不得,舍而不能,得而不惜.这是人最大的悲哀... 所以,请珍惜以下 ...
- Slog71_选取、上传和显示本地图片GET !(微信小程序之云开发-全栈时代3)
ArthurSlog SLog-71 Year·1 Guangzhou·China Sep 12th 2018 ArthurSlog Page GitHub NPM Package Page 掘金主页 ...
- 微信官方小程序示例demo 微信开发者工具打开不显示云开发按钮
如果直接打开官方的demo,微信开发者工具上是不显示云开发按钮的. 是因为默认appid是测试号.要换成一个正式appid就会显示云开发按钮了. 分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默 ...
随机推荐
- java 日期字符串互相转换
一.把日期转换成字符串 //获取当前时间 Date date = new Date(); //打印date数据类型 System.out.println(date.getClass().get ...
- 第五篇 -- git基础教程
git(权威指南)基础教程第一章 git -- gitbash -- cygwin git service:gitolite 两个的目录不同 gitbash ~ windows/home/admini ...
- RegOpenKeyEx
对注册表的操作是通过句柄来完成的,在对某个键下的键值进行操作的时候首先将该键进行打开,然后使用键句柄进行引用该键,操作完后要进行关闭: 注册键的根键不需要打开,他们的句柄是固定的,直接拿来用就是了. ...
- 搭建MySQL主从实现Django读写分离
一.MySQL主从搭建 主从配置原理: 主库写日志到 BinLog 从库开个 IO 线程读取主库的 BinLog 日志,并写入 RelayLog 再开一个 SQL 线程,读 RelayLog 日志,回 ...
- Wordpress 4.6 任意命令执行漏洞(PwnScriptum)
漏洞存在后台登录地方的找回密码页面:http://192.168.49.2:8080/wp-login.php?action=lostpassword 抓包进行修改包 输入一个存在的用户,然后点击获取 ...
- Drupal 远程代码执行漏洞(CVE-2018-7602)
影响版本 Drupal Core 存在一个远程代码执行漏洞,影响 7.x 和 8.x 版本 如下图所示,执行以下命令即可复现该漏洞.示例命令为id,如图红框中显示,可以执行该命令. 检测 python ...
- 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列
目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...
- 阿里面试官:Android中binder机制的实现原理及过程?
Binder 是 Android 系统中非常重要的组成部分.Android 系统中的许多功能建立在 Binder 机制之上.在这篇文章中,我们会对 Android 中的 Binder 在系统架构中的作 ...
- 0基础学小程序----day1
17的书,那时候微信小程序开发程序还是v0.01 19年都v1.02了.位置都不一样了,枯了 技术准备:WXML使用方法类似于HTML,(都不会) 自己的样式语言WXSS兼容了CSS(都不会) 使用J ...
- VBA·Function的基础使用
阅文时长 | 0.27分钟 字数统计 | 440字符 主要内容 | 1.引言&背景 2.基本结构 3.Demo示例 4.声明与参考资料 『VBA·Function的基础使用』 编写人 | SC ...

