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 相关文章推荐
IE/FireFox具备兼容性的拖动代码
Aug 13 Javascript
seajs1.3.0源码解析之module依赖有序加载
Nov 07 Javascript
js中的preventDefault与stopPropagation详解
Jan 29 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
May 05 Javascript
jQuery实现简易的输入框字数计数功能示例
Jan 16 Javascript
Web前端框架Angular4.0.0 正式版发布
Mar 28 Javascript
Angular4学习笔记之准备和环境搭建项目
Aug 01 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
Feb 11 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
详解vue-router导航守卫
Jan 19 Javascript
JS简易计算器实例讲解
Jun 30 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 Javascript
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
第六节--访问属性和方法
2006/11/16 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
javascript截取字符串小结
2015/04/28 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
django中的setting最佳配置小结
2017/11/21 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python解析微信dat文件的方法
2020/11/30 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
数据保密承诺书
2014/06/03 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python
Python PIL按比例裁剪图片
2022/05/11 Python