Skip to content

Commit 843a777

Browse files
Merge pull request #47 from TeamVastsea/feat-show-score
Feat: show score
2 parents c0e6dce + 950bc9b commit 843a777

File tree

7 files changed

+106
-5
lines changed

7 files changed

+106
-5
lines changed

api/ScoreApi.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@ export interface AnswerInfo {
233233
survey: number;
234234
user: number;
235235
answers: Object;
236-
score: null | number;
236+
full_scores: null | number;
237+
user_scores: null | number;
237238
update_time: string;
238239
completed: boolean;
239240
}

app/(root)/backstage/judge/[answerId]/components/questions.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default function QuestionCard(props: PageQuestionProps) {
1010
{!props.checkAccess(JSON.stringify(props.question.condition))
1111
? '(隐藏题目, 用户无需作答)'
1212
: null}
13-
{generateQuestion(props.question, props.value, props.setValue, true)}
13+
{generateQuestion(props.question, props.value, props.setValue, true, props.question.answer?.answer)}
1414
{props.question.answer?.answer &&
1515
<Group>
1616
<Text>标准答案:{props.question.answer.answer}</Text>

app/(root)/backstage/judge/[answerId]/page.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,25 @@ export default function JudgeSinglePage({ params }: { params: { answerId: number
147147
<Center>
148148
<Title>阅卷系统</Title>
149149
</Center>
150+
<Center>
151+
<Stack gap="xs">
152+
<Text size="sm" c="dimmed">选择题颜色说明:</Text>
153+
<Group gap="md" justify="center">
154+
<Group gap={5}>
155+
<div style={{ width: 16, height: 16, backgroundColor: 'rgba(255, 0, 0, 0.3)', border: '1px solid rgba(255, 0, 0, 0.5)' }} />
156+
<Text size="sm">用户选择但错误</Text>
157+
</Group>
158+
<Group gap={5}>
159+
<div style={{ width: 16, height: 16, backgroundColor: 'rgba(0, 0, 255, 0.3)', border: '1px solid rgba(0, 0, 255, 0.5)' }} />
160+
<Text size="sm">用户选择且正确</Text>
161+
</Group>
162+
<Group gap={5}>
163+
<div style={{ width: 16, height: 16, backgroundColor: 'rgba(0, 255, 0, 0.3)', border: '1px solid rgba(0, 255, 0, 0.5)' }} />
164+
<Text size="sm">用户未选择但正确</Text>
165+
</Group>
166+
</Group>
167+
</Stack>
168+
</Center>
150169
<Center>
151170
<Alert
152171
variant="light"

app/(root)/backstage/judge/page.tsx

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,40 @@ export default function SurveyPage() {
2525
const [page, setPage] = useState(0);
2626
const [maxPage, setMaxPage] = useState(1);
2727
const [answers, setAnswers] = useState<AnswerInfo[]>([]);
28+
const [initialized, setInitialized] = useState(false);
2829
const router = useRouter();
2930

31+
// 从localStorage恢复状态
3032
useEffect(() => {
33+
const saved = localStorage.getItem('judgePageState');
34+
if (saved) {
35+
try {
36+
const state = JSON.parse(saved);
37+
setSurveySearch(state.surveySearch || '');
38+
setUnconfirmedOnly(state.unconfirmedOnly || false);
39+
setPage(state.page || 0);
40+
} catch (e) {
41+
console.error('Failed to parse saved state:', e);
42+
}
43+
}
44+
setInitialized(true);
45+
}, []);
46+
47+
// 保存状态到localStorage
48+
useEffect(() => {
49+
if (!initialized) return;
50+
51+
const state = {
52+
surveySearch,
53+
unconfirmedOnly,
54+
page,
55+
};
56+
localStorage.setItem('judgePageState', JSON.stringify(state));
57+
}, [surveySearch, unconfirmedOnly, page, initialized]);
58+
59+
useEffect(() => {
60+
if (!initialized) return;
61+
3162
setSurveysLoading(true);
3263
ScoreApi.searchAnswerList(page,
3364
10,
@@ -39,7 +70,7 @@ export default function SurveyPage() {
3970
setMaxPage(res.total);
4071
setAnswers(res.data);
4172
});
42-
}, [surveySearch, unconfirmedOnly, page]);
73+
}, [surveySearch, unconfirmedOnly, page, initialized]);
4374

4475
return (
4576
<Center>
@@ -62,6 +93,7 @@ export default function SurveyPage() {
6293
onChange={setSurveySearch}
6394
/>
6495
<Checkbox
96+
checked={unconfirmedOnly}
6597
onChange={(e) =>
6698
setUnconfirmedOnly(e.currentTarget.checked)}
6799
label="仅显示未确认的问卷"
@@ -79,6 +111,7 @@ export default function SurveyPage() {
79111
<Table.Th>问卷ID</Table.Th>
80112
<Table.Th>用户ID</Table.Th>
81113
<Table.Th>提交时间</Table.Th>
114+
<Table.Th>分数</Table.Th>
82115
<Table.Th>问卷状态</Table.Th>
83116
</Table.Tr>
84117
</Table.Thead>
@@ -93,6 +126,7 @@ export default function SurveyPage() {
93126
<Table.Td>{element.survey}</Table.Td>
94127
<Table.Td>{element.user}</Table.Td>
95128
<Table.Td>{element.update_time}</Table.Td>
129+
<Table.Td>{element.user_scores}/{element.full_scores}</Table.Td>
96130
<Table.Td>{element.completed ? '已确认' : '待确认'}</Table.Td>
97131
</Table.Tr>
98132
))}

app/(root)/survey/components/MultipleChoice.tsx

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,32 @@ export function MultipleChoice(props: ChoiceProps) {
1111
// console.log(JSON.stringify(value));
1212
props.setValue(JSON.stringify(value));
1313
}
14+
15+
const getCardColor = (index: number) => {
16+
if (!props.correctAnswer || !props.disabled) return undefined;
17+
18+
const userSelectedArray = props.value === undefined || props.value === '' ? [] : JSON.parse(props.value);
19+
const correctArray = JSON.parse(props.correctAnswer);
20+
21+
const userSelected = userSelectedArray.includes(index.toString());
22+
const isCorrect = correctArray.includes(index.toString());
23+
24+
if (userSelected && !isCorrect) return 'rgba(255, 0, 0, 0.1)'; // 红色 - 用户选择但错误
25+
if (userSelected && isCorrect) return 'rgba(0, 0, 255, 0.1)'; // 蓝色 - 用户选择且正确
26+
if (!userSelected && isCorrect) return 'rgba(0, 255, 0, 0.1)'; // 绿色 - 用户未选择但正确
27+
28+
return undefined;
29+
};
1430

1531
const cards = data.map(({ title, content }, index) => (
16-
<Checkbox.Card className={classes.root} radius="md" value={index.toString()} key={index} disabled={props.disabled}>
32+
<Checkbox.Card
33+
className={classes.root}
34+
radius="md"
35+
value={index.toString()}
36+
key={index}
37+
disabled={props.disabled}
38+
style={{ backgroundColor: getCardColor(index) }}
39+
>
1740
<Group wrap="nowrap" align="flex-start">
1841
<Checkbox.Indicator />
1942
<div>

app/(root)/survey/components/SingleChoice.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,29 @@ import type { Value } from '@/api/QuestionApi';
55

66
export function SingleChoice(props: ChoiceProps) {
77
const data = props.choice;
8+
9+
const getCardColor = (index: number) => {
10+
if (!props.correctAnswer || !props.disabled) return undefined;
11+
12+
const userSelected = props.value === index.toString();
13+
const isCorrect = props.correctAnswer === index.toString();
14+
15+
if (userSelected && !isCorrect) return 'rgba(255, 0, 0, 0.1)'; // 红色 - 用户选择但错误
16+
if (userSelected && isCorrect) return 'rgba(0, 0, 255, 0.1)'; // 蓝色 - 用户选择且正确
17+
if (!userSelected && isCorrect) return 'rgba(0, 255, 0, 0.1)'; // 绿色 - 用户未选择但正确
18+
19+
return undefined;
20+
};
821

922
const cards = data.map(({ title, content }, index) => (
10-
<Radio.Card className={classes.root} radius="md" value={index.toString()} key={index} disabled={props.disabled}>
23+
<Radio.Card
24+
className={classes.root}
25+
radius="md"
26+
value={index.toString()}
27+
key={index}
28+
disabled={props.disabled}
29+
style={{ backgroundColor: getCardColor(index) }}
30+
>
1131
<Group wrap="nowrap" align="flex-start">
1232
<Radio.Indicator />
1333
<div>
@@ -34,4 +54,5 @@ export function SingleChoice(props: ChoiceProps) {
3454

3555
export interface ChoiceProps extends InputProps {
3656
choice: Value[];
57+
correctAnswer?: string;
3758
}

app/(root)/survey/components/generateQuestion.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export function generateQuestion(
1111
value: string | undefined,
1212
setValue: (value: string) => void,
1313
isDisable: boolean = false,
14+
correctAnswer?: string,
1415
) {
1516
const titleContent = (
1617
<Title order={3}>
@@ -42,6 +43,7 @@ export function generateQuestion(
4243
value={value}
4344
setValue={setValue}
4445
disabled={isDisable}
46+
correctAnswer={correctAnswer}
4547
/>
4648
</div>
4749
);
@@ -55,6 +57,7 @@ export function generateQuestion(
5557
value={value}
5658
setValue={setValue}
5759
disabled={isDisable}
60+
correctAnswer={correctAnswer}
5861
/>
5962
</div>
6063
);

0 commit comments

Comments
 (0)