fix: 修复保存满分后清登录;配置双写;设置显示账号/密码;抽取比例改按人数加权
- 修复:仅当连接信息(base_url/api_prefix/username/password/verify_ssl)真变化时才清 token + 重连; 保存满分/布局等不应触发登录卷王(bug:之前一律 unlink token.json,导致保存后所有用户都被踢) - 修复:默认满分不再误写当前卷;改为显式 apply_pid + apply_score 才会改 full_scores - 配置双写(DB+文件):避免 DB 不可用时静默回退到出厂默认 admin/123456; ny_save_config 同时写文件+DB;ny_load_config 在 DB 可用但无记录时从文件自动迁回 - 设置弹窗新增:登录账号可编辑、密码 type=password 不回显、留空表示不修改; 保存后根据 ping 自动给出成功/失败反馈(错误密码不再静默) - 抽取比例改为按组人数加权(默认)+ 各组均分 + 自定义比例 + 不分组,最大余额法守恒分配 - 抽出比例 UI:删除 5:5 复选框、改 #balanceMode 下拉 + 按组渲染比例输入框 - Db::lastError() 暴露 DB 错误用于诊断(config_get 返回 db_driver / db_connected / db_error) - e2e:test-draw-alloc 18→29 测试用例(加权/自定义/守恒 fuzz); 新增 test-config-save e2e 27 用例全过(连接信息变化检测 + 自动 ping + 密码不回显 + apply_pid) - mock-server:账户校验从 'admin' 改为 'mock' 接受 e2e 账号
This commit is contained in:
+30
-2
@@ -132,8 +132,19 @@ function ny_config_file(): string
|
||||
return NY_DATA . '/config.json';
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置来源:db | file | default
|
||||
* (default 表示既没读到 DB 也没读到文件——此时账号密码是出厂默认值,几乎必然连不上卷王)
|
||||
*/
|
||||
function ny_config_source(): string
|
||||
{
|
||||
return (string)($GLOBALS['__ny_cfg_source'] ?? 'default');
|
||||
}
|
||||
|
||||
function ny_load_config(): array
|
||||
{
|
||||
$GLOBALS['__ny_cfg_source'] = 'default';
|
||||
|
||||
// 数据库已初始化且能连上 → 从 DB 读,否则回退文件
|
||||
$dbCfg = ny_db_config();
|
||||
if ($dbCfg !== null) {
|
||||
@@ -145,6 +156,7 @@ function ny_load_config(): array
|
||||
}
|
||||
$cfg['base_url'] = rtrim(trim((string)$cfg['base_url']), '/');
|
||||
$cfg['api_prefix'] = '/' . trim((string)$cfg['api_prefix'], '/');
|
||||
$GLOBALS['__ny_cfg_source'] = 'db';
|
||||
return $cfg;
|
||||
}
|
||||
|
||||
@@ -156,6 +168,16 @@ function ny_load_config(): array
|
||||
$cfg[$k] = is_bool($v) ? (bool)$saved[$k] : $saved[$k];
|
||||
}
|
||||
}
|
||||
$GLOBALS['__ny_cfg_source'] = 'file';
|
||||
// DB 已连上但库里没有配置,而文件里有 —— 迁移一份到 DB,避免两端不一致
|
||||
if (class_exists('Db') && Db::pdo() !== null && empty($GLOBALS['__ny_cfg_migrated'])) {
|
||||
$GLOBALS['__ny_cfg_migrated'] = true;
|
||||
try {
|
||||
Db::settingsSet('config', json_encode($cfg, JSON_UNESCAPED_UNICODE));
|
||||
} catch (Throwable $e) {
|
||||
// 迁移失败不影响本次使用
|
||||
}
|
||||
}
|
||||
}
|
||||
$cfg['base_url'] = rtrim(trim((string)$cfg['base_url']), '/');
|
||||
$cfg['api_prefix'] = '/' . trim((string)$cfg['api_prefix'], '/');
|
||||
@@ -164,19 +186,25 @@ function ny_load_config(): array
|
||||
|
||||
function ny_save_config(array $cfg): bool
|
||||
{
|
||||
// 数据库已连接则写入 DB settings(键 config = JSON),否则回退文件
|
||||
// 先写文件快照:DB 万一不可用(连不上 / 未初始化)时不会静默回退到出厂默认配置
|
||||
$fileOk = ny_write_json(ny_config_file(), $cfg);
|
||||
|
||||
if (class_exists('Db')) {
|
||||
$db = Db::pdo();
|
||||
if ($db !== null) {
|
||||
try {
|
||||
Db::settingsSet('config', json_encode($cfg, JSON_UNESCAPED_UNICODE));
|
||||
$GLOBALS['__ny_cfg_source'] = 'db';
|
||||
return true;
|
||||
} catch (Throwable $e) {
|
||||
// 落库失败则回退文件
|
||||
$GLOBALS['__ny_cfg_source'] = 'file';
|
||||
return $fileOk;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ny_write_json(ny_config_file(), $cfg);
|
||||
$GLOBALS['__ny_cfg_source'] = 'file';
|
||||
return $fileOk;
|
||||
}
|
||||
|
||||
/** 数据库初始化后从 DB 读取配置(无则返回 null) */
|
||||
|
||||
Reference in New Issue
Block a user