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 () => {
-
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);
}
}