diff --git a/frontend/src/index.css b/frontend/src/index.css index 17836fa..09080de 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -285,3 +285,9 @@ @apply shadow-[0_0_0_3px_rgba(129,140,248,0.2)]; } } + +/* CodeMirror 编辑器内部滚动(必须是无层级的普通 CSS, + 放在 @layer 里会被 Tailwind 当作未使用样式裁剪掉) */ +.cm-editor { + height: 100%; +} diff --git a/frontend/src/pages/admin/AdminProfilePage.tsx b/frontend/src/pages/admin/AdminProfilePage.tsx index 6711602..7a3eec8 100644 --- a/frontend/src/pages/admin/AdminProfilePage.tsx +++ b/frontend/src/pages/admin/AdminProfilePage.tsx @@ -234,7 +234,7 @@ export function AdminProfilePage() { theme={theme === 'dark' ? oneDark : 'light'} extensions={[markdown()]} onChange={(value) => setContent(value)} - className="flex-1 text-sm" + className="flex-1 min-h-0 text-sm" basicSetup={{ lineNumbers: true, highlightActiveLineGutter: true, highlightActiveLine: true, foldGutter: false }} /> diff --git a/frontend/src/pages/admin/EditorPage.tsx b/frontend/src/pages/admin/EditorPage.tsx index 549a0c0..6ea801b 100644 --- a/frontend/src/pages/admin/EditorPage.tsx +++ b/frontend/src/pages/admin/EditorPage.tsx @@ -53,14 +53,16 @@ export function EditorPage() { enabled: isEdit, }); - const { data: draft } = useQuery({ + const { data: draft, isLoading: draftLoading } = useQuery({ queryKey: ['admin-draft', id], queryFn: () => api.getDraft(id!), enabled: isEdit, }); + // 必须等文章和草稿两个查询都返回后再初始化, + // 否则会先用默认文本渲染,自动保存随即覆盖掉真实草稿(数据丢失) useEffect(() => { - if (!initialized && (post || draft)) { + if (!initialized && !isLoading && !draftLoading && (post || draft)) { setTitle(post?.title || ''); setSlug(post?.slug || ''); setSummary(post?.summary || ''); @@ -70,7 +72,7 @@ export function EditorPage() { setContentMd(md); setInitialized(true); } - }, [post, draft, initialized]); + }, [post, draft, isLoading, draftLoading, initialized]); // 自动保存草稿 useEffect(() => { @@ -356,7 +358,7 @@ export function EditorPage() { theme={theme === 'dark' ? oneDark : 'light'} extensions={[markdown()]} onChange={(value) => setContentMd(value)} - className="flex-1 text-sm" + className="flex-1 min-h-0 text-sm" basicSetup={{ lineNumbers: true, highlightActiveLineGutter: true,