diff --git a/apps/web/src/admin/problem/SqlDetail.vue b/apps/web/src/admin/problem/SqlDetail.vue index ccb00b4..e113574 100644 --- a/apps/web/src/admin/problem/SqlDetail.vue +++ b/apps/web/src/admin/problem/SqlDetail.vue @@ -14,6 +14,8 @@ import { errorCode, errorMessage, isApiError } from "utils/api" import { DIFFICULTY, STORAGE_KEY } from "utils/constants" import { createZipBlob, getTagColor, unique } from "utils/functions" import type { AdminProblem, BlankProblem, SqlConfig, Tag, Testcase } from "utils/types" +import PreviewStrip from "./components/PreviewStrip.vue" +import { usePreviewCollapsed } from "./components/previewCollapse" import { createContestProblem, createProblem, @@ -53,6 +55,7 @@ const props = defineProps<{ const message = useMessage() const router = useRouter() const theme = useThemeVars() +const previewCollapsed = usePreviewCollapsed() const isDark = useDark() const isCreate = computed(() => !props.problemID) @@ -445,7 +448,7 @@ onMounted(async () => { -
+
@@ -634,7 +637,7 @@ onMounted(async () => {
-
@@ -711,16 +718,22 @@ onMounted(async () => { font-size: 12px; } +/* 写的一边是主角,看的一边小一点(用户 2026-10-09:编辑区域要大);右栏可以收起来 */ .sqlEditor { display: grid; - grid-template-columns: minmax(0, 560px) minmax(0, 1fr); + grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: 20px; align-items: start; } +.sqlEditor.collapsed { + grid-template-columns: minmax(0, 1fr) 36px; +} + /* 窄屏(老师的小笔记本)放不下两栏:预览挪到下面 */ @media (max-width: 1180px) { - .sqlEditor { + .sqlEditor, + .sqlEditor.collapsed { grid-template-columns: minmax(0, 1fr); } } diff --git a/apps/web/src/admin/problem/components/CodePreview.vue b/apps/web/src/admin/problem/components/CodePreview.vue index 4e70cdb..353413b 100644 --- a/apps/web/src/admin/problem/components/CodePreview.vue +++ b/apps/web/src/admin/problem/components/CodePreview.vue @@ -39,7 +39,7 @@ const props = defineProps<{ }>() const tab = defineModel("tab", { required: true }) -const emit = defineEmits<{ renderState: [ok: boolean] }>() +const emit = defineEmits<{ renderState: [ok: boolean]; collapse: [] }>() const theme = useThemeVars() const isDark = useDark() @@ -117,6 +117,9 @@ onMounted(() => nextTick(render)) 流程图 + + 收起 › +
diff --git a/apps/web/src/admin/problem/components/PreviewStrip.vue b/apps/web/src/admin/problem/components/PreviewStrip.vue new file mode 100644 index 0000000..15827f8 --- /dev/null +++ b/apps/web/src/admin/problem/components/PreviewStrip.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/apps/web/src/admin/problem/components/previewCollapse.ts b/apps/web/src/admin/problem/components/previewCollapse.ts new file mode 100644 index 0000000..8dfd385 --- /dev/null +++ b/apps/web/src/admin/problem/components/previewCollapse.ts @@ -0,0 +1,7 @@ +/** + * 出题页右栏「学生看到的样子」收没收起来。两张出题页(编程题、SQL 题)共用一个开关, + * 记在本机:老师想专心写的时候收起来,下次打开还是收着的 + */ +export function usePreviewCollapsed() { + return useStorage("oj2:admin-problem-preview-collapsed", false) +} diff --git a/apps/web/src/admin/problem/detail.vue b/apps/web/src/admin/problem/detail.vue index e365fec..24085e8 100644 --- a/apps/web/src/admin/problem/detail.vue +++ b/apps/web/src/admin/problem/detail.vue @@ -22,6 +22,8 @@ import { import AstRulesEditor from "./components/AstRulesEditor.vue" import CaseTable from "./components/CaseTable.vue" import CodePreview from "./components/CodePreview.vue" +import PreviewStrip from "./components/PreviewStrip.vue" +import { usePreviewCollapsed } from "./components/previewCollapse" import { caseFiles, caseStatus, @@ -458,6 +460,7 @@ const open = reactive({ more: false, }) const preview = ref("statement") +const previewCollapsed = usePreviewCollapsed() watch( () => open.write, @@ -842,7 +845,7 @@ onMounted(async () => { -
+
上次没保存的草稿已经恢复
@@ -1273,7 +1276,9 @@ onMounted(async () => {
+ { :mermaid-code="form.mermaidCode" :flowchart-hint="form.flowchartHint" @render-state="mermaidOk = $event" + @collapse="previewCollapsed = true" /> +
@@ -1314,16 +1321,22 @@ onMounted(async () => { font-size: 12px; } +/* 写的一边是主角,看的一边小一点(用户 2026-10-09:编辑区域要大);右栏可以收起来 */ .codeEditor { display: grid; - grid-template-columns: minmax(0, 600px) minmax(0, 1fr); + grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: 20px; align-items: start; } +.codeEditor.collapsed { + grid-template-columns: minmax(0, 1fr) 36px; +} + /* 窄屏(老师的小笔记本)放不下两栏:预览挪到下面 */ @media (max-width: 1180px) { - .codeEditor { + .codeEditor, + .codeEditor.collapsed { grid-template-columns: minmax(0, 1fr); } }