Vue-后台管理笔记
开始vue项目笔记
目标:快速构建,明确需求,整理实用组件和工具库
学习链接
vue-element-admin文档学习
登录篇
后台基础模板
文档总结
跟着思路来写总结!
介绍
布局
路由和侧边栏
权限验证
快捷导航
新增页面
样式
服务端交互
Mock Data
引入外部模块
构建发布
介绍
这里内容是集成的后台管理系统,内容很多,按需获取。
功能
登录/ 注销权限验证
页面权限/指令权限/权限配置/二步登录全局功能
国际化多语言/动态换肤/动态侧边栏/动态面包屑/标签页/svg sprite图标
mock数据/Screenfull全屏/自适应收缩侧边栏编辑器
富文本/Markdown/Json等Excel
导出excel/导入excel/前端可视化excel/导出zip错误页面
401/404
布局
项目结构,了解项目内容
build-构建相关
mock-模拟数据
plop-templates-基本模板
public-静态资源-favicon图标,html模板
src——核心
api-所有请求
assets-主题,字体等静态资源
components-全局公用组件
directive-全局指令
filters-全局filter
icons-项目svg icons
lang-国际化language
layout-全局layout
router-路由表
store-全局store管理
utils-全局公用方法
vendor-公用vendor
views-核心页面
App.vue-入口页面
main.js-入口文件、加载组件、初始化
permission.js -权限管理
tests
.env.xxx
.eslintrc.js
.babelrc
.travis.yml-自动化CI配置
vue.ocnfig.js
postcss.config.js
package.jsonLayout
包含导航、侧边栏、面包屑、标签页及内容
路由渲染的时候,内容写入一级路由就可以,子路由也会带上。app-main
外部包裹了一层keep-alive,为了缓存router-view,配合tabs-view使用的router-view
默认情况下这两个页面切换时并不会触发 vue 的 created 或者 mounted 钩子
可以简单的在 router-view 上加上一个唯一的 key,来保证路由切换时都会重新渲染触发钩子了。
路由和侧边栏
关键核心部分
在侧边栏动态生成路由
根据路由里面的配置项来生成
meta
roles-路由权限设置
title-设置路由在侧边栏和面包屑中的名字
icon-设置该路由的图标
noCache-是否被缓存
breadcrumb-是否在面包屑中显示
affix-固定
activeMenu-点击高亮
路由:
constantRoutes-默认设置的路由
asyncRoutes-需要动态判断的路由-利用addRoutes动态加载
侧边栏:
基于el-menu、submenu和el-menu-item
权限验证
获取用户的权限,比对路由表
通过router.addRoutes动态挂载到router上
前端格局roles去向后端请求可访问的路由表
逻辑修改的地方在permissio.js中
用v-permission来实现按钮级别的权限判断-通过按钮改变权限
快捷导航
运用keep-alive和router-view结合
来说router-link,点击跳转
监听路由$route的变化,判断当前页面是否需要重新加载或以被缓存
这样的是有问题的,两者的name一定要一样,才能关联,这不符合要求
可利用localStorage来进行缓存处理
新增页面
需要先添加路由
需要二级路由才会有内容,不然只有layout组件
如果只有一个路由,就没有下拉箭头,这是可以判断的
如果有多级路由,一定要在二级路由的根文件下添加router-view,用来渲染
新增路由,要在views文件夹下创建对应的文件夹,可在里面创建自己的utils或components文件
自己维护自己,私有/公有
最后在api文件下创建本模块对应的api服务
!!!拆分组件的最大好处不是公用而是可维护性,学的人也能看得懂
也可以在自己文件夹设置样式,请加上scoped
样式
所有的全局样式都写在styles目录下面,每个页面自己对应的样式都写在自己的文件中
添加scoped
自定义element-ui样式
添加命名空间
想修改添加了scoped的子组件>>>
或sass的/deep/
服务端交互
一个完整的前端UI交互到服务器处理流程
- UI 组件交互操作;
- 调用统一管理的 api service 请求函数;
- 使用封装的 request.js 发送请求;
- 获取服务端返回;
- 更新 data;
统一把请求放在api文件夹中
request.js是放在公共工具中的
基于axios的封装,统一处理get、post请求
封装了全局request拦截器、response拦截器、统一的错误处理、统一超时设置、baseURL设置
设置多个baseURL
通过环境变量来设置,从而请求不同的api地址
从mock直接切换到服务器请求
Mock Data
Mock数据是前端必不可少的,是前后分离的关键,模拟服务器连接的接口,模拟请求数据甚至逻辑
swagger,一个rest apis文档生成工具
在本地启动mock-server来模拟数据,我们的 mock 是完全基于webpack-dev-serve来实现的,
所以在你启动前端服务的同时,mock-server就会自动启动
如果你不想使用mock-server的话只要在vue.config.js中移除webpack-dev-server中proxy和after这个Middleware就可以了。
如果想添加 mock 数据,只要在根目录下找到mock文件,
添加对应的路由,对其进行拦截和模拟数据即可。
待后端完成接口后,逐步替换掉原先 mock 的接口。
只要在mock/role/index.js找到对应的路由,之后将它删除即可。
现在在mock/index.js也封装了一个纯前端 mock 的方法,你只需要在src/main.js中:
1 | import { mockXHR } from '../mock' |
引入外部模块
引入依赖npm install vue-count-to --save
加上 –save 参数会自动添加依赖到 package.json 中去。
使用:
全局注册-在main.js中,引入,使用
1 | import countTo from 'vue-count-to' |
局部注册
三步走
import components < countTO…
第三方库使用
挂载到vue原型上,大家都可以使用了
1 | import moment from 'moment' |
也可以直接封装一个组件–待学习
只要在合适的生命周期里面初始化它就好了。一般在 mounted中,可正常使用了
构建发布
构建,一般只有一行命令就可以了
1 | # 打包正式环境 |
构建打包成功之后,会在根目录生成 dist 文件夹,里面就是构建打包好的文件,通常是 .js 、.css、index.html 等静态文件。
环境变量
所有测试环境或者正式环境变量的配置都在 .env.development等 .env.xxxx文件中。
它们都会通过 webpack.DefinePlugin 插件注入到全局。
环境变量必须以VUE_APP_为开头。如:VUE_APP_API、VUE_APP_TITLE
分析构建文件体积
可以通过 webpack-bundle-analyzer 命令构建并分析依赖模块的体积分布,从而优化你的代码。npm run preview -- --report
强烈建议开启 gzip
发布
只需要将最终生成的静态文件,也就是通常情况下 dist 文件夹的静态文件发布到你的 cdn 或者静态服务器即可
其中的 index.html 通常会是你后台服务的入口页面
部署时可能会发现资源路径不对 ,只需修改 vue.config.js 文件资源路径即可。
前端路由与服务端的结合
前端路由使用的是 vue-router,所以你可以选择两种方式:browserHistory 和 hashHistory。
hashHistory 是以 # 后面的路径进行处理,通过 HTML 5 History 进行前端路由管理,
而 browserHistory 则是类似我们通常的页面访问路径,并没有 #,但要通过服务端的配置
环境变量
.env # 在所有的环境中被载入
.env.[mode] # 只在指定的模式中被载入
环境变量必须以VUE_APP_为开头。如:VUE_APP_API、VUE_APP_TITLE
除了一些写在.env的环境变量之外,还有一些构建和部署相关的变量都是需要在vue.config.js中配置的。
进阶
跨域问题
两种
cors 全称为 Cross Origin Resource Sharing(跨域资源共享)–工作量基本在后端
推荐的原因是:只要第一次配好了,之后不管有多少接口和项目复用就可以了,一劳永逸的解决了跨域问题,
而且不管是开发环境还是正式环境都能方便的使用。详细 MDN 文档
proxy-通过搭建一个中转服务器来转发请求规避跨域的问题。-纯前端
Eslint
代码规范
eslint+vscode 来写 vue–标红不符合 eslint 规则的地方,同时还会做一些简单的自我修正。
自动修复npm run lint -- --fix
eslint 会自动修复一些简单的错误。
风格指南
重要!!!推荐vue官方风格指南。。
所有的Component文件,都以大写开头
@/components/BackToTop/index.vue
@/components/Charts/Line.vue
@/views/example/components/Button.vue
所有的.js文件都遵循横线连接
@/utils/open-window.js
@/views/svg-icons/require-icons.js
@/components/MarkdownEditor/default-options.js
在Views文件下
代表路由的.vue文件都使用横线连接 -需要和component进行区分
页面的url 也都是横线连接的,比如https://www.xxx.admin/export-excel
@/views/svg-icons/index.vue
@/views/svg-icons/require-icons.js
路由懒加载
const Foo = () => import(‘./Foo.vue’)
图表
推荐 ECharts,功能齐全,社区 demo 也丰富
ECharts 本身并不是自适应的
需要手动调用它的 .resize()
建议按需引入
1 | // 按需引入 引入 ECharts 主模块 |
CDN
很多文章说使用 CDN 引入的方式能大大减小代码的体积,这是不可能的。虽然打包完的 bundle小了,
但那部分代码只是被你拆出去,用CDN的方式引入罢了。你想减小体积,最高效的方案是启用GZIP。
使用CDN引入的方式等于一些第三方依赖的版本你是通过package.json来控制的,
一些依赖则需要手动维护,增加了一些维护成本。
更换主题
,所以你想在某个view里面覆盖它的样式就不能加 scoped,
但你又想只覆盖这个页面的 element 样式,你就可在它的父级加一个 class,
以用命名空间来解决问题。或者使用深度作用选择器
1 | /* 你的命名空间 */ |
动态换肤
这里需要获取 element-ui 的版本号,从而锁定版本,以免将来 Element 升级时受到非兼容性更新的影响。
国际化
集合了国际化 i18n 方案。通过 vue-i18n而实现。
错误处理
页面
页面级的错误处理由 vue-router 统一处理,所有匹配不到正确路由的页面都会进 404页面。
请求
项目里所有的请求都会走@/utils/request.js里面创建的的 axios 实例,它统一做了错误处理
根据response拦截器中的状态码来处理
代码
通过eslint处理
Webpack指南
这里分享的是链接:写完看完它!!!
个人实践
开始自己做一遍!
第一步,建立gitee仓库,可以线上演示。
创建vue项目,现在本地运行初始化,可以运行。上传gitee
遇到问题:404
把项目打包,配置vue.config.js里面的路径需要配置,dist目录生成
参考地址
可以在线上点开了,第二步,搭建环境
清空初始化文件
下载依赖包-按照作者的版本下载,可以减少问题
安装好,开始配置,写入main.js
写入normalize.css,启动element-ui
可以运行基本element-ui组件。
第三步,创建内容-创建文件夹。。
- 创建组件-根据作者结构来-基本内容OK
- 创建路由表-根据需求来
- 创建全局样式-全局公共样式抽离
组件基本结构,一个主要的,其他组件在主要文件中引入。
公共组件名字大写!!!
公共组件放入components中
先写layout组件,作为后台管理系统的核心部分,几乎每一个页面都要用到
index.vue里面引入了layout自身的组件
Layout里面的组件有侧边栏、导航栏、主页面
侧边栏用动态加载路由来配置,需要传递值-Vuex
创建完Layout基础部分,设置store里面内容
出现问题,如何import { Navbar, Sidebar, AppMain } from './components'
需要一个index.js文件
1 | export { default as Navbar } from './Navbar' |
问题总结
卡在了webpack打包上面….gitee上面运行不出来..