
简介面向阅卷系统管理员与教务人员的操作流程文档以系统化方式梳理从后台数据初始化到考试目录建立的关键配置环节。文档针对学期、年级、科目、班级、学生、教研组等基础数据的维护以及权限分配、考试创建、答题卡扫描制作等高频操作给出明确指引能帮助初次接触该系统的人员快速上手减少配置错误。资源为单个 Word 文档约 21.06MB以文字说明与界面操作示意为主适合在电脑端或打印后对照使用。目前已有 114 人学习可作为学校或教育机构内部培训、系统上线前的操作参考。读者通过这份文档可以完整了解初始化配置向导的使用方法、批量导入学生信息的格式要求、多科与单科考试的创建路径、扫描参数设置及答题卡标定流程从而独立完成一次阅卷考试的全流程搭建。1. 阅卷系统的两条主线主数据初始化与答题卡模板生命周期这套阅卷系统的操作流程本质上只有两条主线一条是把年级、班级、学生、教师这些基础数据灌进后台另一条是为每一次考试生成可用的答题卡模板。前者做一次能管一个学期后者每场考试都要走一遍「扫描→标定→生成 CRP→上传」的闭环。最容易踩坑的其实是第二步——考试目录创建之后答题卡模板的制作顺序一旦颠倒轻则重新圈定区域重则整场考试的扫描作废。下面按操作文档的原始顺序拆解整个流程适合刚接手系统初始化、或者要对已有考试做模板调整的教务管理人员和系统维护者。2. 后台主数据初始化九个配置项的依赖顺序与批量导入校验2.1 先建年级科目再建班级学生初始化路径的拓扑顺序后台初始化的九个步骤看起来是并列的菜单操作实际上存在严格的拓扑依赖。年级在班级之前班级在学生之前教研组和教师在班级配置之前。如果班级还没建就往里导学生批量增加时根本选不到目标班级如果教研组没建配置班级时科任和班主任的下拉列表就是空的。这个顺序在操作文档里没有被强调但实际跑一遍系统就会感受到。九个步骤可以分成三层。第一层是基础字典层包括学期配置、年级、科目、学期添加它们没有前置依赖系统默认的学期配置一般不需要修改。第二层是组织层包括班级和学生学生必须挂在已有班级之下班级必须挂在已有年级之下。第三层是业务关系层包括教研组、配置班级和权限管理操作对象是前面两层产出的数据。步骤操作入口前置条件关键参数增加学期配置初始化向导默认项无保持默认增加年级左下角「增加新记录」无年级名称、编号格式增加科目左下角「增加新记录」无科目名称、编码增加学期选入学年份 → 添加学期年级已建上/下学期起止时间增加班级配置向导 或 班级表管理年级已建班级编号、班级名称增加学生选中班级 → 批量增加班级已建xls 文件导入增加教研组左下角「增加新记录」教师账号已建教研组名称配置班级选中教研组 → 配置班级班级、教研组、教师就绪科任、班主任勾选权限管理用户管理中心 → 权限管理教师账号已建模块权限勾选「增加年级」「增加科目」「增加教研组」都复用左下角「增加新记录」入口格式规律参照上一条已有记录即可。容易遗漏的是「增加学期」——它和「增加学期配置」是两回事学期默认配置不用动但每个年级要单独添加上下学期的起止时间否则考试创建时年级后的学期列表是空的。2.2 学生批量导入xls 格式与表头校验脚本学生导入是九个步骤里唯一涉及外部文件的环节。文档明确了两条硬约束Excel 版本必须是 97-2003扩展名为 xls表头固定为「学生编号」「班级编号」「学生」「密码列」四列。这里有一个常见翻车点新版 Excel 或 WPS 默认保存的 xlsx 虽然能被系统弹窗识别但旧版阅卷系统的导入组件只解析 xls 的 BIFF 结构直接把文件后缀改成 .xls 没有用必须用「另存为 Excel 97-2003」重新导出。我一般会在批量导入前写一段脚本做格式预检避免一次性导入几百行后发现班级编号全部对不上import pandas as pd from pathlib import Path REQUIRED_COLUMNS [学生编号, 班级编号, 学生, 密码列] def validate_student_import(path: str, valid_class_ids: set) - list: p Path(path) errors [] if p.suffix.lower() ! .xls: errors.append(f扩展名必须是 .xls当前是 {p.suffix}) return errors try: df pd.read_excel(p, dtypestr) except Exception as exc: errors.append(f文件解析失败确认是否为 Excel 97-2003: {exc}) return errors missing [c for c in REQUIRED_COLUMNS if c not in df.columns] if missing: errors.append(f表头缺少列: {missing}) return errors empty_ids df[学生编号].isna().sum() if empty_ids: errors.append(f学生编号存在 {empty_ids} 个空值) invalid set(df[班级编号].dropna()) - valid_class_ids if invalid: errors.append(f班级编号在班级表中不存在: {invalid}) return errors脚本逻辑分四层扩展名校验、文件解析校验、必需表头校验、班级编号差集校验。dtypestr 是必须的否则以 0 开头的学号会被读成整数丢精度密码列混排字母时会变成浮点数。班级编号差集能提前暴露两类问题模板的班级编号列填了班级名称而不是编号或者班级在后台还没创建完就被拿来导入学生。2.3 教研组、科任与班主任的三层绑定配置班级这一步除了「初始化配置向导」左侧「基础数据管理」里的「班级表管理」也能建班。两种方式本质上是同一张班级表的两个视图向导适合新学年批量建班班级表管理适合学期中补建个别班级。「配置班级」的业务含义是建立教师与班级的授课关系选中教研组右侧列出该组教师选定教师后勾选班级的科任或班主任角色。系统把科任和班主任做成两类勾选说明班主任是单独建模的——班主任不一定授课但要在成绩单和家校通知里接收数据。漏配某个科目的科任后续创建考试时该科目可能不会出现在可选列表里这是初始化阶段最隐蔽的连锁反应。2.4 权限管理与初始化后的验数权限管理在「用户管理中心」下选中教师后勾选右侧选项文档给出的默认勾选是四个选项。常见做法是考试管理、扫描制作、阅卷评分、成绩查询四类模块权限但我不建议所有教师统一按默认发放。阅卷系统的权限通常是「扫描→评卷→发布」三段式扫描权限给文印室评卷权限按学科分配给任课教师成绩查询权限给班主任和年级组长不要为省事把四类权限全勾上。初始化阶段没有明确的「完成」按钮我习惯结束后做一次数据核对用 SQL 找出「有班级但没有学生」的空壳班级SELECT c.grade_year, c.class_id, c.class_name, COUNT(s.student_id) AS stu_cnt FROM class_table c LEFT JOIN student_table s ON c.class_id s.class_id GROUP BY c.grade_year, c.class_id, c.class_name HAVING stu_cnt 0;表名以实际部署库为准核对逻辑是班级表与学生表按班级编号左连接过滤出无学生班级。这类班级如果被选进考试扫描出的答题卡将无法匹配到人而且错误往往要等扫描完成后才暴露。3. 考试目录创建与扫描参数从多科考试到答题卡数字化3.1 登录入口与网络环境选择双击「心意答阅卷」快捷方式进入登录输入用户名和密码后系统要求选择使用外网还是内网。这个选项决定扫描数据的传输路径内网模式走局域网直连客户端和扫描仪在同一网段TWAIN 通信延迟低、丢包少外网模式一般用于远程访问。答题卡扫描对传输稳定性敏感文印室建议固定用内网模式避免跨公网传输大体积扫描图导致超时。3.2 创建多科考试六个参数的设置逻辑进入管理考试界面后点击「创立考试」界面文案如此语义即创建需要填写六个关键参数。参数取值示例设置要点入学年份2024决定年级下拉列表范围必须与后台初始化一致年级及学期高二 / 2024-2025-1多科可跨年级但建议同一批考生考试名称2025 期末质量检测显示在成绩单标题上建议带日期学号识别类型方块码 / 条码 / 手写必须与答题卡印刷的学号部分一致答题卡定位类型OMR 定位 / 无定位印刷制版选 OMR普通打印选无定位考试科目语文、数学、英语多选每科独立生成模板核心关系是「多科考试」和「单科考试」的容器关系多科考试只是目录容器真正的扫描和判分都在单科考试下进行。学号识别类型和答题卡定位类型必须在创建时决定因为答题卡一旦印制这两项无法修改。多个校区或班级规模差异大时考试名称建议带批次标识方便后续成绩汇总区分。3.3 单科考试与扫描参数设置多科考试创建后鼠标移到考试名称位置点击「新增」填写单科信息并确定单科考试目录即完成。进入单科科目后点「扫描制作」先设置扫描页面和纸类型页面决定扫描区域识别范围纸类型决定图像处理参数主流是 A3 双面部分小学用 A4 单面。设置完把答题卡放进扫描仪点「扫描试卷」弹出扫描仪属性框后选择扫描参数点「扫描」开始扫描完成后点「关闭」返回。这里的扫描仪属性框走的是 TWAIN 协议系统通过驱动主动获取纸张来源、色彩模式、分辨率。通用起点是 300dpi、灰度模式。低于 200dpi 时方块码和填涂标记的边缘锯齿明显客观题识别率下降高于 400dpi 时单张 A3 图像可能超过 15MB批量扫描会拖慢上传链路。提示300dpi 灰度是答题卡扫描的通用起点。分辨率不是越高越好A3 双面 400dpi 产生的中间文件体积增长明显对识别率没有额外收益。扫描前检查磁盘余量是最容易被忽略的环节# 一场 40 页 A3 双面 300dpi 灰度约产生 1.2~2.4GB 中间文件 df -h /var/scan_cache # 清理扫描中断残留的临时分页文件保留最近一天 find /var/scan_cache -name *.tmp -mtime 1 -delete/var/scan_cache 是常见部署的缓存路径实际以服务器配置为准。中间文件在「完成并上传」后会自动清理但扫描中断时 tmp 残留不会自己消失积累多了既占磁盘又会被误识别为答题卡页。用 mtime 清理一天前的残留文件是安全的不会误删正在处理的会话。3.4 扫描过程中的三类异常扫描异常集中在三个位置ADF 走纸器卡纸表现为图像长度异常或页面倾斜双面扫描漏页表现为页数二分之一不是整数灰度模式下铅笔填涂过浅识别时被判为未填。前两类靠扫描仪故障排除解决第三类需要在模板编辑阶段把客观题区域圈大一点并在生成 CRP 后做一张测试卡验证。4. 答题卡模板标定客观题区域、方块码学号与批阅块的坐标设计4.1 标定的边界规则宁可大一点不可出红框模板制作的第一步是标定。选中填涂客观题那一面答题卡点击「答题卡标定并制作」先点「标定」在图片上按住鼠标左键圈出客观题区域。文档给了一个具体约束圈出区域可以稍微大一点但不能超出试卷页的红框。为什么是这条规则圈大一点是为识别留容差——考生填涂的笔迹可能压在选项边缘区域太小会把有效涂痕切掉但不能超出红框因为红框是图像校正基准校正算法按红框做透视变换和畸变修正圈选越过红框后坐标映射整体偏移所有区域错位只能重新标定。我的做法是先放大到 150% 再圈选避免鼠标微操误差。注意圈选区域可以大但不能越过红框。红框是校正基准越框后修正算法失效本场考试模板只能重做。4.2 客观题编辑与「详细」复查圈定客观题区域后点「客观题编辑」进入编辑界面圈出答案区填写对应的题号范围、选项数等信息点确定。这里的「答案区」指每道题的填涂区域系统需要知道每个区域对应第几题、有几个选项扫描识别后才能逐题比照标准答案。完成答案区编辑后文档要求点上方「详细」按钮检查。这一步很多人跳过但它能显示每个区域的编号、坐标、选项数是否与卷面一致。重点核对两点一是填涂方向横排答题卡在 300dpi 下每个填涂区约 30~40 像素宽圈选时把相邻题边界框进来详细视图里能看到题号错位二是题量与卷面题量是否一致漏区会导致后面「统计及批量处理」时题目分数对不上。4.3 学号区与方块码位数一致性是命门学号区编辑在顶部工具栏或右键「新建学号区」进入填写学号信息后系统把填涂方块码映射为数字序列。这里最容易出问题的是位数一致性答题卡印刷的学号填涂位数必须与后台「学生编号」最大位数一致否则扫描识别的学号会整体左移或右移所有答题卡匹配错人。文档还提到模板制作界面要同时圈出「学号区」「考号区」「页码区」其中页码区在无定位方式下可以不用圈。无定位方式依靠学号和页码做版面判断对答题卡印刷精度要求更高但省去定位块制版成本。学校用普通打印机输出答题卡建议选无定位印刷厂制版选 OMR 定位更稳定。区域类型圈选入口关键参数遗漏后果学号区工具栏 / 右键新建学号位数、填涂方向无法识别考生考号区工具栏按钮考号位数多科成绩无法关联页码区工具栏按钮页码格式无定位模式可跳过客观题答案区客观题编辑题号、选项数无法自动判分4.4 主观题批阅块命名规范与分数设计主观题部分在模版制作界面点「批阅块」圈出批阅块区域并命名。文档提示可以在名称下方总分值处填分数「如没写亦可继续下一步」——分数也可以在后续「统计及批量处理」里统一填但我的习惯是圈完就填避免出现批阅块分数为 0 的悬空状态阅卷端拿到 0 分题块容易被误认成废题。批阅块命名直接决定阅卷界面里老师看到的题组名称常见规范是「大题号-小题号」不建议用无语义的「块1」「块2」。高分值主观题可以按得分点拆成多个批阅块阅卷老师只对得分点打分系统自动汇总省去手算总分。4.5 统计及批量处理答案录入与分数配置「统计及批量处理」是模板的集中配置界面做两件事录入客观题标准答案配置主观题分值。答案格式一般是「A B C D」或「AB CD」多选写法识别后自动比对。这里有一个常见坑题目分数和答案必须同时配全只配答案不配分数识别结果能出但成绩统计为 0只配分数不配答案客观题在阅卷端显示为未判定。4.6 CRP 文件生成、上传与刷新链路编辑完成后点「生成 CRP 文件」系统把区域坐标、答案、分数打包成 CRP 描述文件。这是这套系统自定义的模板描述格式本质是结构化序列化数据包含页面尺寸、区域坐标、答案映射和计分规则。生成后点「保存并返回」回到扫描界面此时模板还在本地未服务化点「完成并上传」提交到服务器返回编辑界面点「刷新」才能从服务器拉回最新模板信息。文档里客观题编辑完生成一次 CRP学号区编辑完又生成一次对应双面答题卡的两个面分别描述单面答题卡走一遍「生成 CRP → 保存并返回 → 完成并上传 → 刷新」即可。实际操作中我会确认两个面的 CRP 都上传成功后再点「制作完成」避免有一面漏传。一次完整模板配置可以抽象成下面的结构化描述方便理解生成与上传环节做了什么{ template_id: exam2025-math-v3, page: {size: A3, orientation: portrait, locator: omr}, student_id: {type: block_code, digits: 9, region: [120, 180, 420, 240]}, page_number: {region: [680, 140, 760, 180], required: true}, objective: [ {q_start: 1, q_end: 20, options: 4, region: [120, 340, 680, 620], answer_key: ACBDABDCABDCBDACABDCA} ], subjective: [ {name: 第21题, max_score: 12, region: [120, 660, 680, 980]} ] }坐标单位是像素region 四项分别是左上角 x、y 与右下角 x、y。answer_key 是连续字母串长度必须等于客观题总题数这是「统计及批量处理」录入答案后最常出现的校验项——长度不匹配系统会警告但有时会被忽略导致后续判分错位。5. 制作完成前的五步自检把模板错误挡在扫描之前5.1 自检清单「统计及批量处理」里的「制作完成」按钮把模板状态从编辑改为已完成。这个操作并非不可逆但重新生成 CRP 再走一遍上传链路的成本不低我习惯在点下去之前按固定顺序过五步客观题答案长度等于题量且没有用中文逗号或空格粘连。「统计及批量处理」里批阅块总分值之和等于试卷满分。学号区位数等于后台学生编号最大位数差一位都会整体错位。圈选区域全部在红框内放大检查客观题区域和学号区边界。模板页方向与扫描纸张方向一致A3 纵向答题卡翻转 180 度后定位必失败。5.2 模板上传失败时的定位手段生成 CRP 并上传后如果刷新列表里看不到最新模板先看服务端日志里的上传接口返回再完整走一遍「保存并返回 → 完成并上传 → 刷新」# 服务端模板上传日志关键字路径按实际部署调整 tail -f /var/log/marking/template_upload.log | grep -i crp日志里出现 template_version 冲突或 region 越界警告说明本地模板坐标超出服务端预设页面范围需要回标定界面重新圈选。这类问题越早暴露越好等扫描几百张答题卡后才发现定位失败所有图像都要作废重扫。5.3 保留一张测试卡做冒烟验证每场考试正式扫描前用同一批次打印的空白答题卡手填一份标准样本走一遍「扫描 → 识别 → 判分」冒烟流程。这张测试卡能同时验证学号位数映射、客观题答案判定、批阅块分数是否落到预期题号。测试卡通过后再批量扫描正式答题卡比出错后返工更省时间。我每次换答题卡印刷批次都会重新做一张测试卡因为纸张克数和印刷色差会影响灰度识别阈值上一批能过的模板这一批未必能过。本文还有配套的精品资源点击获取