基于 Vue 的 WebSocket 实时聊天实战项目

基于 Vue 的 WebSocket 实时聊天实战项目 博客地址: blog,csdn,net/bluebluesky… ``` npm install -----安装依赖 npm run dev -----运行 npm run build -----打包 node prod

本文包含相关资料包-----> 点击直达获取<-------

基于 Vue 的 WebSocket 实时聊天实战项目

博客地址: blog.csdn.net/bluebluesky…

``` npm install -----安装依赖 npm run dev -----运行 npm run build -----打包 node prod.server.js -----打包后运行 //记得替换 Index.vue和Chat.vue下的io.connect('http://qiufengh.com:8081') http://qiufengh.com:8081改成自己的项目地址。

```

在线观看 www.qiufengh.com:8081/#/

继上一个项目 用 vuejs 仿网易云音乐(实现听歌以及搜索功能) 后,发现上一个项目单纯用 vue 的 model 管理十分混乱,然后我去看了看 vuex,打算做一个项目练练手,又不想做一个重复的项目,这次我就放弃颜值,打算走心派。结合了后台 nodejs,以及数据库 MongoDB 来开发了一个实时聊天系统。这个系统可以说是一统江山,也算是实现前端程序员的一个梦了,前后通吃。自认为是一个比全的项目。项目地址: github.com/hua1995116/… 觉得好的请顺手来个 star。

实现功能

  • 聊天功能 -- 完成
  • 多个聊天室 -- 完成
  • 与机器人对接 -- 完成
  • 图片发送 -- 完成
  • 注册功能 -- 完成
  • 登录功能 -- 完成

技术栈

  • 前端 vue,vue-router ,vuex
  • 后端 nodejs,express
  • 数据库 MongoDB
  • 通讯 WebSocket
  • 脚手架工具 vue-cli

结构

├─build ├─config ├─models(存放 mongoose 对象) ├─schemas(存放 mongoose 的 schemas 模型) ├─src │ │ App.vue │ │ main.js(主入口) │ ├─assets │ ├─components (组件) │ ├─router(vue-router 路由) │ └─store(vuex) └─static(静态资源)

首先用脚手架工具构建一个项目。像这样:

``` vue init webpack my-project-name

```

结构大致是这样的

好!既然我们是实战项目,我就不多说这些配置问题。不然又跑题了。不然又要被小哥哥小姐姐们打了。

前端

首先看 src 目录下的页面布局。 main.js// 主入口

``` import Vue from 'vue' import App from './App' import router from './router' import store from './store' // 使用museui组件 import MuseUI from 'muse-ui' import 'muse-ui/dist/muse-ui.css' Vue.use(MuseUI) Vue.config.productionTip = false

/ eslint-disable no-new / new Vue({ el: '#app', router, store, template: ' ', components: {App} })

```

我们为了让整个项目看起来漂漂亮亮的,所以选择了 muse-ui,别说,这个 UI 框架是真的漂亮。不信大家可以看 muse-ui 。其余都是脚手架的默认配置。

route/router.js

``` import Vue from 'vue' import Router from 'vue-router' import Index from '@/components/Index' import Robot from '@/components/Robot' import Home from '@/components/Home'

Vue.use(Router)

export default new Router({ routes: [ { path: '/', name: 'Index', component: Index }, { path: '/robot', name: 'Robot', component: Robot }, { path: '/home', name: 'Home', component: Home } ] })

```

大家可以看到一共有三个路由,没错,我们就是写了三块,第一块是和大家一起的聊天室,第二块是和我们可爱的大白聊天,也就是我们的 图灵机器人 。有空你也去搞一个耍耍。第三块就是我们的个人中心,虽然这一块没什么东西。但是毕竟好看,哦~忘了,我们是走心的,怎么可以只看脸。

components/Chat.vue

``` created() { const that = this this.socket = io.connect('http://qiufengh.com:8081') this.socket.on('message', function(obj) { that.$store.commit('addroomdetailinfos', obj) window.scrollTo(0, 900000) }) this.socket.on('logout', function (obj) { that.$store.commit('setusers', obj) }) },

this.socket = io.connect('http://qiufengh.com:8081')

```

这一句,主要用于连接你当前的服务,到时候下载后面的项目时,记得改成自己的服务以及端口。因为是在 Index 和 Chat 都有设置,所以你需要在 Index.vue 和 Chat 里的 connect 都改成你自己的服务。socket.on()用于接受消息。socket.emit() 用于发送消息。不懂的 socket.io 的看这里 socket.io 。有了这个就可以和服务端进行交互。等会讲解服务端。

store/index.js

``` state: { //存放用户 user: { name: '', src: '' }, //存放历史记录 messhistory: { infos: [] }, //存放房间信息,为了方便以后做多房间 roomdetail: { id: '', users: {}, infos: [] }, //存放机器人开场白 robotmsg: [{ message: 'Hi~有什么想知道的可以问我', user: 'robot' }], //聊天页面显示控制 chattoggle: false, //登录页面显示控制 logintoggle: false, //注册页面显示控制 registertoggle: true, //提示框显示控制 dialog: false, //提示框内容 dialoginfo: '' }

```

由于控制代码太多,所以之后的内容请大家移步,我的 GitHub 地址。 github.com/hua1995116/…

服务器端

由于 build 下 dev-server.js 中 webpack 代码太多,太杂乱,不易于讲解。主要来看看用于打包后的服务器端。两份代码是一样的。 prod.server.js(根目录下)

``` var express = require('express'); var config = require('./config/index'); var port = process.env.PORT || config.dev.port;

var app = express();

var router = express.Router(); //用于静态展示入口 router.get('/',function(req,res,next){ req.url = './index.html'; next(); });

app.use(router);

require('./config/routes')(app) / 引入 / var mongoose = require('mongoose') //日志文件 var morgan = require('morgan') //sesstion 存储 var bodyParser = require('body-parser') var cookieParser = require('cookie-parser') var session = require('cookie-session') //用于异步回调 mongoose.Promise = require('bluebird') global.db = mongoose.connect("mongodb://localhost:27017/vuechat")

//服务器提交的数据json化 app.use(bodyParser.json()) app.use(bodyParser.urlencoded({extended: true})) //sesstion 存储 app.use(cookieParser()) app.use(session({ secret: 'vuechat', resave: false, saveUninitialized: true }))

var env = process.env.NODE_ENV || 'development' if ('development' === app.get('env')) { app.set('showStackError', true) app.use(morgan(':method :url :status')) app.locals.pretty = true mongoose.set('debug', true) }

var server = app.listen(port)

//websocket // var http = require('http').Server(app); var io = require('socket.io')(server); var Message = require('./models/message') var users = {} io.on('connection', function (socket) { //监听用户发布聊天内容 socket.on('message', function (obj) { //向所有客户端广播发布的消息 io.emit('message', obj) var mess = { username: obj.username, src:obj.src, msg: obj.msg, roomid:'room1' } var message = new Message(mess) //将发送过来的消息进行储存 message.save(function (err, mess) { if (err) { console.log(err) } console.log(mess) }) console.log(obj.username + '说:' + obj.msg) }) socket.on('login',function (obj) { users[obj.name] = obj //用于监听用户进行聊天室 io.emit('login', users) }) socket.on('logout',function (name) { delete users[name] //用户监听用退出聊天室 io.emit('logout', users) }) })

//声明静态资源地址 app.use(express.static('./dist'));

```

schema 模型

schema/user.js

``` var mongoose = require('mongoose') //用于md5加密 var bcrypt = require('bcryptjs') //加盐数 var SALT_WORK_FACTOR = 10 var UserSchema = new mongoose.Schema({ name: { unique: true, type: String }, password: String, src: String, meta: { createAt: { type: Date, default: Date.now() }, updateAt: { type: Date, default: Date.now() } } }); //对密码进行加密 UserSchema.pre('save', function (next) { var user = this if (this.isNew) { this.createAt = this.updateAt = Date.now() } else { this.updateAt = Date.now() } bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) { if (err) return next(err)

bcrypt.hash(user.password, salt, function (err, hash) {
  if (err) return next(err)

  user.password = hash
  next()
})

}) }) //用于比较密码是否正确 UserSchema.methods = { comparePassword: function (_password, cb) { bcrypt.compare(_password, this.password, function (err, isMatch) { if (err) return cb(err) cb(null, isMatch) }) } }

UserSchema.statics = { fetch: function (cb) { return this .find({}) .sort('meta.updateAt') .exec(cb) }, findById: function (id, cb) { return this .findOne({_id: id}) .exec(cb) } }

module.exports = UserSchema

```

这里主要用到一个 md5 的模块,可以查看 bcryptjs

schema/message.js

``` var mongoose = require('mongoose') //聊天记录模型 var MessageSchema = new mongoose.Schema({ username: String, src:String, msg: String, roomid:String, time: { type: Date, default: Date.now() } }) //静态方法 MessageSchema.statics = { fetch: function (cb) { return this .find({}) .sort('time') .exec(cb) }, findById: function (id, cb) { return this .findOne({_id: id}) .exec(cb) } } module.exports = MessageSchema

```

服务器的 routes config/routes.js 讲一个注册的把,其他请前往项目查看

``` app.post('/user/signup', function (req, res) { //获取提交数据 var _user = req.body console.log(_user) User.findOne({name: _user.name}, function (err, user) { if (err) { console.log(err) } if (user) { res.json({ errno: 1, data: '用户名已存在' }) } else { var user = new User(_user) user.save(function (err, user) { if (err) { console.log(err) } res.json({ errno: 0, data: '注册成功' }) }) } }) })

```

主要用于验证用户名是否重复。

核心部分就讲到这里啦,。其他具体的请查看我的 GitHub 地址(具有详细的注释,不明白的可以提问,需要改进的请各位前辈指出): 地址: github.com/hua1995116/… 在线观看地址: www.qiufengh.com:8081/#/

``` npm install -----安装依赖 npm run dev -----运行 npm run build -----打包 node prod.server.js -----打包后运行 //记得替换 Index.vue和Chat.vue下的io.connect('http://qiufengh.com:8081') http://qiufengh.com:8081改成自己的项目地址。

```

最后上几张图。

参考文献

  • 基于PhoneGap的移动端SNS平台研建(北京林业大学·陈旭)
  • 企业级即时通讯系统设计与实现(华南理工大学·余春贵)
  • 企业内部即时通讯系统的设计与实现(内蒙古大学·王慧平)
  • 基于Node.js和WebSocket的即时通信系统的设计与实现(南京邮电大学·茆玉庭)
  • 基于Web的信息发布与信息交流平台的设计与实现(吉林大学·许昭霞)
  • 面向呼叫中心的可视化实时监控系统的设计与实现(华中科技大学·安秀芳)
  • 基于Web的企业即时通讯系统的设计与实现(河北科技大学·张艳芳)
  • 基于WebSocket协议的在线聊天系统设计与实现(东南大学·杜风旭)
  • 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
  • 企业内部即时通讯系统的设计与实现(内蒙古大学·王慧平)
  • 基于Vue.js的可编程视频平台的设计和实现(华中科技大学·施璇)
  • 基于微服务的社交系统的设计与实现(北京邮电大学·赵岩)
  • 基于Flex框架的Web即时通讯系统的研究与实现(中国海洋大学·刘昭纯)
  • 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
  • 基于WebRTC的视频会议系统的设计与实现(西北大学·孙凯龙)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设导航 ,原文地址:https://m.bishedaima.com/yuanma/35817.html

相关推荐

  • 基于SpringBoot框架的医疗挂号管理系统

    这是一套采用Java编程语言,基于SpringBoot框架构建的医疗预约管理系统源代码,项目中融入了Vue技术,开发工具为Idea或Eclipse,此系统适用于毕业设计或课程实践
    2024年05月23日
    2 1 1
  • 基于Python设计的信息检索系统

    基于Python设计的信息检索系统 【实验目的】: 开发一款针对英文文本的信息检索系统,可以实现建立索引表,布尔查询,通配符查询, 短语查询等功能
    2024年05月14日
    4 1 1
  • 基于Python的信息检索课程设计

    基于Python的信息检索课程设计 sdu视点新闻 全站爬虫爬取+索引构建+搜索引擎查询练习程序 爬虫功能使用Python的scrapy库实现
    2024年05月14日
    3 1 1
  • 学生评奖评优管理系统

    这是一个🔥🔥基于SpringBoot框架的学生评奖评优管理系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 基于Python实现书店销售管理系统

    书店销售管理管理子系统 一,设 计 总 说 明 现在社会随着计算机技术迅速发展与技术的逐渐成熟,信息技术已经使人们的生活发生深刻的变化,生活中的各种服务系统也使人们在生活中的联系日常销售活动方式发生了很大的变化
    2024年05月14日
    6 1 1
  • 网上摄影工作室

    这是一个🔥🔥基于SpringBoot框架的网上摄影工作室设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    2 1 1
  • java+swing实现推箱子小游戏课程设计源码

    在计算机科学领域,游戏设计一直是一个备受关注的话题,随着计算机技术的不断发展,人们对于游戏的需求也越来越高,《java+swing实现推箱子小游戏课程设计源码》是一个旨在使用Java语言和Swing框架实现的推箱子小游戏项目
    2024年05月07日
    5 1 1
  • 基于python + dlib实现人脸识别

    python 进行人脸识别 人脸识别的主要算法 其核心算法是 欧式距离算法使用该算法计算两张脸的面部特征差异,一般在 0,6 以下都可以被认为是同一张脸 人脸识别的主要步骤 获得人脸图片 将人脸图片转为 128D 的矩阵(这个也就是人脸特征的一种数字化表现) 保存人脸 128D 的特征到文件中 获取其他人脸转为 128D 特征通过欧式距离算法与我们保存的特征对比
    2024年05月14日
    2 1 1
  • 网上商城系统

    这是一个🔥🔥基于SpringBoot框架的网上商城系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 基于python实现的CS通信和P2P通信

    基于python实现的CS通信和P2P通信 一,实验要求 C/S通信实现要求 两台计算机分别模拟服务器,客户端 通过编程实现服务器端
    2024年05月14日
    1 1 1

发表回复

登录后才能评论