Skip to content

主题与应用壳

本篇讲控制台的「外观与骨架」:三种导航范式如何切换、主题色与圆角等设计令牌在哪改、暗色主题现状如何。

应用壳结构

所有业务页面都嵌在统一的应用壳 MainLayout 里:

MainLayoutapp.navMode 在三种导航间切换:

ts
// MainLayout.vue(节选)
<NavDual v-if="app.navMode === 'dual'" />
<NavTree v-else-if="app.navMode === 'tree'" />
<NavRail v-else @open-cmdk="cmdkOpen = true" />

三种导航范式

范式navMode形态适用
双列(默认)dual92px 模块竖栏 + 218px 子菜单栏模块多、层级浅
树形tree256px 三级展开树 + 顶部面包屑(SubBar)层级深、爱用树
图标栏rail70px 图标竖栏,悬停弹出子菜单 flyout追求内容区最大化

切换入口在顶栏的设置弹层 SettingsPopover

ts
// SettingsPopover.vue(节选)
const NAV_OPTIONS = [
  { mode: 'dual', name: '双列(推荐)' },
  { mode: 'tree', name: '树形' },
  { mode: 'rail', name: '图标栏' },
]
// 选择后:app.setNavMode(opt.mode)

选择会通过 app.setNavMode 持久化到 localStorageforge.nav,刷新后保持。

⌘K 命令面板

CmdkPalette⌘K / Ctrl+K 唤起,把全部模块的菜单树拍平后做搜索,分「最近访问」与「全部导航」两组,支持上下键高亮、回车跳转。它依赖 app.loadAllMenus()(一次性加载所有模块菜单)。

主题的双轨制

控制台的主题分两条轨道,各管一摊,互不冲突:

  • 轨道一(antd 控件)tokens.ts 导出一个 forgeTheme: ThemeConfig,在 App.vue<a-config-provider :theme="forgeTheme"> 包住整个应用。表格、表单、分页、按钮等 antd 控件的颜色/圆角/控件高度都由它决定。
  • 轨道二(壳与自绘组件):顶栏、三导航、卡片、tag、抽屉等是手写组件,靠 forge.css 里的 CSS 变量控制。
vue
<!-- App.vue 全部结构 -->
<a-config-provider :theme="forgeTheme" :locale="zhCN">
  <router-view />
</a-config-provider>

改主题要改两处

改主色这类「贯穿全站」的令牌,antd 轨道tokens.tscolorPrimaryCSS 轨道forge.css--primary。只改一处会出现「按钮变了但卡片没变」的不一致。两条轨道当前都对齐到薄荷绿 #1f9d5b

设计令牌速查

antd 轨道(tokens.ts)

token含义
colorPrimary / colorSuccess#1f9d5b主色(薄荷绿)
colorWarning#d98a17警告
colorError#e0533c错误
colorInfo#3a7bf0信息
borderRadius8控件圆角
borderRadiusLG12卡片/抽屉/模态圆角
borderRadiusSM6小圆角
controlHeight38控件高度

tokens.ts 还对 Menu / Table / Pagination / Button / Input 等做了组件级覆盖(如表头底色、菜单选中态)。

CSS 轨道(forge.css)

CSS 变量定义在 [data-theme="a"](Theme A 浅色薄荷绿)上,主要令牌:

变量含义
--primary / --bg / --surface主色 / 页面底色 / 卡片面色
--border边框色
--text / --text-muted / --text-faint主文字 / 次要 / 最弱
--radius-card: 12px / --radius-ctl: 8px / --radius-sm: 6px圆角三档
--sp-1 … --sp-94px→56px 八档间距
--shadow-sm / --shadow-pop / --shadow-raise阴影三档

三个 CSS 文件分工:

文件职责
forge.css设计令牌(:root 主题无关 + [data-theme="a"] 浅色 + [data-theme] 语义状态色)
shell.css壳层结构样式(顶栏、三导航、弹层、抽屉、响应式)
antd-overrides.css对 antd 控件的深度样式覆盖(表格、分页、表单细节)

暗色主题:尚未实现

当前没有暗色主题

代码里只声明了 [data-theme="a"](浅色薄荷绿),没有 [data-theme="dark"] 之类的暗色定义,也没有任何地方在运行时切换 documentElementdata-theme。设置弹层目前只切导航范式,不切主题。

要扩展暗色:① 在 forge.css 增加一组 [data-theme="dark"] 变量;② 为 antd 轨道准备一份暗色 ThemeConfig(或用 antd 的 theme.darkAlgorithm);③ 在设置弹层加一个开关,切换 documentElementdata-theme 并切换 a-config-provider:theme。这是当前的一个自然扩展点

图标系统

壳与自绘组件的图标统一走 ForgeIcon + theme/icons.ts

  • icons.ts 是一个 name → SVG path 字典(60+ 图标),并带别名表(如历史名 shopstore),查不到回退 box
  • ForgeIconname 取出 path 串、拆成多段子路径,渲染成统一描边风格的 <svg>
vue
<ForgeIcon name="plus" :size="15" />

加图标:在 icons.tsICONS 里加一项 name: 'M...'(24×24 viewBox 的 path)即可全站可用。

下一步