// ==UserScript==
// @name 智学网排名显示
// @namespace http://www.gzsofteasy.com/
// @version 2.1
// @description 智学网排名优化显示
// @author Frank Chen
// @license MPL
// @source https://github.com/cshuibo/ZhiXueWangRank
// @supportURL https://github.com/cshuibo/ZhiXueWangRank/issues/new/choose
// @match https://*.zhixue.com/activitystudy/web-report/index.html?from=web-container_top*
// @match https://*.zhixue.com/activitystudy/web-report/index.html?examId=*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// ==/UserScript==
const GLOBALDATA = {
classStatTotalNum:0,
gradeStatTotalNum:0,
unionStatTotalNum:0,
setClassStatTotalNum: (n) => {
GLOBALDATA.classStatTotalNum = n;
},
setGradeStatTotalNum: (n) => {
GLOBALDATA.gradeStatTotalNum = n;
},
setUnionStatTotalNum: (n) => {
GLOBALDATA.unionStatTotalNum = n;
},
data: {},
newCode: id => {
if (!!GLOBALDATA.data[id]) {
return;
}
GLOBALDATA.data[id] = {
number: 0,
subject: {},
};
},
addNumber: (id, n) => {
GLOBALDATA.newCode(id);
GLOBALDATA.data[id].number = n;
},
addRank: (id, n, o) => {
GLOBALDATA.newCode(id);
GLOBALDATA.data[id].subject[n] = {
rank: -1,
org: o,
};
},
calc: id => {
const e = GLOBALDATA.data[id];
const keys = Object.keys(e.subject);
if (e.number === 0 || keys.length === 0) {
return;
}
for (const ki in keys) {
const k = keys[ki];
if (e.subject[k].rank !== -1) {
return;
}
const percentage = e.subject[k].org;
const total = e.number;
const rank = Math.ceil(percentage / 100 * total);
GLOBALDATA.data[id].subject[k].rank = Math.min(Math.max(rank, 1), total);
}
display(id);
},
};
function display(id) {
let html = `
班级排行榜
考试人数 ${GLOBALDATA.data[id].number}
`;
const keys = Object.keys(GLOBALDATA.data[id].subject);
for (const ki in keys) {
const k = keys[ki];
html += `
${k}
第
${GLOBALDATA.data[id].subject[k].rank}
名
`;
}
html += `
`;
let rankDOM = document.createElement('div');
rankDOM.classList.add('hierarchy');
rankDOM.id = 'qianjuzhixuerank';
rankDOM.innerHTML = html;
document.querySelector('#report > div > div.report > div > div').insertBefore(rankDOM, document.querySelector('#report > div > div.report > div > div > div:nth-child(2)'));
}
function patchRequest(url, xhr) {
//alert(url);
if (url.indexOf('zhixuebao/report/exam/getSubjectDiagnosis') !== -1) {
xhr.addEventListener("load", patchGetSubjectDiagnosisOnReadyStateChange);
}
if (url.indexOf('zhixuebao/report/paper/getLevelTrend') !== -1) {
xhr.addEventListener("load", patchGetLevelTrendOnReadyStateChange);
}else if (url.indexOf('zhixuebao/report/exam/getLevelTrend') !== -1) {
xhr.addEventListener("load", patchGetLevelTrendOnReadyStateChange);
}
let element = document.querySelector("div.switch_tab_container");
if(element){
element.addEventListener('click', function(event) {
//console.log('元素被点击了!');
setTimeout(function() {
changeRankDisplay();
}, 100);
});
}
}
function patchGetSubjectDiagnosisOnReadyStateChange(proto) {
const xhr = proto.currentTarget;
if (xhr.readyState !== 4) {
return;
}
const code = xhr.responseURL.substring(72, 108);
const data = JSON.parse(xhr.response);
data.result.list.forEach(element => {
GLOBALDATA.addRank(code, element.subjectName, element.myRank);
});
GLOBALDATA.calc(code);
}
function patchGetLevelTrendOnReadyStateChange(proto) {
console.log(">>>patchGetLevelTrendOnReadyStateChange");
const xhr = proto.currentTarget;
if (xhr.readyState !== 4) {
return;
}
const responseURL = xhr.responseURL;
const code = xhr.responseURL.substring(66, 102);
const data = JSON.parse(xhr.response);
if(data.result.list.length > 0){
var classStatTotalNum=data.result.list[0].statTotalNum;
//alert(classStatTotalNum);
GLOBALDATA.setClassStatTotalNum(classStatTotalNum);
GLOBALDATA.addNumber(code, classStatTotalNum);
GLOBALDATA.calc(code);
}
if(data.result.list.length > 1){
var gradeStatTotalNum=data.result.list[1].statTotalNum;
//alert(gradeStatTotalNum);
GLOBALDATA.setGradeStatTotalNum(gradeStatTotalNum);
}
if(data.result.list.length > 2){
var unionStatTotalNum=data.result.list[2].totalNum;
//alert(unionStatTotalNum);
GLOBALDATA.setUnionStatTotalNum(unionStatTotalNum);
}
setTimeout(function() {
changeRankDisplay();
}, 1000);
}
function fetchComputedStyle(obj , property){
//能力检测
if(window.getComputedStyle){
//现在要把用户输入的property中检测一下是不是驼峰,转为连字符写法
//强制把用户输入的词儿里面的大写字母,变为小写字母加-
//paddingLeft → padding-left
property = property.replace(/([A-Z])/g , function(match,$1){
return "-" + $1.toLowerCase();
});
return window.getComputedStyle(obj)[property];
}else{
//IE只认识驼峰,我们要防止用户输入短横,要把短横改为大写字母
//padding-left → paddingLeft
property = property.replace(/\-([a-z])/g , function(match,$1){
return $1.toUpperCase();
});
return obj.currentStyle[property];
}
}
function getPercentage() {
var percent=0;
let runningElement = document.querySelector("div.class-running");
if(runningElement){
//alert(getElementLeftPercentage(runningElement));
var leftValue=fetchComputedStyle(runningElement,"left");
var widthValue=fetchComputedStyle(runningElement,"width");
leftValue = parseFloat(leftValue);
widthValue = parseFloat(widthValue);
//alert("leftValue:"+leftValue);
//alert("widthValue:"+widthValue);
percent=leftValue/widthValue;
}
return percent;
}
//根据百分比和人数计算排名
function getRank(startTotalNumber,percentage){
var rank=startTotalNumber*(1-percentage);
rank = Math.ceil(rank);
rank = Math.max(rank, 1)
return rank;
}
function changeRankDisplay(){
console.log(">>>changeRankDisplay");
let runningElement = document.querySelector("div.class-running");
if(runningElement){
var percentage=getPercentage();
var percentDisplay=(percentage)*100;
percentDisplay = parseFloat(percentDisplay.toFixed(2));
var startTotalNumber=1;
let element3 = document.querySelector("div>span.current");
if(element3){
//alert(element3.innerText);
if(element3.innerText==='班级'){
startTotalNumber=GLOBALDATA.classStatTotalNum;
}else if(element3.innerText==='年级'){
startTotalNumber=GLOBALDATA.gradeStatTotalNum;
}else{
startTotalNumber=GLOBALDATA.unionStatTotalNum;
}
}
//alert(GLOBALDATA.classStatTotalNum);
//alert(GLOBALDATA.gradeStatTotalNum);
//alert(GLOBALDATA.unionStatTotalNum);
var rank=getRank(startTotalNumber,percentage);
//alert("percent:"+percent);
var theElement = document.querySelector("h2");
if(theElement){
//theElement.innerText = '新的标题';
theElement.style.color='red';
theElement.innerText = "人数:"+startTotalNumber+" 排名:"+rank+" 超:"+percentDisplay+"%";
}
//let div = document.createElement("div");
//div.innerHTML ="成绩排名:"+leftValue+"";
//document.body.append(div);
}
}
function displayZhiXueRank() {
console.log(">>>displayZhiXueRank");
XMLHttpRequest.prototype._open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
patchRequest(url, this);
this._open(method, url, async, user, password);
};
}
(function() {
'use strict';
// Your code here...
displayZhiXueRank();
})();