Deploy / deploy (push) Canceled after 0s
- 后台课堂任务 admin/lesson → admin/task(/admin/task),和前台 oj/task 对上 - 后台首页 admin/setting/home.vue → admin/home/,设置 → admin/config/ - 卡点分析、年度趋势从 admin/problem 搬到 admin/analytics(/admin/analytics/stuck|trend),和菜单的「学情分析」、后端 analytics.ts 对上 - 首页 dashboard.vue / TeacherHome.vue → student.vue / teacher.vue;自学首页 home.vue → index.vue,看一课 index.vue → tutorial.vue - lesson 只表示课堂上的一节:自学那边改叫 tutorial(oj/learn/lesson.ts → utils.ts、isLessonDone → isTutorialDone、Lesson*.vue → Tutorial*.vue、自学情况的 lessons 字段 → tutorials) - 旧地址不留跳转 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
48 lines
1.7 KiB
Vue
48 lines
1.7 KiB
Vue
<script setup lang="ts">
|
|
import { isSqlProblem } from '@oj2/contract'
|
|
import type { AdminProblem } from 'utils/types'
|
|
import { getProblem } from '../api'
|
|
import ProblemDetail from './detail.vue'
|
|
import SqlDetail from './components/SqlDetail.vue'
|
|
|
|
/**
|
|
* 出题 / 改题的入口:编程题和 SQL 题是两张不同的页。
|
|
* 新建看地址上的 `?type=sql`(后台题目列表「新建题目」下拉里选的),
|
|
* 编辑看题目本身 —— 题型建好之后不能改,所以没有「切换题型」这回事。
|
|
*/
|
|
const props = defineProps<{
|
|
problemID?: string
|
|
contestID?: string
|
|
}>()
|
|
|
|
const route = useRoute()
|
|
const router = useRouter()
|
|
const message = useMessage()
|
|
|
|
const loaded = shallowRef<AdminProblem | null>(null)
|
|
const kind = ref<'code' | 'sql' | null>(null)
|
|
|
|
async function resolve() {
|
|
kind.value = null
|
|
loaded.value = null
|
|
if (!props.problemID) {
|
|
kind.value = route.query.type === 'sql' ? 'sql' : 'code'
|
|
return
|
|
}
|
|
try {
|
|
loaded.value = await getProblem(props.problemID)
|
|
kind.value = isSqlProblem(loaded.value) ? 'sql' : 'code'
|
|
} catch {
|
|
message.error('获取题目失败')
|
|
router.push(props.contestID ? { name: 'admin contest problem list', params: { contestID: props.contestID } } : { name: 'admin problem list' })
|
|
}
|
|
}
|
|
|
|
watch(() => [props.problemID, route.query.type], resolve, { immediate: true })
|
|
</script>
|
|
|
|
<template>
|
|
<SqlDetail v-if="kind === 'sql'" :key="`sql-${problemID ?? 'new'}`" :problem-i-d="problemID" :contest-i-d="contestID" :initial="loaded" />
|
|
<ProblemDetail v-else-if="kind === 'code'" :key="`code-${problemID ?? 'new'}`" :problem-i-d="problemID" :contest-i-d="contestID" :initial="loaded" />
|
|
</template>
|