vue-pure-admin:开源中后台管理系统模板,Vue3+Element-Plus打造开箱即用解决方案

vue-pure-admin:开源中后台管理系统模板,Vue3+Element-Plus打造开箱即用解决方案

【免费下载链接】vue-pure-admin 【免费下载链接】vue-pure-admin 项目地址: https://gitcode.com/gh_mirrors/vue/vue-pure-admin

前言:中后台开发的痛点与解决方案

你是否还在为中后台系统搭建重复编写基础架构?是否因技术选型混乱导致后期维护困难?是否面临UI组件库与业务逻辑整合的繁琐工作?vue-pure-admin作为一款开源免费的中后台管理系统模板,基于Vue3、Element-Plus和TypeScript技术栈,提供了开箱即用的解决方案,帮助开发者快速构建企业级管理系统。

读完本文后,你将获得:

  • 掌握vue-pure-admin的核心架构与技术亮点
  • 学会如何快速初始化项目并进行定制开发
  • 了解系统内置功能模块的使用方法
  • 掌握高级特性如动态路由、权限管理的实现原理
  • 获取性能优化与生产部署的最佳实践

一、技术架构与核心特性

1.1 技术栈选型

vue-pure-admin采用现代化前端技术栈,主要包括:

技术版本说明
Vue^3.4.27前端框架
TypeScript^5.4.5类型系统
Vite^5.2.12构建工具
Element-Plus^2.7.3UI组件库
Pinia^2.1.7状态管理
Tailwindcss^3.4.3CSS框架
Vue-Router^4.3.2路由管理

1.2 系统架构设计

系统采用分层架构设计,确保代码的可维护性和可扩展性:

mermaid

1.3 核心特性概览

vue-pure-admin提供了丰富的企业级特性:

  • 模块化设计:功能按业务领域划分为独立模块,便于团队协作开发
  • 响应式布局:自适应不同屏幕尺寸,支持PC端与移动端
  • 主题定制:内置光明/暗黑主题,支持自定义主题颜色
  • 国际化支持:多语言切换,满足全球化业务需求
  • 权限管理:基于RBAC模型的细粒度权限控制
  • 动态路由:根据用户权限动态生成路由表
  • 组件库:丰富的业务组件,如表格、表单、图表等
  • 性能优化:代码分割、懒加载、缓存策略等优化手段

二、快速上手:环境搭建与项目初始化

2.1 环境准备

在开始之前,请确保你的开发环境满足以下要求:

  • Node.js: ^18.18.0 || ^20.9.0 || >=21.1.0
  • pnpm: >=9

2.2 项目克隆与安装

推荐使用官方提供的脚手架工具@pureadmin/cli快速创建项目:

# 全局安装脚手架
npm install -g @pureadmin/cli

# 交互式选择模板并创建项目
pure create

或者直接从Git仓库克隆:

# 克隆项目
git clone https://gitcode.com/gh_mirrors/vue/vue-pure-admin.git

# 进入项目目录
cd vue-pure-admin

# 安装依赖
pnpm install

2.3 项目启动与预览

# 开发环境启动
pnpm dev

# 构建生产版本
pnpm build

# 预览构建结果
pnpm preview

启动成功后,访问 http://localhost:9527 即可看到系统登录界面。

2.4 项目目录结构

src/
├── api/           # API请求
├── assets/        # 静态资源
├── components/    # 公共组件
├── config/        # 配置文件
├── directives/    # 自定义指令
├── layout/        # 布局组件
├── plugins/       # 插件配置
├── router/        # 路由配置
├── store/         # 状态管理
├── style/         # 全局样式
├── utils/         # 工具函数
└── views/         # 页面组件

三、核心功能模块详解

3.1 路由管理

系统采用Vue-Router进行路由管理,支持动态路由生成。路由配置位于src/router目录下:

// src/router/index.ts 核心代码
export const router: Router = createRouter({
  history: getHistoryMode(import.meta.env.VITE_ROUTER_HISTORY),
  routes: constantRoutes.concat(...(remainingRouter as any)),
  strict: true,
  scrollBehavior(to, from, savedPosition) {
    return new Promise(resolve => {
      if (savedPosition) {
        return savedPosition;
      } else {
        if (from.meta.saveSrollTop) {
          const top: number =
            document.documentElement.scrollTop || document.body.scrollTop;
          resolve({ left: 0, top });
        }
      }
    });
  }
});

路由守卫实现了权限控制、进度条显示等功能:

// 路由前置守卫
router.beforeEach((to: ToRouteType, _from, next) => {
  if (to.meta?.keepAlive) {
    handleAliveRoute(to, "add");
  }
  
  NProgress.start();
  
  // 权限判断逻辑
  if (Cookies.get(multipleTabsKey) && userInfo) {
    // 有权限,正常跳转
    toCorrectRoute();
  } else {
    // 无权限,跳转登录页
    whiteList.includes(to.fullPath) ? next() : next({ path: "/login" });
  }
});

3.2 状态管理

系统使用Pinia进行状态管理,按功能模块划分不同的store:

// src/store/modules/app.ts 示例
export const useAppStore = defineStore({
  id: "pure-app",
  state: (): appType => ({
    sidebar: {
      opened: storageLocal().getItem<StorageConfigs>(
        `${responsiveStorageNameSpace()}layout`
      )?.sidebarStatus ?? getConfig().SidebarStatus,
      withoutAnimation: false,
      isClickCollapse: false
    },
    layout: storageLocal().getItem<StorageConfigs>(
      `${responsiveStorageNameSpace()}layout`
    )?.layout ?? getConfig().Layout,
    device: deviceDetection() ? "mobile" : "desktop",
    viewportSize: {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight
    }
  }),
  getters: {
    getSidebarStatus(state) {
      return state.sidebar.opened;
    },
    getDevice(state) {
      return state.device;
    }
  },
  actions: {
    TOGGLE_SIDEBAR(opened?: boolean, resize?: string) {
      // 实现侧边栏展开/折叠逻辑
    },
    toggleDevice(device: string) {
      this.device = device;
    }
  }
});

3.3 权限控制

系统基于RBAC(Role-Based Access Control)模型实现权限控制,主要通过以下方式:

  1. 路由权限控制:在路由元信息中配置角色权限
// 路由配置示例
{
  path: '/system',
  name: 'System',
  component: Layout,
  meta: {
    title: '系统管理',
    icon: 'system',
    roles: ['admin', 'system'], // 该路由需要的角色
    alwaysShow: true
  },
  children: [
    // 子路由...
  ]
}
  1. 指令权限控制:通过自定义指令控制按钮等元素的显示
// src/directives/auth/index.ts
import type { App, Directive } from "vue";
import { usePermissionStoreHook } from "@/store/modules/permission";

function isAuth(el: Element, binding: any) {
  const { value } = binding;
  const permissionStore = usePermissionStoreHook();
  const roles = permissionStore.userRoles;

  if (Array.isArray(value) && value.length > 0) {
    const hasPermission = roles.some(role => {
      return value.includes(role);
    });

    if (!hasPermission) {
      el.parentNode?.removeChild(el);
    }
  } else {
    throw new Error("need roles! Like v-auth=\"['admin','editor']\"");
  }
}

const authDirective: Directive = {
  mounted(el, binding) {
    isAuth(el, binding);
  },
  updated(el, binding) {
    isAuth(el, binding);
  }
};

export function setupPermissionDirective(app: App) {
  app.directive("auth", authDirective);
}

在模板中使用:

<el-button v-auth="['admin']" type="primary">仅管理员可见</el-button>

3.4 UI组件库

系统使用Element-Plus作为基础UI组件库,并按需引入以减小打包体积:

// src/plugins/elementPlus.ts
import type { App, Component } from "vue";
import {
  ElButton,
  ElTable,
  ElInput,
  // 其他组件...
  ElLoading,
  ElMessage
} from "element-plus";

const components = [
  ElButton,
  ElTable,
  ElInput
  // 其他组件...
];

const plugins = [
  ElLoading,
  ElMessage
];

export function useElementPlus(app: App) {
  // 全局注册组件
  components.forEach((component: Component) => {
    app.component(component.name, component);
  });
  
  // 全局注册插件
  plugins.forEach(plugin => {
    app.use(plugin);
  });
}

3.5 网络请求

系统对Axios进行了封装,提供统一的请求处理:

// src/utils/http/index.ts
class PureHttp {
  constructor() {
    this.httpInterceptorsRequest();
    this.httpInterceptorsResponse();
  }

  /** 请求拦截 */
  private httpInterceptorsRequest(): void {
    PureHttp.axiosInstance.interceptors.request.use(
      async (config: PureHttpRequestConfig): Promise<any> => {
        // 开启进度条动画
        NProgress.start();
        
        // Token处理逻辑
        const data = getToken();
        if (data) {
          const now = new Date().getTime();
          const expired = parseInt(data.expires) - now <= 0;
          if (expired) {
            // Token过期刷新逻辑
            if (!PureHttp.isRefreshing) {
              PureHttp.isRefreshing = true;
              useUserStoreHook()
                .handRefreshToken({ refreshToken: data.refreshToken })
                .then(res => {
                  const token = res.data.accessToken;
                  config.headers["Authorization"] = formatToken(token);
                  PureHttp.requests.forEach(cb => cb(token));
                  PureHttp.requests = [];
                })
                .finally(() => {
                  PureHttp.isRefreshing = false;
                });
            }
            return PureHttp.retryOriginalRequest(config);
          } else {
            config.headers["Authorization"] = formatToken(data.accessToken);
          }
        }
        return config;
      },
      error => {
        return Promise.reject(error);
      }
    );
  }
  
  // 其他方法...
}

export const http = new PureHttp();

使用示例:

// src/api/user.ts
import { http } from "@/utils/http";
import type { LoginParams, LoginResult } from "./types";

export const loginApi = (params: LoginParams) => {
  return http.post<LoginResult>("/login", { params });
};

export const getUserInfo = () => {
  return http.get("/getUserInfo");
};

四、高级特性与自定义开发

4.1 主题定制

系统支持主题切换功能,包括内置的光明/暗黑主题,以及自定义主题颜色:

mermaid

实现原理:通过修改CSS变量实现主题切换,核心代码位于src/layout/hooks/useDataThemeChange.ts

4.2 多语言支持

系统内置国际化支持,使用vue-i18n实现多语言切换:

// src/plugins/i18n.ts
import { createI18n } from "vue-i18n";
import { storageLocal } from "@pureadmin/utils";
import { useAppStoreHook } from "@/store/modules/app";

// 导入语言包
import enUS from "@/locales/en.yaml";
import zhCN from "@/locales/zh-CN.yaml";

const appStore = useAppStoreHook();

const defaultLocale = storageLocal().getItem<LocaleType>("locale") || appStore.language;

export const i18n = createI18n({
  legacy: false,
  locale: defaultLocale,
  fallbackLocale: "zh-CN",
  messages: {
    "en-US": enUS,
    "zh-CN": zhCN
  },
  availableLocales: ["zh-CN", "en-US"],
  sync: true,
  silentTranslationWarn: true,
  missingWarn: false,
  silentFallbackWarn: true
});

export function useI18n() {
  return i18n;
}

export const t = i18n.global.t;

export const transformI18n = (key: string) => {
  return t(key);
};

4.3 自定义组件

系统提供了丰富的自定义组件,如可拖拽表格、图片裁剪、富文本编辑器等:

// src/components/ReCropper/index.ts
import type { App } from "vue";
import ReCropper from "./src/index.vue";

export const ReCropper = Object.assign(ReCropper, {
  install: (app: App) => {
    app.component(ReCropper.name, ReCropper);
  }
});

export default ReCropper;

使用示例:

<template>
  <re-cropper
    v-model="imageUrl"
    :aspect-ratio="1"
    :min-width="200"
    :min-height="200"
    @crop-success="handleCropSuccess"
  />
</template>

<script setup lang="ts">
import { ref } from "vue";
import ReCropper from "@/components/ReCropper";

const imageUrl = ref("");

const handleCropSuccess = (url: string) => {
  console.log("裁剪成功", url);
};
</script>

五、性能优化与部署

5.1 性能优化策略

5.1.1 代码分割与懒加载

系统使用Vue的异步组件和路由懒加载功能:

// 路由懒加载
const routes = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: () => import('@/views/dashboard/index.vue'),
    meta: { title: '仪表盘', icon: 'dashboard' }
  }
];
5.1.2 资源优化
  • 使用CDN加载第三方库
  • 图片懒加载与压缩
  • 开启Gzip/Brotli压缩
// vite.config.ts 中配置CDN
export default ({ mode }: ConfigEnv): UserConfigExport => {
  return {
    plugins: [
      // 其他插件...
      cdnImport({
        modules: [
          {
            name: "vue",
            var: "Vue",
            path: "https://cdn.jsdelivr.net/npm/vue@3.4.27/dist/vue.global.prod.js",
          },
          {
            name: "element-plus",
            var: "ElementPlus",
            path: "https://cdn.jsdelivr.net/npm/element-plus@2.7.3/dist/index.full.min.js",
            css: "https://cdn.jsdelivr.net/npm/element-plus@2.7.3/dist/index.css",
          },
        ],
      }),
      
      // 压缩配置
      compression({
        verbose: true,
        disable: false,
        threshold: 10240,
        algorithm: "gzip",
        ext: ".gz",
      }),
    ]
  };
};

5.2 生产环境部署

5.2.1 构建优化
// package.json 构建脚本
{
  "scripts": {
    "build": "rimraf dist && NODE_OPTIONS=--max-old-space-size=8192 vite build && generate-version-file",
    "build:staging": "rimraf dist && vite build --mode staging",
    "report": "rimraf dist && vite build --report"
  }
}
5.2.2 Docker部署

系统提供Docker支持,可快速部署到服务器:

# Dockerfile
FROM node:18-alpine as build

WORKDIR /app

COPY package*.json ./

RUN npm install pnpm -g && pnpm install

COPY . .

RUN pnpm build

FROM nginx:alpine

COPY --from=build /app/dist /usr/share/nginx/html

COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

构建和运行Docker镜像:

# 构建镜像
docker build -t vue-pure-admin .

# 运行容器
docker run -dp 8080:80 --name pure-admin vue-pure-admin

六、总结与展望

vue-pure-admin作为一款企业级中后台管理系统模板,提供了完整的解决方案,帮助开发者快速构建高质量的管理系统。其主要优势包括:

  1. 开箱即用:无需从零开始搭建项目架构,直接基于模板开发业务功能
  2. 技术领先:采用最新的前端技术栈,确保系统的先进性和可维护性
  3. 功能完善:内置丰富的企业级特性,满足各类管理系统需求
  4. 性能优化:经过优化的构建配置和代码分割策略,确保系统性能
  5. 易于扩展:模块化设计和插件化架构,便于功能扩展和定制

未来,vue-pure-admin将继续跟进前端技术发展趋势,不断优化用户体验,增加更多实用功能,如低代码表单构建、可视化大屏等,为开发者提供更强大的工具支持。

附录:常用开发资源

如果觉得本项目对你有帮助,请给我们一个Star支持!你的支持是我们持续开发的动力。

本文档内容基于vue-pure-admin v5.7.0版本编写,随着版本迭代可能会有变化,请以官方文档为准。

【免费下载链接】vue-pure-admin 【免费下载链接】vue-pure-admin 项目地址: https://gitcode.com/gh_mirrors/vue/vue-pure-admin

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

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

抵扣说明:

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

余额充值