InfoRadar / client /src /ts /utils /adminManager.ts
dqy08's picture
添加模型管理功能;优化初始化时模型加载时序;国际化仅限普通用户界面;重构server.py以优化环境变量管理和上下文管理
c8f3989
/**
* 管理员状态管理模块
*/
const INFORADAR_ADMIN_TOKEN_KEY = 'admin_token';
const ADMIN_MODE_KEY = 'is_admin_mode';
export class AdminManager {
private static instance: AdminManager | null = null;
private adminToken: string | null = null;
private isAdminMode: boolean = false;
private constructor() {
// 从localStorage恢复状态
const savedToken = localStorage.getItem(INFORADAR_ADMIN_TOKEN_KEY);
const savedMode = localStorage.getItem(ADMIN_MODE_KEY);
if (savedToken) {
this.adminToken = savedToken;
}
if (savedMode === 'true') {
this.isAdminMode = true;
}
}
public static getInstance(): AdminManager {
if (!AdminManager.instance) {
AdminManager.instance = new AdminManager();
}
return AdminManager.instance;
}
/**
* 获取当前admin token
*/
public getAdminToken(): string | null {
return this.adminToken;
}
/**
* 检查是否处于管理员模式
*/
public isInAdminMode(): boolean {
return this.isAdminMode && this.adminToken !== null;
}
/**
* 设置admin token并进入管理员模式
* 返回后端的 success / message,方便前端直接展示后端文案
*/
public async setAdminToken(token: string): Promise<{ success: boolean; message?: string }> {
try {
// 验证token(调用后端API)
const response = await fetch('/api/check_admin', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Admin-Token': token
},
body: JSON.stringify({ token })
});
const result = await response.json();
if (result.success) {
this.adminToken = token;
this.isAdminMode = true;
localStorage.setItem(INFORADAR_ADMIN_TOKEN_KEY, token);
localStorage.setItem(ADMIN_MODE_KEY, 'true');
return {
success: true,
message: result.message
};
} else {
// token无效或管理员功能未启用
this.clearAdminToken();
return {
success: false,
// 不自作主张改写文案,优先使用后端 message
message: result && typeof result.message === 'string' ? result.message : undefined
};
}
} catch (error) {
console.error('验证admin token失败:', error);
this.clearAdminToken();
// 网络等异常场景单独返回一条通用错误
return {
success: false,
message: 'Request failed, please try again later.'
};
}
}
/**
* 清除admin token并退出管理员模式
*/
public clearAdminToken(): void {
this.adminToken = null;
this.isAdminMode = false;
localStorage.removeItem(INFORADAR_ADMIN_TOKEN_KEY);
localStorage.removeItem(ADMIN_MODE_KEY);
}
/**
* 监听管理员模式状态变化
*/
private listeners: Array<(isAdmin: boolean) => void> = [];
public onAdminModeChange(callback: (isAdmin: boolean) => void): void {
this.listeners.push(callback);
}
private notifyListeners(): void {
const isAdmin = this.isInAdminMode();
this.listeners.forEach(callback => callback(isAdmin));
}
/**
* 设置admin token并通知监听器
*/
public async setAdminTokenAndNotify(token: string): Promise<{ success: boolean; message?: string }> {
const result = await this.setAdminToken(token);
this.notifyListeners();
return result;
}
/**
* 清除admin token并通知监听器
*/
public clearAdminTokenAndNotify(): void {
this.clearAdminToken();
this.notifyListeners();
}
}