@octo-cyber/quiz-engine 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/controllers/attempt.controller.d.ts +3 -0
  2. package/dist/controllers/attempt.controller.d.ts.map +1 -0
  3. package/dist/controllers/attempt.controller.js +83 -0
  4. package/dist/controllers/attempt.controller.js.map +1 -0
  5. package/dist/controllers/category.controller.d.ts +3 -0
  6. package/dist/controllers/category.controller.d.ts.map +1 -0
  7. package/dist/controllers/category.controller.js +38 -0
  8. package/dist/controllers/category.controller.js.map +1 -0
  9. package/dist/controllers/exam.controller.d.ts +3 -0
  10. package/dist/controllers/exam.controller.d.ts.map +1 -0
  11. package/dist/controllers/exam.controller.js +48 -0
  12. package/dist/controllers/exam.controller.js.map +1 -0
  13. package/dist/controllers/index.d.ts +7 -0
  14. package/dist/controllers/index.d.ts.map +1 -0
  15. package/dist/controllers/index.js +16 -0
  16. package/dist/controllers/index.js.map +1 -0
  17. package/dist/controllers/paper.controller.d.ts +3 -0
  18. package/dist/controllers/paper.controller.d.ts.map +1 -0
  19. package/dist/controllers/paper.controller.js +70 -0
  20. package/dist/controllers/paper.controller.js.map +1 -0
  21. package/dist/controllers/question.controller.d.ts +3 -0
  22. package/dist/controllers/question.controller.d.ts.map +1 -0
  23. package/dist/controllers/question.controller.js +59 -0
  24. package/dist/controllers/question.controller.js.map +1 -0
  25. package/dist/controllers/statistics.controller.d.ts +3 -0
  26. package/dist/controllers/statistics.controller.d.ts.map +1 -0
  27. package/dist/controllers/statistics.controller.js +37 -0
  28. package/dist/controllers/statistics.controller.js.map +1 -0
  29. package/dist/entities/index.d.ts +24 -0
  30. package/dist/entities/index.d.ts.map +1 -0
  31. package/dist/entities/index.js +43 -0
  32. package/dist/entities/index.js.map +1 -0
  33. package/dist/entities/quiz-answer.entity.d.ts +19 -0
  34. package/dist/entities/quiz-answer.entity.d.ts.map +1 -0
  35. package/dist/entities/quiz-answer.entity.js +81 -0
  36. package/dist/entities/quiz-answer.entity.js.map +1 -0
  37. package/dist/entities/quiz-attempt.entity.d.ts +17 -0
  38. package/dist/entities/quiz-attempt.entity.d.ts.map +1 -0
  39. package/dist/entities/quiz-attempt.entity.js +80 -0
  40. package/dist/entities/quiz-attempt.entity.js.map +1 -0
  41. package/dist/entities/quiz-category.entity.d.ts +10 -0
  42. package/dist/entities/quiz-category.entity.d.ts.map +1 -0
  43. package/dist/entities/quiz-category.entity.js +55 -0
  44. package/dist/entities/quiz-category.entity.js.map +1 -0
  45. package/dist/entities/quiz-exam.entity.d.ts +25 -0
  46. package/dist/entities/quiz-exam.entity.d.ts.map +1 -0
  47. package/dist/entities/quiz-exam.entity.js +99 -0
  48. package/dist/entities/quiz-exam.entity.js.map +1 -0
  49. package/dist/entities/quiz-paper-question.entity.d.ts +12 -0
  50. package/dist/entities/quiz-paper-question.entity.d.ts.map +1 -0
  51. package/dist/entities/quiz-paper-question.entity.js +58 -0
  52. package/dist/entities/quiz-paper-question.entity.js.map +1 -0
  53. package/dist/entities/quiz-paper.entity.d.ts +18 -0
  54. package/dist/entities/quiz-paper.entity.d.ts.map +1 -0
  55. package/dist/entities/quiz-paper.entity.js +75 -0
  56. package/dist/entities/quiz-paper.entity.js.map +1 -0
  57. package/dist/entities/quiz-question.entity.d.ts +28 -0
  58. package/dist/entities/quiz-question.entity.d.ts.map +1 -0
  59. package/dist/entities/quiz-question.entity.js +107 -0
  60. package/dist/entities/quiz-question.entity.js.map +1 -0
  61. package/dist/index.d.ts +27 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +66 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/quiz-engine.module.d.ts +8 -0
  66. package/dist/quiz-engine.module.d.ts.map +1 -0
  67. package/dist/quiz-engine.module.js +45 -0
  68. package/dist/quiz-engine.module.js.map +1 -0
  69. package/dist/schemas/attempt.schema.d.ts +47 -0
  70. package/dist/schemas/attempt.schema.d.ts.map +1 -0
  71. package/dist/schemas/attempt.schema.js +19 -0
  72. package/dist/schemas/attempt.schema.js.map +1 -0
  73. package/dist/schemas/category.schema.d.ts +36 -0
  74. package/dist/schemas/category.schema.d.ts.map +1 -0
  75. package/dist/schemas/category.schema.js +12 -0
  76. package/dist/schemas/category.schema.js.map +1 -0
  77. package/dist/schemas/exam.schema.d.ts +70 -0
  78. package/dist/schemas/exam.schema.d.ts.map +1 -0
  79. package/dist/schemas/exam.schema.js +20 -0
  80. package/dist/schemas/exam.schema.js.map +1 -0
  81. package/dist/schemas/paper.schema.d.ts +71 -0
  82. package/dist/schemas/paper.schema.d.ts.map +1 -0
  83. package/dist/schemas/paper.schema.js +26 -0
  84. package/dist/schemas/paper.schema.js.map +1 -0
  85. package/dist/schemas/question.schema.d.ts +147 -0
  86. package/dist/schemas/question.schema.d.ts.map +1 -0
  87. package/dist/schemas/question.schema.js +32 -0
  88. package/dist/schemas/question.schema.js.map +1 -0
  89. package/dist/services/attempt.service.d.ts +33 -0
  90. package/dist/services/attempt.service.d.ts.map +1 -0
  91. package/dist/services/attempt.service.js +197 -0
  92. package/dist/services/attempt.service.js.map +1 -0
  93. package/dist/services/category.service.d.ts +14 -0
  94. package/dist/services/category.service.d.ts.map +1 -0
  95. package/dist/services/category.service.js +74 -0
  96. package/dist/services/category.service.js.map +1 -0
  97. package/dist/services/exam.service.d.ts +17 -0
  98. package/dist/services/exam.service.d.ts.map +1 -0
  99. package/dist/services/exam.service.js +92 -0
  100. package/dist/services/exam.service.js.map +1 -0
  101. package/dist/services/grade.service.d.ts +16 -0
  102. package/dist/services/grade.service.d.ts.map +1 -0
  103. package/dist/services/grade.service.js +75 -0
  104. package/dist/services/grade.service.js.map +1 -0
  105. package/dist/services/index.d.ts +8 -0
  106. package/dist/services/index.d.ts.map +1 -0
  107. package/dist/services/index.js +18 -0
  108. package/dist/services/index.js.map +1 -0
  109. package/dist/services/paper.service.d.ts +32 -0
  110. package/dist/services/paper.service.d.ts.map +1 -0
  111. package/dist/services/paper.service.js +157 -0
  112. package/dist/services/paper.service.js.map +1 -0
  113. package/dist/services/question.service.d.ts +30 -0
  114. package/dist/services/question.service.d.ts.map +1 -0
  115. package/dist/services/question.service.js +155 -0
  116. package/dist/services/question.service.js.map +1 -0
  117. package/dist/services/statistics.service.d.ts +43 -0
  118. package/dist/services/statistics.service.d.ts.map +1 -0
  119. package/dist/services/statistics.service.js +134 -0
  120. package/dist/services/statistics.service.js.map +1 -0
  121. package/package.json +85 -0
  122. package/web/index.ts +51 -0
  123. package/web/manifest.ts +36 -0
  124. package/web/messages/en-US.json +143 -0
  125. package/web/messages/zh-CN.json +143 -0
  126. package/web/pages/ExamRoomPage.tsx +289 -0
  127. package/web/pages/ExamsPage.tsx +248 -0
  128. package/web/pages/PapersPage.tsx +202 -0
  129. package/web/pages/QuestionBankPage.tsx +263 -0
  130. package/web/pages/StatisticsPage.tsx +178 -0
  131. package/web/services/attempt-service.ts +53 -0
  132. package/web/services/category-service.ts +26 -0
  133. package/web/services/exam-service.ts +31 -0
  134. package/web/services/paper-service.ts +50 -0
  135. package/web/services/question-service.ts +36 -0
  136. package/web/services/statistics-service.ts +28 -0
  137. package/web/stores/quiz-store.ts +31 -0
  138. package/web/types/quiz.ts +166 -0
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QuizAnswer = void 0;
13
+ const core_1 = require("@octo-cyber/core");
14
+ let QuizAnswer = class QuizAnswer {
15
+ id;
16
+ attemptId;
17
+ questionId;
18
+ /** 用户作答 JSON: string | string[] | null(主观题为字符串) */
19
+ userAnswer;
20
+ /** 客观题自动判断,主观题阅卷后设置 */
21
+ isCorrect;
22
+ /** 得分 */
23
+ score;
24
+ /** 阅卷批注 */
25
+ feedback;
26
+ /** 批改人 */
27
+ gradedBy;
28
+ gradedAt;
29
+ createdAt;
30
+ updatedAt;
31
+ };
32
+ exports.QuizAnswer = QuizAnswer;
33
+ __decorate([
34
+ (0, core_1.PrimaryGeneratedColumn)('uuid'),
35
+ __metadata("design:type", String)
36
+ ], QuizAnswer.prototype, "id", void 0);
37
+ __decorate([
38
+ (0, core_1.Index)(),
39
+ (0, core_1.Column)({ type: 'varchar', length: 36, name: 'attempt_id' }),
40
+ __metadata("design:type", String)
41
+ ], QuizAnswer.prototype, "attemptId", void 0);
42
+ __decorate([
43
+ (0, core_1.Column)({ type: 'varchar', length: 36, name: 'question_id' }),
44
+ __metadata("design:type", String)
45
+ ], QuizAnswer.prototype, "questionId", void 0);
46
+ __decorate([
47
+ (0, core_1.Column)({ type: 'text', nullable: true, name: 'user_answer' }),
48
+ __metadata("design:type", String)
49
+ ], QuizAnswer.prototype, "userAnswer", void 0);
50
+ __decorate([
51
+ (0, core_1.Column)({ type: 'boolean', nullable: true, name: 'is_correct' }),
52
+ __metadata("design:type", Boolean)
53
+ ], QuizAnswer.prototype, "isCorrect", void 0);
54
+ __decorate([
55
+ (0, core_1.Column)({ type: 'float', default: 0 }),
56
+ __metadata("design:type", Number)
57
+ ], QuizAnswer.prototype, "score", void 0);
58
+ __decorate([
59
+ (0, core_1.Column)({ type: 'text', nullable: true }),
60
+ __metadata("design:type", String)
61
+ ], QuizAnswer.prototype, "feedback", void 0);
62
+ __decorate([
63
+ (0, core_1.Column)({ type: 'varchar', length: 36, nullable: true, name: 'graded_by' }),
64
+ __metadata("design:type", String)
65
+ ], QuizAnswer.prototype, "gradedBy", void 0);
66
+ __decorate([
67
+ (0, core_1.Column)({ type: 'datetime', nullable: true, name: 'graded_at' }),
68
+ __metadata("design:type", Date)
69
+ ], QuizAnswer.prototype, "gradedAt", void 0);
70
+ __decorate([
71
+ (0, core_1.CreateDateColumn)({ name: 'created_at' }),
72
+ __metadata("design:type", Date)
73
+ ], QuizAnswer.prototype, "createdAt", void 0);
74
+ __decorate([
75
+ (0, core_1.UpdateDateColumn)({ name: 'updated_at' }),
76
+ __metadata("design:type", Date)
77
+ ], QuizAnswer.prototype, "updatedAt", void 0);
78
+ exports.QuizAnswer = QuizAnswer = __decorate([
79
+ (0, core_1.Entity)('quiz_answer')
80
+ ], QuizAnswer);
81
+ //# sourceMappingURL=quiz-answer.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-answer.entity.js","sourceRoot":"","sources":["../../src/entities/quiz-answer.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAO0B;AAGnB,IAAM,UAAU,GAAhB,MAAM,UAAU;IAErB,EAAE,CAAU;IAIZ,SAAS,CAAU;IAGnB,UAAU,CAAU;IAEpB,mDAAmD;IAEnD,UAAU,CAAiB;IAE3B,uBAAuB;IAEvB,SAAS,CAAkB;IAE3B,SAAS;IAET,KAAK,CAAU;IAEf,WAAW;IAEX,QAAQ,CAAiB;IAEzB,UAAU;IAEV,QAAQ,CAAiB;IAGzB,QAAQ,CAAe;IAGvB,SAAS,CAAQ;IAGjB,SAAS,CAAQ;CAClB,CAAA;AAvCY,gCAAU;AAErB;IADC,IAAA,6BAAsB,EAAC,MAAM,CAAC;;sCACnB;AAIZ;IAFC,IAAA,YAAK,GAAE;IACP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;6CACzC;AAGnB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;8CACzC;AAIpB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;8CACnC;AAI3B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;6CACrC;AAI3B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;yCACvB;AAIf;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CAChB;AAIzB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;4CAClD;AAGzB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACrD,IAAI;4CAAQ;AAGvB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;6CAAC;AAGjB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;6CAAC;qBAtCN,UAAU;IADtB,IAAA,aAAM,EAAC,aAAa,CAAC;GACT,UAAU,CAuCtB"}
@@ -0,0 +1,17 @@
1
+ export declare const ATTEMPT_STATUSES: readonly ["IN_PROGRESS", "SUBMITTED", "GRADED"];
2
+ export type AttemptStatus = typeof ATTEMPT_STATUSES[number];
3
+ export declare class QuizAttempt {
4
+ id: string;
5
+ examId: string;
6
+ userId: string;
7
+ startedAt: Date;
8
+ submittedAt: Date | null;
9
+ /** 已用时长(秒) */
10
+ timeUsedSeconds: number;
11
+ status: string;
12
+ totalScore: number;
13
+ isPassed: boolean;
14
+ createdAt: Date;
15
+ updatedAt: Date;
16
+ }
17
+ //# sourceMappingURL=quiz-attempt.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-attempt.entity.d.ts","sourceRoot":"","sources":["../../src/entities/quiz-attempt.entity.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,gBAAgB,iDAAkD,CAAC;AAChF,MAAM,MAAM,aAAa,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE5D,qBACa,WAAW;IAEtB,EAAE,EAAG,MAAM,CAAC;IAIZ,MAAM,EAAG,MAAM,CAAC;IAIhB,MAAM,EAAG,MAAM,CAAC;IAGhB,SAAS,EAAG,IAAI,CAAC;IAGjB,WAAW,EAAG,IAAI,GAAG,IAAI,CAAC;IAE1B,cAAc;IAEd,eAAe,EAAG,MAAM,CAAC;IAIzB,MAAM,EAAG,MAAM,CAAC;IAGhB,UAAU,EAAG,MAAM,CAAC;IAGpB,QAAQ,EAAG,OAAO,CAAC;IAGnB,SAAS,EAAG,IAAI,CAAC;IAGjB,SAAS,EAAG,IAAI,CAAC;CAClB"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QuizAttempt = exports.ATTEMPT_STATUSES = void 0;
13
+ const core_1 = require("@octo-cyber/core");
14
+ exports.ATTEMPT_STATUSES = ['IN_PROGRESS', 'SUBMITTED', 'GRADED'];
15
+ let QuizAttempt = class QuizAttempt {
16
+ id;
17
+ examId;
18
+ userId;
19
+ startedAt;
20
+ submittedAt;
21
+ /** 已用时长(秒) */
22
+ timeUsedSeconds;
23
+ status;
24
+ totalScore;
25
+ isPassed;
26
+ createdAt;
27
+ updatedAt;
28
+ };
29
+ exports.QuizAttempt = QuizAttempt;
30
+ __decorate([
31
+ (0, core_1.PrimaryGeneratedColumn)('uuid'),
32
+ __metadata("design:type", String)
33
+ ], QuizAttempt.prototype, "id", void 0);
34
+ __decorate([
35
+ (0, core_1.Index)(),
36
+ (0, core_1.Column)({ type: 'varchar', length: 36, name: 'exam_id' }),
37
+ __metadata("design:type", String)
38
+ ], QuizAttempt.prototype, "examId", void 0);
39
+ __decorate([
40
+ (0, core_1.Index)(),
41
+ (0, core_1.Column)({ type: 'varchar', length: 36, name: 'user_id' }),
42
+ __metadata("design:type", String)
43
+ ], QuizAttempt.prototype, "userId", void 0);
44
+ __decorate([
45
+ (0, core_1.Column)({ type: 'datetime', name: 'started_at' }),
46
+ __metadata("design:type", Date)
47
+ ], QuizAttempt.prototype, "startedAt", void 0);
48
+ __decorate([
49
+ (0, core_1.Column)({ type: 'datetime', nullable: true, name: 'submitted_at' }),
50
+ __metadata("design:type", Date)
51
+ ], QuizAttempt.prototype, "submittedAt", void 0);
52
+ __decorate([
53
+ (0, core_1.Column)({ type: 'int', default: 0, name: 'time_used_seconds' }),
54
+ __metadata("design:type", Number)
55
+ ], QuizAttempt.prototype, "timeUsedSeconds", void 0);
56
+ __decorate([
57
+ (0, core_1.Index)(),
58
+ (0, core_1.Column)({ type: 'varchar', length: 16, default: 'IN_PROGRESS' }),
59
+ __metadata("design:type", String)
60
+ ], QuizAttempt.prototype, "status", void 0);
61
+ __decorate([
62
+ (0, core_1.Column)({ type: 'float', default: 0, name: 'total_score' }),
63
+ __metadata("design:type", Number)
64
+ ], QuizAttempt.prototype, "totalScore", void 0);
65
+ __decorate([
66
+ (0, core_1.Column)({ type: 'boolean', default: false, name: 'is_passed' }),
67
+ __metadata("design:type", Boolean)
68
+ ], QuizAttempt.prototype, "isPassed", void 0);
69
+ __decorate([
70
+ (0, core_1.CreateDateColumn)({ name: 'created_at' }),
71
+ __metadata("design:type", Date)
72
+ ], QuizAttempt.prototype, "createdAt", void 0);
73
+ __decorate([
74
+ (0, core_1.UpdateDateColumn)({ name: 'updated_at' }),
75
+ __metadata("design:type", Date)
76
+ ], QuizAttempt.prototype, "updatedAt", void 0);
77
+ exports.QuizAttempt = QuizAttempt = __decorate([
78
+ (0, core_1.Entity)('quiz_attempt')
79
+ ], QuizAttempt);
80
+ //# sourceMappingURL=quiz-attempt.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-attempt.entity.js","sourceRoot":"","sources":["../../src/entities/quiz-attempt.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAO0B;AAEb,QAAA,gBAAgB,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAIzE,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEtB,EAAE,CAAU;IAIZ,MAAM,CAAU;IAIhB,MAAM,CAAU;IAGhB,SAAS,CAAQ;IAGjB,WAAW,CAAe;IAE1B,cAAc;IAEd,eAAe,CAAU;IAIzB,MAAM,CAAU;IAGhB,UAAU,CAAU;IAGpB,QAAQ,CAAW;IAGnB,SAAS,CAAQ;IAGjB,SAAS,CAAQ;CAClB,CAAA;AArCY,kCAAW;AAEtB;IADC,IAAA,6BAAsB,EAAC,MAAM,CAAC;;uCACnB;AAIZ;IAFC,IAAA,YAAK,GAAE;IACP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;2CACzC;AAIhB;IAFC,IAAA,YAAK,GAAE;IACP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;2CACzC;AAGhB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BACrC,IAAI;8CAAC;AAGjB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;8BACrD,IAAI;gDAAQ;AAI1B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;oDACtC;AAIzB;IAFC,IAAA,YAAK,GAAE;IACP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;;2CAChD;AAGhB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;+CACvC;AAGpB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;6CAC5C;AAGnB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;8CAAC;AAGjB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;8CAAC;sBApCN,WAAW;IADvB,IAAA,aAAM,EAAC,cAAc,CAAC;GACV,WAAW,CAqCvB"}
@@ -0,0 +1,10 @@
1
+ export declare class QuizCategory {
2
+ id: string;
3
+ name: string;
4
+ parentId: string | null;
5
+ description: string | null;
6
+ sortOrder: number;
7
+ createdAt: Date;
8
+ updatedAt: Date;
9
+ }
10
+ //# sourceMappingURL=quiz-category.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-category.entity.d.ts","sourceRoot":"","sources":["../../src/entities/quiz-category.entity.ts"],"names":[],"mappings":"AAQA,qBACa,YAAY;IAEvB,EAAE,EAAG,MAAM,CAAC;IAGZ,IAAI,EAAG,MAAM,CAAC;IAGd,QAAQ,EAAG,MAAM,GAAG,IAAI,CAAC;IAGzB,WAAW,EAAG,MAAM,GAAG,IAAI,CAAC;IAG5B,SAAS,EAAG,MAAM,CAAC;IAGnB,SAAS,EAAG,IAAI,CAAC;IAGjB,SAAS,EAAG,IAAI,CAAC;CAClB"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QuizCategory = void 0;
13
+ const core_1 = require("@octo-cyber/core");
14
+ let QuizCategory = class QuizCategory {
15
+ id;
16
+ name;
17
+ parentId;
18
+ description;
19
+ sortOrder;
20
+ createdAt;
21
+ updatedAt;
22
+ };
23
+ exports.QuizCategory = QuizCategory;
24
+ __decorate([
25
+ (0, core_1.PrimaryGeneratedColumn)('uuid'),
26
+ __metadata("design:type", String)
27
+ ], QuizCategory.prototype, "id", void 0);
28
+ __decorate([
29
+ (0, core_1.Column)({ type: 'varchar', length: 128 }),
30
+ __metadata("design:type", String)
31
+ ], QuizCategory.prototype, "name", void 0);
32
+ __decorate([
33
+ (0, core_1.Column)({ type: 'varchar', length: 36, nullable: true, name: 'parent_id' }),
34
+ __metadata("design:type", String)
35
+ ], QuizCategory.prototype, "parentId", void 0);
36
+ __decorate([
37
+ (0, core_1.Column)({ type: 'text', nullable: true }),
38
+ __metadata("design:type", String)
39
+ ], QuizCategory.prototype, "description", void 0);
40
+ __decorate([
41
+ (0, core_1.Column)({ type: 'int', default: 0, name: 'sort_order' }),
42
+ __metadata("design:type", Number)
43
+ ], QuizCategory.prototype, "sortOrder", void 0);
44
+ __decorate([
45
+ (0, core_1.CreateDateColumn)({ name: 'created_at' }),
46
+ __metadata("design:type", Date)
47
+ ], QuizCategory.prototype, "createdAt", void 0);
48
+ __decorate([
49
+ (0, core_1.UpdateDateColumn)({ name: 'updated_at' }),
50
+ __metadata("design:type", Date)
51
+ ], QuizCategory.prototype, "updatedAt", void 0);
52
+ exports.QuizCategory = QuizCategory = __decorate([
53
+ (0, core_1.Entity)('quiz_category')
54
+ ], QuizCategory);
55
+ //# sourceMappingURL=quiz-category.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-category.entity.js","sourceRoot":"","sources":["../../src/entities/quiz-category.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAM0B;AAGnB,IAAM,YAAY,GAAlB,MAAM,YAAY;IAEvB,EAAE,CAAU;IAGZ,IAAI,CAAU;IAGd,QAAQ,CAAiB;IAGzB,WAAW,CAAiB;IAG5B,SAAS,CAAU;IAGnB,SAAS,CAAQ;IAGjB,SAAS,CAAQ;CAClB,CAAA;AArBY,oCAAY;AAEvB;IADC,IAAA,6BAAsB,EAAC,MAAM,CAAC;;wCACnB;AAGZ;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;0CAC3B;AAGd;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;8CAClD;AAGzB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDACb;AAG5B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;+CACrC;AAGnB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;+CAAC;AAGjB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;+CAAC;uBApBN,YAAY;IADxB,IAAA,aAAM,EAAC,eAAe,CAAC;GACX,YAAY,CAqBxB"}
@@ -0,0 +1,25 @@
1
+ export declare const EXAM_STATUSES: readonly ["DRAFT", "SCHEDULED", "ONGOING", "ENDED", "CANCELLED"];
2
+ export type ExamStatus = typeof EXAM_STATUSES[number];
3
+ export declare class QuizExam {
4
+ id: string;
5
+ title: string;
6
+ paperId: string;
7
+ description: string | null;
8
+ /** 开始时间,null 表示随时可以参加 */
9
+ startTime: Date | null;
10
+ /** 结束时间,null 表示不限截止 */
11
+ endTime: Date | null;
12
+ /** 最多允许参加次数,0 表示不限 */
13
+ maxAttempts: number;
14
+ /** 是否随机排列题目顺序 */
15
+ shuffleQuestions: boolean;
16
+ /** 是否随机排列选项顺序 */
17
+ shuffleOptions: boolean;
18
+ /** 提交后是否立即展示答案解析 */
19
+ showAnswerAfterSubmit: boolean;
20
+ status: string;
21
+ createdBy: string | null;
22
+ createdAt: Date;
23
+ updatedAt: Date;
24
+ }
25
+ //# sourceMappingURL=quiz-exam.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-exam.entity.d.ts","sourceRoot":"","sources":["../../src/entities/quiz-exam.entity.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,aAAa,kEAAmE,CAAC;AAC9F,MAAM,MAAM,UAAU,GAAG,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtD,qBACa,QAAQ;IAEnB,EAAE,EAAG,MAAM,CAAC;IAGZ,KAAK,EAAG,MAAM,CAAC;IAIf,OAAO,EAAG,MAAM,CAAC;IAGjB,WAAW,EAAG,MAAM,GAAG,IAAI,CAAC;IAE5B,yBAAyB;IAEzB,SAAS,EAAG,IAAI,GAAG,IAAI,CAAC;IAExB,uBAAuB;IAEvB,OAAO,EAAG,IAAI,GAAG,IAAI,CAAC;IAEtB,sBAAsB;IAEtB,WAAW,EAAG,MAAM,CAAC;IAErB,iBAAiB;IAEjB,gBAAgB,EAAG,OAAO,CAAC;IAE3B,iBAAiB;IAEjB,cAAc,EAAG,OAAO,CAAC;IAEzB,oBAAoB;IAEpB,qBAAqB,EAAG,OAAO,CAAC;IAIhC,MAAM,EAAG,MAAM,CAAC;IAGhB,SAAS,EAAG,MAAM,GAAG,IAAI,CAAC;IAG1B,SAAS,EAAG,IAAI,CAAC;IAGjB,SAAS,EAAG,IAAI,CAAC;CAClB"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QuizExam = exports.EXAM_STATUSES = void 0;
13
+ const core_1 = require("@octo-cyber/core");
14
+ exports.EXAM_STATUSES = ['DRAFT', 'SCHEDULED', 'ONGOING', 'ENDED', 'CANCELLED'];
15
+ let QuizExam = class QuizExam {
16
+ id;
17
+ title;
18
+ paperId;
19
+ description;
20
+ /** 开始时间,null 表示随时可以参加 */
21
+ startTime;
22
+ /** 结束时间,null 表示不限截止 */
23
+ endTime;
24
+ /** 最多允许参加次数,0 表示不限 */
25
+ maxAttempts;
26
+ /** 是否随机排列题目顺序 */
27
+ shuffleQuestions;
28
+ /** 是否随机排列选项顺序 */
29
+ shuffleOptions;
30
+ /** 提交后是否立即展示答案解析 */
31
+ showAnswerAfterSubmit;
32
+ status;
33
+ createdBy;
34
+ createdAt;
35
+ updatedAt;
36
+ };
37
+ exports.QuizExam = QuizExam;
38
+ __decorate([
39
+ (0, core_1.PrimaryGeneratedColumn)('uuid'),
40
+ __metadata("design:type", String)
41
+ ], QuizExam.prototype, "id", void 0);
42
+ __decorate([
43
+ (0, core_1.Column)({ type: 'varchar', length: 256 }),
44
+ __metadata("design:type", String)
45
+ ], QuizExam.prototype, "title", void 0);
46
+ __decorate([
47
+ (0, core_1.Index)(),
48
+ (0, core_1.Column)({ type: 'varchar', length: 36, name: 'paper_id' }),
49
+ __metadata("design:type", String)
50
+ ], QuizExam.prototype, "paperId", void 0);
51
+ __decorate([
52
+ (0, core_1.Column)({ type: 'text', nullable: true }),
53
+ __metadata("design:type", String)
54
+ ], QuizExam.prototype, "description", void 0);
55
+ __decorate([
56
+ (0, core_1.Column)({ type: 'datetime', nullable: true, name: 'start_time' }),
57
+ __metadata("design:type", Date)
58
+ ], QuizExam.prototype, "startTime", void 0);
59
+ __decorate([
60
+ (0, core_1.Column)({ type: 'datetime', nullable: true, name: 'end_time' }),
61
+ __metadata("design:type", Date)
62
+ ], QuizExam.prototype, "endTime", void 0);
63
+ __decorate([
64
+ (0, core_1.Column)({ type: 'int', default: 1, name: 'max_attempts' }),
65
+ __metadata("design:type", Number)
66
+ ], QuizExam.prototype, "maxAttempts", void 0);
67
+ __decorate([
68
+ (0, core_1.Column)({ type: 'boolean', default: false, name: 'shuffle_questions' }),
69
+ __metadata("design:type", Boolean)
70
+ ], QuizExam.prototype, "shuffleQuestions", void 0);
71
+ __decorate([
72
+ (0, core_1.Column)({ type: 'boolean', default: false, name: 'shuffle_options' }),
73
+ __metadata("design:type", Boolean)
74
+ ], QuizExam.prototype, "shuffleOptions", void 0);
75
+ __decorate([
76
+ (0, core_1.Column)({ type: 'boolean', default: false, name: 'show_answer_after_submit' }),
77
+ __metadata("design:type", Boolean)
78
+ ], QuizExam.prototype, "showAnswerAfterSubmit", void 0);
79
+ __decorate([
80
+ (0, core_1.Index)(),
81
+ (0, core_1.Column)({ type: 'varchar', length: 16, default: 'DRAFT' }),
82
+ __metadata("design:type", String)
83
+ ], QuizExam.prototype, "status", void 0);
84
+ __decorate([
85
+ (0, core_1.Column)({ type: 'varchar', length: 36, nullable: true, name: 'created_by' }),
86
+ __metadata("design:type", String)
87
+ ], QuizExam.prototype, "createdBy", void 0);
88
+ __decorate([
89
+ (0, core_1.CreateDateColumn)({ name: 'created_at' }),
90
+ __metadata("design:type", Date)
91
+ ], QuizExam.prototype, "createdAt", void 0);
92
+ __decorate([
93
+ (0, core_1.UpdateDateColumn)({ name: 'updated_at' }),
94
+ __metadata("design:type", Date)
95
+ ], QuizExam.prototype, "updatedAt", void 0);
96
+ exports.QuizExam = QuizExam = __decorate([
97
+ (0, core_1.Entity)('quiz_exam')
98
+ ], QuizExam);
99
+ //# sourceMappingURL=quiz-exam.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-exam.entity.js","sourceRoot":"","sources":["../../src/entities/quiz-exam.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAO0B;AAEb,QAAA,aAAa,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAU,CAAC;AAIvF,IAAM,QAAQ,GAAd,MAAM,QAAQ;IAEnB,EAAE,CAAU;IAGZ,KAAK,CAAU;IAIf,OAAO,CAAU;IAGjB,WAAW,CAAiB;IAE5B,yBAAyB;IAEzB,SAAS,CAAe;IAExB,uBAAuB;IAEvB,OAAO,CAAe;IAEtB,sBAAsB;IAEtB,WAAW,CAAU;IAErB,iBAAiB;IAEjB,gBAAgB,CAAW;IAE3B,iBAAiB;IAEjB,cAAc,CAAW;IAEzB,oBAAoB;IAEpB,qBAAqB,CAAW;IAIhC,MAAM,CAAU;IAGhB,SAAS,CAAiB;IAG1B,SAAS,CAAQ;IAGjB,SAAS,CAAQ;CAClB,CAAA;AAlDY,4BAAQ;AAEnB;IADC,IAAA,6BAAsB,EAAC,MAAM,CAAC;;oCACnB;AAGZ;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;uCAC1B;AAIf;IAFC,IAAA,YAAK,GAAE;IACP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;yCACzC;AAGjB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACb;AAI5B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BACrD,IAAI;2CAAQ;AAIxB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;8BACrD,IAAI;yCAAQ;AAItB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;;6CACrC;AAIrB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;kDAC5C;AAI3B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;gDAC5C;AAIzB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;;uDAC9C;AAIhC;IAFC,IAAA,YAAK,GAAE;IACP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;;wCAC1C;AAGhB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;2CAClD;AAG1B;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;2CAAC;AAGjB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;2CAAC;mBAjDN,QAAQ;IADpB,IAAA,aAAM,EAAC,WAAW,CAAC;GACP,QAAQ,CAkDpB"}
@@ -0,0 +1,12 @@
1
+ export declare class QuizPaperQuestion {
2
+ id: string;
3
+ paperId: string;
4
+ questionId: string;
5
+ /** 在本试卷中的分值(可覆盖题目默认分值) */
6
+ score: number;
7
+ sortOrder: number;
8
+ /** 分节标题(用于将题目分组,如"第一部分:基础知识") */
9
+ sectionTitle: string | null;
10
+ createdAt: Date;
11
+ }
12
+ //# sourceMappingURL=quiz-paper-question.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-paper-question.entity.d.ts","sourceRoot":"","sources":["../../src/entities/quiz-paper-question.entity.ts"],"names":[],"mappings":"AAQA,qBACa,iBAAiB;IAE5B,EAAE,EAAG,MAAM,CAAC;IAIZ,OAAO,EAAG,MAAM,CAAC;IAGjB,UAAU,EAAG,MAAM,CAAC;IAEpB,0BAA0B;IAE1B,KAAK,EAAG,MAAM,CAAC;IAGf,SAAS,EAAG,MAAM,CAAC;IAEnB,iCAAiC;IAEjC,YAAY,EAAG,MAAM,GAAG,IAAI,CAAC;IAG7B,SAAS,EAAG,IAAI,CAAC;CAClB"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QuizPaperQuestion = void 0;
13
+ const core_1 = require("@octo-cyber/core");
14
+ let QuizPaperQuestion = class QuizPaperQuestion {
15
+ id;
16
+ paperId;
17
+ questionId;
18
+ /** 在本试卷中的分值(可覆盖题目默认分值) */
19
+ score;
20
+ sortOrder;
21
+ /** 分节标题(用于将题目分组,如"第一部分:基础知识") */
22
+ sectionTitle;
23
+ createdAt;
24
+ };
25
+ exports.QuizPaperQuestion = QuizPaperQuestion;
26
+ __decorate([
27
+ (0, core_1.PrimaryGeneratedColumn)('uuid'),
28
+ __metadata("design:type", String)
29
+ ], QuizPaperQuestion.prototype, "id", void 0);
30
+ __decorate([
31
+ (0, core_1.Index)(),
32
+ (0, core_1.Column)({ type: 'varchar', length: 36, name: 'paper_id' }),
33
+ __metadata("design:type", String)
34
+ ], QuizPaperQuestion.prototype, "paperId", void 0);
35
+ __decorate([
36
+ (0, core_1.Column)({ type: 'varchar', length: 36, name: 'question_id' }),
37
+ __metadata("design:type", String)
38
+ ], QuizPaperQuestion.prototype, "questionId", void 0);
39
+ __decorate([
40
+ (0, core_1.Column)({ type: 'float', default: 1 }),
41
+ __metadata("design:type", Number)
42
+ ], QuizPaperQuestion.prototype, "score", void 0);
43
+ __decorate([
44
+ (0, core_1.Column)({ type: 'int', default: 0, name: 'sort_order' }),
45
+ __metadata("design:type", Number)
46
+ ], QuizPaperQuestion.prototype, "sortOrder", void 0);
47
+ __decorate([
48
+ (0, core_1.Column)({ type: 'varchar', length: 128, nullable: true, name: 'section_title' }),
49
+ __metadata("design:type", String)
50
+ ], QuizPaperQuestion.prototype, "sectionTitle", void 0);
51
+ __decorate([
52
+ (0, core_1.CreateDateColumn)({ name: 'created_at' }),
53
+ __metadata("design:type", Date)
54
+ ], QuizPaperQuestion.prototype, "createdAt", void 0);
55
+ exports.QuizPaperQuestion = QuizPaperQuestion = __decorate([
56
+ (0, core_1.Entity)('quiz_paper_question')
57
+ ], QuizPaperQuestion);
58
+ //# sourceMappingURL=quiz-paper-question.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-paper-question.entity.js","sourceRoot":"","sources":["../../src/entities/quiz-paper-question.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAM0B;AAGnB,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAE5B,EAAE,CAAU;IAIZ,OAAO,CAAU;IAGjB,UAAU,CAAU;IAEpB,0BAA0B;IAE1B,KAAK,CAAU;IAGf,SAAS,CAAU;IAEnB,iCAAiC;IAEjC,YAAY,CAAiB;IAG7B,SAAS,CAAQ;CAClB,CAAA;AAxBY,8CAAiB;AAE5B;IADC,IAAA,6BAAsB,EAAC,MAAM,CAAC;;6CACnB;AAIZ;IAFC,IAAA,YAAK,GAAE;IACP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;kDACzC;AAGjB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;qDACzC;AAIpB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;gDACvB;AAGf;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;oDACrC;AAInB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;uDACnD;AAG7B;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;oDAAC;4BAvBN,iBAAiB;IAD7B,IAAA,aAAM,EAAC,qBAAqB,CAAC;GACjB,iBAAiB,CAwB7B"}
@@ -0,0 +1,18 @@
1
+ export declare const PAPER_STATUSES: readonly ["DRAFT", "PUBLISHED", "ARCHIVED"];
2
+ export type PaperStatus = typeof PAPER_STATUSES[number];
3
+ export declare class QuizPaper {
4
+ id: string;
5
+ title: string;
6
+ description: string | null;
7
+ /** 试卷总分(汇总自题目分值) */
8
+ totalScore: number;
9
+ /** 及格分 */
10
+ passingScore: number;
11
+ /** 考试时限(分钟),0 表示不限 */
12
+ timeLimit: number;
13
+ status: string;
14
+ createdBy: string | null;
15
+ createdAt: Date;
16
+ updatedAt: Date;
17
+ }
18
+ //# sourceMappingURL=quiz-paper.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-paper.entity.d.ts","sourceRoot":"","sources":["../../src/entities/quiz-paper.entity.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,cAAc,6CAA8C,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAExD,qBACa,SAAS;IAEpB,EAAE,EAAG,MAAM,CAAC;IAGZ,KAAK,EAAG,MAAM,CAAC;IAGf,WAAW,EAAG,MAAM,GAAG,IAAI,CAAC;IAE5B,oBAAoB;IAEpB,UAAU,EAAG,MAAM,CAAC;IAEpB,UAAU;IAEV,YAAY,EAAG,MAAM,CAAC;IAEtB,sBAAsB;IAEtB,SAAS,EAAG,MAAM,CAAC;IAInB,MAAM,EAAG,MAAM,CAAC;IAGhB,SAAS,EAAG,MAAM,GAAG,IAAI,CAAC;IAG1B,SAAS,EAAG,IAAI,CAAC;IAGjB,SAAS,EAAG,IAAI,CAAC;CAClB"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QuizPaper = exports.PAPER_STATUSES = void 0;
13
+ const core_1 = require("@octo-cyber/core");
14
+ exports.PAPER_STATUSES = ['DRAFT', 'PUBLISHED', 'ARCHIVED'];
15
+ let QuizPaper = class QuizPaper {
16
+ id;
17
+ title;
18
+ description;
19
+ /** 试卷总分(汇总自题目分值) */
20
+ totalScore;
21
+ /** 及格分 */
22
+ passingScore;
23
+ /** 考试时限(分钟),0 表示不限 */
24
+ timeLimit;
25
+ status;
26
+ createdBy;
27
+ createdAt;
28
+ updatedAt;
29
+ };
30
+ exports.QuizPaper = QuizPaper;
31
+ __decorate([
32
+ (0, core_1.PrimaryGeneratedColumn)('uuid'),
33
+ __metadata("design:type", String)
34
+ ], QuizPaper.prototype, "id", void 0);
35
+ __decorate([
36
+ (0, core_1.Column)({ type: 'varchar', length: 256 }),
37
+ __metadata("design:type", String)
38
+ ], QuizPaper.prototype, "title", void 0);
39
+ __decorate([
40
+ (0, core_1.Column)({ type: 'text', nullable: true }),
41
+ __metadata("design:type", String)
42
+ ], QuizPaper.prototype, "description", void 0);
43
+ __decorate([
44
+ (0, core_1.Column)({ type: 'float', default: 0, name: 'total_score' }),
45
+ __metadata("design:type", Number)
46
+ ], QuizPaper.prototype, "totalScore", void 0);
47
+ __decorate([
48
+ (0, core_1.Column)({ type: 'float', default: 60, name: 'passing_score' }),
49
+ __metadata("design:type", Number)
50
+ ], QuizPaper.prototype, "passingScore", void 0);
51
+ __decorate([
52
+ (0, core_1.Column)({ type: 'int', default: 0, name: 'time_limit' }),
53
+ __metadata("design:type", Number)
54
+ ], QuizPaper.prototype, "timeLimit", void 0);
55
+ __decorate([
56
+ (0, core_1.Index)(),
57
+ (0, core_1.Column)({ type: 'varchar', length: 16, default: 'DRAFT' }),
58
+ __metadata("design:type", String)
59
+ ], QuizPaper.prototype, "status", void 0);
60
+ __decorate([
61
+ (0, core_1.Column)({ type: 'varchar', length: 36, nullable: true, name: 'created_by' }),
62
+ __metadata("design:type", String)
63
+ ], QuizPaper.prototype, "createdBy", void 0);
64
+ __decorate([
65
+ (0, core_1.CreateDateColumn)({ name: 'created_at' }),
66
+ __metadata("design:type", Date)
67
+ ], QuizPaper.prototype, "createdAt", void 0);
68
+ __decorate([
69
+ (0, core_1.UpdateDateColumn)({ name: 'updated_at' }),
70
+ __metadata("design:type", Date)
71
+ ], QuizPaper.prototype, "updatedAt", void 0);
72
+ exports.QuizPaper = QuizPaper = __decorate([
73
+ (0, core_1.Entity)('quiz_paper')
74
+ ], QuizPaper);
75
+ //# sourceMappingURL=quiz-paper.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-paper.entity.js","sourceRoot":"","sources":["../../src/entities/quiz-paper.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAO0B;AAEb,QAAA,cAAc,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAInE,IAAM,SAAS,GAAf,MAAM,SAAS;IAEpB,EAAE,CAAU;IAGZ,KAAK,CAAU;IAGf,WAAW,CAAiB;IAE5B,oBAAoB;IAEpB,UAAU,CAAU;IAEpB,UAAU;IAEV,YAAY,CAAU;IAEtB,sBAAsB;IAEtB,SAAS,CAAU;IAInB,MAAM,CAAU;IAGhB,SAAS,CAAiB;IAG1B,SAAS,CAAQ;IAGjB,SAAS,CAAQ;CAClB,CAAA;AAlCY,8BAAS;AAEpB;IADC,IAAA,6BAAsB,EAAC,MAAM,CAAC;;qCACnB;AAGZ;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;wCAC1B;AAGf;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CACb;AAI5B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;6CACvC;AAIpB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;+CACxC;AAItB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;4CACrC;AAInB;IAFC,IAAA,YAAK,GAAE;IACP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;;yCAC1C;AAGhB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;4CAClD;AAG1B;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;4CAAC;AAGjB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;4CAAC;oBAjCN,SAAS;IADrB,IAAA,aAAM,EAAC,YAAY,CAAC;GACR,SAAS,CAkCrB"}
@@ -0,0 +1,28 @@
1
+ export declare const QUESTION_TYPES: readonly ["SINGLE_CHOICE", "MULTIPLE_CHOICE", "TRUE_FALSE", "FILL_BLANK", "ESSAY"];
2
+ export type QuestionType = typeof QUESTION_TYPES[number];
3
+ export declare const DIFFICULTY_LEVELS: readonly [1, 2, 3, 4, 5];
4
+ export type DifficultyLevel = typeof DIFFICULTY_LEVELS[number];
5
+ export declare class QuizQuestion {
6
+ id: string;
7
+ categoryId: string | null;
8
+ type: string;
9
+ /** 题目正文,支持 Markdown */
10
+ content: string;
11
+ /** 选项列表 JSON: [{ key: 'A', text: '...' }] — 仅选择题使用 */
12
+ options: string | null;
13
+ /** 正确答案 JSON: string | string[] — 单选 'A',多选 ['A','C'],判断 'true'/'false' */
14
+ correctAnswer: string | null;
15
+ /** 解析说明 */
16
+ explanation: string | null;
17
+ /** 难度 1-5 */
18
+ difficulty: number;
19
+ /** 标签 JSON: string[] */
20
+ tags: string | null;
21
+ /** 该题默认分值 */
22
+ defaultScore: number;
23
+ useCount: number;
24
+ createdBy: string | null;
25
+ createdAt: Date;
26
+ updatedAt: Date;
27
+ }
28
+ //# sourceMappingURL=quiz-question.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-question.entity.d.ts","sourceRoot":"","sources":["../../src/entities/quiz-question.entity.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,cAAc,oFAMjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,iBAAiB,0BAA2B,CAAC;AAC1D,MAAM,MAAM,eAAe,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE/D,qBACa,YAAY;IAEvB,EAAE,EAAG,MAAM,CAAC;IAIZ,UAAU,EAAG,MAAM,GAAG,IAAI,CAAC;IAI3B,IAAI,EAAG,MAAM,CAAC;IAEd,uBAAuB;IAEvB,OAAO,EAAG,MAAM,CAAC;IAEjB,sDAAsD;IAEtD,OAAO,EAAG,MAAM,GAAG,IAAI,CAAC;IAExB,2EAA2E;IAE3E,aAAa,EAAG,MAAM,GAAG,IAAI,CAAC;IAE9B,WAAW;IAEX,WAAW,EAAG,MAAM,GAAG,IAAI,CAAC;IAE5B,aAAa;IAEb,UAAU,EAAG,MAAM,CAAC;IAEpB,wBAAwB;IAExB,IAAI,EAAG,MAAM,GAAG,IAAI,CAAC;IAErB,aAAa;IAEb,YAAY,EAAG,MAAM,CAAC;IAGtB,QAAQ,EAAG,MAAM,CAAC;IAGlB,SAAS,EAAG,MAAM,GAAG,IAAI,CAAC;IAG1B,SAAS,EAAG,IAAI,CAAC;IAGjB,SAAS,EAAG,IAAI,CAAC;CAClB"}