初步增加 web 界面
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import { authApi } from '../api/modules';
|
||||
|
||||
export interface AuthUser {
|
||||
id: number;
|
||||
username: string;
|
||||
role: string;
|
||||
role_label?: string;
|
||||
permissions: string[];
|
||||
}
|
||||
|
||||
const TOKEN_KEY = 'token';
|
||||
const USER_KEY = 'user';
|
||||
|
||||
export function getToken(): string | null {
|
||||
return localStorage.getItem(TOKEN_KEY);
|
||||
}
|
||||
|
||||
export function getUser(): AuthUser | null {
|
||||
const raw = localStorage.getItem(USER_KEY);
|
||||
if (!raw) return null;
|
||||
try {
|
||||
return JSON.parse(raw);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export function setAuth(token: string, user: AuthUser) {
|
||||
localStorage.setItem(TOKEN_KEY, token);
|
||||
localStorage.setItem(USER_KEY, JSON.stringify(user));
|
||||
}
|
||||
|
||||
export function clearAuth() {
|
||||
localStorage.removeItem(TOKEN_KEY);
|
||||
localStorage.removeItem(USER_KEY);
|
||||
}
|
||||
|
||||
export async function fetchCurrentUser(): Promise<AuthUser | null> {
|
||||
const token = getToken();
|
||||
if (!token) return null;
|
||||
try {
|
||||
const data = await authApi.me();
|
||||
return {
|
||||
id: data.id,
|
||||
username: data.username,
|
||||
role: data.role,
|
||||
role_label: data.role_label,
|
||||
permissions: data.permissions,
|
||||
};
|
||||
} catch {
|
||||
clearAuth();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export function hasPerm(user: AuthUser | null, perm: string): boolean {
|
||||
if (!user) return false;
|
||||
return user.permissions.includes(perm);
|
||||
}
|
||||
Reference in New Issue
Block a user