vue.js+socket.io+express+mongodb打造在线聊天[二]
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打造在线聊天[二]的更多相关文章
- vue.js+socket.io+express+mongodb打造在线聊天
vue.js+socket.io+express+mongodb打造在线聊天 在线地址观看 http://www.chenleiming.com github地址 https://github.com ...
- 使用node.js + socket.io + redis实现基本的聊天室场景
在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对 ...
- socket.io简单说明及在线抽奖demo
socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...
- 使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
- (转)使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
- 使用Node.js+Socket.IO搭建WebSocket实时应用【转载】
原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新 ...
- 在线白板,基于socket.io的多人在线协作工具
首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上传到github,传送门.可以开俩浏览器看效果. 现实意义是俩人在 ...
- 转载:node.js socket.io
本文转自:http://www.xiaocai.name/post/cf1f9_7b6507 学习node.js socket.io 使用 用node.js(socket.io)实现数据实时推送 在 ...
- 我的学习笔记之node----node.js+socket.io实时聊天(1) (谨此纪念博客开篇)
本想着从hello word开篇,也确实写了相关学习笔记.各种原因吧,现在又着急写出作品,便作罢. 这里将记录一个node.js+socket.io的实时聊天程序.(当然我也是跟着网上各种教程资料学习 ...
随机推荐
- ASP.NET部分代码示例
using System; using System.Collections.Generic; using Model; using System.Data; using System.Data.Sq ...
- parted分区和挂载及非交互式操作
author : headsen chen date : 2017-11-17 09:45:36 个人原创,转载请注明作者,出处,否则依法追究法律责任 1,将磁盘上原有的分区删除掉: 进入:#pa ...
- IPFS: NAT traversal(NAT穿越)
IPFS是一个p2p网络,那么一定绕不开的一个问题就是NAT穿越.之前的文章里面也提到过IPFS网络连通性使用的ICE NAT穿越框架,本文简单介绍一下什么是NAT. 为什么有NAT技术? NAT ...
- leetCode:461 汉明距离
汉明距离 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 思路: 当看到"对应二进制位不同的位置的数目"这 ...
- 简单模拟struts2及struts2的处理流程介绍
用了几天模拟struts2,最后结果还是很成功的,也基本没有什么遇上比较难解决的问题,万事开头难,在最开始的时候无从下手,看着下面这张struts2工作流程图配合着网上的博客看了一天终于有了眉目. 看 ...
- Maven-09: 在线插件信息
仅仅理解如何配置使用插件是不够的.当遇到一个构建任务的时候,用户还需要知道去哪里寻找合适的插件,以帮助完成任务.找到正确的插件之后,还要详细了解该插件的配置点.由于Maven的插件非常多,而且这其中的 ...
- (floyd)佛洛伊德算法
Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...
- iOS之内存管理(ARC)
iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...
- [Scala] 了解 协变 与 逆变
首先定义一个类 A,其参数类型 T 为协变,类中包含一个方法 func,该方法有一个类型为 T 的参数: class A[+T] { def func(x: T) {} } 此时在 x 处会有异常提示 ...
- 从零部署Spring boot项目到云服务器(准备工作)
自己的博客终于成功部署上线了,回过头来总结记录一下整个项目的部署过程! 测试地址:47.94.154.205:8084 注:文末有福利! 一.Linux下应用Shell通过SSH连接云服务器 //ss ...