热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

vue.js+socket.io+express+mon
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
            }
        }
    }
})

  


推荐阅读
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • Spring MVC定制用户登录注销实现示例
    这篇文章描述了如何实现对SpringMVCWeb应用程序的自定义用户访问(登录注销)。作为前提,建议读者阅读这篇文章,其中介 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 【前端工具】nodejs+npm+vue 安装(windows)
    预备先看看这几个是干嘛的,相互的关系是啥。nodejs是语言,类比到php。npm是个包管理,类比到composer。vue是个框架&# ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
  • 前言:原本纠结于Web 模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中eval函数。虽然eval函 ... [详细]
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
author-avatar
尚伦旺
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有