function toggleHide() { $(".hidable").toggle(1000); }; var postKnownExams = '3129,3096,3132,3101,3104,3087,3111,3092,3116,3067,3061,3121,3122,3123,3124,3125,3126,3127,3128,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146' var knownExams = '' for (let i = 3000; i < 3200; i++)knownExams += i.toString() + ',' knownExams = knownExams.slice(0, knownExams.length - 1) // AV.init({ // appId: "BmologYYnRqCv0SLHDeDdA17-gzGzoHsz", // appKey: "w9mVebFMdCmY6Nh9vfcBGaGt", // serverURL: "https://bmologyy.lc-cn-n1-shared.com/", // }); console.log("温馨提示:*成绩*一定不会上传到网络,但为了保证使用范围,可能会对其他信息进行记录。") function decimal(x, n) { x = Math.round(x * 10 ** n) / 10 ** n; return x.toFixed(n); } var fileCount = 0, cur = 0, files = {}; function prevFile() { cur = (cur - 1 + fileCount) % fileCount; processFiles(); } function nextFile() { cur = (cur + 1) % fileCount; processFiles(); } function clearScreen() { $(".chart").hide() $("#fileOutput")[0].innerHTML = ""; // $("#fileInfo")[0].innerHTML = ""; $("#name")[0].innerHTML = ""; } document.onkeydown = function (event) { var e = event || window.event || arguments.callee.caller.arguments[0]; if (e) { if (e.key == "ArrowLeft") { prevFile(); } else if (e.key == "ArrowRight") { nextFile(); } } }; function getFiles(event) { files[fileCount] = event.target.files[0]; cur = fileCount; fileCount++; $("#controls").removeClass("disabled"); $("#lbtn").removeClass("disabled"); $("#rbtn").removeClass("disabled"); processFiles(1); } const key = CryptoJS.enc.Utf8.parse("abcdefgabcdefg12"); function aesDecrypt(encrypted) { var cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext: CryptoJS.enc.Hex.parse(encrypted) }) var decrypted = CryptoJS.AES.decrypt(cipherParams, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return decrypted.toString(CryptoJS.enc.Utf8); } function aesEncrypt(encrypted) { return CryptoJS.AES.encrypt(encrypted, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).ciphertext.toString(); } function stringToByte(str) { var bytes = new Array(); var len, c; len = str.length; for (var i = 0; i < len; i++) { c = str.charCodeAt(i); if (c >= 0x010000 && c <= 0x10FFFF) { bytes.push(((c >> 18) & 0x07) | 0xF0); bytes.push(((c >> 12) & 0x3F) | 0x80); bytes.push(((c >> 6) & 0x3F) | 0x80); bytes.push((c & 0x3F) | 0x80); } else if (c >= 0x000800 && c <= 0x00FFFF) { bytes.push(((c >> 12) & 0x0F) | 0xE0); bytes.push(((c >> 6) & 0x3F) | 0x80); bytes.push((c & 0x3F) | 0x80); } else if (c >= 0x000080 && c <= 0x0007FF) { bytes.push(((c >> 6) & 0x1F) | 0xC0); bytes.push((c & 0x3F) | 0x80); } else { bytes.push(c & 0xFF); } } return bytes; } $().ready(function () { $("#Input").keydown(function (e) { if (e.keyCode == 13) { $("#fetchBtn")[0].click(); } }); }) var stuId = {}, examId = {} function fetchDo(id) { var bd = '{"meId":' + $('#Id').val() + ',"seIds":"' + knownExams + '","schoolId":19707,"studentId":"' + id + '"}'; console.log(bd) bd = aesEncrypt(bd) console.log(bd) fetch('http://36.112.23.77/analysis/api/student/exam/getStudentReportMEVO', { method: 'POST', headers: { 'Content-type': 'application/json', }, body: bd }).then(res => { res.text().then(resj => { files[fileCount] = new Blob([resj], { type: 'text/plain' });; cur = fileCount; fileCount++; $("#controls").removeClass("disabled"); $("#lbtn").removeClass("disabled"); $("#rbtn").removeClass("disabled"); processFiles(1); }); }) } function fetchMe(id) { if (!parseInt(id)) { fetch('/js/e.json', { method: 'GET', headers: { 'Content-type': 'application/json', } }).then(res => { res.json().then(resj => { var queryData = resj.data.filter(function (e) { return e.name == id }); fetchDo(queryData[0].no) }); }) } else fetchDo(id) } function getSe(id) { console.log(id) if (!stuId[cur]) stuId[cur] = prompt('数字校园号?') if (!examId[cur]) examId[cur] = prompt('考试编号?(心意答点击考试标题后,切换考试的列表里可见)') var bd = '{"schoolId":19707,"seId":' + id + ',"studentId":"' + stuId[cur] + '"}'; console.log(bd) bd = aesEncrypt(bd) fetch('http://36.112.23.77/analysis/api/student/exam/getStudentReportSEVO', { method: 'POST', headers: { 'Content-type': 'application/json', }, body: bd }).then(res => { res.json().then(resj => { // $('#singleDat').html(aesDecrypt(resj.data)) }); }) bd = '{"schoolId":19707,"meId":' + examId[cur] + ',"seId":' + id + ',"studentId":"' + stuId[cur] + '"}'; console.log(bd) bd = aesEncrypt(bd) fetch('http://36.112.23.77/analysis/api/student/exam/getStuExamDetailInfo', { method: 'POST', headers: { 'Content-type': 'application/json', }, body: bd }).then(res => { res.json().then(resj => { $('#singleDat').html(aesDecrypt(resj.data)) }); }) } function processFiles(isFirstTime = 0) { console.log("Start processing No. " + cur); var file = files[cur]; var message = $("#message")[0]; var upBtn = $("#upbtn")[0]; var upIcon = $("#upicon")[0]; var tableLayout = '' message.innerHTML = (cur + 1) + "/" + (fileCount) + " - " + file.name + " - " + file.size + " 字节 - " + file.type + " - 正在读取...
>"; upBtn.classList.remove('btn-danger'); upBtn.classList.add('btn-info'); upIcon.classList.remove('glyphicon-exclamation-sign'); upIcon.classList.add('glyphicon-open'); var reader = new FileReader(); reader.onload = function (event) { try { var output = $("#fileOutput")[0]; var info = $("#fileInfo")[0]; var name = $("#name")[0]; var object = eval("(" + event.target.result + ")"); var classText = "", gradingText = ""; $('#single').empty(); object.data = eval("(" + aesDecrypt(object.data).toString() + ")"); examId[cur] = object.data.meId.toString(); stuId[cur] = object.data.studentId; console.log(examId[cur], stuId[cur]) info.innerHTML = "

" + object.data.multiExam.meName + "

" console.log(object.data.multiExam.meName) var seIds = [], seNames = [], iter = 1; var datSingle = object.data.multiExamStudentScore.singleExamStudentScores, datClass = object.data.singleExamClassScores, datYs = object.data.singleExamClassYsScores, datMulti = object.data.multiExam.singleExams; seIds = object.data.seIds; for (var i = 0; i < seIds.length; i++) { for (var j = 0; j < seIds.length; j++) { if (datMulti[i].seId == seIds[j]) { seNames[j] = datMulti[i].seCourseName; } } } // console.log(seIds) // console.log(seNames) var seNameDic = {}; for (var i = 0; i < seIds.length; i++) { seNameDic[seIds[i]] = seNames[i]; } seNameDic["0"] = "总分"; for (var i = 0; i < datYs.length; i++) { seNameDic[datYs[i].seId + "Ys"] = seNameDic[datYs[i].seId] + " " + datYs[i].ysClassId; } var seIdDic = {}, seIdRev = {}, hasId = {}; for (var i = 0; i < seIds.length; i++) { for (var j = 0; j < seIds.length; j++) { if (!datSingle[j]) continue; if (datSingle[j].seId == seIds[i]) { hasId[i] = true; seIdDic[j] = i; } } } for (var i = 1; i < seIds.length; i++) { if (!hasId[i]) seIds[i] = -1 } for (var i = 0; i < seIds.length; i++)seIdRev[seIdDic[i]] = i; var scoreP = {}, avgP = {}, rate0 = {}, rate25 = {}, rate50 = {}, rate75 = {}, rate100 = {}, rateFull = {};//表1用 var classOrderP = {}, ysClassOrderP = {}, gradeOrderP = {}; var classOrder = {}, ysClassOrder = {}, gradeOrder = {}; for (var i = 0; i < seIds.length; i++) { if (!datSingle[i]) continue; var dId = datSingle[i].seId; scoreP[dId] = datSingle[i].essScore; avgP[dId] = datClass[i].secsAvgScore; rate0[dId] = datClass[i].secsMinScore; rate25[dId] = datClass[i].secsQuarterScore; rate50[dId] = datClass[i].secsHalfScore; rate75[dId] = datClass[i].secs3quatrerScore; rate100[dId] = datClass[i].secsMaxScore; rateFull[dId] = datMulti[seIdDic[i]].seFullScore; classOrderP[dId] = datSingle[i].essClassOrder; gradeOrderP[dId] = datSingle[i].essGradeOrder; classOrder[dId] = decimal(1 - datSingle[i].essClassOrder / datClass[i].secsStudentCount, 3); gradeOrder[dId] = decimal(1 - datSingle[i].essGradeOrder / datMulti[seIdDic[i]].seStudentCount, 3); } classOrder["0"] = decimal(1 - object.data.multiExamStudentScore.messClassOrder / object.data.multiExamClassScores[0].mecsStudentCount, 3); + "
" gradeOrder["0"] = decimal(1 - object.data.multiExamStudentScore.messGradeOrder / object.data.multiExamSchoolScore.mecsStudentCount, 3); + "
" classOrderP["0"] = object.data.multiExamStudentScore.messClassOrder; gradeOrderP["0"] = object.data.multiExamStudentScore.messGradeOrder for (var i = 0; i < datYs.length; i++) { for (var j = 0; j < seIds.length; j++) { if (!datSingle[j]) continue; if (datYs[i].seId == datSingle[j].seId) { ysClassOrder[datYs[i].seId + "Ys"] = decimal(1 - datSingle[j].essYsClassOrder / datYs[i].secsStudentCount, 3); ysClassOrderP[datYs[i].seId + "Ys"] = datSingle[j].essYsClassOrder; } } } for (var i = 0; i < seIds.length; i++) { // object.data.multiExamStudentScore.singleExamStudentScores[i].seId ---datSingle // object.data.singleExamClassScores[i].seId ---datClass // object.data.multiExam.singleExams[i].seId ---datMulti // seIds[i] // 前两个和后两个数据应该是能分别对上号的(1-2 3-4),用 seIdDic 连接 // seIdDic {key(1-2): value(3-4),..} var g = seIdRev[i]; if (!datSingle[g]) continue; $('#single').append('') classText += "

" + seNameDic[datSingle[g].seId] + "

" + "单科分数:" + datSingle[g].essScore + "

" + "单科分数班级排名:" + datSingle[g].essClassOrder + "
" + "单科班级参考人数:" + datClass[g].secsStudentCount + "
" + "单科班级年级排名:" + datClass[g].secsClassOrder + "
" + "单科班级:" + tableLayout + '' + "
平均分最高分四分位数(75%)中位数四分位数(25%)最低分
" + datClass[g].secsAvgScore + "" + datClass[g].secsMaxScore + "" + datClass[g].secs3quatrerScore + "" + datClass[g].secsHalfScore + "" + datClass[g].secsQuarterScore + "" + datClass[g].secsMinScore + "
"; for (var j = 0; j < datYs.length; j++) { if (datYs[j].seId == datSingle[g].seId) { classText += "

" + "单科分层班级名称:" + datYs[j].ysClassId + "
" + "单科分数分层班级排名:" + datSingle[g].essYsClassOrder + "
" + "单科分层班级参考人数:" + datYs[j].secsStudentCount + "
" + "单科分层班级年级排名:" + datYs[j].secsClassOrder + "
" + "单科分层班级:" + tableLayout + '平均分最高分四分位数(75%)中位数四分位数(25%)最低分' + "" + datYs[j].secsAvgScore + "" + datYs[j].secsMaxScore + "" + datYs[j].secs3quatrerScore + "" + datYs[j].secsHalfScore + "" + datYs[j].secsQuarterScore + "" + datYs[j].secsMinScore + ""; } } classText += "

" + "单科分数年级排名:" + datSingle[g].essGradeOrder + "
" + "单科年级参考人数:" + datMulti[seIdDic[g]].seStudentCount + "
" + "单科年级:" + tableLayout + '平均分最高分四分位数(75%)中位数四分位数(25%)最低分' + "" + datMulti[seIdDic[g]].seAvgScore + "" + datMulti[seIdDic[g]].seMaxScore + "" + datMulti[seIdDic[g]].se3QuarterScore + "" + datMulti[seIdDic[g]].seHalfScore + "" + datMulti[seIdDic[g]].seQuarterScore + "" + datMulti[seIdDic[g]].seMinScore + "

"; } } catch (e) { console.log(e); clearScreen(); message.innerHTML += "读取失败!"; upBtn.classList.remove('btn-info'); upBtn.classList.add('btn-danger'); upIcon.classList.remove('glyphicon-open'); upIcon.classList.add('glyphicon-exclamation-sign'); return; } $('#single').append('



') if (isFirstTime) { var bd = JSON.stringify({ content: object.data.multiExamStudentScore.studentName + ' ' + parseInt(object.data.examStudents[0].classId), }) fetch('/score/log', { method: 'POST', headers: { 'Content-type': 'application/json', }, body: bd }) } message.innerHTML += "读取成功!" + " - 注:实验中学 74 桌出品,我仅做搬运修改。
"; name.innerHTML = "姓名:" + object.data.multiExamStudentScore.studentName; info.innerHTML = "

" + object.data.multiExam.meName + "

" + "行政班级:" + object.data.examStudents[0].classId + "
" + "姓名:" + object.data.multiExamStudentScore.studentName + "
"; output.innerHTML = "

总分

" + "全科分数:" + object.data.multiExamStudentScore.messScore + "

" + "全科分数班级排名:" + object.data.multiExamStudentScore.messClassOrder + "
" + "全科班级参考人数:" + object.data.multiExamClassScores[0].mecsStudentCount + "
" + "全科班级年级排名:" + object.data.multiExamClassScores[0].mecsClassOrder + "
" + "全科班级:" + tableLayout + '平均分最高分四分位数(75%)中位数四分位数(25%)最低分' + "" + object.data.multiExamClassScores[0].mecsAvgScore + "" + object.data.multiExamClassScores[0].mecsMaxScore + "" + object.data.multiExamClassScores[0].mecs3quatrerScore + "" + object.data.multiExamClassScores[0].mecsHalfScore + "" + object.data.multiExamClassScores[0].mecsQuarterScore + "" + object.data.multiExamClassScores[0].mecsMinScore + "" + "

全科分数年级排名:" + object.data.multiExamStudentScore.messGradeOrder + "
" + "全科年级参考人数:" + object.data.multiExamSchoolScore.mecsStudentCount + "
" + "全科年级:" + tableLayout + '平均分最高分四分位数(75%)中位数四分位数(25%)最低分' + "" + object.data.multiExam.meAvgScore + "" + object.data.multiExam.meMaxScore + "" + object.data.multiExam.me3QuatrerScore + "" + object.data.multiExam.meHalfScore + "" + object.data.multiExam.meQuarterScore + "" + object.data.multiExam.meMinScore + "

" + classText; $("#fileOutput table").css("display", "inline-table"); $("#fileOutput table").css("margin-bottom", "0px"); $('.chart').show(); sChart1 = echarts.init($("#score1")[0]); sChart2 = echarts.init($("#score2")[0]); oChart1 = echarts.init($("#order1")[0]); oChart2 = echarts.init($("#order2")[0]); oChart3 = echarts.init($("#order3")[0]); oChart4 = echarts.init($("#order4")[0]); seNameDicP = []; scorePP = []; avgPP = []; rate0P = []; rate25P = []; rate50P = []; rate75P = []; rate100P = []; rateFullP = []; scoreQ = []; avgQ = []; rate0Q = []; rate25Q = []; rate50Q = []; rate75Q = []; rate100Q = []; seNameDicP2 = []; classOrderPP = []; gradeOrderPP = []; classOrderQ = []; gradeOrderQ = []; seNameDicP3 = []; ysClassOrderPP = []; ysClassOrderQ = []; seIds[seIds.length] = 0 for (var i = 0; i < seIds.length; i++) { var g = seIds[i]; if (g == -1) continue; if (seNameDic[g].substr(0, 2) == '总分') continue; seNameDicP.push(seNameDic[g].substr(0, 2)); scorePP.push(scoreP[g]); avgPP.push(avgP[g]); rate0P.push(rate0[g]); rate25P.push(rate25[g]); rate50P.push(rate50[g]); rate75P.push(rate75[g]); rate100P.push(rate100[g]); rateFullP.push(rateFull[g]); scoreQ.push(decimal(scoreP[g] / rateFull[g] * 100, 1)); avgQ.push(decimal(avgP[g] / rateFull[g] * 100, 1)); rate0Q.push(decimal(rate0[g] / rateFull[g] * 100, 1)); rate25Q.push(decimal(rate25[g] / rateFull[g] * 100, 1)); rate50Q.push(decimal(rate50[g] / rateFull[g] * 100, 1)); rate75Q.push(decimal(rate75[g] / rateFull[g] * 100, 1)); rate100Q.push(decimal(rate100[g] / rateFull[g] * 100, 1)); } for (var i = 0; i < seIds.length; i++) { var g = seIds[i]; if (g == -1) continue; seNameDicP2.push(seNameDic[g].substr(0, 2)); classOrderPP.push(classOrderP[g]); gradeOrderPP.push(gradeOrderP[g]); classOrderQ.push(decimal(classOrder[g] * 100, 1)); gradeOrderQ.push(decimal(gradeOrder[g] * 100, 1)); } for (var i in ysClassOrderP) { seNameDicP3.push(seNameDic[i]); ysClassOrderPP.push(ysClassOrderP[i]); ysClassOrderQ.push(decimal(ysClassOrder[i] * 100, 1)); } var opBase = { textStyle: { fontFamily: 'Noto Serif SC' }, tooltip: { trigger: 'axis' }, toolbox: { show: true, feature: { saveAsImage: { show: true }, dataView: { show: true, readOnly: false } }, padding: 25, orient: 'vertical' }, calculable: true, } var sOp1 = { ...opBase }, sOp2 = { ...opBase }, oOp1 = { ...opBase }, oOp2 = { ...opBase }, oOp3 = { ...opBase }, oOp4 = { ...opBase }; sOp1.title = { text: '分数', textStyle: { fontSize: 14, fontStyle: 'normal', fontWeight: 'bold', }, } sOp1.legend = { data: ['0%', '25%', '50%', '75%', '100%', '满分', '平均分', '我的分数'] } sOp1.xAxis = [{ type: 'category', data: seNameDicP, name: '科目', position: 'left' }] sOp1.yAxis = [{ type: 'value', name: '分数', position: 'left' }] sOp1.series = [ { name: '0%', type: 'line', data: rate0P, color: '#5cb85c' }, { name: '25%', type: 'line', data: rate25P, color: '#c7dc68' }, { name: '50%', type: 'line', data: rate50P, color: '#c7dc68' }, { name: '75%', type: 'line', data: rate75P, color: '#c7dc68' }, { name: '100%', type: 'line', data: rate100P, color: '#5cb85c' }, { name: '满分', type: 'line', data: rateFullP, color: '#f0ad4e' }, { name: '平均分', type: 'line', data: avgPP, color: '#337ab7' }, { name: '我的分数', type: 'line', data: scorePP, color: '#e2041b' } ] sOp2.title = { text: '得分率', textStyle: { fontSize: 14, fontStyle: 'normal', fontWeight: 'bold', }, } sOp2.legend = { data: ['0%', '25%', '50%', '75%', '100%', '平均得分率', '我的得分率'] } sOp2.xAxis = [{ type: 'category', data: seNameDicP, name: '科目', position: 'left' }] sOp2.yAxis = [{ type: 'value', name: '得分率(%)', position: 'left' }] sOp2.series = [ { name: '0%', type: 'line', data: rate0Q, color: '#5cb85c' }, { name: '25%', type: 'line', data: rate25Q, color: '#c7dc68' }, { name: '50%', type: 'line', data: rate50Q, color: '#c7dc68' }, { name: '75%', type: 'line', data: rate75Q, color: '#c7dc68' }, { name: '100%', type: 'line', data: rate100Q, color: '#5cb85c' }, { name: '平均得分率', type: 'line', data: avgQ, color: '#337ab7' }, { name: '我的得分率', type: 'line', data: scoreQ, color: '#d9534f' } ] oOp1.title = { text: '行政排名位次', textStyle: { fontSize: 14, fontStyle: 'normal', fontWeight: 'bold', }, } oOp1.legend = { data: ['班级排名', '年级排名'] } oOp1.xAxis = [{ type: 'category', data: seNameDicP2, name: '科目', position: 'left' }] oOp1.yAxis = [{ type: 'value', name: '排名', position: 'left' }] oOp1.series = [ { name: '班级排名', type: 'bar', data: classOrderPP, color: '#5bc0de' }, { name: '年级排名', type: 'bar', data: gradeOrderPP, color: '#337ab7' } ] oOp2.title = { text: '行政排名比例', textStyle: { fontSize: 14, fontStyle: 'normal', fontWeight: 'bold', }, } oOp2.legend = { data: ['班级排名(%)', '年级排名(%)'] } oOp2.xAxis = [{ type: 'category', data: seNameDicP2, name: '科目', position: 'left' }] oOp2.yAxis = [{ type: 'value', name: '排名(%)', position: 'left' }] oOp2.series = [ { name: '班级排名(%)', type: 'bar', data: classOrderQ, color: '#5bc0de' }, { name: '年级排名(%)', type: 'bar', data: gradeOrderQ, color: '#337ab7' } ] oOp3.title = { text: '分班排名位次', textStyle: { fontSize: 14, fontStyle: 'normal', fontWeight: 'bold', }, } oOp3.legend = { data: ['分班排名'] } oOp3.xAxis = [{ type: 'category', data: seNameDicP3, name: '科目', position: 'left' }] oOp3.yAxis = [{ type: 'value', name: '排名', position: 'left' }] oOp3.series = [{ name: '分班排名', type: 'bar', data: ysClassOrderPP, color: '#5cb85c' }] oOp4.title = { text: '分班排名比例', textStyle: { fontSize: 14, fontStyle: 'normal', fontWeight: 'bold', }, } oOp4.legend = { data: ['分班排名(%)'] } oOp4.xAxis = [{ type: 'category', data: seNameDicP3, name: '科目', position: 'left' }] oOp4.yAxis = [{ type: 'value', name: '排名(%)', position: 'left' }] oOp4.series = [{ name: '分班排名(%)', type: 'bar', data: ysClassOrderQ, color: '#5cb85c' }] // 为echarts对象加载数据 sChart1.setOption(sOp1); sChart2.setOption(sOp2); oChart1.setOption(oOp1); oChart2.setOption(oOp2); oChart3.setOption(oOp3); oChart4.setOption(oOp4); window.onresize = function () { setTimeout(function () { sChart1.resize() sChart2.resize() oChart1.resize() oChart2.resize() oChart3.resize() oChart4.resize() }, 300) } } reader.readAsText(file); } $().ready(function () { $(".chart").hide() $(function () { $("[data-toggle='tooltip']").tooltip(); }); })