免Flash文件上传

无需调用Flash,从课程平台上传附件,不必为了传作业多装一个浏览器!

目前为 2021-12-28 提交的版本。查看 最新版本

// ==UserScript==
// @name             免Flash文件上传
// @namespace        https://gf.qytechs.cn/zh-CN/users/605474
// @version          1.4.1
// @description      无需调用Flash,从课程平台上传附件,不必为了传作业多装一个浏览器!
// @author           ZiuChen <[email protected]>
// @source           https://github.com/ZiuChen/NO-FLASH-Upload
// @match            *://cc.bjtu.edu.cn:81/*
// @require          https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @require          https://cdn.bootcdn.net/ajax/libs/jquery/1.7.2/jquery.min.js
// @require          https://cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.8/clipboard.min.js
// @icon             https://gitee.com/ziuc/utool-filebed/raw/master/20210514-231824-0795.png
// @license          MIT
// @name:en          NO-FLASH-Upload
// @description:en   No need to call Flash, upload accessories from the course platform, do not have to install another browser for the homework!
// ==/UserScript==


/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ "./node_modules/css-loader/dist/runtime/api.js":
/***/ ((module) => {


/*
  MIT License http://www.opensource.org/licenses/mit-license.php
  Author Tobias Koppers @sokra
*/

module.exports = function (cssWithMappingToString) {
  var list = []; // return the list of modules as css string

  list.toString = function toString() {
    return this.map(function (item) {
      var content = "";
      var needLayer = typeof item[5] !== "undefined";

      if (item[4]) {
        content += "@supports (".concat(item[4], ") {");
      }

      if (item[2]) {
        content += "@media ".concat(item[2], " {");
      }

      if (needLayer) {
        content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
      }

      content += cssWithMappingToString(item);

      if (needLayer) {
        content += "}";
      }

      if (item[2]) {
        content += "}";
      }

      if (item[4]) {
        content += "}";
      }

      return content;
    }).join("");
  }; // import a list of modules into the list


  list.i = function i(modules, media, dedupe, supports, layer) {
    if (typeof modules === "string") {
      modules = [[null, modules, undefined]];
    }

    var alreadyImportedModules = {};

    if (dedupe) {
      for (var k = 0; k < this.length; k++) {
        var id = this[k][0];

        if (id != null) {
          alreadyImportedModules[id] = true;
        }
      }
    }

    for (var _k = 0; _k < modules.length; _k++) {
      var item = [].concat(modules[_k]);

      if (dedupe && alreadyImportedModules[item[0]]) {
        continue;
      }

      if (typeof layer !== "undefined") {
        if (typeof item[5] === "undefined") {
          item[5] = layer;
        } else {
          item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
          item[5] = layer;
        }
      }

      if (media) {
        if (!item[2]) {
          item[2] = media;
        } else {
          item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
          item[2] = media;
        }
      }

      if (supports) {
        if (!item[4]) {
          item[4] = "".concat(supports);
        } else {
          item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
          item[4] = supports;
        }
      }

      list.push(item);
    }
  };

  return list;
};

/***/ }),

/***/ "./node_modules/css-loader/dist/runtime/noSourceMaps.js":
/***/ ((module) => {



module.exports = function (i) {
  return i[1];
};

/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js!./src/style/css/PopNotify.css":
/***/ ((module, __webpack_exports__, __webpack_require__) => {

/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Z": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/css-loader/dist/runtime/noSourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports


var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, "/**\r\n    PopNotify.css\r\n    @author CKylinMC\r\n    @version 1.1\r\n    @license MIT\r\n*/\r\n\r\ndiv.popNotifyUnitFrame {\r\n    cursor: pointer;\r\n    box-shadow: 0 3px 6px #80808085;\r\n    min-width: 300px;\r\n    position: fixed;\r\n    z-index: 9999;\r\n    width: max-content;\r\n    min-height: 60px;\r\n    height: fit-content;\r\n    text-align: left;\r\n    top: -100%;\r\n    right: -100%;\r\n    /* overflow: hidden; */\r\n    opacity: 1;\r\n    background: white;\r\n    border-radius: 6px;\r\n    /* animation: pnin forwards .3s cubic-bezier(0, 0.6, 0, 1); */\r\n    /* animation: pnin forwards .8s cubic-bezier(0.04, 1.01, 0.17, 1.04); */\r\n    animation: pnin forwards .8s cubic-bezier(0.1, 1, 0, 1.05);\r\n    transition: .3s;\r\n    /*padding: 6px 12px;*/\r\n    overflow: hidden;\r\n}\r\n\r\ndiv.popNotifyUnitFrame>*:not(i):nth-child(1) {\r\n    margin-bottom: 0;\r\n}\r\n\r\ndiv.popNotifyUnitFrame>*:not(i):nth-child(2) {\r\n    margin-top: 0;\r\n}\r\n\r\n.popNotifyUnitTitle,\r\n.popNotifyUnitContent {\r\n    transform: translateX(50px);\r\n    opacity: 0;\r\n    min-height: 30px;\r\n    height: fit-content;\r\n    margin: 6px 12px;\r\n    font-size: 1em;\r\n}\r\n\r\n.popNotifyUnitTitle {\r\n    font-weight: bold;\r\n    font-size: 1.5em;\r\n}\r\n\r\n.popNotifyUnitBar {\r\n    display: block;\r\n    position: absolute;\r\n    left: 0;\r\n    bottom: 0;\r\n    height: 3px;\r\n    width: 0%;\r\n    background: black;\r\n    animation-name: pnbar;\r\n    animation-timing-function: linear;\r\n}\r\n\r\n.popStyle-success {\r\n    background: rgb(172, 255, 223)!important;\r\n}\r\n\r\n.popStyle-success .popNotifyUnitTitle,\r\n.popStyle-success .popNotifyUnitContent {\r\n    color: rgb(0, 114, 70) !important;\r\n}\r\n\r\n.popStyle-success .popNotifyUnitBar {\r\n    background: rgb(0, 114, 70) !important;\r\n}\r\n\r\n.popStyle-info {\r\n    background: rgb(195, 226, 255) !important;\r\n}\r\n\r\n.popStyle-info .popNotifyUnitTitle,\r\n.popStyle-info .popNotifyUnitContent {\r\n    color: rgb(0, 80, 155) !important;\r\n}\r\n\r\n.popStyle-info .popNotifyUnitBar {\r\n    background: rgb(0, 80, 155) !important;\r\n}\r\n\r\n.popStyle-error {\r\n    background: rgb(255, 196, 196) !important;\r\n}\r\n\r\n.popStyle-error .popNotifyUnitTitle,\r\n.popStyle-error .popNotifyUnitContent {\r\n    color: rgb(255, 66, 66) !important;\r\n}\r\n\r\n.popStyle-error .popNotifyUnitBar {\r\n    background: rgb(255, 66, 66) !important;\r\n}\r\n\r\n.popStyle-warn {\r\n    background: rgb(255, 218, 139) !important;\r\n}\r\n\r\n.popStyle-warn .popNotifyUnitTitle,\r\n.popStyle-warn .popNotifyUnitContent {\r\n    color: rgb(177, 94, 0) !important;\r\n}\r\n\r\n.popStyle-warn .popNotifyUnitBar {\r\n    background: rgb(177, 94, 0) !important;\r\n}\r\n\r\n@keyframes pnin {\r\n    from {\r\n        opacity: 0;\r\n        right: -100%;\r\n    }\r\n    /* to {\r\n        opacity: 1;\r\n        right: 20px;\r\n    } */\r\n}\r\n\r\n@keyframes pnout {\r\n    to {\r\n        opacity: 0;\r\n        right: -100%;\r\n    }\r\n}\r\n\r\n@keyframes pntextin {\r\n    to {\r\n        opacity: 1;\r\n        transform: translateX(0);\r\n    }\r\n}\r\n\r\n@keyframes pnbar {\r\n    to {\r\n        width: 100%;\r\n    }\r\n}", ""]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);


/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js!./src/style/css/reminderCSS.css":
/***/ ((module, __webpack_exports__, __webpack_require__) => {

/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Z": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/css-loader/dist/runtime/noSourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports


var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, ".top {\r\n    font-weight: bold;\r\n}\r\n\r\n.hwtName,\r\n.courseName {\r\n    font-size: 105%;\r\n    cursor: pointer;\r\n}\r\n\r\n.listwrap>.list {\r\n    overflow: auto;\r\n    height: 150px;\r\n}", ""]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);


/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js!./src/style/css/upload-doms.css":
/***/ ((module, __webpack_exports__, __webpack_require__) => {

/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Z": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/css-loader/dist/runtime/noSourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports


var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, "/*\r\n    upload-doms.css\r\n    @author ZiuChen\r\n*/\r\n\r\nbody {\r\n    font-family: PingFang SC,HarmonyOS_Regular,Helvetica Neue,Microsoft YaHei,sans-serif!important;\r\n    font-weight: 400;\r\n    background-color: #F1F2F3;\r\n}\r\n\r\n#inputDiv {\r\n    height: 200px;\r\n    width: 560px;\r\n    margin-top: 20px;\r\n    margin-bottom: 10px;\r\n    box-shadow: 5px 5px 5px #888888;\r\n    cursor: pointer;\r\n    border: 4px solid;\r\n    border-radius: 10px;\r\n    border-color: #82b900;\r\n    background: #c6f062;\r\n}\r\n\r\n#currentFile {\r\n    display: none;\r\n}\r\n\r\n#filenames {\r\n    height: 200px;\r\n    overflow: auto;\r\n    margin-top: 10px;\r\n    margin-bottom: 10px;\r\n    border: 3px solid rgb(130, 185, 0);\r\n    box-shadow: 5px 5px 5px #888888;\r\n    border-radius: 10px;\r\n    -moz-user-select: none;\r\n\t-webkit-user-select: none;\r\n\t-ms-user-select: none;\r\n\tuser-select: none;\r\n}\r\n\r\n/* 滚动条 */\r\n#filenames::-webkit-scrollbar {\r\n    width: 12px;\r\n}\r\n/* 滚动槽 */\r\n#filenames::-webkit-scrollbar-track {\r\n    border-radius: 10px;\r\n}\r\n/* 滑块 */\r\n#filenames::-webkit-scrollbar-thumb {\r\n    border-radius: 10px;\r\n    background: rgba(0,0,0,0.1);\r\n}\r\n\r\n#filenames::-webkit-scrollbar-thumb:active {\r\n    border-radius: 10px;\r\n    background: rgba(0,0,0,0.4);\r\n}\r\n\r\n#buttonDiv {\r\n    margin-top: 20px;\r\n    margin-bottom: 10px;\r\n    text-align: center;\r\n    -moz-user-select: none;\r\n\t-webkit-user-select: none;\r\n\t-ms-user-select: none;\r\n\tuser-select: none;\r\n}\r\n\r\n#outerDiv {\r\n    font-size: 14px;\r\n    width: 590px;\r\n    margin: 0 auto;\r\n    margin-top: 5px;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#fileInfo {\r\n    text-align: left;\r\n    cursor: default;\r\n}\r\n\r\n#textShow {\r\n    margin-top: 80px;\r\n    font-size: 20px;\r\n    color: #424d55;\r\n    text-align: center;\r\n}\r\n\r\n#userTips {\r\n    color: #c0c1bb;\r\n    cursor: default;\r\n}\r\n\r\n#buttonDiv>a {\r\n    cursor: pointer;\r\n    padding-top: 5.5px;\r\n    padding-bottom: 5.5px;\r\n    padding-right: 12px;\r\n    padding-left: 12px;\r\n    margin-right: 12px;\r\n    margin-left: 12px;\r\n    border-radius: 5px;\r\n    box-shadow: 1px 1px 3px #888888;\r\n    background-color: #c6f062;\r\n    border: 2px solid;\r\n}\r\n\r\n.fileObjects {\r\n    cursor:default;\r\n    margin-top: 10px;\r\n    margin-bottom: 10px;\r\n    background-image: url(\"http://cc.bjtu.edu.cn:81/meol/styles/newstyle/course/new06/body_bg.jpg\");\r\n    background-repeat:no-repeat;\r\n    background-size: 0%;\r\n}", ""]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);


/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
/***/ ((module) => {



var stylesInDOM = [];

function getIndexByIdentifier(identifier) {
  var result = -1;

  for (var i = 0; i < stylesInDOM.length; i++) {
    if (stylesInDOM[i].identifier === identifier) {
      result = i;
      break;
    }
  }

  return result;
}

function modulesToDom(list, options) {
  var idCountMap = {};
  var identifiers = [];

  for (var i = 0; i < list.length; i++) {
    var item = list[i];
    var id = options.base ? item[0] + options.base : item[0];
    var count = idCountMap[id] || 0;
    var identifier = "".concat(id, " ").concat(count);
    idCountMap[id] = count + 1;
    var indexByIdentifier = getIndexByIdentifier(identifier);
    var obj = {
      css: item[1],
      media: item[2],
      sourceMap: item[3],
      supports: item[4],
      layer: item[5]
    };

    if (indexByIdentifier !== -1) {
      stylesInDOM[indexByIdentifier].references++;
      stylesInDOM[indexByIdentifier].updater(obj);
    } else {
      var updater = addElementStyle(obj, options);
      options.byIndex = i;
      stylesInDOM.splice(i, 0, {
        identifier: identifier,
        updater: updater,
        references: 1
      });
    }

    identifiers.push(identifier);
  }

  return identifiers;
}

function addElementStyle(obj, options) {
  var api = options.domAPI(options);
  api.update(obj);

  var updater = function updater(newObj) {
    if (newObj) {
      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {
        return;
      }

      api.update(obj = newObj);
    } else {
      api.remove();
    }
  };

  return updater;
}

module.exports = function (list, options) {
  options = options || {};
  list = list || [];
  var lastIdentifiers = modulesToDom(list, options);
  return function update(newList) {
    newList = newList || [];

    for (var i = 0; i < lastIdentifiers.length; i++) {
      var identifier = lastIdentifiers[i];
      var index = getIndexByIdentifier(identifier);
      stylesInDOM[index].references--;
    }

    var newLastIdentifiers = modulesToDom(newList, options);

    for (var _i = 0; _i < lastIdentifiers.length; _i++) {
      var _identifier = lastIdentifiers[_i];

      var _index = getIndexByIdentifier(_identifier);

      if (stylesInDOM[_index].references === 0) {
        stylesInDOM[_index].updater();

        stylesInDOM.splice(_index, 1);
      }
    }

    lastIdentifiers = newLastIdentifiers;
  };
};

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js":
/***/ ((module) => {



var memo = {};
/* istanbul ignore next  */

function getTarget(target) {
  if (typeof memo[target] === "undefined") {
    var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself

    if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
      try {
        // This will throw an exception if access to iframe is blocked
        // due to cross-origin restrictions
        styleTarget = styleTarget.contentDocument.head;
      } catch (e) {
        // istanbul ignore next
        styleTarget = null;
      }
    }

    memo[target] = styleTarget;
  }

  return memo[target];
}
/* istanbul ignore next  */


function insertBySelector(insert, style) {
  var target = getTarget(insert);

  if (!target) {
    throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
  }

  target.appendChild(style);
}

module.exports = insertBySelector;

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js":
/***/ ((module) => {



/* istanbul ignore next  */
function insertStyleElement(options) {
  var element = document.createElement("style");
  options.setAttributes(element, options.attributes);
  options.insert(element, options.options);
  return element;
}

module.exports = insertStyleElement;

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js":
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {



/* istanbul ignore next  */
function setAttributesWithoutAttributes(styleElement) {
  var nonce =  true ? __webpack_require__.nc : 0;

  if (nonce) {
    styleElement.setAttribute("nonce", nonce);
  }
}

module.exports = setAttributesWithoutAttributes;

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js":
/***/ ((module) => {



/* istanbul ignore next  */
function apply(styleElement, options, obj) {
  var css = "";

  if (obj.supports) {
    css += "@supports (".concat(obj.supports, ") {");
  }

  if (obj.media) {
    css += "@media ".concat(obj.media, " {");
  }

  var needLayer = typeof obj.layer !== "undefined";

  if (needLayer) {
    css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");
  }

  css += obj.css;

  if (needLayer) {
    css += "}";
  }

  if (obj.media) {
    css += "}";
  }

  if (obj.supports) {
    css += "}";
  }

  var sourceMap = obj.sourceMap;

  if (sourceMap && typeof btoa !== "undefined") {
    css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
  } // For old IE

  /* istanbul ignore if  */


  options.styleTagTransform(css, styleElement, options.options);
}

function removeStyleElement(styleElement) {
  // istanbul ignore if
  if (styleElement.parentNode === null) {
    return false;
  }

  styleElement.parentNode.removeChild(styleElement);
}
/* istanbul ignore next  */


function domAPI(options) {
  var styleElement = options.insertStyleElement(options);
  return {
    update: function update(obj) {
      apply(styleElement, options, obj);
    },
    remove: function remove() {
      removeStyleElement(styleElement);
    }
  };
}

module.exports = domAPI;

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js":
/***/ ((module) => {



/* istanbul ignore next  */
function styleTagTransform(css, styleElement) {
  if (styleElement.styleSheet) {
    styleElement.styleSheet.cssText = css;
  } else {
    while (styleElement.firstChild) {
      styleElement.removeChild(styleElement.firstChild);
    }

    styleElement.appendChild(document.createTextNode(css));
  }
}

module.exports = styleTagTransform;

/***/ }),

/***/ "./package.json":
/***/ ((module) => {

module.exports = JSON.parse('{"name":"no-flash-upload","description":"一个北京交通大学课程平台附件上传脚本。","version":"1.4.1","author":{"name":"ZiuChen","email":"[email protected]"},"scripts":{"postversion":"git push --follow-tags","analize":"npm_config_report=true npm run build","build":"webpack --mode production --config config/webpack.config.production.cjs","dev":"webpack --mode development --config config/webpack.config.dev.cjs"},"repository":{"type":"git","url":"https://github.com/ZiuChen/NO-FLASH-Upload"},"private":true,"dependencies":{"axios":"0.24.0","axios-userscript-adapter":"0.1.8","jquery":"3.6.0"},"devDependencies":{"@babel/core":"7.16.0","@babel/preset-env":"7.16.0","@babel/preset-typescript":"7.16.0","@types/greasemonkey":"4.0.2","@typescript-eslint/eslint-plugin":"5.2.0","@typescript-eslint/parser":"5.2.0","babel-loader":"8.2.3","browserslist":"4.17.5","css-loader":"6.5.0","less":"4.1.2","less-loader":"10.2.0","style-loader":"3.3.1","typescript":"4.4.4","userscript-metadata-webpack-plugin":"0.1.1","webpack":"5.61.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.1","webpack-livereload-plugin":"3.0.2","webpack-merge":"5.8.0"}}');

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			id: moduleId,
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/compat get default export */
/******/ 	(() => {
/******/ 		// getDefaultExport function for compatibility with non-harmony modules
/******/ 		__webpack_require__.n = (module) => {
/******/ 			var getter = module && module.__esModule ?
/******/ 				() => (module['default']) :
/******/ 				() => (module);
/******/ 			__webpack_require__.d(getter, { a: getter });
/******/ 			return getter;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {

;// CONCATENATED MODULE: ./src/functions/append-tags/front-tags.js
let Tag1 =
/*html*/
`<li><a id="add_button" title="上传作业" onclick=location="http://cc.bjtu.edu.cn:81/meol/common/hw/student/hwtask.jsp?tagbug=client&strStyle=new06"><span>上传作业</span></a></li>`;
let Tag2 =
/*html*/
`<li><a id="add_button" title="下载资源" onclick=location="http://cc.bjtu.edu.cn:81/meol/common/script/listview.jsp?lid=${location.href.split('courseId=')[1]}&folderid=0"><span>下载资源</span></a></li>`;
/* harmony default export */ const front_tags = ({
  tag1: Tag1,
  tag2: Tag2
});
;// CONCATENATED MODULE: ./src/functions/append-tags/append-tags.js


function apppendTags() {
  $('#tmenu').append(front_tags.tag1, front_tags.tag2);
}

/* harmony default export */ const append_tags = (apppendTags);
;// CONCATENATED MODULE: ./src/functions/file-upload/tips-blow.js
let tips = {
  p1:
  /*html*/
  `<p>Tips:上传前点击文件前的图标可以删除该文件,文件上传后点击文件名获取文件下载链接。</p>`,
  p2:
  /*html*/
  `<p>感谢您使用此脚本,欢迎<a href="https://gf.qytechs.cn/zh-CN/scripts/432056" target="blank">好评</a>并<a href="https://blog.csdn.net/Huuc6/article/details/120256435" target="blank">推荐</a>给身边同学,</p>`,
  p3:
  /*html*/
  `<p>如果喜欢这个脚本,可以选择<a href="https://gitee.com/ziuc/utool-filebed/raw/master/Buy me a coffee.png" target="blank">捐赠</a>,这将鼓励我持续维护这个脚本。</p>`
};
/* harmony default export */ const tips_blow = (tips);
;// CONCATENATED MODULE: ./src/functions/file-upload/upload-doms.js

let inputDiv =
/* html */
`<div id="inputDiv"><div id="inputArea"><div id="textShow"><p id="p1">📁文件上传📝</p><p id="p2" style="font-size: 15px">(支持拖拽上传文件)</p></div></div></div>`;
let inputTag =
/* html */
`<input id="currentFile" type="file" multiple="multiple"</input>`;
let fileInfoDiv =
/* html */
`<div id="fileInfo"><a>已选择文件:</a></div>`;
let filenamesDiv =
/* html */
`<div id="filenames"></div>`;
let uploadBtn =
/* html */
`<a id="uploadTrigger" title="上传">上传</a>`;
let emptyBtn =
/* html */
`<a id="emptyTrigger" title="清空">清空</a>`;
let buttonDiv =
/* html */
`<div id="buttonDiv">${uploadBtn}${emptyBtn}</div>`;
let usertipsDiv =
/* html */
`<div id="userTips"><details>${tips_blow.p1}${tips_blow.p2}${tips_blow.p3}<summary>更多信息</summary></details></div>`;
let uploadBox =
/* html */
`<tr><td><div id="outerDiv">${inputDiv}${inputTag}${fileInfoDiv}${filenamesDiv}${buttonDiv}${usertipsDiv}</div></td></tr>`;
/* harmony default export */ const upload_doms = ({
  box: uploadBox,
  uploadBtn: uploadBtn,
  emptyBtn: emptyBtn
});
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js
var injectStylesIntoStyleTag = __webpack_require__("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
var injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js
var styleDomAPI = __webpack_require__("./node_modules/style-loader/dist/runtime/styleDomAPI.js");
var styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js
var insertBySelector = __webpack_require__("./node_modules/style-loader/dist/runtime/insertBySelector.js");
var insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js
var setAttributesWithoutAttributes = __webpack_require__("./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
var setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js
var insertStyleElement = __webpack_require__("./node_modules/style-loader/dist/runtime/insertStyleElement.js");
var insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js
var styleTagTransform = __webpack_require__("./node_modules/style-loader/dist/runtime/styleTagTransform.js");
var styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);
// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/style/css/PopNotify.css
var PopNotify = __webpack_require__("./node_modules/css-loader/dist/cjs.js!./src/style/css/PopNotify.css");
;// CONCATENATED MODULE: ./src/style/css/PopNotify.css

      
      
      
      
      
      
      
      
      

var options = {};

options.styleTagTransform = (styleTagTransform_default());
options.setAttributes = (setAttributesWithoutAttributes_default());

      options.insert = insertBySelector_default().bind(null, "head");
    
options.domAPI = (styleDomAPI_default());
options.insertStyleElement = (insertStyleElement_default());

var update = injectStylesIntoStyleTag_default()(PopNotify/* default */.Z, options);




       /* harmony default export */ const css_PopNotify = (PopNotify/* default */.Z && PopNotify/* default.locals */.Z.locals ? PopNotify/* default.locals */.Z.locals : undefined);

;// CONCATENATED MODULE: ./src/js/PopNotify.js
/**
 * PopNotify.js
 * @author CKylinMC
 * @version 1.1
 * @licence MIT
 */


function popNotifyUnit(title, content, onclick, timeout, style, autoshow) {
  this.constructor = function (title, content, onclick, timeout) {
    this.title = title;
    this.content = content;
    this.onclick = onclick instanceof Function ? onclick : this.close(this);
    this.timeout = timeout || 5000;
    this.id = "PNU_" + Math.floor(Math.random() * 1000000) + new Date().getMilliseconds().toString();
    this.posRight = 20;
    this.posTop = popNotify.getNextYPos();
    this.timer = null;
    this.style = style;
    this.showing = false;
    this.destoried = false; // window[this.id] = this;

    if (autoshow) this.show();
  };

  this.setPosRight = function (x) {
    // if (!this.showing) return;
    x = parseFloat(x);
    if (isNaN(x)) return;
    this.posRight = x;
    this.update();
  };

  this.setPosTop = function (y) {
    // if (!this.showing) return;
    y = parseFloat(y);
    if (isNaN(y)) return;
    this.posTop = y;
    this.update();
  };

  this.update = function () {
    let el = document.querySelector("#" + this.id);
    if (!el) return;
    el.style.top = this.posTop + "px";
    el.style.right = this.posRight + "px";
  };

  this.clicked = function (e, ev) {
    return function () {
      if (e.onclick(ev, e) !== false) e.destory();
    };
  };

  this.show = function () {
    if (this.timer) clearTimeout(this.timer);
    let el = document.querySelector("#" + this.id);
    if (el) el.remove();
    el = document.createElement("div");
    el.id = this.id;
    el.className = "popNotifyUnitFrame" + (this.style ? " popStyle-" + this.style : "");
    el.onclick = this.clicked(this);
    el.style.top = this.posTop + "px";
    el.style.right = this.posRight + "px";

    if (this.title != null) {
      let t = document.createElement("div");
      t.innerText = this.title;
      t.className = "popNotifyUnitTitle";
      t.style.animation = "pntextin .8s forwards .2s cubic-bezier(0, 0.6, 0, 1)";
      el.appendChild(t);
    }

    if (this.content != null) {
      let c = document.createElement("div");
      c.innerText = this.content;
      c.className = "popNotifyUnitContent";
      c.style.animation = "pntextin .8s forwards .3s cubic-bezier(0, 0.6, 0, 1)";
      el.appendChild(c);
    }

    let b = document.createElement("i");
    b.className = "popNotifyUnitBar";
    b.style.animationDuration = this.timeout / 1000 + "s";
    el.appendChild(b);
    this.timer = setTimeout(this.close(this), this.timeout);
    document.body.appendChild(el);
    this.showing = true;
  };

  this.close = function (e) {
    return function () {
      e.destory();
    };
  };

  this.destory = function (force) {
    if (this.destoried) return;
    this.destoried = true;
    this.showing = false;
    if (this.timer) clearTimeout(this.timer);
    let el = document.querySelector("#" + this.id);

    if (el) {
      if (force) return el.remove();
      el.style.animation = "none";
      el.style.animation = "pnout forwards .3s ease-in-out";
      setTimeout(this.remove(this), 310);
      popNotify.refresh();
    }

    popNotify.cleanUp(this);
  };

  this.remove = function (e) {
    return function () {
      let el = document.querySelector("#" + e.id);
      if (el) el.remove();
    };
  };

  this.el = function () {
    return document.querySelector("#" + this.id);
  };

  this.constructor(title, content, onclick, timeout);
}

var popNotify = {
  queue: [],
  closingAll: false,
  show: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let style = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
    let timeout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 5;
    let onclick = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
    this.notify(title, content, timeout * 1000, onclick, style);
  },
  success: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
    let onclick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
    this.show(title, content, "success", timeout, onclick);
  },
  info: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
    let onclick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
    this.show(title, content, "info", timeout, onclick);
  },
  warn: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
    let onclick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
    this.show(title, content, "warn", timeout, onclick);
  },
  error: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
    let onclick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
    this.show(title, content, "error", timeout, onclick);
  },
  notify: function (title, content, timeout, onclick, style) {
    let n = new popNotifyUnit(title, content, onclick, timeout, style, true);
    this.queue.push(n);
    this.refresh();
    return n;
  },
  cleanUp: function (obj) {
    if (this.closingAll) return;
    if (obj) this.queue.forEach((item, index) => {
      if (item === obj) this.queue.splice(index, 1);
    });else for (let i = 0; i < this.queue.length; i++) {
      if (this.queue[i].showing === false) {
        this.queue.splice(i, 1);
        i -= 1;
      }
    }
  },
  refresh: function () {
    let top = 20;
    let height = top;
    this.queue.forEach(item => {
      if (!item.showing) return;
      item.setPosTop(height);
      height += top + item.el().offsetHeight;
    });
  },
  getNextYPos: function () {
    let top = 20;
    let height = top;
    this.queue.forEach(item => {
      if (!item.showing) return;
      height += top + item.el().offsetHeight;
    });
    return height;
  },
  getObjById: function (id) {
    if (!id) return;
    let res = null;
    this.queue.forEach(item => {
      if (item.id === id) res = item;
    });
    return res;
  },
  getObjByElement: function (e) {
    if (!e) return;
    if (!e instanceof HTMLElement) return;
    let id = null;

    if (e.classList.contains("popNotifyUnitFrame")) {
      id = e.id;
    } else if (e.classList.contains("popNotifyUnitTitle") || e.classList.contains("popNotifyUnitContent")) {
      id = e.parentNode.id;
    }

    let res = null;
    this.queue.forEach(item => {
      if (item.id === id) res = item;
    });
    return res;
  },
  close: function (item) {
    let obj;

    if (item instanceof HTMLElement) {
      obj = this.getObjByElement(item);
    } else {
      obj = this.getObjById(item);
    }

    if (!obj) return;
    obj.destory();
  },
  closeAll: function () {
    this.closingAll = true;
    this.queue.forEach(item => item.destory());
    this.queue = [];
    this.closingAll = false;
  }
};
/* harmony default export */ const js_PopNotify = (popNotify);
// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/style/css/upload-doms.css
var css_upload_doms = __webpack_require__("./node_modules/css-loader/dist/cjs.js!./src/style/css/upload-doms.css");
;// CONCATENATED MODULE: ./src/style/css/upload-doms.css

      
      
      
      
      
      
      
      
      

var upload_doms_options = {};

upload_doms_options.styleTagTransform = (styleTagTransform_default());
upload_doms_options.setAttributes = (setAttributesWithoutAttributes_default());

      upload_doms_options.insert = insertBySelector_default().bind(null, "head");
    
upload_doms_options.domAPI = (styleDomAPI_default());
upload_doms_options.insertStyleElement = (insertStyleElement_default());

var upload_doms_update = injectStylesIntoStyleTag_default()(css_upload_doms/* default */.Z, upload_doms_options);




       /* harmony default export */ const style_css_upload_doms = (css_upload_doms/* default */.Z && css_upload_doms/* default.locals */.Z.locals ? css_upload_doms/* default.locals */.Z.locals : undefined);

;// CONCATENATED MODULE: ./src/functions/file-upload/file-uploader.js




function fileUploader() {
  if ($("span:contains('查看作业任务')").length == 0) {
    // 判断是否在作业页面
    return;
  }

  $('.infotable>tbody>tr:contains("请输入你的答案")').after(upload_doms.box);
  $('#filenames, #buttonDiv, #fileInfo').hide(); // 全局变量

  let onUpload = 0;
  let index = 0;
  let isAbort = 0;
  let alreadyLoaded = 0;
  let startTime = 0;
  let flag = 0;
  let filelist = []; // 信息显示部分

  let upldIconList = ['🕒', '⚡', '✅', '🕒', '⌛', '🔒', '✅']; // 所有icon统一管理

  let fileTypeIconList = ['📄', '⛺', '📚', '🎬', '📝', '📜', '🎵']; // 动效

  $('#inputDiv').mouseenter(function () {
    $('#inputDiv').css({
      'background-color': '#aad63d'
    });
    $('#textShow').css('color', '#ffffff');
  });
  $('#inputDiv').mouseleave(function () {
    $('#inputDiv').css({
      'background-color': '#c6f062'
    });
    $('#textShow').css('color', '#424d55');
  });

  function appendObjects(filelist) {
    // 缓存区更新前DOM操作
    $('#filenames, #buttonDiv, #fileInfo').show();
    $('#filenames, #buttonDiv').empty(); // 清空缓存区

    $('#inputDiv').hide(); // 隐藏上传框

    let sizeType = getSizeType(filelist);
    let nameType = getNameType(filelist);
    let fileType = getFileType(filelist);

    for (let i = 0; i < filelist.length; i++) {
      let item = {};
      item.file = filelist[i];
      item.sizeType = sizeType[i];
      item.initName = item.file.name;
      item.showName = nameType[i];
      item.fileTypeIcon = fileType[i].icon;
      item.fileTypeInfo = fileType[i].info;
      let fileObject =
      /*html*/
      `<div class="fileObjects" id="fileTh${i}"><a class="fileindex" id="fileindex${i}" title="${item.fileTypeInfo}" type="${item.file.type}" style="cursor:pointer; margin-left: 15px;">${item.fileTypeIcon}</a>&nbsp&nbsp|&nbsp&nbsp<a class="filename" id="filenameTH${i}" title="${item.initName}" data-clipboard-text="">${item.showName}<a class="fileSize">  (${item.sizeType.size}${item.sizeType.type})</a></a><a class="uploadSpeed" id="speedTh${i}" title="上传速度"></a><a class="timeRemain" id="timeRemainTh${i}"></a></div>`;
      $('#filenames').append(fileObject);
    } // 缓存区更新后DOM操作


    $('#buttonDiv').append(upload_doms.uploadBtn);
    $('#buttonDiv').append(upload_doms.emptyBtn); // 动效 (所有Object都已插入完毕)

    $('.fileObjects').mouseenter(function () {
      // 1.文字加粗 2.展示全名
      let prevName = $(this).find('.filename').html();
      $(this).find('.filename').css('font-weight', 'bold');
      $('.fileObjects').mouseleave(function () {
        $(this).find('.filename').css('font-weight', '');
        $(this).find('.filename').html(prevName);
      });

      if (onUpload == 1 && index == $(this).attr('id').split('fileTh')[1]) {
        // 文件已经开始上传且this为正在上传的文件, 此后的命令将不被执行
        return;
      }

      $(this).find('.filename').html($(this).find('.filename').attr('title'));
    });
    $('.fileindex').mouseenter(function () {
      if (onUpload == 1 || $(this).attr('title') == '[已上传]') {
        // 上传进程已开始/已经上传完 屏蔽按钮
        return;
      }

      let iconNow = $(this).html();
      let titleNow = $(this).attr('title');
      $(this).html('❌');
      $(this).attr('title', '删除');
      $('.fileindex').mouseleave(function () {
        if (onUpload == 1 || $(this).attr('title') == '[已上传]') {
          return;
        }

        $(this).html(iconNow);
        $(this).attr('title', titleNow);
      });
    });
  } // 文件选择前事件监听


  $('#inputDiv').click(() => {
    $('#currentFile').trigger('click');
  });
  $('#currentFile').change(function () {
    flag = 0;
    filelist = []; // 先执行清空 再push

    fileChangedByInput();
  });

  function fileChangedByInput() {
    if (flag == 0) {
      let filelistTMP = {};

      for (let i = 0; i < $('#currentFile')[0].files.length; i++) {
        filelistTMP = $('#currentFile')[0].files[i];
        filelist.push(filelistTMP);
        filelistTMP = {};
      }
    } // 缓存区更新


    appendObjects(filelist); // 文件更新后事件监听

    $('#emptyTrigger').click(function () {
      $('#currentFile').val('');
      $('#filenames, #buttonDiv').empty();
      $('#inputDiv').show();
      isAbort = 1;
      onUpload = 0;
      filelist = [];
      $('#filenames, #buttonDiv, #fileInfo').hide();
    });
    $('.fileindex').click(function () {
      if (onUpload == 1 || $(this).attr('title') == '[已上传]') {
        // 上传进程已开始/已经上传完 屏蔽按钮
        return;
      }

      let th = $(this).attr('id').split('fileindex')[1];
      filelist.splice(th, 1); // 缓存区更新

      appendObjects(filelist);
      flag = 1; // 执行change前,flag置1,不重新读文件

      fileChangedByInput();
      flag = 0; // 执行change后,flag置0,为下次重新读文件做准备

      if (filelist.length == 0) {
        // 点击的文件是最后一个文件,则直接执行清空
        $('#emptyTrigger').trigger('click');
      }
    }); // 上传按钮的监听要放在change中: change后才有#uploadtrigger

    $('#uploadTrigger').click(function () {
      $('#uploadTrigger').hide();

      if (onUpload == 1) {
        // 上传进程开始,屏蔽按钮
        return;
      } // 处理文件缓存区


      isAbort = 0; // 按上传之前按过清空,将isAbort置回0

      sendFileMsg();

      function sendFileMsg() {
        if (index >= filelist.length) {
          // 递归结束
          $('#currentFile').val(''); // <input>文件清空

          index = 0; // 递归条件置零

          onUpload = 0; // 上传开始标志位置0

          return; // 结束递归
        }

        let formData = new FormData();
        formData.append('Filename', filelist[index].name);
        formData.append('Filedata', filelist[index]);
        let xReq = new XMLHttpRequest();
        xReq.open('POST', 'http://cc.bjtu.edu.cn:81/meol/servlet/SerUpload');
        xReq.addEventListener("load", onSuccess);
        xReq.addEventListener("error", onError);
        xReq.upload.onloadstart = onStart;
        xReq.upload.onprogress = onProgress;
        xReq.upload.onabort = onAbort;
        xReq.send(formData);

        function onStart() {
          onUpload = 1; // 上传标志位置1

          startTime = new Date().getTime(); // 设置上传开始时间,用以计算时间速度

          alreadyLoaded = 0; // 设置上传开始时,已上传的文件大小为0
          // 上传开始,缓存区加入竖线
          // $('#speedTh'+index).prepend('&nbsp; | &nbsp;');

          if (filelist[index].size > 52428800) {
            // 大于50M文件 插入timeremain竖线
            $('#timeRemainTh' + index).before('&nbsp; | &nbsp;');
          }
        }

        function onProgress(evt) {
          if (isAbort == 1) {
            xReq.abort(); // 上传过程中随时检查,终止请求
          } // 进度计算


          let percentage = (evt.loaded * 100 / evt.total).toFixed(0); // 速度计算

          let nt = new Date().getTime(); // 获取当前时间

          let perTime = (nt - startTime) / 1000; // 计算出上次调用该方法时到现在的时间差,单位为s

          startTime = new Date().getTime(); //重新赋值,用以下次计算

          let perLoad = evt.loaded - alreadyLoaded; // 计算该分段上传的文件大小,单位b

          alreadyLoaded = evt.loaded; // 重新赋值,用以下次计算

          let speed = perLoad / perTime; // 单位 B/s

          let bspeed = speed;
          let Sunits = 'B/s';

          if (speed / 1024 > 1) {
            speed = speed / 1024;
            Sunits = 'KB/s';
          }

          if (speed / 1024 > 1) {
            speed = speed / 1024;
            Sunits = 'MB/s';
          }

          speed = speed.toFixed(1); // 时间计算 文件>20MB触发

          if (evt.total > 20971520) {
            let restTime = ((evt.total - evt.loaded) / bspeed).toFixed(0); // 实时更新文件缓存区

            $('#timeRemainTh' + index).html(upldIconList[0] + restTime + 's');
            $('#timeRemainTh' + index).attr('title', '剩余时间');
          } // 实时更新文件缓存区


          $('#fileTh' + index).css('background-size', percentage + '%');
          $('#speedTh' + index).html('&nbsp; | &nbsp;' + upldIconList[1] + speed + Sunits);
        }

        function onAbort() {
          isAbort = 0; // 终止条件置零

          index = 0; // 请求终止后index也必须归零,准备发起第二次上传请求

          onUpload = 0; // 上传标志位置0
        }

        function onSuccess() {
          // 插入编辑器操作
          let myiframe = document.getElementsByTagName('iframe')[1].contentDocument;
          let textArea = myiframe.getElementsByClassName('cke_show_borders');
          let constructor = '<p><a data-cke-saved-href="/meol/' + this.responseText + '" href="/meol/' + this.responseText + '">' + filelist[index].name + '</a></p>';

          if ($(textArea).find("p>br").length >= 1) {
            $(textArea).find("p")[0].remove();
          }

          $(textArea).append(constructor); // 处理缓存区操作

          let clipboard = new ClipboardJS('#filenameTH' + index); // 要用id做索引 否则会重复调用.on

          let fileURL = 'http://cc.bjtu.edu.cn:81/meol/' + this.responseText;
          $('#filenameTH' + index).attr("data-clipboard-text", fileURL);
          $('#filenameTH' + index).css('cursor', 'pointer');
          $('#fileindex' + index).html('<a>' + upldIconList[2] + '</a>');
          $('#fileindex' + index).attr('title', '[已上传]');
          $('#speedTh' + index).html('');
          $('#timeRemainTh' + index).remove();
          $('#fileTh' + index).css('background', '#ffffff');
          $('#fileTh' + index).css('font-color', '#e7e8e0');
          clipboard.on('success', function (evt) {
            js_PopNotify.show("成功", `【${$(evt.trigger).text()}】 文件链接已复制到剪切板`, "success");
            evt.clearSelection();
          }); // 递归操作

          index++;
          sendFileMsg();
        }

        function onError() {
          alert('Failed');
        }
      }
    });
  } // 拖拽上传功能


  let oBox = document.getElementById('inputDiv');
  let timer = null;

  document.ondragover = function () {
    clearTimeout(timer);
    timer = setTimeout(function () {
      // 文件放下后执行操作
      $('#p1').html('📁文件上传📝');
      $('#inputDiv').css('background-color', '#c6f062');
      $('#textShow').css('color', '#424d55');
    }, 200);
  }; // 进入子集的时候 会触发ondragover 频繁触发 不给ondrop机会


  oBox.ondragover = function () {
    return false;
  };

  oBox.ondragleave = function () {
    $('#p1').html('📌请将文件拖拽到此区域');
    $('#inputDiv').css('background-color', '#aad63d');
    $('#textShow').css('color', '#ffffff');
  };

  oBox.ondrop = function (ev) {
    $('#currentFile')[0].files = ev.dataTransfer.files;
    fileChangedByInput();
    return false;
  };

  function getSizeType(filelist) {
    let RtnsizeType = [];

    for (let item of filelist) {
      let sizeTypeTMP = {};

      if (item.size < 1024) {
        sizeTypeTMP.size = item.size.toFixed(2);
        sizeTypeTMP.type = 'B';
      } else if (item.size > 1024 && item.size < 1048576) {
        sizeTypeTMP.size = (item.size / 1024).toFixed(2);
        sizeTypeTMP.type = 'KB';
      } else if (item.size > 1048576 && item.size < 1073741824) {
        sizeTypeTMP.size = (item.size / 1048576).toFixed(2);
        sizeTypeTMP.type = 'MB';
      } else if (item.size > 1073741824) {
        js_PopNotify.show("警告", "你选择了大于1GB的文件,服务器存储资源有限,建议选择其他传输方式。", "warn");
        sizeTypeTMP.size = (item.size / 1073741824).toFixed(2);
        sizeTypeTMP.type = 'GB';
      }

      RtnsizeType.push(sizeTypeTMP);
    }

    return RtnsizeType;
  }

  function getNameType(filelist) {
    // 文件名显示长度限制
    let nameType = [];
    let limit;

    for (let item of filelist) {
      let splitName = item.name.split('.'); // 预防文件名中含.的情况

      let newName = splitName[0];

      for (let i = 1; i < splitName.length - 1; i++) {
        newName = newName + '.' + splitName[i];
      }

      limit = isChina(newName); // 即时生成limit限制

      if (newName.length > limit) {
        // 有后缀超长文件
        newName = newName.slice(0, limit) + '... .' + splitName.pop();
      } else if (newName.length == 0) {
        // 无后缀文件
        newName = splitName[0];
      } else {
        // 默认去掉了后缀 把后缀加回来
        newName = newName + '.' + splitName.pop();
      }

      nameType.push(newName);
    }

    function isChina(str) {
      if (escape(str).indexOf("%u") < 0) {
        return 35; // 不包含中文
      } else {
        return 20; // 包含中文
      }
    }

    return nameType;
  }

  function getFileType(filelist) {
    // 文件图标类型
    let fileType = [];

    for (let item of filelist) {
      let fileTypeTMP = {};

      if (item.type.indexOf('image') != -1) {
        fileTypeTMP.icon = fileTypeIconList[1];
        fileTypeTMP.info = '[图像]';
      } else if (item.type.indexOf('zip') != -1) {
        fileTypeTMP.icon = fileTypeIconList[2];
        fileTypeTMP.info = '[压缩文件]';
      } else if (item.type.indexOf('video') != -1) {
        fileTypeTMP.icon = fileTypeIconList[3];
        fileTypeTMP.info = '[视频]';
      } else if (item.type.indexOf('officedocument') != -1 || item.type.indexOf('excel') != -1 || item.type.indexOf('word') != -1 || item.type.indexOf('powerpoint') != -1) {
        fileTypeTMP.icon = fileTypeIconList[4];
        fileTypeTMP.info = '[文档]';
      } else if (item.type.indexOf('pdf') != -1) {
        fileTypeTMP.icon = fileTypeIconList[5];
        fileTypeTMP.info = '[文档]';
      } else if (item.type.indexOf('audio') != -1) {
        fileTypeTMP.icon = fileTypeIconList[6];
        fileTypeTMP.info = '[音频]';
      } else {
        fileTypeTMP.icon = fileTypeIconList[0];
        fileTypeTMP.info = '[文件]';
      }

      fileType.push(fileTypeTMP);
    }

    return fileType;
  }
}

/* harmony default export */ const file_uploader = (fileUploader);
;// CONCATENATED MODULE: ./src/functions/common/send-request.js
async function sendRequest(url, callBack, options) {
  let res = await fetch(url, options).then(response => {
    return response.blob();
  }).then(blob => {
    return new Promise(resolve => {
      let reader = new FileReader();

      reader.onload = () => {
        let htmlData = reader.result;
        htmlData = new window.DOMParser().parseFromString(htmlData, "text/html");
        resolve(htmlData);
      };

      reader.readAsText(blob, 'GBK');
    });
  }).then(response => {
    return callBack(response);
  }).catch(error => {
    console.error(error);
  });
  return res;
}

/* harmony default export */ const send_request = (sendRequest);
;// CONCATENATED MODULE: ./src/functions/send-request/get-info.js

const baseUrl = `http://cc.bjtu.edu.cn:81/meol`;
const userinfoUrl = `${baseUrl}/welcomepage/student/index.jsp`; // 个人信息leftBar

const reminderUrl = `${baseUrl}/welcomepage/student/interaction_reminder.jsp`; // 互动提醒reminder

const lessonUrl = `${baseUrl}/lesson/blen.student.lesson.list.jsp`; // 课程列表courselist

const hwtListUrl = `${baseUrl}/common/hw/student/hwtask.jsp`; // 课程作业hwtlist

async function getUserInfo() {
  let stuInfo = await send_request(userinfoUrl, obj => {
    return obj.querySelectorAll(".userinfobody>ul>li");
  }).then(res => {
    let obj = {
      name: '',
      loginTime: '',
      onlineTime: '',
      loginTimes: ''
    };
    res.forEach((item, index) => {
      obj[Object.keys(obj)[index]] = item.innerText.split(":")[1].trim();
    });
    return obj;
  }).catch(error => {
    console.log(error);
  });
  return stuInfo;
}

async function getRemindInfo() {
  let remindInfo = await send_request(reminderUrl, obj => {
    return obj.querySelectorAll("ul[id='reminder']>li>ul");
  }).then(res => {
    let obj = {
      notify: [],
      hwt: []
    };
    res.forEach((it, ind) => {
      it.querySelectorAll("li>a").forEach(item => {
        let classobj = {
          name: '',
          id: '',
          type: ''
        };
        classobj.name = item.innerText.trim();
        classobj.id = item.getAttribute("href").split("lid=")[1].split("&t=")[0];
        classobj.type = item.getAttribute("href").split("lid=")[1].split("&t=")[1];

        if (classobj.type === "hw") {
          obj["hwt"].push(classobj);
        } else if (classobj.type === "info") {
          obj["notify"].push(classobj);
        }
      });
    });
    return obj;
  }).catch(error => {
    console.log(error);
  });
  return remindInfo;
}

async function getLessonInfo() {
  let lessonInfo = await send_request(lessonUrl, obj => {
    return obj.querySelectorAll("tbody>tr");
  }).then(res => {
    let arry = [];
    res.forEach((item, index) => {
      if (index === 0) return;
      let obj = {
        id: '',
        name: '',
        academy: '',
        teacher: ''
      };
      obj.id = item.firstElementChild.firstElementChild.getAttribute("href").split("lid=")[1];
      obj.name = item.firstElementChild.firstElementChild.innerText.split("\n")[0].trim();
      obj.academy = item.children[1].innerText.split("\n")[0];
      obj.teacher = item.children[2].innerText.split("\n")[0];
      arry.push(obj);
    });
    return arry;
  }).catch(error => {
    console.log(error);
  });
  return lessonInfo;
}

async function getHwtInfo() {
  let hwtInfo = await send_request(hwtListUrl, obj => {
    return obj.querySelectorAll("tbody>tr");
  }).then(res => {
    let arry = [];
    res.forEach((item, index) => {
      if (index === 0) return;
      let obj = {
        hwtID: '',
        hwtName: '',
        date: '',
        DateObj: '',
        remainTime: '',
        able: false
      };
      obj.hwtID = item.querySelectorAll(".infolist")[0].getAttribute("href").split("hwtid=")[1];
      obj.hwtName = item.querySelectorAll(".infolist")[0].innerText.split("\n")[0].trim();
      obj.date = item.children[1].innerText.split("\n")[0];
      obj.DateObj = new Date(`${obj.date.split("年")[0]},${obj.date.split("年")[1].split("月")[0]},${obj.date.split("年")[1].split("月")[1].split("日")[0]},23:59:59`);
      obj.remainTime = parseInt((obj.DateObj.valueOf() - new Date().valueOf()) / (24 * 60 * 60 * 1000));
      obj.able = item.children[5].childElementCount !== 0;
      arry.push(obj);
    });
    return arry;
  }).catch(error => {
    console.log(error);
  });
  return hwtInfo;
}

/* harmony default export */ const get_info = ({
  getUserInfo: getUserInfo,
  getRemindInfo: getRemindInfo,
  getLessonInfo: getLessonInfo,
  getHwtInfo: getHwtInfo
});
;// CONCATENATED MODULE: ./src/functions/get-homework-more-info.js



const get_homework_more_info_baseUrl = `http://cc.bjtu.edu.cn:81/meol`;
const courseUrl = `${get_homework_more_info_baseUrl}/jpk/course/layout/newpage/index.jsp?courseId=`;
const taskanswerUrl = `${get_homework_more_info_baseUrl}/common/hw/student/taskanswer.jsp?hwtid=`; // 查看批阅结果taskanswer.jsp

const writeUrl = `${get_homework_more_info_baseUrl}/common/hw/student/write.jsp?hwtid=`; // 查看作业任务write.jsp

const onceSubmitInfo = "该作业不允许重复提交,确定提交作业吗?";
const hadSubmitTag =
/*html*/
`<a class="icon" title="已提交" style="cursor:default;"> 🟢 </a>`;
const notSubmitTag =
/*html*/
`<a class="icon" title="未提交" style="cursor:default;"> 🟠 </a>`;
const onceSubmitTag =
/*html*/
`<a class="icon" title="只允许提交一次" style="cursor:default;"> 🔒 </a>`;
const freeSubmitTag =
/*html*/
`<a class="icon" title="允许重复提交" style="cursor:default;"> 🔄 </a>`;

async function initializate(courseID) {
  let inPage = false;

  if (location.href.indexOf("hwtask.jsp") === -1) {
    inPage = false;
  } else {
    inPage = true;
  }

  if (inPage) {
    // dont initializate, get info directly
    let a = await appendSubmitInfo();
    let b = await appendOnceInfo();
    js_PopNotify.show(`成功`, "已加载作业信息", "success", 2.5);
  } else {
    // initializate, dont get info
    if (courseID === undefined) return;
    let init = await send_request(courseUrl + courseID, obj => {
      return obj; // nothing todo
    }).catch(error => {
      console.log(error);
    });
    return init;
  }
}

async function appendSubmitInfo() {
  let hwtList = await get_info.getHwtInfo();

  for (let it of hwtList) {
    // cant await in forEach
    // if (it.able == false) return
    let append = await send_request(taskanswerUrl + it.hwtID, obj => {
      return $(obj).find("tr:contains('回答的内容')+tr>td>input").length;
    }).then(res => {
      if (res === 1) {
        $(document.querySelectorAll(".infolist[href='hwtask.view.jsp?hwtid=" + it.hwtID + "']")[0]).before(hadSubmitTag);
      } else {
        $(document.querySelectorAll(".infolist[href='hwtask.view.jsp?hwtid=" + it.hwtID + "']")[0]).before(notSubmitTag);
      }
    }).catch(error => {
      console.log(error);
    }); // return append
  }
}

async function appendOnceInfo() {
  let hwtList = await get_info.getHwtInfo();

  for (let it of hwtList) {
    // cant await in forEach
    if (it.able == false) return;
    let append = await send_request(writeUrl + it.hwtID, obj => {
      return obj.querySelectorAll("script");
    }).then(res => {
      if (res[7].innerText.indexOf(onceSubmitInfo) !== -1) {
        $(document.querySelectorAll(".infolist[href='hwtask.view.jsp?hwtid=" + it.hwtID + "']")[0]).before(onceSubmitTag);
      } else {
        $(document.querySelectorAll(".infolist[href='hwtask.view.jsp?hwtid=" + it.hwtID + "']")[0]).before(freeSubmitTag);
      }
    }).catch(error => {
      console.log(error);
    }); // return append
  }
}

/* harmony default export */ const get_homework_more_info = (initializate);
// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/style/css/reminderCSS.css
var reminderCSS = __webpack_require__("./node_modules/css-loader/dist/cjs.js!./src/style/css/reminderCSS.css");
;// CONCATENATED MODULE: ./src/style/css/reminderCSS.css

      
      
      
      
      
      
      
      
      

var reminderCSS_options = {};

reminderCSS_options.styleTagTransform = (styleTagTransform_default());
reminderCSS_options.setAttributes = (setAttributesWithoutAttributes_default());

      reminderCSS_options.insert = insertBySelector_default().bind(null, "head");
    
reminderCSS_options.domAPI = (styleDomAPI_default());
reminderCSS_options.insertStyleElement = (insertStyleElement_default());

var reminderCSS_update = injectStylesIntoStyleTag_default()(reminderCSS/* default */.Z, reminderCSS_options);




       /* harmony default export */ const css_reminderCSS = (reminderCSS/* default */.Z && reminderCSS/* default.locals */.Z.locals ? reminderCSS/* default.locals */.Z.locals : undefined);

;// CONCATENATED MODULE: ./src/functions/get-reminder.js




const get_reminder_baseUrl = `http://cc.bjtu.edu.cn:81/meol`;
const hwtUrl = `${get_reminder_baseUrl}/common/hw/student/write.jsp?hwtid=`;
const hwtTagTemplate =
/*html*/
`<a onclick="return" class="hwtName"></a><span class="date"></span>`;

function sortByTime() {
  let liList = $(".listwrap>.list>ul>li");
  let remainList = [];

  for (let i = 0; i < liList.length; i++) {
    remainList.push($(liList[i]).find(".date").attr("remain"));
  }

  remainList.sort((a, b) => {
    return a - b;
  });
  remainList.forEach((it, ind) => {
    for (let i = 0; i < liList.length; i++) {
      if ($(liList[i]).find(".date").attr("remain") === it) {
        $(".listwrap>.list>ul").append(liList[i]);
      }
    }
  });
}

async function createHwtList(remindInfo) {
  $(".list>ul").empty();

  for (let courseItem of remindInfo.hwt) {
    // Async Trap: cannot async in forEach
    await get_homework_more_info(courseItem.id).then(async () => {
      await get_info.getHwtInfo().then(hwtList => {
        let ableHwtList = hwtList.filter(hwtItem => {
          return hwtItem.able == true && hwtItem.remainTime <= 15;
        });

        for (let hwtItem of ableHwtList) {
          let hwtTag = document.createElement("li");
          hwtTag.innerHTML = hwtTagTemplate;
          let Info = ``;

          if (hwtItem.remainTime === 0) {
            Info = `今日截止`;
          } else {
            Info = `[还有${hwtItem.remainTime}天截止]`;
          }

          $(hwtTag).find(".hwtName").text(`${Info} ${hwtItem.hwtName} [${courseItem.name}]`);
          $(hwtTag).find(".date").text(hwtItem.DateObj.toLocaleDateString());
          $(hwtTag).find(".date").attr("remain", `${hwtItem.remainTime}`);

          if (hwtItem.remainTime <= 3) {
            $(hwtTag).find("a").addClass("top");
          }

          $(hwtTag).click(() => {
            get_homework_more_info(courseItem.id).then(() => {
              window.open(`${hwtUrl}${hwtItem.hwtID}`, "_parent");
            });
          });
          $(".list>ul").append(hwtTag);
        }
      });
    });
  }
}

async function drawRed(remindInfo) {
  remindInfo.hwt.forEach(courseItem => {
    $(".courseList").find("a[href*='" + courseItem.id + "']").css("color", "#C00");
  });
}

async function getReminderNew() {
  if (location.href.indexOf('welcomepage/student/index.jsp') == -1) return;
  let remindInfo = await get_info.getRemindInfo().then(res => {
    if (res.hwt.length === 0) {
      js_PopNotify.show("信息", "15日内无作业截止", "info", 2.5);
    } else {
      createHwtList(res).then(() => {
        js_PopNotify.show("成功", "作业列表加载完毕", "success", 2.5);
        sortByTime();
      });
      drawRed(res);
    }
  });
}

/* harmony default export */ const get_reminder = (getReminderNew);
;// CONCATENATED MODULE: ./src/functions/get-resources.js


function getResources() {
  if (location.href.indexOf('listview.jsp?') == -1) {
    return;
  }

  let fileLinks = [];

  for (let i = 0; i < $('tbody>tr').length; i++) {
    let href = $($('tbody>tr')[i]).find('td>a').attr('href');

    if (href && href.indexOf('listview.jsp?') != 0) {
      fileLinks.push('http://cc.bjtu.edu.cn:81/meol/common/script/download.jsp' + $($('tbody>tr')[i]).find('td>a').attr('href').split('download_preview.jsp')[1]);
    }
  }

  $('.subtitle').append(
  /*html*/
  `<a id="downloadAll" style="cursor: pointer">下载此目录下所有文件</a>`);
  $('#downloadAll').click(() => {
    if (fileLinks.length) {
      fileLinks.forEach(value => {
        window.open(value);
      });
    } else js_PopNotify.show("警告", "当前目录下无文件", "warn");
  });
}

/* harmony default export */ const get_resources = (getResources);
;// CONCATENATED MODULE: ./src/functions/only-once-commit.js


function judgeOnceSubmit() {
  if (location.href.indexOf("write.jsp") === -1) return;

  if ($("script:contains('该作业不允许重复提交,确定提交作业吗?')").length != 0) {
    let newspan = '<span>(只能提交一次)</span>';
    $('span:contains("查看作业任务")').after(newspan);
    js_PopNotify.show("警告", "注意,此作业只能提交一次,请检查无误后再提交!", "warn");
    return 1;
  } else return 0;
}

/* harmony default export */ const only_once_commit = (judgeOnceSubmit);
;// CONCATENATED MODULE: ./src/functions/check-update.js



const {
  version
} = __webpack_require__("./package.json");

async function getLastestVersion() {
  const GreasyUrl = "https://gf.qytechs.cn/zh-CN/scripts/432056";
  let res = send_request(GreasyUrl, obj => {
    return obj.querySelectorAll('.script-show-version>span')[1].textContent;
  });
  return res;
}

async function checkVersion() {
  if (location.href.indexOf('welcomepage/student/index.jsp') == -1) {
    // 只发welcome页的一次请求
    return;
  }

  getLastestVersion().then(res => {
    let weightLastest = 0;
    let weightNow = 0;
    res.split('.').reverse().forEach((value, index) => {
      weightLastest += (index + 1) * value;
    });
    version.split('.').reverse().forEach((value, index) => {
      weightNow += (index + 1) * value;
    });

    if (weightLastest > weightNow) {
      console.log('need update');
      js_PopNotify.show(`有新版本[${res}]`, "点击安装新版本", "success", "90", () => {
        window.open(`https://gf.qytechs.cn/zh-CN/scripts/432056`);
      });
    } else console.log('version Checked');
  });
}

/* harmony default export */ const check_update = (checkVersion);
;// CONCATENATED MODULE: ./src/index.js









append_tags();
file_uploader();
get_reminder();
get_resources();
get_homework_more_info();
only_once_commit();
check_update();
})();

/******/ })()
;

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址