SEUGPAHelper

帮助你快速计算绩点

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name SEUGPAHelper
// @description 帮助你快速计算绩点
// @version 0.1.0
// @match *://ehall.seu.edu.cn/jwapp/sys/cjcx/*
// @run-at document-end
// @namespace https://greasyfork.org/users/730743
// ==/UserScript==
(function () {
    'use strict';
    function loadMyScript() {
        if (document.querySelector('.bh-advancedQuery-totalNum') === null || document.querySelector('.bh-advancedQuery-totalNum').firstChild === null) { setTimeout(loadMyScript, 500); }
        else {
            alert('使用方法: 本插件计算所有列表中显示出来的绩点。若想要计算所有课程绩点,请选择务必全部,并务必在右下角选择每页显示100。\n\n使用技巧:在上一步基础上,使用高级搜索,筛选掉所有任选课程,避免课程数超出100导致无法计算。\n\n本插件不计算绩点的课程有军训、中西哲学智慧、中国戏曲艺术、吴健雄学院CPP课,所有任选课,所有通过/不通过课程')
            function getGrade(grade) {
                if (grade === '优') return 95;
                if (grade === '良') return 85;
                if (grade === '中') return 75;
                if (grade === '合格') return 65;
                if (grade === '不合格') return 59;
                else return parseFloat(grade);
            }
            function getGPA(grade) {
                if (grade <= 100 && grade >= 96) return 4.8;
                if (grade >= 93) return 4.5;
                if (grade >= 90) return 4.0;
                if (grade >= 86) return 3.8;
                if (grade >= 83) return 3.5;
                if (grade >= 80) return 3.0;
                if (grade >= 76) return 2.8;
                if (grade >= 73) return 2.5;
                if (grade >= 70) return 2.0;
                if (grade >= 66) return 1.8;
                if (grade >= 63) return 1.5;
                if (grade >= 60) return 1.0;
                else return 0;
            }
            function judgeLesson(lesson) {
                let lessonName = lesson.children[2].firstChild.innerHTML;
                let lessonFlag = lesson.children[6].firstChild.innerHTML;
                let lessonNotAllowed = ['军训', '中国戏曲艺术', '中西哲学智慧', '算法与程序设计'];
                if (lessonFlag === '任选') return false;
                if (lessonNotAllowed.indexOf(lessonName) !== -1) return false;
                return true;
            }
            function calclulate() {
                let totalNum = parseInt(document.querySelector('.bh-advancedQuery-totalNum').firstChild.innerHTML);
                let calclulatedNum = 0;
                let totalGPA = 0;
                let AVGgpa = 0;
                let totalGrade = 0;
                let AVGgrade = 0;
                let totalCredits = 0;
                let AllLessons;
                if (document.querySelector('#contentqb-index-table') !== null) {
                    AllLessons = document.querySelector('#contentqb-index-table').children[1].firstChild.firstChild.children[1].children;
                }
                else {
                    AllLessons = document.querySelector('#contentdqxq-index-table').children[1].firstChild.firstChild.children[1].children;
                }
                let htotalGPA=0,htotalGrade=0,htotalCredits=0;
                for (let i = 0; i < AllLessons.length; i++) {
                    if(AllLessons[i].children[9].innerHTML !== '通过' && AllLessons[i].children[9].innerHTML !== '不通过' && !isNaN(getGrade(AllLessons[i].children[9].innerHTML))){
                        calclulatedNum++;
                        let credit = parseFloat(AllLessons[i].children[7].firstChild.innerHTML);
                        let grade = getGrade(AllLessons[i].children[9].innerHTML);
                        let gpa = getGPA(grade);
                        htotalGPA += gpa * credit;
                        htotalGrade += grade * credit;
                        htotalCredits += credit;
                    }
                }
                console.log(`共查询到 ${totalNum}门课程\n计算了 ${calclulatedNum}门课程\n已获总学分为 ${htotalCredits},百分制均分为 ${htotalGrade/htotalCredits}\n4.8制度绩点为 ${htotalGPA/htotalCredits}`);
                calclulatedNum=0;
                for (let i = 0; i < AllLessons.length; i++) {
                    if (judgeLesson(AllLessons[i]) && AllLessons[i].children[9].innerHTML !== '通过' && AllLessons[i].children[9].innerHTML !== '不通过') {
                        calclulatedNum++;
                        let credit = parseFloat(AllLessons[i].children[7].firstChild.innerHTML);
                        let grade = getGrade(AllLessons[i].children[9].innerHTML);
                        let gpa = getGPA(grade);
                        totalGPA += gpa * credit;
                        totalGrade += grade * credit;
                        totalCredits += credit;
                    }
                }
                AVGgrade = totalGrade / totalCredits;
                AVGgpa = totalGPA / totalCredits;
                //alert(`共查询到 ${totalNum}门课程\n计算了 ${calclulatedNum}门课程\n已获总学分为 ${totalCredits}\n百分制均分为 ${AVGgrade}\n4.8制度绩点为 ${AVGgpa}`);
                let gpaText = document.createElement('div');
                gpaText.appendChild(document.createTextNode(`共查询到 ${totalNum}门课程,   计算了 ${calclulatedNum}门课程,   已获总学分为 ${totalCredits},   百分制均分为 ${AVGgrade},   4.8制度绩点为 ${AVGgpa}`));
                if (document.querySelector('.jqx-tabs-title-container').children.length == 3) { document.querySelector('.jqx-tabs-title-container').appendChild(gpaText); }
                else {document.querySelector('.jqx-tabs-title-container').children[3].innerHTML=`共查询到 ${totalNum}门课程,   计算了 ${calclulatedNum}门课程,   已获总学分为 ${totalCredits},   百分制均分为 ${AVGgrade},   4.8制度绩点为 ${AVGgpa}`}
            }
            let calcBtn = document.createElement('button');
            calcBtn.appendChild(document.createTextNode("计算绩点"));
            calcBtn.onclick = calclulate;
            document.querySelector('.jqx-tabs-title-container').appendChild(calcBtn);
        }
    }
    loadMyScript();
})();