P0.5-验证报告.txt

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;构建未受影响
下载此文件