Vue3 后台管理系统模板

Vue3 后台管理系统模板

gie仓库地址
一个基于 Vue3 + TypeScript + Element Plus 的后台管理系统模板,集成了动态路由和权限管理功能。

在这里插入图片描述

技术栈

  • Vue 3.2
  • TypeScript 4.5
  • Vue Router 4
  • Vuex 4
  • Element Plus 2.9
  • Axios
  • Less

功能特性

  • 🚀 基于 Vue3 最新技术栈开发
  • 📦 使用 TypeScript 进行开发,提供更好的类型检查和开发体验
  • 🔐 完整的权限管理解决方案,支持动态路由和按钮级权限控制
  • 🎨 使用 Element Plus 组件库,提供美观的 UI 界面
  • 📱 响应式设计,支持多种设备访问
  • 🔧 支持 PWA,可离线访问
  • 📝 集成 ESLint + Prettier,统一代码风格

项目结构

src/
├── assets/         # 静态资源
├── components/     # 公共组件
├── hooks/          # Vue3 组合式 API 钩子
├── network/        # 网络请求相关
├── plugins/        # 插件
├── router/         # 路由配置
├── store/          # Vuex 状态管理
├── utils/          # 工具函数
└── views/          # 页面组件

安装和使用

环境要求

  • Node.js >= 14.0.0
  • npm >= 6.0.0

安装依赖

npm install

开发环境运行

npm run serve

生产环境构建

npm run build

代码检查

npm run lint

权限管理

本项目实现了完整的权限管理功能,包括动态路由和按钮级权限控制。以下是详细的实现说明:

1. 权限管理架构

权限管理主要包含以下几个部分:

  • 路由权限控制
  • 菜单权限控制
  • 按钮级权限控制
  • 数据权限控制

2. 实现细节

2.1 路由权限控制
  1. 路由守卫实现

    • router/index.ts 中实现全局路由守卫
    • 检查用户是否登录(通过 token)
    • 动态添加路由配置
  2. 动态路由生成

    • 用户登录后获取权限菜单数据
    • 通过 addDynamicRoutes 工具函数动态生成路由
    • 支持路由懒加载,提高性能
  3. 路由配置示例

// 路由守卫实现
router.beforeEach((to, from, next) => {const token = localStorage.getItem('token');if (!token && to.meta.check) {next({ name: 'login' });return;}// 动态添加路由if (token && !layoutRoute.children.length) {const menus = JSON.parse(localStorage.getItem('menus') || '[]');addDynamicRoutes(router, menus);next({ ...to, replace: true });return;}next();
});
2.2 菜单权限控制
  1. 菜单数据结构

    • 支持多级菜单
    • 包含路径、名称、组件、元数据等信息
    • 支持菜单图标、权限标识等扩展属性
  2. 菜单渲染

    • 根据用户权限动态生成菜单
    • 支持菜单缓存,提高性能
    • 支持菜单排序和分组
2.3 按钮级权限控制
  1. 权限指令实现

    • 通过自定义指令 v-permission 控制按钮显示
    • 支持权限表达式,如:v-permission="['add', 'edit']"
    • 支持权限组合判断
  2. 使用示例

<template><el-button v-permission="['add']">添加</el-button><el-button v-permission="['edit']">编辑</el-button><el-button v-permission="['delete']">删除</el-button>
</template>
2.4 数据权限控制
  1. 数据过滤

    • 根据用户角色过滤数据
    • 支持数据范围控制
    • 支持字段级权限控制
  2. 实现方式

    • 在 API 请求中添加权限参数
    • 后端根据权限参数过滤数据
    • 前端处理权限数据展示

3. 权限管理流程

  1. 登录流程

    • 用户输入账号密码登录
    • 获取用户 token 和权限信息
    • 存储权限信息到本地存储
  2. 权限验证流程

    • 路由跳转时验证权限
    • 动态生成路由和菜单
    • 控制按钮和数据的访问权限
  3. 权限更新流程

    • 支持动态更新权限
    • 支持权限缓存清理
    • 支持权限实时生效

4. 安全考虑

  1. 前端安全

    • 敏感信息加密存储
    • 路由权限双重验证
    • XSS 防护
  2. 后端安全

    • 接口权限验证
    • 数据权限过滤
    • 防 SQL 注入

接口封装

本项目采用统一的接口封装方案,提供了完整的请求拦截、响应拦截和错误处理机制。以下是详细的实现说明:

1. 接口封装架构

接口封装主要包含以下几个部分:

  • 请求实例配置
  • 请求拦截器
  • 响应拦截器
  • 接口模块化
  • 统一错误处理

2. 实现细节

2.1 请求实例配置
const service = axios.create({baseURL: "/api/pc",timeout: 40000,headers: {"Access-Control-Allow-Origin": "*","Connection": "Keep-Alive","Content-Type": "application/json; charset = utf-8"}
})
2.2 请求拦截器
service.interceptors.request.use(config => {const token = localStorage.getItem("token");if (token) {config.headers["access-token"] = token}return config;}
)
2.3 响应拦截器
service.interceptors.response.use((res) => {const code = res.data.codeif (code == 100) {router.push({ name: "login" });} else if (code == 1) {ElMessage({message: res.data.msg,type: 'warning'});}return res}, (error) => {return Promise.reject(error);}
)
2.4 接口模块化
  1. 目录结构
src/network/
├── index.ts        # 请求配置和拦截器
└── apis/           # 接口模块├── home.ts     # 首页相关接口├── work.ts     # 工作相关接口└── user.ts     # 用户相关接口
  1. 接口定义示例
// apis/home.ts
export default {// 获取首页数据getHomeData: (params: any) => ({url: '/home/data',method: 'get',params}),// 更新首页数据updateHomeData: (data: any) => ({url: '/home/update',method: 'post',data})
}
  1. 接口调用示例
import getData from '@/network';// 获取首页数据
const getHomeData = async () => {try {const res = await getData('home/getHomeData', { page: 1 });return res.data;} catch (error) {console.error('获取首页数据失败:', error);}
}

3. 接口封装特点

  1. 统一配置

    • 统一的 baseURL 配置
    • 统一的超时时间设置
    • 统一的请求头配置
  2. 自动处理

    • 自动添加 token
    • 自动处理登录过期
    • 自动处理错误提示
  3. 模块化管理

    • 按功能模块划分接口
    • 支持接口自动导入
    • 支持接口命名空间
  4. 类型支持

    • 完整的 TypeScript 类型支持
    • 接口参数类型检查
    • 响应数据类型定义

4. 错误处理机制

  1. 请求错误处理

    • 网络错误处理
    • 超时错误处理
    • 请求取消处理
  2. 响应错误处理

    • 状态码错误处理
    • 业务错误处理
    • 登录过期处理
  3. 错误提示

    • 统一的错误提示组件
    • 可配置的错误提示方式
    • 支持自定义错误处理

5. 使用建议

  1. 接口定义

    • 使用 TypeScript 定义接口类型
    • 添加详细的接口注释
    • 遵循统一的命名规范
  2. 接口调用

    • 使用 async/await 处理异步
    • 添加适当的错误处理
    • 注意请求参数的合法性
  3. 性能优化

    • 合理使用请求缓存
    • 避免重复请求
    • 控制并发请求数量

贡献指南

欢迎提交 Issue 和 Pull Request 来帮助改进项目。

权限说明

    <!-- 路由格式 -->使用方式,登录后后端返回数据格式,根据这个格式,把所有路径路由配置放在这里,读取的时候让后台判断,返回那些路径,与后端沟通好.<!-- 把路由配置放在这里 -->parentId: id;index: index;title:一级路由名称icon:图标 我用的是iconfont 的图标 根据自己情况替换就行了;type: group;children: [ //子级路由index:index;title:二级路由名称path:path;name:name;component:文件读取路径 读取pages 文件 路径// 看不明白的就把这里的路径和pages 下的路径对比一下就明白了menuType:menuType;meta:   路由原信息] ;"nav": [{"parentId": "1","index": "1","title": "首页","icon": "icon-shouye","type": "group","children": [{"index": "1-1","title": "首页","name": "home","path": "/home","component": "shouYe/index","menuType": 0,"meta": {"selectIndex": "1-1","check": true}}]},{"parentId": "2","index": "2","title": "设备管理","icon": "icon-shebei","type": "group","children": [{"index": "2-1","title": "设备列表","name": "shebei","path": "/shebei","component": "shebei/shebei","menuType": 0,"meta": {"selectIndex": "2-1","check": true}}]},{"parentId": "3","index": "3","title": "模块管理","icon": "icon-mokuai","type": "group","children": [{"index": "3-1","title": "模块列表","name": "mokuai","path": "/mokuai","component": "mokuai/Mokuai","menuType": 0,"meta": {"selectIndex": "3-1","check": true}}]},{"parentId": "4","index": "4","title": "标靶检测","icon": "icon-mubiaobachang1","type": "group","children": [{"index": "4-1","title": "报警列表","name": "jingIndex","path": "/jingIndex","component": "biaoba/index","menuType": 0,"meta": {"selectIndex": "4-1","check": true}},{"index": "4-2","title": "标靶检测","name": "biaoba","path": "/biaoba","component": "biaoba/biaoba","menuType": 0,"meta": {"selectIndex": "4-2","check": true}},{"index": "4-3","title": "标靶报警","name": "baojing","path": "/baojing","component": "biaoba/baojing","menuType": 0,"meta": {"selectIndex": "4-3","check": true}},{"index": "4-4","title": "报警等级","name": "dengji","path": "/dengji","component": "biaoba/dengji","menuType": 0,"meta": {"selectIndex": "4-4","check": true}}]}]

许可证

MIT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/78533.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/78533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

林业数智化转型初步设计方案

最近应林业方面的朋友要求,帮助其设计了林业方面的数字化智能化转型的方案设计,编写了如下内容,供大家参考,林业方面主要有三大方向,即林业生态、生物灾害和疫源疫病,目前已经建成了一些信息化系统,但在数字化智能化方面偏弱,就想着如何借助人工智能、物联网、大数据和…

springboot单体项目的执行流程

首先就是启动springboot项目&#xff0c;即执行主函数&#xff0c;这个主函数的类通常带有SpingBootApplication注解&#xff0c;类中的main方法就是程序的入口。 启动主函数后&#xff0c;SpringBoot会按特定顺序加载配置文件&#xff0c;如application.properties或applicat…

Python格式化字符串的四种方法

Python格式化字符串的四种方法 1.使用 % 运算符 %s 是一个字符串的占位符&#xff0c;而 “World” 是替换它的值 print("Hello, %s!" % "World") # 输出&#xff1a;Hello, World!你可以使用多个占位符 注意&#xff1a;多个变量占位&#xff0c;变量要…

【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿

思维导图&#xff1a; Redis最主要的用途&#xff0c;三个方面&#xff1a; 1.存储数据&#xff08;内存数据库&#xff09; 2.缓存&#xff08;redis最常用的场景&#xff09; 3.消息队列 一、什么是缓存 我们知道对于硬件的访问速度来说&#xff0c;通常情况下&#xff1…

中阳视角下的趋势确认策略:以数据为核心的交易思维

中阳视角下的趋势确认策略&#xff1a;以数据为核心的交易思维 在动态交易市场中&#xff0c;如何在波动中捕捉相对确定的趋势&#xff0c;是每一位操作者关心的问题。“中阳”理念主张通过结构性价格分析&#xff0c;判断市场情绪的拐点。尤其是在出现大阳线或中阳线时&#x…

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数&#xff1f; inline&#xff08;内联&#xff09;是 C 中的一个关键字&#xff0c;表示“将函数的代码直接插入到调用点”&#xff0c;以减少函数调用开销&#xff0c;提升执行效率。 ✅ 注意&#xff1a;inline 是一种“请求…

React useMemo函数

第一个参数是回调函数&#xff0c;返回计算的结果&#xff0c;第二个参数是依赖项&#xff0c;该函数只监听count1变量的变化 import { useReducer, useState } from react; import ./App.css;// 定义一个Reducer函数 根据不同的action进行不同的状态修改 function reducer(st…

对比测评:为什么AI编程工具需要 Rules 能力?

通义灵码 Project Rules 在开始体验通义灵码 Project Rules 之前&#xff0c;我们先来简单了解一下什么是通义灵码 Project Rules&#xff1f; 大家都知道&#xff0c;在使用 AI 代码助手的时候&#xff0c;有时候生成的代码不是自己想要的&#xff0c;或者说生成的代码采纳后…

Java学习手册:MyBatis 框架作用详解

一、MyBatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。它通过将 Java 对象与数据库表之间的映射关系进行配置&#xff0c;使得开发者可以使用简单的 SQL 语句和 Java 代码来完成复杂的数据操作。MyBatis 支持自定义 SQL 语句&#xff0c;提供了灵…

list的设计

#pragma once #include<assert.h> #include<iostream> using namespace std; namespace aqc {template<class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& xT())//加const防止权限放大&#xff0c;用引用减少拷贝…

基于 PyQt 的YOLO目标检测可视化界面+ nuitka 打包

在人工智能和计算机视觉领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果&#xff0c;我们使用Pyqt框架进行检测结果的可视化&#xff0c;同时为了使其能够脱离Python环境&#xff0c;我们…

2.1 阅读错题---02-04年

引言 2002年-2004年英语阅读错题汇总与分析总结。 一、02年阅读 Text 1 题目&#xff1a;21题 题型&#xff1a;细节题 原因&#xff1a;单词认错了&#xff0c;原句中 in sympathy with 译为 与…一致 &#xff1b;题干中的 sympathy 译为 同情 题目&#xff1a;22题 题…

Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 本文视频课程记录于上述地址第五章中继器专题第11节 课程主题:中继器制作下拉菜单 主要内容:创建条件选区、多级中继器…

即刻启程,踏上W55MH32高性能以太网单片机学习之路!

单芯片解决方案&#xff0c;开启全新体验——W55MH32 高性能以太网单片机 W55MH32是WIZnet重磅推出的高性能以太网单片机&#xff0c;它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身&#xff0c;具体来说&#xff0c;一颗W55MH32内置高性能Arm Cortex-M3核心…

C++负载均衡远程调用学习之上报功能与存储线程池

目录 1. Lars-reportV0.1 report模块介绍 2.Lars-reporterV0.1 reporter项目目录构建 3.Lars-ReporterV0.1 数据表和proto协议环境搭建 4.Lars-ReporterV0.1上报请求业务处理 5.Lars-ReporterV0.1上报请求模块的测试 6.Lars-ReporterV0.2开辟存储线程池-网络存储分离 1. L…

LabVIEW三轴电机控制

在工业自动化迅猛发展的当下&#xff0c;多轴伺服电机控制系统在制造业、3D 打印等众多领域的需求与日俱增。它不仅要实现高精度的单轴运动控制&#xff0c;还需保障多轴协同作业的精准度&#xff0c;对响应速度也有严格要求。LabVIEW 开发多轴伺服电机控制系统&#xff0c;有效…

驱动开发硬核特训 · Day 27(下篇):深入掌握 Common Clock Framework 架构与实战开发

节。 在本篇内容中&#xff0c;我们将围绕 Linux 内核中的时钟子系统核心架构 —— Common Clock Framework&#xff08;简称 CCF&#xff09;展开深入讲解&#xff0c;目标是帮助你全面理解其设计理念、主要数据结构、注册流程、驱动实现方式&#xff0c;以及如何基于 NXP i.M…

数据库基础:数据库类型与MySQL特点详解

一、数据库的主要类型 1. 关系型数据库(RDBMS) 特点:基于关系模型,数据以表格形式存储 代表产品:MySQL、Oracle、SQL Server、PostgreSQL 优势:ACID事务支持、强一致性、成熟的SQL标准 适用场景:需要复杂查询和事务支持的场景 2. 非关系型数据库(NoSQL) 文档型数据库:Mo…

49认知干货:产品的生命周期及类型汇总

49章:产品的生命周期与类型划分 宇宙是运动的而非静止的,任何事物亦是如此。只要是存在的事物,便必然存在周期性变化,就像四季更替中的冬日枯树、春日新芽、夏日繁茂与秋日凋零。 这也意味着:事物的发展,离不开周期的更迭与演化,死亡并非终点,而是一种新的循环转变。 …

【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?

Elasticsearch 深度解析&#xff1a;从原理到实践 一、为什么选择 Elasticsearch&#xff1f; 数据模型 Elasticsearch 是基于文档的搜索引擎&#xff0c;它使用 JSON 文档来存储数据。在 Elasticsearch 中&#xff0c;相关的数据通常存储在同一个文档中&#xff0c;而不是分散…