您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Добавляет кнопки с иконками, стилизация и всплывающие подсказки сверху
// ==UserScript== // @name Hero.Study навигация+ // @namespace Violentmonkey Scripts // @match https://admin.aogu.hero.study/ru/learner* // @match https://admin.aogu.hero.study/ru/learner/view* // @match https://admin.aogu.hero.study/ru/diplom/* // @match https://admin.aogu.hero.study/ru/diplom/view* // @match https://admin.aogu.hero.study/ru/graduate/* // @grant none // @version 1.1 // @author Steam-G // @description Добавляет кнопки с иконками, стилизация и всплывающие подсказки сверху // ==/UserScript== (function() { 'use strict'; const BUTTON_STYLE = ` margin-left: 10px; padding: 6px; color: black; background: #ffffff00; border-radius: 50%; text-decoration: none; font-size: 20px; display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; box-shadow: 0 2px 6px rgba(0,0,0,0.2); transition: all 0.3s ease; position: relative; `; const TOOLTIP_STYLE = ` position: absolute; top: -32px; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.75); color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 0.2s ease; z-index: 9999; `; function waitForElement(selector, callback) { const targetNode = document.body; const observerOptions = { childList: true, subtree: true }; const observer = new MutationObserver(() => { const el = document.querySelector(selector); if (el) { observer.disconnect(); callback(el); } }); observer.observe(targetNode, observerOptions); } const path = window.location.pathname; function createButtons(studentId, containerElement, buttons) { const wrapper = document.createElement('div'); wrapper.style.display = 'inline-flex'; wrapper.style.alignItems = 'center'; wrapper.style.gap = '8px'; containerElement.parentNode.insertBefore(wrapper, containerElement); wrapper.appendChild(containerElement); buttons.forEach(({ label, url, icon }) => { const button = document.createElement('a'); button.href = url(studentId); button.innerText = icon; button.style.cssText = BUTTON_STYLE; const tooltip = document.createElement('span'); tooltip.textContent = label; tooltip.style.cssText = TOOLTIP_STYLE; button.appendChild(tooltip); button.onmouseenter = () => { button.style.transform = 'scale(1.15)'; tooltip.style.opacity = '1'; }; button.onmouseleave = () => { button.style.transform = 'scale(1)'; tooltip.style.opacity = '0'; }; wrapper.appendChild(button); }); } if (path.includes('/ru/learner/view')) { waitForElement('h1', (headerElement) => { const urlParams = new URLSearchParams(window.location.search); const studentId = urlParams.get('id'); if (!studentId || isNaN(studentId)) { console.log('ID студента не найден в параметрах URL.'); return; } const BUTTONS = [ { label: 'Транскрипт', url: id => `https://admin.aogu.hero.study/ru/transcript/view?id=${id}`, icon: '📄' }, { label: 'Диплом', url: id => `https://admin.aogu.hero.study/ru/diplom/view?id=${id}`, icon: '🎓' } ]; createButtons(studentId, headerElement, BUTTONS); }); } else if (path.includes('/ru/learner/')) { const BUTTONS = [ { label: 'Транскрипт', url: id => `https://admin.aogu.hero.study/ru/transcript/view?id=${id}`, icon: '📄' }, { label: 'Диплом', url: id => `https://admin.aogu.hero.study/ru/diplom/view?id=${id}`, icon: '🎓' } ]; waitForElement('h1.ellipse-text.line-2', (studentNameElement) => { const urlParts = window.location.pathname.split('/'); const studentId = urlParts.pop(); if (!studentId || isNaN(studentId)) { console.log('ID студента не найден в URL.'); return; } createButtons(studentId, studentNameElement, BUTTONS); }); } else if (path.includes('/ru/diplom/view')) { waitForElement('h1', (headerElement) => { const urlParams = new URLSearchParams(window.location.search); const studentId = urlParams.get('id'); if (!studentId || isNaN(studentId)) { console.log('ID студента не найден в параметрах URL.'); return; } const studentLink = { label: 'Профиль студента', url: id => `https://admin.aogu.hero.study/ru/learner/${id}`, icon: '👤' }; createButtons(studentId, headerElement, [studentLink]); }); } else if (path.includes('/ru/diplom/')) { waitForElement('h1', (headerElement) => { const urlParts = window.location.pathname.split('/'); const studentId = urlParts.pop(); if (!studentId || isNaN(studentId)) { console.log('ID студента не найден в URL.'); return; } const studentLink = { label: 'Профиль студента', url: id => `https://admin.aogu.hero.study/ru/learner/${id}`, icon: '👤' }; createButtons(studentId, headerElement, [studentLink]); }); } else if (path.includes('/ru/graduate/')) { const BUTTONS = [ { label: 'Транскрипт', url: id => `https://admin.aogu.hero.study/ru/transcript/view?id=${id}`, icon: '📄' }, { label: 'Диплом', url: id => `https://admin.aogu.hero.study/ru/diplom/view?id=${id}`, icon: '🎓' } ]; waitForElement('h1.ellipse-text.line-2', (studentNameElement) => { const urlParts = window.location.pathname.split('/'); const studentId = urlParts.pop(); if (!studentId || isNaN(studentId)) { console.log('ID студента не найден в URL.'); return; } createButtons(studentId, studentNameElement, BUTTONS); }); } })();