@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.
- package/dist/controllers/attempt.controller.d.ts +3 -0
- package/dist/controllers/attempt.controller.d.ts.map +1 -0
- package/dist/controllers/attempt.controller.js +83 -0
- package/dist/controllers/attempt.controller.js.map +1 -0
- package/dist/controllers/category.controller.d.ts +3 -0
- package/dist/controllers/category.controller.d.ts.map +1 -0
- package/dist/controllers/category.controller.js +38 -0
- package/dist/controllers/category.controller.js.map +1 -0
- package/dist/controllers/exam.controller.d.ts +3 -0
- package/dist/controllers/exam.controller.d.ts.map +1 -0
- package/dist/controllers/exam.controller.js +48 -0
- package/dist/controllers/exam.controller.js.map +1 -0
- package/dist/controllers/index.d.ts +7 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +16 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/paper.controller.d.ts +3 -0
- package/dist/controllers/paper.controller.d.ts.map +1 -0
- package/dist/controllers/paper.controller.js +70 -0
- package/dist/controllers/paper.controller.js.map +1 -0
- package/dist/controllers/question.controller.d.ts +3 -0
- package/dist/controllers/question.controller.d.ts.map +1 -0
- package/dist/controllers/question.controller.js +59 -0
- package/dist/controllers/question.controller.js.map +1 -0
- package/dist/controllers/statistics.controller.d.ts +3 -0
- package/dist/controllers/statistics.controller.d.ts.map +1 -0
- package/dist/controllers/statistics.controller.js +37 -0
- package/dist/controllers/statistics.controller.js.map +1 -0
- package/dist/entities/index.d.ts +24 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +43 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/quiz-answer.entity.d.ts +19 -0
- package/dist/entities/quiz-answer.entity.d.ts.map +1 -0
- package/dist/entities/quiz-answer.entity.js +81 -0
- package/dist/entities/quiz-answer.entity.js.map +1 -0
- package/dist/entities/quiz-attempt.entity.d.ts +17 -0
- package/dist/entities/quiz-attempt.entity.d.ts.map +1 -0
- package/dist/entities/quiz-attempt.entity.js +80 -0
- package/dist/entities/quiz-attempt.entity.js.map +1 -0
- package/dist/entities/quiz-category.entity.d.ts +10 -0
- package/dist/entities/quiz-category.entity.d.ts.map +1 -0
- package/dist/entities/quiz-category.entity.js +55 -0
- package/dist/entities/quiz-category.entity.js.map +1 -0
- package/dist/entities/quiz-exam.entity.d.ts +25 -0
- package/dist/entities/quiz-exam.entity.d.ts.map +1 -0
- package/dist/entities/quiz-exam.entity.js +99 -0
- package/dist/entities/quiz-exam.entity.js.map +1 -0
- package/dist/entities/quiz-paper-question.entity.d.ts +12 -0
- package/dist/entities/quiz-paper-question.entity.d.ts.map +1 -0
- package/dist/entities/quiz-paper-question.entity.js +58 -0
- package/dist/entities/quiz-paper-question.entity.js.map +1 -0
- package/dist/entities/quiz-paper.entity.d.ts +18 -0
- package/dist/entities/quiz-paper.entity.d.ts.map +1 -0
- package/dist/entities/quiz-paper.entity.js +75 -0
- package/dist/entities/quiz-paper.entity.js.map +1 -0
- package/dist/entities/quiz-question.entity.d.ts +28 -0
- package/dist/entities/quiz-question.entity.d.ts.map +1 -0
- package/dist/entities/quiz-question.entity.js +107 -0
- package/dist/entities/quiz-question.entity.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/quiz-engine.module.d.ts +8 -0
- package/dist/quiz-engine.module.d.ts.map +1 -0
- package/dist/quiz-engine.module.js +45 -0
- package/dist/quiz-engine.module.js.map +1 -0
- package/dist/schemas/attempt.schema.d.ts +47 -0
- package/dist/schemas/attempt.schema.d.ts.map +1 -0
- package/dist/schemas/attempt.schema.js +19 -0
- package/dist/schemas/attempt.schema.js.map +1 -0
- package/dist/schemas/category.schema.d.ts +36 -0
- package/dist/schemas/category.schema.d.ts.map +1 -0
- package/dist/schemas/category.schema.js +12 -0
- package/dist/schemas/category.schema.js.map +1 -0
- package/dist/schemas/exam.schema.d.ts +70 -0
- package/dist/schemas/exam.schema.d.ts.map +1 -0
- package/dist/schemas/exam.schema.js +20 -0
- package/dist/schemas/exam.schema.js.map +1 -0
- package/dist/schemas/paper.schema.d.ts +71 -0
- package/dist/schemas/paper.schema.d.ts.map +1 -0
- package/dist/schemas/paper.schema.js +26 -0
- package/dist/schemas/paper.schema.js.map +1 -0
- package/dist/schemas/question.schema.d.ts +147 -0
- package/dist/schemas/question.schema.d.ts.map +1 -0
- package/dist/schemas/question.schema.js +32 -0
- package/dist/schemas/question.schema.js.map +1 -0
- package/dist/services/attempt.service.d.ts +33 -0
- package/dist/services/attempt.service.d.ts.map +1 -0
- package/dist/services/attempt.service.js +197 -0
- package/dist/services/attempt.service.js.map +1 -0
- package/dist/services/category.service.d.ts +14 -0
- package/dist/services/category.service.d.ts.map +1 -0
- package/dist/services/category.service.js +74 -0
- package/dist/services/category.service.js.map +1 -0
- package/dist/services/exam.service.d.ts +17 -0
- package/dist/services/exam.service.d.ts.map +1 -0
- package/dist/services/exam.service.js +92 -0
- package/dist/services/exam.service.js.map +1 -0
- package/dist/services/grade.service.d.ts +16 -0
- package/dist/services/grade.service.d.ts.map +1 -0
- package/dist/services/grade.service.js +75 -0
- package/dist/services/grade.service.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/paper.service.d.ts +32 -0
- package/dist/services/paper.service.d.ts.map +1 -0
- package/dist/services/paper.service.js +157 -0
- package/dist/services/paper.service.js.map +1 -0
- package/dist/services/question.service.d.ts +30 -0
- package/dist/services/question.service.d.ts.map +1 -0
- package/dist/services/question.service.js +155 -0
- package/dist/services/question.service.js.map +1 -0
- package/dist/services/statistics.service.d.ts +43 -0
- package/dist/services/statistics.service.d.ts.map +1 -0
- package/dist/services/statistics.service.js +134 -0
- package/dist/services/statistics.service.js.map +1 -0
- package/package.json +85 -0
- package/web/index.ts +51 -0
- package/web/manifest.ts +36 -0
- package/web/messages/en-US.json +143 -0
- package/web/messages/zh-CN.json +143 -0
- package/web/pages/ExamRoomPage.tsx +289 -0
- package/web/pages/ExamsPage.tsx +248 -0
- package/web/pages/PapersPage.tsx +202 -0
- package/web/pages/QuestionBankPage.tsx +263 -0
- package/web/pages/StatisticsPage.tsx +178 -0
- package/web/services/attempt-service.ts +53 -0
- package/web/services/category-service.ts +26 -0
- package/web/services/exam-service.ts +31 -0
- package/web/services/paper-service.ts +50 -0
- package/web/services/question-service.ts +36 -0
- package/web/services/statistics-service.ts +28 -0
- package/web/stores/quiz-store.ts +31 -0
- 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 @@
|
|
|
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"}
|