AI学习 EleAdminPlus 前端框架
更新时间:2026-03-10
结论:本项目前端
fuyo-ccc-bos-ui已基于ele-admin-plus@1.5.0落地,不需要从零研究“框架怎么接入”,下次直接按本文档的项目约定开发即可。
1. 当前项目事实
- 前端目录:
fuyo-ccc-bos-ui - 技术栈:
Vue 3.5.22+TypeScript 5.9.3+Vite 6.4.0 - UI:
Element Plus 2.11.7 - 业务框架:
EleAdminPlus 1.5.0 - 状态管理:
Pinia 3.0.3 - 路由:
Vue Router 4.6.3 - 请求库:
Axios 1.12.2
2. 这套框架在本项目里到底负责什么
EleAdminPlus 在本项目里不是“替代 Vue/Element Plus”的底层框架,而是管理后台增强层,主要承担这些事情:
- 后台布局:侧栏、顶栏、标签页、面包屑
- 动态菜单转动态路由
- 表格增强:
EleProTable - 弹窗抽屉增强:
useModal - 消息提示:
EleMessage - 树结构处理:
toTree、mapTree、eachTree - 一批业务组件和布局能力
实际开发时仍然是:
- 用
Vue 3 setup script写页面 - 用
Element Plus做基础表单和交互 - 用
EleAdminPlus处理后台壳子、表格、弹窗、菜单权限
3. 入口和初始化要点
入口文件:fuyo-ccc-bos-ui/src/main.ts
当前项目初始化顺序:
- 创建 Vue App
- 安装
Pinia - 安装
Router - 安装权限指令插件
permission - 安装
i18n - 安装按需组件或开发态全量组件
- 安装图标
- 设置主题为
modern - 全局关闭
ElDialog点击遮罩关闭
项目级定制结论:
- 默认主题已经被改成
modern - 标签页不在头部显示:
tabInHeader = false - 标签风格为
tag - 所有
ElDialog默认closeOnClickModal = false
下次如果新增弹窗,不要再单独重复改遮罩关闭逻辑,先看全局默认是否已满足。
4. 目录速查
以 fuyo-ccc-bos-ui/src 为准:
api/:按业务模块拆分接口components/:公共组件config/:系统级常量配置layout/:后台布局router/:静态路由、动态路由生成store/:Pinia 状态styles/:全局样式和主题utils/:请求、权限、token、通用函数views/:页面
开发入口优先级建议:
- 先看
views/有没有同类页面 - 再看
api/是否已有同类接口封装 - 再看
components/是否已有公共组件 - 最后才自己新造模式
5. 动态菜单和动态路由的真实链路
核心文件:
src/api/layout/index.tssrc/store/modules/user.tssrc/utils/menu-util.tssrc/router/routes.ts
当前链路如下:
- 前端调用
/auth/user获取当前用户信息 - 后端返回用户、角色、权限、菜单
user.ts中将authorities里menuType !== 1的数据拿出来转树formatUserMenu把后端菜单结构转换为EleAdminPlus可识别的MenuItem[]getMenuRoutes使用menuToRoutes生成动态路由- 组件路径通过
import.meta.glob('/src/views/**/index.vue')解析
这里有一个非常关键的项目约定:
- 后端菜单里的
component必须能映射到src/views下的页面路径 - 优先匹配:
/src/views${component}.vue - 找不到时再匹配:
/src/views${component}/index.vue
所以新增菜单页面时,最稳妥的文件结构是:
src/views/业务域/页面名/index.vue
后端菜单 component 推荐配置成:
/业务域/页面名
6. 权限控制怎么用
全局指令注册文件:src/utils/permission.ts
当前可直接使用的指令:
v-rolev-any-rolev-permissionv-any-permission
使用方式:
<el-button v-permission="'system:user:add'">新增</el-button> <el-button v-any-permission="['system:user:edit', 'system:user:update']">编辑</el-button>
行为特征:
- 没权限时,元素会直接从 DOM 中移除
- 适合按钮、链接、操作入口控制
开发结论:
- 页面级访问控制主要走菜单和路由
- 按钮级访问控制优先走
v-permission - 不要只做前端隐藏,后端接口仍必须做权限校验
7. 请求层约定
核心文件:src/utils/request.ts
当前项目约定:
baseURL = import.meta.env.VITE_API_URL- token 请求头名不是
Authorization,而是satoken - GET 请求参数会被拼接到 URL
- 响应里如果返回新 token,会从响应头
authorization回写本地缓存 - 登录过期时会自动跳登录
下次接接口时要记住:
- 不要自己重复封装 axios 实例
- 新接口统一写在
src/api/业务模块 - 成功判断统一看
res.data.code === 0
接口层推荐模板:
export async function pageDemo(params: DemoParam) {
const res = await request.get<ApiResult<PageResult<Demo>>>('/demo/page', {
params
});
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.msg));
}
8. 最常用的页面开发模式
8.1 列表页
本项目列表页标准形态基本是:
ele-page- 搜索组件
ele-cardele-pro-tabletoolbar放新增/批量删除action插槽放行内操作
参考页面:src/views/system/role/index.vue
典型特征:
row-key必填columns单独定义datasource对接分页接口v-model:selections管理勾选reload统一刷新- 导出/打印单独配置完整数据源
推荐骨架:
<ele-page>
<demo-search @search="(where) => reload(where, 1)" />
<ele-card :body-style="{ paddingTop: '8px' }">
<ele-pro-table
ref="tableRef"
row-key="id"
:columns="columns"
:datasource="datasource"
v-model:selections="selections"
cache-key="DemoTable"
>
<template #toolbar>
<btn-items :items="[{ preset: 'add', onClick: () => openEdit() }]" />
</template>
<template #action="{ row }">
<btn-items
type="link"
:items="[
{ preset: 'edit', onClick: () => openEdit(row) },
{ preset: 'del', onClick: () => remove(row) }
]"
/>
</template>
</ele-pro-table>
</ele-card>
</ele-page>
8.2 编辑弹窗
项目已经明显偏向使用 useModal,不要再优先写一堆 dialogVisible。
推荐方式:
const { openModal } = useModal();
const openEdit = (row?: Demo) => {
openModal({
custom: true,
asyncComponent: () => import('./components/demo-edit.vue'),
componentProps: {
data: row,
onDone: () => reload()
}
});
};
结论:
- 新增/编辑共用一个弹窗组件
- 弹窗保存成功后调用父级
onDone - 复杂弹窗优先
useModal,代码更干净
8.3 搜索表单
本项目常见做法:
- 搜索表单拆独立组件
- 对外只抛
search事件 - 父页面负责把
where传给tableRef.reload
这样做的好处:
- 页面主体更干净
- 搜索条件可以复用
- 更适合中后台列表页批量开发
9. EleProTable 的落地规则
EleProTable 是这个项目最值得优先复用的组件。
必须掌握的点:
- 支持分页数据源
- 支持搜索条件和排序条件合并
- 支持导出、打印
- 支持插槽列
- 支持缓存
cache-key - 支持选中项联动
项目中最常见的数据源写法:
const datasource: DatasourceFunction = ({ pages, where, orders }) => {
return pageDemo({ ...where, ...orders, ...pages });
};
注意事项:
- 后端分页字段命名必须与当前封装兼容
- 排序参数
orders会直接透传给后端 - 导出全部数据时不要直接复用分页接口,单独写
listXXX
10. 树结构工具该怎么记
本项目大量使用:
toTreemapTreeeachTree
典型场景:
- 菜单平转树
- 菜单树转
EleAdminPlus菜单格式 - 更新菜单徽章
- 树形下拉和树表数据处理
简单记忆:
toTree:平铺数组转树mapTree:遍历树并返回新树eachTree:遍历树做副作用处理
11. 组件按需和构建约定
配置文件:vite.config.ts
当前策略:
- 开发环境:走全量安装,便于调试
- 构建环境:
Element Plus和EleAdminPlus按需引入 - 使用
unplugin-vue-components - 已集成
EleAdminResolver
开发结论:
- 大多数 EleAdminPlus/Element Plus 组件在 SFC 中可直接使用
- 不要因为“没手动 import”就误判组件不可用
- 先遵循现有自动注册机制
12. 主题和外观结论
从 main.ts 看,本项目当前主题取向已经明确:
- 皮肤:
modern - 标签:内容区显示
- 标签样式:
tag
下次做前端页面时:
- 优先顺着当前主题做,不要单页搞完全不同的视觉体系
- 样式先贴合后台管理页,不要自行制造新布局系统
13. EleAdminPlus 1.5.0 值得记住的新能力
根据项目内手册 更新日志.md,当前版本新增/强化的能力里,最值得下次直接使用的是:
UserSelectRoleSelectDepartmentSelectuseModalBtnItemsEleModal/EleDrawer的loading、flexTable- 新主题:清新、现代,以及暗黑模式适配
对本项目最实用的结论:
- 人员、角色、部门选择场景,优先查现成组件,不要先手搓弹窗树和表格
- 操作列按钮,优先
BtnItems - 弹窗交互,优先
useModal
14. 新增一个标准后台页面的最短路径
下次开发时直接按这个顺序:
- 在
src/api/业务模块新增接口封装 - 在
src/views/业务域/页面名/新建页面 - 列表页优先套
ele-page + ele-card + ele-pro-table - 搜索区拆成
components/xxx-search.vue - 新增/编辑拆成
components/xxx-edit.vue - 用
useModal打开编辑弹窗 - 需要按钮权限就加
v-permission - 后端菜单
component填成和src/views对应的路径 - 联调
/auth/user返回的菜单是否能正确生成路由
15. 容易踩坑的地方
- 菜单
component路径填错,动态路由会落到 404 - 只配前端按钮权限、不配后端权限,安全上无效
- 表格导出全部时误用分页接口,导出数据不完整
- 自己再建一套 axios 封装,破坏统一 token 和过期处理
- 忘记
row-key,导致表格勾选和刷新行为异常 - 弹窗状态手写过重,和项目现有
useModal风格脱节
16. 下次直接复用的心智模型
一句话记住:
EleAdminPlus在本项目中的正确使用方式,不是“研究它全部组件”,而是“沿着现有后台模板继续开发”:动态菜单驱动路由,EleProTable驱动列表页,useModal驱动编辑弹窗,权限指令驱动按钮显示,request.ts驱动接口调用。
如果下次让我继续基于这个项目写前端,默认按以下约定执行:
- 页面放
src/views/**/index.vue - 菜单转路由沿用现有动态模式
- 列表优先
EleProTable - 编辑优先
useModal - 权限优先
v-permission - 接口优先复用
request.ts - 样式优先贴合
modern主题