- 新增试卷管理 Tab:列表展示、启用状态、题数/总分/通过分、目标权限标签、复制直链 - 新增试卷编辑弹窗:标题、描述、阅卷模式、通过分数、启用开关 - 目标权限多选、前置身份开关 + 判断方式(ANY/ALL)+ 权限多选 - 题目编辑:五种题型、上下移、删除、信息题、选答题、生死题、自动批复 - 选择题选项增删改、默认选项、正确选项、多选计分模式、选项得分/扣分 - 填空/简答作答字数上限与标准答案 - 查重开关与通过邮件配置(标题/正文/补充说明/附带邀请码) - 保存前校验:标题、题目、权限、通过分、邮件必填项 - 公开端审核类型改名 Public 前缀,避免与后台同名冲突 - 补充中英文 locale 共 37 个键
This commit is contained in:
1 parent
8d73689356
commit
7b3a5212e6
5 files changed
+1534
-201
No files matched your search
@@ -5,8 +5,8 @@ import { computed, onMounted, ref } from 'vue'
|
||||
|
||||
import {
|
||||
skinSiteReviewCatalog,
|
||||
type SkinSiteReviewPaper,
|
||||
type SkinSiteReviewQuestion,
|
||||
type SkinSiteReviewPublicPaper,
|
||||
type SkinSiteReviewPublicQuestion,
|
||||
type SkinSiteReviewReceipt,
|
||||
skinSiteSubmitReview,
|
||||
} from '@/helpers/skin-site-api'
|
||||
@@ -46,10 +46,10 @@ const messages = defineMessages({
|
||||
|
||||
const emit = defineEmits<{ (e: 'back'): void }>()
|
||||
|
||||
const papers = ref<SkinSiteReviewPaper[]>([])
|
||||
const papers = ref<SkinSiteReviewPublicPaper[]>([])
|
||||
const loading = ref(true)
|
||||
const failed = ref(false)
|
||||
const activePaper = ref<SkinSiteReviewPaper | null>(null)
|
||||
const activePaper = ref<SkinSiteReviewPublicPaper | null>(null)
|
||||
const email = ref('')
|
||||
const inviteCode = ref('')
|
||||
const answers = ref<Record<string, string | string[]>>({})
|
||||
@@ -70,7 +70,7 @@ const requiredAnswered = computed(() => {
|
||||
|
||||
const canSubmit = computed(() => emailValid.value && requiredAnswered.value && !submitting.value)
|
||||
|
||||
function defaultAnswer(q: SkinSiteReviewQuestion): string | string[] {
|
||||
function defaultAnswer(q: SkinSiteReviewPublicQuestion): string | string[] {
|
||||
if (q.type === 'MULTIPLE' || q.type === 'SINGLE') {
|
||||
const preset = (q.options ?? []).filter((o) => o.defaultSelected).map((o) => o.id)
|
||||
return q.type === 'MULTIPLE' ? preset : (preset[0] ?? '')
|
||||
@@ -78,7 +78,7 @@ function defaultAnswer(q: SkinSiteReviewQuestion): string | string[] {
|
||||
return ''
|
||||
}
|
||||
|
||||
function openPaper(paper: SkinSiteReviewPaper) {
|
||||
function openPaper(paper: SkinSiteReviewPublicPaper) {
|
||||
activePaper.value = paper
|
||||
answers.value = {}
|
||||
for (const q of paper.questions) answers.value[q.id] = defaultAnswer(q)
|
||||
@@ -93,7 +93,7 @@ function closePaper() {
|
||||
receipt.value = null
|
||||
}
|
||||
|
||||
function toggleMultiple(q: SkinSiteReviewQuestion, optionId: string, checked: boolean) {
|
||||
function toggleMultiple(q: SkinSiteReviewPublicQuestion, optionId: string, checked: boolean) {
|
||||
const current = Array.isArray(answers.value[q.id]) ? (answers.value[q.id] as string[]) : []
|
||||
answers.value[q.id] = checked
|
||||
? [...current.filter((id) => id !== optionId), optionId]
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user