/** * PFP特征模态框处理器 * 显示来自pfp.json的官方特征数据 */ class PFPFeatureModal { constructor() { this.pfpLoader = null; this.modal = null; this.shedingJiRanges = []; this.allPFPData = null; } /** * 初始化模态框 */ async init() { try { // 加载PFP数据(使用现有的PFPLoader) if (typeof PFPLoader !== 'undefined') { this.pfpLoader = new PFPLoader(); this.allPFPData = await this.pfpLoader.loadAllPFP(); } else { // 如果PFPLoader不可用,直接从API加载 await this.loadPFPDataDirectly(); } // 加载设定集配置 await this.loadShedingJiConfig(); // 初始化Bootstrap模态框 const modalElement = document.getElementById('pfpFeatureModal'); if (modalElement) { this.modal = new bootstrap.Modal(modalElement); } // console.debug('✓ PFP特征模态框初始化完成'); } catch (error) { console.error('PFP特征模态框初始化失败:', error); } } /** * 直接从API加载PFP数据 */ async loadPFPDataDirectly() { try { const response = await fetch('https://h5.shuziwenbo.cn/json/shpfp/pfp.json'); this.allPFPData = await response.json(); // console.debug('✓ PFP数据加载完成'); } catch (error) { console.error('加载PFP数据失败:', error); this.allPFPData = {}; } } /** * 加载设定集配置 */ async loadShedingJiConfig() { try { const response = await fetch('/api/v1/pfp/config/sheding-ji'); const result = await response.json(); if (result.success && result.data) { this.shedingJiRanges = result.data.ranges; // console.debug('✓ 设定集配置加载完成'); } } catch (error) { console.error('加载设定集配置失败:', error); this.shedingJiRanges = [[1, 100], [9901, 10000]]; // 使用默认值 } } /** * 判断编号是否为设定集 * 支持两种格式:具体编号列表 [16, 33, 65, ...] 或范围列表 [[2, 100], [9901, 10000]] */ isShedingJi(pfpNumber) { if (!pfpNumber || !this.shedingJiRanges) { return false; } // 检查是否为具体编号列表格式 if (this.shedingJiRanges.length > 0 && typeof this.shedingJiRanges[0] === 'number') { return this.shedingJiRanges.includes(pfpNumber); } // 范围列表格式 for (const range of this.shedingJiRanges) { if (Array.isArray(range) && range.length === 2) { const [start, end] = range; if (pfpNumber >= start && pfpNumber <= end) { return true; } } } return false; } /** * 显示特征数据 * @param {number} pfpNumber - PFP编号 * @param {object} ocrResult - OCR识别结果(可选) */ async showFeatures(pfpNumber, ocrResult = null) { if (!this.modal) { console.error('模态框未初始化'); return; } // 更新模态框标题 document.getElementById('pfpNumber').textContent = pfpNumber; // 显示/隐藏设定集徽章 const badge = document.getElementById('pfpShedingJiBadge'); if (badge) { badge.style.display = this.isShedingJi(pfpNumber) ? 'inline' : 'none'; } // 获取PFP数据(支持 {data: {...}} 或直接 {...} 格式) const pfpDataSource = this.allPFPData ? (this.allPFPData.data || this.allPFPData) : null; const pfpData = pfpDataSource ? pfpDataSource[pfpNumber] : null; // 渲染特征内容 let html = ''; let dataSource = ''; // 优先级: OCR结果 > 官方特征数据 if (ocrResult && Array.isArray(ocrResult) && ocrResult.length > 0) { html = this.renderOCRFeatures(ocrResult); dataSource = 'OCR识别'; } else if (pfpData && pfpData.features) { html = this.renderOfficialFeatures(pfpData); dataSource = '官方数据'; } else { html = '