
Some checks failed
TechAct / explore-gitea-actions (push) Failing after 13s
- 重构AppMainStruct、AssignmentQuestion、Question等实体模型 - 更新相关DTO以匹配新的数据结构 - 优化前端页面布局和组件 - 添加全局信息和笔记功能相关代码 - 更新数据库迁移和程序配置
284 lines
8.6 KiB
Plaintext
284 lines
8.6 KiB
Plaintext
@page "/exam/create"
|
|
@using AutoMapper
|
|
@using Entities.Contracts
|
|
@using Newtonsoft.Json
|
|
@using TechHelper.Client.Pages.Common
|
|
@using TechHelper.Client.Pages.Exam.ExamView
|
|
@using TechHelper.Client.Services
|
|
@using Blazored.TextEditor
|
|
@using Entities.DTO
|
|
@using TechHelper.Client.Exam
|
|
@inject ILogger<Home> Logger
|
|
@inject ISnackbar Snackbar;
|
|
@using Microsoft.AspNetCore.Components
|
|
@using System.Globalization;
|
|
@using TechHelper.Client.Pages.Editor
|
|
@inject IDialogService DialogService
|
|
|
|
<MudPaper Elevation="5" Class="d-flex overflow-hidden flex-grow-1 pa-1 rounded-xl " Style="overflow:hidden; position:relative;height:100%">
|
|
<MudDrawerContainer Class="mud-height-full flex-grow-1" Style="height:100%">
|
|
<MudDrawer @bind-Open="@_open" Elevation="0" Variant="@DrawerVariant.Persistent" Color="Color.Primary" Anchor="Anchor.End" OverlayAutoClose="true">
|
|
|
|
@if (_edit)
|
|
{
|
|
<AssignmentQuestionEdit AssignmentQuestion="selectedAssignmentQuestion" />
|
|
}
|
|
else
|
|
{
|
|
|
|
<MudDrawerHeader>
|
|
<MudText Typo="Typo.h6"> 配置 </MudText>
|
|
</MudDrawerHeader>
|
|
|
|
<MudStack Class="overflow-auto">
|
|
<ParseRoleConfig />
|
|
<MudButton Color="Color.Success"> ParseExam </MudButton>
|
|
</MudStack>
|
|
}
|
|
|
|
|
|
</MudDrawer>
|
|
<MudStack Class="flex-grow-1 h-100">
|
|
|
|
<MudPaper Class="rounded-xl ma-1 pa-2" Style="background-color:#fefefefe">
|
|
<MudButton Variant="Variant.Filled" Color="Color.Secondary" Class="rounded-xl" Size="Size.Small" OnClick="OpenEditor">文本编辑器</MudButton>
|
|
<MudButton Variant="Variant.Filled" Color="Color.Secondary" Class="rounded-xl" Size="Size.Small" OnClick="ParseExam">载入</MudButton>
|
|
<MudButton Variant="Variant.Filled" Color="Color.Secondary" Class="rounded-xl" Size="Size.Small" OnClick="OpenPublish">发布</MudButton>
|
|
<MudButton Variant="Variant.Filled" Color="Color.Secondary" Class="rounded-xl" Size="Size.Small" OnClick="OpenPublish">指派</MudButton>
|
|
<MudButton Variant="Variant.Filled" Color="Color.Secondary" Class="rounded-xl" Size="Size.Small" OnClick="OpenTest">Test</MudButton>
|
|
<MudButton Variant="Variant.Filled" Color="Color.Secondary" Class="rounded-xl" Size="Size.Small" OnClick="HandleGlobalInfo">GlobalExamInfo</MudButton>
|
|
</MudPaper>
|
|
|
|
|
|
<ExamView Class="overflow-auto ma-1 pa-2 rounded-xl" ClickedStruct="HandleClickedStruct" ParsedExam="ExamContent"></ExamView>
|
|
|
|
<MudPaper MaxWidth="300">
|
|
|
|
@if (_parsedExam.Errors.Any())
|
|
{
|
|
foreach (var item in _parsedExam.Errors)
|
|
{
|
|
<MudText> @item.Message </MudText>
|
|
}
|
|
}
|
|
</MudPaper>
|
|
</MudStack>
|
|
</MudDrawerContainer>
|
|
</MudPaper>
|
|
|
|
@code {
|
|
|
|
[CascadingParameter]
|
|
private Task<AuthenticationState> authenticationStateTask { get; set; }
|
|
|
|
private AssignmentQuestionDto selectedAssignmentQuestion = new AssignmentQuestionDto();
|
|
private IReadOnlyCollection<string> _selected;
|
|
private bool _open = false;
|
|
private bool _edit = false;
|
|
|
|
private void ToggleDrawer()
|
|
{
|
|
_open = !_open;
|
|
_edit = false;
|
|
}
|
|
private BlazoredTextEditor _textEditor = new BlazoredTextEditor();
|
|
private AssignmentEx _parsedExam = new AssignmentEx();
|
|
private AssignmentDto ExamContent = new AssignmentDto();
|
|
|
|
private ExamParserConfig _examParserConfig { get; set; } = new ExamParserConfig();
|
|
private string EditorText = "";
|
|
|
|
[Inject]
|
|
private ILocalStorageService LocalStorageService { get; set; }
|
|
|
|
[Inject]
|
|
public IMapper Mapper { get; set; }
|
|
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
await base.OnInitializedAsync();
|
|
|
|
var response = await NoteService.GetNote((byte)SubjectAreaEnum.Literature);
|
|
|
|
if (response.Status)
|
|
{
|
|
try
|
|
{
|
|
LocalStorageService.SetItem("GlobalInfo", response.Result);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
private async void OpenEditor()
|
|
{
|
|
var parameters = new DialogParameters<TextEditorDialog> { { x => x.TextEditor, _textEditor } };
|
|
parameters.Add("EditorText", EditorText);
|
|
|
|
var dialog = await DialogService.ShowAsync<TextEditorDialog>("TextEditor", parameters);
|
|
var result = await dialog.Result;
|
|
if (!result.Canceled)
|
|
{
|
|
_textEditor = result.Data as BlazoredTextEditor ?? new BlazoredTextEditor();
|
|
await ParseExam();
|
|
}
|
|
StateHasChanged();
|
|
}
|
|
private async void OpenPublish()
|
|
{
|
|
var parameters = new DialogParameters<PublishExamDialog> { { x => x.Exam, ExamContent } };
|
|
|
|
var dialog = await DialogService.ShowAsync<PublishExamDialog>("PublishExam", parameters);
|
|
var result = await dialog.Result;
|
|
if (!result.Canceled)
|
|
{
|
|
await Publish();
|
|
}
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async void HandleClickedStruct(AssignmentQuestionDto dto)
|
|
{
|
|
// _open = true;
|
|
// _edit = true;
|
|
// StateHasChanged();
|
|
|
|
var parameters = new DialogParameters<QuestionCardDialog> { { x => x.Questions, dto } };
|
|
|
|
var dialog = await DialogService.ShowAsync<QuestionCardDialog>("Edit_Question", parameters);
|
|
var result = await dialog.Result;
|
|
if (!result.Canceled)
|
|
{
|
|
}
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async Task ParseExam()
|
|
{
|
|
|
|
var plainText = await _textEditor.GetText();
|
|
EditorText = plainText;
|
|
|
|
if (!string.IsNullOrWhiteSpace(plainText))
|
|
{
|
|
try
|
|
{
|
|
var exampar = new ExamParser(_examParserConfig);
|
|
_parsedExam = exampar.ParseExamPaper(plainText);
|
|
Snackbar.Add("试卷解析成功。", Severity.Success);
|
|
Snackbar.Add($"{_parsedExam.Errors}。", Severity.Success);
|
|
StateHasChanged();
|
|
ExamContent = Mapper.Map<AssignmentDto>(_parsedExam);
|
|
ExamContent.SeqIndex();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"Error parsing exam paper: {ex.Message}");
|
|
Console.WriteLine($"Stack Trace: {ex.StackTrace}");
|
|
|
|
Snackbar.Add($"解析试卷时发生错误:{ex.Message}", Severity.Error);
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Snackbar.Add("试卷文本为空,无法解析。", Severity.Warning);
|
|
}
|
|
StateHasChanged();
|
|
}
|
|
|
|
[Inject]
|
|
public IExamService examService { get; set; }
|
|
|
|
[Inject]
|
|
public INoteService NoteService { get; set; }
|
|
|
|
|
|
public async Task Publish()
|
|
{
|
|
var apiRespon = await examService.SaveParsedExam(ExamContent);
|
|
Snackbar.Add(apiRespon.Message);
|
|
}
|
|
public async Task OpenTest()
|
|
{
|
|
Dictionary<string, (Color, string)> Note = new Dictionary<string, (Color, string)> { { "Hello", (Color.Surface, "World") }, { "My", (Color.Surface, "App") }, };
|
|
var json = JsonConvert.SerializeObject(Note);
|
|
var result = await NoteService.AddNote(new GlobalDto { SubjectArea = Entities.Contracts.SubjectAreaEnum.Physics, Data = json });
|
|
|
|
|
|
|
|
Console.WriteLine(json);
|
|
var res = JsonConvert.DeserializeObject<Dictionary<string, (Color, string)>>(json);
|
|
|
|
}
|
|
|
|
private async void HandleGlobalInfo()
|
|
{
|
|
// _open = true;
|
|
// _edit = true;
|
|
// StateHasChanged();
|
|
|
|
var parameters = new DialogParameters<ExamGlobalInfoDialog> { { x => x.Assignment, ExamContent } };
|
|
|
|
var dialog = await DialogService.ShowAsync<ExamGlobalInfoDialog>("Exam_GlobalInfo", parameters);
|
|
var result = await dialog.Result;
|
|
if (!result.Canceled)
|
|
{
|
|
}
|
|
StateHasChanged();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- #region name -->
|
|
@* <MudButtonGroup Vertical="true" Color="Color.Primary" Variant="Variant.Filled">
|
|
<MudIconButton Icon="@Icons.Material.Filled.Settings" OnClick="@ToggleDrawer" Color="Color.Secondary" />
|
|
<MudIconButton Icon="@Icons.Material.Filled.TransitEnterexit" OnClick="@ParseExam" Color="Color.Secondary" />
|
|
<MudIconButton Icon="@Icons.Material.Filled.Save" OnClick="@ToggleDrawer" Color="Color.Secondary" />
|
|
<MudIconButton Icon="@Icons.Material.Filled.Publish" OnClick="@Publish" Color="Color.Secondary" />
|
|
</MudButtonGroup> *@
|
|
@* <MudPaper Class="ma-2 h-100">
|
|
<MudPaper Elevation="0" Style="height:calc(100% - 80px)">
|
|
<BlazoredTextEditor @ref="@_textEditor">
|
|
<ToolbarContent>
|
|
<select class="ql-header">
|
|
<option selected=""></option>
|
|
<option value="1"></option>
|
|
<option value="2"></option>
|
|
<option value="3"></option>
|
|
<option value="4"></option>
|
|
<option value="5"></option>
|
|
</select>
|
|
<span class="ql-formats">
|
|
<button class="ql-bold"></button>
|
|
<button class="ql-italic"></button>
|
|
<button class="ql-underline"></button>
|
|
<button class="ql-strike"></button>
|
|
</span>
|
|
<span class="ql-formats">
|
|
<select class="ql-color"></select>
|
|
<select class="ql-background"></select>
|
|
</span>
|
|
<span class="ql-formats">
|
|
<button class="ql-list" value="ordered"></button>
|
|
<button class="ql-list" value="bullet"></button>
|
|
</span>
|
|
<span class="ql-formats">
|
|
<button class="ql-link"></button>
|
|
</span>
|
|
</ToolbarContent>
|
|
<EditorContent>
|
|
</EditorContent>
|
|
</BlazoredTextEditor>
|
|
</MudPaper>
|
|
</MudPaper> *@
|
|
|
|
<!-- #endregion --> |