Greasy Fork 支持简体中文。

云南大学校园网美化

云南大学自助服务平台(校园网)美化脚本

// ==UserScript==
// @name         云南大学校园网美化
// @namespace    https://greasyfork.org/zh-CN/scripts/476284-云南大学校园网美化
// @homepageURL  https://github.com/Steven-Zhl/4BetterBrowser/Scripts#云南大学校园网美化
// @version      1.2.1
// @license      GPL-3.0
// @description  云南大学自助服务平台(校园网)美化脚本
// @author       Steven-Zhl
// @icon         https://selfsrv.ynu.edu.cn/favicon.ico
// @match        https://selfsrv.ynu.edu.cn/*
// @exclude      https://selfsrv.ynu.edu.cn/login
// @grant        none
// ==/UserScript==

/**
 * 根据16进制颜色值和倍率计算新的颜色值
 * @param {string} hexColor - 16进制表示的颜色
 * @param {number[]} multipliers - R,G,B的倍率,在[0,1]之间
 * @returns {string} - 返回新的16进制颜色值,格式为#{RRGGBB}
 */
function MultiplyHexColor(hexColor, multipliers) {
    // 首先将16进制颜色值转换为RGB色值
    const originR = parseInt(hexColor.slice(1, 3), 16);
    const originG = parseInt(hexColor.slice(3, 5), 16);
    const originB = parseInt(hexColor.slice(5, 7), 16);
    // 分别将RGB色值与倍率相乘,并确保结果在0到255之间
    const R = Math.min(255, Math.max(0, Math.round(originR * multipliers[0])));
    const G = Math.min(255, Math.max(0, Math.round(originG * multipliers[1])));
    const B = Math.min(255, Math.max(0, Math.round(originB * multipliers[2])));
    // 将新的RGB值转换为16进制颜色值并返回
    const resultColor = `#${(R < 16 ? '0' : '') + R.toString(16)}${(G < 16 ? '0' : '') + G.toString(16)}${(B < 16 ? '0' : '') + B.toString(16)}`;
    return resultColor;
}

/**
 * 构建一个图片选择对话框
 * @param {string} titleInfo - 对话框标题
 * @param {string} localVariableName - localStorage中存储图片的变量名
 */
function QueryImage(titleInfo, localVariableName) {
    var dialog = document.createElement('dialog'); dialog.style.cssText = "border-radius: 10px; padding: 10px; text-align: center;";
    var title = document.createElement('h3'); title.innerText = titleInfo; title.style.cssText = "text-align: center; margin: 3px";
    var typeContainer = document.createElement('div'); typeContainer.style.margin = "3px";
    var buttonContainer = document.createElement('div'); buttonContainer.style.cssText = "height: 30px; margin: 3px; text-align: center";
    var tip = document.createElement('p'); tip.innerText = "图片类型: "; tip.style.cssText = "display: inline-block; vertical-align: middle; margin: 3px";
    var select = document.createElement('select'); select.title = "选择图片"; select.style.cssText = "display: inline-block; vertical-align: middle; margin: 3px";
    select.innerHTML = '<option value="local">本地图片</option><option value="online">在线图片</option>';
    var localInput = document.createElement('input'); localInput.type = 'file'; localInput.accept = "image/png, image/jpg, image/jpeg"; localInput.style.margin = "3px";
    var onlineInput = document.createElement('input'); onlineInput.type = 'hidden'; onlineInput.placeholder = "请粘贴图片链接"; onlineInput.style.margin = "3px";
    var yesButton = document.createElement('button'); yesButton.innerText = '确定'; yesButton.style.cssText = "display: inline-block; margin: 3px";
    var clearButton = document.createElement('button'); clearButton.innerText = '恢复默认'; yesButton.style.cssText = "display: inline-block; margin: 3px";
    var cancelButton = document.createElement('button'); cancelButton.innerText = '取消'; cancelButton.style.cssText = "display: inline-block; margin: 3px";
    dialog.className = 'dialog';
    dialog.appendChild(title);
    dialog.appendChild(typeContainer);
    dialog.appendChild(localInput);
    dialog.appendChild(onlineInput);
    dialog.appendChild(buttonContainer);
    typeContainer.appendChild(tip);
    typeContainer.appendChild(select);
    buttonContainer.appendChild(yesButton);
    buttonContainer.appendChild(cancelButton);
    buttonContainer.appendChild(clearButton);
    // 添加事件监听器
    select.addEventListener('change', function () {
        if (select.value === 'local') {
            localInput.type = 'file';
            onlineInput.type = 'hidden';
        }
        else if (select.value === 'online') {
            localInput.type = 'hidden';
            onlineInput.type = 'text';
        }
    });
    yesButton.addEventListener('click', function () {
        if (select.value === 'local' && localInput.files[0]) {
            const reader = new FileReader();
            reader.onload = function () {
                const img = new Image(); // 创建一个新的Image对象
                img.src = reader.result; // 设置Image对象的src为用户输入的文件链接
                try {
                    localStorage.setItem(localVariableName, reader.result);
                } catch (e) {
                    alert('图片文件过大,无法加载');
                    dialog.close();
                }
            };
            reader.readAsDataURL(localInput.files[0]);
            window.location.reload();
        } else if (select.value === 'online') {
            localStorage.setItem(localVariableName, onlineInput.value);
        }

    });
    clearButton.addEventListener('click', function () {
        localStorage.removeItem(localVariableName);
        alert('已恢复默认');
        window.location.reload();
    });
    cancelButton.addEventListener('click', function () { dialog.close(); });
    document.body.appendChild(dialog);
    dialog.showModal();
}

/**
 * 构建一个颜色选择对话框
 * @param {string} titleInfo - 对话框标题
 * @param {string} localVariableName - localStorage中存储颜色的变量名
 */
function QueryColor(titleInfo, localVariableName) {
    var dialog = document.createElement('dialog'); dialog.style.cssText = "border-radius: 10px; padding: 10px; text-align: center;";
    var title = document.createElement('h3'); title.innerText = titleInfo; title.style.cssText = "text-align: center; margin: 3px";
    var buttonContainer = document.createElement('div'); buttonContainer.style.cssText = "height: 30px; margin: 3px; text-align: center";
    var input = document.createElement('input'); input.type = 'color'; input.style.margin = "3px";
    var yesButton = document.createElement('button'); yesButton.innerText = '确定'; yesButton.style.cssText = "display: inline-block; margin: 3px";
    var clearButton = document.createElement('button'); clearButton.innerText = '恢复默认'; yesButton.style.cssText = "display: inline-block; margin: 3px";
    var cancelButton = document.createElement('button'); cancelButton.innerText = '取消'; cancelButton.style.cssText = "display: inline-block; margin: 3px";
    dialog.className = 'dialog';
    dialog.appendChild(title);
    dialog.appendChild(input);
    dialog.appendChild(buttonContainer);
    buttonContainer.appendChild(yesButton);
    buttonContainer.appendChild(cancelButton);
    buttonContainer.appendChild(clearButton);
    yesButton.addEventListener('click', function () {
        localStorage.setItem(localVariableName, input.value);
        window.location.reload();
    });
    clearButton.addEventListener('click', function () {
        localStorage.removeItem(localVariableName);
        alert('已恢复默认');
        window.location.reload();
    });
    cancelButton.addEventListener('click', function () { dialog.close(); });
    document.body.appendChild(dialog);
    dialog.showModal();
}

/**
 * 加载自定义主题色
 * @param {string} themeColor - 16进制表示的主题色
 */
function LoadThemeColor(themeColor) { // 将颜色替换为自定义主题色
    var headerColor = MultiplyHexColor(themeColor, [115 / 60, 202 / 141, 226 / 188]);
    var logoColor = MultiplyHexColor(themeColor, [54 / 60, 127 / 141, 169 / 188]);
    var header = document.getElementsByClassName("navbar navbar-static-top")[0];
    var sidebar = document.getElementsByClassName('sidebar-menu')[0];
    header.style.backgroundColor = themeColor;
    header.style.backgroundImage = 'linear-gradient(to right, ' + themeColor + ', ' + headerColor + ')';
    sidebar.getElementsByClassName('active')[0].firstChild.style.borderLeftColor = themeColor; // 修改sidebar的active元素的左边框颜色
    document.getElementsByClassName('logo')[0].style.backgroundColor = logoColor; // 修改logo的背景颜色
    document.getElementsByClassName('sidebar-toggle')[0].style.backgroundColor = themeColor; // 修改sidebar-toggle的背景颜色
    document.getElementsByClassName('user-header')[0].style.backgroundColor = themeColor; // 修改user-header的背景颜色
    document.getElementsByClassName('main-footer')[0].style.backgroundColor = themeColor; // 修改main-footer的背景颜色
}

/**
 * 加载自定义侧边栏颜色
 * @param {string} sidebarColor - 16进制表示的侧边栏颜色  
 */
function LoadSidebarColor(sidebarColor) {
    var sidebar = document.getElementsByClassName('sidebar-menu')[0];
    document.getElementsByClassName('main-sidebar')[0].style.backgroundColor = sidebarColor;
    document.querySelectorAll('.treeview-menu').forEach(function (treeviewMenu) {
        treeviewMenu.style.backgroundColor = sidebarColor;
    }); // 修改treeview-menu的背景颜色
    sidebar.style.color = sidebarColor;
    sidebar.querySelectorAll('li').forEach(function (li) {
        li.style.backgroundColor = sidebarColor;
        li.style.color = sidebarColor;
        if (li.firstChild.firstChild) li.firstChild.style.backgroundColor = sidebarColor;
    });
}

/**
 * 加载自定义头像
 * @param {string} avaterLink - 头像链接
 */
function LoadAvatar(avaterLink) { // 将图片链接替换为自定义头像
    if (!avaterLink) { return; }
    var avatar = document.getElementsByClassName('img-circle');
    for (let i = 0; i < avatar.length; i++)  avatar[i].src = avaterLink;
    document.getElementsByClassName('user-image')[0].src = avaterLink;
}

/**
 * 加载自定义背景图片
 * @param {string} backgroundLink - 背景图片链接
*/
function LoadBackground(backgroundLink) {
    if (!backgroundLink) { return; }
    var backgroundElement = document.getElementsByClassName('content-wrapper')[0];
    backgroundElement.style.background = 'url(' + backgroundLink + ')';
    backgroundElement.style.backgroundSize = 'cover';
    // 为了更好显示背景图片,需要让页面中的panel和panel-heading元素半透明
    document.querySelectorAll('.panel').forEach(function (panel) { panel.style.opacity = '0.75'; });
    document.querySelectorAll('.panel-heading').forEach(function (panel) { panel.style.opacity = '0.75'; });
}

/**
 * 加载原神主题(预设)
 */
function GenshinTheme() {
    LoadBackground('https://ys.mihoyo.com/main/_nuxt/img/poster.47f71d4.jpg');
    LoadAvatar('https://uploadstatic.mihoyo.com/contentweb/20210105/2021010518424084444.png');
    LoadThemeColor("#404040a0");
    LoadSidebarColor("#404040");
    var badge = document.createElement('img');
    badge.src = 'data:image/png;base64,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';
    badge.style.cssText = "position: fixed; bottom: 80px; right: 20px; width: 60px; height: auto;"
    document.body.appendChild(badge);
    document.getElementsByClassName('logo-lg')[0].firstChild.innerText = "云·原神";
    document.getElementsByClassName('logo-mini')[0].innerHTML = '<img src="https://webstatic.mihoyo.com/bh3/upload/officialsites/201908/ys_1565764084_7084.png" width="40px">';
    var icon = document.createElement('link'); icon.rel = 'icon'; icon.type = 'image/ico'; icon.href = 'https://ys.mihoyo.com/main/favicon.ico';
    document.head.appendChild(icon);
    document.getElementsByClassName('text-success')[0].parentElement.innerHTML = '<i class="fa fa-circle text-success"></i>提瓦特大陆';
}

/**
 * 为指定元素添加点击复制功能
 */
function ClickCopy(element) {
    element.addEventListener('click', function () {
        navigator.clipboard.writeText(element.innerText);
        alert('已复制到剪贴板');
    });
}

(function () {
    // 1. 在首页和/在线信息和日志/上网明细中,同步来自无感知认证的备注,并且为表格内容增添点击复制功能
    if (window.location.href == 'https://selfsrv.ynu.edu.cn/home' || window.location.href.match('https:\/\/selfsrv\.ynu\.edu\.cn\/log\/detail.*')) {
        fetch('https://selfsrv.ynu.edu.cn/user/mac-auth')
            .then(response => {
                if (!response.ok) { throw new Error('网络请求失败'); }
                return response.text();
            })
            .then(html => {
                const temp_div = document.createElement('div');// 创建一个临时div元素来解析HTML
                temp_div.innerHTML = html;
                const mac_list = temp_div.querySelector('.kv-grid-table.table.table-hover.table-bordered').querySelectorAll('tr');
                if (mac_list) {// 获取 mac地址-备注 的字典
                    var macDict = {};
                    var macElements = Array.from(mac_list).slice(1); // 跳过第一个元素
                    macElements.forEach(function (macElement) {
                        macDict[macElement.querySelectorAll('td')[1].innerText] =
                            macElement.querySelectorAll('td')[2].querySelector('.kv-editable-link').innerText;
                    });
                    if (window.location.href == 'https://selfsrv.ynu.edu.cn/home') {
                        // 将其添加到首页的在线信息中
                        var onlineTable = document.getElementsByClassName('kv-grid-table table table-bordered table-striped')[0];
                        var onlineTableHeader = document.getElementsByClassName('kv-table-header w1')[0];
                        onlineTableHeader.getElementsByTagName('tr')[0].innerHTML =
                            '<th>设备备注</th>' + onlineTableHeader.getElementsByTagName('tr')[0].innerHTML;
                        var onlineList = onlineTable.getElementsByTagName('tbody')[0];
                        for (let i = 0; i < onlineList.getElementsByTagName('tr').length; i++) {
                            var macAddr = onlineList.getElementsByTagName('tr')[i].getElementsByTagName('td')[5].innerText;
                            if (macAddr in macDict) {
                                onlineList.getElementsByTagName('tr')[i].innerHTML =
                                    '<td>' + macDict[macAddr] + '</td>' + onlineList.getElementsByTagName('tr')[i].innerHTML;
                            }
                            else {
                                onlineList.getElementsByTagName('tr')[i].innerHTML =
                                    '<td></td>' + onlineList.getElementsByTagName('tr')[i].innerHTML;
                            }
                        }
                        // 为每个<td>添加点击复制功能
                        onlineList.querySelectorAll('td').forEach(function (td) { ClickCopy(td); });
                    } else if (window.location.href.match('https:\/\/selfsrv\.ynu\.edu\.cn\/log\/detail.*')) {
                        // 将其添加到日志/上网明细中
                        var logTable = document.getElementsByClassName('kv-grid-table table table-hover table-bordered')[0];
                        var logTableHeader = document.getElementsByClassName('kv-table-header w0')[0];
                        logTableHeader.getElementsByTagName('tr')[0].innerHTML = '<th>设备备注</th>' + logTableHeader.getElementsByTagName('tr')[0].innerHTML;
                        var logList = logTable.getElementsByTagName('tbody')[0];
                        for (let i = 0; i < logList.getElementsByTagName('tr').length; i++) {
                            var macAddr = logList.getElementsByTagName('tr')[i].getElementsByTagName('td')[3].innerText;
                            if (macAddr in macDict) {
                                logList.getElementsByTagName('tr')[i].innerHTML =
                                    '<td>' + macDict[macAddr] + '</td>' + logList.getElementsByTagName('tr')[i].innerHTML;
                            } else {
                                logList.getElementsByTagName('tr')[i].innerHTML =
                                    '<td></td>' + logList.getElementsByTagName('tr')[i].innerHTML;
                            }
                        }
                        // 为每个<td>添加点击复制功能
                        logList.querySelectorAll('td').forEach(function (td) { ClickCopy(td); });
                    }
                } else { console.error('未找到目标元素'); }
            })
            .catch(error => {
                console.error('Error:', error);
            });
    }
    var sidebar = document.getElementsByClassName('sidebar-menu')[0];
    // 2. 自定义主题色
    var localThemeColor = localStorage.getItem('YNU-selfsrv-enhance-theme-color') ? localStorage.getItem('YNU-selfsrv-enhance-theme-color') : "#3c8dbc"; // 获取先前已设置的主题色
    var themeColorButton = document.createElement('li');// “自定义主题色”按钮
    themeColorButton.className = 'treeview';
    themeColorButton.innerHTML = '<a href="#" title="自定义主题色" ><i class="glyphicon glyphicon-heart"></i><span>自定义主题色</span></a>';
    themeColorButton.addEventListener('click', function () { QueryColor("请选择主题色", 'YNU-selfsrv-enhance-theme-color'); });
    sidebar.appendChild(themeColorButton);
    LoadThemeColor(localThemeColor);
    // 3. 自定义侧边栏颜色
    var local_siderbarColor = localStorage.getItem('YNU-selfsrv-enhance-sidebar-color') ? localStorage.getItem('YNU-selfsrv-enhance-sidebar-color') : "#222d32"; // 获取先前已设置的侧边栏颜色
    var sidebarColorButton = document.createElement('li');
    sidebarColorButton.className = 'treeview';
    sidebarColorButton.innerHTML = '<a href="#" title="自定义侧边栏颜色" ><i class="glyphicon glyphicon-tag"></i><span>自定义侧边栏颜色</span></a>';
    sidebarColorButton.addEventListener('click', function () { QueryColor("请选择侧边栏颜色", 'YNU-selfsrv-enhance-sidebar-color'); });
    sidebar.appendChild(sidebarColorButton);
    LoadSidebarColor(local_siderbarColor);
    // 4. 自定义头像
    var localAvaterLink = localStorage.getItem('YNU-selfsrv-enhance-avatar-link'); // 获取先前已设置的头像链接
    var avatarButton = document.createElement('li');// “更换头像”按钮
    avatarButton.className = 'treeview';
    avatarButton.innerHTML = '<a href="#" title="更换头像" ><i class="glyphicon glyphicon-user"></i><span>更换头像</span></a>';
    avatarButton.style.backgroundColor = local_siderbarColor;
    avatarButton.style.color = local_siderbarColor;
    avatarButton.firstChild.style.backgroundColor = local_siderbarColor;
    avatarButton.addEventListener('click', function () { QueryImage("选择头像图片", "YNU-selfsrv-enhance-avatar-link"); });
    sidebar.appendChild(avatarButton);
    if (localAvaterLink) { LoadAvatar(localAvaterLink); }
    // 5. 自定义背景图片
    var localBackgroundLink = localStorage.getItem('YNU-selfsrv-enhance-background-link'); // 获取先前已设置的背景图片链接
    var backgroundButton = document.createElement('li');// “更换背景图片”按钮
    backgroundButton.className = 'treeview';
    backgroundButton.innerHTML = '<a href="#" title="更换背景图片" ><i class="glyphicon glyphicon-picture"></i><span>更换背景图片</span></a>';
    backgroundButton.style.backgroundColor = local_siderbarColor;
    backgroundButton.style.color = local_siderbarColor;
    backgroundButton.firstChild.style.backgroundColor = local_siderbarColor;
    backgroundButton.addEventListener('click', function () { QueryImage("选择背景图片", "YNU-selfsrv-enhance-background-link"); });
    sidebar.appendChild(backgroundButton);
    if (localBackgroundLink) { LoadBackground(localBackgroundLink); }
    // 6. 原神,启动!
    var genshinButton = document.createElement('li');
    genshinButton.className = 'treeview';
    genshinButton.innerHTML = '<a href="#" title="原神,启动!" ><i class="glyphicon glyphicon-fire"></i><span>原神,启动!</span></a>';
    genshinButton.style.backgroundColor = local_siderbarColor;
    genshinButton.style.color = local_siderbarColor;
    genshinButton.firstChild.style.backgroundColor = local_siderbarColor;
    genshinButton.addEventListener('click', function () {
        if (!localStorage.getItem('YNU-selfsrv-enhance-genshin-mode')) {
            localStorage.setItem('YNU-selfsrv-enhance-genshin-mode', 'true');
            alert('原神,启动!');
        } else {
            localStorage.removeItem('YNU-selfsrv-enhance-genshin-mode');
            alert('原神,关闭!');
        }
        window.location.reload();
    });
    sidebar.appendChild(genshinButton);
    if (localStorage.getItem('YNU-selfsrv-enhance-genshin-mode')) { GenshinTheme(); }
})();