提交后台前端基础框架
This commit is contained in:
130
Backend/src/$ws.js
Executable file
130
Backend/src/$ws.js
Executable file
@@ -0,0 +1,130 @@
|
||||
import Vue from 'vue'
|
||||
import config from '@/config/config'
|
||||
|
||||
var uuid = () => {
|
||||
var s = [];
|
||||
var hex = '0123456789abcdef'
|
||||
for (var i = 0; i < 36; i++) {
|
||||
s[i] = hex.substr(Math.floor(Math.random() * 0x10), 1)
|
||||
}
|
||||
s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
|
||||
s[19] = hex.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
|
||||
s[8] = s[13] = s[18] = s[23] = '-'
|
||||
|
||||
return s.join('');
|
||||
}
|
||||
|
||||
var log = (message, contexts = {}, ex = null) => {
|
||||
if (config.WS_DEBUG) {
|
||||
if (typeof contexts === 'object') {
|
||||
for (var k in contexts) {
|
||||
message = message.replaceAll('{' + k + '}', typeof contexts[k] === 'object' ? JSON.stringify(contexts[k]) : contexts[k])
|
||||
}
|
||||
}
|
||||
if (ex) {
|
||||
console.log('[WebSocket] ' + message, ex)
|
||||
} else {
|
||||
console.log('[WebSocket] ' + message)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
var callbacks = {}
|
||||
var reqQueues = []
|
||||
var connected = false
|
||||
var websocket = null
|
||||
var logininfo = {}
|
||||
|
||||
Vue.prototype.$wsConnect = (username, password, callback) => {
|
||||
websocket = new WebSocket(config.WS_URL)
|
||||
websocket.onmessage = (e) => {
|
||||
log('recv: {data}', { data: e.data })
|
||||
try {
|
||||
var data = JSON.parse(e.data)
|
||||
if (data['type'] === 'answer') {
|
||||
if (callbacks[data['requestId']]) {
|
||||
callbacks[data['requestId']](data['data'])
|
||||
delete callbacks[data['requestId']];
|
||||
}
|
||||
}
|
||||
} catch (ex) {
|
||||
log('recv error: {data}', { data: e.data }, ex)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
websocket.onopen = (e) => {
|
||||
log('open: {e}', { e })
|
||||
|
||||
Vue.prototype.$wsReq('login', {
|
||||
username: username,
|
||||
password: password,
|
||||
}, (ret) => {
|
||||
if (typeof callback === 'function') {
|
||||
callback(ret)
|
||||
}
|
||||
if (ret.ok) {
|
||||
connected = true
|
||||
logininfo = { username, password }
|
||||
if (reqQueues.length > 0) {
|
||||
for (let i = 0; i < reqQueues.length; i ++) {
|
||||
Vue.prototype.$wsSend(reqQueues[i])
|
||||
}
|
||||
}
|
||||
} else {
|
||||
websocket.close()
|
||||
log('login error: {ret}', { ret })
|
||||
}
|
||||
}, true)
|
||||
}
|
||||
websocket.onclose = (e) => {
|
||||
connected = false
|
||||
|
||||
log('close: {e}', { e })
|
||||
if (logininfo) {
|
||||
log('reconnect in three seconds')
|
||||
setTimeout(() => {
|
||||
Vue.prototype.$wsConnect(logininfo.username, logininfo.password)
|
||||
}, 3000)
|
||||
}
|
||||
}
|
||||
websocket.onerror = (e) => {
|
||||
log('error: {e}', { e })
|
||||
}
|
||||
}
|
||||
|
||||
Vue.prototype.$wsSend = (message, force = false) => {
|
||||
if (connected || force) {
|
||||
websocket.send(message)
|
||||
} else {
|
||||
reqQueues.push(message)
|
||||
}
|
||||
}
|
||||
|
||||
Vue.prototype.$wsReq = (type, data, callback, force = false) => {
|
||||
var reqId = uuid();
|
||||
var message = JSON.stringify(Object.assign(config.WS_REQ_PARAMS, {
|
||||
type: type,
|
||||
requestId: reqId,
|
||||
data: data,
|
||||
}))
|
||||
|
||||
if (typeof callback == 'function') {
|
||||
callbacks[reqId] = callback
|
||||
}
|
||||
|
||||
log('send: {message}', { message })
|
||||
|
||||
Vue.prototype.$wsSend(message, force)
|
||||
}
|
||||
|
||||
Vue.prototype.$wsClose = () => {
|
||||
logininfo = { username: '', password: '' }
|
||||
connected = false
|
||||
websocket.close()
|
||||
}
|
||||
|
||||
/*Vue.prototype.$wsConnect('test', '123456', (ret) => {
|
||||
console.log('haha', ret)
|
||||
})*/
|
||||
Reference in New Issue
Block a user