新增账号,超管体系
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
const TOKEN_KEY = 'dashboard_access_token'
|
||||
const USER_KEY = 'dashboard_user'
|
||||
|
||||
export function getToken() {
|
||||
return localStorage.getItem(TOKEN_KEY)
|
||||
@@ -16,6 +17,63 @@ export function clearToken() {
|
||||
localStorage.removeItem(TOKEN_KEY)
|
||||
}
|
||||
|
||||
export function setUser(user) {
|
||||
if (user) {
|
||||
localStorage.setItem(USER_KEY, JSON.stringify(user))
|
||||
} else {
|
||||
localStorage.removeItem(USER_KEY)
|
||||
}
|
||||
}
|
||||
|
||||
export function getUser() {
|
||||
const raw = localStorage.getItem(USER_KEY)
|
||||
if (raw) {
|
||||
try {
|
||||
return JSON.parse(raw)
|
||||
} catch {
|
||||
localStorage.removeItem(USER_KEY)
|
||||
}
|
||||
}
|
||||
return getUserFromToken()
|
||||
}
|
||||
|
||||
export function clearUser() {
|
||||
localStorage.removeItem(USER_KEY)
|
||||
}
|
||||
|
||||
import { clearTabsStorage } from '@/utils/tabs'
|
||||
|
||||
export function clearAuth() {
|
||||
clearToken()
|
||||
clearUser()
|
||||
clearTabsStorage()
|
||||
}
|
||||
|
||||
/** 从 JWT 解析用户信息(兜底) */
|
||||
export function getUserFromToken(token = getToken()) {
|
||||
if (!token) return null
|
||||
try {
|
||||
const part = token.split('.')[1]
|
||||
if (!part) return null
|
||||
let base64 = part.replace(/-/g, '+').replace(/_/g, '/')
|
||||
const pad = base64.length % 4
|
||||
if (pad) base64 += '='.repeat(4 - pad)
|
||||
const payload = JSON.parse(atob(base64))
|
||||
if (payload.sub == null) return null
|
||||
return {
|
||||
id: payload.sub,
|
||||
username: payload.username || '',
|
||||
is_super_admin: !!payload.is_super_admin
|
||||
}
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export function isSuperAdmin(user = getUser()) {
|
||||
return !!user?.is_super_admin
|
||||
}
|
||||
|
||||
/** 解析 JWT 过期时间(毫秒时间戳),失败返回 null */
|
||||
export function getTokenExpiresAt(token) {
|
||||
if (!token) return null
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import axios from 'axios'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getToken, clearToken } from '@/utils/auth'
|
||||
import { getToken, clearAuth } from '@/utils/auth'
|
||||
|
||||
// 创建 axios 实例
|
||||
const request = axios.create({
|
||||
@@ -44,7 +44,7 @@ request.interceptors.response.use(
|
||||
error => {
|
||||
const status = error.response?.status
|
||||
if (status === 401) {
|
||||
clearToken()
|
||||
clearAuth()
|
||||
const detail = error.response?.data?.detail
|
||||
if (detail) {
|
||||
ElMessage.warning(typeof detail === 'string' ? detail : '登录已失效')
|
||||
@@ -57,6 +57,11 @@ request.interceptors.response.use(
|
||||
}
|
||||
return Promise.reject(error)
|
||||
}
|
||||
if (status === 403) {
|
||||
const detail = error.response?.data?.detail
|
||||
ElMessage.warning(typeof detail === 'string' ? detail : '无权限执行此操作')
|
||||
return Promise.reject(error)
|
||||
}
|
||||
console.error('响应错误:', error)
|
||||
ElMessage.error(error.message || '网络错误')
|
||||
return Promise.reject(error)
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
export const TABS_STORAGE_KEY = 'dashboard_tabs_v1'
|
||||
export const HOME_PATH = '/home'
|
||||
|
||||
export function clearTabsStorage() {
|
||||
try {
|
||||
sessionStorage.removeItem(TABS_STORAGE_KEY)
|
||||
} catch {}
|
||||
}
|
||||
Reference in New Issue
Block a user