Files
new-api-key-usage/docs/design/骨架搭建指南.md
T
skycurtain 867bb7d566 docs: 命令登记与 SK_KEY_ENCRYPTION_SECRET 命名对齐
AGENTS 命令表、会话留档约定;骨架搭建指南与设计文档键名对齐代码。
2026-10-06 01:30:52 +08:00

72 lines
7.5 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.
# 骨架搭建指南
> 一次性执行文档:monorepo 骨架 + 在线文档页的搭建步骤,供作者本人或任一 AI 执行者照做。**执行前先读 `README.md` 与 `AGENTS.md`(协作约定——尤其 git push 禁令与提交规则)**;本指南只定步骤、验收与红线,**字段与语义的权威在各定稿文档**(§6 索引)——动手前先读对应文档,不要凭本指南或记忆复述实现。执行完毕本指南状态翻「已实现」。
| 项目 | 内容 |
|------|------|
| 状态 | 草案(待作者审阅) |
| 关联 | 《技术选型》《API契约-公共约定》《API契约-管理面》《API契约-成员视图》(均定稿)· 七篇表字段设计(定稿)· 八篇交互设计(定稿)· `docs/references/NewAPI-接口范围.md`(上游接口实证) |
| 产出 | 可运行的 monorepo 骨架 · Scalar 在线文档页 · 首批端点 · 通过的测试与验收清单 |
---
## 1. 前置条件
- **Bun ≥ 1.2**——本机已装 **1.4.2**(mise 全局安装,声明于 `C:\Users\YYY\.config\mise\config.toml`,可执行文件 `C:\Users\YYY\AppData\Local\mise\installs\bun\1.4.2\bin\bun.exe`)。**⚠️ 验证须在作者的 PowerShell 7 里执行**:mise 的 shim 由 pwsh 的 profile 激活,在 Windows PowerShell 5.1 里 `bun` 会报 command not found(那是 shell 差异,不是没装)——执行者若用 5.1,请改用 `pwsh -c "bun -v"` 或上述绝对路径
- **Docker**(开发期跑 PostgreSQL 容器)——本机 29.6.2 已装
- **git**:`design` 分支(实现代码落点裁决:文档与代码同分支演进);**push 永远由作者手工**
## 2. 目标结构(《技术选型》§4)
```text
(仓库根 · design 分支)
├─ apps/
│ ├─ server/ # 母体后端:Hono serve 装配 · Drizzle/pg · 进程内调度 · 环境变量与密钥注入
│ └─ web/ # 前端:Vue 3 + antdv-next + Vite
├─ packages/
│ ├─ core/ # 业务核心:zod schema 与 DTO 类型 · 轮询与 request_id 去重 · 折算链 · 加密体系 · API 语义
│ └─ db/ # 数据访问层:Drizzle schema(pg 方言)+ 仓储实现
```
依赖方向单向:`apps/*` → `packages/db` → `packages/core`;web 对 core 仅纯类型依赖。
## 3. 步骤(按序)
1. **根骨架**:`package.json`(`workspaces: ["apps/*", "packages/*"]`)+ 根 `tsconfig`(strict;模块解析与路径按 Bun 惯例)+ `.gitignore` 增补(`node_modules` / `dist` / `.env`)
2. **apps/web 第一步做 §3.7 能力 spike**(《技术选型》§7 风险表既定:实现期第一步):Vite + Vue 3 + **antdv-next**,按《交互设计-总览与共性》§3.7 清单逐项搭小样——可折叠侧边栏 / 抽屉、密集表格(**展开行**、行内编辑、横向滚动)、对话框 + 二次确认、message / Alert、**DatePicker 范围选择**、大号粘贴输入框、徽章 / Segmented / Skeleton / Pagination;**任一项不覆盖即触发回退**(Element Plus / ant-design-vue)并回报作者再继续;**锁版本**(antdv-next 周更,用精确版本)
3. **packages/core**:zod schema + DTO 类型——字段权威 = 契约三篇(`LogItem`、错误信封、各端点请求 / 响应 schema);加密体系(`SK_KEY_ENCRYPTION_SECRET` 经 HKDF 派生 hmac / aes 子密钥——《api_keys表字段设计》3.1)与折算链(`qpuAt(t)`——《qpu_history表字段设计》3.3)先立接口与纯函数。**Bun 纪律红线**:只用 TS 标准库与 Web 标准 API(`fetch` / WebCrypto / `URL` / `TextEncoder` / `setTimeout`),禁止 `Bun.*` / `bun:*` / `node:*` / 数据库驱动
4. **packages/db**:drizzle-orm `pg-core` schema——字段权威 = 七篇表设计(`api_keys` 16 列 / `usage_logs` 25 列 / `payments` 9 列 / `qpu_history` 3 列 / `members` 7 列 / `users` / `sessions`;索引与 `dedupe_key` 规则照表设计);drizzle-kit 迁移;驱动 **postgres.js**(定案)。**方言红线**:pg 特有物(`jsonb` 等)不出本层
5. **apps/server**:Hono(Bun 原生 serve)+ `@hono/zod-openapi` + **Scalar** 文档页(挂 `/api/docs`,开放只读);两套凭证中间件照《API契约-公共约定》§2(会话 cookie `admin_session`:`HttpOnly + Secure + SameSite=Lax`,`Path=/api/admin`;成员 Bearer:`members.token_hash` 哈希比对 + `status` 检查);`.env`:`DATABASE_URL`、`SK_KEY_ENCRYPTION_SECRET`、初始化凭证(示意 `ADMIN_INIT_USERNAME` / `ADMIN_INIT_PASSWORD`——空库双通道,users 表设计 3.1:空库 + env 在 → 静默落库)
6. **开发用 compose**:只起 PostgreSQL 容器(server 本地跑);部署形态(server 镜像化)归后续部署设计,不在本步骤
7. **首批端点**(实现顺序):`setup-state` / `setup` / `session` / `password`(三态与登录——《API契约-管理面》§2)→ `engine` 端点先立路由桩(状态存储归同步引擎设计,返回占位结构)→ `keys` 登记四态(上游验证:解密 `key_ciphertext` 调上游——上游行为实证见 `NewAPI-接口范围.md`)→ 其余按契约逐个
8. **测试**:`bun test`——集成测试直打 Hono app;**契约有的端点必须有 handler、schema 必须对齐契约**(漂移钉住);错误信封、401、409 附 `key_id`、三态、`type=2` 口径都要有用例
9. **AGENTS.md 命令节登记**(作者常设授权「该改时就改」):`bun install` / `bun test` / 开发启动命令
## 4. 验收清单(全部通过才算完成)
- [ ] `bun install` 与 `bun test` 通过
- [ ] `/api/docs` 文档页可开、已实现端点可见、可试调
- [ ] 空库三态:无 env 无行 → 引导态;env 在 → 静默落库;非空 → 登录态
- [ ] 登录建会话(cookie 形态正确);任意受保护端点无凭证 → `401` 错误信封
- [ ] keys 登记:成功 `201` / hash 命中 `409`(附注 `key_id`)/ 上游拒绝 `422` / 上游不可达 `502`
- [ ] 聚合与明细口径:聚合仅 `type=2`;明细 `token_name` 取当前名
- [ ] 未知 `/api/*` → `404` 错误信封(JSON,非 HTML)
- [ ] 红线自查:`packages/core` 无 `Bun.*` / `node:*` / 驱动 import;`sk-key` 明文与 `key_ciphertext` / `token_hash` 永不出现在任何响应
- [ ] 每个管理面写操作落审计一行(action 枚举 =《API契约-管理面》§9)
## 5. 红线(违反即返工,出处见各定稿文档)
- **Bun 纪律与方言不外泄**(《技术选型》§5);**业务错误一律非 2xx、成功无信封**(《API契约-公共约定》§3);**snake_case 与表字段同构**(同文 §7)
- 令牌明文仅签发响应出现一次;审计是不可变历史;提交避开 `api*.json`(未脱敏快照)与 `session-archive/`(会话原档,未跟踪、勿 ignore)
## 6. 依据文档索引(执行者动手前必读)
| 文档 | 权威范围 |
|------|---------|
| `docs/design/技术选型.md`(定稿) | 栈、monorepo 结构、Bun 纪律、回退 |
| `docs/design/API契约-公共约定.md`(定稿) | 路由隔离、鉴权两档、错误信封、时间 / 数值 / 分页 / 命名 |
| `docs/design/API契约-管理面.md` / `API契约-成员视图.md`(定稿) | 全部端点与请求 / 响应字段 |
| `docs/design/*表字段设计.md` 七篇(定稿) | 全部表字段、索引、`dedupe_key`、写入时机 |
| `docs/design/交互设计-*.md` 八篇(定稿) | 页面语义(web 实现时的信息结构与文案) |
| `docs/references/NewAPI-接口范围.md` | 上游接口实证(登记验证、轮询数据源) |