当前项目完全基于浏览器 localStorage 进行数据持久化,存在以下限制:
┌─────────────────────────────────────────────────┐
│ 前端层 (Pinia Stores) │
│ useLocalStorage / useDatabase │
├─────────────────────────────────────────────────┤
│ 数据持久化抽象层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────┐│
│ │ localStorage │ │ REST API │ │ SDK ││
│ │ (当前实现) │ │ (推荐) │ │ (可选) ││
│ └─────────────┘ └─────────────┘ └─────────┘│
├─────────────────────────────────────────────────┤
│ 服务端 API 层 │
│ ┌─────────────────────────────────────────┐ │
│ │ server/api/ (CRUD + 业务逻辑) │ │
│ └─────────────────────────────────────────┘ │
├─────────────────────────────────────────────────┤
│ 数据库驱动层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────┐│
│ │ Turso/libSQL│ │ Supabase │ │ SQLite ││
│ │ (当前) │ │ (备选) │ │ (本地) ││
│ └─────────────┘ └─────────────┘ └─────────┘│
└─────────────────────────────────────────────────┘urdoc/
├── server/
│ ├── db/
│ │ ├── index.ts # @libsql/client 连接配置
│ │ └── migrations/ # SQL 迁移文件
│ │ └── 001_users.sql # 用户表迁移
│ ├── utils/
│ │ └── db.ts # 数据库工具函数(自动导入)
│ └── api/
│ ├── auth/ # 认证 API
│ │ ├── login.post.ts # 登录接口
│ │ └── logout.post.ts # 登出接口
│ ├── cases/ # 病例 API
│ ├── stories/ # 故事 API
│ ├── tests/ # 考核 API
│ ├── acts/ # 互动实践 API
│ ├── rates/ # 评价 API
│ └── records/ # 记录 API
├── app/
│ ├── composables/
│ │ └── useDatabase.ts # 数据库操作 composable
│ ├── pages/
│ │ └── login.vue # 登录页面
│ └── utils/
│ └── migration.ts # localStorage 迁移工具
└── package.json # 依赖配置pnpm add @libsql/clientserver/db/index.tsserver/utils/db.tsserver/utils/db.ts 中定义 Zod schemaPOST /api/cases # 创建病例
GET /api/cases # 获取病例列表(支持分页、搜索)
GET /api/cases/:id # 获取单个病例
PUT /api/cases/:id # 更新病例
DELETE /api/cases/:id # 删除病例app/composables/useDatabase.tsapp/utils/migration.ts共 12 张表:
users — 用户表(认证用)records — 主表,存储记录基本信息record_cases — 病例子表record_stories — 故事子表record_tests — 考核子表record_acts — 互动实践子表record_rates — 评价子表record_images — 图片子表record_audios — 音频子表record_videos — 视频子表models — 模型配置表prompts — 提示词表users 表(用户认证)
records 表(主表)
record_cases 表(病例)
record_stories 表(故事)
record_tests 表(考核)
record_acts 表(互动实践)
record_rates 表(评价)
record_images 表(图片)
record_audios 表(音频)
record_videos 表(视频)
models 表(模型配置)
prompts 表(提示词)
records (1) ──── (N) record_cases
records (1) ──── (N) record_stories
records (1) ──── (N) record_tests
records (1) ──── (N) record_acts
records (1) ──── (N) record_rates
records (1) ──── (N) record_images
records (1) ──── (N) record_audios
records (1) ──── (N) record_videos
record_cases (1) ──── (N) record_actsserver/db/index.ts@libsql/client 创建连接useRuntimeConfig() 获取 Turso 配置file:local.dbserver/utils/db.ts认证 API
server/api/auth/login.post.ts — 用户登录server/api/auth/logout.post.ts — 用户登出setUserSession() / clearUserSession() 管理会话hashPassword() / verifyPassword() 处理密码数据 API
server/api/records/index.get.ts 等路由文件useDb() 获取数据库连接app/composables/useDatabase.ts$fetch)app/utils/migration.tsexport default defineNuxtConfig({
modules: ['nuxt-auth-utils', /* 其他模块 */],
runtimeConfig: {
turso: {
databaseUrl: '',
authToken: '',
},
},
})# .env
NUXT_TURSO_DATABASE_URL=libsql://urdoc-dearfad.aws-ap-northeast-1.turso.io
NUXT_TURSO_AUTH_TOKEN=your_token_here
NUXT_SESSION_PASSWORD=your_session_password_min_32_chars # nuxt-auth-utils 会话加密在 server/db/index.ts 中实现驱动工厂,根据环境变量返回对应的数据库 client:
server/db/
├── index.ts # 驱动工厂
└── drivers/
├── turso.ts # @libsql/client 实现
└── edgeone.ts # 未来 EdgeOne 驱动实现所有驱动需实现统一的 execute() 接口,确保上层代码无需修改。
server/db/drivers/edgeone.ts 实现与 @libsql/client 相同的接口server/db/index.ts 中根据环境变量选择驱动| 阶段 | 任务 | 预计时间 | 优先级 |
|---|---|---|---|
| 1 | 基础设施搭建 | 2-3 小时 | P0 |
| 2 | API 开发 | 3-4 小时 | P0 |
| 3 | 前端集成 | 2-3 小时 | P1 |
| 4 | 数据迁移 | 1-2 小时 | P1 |
| 5 | 优化和测试 | 2-3 小时 | P2 |
| 总计 | 10-15 小时 |
nuxt.config.ts - 项目配置app/types/ - 类型定义app/stores/ - Pinia storesserver/api/ - 服务端 API