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 相关文章推荐
原生JS可拖动弹窗效果实例代码
Nov 09 Javascript
js获得当前时区夏令时发生和终止的时间代码
Feb 23 Javascript
javascript操纵OGNL标签示例代码
Jun 16 Javascript
jQuery.position()方法获取不到值的安全替换方法
Mar 13 Javascript
jQuery控制cookie过期时间的方法
Apr 07 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
Feb 18 Javascript
详解用node.js实现简单的反向代理
Jun 26 Javascript
微信小程序顶部导航栏可滑动并选中放大
Dec 05 Javascript
Js逆向实现滑动验证码图片还原的示例代码
Mar 10 Javascript
原生JavaScript实现购物车
Jan 10 Javascript
如何利用JavaScript实现二叉搜索树
Apr 02 Javascript
TypeScript 使用 Tuple Union 声明函数重载
Apr 07 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
一个更简单的无限级分类菜单代码
2007/01/16 PHP
建站常用13种PHP开源CMS比较
2009/08/23 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
PDO::inTransaction讲解
2019/01/28 PHP
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
python实现在windows下操作word的方法
2015/04/28 Python
python中requests库session对象的妙用详解
2017/10/30 Python
python修改txt文件中的某一项方法
2018/12/29 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
文员个人求职自荐信
2013/09/21 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
《分一分》教学反思
2014/04/13 职场文书
高中班主任评语大全
2014/04/25 职场文书
2014组织生活会方案
2014/05/19 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
骨干教师申报材料
2014/12/17 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
单位综合评价意见
2015/06/05 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书