百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

如何快速用Vue-element-admin撸了个管理后台

liuian 2025-02-20 16:44 26 浏览

最近一个朋友找我开发一个用于库存管理的后台,虽然逻辑并不是很复杂而且系统也并不是很大,但是因为存在一些定制需求,所以就希望通过自行开发,而不是直接使用目前市场上的库存管理后台。我也正好最近在研究一些新的前端框架,这次开发周期并不是很紧,所以也就正好可以给我对于一些之前没有使用过的前端框架练练手。

为什么选vue-element-admin

因为有段时间没有直接开发PC端前端项目了,这次接到项目之后,从网上搜索了一下目前比较流行的前端开发框架,看看是否可以选择适合的框架,而且可以通过这个项目研究一下目前一些新框架的结构。看了不少关于前端框架的排名文章,包括GitHub等网站上最近几年关于前端框架的热门程度,最近几年比较热门和流行的主要集中在React、Angular和Vue这三者上。在根据这些框架找了一些资料,发现Vue和Angular目前更适合网络应用的开发,React更适合手机App的跨平台开发。

对于Vue和Angular更近一步的研究,发现基本上两者功能上还是比较接近的,虽然Angular比较稳定,但是目前国内Vue的开发者相对比较多,考虑到之后朋友的这套系统可能会自己找团队来维护以及扩展,所以还是选择了基于Vue框架来开发。因为Vue可以算是非常流行的前端开发框架,有很多前端组件库都是基于Vue或者支持Vue的。我个人认为还是找一个大厂开源的组件库会比较靠谱一点,应该会相对成熟一些(不过还是最终还是碰到一些坑的),也就选择了eleme开发团队的element-ui,相对来说组件比较齐全,而且可以直接通过模版来摸索。

vue和element-ui对于管理后台有个不错的开源项目vue-element-admin,虽然vue-element-admin只能算是将element-ui和vue做了一个结合,不过项目里面还是封装了不少基础的功能,例如封装了axios来简化了接口的请求等。而且vue-element-admin包括了一个全功能展示的Demo和一个Starter模版,可以非常容易的开始框架的熟悉和着手开发。

开发的一些心得

模版中的Mock数据转换成本地数据库

因为vue-element-admin是一个纯前端的框架,为了效果展示直接使用了Mock.js来模拟数据接口的调用。我为了直接可以连接我开发的后端接口,我碰到一个问题就是跨域调用的问题,因为前端代码在开发模式下是运行在vue-cli自带的服务器上,然后我的后端接口是运行本地Apache服务器上,虽然在一个电脑上,但是因为是两个不同的服务器(实际上调用ip都是相同的,只是端口不同),所以还是要解决跨域调用问题。可惜的是在vue-element-admin的文档上虽然提到了跨域问题,但是解决方案只是简单了说了一句在开发环境下建议使用Proxy的方式。最终通过对Webpack设置的一些研究,解决了Proxy设置的问题。也就是将接口指向的文件夹映射到本地Apache服务器上相应的文件夹。可以将如下的配置添加在vue.config.js中的module.exports中

devServer: {
    proxy:{
      "/api": {
        target: "http://localhost/",
        changeOrigin: true,
      }
    },
    port: 80,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
  },

路由的设置

接下来就是添加相应的页面了,这步vue-element-admin直接对于vue-router做了拓展,用过添加了meta参数来实现侧边栏的导航和权限设置功能。尤其是权限和路由的绑定对于管理后台还是非常重要的,毕竟系统的使用者有不同的角色和相应的查看使用权限。这里的路由分为固定路由以及动态路由,而且对于侧边栏可以选择显示路由和隐藏路由,例如登录和注册页面就属于隐藏路由不包括在侧边内。固定路由就是无论用户权限都可以查看的页面,动态路由是根据用户的权限不同选择性显示的。在设置路由的时候,还是注意一点就是虽然通配符来拦截的404页面是固定路由,但是需要添加在动态路由内,而且要添加在最后,不然的话在这个通配符之后的页面都不会显示出来。下面是我项目一个只有超级管理员和管理员才能查看的页面路由配置:

{
    path: '/log',
    component: Layout,
    alwasyShow: true,
    redirect : '/log/index',
    meta: {
      title: "日志",
      icon:"el-icon-notebook-2",
      roles:["superadmin","admin"]
    },
    children: [
      {
        path: 'index',
        name: 'Log',
        component: () => import('@/views/logs/index'),
        meta: { title: '操作日志', icon: 'el-icon-notebook-2', roles:['superadmin','admin']}
      }
    ]
  }

权限设置

配置完系统的页面和路由之后,就是设置用户权限了,vue-element-admin模版中只配置了两个用户权限admin和editor,实际上权限设置还是比较简单的,首先根据系统的开发需求设计不同的用户角色,例如这次这个系统中我就设计了5个不同的角色,这样的话,只需要在加载用户数据的时候由后端将用户所属的角色以数组形式返回,然后在状态管理中给user添加roles的参数就能在不同页面和组件中读取权限,便于对于不同权限不同显示的实现。不过这个里面有个小坑,就是因为我的管理员角色被命名为superadmin,和原本模版中的命名,admin不一致,一开始也没有找到如何对其做修改。最后对于整体代码梳理了一遍,才发现在状态管理文件夹下有一个permission文件来实现按权限实现动态路由的功能,这里直接将角色为admin的用户展示全部可显示的页面,只需要将这里判断条件改为自己管理员角色就可以了。代码如下:

const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
        let accessedRoutes
        if (roles.includes('superadmin')) {
        accessedRoutes = asyncRoutes || []
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
        }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

表格使用

对于库存管理后台,表格是最核心的展示组件。element-ui的表格组件整体来说还是功能非常完善的,可以直接通过配置列来完成整个表格的渲染,而且融合一些表格基础操控,例如直接通过添加一个sortable参数就可实现列的排序功能。简单说一下我在这个项目使用到的一些功能吧

  • 基础的数据列表

直接通过后端传入的数据列表可以通过配置el-table-column中的prop属性来展示相应的数据项,只需要将相对应的数据数组赋值到el-table定义的data属性相对应的变量上就可以直接展示基础的表格数据了,这样对于基础展示的表格非常便捷,基本上对于配置好的表格结构只需要一行赋值代码就能解决了。

  • 自定义单元格

虽然一半以上的表格数据展示都可以直接展示的,不过还是有一些列的展示方式不同或者说需要对于后端返回的数据做一些处理,这就可以用到el-table-column中formatter属性来回调一个处理数据展示格式的函数,不过有一点是formatter函数只能返回字符串而不能添加HTML标签来做更丰富的自定义,所以理论上formatter的作用只是局限于数据格式的调整,例如在我这个项目中,需要将库存数字转换成万件单位的,那就可以用如下的函数来处理,而且能通过列中的property对于一些列做特殊处理

	countCellFormater(r, c, value, index) {
      if (c.property == "pack_count") {
        if (value != 0) {
          var return_count = new Number((value * r.item.pack_size) / 10000);
          return value + "包(计:" + return_count.toFixed(2) + "万件)";
        }
      }
      if (value == 0) {
        return "-";
      } else {
        var return_count = new Number(value / 10000);
        return return_count.toFixed(2) + "万";
      }
    }

如果需要更丰富的展示方式,需要用到el-table-column的slot,这样通过定义slot-scope可以读取每行的数据以及相应行的下标,这样的就更自由了,不但可以以更丰富的样式展示数据,也可以将多个数据列组合在一起展示。

  • 表格筛选

表格筛选的配置也比较直观,就是筛选条件数组(filters)和筛选处理函数(filter-method)来实现,筛选数组可以是固定的字符串数组或是通过调用函数来返回相应列的动态筛选条件数组,然后filter-method就是通过对于相应的数据属性和选择的筛选条件做比对就可以了。一般来说筛选条件会将数据相应属性中重复的内容剔除后的数组,不过像时间可能需要做多一些的处理,只显示日期作为筛选分类。因为绝大多数筛选数组生成函数和筛选处理函数都是类似的,唯一不同的就是选择的数据属性不同,这样就可以直接通过column.property来区分处理的数据属性,代码如下

	itemColumnFilters(label) {
      var dataset = this.tableData;
      var filters = [];
      var values = [];
      dataset.forEach(function (v, i) {
        if (v.item[label] != "" && values.indexOf(v.item[label]) == -1) {
          filters.push({
            text: v.item[label],
            value: v.item[label],
          });
          values.push(v.item[label]);
        }
      });
      return filters;
    },
    itemColumnFilterHandler(value, row, column) {
      return row.item[column.property] === value;
    },

表单使用

对于一个需要大量数据输入的库存系统,表单的使用频率是仅次于表格的。element-ui中表单的组件基本上能满足这个项目的需求,而且根据文档上来看,对于绝大多数的项目需要的表单组件都有,例如选择框、输入框、选择器、开关等等都有,而且还有数据穿梭框等相对比较复杂的组件,虽然这个项目中主要还只是用到输入框、选择器以及开关,不过这些组件的存在可以方便开发降低再造轮子的成本。表单我体验比较深的是两个功能:

  • 自动完成的输入框

自动提示的输入框可以大大的提升使用体验和效率,对于这个项目中很多需要反复输入的输入框都直接使用了具有自动完成的输入框,而且自动完成的数据可以预先加载或是实时远程调用,都非常直观,这样用户体验上来说,可以减少很多的键盘输入。之前在开发小程序的时候,还自己写过一个自动提示的输入框插件,虽然实现的功能上来说基本一致,但是结合了element-ui的设计语言,还是美观不少。

  • async-validator的验证模式

表单中应该最耗费开发时间的可能就是输入数据验证了,这点上因为很多验证规则的过于复杂而需要自定义验证函数,不过element-ui基于async-validator的验证机制基本上还是能满足绝大多数验证规则的,就算比较复杂的验证规则也可以通过回调函数来处理,虽然这次项目中只是一些简单的必填验证、输入长度以及数字区间的验证,但是还是用到了异步服务器端验证的功能,结构还是非常直观易于理解的。不过开发过程中碰到一个小坑,就是对于数字的验证需要在输入框中model参数上添加.number的后缀,要不就会验证会以字符串来处理,那么数字区间就会变成字符串长度验证了。这个问题也是我在验证数字是一直不成功找到的问题,主要是在element-ui文档内没有找到相应的解决方案


	
		
	


//在规则中添加相应的type为number的规则即可

count:[{
	type:"number", min:0, message:"请填写正确的包装数量",trigger:"blur"
}]

对话框+表单

为了降低单页面内的操控数量,对于有较多操作的页面,我是结合了对话框和表单的方式,而且为了代码的整洁性,将不同功能的对话框以页面组件的方式实现,这样在页面代码中只需要引入组件,然后通过一个简单的显示参数的变化来控制对话框的显示和隐藏。然后将表单中相对复杂的业务逻辑就可以封装在对话框组件内了便于后期的维护。不过这个会引起一些后期的其他问题,例如移动端适配,因为element-ui对话框是根据屏幕宽度来定义宽度的,对于小屏幕的时候就会出现显示的问题,目前还没有做移动端适配,所以就放在之后处理了。

echarts的使用

最后是首页或是仪表盘中的数据展示,为了美观使用了图表的方式,就直接引入echarts,因为通过npm来对外部模块的管理,安装和引用echarts还是比较方便的,一个简单npm install就可以将echarts和相应的依赖项都安装了。不过不知道是因为版本不匹配还是vue本身的原因,直接应用echarts都会在渲染的时候报错,类似某个属性不存在等问题。因为时间有限,没有太深入的研究,然后再引入vue-echarts就能使用了,虽然粗略看了一下vue-echarts的代码和echarts官方使用方式基本一样,但是直接使用官方文档上的引用和调用方式就会报错。以后有时间的话,再仔细研究一下,毕竟echarts的功能还是非常强大的,虽然这次项目中我只用了简单的线性图,但是echarts基本能满足绝大多数的数据可视化的需求。

遇到的坑

没有坑的新尝试都是不完整的,不过这次因为项目相对比较简单,并没有碰到太多的坑,就说两个吧

移动端适配

因为管理后台的特性,element-ui对于移动端的适配是基本没有的,只是在布局上对不同尺寸显示区域做了适配和隐藏选项,也只能简单的将布局做调整。对于类似像表格和对话框这样的组件在手机端上的展示就非常惨不忍睹了,这点上对于现在移动互联网时代有点不太靠谱。不过,应该也能通过自行开发来做一定上的功能适配,比如对于不同的显示尺寸展示不同结构的表格和组件。

部署发布的根目录设置

这个可能是有一定的项目特性,因为项目的部署不是在域名根目录下的,所以需要在发布编译配置中修改根目录的设置,要不对于不是直接部署在域名根目录上项目,所有的路由都会出现资源调用的问题。不过这个设置还是比较简单的,就是一开始没有在文档中看到,所以算是一个小坑。可以直接在项目根目录下.env.production中修改下面这行就可以了。

# just a flag
ENV = 'production'

# base api
VUE_APP_BASE_API = '/api'

总结

总的来说,使用已有框架来开发的确能提高不少的效率,不过也不得不说,因为一些库的文档并不是非常的完善,需要花一点时间来摸索,所以还是会碰到坑。不过基于Vue的框架有一点优势不得不说,就是国内的开发者的确很多,在网上也能找到很多解决方案,不需要费力在国外网站找资料。总的来说,对于我来说新了解的一个框架,第一次开发的体验还是不错的。


如果大家对于这个项目开发中某些细节感兴趣的话,可以在这篇文章下评论,我会尽量再多展开一些。

相关推荐

教你把多个视频合并成一个视频的方法

一.情况介绍当你有一个m3u8文件和一个目录,目录中有连续的视频片段,这些片段可以连成一段完整的视频。m3u8文件打开后像这样:m3u8文件,可以理解为播放列表,里面是播放视频片段的顺序。视频片段像这...

零代码编程:用kimichat合并一个文件夹下的多个文件

一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢?在kimichat对话框中输入提示词:你是一个Python编程专家,完成如下的编程任务:这个文件夹:D:\downloa...

Java APT_java APT 生成代码

JavaAPT(AnnotationProcessingTool)是一种在Java编译阶段处理注解的工具。APT会在编译阶段扫描源代码中的注解,并根据这些注解生成代码、资源文件或其他输出,...

Unit Runtime:一键运行 AI 生成的代码,或许将成为你的复制 + 粘贴神器

在我们构建了UnitMesh架构之后,以及对应的demo之后,便着手于实现UnitMesh架构。于是,我们就继续开始UnitRuntime,以用于直接运行AI生成的代码。PS:...

挣脱臃肿的枷锁:为什么说Vert.x是Java开发者手中的一柄利剑?

如果你是一名Java开发者,那么你的职业生涯几乎无法避开Spring。它如同一位德高望重的老国王,统治着企业级应用开发的大片疆土。SpringBoot的约定大于配置、SpringCloud的微服务...

五年后,谷歌还在全力以赴发展 Kotlin

作者|FredericLardinois译者|Sambodhi策划|Tina自2017年谷歌I/O全球开发者大会上,谷歌首次宣布将Kotlin(JetBrains开发的Ja...

kotlin和java开发哪个好,优缺点对比

Kotlin和Java都是常见的编程语言,它们有各自的优缺点。Kotlin的优点:简洁:Kotlin程序相对于Java程序更简洁,可以减少代码量。安全:Kotlin在类型系统和空值安全...

移动端架构模式全景解析:从MVC到MVVM,如何选择最佳设计方案?

掌握不同架构模式的精髓,是构建可维护、可测试且高效移动应用的关键。在移动应用开发中,选择合适的软件架构模式对项目的可维护性、可测试性和团队协作效率至关重要。随着应用复杂度的增加,一个良好的架构能够帮助...

颜值非常高的XShell替代工具Termora,不一样的使用体验!

Termora是一款面向开发者和运维人员的跨平台SSH终端与文件管理工具,支持Windows、macOS及Linux系统,通过一体化界面简化远程服务器管理流程。其核心定位是解决多平台环境下远程连接、文...

预处理的底层原理和预处理编译运行异常的解决方案

若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好![Mac-10.7.1LionIntel-based]Q:预处理到底干了什么事情?A:预处理,顾名思义,预先做的处理。源代码中...

为“架构”再建个模:如何用代码描述软件架构?

在架构治理平台ArchGuard中,为了实现对架构的治理,我们需要代码+模型描述所要处理的内容和数据。所以,在ArchGuard中,我们有了代码的模型、依赖的模型、变更的模型等,剩下的两个...

深度解析:Google Gemma 3n —— 移动优先的轻量多模态大模型

2025年6月,Google正式发布了Gemma3n,这是一款能够在2GB内存环境下运行的轻量级多模态大模型。它延续了Gemma家族的开源基因,同时在架构设计上大幅优化,目标是让...

比分网开发技术栈与功能详解_比分网有哪些

一、核心功能模块一个基本的比分网通常包含以下模块:首页/总览实时比分看板:滚动展示所有正在进行的比赛,包含比分、比赛时间、红黄牌等关键信息。热门赛事/焦点战:突出显示重要的、关注度高的比赛。赛事导航...

设计模式之-生成器_一键生成设计

一、【概念定义】——“分步构建复杂对象,隐藏创建细节”生成器模式(BuilderPattern):一种“分步构建型”创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...

构建第一个 Kotlin Android 应用_kotlin简介

第一步:安装AndroidStudio(推荐IDE)AndroidStudio是官方推荐的Android开发集成开发环境(IDE),内置对Kotlin的完整支持。1.下载And...