docs: refresh public docs for current codebase, add SECURITY.md

- README: real counts (44 commands, 61 integration asserts, demo=25 records
  + 4 semesters + 7 attachments), add resume/assessment module features,
  env vars incl. LSKY, doc navigation table, done-roadmap items checked
- docs/api.md: /auth/logout, admin users/demo-rebuild/sync-lsky routes,
  attachment thumb/download channels, profile_upsert top-key merge
  semantics, full footprint_list query reference, 44-command table
- sync-server/README: replace stale ADMIN_TOKEN/X-Admin-Token admin section
  (actual is_admin Bearer model), add go-live checklist, backup note for WAL
- CHANGELOG: add Unreleased section (resume/assessment modules, security
  fixes, perf tuning)
- CONTRIBUTING: 61 asserts, security-sensitive-change guidance, perf baseline
  table, security issue routing
- docs/SECURITY.md: new - report channel, threat model table, hardening
  summary, known tradeoffs
- LICENSE: ensure MIT file matches README badge
This commit is contained in:
root
2026-10-17 22:27:56 +08:00
parent 88525a3f9f
commit 8cdf8b44fa
8 changed files with 207 additions and 73 deletions
+37 -23
View File
@@ -12,20 +12,22 @@
- **留痕本体** —— 自定义记录类型 + 动态表单模板;竞赛、志愿、学生工作、荣誉、证书、科研、实习皆可配;正面/负面、进行中、草稿全留痕
- **秒级检索** —— FTS5 trigram 中文全文搜索 + 多条件筛选 + 保存视图(同一查询一键复用)
- **时间线** —— 按学年/月分组的完整回顾
- **学业成绩** —— 学期 GPA/排名、课程成绩、可自定义绩点梯度(grade band)与趋势图
- **时间线** —— 按学年/月分组的完整回顾,玻璃质感粘性年份头
- **学业成绩** —— 学期 GPA/排名、课程成绩、可自定义绩点梯度(grade band)与趋势图;综测学业分直接取学期卡同源口径
- **成长量化** —— 自定义维度与指标(如志愿时长),统计总览与年度对比
- **附件佐证** —— 图片/文档上传,SHA-256 内容寻址去重
- **简历** —— 可视化编辑模板(基本信息/学业/经历区块增删排序)+ 一键导出规范排版的 Word 文档
- **综合测评** —— 五大素质自动计分(活动/竞赛/学生工作/奖惩,逐项证据画廊)、中文 FTS 三角分词检索佐证、可编辑评分细则与手动修正、学年九格信息表、导出带页码页脚与附件矩阵附录的 Word 档案
- **附件佐证** —— 图片/文档/PDF 上传,SHA-256 内容寻址去重,客户端缩略图 + 灯箱预览,docx/xlsx 在线预览(已 HTML 加固)
- **多用户云优先** —— 所有数据存服务器,按用户独立 SQLite 档案库;浏览器 / PWA / Windows 桌面三端同源同步
- **管理后台** —— 邀请码全生命周期管理(自定义码、备注、启用/停用、删除、批量生成)、用户列表、注册配额
- **演示模式** —— 内置演示账号 `demo / demo1234`,自动播种 16 条足迹 + 4 学期成绩,开箱即看
- **管理后台** —— 邀请码全生命周期管理(自定义码、备注、启用/停用、删除、批量生成)、用户列表、注册配额、账号删除级联清理(图床/档案库/附件/会话)
- **演示模式** —— 内置演示账号 `demo / demo1234`,自动播种 25 条足迹 + 4 学期成绩 + 7 份佐证附件,开箱即看
- **PWA + 桌面** —— 可安装到桌面/手机;Windows Tauri 安装包;亮/暗双主题
## 架构
```
浏览器 PWA ─┐
Windows 桌面 ─┤ HTTPS + Bearer Token(365 天)
Windows 桌面 ─┤ HTTPS + Bearer Token(365 天,可服务端吊销)
移动端 PWA ─┘
│
▼
@@ -33,17 +35,19 @@
│ sync-server(零依赖 Node ≥ 22.5)│
│ node:http + node:sqlite │
│ scrypt 认证 · 邀请码 · LWW 同步 │
│ 登录限速 · 会话吊销 · 附件加固 │
└───────────────┬────────────────┘
▼
data/users/<uid>.db 每用户独立 SQLite 档案库
data/blobs/<uid>/ 内容寻址附件存储
data/users/<uid>.db 每用户独立 SQLite 档案库(WAL + 索引齐全)
data/attachments/ 按用户隔离的内容寻址附件
```
设计取向:
- **服务器零 npm 依赖**:仅用 Node 内置模块(`node:http` / `node:sqlite` / `node:crypto`),攻击面与供应链风险极小
- **命令层同源**:Web、桌面、数据播种共用同一份 `app/server/db.mjs` 命令层,同一业务逻辑多处不漂移
- **命令层同源**:Web、桌面、数据播种共用同一份 `app/server/db.mjs` 命令层(44 个命令),同一业务逻辑多处不漂移
- **同步元数据内建**:所有表带 uuid/hlc/origin 列 + oplog,为多端增量同步而生
- **性能基线**(3000 条记录实测):列表/时间线 ≤23ms、单条写 ≈0.3ms(WAL + synchronous=NORMAL + 8MB 页缓存)
## 快速开始(Docker 部署)
@@ -69,12 +73,13 @@ footprints.example.com {
```
> compose 默认加入名为 `mynet` 的外部网络;没有就先 `docker network create mynet`,或把 compose 里的 networks 段改成你自己的。
> 详细部署与拓扑说明见 [`sync-server/README.md`](sync-server/README.md)。
首次使用:
1. 打开站点 → 注册 —— **第一个注册的账号自动成为管理员**
1. 打开站点 → 注册 —— **第一个注册的账号自动成为管理员**(内置 demo 账号不占管理员席位)
2. 管理员登录 → 侧边栏「管理」→ 新建/批量生成邀请码,发给需要注册的用户
3. 人齐之后建议收紧注册:compose 里 `REGISTER_ENABLED=false`(或改掉 `INVITE_CODE` 默认值)再 `up -d`
3. 人齐之后建议收紧注册:compose 里 `REGISTER_ENABLED=false`,并把 `INVITE_CODE` 从示例默认值 `please-change-me` 换成强随机值或留空(改用管理页动态码)
4. 想先看看界面?用演示账号 **demo / demo1234** 登录,数据管够
## 本地开发
@@ -99,29 +104,32 @@ pnpm -C app install && pnpm -C app tauri build
```bash
node scripts/check.mjs # 语法 + 类型 + 构建 + 关键标记 tripwire
node scripts/test-integration.mjs # 35 条集成断言(播种/登录/邀请码全矩阵/角色规则/幂等)
node scripts/test-integration.mjs # 61 条集成断言(播种/登录/邀请码全矩阵/角色规则/幂等/级联删除)
node scripts/smoke.mjs <url> <user> <pass> # 部署后冒烟
git config core.hooksPath .githooks # 启用 pre-push 钩子:工作区不干净或测试红,push 直接拒绝
```
## 项目结构
```
├─ app/ # 前端 + 桌面端
│ ├─ src/ # React 19 + Vite + Tailwind v4 UI(三端共用)
│ ├─ public/ # PWA:sw.js v3(接口绝不缓存)/ manifest / icons
│ ├─ server/ # ★ 命令层 db.mjs:零依赖数据层(37 个命令)
│ │ ├─ pages/ # 时间线/记录/成绩/统计/类型/字典/个人信息/简历/综合测评/管理
│ │ ├─ lib/zongce.ts # 综测计分引擎(五大素质聚合 + 学业口径对齐)
│ │ └─ styles/theme.css # 亮/暗主题令牌 + MHTML Word 导出样式基座
│ ├─ public/ # PWA:sw.js(接口绝不缓存)/ manifest / icons
│ ├─ server/ # ★ 命令层 db.mjs:零依赖数据层(44 个命令)
│ ├─ schema.sql # 数据库 schema(Rust 与 Node 共用)
│ └─ src-tauri/ # Tauri 2 桌面壳
├─ sync-server/ # 自建同步服务器
│ ├─ src/ # index/auth/db/sync/attachments(零依赖)
│ ├─ www/ # 构建产物(部署时以卷挂载,git pull 即更新)
│ └─ docker-compose.caddy.yml
├─ docs/ # api.md(HTTP API)· DESIGN.md(设计底稿)· examples/
├─ docs/ # api.md · DESIGN.md · SECURITY.md · zongce-rules(测评细则示例)
├─ scripts/ # check / test-integration / smoke
├─ tools/ # pnpm.cjs + 图标生成器
├─ .gitea/ # Issue/PR 模板
├─ .githooks/ # pre-push 质量门禁(check + 35 条集成断言)
├─ .githooks/ # pre-push 质量门禁(check + 61 条集成断言)
└─ .editorconfig
```
@@ -131,20 +139,26 @@ git config core.hooksPath .githooks # 启用 pre-push 钩子:工作区不干
|---|---|---|
| `PORT` | `8788` | 监听端口 |
| `DATA_DIR` | `./data` | 数据目录(用户库/附件/同步账本) |
| `REGISTER_ENABLED` | `true` | 是否开放注册 |
| `INVITE_CODE` | 空 | 静态兜底邀请码(动态码由管理员在管理页生成) |
| `REGISTER_ENABLED` | `true` | 是否开放注册(注册完毕后建议关闭) |
| `INVITE_CODE` | 空 | 静态兜底邀请码(动态码由管理员在管理页生成;**务必改默认值**) |
| `MAX_USERS` | `0` | 用户数上限,0 = 不限 |
| `WWW_DIR` | `../www` | 前端静态目录 |
| `LSKY_API` / `LSKY_TOKEN` | 空 | 可选:附件自动迁入自建图床(Lsky Pro) |
## 文档
- [HTTP API 参考](docs/api.md)
- [设计方案(v0.5 底稿)](docs/DESIGN.md) —— 项目的原始设计思想;现产品已演进为云优先多用户架构
| 文档 | 内容 |
|---|---|
| [HTTP API 参考](docs/api.md) | 全部 HTTP 端点与 44 个业务命令 |
| [安全模型](docs/SECURITY.md) | 威胁模型、已加固项、漏洞报告渠道 |
| [设计方案(v0.5 底稿)](docs/DESIGN.md) | 项目的原始设计思想;现产品已演进为云优先多用户架构 |
| [综合测评细则示例](docs/zongce-rules-2026-2027.md) | 「评分细则参考」默认值的来源(纯文本,可自行修改) |
## Roadmap
- [ ] 附件缩略图 / 上传前压缩 / 大文件分片
- [ ] 评奖评优材料包一键导出
- [ ] 大文件分片上传
- [x] 附件缩略图 / 上传前压缩(客户端 canvas 生成 480px WebP)
- [x] 评奖评优材料包一键导出(简历 / 综测 Word 档案)
- [ ] 对象存储(S3)适配
- [ ] 端到端加密存储
- [ ] 移动端体验优化(手势、离线编辑队列)