Files
MookNote/Wiki/Architecture.md
DelLevin-Home ea7381d0bc 添加wiki
2026-06-03 18:42:32 +08:00

95 lines
4.4 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.
# 整体架构
## 分层架构
```
┌─────────────────────────────────────────────┐
│ Pages (UI) │ lib/pages/
│ home_page, movie_tab_page, book_tab_page, │
│ note_tab_page, detail/form/share pages... │
├─────────────────────────────────────────────┤
│ Widgets (共享组件) │ lib/widgets/
│ list_items, star_rating, drawer, bottom_nav │
├─────────────────────────────────────────────┤
│ Providers (状态管理) │ lib/providers/
│ AppProvider │
├─────────────────────────────────────────────┤
│ Utils (业务逻辑) │ lib/utils/
│ DAO层 │ 同步服务 │ 图片管理 │ 主题 │ 偏好设置 │
├─────────────────────────────────────────────┤
│ Models (数据模型) │ lib/models/
│ Movie │ Book │ Note │ Reviews │ Posters... │
├─────────────────────────────────────────────┤
│ Database (SQLite) │ lib/utils/database_helper.dart
│ sqflite │
└─────────────────────────────────────────────┘
```
## 目录职责
### lib/models/
数据模型定义,所有模型集中在 `data_models.dart` 中:`Movie``Book``Note``MovieReview``BookReview``MoviePoster``BookExcerpt`。每个模型提供 `fromJson` / `toJson` / `copyWith` 方法。
### lib/providers/
全局状态管理,仅 `AppProvider`ChangeNotifier一个文件。管理所有数据列表、UI 状态、CRUD 操作。
### lib/utils/
业务逻辑层:
- `database_helper.dart` — SQLite 数据库单例(版本 13
- `movie/``book/``note/` — 各实体 DAO
- `tag/tag_dao.dart` — 标签管理
- `sync/` — 同步服务ServerSyncService、ServerDataService、WebDAV、AutoBackup
- `theme/app_theme.dart` — 主题定义
- `user_prefs.dart` — SharedPreferences 包装
- `image_path_helper.dart` — 图片路径管理
- `app_router.dart` — 路由生成器
### lib/pages/
UI 页面,按功能域组织:
- `movies/` — 影视相关(列表、详情、表单、影评、海报墙、分享、豆瓣 WebView
- `book/` — 书籍相关(列表、详情、表单、书评、摘抄、分享)
- `note/` — 笔记相关(列表、详情、表单、分享)
- `sync/` — 同步页面备份、云同步、服务端同步、WebDAV
- `markdown_reader/` — Markdown 阅读器
### lib/widgets/
共享可复用 Widget列表项、星级评分、抽屉菜单、底部导航、骨架屏等。
## 启动流程
`main.dart` 中的初始化顺序:
```
1. WidgetsFlutterBinding.ensureInitialized()
2. UserPrefs.init() ← SharedPreferences 初始化
3. AppProvider() ← 创建全局状态
4. runApp(MyApp) ← 启动 UI
5. (异步) _validateSyncOnStartup() ← 校验同步激活码
6. (异步) appProvider.initDatabase() ← 加载数据(本地或远程)
7. (异步) appProvider.initMainTabIndex() ← 恢复用户默认标签
8. (异步) _initAutoBackup() ← 启动自动备份(如已启用)
9. (异步) _initUsageStats() ← 启动用户统计上报
```
步骤 5-9 均为 `unawaited`,不阻塞 UI 渲染。
## 本地/远程双模式
`AppProvider._useRemote` 决定数据来源:
```dart
bool get _useRemote {
final prefs = UserPrefs();
return prefs.syncEnabled &&
prefs.syncServerUrl.isNotEmpty &&
prefs.syncActivationCode.isNotEmpty &&
ServerDataService.instance.isAvailable;
}
```
所有 DAO 方法(增删改查)在 `AppProvider` 中都有双路径:
- `_useRemote == true` → 调用 `ServerDataService`HTTP API
- `_useRemote == false` → 调用本地 DAOSQLite
[返回首页](Home.md)