Fantastic-admin 框架开发指南:从 AGENTS.md 读懂 Vue 3 后台管理系统的工程全貌

原创2026-10-02 11:27:531,444 阅读
文章标签:前端AI 技能

Fantastic-admin 框架开发指南:从 AGENTS.md 读懂 Vue 3 后台管理系统的工程全貌

导读:本文以仓库根目录 AGENTS.md 为骨架,逐条展开 Fantastic-admin 这一基于 Vue 3 的后台管理框架的工程事实——包括其技术栈选型、pnpm monorepo 目录布局、核心 CLI 命令的工作机制,以及面向 AI 编程场景的协作规范与代码约束。读者可通过本文快速建立对该仓库的整体认知,并掌握在多应用 monorepo 中安全开发、构建与协作的完整方法论。

一、项目定位:面向 AI 编程的后台管理框架

AGENTS.md 开篇即给出项目一句话定位:Fantastic-admin 是一个基于 Vue 3 的后台管理框架。结合仓库目录与 README.md 的项目描述可以确认,它的定位是面向 AI 编程场景的管理系统框架,同时兼容 PC 与移动端。

这一"面向 AI 编程"的定位并非空泛口号,而是体现在仓库结构中——根目录下存在一个完整的 skills/ 目录(如 fa-crud-page-generator、fa-route-generator、fa-form-builder、fa-feedback 等技能包),它们以 SKILL.md + references 的形式为 AI Agent 提供可复用的开发方法论,AGENTS.md 本身也正是为 AI 协作方阅读的入口文档。

二、技术栈全景:Vue 3 + TypeScript + Vite 的现代组合

AGENTS.md 列出的技术栈与仓库真实依赖完全对应,可逐一在 package.json 与 pnpm-workspace.yaml 的 catalog 中得到印证:

技术领域 选型 仓库证据
框架 Vue 3.6(vue: ^3.5.43,catalog 声明)+ TypeScript + Vite 8(vite: ^8.3.1) pnpm-workspace.yaml
UI 组件 Element Plus(默认,可替换)+ Reka UI(reka-ui: ^2.10.5)+ UnoCSS 原子化 CSS pnpm-workspace.yaml
状态管理 Pinia + pinia-plugin-persistedstate pnpm-workspace.yaml
路由 Vue Router 5(vue-router: ^5.3.1) pnpm-workspace.yaml
包管理器 pnpm(强制) package.json packageManager: pnpm@12.6.0
HTTP Axios pnpm-workspace.yaml
Mock vite-plugin-fake-server pnpm-workspace.yaml

值得注意的两个细节:

  1. "UI 可替换"是字面意义上的架构能力:apps/ 下并排存在 core(Element Plus 默认)、core-ant-design-vue、core-antdv-next、core-arco-design-vue、core-element-plus、core-naive-ui、core-tdesign、core-vexip-ui 共 8 个应用,它们共享同一套 src/ 目录结构(api / assets / components / composables / layouts / router / slots / store / types / ui / utils / views),通过 pnpm-workspace.yaml 的 catalog 机制(element-plus、ant-design-vue、naive-ui、arco-design-vue、tdesign、vexip-ui 等独立 catalog 分组)按应用维度锁定不同 UI 库版本。这证明"替换 UI 库"不是文档空谈,而是 monorepo 内实际可切换的工程事实。

  2. Node.js 版本有硬性门槛:AGENTS.md 要求以根目录 package.json 为准。实测 package.json 的 engines 字段为 node: ^22.22.2 || ^24.15.0 || >=26.0.0,且 packageManager: pnpm@12.6.0 会通过 preinstall 钩子(npx only-allow pnpm)强制包管理器约束。

三、目录结构:pnpm monorepo 的两级分层

AGENTS.md 给出了精简的目录树,其核心分层思想是 apps(应用层)与 packages(共享子包层)分离。结合仓库真实布局,可将其扩充为如下更完整的视图:

apps/
└── core/                          # 默认应用(Element Plus)
    └── src/
        ├── api/                   # API 请求模块(modules/ 下按业务拆分)
        ├── assets/                # 静态资源(icons、images、styles)
        ├── components/            # 全局业务组件(AppAccountButton、AppAuth 等)
        ├── composables/           # 组合式函数
        ├── hotkeys/               # 快捷键注册
        ├── iconify/               # 图标集(离线/在线模式)
        ├── layouts/               # 布局组件(含 26 个子组件)
        ├── router/                # 路由配置(modules、guards、extensions)
        ├── slots/                 # 插槽组件
        ├── store/                 # Pinia store(modules/ 下 6 个模块)
        ├── types/                 # TS 类型(auto-imports.d.ts、env.d.ts 等)
        ├── ui/                    # 框架内建 UI 组件(provider + shadcn 风格组件)
        ├── utils/                 # 工具函数(dayjs、storage、ua 等)
        └── views/                 # 页面视图
packages/
├── components/                    # 框架内建组件库(Fa* 系列,跨应用共享)
├── composables/                   # 组合式函数子包(pagination 等)
├── copyright/                     # 版权信息工具子包
├── hotkeys/                       # 快捷键子包
├── iconify-tools/                 # 图标下载/安装工具
├── settings/                      # 框架设置子包(默认值、类型、合并工具)
├── themes/                        # 主题配置子包(light/dark CSS 变量)
└── types/                         # 全局类型定义
scripts/
└── cli.ts                         # 工程 CLI 入口

AGENTS.md 中提到的"框架内建 UI 组件库"在 packages/components/src/index.ts 中有完整清单:FaAlert、FaAvatar、FaButton、FaTable、FaForm、FaModal、FaDrawer、FaToast、FaPagination 等,全部以 Fa 前缀命名并通过 Fa* 导出,同时配套 packages/components/resolver.ts 提供组件解析能力,配合 unplugin-vue-components 实现按需自动导入。

四、常用命令:CLI 背后的真实执行链路

AGENTS.md 给出三条核心命令,但它们在仓库中的实现远比字面更精巧——三条命令并非直接在根目录执行,而是经由 scripts/cli.ts 这一交互式 CLI 分发:

pnpm dev          # 启动开发服务器
pnpm build        # 构建
pnpm lint         # 运行全量 lint(tsc + eslint + stylelint)

在 package.json 中,三者对应:

{
  "dev": "tsx scripts/cli.ts --mode=dev",
  "build": "tsx scripts/cli.ts --mode=build",
  "serve": "tsx scripts/cli.ts --mode=serve",
  "lint": "run-s lint:tsc lint:eslint lint:stylelint",
  "lint:tsc": "pnpm --filter './apps/*' -r run lint",
  "lint:eslint": "eslint . --cache --fix",
  "lint:stylelint": "stylelint \"{apps,packages}/**/*.{css,scss,vue}\" --cache --fix"
}

4.1 dev / build / serve 的交互式分发机制

阅读 scripts/cli.ts 源码可知其完整流程:

  • 三种模式(dev / build / serve)由 --mode 参数决定,通过 parseModeArg 解析(支持 --mode=dev、-m dev 等写法),--help 或 -h 可查看用法;
  • CLI 会扫描 apps/ 下所有含 package.json 的子目录(getWorkspaceEntries),并按模式过滤出含匹配脚本(dev*、build*、serve*)的应用;
  • dev / serve 为单选模式(selectionMode: 'single'),build 为多选模式(selectionMode: 'multiple'),应用较多时会通过 @clack/prompts 弹出交互式选择;
  • 最终通过 spawn('pnpm', <a href="https://link.gitcode.com/i/2509749c8237ef31adc782bd2964417c" target="_blank">'--filter', packageName, 'run', script], ...) 执行对应子包脚本,例如选中 core 应用后实际执行的是 pnpm --filter @fantastic-admin/core run dev,即 [apps/core/package.json 中的 vite。

因此 pnpm dev 的真实含义是"选择目标应用后,在其目录下运行 Vite 开发服务器";pnpm build 则是"多选若干应用后,各自执行 vue-tsc -b && vite build 类型检查与构建"。

4.2 lint 三阶段流水线

pnpm lint 通过 npm-run-all2 的 run-s(串行)依次执行:

  1. lint:tsc:pnpm --filter './apps/*' -r run lint——对每个应用递归执行其自身 lint 脚本(在 apps/core/package.json 中即 vue-tsc -b 全量类型检查);
  2. lint:eslint:eslint . --cache --fix——根级 ESLint(基于 @antfu/eslint-config,见 eslint.config.js)带缓存并自动修复;
  3. lint:stylelint:stylelint "{apps,packages}/**/*.{css,scss,vue}" --cache --fix——对样式文件与 Vue 文件中的样式进行规范校验。

这正是 AGENTS.md 所说"运行全量 lint(tsc + eslint + stylelint)"的实现全貌。

4.3 提交前的自动化保障

AGENTS.md 提到"代码提交前会自动运行 lint-staged"。仓库 package.json 通过 simple-git-hooks 配置了 pre-commit 钩子为 pnpm lint-staged,即仅对暂存文件执行 lint 修复,避免全量校验拖慢提交速度。同时 commit 脚本(git cz)搭配 cz-git 提供规范化的提交信息模板。

五、开发规范:AI 协作的硬约束

AGENTS.md 的开发规范部分是 AI 参与者(以及人类开发者)在仓库内改代码时必须遵守的契约,逐条对应到仓库真实实现:

5.1 SFC 与样式约定

  • <script setup lang="ts"> 语法:仓库所有视图与组件均采用此写法,例如 apps/core/src/main.ts 作为入口采用 Composition API 组织,组件层从 packages/components/src/basic/ 到 apps/core/src/views/ 均遵循 SFC + lang="ts"。
  • 样式优先 UnoCSS 原子类,复杂样式用 SCSS:根目录 uno.config.ts 配置了 UnoCSS(含 unocss-preset-animations 等预设),应用入口 apps/core/src/main.ts 显式 import 'virtual:uno.css';SCSS 由 sass-embedded 提供(catalog 声明),并在 stylelint.config.js 中通过 stylelint-config-standard-scss 进行校验。
  • 组件命名 PascalCase 且文件名与组件名一致:从 apps/core/src/components/ 下的 AppAccountButton、AppAccountForm、AppAuth 等目录命名即可验证。

5.2 模块归属约定

5.3 内建组件优先原则

AGENTS.md 强调"优先使用框架内建组件而非第三方组件或自定义实现"。内建组件集中在 packages/components/src/index.ts 的 Fa* 系列,覆盖表单(FaForm/FaInput/FaSelect/FaRadioGroup/FaCheckbox)、反馈(FaAlert/FaToast/FaModal/FaDrawer/FaTooltip/FaPopover)、数据展示(FaTable/FaTag/FaBadge/FaDescriptions/FaTrend)、导航与布局(FaTabs/FaPageHeader/FaPageMain/FaDivider)、上传(FaFileUpload/FaImageUpload)等场景,并通过 packages/components/resolver.ts 提供按需解析。

六、设置与主题:跨应用共享的子包机制

AGENTS.md 目录树提到的 packages/settings(框架设置)与 packages/themes(主题配置)是理解整个框架可配置性的关键:

6.1 settings 子包

packages/settings/src/index.ts 对外导出 settingsDefault、merge、setSettings、setSettingsLegacy、diffTwoObj 等核心 API。其类型定义在 packages/settings/src/types.ts 中按主题域拆分:

  • AppSettings:应用级配置,含路由模式(routeMode: 'hash' | 'html5',默认 hash)、路由数据来源(routeBaseOn: 'frontend' | 'backend',默认 frontend)、动态标题(dynamicTitle)、哀悼模式(rip)、移动端访问开关(mobile)、主页(home)、版权(copyright)、账号(account)等;
  • MenuSettings、TabbarSettings、ToolbarSettings、PageSettings、ThemeSettings:分别对应侧边栏/头部菜单、标签栏、工具栏、页面级与主题级配置,且 MenuMode('side' | 'head' | 'single')、TopbarMode('static' | 'fixed' | 'sticky')、MainMenuClickMode('switch' | 'jump' | 'smart')等联合类型全部以带 JSDoc @default 注释的形式在源码中显式声明。

这与根目录 skills/fa-framework-settings/references/ 下的 7 份配置参考文档(app-settings.md、menu-settings.md、tabbar-settings.md、theme-settings.md 等)形成呼应——AI 可通过技能参考快速定位每个配置域的完整选项。

6.2 themes 子包

packages/themes/index.ts 导出 lightTheme 与 darkTheme 两组 CSS 变量对象,采用 shadcn 风格的 oklch 颜色令牌(如 --background、--foreground、--primary、--accent)叠加框架自定义的 --g-* 布局变量(主区域、头部、主导航、次导航、标签栏、工具栏的背景/前景色),从而支持运行时主题切换。@fantastic-admin/themes 以 workspace:* 形式被根包引用(见 package.json devDependencies)。

七、Mock 数据:vite-plugin-fake-server 的落地方式

AGENTS.md 明确 Mock 数据使用 vite-plugin-fake-server,且文件要放在 apps/<app>/src/api/modules/ 对应模块旁。仓库证据链完整:

八、AI 协作注意事项与反馈闭环

AGENTS.md 最后两节是 AI 编程场景特有的协作规则,值得完整保留:

  1. 内建组件禁改:任何情况下都不要直接修改内建组件,确定修改前必须先与用户确认——这保护了 packages/components/ 跨应用共享的稳定性;
  2. Node 版本以根目录 package.json 为准:即上文提及的 engines 约束;
  3. 反复修改检测(fa-feedback):使用任何 fa-* 系列技能时,如果用户对同一功能点要求修改 3 次及以上仍未达到预期(如连续说"不对""再改改""还是不行"),必须触发 skills/fa-feedback/SKILL.md 技能,询问用户是否将问题反馈给框架作者。这是仓库为 AI 协作设计的"止损机制",避免低效循环。

九、从文档到实践:快速上手路径

综合 AGENTS.md 与仓库结构,一个完整的上手路径如下:

  1. 环境准备:安装 Node.js(^22.22.2 || ^24.15.0 || >=26.0.0)与 pnpm(12.6.0),仓库 preinstall 钩子会校验包管理器;
  2. 安装依赖:在仓库根目录执行 pnpm install(workspace 自动识别 apps/* 与 packages/*,catalog 统一锁定依赖版本);
  3. 启动开发:pnpm dev,在弹出的应用列表中选择目标应用(如 core),CLI 会自动执行 pnpm --filter @fantastic-admin/core run dev 启动 Vite;
  4. 日常开发:遵循 src/ 目录约定新增 API 模块、Store 模块与路由配置;优先使用 Fa* 内建组件;样式优先 UnoCSS 原子类;
  5. 质量检查:提交前由 simple-git-hooks 触发 lint-staged 自动修复;全量校验使用 pnpm lint;
  6. 构建发布:pnpm build 多选应用执行 vue-tsc -b && vite build,产物供 pnpm serve(http-server ./dist -o)预览。

结语

AGENTS.md 虽然篇幅简短,却精确刻画了 Fantastic-admin 仓库的工程骨架:Vue 3 + TypeScript + Vite 8 的技术底座、pnpm monorepo 的 apps/packages 两级架构、以 scripts/cli.ts 为核心的交互式命令分发、以及面向 AI 协作的严格代码契约与反馈机制。理解这份文档,就掌握了在这个多应用、多 UI 库并存的中后台框架中安全探索与高效开发的完整地图——其余细节,均可顺着本文给出的源码路径继续深入。

登录后查看全文
basic