This commit is contained in:
clay
2024-03-04 19:13:43 +08:00
commit e44edd71c0
350 changed files with 52288 additions and 0 deletions

25
src/utils/auth.js Normal file
View 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')
}

View 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
View 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
View 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
View 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
View 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)
}
}