e3f4af9c0c
- 总体架构:新增打印/图像预处理/双飞轮/三环境部署 - 技术选型:调整决策理由(Coze沙盒自动化测试),新增Sharp+PDFKit - 数据模型:新增code/role/question_type+print_tasks+audit_logs,ID+code并存 - 模块设计:新增Image/Print模块,推荐两阶段匹配(关键词粗筛→AI精排) - PRD:目标用户扩展为学生+家长,新增PDF打印,年级聚焦小初,图像预处理流程 - ADR-010:题库抽象层Adapter Pattern Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
94 lines
4.2 KiB
Markdown
94 lines
4.2 KiB
Markdown
# 技术选型
|
||
|
||
> 版本: v0.4.0 | 作者: Arch AI | 基于 PRD v0.4.0 + 旧架构合并
|
||
|
||
---
|
||
|
||
## 1. 技术栈总览
|
||
|
||
| 层 | 选型 | 版本 | 选型理由 |
|
||
|----|------|------|----------|
|
||
| 小程序框架 | Taro | 4.1.x | 跨端能力(微信/抖音/H5),React 生态 |
|
||
| UI 框架 | React | 18.x | Hooks 生态成熟,社区资源丰富 |
|
||
| UI 组件库 | shadcn/ui (Taro 适配) | — | 可定制、无样式锁定、复制即用 |
|
||
| 样式方案 | Tailwind CSS | 4.x | 原子化 CSS,与 shadcn/ui 深度集成 |
|
||
| 状态管理 | Zustand | 5.x | 轻量、无 Provider、TS 友好 |
|
||
| 后端框架 | NestJS | 10.x | 模块化、IoC、企业级 Node.js 框架 |
|
||
| ORM | Drizzle ORM | 0.45.x | Type-safe、轻量、SQL-like API |
|
||
| 数据库 | PostgreSQL | 15+ | 关系型、JSON 支持、全文搜索 |
|
||
| AI 能力 | Coze SDK | — | 现成 OCR + NLP 能力,无需自训 |
|
||
| 文件存储 | S3 兼容 (MinIO/Supabase) | — | 图片上传,标准化接口 |
|
||
| 包管理 | pnpm | 9.x | monorepo 原生支持、磁盘效率高 |
|
||
| 图像处理 | Sharp | 0.33.x | Node.js 高性能图像处理,CLAHE/旋转/缩放 |
|
||
| PDF 生成 | PDFKit | 0.15.x | Node.js PDF 生成,A4/300DPI 排版 |
|
||
| 测试 | Jest | 29.x | 生态最大、React 测试工具链成熟 |
|
||
| 语言 | TypeScript | 5.x | 全栈类型安全 |
|
||
|
||
## 2. 关键选型决策
|
||
|
||
### 2.1 为什么是 Taro 而不是 uni-app?
|
||
|
||
| 维度 | Taro | uni-app |
|
||
|------|------|---------|
|
||
| React 支持 | 一等公民 | Vue 为主 |
|
||
| shadcn/ui | 社区已有 Taro 适配 | 无 |
|
||
| 跨端编译 | 编译时转译,性能好 | 运行时适配,有开销 |
|
||
| 社区 | 京东维护,活跃 | DCloud 维护 |
|
||
|
||
**决策**: Taro。项目已用 React + shadcn/ui 体系,Taro 天然匹配。最终仅发布微信小程序,但 Taro 保留了未来迁移 H5/原生 APP 的灵活性(后端 API 不变,只换前端壳)。
|
||
|
||
### 2.2 为什么是 NestJS 而不是 Express/Fastify?
|
||
|
||
| 维度 | NestJS | Express |
|
||
|------|--------|---------|
|
||
| 架构约束 | 模块化 + 依赖注入 | 无约束,需自建 |
|
||
| TypeScript | 一等公民 | 需额外配置 |
|
||
| 测试友好 | 内置 TestingModule | 需自建 |
|
||
| 微服务支持 | 内置 Transport 层 | 需自建 |
|
||
|
||
**决策**: NestJS。自建后端是刚性需求——Coze 沙盒自动化测试需要完整的后端环境(长连接、GPU 调用、流式响应),微信云开发(云函数 10s 超时)无法满足。同时 NestJS 模块化设计降低长期拆分微服务的迁移成本。
|
||
|
||
### 2.3 为什么是 Drizzle ORM 而不是 Prisma?
|
||
|
||
| 维度 | Drizzle | Prisma |
|
||
|------|---------|--------|
|
||
| Bundle 大小 | < 10KB | ~500KB+ (engine) |
|
||
| SQL 控制 | SQL-like API,接近原生 | 抽象层厚 |
|
||
| 边缘运行时 | 支持 | 需额外配置 |
|
||
| 迁移工具 | 内置 | 内置 |
|
||
|
||
**决策**: Drizzle。小程序场景对包体积敏感,Drizzle 更轻。且项目初期 SQL 灵活性重要。
|
||
|
||
### 2.4 AI 方案: Coze SDK vs 直接调用 API
|
||
|
||
| 维度 | Coze SDK | 直接 Claude/GPT API |
|
||
|------|----------|---------------------|
|
||
| 开发量 | 低(工作流已封装) | 高(需自建 prompt chain) |
|
||
| OCR 能力 | 内置 | 需额外组件 |
|
||
| 成本 | 按调用次数 | 按 token |
|
||
| 可定制性 | 低 | 高 |
|
||
|
||
**决策**: MVP 用 Coze SDK 快速上线,Phase 3 评估自研模型(P02)。
|
||
|
||
## 3. 暂不引入的技术
|
||
|
||
| 技术 | 原因 | 引入时机 |
|
||
|------|------|----------|
|
||
| Redis | MVP 无高频读写,PostgreSQL 足够 | Phase 3(推荐/排行榜缓存) |
|
||
| Docker/K8s | 单实例部署,先跑起来 | Phase 3(CI/CD 配套) |
|
||
| GraphQL | REST 足够,前端查询模式简单 | Phase 3(复杂查询场景) |
|
||
| Elasticsearch | PostgreSQL 全文搜索够用 | Phase 3(题库搜索量大时) |
|
||
| Kafka/RabbitMQ | 无异步解耦需求 | Phase 3(微服务拆分后) |
|
||
|
||
## 4. 技术债务记录
|
||
|
||
| 债务 | 说明 | 偿还计划 |
|
||
|------|------|----------|
|
||
| P01 项目代码是"代码检测"模板 | 需要替换为错题本业务代码 | Phase 2 开发时自然替换 |
|
||
| 无 CI/CD | 手动测试部署 | Phase 3 引入 GitHub Actions |
|
||
| 无监控 | 无 APM/日志收集 | Phase 3 引入 Sentry + 阿里云日志 |
|
||
|
||
---
|
||
|
||
*关联: 总体架构.md → 模块设计.md*
|