VChat - 一个通讯社交类WebApp,本文用于记录开发遇到的磕磕绊绊和技术点。

使用JWT(JSON WEB TOKEN)做接口权限设计

接口权限,即在客户端发送请求的时候,需要带上一个服务器给予的token,服务器根据该token判断该客户端是否可以获取资源或进行某些操作。

exm:
登陆成功时生成token给到客户端,客户端把token存在本地,每次请求时带上。

router.post('/signin',(req,res)=>{let pars = req.body,username = pars.username,password = pars.password,sql = $userSql.getByAccount;// 根据username 找出用户信息 利用uid生成tokenconn.query(sql,username,(err,result)=>{if(result[0]){let user  = result[0]if(user.upassword === password){let secret = 'i am a good man'; //密钥//设置tokenlet token = jwt.sign({ user }, secret, { expiresIn:  60 * 60 * 1 });res.json({'result':'登陆成功','token':token,'uid':user.uid})}else{res.json({'result':'密码错误'})}}else{res.json({'result':'用户不存在'})}});
});

客户端发送请求,服务端验证token

router.get('/friends',(req,res)=>{let token = req.query.token,secret = 'i am a good man',//密钥friSql = $friSql.getById,userSql = $userSql.getById;jwt.verify(token, secret, function (err, decode) {if (err) {  //  时间失效 或者 遇到伪造的tokenres.json({'info':err})} else {// decode中就含有我们用于生成token的信息,我用的是uidlet user = decode.user;let uid = user.uid;}});
});// 前端使用axios请求
this.$axios.get('/api/user/friends',{params:{token: window.localStorage.getItem('token')}
}).then(res=>{if(res.data['result']){this.friends = res.data['result']}})

使用Socket.io 做点对点通信

流程:

1.用户登陆成功后,与服务器发起socket连接。

2.服务器使用一个users对象来保存用户与socket之间的映射,每当socket断开,都要更新users。每次用户断开连接时,都要将users[uid] 置为 null。每次连接时再分配新的socketId。

let users = {uid1: socketId,uid2: socketId
}

3.在sender发送信息给receiver时,是利用receiver的uid去获取其socketId来发送,但如果receiver不在线,其socketId自然为null,这时候需要先让服务器保存sender发送的信息,在下一次receiver连接socketId时将这些信息发给receiver。

// 存放离线信息
let unline_data = [// uid2 为接收方uid2 : [{senderId :msg :},.......]
];

每次客户端上线时检查有没有离线信息给该客户端的,有的话发送,并清空该客户端离线信息。

//  连接成功
let hisMsg = unline_data[conn_uid] ? unline_data[conn_uid]:'没有新消息';
let initMsg = {msg: `${conn_uid} 连接成功 给你分配的socketId为${users[conn_uid].id}`,hisMsg: hisMsg
};
socket.emit('receiveMsg',{msg: initMsg,code: 200
});unline_data[conn_uid] = null; // 清空离线信息

完整代码

let users = {// 'uid':'socketId'
};// 存放离线信息
let unline_data = [/*// uid2 为接收方uid2 : [{senderId :msg :},.......]*/
];io.on('connection',function(socket) {// 存储连接用户的uid 和 socketId映射let conn_uid = socket.request._query.uid;users[conn_uid] = socket;//  连接成功let hisMsg = unline_data[conn_uid]? unline_data[conn_uid]:'没有新消息';let initMsg = {msg: `${conn_uid} 连接成功 给你分配的socketId为${users[conn_uid].id}`,hisMsg: hisMsg};socket.emit('receiveMsg',{msg: initMsg,code: 200});unline_data[conn_uid] = null; // 清空离线信息// 这里监听 disconnect,就可以知道谁断开连接了socket.on('disconnect', function () {Object.keys(users).forEach(k=>{if (users[k] && users[k]===socket){users[k] = false}});console.log('socket disconnect: ' + socket.id);});//接收数据 并转发给相应的用户 实现单点聊天socket.on('sendMsg', function (obj) {let uid = obj.uid;let uid2 = obj.uid2;let msg = obj.msg;let data = {senderId: uid,receiverId: uid2,msg: msg};// 接收方在线(socket连接中)if(users[uid2]){users[uid2].emit('receiveMsg',data);}else{// 对方不在线,用数据结构先纯起来if(! (Object.prototype.toString.call(unline_data[uid2]).slice(8,-1) === 'Array')){unline_data[uid2] = []}unline_data[uid2].push(data)}});
});

用Vuex管理Socket

router.beforeEach((to,from,next)=>{let uid = window.localStorage.getItem('uid');let socket = store.getters.getSocket;// store中没有 就重新连接 并提交到store中if (!socket){store.dispatch('setSocket',io.connect('//192.168.137.1:3000',{'force new connection': true,'query': {uid:uid}}));//与服务器进行连接//监听接收信息store.getters.getSocket.on("receiveMsg",function (data) {let msg = data.msg;console.log(msg);});}next() // 继续跳转路由
});

Vuex:

import Vue from 'vue'
import Vuex from 'vuex'
import io from 'socket.io-client'
Vue.use(Vuex)const store = new Vuex.Store({state:{headTitle:'聊天',socket:null},getters: {getHeadTitle: function (state) {return state.headTitle;},getSocket:function(state){return state.socket}},mutations:{setHeadTitleFunc:function(state,title){state.headTitle = title;},setSocketFunc:function(state,socket){state.socket = socket}},actions:{setHeadTitle:function(context,title){context.commit('setHeadTitleFunc',title)},setSocket:function(context,socket){context.commit('setSocketFunc',socket)}}
});export default store

个人项目记录 -- VChat相关推荐

  1. ssm 项目记录用户操作日志和异常日志

    ssm 项目记录用户操作日志和异常日志 参考文章: (1)ssm 项目记录用户操作日志和异常日志 (2)https://www.cnblogs.com/mei-m/p/10231792.html (3 ...

  2. 【个人项目】项目记录:github链接、设计实现、单元测试、性能分析与改进、PSP完成表格、总结反思

    项目记录 一.github链接 链接:https://github.com/LLFKirito/SudokuWork-BIT1120161918/ 二.设计实现 总体设计 程序流程图如下 程序分为ma ...

  3. 微信读书项目记录(1)

    微信读书项目记录 一.项目需求及阅读器引擎介绍 1.1epubjs阅读器引擎介绍,常用的类 Book,完成阅读器解析 Rendition,完成阅读器定位 Navigation,存储目录信息 View ...

  4. STM32对接涂鸦wifi模块项目记录(智能插座完善版本)

    应项目需求,客户需要对接涂鸦平台,从了解平台到样品实际落地,还是挺方便的, 做过的一个项目,人体感应智能插座项目,对接涂鸦云 : 硬件平台:STM32F103 WIFI模块: 涂鸦WiFi(型号见文章 ...

  5. 项目记录: 3DOF+实时渲染 之 虚拟视点合成

    项目记录: 3DOF+实时渲染 之 虚拟视点合成 总结一下实现3DOF+渲染的一些细节. 虚拟视点合成 3DOF+实时渲染方案 0. 3DOF+概念 关于 3DOF+ 概念 可以参考我之前的博文. 3 ...

  6. 架构之路--实战项目记录(二) 忘记数据库 开始抽象

    对我而言,认识BLL层的作用,或者领域模型驱动的含义,最大的干扰来自数据库. 我们很清楚的知道UI层的含义,也知道数据层是做什么的.但对于一个简单的(甚至是相当复杂的)系统而言,实在不知道除了对数据库 ...

  7. 项目记录 Gadget桌面帮助系统

    本文主要记录Gadget相关开发.项目架构和项目中使用到的一些关键技术. 项目名称: Gadget桌面帮助系统 开发环境: VS 2008 Silverlight 3.0 Beta Sql Serve ...

  8. 人脸识别+检索项目记录

    趁空闲时间,记录一下做过的一个实验室项目,主要分为4个部分:1)语音转文字:2)人脸识别:3)行人识别:4)检索.本人负责人脸识别和检索模块及整体项目的融合,在此介绍一下自己所做的两个模块. 背景 对 ...

  9. 一体化3团队项目记录

    github项目地址:https://github.com/yitihua/pilipili 小组成员: 姓名 学号 gitID 应用技术 顾思宇 2016011993 dandelionClaw 全 ...

最新文章

  1. LSTM之父:吐槽了两年,来划划重点:“这5篇最高引论文都源于我们。”
  2. datePicker在fullscreen下不弹出
  3. 【SpringCloud】Zuul-实例
  4. redis的7个应用场景
  5. [Cocos2d-x For WP8]Scene场景
  6. unity3d 自动变化大小_【Unity游戏开发】AB学习(三)--加载AB和实例化操作对应的内存变化...
  7. python使用json序列化datetime类型问题处理
  8. python词组语义相似度_文本匹配,语义相似度,匹配相似短语/单词python语义wordNet模糊匹配...
  9. 如何打开别人发布的vue项目---express的使用方法
  10. 南京高中计算机老师,正高级教师、江苏省高中信息技术特级教师——巫雪琴
  11. [转载] Python——函数练习(包括简单递归)
  12. apdu 移动sim_在Android中将APDU命令发送到USIM / SIM卡
  13. Sentinel Slot扩展实践-流控熔断预警实现
  14. 单相逆变电路实战!(基于STM32F103C8T6的单相逆变电路,PID控制输出额定电压)
  15. python绘图篮球_用Python把NBA球员投篮数据可视化
  16. opencv 利用傅里叶变换获取低频和高频部分图像-07
  17. Flink(二十三)—— 流计算框架 Flink 与 Storm 的性能对比
  18. 很多人都舍不得拿出来分享的资源网站
  19. 父类能调用子类方法么
  20. 财务软件应该如何搭建产品常见问题文档/用户操作手册?

热门文章

  1. 数据库_mysql数据库引擎_数据库索引
  2. 罗振宇2018《时间的朋友》--小趋势
  3. Gephi学习笔记-画出图形基本流程
  4. robot光线机器人安卓版_RobotMake下载-RobotMake机器人控制软件下载v3.1.5 安卓版-西西软件下载...
  5. 【天池基础知识】 - 查看特征变量的相关性(计算相关性系数+画出热力图+筛选特征变量+Box-Cox变换)
  6. python发送邮件一
  7. python对erp系统有帮助吗_ERP系统的优点
  8. 基于深度学习的烟草工业人员行为分析管控研究(二)
  9. ArcGIS中根据DEM提取等高线和高程点(附练习数据)
  10. vue里的axios获取本地的json数据