企业级中后台开发效率提升90%!Anno-Admin-Ant-Design-UI全攻略:从0到1搭建高可用管理系统

企业级中后台开发效率提升90%!Anno-Admin-Ant-Design-UI全攻略:从0到1搭建高可用管理系统

【免费下载链接】anno-admin-ant-design-ui Anno Admin Ant Design UI 与 AnnoAdmin 相配套使用的前端 UI 框架. 【免费下载链接】anno-admin-ant-design-ui 项目地址: https://gitcode.com/Cmeet/anno-admin-ant-design-ui

为什么选择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开源许可证,完全免费商用,是构建企业级中后台系统的理想选择。

mermaid

核心优势

Anno-Admin-Ant-Design-UI具有以下核心优势:

优势说明适用场景
开箱即用无需从零开始搭建项目架构,节省80%配置时间快速原型开发、紧急项目交付
丰富组件内置50+常用业务组件,覆盖90%中后台场景需求数据表格、表单处理、权限控制
灵活配置支持多维度自定义配置,满足不同企业风格需求品牌定制、主题切换、布局调整
权限管理完善的前后端权限控制方案,适配各种权限模型多角色系统、数据权限隔离
性能优化代码分割、懒加载等优化措施,提升系统响应速度大数据表格、复杂表单系统

快速开始

环境准备

在开始使用Anno-Admin-Ant-Design-UI之前,需要确保你的开发环境满足以下要求:

  • Node.js 14.0.0+
  • pnpm 6.0.0+
  • Git

安装步骤

  1. 克隆项目
git clone https://gitcode.com/Cmeet/anno-admin-ant-design-ui.git
cd anno-admin-ant-design-ui
  1. 安装依赖
# 全局安装pnpm(如已安装可跳过)
npm i -g pnpm

# 安装项目依赖
pnpm install
  1. 本地开发
pnpm dev
  1. 构建生产版本
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,
  },
};
布局类型

系统支持三种主要布局类型:

mermaid

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的实际应用。

功能需求

  • 用户列表展示(支持分页、搜索、排序)
  • 用户新增/编辑/删除功能
  • 用户角色分配
  • 密码重置功能

实现步骤

  1. 创建路由
// 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,
      },
    },
  ],
};
  1. 创建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 });
};
  1. 创建页面组件
<!-- 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>
  1. 创建表单模态框
<!-- 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>

性能优化与最佳实践

性能优化策略

  1. 路由懒加载
// 路由配置中使用懒加载
{
  path: 'list',
  name: 'UserList',
  component: () => import('@/views/system/user/index.vue'),
  meta: {
    title: '用户列表',
    keepAlive: true, // 需要缓存的页面
  },
}
  1. 组件按需加载
// 只导入需要的组件
import { BasicTable, TableAction } from '@/components/Table';
  1. 大数据处理
<!-- 使用虚拟滚动处理大数据表格 -->
<BasicTable
  @register="registerTable"
  :scroll="{ x: 1200, y: 600 }"
  :row-key="(record) => record.id"
  :virtual-scroll="true"
/>

最佳实践

  1. 代码规范
  • 使用TypeScript强类型检查
  • 遵循ESLint规范
  • 组件命名采用PascalCase格式
  • 工具函数命名采用camelCase格式
  1. 项目结构
  • 按业务模块组织代码
  • 公共组件放在components目录
  • 页面组件放在views目录
  • API请求按模块组织
  1. 状态管理
  • 全局状态使用Pinia管理
  • 页面状态使用组件内部状态
  • 复杂状态拆分管理

总结与展望

通过本文的介绍,我们了解了Anno-Admin-Ant-Design-UI的核心功能和使用方法,从环境搭建到实际项目开发,全面展示了这款企业级中后台解决方案的强大能力。

Anno-Admin-Ant-Design-UI作为一款优秀的开源项目,不仅提供了丰富的组件和功能,还具有高度的可定制性和扩展性,能够满足各种复杂的业务需求。无论是快速原型开发还是大型企业应用,都能显著提高开发效率,降低维护成本。

未来,Anno-Admin-Ant-Design-UI将继续优化性能,增加更多实用功能,为开发者提供更好的开发体验。我们欢迎社区贡献者参与项目开发,共同打造更优秀的中后台解决方案。

参与贡献

Anno-Admin-Ant-Design-UI是一个开源项目,欢迎开发者参与贡献:

  1. 进群讨论

    • 在群里抛出您遇到的问题,或许已经有人解决了您的问题。
  2. 提Issue

    • 如果Issue列表中已有相关问题,可直接认领该Issue。
    • 若无,请新建一个Issue描述问题。
  3. Fork仓库

    • 复制本项目的仓库到您的账号下。
  4. 新建分支

    • 新特性分支命名格式:feat/#{issue-id}
    • Bug修复分支命名格式:fix/#{issue-id}
  5. 本地自测

    • 确保通过所有现有单元测试。
    • 为您解决的问题新增单元测试。
  6. 提交代码

    • 将修改推送到您的分支。
  7. 创建Pull Request

    • 向本项目发起合并请求。
  8. PR审核

    • 项目维护者会验证和测试您的PR,通过后将合并至dev分支。

被采纳的PR贡献者将列入项目的贡献者列表!

许可证

Anno-Admin-Ant-Design-UI使用MIT许可证。详情请参阅LICENSE文件。


如果您觉得本文对您有帮助,请点赞、收藏、关注三连,您的支持是我们持续更新的动力!下期我们将带来Anno-Admin-Ant-Design-UI的高级主题定制与国际化方案,敬请期待!

【免费下载链接】anno-admin-ant-design-ui Anno Admin Ant Design UI 与 AnnoAdmin 相配套使用的前端 UI 框架. 【免费下载链接】anno-admin-ant-design-ui 项目地址: https://gitcode.com/Cmeet/anno-admin-ant-design-ui

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值