// 本地需要编写
// api接口通过code换取token
async function getTokenByCode(code){
// 发送接口获取token 并返回
const res = await request({ method:'get', url:'xxx', params:{code} })
return res.data // 取出返回数据中的token或者返回一个包含token数据的对象
}
function persistingData (data) {
localStorage.setItem('token',data.token)
// do something
}
async function render(){
try{
const res = await loginByQueryInfo({signKey:'code',getTokenByCode,persistingData})
}catch(e){
//do something
}
// do something
}
// npm库 获取token 删除code
export async function loginByQuery({ signKey = 'code', getTokenBySign, persistingData}={},url){
if(typeof getTokenBySign !=='function' || typeof persistingData !== 'function'){
throw new Error('getTokenByCode、persistingData必须为函数')
}
const sign = getQueryString(signKey,url)
if(!isEmpty(sign)){
const res = await getTokenBySign(sign)
await persistingData(res)
if(!url) replaceSign(signKey)
}else{
throw new Error('无法获取到sign')
}
}
// 获取url的query中指定key的值
export function getQueryString(key, url){
if(isEmpty(url)) url = window.location.href
const reg = new RegExp('(^|&|\\?)' + key + '=([^&]*)(&|$|#)', 'i')
const r = url.match(reg)
if (r != null) return decodeURIComponent(r[2])
return null
}
// 重定向页面去除指定的key
function replaceSign(signKey) {
const reg = new RegExp('(^|&|\\?)'+ signKey +'([^&]*)(&|$|#)','i')
const url = window.location.href.replace(reg, '')
window.history.replaceState(null, null, url)
}
// 判断变量是否为空
function isEmpty(val){
return val === undefined || val === null
}