# 软构大作业 **Repository Path**: wsd10/soft-structure-homework ## Basic Information - **Project Name**: 软构大作业 - **Description**: 软件构造基础11小组大作业仓库 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-09 - **Last Updated**: 2025-06-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 课表管理应用程序 ## 1. 项目简介 本项目是一个基于 C# WinForms 开发的桌面课程表管理应用程序。用户可以通过本应用方便地管理自己的课程安排,支持从武汉大学教务系统导入课程、手动添加、编辑、删除课程,并能在课程开始前获得提醒。此外,还支持将课表导出为 CSV 和 PDF 文件。 ## 2. 主要功能 - **课程表可视化**:以周视图直观展示每日课程安排,动态调整布局。 - **课程管理 (CRUD)**: - 手动添加新课程。 - 编辑现有课程信息。 - 删除不再需要的课程。 - 查看课程详细信息。 - **从教务系统导入**: - 内置浏览器模块,方便用户登录武汉大学教务系统。 - 自动解析教务系统课表 HTML,导入课程数据。 - **课程导出**: - 将当前课表导出为 CSV 文件。 - 将当前课表导出为 PDF 文件 (使用 QuestPDF 库)。 - **上课提醒**: - 在课程开始前(默认提前 30 分钟和 15 分钟)弹出自定义提醒窗口。 - 提醒内容包括课程名称、时间、地点、教师等。 - **课程颜色标记**: - 为不同课程自动或手动分配不同颜色,便于区分。 - 同名课程将自动使用相同颜色。 - **数据持久化**: - 使用 SQLite 本地数据库存储课程信息。 ## 3. 技术栈 - **语言**: C# - **框架**: .NET Framework - **数据库**: SQLite - **HTML 解析**: HtmlAgilityPack - **PDF 生成**: QuestPDF - **开发环境**: Visual Studio ## 4. 核心组件说明 - **`Form1.cs` (主窗体)** - 应用程序的主界面,负责展示课程表网格。 - 处理用户交互,如选择周次、点击课程格进行编辑/删除、点击空白格添加课程。 - 动态绘制课程表 UI,包括时间表头、日期表头和课程块。 - 调用 `Course_CRUD_Service` 进行课程数据的获取和操作。 - **`CourseEntity.cs` (课程实体)** - 定义了课程的数据模型,包含 ID、名称、教师、地点、学分、起止周、星期、起止节次、颜色等属性。 - **`SQLiteHelper.cs` (数据库辅助类)** - 负责 SQLite 数据库的连接管理。 - 提供数据库初始化方法 (`InitializeDatabase`),在首次运行时创建 `Courses` 表。 - 表结构定义了课程的各个字段及其约束。 - **`CourseRepository.cs` (课程仓库)** - 实现了 `ICourseRepository` 接口。 - 封装了对 `Courses` 表的直接数据库操作,包括增 (Create)、删 (Delete)、改 (Update)、查 (GetAll, GetById, GetCoursesByWeek, GetCoursesByWeekday, GetTodayCourses 等)。 - 使用 `SqliteCommand` 执行 SQL 语句。 - **`Course_CRUD_Service.cs` (课程业务逻辑服务)** - 处理课程相关的业务逻辑和数据验证。 - 调用 `CourseRepository` 执行实际的数据库操作。 - 包含添加、修改、删除课程时的验证逻辑(如字段非空、时间冲突检查)。 - 管理课程名称与颜色的映射关系,确保同名课程颜色一致。 - 提供 `OperationResult` 作为方法返回值,封装操作成功与否及相关数据或错误信息。 - **`ImportForm.cs` (导入导出窗体)** - 提供从武汉大学教务系统导入课程的功能。 - 内嵌 `WebBrowser` 控件供用户登录教务系统。 - 调用 `CourseService` (推测)进行登录状态检查和 HTML 内容获取。 - 调用 `CourseParser` 解析课表 HTML。 - 提供将课表导出为 CSV 和 PDF 格式的功能。 - 使用 `QuestPDF` 库生成 PDF 文件。 - **`CourseParser.cs` (HTML 课表解析器)** - 静态类,负责解析从教务系统获取的 HTML 课表内容。 - 使用 `HtmlAgilityPack` 定位和提取课程相关的 DOM 元素。 - 将解析出的课程信息转换为 `CourseEntity`对象列表。 - **`CourseService.cs`** - (基于 `ImportForm.cs` 中的使用推测) 可能负责与外部教务系统进行交互的逻辑,例如: - 检查用户在 `WebBrowser` 中的登录状态。 - 从 `WebBrowser` 获取课表页面的 HTML 内容。 - **注意**: 此服务主要处理与 Web 交互的部分,课程数据的本地存储和管理由 `Course_CRUD_Service` 负责。 - **`ReminderService.cs` (课程提醒服务)** - 后台服务,使用 `System.Windows.Forms.Timer` 定时运行。 - 每分钟检查一次是否有即将开始的课程。 - 根据硬编码的学期开始日期计算当前周次。 - 调用 `CourseRepository` 获取当天的课程。 - 在课程开始前特定时间(如 30 分钟、15 分钟)触发提醒。 - **`ReminderForm.cs` (课程提醒窗体)** - 自定义样式的无边框窗体,用于显示课程提醒信息。 - 展示课程名称、时间、地点等详细信息。 - 窗体出现和关闭时带有动画效果。 - 播放提醒音效。 - **`EditDialog.cs` (编辑对话框)** - 用于添加新课程或修改现有课程信息的对话框窗口。 - 提供输入字段供用户填写或修改课程的各项属性。 ## 5. 使用说明 ### 5.1. 运行程序 1. 确保已安装 .NET 运行环境。 2. 直接运行编译后的 `Course schedule management application.exe` 文件。 ### 5.2. 数据库初始化 - 首次运行程序时,若根目录下不存在 `CourseDB.db` 文件,程序会自动创建该数据库文件及所需的 `Courses` 表。 ### 5.3. 课程导入 (从武汉大学教务系统) 1. 在主界面 (`Form1`),通过菜单或按钮找到"导入/导出"功能,打开导入导出窗体 (`ImportForm`)。 2. `ImportForm` 中会加载武汉大学教务系统的登录页面。 3. 在内嵌的浏览器中完成登录操作。 4. 登录成功后,导航到包含课表的页面。 5. 点击 `ImportForm` 上的"导入课表"按钮。 6. 程序会自动检测登录状态,并尝试解析当前浏览器页面中的课表 HTML。 - **注意**: 导入操作会先清空本地数据库中所有已存在的课程,然后再存入新导入的课程。 7. 导入成功后会有提示信息,并显示导入的课程数量。 ### 5.4. 手动管理课程 - **添加课程**: 在主界面的课程表网格中,双击空白单元格,会弹出 `EditDialog`,填写课程信息后保存。 - **编辑课程**: 在主界面的课程表网格中,双击已有的课程块,会弹出 `EditDialog`,修改课程信息后保存。 - **删除课程**: 在 `EditDialog` 中或通过课程块的右键菜单(如果实现)进行删除。 ### 5.5. 查看课程表 - 主界面默认显示当前周的课程。 - 可以通过主界面上的"上一周"、"下一周"按钮切换显示的周次。 ### 5.6. 课程导出 1. 在导入导出窗体 (`ImportForm`) 中。 2. 确保已有课程数据(通过导入或手动添加)。 3. 点击"导出为 CSV 文件"或"导出为 PDF 文件"按钮。 4. 选择保存路径和文件名即可导出。 ### 5.7. 课程提醒 - 提醒服务 (`ReminderService`) 会在程序启动后自动在后台运行。 - 当有课程即将在预设的时间内(例如 30 分钟或 15 分钟)开始时,屏幕右下角会弹出 `ReminderForm` 提醒窗口。 ## 6. 数据库结构 (`Courses` 表) | 字段名 | 类型 | 约束与说明 | | ------------ | ------- | ------------------------------------------------------------------------------- | | `ID` | INTEGER | 主键, 自增 (`PRIMARY KEY AUTOINCREMENT`) | | `Name` | TEXT | 课程名称, 非空 (`NOT NULL`) | | `Instructor` | TEXT | 教师名称, 非空 (`NOT NULL`) | | `Location` | TEXT | 上课地点, 非空 (`NOT NULL`) | | `Credit` | REAL | 学分, 非空 (`NOT NULL`) | | `WeekFrom` | INTEGER | 开始周次 (1-20), 非空 (`NOT NULL CHECK(WeekFrom BETWEEN 1 AND 20)`) | | `WeekTo` | INTEGER | 结束周次 (1-20), 非空 (`NOT NULL CHECK(WeekTo BETWEEN 1 AND 20)`) | | `Weekday` | INTEGER | 星期几 (1-7, 通常 1 代表周一), 非空 (`NOT NULL CHECK(Weekday BETWEEN 1 AND 7)`) | | `ClassFrom` | INTEGER | 开始节次 (1-12), 非空 (`NOT NULL CHECK(ClassFrom BETWEEN 1 AND 12)`) | | `ClassTo` | INTEGER | 结束节次 (1-12), 非空 (`NOT NULL CHECK(ClassTo BETWEEN 1 AND 12)`) | | `ColorHex` | TEXT | 课程颜色 16 进制码 (例如 "#FF0000"), 可空 | | | | `CHECK(WeekTo >= WeekFrom)` | | | | `CHECK(ClassTo >= ClassFrom)` |