Files
ny-exam-platform/docs/guide/install.md
T
nxxy335 25a2e8a42c 文档部署到 /ny-exam-platform 子路径 + 移除快照/趋势/异常 + 打印与 UI 全面完善
文档站(#88)
- base 默认改为 /ny-exam-platform/,可用 DOCS_BASE=/ 覆盖本地预览
- 新增 DOCS_OUT 环境变量,避免构建时清空输出目录失败导致产物半截
- 新增 tools/docs-preview.js:按子路径重写路由的本地预览服务
- 删除 docs/guide/snapshot.md,同步清理全部相关文档

移除存快照 / 趋势 / 异常(#89)
- 后端:删除 api.php 的 snapshot_save/list/delete/trend 四个 action 与
  $WRITE_ACTIONS 中的同名条目;删除 lib/Snapshot.php 与自动加载注册;
  DataService 移除 detectAnomalies() 及其调用
- 前端:移除三个按钮与三个弹窗、相关 JS 处理与 state 字段
- 测试:移除对应用例,补充 5 条名单导入列识别断言(17+9+18+32+29+11 全过)

打印完善(#90)
- 改用隐藏 iframe 输出,规避弹窗拦截;@page A4 支持纵向/横向
- 表头每页重复、行内不跨页断开、全表连续名次、可选「是否合格」列
- 分组小计(人数/平均/最高/最低/合格人数与合格率)、可附缺考名单另起一页
- 末尾签字栏;缺考名单打印改为同一套输出

UI / 交互 / Bug 修复(#91)
- dashboard.php:补「← 主系统 / 退出」入口(此前全屏后无法离开);
  修复成员下钻 onclick 里 JSON.stringify 双引号提前闭合属性导致点击报错,
  改为 data-sid 事件委托;补 Esc 关弹窗;后台标签页暂停轮询、切回自动补拉;
  刷新中断原因写入 title;数值字段统一兜底,避免 NaN / undefined%
- draw.php / draw.js:结果表新增「登陆账号」列(导出前可核对,缺失显示 学号 ⚠);
  弹窗只关最上层且支持 Esc;「全部」改为跟随候选池,手工改人数即解除;
  候选池不足时给出明确提示;自定义比例框隐藏时清空,避免旧权重被误读
- app.js / dashboard.php:成绩着色改为按「占本卷满分的百分比」判断,
  修复满分不是 100 时整列误标红
- style.css:数值列右对齐;新增 subbar、draw-stage-sub;
  看板顶栏窄屏下拉与按钮换行,消除横向滚动
2026-09-11 16:23:08 +08:00

133 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 环境要求与部署
## 环境要求
| 项目 | 要求 | 说明 |
| --- | --- | --- |
| PHP | ≥ 8.0 | 推荐 8.1+ |
| `curl` | 必需 | 调用卷王 API |
| `json` / `mbstring` | 必需 | 数据编解码、中文处理 |
| `openssl` | 推荐 | 登录时对密码做 RSA 加密;缺失时降级为明文提交 |
| `zip` | 可选 | 缺失时用内置解析器读取 xlsx(写入 xlsx 内置实现无需此扩展) |
| `pdo_sqlite` | 推荐 | 启用 SQLite 存储;缺失时自动降级为 JSON 文件存储 |
| 数据库 | 无 | 不需要 MySQL / PostgreSQL |
| Composer | 无 | 没有任何第三方依赖 |
> 用 `php -m` 可以查看已加载的扩展。
## 部署方式
### 方式一:PHP 内置服务器(体验 / 内网临时使用)
```bash
cd ny-exam-platform
php -S 0.0.0.0:8080
```
浏览器打开 <http://localhost:8080>。Windows 下也可双击 `启动平台.bat`。
::: warning 仅用于内网体验
PHP 内置服务器是单进程、无并发能力的开发服务器,**不要**用于生产。
并且它**不解析 `.htaccess`**,`data/` 目录会可被直接访问,请务必参考
[安全加固清单](../security/hardening.md)。
:::
### 方式二:Nginx + PHP-FPM(推荐生产)
假设站点根目录为 `/www/sites/sj.exam.nxxy335.top/index`,那么把仓库内容放在该目录下即可。
```nginx
server {
listen 80;
server_name sj.example.com;
root /www/sites/sj.exam.nxxy335.top/index;
index index.php index.html;
charset utf-8;
client_max_body_size 20m; # 名单文件导入上限,与后端 20MB 校验一致
# ---- 安全:禁止直接访问数据目录(nginx 不读 .htaccess,必须显式配置)----
location ^~ /data/ {
deny all;
return 404;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 不要暴露隐藏文件
location ~ /\. {
deny all;
return 404;
}
}
```
校验并重载:
```bash
nginx -t && nginx -s reload
```
### 方式三:Apache
仓库会在 `data/` 及其子目录自动生成 `.htaccess`(内容 `Deny from all`),
Apache 下 `data/` 默认即被保护。仍需确认:
- 虚拟主机 `AllowOverride` 不为 `None`(否则 `.htaccess` 被忽略);
- `mod_rewrite` 若启用,确认没有规则把 `/data/` 放行。
### 方式四:宝塔面板
1. 新建站点 → 根目录指向仓库目录;
2. PHP 版本选 8.0+,安装 `fileinfo`、`opcache`(可选);
3. 站点 → 配置文件,在 `server {}` 内加入上面的 `location ^~ /data/` 段;
4. 站点 → 目录权限,确保 `data/` 可写(运行用户通常为 `www`);
5. 若使用反向代理,确认 `/api.php` 的 `action` 参数未被缓存。
## 目录权限
| 路径 | 需要 | 说明 |
| --- | --- | --- |
| `data/` | 可写 | 配置、名单、令牌的根目录 |
| `data/ny.db` | 可写 | SQLite 主库(启用 `pdo_sqlite` 时) |
| `data/uploads/` | 可写 | 导入名单时的临时落盘,解析后立即删除 |
| `data/cache/` | 可写 | 卷王令牌缓存、结果缓存 |
```bash
chown -R www:www data
chmod -R 755 data
```
Windows 下给 `IIS_IUSRS` 或站点应用程序池身份赋予 `data` 的「修改」权限。
## 升级
仓库是纯文件部署,升级即覆盖文件:
```bash
git pull
```
覆盖后 `data/` 保留(其中存放配置与名单,并且在 `.gitignore` 中),
程序会在首次访问时自动完成目录初始化与数据迁移。
::: tip 关于 SQLite 迁移
首次在有 `pdo_sqlite` 的环境运行时,`data/config.json` 与 `data/roster.json`
会被自动迁移进 `data/ny.db`,之后以数据库为准,文件作为备份继续双写。
迁移是幂等的,重复执行不会覆盖已入库的数据。
:::
## 下一步
- [快速上手](./quickstart.md)
- [安全加固清单](../security/hardening.md)