feat: 关闭标签页/浏览器后强制重新登录——认证信息(token/username/realName/modules)改存 sessionStorage,目录记忆/备注草稿等偏好仍存 localStorage
| | |
| | | }) |
| | | |
| | | api.interceptors.request.use(config => { |
| | | const token = localStorage.getItem('token') |
| | | const token = sessionStorage.getItem('token') |
| | | if (token) config.headers.Authorization = 'Bearer ' + token |
| | | return config |
| | | }) |
| | |
| | | response => response.data, |
| | | error => { |
| | | if (error.response && error.response.status === 401) { |
| | | localStorage.removeItem('token') |
| | | sessionStorage.removeItem('token') |
| | | window.location.href = '/login' |
| | | return Promise.reject(error) |
| | | } |
| | |
| | | }, |
| | | computed: { |
| | | username() { |
| | | return localStorage.getItem('username') || 'admin' |
| | | return sessionStorage.getItem('username') || 'admin' |
| | | } |
| | | }, |
| | | methods: { |
| | |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | localStorage.removeItem('token') |
| | | localStorage.removeItem('username') |
| | | sessionStorage.removeItem('token') |
| | | sessionStorage.removeItem('username') |
| | | sessionStorage.removeItem('realName') |
| | | sessionStorage.removeItem('modules') |
| | | this.$message.success('已退出登录') |
| | | this.$router.push('/login') |
| | | }).catch(() => {}) |
| | |
| | | Vue.mixin({ |
| | | methods: { |
| | | logout() { |
| | | localStorage.removeItem('token') |
| | | localStorage.removeItem('username') |
| | | localStorage.removeItem('realName') |
| | | localStorage.removeItem('modules') |
| | | sessionStorage.removeItem('token') |
| | | sessionStorage.removeItem('username') |
| | | sessionStorage.removeItem('realName') |
| | | sessionStorage.removeItem('modules') |
| | | this.$router.push('/login') |
| | | } |
| | | } |
| | |
| | | }) |
| | | |
| | | router.beforeEach((to, from, next) => { |
| | | const token = localStorage.getItem('token') |
| | | const token = sessionStorage.getItem('token') |
| | | if (to.path === '/login') { |
| | | next(token ? '/dashboard' : undefined) |
| | | } else { |
| | |
| | | this.loggingIn = false |
| | | const d = res.data |
| | | if (d.code === 200) { |
| | | localStorage.setItem('token', d.data.token) |
| | | localStorage.setItem('username', d.data.username) |
| | | localStorage.setItem('realName', d.data.realName || '') |
| | | localStorage.setItem('modules', d.data.modules || '') |
| | | sessionStorage.setItem('token', d.data.token) |
| | | sessionStorage.setItem('username', d.data.username) |
| | | sessionStorage.setItem('realName', d.data.realName || '') |
| | | sessionStorage.setItem('modules', d.data.modules || '') |
| | | this.$message.success('登录成功') |
| | | this.$router.push('/dashboard') |
| | | } else if (d.code === 401) { |
| | |
| | | } |
| | | }, |
| | | computed: { |
| | | username() { return localStorage.getItem('username') || '' }, |
| | | realName() { return localStorage.getItem('realName') || '' }, |
| | | username() { return sessionStorage.getItem('username') || '' }, |
| | | realName() { return sessionStorage.getItem('realName') || '' }, |
| | | myModules() { |
| | | const s = localStorage.getItem('modules') |
| | | const s = sessionStorage.getItem('modules') |
| | | if (!s) return [] |
| | | return s.split(',').filter(Boolean) |
| | | }, |
| | |
| | | return m ? m.title : key |
| | | }, |
| | | logout() { |
| | | localStorage.removeItem('token'); localStorage.removeItem('username'); localStorage.removeItem('realName'); localStorage.removeItem('modules') |
| | | sessionStorage.removeItem('token'); sessionStorage.removeItem('username'); sessionStorage.removeItem('realName'); sessionStorage.removeItem('modules') |
| | | this.$router.push('/login') |
| | | }, |
| | | // ==================== 查询条件与状态刷新 ==================== |