Vben Admin是一个基于 Vue3.0、Vite、 TypeScript 的中后台解决方案,目前更新到5.0版本,跟旧版本不兼容。这是他的官网:Vben Admin。
关键目录说明:
/
:项目根目录,包含项目的入口文件、配置文件、依赖文件等。
package.json
:定义项目的依赖、脚本和配置信息。
vite.config.ts
:Vite 的配置文件,用于定义开发服务器、构建工具等。
.env.*
:环境变量配置文件,用于定义不同环境下的配置,如开发环境、生产环境等。
src/
:项目的源代码目录,包含所有前端代码。
/api
:存放所有与后端接口相关的请求代码,通常按模块划分。
user.ts
:用户相关的 API 请求。
dashboard.ts
:仪表盘相关的 API 请求。
system/
:系统管理相关的 API 请求,如菜单、角色、用户等。
/assets
:存放静态资源,如图片、样式文件等。
/components
:自定义组件的存放目录。
BasicUpload.vue
:文件上传组件。
BasicTable.vue
:表格组件。
/layouts
:页面布局相关的组件,如顶部导航栏、侧边栏等。
BasicLayout.vue
:基本布局组件。
/router
:路由配置目录。
index.ts
:路由的入口文件,定义全局路由配置。
modules/
:按模块划分的路由配置文件。
/store
:状态管理目录,使用 Pinia 或 Vuex。
index.ts
:状态管理的入口文件。
modules/
:按模块划分的状态管理文件。
/utils
:工具函数目录,存放常用的工具函数。
http/axios.ts
:封装的 HTTP 请求工具。
helper.ts
:通用的辅助函数。
/views
:页面组件目录,存放所有的页面组件。
Dashboard.vue
:仪表盘页面。
UserManage.vue
:用户管理页面。
/hooks
:自定义的 Vue 钩子函数。
useTable.ts
:用于表格操作的自定义钩子。
/types
:自定义的 TypeScript 类型定义文件。
global.d.ts
:全局类型定义。
/mock
:Mock 数据目录,用于开发环境中的模拟数据。
index.ts
:Mock 数据的入口文件。
modules/
:按模块划分的 Mock 数据文件。
/locales
:国际化语言包目录。
en-US.ts
:英文语言包。
zh-CN.ts
:中文语言包。
/styles
:全局样式文件目录。
index.less
:全局样式文件。
/theme
:主题配置目录。
index.ts
:主题配置文件。
/config
:项目配置目录。
index.ts
:项目全局配置文件。
/entry
:项目入口文件。
main.ts
:项目的主入口文件,用于初始化 Vue 应用。
/permission
:权限管理目录。
index.ts
:权限管理的入口文件。
/theme
:主题配置目录。
index.ts
:主题配置文件。
public/
:存放公共静态资源,如 favicon.ico
、manifest.json
等。
tests/
:存放测试代码,如单元测试、端到端测试等。
docs/
:存放项目文档,如开发指南、API 文档等。
dist/
:项目构建后的输出目录,包含生产环境的静态资源。
node_modules/
:存放项目依赖的第三方库。
.env.development
:开发环境的配置文件。
.env.production
:生产环境的配置文件。
.eslintrc.js
:ESLint 配置文件,用于代码规范检查。
.prettierrc.js
:Prettier 配置文件,用于代码格式化。
.browserslistrc
:浏览器兼容性配置文件。
scripts/
:存放项目相关的脚本文件,如自动化脚本、构建脚本等。
项目根目录
├── src/ # 源代码目录
│ ├── api/ # API 请求相关代码
│ │ ├── user.ts # 用户相关的 API 请求
│ │ ├── dashboard.ts # 仪表盘相关的 API 请求
│ │ └── system/ # 系统管理相关的 API 请求
│ │ ├── menu.ts # 菜单管理 API
│ │ ├── role.ts # 角色管理 API
│ │ └── user.ts # 系统用户管理 API
│ ├── assets/ # 静态资源目录
│ │ ├── images/ # 图片资源
│ │ └── styles/ # 样式文件
│ ├── components/ # 自定义组件目录
│ │ ├── BasicUpload.vue # 文件上传组件
│ │ └── BasicTable.vue # 表格组件
│ ├── layouts/ # 页面布局组件
│ │ └── BasicLayout.vue # 基本布局组件
│ ├── router/ # 路由配置目录
│ │ ├── index.ts # 路由入口文件
│ │ └── modules/ # 按模块划分的路由配置
│ ├── store/ # 状态管理目录
│ │ ├── index.ts # 状态管理入口文件
│ │ └── modules/ # 按模块划分的状态管理
│ ├── utils/ # 工具函数目录
│ │ ├── http/axios.ts # 封装的 HTTP 请求工具
│ │ └── helper.ts # 通用辅助函数
│ ├── views/ # 页面组件目录
│ │ ├── Dashboard.vue # 仪表盘页面
│ │ └── UserManage.vue # 用户管理页面
│ ├── hooks/ # 自定义 Vue 钩子函数
│ │ └── useTable.ts # 表格操作的自定义钩子
│ ├── types/ # TypeScript 类型定义
│ │ └── global.d.ts # 全局类型定义
│ ├── mock/ # Mock 数据目录
│ │ ├── index.ts # Mock 数据入口文件
│ │ └── modules/ # 按模块划分的 Mock 数据
│ ├── locales/ # 国际化语言包目录
│ │ ├── en-US.ts # 英文语言包
│ │ └── zh-CN.ts # 中文语言包
│ ├── styles/ # 全局样式文件目录
│ │ └── index.less # 全局样式文件
│ ├── theme/ # 主题配置目录
│ │ └── index.ts # 主题配置文件
│ ├── config/ # 项目配置目录
│ │ └── index.ts # 项目全局配置文件
│ ├── entry/ # 项目入口文件
│ │ └── main.ts # Vue 应用的主入口文件
│ └── permission/ # 权限管理目录
│ └── index.ts # 权限管理入口文件
├── public/ # 公共静态资源目录
│ ├── favicon.ico # 网站图标
│ └── manifest.json # 应用配置文件
├── tests/ # 测试代码目录
├── docs/ # 项目文档目录
├── dist/ # 构建输出目录
├── node_modules/ # 项目依赖目录
├── package.json # 项目依赖和脚本配置
├── vite.config.ts # Vite 配置文件
├── .env.development # 开发环境配置文件
├── .env.production # 生产环境配置文件
├── .eslintrc.js # ESLint 配置文件
├── .prettierrc.js # Prettier 配置文件
└── .browserslistrc # 浏览器兼容性配置文件
在 Vben Admin 中,如果需要在自定义组件中连接多个 API,建议将这些 API 的调用逻辑集中管理,而不是分散在组件内部。这样可以提高代码的可维护性和可复用性。以下是几种常见的管理方式:
src/api
目录中集中管理 API将所有相关的 API 请求封装到 src/api
目录下的模块文件中。
假设你有一个自定义组件 CustomComponent.vue
,需要调用多个 API,比如获取用户信息、获取订单列表和更新订单状态。
a.在 src/api
目录中创建模块文件
src/api/
├── user.ts # 用户相关 API
├── order.ts # 订单相关 API
└── ...
b.封装 API 请求
// src/api/user.ts
import { defHttp } from '/@/utils/http/axios';
export function getUserInfo() {
return defHttp.request({
url: '/user/info',
method: 'GET',
});
}
// src/api/order.ts
import { defHttp } from '/@/utils/http/axios';
export function getOrderList() {
return defHttp.request({
url: '/order/list',
method: 'GET',
});
}
export function updateOrderStatus(orderId: string, status: string) {
return defHttp.request({
url: `/order/${orderId}/status`,
method: 'PUT',
data: { status },
});
}
c.在组件中使用
User Info
{{ userInfo.name }}
Orders
- {{ order.name }}
如果组件中需要调用多个 API,并且这些 API 调用之间存在逻辑关系,可以使用 Vue 的 Composition API 来组合这些逻辑。
User Info
{{ userInfo.name }}
Orders
- {{ order.name }}
如果多个组件需要共享相同的 API 逻辑,可以将这些逻辑封装到自定义 Hook 中。
a.创建自定义 Hook
// src/hooks/useUserAndOrders.ts
import { ref } from 'vue';
import { getUserInfo } from '/@/api/user';
import { getOrderList } from '/@/api/order';
export function useUserAndOrders() {
const userInfo = ref(null);
const orders = ref([]);
const fetchUserInfo = async () => {
userInfo.value = await getUserInfo();
};
const fetchOrders = async () => {
orders.value = await getOrderList();
};
const loadAll = async () => {
await fetchUserInfo();
await fetchOrders();
};
return { userInfo, orders, loadAll };
}
b.在组件中使用
User Info
{{ userInfo.name }}
Orders
- {{ order.name }}
如果 API 调用的结果需要在多个组件之间共享,可以使用 Vuex 或 Pinia 来管理这些状态。
a.创建 Pinia Store
// src/store/modules/user.ts
import { defineStore } from 'pinia';
import { getUserInfo } from '/@/api/user';
export const useUserStore = defineStore('user', {
state: () => ({
userInfo: null,
}),
actions: {
async fetchUserInfo() {
this.userInfo = await getUserInfo();
},
},
});
// src/store/modules/orders.ts
import { defineStore } from 'pinia';
import { getOrderList } from '/@/api/order';
export const useOrdersStore = defineStore('orders', {
state: () => ({
orders: [],
}),
actions: {
async fetchOrders() {
this.orders = await getOrderList();
},
},
});
b.在组件中使用
User Info
{{ userInfo.name }}
Orders
- {{ order.name }}
注:
package.json
文件中定义路径别名来简化模块的导入路径。