学生档案批量打印(安徽中职 zzxsgl)
学生档案批量打印脚本 — 详细说明
本文档对应文件:batch-print-students.user.js(Tampermonkey / 脚本猫 用户脚本)。
一、脚本作用
在省平台 「全国中等职业学校学生管理信息系统」(域名 zzxsgl.ahjygl.gov.cn)的 班级学生查询列表页上,依次对当前页每一名学生:
- 打开该学生的 详情页;
- 在详情页点击 「打印预览」;
- 进入 打印预览页(带
isPrint=0的 URL),点击工具栏 「打印」,或兜底调用window.print(); - 处理完打印相关流程后,自动跳转回你开始任务时的列表地址,并对下一人重复。
脚本 只处理当前表格里已经加载出来的行,不翻页、不遍历其它页码。
二、安装与环境
| 项目 | 说明 |
|---|---|
| 扩展 | Tampermonkey(Chrome / Edge)、或脚本猫浏览器扩展 |
| 脚本类型 | 必须选「脚本」;若为脚本猫站点上的「库」类型,@match 往往不会在目标页生效 |
| 浏览器 | Chrome / Edge 等 Chromium 内核(推荐最新稳定版) |
| 脚本授权 | @grant GM_setValue、GM_getValue,用于跨整页跳转保存队列与进度 |
导入方式简述
- 将
batch-print-students.user.js用扩展「从文件导入」或通过脚本猫创建脚本并粘贴全文。 - 确认头部
@match包含你使用的站点(默认已写http(s)://zzxsgl.ahjygl.gov.cn/*)。 - 保存并启用脚本。
三、页面类型与 URL 约定
脚本把当前标签页分为四类,判断顺序为:列表 → 打印预览 → 详情;都不满足则为 unknown(不跑流程)。
1. 列表页 list
- 典型特征:有「查询条件 / 查询结果」,姓名列为可点链接。
- 识别逻辑(代码):
- 若不是详情、不是 zz 打印预览地址;
- 且 URL 含
studInfoManage且不包含goStuDetail→ 认为是列表; - 否则兜底:页面正文含「查询结果」,且能通过
listStudentLinkSelector找到姓名链接。
若你的列表 URL 完全不含 studInfoManage,主要依赖兜底条件;兜底失败时需改 CONFIG.isListPage() 或在 Network 里看真实 action 名后加一层判断。
2. 详情页 detail
- 示例形态:路径中含
studInfoManage!goStuDetail.action,参数中带xsqb.id=等。 - 要做的操作:查找并点击 「打印预览」(不配 CSS 时按文案全文包含「打印预览」查找)。
3. 打印预览页 print
- 示例形态:路径中含
zzZxsJbxxAction!showDetail.action,且查询串中含isPrint=0(与…&isPrint=0等价)。 - 要做的操作:优先点击文案为 「打印」 的工具栏按钮;找不到则用
CONFIG.autoPrintOnPreviewPage决定是否直接window.print()。
4. unknown
- 既不像列表也不像详情也不像上述预览 URL,则面板不会出现、批量逻辑不执行。可把
CONFIG.debug设为true看控制台[批量打印] 页面类型:日志。
四、用户操作流程(你侧)
- 打开 列表页,按需选年度、班级,点「查询」,让 当前页的「查询结果」表格显示出学生。
- 等待右下角悬浮面板「批量打印」出现。
- 点 「开始」:脚本抓取当前页所有姓名链接并排好队,跳转到第 1 人详情。
- 在预览页按需处理浏览器 打印对话框(系统无法静默,一般每次仍会弹出)。
- 一单结束后脚本会
location.href回到你开始任务时的列表 URL,再打开队列中下一人。 - 可随时点 「停止」:停止后续排队(已发出的跳转不受影响时,请以页面实际状态为准)。
- 当前页全部打完后面板会提示 「全部完成」。
五、内部状态机(便于排查)
脚本用 GM_setValue/GM_getValue 持久化(键名:batchStudentPrint_state_v1),主要字段含义:
| 字段 | 含义 |
|---|---|
running |
是否在批量流程中 |
stopRequested |
用户是否点了停止 |
listUrl |
点开始时的列表完整地址,打完一人后以此为「回家」地址 |
queue |
{ href, text }[],当前页的姓名链接队列 |
index |
当前处理到的学生在队列中的下标 |
phase |
idle、goto_detail、on_detail、goto_print、on_print、return_list |
要点:详情页若为 同一标签跳转 到预览(previewOpenMode: 'sameTab'),脚本在 点击「打印预览」之前 就会把 phase 写成 goto_print,否则整页卸载后来不及保存状态。
六、CONFIG 配置项说明
在脚本中段 const CONFIG = { ... } 内修改。
选择与页面识别
| 配置项 | 作用 |
|---|---|
listStudentLinkSelector |
列表姓名列 <a> 的 CSS,默认 .grid-table tbody tr td:nth-child(2) a;抓不到人用 F12 复制 selector |
isListPage() |
是否在列表页;一般无需改除非你的列表 URL 与默认规则差很远 |
isDetailPage() |
是否在 goStuDetail 详情 |
isPrintPreviewPage() |
是否在 zzZxsJbxx…showDetail… 且 isPrint=0 |
detailPrintPreviewSelectorCss |
详情页「打印预览」的稳定 CSS;留空则按文案「打印预览」找 |
printPagePrintButtonSelectorCss |
预览页「打印」的稳定 CSS;留空则按规范化后等于「打印」的节点找 |
printPageExtraPrintSelector |
极少数站点需多点一步时可填额外选择器 |
等待时间与行为
| 配置项 | 含义(毫秒) |
|---|---|
wait.domReady |
等元素出现的最长时间(详情里等「打印预览」) |
wait.afterNavigation |
进页后简短延迟 |
wait.afterClickPreview |
非 sameTab 时点击预览后的等待 |
wait.printDialogDelay |
打印前延迟 |
wait.betweenStudents |
回列表后到打开下一人之间的间隔 |
wait.popupPoll |
弹窗模式下轮询子窗口关闭的间隔 |
| 配置项 | 含义 |
|---|---|
autoPrintOnPreviewPage |
预览页没找到「打印」按钮时是否 window.print() |
closePreviewWindowAfterPrint |
结束后是否尝试 window.close()(主标签上通常关不掉,会再走 location.href=listUrl) |
previewOpenMode |
sameTab:同标签进入预览(本系统默认);popup:新窗口 + hook window.open;iframe:需配合 previewIframeSelector |
debug |
true 时在控制台输出 [批量打印] 日志 |
七、@noframes 说明
脚本带有 @noframes,只在 顶层窗口 运行。若你发现系统整页插在 iframe 里且脚本完全不执行,可尝试删除头部 @noframes 一行后重载(可能影响其它内嵌页,按需评估)。
八、常见问题
1. 列表上没有悬浮面板
- 脚本未注入:检查扩展是否开启、脚本是否启用、
@match是否盖住当前网址。 - 页面被判成
unknown:开启CONFIG.debug,看控制台;按第三节调整isListPage或listStudentLinkSelector。
2. 点开始提示抓不到姓名
- 改
listStudentLinkSelector:在列表页右键「姓名」→ 检查 → 复制 selector;注意是否有多层 iframe(与第七节相关)。
3. 详情里提示找不到「打印预览」
- 填
detailPrintPreviewSelectorCss,或确认页面是否真的已切到详情 tab、是否需先点开「学生基本信息」等。
4. 预览页没有弹出打印对话框
- 确认是否被判成
print(URL 是否含showDetail、isPrint=0)。 - 可把
printPagePrintButtonSelectorCss写成精确选择器; - 或保持
autoPrintOnPreviewPage: true,在无按钮时使用window.print()。
5. 打印结束后没有回到列表
- 核对
listUrl是否在点开始时被正确记下(一般不会改代码;避免在开始前用其它方式改写过历史导致扩展丢失)。 - 同标签预览流程依赖
finishPrintAndReturn()里的location.href = listUrl;若浏览器或策略拦截跳转,需在浏览器侧排查。
6. 预览是新开窗口怎么办
把 previewOpenMode 改成 popup;并保证 弹窗页的 URL 仍匹配 @match,否则预览窗内脚本不会注入、无法自动点「打印」。
九、免责声明与安全提示
- 本脚本仅在 你有权访问与打印 的数据范围内使用。
- 账号、密码与会话 Cookie 请自行保管;勿把导出脚本发到不可信途径。
- 批量打印会向系统发起与手工等价的页面请求;请适度使用,避免在业务高峰对服务器造成不必要的压力。
十、版本与文件
| 项目 | 值 |
|---|---|
| 脚本文件名 | batch-print-students.user.js |
| 当前说明对应版本(以脚本头部为准) | 1.1.0 |
若脚本头部 @version 已升级,请以脚本内注释与 CONFIG 为准;本文若未同步更新,可把差异记在你自己的备忘录中。