封装导出下载

This commit is contained in:
龙运模
2024-07-13 15:46:21 +08:00
parent 4ab5a2eee3
commit b32dee5886
10 changed files with 343 additions and 7 deletions
+194
View File
@@ -0,0 +1,194 @@
//@eslint-disable
import tool from '@/utils/tool';
import systemConfig from '@/config';
import api from '../api';
import router from "@/router";
import {ElNotification} from 'element-plus';
// import store from "../store";
let websocket = null;
let global_callback = function () {};
let timeoutObj = null;
let timeout = 28 * 1000; //30秒一次心跳
let serverTimeoutObj = 60; //心跳倒计时
let timeOutNum = 60; //断开 重连倒计时
let lockReconnect = false; //是否真正建立连接
const wsUri = systemConfig.WS_URL;
let showNot = null;
function networkDes() {
ElNotification.error({
title: '网络已断开',
message: '网络已断开,正在重连……'
})
}
function reConnect() {//重新连接
if (lockReconnect) {
return;
}
lockReconnect = true;
//没连接上会一直重连,设置延迟避免请求过多
timeOutNum && clearTimeout(timeOutNum);
timeOutNum = setTimeout(function () {
//新连接
createWebSocket(global_callback);
lockReconnect = false;
}, 5000);
}
function startHeartbeat() {
//清除时间
clearTimeout(timeoutObj);
clearTimeout(serverTimeoutObj);
start();
}
function start() {//开启心跳
timeoutObj && clearTimeout(timeoutObj);
serverTimeoutObj && clearTimeout(serverTimeoutObj);
timeoutObj = setTimeout(function () {
//这里发送一个心跳,后端收到后,返回一个心跳消息,
if (websocket.readyState === 1) {//如果连接正常
const heart = {type: "heart"}
websocket.send(JSON.stringify(heart));
} else {//否则重连
reConnect();
}
serverTimeoutObj = setTimeout(function () {
//超时关闭
closeSock(false);
}, timeout);
}, timeout)
}
function createWebSocket(callback, token) {
if (websocket == null || typeof websocket !== WebSocket) {
initWebSocket(callback, token);
}
}
function initWebSocket(callback, token) {
global_callback = callback;
// 初始化websocket
let reToken = token === undefined ? tool.cookie.get('TOKEN') : token;
if(!reToken) return // 没有token 不执行ws创建
websocket = new WebSocket(wsUri + "?token=Bearer " + reToken);
websocket.onmessage = function (e) {
webSocketOnMessage(e);
};
websocket.onclose = function (e) {
webSocketClose(e);
};
websocket.onopen = function () {
websocketOpen();
};
// 连接发生错误的回调方法
websocket.onerror = function () {
networkDes()
reConnect()
};
}
// 实际调用的方法
function sendSock(agentData) {
if (websocket.readyState === websocket.OPEN) {
// 若是ws开启状态
webSocketSend(agentData);
} else if (websocket.readyState === websocket.CONNECTING) {
// 若是 正在开启状态,则等待1s后重新调用
setTimeout(function () {
sendSock(agentData);
}, 1000);
} else {
// 若未开启 ,则等待1s后重新调用
setTimeout(function () {
sendSock(agentData);
}, 1000);
}
}
function closeSock(active) {
lockReconnect = active; // 主动断开时不重连
websocket.close();
}
// 数据接收
function webSocketOnMessage(msg) {
// 收到信息为Blob类型时
let result = null;
// debugger
// 二进制文件
if (msg.data instanceof Blob) {
const reader = new FileReader();
reader.readAsText(msg.data, "UTF-8");
reader.onload = () => {
result = JSON.parse(reader.result);
global_callback(result);
};
} else {
if(msg.type === "") return
result = JSON.parse(msg.data);
// if(result.type == 13){
// store.commit("SET_WS_Msg_NUM", result.data.todo_msg_count);
// }
if(global_callback){
global_callback(result);
}
}
if (result.type == -1 || result.type == 8 || result.type == 9) {
if(result.type == -1){
if(result.data && result.data.token){
tool.cookie.set("TOKEN", result.data.token);
}
}else{
showNot = ElNotification.error({
title: '系统退出',
message: result.msg,
duration:0
});
handleError('系统退出', result.msg);
}
}
if(result.type == 'init'){
if(showNot && showNot.close){
showNot.close();
}
}
startHeartbeat()
}
function handleError() {
api.system.user.logout.post().then();
router.replace({ path: "/login" }).then();
closeSock(true);
}
function getSock(callback) {
global_callback = callback
}
// 数据发送
function webSocketSend(agentData) {
websocket.send(agentData);
}
// 关闭
function webSocketClose() {
reConnect()
}
function websocketOpen() {
start()
}
export {
sendSock,
createWebSocket,
closeSock,
getSock,
reConnect,
};