信息查看器

logview2信息查看器

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/498149/1395619/%E4%BF%A1%E6%81%AF%E6%9F%A5%E7%9C%8B%E5%99%A8.js

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

(function() {
    'use strict';

    // 日志类型定义
    const LOG_TYPES = ['info', 'warning', 'error'];

    let logContainer; // 日志容器

    // 全局记录各种类型日志数量
    window.logCounts = {
        info: 0,
        warning: 0,
        error: 0
    };

    // 创建日志列表的容器
    logContainer = document.createElement('div');
    logContainer.style.position = 'fixed';
    logContainer.style.bottom = '20px'; // 距离底部 20px
    logContainer.style.right = '20px'; // 距离右侧 20px
    logContainer.style.zIndex = '9999';
    logContainer.style.padding = '10px';
    logContainer.style.backgroundColor = '#f0f0f0';
    logContainer.style.border = '1px solid #ccc';
    logContainer.style.width = '400px'; // 固定宽度
    logContainer.style.height = '300px'; // 固定高度
    logContainer.style.overflowY = 'auto'; // 垂直滚动条
    logContainer.style.overflowX = 'hidden'; // 隐藏水平滚动条
     logContainer.style.display = 'none'; // 初始不可见
    document.body.appendChild(logContainer);

    // 创建导出按钮
    const exportButton = document.createElement('button');
    exportButton.textContent = '导出 Errors';
    exportButton.style.position = 'fixed';
    exportButton.style.bottom = '50px'; // 距离底部 50px
    exportButton.style.right = '30px'; // 距离右侧 30px
    exportButton.style.zIndex = '10000'; // 比日志容器高
    exportButton.style.display = 'none'; // 初始不显示
    exportButton.addEventListener('click', () => {
        // 收集所有错误信息
        const errorLogs = Array.from(logContainer.querySelectorAll('.error')).map(log => log.textContent);
        const errorLogsText = errorLogs.join('\n');

        // 创建文本文件并下载
        const blob = new Blob([errorLogsText], { type: 'text/plain' });
        const url = URL.createObjectURL(blob);

        // 创建下载链接
        const downloadLink = document.createElement('a');
        downloadLink.href = url;
        downloadLink.download = 'error_logs.txt';
        downloadLink.style.display = 'none';
        document.body.appendChild(downloadLink);

        // 模拟点击下载链接
        downloadLink.click();

        // 清理资源
        URL.revokeObjectURL(url);
        document.body.removeChild(downloadLink);
    });
    document.body.appendChild(exportButton);

    // 创建隐藏按钮
    const hideButton = document.createElement('button');
    hideButton.textContent = 'Hide Logs';
    hideButton.style.position = 'fixed';
    hideButton.style.bottom = '20px'; // 距离底部 20px
    hideButton.style.right = '30px'; // 距离右侧 30px
    hideButton.style.zIndex = '10000'; // 比日志容器高
    hideButton.style.display = 'none'; // 初始不显示
    hideButton.addEventListener('click', () => {
        logContainer.style.display = 'none';
         
    hideButton.style.display = 'none';
    exportButton.style.display = 'none';
    });
    document.body.appendChild(hideButton);

    // 创建显示方法
    window.showLogContainer = function() {
        logContainer.style.display = 'block';
              hideButton.style.display = 'block';
    exportButton.style.display = 'block';
    };

    // 创建日志类型选择器
    const typeSelector = document.createElement('div');
    typeSelector.style.marginBottom = '10px';
    logContainer.appendChild(typeSelector);

    // 创建日志条目列表
    const logList = document.createElement('ul');
    logList.style.listStyleType = 'none';
    logContainer.appendChild(logList);

    // 函数:向日志列表中添加条目
    window.addToLog = function(message, type) {
        const logEntry = document.createElement('li');
        const options = { timeZone: 'Asia/Shanghai', hour12: false, hour: 'numeric', minute: 'numeric', second: 'numeric' };
        const currentTime = new Date().toLocaleTimeString('zh-CN', options); // 获取当前北京时间,中国格式,24小时制
        logEntry.textContent = `[${type.toUpperCase()}] ${currentTime} - ${message}`;
        logEntry.classList.add(type); // 添加类型类名

        // 根据日志类型设置不同的颜色样式
        if (type === 'info') {
            logEntry.style.color = '#3498db';
        } else if (type === 'warning') {
            logEntry.style.color = '#f39c12';
        } else if (type === 'error') {
            logEntry.style.color = '#e74c3c';
        }

        // 添加日志条目到日志列表的顶部
        logList.insertBefore(logEntry, logList.firstChild);

        // 更新日志类型计数
        window.logCounts[type]++;
        updateTypeButtonsDisplay();
    };

    // 函数:更新类型按钮显示的日志数量
    function updateTypeButtonsDisplay() {
        LOG_TYPES.forEach(type => {
            const button = getTypeButton(type);
            if (button) {
                const count = window.logCounts[type];
                button.textContent = `${type.charAt(0).toUpperCase()}${type.slice(1)} Logs (${count})`;
            }
        });

        // 更新 "All Logs" 按钮的显示
        const allLogsButton = getTypeButton('all');
        if (allLogsButton) {
            const totalLogs = Object.values(window.logCounts).reduce((acc, curr) => acc + curr, 0);
            allLogsButton.textContent = `All Logs (${totalLogs})`;
        }
    }

    // 函数:获取指定类型的按钮
    function getTypeButton(type) {
        return Array.from(typeSelector.children).find(btn => btn.textContent.toLowerCase().includes(type));
    }

    // 函数:清空日志列表和计数
    window.clearLogs = function() {
        logList.innerHTML = '';
        window.logCounts.info = 0;
        window.logCounts.warning = 0;
        window.logCounts.error = 0;

        updateTypeButtonsDisplay();
    };

    // 函数:根据选择的日志类型过滤显示
    window.filterLogs = function(type) {
        const logEntries = logList.getElementsByTagName('li');
        for (let i = 0; i < logEntries.length; i++) {
            const logEntry = logEntries[i];
            if (type === 'all' || logEntry.classList.contains(type)) {
                logEntry.style.display = 'block';
            } else {
                logEntry.style.display = 'none';
            }
        }
    };

    // 初始化:创建类型选择按钮
    const allLogsButton = document.createElement('button');
    allLogsButton.textContent = 'All Logs (0)';
    allLogsButton.addEventListener('click', () => window.filterLogs('all'));
    typeSelector.appendChild(allLogsButton);

    LOG_TYPES.forEach(type => {
        const typeButton = document.createElement('button');
        typeButton.textContent = `${type.charAt(0).toUpperCase()}${type.slice(1)} Logs (0)`;
        typeButton.addEventListener('click', () => window.filterLogs(type));
        typeSelector.appendChild(typeButton);
    });
})();