# 数学脑 · 开发需求文档

> 版本：MVP v6.0 | 更新日期：2023年

---

## 一、项目概述

| 项目 | 内容 |
|------|------|
| **产品名** | 数学脑 |
| **代码名** | miniapp |
| **类型** | 移动端 SPA（单页应用）Web App |
| **架构** | Flask（Python 后端） + 原生 HTML/CSS/JS（前端） |
| **适应端** | iPhone 移动端（390px 宽度，100dvh，safe-area 适配） |
| **数据库** | SQLite |
| **AI 引擎** | DeepSeek Chat API |

---

## 二、技术栈

| 层级 | 技术 | 用途 |
|------|------|------|
| 后端框架 | Flask 3.x（Python） | 路由、API、数据库管理 |
| 数据库 | SQLite（SQLite3） | 视频数据、行为日志 |
| 前端 | 原生 HTML5 + CSS3 + Vanilla JS | SPA 页面切换、视觉小说引擎 |
| AI 集成 | DeepSeek Chat API | AI 数学助教对话 |
| 故事数据 | JSON（seed_story.json） | 8 章互动剧情节点树 |
| 视频数据 | JSON（seed_videos.json）→ SQLite | 54 条专业分区视频 |
| UI 风格 | 自制设计系统（CSS 变量 + flex/grid） | iPhone 式移动端适配 |

---

## 三、项目文件结构

```
miniapp/
├── app.py                    # Flask 后端主文件
├── data/
│   ├── seed_story.json       # 8章93节点互动剧情数据
│   ├── seed_videos.json      # 54条专业分区种子视频
│   ├── miniapp_v3.db         # SQLite 数据库
│   ├── build_story.py        # 剧情JSON生成脚本
│   └── novel/                # 原著小说txt（素材参考）
│       ├── 葫芦侠行（第一章）.txt
│       ├── 葫芦侠行（第二章）.txt
│       ├── ...
│       └── 框架.txt
├── static/
│   ├── css/
│   │   └── style.css         # 全局样式（~1400行）
│   └── js/
│       └── app.js            # 前端核心逻辑（~550行）
└── templates/
    └── index.html            # SPA 入口页面（~286行）
```

---

## 四、后端 API 接口

| 路径 | 方法 | 参数 | 返回 | 说明 |
|------|------|------|------|------|
| `/` | GET | — | HTML | 返回 SPA 首页 |
| `/api/videos` | GET | `module`(选填), `discipline`(选填) | `{code, data, disciplines}` | 视频列表 + 学科分类 |
| `/api/chat` | POST | `{message, student_id}` | `{code, reply, is_fallback}` | AI 对话（DeepSeek） |
| `/api/story` | GET | — | `{code, data}` | 获取互动剧情 JSON |
| `/api/log` | POST | `{user_id, action, target}` | `{code, msg}` | 行为日志记录 |
| `/api/students` | GET | — | `{code, data}` | 学生列表（B端预留） |

### 视频数据模型（videos 表）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | INTEGER PK | 自增 |
| title | TEXT NOT NULL | 视频标题 |
| module | TEXT | 所属模块（如"数人"） |
| sub_category | TEXT | 子分类 |
| discipline | TEXT | 学科（如"人工智能"） |
| discipline_icon | TEXT | 学科 emoji |
| video_url | TEXT | 外部视频链接 |
| description | TEXT | 视频简介 |
| duration_min | INTEGER | 时长（分钟） |
| author | TEXT | 作者（学院+姓名） |

---

## 五、前端架构

### 五层设计

```
┌─────────────────────────────────┐
│         index.html              │  ← 结构层：DOM 容器
├─────────────────────────────────┤
│         style.css               │  ← 表现层：响应式 + 动画
├─────────────────────────────────┤
│          app.js                 │  ← 逻辑层：路由 + 状态 + API
├─────────────────────────────────┤
│     seed_story.json             │  ← 数据层：剧情节点树
├─────────────────────────────────┤
│        Flask API                │  ← 服务层：数据库 + AI
└─────────────────────────────────┘
```

### 核心 JavaScript 模块

| 模块 | 函数 | 功能 |
|------|------|------|
| **全局状态** | `vnState`, `allVideos`, `storyData` | 应用级状态管理 |
| **模块切换** | `switchModule()`, `hideAllPanels()` | 四Tab页面切换、DOM显隐 |
| **发现页面** | `loadVideos()`, `renderVideoList()`, `renderDisciplineGrid()` | 视频流渲染、12学科网格 |
| **知识页面** | `renderShushuoFeed()`, `updateShushuoHero()` | 知识卡片Feed渲染 |
| **数学人生** | `navigateVN()`, `buildChoiceButtons()`, `applyVNStats()` | 视觉小说引擎核心 |
| **AI聊天** | `openChat()`, `sendMessage()`, `quickAsk()` | AI对话弹窗 |
| **数据持久化** | `saveVNState()`, `loadVNSave()`, `resetVNSave()` | localStorage存档 |

---

## 六、视觉小说引擎（VN Engine）

### 剧情数据模型

```json
{
  "title": "葫芦侠行",
  "start_node": "ch1_start",
  "nodes": {
    "节点ID": {
      "scene": "场景描述文本",
      "character": "说话角色",
      "sprite": "角色立绘URL（可选）",
      "choices": [
        {
          "text": "选项文本",
          "next": "下一节点ID",
          "effects": {
            "shuli": 整数,      // 数理根基变化
            "xiayi": 整数,      // 侠义声望变化
            "xinzhi": 整数,     // 心志韧性变化
            "favorability": {   // 角色好感度变化
              "角色名": 整数
            }
          }
        }
      ]
    }
  }
}
```

### 四属性系统

| 属性 | 键名 | 初始值 | 说明 |
|------|------|--------|------|
| 📐 数理根基 | `shuli` | 10 | 解锁高阶功法、影响论道胜负 |
| ⚔️ 侠义声望 | `xiayi` | 10 | 影响NPC态度、武林大会成绩 |
| 🧘 心志韧性 | `xinzhi` | 10 | 面对挫折的选择余地 |
| 💕 好感度 | `favorability` | 0（每人） | 触发专属剧情、影响结局 |

### 当前剧情规模

- **8 章**：初入江湖 → 西部教习 → 数理论道 → 脑学初创 → 报国之路 → 暗流涌动 → 陋室修炼 → 真相之门
- **93 个交互节点**
- **8+ 种结局**（真相守望、数理宗师、逍遥江湖、出海远航、悲情英雄、堕落之路、冤狱、虚无）

---

## 七、UI 设计系统

### 色彩系统

| 用途 | CSS 变量 | 色值 |
|------|----------|------|
| 发现页主色 | `--shuren` | `#F97316`（橙） |
| 知识页主色 | `--shushuo` | `#3B82F6`（蓝） |
| 数学人生主色 | `--shusi` | `#10B981`（绿） |
| 我的页主色 | `--mine` | `#8B5CF6`（紫） |
| 页面背景 | `--bg` | `#F2F3F7` |
| 卡片背景 | `--card` | `#FFFFFF` |
| 主文字 | `--text` | `#1E1E2E` |

### 布局规范

- **容器宽度**：`min(390px, 100vw)`（iPhone 比例）
- **桌面端**：居中显示 + `border-radius: 34px` + 阴影（模拟设备壳）
- **底部 TabBar**：白色半透明玻璃感 + `backdrop-filter: blur(18px)` + safe-area
- **顶部状态栏**：白色半透明 + 模糊 + `z-index: 50`
- **字体**：`-apple-system, PingFang SC, Microsoft YaHei`

---

## 八、部署与运行

### 启动命令

```powershell
cd C:\Users\Asus\Desktop\miniapp
py app.py
```

### 访问地址

```
http://127.0.0.1:5000/
```

### 环境要求

- Python 3.12+
- Flask
- requests
- python-docx（素材提取用，非运行时必需）

### 数据初始化

- 首次启动自动执行 `init_db()` + `load_seed_videos()`
- 54 条视频数据从 `seed_videos.json` 导入 SQLite
- 互动剧情从 `seed_story.json` 按需读取
- 旧数据库可通过改名绕过锁定问题

---

## 九、待开发需求

### P0（核心）
- [ ] 用户登录系统（OAuth/手机号）
- [ ] 视频上传与审核后台
- [ ] 互动剧情章节选择器（允许跳章/读档）
- [ ] 个人中心真实数据绑定（收藏、观看记录、剧情存档）

### P1（增强）
- [ ] 社交功能（评论、点赞、分享）
- [ ] 知识页数学小测验
- [ ] 视觉小说立绘 + 背景图系统
- [ ] 好感度可视化面板
- [ ] 多端适配（小程序版本）

### P2（远期）
- [ ] 微服务拆分
- [ ] 实时协作编辑（多人剧情共创）
- [ ] AI 生成剧情分支
- [ ] 数据分析看板（学生行为）
