学生档案批量打印(安徽中职 zzxsgl)

创建于 7 小时前
更新于 6 小时前
在校生档案:列表→详情→打印预览→打印→回列表(zzxsgl.ahjygl.gov.cn)·支持 iframe 内表格
总安装量
13
今日新增
+0
用户评分
- / 5.0 (0)
当前版本
1.2.0
脚本详情

学生档案批量打印脚本 — 详细说明

本文档对应文件:batch-print-students.user.js(Tampermonkey / 脚本猫 用户脚本)。


一、脚本作用

在省平台 「全国中等职业学校学生管理信息系统」(域名 zzxsgl.ahjygl.gov.cn)的 班级学生查询列表页上,依次对当前页每一名学生:

  1. 打开该学生的 详情页
  2. 在详情页点击 「打印预览」
  3. 进入 打印预览页(带 isPrint=0 的 URL),点击工具栏 「打印」,或兜底调用 window.print()
  4. 处理完打印相关流程后,自动跳转回你开始任务时的列表地址,并对下一人重复。

脚本 只处理当前表格里已经加载出来的行不翻页、不遍历其它页码


二、安装与环境

项目 说明
扩展 Tampermonkey(Chrome / Edge)、或脚本猫浏览器扩展
脚本类型 必须选「脚本」;若为脚本猫站点上的「库」类型,@match 往往不会在目标页生效
浏览器 Chrome / Edge 等 Chromium 内核(推荐最新稳定版)
脚本授权 @grant GM_setValueGM_getValue,用于跨整页跳转保存队列与进度

导入方式简述

  1. batch-print-students.user.js 用扩展「从文件导入」或通过脚本猫创建脚本并粘贴全文。
  2. 确认头部 @match 包含你使用的站点(默认已写 http(s)://zzxsgl.ahjygl.gov.cn/*)。
  3. 保存并启用脚本。

三、页面类型与 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. 打开 列表页,按需选年度、班级,点「查询」,让 当前页的「查询结果」表格显示出学生。
  2. 等待右下角悬浮面板「批量打印」出现。
  3. 「开始」:脚本抓取当前页所有姓名链接并排好队,跳转到第 1 人详情。
  4. 在预览页按需处理浏览器 打印对话框(系统无法静默,一般每次仍会弹出)。
  5. 一单结束后脚本会 location.href 回到你开始任务时的列表 URL,再打开队列中下一人。
  6. 可随时点 「停止」:停止后续排队(已发出的跳转不受影响时,请以页面实际状态为准)。
  7. 当前页全部打完后面板会提示 「全部完成」

五、内部状态机(便于排查)

脚本用 GM_setValue/GM_getValue 持久化(键名:batchStudentPrint_state_v1),主要字段含义:

字段 含义
running 是否在批量流程中
stopRequested 用户是否点了停止
listUrl 点开始时的列表完整地址,打完一人后以此为「回家」地址
queue { href, text }[],当前页的姓名链接队列
index 当前处理到的学生在队列中的下标
phase idlegoto_detailon_detailgoto_printon_printreturn_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.openiframe:需配合 previewIframeSelector
debug true 时在控制台输出 [批量打印] 日志

七、@noframes 说明

脚本带有 @noframes,只在 顶层窗口 运行。若你发现系统整页插在 iframe 里且脚本完全不执行,可尝试删除头部 @noframes 一行后重载(可能影响其它内嵌页,按需评估)。


八、常见问题

1. 列表上没有悬浮面板

  • 脚本未注入:检查扩展是否开启、脚本是否启用、@match 是否盖住当前网址。
  • 页面被判成 unknown:开启 CONFIG.debug,看控制台;按第三节调整 isListPagelistStudentLinkSelector

2. 点开始提示抓不到姓名

  • listStudentLinkSelector:在列表页右键「姓名」→ 检查 → 复制 selector;注意是否有多层 iframe(与第七节相关)。

3. 详情里提示找不到「打印预览」

  • detailPrintPreviewSelectorCss,或确认页面是否真的已切到详情 tab、是否需先点开「学生基本信息」等。

4. 预览页没有弹出打印对话框

  • 确认是否被判成 print(URL 是否含 showDetailisPrint=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 为准;本文若未同步更新,可把差异记在你自己的备忘录中。