// import CryptoJS from "crypto-js" import { JSEncrypt } from "jsencrypt"; import service from "@/api/axios"; const encryptKey = "WfJTKO9S4eLkrPz2JKrAnzdb"; const encryptIV = "D076D35C"; /** * 登录密码加密,公钥直接写死在方法里 * @param data: 待加密数据 * @returns 加密结果 */ export function encryptLoginPassword(data) { const secret = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjh2ei17z5k2r4VzbqoSCE6RmYzWySJTgVQYulgfVM+vqcDoUE4cFB4XCFA2lHWjjpsuJP1EtwKlvUgxo5okr3x/a88o8eERxBynnVQZbEYpKteW5aqSEb/g1yPLWnKV88b/ED445ITYbZZuInRo5lkCvd6QEjL6d2Fch6mEo5awYXC4/S4BJf9YlYRhGzR7wpiXCLvyBHQ4iSIIDNpmrPBPQzGP0rx09aDu54kz/42CR6SX2OqXSi4ZoieqkPFl/iuX4RoD/NKKR+haDn1UzoD3k1WzHSTBFFs27rxRpxfBUZzfXQeskgKyw/Slcl3jUFizczsY4CLgTRrfey48Q6QIDAQAB"; // 新建JSEncrypt对象 let encryptor = new JSEncrypt(); // 设置公钥 encryptor.setPublicKey(secret); // 加密数据 return encryptor.encrypt(data); } /** * 设置本周,本月,本季度 * @param index: 规则值 * @returns startDay=开始时间,endDay=结束时间 */ export function setDateRules(type) { var that = {}; let aYear = new Date().getFullYear(); let aMonth = new Date().getMonth() + 1; that.day = ""; that.startDay = ""; that.endDay = ""; switch (type) { case "onDay": that.day = formatDate(new Date(), "yyyy-MM-dd"); that.startDay = that.day; that.endDay = that.day; break; case "onWeek": let day = new Date().getDay(); if (day == 0) { //中国式星期天是一周的最后一天 day = 7; } day--; let aTime = new Date().getTime() - 24 * 60 * 60 * 1000 * day; that.startDay = formatDate(new Date(aTime), "yyyy-MM-dd"); that.endDay = formatDate(new Date(), "yyyy-MM-dd"); break; case "onMonth": aMonth = aMonth < 10 ? "0" + aMonth : aMonth; that.startDay = `${aYear}-${aMonth}-01`; that.endDay = formatDate(new Date(), "yyyy-MM-dd"); break; case "term": that.startDay = getDateRange()[0]; that.endDay = getDateRange()[1]; break; case "onQuarter": if (aMonth > 0 && aMonth < 4) { aMonth = "1"; } else if (aMonth > 3 && aMonth < 7) { aMonth = "4"; } else if (aMonth > 6 && aMonth < 10) { aMonth = "7"; } else { aMonth = "10"; } aMonth = aMonth < 10 ? "0" + aMonth : aMonth; that.startDay = `${aYear}-${aMonth}-01`; that.endDay = formatDate(new Date(), "yyyy-MM-dd"); break; } return that; } /** * 对称加密 * @param secret:加密公钥 * @param data: 待加密数据 * @returns 加密结果 */ export function encryptData(secret, data) { // 新建JSEncrypt对象 let encryptor = new JSEncrypt(); // 设置公钥 encryptor.setPublicKey(secret); // 加密数据 return encryptor.encrypt(data); } // 深度复制 export function deepClone(obj) { let result = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === "object") { result[key] = deepClone(obj[key]); } else { result[key] = obj[key]; } } } return result; } export function getKnowledge(knowledgeParam) { if (!knowledgeParam) return ""; var knowledge = knowledgeParam + ""; var knowledges = knowledge.split(","); var resultArray = []; knowledges.forEach((ksplit) => { var ss = ksplit.split("#").filter((dd) => dd.length >= 1); if (ss.length > 0) { resultArray.push(ss[ss.length - 1]); } }); return resultArray.join(";"); } // // 3DES加密 // export function desEncrypt (str, key = encryptKey, iv = encryptIV) { // var cryptoKey = CryptoJS.enc.Utf8.parse(key) // var cryptoIv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8)) // var encodeStr = CryptoJS.TripleDES.encrypt(str, cryptoKey, { // iv: cryptoIv, // mode: CryptoJS.mode.CBC, // padding: CryptoJS.pad.Pkcs7 // }) // return encodeStr.toString() // } // // 3DES解密 // export function desDecrypt (str, key = encryptKey, iv = encryptIV) { // var cryptoKey = CryptoJS.enc.Utf8.parse(key) // var cryptoIv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8)) // var decryptStr = CryptoJS.TripleDES.decrypt(str, cryptoKey, { // iv: cryptoIv, // mode: CryptoJS.mode.CBC, // padding: CryptoJS.pad.Pkcs7 // }) // return decryptStr.toString(CryptoJS.enc.Utf8) // } // 随机生成由字母+数字的字符串 export function randomWord(randomFlag, min, max) { // randomFlag: Boolean 是否随机个数 // min 最少个数 // max 最大个数 var str = ""; var range = min; var arr = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", ]; // 随机产生 if (randomFlag) { range = Math.round(Math.random() * (max - min)) + min; } var pos = ""; for (var i = 0; i < range; i++) { pos = Math.round(Math.random() * (arr.length - 1)); str += arr[pos]; } return str; } // 判断数组中是否存在相同值 export function hasRepeatValue(arr, key = null) { if (key) arr = arr.map((d) => d[key]); if (arr.length) { let nameNum = arr.reduce((pre, cur) => { if (cur in pre) { pre[cur]++; } else { pre[cur] = 1; } return pre; }, {}); return Object.values(nameNum).findIndex((d) => d > 1) < 0; } return true; } // 获取cookie值 export function getCookie(name, defaultValue) { const result = new RegExp("(^| )" + name + "=([^;]*)(;|$)"); return result[0] === document.cookie.match(result[1]) ? unescape(result[0][2]) : defaultValue; } /** * base64转化unicode */ export function b64DecodeUnicode(str) { let uni; try { // atob 经过 base-64 编码的字符串进行解码 uni = decodeURIComponent( atob(str) .split("") .map(function (c) { return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); }) .join("") ); } catch (e) {} return uni; } // base64ToFile export function base64ToFile(base64Data, tempfilename, contentType) { contentType = contentType || ""; var sliceSize = 1024; var byteCharacters = atob(base64Data); var bytesLength = byteCharacters.length; var slicesCount = Math.ceil(bytesLength / sliceSize); var byteArrays = new Array(slicesCount); for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) { var begin = sliceIndex * sliceSize; var end = Math.min(begin + sliceSize, bytesLength); var bytes = new Array(end - begin); for (var offset = begin, i = 0; offset < end; ++i, ++offset) { bytes[i] = byteCharacters[offset].charCodeAt(0); } byteArrays[sliceIndex] = new Uint8Array(bytes); } var file = new File(byteArrays, tempfilename, { type: contentType }); return file; } // 将base64转换为文件 export function dataURLtoFile(dataurl, filename) { var arr = dataurl.split(","); var mime = arr[0].match(/:(.*?);/)[1]; var bstr = atob(arr[1]); var n = bstr.length; var u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, { type: mime }); } // 将图片转换为Base64 export function getImgToBase64(url, callback, outputFormat) { var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); var img = new Image(); img.crossOrigin = "Anonymous"; img.onload = function () { canvas.height = img.height; canvas.width = img.width; ctx.drawImage(img, 0, 0); var dataURL = canvas.toDataURL(outputFormat || "image/png"); callback(dataURL); canvas = null; }; img.src = url; } // 转换级联下拉数据 export function loopOptions(list, option = {}) { option = { value: "id", label: "name", children: "children", ...option, }; if (list instanceof Array && list.length) { return list.map((d, i) => { d.value = d[option.value] || i + 1; d.label = d[option.label]; if (d[option.children]) { d[option.children] = loopOptions(d[option.children], option); } return d; }); } return []; } // 通过Id获取级联数据id数组 export function getTreeIds(tree, currentId, key = "id") { let parent = {}; let pid = {}; const loop = (list, level) => { if (list instanceof Array && list.length) { for (let index = 0; index < list.length; index++) { const d = list[index]; parent[level] = d.id; if (d[key] === currentId) { for (let idx = 1; idx <= level; idx++) { pid[idx] = parent[idx]; } break; } else if (d.children) { loop(d.children, level + 1); } } } }; loop(tree, 1); let result = []; Object.keys(pid) .sort((a, b) => a - b) .forEach((k) => { result.push(pid[k]); }); return result; } /* * 格式化时间 * yyyy-MM-dd hh:mm:ss * */ export function formatDate(date, fmt) { if (!date || date == null) return null; if (isNaN(date)) { return date; } let format = fmt || "yyyy-MM-dd hh:mm:ss"; let dates = new Date(Number(date)); let formatObj = { y: dates.getFullYear(), M: dates.getMonth() + 1, d: dates.getDate(), h: dates.getHours(), m: dates.getMinutes(), s: dates.getSeconds(), }; let time_str = format.replace(/(y|M|d|h|m|s)+/g, (result, key) => { let value = formatObj[key]; if (result.length > 0 && value < 10) { value = "0" + value; } return value || 0; }); return time_str; } export function formatTimeWithHours(seconds) { if (!seconds || seconds <= 0) return "0秒"; const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); const sec = seconds % 60; // 根据是否有小时动态调整格式 var ret = ""; if (hours > 0) { ret += hours + "小时"; } if (minutes > 0) { ret += minutes + "分钟"; } if (sec > 0) { ret += sec + "秒"; } return ret; } // 获取日期时间戳 export function getTime(dayNum) { var myDate = new Date(); var lw = new Date(myDate - 1000 * 60 * 60 * 24 * dayNum); // 最后一个数字多少天前的意思 var lastY = lw.getFullYear(); var lastM = lw.getMonth() + 1; var lastD = lw.getDate(); var startdate = lastY + "-" + (lastM < 10 ? "0" + lastM : lastM) + "-" + (lastD < 10 ? "0" + lastD : lastD); var b = startdate.split(/\D/); var date = new Date(b[0], b[1] - 1, b[2]); var time = date.getTime(); return time; } // 获取几天之前日期 export function getData(dayNum) { var myDate = new Date(); var lw = new Date(myDate - 1000 * 60 * 60 * 24 * dayNum); // 最后一个数字多少天前的意思 var lastY = lw.getFullYear(); var lastM = lw.getMonth() + 1; var lastD = lw.getDate(); var startdate = lastY + "-" + (lastM < 10 ? "0" + lastM : lastM) + "-" + (lastD < 10 ? "0" + lastD : lastD); return startdate; } // 日期转换时间戳 export function getNewTime(dayNum) { var b = dayNum.split(/\D/); var date = new Date(b[0], b[1] - 1, b[2]); var time = date.getTime(); return time; } /* * 获取URL参数 * * */ export function getURLParams(variable) { let str = window.location.href.split("?")[1]; if (!str) return null; let ar = str.split("&"); let obj = {}; let data; for (var i = 0; i < ar.length; i++) { var pair = ar[i].split("="); pair[1] = decodeURIComponent(pair[1]); if (pair[0] == variable) { data = pair[1]; return pair[1]; } if (pair[0]) { obj[pair[0]] = pair[1]; } } return variable ? data : obj; } /** * 校验答案 * @param {*} s 源字符串 * @param {*} questionType 题型,2单选 3多选 * @param {*} optionCount 选项数目 * @param {*} questionCount 题目数目 */ function filtterChar(s, b, optionCount) { const ms = "ABCDEFGHIJ"; let rs = ""; for (let i = 0; i < s.length; i++) { let c = s[i]; if (c == "," || c == " " || c == ",") { if (!b) { continue; } c = ","; } else if (c < "A" || c >= ms[optionCount]) { continue; } rs += c; } return rs; } function removeDup(s) { const ms = "ABCDEFGHIJ"; let rs = ""; for (let i = 0; i < ms.length; i++) { if (s.indexOf(ms[i]) >= 0) { rs += ms[i]; } } return rs; } export function checkAnswer( s, questionType, optionCount = 4, questionCount = 1 ) { if (optionCount > 10 || questionCount < 1) { return null; } let pre = s; s = s.toUpperCase(); s = filtterChar(s, questionType == 3 && questionCount > 1, optionCount); if (questionType == 2) { //单选 if (s.length > questionCount) { s = s.substring(0, questionCount); } } else if (questionType == 3) { //多选 //允许逗号 let ss = s.split(","); let len = questionCount; if (len > ss.length) { len = ss.length; } let rs = ""; for (let i = 0; i < len; i++) { rs += removeDup(ss[i]); if (i < len - 1) { rs += ","; } } s = rs; } else { return null; } return s; } export function downloadFile(fileName, files) { if (typeof window.navigator.msSaveBlob !== "undefined") { window.navigator.msSaveBlob(files, fileName); } else { let URL = window.URL || window.webkitURL; let objectUrl; if (files instanceof Blob) { objectUrl = URL.createObjectURL(files); } else { objectUrl = files; } const a = document.createElement("a"); if (typeof a.download === "undefined") { window.location = objectUrl; } else { a.href = objectUrl; a.download = fileName; document.body.appendChild(a); a.click(); a.remove(); } } } // 获取网络URL的blob,返回一个promise export function getBlob(url) { return new Promise((resolve) => { resolve( service({ url: url, withCredentials: true, method: "get", responseType: "blob", }) ); }); } export function fetchHTML(url) { return new Promise((resolve) => { resolve( service({ url: url, withCredentials: false, method: "get" }) ); }); } /** * 打包压缩下载 */ export function compressAndDown(arr, fileName) { const zip = new JSZip(); const promiseArr = []; arr.forEach((item) => { const promise = getBlob(item.reportPath).then((res) => { const fileName = item.testName; let sIdx = item.reportPath.lastIndexOf("."); const fileType = item.reportPath.substring(sIdx); zip.file(`${fileName}${fileType}`, res, { binary: true }); }); promiseArr.push(promise); }); Promise.all(promiseArr).then(() => { zip .generateAsync({ type: "blob", compression: "DEFLATE", compressionOptions: { level: 9, }, }) .then((res) => { FileSave.saveAs(res, fileName ? fileName : "报表.zip"); }); }); } /** * 班级格式化为三级列表 学段-年级-班级 * @param {*} data * @returns */ function setSectionName(num) { let txt = ""; switch (num) { case 1: txt = "小学"; break; case 2: txt = "中学"; break; case 3: txt = "高中"; break; case 4: txt = "大学"; break; } return txt; } export function setGradeName(num) { let txt = ""; switch (num) { case 1: txt = "一年级"; break; case 2: txt = "二年级"; break; case 3: txt = "三年级"; break; case 4: txt = "四年级"; break; case 5: txt = "五年级"; break; case 6: txt = "六年级"; break; case 7: txt = "初一"; break; case 8: txt = "初二"; break; case 9: txt = "初三"; break; case 10: txt = "高一"; break; case 11: txt = "高二"; break; case 12: txt = "高三"; break; case 13: txt = "大一"; break; case 14: txt = "大二"; break; case 15: txt = "大三"; break; case 16: txt = "大四"; break; case 51: txt = "一年级"; break; case 52: txt = "二年级"; break; case 53: txt = "三年级"; break; case 54: txt = "四年级"; break; case 55: txt = "五年级"; break; case 56: txt = "六年级"; break; case 57: txt = "七年级"; break; case 58: txt = "八年级"; break; case 59: txt = "九年级"; break; default: txt = "其他"; break; } return txt; } export function formatClass(data) { let sectionName = []; let sectionNameArr = []; data.map((item) => { if (!sectionName.includes(item.sectionName)) { sectionName.push(item.sectionName); sectionNameArr.push({ value: item.sectionName, label: setSectionName(item.sectionName), children: [ { value: item.gradeName, label: setGradeName(item.gradeName), children: [ { value: item.classId, label: item.className, }, ], }, ], }); } else { let hasGrade = false; let sectionIndex = 0; let gradeIndex = 0; sectionNameArr.map((items, index) => { items.map((grade, gradeInx) => { if (setGradeName(item.gradeName) == grade.value) { hasGrade = true; sectionIndex = index; gradeIndex = gradeInx; } }); }); if (hasGrade) { sectionNameArr[sectionIndex].children[gradeIndex].push({ value: item.classId, label: item.className, }); } else { sectionNameArr[sectionIndex].children.push({ value: setGradeName(item.gradeName), label: setGradeName(item.gradeName), children: [ { value: item.classId, label: item.className, }, ], }); } } }); return sectionNameArr; } export function formatGradeClass(data) { let gradeName = []; let gradeNameArr = []; data.map((item) => { if (!gradeName.includes(item.gradeName)) { gradeName.push(item.gradeName); gradeNameArr.push({ value: item.grade, label: item.gradeName, children: [ { value: item.id, label: item.className, }, ], }); } else { let gradeIndex = 0; gradeNameArr.map((items, index) => { if (items.value == item.grade) { gradeIndex = index; } }); gradeNameArr[gradeIndex].children.push({ value: item.id, label: item.className, }); } }); return gradeNameArr; } export function formatGradeNameClass(data) { let gradeName = []; let gradeNameArr = []; data.map((item) => { if (!gradeName.includes(item.gradeName)) { gradeName.push(item.gradeName); gradeNameArr.push({ value: item.gradeName, label: item.gradeName, grade: item.grade, children: [ { value: item.id, label: item.className, leaf: true, }, ], }); } else { let gradeIndex = 0; gradeNameArr.map((items, index) => { if (items.value == item.gradeName) { gradeIndex = index; } }); gradeNameArr[gradeIndex].children.push({ value: item.id, label: item.className, leaf: true, }); } }); return gradeNameArr; } ///试卷定制化打印 export async function paperPrint(paper) { let printWin = window.open("", "_blank", "width=800,height=600,resizable=no"); var browser = getBrowserEngine(printWin); var subjectName = paper.subjectName; var paperTitle = paper.title; var paperQuestions = paper.questionList; function getBrowserEngine(windowParams) { if (windowParams.navigator.userAgent.indexOf("Edge") > -1) { return "EdgeHTML"; } if (windowParams.navigator.userAgent.indexOf("Edg") > -1) { return "Blink"; // Microsoft Edge (Chromium) } if (windowParams.navigator.userAgent.indexOf("Firefox") > -1) { return "Gecko"; } if (windowParams.navigator.userAgent.indexOf("Trident") > -1) { return "Trident"; // IE } if (/Chrome/.test(windowParams.navigator.userAgent) && /Google Inc/.test(windowParams.navigator.vendor)) { return 'Google Chrome'; } if (/360/.test(windowParams.navigator.userAgent) || /QIHU/.test(windowParams.navigator.userAgent)) { return '360 Browser'; } return "Blink"; // Assume it's Chrome, Safari, or an alternative Blink-based browser } function numberToChinese(num) { const chineseDigits = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]; const chineseUnits = ["", "十", "百", "千", "万", "亿"]; let result = ''; let unitPos = 0; // 单位的位置 let zeroFlag = false; // 是否出现过零 if (num === 0) { return chineseDigits[0]; // 特殊情况,0 返回 "零" } // 处理数字,每次取一位并加上单位 while (num > 0) { const currentDigit = num % 10; // 取最后一位数字 if (currentDigit === 0) { if (!zeroFlag) { result = chineseDigits[currentDigit] + result; // 只在出现零时添加 zeroFlag = true; // 标记零已经出现 } } else { result = chineseDigits[currentDigit] + chineseUnits[unitPos] + result; zeroFlag = false; // 重置零的标记 } num = Math.floor(num / 10); // 去掉最后一位数字 unitPos++; } // 处理 '一十' 和 '一百' 等情况 if (result.startsWith('一十')) { result = result.substring(1); // 去掉 '一',例如 '一十' -> '十' } return result; } function htmlParseDom(html, getStyleScripts) { var tempDom = document.createElement('div'); tempDom.innerHTML = html; var doms = tempDom.querySelectorAll('p'); if (getStyleScripts == true) { var styleDoms = tempDom.querySelectorAll('style'); var scriptDoms = tempDom.querySelectorAll('script'); return { doms: doms, styles: styleDoms, scripts: scriptDoms } } return { doms: doms } } function generatePageParams() { const totalHeightPx = Math.max( printWin.document.documentElement.scrollHeight, // 整个文档高度 printWin.document.body.scrollHeight // Body 的高度 ); const totalHeightMM = totalHeightPx * 25.4 / 96; // ie浏览器高度 var A4HeightMM = 287; if (browser == "Google Chrome") { A4HeightMM = 297; } var pages = Math.ceil(totalHeightMM / A4HeightMM) + 1; for (var page = 0; page < pages; page++) { var pageFooteDiv = printWin.document.createElement('div'); pageFooteDiv.classList.add('page-footer'); pageFooteDiv.innerText = `${paperTitle} ${subjectName} 第${page + 1}页(共${pages}页)`; pageFooteDiv.style.top = (page + 1) * A4HeightMM + (page * 5.5) + 'mm'; printWin.document.body.appendChild(pageFooteDiv); } } // size: A4 portrait; // size: A3 landscape; printWin.document.title = "中天易教"; const style = printWin.document.createElement('style'); style.innerHTML = ` @media print { @page { size: A4 portrait; height: 300mm; margin-top:5mm; margin-bottom:10mm; margin-left:2mm; margin-right:2mm; } body { counter-reset: page-number; /* 重置页码计数器 */ } mn { padding-top:2px; } } table tfoot { height: 0px; display: table-footer-group; } table thead { height: 20px; display: table-header-group; } .student-input { text-align:center; margin-bottom:10px; span { margin-right:10px; } } .page-left { height: 1100px; width:30px; position:fixed; top:0; left:0; } .page-right { height:1100px; width:30px; position:fixed; top:0; right:0; } .page-header { height:20px; width:100%; text-align:center; position:fixed; top:0; left:0; } .page-footer { height:20px; width:100%; text-align:center; position: absolute; } h3,h2 { margin:3px 0px 3px 0px; } .title-header { .title-content { text-align:center; } } b { font-weight:500; margin:10px 0px; } p,table { font-size:16px; margin:0px; padding:0px 0px 2px 0px; margin-block-start:0px; margin-block-end: 0px; margin-inline-start: 0px; margin-inline-end: 0px; span,*,image,img,tr,td { font-size:16px; line-height:20px !important; } img,image { margin:0px; padding:0px; transform: scale(0.65); transform-origin: center; } }`; printWin.document.head.appendChild(style); const titleBoxDom = printWin.document.createElement('div'); titleBoxDom.classList.add('title-header'); const titleDom = printWin.document.createElement('h3'); titleDom.innerText = paperTitle; titleDom.classList.add('title-content'); const subjectDom = printWin.document.createElement('h2'); subjectDom.innerText = subjectName; subjectDom.classList.add('title-content'); titleBoxDom.appendChild(titleDom); titleBoxDom.appendChild(subjectDom); printWin.document.body.appendChild(titleBoxDom); const studentInputBoxDom = printWin.document.createElement('div'); studentInputBoxDom.classList.add('student-input'); const studentClassInputDom = printWin.document.createElement('span'); studentClassInputDom.innerHTML = '班级:________________'; const studentNameInputDom = printWin.document.createElement('span'); studentNameInputDom.innerHTML = '姓名:________________'; const studentNoInputDom = printWin.document.createElement('span'); studentNoInputDom.innerHTML = '学号:________________'; studentInputBoxDom.appendChild(studentClassInputDom); studentInputBoxDom.appendChild(studentNameInputDom); studentInputBoxDom.appendChild(studentNoInputDom); printWin.document.body.appendChild(studentInputBoxDom); const tableDom = printWin.document.createElement('table'); const theadDom = printWin.document.createElement('thead'); const theadTrDom = printWin.document.createElement('tr'); theadTrDom.appendChild(printWin.document.createElement('th')); theadTrDom.appendChild(printWin.document.createElement('th')); theadTrDom.appendChild(printWin.document.createElement('th')); theadDom.appendChild(theadTrDom); tableDom.appendChild(theadDom); const tbodyDom = printWin.document.createElement('tbody'); for (var iof = 0; iof < paperQuestions.length; iof++) { var item = paperQuestions[iof]; if (!item || !item.subQuestions) continue; const tbodyTrDom = printWin.document.createElement('tr'); const tbodyLeftAltTdDom = printWin.document.createElement('td'); const tbodyContentTdDom = printWin.document.createElement('td'); const tbodyRightAltTdDom = printWin.document.createElement('td'); const questionTitleDom = printWin.document.createElement('div'); questionTitleDom.innerText = `${numberToChinese(iof + 1)}、${item.questionTitle}(本节共${item.subQuestions.length}小题,共${item.score}分)`; tbodyContentTdDom.appendChild(questionTitleDom); tbodyTrDom.appendChild(tbodyLeftAltTdDom); tbodyTrDom.appendChild(tbodyContentTdDom); tbodyTrDom.appendChild(tbodyRightAltTdDom); tbodyDom.appendChild(tbodyTrDom); for (var idof = 0; idof < item.subQuestions.length; idof++) { const qTbodyTrDom = printWin.document.createElement('tr'); const qTbodyLeftAltTdDom = printWin.document.createElement('td'); const qTbodyContentTdDom = printWin.document.createElement('td'); const qTbodyRightAltTdDom = printWin.document.createElement('td'); const questionDom = printWin.document.createElement('div'); var subItem = item.subQuestions[idof]; var screenshotHtml = await fetchHTML(subItem.screenshot); var getStyleScripts = iof == 0 && idof == 0; var screenshotObject = htmlParseDom(screenshotHtml, getStyleScripts); var screenshotDoms = screenshotObject.doms; if (screenshotDoms.length <= 0) continue; for (var dom = 0; dom < screenshotDoms.length; dom++) { var screenshotDom = screenshotDoms[dom]; questionDom.appendChild(screenshotDom); } qTbodyContentTdDom.appendChild(questionDom); qTbodyTrDom.appendChild(qTbodyLeftAltTdDom); qTbodyTrDom.appendChild(qTbodyContentTdDom); qTbodyTrDom.appendChild(qTbodyRightAltTdDom); tbodyDom.appendChild(qTbodyTrDom); } } tableDom.appendChild(tbodyDom); printWin.document.body.appendChild(tableDom); const tfootDom = printWin.document.createElement('tfoot'); const tfootTrDom = printWin.document.createElement('tr'); tfootTrDom.appendChild(printWin.document.createElement('td')); tfootTrDom.appendChild(printWin.document.createElement('td')); tfootTrDom.appendChild(printWin.document.createElement('td')); tfootDom.appendChild(tfootTrDom); tableDom.appendChild(tfootDom); // generatePageParams(); const iamges = printWin.document.querySelectorAll('img'); if (iamges.length >= 1) { iamges[iamges.length - 1].onload = function () { printWin.print(); printWin.close(); } } else { printWin.print(); printWin.close(); } } export function tablePrint(options) { var id = options.id; var title = options.title; var lindex = options.lindex; var splitParam = options.splitParam ?? 20; var printType = options.printType; var fixedColumn = options.fixedColumn ?? 0; var diffNumber = options.diffNumber ?? 0; var diffStNumber = options.diffStNumber ?? 0; let divs = document.getElementById(id); let awin = window.open("中天易教", "_blank", "width=800,height=600,resizable=no"); awin.document.getElementsByTagName( "head" )[0].innerHTML = ``; var splitNumber = splitParam ? splitParam : 20; let aDom = divs.cloneNode(true); let thead = aDom.querySelectorAll(".el-table__header-wrapper thead"); let tbody = aDom.querySelectorAll(".el-table__body-wrapper table"); var lastNotHiddenNumber = 0; if (tbody.length >= 1) { for (var tb = 0; tb < tbody.length; tb++) { var currentTbody = tbody[tb]; var currentThead = thead[tb]; var headTrs = currentThead.querySelectorAll("tr"); var headThs = null; if (lindex != null && lindex >= 0) headThs = headTrs[lindex].querySelectorAll("th"); else headThs = headTrs[headTrs.length - 1].querySelectorAll("th"); if (headThs.length > splitNumber) { var bodyTrs = currentTbody.querySelectorAll("tr"); var roas = Math.ceil(headThs.length / splitNumber); if (fixedColumn) { var thLength = headThs.length; thLength -= splitNumber; roas = 1; splitNumber -= fixedColumn; roas += Math.ceil(thLength / splitNumber); } else fixedColumn = 0; for (var stao = 1; stao < roas; stao++) { var newThead = currentThead.cloneNode(true); var newTbody = currentTbody.cloneNode(); var newTrs = newThead.querySelectorAll("tr"); for (var trds = 0; trds < newTrs.length; trds++) { var newThs = newTrs[trds].querySelectorAll("th"); var index = 0; for (var lpss = 0; lpss < newThs.length; lpss++) { var newTh = newThs[lpss]; if (!newTh) continue; if (stao == roas - 1 && index >= splitNumber + fixedColumn) { var currentTh = headTrs[trds].querySelectorAll("th")[lpss]; if (currentTh) { currentTh.style.display = "none"; } } var min = (stao + 1) * splitNumber; var max = stao * splitNumber; if (fixedColumn != 0) { min += fixedColumn; max += fixedColumn; } if (index >= min || index < max) { if (trds == 0 && fixedColumn != 0 && lpss < fixedColumn) { if (stao == roas - 1) lastNotHiddenNumber += 1; continue; } newTh.style.display = "none"; } else if (stao == roas - 1) lastNotHiddenNumber += 1; var colspan = Number(newTh.getAttribute("colspan")) || 0; index += 1; if (colspan > 1) { index += colspan - 1; } } } for (var trd = 0; trd < bodyTrs.length; trd++) { var currentTr = bodyTrs[trd]; var newTr = currentTr.cloneNode(true); var currentTds = currentTr.querySelectorAll("td"); var newTds = newTr.querySelectorAll("td"); var length = headThs.length + diffNumber; for (var lps = 0; lps < length; lps++) { var lpsIndex = lps; if (lps > diffStNumber) lpsIndex = lps - diffNumber; var newTd = newTds[lps]; if (!newTd) continue; if (stao == roas - 1 && lpsIndex >= splitNumber + fixedColumn) { var currentTd = currentTds[lps]; if (currentTd) { currentTd.style.display = "none"; } } var min = (stao + 1) * splitNumber; var max = stao * splitNumber; if (fixedColumn != 0) { min += fixedColumn; max += fixedColumn; } if (lpsIndex >= min || lpsIndex < max) { if (fixedColumn != 0 && lpsIndex < fixedColumn) continue; newTd.style.display = "none"; } } newTbody.appendChild(newTr); } if (lastNotHiddenNumber == fixedColumn) continue; newTbody.appendChild(newThead); newTbody.classList.add("_addedList"); currentTbody.parentNode.parentNode.append(newTbody); } } currentTbody.appendChild(currentThead); } } if (title) { let pTit = awin.document.createElement("p"); pTit.className = "tit"; pTit.innerHTML = title; awin.document.body.append(pTit); } let pagedoc = awin.document.createElement("div"); pagedoc.className = "page-number"; awin.document.body.append(pagedoc); awin.document.body.append(aDom); let pagedom = awin.document.querySelectorAll(".page-number"); awin.print(); awin.close(); } export const cNum = [ "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", ]; // 当学期时间 function getDateRange() { const currentDate = new Date(); const currentYear = currentDate.getFullYear(); const currentMonth = currentDate.getMonth() + 1; // getMonth() 返回的是 0-11 let startDate, endDate; if (currentMonth >= 2 && currentMonth <= 7) { // 在 2 月到 7 月之间 startDate = `${currentYear}-02-01`; endDate = `${currentYear}-07-31`; } else { // 不在 2 月到 7 月之间 startDate = `${currentYear}-08-01`; endDate = `${currentYear + 1}-01-31`; // 下一年的 1 月 31 日 } return [startDate, endDate]; }