vue 中登录页面时的实现
1、在项目中store中都store.js文件里添加保存和删除token都全局方法。
// store.js 中都mutation中增加添加和删除token的方法
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = { // 全局管理的数据存储
isLogin:'0',
ser:null,
token:localStorage.getItem('token') ? localStorage.getItem('token'):'', // token
};
export default new Vuex.Store({
state,
getters:{ // 监听数据变化的
getStorage(state){ // 获取本地存储的登录信息
if(!state.token){
state.token =JSON.parse(localStorage.getItem(key))
}
return state.token
}
},
mutations:{
$_setToken(state, value) { // 设置存储token
state.token = value;
localStorage.setItem('token', value);
},
$_removeStorage(state, value){ // 删除token
localStorage.removeItem('token');
},
}
})
2、在登录页面(login.vue)中登录方法调用接口成功后把token存储在本地存储中localStorage。
// login.vue页面
methods:{
loginFun(){
this.$api.post('请求的后端接口链接',{
data:{
userId:this.user, // 登录名
userPwd:this.psw, // 登录密码
}
}).then((res) => {
if(res.data.status == 200){
var userInfo = res.data.data;
this.$store.commit('$_setToken', userInfo.token);
Toast({ message: '登录成功', type: 'success',duration: 1500}); // ui弹窗提示
this.$router.push({ name:'homePage' }); // 跳转到首页
} else {
Toast({ message: res.data.message, duration: 1500}); // ui弹窗提示
}
})
}
}
退出的时候
returnFun(){ // 退出登录
MessageBox.confirm(this.lang.logoutTip).then(action => {
this.$store.commit('$_removeStorage'); // 清除登录信息
this.$router.push({
name:'login'
});
Toast({message:this.lang.logoutSuccess, duration: 1500});
}).catch(()=>{})
}
登录状态判别时 全局 1.在路由拦截器中进行判别 2、在请求拦截器中进行判别
// 全局路由构造函数,判断是否登录和要跳转到页面
router.beforeEach((to, from, next) => {
if (to.matched.some(m => m.meta.requireAuth)) { // 需要登录
if(window.localStorage.token && window.localStorage.isLogin === '1'){
next()
} else if (to.path !== '/login') {
let token = window.localStorage.token;
if (token === 'null' || token === '' || token === undefined){
next({path: '/login'})
Toast({ message: '检测到您还未登录,请登录后操作!', duration: 1500 })
}
} else {
next()
}
} else { // 不需要登录
next()
}
})
// 配置公共url
Axios.defaults.baseURL = "XXX"
//添加请求拦截器
axios.interceptors.request.use(
config =>{
if(store.state.token){
config.headers.common['token'] =store.state.token
}
return config;
},
error =>{
//对请求错误做什么
return Promise.reject(error);
})
//http reponse响应拦截器
axios.interceptors.response.use(
response =>{
return response;
},
error=>{
if(error.response){
switch(error.response.status){
case 401:
localStorage.removeItem('token');
router.replace({
path: '/views/login',
query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
})
}
}
})
3、某个页面要进行登录判别的话可以使用路由独享的守卫进行token判别
const router = new VueRouter({
routes: [
{
path: '/test',
component: test,
beforeEnter: (to, from, next) => {
// authkey 存在 进入该路由,不存在跳转到登陆页面
if (sessionStorage.getItem('authkey')) {
console.log(sessionStorage.getItem('authkey'))
next()
} else {
next('/user/Login')
}
},
}
]
})

浙公网安备 33010602011771号