feat: add checker log widget

This commit is contained in:
2025-09-08 15:10:59 +08:00
parent c71b8fee48
commit d217a0e6d4
6 changed files with 119 additions and 19 deletions

View File

@ -96,6 +96,9 @@
<Compile Include="Util\ColorTrans.cs" />
<Compile Include="Util\WeekNames.cs" />
<Compile Include="Util\Win32Dialog.cs" />
<Compile Include="Widget\LogChecker.xaml.cs">
<DependentUpon>LogChecker.xaml</DependentUpon>
</Compile>
<Page Include="Dialog\EditCourse.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@ -120,6 +123,10 @@
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Widget\LogChecker.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
@ -148,8 +155,6 @@
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Folder Include="Widget\" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -87,7 +87,7 @@ namespace HFUTCourseSimulation.Kernel {
/// <returns>如果检查无误则返回检查好的结构否则返回null</returns>
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<Data.Built.Course>();
foreach (var course in semester.Courses) {
// 检查课程(实际上只有安排需要检查)
reporter.Info($"正在检查课程:{course.Name}");
reporter.Info($"正在检查课程:{course.Name}...");
var schedules = new List<Data.Built.Schedule>();

View File

@ -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是否能正常使用。", "导出渲染结果");
}
}
}

View File

@ -0,0 +1,37 @@
<Window x:Class="HFUTCourseSimulation.Widget.LogChecker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:HFUTCourseSimulation.Widget"
xmlns:uidata="clr-namespace:HFUTCourseSimulation.Kernel"
mc:Ignorable="d"
x:Name="uiMainWindow"
Title="检查器日志" Height="500" Width="400" Closed="uiMainWindow_Closed" Loaded="uiMainWindow_Loaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Border x:Name="uiErrorBanner" Grid.Row="0" Background="#F44336" BorderThickness="0">
<TextBlock Text="检查器发现了错误,请查看列表并处理!" Margin="5" Padding="5" Foreground="#FFFFFF" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
</Border>
<Border x:Name="uiOkBanner" Grid.Row="0" Background="#4CAF50" BorderThickness="0">
<TextBlock Text="检查器没有发现错误,请继续!" Margin="5" Padding="5" Foreground="#FFFFFF" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
</Border>
<ListBox x:Name="uiMessageList" Grid.Row="1" Margin="5">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid d:DataContext="{d:DesignInstance uidata:ReporterEntry}">
<TextBlock Text="{Binding Message, Mode=OneTime}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button x:Name="uiBtnOk" Content="确认" Grid.Row="2" Width="100" Padding="5" Margin="5" HorizontalAlignment="Right" Click="uiBtnOk_Click"/>
</Grid>
</Window>

View File

@ -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 {
/// <summary>
/// Interaction logic for LogChecker.xaml
/// </summary>
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();
}
}
}

View File

@ -1,9 +1,11 @@
# HFUT Course Simulation
这是一个个人目的很强的工程,这意味着这个工程的一切都是以我用的爽为前提的。
这是一个2018年制作的项目也是我考入HFUT的时间。当时HFUT查看课表有诸多不便之处例如学校官方提供的移动端课表可以分周次看课程以及考试成绩等经常无缘无故禁止外网访问只能连接学校内网查看而我又不想使用诸如超级课程表等软件。而且除了查看课表之外我还有一些其他需求例如我希望在选择公选课时能让我有一个可视化概览让我判断我选的课程之间是否冲突是否在合适的日子以及希望存储一张包含当前学期全部课程的大图到我的手机中供我离线查看。
于是我创建了这个项目,并根据我的需求,给予了它这个名字。以最快的速度完成了原型开发,并经过一些小修小补之后服务于我整个本科生涯。
后来我升入了另一所高校。这个高校虽然渊源上和HFUT本是一家但它的课程和每日节次安排均与HFUT不同然而还是继承了HFUT那坑爹的晚课时间我最讨厌这个了。尽管第一版可以做一些妥协勉强凑合使用但我还是决定对第一版进行重构使其能够在我目前这个高校中使用通过增加其泛用性来实现
后来我升入了另一所高校。这个高校虽然从源头上来说和HFUT本是一家但它的课程和每日节次安排均与HFUT不同然而还是继承了HFUT那坑爹的晚课时间我最讨厌这个了。尽管第一版可以做一些妥协的情况下,勉强凑合使用,但我还是决定对第一版进行重构,使其能够在我目前这个高校中使用(通过增加其泛用性来实现)。
在浏览了7年前写的代码后发现原本的代码是真的一坨屎山不仅没有充分利用Newtonsoft.Json的自定义序列化优势也没有利用WPF的便捷的绑定功能且UI设计文件结构稀烂。所以针对以上问题配合期望的功能对程序开展了完全的重构。但程序的名称改起来太麻烦索性就不改了就依然保持原样毕竟我也看不起我后来升入的这个学校。