diff --git a/Entities/Contracts/Assignment.cs b/Entities/Contracts/Assignment.cs index ee605fc..9da5515 100644 --- a/Entities/Contracts/Assignment.cs +++ b/Entities/Contracts/Assignment.cs @@ -27,6 +27,10 @@ namespace Entities.Contracts [Column("subject_area")] public SubjectAreaEnum SubjectArea { get; set; } + [Required] + [Column("exam_struct_id")] + public Guid ExamStructId { get; set; } + [Required] [Column("due_date")] public DateTime DueDate { get; set; } @@ -54,6 +58,8 @@ namespace Entities.Contracts [ForeignKey(nameof(CreatorId))] public User Creator { get; set; } public ICollection AssignmentClasses { get; set; } + + [ForeignKey(nameof(ExamStructId))] public AssignmentQuestion ExamStruct { get; set; } public ICollection AssignmentAttachments { get; set; } public ICollection Submissions { get; set; } diff --git a/Entities/Contracts/AssignmentQuestion.cs b/Entities/Contracts/AssignmentQuestion.cs index cbe0232..232244e 100644 --- a/Entities/Contracts/AssignmentQuestion.cs +++ b/Entities/Contracts/AssignmentQuestion.cs @@ -20,10 +20,6 @@ namespace Entities.Contracts [Column("question_id")] public Guid? QuestionId { get; set; } - [Column("assignment")] - [ForeignKey("Assignment")] - public Guid? AssignmentId { get; set; } - [Column("title")] [MaxLength(1024)] public string? Title { get; set; } @@ -54,7 +50,6 @@ namespace Entities.Contracts public Question? Question { get; set; } public Assignment? Assignment { get; set; } - [ForeignKey(nameof(QuestionContextId))] public QuestionContext? QuestionContext { get; set; } diff --git a/TechHelper.Client/Pages/Exam/ExamEdit.razor b/TechHelper.Client/Pages/Exam/ExamEdit.razor index 970bafa..31c205b 100644 --- a/TechHelper.Client/Pages/Exam/ExamEdit.razor +++ b/TechHelper.Client/Pages/Exam/ExamEdit.razor @@ -29,8 +29,8 @@ Console.WriteLine($"ExamId 字符串成功解析为 Guid: {parsedExamId}"); try { - // var result = await ExamService.GetExam(parsedExamId); - // if (result.Status) ExamDto = result.Result as ExamDto ?? new ExamDto(); + var result = await ExamService.GetExam(parsedExamId); + if (result.Status) ExamDto = result.Result as AssignmentDto ?? new AssignmentDto(); } catch (Exception ex) { diff --git a/TechHelper.Client/Pages/Exam/ExamManager.razor b/TechHelper.Client/Pages/Exam/ExamManager.razor index a8c15e6..bcdaad1 100644 --- a/TechHelper.Client/Pages/Exam/ExamManager.razor +++ b/TechHelper.Client/Pages/Exam/ExamManager.razor @@ -21,7 +21,7 @@ else @foreach (var item in examDtos) { - + } @@ -35,7 +35,7 @@ else [CascadingParameter] private Task authenticationStateTask { get; set; } - private List examDtos = new List(); + private List examDtos = new List(); private bool isloding = true; @@ -50,7 +50,7 @@ else isloding = true; Snackbar.Add("正在加载", Severity.Info); var result = await ExamService.GetAllExam(authenticationStateTask.Result.User.Identity.Name); - examDtos = result.Result as List ?? new List(); + examDtos = result.Result as List ?? new List(); isloding = false; Snackbar.Add("加载成功", Severity.Info); StateHasChanged(); diff --git a/TechHelper.Client/Pages/Exam/ExamPreview.razor b/TechHelper.Client/Pages/Exam/ExamPreview.razor index e5b93b9..0021fd2 100644 --- a/TechHelper.Client/Pages/Exam/ExamPreview.razor +++ b/TechHelper.Client/Pages/Exam/ExamPreview.razor @@ -3,7 +3,7 @@ - @examDto.AssignmentTitle + @AssignmentDto.Title @@ -26,7 +26,7 @@ public NavigationManager navigationManager { get; set; } [Parameter] - public ExamDto examDto { get; set; } + public AssignmentDto AssignmentDto { get; set; } [Parameter] @@ -47,11 +47,11 @@ private void ExamClick() { - navigationManager.NavigateTo($"exam/edit/{examDto.AssignmentId}"); + navigationManager.NavigateTo($"exam/edit/{AssignmentDto.Id}"); } private void CheckExam() { - navigationManager.NavigateTo($"exam/check/{examDto.AssignmentId}"); + navigationManager.NavigateTo($"exam/check/{AssignmentDto.Id}"); } } diff --git a/TechHelper.Client/Services/ExamService.cs b/TechHelper.Client/Services/ExamService.cs index 656b675..9e70131 100644 --- a/TechHelper.Client/Services/ExamService.cs +++ b/TechHelper.Client/Services/ExamService.cs @@ -88,13 +88,12 @@ namespace TechHelper.Client.Services public async Task GetAllExam(string user) { - // 直接使用注入的 _client 实例 var response = await _client.GetAsync($"exam/getAllPreview?user={user}"); if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject>(content); + var result = JsonConvert.DeserializeObject>(content); return ApiResponse.Success(result: result); } else diff --git a/TechHelper.Server/Migrations/20250620104952_init.Designer.cs b/TechHelper.Server/Migrations/20250624030547_init.Designer.cs similarity index 98% rename from TechHelper.Server/Migrations/20250620104952_init.Designer.cs rename to TechHelper.Server/Migrations/20250624030547_init.Designer.cs index 5215334..c88a2dc 100644 --- a/TechHelper.Server/Migrations/20250620104952_init.Designer.cs +++ b/TechHelper.Server/Migrations/20250624030547_init.Designer.cs @@ -12,7 +12,7 @@ using TechHelper.Context; namespace TechHelper.Server.Migrations { [DbContext(typeof(ApplicationContext))] - [Migration("20250620104952_init")] + [Migration("20250624030547_init")] partial class init { /// @@ -49,6 +49,10 @@ namespace TechHelper.Server.Migrations .HasColumnType("datetime(6)") .HasColumnName("due_date"); + b.Property("ExamStructId") + .HasColumnType("char(36)") + .HasColumnName("exam_struct_id"); + b.Property("IsDeleted") .HasColumnType("tinyint(1)") .HasColumnName("deleted"); @@ -82,6 +86,9 @@ namespace TechHelper.Server.Migrations b.HasIndex("CreatorId"); + b.HasIndex("ExamStructId") + .IsUnique(); + b.HasIndex("UserId"); b.ToTable("assignments", (string)null); @@ -161,10 +168,6 @@ namespace TechHelper.Server.Migrations .HasColumnType("char(36)") .HasColumnName("id"); - b.Property("AssignmentId") - .HasColumnType("char(36)") - .HasColumnName("assignment"); - b.Property("CreatedAt") .HasColumnType("datetime(6)") .HasColumnName("created_at"); @@ -206,9 +209,6 @@ namespace TechHelper.Server.Migrations b.HasKey("Id"); - b.HasIndex("AssignmentId") - .IsUnique(); - b.HasIndex("ParentAssignmentQuestionId"); b.HasIndex("QuestionContextId"); @@ -747,19 +747,19 @@ namespace TechHelper.Server.Migrations b.HasData( new { - Id = new Guid("577dbfe8-7b77-4ead-9386-678f02dea5f4"), + Id = new Guid("6163bf44-8dc7-4ad4-8d4c-c4452123949e"), Name = "Student", NormalizedName = "STUDENT" }, new { - Id = new Guid("04b04eed-32b9-4eb0-b5f5-a97bb4626718"), + Id = new Guid("90caaab6-bfc7-4b70-891a-4c6f327e29d8"), Name = "Teacher", NormalizedName = "TEACHER" }, new { - Id = new Guid("82354e4d-902d-4dd6-9790-6ef50ba9bc11"), + Id = new Guid("bf88293a-32d6-4d73-bc83-fe763c143024"), Name = "Administrator", NormalizedName = "ADMINISTRATOR" }); @@ -876,11 +876,19 @@ namespace TechHelper.Server.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Entities.Contracts.AssignmentQuestion", "ExamStruct") + .WithOne("Assignment") + .HasForeignKey("Entities.Contracts.Assignment", "ExamStructId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.HasOne("Entities.Contracts.User", null) .WithMany("CreatedAssignments") .HasForeignKey("UserId"); b.Navigation("Creator"); + + b.Navigation("ExamStruct"); }); modelBuilder.Entity("Entities.Contracts.AssignmentAttachment", b => @@ -915,10 +923,6 @@ namespace TechHelper.Server.Migrations modelBuilder.Entity("Entities.Contracts.AssignmentQuestion", b => { - b.HasOne("Entities.Contracts.Assignment", "Assignment") - .WithOne("ExamStruct") - .HasForeignKey("Entities.Contracts.AssignmentQuestion", "AssignmentId"); - b.HasOne("Entities.Contracts.AssignmentQuestion", "ParentAssignmentQuestion") .WithMany("ChildrenAssignmentQuestion") .HasForeignKey("ParentAssignmentQuestionId"); @@ -933,8 +937,6 @@ namespace TechHelper.Server.Migrations .HasForeignKey("QuestionId") .OnDelete(DeleteBehavior.Cascade); - b.Navigation("Assignment"); - b.Navigation("ParentAssignmentQuestion"); b.Navigation("Question"); @@ -1159,14 +1161,13 @@ namespace TechHelper.Server.Migrations b.Navigation("AssignmentClasses"); - b.Navigation("ExamStruct") - .IsRequired(); - b.Navigation("Submissions"); }); modelBuilder.Entity("Entities.Contracts.AssignmentQuestion", b => { + b.Navigation("Assignment"); + b.Navigation("ChildrenAssignmentQuestion"); b.Navigation("SubmissionDetails"); diff --git a/TechHelper.Server/Migrations/20250620104952_init.cs b/TechHelper.Server/Migrations/20250624030547_init.cs similarity index 98% rename from TechHelper.Server/Migrations/20250620104952_init.cs rename to TechHelper.Server/Migrations/20250624030547_init.cs index d2457d4..58273f1 100644 --- a/TechHelper.Server/Migrations/20250620104952_init.cs +++ b/TechHelper.Server/Migrations/20250624030547_init.cs @@ -229,42 +229,6 @@ namespace TechHelper.Server.Migrations }) .Annotation("MySql:CharSet", "utf8mb4"); - migrationBuilder.CreateTable( - name: "assignments", - columns: table => new - { - id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - title = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - description = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - subject_area = table.Column(type: "tinyint unsigned", nullable: false), - due_date = table.Column(type: "datetime(6)", nullable: false), - total_points = table.Column(type: "tinyint unsigned", nullable: false), - score = table.Column(type: "float", nullable: false), - created_by = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - created_at = table.Column(type: "datetime(6)", nullable: false), - updated_at = table.Column(type: "datetime(6)", nullable: false), - deleted = table.Column(type: "tinyint(1)", nullable: false), - UserId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci") - }, - constraints: table => - { - table.PrimaryKey("PK_assignments", x => x.id); - table.ForeignKey( - name: "FK_assignments_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_assignments_AspNetUsers_created_by", - column: x => x.created_by, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - migrationBuilder.CreateTable( name: "classes", columns: table => new @@ -316,99 +280,6 @@ namespace TechHelper.Server.Migrations }) .Annotation("MySql:CharSet", "utf8mb4"); - migrationBuilder.CreateTable( - name: "assignment_attachments", - columns: table => new - { - id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - assignment_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - file_path = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - file_name = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - uploaded_at = table.Column(type: "datetime(6)", nullable: false), - deleted = table.Column(type: "tinyint(1)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_assignment_attachments", x => x.id); - table.ForeignKey( - name: "FK_assignment_attachments_assignments_assignment_id", - column: x => x.assignment_id, - principalTable: "assignments", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "submissions", - columns: table => new - { - id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - assignment_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - student_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - attempt_number = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - submission_time = table.Column(type: "datetime(6)", nullable: false), - overall_grade = table.Column(type: "float", precision: 5, scale: 2, nullable: true), - overall_feedback = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - graded_by = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), - graded_at = table.Column(type: "datetime(6)", nullable: true), - deleted = table.Column(type: "tinyint(1)", nullable: false, defaultValue: false), - status = table.Column(type: "int", maxLength: 15, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_submissions", x => x.id); - table.ForeignKey( - name: "FK_submissions_AspNetUsers_graded_by", - column: x => x.graded_by, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.SetNull); - table.ForeignKey( - name: "FK_submissions_AspNetUsers_student_id", - column: x => x.student_id, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_submissions_assignments_assignment_id", - column: x => x.assignment_id, - principalTable: "assignments", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "assignment_class", - columns: table => new - { - assignment_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - class_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - assigned_at = table.Column(type: "datetime(6)", nullable: false), - deleted = table.Column(type: "tinyint(1)", nullable: false, defaultValue: false) - }, - constraints: table => - { - table.PrimaryKey("PK_assignment_class", x => new { x.assignment_id, x.class_id }); - table.ForeignKey( - name: "FK_assignment_class_assignments_assignment_id", - column: x => x.assignment_id, - principalTable: "assignments", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_assignment_class_classes_class_id", - column: x => x.class_id, - principalTable: "classes", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - migrationBuilder.CreateTable( name: "class_student", columns: table => new @@ -556,7 +427,6 @@ namespace TechHelper.Server.Migrations { id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), question_id = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), - assignment = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), title = table.Column(type: "varchar(1024)", maxLength: 1024, nullable: true) .Annotation("MySql:CharSet", "utf8mb4"), description = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), @@ -581,11 +451,6 @@ namespace TechHelper.Server.Migrations column: x => x.parent_question_group_id, principalTable: "assignment_questions", principalColumn: "id"); - table.ForeignKey( - name: "FK_assignment_questions_assignments_assignment", - column: x => x.assignment, - principalTable: "assignments", - principalColumn: "id"); table.ForeignKey( name: "FK_assignment_questions_questions_question_id", column: x => x.question_id, @@ -595,6 +460,142 @@ namespace TechHelper.Server.Migrations }) .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.CreateTable( + name: "assignments", + columns: table => new + { + id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + title = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + subject_area = table.Column(type: "tinyint unsigned", nullable: false), + exam_struct_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + due_date = table.Column(type: "datetime(6)", nullable: false), + total_points = table.Column(type: "tinyint unsigned", nullable: false), + score = table.Column(type: "float", nullable: false), + created_by = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + created_at = table.Column(type: "datetime(6)", nullable: false), + updated_at = table.Column(type: "datetime(6)", nullable: false), + deleted = table.Column(type: "tinyint(1)", nullable: false), + UserId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_assignments", x => x.id); + table.ForeignKey( + name: "FK_assignments_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_assignments_AspNetUsers_created_by", + column: x => x.created_by, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_assignments_assignment_questions_exam_struct_id", + column: x => x.exam_struct_id, + principalTable: "assignment_questions", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "assignment_attachments", + columns: table => new + { + id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + assignment_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + file_path = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + file_name = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + uploaded_at = table.Column(type: "datetime(6)", nullable: false), + deleted = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_assignment_attachments", x => x.id); + table.ForeignKey( + name: "FK_assignment_attachments_assignments_assignment_id", + column: x => x.assignment_id, + principalTable: "assignments", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "assignment_class", + columns: table => new + { + assignment_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + class_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + assigned_at = table.Column(type: "datetime(6)", nullable: false), + deleted = table.Column(type: "tinyint(1)", nullable: false, defaultValue: false) + }, + constraints: table => + { + table.PrimaryKey("PK_assignment_class", x => new { x.assignment_id, x.class_id }); + table.ForeignKey( + name: "FK_assignment_class_assignments_assignment_id", + column: x => x.assignment_id, + principalTable: "assignments", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_assignment_class_classes_class_id", + column: x => x.class_id, + principalTable: "classes", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "submissions", + columns: table => new + { + id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + assignment_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + student_id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + attempt_number = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + submission_time = table.Column(type: "datetime(6)", nullable: false), + overall_grade = table.Column(type: "float", precision: 5, scale: 2, nullable: true), + overall_feedback = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + graded_by = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + graded_at = table.Column(type: "datetime(6)", nullable: true), + deleted = table.Column(type: "tinyint(1)", nullable: false, defaultValue: false), + status = table.Column(type: "int", maxLength: 15, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_submissions", x => x.id); + table.ForeignKey( + name: "FK_submissions_AspNetUsers_graded_by", + column: x => x.graded_by, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.SetNull); + table.ForeignKey( + name: "FK_submissions_AspNetUsers_student_id", + column: x => x.student_id, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_submissions_assignments_assignment_id", + column: x => x.assignment_id, + principalTable: "assignments", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.CreateTable( name: "submission_details", columns: table => new @@ -643,9 +644,9 @@ namespace TechHelper.Server.Migrations columns: new[] { "Id", "ConcurrencyStamp", "Name", "NormalizedName" }, values: new object[,] { - { new Guid("04b04eed-32b9-4eb0-b5f5-a97bb4626718"), null, "Teacher", "TEACHER" }, - { new Guid("577dbfe8-7b77-4ead-9386-678f02dea5f4"), null, "Student", "STUDENT" }, - { new Guid("82354e4d-902d-4dd6-9790-6ef50ba9bc11"), null, "Administrator", "ADMINISTRATOR" } + { new Guid("6163bf44-8dc7-4ad4-8d4c-c4452123949e"), null, "Student", "STUDENT" }, + { new Guid("90caaab6-bfc7-4b70-891a-4c6f327e29d8"), null, "Teacher", "TEACHER" }, + { new Guid("bf88293a-32d6-4d73-bc83-fe763c143024"), null, "Administrator", "ADMINISTRATOR" } }); migrationBuilder.CreateIndex( @@ -695,12 +696,6 @@ namespace TechHelper.Server.Migrations table: "assignment_class", column: "class_id"); - migrationBuilder.CreateIndex( - name: "IX_assignment_questions_assignment", - table: "assignment_questions", - column: "assignment", - unique: true); - migrationBuilder.CreateIndex( name: "IX_assignment_questions_description", table: "assignment_questions", @@ -721,6 +716,12 @@ namespace TechHelper.Server.Migrations table: "assignments", column: "created_by"); + migrationBuilder.CreateIndex( + name: "IX_assignments_exam_struct_id", + table: "assignments", + column: "exam_struct_id", + unique: true); + migrationBuilder.CreateIndex( name: "IX_assignments_UserId", table: "assignments", @@ -851,10 +852,13 @@ namespace TechHelper.Server.Migrations name: "classes"); migrationBuilder.DropTable( - name: "assignment_questions"); + name: "submissions"); migrationBuilder.DropTable( - name: "submissions"); + name: "assignments"); + + migrationBuilder.DropTable( + name: "assignment_questions"); migrationBuilder.DropTable( name: "QuestionContexts"); @@ -863,14 +867,11 @@ namespace TechHelper.Server.Migrations name: "questions"); migrationBuilder.DropTable( - name: "assignments"); + name: "AspNetUsers"); migrationBuilder.DropTable( name: "key_point"); - migrationBuilder.DropTable( - name: "AspNetUsers"); - migrationBuilder.DropTable( name: "lesson"); diff --git a/TechHelper.Server/Migrations/ApplicationContextModelSnapshot.cs b/TechHelper.Server/Migrations/ApplicationContextModelSnapshot.cs index 1744502..033b4e1 100644 --- a/TechHelper.Server/Migrations/ApplicationContextModelSnapshot.cs +++ b/TechHelper.Server/Migrations/ApplicationContextModelSnapshot.cs @@ -46,6 +46,10 @@ namespace TechHelper.Server.Migrations .HasColumnType("datetime(6)") .HasColumnName("due_date"); + b.Property("ExamStructId") + .HasColumnType("char(36)") + .HasColumnName("exam_struct_id"); + b.Property("IsDeleted") .HasColumnType("tinyint(1)") .HasColumnName("deleted"); @@ -79,6 +83,9 @@ namespace TechHelper.Server.Migrations b.HasIndex("CreatorId"); + b.HasIndex("ExamStructId") + .IsUnique(); + b.HasIndex("UserId"); b.ToTable("assignments", (string)null); @@ -158,10 +165,6 @@ namespace TechHelper.Server.Migrations .HasColumnType("char(36)") .HasColumnName("id"); - b.Property("AssignmentId") - .HasColumnType("char(36)") - .HasColumnName("assignment"); - b.Property("CreatedAt") .HasColumnType("datetime(6)") .HasColumnName("created_at"); @@ -203,9 +206,6 @@ namespace TechHelper.Server.Migrations b.HasKey("Id"); - b.HasIndex("AssignmentId") - .IsUnique(); - b.HasIndex("ParentAssignmentQuestionId"); b.HasIndex("QuestionContextId"); @@ -744,19 +744,19 @@ namespace TechHelper.Server.Migrations b.HasData( new { - Id = new Guid("577dbfe8-7b77-4ead-9386-678f02dea5f4"), + Id = new Guid("6163bf44-8dc7-4ad4-8d4c-c4452123949e"), Name = "Student", NormalizedName = "STUDENT" }, new { - Id = new Guid("04b04eed-32b9-4eb0-b5f5-a97bb4626718"), + Id = new Guid("90caaab6-bfc7-4b70-891a-4c6f327e29d8"), Name = "Teacher", NormalizedName = "TEACHER" }, new { - Id = new Guid("82354e4d-902d-4dd6-9790-6ef50ba9bc11"), + Id = new Guid("bf88293a-32d6-4d73-bc83-fe763c143024"), Name = "Administrator", NormalizedName = "ADMINISTRATOR" }); @@ -873,11 +873,19 @@ namespace TechHelper.Server.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Entities.Contracts.AssignmentQuestion", "ExamStruct") + .WithOne("Assignment") + .HasForeignKey("Entities.Contracts.Assignment", "ExamStructId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.HasOne("Entities.Contracts.User", null) .WithMany("CreatedAssignments") .HasForeignKey("UserId"); b.Navigation("Creator"); + + b.Navigation("ExamStruct"); }); modelBuilder.Entity("Entities.Contracts.AssignmentAttachment", b => @@ -912,10 +920,6 @@ namespace TechHelper.Server.Migrations modelBuilder.Entity("Entities.Contracts.AssignmentQuestion", b => { - b.HasOne("Entities.Contracts.Assignment", "Assignment") - .WithOne("ExamStruct") - .HasForeignKey("Entities.Contracts.AssignmentQuestion", "AssignmentId"); - b.HasOne("Entities.Contracts.AssignmentQuestion", "ParentAssignmentQuestion") .WithMany("ChildrenAssignmentQuestion") .HasForeignKey("ParentAssignmentQuestionId"); @@ -930,8 +934,6 @@ namespace TechHelper.Server.Migrations .HasForeignKey("QuestionId") .OnDelete(DeleteBehavior.Cascade); - b.Navigation("Assignment"); - b.Navigation("ParentAssignmentQuestion"); b.Navigation("Question"); @@ -1156,14 +1158,13 @@ namespace TechHelper.Server.Migrations b.Navigation("AssignmentClasses"); - b.Navigation("ExamStruct") - .IsRequired(); - b.Navigation("Submissions"); }); modelBuilder.Entity("Entities.Contracts.AssignmentQuestion", b => { + b.Navigation("Assignment"); + b.Navigation("ChildrenAssignmentQuestion"); b.Navigation("SubmissionDetails"); diff --git a/TechHelper.Server/Repositories/ExamRepository.cs b/TechHelper.Server/Repositories/ExamRepository.cs index a948411..c702a22 100644 --- a/TechHelper.Server/Repositories/ExamRepository.cs +++ b/TechHelper.Server/Repositories/ExamRepository.cs @@ -11,6 +11,7 @@ namespace TechHelper.Server.Repositories private readonly IUnitOfWork _unitOfWork; private readonly IRepository _assignmentRepo; private readonly IRepository _questionRepo; + private readonly IRepository _assignQuestionRepo; public ExamRepository(IUnitOfWork unitOfWork) { @@ -20,11 +21,50 @@ namespace TechHelper.Server.Repositories public async Task GetFullExamByIdAsync(Guid assignmentId) { + var result = await _assignmentRepo.GetFirstOrDefaultAsync( + predicate: + a => a.Id == assignmentId, + include: + i => i.Include(a => a.ExamStruct) + ); - return null; + result.ExamStruct = await GetNeed(result.ExamStructId)?? null; + + return result; } + public async Task GetNeed(Guid id) + { + var result = await _assignQuestionRepo.GetFirstOrDefaultAsync( + predicate: aq => aq.Id == id, + include: i => i + .Include(aq => aq.ChildrenAssignmentQuestion) + .Include(aq => aq.Question) + .ThenInclude(q => q.Lesson) + .Include(aq => aq.Question) + .ThenInclude(q => q.KeyPoint) + ); + + if (result == null) + { + return null; + } + + var loadedChildren = new List(); + foreach (var child in result.ChildrenAssignmentQuestion) + { + var loadedChild = await GetNeed(child.Id); + if (loadedChild != null) + { + loadedChildren.Add(loadedChild); + } + } + result.ChildrenAssignmentQuestion = loadedChildren; + + return result; + } + public async Task> GetExamPreviewsByUserAsync(Guid userId) diff --git a/TechHelper.Server/Services/ExamService.cs b/TechHelper.Server/Services/ExamService.cs index 7cf259b..803df0a 100644 --- a/TechHelper.Server/Services/ExamService.cs +++ b/TechHelper.Server/Services/ExamService.cs @@ -75,10 +75,11 @@ namespace TechHelper.Server.Services return _mapper.Map(assignment); } - public async Task> GetAllExamPreviewsAsync(Guid userId) + public async Task GetAllExamPreviewsAsync(Guid userId) { var assignments = await _examRepository.GetExamPreviewsByUserAsync(userId); - return _mapper.Map>(assignments); + var result = _mapper.Map>(assignments); + return ApiResponse.Success(result: result); } @@ -87,9 +88,15 @@ namespace TechHelper.Server.Services throw new NotImplementedException(); } - public Task GetAsync(Guid id) + public async Task GetAsync(Guid id) { - throw new NotImplementedException(); + var assignment = await _examRepository.GetFullExamByIdAsync(id); + if (assignment == null) + { + return ApiResponse.Error("获取失败"); + } + var result = _mapper.Map(assignment); + return ApiResponse.Success(result: result); } public Task AddAsync(AssignmentDto model) @@ -107,10 +114,6 @@ namespace TechHelper.Server.Services throw new NotImplementedException(); } - Task IExamService.GetAllExamPreviewsAsync(Guid userId) - { - throw new NotImplementedException(); - } } }