vue.js+socket.io+express+mongodb打造在线聊天[二]

在线地址观看

http://www.chenleiming.com/vuechat

github地址

https://github.com/clm960227/...

有喜欢的小哥哥,小姐姐请反手来个star,谢谢!有issue的欢迎提出

介绍
本项目基于vue.js+socket.io+express+mongodb实现的聊天效果, 界面以及功能参考QQ,微信

技术栈

  • 前端: vue,vue-router,vuex,axios
  • 构建: webpack,vue-cli
  • 后端: express,multer(上传图片),cors(跨域处理), superagent(调用机器人接口),mongoose(操作数据库)
  • 通讯: socket.io
  • 数据库: mongodb
  • css预处理器: sass

功能列表

  • 用户注册
  • 用户登录
  • 群聊
  • 群聊中@小美 和机器人聊天 (注意@小美和消息中间要有空格)
  • 机器人聊天
  • 留言板
  • 更换主题颜色
  • 进出聊天群提醒

功能展示

  • 登录与注册

  • 群聊

  • 群聊中与机器人聊天

  • 机器人聊天

  • 留言板

  • 更换主题

好啦~功能差不多就这些啦,这次添加了进出群提醒,主题颜色更换还有布局的一些调整。废话不多说啦,接下来该介绍介绍核心部分,以免被各位小哥哥,小姐姐打。

前端聊天代码

const infoObj = {
status: 'userstate',
nickname: this.getUserinfo.nickname,
roomId: this.roomId
}
this.socket.emit('join-room', infoObj)
this.socket.on('join-room', (joinInfo) => {
this.MsgList.push(joinInfo)
this.$nextTick(() => {
this.msgDOM.scrollTop = this.msgDOM.scrollHeight
})
})
// 聊天
this.socket.on('chat-msg', (msg) => {
console.log(msg)
this.MsgList.push(msg)
this.$nextTick(() => {
this.msgDOM.scrollTop = this.msgDOM.scrollHeight
})
})
// 离开房间
this.socket.on('leave-room', (leaveInfo) => {
this.MsgList.push(leaveInfo)
this.$nextTick(() => {
this.msgDOM.scrollTop = this.msgDOM.scrollHeight
})
})

  

后端聊天代码

io.on('connection', (socket) => {
// 进入房间
socket.on('join-room', (info) => {
// 添加到房间
socket.join(info.roomId)
const joinInfo = {
status: info.status,
text: info.nickname + '加入了群聊'
}
socket.to(info.roomId).broadcast.emit('join-room', joinInfo)
})
// 群聊天
socket.on('chat-msg', (msg) => {
saveChatMsg(msg, () => {
io.to(msg.roomId).emit('chat-msg', msg)
// 分割聊天消息,判断是否与机器人聊天
const msgArr = msg.text.split(' ')
const robotParam = {
userId: msg.userId,
roomId: msg.roomId || null,
timeStamp: msg.timeStamp + 1 || null,
text: msgArr[1]
}
if (msgArr[0] === '@小美') {
getRobotMsg(robotParam, (robotmsg) => {
saveChatMsg(robotmsg)
io.to(msg.roomId).emit('chat-msg', robotmsg)
})
}
})
})
// 机器人聊天
socket.on('robot-msg', (msg) => {
const robotParam = {
userId: msg.userId,
timeStamp: msg.timeStamp,
text: msg.text
}
getRobotMsg(robotParam, (robotmsg) => {
socket.emit('robot-msg', robotmsg)
})
})
// 离开房间
socket.on('leave-room', (info) => {
socket.leave(info.roomId)
const leaveInfo = {
status: info.status,
text: info.nickname + '离开了群聊'
}
socket.to(info.roomId).broadcast.emit('leave-room', leaveInfo)
})
})

  

vuex

export default new Vuex.Store({
state: {
// 主题颜色
themeColor: '',
// 存放用户信息
userInfo: {
userId: '',
nickname: '',
headPic: ''
},
// 机器人信息
robot: {
Info: {
userId: 'robot',
nickname: '小美',
headPic: '/static/img/robot-headpic.jpg'
},
// 机器人打招呼
greetMsg: 'hi~ 我是机器人小美,有什么可以帮您的嘛?'
}
},
getters: {
// 获取主题颜色
getThemeColor: state => {
return state.themeColor
},
// 获取登录用户信息
getUserinfo: state => {
return state.userInfo
},
// 获取机器人信息
getRobotinfo: state => {
return state.robot.Info
},
// 获取机器人欢迎语
getRobotGreetMsg: state => {
return state.robot.greetMsg
}
},
mutations: {
// 设置用户信息
setUserinfo(state, userInfo) {
state.userInfo.userId = userInfo.userId
state.userInfo.nickname = userInfo.nickname
state.userInfo.headPic = userInfo.headPic
},
// 设置聊天记录
setHistoryMsg(state, msgList) {
state.msgInfo = msgList
},
// 设置主题颜色
setThemeColor(state, color) {
state.themeColor = color
}
},
actions: {
// 注册用户
async register({commite}, data) {
const res = await url.register(data)
if (res.data.state === 0) {
return {
status: 'fail',
data: res.data.data
}
}
return {
status: 'success',
data: res.data.data
}
},
// 登录用户
async login({commite}, data) {
const res = await url.login(data)
if (res.data.state === 0) {
return {
status: 'fail',
data: res.data.data
}
}
return {
status: 'success',
data: res.data.data
}
},
// 上传图片
async upload({commite}, data) {
await url.upload(data)
},
// 获取聊天记录
async getHistoryChatMsg({commite}, data) {
const res = await url.gethistorychatmsg(data)
return {
status: 'success',
data: res.data.data.msgList
}
},
// 保存留言
async saveLeaveMsg({commite}, data) {
const res = await url.saveleavemsg(data)
return {
status: res.data.data.stateText
}
},
// 获取留言数据
async getLeaveMsg({commite}) {
const res = await url.getleavemsg()
return {
status: res.data.data.stateText,
data: res.data.data.leaveMsg
}
}
}
})

  

vue.js+socket.io+express+mongodb打造在线聊天[二]的更多相关文章

  1. vue.js+socket.io+express+mongodb打造在线聊天

    vue.js+socket.io+express+mongodb打造在线聊天 在线地址观看 http://www.chenleiming.com github地址 https://github.com ...

  2. 使用node.js + socket.io + redis实现基本的聊天室场景

    在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对 ...

  3. socket.io简单说明及在线抽奖demo

    socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...

  4. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  5. (转)使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  6. 使用Node.js+Socket.IO搭建WebSocket实时应用【转载】

    原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新 ...

  7. 在线白板,基于socket.io的多人在线协作工具

    首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上传到github,传送门.可以开俩浏览器看效果. 现实意义是俩人在 ...

  8. 转载:node.js socket.io

    本文转自:http://www.xiaocai.name/post/cf1f9_7b6507  学习node.js socket.io 使用 用node.js(socket.io)实现数据实时推送 在 ...

  9. 我的学习笔记之node----node.js+socket.io实时聊天(1) (谨此纪念博客开篇)

    本想着从hello word开篇,也确实写了相关学习笔记.各种原因吧,现在又着急写出作品,便作罢. 这里将记录一个node.js+socket.io的实时聊天程序.(当然我也是跟着网上各种教程资料学习 ...

随机推荐

  1. python 全栈开发,Day2

    python基础二(基础数据类型) 一.数据 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类 ...

  2. font awesome矢量图标框架

    一.font awesome简介 目前图标总数共有519个; 不依赖Javascript 矢量图形,无限缩放 免费,可用于商业 CSS控制样式,自定义图标颜色,大小,阴影,一切可能实现的效果 支持re ...

  3. nodejs轻量级时间格式化组件Moment.js的使用例子

    在项目中,经常使用时间进行格式化的输出,以及转换,同时做时间的统计,原本js原生的时间函数比较复杂繁琐,不适合快速开发使用. 轻量级的moment.js很好的解决了这些问题. 下面以简单的例子进行mo ...

  4. Eclipse设置新建jsp文件默认模板

    没有需求就没有进步,遇到问题:现在有大量的html模板页面,但是这些模板是不能和后台进行数据交互的,所以要把他们通通变成jsp页面(59个html文件),还有就是html文件转换成jsp文件的时候,前 ...

  5. 笔记:MyBatis Mapper XML文件详解 - 映射和参数

    MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...

  6. 常用Markdown公式整理 && 页内跳转注意 && Markdown preview

    目录: 常用Markdown公式及注意事项 标题 列表 链接 区块 代码块 / 引用  粗体和斜体 文字块 图片 表格 横线 页内跳转注意事项 其他重要需注意 Markdown preview 前提: ...

  7. xilinx的quick boot(1) ——flash的一些内容

    xilinx的quick boot(1) --flash,quick boot配置文件,以及中间的一些联系xilinx 配置模式分为SPI,BPI.用过的spi外挂flash是N25Q./////// ...

  8. 关于css的text-indent首行缩进两个字符和图片缩进的问题

    段落前面空两个字的距离,不要再使用空格了.应该使用首行缩进text-indent. text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字. <style typ ...

  9. LeetCode-4. 两个排序数组的中位数(详解)

    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ...

  10. 20162308 实验二《Java面向对象程序设计》实验报告

    20162308 实验二<Java面向对象程序设计>实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 ...