Skip to content

DunoDoge/FlowCourse

Repository files navigation

FlowCourse / 流课表

一款基于 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
Loading

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
Loading

项目结构

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
Loading
层级 目录 职责
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.ArkData relationalStore) 结构化持久化(事务 + 索引)
  • HDS (HarmonyOS Design System) 组件(HdsNavigation, HdsTabs)
  • 媒体查询 响应式断点布局(AppStorageV2 全局状态共享)
  • Design Tokens Notion 风格统一设计规范
  • reminderAgentManager 代理提醒
  • CalendarKit 系统日历交互
  • ShareKit 系统分享面板
  • @ohos/hypium + @ohos/hamock 单元测试框架

About

Course schedule app on HarmonyOS devices (phone, tablet, 2in1)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors