P1 数据模型落地 — 验证报告
日期:2026-08-22
目录:/home/zyw/Downloads/ai-lesson-prep
依据:《v0.2修订执行计划》P1 DoD;《设计说明书-v0.2》§4.2;《v0.2样例JSON.md》
========================================================================
1. 环境
========================================================================
Node:v20.15.1
npm:9.2.0
Prisma:5.22.0
说明:未新装依赖。npx 执行前取消 HTTP(S)_PROXY,避免 P0.5 同类
“HttpsProxyAgent is not a constructor” 问题。
========================================================================
2. Prisma schema
========================================================================
prisma validate:The schema at prisma/schema.prisma is valid(exit 0)
JSON 约定:Prisma 5.22 SQLite 连接器不支持 Json 类型(validate 报
P1012)。全部 JSON 载荷用 String 存 JSON 文本;结构写在字段注释中。
users 模型列与 P0.5 一致,仅增加关系字段(不产生 ALTER TABLE users)。
========================================================================
3. 迁移(npx prisma migrate dev --name v02_models --skip-seed)
========================================================================
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": SQLite database "dev.db" at "file:./dev.db"
Applying migration `20260822014730_v02_models`
The following migration(s) have been created and applied from new schema changes:
migrations/
└─ 20260822014730_v02_models/
└─ migration.sql
Your database is now in sync with your schema.
Running generate... ✔ Generated Prisma Client (v5.22.0)
to ./node_modules/@prisma/client in 419ms
exit 0
迁移 SQL 含 CREATE TABLE / CREATE INDEX,不含 ALTER TABLE "users"。
_prisma_migrations:
20260822000000_init applied
20260822014730_v02_models applied
数据库文件:prisma/dev.db(368640 bytes)
========================================================================
4. prisma generate
========================================================================
(migrate dev 已生成一次;再执行 npx prisma generate)
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
✔ Generated Prisma Client (v5.22.0) to ./node_modules/@prisma/client in 470ms
exit 0
========================================================================
5. 表清单(sqlite_master,不含 sqlite_* / _prisma_*)
========================================================================
共 27 张表:
users (P0.5 已有,列未改)
courses
chapters
lessons
course_outcomes
knowledge_points
knowledge_prereq
sizheng_elements
knowledge_point_sizheng
major_templates
template_rules
classes
questionnaires
questionnaire_responses
hotspots
cases
case_knowledge_points
case_templates
lesson_plans
course_outlines
feedbacks
generation_tasks
knowledge_patches
sys_config
user_export_prefs
rss_sources
exports (ER:LessonPlan 1──N Export,一并落地)
========================================================================
6. users 表未受影响
========================================================================
PRAGMA table_info(users):
id INTEGER PK AUTOINCREMENT NOT NULL
username TEXT NOT NULL
password_hash TEXT NOT NULL
display_name TEXT NOT NULL
role TEXT NOT NULL
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
CREATE TABLE "users" 与 20260822000000_init 一致。
现有账号:
id=1 username=admin display_name=系统管理员 role=admin
password_hash 长度=60(bcrypt)
PrismaClient.user.findUnique({ username: "admin" }) 返回同一对象。
认证代码(src/lib/auth.ts / seed/admin.ts)未改。
========================================================================
7. P1 关键列抽检
========================================================================
questionnaire_responses:
student_no TEXT NOT NULL=0(可空独立列,非题目)
lesson_plans.status 默认 'not_started'
七态注释:not_started / plan_draft / plan_confirmed /
ppt_draft / ppt_confirmed / materials_draft / completed
draft_content / confirmed_content / teacher_edits_summary /
why_changed / adaptation_log / generation_meta 均存在
course_outcomes:
literacy_dim TEXT NOT NULL
is_core BOOLEAN NOT NULL
UNIQUE(course_id, code)
classes:
profile, profile_revision_log, chaoxing_course_id, chaoxing_class_id
template_rules:
literacy_focus / omit_items / permitted_tools /
expected_student_performance / preferred_lesson_type / media_strategy
knowledge_points:
content_depth / bloom_range / misconceptions(无 base_depth)
cases:
case_type / dilemma / stakeholders / teaching_note / time_needed /
literacy_focus / source_case_id
feedbacks:
goal_achievement / difficulty / case_sparked_discussion /
next_lesson_suggestion / effect_rating / chaoxing_metrics
generation_tasks.type 注释含:
lesson_plan / ppt / materials / outline /
questionnaire / profile_report / knowledge_extract / hotspot_analyze
UNIQUE:
lesson_plans(class_id, lesson_id)
questionnaires.token
knowledge_prereq(from_kp_id, to_kp_id)
case_knowledge_points(case_id, knowledge_point_id)
case_templates(case_id, template_id)
sys_config.key
========================================================================
8. 对拍(详见 P1-对拍报告.md)
========================================================================
静态字段名对拍(样例 JSON 键 ⊂ schema 注释/列):95 / 95 通过
入库回读(写入样例 JSON 再 parse):17 / 17 通过
临时对拍数据已清理。
结论:与《v0.2样例JSON.md》字段名全部一致。
========================================================================
9. P1 DoD 对照
========================================================================
[x] Prisma schema + 迁移,含目标对象/关联表/草稿分存/补丁表/系统配置表
[x] questionnaire_responses.student_no 可空独立列,非 questions[] 题目
[x] 与 P0 样例 JSON 对拍通过(字段名一致)
[x] prisma migrate 可跑;prisma generate 通过
[x] users 表与现有认证不受影响
[x] 未删除/移动现有 .md/.txt 设计文档与 P0.5 代码
========================================================================
10. 遗留(不阻塞 P1)
========================================================================
- 种子数据(第七章知识点/流浪狗案例/法学 template_rules/问卷蓝图)属 P2
- 空/过短 description 拒生成、token 限次/过期、学号不进 prompt 等
为应用层门槛,P1 只落表与注释
- raw_text 500–800 字上限为应用层校验
- sys_config 表为空;.env LESSON_MINUTES=45 仍为初值(表覆盖在 P7 读取时写入)
- generation_tasks.created_by 为相对 v0.1 的可选补充列
- exports 表按 ER 落地,任务点名清单未单列,属完整模型
- P0.5 遗留仍在:教师自助注册、DEEPSEEK_API_KEY 为空、班级卡片静态占位