feat: 完成玩家审核试卷编辑器
Sync source to CNB / Sync Git ref (push) Skipped

- 新增试卷管理 Tab:列表展示、启用状态、题数/总分/通过分、目标权限标签、复制直链
- 新增试卷编辑弹窗:标题、描述、阅卷模式、通过分数、启用开关
- 目标权限多选、前置身份开关 + 判断方式(ANY/ALL)+ 权限多选
- 题目编辑:五种题型、上下移、删除、信息题、选答题、生死题、自动批复
- 选择题选项增删改、默认选项、正确选项、多选计分模式、选项得分/扣分
- 填空/简答作答字数上限与标准答案
- 查重开关与通过邮件配置(标题/正文/补充说明/附带邀请码)
- 保存前校验:标题、题目、权限、通过分、邮件必填项
- 公开端审核类型改名 Public 前缀,避免与后台同名冲突
- 补充中英文 locale 共 37 个键
This commit is contained in:
AxTps committed 2026-10-18 10:25:48 +08:00
1 parent 8d73689356
commit 7b3a5212e6
5 files changed
+1534 -201

No files matched your search

+119 -6
View File
@@ -564,32 +564,32 @@ export function skinSitePublicMapServers(): Promise<SkinSiteResponse<SkinSitePub
export type SkinSiteReviewQuestionType = 'SINGLE' | 'MULTIPLE' | 'TRUE_FALSE' | 'FILL' | 'ESSAY'
export type SkinSiteReviewResult = 'PENDING' | 'PASSED' | 'REJECTED'
export interface SkinSiteReviewOption {
export interface SkinSiteReviewPublicOption {
id: string
description: string
correct?: boolean
defaultSelected?: boolean
}
export interface SkinSiteReviewQuestion {
export interface SkinSiteReviewPublicQuestion {
id: string
type: SkinSiteReviewQuestionType
type: SkinSiteReviewPublicQuestionType
title: string
annotation?: string | null
score?: number
optional?: boolean
fatal?: boolean
options?: SkinSiteReviewOption[]
options?: SkinSiteReviewPublicOption[]
answer?: string | null
maxLength?: number | null
informationQuestion?: boolean
}
export interface SkinSiteReviewPaper {
export interface SkinSiteReviewPublicPaper {
id: string
title: string
description?: string
questions: SkinSiteReviewQuestion[]
questions: SkinSiteReviewPublicQuestion[]
[key: string]: unknown
}
@@ -1039,6 +1039,42 @@ export function skinSiteAdminUserFrequencyLimit(
export type SkinSiteReviewMode = 'AUTO' | 'MANUAL'
export type SkinSiteReviewQuestionType = 'SINGLE' | 'MULTIPLE' | 'TRUE_FALSE' | 'FILL' | 'ESSAY'
export interface SkinSiteReviewOption {
id: string
description: string
correct: boolean
defaultSelected: boolean
score: number
}
export interface SkinSiteReviewQuestion {
id: string
type: SkinSiteReviewQuestionType
title: string
annotation?: string | null
score: number
optional: boolean
fatal: boolean
autoReview: boolean
options: SkinSiteReviewOption[]
answer?: string | null
maxLength?: number | null
informationQuestion?: boolean
informationAlias?: string | null
}
export interface SkinSiteReviewPaper {
id: string
title: string
annotation?: string | null
mode: SkinSiteReviewMode
passScore: number
version: number
questions: SkinSiteReviewQuestion[]
}
export interface SkinSiteReviewAnswer {
id: string
questionId?: string
@@ -1069,6 +1105,7 @@ export interface SkinSiteReviewSubmission {
createdAt: number
reviewedAt?: number | null
answers: SkinSiteReviewAnswer[]
paper: SkinSiteReviewPaper
decisionHistory?: Array<{
previousResult: SkinSiteReviewResult
result: SkinSiteReviewResult
@@ -1789,3 +1826,79 @@ export function skinSiteWikiUpdateSettings(
body: settings,
})
}
export interface SkinSiteReviewPaperSummary {
id: string
enabled: boolean
title: string
annotation?: string | null
mode: SkinSiteReviewMode
passScore: number
targetPermissions: string[]
version: number
questionCount: number
totalScore: number
updatedAt: number
prerequisiteMode: 'ANY' | 'ALL'
prerequisitePermissions: string[]
eligible: boolean
}
export interface SkinSiteReviewMailConfig {
enabled: boolean
subject: string
message: string
includeInviteCode: boolean
extraText: string
}
export interface SkinSiteReviewConfigData {
preventDuplicate?: boolean
mail?: SkinSiteReviewMailConfig
id: string
enabled: boolean
title: string
annotation?: string | null
mode: SkinSiteReviewMode
passScore: number
targetPermissions: string[]
version: number
questions: SkinSiteReviewQuestion[]
updatedAt: number
prerequisiteMode: 'ANY' | 'ALL'
prerequisitePermissions: string[]
}
export function skinSiteReviewPaperList(): Promise<
SkinSiteResponse<SkinSiteReviewPaperSummary[]>
> {
return skinSiteRequest<SkinSiteReviewPaperSummary[]>('review/admin/papers')
}
export function skinSiteReviewPaperAdmin(
paperId: string,
): Promise<SkinSiteResponse<SkinSiteReviewConfigData>> {
return skinSiteRequest<SkinSiteReviewConfigData>(
'review/admin/papers/' + encodeURIComponent(paperId),
)
}
export function skinSiteCreateReviewPaperAdmin(
data: SkinSiteReviewConfigData,
): Promise<SkinSiteResponse<SkinSiteReviewConfigData>> {
return skinSiteRequest<SkinSiteReviewConfigData>('review/admin/papers', {
method: 'POST',
body: data,
})
}
export function skinSiteUpdateReviewPaperAdmin(
paperId: string,
data: SkinSiteReviewConfigData,
): Promise<SkinSiteResponse<SkinSiteReviewConfigData>> {
return skinSiteRequest<SkinSiteReviewConfigData>(
'review/admin/papers/' + encodeURIComponent(paperId),
{ method: 'PUT', body: data },
)
}