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 相关文章推荐
多广告投放代码 推荐
Nov 13 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
Nov 05 Javascript
使用jQuery实现input数值增量和减量的方法
Jan 24 Javascript
javascript闭包的理解
Apr 01 Javascript
jQuery中next方法用法实例
Apr 24 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
基于jQuery实现页面搜索功能
Mar 26 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
你有必要知道的10个JavaScript难点
Jul 25 Javascript
vue 实现的树形菜的实例代码
Mar 19 Javascript
使用Node.js写一个代码生成器的方法步骤
May 10 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
PHP个人网站架设连环讲(二)
2006/10/09 PHP
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
C# Assembly类访问程序集信息
2009/06/13 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python利用IPython提高开发效率
2016/08/10 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
医院标语大全
2014/06/23 职场文书
办理房产证委托书
2014/09/18 职场文书
大学四年个人总结
2015/03/03 职场文书
python解析json数据
2022/04/29 Python