docs: 补全 AI 入口/API/路由/现状文档并对齐一致性
新增(Codex 起草,本次纳入并校对): - AGENTS.md:仓库级 AI 强约束入口 - docs/00-ai-start-here.md:AI 开发入口与导航 - docs/api.md:账号/生词本/进度 API 合约草案 - docs/routes.md:go-app 页面路由与组件归属 - docs/current-state.md:当前实现状态 补充与对齐: - 验证命令补 bash(WSL/Linux 为主,PowerShell 为备):00-ai-start-here、AGENTS - 04-architecture:新增第六节"项目结构(包布局)"+ 3.2 建表 SQL 草案 - docs/README 导航补 06-tasks;CLAUDE 目录树补 AGENTS/scripts/design_mockups - 00-ai-start-here 去除已过时的"需要补齐"段 - 06-tasks:Phase 2/3/4/5 交叉引用 api.md / routes.md / 包布局 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+66
-1
@@ -34,7 +34,7 @@
|
||||
|
||||
**后端(net/http)**
|
||||
|
||||
- 用户注册 / 登录 / 鉴权(方式见技术栈,待定)
|
||||
- 用户注册 / 登录 / 鉴权(httpOnly Session Cookie)
|
||||
- 生词本增删查
|
||||
- 学习进度读写
|
||||
- (静态音频与文稿可由 go-app Handler 或 CDN 提供)
|
||||
@@ -95,6 +95,39 @@
|
||||
> 目的是避免将来接入新概念英语等时,对**已产生的用户进度/生词数据**做痛苦的 schema 迁移(用户数据不可重生,内容数据可重生)。
|
||||
> ⚠️ MVP 阶段**仅留列、填默认值,不写任何多教材逻辑**(不建 courses 表、不改内容 JSON、不做按教材过滤)——多教材接入是 V2+,见 [任务看板](06-tasks.md) 待办池。
|
||||
|
||||
建表草案(SQLite,T-301 实现时以此为基准,可按需微调约束):
|
||||
|
||||
```sql
|
||||
CREATE TABLE users (
|
||||
id INTEGER PRIMARY KEY,
|
||||
email TEXT UNIQUE NOT NULL,
|
||||
password_hash TEXT NOT NULL,
|
||||
created_at TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE progress (
|
||||
user_id INTEGER NOT NULL,
|
||||
course_id TEXT NOT NULL DEFAULT 'family-album',
|
||||
episode_id INTEGER NOT NULL,
|
||||
act INTEGER NOT NULL,
|
||||
last_position REAL NOT NULL DEFAULT 0, -- 秒
|
||||
completed INTEGER NOT NULL DEFAULT 0, -- 0/1
|
||||
updated_at TEXT NOT NULL,
|
||||
PRIMARY KEY (user_id, course_id, episode_id, act)
|
||||
);
|
||||
|
||||
CREATE TABLE vocab (
|
||||
id INTEGER PRIMARY KEY,
|
||||
user_id INTEGER NOT NULL,
|
||||
course_id TEXT NOT NULL DEFAULT 'family-album',
|
||||
word TEXT NOT NULL,
|
||||
episode_id INTEGER NOT NULL,
|
||||
act INTEGER NOT NULL,
|
||||
context_sentence TEXT,
|
||||
created_at TEXT NOT NULL
|
||||
);
|
||||
```
|
||||
|
||||
**功能模块化**:字幕同步、生词本、播放器做成可复用组件,不同教材按需启用(走遍美国用字幕同步;新概念可能更重单词表与语法)。
|
||||
|
||||
## 四、关键技术难点
|
||||
@@ -117,3 +150,35 @@
|
||||
7. (V2)复读 / 测验 / 打卡
|
||||
|
||||
> 原则:先验证最难的字幕同步,跑通再往上搭架子,避免先搭一堆架构最后卡在核心功能。
|
||||
|
||||
## 六、项目结构(建议包布局)
|
||||
|
||||
go-app 同一份代码两处运行:编译成 **wasm 在浏览器**跑(`app.RunWhenOnBrowser()`),编译成**普通二进制在服务器**跑(起 `http.Server` + `app.Handler`)。因此前端组件包必须能进 wasm,而后端包(`net/http`、SQLite、文件 IO)**不能进 wasm**——用构建标签 `//go:build !wasm`(或单独的非 js 包,只被 server 入口引用)隔离。
|
||||
|
||||
建议布局(T-001 起逐步建立,不必一次建全):
|
||||
|
||||
```
|
||||
lingo/
|
||||
├── go.mod
|
||||
├── main.go # 装配入口:注册页面组件 + RunWhenOnBrowser;server 侧起 http + app.Handler
|
||||
├── pages/ # go-app 前端组件(进 wasm)
|
||||
│ ├── list.go # 课程列表页(EpisodeList)
|
||||
│ ├── play.go # 播放页(TranscriptView)
|
||||
│ ├── player.go # AudioPlayer:syscall/js 封装浏览器 Audio API
|
||||
│ ├── vocab.go # 生词本页
|
||||
│ └── auth.go # 登录/注册(AuthForm)
|
||||
├── content/ # episodes.json 加载与类型定义(T-003,前后端共用,纯数据可进 wasm)
|
||||
│ └── content.go
|
||||
├── server/ # 仅服务器端,//go:build !wasm 隔离,不进 wasm
|
||||
│ ├── api.go # /api/*(账号 / 生词 / 进度),合约见 docs/api.md
|
||||
│ ├── auth.go # httpOnly Session Cookie
|
||||
│ ├── db.go # SQLite 建表与读写(见 3.2 建表草案)
|
||||
│ └── static.go # /family-album/* → 磁盘 family-album-usa/ 的路径映射
|
||||
└── web/ # 静态资源
|
||||
├── app.css # 纯 CSS(可迁移自 design_mockups/ 的 :root + 组件样式)
|
||||
├── manifest.webmanifest
|
||||
└── sw.js # Service Worker(Phase 6)
|
||||
```
|
||||
|
||||
- 页面路由与组件归属详见 [`routes.md`](routes.md);后端接口形状详见 [`api.md`](api.md)。
|
||||
- `content/` 只放数据结构与加载,保持可进 wasm(前端列表/播放页要用),**不要**在其中引入 server-only 依赖。
|
||||
|
||||
Reference in New Issue
Block a user