Skip to content

Commit 5d5e620

Browse files
committed
feat: question campus
1 parent 14d7961 commit 5d5e620

3 files changed

Lines changed: 122 additions & 61 deletions

File tree

apis/cache.go

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,28 +115,45 @@ LOAD_FILES:
115115
currentQuestion := &questionConfig.Questions[i]
116116
if currentQuestion.Group == "required" {
117117
questionConfig.RequiredQuestions = append(questionConfig.RequiredQuestions, currentQuestion)
118-
} else {
118+
} else if currentQuestion.Group == "optional" {
119119
questionConfig.OptionalQuestions = append(questionConfig.OptionalQuestions, currentQuestion)
120+
} else if currentQuestion.Group == "campus" {
121+
questionConfig.CampusQuestions = append(questionConfig.CampusQuestions, currentQuestion)
120122
}
121123
}
122124

123-
if questionConfig.Spec.NumberOfQuestions > 0 {
124-
if questionConfig.Spec.NumberOfQuestions < len(questionConfig.RequiredQuestions) {
125+
if questionConfig.Spec.NumberOfOptionalQuestions > 0 {
126+
if questionConfig.Spec.NumberOfOptionalQuestions > len(questionConfig.OptionalQuestions) {
125127
log.Warn().
126128
Str("filename", file.Name()).
127-
Int("number_of_questions", questionConfig.Spec.NumberOfQuestions).
128-
Int("number_of_required_questions", len(questionConfig.RequiredQuestions)).
129-
Msg("expected number of questions is less than number of required questions")
129+
Int("number_of_optional_questions", questionConfig.Spec.NumberOfOptionalQuestions).
130+
Int("number_of_optional_questions", len(questionConfig.OptionalQuestions)).
131+
Msg("expected number of optional questions is greater than number of optional questions")
130132
continue LOAD_FILES
131133
}
132-
if questionConfig.Spec.NumberOfQuestions > len(questionConfig.Questions) {
134+
} else if questionConfig.Spec.NumberOfOptionalQuestions < -1 {
135+
log.Warn().
136+
Str("filename", file.Name()).
137+
Int("number_of_optional_questions", questionConfig.Spec.NumberOfOptionalQuestions).
138+
Msg("expected number of optional questions is less than -1")
139+
continue LOAD_FILES
140+
}
141+
142+
if questionConfig.Spec.NumberOfCampusQuestions > 0 {
143+
if questionConfig.Spec.NumberOfCampusQuestions > len(questionConfig.CampusQuestions) {
133144
log.Warn().
134145
Str("filename", file.Name()).
135-
Int("number_of_questions", questionConfig.Spec.NumberOfQuestions).
136-
Int("number_of_questions", len(questionConfig.Questions)).
137-
Msg("expected number of questions is greater than number of questions")
146+
Int("number_of_campus_questions", questionConfig.Spec.NumberOfCampusQuestions).
147+
Int("number_of_campus_questions", len(questionConfig.CampusQuestions)).
148+
Msg("expected number of campus questions is greater than number of campus questions")
138149
continue LOAD_FILES
139150
}
151+
} else if questionConfig.Spec.NumberOfCampusQuestions < -1 {
152+
log.Warn().
153+
Str("filename", file.Name()).
154+
Int("number_of_campus_questions", questionConfig.Spec.NumberOfCampusQuestions).
155+
Msg("expected number of campus questions is less than 0")
156+
continue LOAD_FILES
140157
}
141158

142159
valid := true

apis/question.go

Lines changed: 83 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -49,74 +49,101 @@ func RetrieveQuestions(c *fiber.Ctx) (err error) {
4949
}
5050

5151
var (
52-
questions = questionConfig.Questions
53-
requiredQuestions = questionConfig.RequiredQuestions
54-
optionalQuestions = questionConfig.OptionalQuestions
55-
number = questionConfig.Spec.NumberOfQuestions
56-
inOrder = questionConfig.Spec.InOrder
52+
// questions = questionConfig.Questions
53+
// number = questionConfig.Spec.NumberOfQuestions
54+
requiredQuestions = questionConfig.RequiredQuestions
55+
optionalQuestions = questionConfig.OptionalQuestions
56+
campusQuestions = questionConfig.CampusQuestions
57+
numberOfOptionalQuestions = questionConfig.Spec.NumberOfOptionalQuestions
58+
numberOfCampusQuestions = questionConfig.Spec.NumberOfCampusQuestions
59+
inOrder = questionConfig.Spec.InOrder
5760
)
5861

62+
number := len(requiredQuestions)
63+
if numberOfOptionalQuestions == -1 {
64+
number += len(optionalQuestions)
65+
} else if numberOfOptionalQuestions >= 0 {
66+
number += numberOfOptionalQuestions
67+
} else {
68+
return common.InternalServerError("[retrieve questions]: number of optional questions invalid")
69+
}
70+
if numberOfCampusQuestions == -1 {
71+
number += len(campusQuestions)
72+
} else if numberOfCampusQuestions >= 0 {
73+
number += numberOfCampusQuestions
74+
} else {
75+
return common.InternalServerError("[retrieve questions]: number of campus questions invalid")
76+
}
77+
5978
var questionsResponse = QuestionConfig{
6079
Version: version,
6180
Spec: QuestionSpec{
62-
NumberOfQuestions: number,
63-
InOrder: inOrder,
81+
NumberOfOptionalQuestions: numberOfOptionalQuestions,
82+
NumberOfCampusQuestions: numberOfCampusQuestions,
83+
NumberOfQuestions: number,
84+
InOrder: inOrder,
6485
},
6586
}
6687

67-
if number == 0 {
68-
// send all questions
69-
questionsResponse.Questions = make([]Question, len(questions))
70-
copy(questionsResponse.Questions, questions)
88+
questionsResponse.Questions = make([]Question, number)
89+
tmpQuestions := make([]*Question, 0, number)
7190

72-
} else if number == -1 {
73-
// send all required questions
74-
questionsResponse.Questions = make([]Question, len(requiredQuestions))
91+
if number == 0 {
92+
return common.InternalServerError("[retrieve questions]: number of questions too small")
93+
}
7594

76-
for i, question := range requiredQuestions {
77-
questionsResponse.Questions[i] = *question
78-
}
79-
} else {
80-
// send all required questions and part of random optional questions according to number
81-
// be sure that number == len(requiredQuestions) + len(chosenOptionalQuestions)
82-
// if number < len(requiredQuestions), return error
83-
questionsResponse.Questions = make([]Question, number)
84-
optionalQuestionsNumber := number - len(requiredQuestions)
85-
if optionalQuestionsNumber < 0 {
86-
return common.InternalServerError("[retrieve questions]: number of questions too small")
87-
}
95+
copy(tmpQuestions, requiredQuestions)
8896

89-
for i, question := range requiredQuestions {
90-
questionsResponse.Questions[i] = *question
91-
}
97+
// for i, question := range requiredQuestions {
98+
// tmpQuestions[i] = question
99+
// // questionsResponse.Questions[i] = *question
100+
// }
92101

102+
// questionConfig.Questions = append(questionConfig.Questions, optionalQuestions...)
103+
if numberOfOptionalQuestions == -1 {
104+
// send all opntional questions
105+
tmpQuestions = append(tmpQuestions, optionalQuestions...)
106+
} else if numberOfOptionalQuestions > 0 {
93107
// shuffle optional questions
94-
if optionalQuestionsNumber > 0 {
95-
chosenOptionalQuestions := make([]*Question, len(optionalQuestions))
96-
copy(chosenOptionalQuestions, optionalQuestions)
97-
rand.Shuffle(len(chosenOptionalQuestions), func(i, j int) {
98-
chosenOptionalQuestions[i], chosenOptionalQuestions[j] = chosenOptionalQuestions[j], chosenOptionalQuestions[i]
99-
})
100-
101-
for i, question := range chosenOptionalQuestions {
102-
questionsResponse.Questions[i+len(requiredQuestions)] = *question
103-
if i == optionalQuestionsNumber-1 {
104-
break
105-
}
106-
}
107-
}
108+
chosenOptionalQuestions := make([]*Question, len(optionalQuestions))
109+
copy(chosenOptionalQuestions, optionalQuestions)
110+
rand.Shuffle(len(chosenOptionalQuestions), func(i, j int) {
111+
chosenOptionalQuestions[i], chosenOptionalQuestions[j] = chosenOptionalQuestions[j], chosenOptionalQuestions[i]
112+
})
113+
114+
tmpQuestions = append(tmpQuestions, chosenOptionalQuestions[:numberOfOptionalQuestions]...)
115+
}
116+
117+
if numberOfCampusQuestions == -1 {
118+
// send all campus questions
119+
tmpQuestions = append(tmpQuestions, campusQuestions...)
120+
} else if numberOfCampusQuestions > 0 {
121+
// shuffle campus questions
122+
chosenCampusQuestions := make([]*Question, len(campusQuestions))
123+
copy(chosenCampusQuestions, campusQuestions)
124+
rand.Shuffle(len(chosenCampusQuestions), func(i, j int) {
125+
chosenCampusQuestions[i], chosenCampusQuestions[j] = chosenCampusQuestions[j], chosenCampusQuestions[i]
126+
})
127+
128+
tmpQuestions = append(tmpQuestions, chosenCampusQuestions[:numberOfCampusQuestions]...)
108129
}
109130

131+
132+
110133
if !inOrder {
111-
rand.Shuffle(len(questionsResponse.Questions), func(i, j int) {
112-
questionsResponse.Questions[i], questionsResponse.Questions[j] = questionsResponse.Questions[j], questionsResponse.Questions[i]
134+
rand.Shuffle(len(tmpQuestions), func(i, j int) {
135+
tmpQuestions[i], tmpQuestions[j] = tmpQuestions[j], tmpQuestions[i]
113136
})
114137
} else {
115-
sort.Slice(questionsResponse.Questions, func(i, j int) bool {
116-
return questionsResponse.Questions[i].ID < questionsResponse.Questions[j].ID
138+
sort.Slice(tmpQuestions, func(i, j int) bool {
139+
return tmpQuestions[i].ID < tmpQuestions[j].ID
117140
})
118141
}
119142

143+
for i, question := range tmpQuestions {
144+
questionsResponse.Questions[i] = *question
145+
}
146+
120147
// shuffle options
121148
for i := range questionsResponse.Questions {
122149
options := questionsResponse.Questions[i].Options // copy slice pointer only
@@ -127,8 +154,12 @@ func RetrieveQuestions(c *fiber.Ctx) (err error) {
127154

128155
// clear analysis and answer
129156
for i := range questionsResponse.Questions {
157+
if questionsResponse.Questions[i].Group == "campus" {
158+
questionsResponse.Questions[i].Group = "optional"
159+
}
130160
questionsResponse.Questions[i].Analysis = ""
131161
questionsResponse.Questions[i].Answer = nil
162+
questionsResponse.Questions[i].Option = questionsResponse.Questions[i].Options
132163
}
133164

134165
return c.JSON(questionsResponse)
@@ -183,9 +214,10 @@ func AnswerQuestions(c *fiber.Ctx) (err error) {
183214
var (
184215
questions = questionConfig.Questions
185216
requiredQuestions = questionConfig.RequiredQuestions
186-
number = questionConfig.Spec.NumberOfQuestions
187217
)
188218

219+
number := len(requiredQuestions) + questionConfig.Spec.NumberOfOptionalQuestions + questionConfig.Spec.NumberOfCampusQuestions
220+
189221
// get all submitted question number and required question number
190222
submittedQuestionNumber := len(body.Answers)
191223
submittedRequiredQuestionNumber := 0
@@ -253,6 +285,9 @@ func AnswerQuestions(c *fiber.Ctx) (err error) {
253285
}
254286

255287
accessToken, refreshToken, err := user.CreateJWTToken()
288+
if err != nil {
289+
return
290+
}
256291

257292
return c.JSON(SubmitResponse{
258293
Correct: true,

apis/schemas.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ type Question struct {
104104
Type QuestionType `json:"type" yaml:"type" validate:"oneof=single-selection true-or-false multi-selection"`
105105

106106
// 题目分组,可选或必选
107-
Group string `json:"group" yaml:"group" validate:"oneof=optional required"`
107+
Group string `json:"group" yaml:"group" validate:"oneof=optional required campus"`
108108

109109
// 问题描述
110110
Question string `json:"question" yaml:"question" validate:"required"`
@@ -122,19 +122,27 @@ type Question struct {
122122
// 有一个或多个选项,如果是判断题,则选项只能是 true 或者 false
123123
// 如果 Answer 中的答案不在 Options 中,则会在解析时加到 Options 中
124124
Options []string `json:"options" yaml:"options"`
125+
126+
// 椰树 swift
127+
Option []string `json:"option" yaml:"option"`
125128

126129
// 题目解析,预留,可选
127130
Analysis string `json:"analysis,omitempty" yaml:"analysis,omitempty"`
128131
}
129132

130133
// QuestionSpec 题库的发题、判题的规格 schema
131134
type QuestionSpec struct {
132-
// 表示总的题目数量。
135+
NumberOfQuestions int `json:"number_of_questions" yaml:"number_of_questions"`
136+
137+
// 表示可选题的题目数量。
133138
// 发送题目时,题库中的必做题都会发送,可选题会根据题目数量随机发送。
134139
// 如果总的题目数量小于题库中的必做题数量,将会在解析时返回错误。
135140
// 如果设置为 0 或者不设置,则题库中的所有题目都会发送
136141
// 如果设置为 -1,则题库中的必做题都会发送,可选题不会发送
137-
NumberOfQuestions int `json:"number_of_questions" yaml:"number_of_questions"`
142+
NumberOfOptionalQuestions int `json:"number_of_optional_questions" yaml:"number_of_optional_questions"`
143+
144+
// 校园题的数量
145+
NumberOfCampusQuestions int `json:"number_of_campus_questions" yaml:"number_of_campus_questions"`
138146

139147
// 表示是否由题目声明顺序由上到下顺序出题,默认为 false,即乱序出题
140148
InOrder bool `json:"in_order" yaml:"in_order"`
@@ -154,6 +162,7 @@ type QuestionConfig struct {
154162
// 辅助信息,不需要填写
155163
RequiredQuestions []*Question `json:"-" yaml:"-"`
156164
OptionalQuestions []*Question `json:"-" yaml:"-"`
165+
CampusQuestions []*Question `json:"-" yaml:"-"`
157166
}
158167

159168
// SubmitAnswer 提交的答案 schema.

0 commit comments

Comments
 (0)