From 643840b1205009fbfc13f129a95e11a96ec359fb Mon Sep 17 00:00:00 2001 From: gameloader Date: Tue, 19 Sep 2023 15:44:33 +0800 Subject: [PATCH] add choose fixed number --- whuF2caculate.js | 352 ++++++++++++++++++++++++++--------------------- 1 file changed, 193 insertions(+), 159 deletions(-) diff --git a/whuF2caculate.js b/whuF2caculate.js index c7b3c58..07b292f 100644 --- a/whuF2caculate.js +++ b/whuF2caculate.js @@ -1,7 +1,7 @@ // ==UserScript== // @name 武大综测F2年度计算小工具 // @namespace whu -// @version 1.1 +// @version 1.2 // @author game-loader // @description 计算武大综测F2部分 // @homepage https://github.com/game-loader @@ -9,187 +9,221 @@ // @grant GM_xmlhttpRequest // ==/UserScript== -(function() { - 'use strict'; +(function () { + "use strict"; - // 创建小窗口 - var container = document.createElement('div'); - container.style.position = 'fixed'; - container.style.top = '50%'; - container.style.right = '20%'; - container.style.transform = 'translate(50%, -50%)'; - container.style.backgroundColor = '#ffffff'; - container.style.padding = '20px'; - container.style.border = '1px solid #000000'; - container.style.zIndex = '1000'; + // 创建小窗口 + var container = document.createElement("div"); + container.style.position = "fixed"; + container.style.top = "50%"; + container.style.right = "20%"; + container.style.transform = "translate(50%, -50%)"; + container.style.backgroundColor = "#ffffff"; + container.style.padding = "20px"; + container.style.border = "1px solid #000000"; + container.style.zIndex = "1000"; - // 创建年份下拉框 - var yearSelect = document.createElement('select'); - yearSelect.innerHTML = ` + // 创建年份下拉框 + var yearSelect = document.createElement("select"); + yearSelect.innerHTML = ` `; - container.appendChild(yearSelect); + container.appendChild(yearSelect); - // 添加距离 - var spacer = document.createElement('div'); - spacer.style.height = '10px'; - container.appendChild(spacer); + // 添加距离 + var spacer = document.createElement("div"); + spacer.style.height = "10px"; + container.appendChild(spacer); - // 创建计算按钮 - var calculateButton = document.createElement('button'); - calculateButton.textContent = '计算综测F2'; - calculateButton.style.backgroundColor = '#5cb3cc'; - calculateButton.style.color = '#ffffff'; - calculateButton.style.border = 'none'; - calculateButton.style.borderRadius = '5px'; - calculateButton.style.padding = '8px 16px'; - calculateButton.style.boxShadow = '0px 2px 4px rgba(0, 0, 0, 0.4)'; - container.appendChild(calculateButton); + // 创建计算按钮 + var calculateButton = document.createElement("button"); + calculateButton.textContent = "计算综测F2"; + calculateButton.style.backgroundColor = "#5cb3cc"; + calculateButton.style.color = "#ffffff"; + calculateButton.style.border = "none"; + calculateButton.style.borderRadius = "5px"; + calculateButton.style.padding = "8px 16px"; + calculateButton.style.boxShadow = "0px 2px 4px rgba(0, 0, 0, 0.4)"; + container.appendChild(calculateButton); - // Create the query elective courses button - var queryButton = document.createElement('button'); - queryButton.textContent = '查询选修课'; - queryButton.style.backgroundColor = '#5cb3cc'; - queryButton.style.color = '#ffffff'; - queryButton.style.border = 'none'; - queryButton.style.borderRadius = '5px'; - queryButton.style.padding = '8px 16px'; - queryButton.style.boxShadow = '0px 2px 4px rgba(0, 0, 0, 0.4)'; - queryButton.style.marginLeft = '20px'; // Add space between the buttons - container.appendChild(queryButton); + // Create the query elective courses button + var queryButton = document.createElement("button"); + queryButton.textContent = "查询选修课"; + queryButton.style.backgroundColor = "#5cb3cc"; + queryButton.style.color = "#ffffff"; + queryButton.style.border = "none"; + queryButton.style.borderRadius = "5px"; + queryButton.style.padding = "8px 16px"; + queryButton.style.boxShadow = "0px 2px 4px rgba(0, 0, 0, 0.4)"; + queryButton.style.marginLeft = "20px"; // Add space between the buttons + container.appendChild(queryButton); + // 创建位数选择下拉框 + var decimalSelect = document.createElement("select"); + decimalSelect.innerHTML = ` + + + + +`; + container.appendChild(decimalSelect); - // 将小窗口添加到页面中 - document.body.appendChild(container); + // 添加提示文本 + var decimalLabel = document.createElement("p"); + decimalLabel.textContent = "选择保留的小数位数:"; + container.insertBefore(decimalLabel, decimalSelect); - // 设置小窗口样式 - container.style.width = '300px'; - container.style.height = '200px'; - container.style.overflow = 'auto'; + // 将小窗口添加到页面中 + document.body.appendChild(container); - // 获取gnmkdmKey的值 - var gnmkdmKey = document.getElementById('gnmkdmKey').value; + // 设置小窗口样式 + container.style.width = "300px"; + container.style.height = "200px"; + container.style.overflow = "auto"; - // 构造请求URL和postData - var url = 'https://jwgl.whu.edu.cn/cjcx/cjcx_cxXsgrcj.html'; - var params = 'doType=query&gnmkdm=' + encodeURIComponent(gnmkdmKey); + // 获取gnmkdmKey的值 + var gnmkdmKey = document.getElementById("gnmkdmKey").value; + // 构造请求URL和postData + var url = "https://jwgl.whu.edu.cn/cjcx/cjcx_cxXsgrcj.html"; + var params = "doType=query&gnmkdm=" + encodeURIComponent(gnmkdmKey); - // 最终请求URL - var finalUrl = url + '?' + params; + // 最终请求URL + var finalUrl = url + "?" + params; - // Bind click event to the query button - queryButton.addEventListener('click', function() { - var postData = 'xnm=' + yearSelect.value + '&xqm=&kcbj=&_search=false&nd=' + Date.now() + '&queryModel.showCount=50&queryModel.currentPage=1&queryModel.sortName=&queryModel.sortOrder=asc&time=0'; - // Perform the same POST request as the calculate button - // console.log(postData); - GM_xmlhttpRequest({ - method: 'POST', - url: finalUrl, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - data: postData, - onload: function(response) { - var responseData = JSON.parse(response.responseText); - let items = responseData.items; - // console.log(items); + // Bind click event to the query button + queryButton.addEventListener("click", function () { + var postData = + "xnm=" + + yearSelect.value + + "&xqm=&kcbj=&_search=false&nd=" + + Date.now() + + "&queryModel.showCount=50&queryModel.currentPage=1&queryModel.sortName=&queryModel.sortOrder=asc&time=0"; + // Perform the same POST request as the calculate button + // console.log(postData); + GM_xmlhttpRequest({ + method: "POST", + url: finalUrl, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + data: postData, + onload: function (response) { + var responseData = JSON.parse(response.responseText); + let items = responseData.items; + // console.log(items); - // Only consider items where kcxzmc includes "选修" - var electiveItems = items.filter((item) => { - // console.log('item:', items[item]); - // console.log('kcxzmc:', items[item] && items[item].kcxzmc); - return item && items[item].kcxzmc && items[item].kcxzmc.includes("选修"); - }); - - // Display these items in a list with checkboxes - var electiveList = document.createElement('ul'); - electiveList.style.listStyleType = 'none'; - electiveList.style.border = '1px solid black'; // Add border to the list - electiveList.style.padding = '10px'; // Add some padding - electiveList.style.marginTop = '20px'; // Add margin at the top - - electiveItems.forEach(item => { - var listItem = document.createElement('li'); - listItem.style.marginTop = '5px'; - listItem.style.display = 'flex'; // Use flex layout - listItem.style.alignItems = 'center'; // Center-align items vertically - - var checkbox = document.createElement('input'); - checkbox.type = 'checkbox'; - checkbox.value = item.kcmc; - checkbox.style.marginRight = '10px'; // Add some space between the checkbox and the label - listItem.appendChild(checkbox); - - var label = document.createElement('label'); - label.textContent = item.kcmc; - listItem.appendChild(label); - - electiveList.appendChild(listItem); - }); - - // Add the list to the container - container.appendChild(electiveList); - } + // Only consider items where kcxzmc includes "选修" + var electiveItems = items.filter((item) => { + // console.log('item:', items[item]); + // console.log('kcxzmc:', items[item] && items[item].kcxzmc); + return ( + item && items[item].kcxzmc && items[item].kcxzmc.includes("选修") + ); }); + + // Display these items in a list with checkboxes + var electiveList = document.createElement("ul"); + electiveList.style.listStyleType = "none"; + electiveList.style.border = "1px solid black"; // Add border to the list + electiveList.style.padding = "10px"; // Add some padding + electiveList.style.marginTop = "20px"; // Add margin at the top + + electiveItems.forEach((item) => { + var listItem = document.createElement("li"); + listItem.style.marginTop = "5px"; + listItem.style.display = "flex"; // Use flex layout + listItem.style.alignItems = "center"; // Center-align items vertically + + var checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.value = item.kcmc; + checkbox.style.marginRight = "10px"; // Add some space between the checkbox and the label + listItem.appendChild(checkbox); + + var label = document.createElement("label"); + label.textContent = item.kcmc; + listItem.appendChild(label); + + electiveList.appendChild(listItem); + }); + + // Add the list to the container + container.appendChild(electiveList); + }, }); + }); + // 绑定按钮点击事件 + calculateButton.addEventListener("click", function () { + let postData = + "xnm=" + + yearSelect.value + + "&xqm=&kcbj=&_search=false&nd=" + + Date.now() + + "&queryModel.showCount=70&queryModel.currentPage=1&queryModel.sortName=&queryModel.sortOrder=asc&time=0"; + // 发送POST请求 + GM_xmlhttpRequest({ + method: "POST", + url: finalUrl, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + data: postData, + onload: function (response) { + var responseData = JSON.parse(response.responseText); + let items = responseData.items; + // console.log(items); - // 绑定按钮点击事件 - calculateButton.addEventListener('click', function() { + // 创建变量用于存储必修成绩、选修成绩和必修学分 + var requiredScore = 0; + var electiveScore = 0; + var requiredCredits = 0; - let postData = 'xnm=' + yearSelect.value + '&xqm=&kcbj=&_search=false&nd=' + Date.now() + '&queryModel.showCount=70&queryModel.currentPage=1&queryModel.sortName=&queryModel.sortOrder=asc&time=0'; - // 发送POST请求 - GM_xmlhttpRequest({ - method: 'POST', - url: finalUrl, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - data: postData, - onload: function(response) { - var responseData = JSON.parse(response.responseText); - let items = responseData.items; - // console.log(items); + // Get the selected elective courses + var selectedElectives = Array.from( + container.querySelectorAll('input[type="checkbox"]:checked'), + ).map((input) => input.value); + // Iterate through each item in the items array + for (var i = 0; i < items.length; i++) { + var item = items[i]; + var kcxzmc = item.kcxzmc; + var bfzcj = parseFloat(item.bfzcj); + var xf = parseFloat(item.xf); - // 创建变量用于存储必修成绩、选修成绩和必修学分 - var requiredScore = 0; - var electiveScore = 0; - var requiredCredits = 0; + if (kcxzmc.includes("必修")) { + requiredScore += bfzcj * xf; + requiredCredits += xf; + } else if (kcxzmc.includes("选修")) { + if (selectedElectives.includes(item.kcmc)) { + // Treat the selected elective courses as required courses + requiredScore += bfzcj * xf; + requiredCredits += xf; + } else { + // Only consider the non-selected elective courses for the elective score + electiveScore += bfzcj * xf; + } + } + } - // Get the selected elective courses - var selectedElectives = Array.from(container.querySelectorAll('input[type="checkbox"]:checked')).map(input => input.value); - // Iterate through each item in the items array - for (var i = 0; i < items.length; i++) { - var item = items[i]; - var kcxzmc = item.kcxzmc; - var bfzcj = parseFloat(item.bfzcj); - var xf = parseFloat(item.xf); + // 计算必修课平均成绩和选修课成绩 + var requiredGrade = requiredScore / requiredCredits; + var electiveGrade = electiveScore * 0.002; - if (kcxzmc.includes("必修")) { - requiredScore += bfzcj * xf; - requiredCredits += xf; - } else if (kcxzmc.includes("选修")) { - if (selectedElectives.includes(item.kcmc)) { - // Treat the selected elective courses as required courses - requiredScore += bfzcj * xf; - requiredCredits += xf; - } else { - // Only consider the non-selected elective courses for the elective score - electiveScore += bfzcj * xf; - } - } - } - - // 计算必修课平均成绩和选修课成绩 - var requiredGrade = requiredScore / requiredCredits; - var electiveGrade = electiveScore * 0.002; - - // 在窗口中显示结果 - var resultElement = document.createElement('div'); - resultElement.style.marginTop = '10px'; - resultElement.textContent = "必修课: " + requiredGrade.toFixed(3) + ",选修课: " + electiveGrade.toFixed(3)+",总成绩:"+(requiredGrade+electiveGrade).toFixed(3); - container.appendChild(resultElement); - }})})})(); + // 在窗口中显示结果 + var resultElement = document.createElement("div"); + resultElement.style.marginTop = "10px"; + resultElement.textContent = + "必修课: " + + requiredGrade.toFixed(decimalSelect.value) + + ",选修课: " + + electiveGrade.toFixed(decimalSelect.value) + + ",总成绩:" + + (requiredGrade + electiveGrade).toFixed(decimalSelect.value); + container.appendChild(resultElement); + }, + }); + }); +})();