网站配置
侧边栏菜单
配置 Admin Sidebar 的分组、角色可见性和可选模块入口。
用户站当前没有仪表盘侧边栏;“侧边栏菜单”指 Admin 应用壳:
apps/admin/src/pages/_app/-components/app-shell-sidebar.tsx导航结构
SIDEBAR_NAVIGATION 由 section 和 item 组成:
type SidebarNavigationItem = {
icon: string
label: string
requiresRole?: AppRole
to: SidebarNavigationTo
}
type SidebarNavigationSection = {
items: SidebarNavigationItem[]
label: string
}当前 Workspace 分组包含 Radar,以及按 Manifest 注册的 Projects、User Assets、Analytics、Newsletter 管理入口。用户管理始终存在,因为 Admin 自身要求 Authentication。
角色可见性
需要管理员权限的入口声明 requiresRole: 'admin',渲染前由真实 AuthSnapshot 和 hasRole() 过滤。
导航隐藏不是授权
requiresRole 只控制可见性。所有 /api/admin/* Route 仍必须在任何 D1/R2
读取前验证 Session、邮箱状态、ban、持久化 role 和逐操作 permission。
Capability gate
可选模块入口直接读取 PUBLIC_PROJECT_CONFIG.features 或对应应用配置常量。不要保留一个指向未生成 route 的灰色菜单项;能力关闭时,入口与 route 应一起从产物移除。
默认落地页
Sidebar 第一项使用 DEFAULT_APP_ROUTE。修改登录后的落地页时,在 apps/admin/src/config/app.ts 更新唯一常量,并让 Sidebar 第一项继续引用它;不要维护两个字符串。
图标与文案
- 图标使用
i-solar-*/i-carbon-*class。 - 文案使用 Admin 严格消息目录
t('navigation.*')。 - 折叠状态下必须保留 Tooltip。
- 新 route 要加入
SidebarNavigationTo联合类型。
折叠状态
折叠状态由 apps/admin/src/stores/app.ts 持久化。它只保存非敏感 UI 偏好,不保存 Session 或 token。
验证
pnpm --filter admin typecheck
pnpm --filter admin test
pnpm test:e2e:admin至少覆盖普通用户与管理员可见性、当前路由高亮、折叠 Tooltip,以及模块关闭后的导航裁剪。