diff --git a/HFUTCourseSimulation/HFUTCourseSimulation.csproj b/HFUTCourseSimulation/HFUTCourseSimulation.csproj
index ff5d576..3f3d830 100644
--- a/HFUTCourseSimulation/HFUTCourseSimulation.csproj
+++ b/HFUTCourseSimulation/HFUTCourseSimulation.csproj
@@ -96,6 +96,9 @@
+
+ LogChecker.xaml
+
Designer
MSBuild:Compile
@@ -120,6 +123,10 @@
MainWindow.xaml
Code
+
+ Designer
+ MSBuild:Compile
+
@@ -148,8 +155,6 @@
-
-
-
+
\ No newline at end of file
diff --git a/HFUTCourseSimulation/Kernel/Arranger.cs b/HFUTCourseSimulation/Kernel/Arranger.cs
index 8860618..fedc75d 100644
--- a/HFUTCourseSimulation/Kernel/Arranger.cs
+++ b/HFUTCourseSimulation/Kernel/Arranger.cs
@@ -87,7 +87,7 @@ namespace HFUTCourseSimulation.Kernel {
/// 如果检查无误则返回检查好的结构,否则返回null
private static Data.Built.Semester CheckSemester(Data.Storage.Semester semester, Reporter reporter) {
// 检查Semester
- reporter.Info($"正在检查学期");
+ reporter.Info($"正在检查学期设置...");
if (semester.StartDate.DayOfWeek != DayOfWeek.Monday) {
reporter.Error($"起始日期{semester.StartDate:yyyy-MM-dd}不是星期一");
return null;
@@ -108,10 +108,11 @@ namespace HFUTCourseSimulation.Kernel {
if (rv is null) return null;
int dinnerAt = rv.Value;
+ reporter.Info($"正在检查课程设置...");
var courses = new List();
foreach (var course in semester.Courses) {
// 检查课程(实际上只有安排需要检查)
- reporter.Info($"正在检查课程:{course.Name}");
+ reporter.Info($"正在检查课程:{course.Name}...");
var schedules = new List();
diff --git a/HFUTCourseSimulation/MainWindow.xaml.cs b/HFUTCourseSimulation/MainWindow.xaml.cs
index f9e7618..eeb61ea 100644
--- a/HFUTCourseSimulation/MainWindow.xaml.cs
+++ b/HFUTCourseSimulation/MainWindow.xaml.cs
@@ -248,34 +248,48 @@ namespace HFUTCourseSimulation {
private void uiMenuCheck_Click(object sender, RoutedEventArgs e) {
var semester = _context.Semester.ToStorage();
var reporter = new Kernel.Reporter();
- var rv = Kernel.Arranger.Arrange(semester, reporter);
+ Kernel.Arranger.Arrange(semester, reporter);
+
+ var widget = new Widget.LogChecker();
+ widget.CurrentReporter = reporter;
+ widget.ShowDialog();
}
private void uiMenuSimulator_Click(object sender, RoutedEventArgs e) {
var semester = _context.Semester.ToStorage();
var reporter = new Kernel.Reporter();
var rv = Kernel.Arranger.Arrange(semester, reporter);
- if (rv is null) return;
- var dialog = new Dialog.Simulator();
- dialog.CurrentSemester = rv;
- dialog.ShowDialog();
+ if (rv is null || reporter.HasError()) {
+ var widget = new Widget.LogChecker();
+ widget.CurrentReporter = reporter;
+ widget.ShowDialog();
+ } else {
+ var dialog = new Dialog.Simulator();
+ dialog.CurrentSemester = rv;
+ dialog.ShowDialog();
+ }
}
private void uiMenuRender_Click(object sender, RoutedEventArgs e) {
var semester = _context.Semester.ToStorage();
var reporter = new Kernel.Reporter();
var rv = Kernel.Arranger.Arrange(semester, reporter);
- if (rv is null) return;
- // Fetch file path.
- var filepath = Util.Win32Dialog.SaveRender();
- if (filepath is null) return;
-
- if (Kernel.Render.Rending(rv, filepath)) {
- ReportStatus($"已导出图片:{filepath}");
+ if (rv is null || reporter.HasError()) {
+ var widget = new Widget.LogChecker();
+ widget.CurrentReporter = reporter;
+ widget.ShowDialog();
} else {
- Win32Dialog.Error("导出失败。请检查文件是否被占用,或检查GDI是否能正常使用。", "导出结果");
+ // Fetch file path.
+ var filepath = Util.Win32Dialog.SaveRender();
+ if (filepath is null) return;
+
+ if (Kernel.Render.Rending(rv, filepath)) {
+ ReportStatus($"已导出图片:{filepath}");
+ } else {
+ Win32Dialog.Error("导出失败。请检查文件是否被占用,或检查GDI是否能正常使用。", "导出渲染结果");
+ }
}
}
diff --git a/HFUTCourseSimulation/Widget/LogChecker.xaml b/HFUTCourseSimulation/Widget/LogChecker.xaml
new file mode 100644
index 0000000..8d8e24e
--- /dev/null
+++ b/HFUTCourseSimulation/Widget/LogChecker.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/HFUTCourseSimulation/Widget/LogChecker.xaml.cs b/HFUTCourseSimulation/Widget/LogChecker.xaml.cs
new file mode 100644
index 0000000..96ad53b
--- /dev/null
+++ b/HFUTCourseSimulation/Widget/LogChecker.xaml.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace HFUTCourseSimulation.Widget {
+ ///
+ /// Interaction logic for LogChecker.xaml
+ ///
+ public partial class LogChecker : Window {
+ public LogChecker() {
+ InitializeComponent();
+ }
+
+ private void uiMainWindow_Loaded(object sender, RoutedEventArgs e) {
+ var hasError = CurrentReporter.HasError();
+ uiErrorBanner.Visibility = hasError ? Visibility.Visible : Visibility.Collapsed;
+ uiOkBanner.Visibility = hasError ? Visibility.Collapsed : Visibility.Visible;
+ uiMessageList.ItemsSource = CurrentReporter;
+ }
+
+ private void uiMainWindow_Closed(object sender, EventArgs e) {
+ uiMessageList.ItemsSource = null;
+ }
+
+ public Kernel.Reporter CurrentReporter { get; set; }
+
+ private void uiBtnOk_Click(object sender, RoutedEventArgs e) {
+ this.Close();
+ }
+ }
+}
diff --git a/README.md b/README.md
index 1320fb6..a28e829 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,11 @@
# HFUT Course Simulation
+这是一个个人目的很强的工程,这意味着这个工程的一切都是以我用的爽为前提的。
+
这是一个2018年制作的项目,也是我考入HFUT的时间。当时HFUT查看课表有诸多不便之处:例如学校官方提供的移动端课表(可以分周次看课程,以及考试成绩等)经常无缘无故禁止外网访问,只能连接学校内网查看;而我又不想使用诸如超级课程表等软件。而且,除了查看课表之外,我还有一些其他需求:例如我希望在选择公选课时能让我有一个可视化概览,让我判断我选的课程之间是否冲突,是否在合适的日子;以及希望存储一张包含当前学期全部课程的大图到我的手机中,供我离线查看。
于是我创建了这个项目,并根据我的需求,给予了它这个名字。以最快的速度完成了原型开发,并经过一些小修小补之后服务于我整个本科生涯。
-后来我升入了另一所高校。这个高校虽然渊源上和HFUT本是一家,但它的课程和每日节次安排均与HFUT不同(然而还是继承了HFUT那坑爹的晚课时间,我最讨厌这个了)。尽管第一版可以做一些妥协,勉强凑合使用,但我还是决定对第一版进行重构,使其能够在我目前这个高校中使用(通过增加其泛用性来实现)。
+后来我升入了另一所高校。这个高校虽然从源头上来说和HFUT本是一家,但它的课程和每日节次安排均与HFUT不同(然而还是继承了HFUT那坑爹的晚课时间,我最讨厌这个了)。尽管第一版可以在做一些妥协的情况下,勉强凑合使用,但我还是决定对第一版进行重构,使其能够在我目前这个高校中使用(通过增加其泛用性来实现)。
在浏览了7年前写的代码后,发现原本的代码是真的一坨屎山,不仅没有充分利用Newtonsoft.Json的自定义序列化优势,也没有利用WPF的便捷的绑定功能,且UI设计,文件结构稀烂。所以针对以上问题,配合期望的功能,对程序开展了完全的重构。但程序的名称改起来太麻烦,索性就不改了,就依然保持原样,毕竟我也看不起我后来升入的这个学校。