YNU-selfsrv-enhance

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

目前为 2023-09-28 提交的版本。查看 最新版本

// ==UserScript==
// @name         YNU-selfsrv-enhance
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  云南大学(校园网)自助服务平台增强脚本
// @author       Steven-Zhl
// @match        https://selfsrv.ynu.edu.cn/*
// @icon         http://ynu.edu.cn/favicon.ico
// @grant        none
// @license      Apache-2.0
// ==/UserScript==

function multiplyHexColor(hexColor, multipliers) {
    // 首先将16进制颜色值转换为RGB色值
    const r = parseInt(hexColor.slice(1, 3), 16);
    const g = parseInt(hexColor.slice(3, 5), 16);
    const b = parseInt(hexColor.slice(5, 7), 16);

    // 分别将RGB色值与倍率相乘,并确保结果在0到255之间
    const multipliedR = Math.min(255, Math.max(0, Math.round(r * multipliers[0])));
    const multipliedG = Math.min(255, Math.max(0, Math.round(g * multipliers[1])));
    const multipliedB = Math.min(255, Math.max(0, Math.round(b * multipliers[2])));

    // 将新的RGB值转换为16进制颜色值并返回
    const resultColor = `#${(multipliedR < 16 ? '0' : '') + multipliedR.toString(16)}${(multipliedG < 16 ? '0' : '') + multipliedG.toString(16)}${(multipliedB < 16 ? '0' : '') + multipliedB.toString(16)}`;

    return resultColor;
}
function input_avatar_link() {
    var userInput = prompt('请输入头像链接:');
    if (userInput !== null) {
        localStorage.setItem('YNU-selfsrv-enhance-avatar-link', userInput);// 将头像链接保存到本地
        window.location.reload();// 刷新页面
    }
}
function change_avatar() { // 将图片链接替换为自定义头像
    var saved_avatar_link = localStorage.getItem('YNU-selfsrv-enhance-avatar-link');
    if (saved_avatar_link) {
        var avatar = document.getElementsByClassName('img-circle');
        for (let i = 0; i < avatar.length; i++) { avatar[i].src = saved_avatar_link; }
        document.getElementsByClassName('user-image')[0].src = saved_avatar_link;
    }
}
function queryColor(tip_info, localVariableName) {
    // 在弹出窗口使用 <input type="color"> 元素来选择颜色
    var tips = document.createElement('div'); tips.className = "dialog-header"; tips.innerText = tip_info;
    var colorInput = document.createElement('input'); colorInput.type = 'color';
    var dialog = document.createElement('dialog'); dialog.style.borderRadius = '10px'; dialog.style.padding = '10px';
    var yesButton = document.createElement('button'); yesButton.innerText = '确定';
    var cancelButton = document.createElement('button'); cancelButton.innerText = '取消';
    dialog.className = 'dialog';
    dialog.appendChild(tips);
    dialog.appendChild(colorInput);
    dialog.appendChild(yesButton);
    dialog.appendChild(cancelButton);
    document.body.appendChild(dialog);
    dialog.showModal();
    yesButton.addEventListener('click', function () { dialog.close(); localStorage.setItem(localVariableName, colorInput.value); window.location.reload(); });
    cancelButton.addEventListener('click', function () { dialog.close(); });
}

(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 tempDiv = document.createElement('div');// 创建一个临时div元素来解析HTML
                tempDiv.innerHTML = html;
                const mac_list = tempDiv.querySelector('.kv-grid-table.table.table-hover.table-bordered').querySelectorAll('tr');
                if (mac_list) {// 获取 mac地址-备注 的字典
                    var mac_dict = {};
                    var macElements = Array.from(mac_list).slice(1); // 跳过第一个元素
                    macElements.forEach(function (macElement) {
                        mac_dict[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 online_table = document.getElementsByClassName('kv-grid-table table table-bordered table-striped')[0];
                        var online_table_header = document.getElementsByClassName('kv-table-header w1')[0];
                        online_table_header.getElementsByTagName('tr')[0].innerHTML = '<th>设备备注</th>' + online_table_header.getElementsByTagName('tr')[0].innerHTML;
                        var online_list = online_table.getElementsByTagName('tbody')[0];
                        for (let i = 0; i < online_list.getElementsByTagName('tr').length; i++) {
                            var mac_addr = online_list.getElementsByTagName('tr')[i].getElementsByTagName('td')[5].innerText;
                            if (mac_addr in mac_dict) {
                                online_list.getElementsByTagName('tr')[i].innerHTML = '<td>' + mac_dict[mac_addr] + '</td>' + online_list.getElementsByTagName('tr')[i].innerHTML;
                            } else {
                                online_list.getElementsByTagName('tr')[i].innerHTML = '<td></td>' + online_list.getElementsByTagName('tr')[i].innerHTML;
                            }
                        }
                    } else if (window.location.href.match('https:\/\/selfsrv\.ynu\.edu\.cn\/log\/detail.*')) {
                        // 将其添加到日志/上网明细中
                        var log_table = document.getElementsByClassName('kv-grid-table table table-hover table-bordered')[0];
                        var log_table_header = document.getElementsByClassName('kv-table-header w0')[0];
                        log_table_header.getElementsByTagName('tr')[0].innerHTML = '<th>设备备注</th>' + log_table_header.getElementsByTagName('tr')[0].innerHTML;
                        var log_list = log_table.getElementsByTagName('tbody')[0];
                        for (let i = 0; i < log_list.getElementsByTagName('tr').length; i++) {
                            var mac_addr = log_list.getElementsByTagName('tr')[i].getElementsByTagName('td')[3].innerText;
                            if (mac_addr in mac_dict) {
                                log_list.getElementsByTagName('tr')[i].innerHTML = '<td>' + mac_dict[mac_addr] + '</td>' + log_list.getElementsByTagName('tr')[i].innerHTML;
                            } else {
                                log_list.getElementsByTagName('tr')[i].innerHTML = '<td></td>' + log_list.getElementsByTagName('tr')[i].innerHTML;
                            }
                        }
                    }
                } else { console.error('未找到目标元素'); }
            })
            .catch(error => {
                console.error('Error:', error);
            });
    }
    // 2. 允许自定义头像
    var saved_avatar_link = localStorage.getItem('YNU-selfsrv-enhance-avatar-link'); // 获取先前已设置的头像链接
    var change_avatar_button = document.createElement('button');// “更换头像”按钮
    change_avatar_button.className = 'change_avatar_button btn btn-default btn-flat';
    change_avatar_button.innerText = '更换头像';
    document.getElementsByClassName('user-footer')[0].firstChild.appendChild(change_avatar_button);// 添加“更换头像”按钮
    change_avatar_button.addEventListener('click', function () { input_avatar_link(); change_avatar(); });
    if (saved_avatar_link) { change_avatar(); }
    // 3. 自定义主题色
    var bench_mark_color = '#3c8dbc';
    if (localStorage.getItem('YNU-selfsrv-enhance-theme-color')) { bench_mark_color = localStorage.getItem('YNU-selfsrv-enhance-theme-color'); }
    var header_light_color = multiplyHexColor(bench_mark_color, [115 / 60, 202 / 141, 226 / 188]);
    var logo_color = multiplyHexColor(bench_mark_color, [54 / 60, 127 / 141, 169 / 188]);
    var header = document.getElementsByClassName("navbar navbar-static-top")[0];
    var sidebar = document.getElementsByClassName('sidebar-menu')[0];
    var modify_theme_color = document.createElement('li');
    modify_theme_color.className = 'treeview';
    modify_theme_color.innerHTML = '<a href="#" title="自定义主题色" ><i class="glyphicon glyphicon-heart"></i><span>自定义主题色</span></a>';
    modify_theme_color.addEventListener('click', function () { queryColor("请选择主题色", 'YNU-selfsrv-enhance-theme-color'); });
    sidebar.appendChild(modify_theme_color);
    header.style.backgroundColor = bench_mark_color;
    header.style.backgroundImage = 'linear-gradient(to right, ' + bench_mark_color + ', ' + header_light_color + ')';
    sidebar.getElementsByClassName('active')[0].firstChild.style.borderLeftColor = bench_mark_color; // 修改sidebar的active元素的左边框颜色
    document.getElementsByClassName('logo')[0].style.backgroundColor = logo_color; // 修改logo的背景颜色
    document.getElementsByClassName('sidebar-toggle')[0].style.backgroundColor = bench_mark_color; // 修改sidebar-toggle的背景颜色
    document.getElementsByClassName('user-header')[0].style.backgroundColor = bench_mark_color; // 修改user-header的背景颜色
    // 4. 自定义侧边栏颜色
    var sidebar_color = '#222d32';
    if (localStorage.getItem('YNU-selfsrv-enhance-sidebar-color')) { sidebar_color = localStorage.getItem('YNU-selfsrv-enhance-sidebar-color'); }
    var modify_sidebar_color = document.createElement('li');
    modify_sidebar_color.className = 'treeview';
    modify_sidebar_color.innerHTML = '<a href="#" title="自定义侧边栏颜色" ><i class="glyphicon glyphicon-tag"></i><span>自定义侧边栏颜色</span></a>';
    modify_sidebar_color.addEventListener('click', function () { queryColor("请选择侧边栏颜色", 'YNU-selfsrv-enhance-sidebar-color'); });
    sidebar.appendChild(modify_sidebar_color);
    document.getElementsByClassName('main-sidebar')[0].style.backgroundColor = sidebar_color;
    document.querySelectorAll('.treeview-menu').forEach(function (treeview_menu) { treeview_menu.style.backgroundColor = sidebar_color; }); // 修改treeview-menu的背景颜色
    sidebar.style.color = sidebar_color;
    sidebar.querySelectorAll('li').forEach(function (li) {
        li.style.backgroundColor = sidebar_color;
        li.style.color = sidebar_color;
        if (li.firstChild.firstChild) { console.log(li.firstChild); li.firstChild.style.backgroundColor = sidebar_color; }
    });
    // 5. 自定义背景图片
    var background_link = localStorage.getItem('YNU-selfsrv-enhance-background-link');
    var modify_background_image = document.createElement('li');// “更换背景图片”按钮
    modify_background_image.className = 'treeview';
    modify_background_image.innerHTML = '<a href="#" title="自定义背景图片" ><i class="glyphicon glyphicon-picture"></i><span>自定义背景图片</span></a>';
    modify_background_image.style.backgroundColor = sidebar_color;
    modify_background_image.style.color = sidebar_color;
    modify_background_image.firstChild.style.backgroundColor = sidebar_color;
    modify_background_image.addEventListener('click', function () {
        var backgroundInput = prompt('请输入背景图片链接:');
        if (backgroundInput !== null) {
            localStorage.setItem('YNU-selfsrv-enhance-background-link', backgroundInput);// 将头像链接保存到本地
            window.location.reload();// 刷新页面
        }
    });
    sidebar.appendChild(modify_background_image);
    if (background_link) {
        var backgroundElement = document.getElementsByClassName('content-wrapper')[0];
        backgroundElement.style.background = 'url(' + background_link + ')';
        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'; });
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址