// ==UserScript==
// @name 破解百度网盘/百度文库下载限制
// @namespace tools
// @version 2.1.0
// @author 大角牛软件科技
// @description 【2025】破解百度网盘下载限制,百度文库下载限制,完全免费下载。联系作者/用户QQ群: 882776749
// @license AGPL v3
// @icon https://u2233.vip/favicon.ico
// @match *://pan.baidu.com/*
// @match *://www.sse.com.cn/assortment/options/date*
// @match *://www.zhipin.com/*
// @match *://wenku.baidu.com/*
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js
// @require data:application/javascript,%3Bwindow.Vue%20%3D%20Vue%3B
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/index.full.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js
// @require data:application/javascript,%3Bwindow.echarts%20%3D%20echarts%3B
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/system.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/extras/named-register.min.js
// @require data:application/javascript,%3B(typeof%20System!%3D'undefined')%26%26(System%3Dnew%20System.constructor())%3B
// @resource ElementPlus https://cdn.jsdelivr.net/npm/[email protected]/dist/index.css
// @connect dl-test.infiniteworlds.com.cn
// @connect wan.baidu.com
// @connect localhost
// @connect u2233.vip
// @grant GM_addStyle
// @grant GM_deleteValue
// @grant GM_getResourceText
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @noframes
// ==/UserScript==
(t=>{if(typeof GM_addStyle=="function"){GM_addStyle(t);return}const a=document.createElement("style");a.textContent=t,document.head.append(a)})(' #cd-nav[data-v-9c557335]{position:fixed;bottom:10%;right:10%;z-index:999999999999999}ul[data-v-9c557335],li[data-v-9c557335]{list-style:none;-webkit-user-select:none;user-select:none}.btnBox[data-v-9c557335]{display:flex!important;gap:10px 0;flex-direction:row-reverse}#cd-nav ul[data-v-9c557335]{width:90%;width:400px;position:absolute;margin:0;padding:0;right:0;bottom:0;border-radius:.25em;box-shadow:#959da533 0 8px 24px;background:#fff;visibility:hidden;overflow:hidden;z-index:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:scale(0);-moz-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);-webkit-transform-origin:100% 100%;-moz-transform-origin:100% 100%;-ms-transform-origin:100% 100%;-o-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transition:-webkit-transform .3s,visibility 0s .3s;-moz-transition:-moz-transform .3s,visibility 0s .3s;transition:transform .3s,visibility 0s .3s}#cd-nav ul li[data-v-9c557335]{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex}#cd-nav ul.is-visible[data-v-9c557335]{visibility:visible;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);-webkit-transition:-webkit-transform .3s,visibility 0s 0s;-moz-transition:-moz-transform .3s,visibility 0s 0s;transition:transform .3s,visibility 0s 0s}#cd-nav ul.is-visible li[data-v-9c557335]:nth-child(1){-webkit-animation:cd-slide-in-9c557335 .2s;-moz-animation:cd-slide-in-9c557335 .2s;animation:cd-slide-in-9c557335 .2s}#cd-nav ul.is-visible li[data-v-9c557335]:nth-child(2){-webkit-animation:cd-slide-in-9c557335 .3s;-moz-animation:cd-slide-in-9c557335 .3s;animation:cd-slide-in-9c557335 .3s}#cd-nav ul.is-visible li[data-v-9c557335]:nth-child(3){-webkit-animation:cd-slide-in-9c557335 .4s;-moz-animation:cd-slide-in-9c557335 .4s;animation:cd-slide-in-9c557335 .4s}#cd-nav ul.is-visible li[data-v-9c557335]:nth-child(4){-webkit-animation:cd-slide-in-9c557335 .5s;-moz-animation:cd-slide-in-9c557335 .5s;animation:cd-slide-in-9c557335 .5s}#cd-nav ul.is-visible li[data-v-9c557335]:nth-child(5){-webkit-animation:cd-slide-in-9c557335 .6s;-moz-animation:cd-slide-in-9c557335 .6s;animation:cd-slide-in-9c557335 .6s}#cd-nav li>div[data-v-9c557335]{display:block;padding:20px;border-bottom:1px solid #eff2f6;cursor:pointer;box-sizing:border-box;font-size:14px}#cd-nav li>div[data-v-9c557335]:first-child{flex:0 0 250px}#cd-nav li>div[data-v-9c557335]:last-child{flex:1}#cd-nav li:last-child div[data-v-9c557335]{border-bottom:none}.cd-nav-trigger[data-v-9c557335]{position:absolute;bottom:0;right:0;width:44px;height:44px;background:#f56c6c;border-radius:.25em;box-shadow:#959da533 0 8px 24px;overflow:hidden;text-indent:100%;white-space:nowrap;z-index:2;cursor:pointer}.cd-nav-trigger span[data-v-9c557335]{position:absolute;display:block;width:20px;height:2px;background:#fff;top:50%;margin-top:-1px;left:50%;margin-left:-10px;-webkit-transition:background .3s;-moz-transition:background .3s;transition:background .3s}.cd-nav-trigger span[data-v-9c557335]:before,.cd-nav-trigger span[data-v-9c557335]:after{content:"";position:absolute;left:0;background:inherit;width:100%;height:100%;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .3s,background 0s;-moz-transition:-moz-transform .3s,background 0s;transition:transform .3s,background 0s}.cd-nav-trigger span[data-v-9c557335]:before{top:-6px;-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}.cd-nav-trigger span[data-v-9c557335]:after{bottom:-6px;-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}.cd-nav-trigger.menu-is-open[data-v-9c557335]{box-shadow:none}.cd-nav-trigger.menu-is-open span[data-v-9c557335]{background:#e84a6400}.cd-nav-trigger.menu-is-open span[data-v-9c557335]:before,.cd-nav-trigger.menu-is-open span[data-v-9c557335]:after{background:#fff}.cd-nav-trigger.menu-is-open span[data-v-9c557335]:before{top:0;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}.cd-nav-trigger.menu-is-open span[data-v-9c557335]:after{bottom:0;-webkit-transform:rotate(225deg);-moz-transform:rotate(225deg);-ms-transform:rotate(225deg);-o-transform:rotate(225deg);transform:rotate(225deg)}@-webkit-keyframes cd-slide-in-9c557335{0%{-webkit-transform:translateX(100px)}to{-webkit-transform:translateY(0)}}@-moz-keyframes cd-slide-in-9c557335{0%{-moz-transform:translateX(100px)}to{-moz-transform:translateY(0)}}@keyframes cd-slide-in-9c557335{0%{-webkit-transform:translateX(100px);-moz-transform:translateX(100px);-ms-transform:translateX(100px);-o-transform:translateX(100px);transform:translate(100px)}to{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}.el-drawer__header{margin-bottom:0!important}body{font-size:14px!important}a{text-decoration:none!important}:where(*,*:before,*:after){box-sizing:border-box}:where(html){-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;line-height:1.15}:where(body){margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:where(img,picture,video,canvas,svg,iframe,embed,object){display:block}:where(img,svg){height:auto}:where(iframe){border:0}:where(input,button,textarea,select){font:inherit;color:inherit}:where(button,[type=button],[type=reset],[type=submit]){-webkit-appearance:button}:where(textarea){resize:vertical}:where(fieldset){min-width:0;margin:0;padding:.35em .75em .625em;border:1px solid #a9a9a9}:where(legend){padding:0}:where(progress){vertical-align:baseline}:where(ol,ul){list-style:none;margin:0;padding:0}:where(blockquote,q){quotes:none}:where(blockquote:before,blockquote:after,q:before,q:after){content:"";content:none}:where(table){border-collapse:collapse;border-spacing:0}:where(th,td){padding:0;text-align:left}:where(main,article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section){display:block}:where(summary){display:list-item}:where(template,[hidden]){display:none}:where(:focus-visible){outline:2px solid Highlight;outline-offset:2px}:where(:focus:not(:focus-visible)){outline:0}:where(html){color-scheme:light dark}:where(html){scrollbar-width:thin;scrollbar-color:#888 transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:#888;border-radius:4px}::-webkit-scrollbar-track{background:transparent}:where(iframe){width:100%;height:auto}.content[data-v-f8630f3e]{flex:1;box-sizing:border-box;background-color:#fff}.header[data-v-f8630f3e]{text-align:center;margin-bottom:10px;padding:20px;background:linear-gradient(120deg,#a1c4fd,#c2e9fb);box-shadow:0 4px 6px #0000001a}.header h1[data-v-f8630f3e]{margin:0;color:#2c3e50;font-size:28px}.header p[data-v-f8630f3e]{margin:10px 0 0;color:#7f8c8d;font-size:16px}.task-list[data-v-f8630f3e]{display:grid;padding:10px;box-sizing:border-box;grid-template-columns:repeat(auto-fill,minmax(350px,1fr));gap:14px;margin-top:20px}.task-card[data-v-f8630f3e]{background:#fff;border-radius:12px;box-shadow:0 4px 15px #0000001a;padding:14px;transition:all .3s ease;border-left:5px solid #3498db}.task-card[data-v-f8630f3e]:hover{transform:translateY(-5px);box-shadow:0 8px 25px #00000026}.task-card.processing[data-v-f8630f3e]{border-left-color:#f39c12}.task-card.completed[data-v-f8630f3e]{border-left-color:#27ae60}.task-card.error[data-v-f8630f3e]{border-left-color:#e74c3c}.task-title[data-v-f8630f3e]{font-size:16px;font-weight:600;margin:0 0 10px;color:#2c3e50;display:flex;justify-content:space-between;align-items:center}.task-module[data-v-f8630f3e]{background-color:#ecf0f1;color:#7f8c8d;padding:3px 8px;border-radius:12px;font-size:12px;font-weight:400}.task-info[data-v-f8630f3e]{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:15px 0}.info-item[data-v-f8630f3e]{font-size:14px}.info-label[data-v-f8630f3e]{color:#7f8c8d;font-weight:500}.info-value[data-v-f8630f3e]{color:#2c3e50;font-weight:600;margin-top:8px;word-break:break-all}.task-status[data-v-f8630f3e]{padding:8px 12px;border-radius:20px;font-size:13px;font-weight:500;text-align:center;margin-top:10px}.status-pending[data-v-f8630f3e]{background-color:#f8f9fa;color:#6c757d}.status-processing[data-v-f8630f3e]{background-color:#fff3cd;color:#856404}.status-completed[data-v-f8630f3e]{background-color:#d4edda;color:#155724}.status-error[data-v-f8630f3e]{background-color:#f8d7da;color:#721c24}.progress-bar[data-v-f8630f3e]{height:8px;background-color:#ecf0f1;border-radius:4px;margin:15px 0;overflow:hidden}.progress-fill[data-v-f8630f3e]{height:100%;background:linear-gradient(90deg,#3498db,#2ecc71);border-radius:4px;transition:width .3s ease}.loading[data-v-f8630f3e]{text-align:center;padding:40px;color:#7f8c8d}.loading-spinner[data-v-f8630f3e]{border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;width:40px;height:40px;animation:spin-f8630f3e 1s linear infinite;margin:0 auto 20px}@keyframes spin-f8630f3e{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.empty-state[data-v-f8630f3e]{text-align:center;padding:60px 20px;color:#7f8c8d}.empty-state i[data-v-f8630f3e]{font-size:48px;margin-bottom:20px;display:block}#el[data-v-f8630f3e]{display:flex;justify-content:space-between}.data-analysis-tool[data-v-3be403ae]{background:#fff;margin-top:40px}.date-selector[data-v-3be403ae]{display:flex;justify-content:center;gap:10px;align-items:center;margin-bottom:20px}.cache-info[data-v-3be403ae]{font-size:14px;color:#666;margin-bottom:8px}.loading-info[data-v-3be403ae]{text-align:center;margin:20px 0}.charts-container[data-v-3be403ae]{display:grid;grid-template-columns:repeat(1,1fr);gap:20px}.chart-wrapper[data-v-3be403ae]{background:#fff;padding:15px;border-radius:4px;box-shadow:0 2px 4px #0000001a}.chart-title[data-v-3be403ae]{font-weight:700;margin-bottom:10px}.chart-container[data-v-3be403ae]{height:350px;background:#f9f9f9;margin-bottom:10px}.chart-time-slider[data-v-3be403ae]{padding:0 10px}@media (max-width: 1600px){.charts-container[data-v-3be403ae]{grid-template-columns:repeat(1,1fr)}}@media (max-width: 1200px){.charts-container[data-v-3be403ae]{grid-template-columns:repeat(1,1fr)}}@media (max-width: 768px){.charts-container[data-v-3be403ae]{grid-template-columns:1fr}.date-selector[data-v-3be403ae]{flex-direction:column;align-items:flex-start}} ');
System.addImportMap({ imports: {"vue":"user:vue","element-plus":"user:element-plus","echarts":"user:echarts"} });
System.set("user:vue", (()=>{const _=Vue;('default' in _)||(_.default=_);return _})());
System.set("user:element-plus", (()=>{const _=ElementPlus;('default' in _)||(_.default=_);return _})());
System.set("user:echarts", (()=>{const _=echarts;('default' in _)||(_.default=_);return _})());
System.register("./__entry.js", ['./__monkey.entry-DzHbnFBR.js'], (function (exports, module) {
'use strict';
return {
setters: [null],
execute: (function () {
})
};
}));
System.register("./__monkey.entry-DzHbnFBR.js", ['vue', 'element-plus'], (function (exports, module) {
'use strict';
var createApp, resolveComponent, createElementBlock, openBlock, createVNode, createBlock, createCommentVNode, resolveDynamicComponent, createElementVNode, normalizeClass, Fragment, renderList, withCtx, createTextVNode, toDisplayString, ElementPlus, ElMessage;
return {
setters: [module => {
createApp = module.createApp;
resolveComponent = module.resolveComponent;
createElementBlock = module.createElementBlock;
openBlock = module.openBlock;
createVNode = module.createVNode;
createBlock = module.createBlock;
createCommentVNode = module.createCommentVNode;
resolveDynamicComponent = module.resolveDynamicComponent;
createElementVNode = module.createElementVNode;
normalizeClass = module.normalizeClass;
Fragment = module.Fragment;
renderList = module.renderList;
withCtx = module.withCtx;
createTextVNode = module.createTextVNode;
toDisplayString = module.toDisplayString;
}, module => {
ElementPlus = module.default;
ElMessage = module.ElMessage;
}],
execute: (function () {
const scriptRel = /* @__PURE__ */ function detectScriptRel() {
const relList = typeof document !== "undefined" && document.createElement("link").relList;
return relList && relList.supports && relList.supports("modulepreload") ? "modulepreload" : "preload";
}();
const assetsURL = function(dep) {
return "/" + dep;
};
const seen = {};
const __vitePreload = function preload(baseModule, deps, importerUrl) {
let promise = Promise.resolve();
if (deps && deps.length > 0) {
let allSettled = function(promises$2) {
return Promise.all(promises$2.map((p$1) => Promise.resolve(p$1).then((value$1) => ({
status: "fulfilled",
value: value$1
}), (reason) => ({
status: "rejected",
reason
}))));
};
document.getElementsByTagName("link");
const cspNonceMeta = document.querySelector("meta[property=csp-nonce]");
const cspNonce = cspNonceMeta?.nonce || cspNonceMeta?.getAttribute("nonce");
promise = allSettled(deps.map((dep) => {
dep = assetsURL(dep);
if (dep in seen) return;
seen[dep] = true;
const isCss = dep.endsWith(".css");
const cssSelector = isCss ? '[rel="stylesheet"]' : "";
if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) return;
const link = document.createElement("link");
link.rel = isCss ? "stylesheet" : scriptRel;
if (!isCss) link.as = "script";
link.crossOrigin = "";
link.href = dep;
if (cspNonce) link.setAttribute("nonce", cspNonce);
document.head.appendChild(link);
if (isCss) return new Promise((res, rej) => {
link.addEventListener("load", res);
link.addEventListener("error", () => rej(/* @__PURE__ */ new Error(`Unable to preload CSS for ${dep}`)));
});
}));
}
function handlePreloadError(err$2) {
const e$1 = new Event("vite:preloadError", { cancelable: true });
e$1.payload = err$2;
window.dispatchEvent(e$1);
if (!e$1.defaultPrevented) throw err$2;
}
return promise.then((res) => {
for (const item of res || []) {
if (item.status !== "rejected") continue;
handlePreloadError(item.reason);
}
return baseModule().catch(handlePreloadError);
});
};
const _export_sfc = exports("_", (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) {
target[key] = val;
}
return target;
});
const _sfc_main$1 = {
name: "HamburgerMenu",
props: {
menuItems: {
type: Array,
required: true,
default: () => []
}
},
data() {
return {
menuOpen: false,
isHidden: false
};
},
methods: {
toggleMenu() {
this.menuOpen = !this.menuOpen;
},
onItemClick(index) {
this.$emit("itemClick", index);
},
btnClickEvent(index1, index2) {
this.$emit("btnClickEvent", {
index1,
index2
});
}
}
};
const _hoisted_1 = {
id: "cd-nav",
class: "is-fixed"
};
const _hoisted_2 = {
key: 0,
class: "btnBox"
};
const _hoisted_3 = ["onClick"];
function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
const _component_el_link = resolveComponent("el-link");
return openBlock(), createElementBlock("div", _hoisted_1, [
createElementVNode("a", {
class: normalizeClass(["cd-nav-trigger", { "menu-is-open": $data.menuOpen }]),
onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleMenu && $options.toggleMenu(...args))
}, _cache[1] || (_cache[1] = [
createElementVNode("span", null, null, -1)
]), 2),
createElementVNode("ul", {
class: normalizeClass(["has-transitions", "is-hidden", { "is-visible": $data.menuOpen }])
}, [
(openBlock(true), createElementBlock(Fragment, null, renderList($props.menuItems, (item, index) => {
return openBlock(), createElementBlock("li", { key: index }, [
createElementVNode("div", null, [
createVNode(_component_el_link, {
type: "primary",
disabled: item.disabled,
onClick: ($event) => $options.onItemClick(index)
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(item.text), 1)
]),
_: 2
}, 1032, ["disabled", "onClick"])
]),
item.btns && item.btns.length ? (openBlock(), createElementBlock("div", _hoisted_2, [
(openBlock(true), createElementBlock(Fragment, null, renderList(item.btns, (btn, index2) => {
return openBlock(), createElementBlock("div", {
key: index2,
onClick: ($event) => $options.btnClickEvent(index, index2)
}, [
createVNode(_component_el_link, { type: "warning" }, {
default: withCtx(() => [
createTextVNode(toDisplayString(btn.text), 1)
]),
_: 2
}, 1024)
], 8, _hoisted_3);
}), 128))
])) : createCommentVNode("", true)
]);
}), 128))
], 2)
]);
}
const HamburgerMenu = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__scopeId", "data-v-9c557335"]]);
const _sfc_main = {
name: "App",
components: {
HamburgerMenu
},
data() {
return {
currentComponent: null,
config: {
text: {
callme: "请全屏截图并发给管理员",
error: "出现异常!"
}
}
};
},
computed: {
tingConfig() {
return $tingConfig || { qq: "882776749" };
},
menuItems() {
let that = this;
let items = [
// logo制作
// https://www.logomaker.com.cn/guide#/generate?title=%E5%A4%A7%E8%A7%92%E7%89%9B&slogan=Big%20Horn%20Bull&brand_true_slogan=&industry_id=139&industry_tag=&industry_keyword=%E8%BD%AF%E4%BB%B6%E5%BA%94%E7%94%A8&sceneSelect=b&source=new&preview_dialog=true
{
text: "百度文库 | 下载当前文档",
disabled: !window.location.href.includes("wenku.baidu.com/view"),
click() {
let url = window.location.href;
url = encodeURIComponent(url);
window.open(`https://u2233.vip/BDWK/index.html?url=${url}`);
document.getElementsByClassName("cd-nav-trigger")[0].click();
},
btns: [
{
text: "💡 使用教程",
click: () => {
window.open("https://u2233.vip/BDWK/word.html", "_blank");
}
}
]
},
{
text: "百度网盘 | 领取极速下载卷",
disabled: !window.location.href.includes("pan.baidu.com"),
async click() {
$createVerifyCodeModal(async () => {
const component = await __vitePreload(() => module.import('./index-C6Br58wp-CNrm4cDA.js'), void 0 );
that.currentComponent = component.default;
that.$nextTick(() => {
that.$refs.dynamicComponent.open();
});
});
document.getElementsByClassName("cd-nav-trigger")[0].click();
},
btns: [
{
text: "💡 使用教程",
click: () => {
window.open("https://u2233.vip/BDWP/word.html", "_blank");
}
}
]
},
{
text: "BOOS直聘 | 抓取数据",
disabled: !window.location.href.includes("zhipin.com/web/geek/jobs"),
async click() {
$createVerifyCodeModal(async (captcha) => {
const capStatus = await $httpRequest({
url: `https://dl-test.infiniteworlds.com.cn/TING/checkCaptcha?captcha=${captcha}`
});
if (capStatus.data.code != 0) {
ElMessage.warning(capStatus.data.message);
return;
}
const component = await __vitePreload(() => module.import('./index-BUsTNQud-vB6-WEWk.js'), void 0 );
that.currentComponent = component.default;
that.$nextTick(() => {
if (that.$refs.dynamicComponent && typeof that.$refs.dynamicComponent.open === "function") {
that.$refs.dynamicComponent.open();
}
});
});
document.getElementsByClassName("cd-nav-trigger")[0].click();
},
btns: [
{
text: "💡 使用教程",
click: () => {
window.open("https://u2233.vip/BOSS/word.html", "_blank");
}
}
]
},
{
text: `点击联系开发者/QQ群(${this.tingConfig.qq})`,
click() {
window.open(
`https://jq.qq.com/?_wv=1027&k=${this.tingConfig.qq}`,
"_blank"
);
}
}
];
return items.sort((a, b) => {
const aHasDisabled = "disabled" in a;
const bHasDisabled = "disabled" in b;
if (!aHasDisabled && bHasDisabled) return 1;
if (aHasDisabled && !bHasDisabled) return -1;
if (!aHasDisabled && !bHasDisabled) return 0;
return (a.disabled ? 1 : 0) - (b.disabled ? 1 : 0);
});
}
},
methods: {
// 操作按钮点击事件
btnClickEvent({ index1, index2 }) {
this.menuItems[index1].btns[index2].click();
},
// 上海证券数据分析
async ShangHaiZhengQuan() {
const component = await __vitePreload(() => module.import('./index-D_oBu48O-BWn9ZtuK.js'), void 0 );
const pageContent = document.querySelector(".page_content");
const appContainer2 = document.createElement("div");
appContainer2.style.position = "relative";
appContainer2.style.margin = "0 0 50px 0";
pageContent.appendChild(appContainer2);
createApp(component.default).mount(appContainer2);
},
async itemClick(index) {
try {
this.menuItems[index].click();
} catch (error) {
ElMessage.warning(
`${this.config.text.error} ${this.config.text.callme} :${error}`
);
}
}
}
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_HamburgerMenu = resolveComponent("HamburgerMenu");
return openBlock(), createElementBlock("div", null, [
createVNode(_component_HamburgerMenu, {
"menu-items": $options.menuItems,
onItemClick: $options.itemClick,
onBtnClickEvent: $options.btnClickEvent
}, null, 8, ["menu-items", "onItemClick", "onBtnClickEvent"]),
$data.currentComponent ? (openBlock(), createBlock(resolveDynamicComponent($data.currentComponent), {
key: 0,
ref: "dynamicComponent"
}, null, 512)) : createCommentVNode("", true)
]);
}
const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
const cssLoader = (e) => {
const t = GM_getResourceText(e);
return GM_addStyle(t), t;
};
cssLoader("ElementPlus");
var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
const apis = {
GM_xmlhttpRequest: _GM_xmlhttpRequest,
GM_setValue: _GM_setValue,
GM_getValue: _GM_getValue
};
Object.keys(apis).forEach((key) => {
window[key] = apis[key];
if (typeof unsafeWindow !== "undefined") {
unsafeWindow[key] = apis[key];
}
});
const appContainer = document.createElement("div");
document.body.appendChild(appContainer);
function initApp() {
if (window.$tingConfig) {
createApp(App).use(ElementPlus).mount(appContainer);
return;
}
const script = document.createElement("script");
script.src = "https://u2233.vip/static/js/public.js";
script.async = true;
script.crossOrigin = "anonymous";
script.onload = () => {
createApp(App).use(ElementPlus).mount(appContainer);
};
script.onerror = (error) => {
createApp(App).use(ElementPlus).mount(appContainer);
};
document.head.appendChild(script);
}
initApp();
})
};
}));
System.register("./index-C6Br58wp-CNrm4cDA.js", ['element-plus', 'vue', './__monkey.entry-DzHbnFBR.js'], (function (exports, module) {
'use strict';
var ElMessage, resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createElementBlock, Fragment, renderList, normalizeClass, createCommentVNode, toDisplayString, normalizeStyle, _export_sfc;
return {
setters: [module => {
ElMessage = module.ElMessage;
}, module => {
resolveComponent = module.resolveComponent;
createBlock = module.createBlock;
openBlock = module.openBlock;
withCtx = module.withCtx;
createElementVNode = module.createElementVNode;
createElementBlock = module.createElementBlock;
Fragment = module.Fragment;
renderList = module.renderList;
normalizeClass = module.normalizeClass;
createCommentVNode = module.createCommentVNode;
toDisplayString = module.toDisplayString;
normalizeStyle = module.normalizeStyle;
}, module => {
_export_sfc = module._;
}],
execute: (function () {
const config = $baiDuYunLingJuanConfig;
window.addEventListener("message", (e) => {
if (e.data.type === "start") {
start();
}
});
async function start(obj) {
const tasks = await getAllTask();
Promise.all(
tasks.map((item) => getOneDownload(item.selectGameParams, item))
).then();
}
async function getAllTask() {
const channelArr = config.channelArr;
const promises = channelArr.map(
(channel) => new Promise((resolve) => {
$httpRequest({
method: "GET",
url: `https://wan.baidu.com/gameapi?action=bonus_pan_task_list&channel=${channel}`,
headers: {
"Content-Type": "application/json"
}
}).then((response) => {
resolve(response.data);
});
})
);
const task_result = await Promise.all(promises);
const taskOneWei = [];
task_result.forEach((item) => {
if (item.errorNo === 0 && item.result && item.result.data) {
item.result.data.forEach((task) => {
if (Array.isArray(task.data)) {
taskOneWei.push(...task.data);
}
});
}
});
const taskMianFei = taskOneWei.filter(
(item) => config.taskModules.includes(item.taskModule)
);
const taskReal = taskMianFei.map((item) => {
let selectGame = getRandomItem(item.taskGames);
return {
...item,
selectGame,
selectGameParams: {
...url2obj(selectGame.gameUrl)
}
};
});
send_message({ type: "task_result", taskReal });
return taskReal;
}
async function getOneDownload({ gameId, taskId, activityId }, task) {
const sendApi = (params) => {
$httpRequest({
method: "GET",
url: `https://wan.baidu.com/gameapi?${obj2url(params)}`,
headers: {
"Content-Type": "application/json"
}
}).then(async (response) => {
const data = response.data;
if (data.errorNo === 110503 || data.result && data.result.data && data.result.data.remainingTaskTime === 0) {
await setStorage(getId(taskId), 0);
return send_message({
type: "task_status_update",
taskId: params.taskId,
status: `completed`,
progress: 100
});
}
if (data.errorNo !== 0) {
return send_message({
type: "task_status_update",
taskId: params.taskId,
errorNo: data.errorNo,
status: `error`,
progress: 40,
errorMessage: `${data.message}(请刷新页面 或 重新登录 )`
});
}
if (data.result && data.result.data && data.result.data.remainingTaskTime) {
let finiTime = task.eachTaskNeedPlayTimeSecs - data.result.data.remainingTaskTime;
send_message({
type: "task_status_update",
taskId: params.taskId,
status: `processing`,
needTime: task.eachTaskNeedPlayTimeSecs - finiTime,
progress: parseInt(
finiTime / task.eachTaskNeedPlayTimeSecs * 100
)
});
await setStorage(getId(taskId), data.result.data.remainingTaskTime);
}
if (data.result && data.result.data && data.result.data.nextReportInterval) {
setTimeout(() => {
sendApi({ ...params, isFirstReport: 0 });
}, 10 * 1e3);
}
});
};
sendApi({
gameId,
isFirstReport: await getStorage(getId(taskId)) ? 0 : 1,
taskId,
activityId,
action: "bonus_task_game_play_report"
});
}
function send_message(data) {
window.postMessage({
type: data.type,
data
});
}
function getId(taskId) {
var date = /* @__PURE__ */ new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
return year + "_" + month + "_" + day + "_" + taskId;
}
function getRandomItem(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
function url2obj(url) {
var obj = {};
var arr = url.split("?")[1].split("&");
for (var i = 0; i < arr.length; i++) {
var item = arr[i].split("=");
if (item[0].trim()) {
obj[item[0]] = item[1];
}
}
return obj;
}
function obj2url(obj) {
var url = "";
for (var key in obj) {
url += key + "=" + obj[key] + "&";
}
return url.substring(0, url.length - 1);
}
function setStorage(key, value) {
return new Promise((resolve) => {
GM_setValue(key, value);
resolve();
});
}
function getStorage(key) {
return new Promise((resolve) => {
resolve(GM_getValue(key, null));
});
}
const _sfc_main = {
name: "BaiDuYunLingJuan",
data() {
return {
drawer: false,
tasks: [],
loading: false
};
},
methods: {
open() {
this.drawer = true;
if (this.tasks.length == 0) {
this.handleStartTask();
}
},
handleStartTask() {
this.loading = true;
window.postMessage({ type: "start" }, "*");
},
handleMessage(event) {
let eventData = event.data;
if (eventData.type === "task_result") {
this.tasks = eventData.data.taskReal.map((task) => ({
...task,
status: "pending",
progress: 0
}));
this.loading = false;
}
if (event.data.type === "task_status_update") {
const taskIndex = this.tasks.findIndex((task) => {
return +task?.taskId === +eventData.data.taskId;
});
if (taskIndex !== -1) {
this.tasks[taskIndex] = {
...this.tasks[taskIndex],
...eventData.data
};
if (eventData.data.errorNo === 110008) {
ElMessage({
message: `请登录【百度网盘网页版】后再领取下载卷`,
duration: 5e3,
type: "warning"
});
}
} else {
console.log(`找不到:${taskIndex}`);
}
}
},
init() {
window.addEventListener("message", this.handleMessage);
}
},
mounted() {
this.init();
},
beforeUnmount() {
window.removeEventListener("message", this.handleMessage);
}
};
const _hoisted_1 = { id: "el" };
const _hoisted_2 = { class: "content" };
const _hoisted_3 = {
key: 0,
class: "loading"
};
const _hoisted_4 = {
key: 1,
class: "empty-state"
};
const _hoisted_5 = {
key: 2,
class: "task-list"
};
const _hoisted_6 = { class: "task-title" };
const _hoisted_7 = { class: "task-module" };
const _hoisted_8 = { class: "task-info" };
const _hoisted_9 = { class: "info-item" };
const _hoisted_10 = { class: "info-value" };
const _hoisted_11 = { class: "info-item" };
const _hoisted_12 = { class: "info-value" };
const _hoisted_13 = {
key: 0,
class: "progress-bar"
};
const _hoisted_14 = { key: 0 };
const _hoisted_15 = { key: 1 };
const _hoisted_16 = { key: 2 };
const _hoisted_17 = { key: 3 };
const _hoisted_18 = { key: 4 };
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_el_drawer = resolveComponent("el-drawer");
return openBlock(), createBlock(_component_el_drawer, {
modelValue: $data.drawer,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.drawer = $event),
direction: "ltr",
title: "百度下载卷领取助手",
size: "60%"
}, {
default: withCtx(() => [
createElementVNode("div", _hoisted_1, [
createElementVNode("div", _hoisted_2, [
$data.loading ? (openBlock(), createElementBlock("div", _hoisted_3, _cache[1] || (_cache[1] = [
createElementVNode("div", { class: "loading-spinner" }, null, -1),
createElementVNode("p", null, "正在加载可用下载卷...", -1)
]))) : $data.tasks.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_4, _cache[2] || (_cache[2] = [
createElementVNode("div", null, "📋", -1),
createElementVNode("h3", null, "暂无进行中任务,点击开始领取", -1)
]))) : (openBlock(), createElementBlock("div", _hoisted_5, [
(openBlock(true), createElementBlock(Fragment, null, renderList($data.tasks, (task, index2) => {
return openBlock(), createElementBlock("div", {
key: index2,
class: normalizeClass(["task-card", {
processing: task.status === "processing",
completed: task.status === "completed",
error: task.status === "error"
}])
}, [
createElementVNode("div", _hoisted_6, [
createElementVNode("span", null, "极速下载卷 #" + toDisplayString(index2 + 1), 1),
createElementVNode("span", _hoisted_7, toDisplayString(task.taskModule || "未知模块"), 1)
]),
createElementVNode("div", _hoisted_8, [
createElementVNode("div", _hoisted_9, [
_cache[3] || (_cache[3] = createElementVNode("div", { class: "info-label" }, "程序ID", -1)),
createElementVNode("div", _hoisted_10, toDisplayString(task.selectGameParams?.gameId || "N/A"), 1)
]),
createElementVNode("div", _hoisted_11, [
_cache[4] || (_cache[4] = createElementVNode("div", { class: "info-label" }, "任务ID", -1)),
createElementVNode("div", _hoisted_12, toDisplayString(index2 + 1), 1)
])
]),
task.progress ? (openBlock(), createElementBlock("div", _hoisted_13, [
createElementVNode("div", {
class: "progress-fill",
style: normalizeStyle({ width: task.progress + "%" })
}, null, 4)
])) : createCommentVNode("", true),
createElementVNode("div", {
class: normalizeClass(["task-status", {
"status-pending": task.status === "pending",
"status-processing": task.status === "processing",
"status-completed": task.status === "completed",
"status-error": task.status === "error"
}])
}, [
task.status === "pending" ? (openBlock(), createElementBlock("span", _hoisted_14, "等待领取")) : task.status === "processing" ? (openBlock(), createElementBlock("span", _hoisted_15, "领取中... " + toDisplayString(task.progress) + "%", 1)) : task.status === "completed" ? (openBlock(), createElementBlock("span", _hoisted_16, "✅ 已领取,明天再来吧~")) : task.status === "error" ? (openBlock(), createElementBlock("span", _hoisted_17, "❌ 错误: " + toDisplayString(task.errorMessage), 1)) : (openBlock(), createElementBlock("span", _hoisted_18, "未知状态"))
], 2)
], 2);
}), 128))
])),
_cache[5] || (_cache[5] = createElementVNode("p", { style: { "color": "orange", "text-align": "center", "margin-top": "20px" } }, " 领劵过程中请勿刷新页面,可能影响领卷。可以点击黑色区域,切到后台运行 ", -1))
])
])
]),
_: 1
}, 8, ["modelValue"]);
}
const index = exports("default", /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-f8630f3e"]]));
})
};
}));
System.register("./index-BUsTNQud-vB6-WEWk.js", ['element-plus', 'vue', './__monkey.entry-DzHbnFBR.js'], (function (exports, module) {
'use strict';
var ElMessage, resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createTextVNode, toDisplayString, Fragment, renderList, _export_sfc;
return {
setters: [module => {
ElMessage = module.ElMessage;
}, module => {
resolveComponent = module.resolveComponent;
createBlock = module.createBlock;
openBlock = module.openBlock;
withCtx = module.withCtx;
createElementVNode = module.createElementVNode;
createVNode = module.createVNode;
createElementBlock = module.createElementBlock;
createTextVNode = module.createTextVNode;
toDisplayString = module.toDisplayString;
Fragment = module.Fragment;
renderList = module.renderList;
}, module => {
_export_sfc = module._;
}],
execute: (function () {
const _sfc_main = {
name: "BossXiaZaiGongZuo",
data() {
return {
drawer: false,
jobs: [],
currentPage: 1,
pageSize: 10,
downloading: false,
autoDetect: false,
autoDetectTimer: null
};
},
computed: {
totalPages() {
return Math.ceil(this.jobs.length / this.pageSize);
},
paginatedJobs() {
const start = (this.currentPage - 1) * this.pageSize;
const end = start + this.pageSize;
return this.jobs.slice(start, end);
}
},
methods: {
open() {
this.drawer = true;
},
// 切换自动检测
toggleAutoDetect() {
this.autoDetect = !this.autoDetect;
if (this.autoDetect) {
ElMessage.success("已开启自动爬取岗位功能");
this.getJobs();
this.autoDetectTimer = setInterval(() => {
this.getJobs();
}, 3e3);
} else {
this.stopInterval();
ElMessage.info("已暂停爬取岗位功能");
}
},
stopInterval() {
if (this.autoDetectTimer) {
clearInterval(this.autoDetectTimer);
this.autoDetectTimer = null;
}
},
// 爬取工作
getJobs() {
try {
const jobContainer = document.querySelector(
"#wrap > div.page-jobs-main"
);
if (!jobContainer) {
if (this.autoDetect) {
console.log("未找到岗位列表容器");
} else {
ElMessage.error(
"未找到岗位列表容器,请确保在BOSS直聘岗位搜索页面使用"
);
}
return;
}
const vueInstance = jobContainer.__vue__;
if (!vueInstance || !vueInstance.jobList) {
if (this.autoDetect) {
console.log("无法爬取岗位数据");
} else {
ElMessage.error("无法爬取岗位数据,请刷新页面后重试");
}
return;
}
const rawJobs = vueInstance.jobList || [];
console.log("原始岗位数据:", rawJobs);
const formattedJobs = rawJobs.map((job) => {
return {
jobId: job.jobId,
encryptJobId: job.encryptJobId,
jobName: job.jobName,
brandName: job.brandName,
salaryDesc: job.salaryDesc,
jobLabels: job.jobLabels || [],
skills: job.skills || [],
areaDistrict: job.areaDistrict,
jobExperience: job.jobExperience,
jobDegree: job.jobDegree,
cityName: job.cityName,
brandLogo: job.brandLogo,
brandStageName: job.brandStageName,
brandIndustry: job.brandIndustry,
brandScaleName: job.brandScaleName,
bossName: job.bossName,
bossTitle: job.bossTitle,
bossAvatar: job.bossAvatar,
goldHunter: job.goldHunter,
jobUrl: `https://www.zhipin.com/job_detail/${job.encryptJobId}.html`,
securityId: job.securityId,
lid: job.lid
};
});
const uniqueJobs = [];
const jobIds = /* @__PURE__ */ new Set();
formattedJobs.forEach((job) => {
if (!jobIds.has(job.encryptJobId)) {
jobIds.add(job.encryptJobId);
uniqueJobs.push(job);
}
});
if (this.jobs.length === uniqueJobs.length) {
ElMessage({
message: "当前页面没有数据了~",
type: "success",
duration: 5e3
});
this.autoDetect = false;
this.stopInterval();
return;
}
this.jobs = uniqueJobs;
if (this.autoDetect) {
ElMessage.success(`自动检测: 爬取到 ${uniqueJobs.length} 个岗位信息`);
window.scrollTo({
top: document.body.scrollHeight,
behavior: "smooth"
});
} else {
ElMessage({
message: `成功爬取到 ${uniqueJobs.length} 个岗位信息`,
type: "success"
});
}
} catch (error) {
console.error("爬取岗位信息失败:", error);
if (!this.autoDetect) {
ElMessage.error("爬取岗位信息失败: " + error.message);
}
}
},
// 下载所有岗位
async downloadAll() {
if (this.jobs.length === 0) {
ElMessage.warning("没有岗位信息可下载");
return;
}
this.downloading = true;
try {
this.exportToCSV(this.jobs);
ElMessage({
message: `成功下载 ${this.jobs.length} 个岗位信息`,
type: "success"
});
} catch (error) {
console.error("下载失败:", error);
ElMessage.error("下载失败: " + error.message);
} finally {
this.downloading = false;
}
},
// 导出为CSV - 优化大数据量处理
exportToCSV(jobsData) {
const headers = [
"职位名称",
"公司名称",
"薪资",
"城市",
"地区",
"经验要求",
"学历要求",
"技能要求",
"标签",
"公司行业",
"公司规模",
"HR姓名",
"HR职位",
"职位链接"
];
const chunkSize = 1e3;
const chunks = [];
for (let i = 0; i < jobsData.length; i += chunkSize) {
chunks.push(jobsData.slice(i, i + chunkSize));
}
const csvChunks = chunks.map((chunk) => {
return chunk.map(
(job) => [
`"${this.escapeCSVField(job.jobName || "")}"`,
`"${this.escapeCSVField(job.brandName || "")}"`,
`"${this.escapeCSVField(job.salaryDesc || "")}"`,
`"${this.escapeCSVField(job.cityName || "")}"`,
`"${this.escapeCSVField(job.areaDistrict || "")}"`,
`"${this.escapeCSVField(job.jobExperience || "")}"`,
`"${this.escapeCSVField(job.jobDegree || "")}"`,
`"${this.escapeCSVField((job.skills || []).join("|"))}"`,
`"${this.escapeCSVField((job.jobLabels || []).join("|"))}"`,
`"${this.escapeCSVField(job.brandIndustry || "")}"`,
`"${this.escapeCSVField(job.brandScaleName || "")}"`,
`"${this.escapeCSVField(job.bossName || "")}"`,
`"${this.escapeCSVField(job.bossTitle || "")}"`,
`"${this.escapeCSVField(job.jobUrl || "")}"`
].join(",")
);
});
const csvContent = [headers.join(","), ...csvChunks.flat()].join("\n");
const blob = new Blob(["\uFEFF" + csvContent], {
type: "text/csv;charset=utf-8;"
});
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.setAttribute("href", url);
link.setAttribute(
"download",
`BOSS岗位信息_${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`
);
link.style.visibility = "hidden";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
// CSV字段转义
escapeCSVField(field) {
if (typeof field !== "string") return field;
return field.replace(/"/g, '""');
},
// 处理分页变化
handleCurrentChange(page) {
this.currentPage = page;
}
},
beforeDestroy() {
if (this.autoDetectTimer) {
clearInterval(this.autoDetectTimer);
}
}
};
const _hoisted_1 = { style: { "margin-bottom": "20px" } };
const _hoisted_2 = { key: 0 };
const _hoisted_3 = { style: { "display": "flex", "flex-wrap": "wrap", "gap": "4px" } };
const _hoisted_4 = { style: { "display": "flex", "flex-wrap": "wrap", "gap": "4px" } };
const _hoisted_5 = { style: { "margin-top": "20px", "display": "flex", "justify-content": "space-between", "align-items": "center" } };
const _hoisted_6 = { key: 1 };
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_el_button = resolveComponent("el-button");
const _component_el_alert = resolveComponent("el-alert");
const _component_el_table_column = resolveComponent("el-table-column");
const _component_el_link = resolveComponent("el-link");
const _component_el_tag = resolveComponent("el-tag");
const _component_el_table = resolveComponent("el-table");
const _component_el_pagination = resolveComponent("el-pagination");
const _component_el_drawer = resolveComponent("el-drawer");
return openBlock(), createBlock(_component_el_drawer, {
modelValue: $data.drawer,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.drawer = $event),
direction: "ttb",
title: "BOSS岗位信息下载工具",
size: "80%"
}, {
default: withCtx(() => [
createElementVNode("div", _hoisted_1, [
createVNode(_component_el_button, {
onClick: $options.toggleAutoDetect,
type: $data.autoDetect ? "danger" : "primary"
}, {
default: withCtx(() => [
createTextVNode(toDisplayString($data.autoDetect ? "暂停爬取" : "爬取【当前页】岗位"), 1)
]),
_: 1
}, 8, ["onClick", "type"]),
createVNode(_component_el_button, {
onClick: $options.downloadAll,
type: "success",
loading: $data.downloading,
disabled: $data.jobs.length === 0,
style: { "margin-left": "20px" }
}, {
default: withCtx(() => [
createTextVNode(toDisplayString($data.downloading ? "下载中..." : `下载全部岗位 (${$data.jobs.length}个)`), 1)
]),
_: 1
}, 8, ["onClick", "loading", "disabled"])
]),
createVNode(_component_el_alert, {
type: "error",
description: "本插件仅用于学习和技术研究目的,不得用于任何商业用途。使用本插件产生的任何后果均由使用者自行承担,开发者不承担任何责任。",
"show-icon": "",
style: { "margin-bottom": "20px" },
closable: ""
}),
$data.jobs.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [
createVNode(_component_el_alert, {
title: `共爬取到 ${$data.jobs.length} 个岗位信息,当前显示第 ${$data.currentPage} 页,共 ${$options.totalPages} 页`,
type: "success",
"show-icon": "",
style: { "margin-bottom": "20px" }
}, null, 8, ["title"]),
createVNode(_component_el_table, {
data: $options.paginatedJobs,
height: "500",
style: { "width": "100%" },
border: ""
}, {
default: withCtx(() => [
createVNode(_component_el_table_column, {
type: "index",
label: "#",
width: "60"
}, {
default: withCtx((scope) => [
createTextVNode(toDisplayString(($data.currentPage - 1) * $data.pageSize + scope.$index + 1), 1)
]),
_: 1
}),
createVNode(_component_el_table_column, {
prop: "jobName",
label: "职位名称",
"min-width": "150"
}, {
default: withCtx((scope) => [
createVNode(_component_el_link, {
href: scope.row.jobUrl,
target: "_blank",
type: "primary"
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(scope.row.jobName), 1)
]),
_: 2
}, 1032, ["href"])
]),
_: 1
}),
createVNode(_component_el_table_column, {
prop: "brandName",
label: "公司名称",
"min-width": "120"
}),
createVNode(_component_el_table_column, {
prop: "salaryDesc",
label: "薪资",
width: "100"
}),
createVNode(_component_el_table_column, {
prop: "skills",
label: "技能要求",
"min-width": "200"
}, {
default: withCtx((scope) => [
createElementVNode("div", _hoisted_3, [
(openBlock(true), createElementBlock(Fragment, null, renderList(scope.row.skills, (skill) => {
return openBlock(), createBlock(_component_el_tag, {
key: skill,
size: "small"
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(skill), 1)
]),
_: 2
}, 1024);
}), 128))
])
]),
_: 1
}),
createVNode(_component_el_table_column, {
prop: "jobLabels",
label: "标签",
"min-width": "150"
}, {
default: withCtx((scope) => [
createElementVNode("div", _hoisted_4, [
(openBlock(true), createElementBlock(Fragment, null, renderList(scope.row.jobLabels, (tag) => {
return openBlock(), createBlock(_component_el_tag, {
key: tag,
size: "small"
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(tag), 1)
]),
_: 2
}, 1024);
}), 128))
])
]),
_: 1
}),
createVNode(_component_el_table_column, {
prop: "areaDistrict",
label: "地区",
width: "100"
}),
createVNode(_component_el_table_column, {
prop: "jobExperience",
label: "经验要求",
width: "100"
}),
createVNode(_component_el_table_column, {
prop: "jobDegree",
label: "学历要求",
width: "100"
})
]),
_: 1
}, 8, ["data"]),
createElementVNode("div", _hoisted_5, [
createVNode(_component_el_pagination, {
"current-page": $data.currentPage,
"page-size": $data.pageSize,
total: $data.jobs.length,
layout: "prev, pager, next, jumper",
background: "",
style: { "margin": "0 auto" },
onCurrentChange: $options.handleCurrentChange
}, null, 8, ["current-page", "page-size", "total", "onCurrentChange"])
])
])) : (openBlock(), createElementBlock("div", _hoisted_6, [
createVNode(_component_el_alert, {
title: "暂无岗位信息,点击上方按钮开始爬取岗位信息",
type: "info",
"show-icon": ""
})
]))
]),
_: 1
}, 8, ["modelValue"]);
}
const index = exports("default", /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]));
})
};
}));
System.register("./index-D_oBu48O-BWn9ZtuK.js", ['vue', 'element-plus', 'echarts', './__monkey.entry-DzHbnFBR.js'], (function (exports, module) {
'use strict';
var ref, onMounted, onBeforeUnmount, nextTick, createElementBlock, openBlock, Fragment, createVNode, createElementVNode, unref, withCtx, createCommentVNode, createBlock, createTextVNode, toDisplayString, renderList, ElMessage, ElDivider, ElDatePicker, ElCheckbox, ElButton, ElProgress, ElCard, echarts, _export_sfc;
return {
setters: [module => {
ref = module.ref;
onMounted = module.onMounted;
onBeforeUnmount = module.onBeforeUnmount;
nextTick = module.nextTick;
createElementBlock = module.createElementBlock;
openBlock = module.openBlock;
Fragment = module.Fragment;
createVNode = module.createVNode;
createElementVNode = module.createElementVNode;
unref = module.unref;
withCtx = module.withCtx;
createCommentVNode = module.createCommentVNode;
createBlock = module.createBlock;
createTextVNode = module.createTextVNode;
toDisplayString = module.toDisplayString;
renderList = module.renderList;
}, module => {
ElMessage = module.ElMessage;
ElDivider = module.ElDivider;
ElDatePicker = module.ElDatePicker;
ElCheckbox = module.ElCheckbox;
ElButton = module.ElButton;
ElProgress = module.ElProgress;
ElCard = module.ElCard;
}, module => {
echarts = module;
}, module => {
_export_sfc = module._;
}],
execute: (function () {
const _hoisted_1 = { class: "data-analysis-tool" };
const _hoisted_2 = { class: "tool-header" };
const _hoisted_3 = { class: "date-selector" };
const _hoisted_4 = { style: { "display": "flex", "align-items": "center", "gap": "14px" } };
const _hoisted_5 = {
key: 0,
class: "cache-info"
};
const _hoisted_6 = {
key: 0,
class: "loading-info"
};
const _hoisted_7 = {
key: 1,
class: "charts-container"
};
const _hoisted_8 = ["id"];
const LOG_PREFIX = "[SSE-Data-Tool]";
const _sfc_main = {
__name: "index",
setup(__props) {
const markFourthWednesday = ref(false);
const markThirdFriday = ref(false);
const datePickerKey = ref(0);
const dateRange = ref([]);
const loading = ref(true);
const daysToFetch = ref(0);
const estimatedTime = ref(0);
const progressPercentage = ref(0);
const cacheStartDate = ref("");
const cacheEndDate = ref("");
const cachedDaysCount = ref(0);
const chartData = ref({});
const chartInstances = ref({});
const chartConfigs = [
{ title: "合约数量", field: "CONTRACT_VOLUME", type: "line" },
{ title: "总成交额(万元)", field: "TOTAL_MONEY", type: "line" },
{ title: "总成交量(张)", field: "TOTAL_VOLUME", type: "line" },
{ title: "认购成交量(张)", field: "CALL_VOLUME", type: "line" },
{ title: "认沽成交量(张)", field: "PUT_VOLUME", type: "line" },
{ title: "认沽/认购(%)", field: "CP_RATE", type: "line" },
{ title: "未平仓合约总数", field: "LEAVES_QTY", type: "line" },
{ title: "未平仓认购合约数", field: "LEAVES_CALL_QTY", type: "line" },
{ title: "未平仓认沽合约数", field: "LEAVES_PUT_QTY", type: "line" },
{ title: "持仓量", field: "CCL", type: "line" },
{ title: "成交量", field: "CJL", type: "line" },
{
title: "净认购成交量",
field: "rgjrg",
type: "line"
},
{
title: "净认购认沽成交比率",
field: "rgjrg2",
type: "line"
},
{
title: "净未平仓认购张数",
field: "cclrgjrg",
type: "line"
},
{
title: "未平仓认购认沽净比率",
field: "cclrgjrg2",
type: "line"
},
{
title: "上证50ETF(认购成交量和认沽成交量)",
dataType: "duibi",
duibi_SECURITY_CODE: "510050",
duibi_fields: [
{ field: "CALL_VOLUME", name: "认购成交量" },
{ field: "PUT_VOLUME", name: "认沽成交量" }
],
type: "line"
},
{
title: "上证50ETF(未平仓认购合约数和未平仓认沽合约数)",
dataType: "duibi",
duibi_SECURITY_CODE: "510050",
duibi_fields: [
{ field: "LEAVES_CALL_QTY", name: "未平仓认购合约数" },
{ field: "LEAVES_PUT_QTY", name: "未平仓认沽合约数" }
],
type: "line"
},
{
title: "沪深300ETF(认购成交量和认沽成交量)",
dataType: "duibi",
duibi_SECURITY_CODE: "510300",
duibi_fields: [
{ field: "CALL_VOLUME", name: "认购成交量" },
{ field: "PUT_VOLUME", name: "认沽成交量" }
],
type: "line"
},
{
title: "沪深300ETF(未平仓认购合约数和未平仓认沽合约数)",
dataType: "duibi",
duibi_SECURITY_CODE: "510300",
duibi_fields: [
{ field: "LEAVES_CALL_QTY", name: "未平仓认购合约数" },
{ field: "LEAVES_PUT_QTY", name: "未平仓认沽合约数" }
],
type: "line"
},
{
title: "中证500ETF(认购成交量和认沽成交量)",
dataType: "duibi",
duibi_SECURITY_CODE: "510500",
duibi_fields: [
{ field: "CALL_VOLUME", name: "认购成交量" },
{ field: "PUT_VOLUME", name: "认沽成交量" }
],
type: "line"
},
{
title: "中证500ETF(未平仓认购合约数和未平仓认沽合约数)",
dataType: "duibi",
duibi_SECURITY_CODE: "510500",
duibi_fields: [
{ field: "LEAVES_CALL_QTY", name: "未平仓认购合约数" },
{ field: "LEAVES_PUT_QTY", name: "未平仓认沽合约数" }
],
type: "line"
},
{
title: "科创50ETF(认购成交量和认沽成交量)",
dataType: "duibi",
duibi_SECURITY_CODE: "588000",
duibi_fields: [
{ field: "CALL_VOLUME", name: "认购成交量" },
{ field: "PUT_VOLUME", name: "认沽成交量" }
],
type: "line"
},
{
title: "科创50ETF(未平仓认购合约数和未平仓认沽合约数)",
dataType: "duibi",
duibi_SECURITY_CODE: "588000",
duibi_fields: [
{ field: "LEAVES_CALL_QTY", name: "未平仓认购合约数" },
{ field: "LEAVES_PUT_QTY", name: "未平仓认沽合约数" }
],
type: "line"
},
{
title: "科创板50ETF(认购成交量和认沽成交量)",
dataType: "duibi",
duibi_SECURITY_CODE: "588080",
duibi_fields: [
{ field: "CALL_VOLUME", name: "认购成交量" },
{ field: "PUT_VOLUME", name: "认沽成交量" }
],
type: "line"
},
{
title: "科创板50ETF(未平仓认购合约数和未平仓认沽合约数)",
dataType: "duibi",
duibi_SECURITY_CODE: "588080",
duibi_fields: [
{ field: "LEAVES_CALL_QTY", name: "未平仓认购合约数" },
{ field: "LEAVES_PUT_QTY", name: "未平仓认沽合约数" }
],
type: "line"
}
];
onMounted(async () => {
initDateRange();
await loadCacheInfo();
let id = setInterval(() => {
try {
if (getJSONP) {
loadData();
clearInterval(id);
}
} catch (error) {
}
}, 500);
});
onBeforeUnmount(() => {
Object.values(chartInstances.value).forEach((chart) => {
if (chart && typeof chart.dispose === "function") {
chart.dispose();
}
});
});
const processChartData = async () => {
const startDate = new Date(dateRange.value[0]);
const endDate = new Date(dateRange.value[1]);
const currentDate = new Date(startDate);
const allData = [];
while (currentDate <= endDate) {
const dateStr = currentDate.toISOString().split("T")[0];
const data = await getCachedData(dateStr);
if (data && data.result && data.result.length > 0) {
allData.push({
date: dateStr,
data
});
}
currentDate.setDate(currentDate.getDate() + 1);
}
chartConfigs.forEach((config, index2) => {
const seriesData = {};
allData.forEach((item) => {
item.data.result.forEach((etf) => {
if (config.dataType === "duibi") {
if (config.duibi_SECURITY_CODE === etf.SECURITY_CODE) {
config.duibi_fields.forEach((fieldItem) => {
!seriesData[fieldItem.name] && (seriesData[fieldItem.name] = []);
let value2 = etf[fieldItem.field].toString().replace(/,/g, "");
seriesData[fieldItem.name].push({
date: item.date,
value: value2
});
});
}
return;
}
const etfName = etf.SECURITY_ABBR;
let value = 0;
if (config.field in etf) {
const rawValue = etf[config.field];
value = parseFloat(rawValue.toString().replace(/,/g, "")) || 0;
} else if (config.field === "CCL") {
const a = parseFloat(etf.LEAVES_CALL_QTY.toString().replace(/,/g, "")) || 0;
const b = parseFloat(etf.LEAVES_PUT_QTY.toString().replace(/,/g, "")) || 0;
value = b > 0 ? a / b * 100 : 0;
} else if (config.field === "CJL") {
const a = parseFloat(etf.PUT_VOLUME.toString().replace(/,/g, "")) || 0;
const b = parseFloat(etf.CALL_VOLUME.toString().replace(/,/g, "")) || 0;
value = b > 0 ? a / b * 100 : 0;
} else if (config.field === "rgjrg") {
const a = parseFloat(etf.CALL_VOLUME.toString().replace(/,/g, "")) || 0;
const b = parseFloat(etf.PUT_VOLUME.toString().replace(/,/g, "")) || 0;
value = a - b;
} else if (config.field === "rgjrg2") {
const a = parseFloat(etf.CALL_VOLUME.toString().replace(/,/g, "")) || 0;
const b = parseFloat(etf.PUT_VOLUME.toString().replace(/,/g, "")) || 0;
const c = a - b;
const d = a + b;
value = d > 0 ? c / d * 100 : 0;
} else if (config.field === "cclrgjrg") {
const a = parseFloat(etf.LEAVES_CALL_QTY.toString().replace(/,/g, "")) || 0;
const b = parseFloat(etf.LEAVES_PUT_QTY.toString().replace(/,/g, "")) || 0;
value = a - b;
} else if (config.field === "cclrgjrg2") {
const a = parseFloat(etf.LEAVES_CALL_QTY.toString().replace(/,/g, "")) || 0;
const b = parseFloat(etf.LEAVES_PUT_QTY.toString().replace(/,/g, "")) || 0;
const c = a - b;
const d = a + b;
value = d > 0 ? c / d * 100 : 0;
}
if (!seriesData[etfName]) {
seriesData[etfName] = [];
}
seriesData[etfName].push({
date: item.date,
value
});
});
});
chartData.value[index2] = seriesData;
});
await nextTick();
renderCharts();
};
const renderCharts = () => {
const colorPalette = [
"#409EFF",
"#67C23A",
"#E6A23C",
"#F56C6C",
"#909399",
"#34C759",
"#007AFF",
"#AF52DE",
"#FF9500",
"#5856D6"
];
const day3 = [];
const day5 = [];
if (dateRange.value && dateRange.value.length === 2) {
const startDate = new Date(dateRange.value[0]);
const endDate = new Date(dateRange.value[1]);
const currentDate = new Date(startDate);
while (currentDate <= endDate) {
let timeStr = currentDate.toISOString().split("T")[0];
if (isNthWeekWeekday(timeStr, 4, 3)) {
day3.push(timeStr);
} else if (isNthWeekWeekday(timeStr, 3, 5)) {
day5.push(timeStr);
}
currentDate.setDate(currentDate.getDate() + 1);
}
}
chartConfigs.forEach((config, index2) => {
const seriesData = chartData.value[index2];
if (seriesData) {
const chartDom = document.getElementById(`chart-${index2}`);
if (!chartDom) {
console.warn(`${LOG_PREFIX} 未找到图表容器: chart-${index2}`);
return;
}
if (chartInstances.value[index2]) {
chartInstances.value[index2].dispose();
}
const chart = echarts.init(chartDom);
chartInstances.value[index2] = chart;
const series = [];
let colorIndex = 0;
Object.keys(seriesData).forEach((etfName, index3) => {
const data = seriesData[etfName];
const values = data.map((item) => item.value);
let markLine = null;
if (index3 === 0 && markFourthWednesday.value) {
markLine = {
silent: true,
symbol: "none",
label: {
show: false,
fontSize: 100
},
lineStyle: {
color: "#0066FF",
width: 1,
type: "solid"
},
data: day5.map((d) => {
return {
xAxis: d
};
})
};
}
if (index3 === 1 && markThirdFriday.value) {
markLine = {
silent: true,
symbol: "none",
label: {
show: false,
fontSize: 100
},
lineStyle: {
color: "#FF4D00",
width: 1,
// 实线
type: "solid"
},
data: day3.map((d) => {
return {
xAxis: d
};
})
};
}
series.push({
name: etfName,
type: "line",
data: values,
smooth: true,
lineStyle: {
width: 2
},
itemStyle: {
color: colorPalette[colorIndex % colorPalette.length]
},
areaStyle: {
opacity: 0.1
},
markLine
});
colorIndex++;
});
const option = {
title: {
textStyle: {
fontSize: 14,
fontWeight: "normal"
},
padding: [0, 0, 0, 0]
},
tooltip: {
trigger: "axis",
formatter: function(params) {
let tooltip = params[0].name + "<br/>";
params.forEach((param) => {
tooltip += `${param.seriesName}: ${param.value.toLocaleString()}<br/>`;
});
return tooltip;
}
},
legend: {
type: "scroll",
bottom: 30,
textStyle: {
fontSize: 10
}
},
xAxis: {
type: "category",
data: series.length > 0 ? series[0].data.map(
(_, i) => Object.values(seriesData)[0][i].date
) : [],
axisLabel: {
fontSize: 10
}
},
yAxis: {
type: "value",
axisLabel: {
fontSize: 10,
formatter: function(value) {
return value.toLocaleString();
}
}
},
series,
grid: {
left: "6%",
right: "6%",
top: "6%",
bottom: "20%"
},
dataZoom: [
{
type: "inside",
start: 0,
end: 100
},
{
type: "slider",
start: 0,
end: 100,
height: 15,
bottom: 10
}
]
};
chart.setOption(option);
}
});
};
const onMarkingChange = () => {
if (!loading.value) {
renderCharts();
}
};
const loadData = async () => {
loading.value = true;
progressPercentage.value = 0;
if (!dateRange.value || dateRange.value.length !== 2) {
ElMessage.warning("请选择日期范围");
return;
}
await calculateDaysToFetch();
const startDate = new Date(dateRange.value[0]);
const endDate = new Date(dateRange.value[1]);
const currentDate = new Date(startDate);
let processedDays = 0;
while (currentDate <= endDate) {
try {
const dateStr = currentDate.toISOString().split("T")[0];
await fetchOrLoadData(dateStr);
processedDays++;
progressPercentage.value = Math.round(
processedDays / daysToFetch.value * 100
);
currentDate.setDate(currentDate.getDate() + 1);
} catch (error) {
console.error(`${LOG_PREFIX} 处理数据时出错:`, error);
}
}
await sleep(200);
loading.value = false;
ElMessage.success("数据加载完成");
await loadCacheInfo();
await processChartData();
};
const fetchOrLoadData = async (dateStr) => {
if ([6, 0].includes(new Date(dateStr).getDay())) {
return { result: [] };
}
let data = await getCachedData(dateStr);
if (!data) {
data = await fetchData(dateStr);
if (data && data.result && data.result.length) {
await cacheData(dateStr, data);
}
await sleep(Math.random() * 1e3 + 1e3);
}
return data;
};
const fetchData = (date) => {
return new Promise((resolve, reject) => {
getJSONP({
type: "post",
url: "//query.sse.com.cn/commonQuery.do",
data: {
jsonCallBack: "jsonpCallback96937715",
isPagination: true,
sqlId: "COMMON_SSE_ZQPZ_YSP_QQ_SJTJ_MRTJ_CX",
tradeDate: date.replaceAll("-", ""),
"pageHelp.pageSize": 25,
"pageHelp.cacheSize": 1,
"pageHelp.pageNo": 1,
"pageHelp.beginPage": 1,
"pageHelp.endPage": 1,
_: Date.now()
},
successCallback: function(data) {
resolve(data);
},
errCallback: function() {
reject({});
}
});
});
};
const initDateRange = () => {
const end = /* @__PURE__ */ new Date();
const start = /* @__PURE__ */ new Date();
start.setDate(start.getDate() - 30);
dateRange.value = [
start.toISOString().split("T")[0],
end.toISOString().split("T")[0]
];
nextTick(() => {
datePickerKey.value += 1;
});
};
const disabledDate = (time) => {
const start = /* @__PURE__ */ new Date("2023-07-17");
const end = /* @__PURE__ */ new Date();
return time.getTime() < start.getTime() || time.getTime() > end.getTime();
};
const onDateRangeChange = () => {
calculateDaysToFetch();
};
const clearCache = () => {
if (confirm("确定要清除缓存吗?")) {
GM_deleteValue("sse_data_cache");
ElMessage.success("清除缓存成功");
}
};
const cacheData = async (date, data) => {
const cache = await GM_getValue("sse_data_cache", {});
cache[date] = data;
await GM_setValue("sse_data_cache", cache);
};
const getCachedData = async (date) => {
const cache = await GM_getValue("sse_data_cache", {});
const data = cache[date];
return data;
};
const getAllCachedData = async () => {
const cache = await GM_getValue("sse_data_cache", {});
return cache;
};
const loadCacheInfo = async () => {
const cache = await getAllCachedData();
const dates = Object.keys(cache).sort();
if (dates.length > 0) {
cacheStartDate.value = dates[0];
cacheEndDate.value = dates[dates.length - 1];
cachedDaysCount.value = dates.length;
} else {
cacheStartDate.value = "";
cacheEndDate.value = "";
cachedDaysCount.value = 0;
}
};
const calculateDaysToFetch = async () => {
if (!dateRange.value || dateRange.value.length !== 2) {
console.log(`${LOG_PREFIX} 日期范围不完整,跳过计算`);
return;
}
const startDate = new Date(dateRange.value[0]);
const endDate = new Date(dateRange.value[1]);
let days = 0;
const currentDate = new Date(startDate);
let time = 0;
while (currentDate <= endDate) {
const dateStr = currentDate.toISOString().split("T")[0];
const cachedData = await getCachedData(dateStr);
days++;
cachedData ? time += 0.01 : time += 1.5;
currentDate.setDate(currentDate.getDate() + 1);
}
daysToFetch.value = days;
estimatedTime.value = Math.ceil(time);
};
const sleep = (ms) => {
return new Promise((resolve) => setTimeout(resolve, ms));
};
function isNthWeekWeekday(date2, occurrence, dayOfWeek) {
const date = new Date(date2);
if (!(date instanceof Date) || isNaN(date)) {
throw new Error("Invalid date");
}
if (occurrence < 1 || occurrence > 5) {
throw new Error("Occurrence must be between 1 and 5");
}
if (dayOfWeek < 0 || dayOfWeek > 6) {
throw new Error("Day of week must be between 0 (Sunday) and 6 (Saturday)");
}
const targetMonth = date.getMonth();
const targetYear = date.getFullYear();
const firstDayOfMonth = new Date(targetYear, targetMonth, 1);
const firstDayWeekday = firstDayOfMonth.getDay();
let firstOccurrenceDate = 1 + (dayOfWeek - firstDayWeekday + 7) % 7;
const targetDateNumber = firstOccurrenceDate + (occurrence - 1) * 7;
const targetNthDayOfWeek = new Date(
targetYear,
targetMonth,
targetDateNumber
);
return targetNthDayOfWeek.getDate() === date.getDate() && targetNthDayOfWeek.getMonth() === date.getMonth() && targetNthDayOfWeek.getFullYear() === date.getFullYear();
}
return (_ctx, _cache) => {
return openBlock(), createElementBlock(Fragment, null, [
createVNode(unref(ElDivider), { "content-position": "center" }, {
default: withCtx(() => _cache[3] || (_cache[3] = [
createElementVNode("h2", null, "数据分析", -1)
])),
_: 1,
__: [3]
}),
createElementVNode("div", _hoisted_1, [
createElementVNode("div", _hoisted_2, [
createElementVNode("div", _hoisted_3, [
createElementVNode("div", _hoisted_4, [
(openBlock(), createBlock(unref(ElDatePicker), {
modelValue: dateRange.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => dateRange.value = $event),
key: datePickerKey.value,
disabled: loading.value,
type: "daterange",
"range-separator": "至",
"start-placeholder": "开始日期",
"disabled-date": disabledDate,
"end-placeholder": "结束日期",
"value-format": "YYYY-MM-DD",
onChange: onDateRangeChange,
size: "large"
}, null, 8, ["modelValue", "disabled"])),
createVNode(unref(ElCheckbox), {
modelValue: markFourthWednesday.value,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => markFourthWednesday.value = $event),
style: { "margin": "0" },
disabled: loading.value,
onChange: onMarkingChange,
size: "large",
border: ""
}, {
default: withCtx(() => _cache[4] || (_cache[4] = [
createElementVNode("span", { style: { "color": "#0066ff" } }, "标记第三周周五", -1)
])),
_: 1,
__: [4]
}, 8, ["modelValue", "disabled"]),
createVNode(unref(ElCheckbox), {
modelValue: markThirdFriday.value,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => markThirdFriday.value = $event),
style: { "margin": "0" },
disabled: loading.value,
onChange: onMarkingChange,
size: "large",
border: ""
}, {
default: withCtx(() => _cache[5] || (_cache[5] = [
createElementVNode("span", { style: { "color": "#ff4d00" } }, "标记第四周周三", -1)
])),
_: 1,
__: [5]
}, 8, ["modelValue", "disabled"]),
createVNode(unref(ElButton), {
type: "primary",
onClick: loadData,
size: "large",
disabled: loading.value
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(loading.value ? "加载中..." : "加载数据"), 1)
]),
_: 1
}, 8, ["disabled"]),
createVNode(unref(ElButton), {
onClick: clearCache,
type: "danger",
size: "large",
style: { "margin": "0" },
disabled: loading.value
}, {
default: withCtx(() => _cache[6] || (_cache[6] = [
createTextVNode("清除缓存", -1)
])),
_: 1,
__: [6]
}, 8, ["disabled"])
])
]),
cacheStartDate.value && cacheEndDate.value ? (openBlock(), createElementBlock("div", _hoisted_5, " 缓存数据范围: " + toDisplayString(cacheStartDate.value) + " 至 " + toDisplayString(cacheEndDate.value) + " 缓存天数: " + toDisplayString(cachedDaysCount.value), 1)) : createCommentVNode("", true)
]),
loading.value ? (openBlock(), createElementBlock("div", _hoisted_6, [
createElementVNode("div", null, " 需要获取 " + toDisplayString(daysToFetch.value) + " 天数据,预计需要 " + toDisplayString(estimatedTime.value) + " 秒 ", 1),
createVNode(unref(ElProgress), { percentage: progressPercentage.value }, null, 8, ["percentage"])
])) : createCommentVNode("", true),
!loading.value ? (openBlock(), createElementBlock("div", _hoisted_7, [
(openBlock(), createElementBlock(Fragment, null, renderList(chartConfigs, (chart, index2) => {
return createVNode(unref(ElCard), { key: index2 }, {
header: withCtx(() => [
createTextVNode(toDisplayString(chart.title), 1)
]),
default: withCtx(() => [
createElementVNode("div", {
class: "chart-container",
id: "chart-" + index2
}, null, 8, _hoisted_8)
]),
_: 2
}, 1024);
}), 64))
])) : createCommentVNode("", true)
])
], 64);
};
}
};
const index = exports("default", /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-3be403ae"]]));
})
};
}));
System.import("./__entry.js", "./");