新增账号,超管体系

This commit is contained in:
eafonyang
2026-06-18 17:37:08 +08:00
parent 481261b334
commit 476da9b459
27 changed files with 1439 additions and 84 deletions
+58
View File
@@ -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
+7 -2
View File
@@ -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)
+8
View File
@@ -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 {}
}