|
@@ -127,7 +127,6 @@ const fetchData = async () => {
|
|
|
tableData.value = pageData?.data || []
|
|
tableData.value = pageData?.data || []
|
|
|
pagination.total = pageData?.total || 0
|
|
pagination.total = pageData?.total || 0
|
|
|
} catch {
|
|
} catch {
|
|
|
- ElMessage.error('获取题目列表失败')
|
|
|
|
|
tableData.value = []
|
|
tableData.value = []
|
|
|
} finally {
|
|
} finally {
|
|
|
loading.value = false
|
|
loading.value = false
|
|
@@ -191,7 +190,7 @@ const handleEdit = (row: ProblemVo) => {
|
|
|
problemForm.categoryIds = d.categories?.map((c) => c.id).filter((c): c is number => c !== undefined) || []
|
|
problemForm.categoryIds = d.categories?.map((c) => c.id).filter((c): c is number => c !== undefined) || []
|
|
|
dialogVisible.value = true
|
|
dialogVisible.value = true
|
|
|
})
|
|
})
|
|
|
- .catch(() => ElMessage.error('获取题目信息失败'))
|
|
|
|
|
|
|
+ .catch(() => {})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const handleSave = async () => {
|
|
const handleSave = async () => {
|
|
@@ -213,11 +212,8 @@ const handleSave = async () => {
|
|
|
ElMessage.success(isEdit.value ? '修改成功' : '新增成功')
|
|
ElMessage.success(isEdit.value ? '修改成功' : '新增成功')
|
|
|
dialogVisible.value = false
|
|
dialogVisible.value = false
|
|
|
fetchData()
|
|
fetchData()
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res?.message || '保存失败')
|
|
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
- ElMessage.error('保存失败')
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -230,11 +226,8 @@ const handleDelete = (row: ProblemVo) => {
|
|
|
if (res?.code === 200) {
|
|
if (res?.code === 200) {
|
|
|
ElMessage.success('删除成功')
|
|
ElMessage.success('删除成功')
|
|
|
fetchData()
|
|
fetchData()
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res?.message || '删除失败')
|
|
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
- ElMessage.error('删除失败')
|
|
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
.catch(() => {})
|
|
.catch(() => {})
|
|
@@ -254,11 +247,8 @@ const handleBatchDelete = () => {
|
|
|
ElMessage.success('删除成功')
|
|
ElMessage.success('删除成功')
|
|
|
selectedRows.value = []
|
|
selectedRows.value = []
|
|
|
fetchData()
|
|
fetchData()
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res?.message || '删除失败')
|
|
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
- ElMessage.error('删除失败')
|
|
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
.catch(() => {})
|
|
.catch(() => {})
|
|
@@ -318,11 +308,8 @@ const saveCase = async () => {
|
|
|
ElMessage.success('保存成功')
|
|
ElMessage.success('保存成功')
|
|
|
caseDialogVisible.value = false
|
|
caseDialogVisible.value = false
|
|
|
loadDetail(currentProblemId.value!)
|
|
loadDetail(currentProblemId.value!)
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res?.message || '保存失败')
|
|
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
- ElMessage.error('保存失败')
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -335,11 +322,8 @@ const deleteCase = (row: ProblemCaseVo) => {
|
|
|
if (res?.code === 200) {
|
|
if (res?.code === 200) {
|
|
|
ElMessage.success('删除成功')
|
|
ElMessage.success('删除成功')
|
|
|
loadDetail(currentProblemId.value!)
|
|
loadDetail(currentProblemId.value!)
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res?.message || '删除失败')
|
|
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
- ElMessage.error('删除失败')
|
|
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
.catch(() => {})
|
|
.catch(() => {})
|
|
@@ -383,11 +367,8 @@ const saveTest = async () => {
|
|
|
ElMessage.success('保存成功')
|
|
ElMessage.success('保存成功')
|
|
|
testDialogVisible.value = false
|
|
testDialogVisible.value = false
|
|
|
loadDetail(currentProblemId.value!)
|
|
loadDetail(currentProblemId.value!)
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res?.message || '保存失败')
|
|
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
- ElMessage.error('保存失败')
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -400,11 +381,8 @@ const deleteTest = (row: ProblemTestVo) => {
|
|
|
if (res?.code === 200) {
|
|
if (res?.code === 200) {
|
|
|
ElMessage.success('删除成功')
|
|
ElMessage.success('删除成功')
|
|
|
loadDetail(currentProblemId.value!)
|
|
loadDetail(currentProblemId.value!)
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res?.message || '删除失败')
|
|
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
- ElMessage.error('删除失败')
|
|
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
.catch(() => {})
|
|
.catch(() => {})
|
|
@@ -425,13 +403,9 @@ const toggleTestHidden = async (row: ProblemTestVo, val: number) => {
|
|
|
const res = await api.updateTest(data)
|
|
const res = await api.updateTest(data)
|
|
|
if (res?.code === 200) {
|
|
if (res?.code === 200) {
|
|
|
ElMessage.success('更新成功')
|
|
ElMessage.success('更新成功')
|
|
|
- } else {
|
|
|
|
|
- row.isHidden = old
|
|
|
|
|
- ElMessage.error(res?.message || '更新失败')
|
|
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
row.isHidden = old
|
|
row.isHidden = old
|
|
|
- ElMessage.error('更新失败')
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -541,8 +515,11 @@ onMounted(() => {
|
|
|
</el-card>
|
|
</el-card>
|
|
|
|
|
|
|
|
<!-- 新增/编辑题目 -->
|
|
<!-- 新增/编辑题目 -->
|
|
|
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="900px" draggable>
|
|
|
|
|
- <el-form ref="formRef" :model="problemForm" :rules="formRules" label-width="90px">
|
|
|
|
|
|
|
+ <el-dialog v-model="dialogVisible" width="960px" draggable>
|
|
|
|
|
+ <template #header>
|
|
|
|
|
+ <div class="dialog-header">{{ dialogTitle }}</div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <el-form ref="formRef" :model="problemForm" :rules="formRules" label-position="top">
|
|
|
<el-form-item label="标题" prop="title">
|
|
<el-form-item label="标题" prop="title">
|
|
|
<el-input v-model="problemForm.title" placeholder="请输入题目标题" />
|
|
<el-input v-model="problemForm.title" placeholder="请输入题目标题" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -551,20 +528,30 @@ onMounted(() => {
|
|
|
<MdEditor :value="problemForm.description || ''" :plugins="mdPlugins" @change="(v: string) => (problemForm.description = v)" />
|
|
<MdEditor :value="problemForm.description || ''" :plugins="mdPlugins" @change="(v: string) => (problemForm.description = v)" />
|
|
|
</div>
|
|
</div>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="时间限制" prop="timeLimitMs">
|
|
|
|
|
- <el-input-number v-model="problemForm.timeLimitMs" :min="1" /> ms
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="内存限制" prop="memoryLimitMb">
|
|
|
|
|
- <el-input-number v-model="problemForm.memoryLimitMb" :min="1" /> MB
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="难度" prop="difficulty">
|
|
|
|
|
- <el-select v-model="problemForm.difficulty" style="width: 200px">
|
|
|
|
|
- <el-option v-for="item in difficultyOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="公开" prop="isPublic">
|
|
|
|
|
- <el-switch v-model="problemForm.isPublic" :active-value="1" :inactive-value="0" active-text="公开" inactive-text="未公开" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
|
|
+ <el-row :gutter="16">
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-form-item label="时间限制" prop="timeLimitMs">
|
|
|
|
|
+ <el-input-number v-model="problemForm.timeLimitMs" :min="1" controls-position="right" style="width: 100%" /> ms
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-form-item label="内存限制" prop="memoryLimitMb">
|
|
|
|
|
+ <el-input-number v-model="problemForm.memoryLimitMb" :min="1" controls-position="right" style="width: 100%" /> MB
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-form-item label="难度" prop="difficulty">
|
|
|
|
|
+ <el-select v-model="problemForm.difficulty" style="width: 100%">
|
|
|
|
|
+ <el-option v-for="item in difficultyOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-form-item label="公开" prop="isPublic">
|
|
|
|
|
+ <el-switch v-model="problemForm.isPublic" :active-value="1" :inactive-value="0" active-text="公开" inactive-text="未公开" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
<el-form-item label="分类">
|
|
<el-form-item label="分类">
|
|
|
<el-checkbox-group v-model="problemForm.categoryIds">
|
|
<el-checkbox-group v-model="problemForm.categoryIds">
|
|
|
<el-checkbox v-for="item in categoryOptions" :key="item.id" :value="item.id" :label="item.id">
|
|
<el-checkbox v-for="item in categoryOptions" :key="item.id" :value="item.id" :label="item.id">
|
|
@@ -574,8 +561,10 @@ onMounted(() => {
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<template #footer>
|
|
<template #footer>
|
|
|
- <el-button @click="dialogVisible = false">取消</el-button>
|
|
|
|
|
- <el-button type="primary" @click="handleSave">确定</el-button>
|
|
|
|
|
|
|
+ <div class="dialog-footer">
|
|
|
|
|
+ <el-button @click="dialogVisible = false">取消</el-button>
|
|
|
|
|
+ <el-button type="primary" @click="handleSave">确定</el-button>
|
|
|
|
|
+ </div>
|
|
|
</template>
|
|
</template>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
@@ -708,8 +697,24 @@ onMounted(() => {
|
|
|
margin-top: 16px;
|
|
margin-top: 16px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.dialog-header {
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.dialog-footer {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.markdown-editor-wrapper {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.markdown-editor-wrapper :deep(.bytemd) {
|
|
.markdown-editor-wrapper :deep(.bytemd) {
|
|
|
height: 300px;
|
|
height: 300px;
|
|
|
|
|
+ width: 100%;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.markdown-editor-wrapper.case-description :deep(.bytemd) {
|
|
.markdown-editor-wrapper.case-description :deep(.bytemd) {
|