import React, { useCallback, useEffect, useState } from 'react'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import Button from '@mui/material/Button'; import Box from '@mui/material/Box'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import Chip from '@mui/material/Chip'; import Switch from '@mui/material/Switch'; import FormControlLabel from '@mui/material/FormControlLabel'; import IconButton from '@mui/material/IconButton'; import EditIcon from '@mui/icons-material/Edit'; import DeleteIcon from '@mui/icons-material/Delete'; import { listPosts, updatePost, deletePost } from '../../api/blog.js'; import { getSettings, saveSettings } from '../../api/settings.js'; import { showSnack } from '../snack.jsx'; import ConfirmDialog from '../ConfirmDialog.jsx'; /** 博客管理:博客侧栏开关 + 文章列表(发布开关/编辑跳前台 write.html?edit=id/删除) */ export default function BlogManage() { const [posts, setPosts] = useState(null); const [showSidebar, setShowSidebar] = useState(true); const [confirm, setConfirm] = useState(null); // { id, title } const [deleting, setDeleting] = useState(false); const load = useCallback(() => { listPosts(true) .then((ps) => setPosts(ps || [])) .catch((e) => showSnack(e.message, 'error')); }, []); useEffect(() => { load(); getSettings().then((s) => setShowSidebar(s.blog_show_sidebar !== '0')).catch(() => {}); }, [load]); const saveSidebar = async () => { try { await saveSettings({ blog_show_sidebar: showSidebar ? '1' : '0' }); showSnack('已保存'); } catch (e) { showSnack(e.message, 'error'); } }; const togglePublish = async (p) => { try { await updatePost(p.id, { title: p.title, content: p.content, excerpt: p.excerpt || '', published: p.published ? 0 : 1, use_markdown: p.use_markdown, }); showSnack(p.published ? '已转为草稿' : '已发布'); load(); } catch (e) { showSnack(e.message, 'error'); } }; const doDelete = async () => { if (!confirm) return; setDeleting(true); try { await deletePost(confirm.id); showSnack('已删除'); setConfirm(null); load(); } catch (e) { showSnack(e.message, 'error'); } setDeleting(false); }; return ( 博客管理 setShowSidebar(e.target.checked)} />} label="博客页面左侧显示头像和简介" /> 标题 状态 格式 时间 操作 {posts === null ? ( 加载中... ) : posts.length === 0 ? ( 暂无文章 ) : posts.map((p) => ( {p.title} togglePublish(p)} title="点击切换发布状态" /> {p.created_at} setConfirm({ id: p.id, title: p.title })}> ))}
setConfirm(null)} onConfirm={doDelete} confirmText={deleting ? '删除中...' : '确认删除'} />
); }