企业级中后台开发效率提升90%!Anno-Admin-Ant-Design-UI全攻略:从0到1搭建高可用管理系统
为什么选择Anno-Admin-Ant-Design-UI?
你是否还在为中后台系统开发效率低下而烦恼?还在重复造轮子浪费宝贵时间?Anno-Admin-Ant-Design-UI作为一款企业级中后台前端解决方案,基于Vue3和Ant Design Vue构建,为开发者提供了一站式开发体验。本文将带你深入了解这款强大的UI框架,从环境搭建到核心功能实现,让你在72小时内从零构建一个专业的管理系统界面。
读完本文你将获得:
- 掌握企业级中后台项目的完整搭建流程
- 学会使用Anno-Admin-Ant-Design-UI的核心组件与特性
- 了解高级功能如权限管理、动态表单的实现方式
- 获取项目最佳实践与性能优化技巧
项目概述
项目简介
Anno Admin Ant Design UI是与AnnoAdmin配套使用的前端UI框架,基于Vue vben admin二次开发,融合了Ant Design Vue的设计理念与最佳实践。该项目采用MIT开源许可证,完全免费商用,是构建企业级中后台系统的理想选择。
核心优势
Anno-Admin-Ant-Design-UI具有以下核心优势:
| 优势 | 说明 | 适用场景 |
|---|---|---|
| 开箱即用 | 无需从零开始搭建项目架构,节省80%配置时间 | 快速原型开发、紧急项目交付 |
| 丰富组件 | 内置50+常用业务组件,覆盖90%中后台场景需求 | 数据表格、表单处理、权限控制 |
| 灵活配置 | 支持多维度自定义配置,满足不同企业风格需求 | 品牌定制、主题切换、布局调整 |
| 权限管理 | 完善的前后端权限控制方案,适配各种权限模型 | 多角色系统、数据权限隔离 |
| 性能优化 | 代码分割、懒加载等优化措施,提升系统响应速度 | 大数据表格、复杂表单系统 |
快速开始
环境准备
在开始使用Anno-Admin-Ant-Design-UI之前,需要确保你的开发环境满足以下要求:
- Node.js 14.0.0+
- pnpm 6.0.0+
- Git
安装步骤
- 克隆项目
git clone https://gitcode.com/Cmeet/anno-admin-ant-design-ui.git
cd anno-admin-ant-design-ui
- 安装依赖
# 全局安装pnpm(如已安装可跳过)
npm i -g pnpm
# 安装项目依赖
pnpm install
- 本地开发
pnpm dev
- 构建生产版本
pnpm build
项目结构
项目采用模块化设计,主要目录结构如下:
anno-admin-ant-design-ui/
├── src/
│ ├── components/ # 业务组件
│ ├── layouts/ # 布局组件
│ ├── router/ # 路由配置
│ ├── store/ # 状态管理
│ ├── utils/ # 工具函数
│ ├── views/ # 页面视图
│ └── App.vue # 应用入口
├── mock/ # 模拟数据
├── public/ # 静态资源
└── package.json # 项目配置
核心功能详解
1. 布局系统
Anno-Admin-Ant-Design-UI提供了灵活的布局系统,支持多种布局模式切换,满足不同业务场景需求。
布局配置
通过修改src/settings/projectSetting.ts文件,可以自定义系统布局:
// src/settings/projectSetting.ts
const setting: ProjectConfig = {
// 内容模式:full(全屏)、fixed(固定宽度)
contentMode: ContentEnum.FULL,
// 是否显示logo
showLogo: true,
// 是否显示页脚
showFooter: true,
// 头部配置
headerSetting: {
// 头部背景颜色
bgColor: HEADER_PRESET_BG_COLOR_LIST[0],
// 是否固定顶部
fixed: true,
// 是否显示头部
show: true,
// 主题
theme: ThemeEnum.LIGHT,
},
// 菜单配置
menuSetting: {
// 侧边栏背景颜色
bgColor: SIDE_BAR_BG_COLOR_LIST[3],
// 是否固定左侧菜单
fixed: true,
// 菜单宽度
menuWidth: 210,
// 菜单模式:inline(内联)、horizontal(水平)
mode: MenuModeEnum.INLINE,
},
// 多标签页配置
multiTabsSetting: {
// 是否显示多标签页
show: true,
// 是否可拖拽排序标签
canDrag: true,
},
};
布局类型
系统支持三种主要布局类型:
2. 路由管理
路由系统是中后台应用的核心部分,Anno-Admin-Ant-Design-UI提供了功能完善的路由解决方案。
路由配置
路由配置文件位于src/router/routes/basic.ts,基本路由配置示例:
// src/router/routes/basic.ts
export const ERROR_LOG_ROUTE: AppRouteRecordRaw = {
path: '/error-log',
name: 'ErrorLog',
component: LAYOUT,
redirect: '/error-log/list',
meta: {
title: 'ErrorLog',
hideBreadcrumb: true,
hideChildrenInMenu: true,
},
children: [
{
path: 'list',
name: 'ErrorLogList',
component: () => import('@/views/sys/error-log/index.vue'),
meta: {
title: t('routes.basic.errorLogList'),
hideBreadcrumb: true,
currentActiveMenu: '/error-log',
},
},
],
};
路由守卫
系统内置了多种路由守卫,用于处理权限验证、页面加载状态等:
- 权限守卫:控制页面访问权限
- 进度条守卫:显示页面加载进度
- 标签页守卫:管理多标签页状态
3. 表格组件
表格是中后台系统最常用的组件之一,Anno-Admin-Ant-Design-UI提供了功能强大的表格组件,支持排序、筛选、分页等常见需求。
基础用法
<template>
<BasicTable @register="registerTable" />
</template>
<script setup lang="ts">
import { BasicTable, useTable } from '@/components/Table';
import { getTableData } from '@/api/demo/table';
const columns = [
{
title: 'ID',
dataIndex: 'id',
width: 50,
},
{
title: '名称',
dataIndex: 'name',
width: 120,
},
{
title: '状态',
dataIndex: 'status',
width: 80,
customRender: ({ record }) => {
return record.status === 1 ? '启用' : '禁用';
},
},
];
const { registerTable } = useTable({
title: '基础表格示例',
api: getTableData,
columns,
pagination: {
pageSize: 10,
},
});
</script>
高级功能
表格组件支持多种高级功能,如:
- 自定义单元格渲染
- 行选择与批量操作
- 单元格编辑
- 树形表格
- 虚拟滚动(处理大数据量)
4. 表单组件
表单是数据收集与提交的关键组件,Anno-Admin-Ant-Design-UI提供了功能丰富的表单解决方案。
动态表单
<template>
<BasicForm @register="registerForm" @submit="handleSubmit" />
</template>
<script setup lang="ts">
import { BasicForm, useForm } from '@/components/Form';
const schemas = [
{
field: 'name',
label: '名称',
component: 'Input',
required: true,
rules: [{ required: true, message: '请输入名称' }],
},
{
field: 'status',
label: '状态',
component: 'Select',
required: true,
componentProps: {
options: [
{ label: '启用', value: 1 },
{ label: '禁用', value: 0 },
],
},
},
{
field: 'date',
label: '日期',
component: 'DatePicker',
required: true,
},
];
const { registerForm, validateFields } = useForm({
schemas,
labelWidth: 100,
});
const handleSubmit = async () => {
const values = await validateFields();
// 提交表单数据
console.log(values);
};
</script>
表单属性配置
表单组件提供了丰富的配置选项,通过src/components/Form/src/props.ts可以查看完整配置:
// 表单基础属性
const basicProps = {
// 表单模型
model: {
type: Object as PropType<Recordable>,
default: () => ({}),
},
// 标签宽度
labelWidth: {
type: [Number, String] as PropType<number | string>,
default: 0,
},
// 表单配置规则
schemas: {
type: Array as PropType<FormSchema[]>,
default: () => [],
},
// 布局方式:horizontal(水平)、vertical(垂直)、inline(内联)
layout: propTypes.oneOf(['horizontal', 'vertical', 'inline']).def('horizontal'),
// 是否显示操作按钮组
showActionButtonGroup: propTypes.bool.def(true),
// 显示重置按钮
showResetButton: propTypes.bool.def(true),
// 显示提交按钮
showSubmitButton: propTypes.bool.def(true),
};
5. 权限管理
权限管理是企业级应用的核心需求,Anno-Admin-Ant-Design-UI提供了完善的权限控制方案。
权限模式
系统支持多种权限模式,可在src/settings/projectSetting.ts中配置:
// src/settings/projectSetting.ts
const setting: ProjectConfig = {
// 权限模式:BACK(后端控制)、ROUTE_MAPPING(路由映射)、ROLE(角色控制)
permissionMode: PermissionModeEnum.BACK,
// 权限缓存类型:SESSION(会话存储)、LOCAL(本地存储)
permissionCacheType: CacheTypeEnum.LOCAL,
// 会话超时处理:ROUTE_JUMP(路由跳转)、PAGE_COVERAGE(页面覆盖)
sessionTimeoutProcessing: SessionTimeoutProcessingEnum.ROUTE_JUMP,
};
权限控制示例
<template>
<!-- 按钮权限控制 -->
<a-button v-if="hasPermission(['btn.add'])" @click="handleAdd">新增</a-button>
<!-- 菜单权限由路由配置控制 -->
</template>
<script setup lang="ts">
import { usePermission } from '@/hooks/web/usePermission';
const { hasPermission } = usePermission();
const handleAdd = () => {
// 新增操作
};
</script>
项目实战:用户管理模块
下面我们通过实现一个用户管理模块,展示Anno-Admin-Ant-Design-UI的实际应用。
功能需求
- 用户列表展示(支持分页、搜索、排序)
- 用户新增/编辑/删除功能
- 用户角色分配
- 密码重置功能
实现步骤
- 创建路由
// src/router/routes/modules/system.ts
export const userRoute: AppRouteRecordRaw = {
path: 'user',
name: 'User',
component: LAYOUT,
redirect: '/system/user/list',
meta: {
title: '用户管理',
icon: 'ion:people-outline',
orderNo: 10,
},
children: [
{
path: 'list',
name: 'UserList',
component: () => import('@/views/system/user/index.vue'),
meta: {
title: '用户列表',
keepAlive: true,
},
},
],
};
- 创建API服务
// src/api/system/user.ts
import { defHttp } from '@/utils/http/axios';
enum Api {
UserList = '/system/user/list',
UserAdd = '/system/user/add',
UserEdit = '/system/user/edit',
UserDelete = '/system/user/delete',
ResetPwd = '/system/user/resetPwd',
}
// 获取用户列表
export const getUserList = (params) => {
return defHttp.get({ url: Api.UserList, params });
};
// 新增用户
export const addUser = (data) => {
return defHttp.post({ url: Api.UserAdd, data });
};
// 编辑用户
export const editUser = (data) => {
return defHttp.put({ url: Api.UserEdit, data });
};
// 删除用户
export const deleteUser = (id) => {
return defHttp.delete({ url: `${Api.UserDelete}/${id}` });
};
// 重置密码
export const resetPassword = (data) => {
return defHttp.post({ url: Api.ResetPwd, data });
};
- 创建页面组件
<!-- src/views/system/user/index.vue -->
<template>
<PageWrapper title="用户管理" content="用户信息管理,包括新增、编辑、删除等操作">
<BasicTable @register="registerTable" class="mb-4">
<template #toolbar>
<a-button type="primary" @click="handleAdd">
<Icon icon="ion:add-outline" class="mr-2" />
新增用户
</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
{
label: '编辑',
icon: 'edit',
onClick: handleEdit.bind(null, record),
},
{
label: '重置密码',
icon: 'key',
onClick: handleResetPwd.bind(null, record),
},
{
label: '删除',
icon: 'delete',
color: 'error',
popConfirm: {
title: '确定删除该用户吗?',
confirm: handleDelete.bind(null, record),
},
},
]"
/>
</template>
</BasicTable>
<UserModal @register="registerUserModal" @success="handleSuccess" />
<AnnoResetPwdModal @register="registerResetPwdModal" @success="handleSuccess" />
</PageWrapper>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { PageWrapper } from '@/components/Page';
import { BasicTable, TableAction } from '@/components/Table';
import { useTable } from '@/hooks/web/useTable';
import { getUserList, deleteUser } from '@/api/system/user';
import UserModal from './components/UserModal.vue';
import AnnoResetPwdModal from '@/components/AnnoResetPwd/AnnoResetPwdModal.vue';
import { useModal } from '@/hooks/web/useModal';
import { Icon } from '@/components/Icon';
// 表格列定义
const columns = [
{
title: '用户名',
dataIndex: 'username',
width: 120,
search: true,
},
{
title: '姓名',
dataIndex: 'realName',
width: 100,
search: true,
},
{
title: '邮箱',
dataIndex: 'email',
width: 180,
},
{
title: '手机',
dataIndex: 'phone',
width: 120,
},
{
title: '状态',
dataIndex: 'status',
width: 80,
customRender: ({ record }) => {
return record.status === 1 ? '启用' : '禁用';
},
filters: [
{ text: '启用', value: 1 },
{ text: '禁用', value: 0 },
],
},
{
title: '创建时间',
dataIndex: 'createTime',
width: 160,
sorter: true,
},
{
title: '操作',
dataIndex: 'action',
width: 180,
slots: { customRender: 'action' },
},
];
// 表格配置
const { registerTable } = useTable({
title: '用户列表',
api: getUserList,
columns,
rowKey: 'id',
pagination: {
pageSize: 10,
},
});
// 模态框配置
const [registerUserModal, { openModal: openUserModal }] = useModal();
const [registerResetPwdModal, { openModal: openResetPwdModal }] = useModal();
// 新增用户
const handleAdd = () => {
openUserModal(true, { isUpdate: false });
};
// 编辑用户
const handleEdit = (record) => {
openUserModal(true, { record, isUpdate: true });
};
// 重置密码
const handleResetPwd = (record) => {
openResetPwdModal(true, { record });
};
// 删除用户
const handleDelete = async (record) => {
await deleteUser(record.id);
// 刷新表格
emit('refreshTable');
};
// 操作成功处理
const handleSuccess = () => {
// 刷新表格
emit('refreshTable');
};
</script>
- 创建表单模态框
<!-- src/views/system/user/components/UserModal.vue -->
<template>
<BasicModal
v-bind="$attrs"
:title="isUpdate ? '编辑用户' : '新增用户'"
@register="registerModal"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicModal>
</template>
<script setup lang="ts">
import { ref, unref } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicForm, useForm } from '@/components/Form';
import { addUser, editUser } from '@/api/system/user';
import { getRoleList } from '@/api/system/role';
const isUpdate = ref(false);
const record = ref({});
// 角色列表
const roleList = ref([]);
// 获取角色列表
const getRoleOptions = async () => {
const res = await getRoleList({ pageSize: 100 });
roleList.value = res.list.map(role => ({
label: role.roleName,
value: role.roleId,
}));
};
// 表单配置
const schemas = [
{
field: 'username',
label: '用户名',
component: 'Input',
required: true,
ifShow: ({ values }) => !unref(isUpdate) || !values.id,
rules: [
{ required: true, message: '请输入用户名' },
{ min: 3, max: 20, message: '用户名长度在3-20之间' },
],
},
{
field: 'realName',
label: '姓名',
component: 'Input',
required: true,
rules: [{ required: true, message: '请输入姓名' }],
},
{
field: 'password',
label: '密码',
component: 'InputPassword',
required: () => !unref(isUpdate),
ifShow: () => !unref(isUpdate) || (unref(isUpdate) && !unref(record).id),
rules: [
{ required: true, message: '请输入密码' },
{ min: 6, max: 20, message: '密码长度在6-20之间' },
],
},
{
field: 'email',
label: '邮箱',
component: 'Input',
required: true,
rules: [
{ required: true, message: '请输入邮箱' },
{ type: 'email', message: '请输入正确的邮箱格式' },
],
},
{
field: 'phone',
label: '手机',
component: 'Input',
required: true,
rules: [
{ required: true, message: '请输入手机号' },
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号' },
],
},
{
field: 'roleIds',
label: '角色',
component: 'Select',
required: true,
componentProps: {
mode: 'multiple',
options: roleList.value,
},
},
{
field: 'status',
label: '状态',
component: 'RadioGroup',
required: true,
defaultValue: 1,
componentProps: {
options: [
{ label: '启用', value: 1 },
{ label: '禁用', value: 0 },
],
},
},
];
// 表单配置
const [registerForm, { setFieldsValue, validateFields }] = useForm({
schemas,
labelWidth: 100,
});
// 模态框配置
const [registerModal, { setModalProps }] = useModalInner(async (data) => {
isUpdate.value = !!data.isUpdate;
record.value = data.record || {};
// 获取角色列表
await getRoleOptions();
// 编辑模式回显数据
if (unref(isUpdate)) {
setFieldsValue({
...unref(record),
roleIds: unref(record).roles?.map(role => role.roleId) || [],
});
} else {
// 新增模式重置表单
setFieldsValue({ status: 1 });
}
});
// 提交表单
const handleSubmit = async () => {
const values = await validateFields();
if (unref(isUpdate)) {
await editUser({ ...values, id: unref(record).id });
} else {
await addUser(values);
}
// 关闭模态框并触发成功事件
emit('success');
closeModal();
};
</script>
性能优化与最佳实践
性能优化策略
- 路由懒加载
// 路由配置中使用懒加载
{
path: 'list',
name: 'UserList',
component: () => import('@/views/system/user/index.vue'),
meta: {
title: '用户列表',
keepAlive: true, // 需要缓存的页面
},
}
- 组件按需加载
// 只导入需要的组件
import { BasicTable, TableAction } from '@/components/Table';
- 大数据处理
<!-- 使用虚拟滚动处理大数据表格 -->
<BasicTable
@register="registerTable"
:scroll="{ x: 1200, y: 600 }"
:row-key="(record) => record.id"
:virtual-scroll="true"
/>
最佳实践
- 代码规范
- 使用TypeScript强类型检查
- 遵循ESLint规范
- 组件命名采用PascalCase格式
- 工具函数命名采用camelCase格式
- 项目结构
- 按业务模块组织代码
- 公共组件放在components目录
- 页面组件放在views目录
- API请求按模块组织
- 状态管理
- 全局状态使用Pinia管理
- 页面状态使用组件内部状态
- 复杂状态拆分管理
总结与展望
通过本文的介绍,我们了解了Anno-Admin-Ant-Design-UI的核心功能和使用方法,从环境搭建到实际项目开发,全面展示了这款企业级中后台解决方案的强大能力。
Anno-Admin-Ant-Design-UI作为一款优秀的开源项目,不仅提供了丰富的组件和功能,还具有高度的可定制性和扩展性,能够满足各种复杂的业务需求。无论是快速原型开发还是大型企业应用,都能显著提高开发效率,降低维护成本。
未来,Anno-Admin-Ant-Design-UI将继续优化性能,增加更多实用功能,为开发者提供更好的开发体验。我们欢迎社区贡献者参与项目开发,共同打造更优秀的中后台解决方案。
参与贡献
Anno-Admin-Ant-Design-UI是一个开源项目,欢迎开发者参与贡献:
-
进群讨论
- 在群里抛出您遇到的问题,或许已经有人解决了您的问题。
-
提Issue
- 如果Issue列表中已有相关问题,可直接认领该Issue。
- 若无,请新建一个Issue描述问题。
-
Fork仓库
- 复制本项目的仓库到您的账号下。
-
新建分支
- 新特性分支命名格式:
feat/#{issue-id} - Bug修复分支命名格式:
fix/#{issue-id}
- 新特性分支命名格式:
-
本地自测
- 确保通过所有现有单元测试。
- 为您解决的问题新增单元测试。
-
提交代码
- 将修改推送到您的分支。
-
创建Pull Request
- 向本项目发起合并请求。
-
PR审核
- 项目维护者会验证和测试您的PR,通过后将合并至dev分支。
被采纳的PR贡献者将列入项目的贡献者列表!
许可证
Anno-Admin-Ant-Design-UI使用MIT许可证。详情请参阅LICENSE文件。
如果您觉得本文对您有帮助,请点赞、收藏、关注三连,您的支持是我们持续更新的动力!下期我们将带来Anno-Admin-Ant-Design-UI的高级主题定制与国际化方案,敬请期待!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



