关联主题::
同级:: 2025-08-30_星期六
下一级::


我来查看一下更新日志是如何实时获取数据的。让我先搜索相关的代码:

[2 tools called]

现在让我详细查看更新日志系统的实现:

[2 tools called]

让我再查看一下主页面中是如何调用更新日志的:

[1 tool called]

现在我完全理解了更新日志的实时数据获取机制。让我为您详细解释:

更新日志的实时数据获取机制

当前的更新日志系统通过以下方式实时获取数据:

1. 数据扫描机制

scanForUpdates() {
    // 清空之前的数据
    this.updateData = [];
    
    const updateElements = document.querySelectorAll('.update-date');
    
    updateElements.forEach(element => {
        const updateDate = element.getAttribute('data-date');
        const li = element.closest('li');
        
        if (li && updateDate) {
            const linkElement = li.querySelector('a');
            const title = linkElement ? linkElement.textContent.trim() : '';
            const url = linkElement ? linkElement.getAttribute('href') : '';
            const path = this.getFullPath(li);
            const notes = this.getNotes(li);
            const backupUrl = this.getBackupUrl(li);
            
            this.updateData.push({
                title: title,
                url: url,
                updateDate: updateDate,
                path: path,
                notes: notes,
                backupUrl: backupUrl,
                timestamp: new Date(updateDate).getTime()
            });
        }
    });
 
    this.updateData.sort((a, b) => b.timestamp - a.timestamp);
    
    // 更新全局变量
    window.UPDATE_LOG_DATA = this.updateData;
    
    console.log(`扫描到 ${this.updateData.length} 个更新项目`);
}

2. 实时性实现方式

A. DOM扫描方式:

  • 系统在页面加载时自动扫描所有带有 update-date 类的DOM元素
  • 实时从当前页面的HTML结构中提取数据,而不是从静态文件读取
  • 每次打开更新日志时都会重新扫描最新的DOM状态

B. 数据获取流程:

// 尝试从父页面获取数据
if (window.opener && window.opener.UPDATE_LOG_DATA) {
    updateData = window.opener.UPDATE_LOG_DATA;
    originalData = [...updateData];
    displayUpdateLog();
} else {
    // 如果没有父页面数据,尝试从localStorage获取或显示错误
    const storedData = localStorage.getItem('updateLogData');
    if (storedData) {
        try {
            updateData = JSON.parse(storedData);
            originalData = [...updateData];
            displayUpdateLog();
        } catch (e) {
            showError('数据格式错误,请返回首页重新生成');
        }
    } else {
        showError('无法获取更新日志数据,请返回首页重新生成');
    }
}

3. 数据来源和结构

数据来源:

  • 直接从首页的DOM元素中实时提取
  • 查找所有带有 class="update-date"data-date 属性的元素
  • 获取其父级 <li> 元素的完整信息

提取的数据包括:

  • 标题: 链接文本内容
  • URL: 链接地址
  • 更新日期: data-date 属性值
  • 分类路径: 通过DOM树向上追溯获取完整路径
  • 备注: fa-info-circle 元素的 notes 属性
  • 备份链接: 带有 bei 类的图片链接

4. 触发方式

A. 手动触发:

function openUpdateLog() {
    // 确保更新日志系统已经初始化
    if (window.updateLogger && window.UPDATE_LOG_DATA) {
        // 将数据存储到localStorage作为备用
        localStorage.setItem('updateLogData', JSON.stringify(window.UPDATE_LOG_DATA));
        
        // 打开更新日志页面
        const updateLogWindow = window.open('update-log.html', '_blank');
        
        // 如果弹出窗口被阻止,给用户提示
        if (!updateLogWindow) {
            alert('请允许弹出窗口以查看更新日志');
        }
    } else {
        // 如果数据还没有准备好,等待一下再试
        setTimeout(() => {
            if (window.updateLogger && window.UPDATE_LOG_DATA) {
                openUpdateLog();
            } else {
                alert('更新日志数据正在加载中,请稍后再试');
            }
        }, 1000);
    }
}

B. URL参数触发:

  • 访问 index.html?generateUpdateLog=true 会自动生成更新日志

5. 实时性保证

  1. 页面加载时初始化: 每次刷新首页都会重新扫描所有更新数据
  2. 点击时重新获取: 每次点击”更新日志”按钮都会获取最新的DOM数据
  3. 无缓存依赖: 不依赖静态文件或数据库,直接从当前页面状态获取
  4. 自动同步: 当你在首页添加、修改或删除带更新日期的资源时,更新日志会自动反映这些变化

6. 数据传递机制

  • 主窗口到子窗口: 通过 window.opener.UPDATE_LOG_DATA 传递
  • 本地存储备份: 同时存储到 localStorage 作为备用
  • 全局变量: 在主窗口中维护 window.UPDATE_LOG_DATA 全局变量

这种设计确保了更新日志始终显示最新的数据状态,无需手动刷新或重新生成,实现了真正的”实时”数据获取。