一款基于 HarmonyOS NEXT 的课程表应用,采用 MVVM 架构模式,支持多设备适配、多课表管理、桌面卡片、深色模式、教务系统导入、系统日历导出、备份恢复、课程提醒、应用接续等功能。
| 项目 | 值 |
|---|---|
| 包名 | com.dunodoge.flowcourse |
| 版本 | 1.6.0 |
| 目标平台 | HarmonyOS NEXT (API 23, SDK 6.1.0) |
| 应用模型 | Stage 模型 |
| 目标设备 | phone, tablet, 2in1, wearable, tv |
| 数据存储 | 关系型数据库 (RDB, flowcourse.db) |
| 代码混淆 | 已禁用(debug / release 均关闭) |
- 多设备适配 — 响应式三断点布局(sm/md/lg),大屏侧边栏导航 + 右侧详情面板,小屏悬浮页签导航,自动适配手机/平板/2in1/PC
- 多课表管理 — 支持创建、切换、独立管理多个课表,数据按课表 ID 隔离
- 周视图 & 日视图 — 课表页面以周视图展示课程网格,清单页面以日视图展示当日课程列表
- 桌面卡片 — 提供五种尺寸的桌面卡片(2×2 日视图、2×4 日视图、4×4 周视图、6×4 周视图、2×2 添加课程快捷入口),实时同步课程数据
- 深色模式 — 全面适配系统深色/浅色模式,卡片在任意场景下实时响应切换
- 主题配色 — 内置蔚蓝、珊瑚、翠绿、暖橙、雅紫、青碧六种 Notion 风格柔和配色方案
- 教务系统导入 — 支持从正方教务、HUB 等教务系统导入课表数据
- 系统日历导出 — 将课程导出到系统日历
- 备份与恢复 — 支持全量数据导出/导入,恢复时可选择覆盖当前课表或新建课表
- 课表分享 — 支持文件分享和口令分享(Base64 编码),好友可通过口令一键导入课表
- 课程提醒 — 三级提醒配置(全局 → 课程级 → 时间段级),支持代理提醒(最多 30 条)
- 自定义背景 — 支持从相册选择背景图片,课表页和清单页均可显示自定义背景
- 应用接续 — 支持跨设备接续,保存当前页签、周次、日期、课表、主题方案、编辑草稿等 UI 状态
- 无障碍 — 颜色对比度符合 WCAG AA 标准,确保视觉可读性
- Notion 风格设计系统 — 统一的设计 Token 体系(颜色、排版、间距、圆角、阴影、尺寸),课程卡片采用 pastel 色板 + 浅色背景双层配色
- 沉浸式全屏 — 透明状态栏与导航栏,内容延伸至系统栏区域
- 国际化 — 支持简体中文与英文,180+ 条字符串资源完整翻译
- 关系型数据库 — 基于 RDB 的结构化存储(8 张表 + 索引),支持事务保证;自动从旧版 Preferences 平滑迁移
- 单元测试覆盖 — 9 个测试套件覆盖 Repository、Parser、DateUtils、ColorUtils、BackupHelper 等核心模块
- 模块化重构 — 主框架与设置页对话框已拆分为 22 个独立组件(
view/components/mainframe/× 7 +view/components/minepage/× 15),MainFrame 主体精简至约 540 行
基于媒体查询的三断点响应式布局:
| 断点 | 宽度范围 | 导航方式 | 布局特征 |
|---|---|---|---|
| sm | < 600vp | 悬浮页签栏(底部) | 单栏全屏内容 |
| md | 600–840vp | 悬浮页签栏(底部) | 单栏全屏内容 |
| lg | ≥ 840vp | 侧边栏导航 | 左侧导航 + 主内容 + 右侧详情面板 |
lg 断点布局 (≥ 840vp):
graph LR
subgraph LG["lg 断点 — 三栏布局"]
direction LR
subgraph Sidebar["侧边栏"]
N1["清单"]
N2["课表"]
N3["我的"]
Sep["|"]
N4["添加课程"]
N5["添加待办"]
end
subgraph MainLg["主内容区"]
ML["HdsNavigation + HdsTabs<br/>(页签栏隐藏)"]
end
subgraph Detail["右侧详情面板"]
DL["月历 / 课程详情"]
end
end
Sidebar --- MainLg --- Detail
sm/md 断点布局 (< 840vp):
graph TB
subgraph SM["sm/md 断点 — 单栏布局"]
direction TB
subgraph MainSm["主内容区"]
MS["HdsNavigation + HdsTabs<br/>(悬浮页签栏可见)"]
end
subgraph Tabs["悬浮页签栏"]
T["清单 · 课表 · 我的"]
end
end
MainSm --> Tabs
entry/src/main/
├── ets/
│ ├── entryability/ # 应用入口
│ │ └── EntryAbility.ets # UIAbility:生命周期、权限、主题初始化、卡片跳转路由、沉浸式全屏、应用接续
│ ├── entrybackupability/ # 备份扩展
│ │ └── EntryBackupAbility.ets
│ ├── courseformability/ # 桌面卡片 Ability
│ │ └── CourseFormAbility.ets # FormExtensionAbility:卡片数据提供与更新、深色模式响应
│ ├── model/ # 数据模型层
│ │ ├── CourseModel.ets # 核心数据模型(ScheduleModel、CourseModel、CourseTimeSlot、ReminderConfig)
│ │ ├── CourseRepository.ets # 数据仓库(RDB 持久化、课程 CRUD、卡片数据生成、备份序列化、Preferences 迁移)
│ │ ├── RdbHelper.ets # RDB 单例管理(建表/索引、事务初始化)
│ │ ├── ClassTimeConfig.ets # 作息时间配置模型与模板
│ │ ├── SemesterConfig.ets # 学期配置
│ │ ├── ReminderRepository.ets # 提醒配置 RDB 持久化
│ │ └── EduSystemConfig.ets # 教务系统配置与预设学校
│ ├── viewmodel/ # 业务逻辑层
│ │ ├── CourseViewModel.ets # 视图状态管理(@ObservedV2 @Trace 响应式、@Computed 计算属性)
│ │ ├── CourseService.ets # 课程服务(数据变更 + 自动卡片刷新)
│ │ ├── CourseQueryService.ets # 课程查询服务(周次过滤、冲突检测、时间范围计算)
│ │ ├── ScheduleService.ets # 课表管理服务(CRUD、切换、数据隔离)
│ │ ├── ScheduleParser.ets # 课表数据解析器(周次/节次文本解析)
│ │ ├── TemplateService.ets # 作息模板服务(模板管理、默认模板、模板与课表关联)
│ │ └── ReminderService.ets # 提醒服务(代理提醒发布/取消/同步)
│ ├── view/ # UI 视图层
│ │ ├── pages/
│ │ │ ├── MainFrame.ets # 主框架(响应式三断点导航编排,重构后约 540 行)
│ │ │ ├── SchedulePage.ets # 课表页(周视图 + 右侧详情面板 + 自定义背景)
│ │ │ ├── ChecklistPage.ets # 清单页(日视图 + 月历选择器 + 课程/待办双模式)
│ │ │ ├── MinePage.ets # 设置页(主题、提醒、备份恢复、日历导出等)
│ │ │ ├── CourseEditPage.ets # 课程编辑页
│ │ │ └── EduSystemImportPage.ets # 教务系统导入页
│ │ └── components/
│ │ ├── WeekView.ets # 周视图组件
│ │ ├── DayView.ets # 日视图组件
│ │ ├── RightDetailPanel.ets # 右侧详情面板(月历/课程详情,大屏专用)
│ │ ├── CalendarDayCell.ets # 日历单元格
│ │ ├── MonthCalendarPicker.ets # 月历选择器
│ │ ├── WeekPickerDialog.ets # 周选择对话框
│ │ ├── ScheduleSettingsComponents.ets # 课表设置组件
│ │ ├── mainframe/ # 主框架拆分组件(7 个)
│ │ │ ├── MainSidebar.ets # 大屏侧边栏导航
│ │ │ ├── MainTabsArea.ets # 主内容区与页签
│ │ │ ├── MonthCalendarOverlay.ets # 月历浮层
│ │ │ ├── MoreMenuOverlay.ets # 更多菜单浮层
│ │ │ ├── ScheduleSwitcherOverlay.ets # 课表切换浮层
│ │ │ ├── BackupDialogs.ets # 备份/恢复/导出对话框集合
│ │ │ └── BackupRestoreActions.ets # 备份/恢复操作辅助
│ │ └── minepage/ # 设置页拆分对话框组件(15 个)
│ │ ├── SettingsSection.ets / SettingsItem.ets # 通用设置项容器
│ │ ├── AboutDialog.ets / ShareChoiceDialog.ets / ShareTokenDialog.ets
│ │ ├── ThemeColorPickerDialog.ets / BackgroundSettingsDialog.ets
│ │ ├── ReminderSettingsDialog.ets
│ │ ├── ScheduleManagerDialog.ets / NewScheduleDialog.ets
│ │ ├── TemplateManagerDialog.ets / NewTemplateDialog.ets / RenameTemplateDialog.ets
│ │ └── ClassTimeEditDialog.ets / TimeEditDialog.ets
│ ├── common/ # 公共工具层
│ │ ├── Constants.ets # 常量定义(颜色资源、布局常量、默认作息、课程颜色、接续 Key)
│ │ ├── DesignTokens.ets # Notion 风格设计 Token 系统(颜色、排版、间距、圆角、阴影、尺寸)
│ │ ├── BreakpointConstants.ets # 断点常量与状态管理(BreakpointState、BreakpointType<T>)
│ │ ├── BreakpointUtils.ets # 断点工具(媒体查询监听、全局状态同步)
│ │ ├── DateUtils.ets # 日期工具(周次计算、日历构建、当前节次判断)
│ │ ├── TimeUtils.ets # 时间工具(HH:mm 与分钟数互转、偏移计算)
│ │ ├── ColorUtils.ets # 颜色工具(透明度计算)
│ │ ├── ThemeColors.ets # 主题颜色管理(6 种配色方案、ThemeState 全局响应式)
│ │ ├── WidgetRefreshHelper.ets # 卡片刷新辅助 + 共享数据构建函数
│ │ ├── BackupHelper.ets # 备份/恢复工具(文件导出/导入、数据校验)
│ │ ├── CalendarHelper.ets # 系统日历交互工具(创建日历、导出课程事件)
│ │ ├── ShareHelper.ets # 分享工具(文件分享、口令编解码、系统分享面板)
│ │ ├── BackgroundHelper.ets # 背景图片管理(选择、保存、恢复、清理)
│ │ └── EduSystemAdapters.ets # 教务系统适配器(正方教务、HUB)
│ ├── widget/ # 桌面卡片 UI
│ │ ├── common/
│ │ │ └── WidgetUtils.ets # 卡片共享工具(主题色映射、颜色透明度计算)
│ │ └── pages/
│ │ ├── DayViewWidget2x2.ets # 2×2 日视图卡片
│ │ ├── DayViewWidget2x4.ets # 2×4 日视图卡片(过滤已结束课程)
│ │ ├── WeekViewWidget4x4.ets # 4×4 周视图卡片
│ │ ├── WeekViewWidget6x4.ets # 6×4 周视图卡片
│ │ └── AddCourseWidget2x2.ets # 2×2 添加课程快捷卡片
│ └── pages/
│ ├── Index.ets # 入口页面(初始化、接续恢复)
│ ├── CourseEditPage.ets # 课程编辑页(路由页面)
│ └── EduSystemImportPage.ets # 教务系统导入页(路由页面)
├── resources/
│ ├── base/
│ │ ├── element/
│ │ │ ├── string.json # 字符串资源(默认/回退)
│ │ │ ├── color.json # 颜色资源(浅色模式)
│ │ │ └── float.json # 浮点数资源
│ │ ├── profile/
│ │ │ ├── form_config.json # 桌面卡片配置(5 种卡片定义)
│ │ │ ├── main_pages.json # 页面路由配置
│ │ │ └── backup_config.json # 备份配置
│ │ └── media/ # 图标资源
│ ├── en_US/
│ │ └── element/
│ │ └── string.json # 英文字符串资源
│ ├── zh_CN/
│ │ └── element/
│ │ └── string.json # 简体中文字符串资源
│ └── dark/
│ └── element/
│ └── color.json # 颜色资源(深色模式)
└── module.json5 # 模块配置(权限、Ability 注册)
项目采用 MVVM(Model-View-ViewModel) 架构模式,分为六个核心层级:
flowchart TD
EA["Ability 层<br>生命周期 · 权限 · 主题 · 卡片路由 · 应用接续"]
EA --> IDX["Index<br>数据初始化 · 接续恢复"]
IDX --> MF["View 层 — MainFrame<br>响应式三断点导航"]
MF --> CVM["ViewModel 层 — CourseViewModel<br>@ObservedV2 视图状态管理"]
CVM --> CS["CourseService"]
CVM --> SS["ScheduleService"]
CVM --> TS["TemplateService"]
CVM --> RS["ReminderService"]
CVM --> CQS["CourseQueryService"]
CS --> CR["Model 层 — CourseRepository<br>RDB 持久化(事务)"]
CS --> WRH["WidgetRefreshHelper"]
CR --> RDB["RdbHelper<br>flowcourse.db"]
CR --> CFA["Widget 层 — CourseFormAbility"]
DT["Common 层 — DesignTokens · ThemeColors · BreakpointUtils"]
DT -.-> MF
| 层级 | 目录 | 职责 |
|---|---|---|
| Ability | entryability/ courseformability/ entrybackupability/ |
应用入口与卡片入口,管理生命周期、权限请求、主题初始化、卡片跳转路由、沉浸式全屏、应用接续、备份扩展 |
| View | view/pages/ view/components/ |
UI 渲染与用户交互,使用 ArkUI 声明式组件(@ComponentV2) |
| ViewModel | viewmodel/ |
业务逻辑编排与视图状态管理(@ObservedV2 + @Trace 响应式),组合子服务实现职责分离 |
| Model | model/ |
数据模型定义与 RDB 持久化(关系型数据库 flowcourse.db),课程数据按课表 ID 隔离,支持事务保证与 Preferences 自动迁移 |
| Common | common/ |
通用工具、常量、设计 Token、断点管理、辅助类 |
| Widget | widget/pages/ |
桌面卡片 UI(运行在受限的 Form 上下文中,通过 @LocalStorageProp 接收数据) |
各层详细 API 文档、数据模型属性表、子服务方法表、核心数据流时序图、依赖关系图、权限清单等请参阅 CODE_WIKI。
- HarmonyOS NEXT (API 23, SDK 6.1.0)
- ArkTS + ArkUI 声明式开发范式(@ComponentV2 + @ObservedV2)
- Stage 模型
- Form Kit 桌面卡片(FormExtensionAbility)
- 关系型数据库 (
@kit.ArkDatarelationalStore) 结构化持久化(事务 + 索引) - HDS (HarmonyOS Design System) 组件(HdsNavigation, HdsTabs)
- 媒体查询 响应式断点布局(AppStorageV2 全局状态共享)
- Design Tokens Notion 风格统一设计规范
- reminderAgentManager 代理提醒
- CalendarKit 系统日历交互
- ShareKit 系统分享面板
- @ohos/hypium + @ohos/hamock 单元测试框架