# Admin UI 架构(React + Tremor SPA) ## 背景 原 `/admin` 由 hono/jsx 服务端渲染,单层 layout + 单一 CSS,信息密度低、视觉乏力。从 v0.7+ 起改造为 **React SPA**,hono 退化为 JSON API。本文档记录 Phase 1 落地的架构,后续 Phase 2-5 在此基础上逐页迁移。 ## 顶层布局 ``` 请求路径 服务方 ──────────────────────────────────────────────── GET /admin/_app/* Vite 构建产物 (dist/ui/assets/...) GET /admin/api/* JSON 端点(session 认证) POST /admin/api/* 同上 + CSRF GET /admin/login SSR HTML 登录页(保留) POST /admin/login form 处理 → 302 /admin GET /admin/legacy[/...] 旧 SSR 页面(迁移期保留) GET /admin/keys, /usage, 旧 SSR 页面(历史路径,迁移完成后会删) /audit, /traces, /settings GET /admin/[anything else] dist/ui/index.html(SPA 路由回退) ``` ## 工程结构 ``` copilot-api/ ├── src/ │ ├── server.ts Hono 路由表(含 SPA 静态 + 回退 + legacy 挂载) │ ├── admin/ │ │ ├── api/ ← 新增:JSON 端点 │ │ │ ├── route.ts 汇总 mount │ │ │ ├── me.ts GET /admin/api/me │ │ │ ├── logout.ts POST /admin/api/logout │ │ │ └── overview.ts GET /admin/api/overview │ │ ├── session-middleware.ts /admin/api/* 分支:返回 401 JSON 代替 302 │ │ └── ... (旧 SSR 页面保留) │ └── lib/, services/, ... (未变) ├── ui/ ← 新增:Vite + React 工程 │ ├── package.json │ ├── vite.config.ts base="/admin/_app/", outDir="../dist/ui" │ ├── tailwind.config.js Tremor 配色 token │ ├── postcss.config.js │ ├── index.html │ └── src/ │ ├── main.tsx React 入口 │ ├── App.tsx 路由表 │ ├── index.css Tailwind base/components/utilities │ ├── api/ │ │ ├── client.ts fetch + CSRF + 401 重定向 │ │ └── types.ts JSON 响应类型 │ ├── layout/ │ │ ├── AppShell.tsx 侧栏 + 顶栏 + Outlet │ │ ├── Sidebar.tsx LiteLLM 风格分组导航 │ │ └── TopBar.tsx 页面标题 + me 信息 + 登出 │ └── pages/ │ ├── Overview.tsx KPI×6 + AreaChart + DonutChart + BarList + Recent │ └── Placeholder.tsx 未迁移页面跳 legacy └── dist/ ├── main.js tsdown 产物(服务器) └── ui/ vite 产物(SPA 静态资源) ``` ## 数据流 ``` Browser └── GET /admin/ ─────────────► hono → fs.readFileSync(dist/ui/index.html) │ └── HTML 加载 →