feat: 接入PostgreSQL/MariaDB + 首次安装向导 + 登录页独立 + 设置重构 + 文件夹识别兜底
- 数据库层 lib/Db.php:统一 PDO 支持 pgsql/mysql/sqlite,连接参数存 data/db.json (git-ignored),migrate 建 ny_settings/ny_roster 表(三方言兼容 upsert) - 配置/名单读写:bootstrap ny_load_config/ny_save_config 与 Roster 均改为 '数据库可用则走 DB、否则回退 data/config.json/roster.json' 的文件降级模式 - 首次安装向导 install.php:选择存储后端(文件/PostgreSQL/MariaDB),测试连接+ 建表+写入卷王连接信息与默认满分;支持 ?force=1 重新配置 - 登录门分离:新增 login.php 独立登录页(仅需密码,账号预填)+logout.php+ 会话(ny_session_start/ny_is_auth/ny_login/ny_logout);index/dashboard 未安装 跳 install、未登录跳 login;api.php 加会话保护与 auth_check - 设置重构:删除卷王系统地址/接口前缀/登录账号/登录密码(连接信息由安装向导 配置);新增布局配置(默认/成绩明细与缺考名单同行)与各试卷独立满分列表(默认 分数作用于全部);工具栏布局下拉移除 - 文件夹识别兜底:app.js/dashboard.php 双策略 — mode 含 folder 优先,缺省时用 parent_id 引用反推(应对部分版本无 mode 字段);空文件夹自动隐藏 验证:php -l 全部通过、node --check app.js 通过;SQLite 等价实测 Db 层 (migrate/config upsert/Roster 读写/ny_load_config)与会话辅助函数全部PASS; e2e(内置服务器)验证路由:未装→install、装完→login、index/dashboard 未登录 跳转、api 401 保护、?force=1 重配、logout 302 均正确。本机无真实 pgsql/mysql 服务器,DB 连接按部署环境实测。
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
/**
|
||||
* 独立登录页:连接信息(系统地址/接口前缀/账号)已在安装向导配置,
|
||||
* 本页仅需输入密码(账号可改)完成卷王登录,成功后进入主系统。
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
require __DIR__ . '/bootstrap.php';
|
||||
|
||||
if (ny_is_auth()) {
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
if (!ny_is_installed()) {
|
||||
header('Location: install.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
$cfg = ny_load_config();
|
||||
$err = '';
|
||||
$ok = false;
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$user = trim((string)($_POST['username'] ?? $cfg['username']));
|
||||
$pwd = (string)($_POST['password'] ?? '');
|
||||
// 允许用户在本页调整账号;密码必须输入
|
||||
if ($user === '' || $pwd === '') {
|
||||
$err = '请输入账号与密码。';
|
||||
} else {
|
||||
// 用当前配置的连接信息 + 本页输入的账密做一次卷王登录
|
||||
$test = $cfg;
|
||||
$test['username'] = $user;
|
||||
$test['password'] = $pwd;
|
||||
try {
|
||||
$client = new SurveyKingClient($test);
|
||||
$client->getToken(true);
|
||||
// 登录成功:把账号写回配置(如需),并建立会话
|
||||
$cfg['username'] = $user;
|
||||
ny_save_config($cfg);
|
||||
ny_login();
|
||||
$ok = true;
|
||||
} catch (Throwable $e) {
|
||||
$err = '登录失败:' . $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>登录 · <?= htmlspecialchars(NY_APP_NAME) ?></title>
|
||||
<link rel="stylesheet" href="assets/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="login-gate<?= $ok ? ' hidden' : '' ?>">
|
||||
<div class="login-box">
|
||||
<div class="login-brand">
|
||||
<span class="logo">NY</span>
|
||||
<div class="brand-text">
|
||||
<strong><?= htmlspecialchars(NY_APP_NAME) ?></strong>
|
||||
<small>实时数据统计</small>
|
||||
</div>
|
||||
</div>
|
||||
<p class="login-tip">系统连接信息已配置(<?= htmlspecialchars(parse_url($cfg['base_url'], PHP_URL_HOST)) ?>/<?= htmlspecialchars(trim($cfg['api_prefix'], '/')) ?>)。请输入账号密码完成登录。</p>
|
||||
|
||||
<?php if ($err !== ''): ?>
|
||||
<div class="alert" style="white-space:pre-wrap"><?= htmlspecialchars($err) ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<form method="post">
|
||||
<div class="fi"><label>账号</label><input type="text" name="username" value="<?= htmlspecialchars($cfg['username']) ?>" autocomplete="username"></div>
|
||||
<div class="fi"><label>密码</label><input type="password" name="password" placeholder="请输入密码" autocomplete="current-password" autofocus></div>
|
||||
<div class="login-actions">
|
||||
<button class="btn btn-primary" type="submit">登录</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="forgot"><span style="font-size:12px;color:var(--text-3)">如系统连接信息已变更,请先完成<a href="install.php?force=1" style="color:var(--primary)">重新安装/配置</a></span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($ok): ?>
|
||||
<div class="login-gate">
|
||||
<div class="login-box" style="text-align:center">
|
||||
<div class="login-brand" style="justify-content:center"><span class="logo">NY</span>
|
||||
<div class="brand-text"><strong>登录成功</strong><small>正在进入数据平台…</small></div>
|
||||
</div>
|
||||
<script>setTimeout(function(){ location.href='index.php'; }, 600);</script>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user