style(admin): 预览外链去箭头emoji

This commit is contained in:
Pine
2026-08-27 15:50:07 +08:00
parent 81805804c9
commit b001a19b3d
+16 -1
View File
@@ -44,6 +44,8 @@ export default function ArticleEditor() {
const [cover, setCover] = React.useState("");
const [video, setVideo] = React.useState("");
const [link, setLink] = React.useState("");
const [cardMode, setCardMode] = React.useState("small");
const [isPublic, setIsPublic] = React.useState(true);
const [html, setHtml] = React.useState("");
const [editor, setEditor] = React.useState<IDomEditor | null>(null);
const [busy, setBusy] = React.useState(false);
@@ -63,6 +65,7 @@ export default function ArticleEditor() {
contentApi.getOne(id).then((r) => {
setCat(r.type || "policy"); setTitle(r.title || ""); setAuthor(r.publisher_name || "");
setCover(r.cover || ""); setVideo(r.video || ""); setLink(r.link || ""); setHtml(r.body || "");
setCardMode(r.card_mode || "small"); setIsPublic(r.is_public !== false);
}).catch((e) => setErr((e as Error).message || "加载失败"));
return () => { if (editor) editor.destroy(); };
}, [id]);
@@ -79,6 +82,7 @@ export default function ArticleEditor() {
type: cat, title, body: html,
cover, video, link,
publisher_name: author,
card_mode: cardMode, is_public: isPublic,
status,
summary: stripHtml(html).slice(0, 80),
};
@@ -138,6 +142,17 @@ export default function ArticleEditor() {
<SelectTrigger className="w-28 h-8"><SelectValue /></SelectTrigger>
<SelectContent>{CATS.map((c) => <SelectItem key={c.value} value={c.value}>{c.label}</SelectItem>)}</SelectContent>
</Select>
<Select value={cardMode} onValueChange={setCardMode}>
<SelectTrigger className="w-28 h-8"><SelectValue /></SelectTrigger>
<SelectContent>
<SelectItem value="small"></SelectItem>
<SelectItem value="big"></SelectItem>
</SelectContent>
</Select>
<label className="flex items-center gap-2 text-sm">
<input type="checkbox" checked={isPublic} onChange={(e) => setIsPublic(e.target.checked)} />
C端展示
</label>
<Input className="h-8" placeholder="视频 URL(可选,卡片播放角标)" value={video} onChange={(e) => setVideo(e.target.value)} />
<Input className="h-8" placeholder="外链(可选)" value={link} onChange={(e) => setLink(e.target.value)} />
</div>
@@ -175,7 +190,7 @@ export default function ArticleEditor() {
<div className="text-sm text-muted-foreground">{author || "云超服"}</div>
<div className="prose max-w-none" dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(html || "") }} />
{video && <div className="text-sm text-muted-foreground"><video className="w-full" src={video} controls /></div>}
{link && <a className="text-emerald-500" href={link} target="_blank" rel="noreferrer"> </a>}
{link && <a className="text-emerald-500" href={link} target="_blank" rel="noreferrer"></a>}
</div>
</DialogContent>
</Dialog>