/** * 管理员状态管理模块 */ 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(); } }