当时我们在开发这个项目的时候,我和mentor主要负责三大模块,权限部分,路由部分和通信部分。当时由于我的 mentor 正在赶京津冀大屏展示项目,所以他就安排让我负责这三部分;
权限模块
这块主要涉及区域不同公司和不同级别的人使用,所以权限这块必不可少的一部分。权限这块,首先就是登录部分,这块主要分admin,devadmin,general;
一般用户根据自己被设置的权限 1. 登录系统
@1 关键点一:实现无感知刷新 token
测试时,偶尔会出现突然跳转到登录页,需要重新登录的现象。感觉用户体验不好,当时也没有好的思路就放在那儿了,后来不忙思考下结合查阅的资料,给解决了
当时平台登录的逻辑是,token没有过期,用户后可直接进行操作,无需进行登录操作,
原因:经过调试查看控制台发现,是由于当前的 token 过期,导致请求失败;在响应拦截失败请求返回的状态码为401,得知是token过期,从而跳转到登录页。
因此这个问题的切入点就是:第一,怎样及时的,在用户感知不到情况下刷新token;第二,token过期了,可能有多个失败的请求,需要进行重新发送
当时在做的方案是:
-
处理 axios 响应拦截
当状态码为401时,使用 Promise 处理失败的请求,存储的是请求回调函数
-
封装 refreshToken 逻辑
存储由于 token 过期导致的失败请求
关键点:使用定时器确保当前拥有与过期失败的请求都接收到,再刷新token
更新本地以及失败请求中的 token
关键点:刷新token 之后,重新设置失败请求的请求头
然后再进行重新请求 当refreshToken 过期了,只能重新登录了
(登录问题) juejin.cn/post/725457…
2.进行初始化页面,
关键点二: 动态路由加载和使用
我们主要思路是:静态路由都在前端里面,然后根据后端返回的权限,通过静态路由的 name 属性,和返回数据的component 属性进行过滤比对权限,把该用户角色所对应的路由,和meta中的title处理好,在进行渲染处理。
(动态路由问题)
https://juejin.cn/post/7340998385304387620
初始化页面操作:
1. 登录页面点击登录成功后需要进行初始化页面操作
2. 有 token 时不需要登录时,在路由劫持的地方调用进行初始化页面
关键点三:连接socket进行通信
- 判断是否含有需要聊天通信的路由
是: 建立socket连接
创建socket类,构造函数中初始化数据,【地址,实例,状态,参数,心跳计时器,心跳时间,信息方法,是否重连,重连计时器,重连时间,重连次数等】
@1 : 调用init方法,验证token,创建实例,初始化实例方法 onopen连接成功后的回调, onclose连接关闭后的回调,onmessage收到服务器数据后的回调, 三个方法。对于onmessage方法,需要先判断执行函数缓存message_func有无,有就调用onmessage方法传入message_func作为参数。
@2 : 调用封装单独处理消息的函数onmessage,在socketMsg中导出的函数onMessage中,执行socketjs中的onmessage方法,传入一个函数,根据服务端返回不同的数据data,进行switch ... case ...进行操作【login_success,chat_create,monitor_chat_create,chat_close,queue_add,queue_quit,visitor_noAnswered,message,instant_message,opinion,user_update,user_remove,login_in_other,echo...】
调用init方法关键点:
一、初始化时,
@1.先将心跳计时器和重连计时器清除,不然之后重新越来越快;
@2.因为收到服务器的数据情况复杂,所以这里我给单独抽离出来封装一个函数,专门处理接收到的消息
二、调用onMessage时,
- 创建字典
- 接收到数据情况比较多,逻辑也比较复杂,需要抽离函数,方法命令和注释需要统一
三、恢复现场数据socketHttp中init方法,会话内容相关请求:
- 会话列表
- 我的排队