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)
This commit is contained in:
iven
2026-05-31 20:52:19 +08:00
commit c539e6fd83
285 changed files with 59156 additions and 0 deletions

View File

@@ -0,0 +1,779 @@
# 暖记 (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 工作区模式*