后台管理系统复盘
Note
技术复盘
毁灭性bug
- 随便下载库
随便下载库
下载了没有人用的库,因为代码互相依赖,依赖版本不统一,导致了项目打开后显现不出来任何内容。接着我使用npm fix audit语句尝试修复,结果仍无法显现任何内容,之后一时心急使用npm fix audit —force修复,导致项目直接崩溃,无法启动。
功能介绍和业务细节
- 模板的选择
- 模板的初始化
- 模板的项目结构分析
- 登录(注册)
- 面包屑导航
- 图表的使用
- element自定义样式修改
- 样式scope问题
- 上传
- 下载(导出)
- 增删查改
- 多权限路由
- 分页逻辑
模板的选择
后台管理系统很多,这里选择了基于vue2的vue-element-admin
模板的初始化
模板文档中:
建议
你可以把
vue-element-admin当做工具箱或者集成方案仓库,在vue-admin-template的基础上进行二次开发,想要什么功能或者组件就去vue-element-admin那里复制过来。
但我个人开发的感受是还是直接使用vue-element-admin更加方便,删比增简单。有时因为要引用一个功能,需要整个项目找他的入口和引用。
两个例子:
在组件error-log中,引用的资源有:

处理起来比较困难,大致的逻辑是在设置settings.js中确定errorlog的使用环境,在error-log.js中判断是否需要使用……
多权限路由中,也有很多关于roles判断的地方
模板初始化成功后,可以运行项目和code业务代码
模板的项目结构分析
登录(注册)
在上两个项目中,登录是比较困扰我的业务逻辑,主要改动的地方有:
api/login.js 中重写登录接口
1 | // url: '/vue-admin-template/user/info', |
src/main.js 中取消mock服务
src/utils/request.js 中重写登录逻辑和token名
1 | // config.headers['X-Token'] = getToken() |
vue.config.js 中取消mock服务,新增跨域设置
1 | proxy: { // 配置反向代理 |
.env.development,.env.production 中配置域名
1 | # VUE_APP_BASE_API = '/dev-api' |
src/utils/auth.js 中重写tokenkey
1 | // const TokenKey = 'vue_admin_template_token' |
还有自己处理一下response的data,有的请求不用解构
面包屑导航


我记得出现过一个bug,全部的dashboard字样重新设置会显示第一张图,具体的问题我还没有搞明白。
图表的使用
用echart和模板自带的图表组件就好了
element自定义样式修改
src\styles\element-ui.scss 下重新设置,样式的类名去查html元素
样式scope问题

在表格中,如果需要根据某一条的状态设置特殊样式,此时在element-ui.scss全局设置样式是不可行的,因此需要单独设置特殊样式
1 | // 判断状态的逻辑写到这里面,这个是上色 |
然后需要style设置非scoped,才能穿透样式,为了防止样式穿透影响其他元素,应当设置一个特殊的container装载这些样式
1 | <style lang="scss"> |
上传
一般都用自定义上传,el-upload配置
两个项目中涉及了:
- 自定义上传规则
- 最多允许一张图片的上传
- 必须有一张图片的上传
- 至少上传一张,最多允许九张图片的上传
自定义上传规则
1 | <el-upload |
然后在下面js中写上传逻辑,需要注意的点其实是怎么验证(图片一定要上传时)
最多允许一张图片的上传
设置limit属性
必须有一张图片的上传
1 | if (this.dynamicValidateForm.urlList.length === 0) { |
至少有一张图片,最多有九张图片的上传
前二者的结合
下载(导出)
根据vue-element-admin改写,添加一下特殊的配置项即可
性能考虑,需要分包引入:
1 | handleDownload() { |
处理配置项
1 | // multiHeader:一级表头 |
调用函数
1 | import('@/vendor/Export2Excel').then(excel => { |
增删查改
略
多权限路由
见chuang-system的写法
分页逻辑
当时写分页的时候比较乱,现在可以总结一下分页。
- 前端分页
- 服务器分页
- form + size
- scroll
前端分页
后台返回所有数据,前端进行分页,维护list和show_list
服务器分页——form + size
前端搜索体验最好,但只能用于后台小数据集
前端维护total,currentPage,pageSize、后台返回的list即可
服务器分页——scroll
维护scollIdArray,page,total即可,total由后台返回。
page的变化由prevClick和nextClick决定
scollIdArray,更新于后台返回数据,点击prevClick和nextClick,搜索条件发生变化时
在后台返回数据时:
1 | this.scollIdArray[this.page - 1] = response.data.scrollId |
点击prevClick和nextClick时:
1 | if (event === 'prev') { |
搜索条件发生变化时,清空
一些bug的处理思路
首先一点,前端没多少很难的东西。很多问题是后台给你制造的,揪出对接后台问题。
- 空数据(数据为null)问题
- element组件dialogdata读取问题
- element-dialog和echart不太兼容的问题
空数据(数据为null)问题
后台传来null时(往往是爬虫没有给后台数据,后台只建了表但是没有数据),很多代码会跑出异常,需要增强健壮性。
在使用后台数据进行操作之前,需要判断后台数据是否为null,然后进行处理。
1 | watch: { |
element组件dialogdata读取问题
业务上,有一个dialog需要点开之后再请求后台然后渲染数据,但是element-dialog是当即渲染而不是点开之后再去获得,因此需要默认的设置
1 | return this.list && this.list.length > 0 ? this.list[this.showIndex] : {} |
element-dialog和echart不太兼容的问题
echart中很喜欢使用width:100%,但是dialog默认的width是自动计算的,因此会导致dialog非常小,echart不能正常显示的问题。
需要将dialog设置宽度,如果仍不行需要重新启动服务,因为有时候echart在我的代码里是只初始化一次,且dialog在页面加载的时候就会自动加载。
如果图表仍不正常显示,考虑是前者数据读取的问题
登录问题
当时卡了我很久,登录的思路是:取消mock服务,业务逻辑:配置域名,配置代理,调用自己的接口,返回数据处理。
参考资料
https://github.com/WAGFS/vue-zxing
