优化流程

This commit is contained in:
qaq
2025-07-02 15:40:14 +08:00
parent d7339af37b
commit 94e01ae63b
66 changed files with 5973 additions and 1988 deletions
+72
View File
@@ -0,0 +1,72 @@
import { getRoleIdFromToken, isTokenValid } from './jwt';
/**
* 权限工具类
*/
/**
* 获取当前用户的token
* @returns token
*/
export function getToken(): string | null {
return localStorage.getItem('token');
}
/**
* 获取当前用户的角色ID
* @returns 角色ID
*/
export function getCurrentUserRoleId(): number | null {
const token = getToken();
if (!token || !isTokenValid(token)) {
return null;
}
return getRoleIdFromToken(token);
}
/**
* 判断当前用户是否是管理员
* @returns 是否是管理员
*/
export function isAdmin(): boolean {
const roleId = getCurrentUserRoleId();
return roleId === 0;
}
/**
* 判断当前用户是否有指定角色
* @param targetRoleId 目标角色ID
* @returns 是否有指定角色
*/
export function hasRole(targetRoleId: number): boolean {
const roleId = getCurrentUserRoleId();
return roleId === targetRoleId;
}
/**
* 判断当前用户是否已登录且token有效
* @returns 是否已登录
*/
export function isLoggedIn(): boolean {
const token = getToken();
return token ? isTokenValid(token) : false;
}
/**
* 权限检查装饰器函数
* @param fn 要执行的函数
* @param errorMsg 权限不足时的错误提示
* @returns 包装后的函数
*/
export function requireAdmin<T extends (...args: any[]) => any>(
fn: T,
errorMsg: string = '权限不足,仅管理员可操作'
): T {
return ((...args: Parameters<T>) => {
if (!isAdmin()) {
console.warn(errorMsg);
return false;
}
return fn(...args);
}) as T;
}
+113
View File
@@ -0,0 +1,113 @@
/**
* JWT工具类 - TypeScript版本
*/
interface JWTPayload {
sub: string;
role_id: number;
user: string;
exp: number;
iat: number;
}
/**
* 从JWT Token中获取payload
* @param token JWT Token
* @returns payload数据
*/
function getPayloadFromToken(token: string): JWTPayload | null {
try {
if (!token) return null;
const parts = token.split('.');
if (parts.length !== 3) return null;
const encodedPayload = parts[1];
const decodedPayload = atob(encodedPayload);
return JSON.parse(decodedPayload) as JWTPayload;
} catch (error) {
return null;
}
}
/**
* 从JWT Token中获取用户ID
* @param token JWT Token
* @returns 用户ID
*/
export function getUserIdFromToken(token: string): number | null {
const payload = getPayloadFromToken(token);
return payload ? parseInt(payload.sub) : null;
}
/**
* 从JWT Token中获取用户角色ID
* @param token JWT Token
* @returns 角色ID
*/
export function getRoleIdFromToken(token: string): number | null {
const payload = getPayloadFromToken(token);
return payload ? payload.role_id : null;
}
/**
* 从JWT Token中获取用户名
* @param token JWT Token
* @returns 用户名
*/
export function getUsernameFromToken(token: string): string | null {
const payload = getPayloadFromToken(token);
return payload ? payload.user : null;
}
/**
* 验证token是否过期
* @param token JWT Token
* @returns 是否有效
*/
export function isTokenValid(token: string): boolean {
const payload = getPayloadFromToken(token);
if (!payload) return false;
const now = Math.floor(Date.now() / 1000);
return payload.exp > now;
}
// JwtUtil对象,提供便捷的静态方法调用
export const JwtUtil = {
/**
* 从localStorage获取token并解析用户ID
* @returns 用户ID
*/
getUserIdFromToken(): number | null {
const token = localStorage.getItem('token');
return token ? getUserIdFromToken(token) : null;
},
/**
* 从localStorage获取token并解析角色ID
* @returns 角色ID
*/
getRoleIdFromToken(): number | null {
const token = localStorage.getItem('token');
return token ? getRoleIdFromToken(token) : null;
},
/**
* 从localStorage获取token并解析用户名
* @returns 用户名
*/
getUsernameFromToken(): string | null {
const token = localStorage.getItem('token');
return token ? getUsernameFromToken(token) : null;
},
/**
* 验证localStorage中的token是否有效
* @returns 是否有效
*/
isTokenValid(): boolean {
const token = localStorage.getItem('token');
return token ? isTokenValid(token) : false;
}
};
+24
View File
@@ -0,0 +1,24 @@
/**
* 安全退出登录函数
* 清除登录相关数据,但保留用户偏好设置(如主题)
*/
export const safeLogout = () => {
// 需要保留的用户偏好设置
const preservedSettings = {
theme: localStorage.getItem('heroui-theme'),
// 可以在这里添加其他需要保留的设置
};
// 清除所有localStorage数据
localStorage.clear();
// 恢复保留的设置
Object.entries(preservedSettings).forEach(([key, value]) => {
if (value) {
if (key === 'theme') {
localStorage.setItem('heroui-theme', value);
}
// 可以在这里添加其他设置的恢复逻辑
}
});
};