OJ-04--添加useStore(pinia) 并完善aixos的reponse 和 request 配置

84 阅读1分钟

创建stores/user-store.js

用于存放用户的状态相当于 vue2 中的vuex.

import {defineStore} from "pinia";

export const useUserStore = defineStore({
    id:"user",
    state:()=>({
        token:null,
        baseInfo:null,
        theme:'light',
    }),
    getters:{
        isLogin:(state) => {//是否有token记录 , 打开页面自动登录判断使用
            return state.token != null;
        }
    },
    actions:{//登出操作
        logout(){
            this.baseInfo = null;
            this.token = null;
            localStorage.removeItem("token");
            localStorage.removeItem("baseInfo");
            sessionStorage.removeItem("theme");
        }
    },
    persist:[
        {
            key:"token",
            storage:localStorage,
            paths:['token']
        },{
            key:"baseInfo",
            storage:localStorage,
            paths:['baseInfo']
        },{
            key:"theme",
            storage:sessionStorage,
            paths:['theme']
        }

    ]
})

优化 axios中的 request 和 response

request配置

request请求时,在请求头中配置token信息,以便后端收到请求后根据token解析/鉴权/等操作

httpService.interceptors.request.use((config)=>{
    const  useStore = useUserStore();
    if(useStore.token !== null){
        config.headers['Authorization'] = useStore.token;
        return config;
    }
    return config;
},err=>{
    console.log("错误 的请求")
    return Promise.reject(err)
})

response

response 根据服务端返回的信息 做相应的处理

httpService.interceptors.response.use(res=>{
    console.log("res")
    console.log(res)
    //设置token 
    const authorization = res?.headers.authorization;
    if (authorization){
        const useStore = useUserStore();
        useStore.token = authorization;

    }
    if (res.status === 200 ){
        if (res.data.code === 400){
            return Promise.reject(res.data.msg);
        }
        return res;
    }else{
        ElMessage({message: res.msg?res.msg:"系统异常",type: 'error',})
        return Promise.reject(res.data.msg);
    }
},error => {
    console.log("错误的接收信息")
    console.log(error)
    if (error.response){
        console.log("response")
        if (error.response.status === 401){//token 过期, 需要重新登录
            console.log("toekn401")
            const userStore = useUserStore()
            userStore.logout()
            ElMessage({message: '登录已 过期, 需要重新登录.',type: 'warning',})
            setTimeout(()=>{
                router.push({
                    path:'/login',
                    query:{
                        auth:0,
                    }
                })
            },1500)
        }
    }
    return Promise.reject(error);
})