refactor: 取消 install.php 安装向导 + 下线 pgsql/mysql 支持 + 班级看板独立
- 删除 install.php:所有入口(index/dashboard/draw/login/api)不再跳安装,
未登录统一跳 login.php;连接信息变更在【设置】里直接修改 data/config.json
- 下线 pgsql/mysql:
* bootstrap.php 简化为单文件存储路径(ny_load_config/ny_save_config 直接读写 data/config.json),
删除 ny_db_config、配置迁移、配置双写分支
* lib/Db.php 改为纯 stub:pdo() 恒返回 null,避免上层误连;migrate/ensureRosterLogin 等为 no-op
* Roster.php 经 useDb 永远 false,自动走 roster.json
* api.php 不再返回 db_driver/db_connected/db_error 诊断
- 班级看板独立(dashboard.php 重写):
* 删除"← 返回总览"按钮 + 整体概况 #overview 区
* 进入即展示单班看板:6 张汇总卡 + 分组对比/成员榜
* 顶部 hero 区动态显示当前班级名 + 问卷名
* 工具栏新增 #classSel 班级选择器(切换班级不离开本页)
* URL 支持 ?pid=&class=&auto=1|0 分享与刷新恢复
* 下拉班级选项随数据动态刷新;保留自动刷新 + 全屏 + 缓存
- e2e 测试(test-config-save)加固 cleanup 钩子:
* 统一 cleanup() 函数接管所有退出路径
* 解决之前 e2e 留 residue 把 data/config.json 改成 mock 地址的问题(导致本机登录失败)
- php -l 全文件通过;node --check 内嵌 JS 通过;e2e test-config-save 27/27 + test-draw-alloc 29/29 全过
This commit is contained in:
+3
-66
@@ -80,17 +80,13 @@ function ny_logout(): void
|
||||
session_destroy();
|
||||
}
|
||||
|
||||
/** 判断是否已安装(有过连接配置且能流转):文件 config 或 DB settings 存在 base_url 且账号非空 */
|
||||
/** 判断是否已安装(只看文件 config:base_url 非空即视为已具备连接配置) */
|
||||
function ny_is_installed(): bool
|
||||
{
|
||||
$cfg = ny_load_config();
|
||||
if (trim((string)($cfg['base_url'] ?? '')) === '') {
|
||||
return false;
|
||||
}
|
||||
// 有无可用的后端(文件 config 存在 ,或 DB 连得上)
|
||||
if (class_exists('Db') && Db::isConnected()) {
|
||||
return true;
|
||||
}
|
||||
return is_file(ny_config_file());
|
||||
}
|
||||
|
||||
@@ -145,21 +141,7 @@ function ny_load_config(): array
|
||||
{
|
||||
$GLOBALS['__ny_cfg_source'] = 'default';
|
||||
|
||||
// 数据库已初始化且能连上 → 从 DB 读,否则回退文件
|
||||
$dbCfg = ny_db_config();
|
||||
if ($dbCfg !== null) {
|
||||
$cfg = ny_default_config();
|
||||
foreach ($cfg as $k => $v) {
|
||||
if (array_key_exists($k, $dbCfg)) {
|
||||
$cfg[$k] = is_bool($v) ? (bool)$dbCfg[$k] : $dbCfg[$k];
|
||||
}
|
||||
}
|
||||
$cfg['base_url'] = rtrim(trim((string)$cfg['base_url']), '/');
|
||||
$cfg['api_prefix'] = '/' . trim((string)$cfg['api_prefix'], '/');
|
||||
$GLOBALS['__ny_cfg_source'] = 'db';
|
||||
return $cfg;
|
||||
}
|
||||
|
||||
// 默认配置 + 文件覆盖(DB 后端本批次已下线,统一走文件存储)
|
||||
$cfg = ny_default_config();
|
||||
$saved = ny_read_json(ny_config_file(), null);
|
||||
if (is_array($saved)) {
|
||||
@@ -169,15 +151,6 @@ function ny_load_config(): array
|
||||
}
|
||||
}
|
||||
$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'], '/');
|
||||
@@ -186,44 +159,8 @@ function ny_load_config(): array
|
||||
|
||||
function ny_save_config(array $cfg): bool
|
||||
{
|
||||
// 先写文件快照: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;
|
||||
}
|
||||
}
|
||||
}
|
||||
$GLOBALS['__ny_cfg_source'] = 'file';
|
||||
return $fileOk;
|
||||
}
|
||||
|
||||
/** 数据库初始化后从 DB 读取配置(无则返回 null) */
|
||||
function ny_db_config(): ?array
|
||||
{
|
||||
if (!class_exists('Db')) {
|
||||
return null;
|
||||
}
|
||||
$db = Db::pdo();
|
||||
if ($db === null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
$raw = (string)(Db::settingsAll()['config'] ?? '');
|
||||
} catch (Throwable $e) {
|
||||
return null;
|
||||
}
|
||||
$data = json_decode($raw, true);
|
||||
return is_array($data) ? $data : null;
|
||||
return ny_write_json(ny_config_file(), $cfg);
|
||||
}
|
||||
|
||||
/** 安全的字符串化(避免数组/对象转字符串报错) */
|
||||
|
||||
Reference in New Issue
Block a user