Files
nj/docs/superpowers/specs/2026-05-31-nuanji-warm-notes-design.md
iven c539e6fd83 feat: initialize Nuanji (Warm Notes) project
- Base platform from base.git (ERP base: auth, core, config, message, workflow, plugin)
- Created erp-diary module skeleton (lib.rs, dto.rs, error.rs, event.rs, state.rs)
- Integrated erp-diary into workspace and erp-server
- Added DiaryModule registration in main.rs
- Added DiaryState FromRef in state.rs
- Diary routes mounted (empty routes, ready for implementation)
- Product design spec v1.2 preserved in docs/
- Implementation plan preserved in plans/

Cargo check: OK
Cargo test: OK (78+ base tests passing)
2026-05-31 20:52:19 +08:00

780 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 暖记 (Warm Notes) — 产品设计规格
> **版本**: 1.2
> **日期**: 2026-05-31
> **状态**: Phase 1 待确认
> **平台**: Android / iOS / macOS / Windows / HarmonyOS
> **后端**: HMS ERP 基座 (Rust/Axum) + erp-diary 业务模块
---
## 1. 产品定位
**暖记** 是一款温暖治愈风格的手账日记 app以手写/涂鸦为核心输入方式,覆盖小学到大学全学段用户。
### 1.1 目标用户
| 阶段 | 用户群 | 核心场景 | 优先级 |
|------|--------|----------|--------|
| **Phase 1** | 小学生 (8-12岁, 3-6年级) | 平板+触控笔手写日记、班级分享、老师点评 | ⭐ 核心 |
| **Phase 2** | 中学生 (13-15岁) | 独立创作、心情追踪、好友互动 | 扩展 |
| **Phase 3** | 高中/大学生/年轻人 (16+) | 完整社交、高级模板、数据分析 | 扩展 |
### 1.2 核心价值主张
- **笔迹保真**:保留用户真实手写笔迹,适度去抖但不过度平滑,让日记有温度和个人辨识度
- **手账体验**:贴纸、涂鸦、照片、和纸胶带——不只是在手机上打字,而是一本可以装饰的手账
- **班级连接**:老师布置主题 → 学生写作 → 老师点评,形成写作闭环,培养写作习惯
- **成长记录**:心情追踪、成就徽章、日历回顾,让用户看见自己的变化
### 1.3 双模式设计
App 同时支持两类用户,互不排斥:
- **班级用户**:通过班级码加入,享受班级分享、老师点评功能。以小学生为主。
- **独立用户**:手机号/第三方注册,自由使用全部日记功能,无需加入班级。覆盖中学生到成人。
---
## 2. 角色与权限
### 2.1 三种角色
#### 👩‍🏫 老师
- 创建/管理班级,生成班级码
- 布置日记主题/作业
- 查看班级所有已分享的日记
- 点评 + 文字评语
- 统计班级完成情况
- **不可**查看学生标记为"私密"的日记
#### 👧 学生
- 手写/打字/拍照创建日记
- 装饰日记(贴纸/涂鸦/胶带/照片)
- 选择性分享到班级(每篇日记自主选择公开或私密)
- 查看同学分享的日记
- 收到老师评语通知
- 收集成就徽章
#### 👨‍👩‍👧 家长
- 绑定孩子账号(扫码/短信验证)
- 查看自己孩子的日记(只读)
- 查看老师的评语
- 设置使用时间限制(可选)
- 接收周报/月报
- **不可**查看其他学生日记
- **不可**修改孩子日记内容
### 2.2 权限矩阵
| 操作 | 老师 | 学生 | 家长 |
|------|------|------|------|
| 创建日记 | — | ✅ | — |
| 查看自己孩子的日记 | — | ✅ | ✅ |
| 查看其他学生分享的日记 | ✅ | ✅ | — |
| 查看学生私密日记 | — | 仅自己 | — |
| 布置日记主题 | ✅ | — | — |
| 点评日记 | ✅ | — | — |
| 管理班级成员 | ✅ | — | — |
| 设置使用时间 | — | — | ✅ |
---
## 3. 功能模块
### 3.1 手账编辑器(核心)
**架构**Flutter Stack 层叠
- **Layer 1 — Canvas 手写层**CustomPainter + perfect_freehand
- **Layer 2 — 元素层**Positioned Widgets贴纸/照片/文字/胶带Draggable + 手势缩放旋转
- **Layer 3 — 工具栏**:贴纸面板、模板面板、画笔面板、格式栏、标签面板
**手写引擎**
- perfect_freehand 库实现速度→线宽映射
- 触控笔压感直传PointerEvent.pressure → 线宽/透明度)
- 轻量去抖(仅消除 ±1-2px 设备采样噪声,保留个人笔迹特征)
- Palm rejection触控笔书写时忽略手掌触碰
- 笔画收尾处理保留(起笔/收笔轻重变化是个人风格关键)
**画笔工具**
- 钢笔(细线、压感敏感)
- 铅笔(中等粗细、轻微纹理感)
- 马克笔(宽笔触、半透明叠加)
- 橡皮(区域擦除)
**工具面板**
- 贴纸面板:分类浏览(热门/可爱/植物/天气/节日/手绘/校园)、搜索、拖拽放置
- 模板面板:日/周/月视图模板、学生专属模板
- 画笔面板:工具选择、粗细滑块、颜色选择、透明度(马克笔专属)
- 格式栏:加粗/斜体/下划线、文字颜色、对齐方式
- 标签面板:已选标签、输入新标签、推荐标签
**自动保存**:每次笔画结束或元素变更时增量保存。
### 3.2 日记内容数据模型
```
JournalEntry {
id: String
title: String
date: DateTime
mood: Enum (happy, calm, sad, angry, thinking)
weather: Enum (sunny, cloudy, rainy, snowy, windy)
elements: List<JournalElement> // 有序排列
tags: List<String>
isSharedToClass: Boolean
teacherComment: String?
createdAt: DateTime
updatedAt: DateTime
}
JournalElement {
type: Enum (handwriting, text, sticker, photo, washiTape)
position: Offset
size: Size
rotation: Double
zIndex: Int
// type-specific data:
handwritingData: HandwritingStroke[]? // 矢量点序列
textContent: String?
stickerId: String?
photoPath: String?
washiTapeStyle: String?
}
HandwritingStroke {
points: List<Offset> // 原始坐标
pressures: List<Double> // 压感数据
timestamps: List<Int> // 时间戳(可回放)
color: String
width: Double
toolType: Enum (pen, pencil, marker, eraser)
opacity: Double
}
```
### 3.3 日历系统
- **月视图**7×N 网格,心情色彩标记(心情点),日记标记点
- **周视图**7 天概览,每日卡片展示日记缩略
- **时间轴**:按时间线展示当日日记条目
- **心情概览**:条形图统计本月各心情天数
### 3.4 心情追踪
- 5 种标准化心情:😊开心、😐平静、😢难过、😡生气、🤔思考
- 天气标记:☀️晴、⛅多云、🌧雨、❄️雪、🍃风
- 心情趋势图近7天/30天/3月
- 统计卡片:好心情占比、连续记录天数、天气分布、日记篇数
- 心情洞察:最佳心情日、开心触发因素、月度变化趋势
### 3.5 班级系统Phase 1 新增)
#### 班级功能
- 老师创建班级 → 生成 6 位班级码 → 学生输入加入
- 班级成员列表(老师可管理)
- 班级日记墙(展示所有已分享的日记)
- 老师布置日记主题/作业(带截止时间)
- 老师点评 + 评语通知
#### 分享机制
- 学生写完日记后自主选择:分享到班级 / 保持私密
- 分享后的日记出现在班级日记墙
- 老师可点评任意已分享日记
- 学生收到点评通知
### 3.6 贴纸/模板系统
- 预装基础贴纸包(免费)
- 扩展贴纸包下载(免费 + 付费)
- 分类:热门/可爱/植物/天气/节日/手绘/校园/文字/和纸胶带
- 收藏夹功能
- 模板画廊:日/周/月视图模板、学生专属模板(考试复习/课程表/读书笔记/校园生活)
### 3.7 成就系统
- 连续记录徽章7天/30天/100天
- 百篇日记徽章
- 贴纸达人徽章
- 年度记录徽章
- 解锁条件明确,视觉反馈清晰
### 3.8 搜索系统
- 全文搜索日记内容
- 按标签搜索
- 按心情/天气筛选
- 模板搜索
- 搜索历史 + 热门搜索
### 3.9 个人中心
- 头像 + 昵称 + 签名
- 统计:总日记数、连续天数、本月日记、使用贴纸数
- 成就徽章展示
- 设置:日记提醒、隐私锁、云同步、主题外观、数据导出、反馈、关于
---
## 4. 视觉设计系统
### 4.1 色彩
| Token | 浅色模式 | 深色模式 | 用途 |
|-------|---------|---------|------|
| bg | #FFF8F0 | #1A1614 | 页面背景(奶油白) |
| surface | #FFFFFF | #2A2520 | 卡片/面板背景 |
| fg | #2D2420 | #F0E8DF | 主文字 |
| accent | #E07A5F | #E8907A | 主色调(珊瑚色) |
| secondary | #81B29A | #8FBF9E | 辅助色(鼠尾草绿) |
| tertiary | #F2CC8F | #D4B878 | 第三色(暖金) |
| rose | #D4A5A5 | #C4A0A0 | 玫瑰粉 |
### 4.2 字体
- 显示字体Quicksand / Nunito / SF Pro Rounded
- 正文字体Nunito
- 手写体Caveat / Kalam
- 等宽字体JetBrains Mono
### 4.3 设计要素
- 大圆角体系10px / 16px / 22px / 28px / pill
- 柔和阴影soft / medium / float 三级
- 触摸目标最小 44pxWCAG 2.5.8
- 弹性动画曲线cubic-bezier(0.34, 1.56, 0.64, 1)
- 深色模式完整支持
---
## 5. 技术架构
### 5.1 技术栈
| 层级 | 技术方案 | 选型理由 |
|------|---------|---------|
| UI 框架 | Flutter 3.x | 跨平台、高性能自绘引擎 |
| 状态管理 | flutter_bloc (BLoC) | 复杂交互场景、可测试性强 |
| 本地存储 | Isar | 查询能力 + 全文搜索 + 内置加密 |
| 手写绘制 | CustomPainter + perfect_freehand | 笔迹保真、压感支持、速度→线宽 |
| 图表 | fl_chart | 功能完善、高度自定义 |
| 主题 | ThemeData + ColorScheme | 官方支持、深色模式 |
| 图片处理 | flutter_image_compress | 压缩存储 |
| 路由 | go_router | 声明式路由、深链接支持 |
| 网络 | dio + connectivity_plus | 云同步 + 离线检测 |
| 数据模型 | freezed + json_serializable | 不可变、类型安全 |
| 通知 | flutter_local_notifications | 日记提醒 |
| 权限 | permission_handler | 相机/存储/通知 |
| 导出 | pdf + screenshot + share_plus | 日记导出与分享 |
| 日志 | logger | 调试与错误追踪 |
### 5.2 跨平台策略
- **Android / iOS**Flutter 直接构建Phase 1 首发)
- **macOS / Windows**Flutter 桌面端适配(响应式布局)
- **HarmonyOS**:通过 ohos_flutter 社区方案适配
- **优先级**Android/iOS → macOS/Windows → HarmonyOS
### 5.3 响应式布局
- 手机端(< 600px单列布局底部 TabBar
- 平板端600-1024px双栏布局列表+详情),侧边导航
- 桌面端(> 1024px三栏布局导航+列表+详情/编辑器)
### 5.4 数据架构
**离线优先 + 定时云同步**
- 所有数据优先写入 Isar 本地数据库,离线完全可用
- WiFi 环境下自动增量同步到云端(避免消耗学生流量)
- 同步冲突策略:本地优先 → 云端合并 → 人工提示解决
- 班级分享数据通过云端推送(需网络),本地缓存离线可读
- 素材包:预装基础贴纸 + WiFi 下载扩展包 + 本地缓存管理
---
## 6. 注册与安全
### 6.1 注册流程
**班级用户(小学生)**
1. 方式 A输入老师提供的 6 位班级码 → 设置昵称+头像 → 加入班级 → 首次使用需家长授权
2. 方式 B家长注册 → 为孩子创建子账号 → 绑定班级码
**独立用户(中学/成人)**
1. 手机号 + 验证码注册
2. 第三方登录(微信/Apple/Google
3. 选择年龄段标签
4. 直接使用全部功能
### 6.2 儿童安全
**PIPL 合规(中国个人信息保护法)**
- 未满 14 岁必须取得父母/监护人同意(家长授权弹窗 + 短信/扫码确认)
- 制定专门的儿童个人信息处理规则(单独隐私政策文档)
- 收集信息最小必要(昵称+年级即可,无需真实姓名/身份证)
- 家长有权查阅/更正/删除孩子的个人信息
- 账号注销后 30 天内删除所有数据
**数据安全**
- Isar 内置加密存储(日记内容 AES 加密)
- 云同步 TLS 传输加密
- 照片加密本地存储
**内容安全**
- 敏感词本地词库过滤
- 分享前自动检查
- 老师可审核班级内容
- 家长可查看孩子日记(只读)
---
## 7. Phase 1 页面清单
基于原型稿Phase 1 需实现的屏幕:
### 7.1 直接复用原型稿(需适配小学生内容)
| 页面 | 原型文件 | 调整说明 |
|------|---------|---------|
| 启动页 | splash.html | 保持不变 |
| 引导页 | onboarding.html | 内容调整为小学生向 |
| 首页日记流 | home-daily.html | 移除"考研"等成人内容 |
| 手账编辑器 | editor.html | 强化手写优先 |
| 日历视图 | calendar.html | 保持不变 |
| 周概览 | weekly.html | 保持不变 |
| 月度概览 | monthly.html | 保持不变 |
| 心情追踪 | mood-tracker.html | 保持不变 |
| 贴纸素材库 | stickers.html | 增加校园主题贴纸 |
| 模板画廊 | templates.html | 内容调整为小学生向 |
| 搜索 | search.html | 保持不变 |
| 个人中心 | profile.html | 增加家长关联/班级入口 |
### 7.2 Phase 1 新增页面
| 页面 | 说明 |
|------|------|
| 班级码加入 | 输入班级码 → 设置昵称头像 → 加入班级 |
| 家长授权 | 弹窗 → 家长扫码/短信确认 → 授权完成 |
| 班级主页 | 班级信息、成员列表、日记墙、老师布置的主题 |
| 班级日记墙 | 瀑布流展示同学分享的日记 |
| 老师布置主题 | 老师发布日记主题/作业(带截止时间) |
| 老师点评 | 查看学生分享日记 → 写评语 |
| 家长仪表板 | 查看孩子日记、使用报告、时间设置 |
| 家长关联 | 扫码/短信绑定孩子账号 |
### 7.3 推迟到 Phase 2+
| 页面 | 原型文件 | 说明 |
|------|---------|------|
| 发现页 | discover.html | 社交功能Phase 2 开放给中学生 |
---
## 8. 项目范围总结
### Phase 1 MVP 范围(小学生版)
- ✅ 完整手账编辑器(手写优先)
- ✅ 日历/周/月视图
- ✅ 心情追踪系统
- ✅ 贴纸/模板系统(预装 + 扩展下载)
- ✅ 班级系统(创建/加入/分享/点评)
- ✅ 三角色(老师/学生/家长)
- ✅ 成就系统
- ✅ 搜索系统
- ✅ 儿童安全与家长控制
- ✅ 深色模式
- ✅ Android + iOS 首发
- ❌ 发现页/社交功能Phase 2
- ❌ 达人日记/热门话题Phase 2+
- ❌ 高级数据分析Phase 3
- ❌ macOS/Windows/HarmonyOSPhase 1 后续)
---
## 9. 后端架构 — 基于 HMS ERP 基座
> **核心决策:复用 HMS 健康管理平台的 ERP 基座,以 Feature Flag 工作区模式加载暖记业务模块。**
### 9.1 架构策略Feature Flag 工作区
采用 **单一仓库 + Cargo Workspace + Feature Flag** 模式:
```
hms/ # 一个仓库
├── crates/
│ ├── erp-core/ # L1: 基座 — 事件·错误·trait
│ ├── erp-auth/ # L2: 基座 — 用户·角色·权限·JWT
│ ├── erp-config/ # L2: 基座 — 字典·菜单·设置
│ ├── erp-message/ # L2: 基座 — 消息·通知·推送
│ ├── erp-workflow/ # L2: 基座 — 工作流(可选)
│ ├── erp-plugin/ # L2: 基座 — 插件运行时
│ │
│ ├── erp-diary/ # L2: 暖记业务 — 日记·班级·贴纸·心情
│ │ ├── src/entity/ # ~15 Entity日记·班级·贴纸等
│ │ ├── src/service/ # ~12 Service日记CRUD·同步·班级管理
│ │ ├── src/handler/ # ~10 HandlerREST API
│ │ └── src/event.rs # diary.created / diary.shared 等
│ │
│ ├── erp-health/ # L2: HMS 业务feature flag 控制)
│ ├── erp-ai/ # L2: HMS 业务feature flag 控制)
│ ├── erp-dialysis/ # L2: HMS 业务feature flag 控制)
│ │
│ └── erp-server/ # L3: Axum 入口,按 feature 组装模块
│ └── migration/ # SeaORM 迁移(基座 + 业务)
├── apps/
│ ├── web/ # HMS 管理后台React SPA
│ └── nuanji-api/ # 暖记专用 API 网关(可选)
└── Cargo.toml # Workspace root
```
**Feature Flag 控制**
```toml
# Cargo.toml (workspace)
[workspace]
members = [
"crates/erp-core",
"crates/erp-auth",
"crates/erp-config",
"crates/erp-message",
"crates/erp-workflow",
"crates/erp-plugin",
"crates/erp-diary", # 暖记业务模块
"crates/erp-server",
]
# erp-server/Cargo.toml
[features]
default = ["diary"]
diary = ["erp-diary"]
health = ["erp-health"]
ai = ["erp-ai"]
dialysis = ["erp-dialysis"]
full = ["diary", "health", "ai", "dialysis"]
```
**启动时按 feature 组装模块**
```rust
// erp-server/src/main.rs
fn register_modules() -> Vec<Box<dyn ErpModule>> {
let mut modules: Vec<Box<dyn ErpModule>> = vec![
Box::new(AuthModule),
Box::new(ConfigModule),
Box::new(MessageModule),
];
#[cfg(feature = "diary")]
modules.push(Box::new(DiaryModule));
#[cfg(feature = "health")]
modules.push(Box::new(HealthModule));
modules
}
```
**部署实例**
- `cargo build --features diary` → 暖记后端(不含医疗模块)
- `cargo build --features health,ai` → HMS 后端(不含日记模块)
- `cargo build --features full` → 全功能实例
### 9.2 技术栈(继承 HMS 基座)
| 层级 | 技术方案 | 来源 |
|------|---------|------|
| 后端框架 | Axum 0.8 (Rust) | HMS 基座继承 |
| ORM | SeaORM 1.1 | HMS 基座继承 |
| 数据库 | PostgreSQL 16 | HMS 基座继承 |
| 缓存 | Redis 7 | HMS 基座继承 |
| 认证 | JWT + Argon2 + RBAC | HMS 基座继承(扩展角色) |
| 加密 | AES-256-GCM + KEK/DEK | HMS 基座继承 |
| 事件 | EventBus + Outbox | HMS 基座继承 |
| 文件存储 | 阿里云 OSS / 腾讯云 COS | 新增(贴纸/照片) |
| 推送 | 极光推送 / 个推 | 新增(老师点评通知) |
| 短信 | 阿里云短信 | HMS 基座继承 |
| CDN | 阿里云 CDN | 新增(贴纸包分发) |
| API 文档 | utoipa (OpenAPI) | HMS 基座继承 |
> **数据本地化**儿童个人信息必须存储在中国境内服务器。HMS 已支持多租户 + 租户独立加密密钥。
### 9.3 基座继承能力 vs 新增开发
| 能力 | 来源 | 工作量 |
|------|------|--------|
| 用户/角色/权限 CRUD | erp-auth 继承 | ✅ 零开发 |
| JWT 认证 + Token 轮换 | erp-auth 继承 | ✅ 零开发 |
| RBAC 权限码守卫 | erp-auth 继承 | ✅ 零开发 |
| 组织/部门/岗位 | erp-auth 继承 | ✅ 零开发 |
| 事件总线 + Outbox | erp-core 继承 | ✅ 零开发 |
| 字典/菜单/设置 | erp-config 继承 | ✅ 零开发 |
| 消息/通知/模板 | erp-message 继承 | ✅ 零开发 |
| PII 加密 + 盲索引 | erp-core 继承 | ✅ 零开发 |
| 审计日志 | erp-core 继承 | ✅ 零开发 |
| 多租户隔离 | erp-core 继承 | ✅ 零开发 |
| SeaORM 迁移框架 | erp-server 继承 | ✅ 零开发 |
| OpenAPI 文档生成 | utoipa 继承 | ✅ 零开发 |
| 测试框架 | HMS 基座继承 | ✅ 零开发 |
| student/teacher/parent 角色 | erp-auth 扩展 | 🆕 ~200 行 |
| 班级码认证 | erp-auth 扩展 | 🆕 ~500 行 |
| 家长扫码绑定 | 新增 service | 🆕 ~400 行 |
| 日记 CRUD + 同步 | erp-diary 新增 | 🆕 ~2000 行 |
| 班级管理 | erp-diary 新增 | 🆕 ~800 行 |
| 贴纸/模板管理 | erp-diary 新增 | 🆕 ~600 行 |
| 心情/统计 API | erp-diary 新增 | 🆕 ~500 行 |
| 内容安全过滤 | erp-diary 新增 | 🆕 ~300 行 |
| 文件上传(照片/贴纸) | 参考健康模块 | 🆕 ~500 行 |
| **合计新增** | | **~5800 行 Rust** |
### 9.4 核心后端模块erp-diary
1. **日记服务**:日记 CRUD、元素管理、增量同步、版本号冲突检测、软删除
2. **手写数据服务**:笔画矢量存储、按需加载(大字段独立表)、导出为图片
3. **班级服务**:创建班级、生成班级码、成员管理、班级码安全(有效期+次数限制+锁定)
4. **主题布置服务**:老师发布/管理日记主题、学生提交关联、完成度统计
5. **点评服务**:老师评语、通知推送(继承 erp-message
6. **家长绑定服务**:扫码/短信验证、绑定关系管理、只读权限控制
7. **素材服务**贴纸包管理、下载统计、Phase 1 全免费
8. **心情统计服务**:心情趋势、统计卡片、洞察分析
9. **内容安全服务**:敏感词过滤(含谐音/拼音变体检测)、图片安全标注
10. **成就服务**:成就规则引擎、徽章解锁、通知
### 9.5 基座优化同步策略
由于所有项目共享一个仓库:
- 基座层的 Bug 修复或优化只提交一次
- 所有 feature 配置的构建自动受益
- CI 按矩阵运行:`--features diary` + `--features health` 等组合
- 迁移文件统一管理,按序号递增(暖记迁移从 m000166 开始)
---
## 10. 完整数据模型(评审补充)
### 10.1 用户与角色
```
User {
id: String (UUID)
role: Enum (teacher, student, parent, independent)
nickname: String
avatarUrl: String?
phone: String? // 独立用户/家长/老师必须有
gradeLevel: Int? // 学生年级 (1-6)
ageGroup: String? // 独立用户年龄段标签
parentAuthorized: Boolean // 未满14岁需家长授权
createdAt: DateTime
settings: UserSettings
}
UserSettings {
theme: Enum (light, dark, system)
reminderEnabled: Boolean
reminderTime: String // "21:00"
privacyLockEnabled: Boolean
syncOnWifiOnly: Boolean
language: String // "zh-CN"
}
TeacherProfile {
userId: String
schoolName: String?
verificationStatus: Enum (pending, verified, rejected)
// 老师身份验证:教师证上传 或 学校邮箱验证
}
ParentChildBinding {
id: String
parentId: String
childId: String
verificationMethod: Enum (qrcode, sms)
status: Enum (active, revoked)
createdAt: DateTime
}
```
### 10.2 班级
```
Class {
id: String
name: String // "三年级2班"
schoolName: String?
teacherId: String // 创建者/班主任
classCode: String // 6位字母数字混合安全性优于纯数字
codeExpiresAt: DateTime? // 班级码有效期(学期结束自动失效)
codeMaxUses: Int? // 班级码最大使用次数
memberCount: Int
createdAt: DateTime
isActive: Boolean // 学期结束后可归档
}
ClassMember {
classId: String
userId: String
role: Enum (teacher, student)
joinedAt: DateTime
isActive: Boolean
}
```
### 10.3 日记(完整模型)
```
JournalEntry {
id: String (UUID)
authorId: String // 明确谁写的
classId: String? // 所属班级(可选)
title: String
date: DateTime
mood: Enum (happy, calm, sad, angry, thinking)
weather: Enum (sunny, cloudy, rainy, snowy, windy)
elements: List<JournalElement>
tags: List<String>
// 分享状态
isPrivate: Boolean // true = 仅自己可见
sharedToClass: Boolean // 是否已分享到班级
sharedAt: DateTime? // 分享时间
assignedTopicId: String? // 关联老师布置的主题
// 元数据
version: Int // 版本号(同步冲突检测)
createdAt: DateTime
updatedAt: DateTime
deletedAt: DateTime? // 软删除
}
```
### 10.4 主题布置与点评
```
TopicAssignment {
id: String
classId: String
teacherId: String
title: String // "今天我观察了..."
description: String?
deadline: DateTime?
createdAt: DateTime
isActive: Boolean
}
Comment {
id: String
journalEntryId: String
authorId: String // 点评者(老师)
content: String
createdAt: DateTime
}
```
### 10.5 素材与成就
```
StickerPack {
id: String
name: String
category: String
stickerCount: Int
price: Decimal // 0 = 免费
downloadUrl: String
version: Int
}
Achievement {
id: String
name: String
description: String
iconEmoji: String
condition: String // "streak_days >= 7"
}
UserAchievement {
userId: String
achievementId: String
earnedAt: DateTime
}
```
---
## 11. 安全与合规补充(评审补充)
### 11.1 老师注册流程
1. 下载 app → 选择"我是老师"
2. 注册:手机号 + 验证码
3. 身份验证(二选一):
- **方式 A**:上传教师证照片 → 人工审核1-3工作日
- **方式 B**:学校教育邮箱验证(.edu.cn 后缀)
4. 审核通过后可创建班级
### 11.2 PIPL 合规补充
- **监护人可验证性**:家长需提供手机号(运营商实名)+ 短信验证码确认身份
- **儿童个人信息影响评估**:上线前完成《个人信息保护影响评估报告》
- **数据本地化**:所有服务器部署在中国境内(阿里云/腾讯云)
- **家长数据管理权**:家长仪表板提供导出/更正/删除孩子数据功能
- **儿童隐私政策**:使用通俗易懂的语言编写,配有图示说明
- **账号注销**:注销后 30 天内删除所有关联数据
### 11.3 班级码安全机制
- 6 位字母数字混合62^6 ≈ 568 亿种组合)
- 班级码有效期(默认学期结束自动失效)
- 老师可随时重置班级码
- 连续 5 次输入错误后锁定 30 分钟
- 可选开启"加入需老师审批"模式
### 11.4 Phase 1 贴纸付费策略
- **Phase 1 全部免费**:避免儿童支付合规问题
- 预装 3-5 个基础贴纸包
- 限时活动赠送主题贴纸包
- **Phase 2** 再引入付费机制(家长代付)
### 11.5 内容安全方案
- **文字**:本地敏感词库 + 服务端 AI 内容检测(含谐音/拼音变体)
- **图片**:服务端 AI 安全标注(检测不当图片)
- **分享审核**:可配置"老师审核后才能分享到班级"
- **举报机制**:学生/老师可举报不当内容
---
## 12. 字体与中文化补充(评审补充)
### 12.1 中文字体方案
| 用途 | 浅色字体 | 回退方案 |
|------|---------|---------|
| 显示字体 | 思源黑体 (Noto Sans SC) / 阿里巴巴普惠体 | PingFang SC (iOS) / 系统默认 |
| 正文 | Noto Sans SC / 系统默认 | 各平台系统字体 |
| 手写风格 | 漫漫字 / 手写体 | Caveat (英文手写部分) |
> Flutter 可通过 Google Fonts 加载 Noto Sans SC确保中文排版美观一致。
### 12.2 perfect_freehand 技术确认
`perfect_freehand` 有 Dart/Flutter 原生移植版本(`perfect_freehand` pub.dev 包),可直接在 Flutter 中使用,无需 JS interop。
---
## 13. 性能目标(评审补充)
| 指标 | 目标值 |
|------|--------|
| App 冷启动 | < 2 秒 |
| 日记列表滚动 | 60fps 稳定 |
| 手写延迟 | < 16ms触控到渲染 |
| 照片压缩后质量 | ≥ 85% SSIM |
| 单篇日记本地存储 | < 5MB含照片 |
| 本地数据库上限 | 500MB超限提示清理 |
| 云同步单次数据量 | < 10MB |
| 贴纸包大小 | < 5MB/包 |
---
*本文档为暖记 (Warm Notes) Phase 1 产品设计规格,基于原型稿分析与头脑风暴讨论整理。*
*评审版本v1.1 — 补充后端架构、完整数据模型、安全合规、性能目标*
*v1.2 — 后端架构从 NestJS 方案替换为 HMS ERP 基座 (Rust/Axum) + Feature Flag 工作区模式*