init
This commit is contained in:
25
src/utils/auth.js
Normal file
25
src/utils/auth.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import Cookies from "js-cookie";
|
||||
|
||||
export const getToken = () => {
|
||||
return Cookies.get('Authorization')
|
||||
}
|
||||
|
||||
export const setToken = (token) => {
|
||||
return Cookies.set('Authorization', token)
|
||||
}
|
||||
|
||||
export const removeToken = () => {
|
||||
return Cookies.remove('Authorization')
|
||||
}
|
||||
|
||||
export const getAuthInfo = () => {
|
||||
return Cookies.get('authinfo')
|
||||
}
|
||||
|
||||
export const setAuthInfo = (info) => {
|
||||
return Cookies.set('authinfo', info)
|
||||
}
|
||||
|
||||
export const removeAuthInfo = () => {
|
||||
return Cookies.remove('authinfo')
|
||||
}
|
||||
51
src/utils/axiosCanceler.js
Normal file
51
src/utils/axiosCanceler.js
Normal file
@@ -0,0 +1,51 @@
|
||||
// 存储每个请求的标识和取消函数
|
||||
const pendingRequest = new Map()
|
||||
|
||||
const getPendUrl = (config) => {
|
||||
return `${config.method}&${config.url}`
|
||||
}
|
||||
|
||||
export class AxiosCanceler {
|
||||
/**
|
||||
* 添加请求
|
||||
* @param {*} config 请求配置
|
||||
*/
|
||||
addPendingRequest(config) {
|
||||
const url = getPendUrl(config)
|
||||
const controller = new AbortController() // 请求中止控制器
|
||||
config.signal = controller.signal
|
||||
if(!pendingRequest.has(url)) {
|
||||
pendingRequest.set(url, controller)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除请求
|
||||
* @param {*} config 请求配置
|
||||
*/
|
||||
removePendingRequest(config) {
|
||||
const url = getPendUrl(config)
|
||||
if(pendingRequest.has(url)) {
|
||||
const abortController = pendingRequest.get(url)
|
||||
if(abortController) {
|
||||
abortController.abort(url)
|
||||
}
|
||||
pendingRequest.delete(url)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除所有请求
|
||||
*/
|
||||
removeAllPendingRequest() {
|
||||
for (const abortController of pendingRequest) {
|
||||
if(abortController)
|
||||
abortController.abort()
|
||||
}
|
||||
this.reset()
|
||||
}
|
||||
|
||||
reset() {
|
||||
pendingRequest.clear()
|
||||
}
|
||||
}
|
||||
66
src/utils/downloadZip.js
Normal file
66
src/utils/downloadZip.js
Normal file
@@ -0,0 +1,66 @@
|
||||
import axios from 'axios'
|
||||
import {getToken} from "./auth";
|
||||
import {ElMessage} from "element-plus";
|
||||
|
||||
const baseURL = import.meta.env.VITE_BASE_URL
|
||||
|
||||
const mimeMap = {
|
||||
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
zip: 'application/zip'
|
||||
}
|
||||
|
||||
|
||||
export function downLoadZip(url) {
|
||||
axios({
|
||||
method: 'get',
|
||||
url: baseURL + url,
|
||||
responseType: 'blob',
|
||||
headers: {'Authorization': getToken()}
|
||||
}).then(res => {
|
||||
try {
|
||||
resolveBlob(res, mimeMap.zip)
|
||||
}catch (e) {
|
||||
ElMessage.error("下载失败,请检查相关配置")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function downLoadExcel(url,params) {
|
||||
axios({
|
||||
method: 'get',
|
||||
url: baseURL + url,
|
||||
params,
|
||||
responseType: 'blob',
|
||||
headers: {'Authorization': getToken()}
|
||||
}).then(res => {
|
||||
console.log(res)
|
||||
try {
|
||||
resolveBlob(res, mimeMap.xlsx)
|
||||
}catch (e) {
|
||||
console.log(res)
|
||||
ElMessage.error(res.data.msg)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 解析blob响应内容并下载
|
||||
* @param {*} res blob响应内容
|
||||
* @param {String} mimeType MIME类型
|
||||
*/
|
||||
export function resolveBlob(res, mimeType) {
|
||||
const aLink = document.createElement('a')
|
||||
let blob = new Blob([res.data], {type: mimeType})
|
||||
let reg = /fileName=([^&]+)/;
|
||||
let contentDisposition = decodeURI(res.headers['content-disposition'])
|
||||
let result = reg.exec(contentDisposition)
|
||||
console.log(result)
|
||||
let fileName = result[1]
|
||||
fileName = fileName.replace(/\"/g, '')
|
||||
aLink.href = URL.createObjectURL(blob)
|
||||
aLink.setAttribute('download', fileName) // 设置下载文件名称
|
||||
document.body.appendChild(aLink)
|
||||
aLink.click()
|
||||
document.body.appendChild(aLink)
|
||||
}
|
||||
54
src/utils/publicvoid.js
Normal file
54
src/utils/publicvoid.js
Normal file
@@ -0,0 +1,54 @@
|
||||
// import md5 from 'js-md5'
|
||||
// import { useI18n } from 'vue-i18n'
|
||||
|
||||
/**
|
||||
* @author 温华
|
||||
* @description 这是一个加密函数
|
||||
* @param {string | number} data 需要加密的数据
|
||||
* @returns {result} 返回已加密的数据
|
||||
*/
|
||||
// export const useEncryption = data => {
|
||||
// const result = md5(data)
|
||||
// return result
|
||||
// }
|
||||
|
||||
/**
|
||||
* @author 温华
|
||||
* @param {function} func 需要添加防抖的函数
|
||||
* @param {number} wait 等待执行的时间
|
||||
* @param {boolean} immediate 是否立即执行
|
||||
* @returns
|
||||
*/
|
||||
export const useDebounce = function (func, wait = 1000, isImmediate = true) {
|
||||
var timerId = null
|
||||
var flag = true
|
||||
return function () {
|
||||
let context = this
|
||||
let args = arguments
|
||||
clearTimeout(timerId)
|
||||
if (isImmediate) {
|
||||
if (flag) {
|
||||
func.apply(context, args)
|
||||
flag = false
|
||||
}
|
||||
timerId = setTimeout(function () {
|
||||
flag = true
|
||||
}, wait)
|
||||
} else {
|
||||
timerId = setTimeout(function () {
|
||||
func.apply(context, args)
|
||||
}, wait)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const tableHead = {
|
||||
backgroundColor: '#F6F9FF',
|
||||
color: '#3D3F46',
|
||||
textAlign: 'center',
|
||||
// lineHeight: '30px'
|
||||
}
|
||||
|
||||
export const tabCell = {
|
||||
textAlign: 'center',
|
||||
}
|
||||
72
src/utils/request.js
Normal file
72
src/utils/request.js
Normal file
@@ -0,0 +1,72 @@
|
||||
import axios from "axios";
|
||||
import { AxiosCanceler } from "./axiosCanceler";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { getToken, removeToken } from "./auth";
|
||||
|
||||
axios.defaults.headers['Content-Type']='application/json'
|
||||
|
||||
const serveice = axios.create({
|
||||
baseURL: import.meta.env.VITE_BASE_URL,
|
||||
timeout: 6000
|
||||
})
|
||||
const axiosCanceler = new AxiosCanceler()
|
||||
serveice.interceptors.request.use(config=>{
|
||||
const ACCESS_TOKEN = getToken() || ''
|
||||
if(ACCESS_TOKEN!==undefined && ACCESS_TOKEN!=='') {
|
||||
config.headers['Authorization']=ACCESS_TOKEN
|
||||
}
|
||||
// 检查是否有重复请求, 有则取消掉
|
||||
axiosCanceler.removePendingRequest(config)
|
||||
// 将请求加入pendingMap
|
||||
axiosCanceler.addPendingRequest(config)
|
||||
return config
|
||||
},error=>{
|
||||
Promise.reject(error)
|
||||
})
|
||||
serveice.interceptors.response.use(response=>{
|
||||
axiosCanceler.removePendingRequest(response.config)
|
||||
//二进制数据直接返回
|
||||
if(response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {
|
||||
return response.data
|
||||
}
|
||||
return response.data
|
||||
},error=>{
|
||||
let response = error.response
|
||||
const status = response.status;
|
||||
switch(status) {
|
||||
case 401:
|
||||
ElMessageBox.confirm('登录状态已过期,请重新登录','系统提示',{
|
||||
confirmButtonText: '重新登录',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
closeOnClickModal: false
|
||||
}).then(()=>{
|
||||
removeToken()
|
||||
window.location = '/login'
|
||||
})
|
||||
return Promise.reject('会话已过期,请重新登录')
|
||||
case 402:
|
||||
break;
|
||||
case 403:
|
||||
ElMessage.warning('禁止访问')
|
||||
removeToken()
|
||||
window.location = '/forbidden'
|
||||
break;
|
||||
case 404:
|
||||
ElMessage.warning('不存在的地址')
|
||||
break;
|
||||
case 405:
|
||||
ElMessage.warning('传输格式错误,请检查')
|
||||
break;
|
||||
case 500:
|
||||
if (response.data){
|
||||
return response.data
|
||||
}else {
|
||||
ElMessage.error('系统未知错误')
|
||||
break;
|
||||
}
|
||||
}
|
||||
return Promise.reject(error)
|
||||
})
|
||||
|
||||
export default serveice
|
||||
46
src/utils/socket.js
Normal file
46
src/utils/socket.js
Normal file
@@ -0,0 +1,46 @@
|
||||
class Socket {
|
||||
constructor(url) {
|
||||
this.wx = new WebSocket(url)
|
||||
this.state = false
|
||||
}
|
||||
|
||||
open() {
|
||||
this.wx.onopen = (e) => {
|
||||
console.log('连接服务器成功');
|
||||
this.state = true
|
||||
}
|
||||
}
|
||||
|
||||
close() {
|
||||
this.wx.onclose = (e) => {
|
||||
console.log('服务器关闭');
|
||||
this.state = false
|
||||
}
|
||||
}
|
||||
|
||||
_error() {
|
||||
this.wx.onerror = (e) => {
|
||||
console.log('连接出错');
|
||||
this.state = false
|
||||
this.close()
|
||||
this.open()
|
||||
}
|
||||
}
|
||||
|
||||
message() {
|
||||
this.wx.onmessage = (e) => {
|
||||
// 接收服务器发送的消息
|
||||
return e.data
|
||||
}
|
||||
}
|
||||
|
||||
send(data) {
|
||||
let sendMsg
|
||||
if(data && data instanceof Object || data instanceof Array) {
|
||||
sendMsg = JSON.stringify(data)
|
||||
} else {
|
||||
sendMsg = data.toString()
|
||||
}
|
||||
this.wx.send(sendMsg)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user