此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/471561/1260860/SinHelper.js
您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
(我已经安装了用户样式管理器,让我安装!)
- ; (function () {
- window.sinHelper = {
- Cache: {
-
- },
- /* 网络拦截相关 */
- Xhr: {
- inited: false,
- init: function () {
- if (this.inited === true) return;
- let oldSend = XMLHttpRequest.prototype.send, _this = this;
- XMLHttpRequest.prototype.send = function () {
- let xhr = this
- this.addEventListener("load", function () {
- if (xhr.readyState != 4 || xhr.status != 200) return;
- if (xhr.responseType != '' && xhr.responseType != 'text') return;
- xhr.requestData = arguments
- xhr.responseHeders = xhr.getAllResponseHeaders()
- xhr.responseData = function () {
- try {
- return JSON.parse(xhr.responseText)
- } catch (e) {
- return xhr.responseText
- }
- }();
- _this.dispatchFetch(xhr)
- })
- oldSend.apply(this, arguments);
- }
- this.inited = true;
- },
- rules: {}, // pathname => function
- routes: [], // functions
- registRules: function (ruleName, ruleFunc) {
- if (typeof (ruleFunc) != 'function') {
- console.error("Xhr Rules 必须是可调用的函数", ruleName)
- return
- }
- this.rules[ruleName] = ruleFunc
- },
- /* 调用注册(不可用)的 pathname 处理函数 */
- dispatchFetch: function (xhr) {
- let _this = this
- const url = new URL(xhr.responseURL)
- if (_this.rules[url.pathname]) {
- if (typeof (this.rules[url.pathname]) == 'function') {
- this.rules[url.pathname](xhr)
- } else {
- console.error("Xhr 处理函数错误:", url.pathname)
- }
- } else {
- _this.routes.forEach((route) => {
- if (typeof (route) == 'function') {
- route(xhr)
- }
- })
- }
- }
- },
- Url: {
- info: function (_url) {
- let urlInfo = new URL(_url)
-
- urlInfo['getParams'] = function (_key) {
- let _obj = Object.fromEntries(urlInfo.searchParams.entries())
- if (_key) return _obj[_key] || null
- return _obj
- }
-
- return urlInfo
- },
- getParams: function (_url, _key) {
- let urlStr = _url.split('?')[1]
- let urlSearchParams = new URLSearchParams(urlStr)
- let result = Object.fromEntries(urlSearchParams.entries())
- if (_key) return result[_key] || null
- return result
- }
- },
- /* 原生JS 下载Excel */
- Excel: {
- 'trans2Base64': function (content) {
- return window.btoa(unescape(encodeURIComponent(content)));
- },
- 'exportExcelFromFront': function (params) {
- let _this = this
- const { cellList, headerList, caption, exportName = 'exportName' } = params;
-
- const captionEle = caption ? `<caption>${caption}</caption>` : ''; // 表格标题
- const headerEle = `<tr>${headerList?.map((item) => `<th>${item}</th>`)?.join('')}</tr>`;
- const cellEle = cellList
- ?.map((itemRow) => `<tr>${itemRow?.map((itemCell) => `<td>${itemCell}</td>`)?.join('')}</tr>`)
- ?.join('');
-
- const excelContent = `${captionEle}${headerEle}${cellEle}`;
- let worksheet = '工作表1';
- let excelFile =
- "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>";
- excelFile +=
- `<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>${worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>`;
- excelFile += "<body><table width='10%' border='1'>";
- excelFile += excelContent;
- excelFile += '</table></body>';
- excelFile += '</html>';
- const link = `data:application/vnd.ms-excel;base64,${_this.trans2Base64(excelFile)}`;
- const a = document.createElement('a');
- a.download = `${exportName}.xlsx`;
- a.href = link;
- a.click();
- }
- },
- /* 数学函数 */
- Math: {
- round: function (_number, _precision) {
- if (!_precision) _precision = 0
- _precision = _precision * 1
- let _power = 10 ** _precision
- return Math.round(_number * _power) / _power
- }
- },
- Str: {
- decodeBase64Safe: function (_encoded) {
- _encoded = _encoded.replace(/-/g, '+').replace(/_/g, '/');
- while (_encoded.length % 4) {
- _encoded += '=';
- }
- return atob(_encoded);
- }
- },
- Time: {
- /**
- * 格式化时间戳
- * @param {string|Date|number} [value='']
- * @param {string} [fmt='yyyy-MM-dd hh:mm:ss']
- * @returns {string}
- */
- format: function (value, fmt) {
- let date = value
- if (typeof value !== 'object' && !value.hasOwnProperty('getFullYear')) {
- date = new Date(), value = value + ''
- if (value.length === 10) date = new Date(value * 1000)
- if (value.length === 13) date = new Date(value * 1)
- }
-
- if (!fmt) fmt = 'yyyy-MM-dd hh:mm:ss'
- let o = {
- "M+": date.getMonth() + 1,
- "d+": date.getDate(),
- "h+": date.getHours(),
- "m+": date.getMinutes(),
- "s+": date.getSeconds(),
- "q+": Math.floor((date.getMonth() + 3) / 3),
- "S": date.getMilliseconds()
- };
- if (/(y+)/.test(fmt)) {
- fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
- }
- for (let k in o) {
- if (new RegExp("(" + k + ")").test(fmt)) {
- fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
- }
- }
- return fmt;
- },
- /**
- * 秒数 转 时分秒
- */
- convert: function (seconds) {
- let d = 0, h = 0, m = 0, s = 0, res = ''
-
- if (seconds >= 86400) d = parseInt(seconds / 60 / 60 / 24)
- if (seconds >= 3600) h = parseInt(seconds / 60 / 60 % 24)
- if (seconds >= 60) m = parseInt(seconds / 60 % 60)
- s = parseInt(seconds % 60)
-
- if (d > 0) res += d + '天'
- if (h > 0) res += (h < 10 ? '0' + h : h) + '小时'
- if (m > 0) res += (m < 10 ? '0' + m : m) + '分'
- if (s > 0) res += (s < 10 ? '0' + s : s) + '秒'
- return res
- }
- }
- };
- })();