使用的插件 vuex,axios和vue router
项目中部分网页不需要登陆就能访问比如登陆,注册,其他页面的访问则需保持登陆状态,下面这种
1.首先配置路由:在router.js中添加meta区分
比如登录注册页面,不需要登录即可进入,那么我们把meta中的isLogin标志设置为false
{
//登录
path: '/loginweb',
component: Login,
meta: {
isLogin: false
}
},
{
//注册
path: '/logon',
component: Logon,
meta: {
isLogin: false
}
},
而在首页我们需要登录才能进入,那么我们把meta中的isLogin标志设置为true
{
//首页
path: '/',
component: Home,
meta: {
isLogin: true
}
},
{
//中国文化
path: '/chinese',
component: Chinese,
meta: {
isLogin: true
}
},
{
//中国文化
path: '/news',
component: News,
meta: {
isLogin: true
}
},
{
//趣味汉语
path: '/ic',
component: IC,
meta: {
isLogin: true
}
},
{
//成语
path: '/idiom',
component: Idiom,
meta: {
isLogin: true
}
},
{
//交流互动
path: '/ei',
component: EI,
meta: {
isLogin: true
}
},
{
//诗词
path: '/poetry',
component: Poetry,
meta: {
isLogin: true
}
},
{
//练习
path: '/practice',
component: Practice,
meta: {
isLogin: true
}
},
{
//对话
path: '/dialogue',
component: Dialogue,
meta: {
isLogin: true
}
}
这样我们就为进入各个路由是否需要登录做了区分。
2.在登陆请求成功后修改状态
var that = this;
this.$axios.post('/login/', this.$qs.stringify({
username: this.logindata.username,
pwd: this.logindata.pass,
}))
.then(function (res) {
console.log(res);
if (res.data.msg == '该用户不存在') {
that.logindata.erusername = res.data.msg;
} else if (res.data.msg == '输入密码错误') {
that.logindata.erpass = res.data.msg;
} else {
//登陆成功后设置了,localStorage 保存登陆状态和userid
localStorage.setItem("Userid", res.data.userid);
localStorage.setItem("Flag", "isLogin");
that.$store.dispatch("userLogin", true);
that.$router.push("/");
}
})
.catch(function (error) {
if (error) {
console.log('登录请求失败');
}
});
这个里为什么要使用that重新代替this 是因为箭头函数中this指向了上下文,不在本组件中,取不到组件中的相关的值
3.在vuex中,stor.js这样写
export default new Vuex.Store({
// 设置属性
state: {
isLogin: false,
},
// 获取属性的状态
getters: {
//获取登录状态
isLogin: state => state.isLogin,
},
// 设置属性状态
mutations: {
//保存登录状态
userStatus(state, flag) {
state.isLogin = flag
},
},
// 应用mutations
actions: {
//获取登录状态
setUser({commit}, flag) {
commit("userStatus", flag)
},
}
})
重点来了~,在mian.js里,需要控制路由的跳转
router.beforeEach((to, from, next) => {
//获取用户登录成功后储存的登录标志
let getFlag = localStorage.getItem("Flag");
let getid = localStorage.getItem("Userid");
//如果登录标志存在且为isLogin,即用户已登录
if (getFlag === "isLogin"&&getid !== null) {
//设置vuex登录状态为已登录
store.state.isLogin = true;
next();
//如果已登录,还想想进入登录注册界面,则定向回首页
if (!to.meta.isLogin) {
//iViewUi友好提示
// iView.Message.error('请先退出登录');
next({
path: '/'
})
}
//如果登录标志不存在,即未登录
} else {
//用户想进入需要登录的页面,则定向回登录界面
if (to.meta.isLogin) {
next({
path: '/loginweb',
})
//用户进入无需登录的界面,则跳转继续
} else {
next()
}
}
});
router.afterEach(() => {
window.scroll(0, 0);
});
这样就已经完成了Vue的登录注册,当用户关闭浏览器或者第二天再次进入网站,用户依旧可以保持着登录的状态直到用户手动退出登录。
用户退出只需要localStorage.removeItem("Flag"),localStorage.removeItem("Userid")即可
错误路由的拦截,只要我们没有登陆,或者错误的路由,都会跳转登陆页面
created: function () {
if (!this.$route.matched.length) {
this.$router.push("/");
}
let getFlag = localStorage.getItem("Flag");
let getid = localStorage.getItem("Userid");
if ((getid===null||getFlag !== "isLogin") && this.$route.path != '/logon') {
this.$router.push("/loginweb");
}
},