2023-08-07 00:01:20 +08:00

103 lines
2.8 KiB
JavaScript

import axios from "axios";
import {ElMessage} from "element-plus";
const authItemName = "authorize"
const accessHeader = () => {
return {
'Authorization': `Bearer ${takeAccessToken()}`
}
}
const defaultError = (error) => {
console.error(error)
ElMessage.error('发生了一些错误,请联系管理员')
}
const defaultFailure = (message, status, url) => {
console.warn(`请求地址: ${url}, 状态码: ${status}, 错误信息: ${message}`)
ElMessage.warning(message)
}
function takeAccessToken() {
const str = localStorage.getItem(authItemName) || sessionStorage.getItem(authItemName);
if(!str) return null
const authObj = JSON.parse(str)
if(authObj.expire <= new Date()) {
deleteAccessToken()
ElMessage.warning("登录状态已过期,请重新登录!")
return null
}
return authObj.token
}
function storeAccessToken(remember, token, expire){
const authObj = {
token: token,
expire: expire
}
const str = JSON.stringify(authObj)
if(remember)
localStorage.setItem(authItemName, str)
else
sessionStorage.setItem(authItemName, str)
}
function deleteAccessToken() {
localStorage.removeItem(authItemName)
sessionStorage.removeItem(authItemName)
}
function internalPost(url, data, headers, success, failure, error = defaultError){
axios.post(url, data, { headers: headers }).then(({data}) => {
if(data.code === 200)
success(data.data)
else
failure(data.message, data.code, url)
}).catch(err => error(err))
}
function internalGet(url, headers, success, failure, error = defaultError){
axios.get(url, { headers: headers }).then(({data}) => {
if(data.code === 200)
success(data.data)
else
failure(data.message, data.code, url)
}).catch(err => error(err))
}
function login(username, password, remember, success, failure = defaultFailure){
internalPost('/api/auth/login', {
username: username,
password: password
}, {
'Content-Type': 'application/x-www-form-urlencoded'
}, (data) => {
storeAccessToken(remember, data.token)
ElMessage.success(`登录成功,欢迎 ${data.username} 来到我们的系统`)
success(data)
}, failure)
}
function post(url, data, success, failure = defaultFailure) {
internalPost(url, data, accessHeader() , success, failure)
}
function logout(success, failure = defaultFailure){
get('/api/auth/logout', () => {
deleteAccessToken()
ElMessage.success(`退出登录成功,欢迎您再次使用`)
success()
}, failure)
}
function get(url, success, failure) {
internalGet(url, accessHeader(), success, failure = defaultFailure)
}
function unauthorized() {
return !takeAccessToken()
}
export { post, get, login, logout, unauthorized }