# easy-admin **Repository Path**: LiCcccc1124-java/easy-admin ## Basic Information - **Project Name**: easy-admin - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-10-28 - **Last Updated**: 2025-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Easy Admin 后台管理系统 基于 Vue 3 + Element Plus 的简易后台管理系统,对接 Spring Boot 后端 API,提供丰富的业务组件。 后端项目地址:https://gitee.com/Love_Noah_chen/easy-back ## 技术栈 - **框架**: Vue 3.4 - **UI 组件库**: Element Plus 2.5 - **状态管理**: Pinia 2.1 - **路由**: Vue Router 4.2 - **HTTP 客户端**: Axios 1.6 - **构建工具**: Vite 5.0 - **图标**: @element-plus/icons-vue - **进度条**: nprogress - **Cookie管理**: js-cookie ## 功能模块 ### ✅ 已实现功能 1. **用户认证** - 用户名密码登录 - Sa-Token 认证 - 自动 Token 刷新 - 路由守卫和权限控制 2. **菜单管理** - 菜单树展示 - 新增/编辑/删除菜单 - 菜单权限关联 3. **部门管理** - 部门树展示 - 新增/编辑/删除部门 - 级联删除 - 启用/停用部门 4. **角色管理** - 角色列表(分页) - 新增/编辑/删除角色 - 角色状态管理 5. **用户管理** - 用户列表(分页) - 新增/编辑/删除用户 - 用户角色分配 - 用户状态管理 6. **权限管理** - 菜单权限 - 按钮权限 - 权限指令 `v-permission` 7. **系统配置** - 系统参数配置 - 字典管理 - 枚举管理 8. **个人中心** - 个人信息修改 - 头像上传 - 密码修改 9. **文件管理** - 文件上传(单文件/多文件) - 批量模式(流水号) - 图片预览 - 文件下载 10. **系统布局** - 动态菜单加载 - 侧边栏菜单 - 顶部导航栏 - 面包屑导航 - 响应式布局 - 俄罗斯方块登录背景动画 ## 页面截图 ![image-20251021222956505](docs/images/image-20251021222956505.png) ![image-20251021223154894](docs/images/image-20251021223154894.png) ![image-20251021223215713](docs/images/image-20251021223215713.png) ![image-20251021223247031](docs/images/image-20251021223247031.png) ## 项目结构 ``` easy-admin/ ├── public/ # 静态资源 ├── src/ │ ├── api/ # API 接口封装 │ │ ├── login.js # 登录接口 │ │ ├── menu.js # 菜单接口 │ │ ├── dept.js # 部门接口 │ │ ├── role.js # 角色接口 │ │ └── file.js # 文件接口 │ ├── assets/ # 资源文件 │ ├── components/ # 业务组件 │ │ ├── PageTable.vue # 分页表格组件 │ │ ├── DictSelect.vue # 字典选择器 │ │ ├── EnumSelect.vue # 枚举选择器 │ │ ├── FileUpload.vue # 文件上传 │ │ ├── ImageUpload.vue # 图片上传 │ │ ├── ImageCell.vue # 图片单元格 │ │ ├── IconPicker.vue # 图标选择器 │ │ ├── PaginationSelect.vue # 分页选择器 │ │ ├── MenuTree.vue # 菜单树 │ │ ├── DeptTree.vue # 部门树 │ │ └── RectLoading.vue # 加载动画 │ ├── layout/ # 布局组件 │ │ ├── index.vue # 主布局 │ │ └── components/ # 布局子组件 │ ├── router/ # 路由配置 │ │ └── index.js # 路由主文件 │ ├── stores/ # Pinia 状态管理 │ │ └── user.js # 用户状态 │ ├── styles/ # 全局样式 │ │ └── index.scss # 主样式文件 │ ├── utils/ # 工具函数 │ │ ├── request.js # Axios 封装 │ │ └── auth.js # 认证工具 │ ├── views/ # 页面组件 │ │ ├── login/ # 登录页 │ │ ├── dashboard/ # 首页 │ │ ├── system/ # 系统管理 │ │ │ ├── menu/ # 菜单管理 │ │ │ ├── dept/ # 部门管理 │ │ │ └── role/ # 角色管理 │ │ └── error/ # 错误页面 │ ├── App.vue # 根组件 │ └── main.js # 入口文件 ├── index.html # HTML 模板 ├── vite.config.js # Vite 配置 ├── package.json # 依赖配置 └── README.md # 项目说明 ``` ## 开始使用 ### 环境要求 - Node.js >= 16.0.0 - npm >= 8.0.0 或 pnpm >= 7.0.0 ### 安装依赖 ```bash # 进入前端项目目录 cd easy-admin # 使用 npm npm install # 或使用 pnpm(推荐) pnpm install # 或使用 yarn yarn install ``` ### 开发环境运行 ```bash npm run dev # 或 pnpm dev # 或 yarn dev ``` 访问: http://localhost:3000 ### 生产环境构建 ```bash npm run build # 或 pnpm build # 或 yarn build ``` 构建产物在 `dist` 目录。 ### 预览生产构建 ```bash npm run preview # 或 pnpm preview # 或 yarn preview ``` ## API 配置 后端 API 地址配置在 `vite.config.js` 中的代理设置: ```javascript server: { port: 3000, proxy: { '/api': { target: 'http://localhost:8080', // 后端服务地址 changeOrigin: true } } } ``` ## API 接口说明 ### 后端接口地址 所有接口都通过 `/api/v1/` 前缀访问。 #### 认证相关 - **POST** `/api/v1/login` - 用户登录 - 请求体: `{ username, password, loginType }` - 响应: `{ token, userInfo }` - **GET** `/api/v1/logout` - 用户登出 #### 菜单管理 - **PUT** `/api/v1/menu/add` - 新增菜单 - **POST** `/api/v1/menu/modify` - 修改菜单 - **DELETE** `/api/v1/menu/delete/{menuId}` - 删除菜单 - **GET** `/api/v1/menu/tree` - 获取完整菜单树 - **GET** `/api/v1/menu/info/{menuId}` - 获取菜单详情 - **GET** `/api/v1/menu/current-user-tree` - 获取当前用户菜单树 - **GET** `/api/v1/menu/current-user-permissions` - 获取当前用户权限列表 #### 部门管理 - **PUT** `/api/v1/dept/add` - 新增部门 - **POST** `/api/v1/dept/modify` - 修改部门 - **DELETE** `/api/v1/dept/delete/{deptId}` - 删除部门 - **POST** `/api/v1/dept/disable/{deptId}` - 停用部门 - **POST** `/api/v1/dept/enable/{deptId}` - 启用部门 - **POST** `/api/v1/dept/page` - 部门分页列表 - **GET** `/api/v1/dept/tree` - 部门树 - **GET** `/api/v1/dept/info/{deptId}` - 部门详情 #### 角色管理 - **PUT** `/api/v1/role/add` - 新增角色 - **POST** `/api/v1/role/modify` - 修改角色 - **DELETE** `/api/v1/role/delete/{roleId}` - 删除角色 - **POST** `/api/v1/role/page` - 角色分页列表 - **GET** `/api/v1/role/info/{roleId}` - 角色详情 #### 用户管理 - **PUT** `/api/v1/user/add` - 新增用户 - **POST** `/api/v1/user/modify` - 修改用户 - **DELETE** `/api/v1/user/delete/{userId}` - 删除用户 - **POST** `/api/v1/user/page` - 用户分页列表 - **GET** `/api/v1/user/info/{userId}` - 用户详情 #### 个人中心 - **GET** `/api/v1/profile/info` - 获取当前用户信息 - **POST** `/api/v1/profile/update` - 更新个人信息 - **POST** `/api/v1/profile/updatePassword` - 修改密码 #### 文件管理 - **POST** `/api/v1/file/upload` - 上传文件 - 支持单文件和多文件上传 - 支持批量模式(返回流水号) - **GET** `/api/v1/file/download/{fileId}` - 下载文件 - **GET** `/api/v1/file/preview/{fileId}` - 预览文件(需认证) - **GET** `/api/v1/file/info/{fileId}` - 获取文件信息 - **GET** `/api/v1/file/list/batch/{fileSerial}` - 通过流水号获取文件列表 - **GET** `/api/v1/file/download/batch/{fileSerial}` - 批量下载(ZIP) #### 系统配置 - **GET** `/api/v1/system/config/getSystemName` - 获取系统名称 - **GET** `/api/v1/system/config/getByKey/{key}` - 根据键获取配置值 - **POST** `/api/v1/system/config/page` - 配置分页列表 - **POST** `/api/v1/system/config/modify` - 修改配置 #### 字典管理 - **GET** `/api/v1/dict/list/{dictCode}` - 获取字典项列表 - **POST** `/api/v1/dict/page` - 字典分页列表 #### 枚举管理 - **GET** `/api/v1/enum/options/{enumName}` - 获取枚举选项列表 ## 默认账号 系统会在首次启动时自动初始化默认管理员账号: - 用户名: `admin` - 密码: `123456` **注意**: 请在生产环境中及时修改默认密码! ## 开发说明 ### 新增页面 1. 在 `src/views/` 下创建对应的 Vue 组件 3. 在 `src/api/` 中添加对应的 API 接口 ### 自动导入 项目使用了 `unplugin-auto-import` 和 `unplugin-vue-components`: - Vue API(ref, reactive, computed 等)无需手动导入 - Element Plus 组件按需自动导入 - Vue Router API 自动导入 ### 样式规范 - 使用 SCSS 预处理器 - 采用 BEM 命名规范 - 全局样式定义在 `src/styles/index.scss` ## 浏览器支持 - Chrome >= 87 - Firefox >= 78 - Safari >= 14 - Edge >= 88 ## 注意事项 1. **Token 存储**: Token 存储在 Cookie 中,键名为 `Admin-Token` 2. **请求拦截**: 所有请求自动携带 Token(请求头 `authorize-token: Bearer {token}`) 3. **响应拦截**: - 自动处理 401/40100 错误,跳转到登录页 - 业务错误(code !== 20000)统一处理 4. **路由守卫**: - 未登录用户自动重定向到登录页 - 动态加载菜单路由 - 首次访问自动跳转到第一个菜单 5. **权限控制**: - 按钮级权限使用 `v-permission` 指令 - 支持 `v-permission="'add'"` 单个权限 - 支持 `v-permission="['add','edit']"` 多个权限(任一) - 支持 `v-permission.and="['add','edit']"` 多个权限(全部) ## 业务组件使用说明 ### 1. PageTable 分页表格组件 功能强大的分页表格组件,支持搜索、工具栏、自动高度等特性。 **基础用法:** ```vue ``` **主要属性:** - `data`: 表格数据 - `loading`: 加载状态 - `pagination`: 分页配置 `{ current, size, total }` - `showPagination`: 是否显示分页器(默认 true) - `showToolbar`: 是否显示工具栏(默认 false) **支持的插槽:** - `search-form`: 搜索表单 - `toolbar-left`: 工具栏左侧按钮 - `toolbar-right`: 工具栏右侧按钮 --- ### 2. DictSelect 字典选择器 从后端字典表加载数据的下拉选择组件,支持两种显示模式。 **基础用法:** ```vue ``` **主要属性:** - `dict-code`: 字典编码(必填) - `mode`: 显示模式,`'select'` 或 `'button'`(默认 'select') - `multiple`: 是否多选(默认 false) - `immediate`: 是否立即加载(默认 false,首次展开时加载) --- ### 3. EnumSelect 枚举选择器 从后端枚举类加载数据的下拉选择组件。 **基础用法:** ```vue ``` **主要属性:** - `enum-name`: 枚举类名称(必填) - `mode`: 显示模式,`'select'` 或 `'button'` - `multiple`: 是否多选 --- ### 4. FileUpload 文件上传组件 支持多文件上传、拖拽、粘贴的文件上传组件,支持批量下载。 **基础用法:** ```vue ``` **主要属性:** - `batch-mode`: 批量模式,多文件共用一个流水号(默认 false) - `limit`: 允许上传的文件数量 - `accept`: 接受的文件类型 - `max-size`: 文件大小限制(MB) **特色功能:** - 拖拽文件到表格区域上传 - Ctrl+V 粘贴图片上传 - 批量下载(批量模式) --- ### 5. ImageUpload 图片上传组件 专用于图片上传的组件,支持预览、拖拽、粘贴。 **基础用法:** ```vue ``` **主要属性:** - `limit`: 允许上传的图片数量 - `max-size`: 图片大小限制(MB,默认 5) - `auto-upload`: 是否自动上传(默认 true) - `batch-mode`: 批量模式 --- ### 6. ImageCell 图片单元格组件 在表格中展示图片,支持预览、点击放大。 **基础用法:** ```vue ``` **主要属性:** - `mode`: 加载模式,`'id'` 或 `'serial'`(默认 'id') - `file-id`: 文件ID或ID数组 - `serial`: 文件流水号 - `max-display`: 最大显示数量(默认 3) - `size`: 缩略图大小(默认 40) --- ### 7. IconPicker 图标选择器 选择 Element Plus 图标的选择器组件。 **基础用法:** ```vue ``` **特色功能:** - 支持搜索图标 - 图标预览 - 自适应高度 --- ### 8. PaginationSelect 分页选择器 支持分页的下拉选择组件,适用于大数据量选择。 **基础用法:** ```vue ``` **主要属性:** - `load-data`: 数据加载函数(必填) - `load-initial-data`: 加载初始数据的函数(用于回显) - `label-key`: 显示的标签字段 - `value-key`: 值字段 - `show-pagination`: 是否显示分页(默认 true) --- ### 9. RectLoading 加载动画 美观的加载动画组件。 **基础用法:** ```vue ``` **主要属性:** - `visible`: 是否显示 - `type`: 类型,`'default'` 或 `'small'` - `color`: 颜色 - `text`: 提示文字 --- ## 常见问题 ### 1. 启动后无法访问后端接口? 检查 `vite.config.js` 中的代理配置,确保 `target` 指向正确的后端地址(默认 `http://localhost:8080`)。 ### 2. 登录后跳转 404? - 检查后端是否正常返回菜单数据 - 检查菜单表中是否有可用的菜单项 - 查看浏览器控制台是否有错误信息 ### 3. 图片/文件无法预览或下载? - 确保后端 MinIO 服务已正常启动 - 检查 MinIO 配置是否正确 - 查看后端配置文件中的文件存储设置 ### 4. Token 过期后无法自动跳转登录页? 检查响应拦截器中的错误码处理逻辑,确保正确处理 `40100` 错误码。 ### 5. 按钮权限指令不生效? - 确保已在 `main.js` 中注册 `v-permission` 指令 - 检查用户是否有对应的权限 - 查看 localStorage 中是否正确存储了权限列表 ### 6. 组件使用问题 详细的组件文档请查看本文档中的"业务组件使用说明"章节。 ## 许可证 MIT License ## 觉得项目不错可以考虑请作者喝杯蜜雪 ![image-1](docs/images/images-1.jpg) ![image-20251022203632466](docs/images/image-20251022203632466.png)