P0.5 工程骨架 — 验证报告
日期:2026-08-22
目录:/home/zyw/Downloads/ai-lesson-prep
依据:《v0.2修订执行计划》P0.5 DoD;《设计说明书-v0.2》§3.3 / F1 / §11.2
========================================================================
1. 环境
========================================================================
Node:v20.15.1
npm:9.2.0
说明:系统 HTTPS_PROXY=http://127.0.0.1:10809 时,npm 9.2.0 报
“HttpsProxyAgent is not a constructor”。本次安装改为
registry.npmmirror.com 并取消代理环境变量,安装成功。
npm install:added 416 packages in 3m(exit 0)
========================================================================
2. Prisma 迁移(npx prisma migrate deploy)
========================================================================
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": SQLite database "dev.db" at "file:./dev.db"
SQLite database dev.db created at file:./dev.db
1 migration found in prisma/migrations
Applying migration `20260822000000_init`
The following migration(s) have been applied:
migrations/
└─ 20260822000000_init/
└─ migration.sql
All migrations have been successfully applied.
数据库文件:prisma/dev.db(24576 bytes)
users 表查询:
id=1 username=admin display_name=系统管理员 role=admin
password_hash 长度=60(bcrypt)
========================================================================
3. Seed(npx prisma db seed)
========================================================================
Running seed command `tsx prisma/seed.ts` ...
--------------------------------------------------
默认管理员已就绪(部署后请立即修改密码)
用户名: admin
密码: Admin@123456
角色: admin
--------------------------------------------------
🌱 The seed command has been executed.
========================================================================
4. 生产构建(npm run build)
========================================================================
> ai-lesson-prep@0.2.0 build
> next build
▲ Next.js 14.2.35
- Environments: .env
Creating an optimized production build ...
✓ Compiled successfully
Linting and checking validity of types ...
Generating static pages (0/18) ...
✓ Generating static pages (18/18)
Route (app) Size First Load JS
┌ ƒ / 141 B 87.4 kB
├ ○ /_not-found 875 B 88.2 kB
├ ƒ /api/auth/login 0 B 0 B
├ ƒ /api/auth/logout 0 B 0 B
├ ƒ /api/me 0 B 0 B
├ ƒ /cases 196 B 96.1 kB
├ ƒ /classes 196 B 96.1 kB
├ ƒ /dashboard 197 B 96.1 kB
├ ƒ /exports 196 B 96.1 kB
├ ƒ /hotspots 196 B 96.1 kB
├ ƒ /knowledge 197 B 96.1 kB
├ ○ /login 10.2 kB 97.5 kB
├ ƒ /patches 196 B 96.1 kB
├ ƒ /prepare 197 B 96.1 kB
├ ƒ /q/[token] 141 B 87.4 kB
├ ƒ /questionnaires 196 B 96.1 kB
└ ƒ /templates 196 B 96.1 kB
ƒ Middleware 30.7 kB
结论:npm run build 通过(exit 0)。
========================================================================
5. 运行时自测(next start -p 3000 + curl)
========================================================================
未登录 GET /dashboard
→ HTTP 307 Location: /login
POST /api/auth/login 错误密码
→ HTTP 401 {"error":"用户名或密码错误"}
POST /api/auth/login admin / Admin@123456
→ HTTP 200 {"ok":true,"user":{"id":1,"username":"admin","displayName":"系统管理员","role":"admin"}}
→ Set-Cookie: alp_session=...; HttpOnly; SameSite=lax; Path=/
带会话 GET /api/me
→ HTTP 200 返回同一用户对象
带会话 GET /dashboard
→ HTTP 200 HTML 含「工作台」「法学 2025」「系统管理员」「登出」
POST /api/auth/logout
→ HTTP 200 Set-Cookie: alp_session=; Max-Age=0
登出后再 GET /dashboard
→ HTTP 307 Location: /login
GET /login
→ HTTP 200
========================================================================
6. P0.5 DoD 对照
========================================================================
[x] Next.js 14 App Router + TypeScript + Tailwind + shadcn/ui + Prisma(SQLite) 可运行
[x] 登录 / 登出 / 会话(iron-session + bcryptjs);角色 admin / teacher
[x] /dashboard 空工作台 + 班级卡片占位 + 顶部导航含登出
[x] 未登录访问 /dashboard 重定向 /login
[x] Prisma users 表:id / username / password_hash / display_name / role / created_at
[x] SQLite 文件 prisma/dev.db;prisma migrate 可运行
[x] .env 与 .env.example:DEEPSEEK_API_KEY / DATABASE_URL / SESSION_SECRET / UPLOAD_DIR / LESSON_MINUTES=45
[x] seed 默认 admin / Admin@123456(提示部署后修改)
[x] npm run build 通过
========================================================================
7. 遗留(不阻塞 P0.5)
========================================================================
- F1.1 教师自助注册未做(P0.5 仅要求登录/会话;账号靠 seed / 后续管理)
- 全量业务表未建(P1)
- DEEPSEEK_API_KEY 为空(P2/P4 前门闩)
- 班级卡片为静态占位,P3 改为读库
- 会话 cookie Secure 默认关闭(本机 HTTP);上线 HTTPS 时设 COOKIE_SECURE=true(P10)
- 系统 npm 9.2.0 与 HTTPS_PROXY 不兼容,后续安装需取消代理或换镜像
- eslint-visitor-keys 声明需要 Node ^20.19.0,当前 20.15.1;构建未受影响