export const TOKEN_TIME = 'tokenTime'
export const TOKEN_TIME_VALUE = 2 * 60 * 60 * 1000
创建auth.js来放咱们所需的方法
import { TOKEN_TIME, TOKEN_TIME_VALUE } from './constant'
// 登录时设置时间
export const setTokenTime = () => {
localStorage.setItem(TOKEN_TIME,Date.now())
}
// 获取
export const getTokenTime = () => {
return localStorage.getItem(TOKEN_TIME)
}
// 是否已经过期
export const diffTokenTime = () => {
const currentTime = Date.now()
const tokenTime = getTokenTime()
return currentTime - tokenTime > TOKEN_TIME_VALUE
}
import {login as loginApi} from '../../api/login'
import router from '../../router'
//ElLoading一个是加载的小插件,一个是ElMessage弹窗
import { ElLoading,ElMessage } from 'element-plus'
//设置token的登录时间的方法 我们需要引入
import { setTokenTime } from '@/utils/auth'
export default {
//开启命名空间
namespaced:true,
state:() =>({
//设置静态变量
token : localStorage.getItem('token') || '',
}),
mutations:{
//提交更新数据的方法
setToken(state,token){
state.token = token
localStorage.setItem('token',token)
},
},
actions:{
//登录的方法
login: function ({ commit }, userInfo) {
return new Promise((resolve, reject) => {
loginApi(userInfo).then( (res)=> {
// console.log(res.token)
//这个就是那个loading 详细过程官方文档有哦
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)'
})
setTimeout(() => {
loading.close()
ElMessage.success("登录成功")
//成功之后跳转到咱们的主页
router.replace('/')
}, 2000)
//执行setToken方法
commit('setToken', res.token)
//执行setTokenTime方法 设置token的登录时间
setTokenTime()
resolve()
}).catch((err) => {
reject(err)
})
})
},
// 退出
logout({ commit }) {
commit('setToken', '')
localStorage.clear()
router.replace('/login')
}
}
}
export default {
token: (state) => state.app.token,
siderType: (state) => state.app.siderType,
lang: (state) => state.app.lang
}
import { createStore } from 'vuex'
// @ts-ignore
import app from './modules/app'
// @ts-ignore
import getters from './getters'
export default createStore({
modules: {
app
},
getters
})
由此准备工作完成啦 这里采取的分块化 可能会有一点繁琐 但是维护起来就知道多么爽了哈哈哈
怎么把咱们的每一次请求都带上token呢 毫无疑问 咱们就要去封装的axios里面操作啦
import { diffTokenTime } from '../utils/auth'
import store from '../store'
service.interceptors.request.use(
(config) => {
if (localStorage.getItem('token')) {
if (diffTokenTime()) {
store.dispatch('app/logout')
return Promise.reject(new Error('token 失效了'))
}
}
config.headers.Authorization = localStorage.getItem('token')
return config
},
(error) => {
return Promise.reject(new Error(error))
}
)
主要是请求的处理 所以我就直接贴请求部分了
- 这里的意思是如果获取到的token为空 那就是没有登录
- 如果有登录 在app.js中的login方法已经将token存在咱们的浏览器了
- 所以在请求的时候 我们就可以获取到token 下一步执行diffTokenTime()方法
- 来判断token是否超过限制的登录时间
- 如果 超出时间 就执行注销操作
既然方法在我们vuex里面了 所以登录的方法也要修改哦
import { useStore } from 'vuex'
const store = useStore()
store.dispatch('app/login', ruleform.value)
在router文件下新建permission.js
import router from './index'
import store from '../store'
const whiteList = ['/login']
router.beforeEach((to, from, next) => {
if (store.getters.token) {
if (to.path === '/login') {
next('/')
} else {
next()
}
} else {
if (whiteList.includes(to.path)) {
next()
} else {
next('/login')
}
}
})
'/'是去登录成功的主页的路由 '
'/login' 是去登录的路由
只需要在router的index.js配置以下就好
以上就实现了咱们简单的token登录 过期自动退出啦
欢迎关注点赞收藏!!!!