vue+socket.io+express+mongodb 实现简易多房间在线群聊示例


Posted in Javascript onOctober 21, 2017

项目简介

主要是通过做一个多人在线多房间群聊的小项目、来练手全栈技术的结合运用。

项目源码:chat-vue-node

主要技术: vue2全家桶 + socket.io + node(express) + mongodb(mongoose)

环境配置: 需安装配置好 node,mongodb环境(参考:https://3water.com/article/109449.htm); 建议安装 Robomogo 客户端来管理mongodb数据。

编译运行:

1.开启MongoDB服务,新建命令行窗口1:

mongod

2.启动服务端node,新建命令行窗口2:

cd server
node index.js

3.启动前端vue页面

cd client
cnpm install
npm run dev

然后在浏览器多个窗口打开 localhost:8080,注册不同账号并登录、即可进行多用户多房间在线聊天。

主要效果预览:

vue+socket.io+express+mongodb 实现简易多房间在线群聊示例

代码目录概览

|--chat-vue-node
  |--client        // 前端客户端:基于 vue-cli 搭建的所有聊天页面
  |--server        // 后台服务端
    |--api.js       // express 通过 mongoose 操作 mongodb 数据库的所有接口
    |--db.js       // 数据库初始化、Schema数据模型
    |--index.js      // 后台服务启动入口
    |--package.json
  .gitignore
  README.md

soeket.io 基础

soeket.io 在该项目中用到的基本功能如下(详情请看GitHub中的chatGroup.vue、server/index.js这两文件代码):

// 客户端连接
var socket = io.connect('http://localhost:8081')
// 服务端监听到连接
io.on('connection', function(socket){
 // ......
}

// 客户端发送进入房间请求
socket.emit('joinToRoom', data)
// 服务端监听
socket.on('joinToRoom', function (data) {
 // ......
 // 服务端处理进入房间、离开房间
 socket.join(roomGroupId)
 // 有人进入房间,向该群其它的成员发送更新在线成员
 io.sockets.in(roomGroupId).emit('joinToRoom', chat)
 io.sockets.in(roomGroupId).emit('updateGroupNumber', roomNum[roomGroupId])
}

// 客户端发送聊天消息
socket.emit('emitChat', chat)
// 服务端监听并向群内其它人群发该消息
socket.on('emitChat', function (data) {
 let roomGroupId = chat.chatToGroup
 // 向特定的群成员转发消息
 socket.in(roomGroupId).emit('broadChat', chat)
})

数据结构设计

主要有三个数据结构模型:

// 用户信息的数据结构模型
const accountSchema = new Schema({
 account: {type: Number},  // 用户账号
 nickName: {type: String},  // 用户昵称
 pass: {type: Number},    // 密码
 regTime: {type: Number}   // 注册时间
})
// 聊天群的数据结构模型:聊天群包含的成员
const relationSchema = new Schema({
 groupAccount: Number,    // 群账号
 groupNickName: String,   // 群昵称
 groupNumber: []       // 群成员
})
// 单个聊天群的聊天消息记录
const groupSchema = new Schema({
 account: Number,      // 聊天者的账号
 nickName: String,      // 聊天者的昵称
 chatTime: Number,      // 发消息的时间戳
 chatMes: String,      // 聊天的消息内容
 chatToGroup: Number,    // 聊天的所在群账号
 chatType: String      // 消息类型:进入群、离开群、发消息
})

vue-router 路由设计

页面路由的跳转全部由前端的 vue-router 处理,页面功能少而全、仅3个:注册登录页、个人中心页、群聊页

routes: [
 // {path: '/', name: 'Hello', component: Hello},
 {path: '/', redirect: '/login', name: 'Hello', component: Hello},
 {path: '/login', name: 'Login', component: Login},
 {path: '/center', name: 'Center', component: Center},
 {path: '/chatGroup', name: 'ChatGroup', component: ChatGroup}
]
// 未登录时,通过编程式跳去登录页:
router.push({ path: 'login' })

vuex 全局状态

主要是通过vuex来全局管理个人账号的登录状态、当前所在群聊房间的信息:

export default new Vuex.Store({
 state: {
  chatState: {
   account: null,
   nickName: null
  },
  groupState: null  // 点击进群的时候更新
 },
 mutations: {
  updateChatState (state, obj) {
   state.chatState = obj
  },
  updateGroupState (state, obj) {
   state.groupState = obj
  }
 },
 actions: {
  updateChatState ({commit}, obj) {
   commit('updateChatState', obj)
  },
  updateGroupState ({commit}, obj) {
   commit('updateGroupState', obj)
  }
 },
 getters: {
  getChatState (state) {
   return state.chatState
  },
  getGroupState (state) {
   return state.groupState
  }
 }
})

在全局中更新state、获取state:

// 更新
this.$store.dispatch('updateChatState', {account: null, nickName: null})
// 获取
this.$store.getters.getChatState

数据库接口api

module.exports = function (app) {
 app.all("*", function(req, res, next) {
  next()
 })
 // api login 登录
 app.get('/api/user/login', function (req, res) { // ... })
 // api register 注册
 app.get('/api/user/register', function (req, res) { // ... })
 // getAccountGroup 获取可进入的房间
 app.get('/api/user/getAccountGroup', function (req, res) { // ... })
 // getGroupNumber 获取当前房间的群成员
 app.get('/api/user/getGroupNumber', function (req, res) { // ... })
 // api getChatLog 获取当前房间的聊天记录
 app.get('/api/getChatLog', function (req, res) { // ... })
 app.get('*', function(req, res){
  res.end('404')
 })
}

更多详细的实现,请看 源码chat-vue-node ,里面保留着开发摸索时的很多注释。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解密效果
Jun 23 Javascript
Javascript中的Split使用方法与技巧
Mar 09 Javascript
JavaScript 大数据相加的问题
Aug 03 Javascript
jquery操作HTML5 的data-*的用法实例分享
Aug 17 Javascript
AngularJS语法详解
Jan 23 Javascript
JS实现n秒后自动跳转的两种方法
Nov 30 Javascript
js中获取jsp表单中radio类型的值简单实例
Aug 15 Javascript
jquery判断页面网址是否有效的两种方法
Dec 11 Javascript
原生js实现放大镜效果
Jan 11 Javascript
生产制造追溯系统之在线打印功能
Jun 03 Javascript
openlayers4实现点动态扩散
Aug 17 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
vue使用keep-alive实现数据缓存不刷新
Oct 21 #Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
Oct 21 #Javascript
Vue filter介绍及其使用详解
Oct 21 #Javascript
详解node nvm进行node多版本管理
Oct 21 #Javascript
JS实现瀑布流布局
Oct 21 #Javascript
js实现Tab选项卡切换效果
Jul 17 #Javascript
js实现鼠标移动到图片产生遮罩效果
Oct 21 #Javascript
You might like
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
JavaScript 比较时间大小的代码
2010/04/24 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
生产部主管岗位职责
2014/01/06 职场文书
境外导游求职信
2014/02/27 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
回复函格式及范文
2015/07/14 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
Python采集壁纸并实现炫轮播
2022/04/30 Python