完成批次 L-R:限流移除/白名单驱动/打印增强/全屏/表格对齐/主题变量/滚动闪烁修复
- 移除登录失败限流;fix-config.php 修正 e2e 串味的 127.0.0.1 连接 - 白名单驱动缺/待考名单(DataService + SurveyKingClient::getWhitelist,复用已取 survey) - 打印成绩明细增强(范围/合格列默认关/去页脚);看板全屏占满;表格 vertical-align:middle;隐藏登陆账号;导入默认追加 - 主题变量收口(:root 新增 brand/primary-2/ok-2 等,替换硬编码渐变);删死规则 - 表头/数据列对齐修复(index 未匹配表、dashboard 成员榜、draw 结果/历史/排除表);看板占位卡片配色一致 - 修复滚动闪烁:row-drop-in 动画经 _dropAnim 门控,仅强制重绘时播放 - 测试:新增 test-whitelist.js;run-all.sh 全绿 132
This commit is contained in:
+16
-27
@@ -110,9 +110,23 @@ class Roster
|
||||
'login' => trim((string)($s['login'] ?? '')),
|
||||
];
|
||||
}
|
||||
// 按学号去重(同 sid 取最后一条):roster 表 sid 为主键,重复 sid 会触发约束冲突导致整批回滚。
|
||||
// 去重避免「保存成功但名单实际没变」的静默丢失。
|
||||
$bySid = [];
|
||||
$noSid = [];
|
||||
foreach ($clean as $s) {
|
||||
if ((string)($s['sid'] ?? '') !== '') {
|
||||
$bySid[$s['sid']] = $s;
|
||||
} else {
|
||||
$noSid[] = $s;
|
||||
}
|
||||
}
|
||||
$clean = array_values($bySid);
|
||||
foreach ($noSid as $s) {
|
||||
$clean[] = $s;
|
||||
}
|
||||
if (self::useDb()) {
|
||||
Db::rosterReplace($clean);
|
||||
return true;
|
||||
return Db::rosterReplace($clean);
|
||||
}
|
||||
return ny_write_json(self::file(), [
|
||||
'students' => $clean,
|
||||
@@ -157,31 +171,6 @@ class Roster
|
||||
return $mt . ':' . $sz . ':' . $hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* 首次使用时,若名单为空且存在 导入模板.xlsx,自动导入
|
||||
*/
|
||||
public static function ensureSeeded(): bool
|
||||
{
|
||||
if (self::count() > 0) {
|
||||
return false;
|
||||
}
|
||||
$candidates = [
|
||||
dirname(NY_ROOT) . '/导入模板.xlsx',
|
||||
NY_ROOT . '/导入模板.xlsx',
|
||||
NY_DATA . '/导入模板.xlsx',
|
||||
];
|
||||
foreach ($candidates as $f) {
|
||||
if (is_file($f)) {
|
||||
try {
|
||||
$res = self::importFile($f, 'xlsx');
|
||||
return $res['count'] > 0;
|
||||
} catch (Throwable $e) {
|
||||
// 忽略
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析上传文件 -> 学生数组
|
||||
|
||||
Reference in New Issue
Block a user