# 情绪词 · 研发交接说明 v1.0.0

> **版本**：1.1.0（文档同步 2026-07-17）  
> **v1.1.0 变更**：运营后台新增**登录门禁 + 管理员账号管理**（见 §7.1、A-09/A-10）。  
> **读者**：迁移微信小程序 / 对接后台的产品与研发  
> **关联**：[FEATURE-LIST-v1.0.0.md](./FEATURE-LIST-v1.0.0.md) · [DATA-SCHEMA.md](./DATA-SCHEMA.md) · [原型地图](../prototype/map.html)

页面内注释只写「用户问题 / 业务规则」；实现细节、**数据怎么传**、交互总表以本文为准。

---

## 0. 本版功能清单速览（给开发）

| 端 | 模块 | 能力摘要 | 状态 |
|----|------|----------|------|
| C | 导航 | 3 Tab：情绪词 / 词库 / 我 | ✅ |
| C | 首页 | 一体任务卡；主按钮状态机；待复习可点 | ✅ |
| C | 词库 | 基础库 + **亲子一本**（`emotion_parenting`）；NVC 不展示 | ✅ |
| C | 计划 | 双轴滑杆（天×日≥R）；学习模式；保存开课 | ✅ |
| C | 学词 | 初识→做题；选中即判；答错提示；顶栏已学/目标；满额只学中弹窗 | ✅ |
| C | 结果 | 正确率；未满额可继续；满额无「再学几个」 | ✅ |
| C | 复习 | 当前库错题；完全掌握清零 | ✅ |
| C | 我 | 资料 / 日历 / 我的学习 | ✅ |
| B | 词库 | 列表→详情→编辑；状态仅 **未上架 / 已上架** | ✅ |
| B | 词条 | 词义+练一练同页；出题状态 **未完善 / 已完善**；必填 `*` + 保存校验 | ✅ |
| B | 导入 | **弹窗**；**统一 CSV 模板**（`题目类型` + `题目内容`）；拖入文件（无粘贴） | ✅ |
| B | 草稿 | 改动写本机草稿，**不写回** `data/` JSON（发布流水线待建） | ✅ |
| B | 登录门禁 | 进后台先登录；会话 **1 天**有效期；过期/退出回登录页（见 §7.1） | ✅ |
| B | 管理员 | 「管理员」页；超管不可删/停、可改己密；新增子账号；子账号停用/重置/删除；**本期不做权限** | ✅ |
| — | 正式 API | 无；见 **§1 数据传输** | ⏳ |

完整条目表见 [FEATURE-LIST-v1.0.0.md](./FEATURE-LIST-v1.0.0.md)。

---

## 1. 产品一句话

用户学会用**更准的情绪词**表达感受。v1.0.0 只做「百词斩式学情绪词」：

**选库 → 设计划 → 学词做题 → 结果 →（错题可复习）→「我」看日历与过往词库。**

不做（代码保留、入口隐藏）：趣味测评、情景分析、命名器、词卡本入口、扩展库正式开课、App 内重置、页内雷达画像。

---

## 1.1 数据传输与存储架构（研发必读）

> **原型阶段没有业务 HTTP API。**  
> 「内容」靠静态 JSON + 本地 HTTP 文件服务；「进度 / 后台草稿」靠浏览器 `localStorage`；「导入」是浏览器读文件后写入草稿。  
> 迁小程序 / 接真实后台时，按下表把通道换成 `wx.request` / 云函数 / OSS 即可，**业务字段仍对齐 DATA-SCHEMA**。

### 1.1.1 总览

```mermaid
flowchart LR
  subgraph Static["静态内容仓 · data/"]
    IDX["packs/index.json"]
    W["packs/**/*.json 词条+题"]
  end

  subgraph HTTP["本地文件服务 · 打开原型.bat :8775"]
    FS[http.server / serve]
  end

  subgraph C["C 端原型"]
    PACKS["utils/packs.js · fetch"]
    STORE["utils/store.js · localStorage\nemotion_words_state_v1"]
    UI["prototype/js/app.js"]
  end

  subgraph B["运营后台原型"]
    AFETCH["admin.js · fetch 读 data/"]
    ADRAFT["localStorage\new_admin_draft_v1"]
    CSV["CSV 拖入 · FileReader"]
    AUI["词库/词条/导入 UI"]
  end

  IDX --> FS
  W --> FS
  FS -->| PACKS
  FS --> AFETCH
  PACKS --> UI
  STORE --> UI
  UI --> STORE
  AFETCH --> AUI
  AUI --> ADRAFT
  CSV --> ADRAFT
  ADRAFT -.->|"合并覆盖读"| AUI
```

### 1.1.2 按功能：数据走哪条通道

| 功能（前后端） | 传输 / 存储方式 | 键或路径 | 方向 | 说明 |
|----------------|-----------------|----------|------|------|
| C 端加载词库列表 | **HTTP GET**（静态文件） | `/data/packs/index.json` | 仓 → C | `EWPacks.loadIndex`；带 `?v=` 破缓存 |
| C 端加载词条与题目 | **HTTP GET** | `/data/packs/{dataFile}` | 仓 → C | 如 `basic/anger.json`、`extensions/parenting.json` |
| C 端缺题自动出题 | **纯前端** | `utils/quiz-fallback.js` | — | 不读网；按词条字段生成 |
| C 端学习计划 / 进度 / 日历 / 错题 | **localStorage** | `emotion_words_state_v1` | C ↔ 本机 | `EWStore.loadState` / `persist`；含 `packProgress`、`wordProgress`、`studyCalendar`、`profile` |
| C 端跨日清今日计数 | **localStorage** | `ew_last_day` | C ↔ 本机 | 辅助键 |
| B 端打开后台读内容 | **HTTP GET**（同仓） | `/data/packs/...` | 仓 → B | 与 C **同一套 JSON** |
| B 端改词库元数据 / 词条 / 题 | **localStorage 草稿** | `ew_admin_draft_v1` | B ↔ 本机 | `index.packs` + `words[packId][]`；**覆盖**同 id 的文件数据，刷新不丢 |
| B 端 CSV 导入 | **浏览器 FileReader** → 解析 → 写草稿 | 无服务端上传 | 运营文件 → B 草稿 | 统一模板；每行一道题；同词面 append |
| B 端下载导入模板 | **GET 读样例 CSV + Blob 下载**（UTF-8 BOM） | `docs/import-templates/词条导入模板.csv` | B → 本机文件 | 唯一样例源；改 CSV 后刷新即生效 |
| B 端封面 / 场景图（原型） | **FileReader → base64** 写入草稿字段 | `coverImageUrl` / `quizzes.*.imageUrl` | 本机图 → 草稿 | 正式环境应改为 OSS URL |
| B 端用户学习看板 | 读用户进度（正式 API）；原型阶段可用本机演示数据 | 用户进度服务 / 本机草稿 | B ↔ 服务端 | 用户主键与 C 端登录 `userId` 一致；原型演示数据非正式库表样例 |
| 正式发布（词库上架到 C） | **尚未实现** | 目标：草稿合并进 `data/` 或 CMS API | B → 仓 / 服务 | A-07 待建；当前 C **读不到**后台草稿 |

### 1.1.3 读写优先级（后台）

```
展示词库列表 / 词条 =
  localStorage.ew_admin_draft_v1 中有该 pack / words
    ? 用草稿
    : fetch(data/packs/…)
```

C 端**从不**读 `ew_admin_draft_v1`。要在 C 验证后台改动，必须走「发布到 JSON / 接口」或临时手动改 `data/`。

### 1.1.4 迁微信小程序 / 真实后台时的替换建议

| 原型通道 | 正式建议 |
|----------|----------|
| `fetch('/data/packs/…')` | 内容 CDN / 云存储 / 管理端发布 API；小程序 `wx.request` 或分包静态资源 |
| `emotion_words_state_v1` | 登录后：`wx.setStorageSync` 作缓存 + 服务端用户进度 API；关键写前校验登录 |
| `ew_admin_draft_v1` | 运营后台（Web）→ 鉴权 REST/GraphQL；草稿可仍落库，发布打版本 |
| CSV FileReader | 管理端「导入」接口：上传文件或粘贴解析结果 POST；服务端校验「选项配置」规则 |
| base64 配图 | 直传 OSS，库中只存 URL |

字段契约仍以 [DATA-SCHEMA.md](./DATA-SCHEMA.md) 为准；导入列规则见本文 §5.1。

---

## 2. 信息架构（开放）

| Tab / 页 | 路由 | 用户进来要解决什么 |
|----------|------|-------------------|
| 情绪词 | `/pages/emotion/index` | 今天学哪本、学到哪、点一下开始 |
| 词库 | `/pages/library/index` | 在喜怒哀惧四本里选一本去设计划 |
| 学习计划 | `/pages/pack-detail/index` | 看懂这本库 + 定每天几个词 + 学法 |
| 今日学习 | `/pages/study/index` | 初识 + 做题 |
| 学习结果 | `/pages/study-result/index` | 本组小结，决定继续或回首页 |
| 复习 | `/pages/practice/index` | 练错题（路由保留；**首页不挂入口**） |
| 我 | `/pages/profile/index` | 资料 · 日历 · 我的学习（可折叠） |
| 资料编辑 | `/pages/profile-edit/index` | 改昵称 / ID / 性别 / 头像色 |

### 2.1 隐藏路由（深链 → 回情绪词首页）

`/pages/scenario/index` · `/pages/naming/index` · `/pages/wordbook/index` · `/pages/assessment/*`

扩展预览 `/pages/extension-preview/index` 仍可进入，但**不可正式开课**。

---

## 3. 页面与交互说明（研发对照）

### 3.1 情绪词首页

**展示**  
一体任务卡：封面/词库名/计划元信息 → 本库进度条 → 今日新学 | 待复习 → **唯一主按钮**。

**主按钮文案**

| 状态 | 文案 | 行为 |
|------|------|------|
| 无在学库 | （空卡）去选词库 | → 词库 Tab |
| 可学 | 开始学习 / 继续学习 / 再学一组 | → 开学习批次 |
| 本库学完 | 本库已学完 | → 词库 Tab |

**明确不做（本页）**：独立「复习」主按钮、其它词库横滑书架、测评入口。  
**待复习**：数字 >0 时可点进入复习页。

**交互**：点封面行 → `pack-detail`；主按钮 → `continue-study` / `go-library`；待复习 → `go-review`。

---

### 3.2 词库 Tab

**可学列表** = `getBasicPacks`：**基础库**（喜怒哀惧/觉察）+ **亲子一本**（`emotion_parenting`）。NVC 等扩展 **不进列表**。
强度统一 **1～3 档**（亲子词 intensity = 文档原 1/2/3 层）。

**交互**：点行 → 对应 `pack-detail`。状态徽标：在学 / 已学完。

---

### 3.3 学习计划页

**结构**：顶部完整词库介绍 → 进度摘要 → **动态每日词数档** → 学习模式 → 保存。

**交互**：`plan-tab` / `pick-daily-row` / `pick-mode-tile` / `save-plan-start` / `switch-pack`。  
**不做**：页内重置。保存后 `planConfigured=true`。当天改目标：保留已学数，按新目标重算完成态。

详细档位算法见下方 **§3.3.1**（研发必读）。

---

### 3.3.1 每日学词 / 天数双轴算法（研发对照）

> 产品结论（Grill 2026-07-15）：**百词斩式对称双主轴**——「每天学几个」与「大约几天学完」双向滑动联动；始终 `天数 × 每日词数 ≥ R`（R=剩余未学）。
> 档位数随 R **动态变密/变疏**；禁止再写死全局仅三档 + 硬顶 20。
> 原型：`utils/plan-targets.js`（`EWPlanTargets`）+ 计划页双滑杆。

#### 输入 / 输出

| 项 | 说明 |
|----|------|
| 输入 R | 剩余未学 = `max(1, 总词数 − learnedCount)` |
| 输出 | `dailyOptions[]`、`dayOptions[]`（升序多档）+ 当前配对 `(daily, days)` |
| 约束 | 任意合法配对满足 `days × daily ≥ R`；两端互相咬合 |
| 边界 | 天软区间约 7～60；每日上限 40；再与 R 取交 |
| 默认 | 目标约 **14 天** → `syncFromDays` 反推每日 |
| 旧值 | `syncFromDaily(旧 dailyTarget)` 吸到最近合法档并重算天数 |

#### 档位密度

`T = clamp(round(3 + log2(R)), 3, 16)`；R<10 走微库 2～3 档。

天数锚点：`7 / 10 / 14 / 21 / 30 / 45 / 60`（落入合法区间者），不足 T 按空隙插值，过多则优先丢掉非锚点。

#### 联动

| 操作 | 行为 |
|------|------|
| 拖每日 | `days = snap(ceil(R/daily))` |
| 拖天数 | `daily = snap(ceil(R/days))` |
| 校准 | 若乘积仍 < R，优先抬天数再抬每日 |

#### 展示与业务联动

| 点 | 规则 |
|----|------|
| UI | 双 range 滑杆，索引映射到档位数组 |
| 预计日期 | `formatDate(days)` |
| 持久化 | 仍只存 `packProgress.dailyTarget`；天数运行时推导 |
| 今日目标 / 改档 | 口径不变（Grill·A：不重置 `todayWordsDone`） |

#### 自测期望（量级）

| R | 每日档数（约） | 说明 |
|---|---------------|------|
| 5 | 2～3 | 微库 |
| 50 | 6～8 | |
| 233 | 8～12 | 亲子整包 |
| 600+ | 12～16 | 触顶 |

> 旧「三档 N/14·N/10·N/7」算法已废弃，勿再实现。源码：`utils/plan-targets.js`。

---

### 3.4 今日学习

**步骤**：初识 intro → 若干 quiz（模式决定组卷）。

**顶栏进度**：`今天 已学/每日目标`（按词库 `todayWordsDone`）；计划已满后显示「今日计划已完成 · 加时 +N」，条满格。

**交互铁律**

1. `quiz-pick`：**选中即提交**（无二次确认）。  
2. 答对：Toast → **自动**进入下一题/下一词（无「下一题」按钮）。  
3. 答错：展示 **答错提示**（旁敲侧击，`feedback` 字段）→ 点「知道了」继续。  
4. intro：`study-next` =「记住了，开始做题」。  
5. **每学完一个词**（该词最后一步结束后）`todayWordsDone +1`；刚达每日目标时弹层（学中唯一「是否继续」）：「先回去」结算后直达情绪词首页并恢复 Tab / 「再学几个」进入加时（此后不加当日计数）。

结束：`finishStudy` 更新词库学会进度与日历；当日条已在逐词结算时写入。

---

### 3.5 学习结果

展示正确率、本组词、今日目标是否达成。按钮：未满额可「继续学习」；满额或词库学完则「回情绪词」等。满额「是否加时」只在学中弹窗决策，结果页不再出现「再学几个」。

离开本页后清空 `studySession`。

---

### 3.6 复习

**入口**：首页任务卡「待复习」数字（>0 时可点 → `/pages/practice/index`）。

**交互**：做错题再练一遍（`review-pick`）。页面底部 **「完全掌握」**：**无二次确认**，一点即将该词 `wrongCount` 清零并移出待复习池，Toast 反馈。

排序与计数：**仅当前在学词库**（`activePackId`）下 `wrongCount > 0` 的词；与首页「待复习」同口径。换库后跟随新库。

---

### 3.7 我

| 区块 | 规则 |
|------|------|
| 资料 | 点进编辑；本机保存 |
| 日历 | **Grill·A**：仅按当前在学词库：当日该库新学 ≥ 该库 `dailyTarget` → 完成；无补卡；与首页今日新学同口径 |
| 我的学习 | 全部 `planConfigured`；排序：当前库优先，再按最近学习；**默认 3 本**，`learn-expand` / `learn-collapse` |
| 关于 | Toast「情绪词 v1.0.0…」 |

书脊横滑可点进计划页；列表行同。

---

### 3.8 资料编辑

头像色 / 昵称 / 展示 ID / 性别 → `save-profile` → 回「我」。

---

## 4. 交互动作速查（开放路径）

| action | 业务含义 |
|--------|----------|
| `pack-detail` | 进学习计划 |
| `continue-study` | 开今日学习批次 |
| `save-plan-start` | 保存计划（可顺带开学） |
| `pick-daily-row` / `pick-mode-tile` / `plan-tab` / `switch-pack` | 改计划 / 换库 |
| `study-next` / `quiz-pick` | 学习流前进 / 答题 |
| `go-library` / `go-emotion` | Tab 跳转 |
| `edit-profile` / `save-profile` / `pick-avatar-open` → 相册或微信头像 | 资料 |
| `cal-prev` / `cal-next` / `cal-pick` | 日历 |
| `learn-expand` / `learn-collapse` | 我的学习折叠 |
| `about-app` | 版本说明 |
| `review-pick` / `go-review` / `review-master` | 复习答题 / 从首页进复习 / 完全掌握移出池 |

调试：`reset-data` / `reset-pack` 代码在，**正式 UI 不挂**；地图页有「重置全部」。

---

## 5. 后台对齐（Grill B1–B11 已落地）

| 开放 | 隐藏（勿删） |
|------|--------------|
| 词库管理：列表 → 详情 → 词条合一页；详情「导入」；词库编辑用封面图上传（无标签/分支/版本/词条文件/即将上线） | 测评配置（菜单已取消，旧路由仍拦截回词库）；旧平级 Tab 重定向 |
| 用户学习概览与明细（无访客占位、无学习会话模块） | 测评结果主视图 |

### 5.1 内容配置路径

```
词库列表 → 词库详情（词条表 + 导入弹窗）
              → 词条编辑（上：词义 · 下：题目列表，卡片内选场景题/释义题）一次保存
```

**数据落点**：见 **§1.1**——后台读写最终进 `ew_admin_draft_v1`；C 端只读 `data/packs/*.json`。

| 能力 | 规则 |
|------|------|
| 词库状态 | 仅 **未上架 / 已上架**（`enabled`）；无「即将上线」 |
| 出题状态 | **未完善 / 已完善**；完善 = 词面+意思+倾向+例句 + 场景题完整≥1 + 释义题完整≥1 |
| 必填标识 | 表单红色 `*`；保存缺项 Toast 分条 + 输入框标红 |
| 多题 | 场景题/释义题均可 N 道；学词/复习按类型 **随机抽 1** |
| 题目配置 | **单一题目列表**；每条卡片选「场景题 / 释义题」；场景题可填配图 URL（不校验格式） |
| 选项配置（编辑页） | 标题「选项配置」；四框+圆点；缺文案/未标正确/缺题目内容不可保存 |
| 导入 | **弹窗**；**统一模板** `词条导入模板.csv`；拖入 CSV（无粘贴）；UTF-8 BOM |
| 导入列 | **题目类型**（场景题/释义题）· **题目内容**（必填）· 选项配置 · 首行带词条基础字段 |
| 导入规则 | 同词面首行建词条；后续行 append 题目；基础字段不可冲突；已有词只追加题 |
| 导入「选项配置」列 | `文案:0\|文案:1\|文案:0\|文案:0`；恰好 4 项、恰好一个 `1`；末尾 `:` 拆标记；文案禁 `\|`；旧「选项1–4/正确答案」报错 |
| quizzes 存储 | `scenario` / `meaning` 可为对象或数组；后台保存写数组 |
| C 端缺题 | 当前学习模式缺主题型（场景/释义）→ 初识后直接下一词，不 fallback 顶替 |

深链隐藏后台路由 → 回词库列表。旧 `#words` / `#quizzes` / `#import` → 重定向。

---

## 6. 关键业务字段

### 6.1 C 端用户状态 · `emotion_words_state_v1`

| 字段 | 含义 |
|------|------|
| `auth.loggedIn` / `auth.userId` | 登录态；`userId` 与 B 端用户主键同一业务字段（服务端签发） |
| `profile` | 本机展示资料（≠ userId） |
| `packProgress[id].planConfigured` | 是否进过计划 → 出现在「我的学习」 |
| `packProgress[id].dailyTarget / learningMode / learnedCount / currentWordIndex` | 计划与进度 |
| `packProgress[id].todayWordsDone` | 该库当日新学数（日历与首页「今日新学」口径） |
| `studyCalendar[YYYY-MM-DD]` | `{ wordsDone, target, completed, packId? }`；完成=新学≥该库目标 |
| `preferences.activePackId` | 首页当前库 |
| `preferences.todayWordsDone` | 当前库 todayWordsDone 的镜像 |
| `studySession` | 进行中批次 |
| `wordProgress[id].wrongCount` | 复习池 |

### 6.2 后台草稿 · `ew_admin_draft_v1`

| 字段 | 含义 |
|------|------|
| `index.packs[]` | 词库元数据草稿（覆盖 `index.json` 同 id） |
| `words[packId][]` | 该库词条+quizzes 全量草稿 |

内容 JSON 契约见 [DATA-SCHEMA.md](./DATA-SCHEMA.md)。

---

## 7. 登录约定（产品规则）

软门禁：可先浏览词库介绍；**开始学习、保存计划、保存资料、进入复习**等写入类动作前须完成微信登录（仅身份：`wx.login` 换票，登录弹窗不索要头像/手机号）。

| 规则 | 说明 |
|------|------|
| 未登录首页 | **空计划态**（无每日目标数字、无假进度）；主 CTA 引导登录后制定计划 |
| 可关闭弹层 | 「暂不登录」后回到空计划；再次触发写入动作可再弹 |
| 登录成功 | **续刚才被拦截的动作**（常进入订计划） |
| 进度归属 | 登录后本机进度绑定到账号；冲突时 v1 以本机为准静默合并 |
| 用户主键 | C 端登录用户与 B 端用户看板使用**同一业务用户 ID**（由服务端根据微信登录凭证签发）。**展示用昵称/展示 ID ≠ 该主键** |
| 换头像 | 编辑资料页**点击头像**上浮 ActionSheet：「从相册选择 / 使用微信头像」；与登录弹窗分离 |
| 失败 | Toast 提示后可重试，不自动连弹 |

清进度不作正式产品能力。接口路径、表名、字段物理类型由后端设计，本文不规定字面量样例 ID。

### 7.1 后台登录门禁 + 管理员账号（Web 运营后台 · A-09/A-10）

进入运营后台先经**登录门禁**；管理员账号在「管理员」页维护。以下为 **Grill 已确认的产品规则**，原型用 `localStorage` 落地，**正式环境须换服务端账号体系**。

**流程（研发对照）**

1. `bootstrap()` / 每次 `render()` 前调用 `AdminAuth.isLoggedIn()` 校验会话；未登录 / 已过期 → 渲染**全屏登录页**，拦截所有后台路由。
2. 登录校验账号存在 + 状态 `active` + 密码匹配 → 写会话（`expireAt = now + 1 天`），移除登录页并继续加载后台。
3. 侧栏底部账号条显示当前登录人昵称/角色 + **退出登录**（清会话并刷新回登录页）。

**账号与权限规则**

| 规则 | 说明 |
|------|------|
| 角色 | `super`（超级管理员）/ `sub`（子账号）。**账号管理仅 super 可做**；sub 进「管理员」页为**只读**，仅能改本人密码 |
| 超级管理员 | **不可删除、不可停用、不可被他人改密**；仅**本人可改密码**（需校验原密码） |
| 子账号（sub） | **不能修改任何人**（含 super 与其他子账号）；仅可**修改本人密码** |
| 新增账号 | 仅 super 可新增，且**只能新增子账号**（`role=sub`），用于后台登录 |
| 账号管理（super） | 对子账号可**停用/启用**、**重置密码**（无需原密码）、**删除**；对 super 一律不可 |
| 会话有效期 | **1 天**（`SESSION_TTL_MS`）；过期或账号被停用/删除后回落登录页 |
| 演示账号 | `admin` / `admin888`（仅原型播种；正式环境删除播种逻辑） |

> **权限落地**：前端三层兜底——`rowActions` 控按钮可见性 + `handleAction` 对管理动作二次拦截 + 各 mutation 内 `requireSuper()`。正式环境须由**服务端**做同等鉴权，前端校验仅为体验，不作为安全边界。

**存储（⚠️ 仅原型）**

| 键 | 内容 |
|----|------|
| `localStorage.ew_admin_accounts_v1` | 账号表（**明文密码，仅演示**） |
| `localStorage.ew_admin_session_v1` | 当前会话 `{ username, loginAt, expireAt }` |

**正式环境替换建议**：账号入库时密码**加盐哈希**（如 bcrypt）；登录由服务端签发 **Token/Session** 并**服务端校验有效期**，前端只持 Token；权限分级（若未来需要）在服务端做 RBAC。原型代码集中在 `admin-prototype/js/admin-auth.js`（含头部落地须知注释），迁移时整体替换该模块即可，`admin.js` 仅通过 `window.AdminAuth` 调用。

---

## 8. 原型打开

1. `打开原型.bat` → `8775`  
2. C 端 `/prototype/index.html`  
3. 地图 `/prototype/map.html`（含**仅原型**调试按钮：重置进度/未登录；**开发勿实现**）  
4. 后台 `/admin-prototype/index.html`

---

## 9. 验收要点

- [ ] 仅 3 Tab；无测评/情景入口  
- [ ] 词库含基础 + 亲子一本；无扩展分区  
- [ ] 未登录为空计划 + 登录 CTA；登录后一体卡 + 单主按钮；待复习可点  
- [ ] 写入类动作前软门禁登录；可关闭弹层再试  
- [ ] 计划双轴；无页内重置  
- [ ] 做题：选中即判 / 对自动下题 / 错有答错提示  
- [ ] 满额只学中弹窗；结果页无「再学几个」  
- [ ] 「我」：资料、日历、学习列表默认 3 + 展示更多  
- [ ] 地图可重置；App 内无重置  
- [ ] 隐藏页深链回首页  
- [ ] 后台：未上架/已上架；未完善/已完善；导入弹窗 + 选项配置  
- [ ] **数据通道**：C 读 GET-JSON + LS-C；B 写 LS-B；C 读不到草稿（见 §1.1）  
- [ ] 红点注释抽屉可开  

功能条目总表：[FEATURE-LIST-v1.0.0.md](./FEATURE-LIST-v1.0.0.md)。

---

## 10. Grill 共识记录

| # | 议题 | 结论 |
|---|------|------|
| 1 | 复习入口 | **A**：首页点「待复习」数字进入；复习页「完全掌握」移出待复习（`wrongCount=0`） |
| 2 | 日历完成口径 | **A**：仅按当前在学词库当日新学 ≥ 该库 `dailyTarget`；不跨库叠加 |
| 3 | 完全掌握确认 | **A**：无确认框，点即生效 + Toast「已移出待复习」 |
| 4 | 待复习范围 | **A**：只算当前在学词库错题；换库后数字/队列跟新库走 |
| 5 | 当天改每日目标 | **A**：保留当日已学数，只改目标并按新目标重算完成态 |
| 6 | 每日档位 / 天数 | **双轴**：多档动态密度 + 天数↔每日联动，`天×日≥R`；默认约 14 天 |

### 后台配置重构（进行中）

| # | 议题 | 结论 |
|---|------|------|
| B1 | 内容主骨架 | **A**：只围绕「词库」；点库→词条列表；导入为按钮；去掉平级「词条/题目/导入」Tab |
| B2 | 词与题编辑 | **A**：同一页上下两块（词义 + 练习），一次保存 |
| B3 | 必填题型 | **A**：必填「看场景选词」+「释义题」；极性/易混等选填；缺省可 fallback 并标缺口 |
| B4 | 导入入口 | **A**：仅词库详情页「导入」按钮；目标库默认为当前库 |
| B5 | 词字段露出 | **A**：默认露出词面/意思/情绪倾向/例句；强度/身体感受/易混/误用等折叠；编号自动生成；全中文标签 |
| B6 | 练一练编辑项 | **A**：只编题干/场景 + 4 选项 + 点选正确答案；无英文键名；解析优先复用词条字段 |
| B7 | 导入内容/模板 | **已冻结**：分题型 CSV；列「选项配置」=`文案:0\|文案:1\|…`；UTF-8 BOM；弹窗拖入 |
| B8 | 词库详情词条列表 | **A**：词面 · 情绪倾向 · 出题状态（已完善/未完善）· 操作 |
| B9 | 多题配置 | **补充**：两类题均可配置**多道**；词页下半块可**新增 / 删除**单题 |
| B10 | 多题如何出题 | **A**：学词时该类型**随机抽 1 道**；**复习同样随机抽** |
| B11 | 实施范围 | **A**：冻结并开工内容配置 IA + C 端抽题 |
| B12 | 选项配置格式 | **A→B→A→C→A→B→C**：单列 `选项配置`；`\|` 分隔；末尾 `:0/:1`；恰好 4+一个1；旧列不兼容；编辑页仍四框；报错分条+标红 |
| B13 | 词库状态 | 仅未上架/已上架；无即将上线 |

### v1.0.1 首次引导与无计划空态（进行中）

| # | 议题 | 结论 |
|---|------|------|
| V1 | 导览形态 | **A**：首次全屏导览；点「知道了」后不再出；与首页无计划空态任务卡分工 |
| V2 | 导览按钮 | **A**：主「去选词库」（记已看→词库 Tab）· 次「知道了」（记已看→首页空态） |
| V3 | 数据状态 | **A**：无计划=`!activePackId`→任务空态；导览关闭=`onboardingDismissed`；有计划不再出导览；重置两边都清 |
| V4 | 触发与形态 | **A**：进「情绪词」Tab / 首次进入时全屏路由导览；文案需打磨；**高亮相关功能区域** |
| V5 | 高亮方式 | **A**：一屏遮罩高亮真实热区（词库 Tab + 任务空态区等）；短标注，不多步向导 |
| V6 | 导览文案 | **B**：主标题用暖心「把感受说得更准一点」；路径作副文；热区短标保留动作导向 |
| V7 | 首页空态文案 | **A**：统一为「还没有学习计划」+ 去选库说明；强调无计划状态 |
| V8 | 实施范围 | **A**：冻结并实现导览+空态；「我」空态/再看一次本轮不做 |

### 进行中 / 已同步

- 亲子词库、计划双轴、学词满额路径、导入弹窗与「选项配置」、词库/出题状态文案：**已进原型**。
- **功能清单 + 数据传输**：FEATURE-LIST 与 HANDOFF §0 / §1.1 已对齐（2026-07-16）。
- 样式注释：右下角**红点序号** → 右侧抽屉；`assets/proto-notes/`。
- 正式「草稿发布到 C」流水线：**未建**（A-07）。
