feat: 导出按班级/组别筛选 + 随机抽取页 + 零依赖 XLSX 导出
导出跟随分类筛选 - api.php export / export_absent 新增 cls、grp 参数,按当前筛选过滤 rows - 缺考口径与页面完全一致:筛选后名单 − 筛选后已提交(按学号匹配) - 导出文件名附带班级 / 组别(如 成绩明细_高一数学月考_高一(1)班_A组_时间戳.csv) - app.js 两个导出按钮追加 cls/grp 参数并提示导出范围 随机抽取页 draw.php - 来源:学号名单 / 某试卷已提交人员;支持班级、组别筛选与抽取人数设置 - 「排除已抽中」累计去重,抽取结果存入 localStorage,刷新后仍可下载 - 抽取动画(滚动定格),结果表格含序号 / 学号 / 姓名 / 班级 / 组别 - 下载「白名单导入模板.xlsx」「白名单列表.xlsx」:两列 姓名 / 登陆账号 XLSX 导出能力 - 新增 lib/XlsxWriter.php:零依赖生成 xlsx,有 zip 扩展走 ZipArchive, 无则回退手写 ZIP(stored);单元格按共享字符串 + 文本格式(numFmtId=49) 写入,长学号不会变科学计数法 - 新增 api.php action=draw_export,输出与「白名单列表.xlsx」模板一致的结构 其他 - index.php 顶栏新增「随机抽取」入口;支持 index.php#roster 直接打开名单管理 - tools/test-xlsxwriter.php 自测:18 项全通过(含无 ZipArchive 的手写打包路径)
This commit is contained in:
@@ -585,3 +585,36 @@ body.dash.fs-on .group-compare { gap: 12px; }
|
||||
body.dash.fs-on .gpanel { padding: 12px 14px; }
|
||||
body.dash.fs-on .member-list { max-height: 30vh; }
|
||||
|
||||
|
||||
/* ================= 随机抽取页 ================= */
|
||||
.panel-head .actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
|
||||
|
||||
/* 抽取人数输入框:在 toolbar 内联按钮组中收窄 */
|
||||
.field .inline input[type=number] { width: 78px; flex: none; }
|
||||
|
||||
.draw-stage {
|
||||
margin: 18px; padding: 26px 18px;
|
||||
border: 1px dashed var(--border); border-radius: var(--radius);
|
||||
background: linear-gradient(180deg, #fbfcff, #f6f8ff);
|
||||
text-align: center; font-size: 20px; font-weight: 700;
|
||||
color: var(--text-3); letter-spacing: 1px;
|
||||
min-height: 86px; display: flex; align-items: center; justify-content: center;
|
||||
transition: color .2s ease, background .2s ease;
|
||||
}
|
||||
.draw-stage.rolling {
|
||||
color: var(--primary);
|
||||
background: linear-gradient(180deg, #f2f6ff, #eaf0ff);
|
||||
animation: drawShake .12s infinite alternate;
|
||||
}
|
||||
.draw-stage.done {
|
||||
color: var(--ok);
|
||||
background: linear-gradient(180deg, #f2fbf5, #e9f7ee);
|
||||
font-size: 26px;
|
||||
}
|
||||
@keyframes drawShake {
|
||||
from { transform: translateY(-1px) scale(.995); }
|
||||
to { transform: translateY(1px) scale(1.005); }
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.draw-stage.rolling { animation: none; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user