feat: ship blog platform admin and deploy stack
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
import {
|
||||
BarChart3,
|
||||
BellRing,
|
||||
BookOpenText,
|
||||
ExternalLink,
|
||||
History,
|
||||
Image as ImageIcon,
|
||||
LayoutDashboard,
|
||||
Link2,
|
||||
@@ -18,6 +20,7 @@ import { NavLink } from 'react-router-dom'
|
||||
import { Badge } from '@/components/ui/badge'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Separator } from '@/components/ui/separator'
|
||||
import { buildFrontendUrl } from '@/lib/frontend-url'
|
||||
import { cn } from '@/lib/utils'
|
||||
|
||||
const primaryNav = [
|
||||
@@ -39,6 +42,12 @@ const primaryNav = [
|
||||
description: 'Markdown 内容管理',
|
||||
icon: ScrollText,
|
||||
},
|
||||
{
|
||||
to: '/revisions',
|
||||
label: '版本',
|
||||
description: '历史快照与一键回滚',
|
||||
icon: History,
|
||||
},
|
||||
{
|
||||
to: '/comments',
|
||||
label: '评论',
|
||||
@@ -63,6 +72,18 @@ const primaryNav = [
|
||||
description: '对象存储图片管理',
|
||||
icon: ImageIcon,
|
||||
},
|
||||
{
|
||||
to: '/subscriptions',
|
||||
label: '订阅',
|
||||
description: '邮件 / Webhook 推送',
|
||||
icon: BellRing,
|
||||
},
|
||||
{
|
||||
to: '/audit',
|
||||
label: '审计',
|
||||
description: '后台操作审计日志',
|
||||
icon: Settings,
|
||||
},
|
||||
{
|
||||
to: '/settings',
|
||||
label: '设置',
|
||||
@@ -74,12 +95,20 @@ const primaryNav = [
|
||||
export function AppShell({
|
||||
children,
|
||||
username,
|
||||
email,
|
||||
authSource,
|
||||
authProvider,
|
||||
loggingOut,
|
||||
canLogout,
|
||||
onLogout,
|
||||
}: {
|
||||
children: ReactNode
|
||||
username: string | null
|
||||
email: string | null
|
||||
authSource: string | null
|
||||
authProvider: string | null
|
||||
loggingOut: boolean
|
||||
canLogout: boolean
|
||||
onLogout: () => Promise<void>
|
||||
}) {
|
||||
return (
|
||||
@@ -155,7 +184,7 @@ export function AppShell({
|
||||
工作台状态
|
||||
</p>
|
||||
<p className="mt-1 text-sm text-muted-foreground">
|
||||
核心后台流程已经迁移到独立管理端。
|
||||
核心后台流程统一运行在当前独立管理端。
|
||||
</p>
|
||||
</div>
|
||||
<Badge variant="success">运行中</Badge>
|
||||
@@ -186,8 +215,13 @@ export function AppShell({
|
||||
当前登录:{username ?? 'admin'}
|
||||
</p>
|
||||
<p className="text-xs uppercase tracking-[0.18em] text-muted-foreground">
|
||||
React + shadcn/ui 基础架构
|
||||
{authProvider ?? 'React + shadcn/ui 基础架构'}
|
||||
</p>
|
||||
{email ? (
|
||||
<p className="text-xs text-muted-foreground">{email}</p>
|
||||
) : authSource ? (
|
||||
<p className="text-xs text-muted-foreground">认证来源:{authSource}</p>
|
||||
) : null}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -213,14 +247,19 @@ export function AppShell({
|
||||
|
||||
<div className="flex flex-wrap items-center gap-3">
|
||||
<Button variant="outline" asChild>
|
||||
<a href="http://localhost:4321" target="_blank" rel="noreferrer">
|
||||
<a href={buildFrontendUrl('/')} target="_blank" rel="noreferrer">
|
||||
<ExternalLink className="h-4 w-4" />
|
||||
打开前台
|
||||
</a>
|
||||
</Button>
|
||||
<Button variant="ghost" onClick={() => void onLogout()} disabled={loggingOut}>
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => void onLogout()}
|
||||
disabled={loggingOut || !canLogout}
|
||||
title={canLogout ? undefined : '当前会话由前置 SSO / 代理控制'}
|
||||
>
|
||||
<LogOut className="h-4 w-4" />
|
||||
{loggingOut ? '退出中...' : '退出登录'}
|
||||
{canLogout ? (loggingOut ? '退出中...' : '退出登录') : 'SSO 受代理保护'}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user