前言:用vue做后台管理系统做了半年,最近element-ui升级到2了,所以决定搭建一个基于ele2的后台模版,在这我将手把手javascript:void(null)分享一下如何从0搭建一个后台系统模版。本模版将会长期更新,以后维护中会把常用结局方案常用组件封装在另外一个系统中,模版保障:方便快速开发,极易扩展的一个模版,基于此模版,您只需要修改少量的代码,就能进行开发。 分享开发过程,待续未完......
概述
github地址 项目在线预览 个人博客地址 此模板内涵盖:
- 登录权限控制
- 路由跳转拦截
- 网络请求拦截
- 侧边导航动态生成
- 动态换肤
- 结合Element-ui 2.0版本以上
等等包含后台系统常用功能,方便快速开发,极易扩展的一个模版,基于此模版,您只需要修改少量的代码,就能进行开发。
项目主依赖总览
- Vue.js
- Vue-router
- Vuex
- axios 一个封装了网络请求的库
- element-ui2 2.0版本以上,最近饿了吗团队除了2.0,1.+年后也不再维护
- normalize.css css样式重置
- nprogress 一个加载进度条插件
- screenfull 一个全屏的插件
- stylus、stylus-loader 本项目使用的Css预处理器,也可自行选择其他与处理器
- eslint-config-vue Eslint规则采用Vue源码的官方规则,你可以用自定义或者其他规则,Eslint规则查询字典
搭建前准备
一、环境准备
- 最新node.js环境安装、npm、yarn、vue-cli脚手架安装这些就不在此多说。
二、模拟数据
- 由于是个人项目,本模板中的数据都为Easy Mock生成的在线模拟数据。有兴趣的可以了解下。 模拟数据的地址接口配置在根目录下 /config/dev.env.js 的相关配置中,改成您的请求地址即可
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
BASE_API: '"http://www.easy-mock.com/mock/59dc61571de3d46fa94cebc7/lolapp"' // 这里换成您的请求地址即可
})
2.接口约定。一般在项目中前后端联系的接口都会有固定的约定,虽然本项目是模拟数据,但是为了做到规范,先简单约定好接口格式,方便后面请求拦截的时候判断,接口约定规则如下
1、数据交互统一为JSON格式
2、出参通用格式类似
{
"code": "H0000",
"data": "88888888"
}
其中:code指返回码,有具体业务含义,如:
S0000 系统错误!
B0000 未登录或登录失效!
H0000 执行成功
首字母
S: 系统错误
B: 业务异常
H: 提示
M: 消息
data指返回的json数据。
3、登陆后返回session_key,后续每次请求时都须将此作为token加入在header的Authorization信息中。
三、跨域问题
- 由于本模板项目是用的 Easy Mock,不用前端解决跨域问题,但是如果您的实际需求中需要解决跨域问题 可以 百度 cors 跨域 或者 webpack 配置反向代理:这里具体就不详细说明了,百度有很多答案,我这里简单贴个图:
webpack配置 'config/index.js'
axios配置 这几个地方对应好了就行
四、字体图标
1.Element-ui里面自带的图标在实际项目中肯定不够用,我是使用的阿里iconfont字体图标库,注册一个帐号,创建一个项目添加你想要的字体图标,会生成一个cdn的css链接,然后在你的head 里面 link这个样式即可。当你增加新图标的时候更新这个地址就好了。
五、关于vuex的使用
并不是每个项目都必须使用vuex,根据项目需要来使用。对于数据流不复杂的项目,完全可以讲数据保存在本地,也能达到类似的效果也不影响项目需求,vuex我个人感觉使用很繁琐,根据你的项目来进行使用。 还是借用官方文档的术语: 虽然 Vuex 可以帮助我们管理共享状态,但也附带了更多的概念和框架。这需要对短期和长期效益进行权衡。 如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 global event bus 就足够您所需了
开始搭建
1. Vue-cli脚手架生成项目
使用vue官方脚手架生成项目,生成的时候最好选择webpack模版,单元测试,根据你的需求是否安装。
2. 目录结构
├── build // 构建相关
├── config // 配置相关
├── src // 源代码
│ ├── api // 所有请求
│ ├── assets // 图片 字体等静态资源
│ ├── components // 全局公用组件
│ ├── directive // 全局指令
│ ├── filtres // 全局filter
│ ├── mock // mock数据
│ ├── router // 路由
│ ├── store // 全局store管理
│ ├── styles // 全局样式
│ ├── utils // 全局公用方法
│ ├── views // view
│ ├── App.vue // 入口页面
│ ├── main.js // 入口 加载组件 初始化等
│ └── permission.js // 权限控制 初始用户数据等
├── static // 第三方不打包资源
│ ├── img // 第三方不打包图片
│ └── theme // 主题包
├── .babelrc // babel-loader 配置
├── eslintrc.js // eslint 配置项
├── .gitignore // git 忽略项
├── .fjpublish.config.js // 自动化发布服务器 配置
├── index.html // html模板
└── package.json // package.json
3.webpack配置改造
3.1 在实际开发过程中,往往有多个环境,开发环境、测试环境、生产环境等等。我们需要进行多环境配置。
步骤1
在./config文件夹下新建一个sit.env.js 的文件
// 测试仿真环境
module.exports = {
NODE_ENV: '"production"',
BASE_API: '"http://120.55.169.121:8888/index"',
CRM_PATH: '"http://120.55.169.121:8083"', // 其他配置
};
dev.env.js 、prode.env.js 也可进行类似的配置,把各个环境请求的不同端口配置在这
后面在你的程序中,如果要使用这些变量可参考下例
let baseUrl = process.env.BASE_API;
let crmPath = process.env.CRM_PATH;
// 创建axios实例
const service = axios.create({
baseURL: BASE_API, // api的base_url
})
步骤2
修改./config/index.js文件,将 sit.env.js 在 index.js 的 build 对象中引入:如图
步骤3
修改./build/build.js 文件,将 process.env.NODE_ENV = 'production' 注释或者删除,因为我们在后面需要动态配置NODE_ENV,此步骤如图
步骤4
修改./build/webpack.prod.conf.js 文件 修改 evn,不BB直接上图
这样webpack 的配置就修改完了。 在这里可以顺便修改一下这个文件下 UglifyJsPlugin,打包构建的时候可以去除console.log,debugger。配置如下。(此步骤和多环境配置无关)
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false,
drop_debugger: true, // 去除构建的 debugger
drop_console: true // 去除构建的 console
},
sourceMap: true
}),
步骤5
我们需要修改 package.json 的script 语句来增加命令启动我们新增的服务
"scripts": {
"dev": "node build/dev-server.js",
"start": "node build/dev-server.js",
"build:sit": "NODE_ENV=sit node build/build.js",
"build:prod": NODE_ENV=production node build/build.js"
},
然后启动 run run build:sit,可是这个时候报错了,NODE_ENV不被识别,这是由于 windows 不支持 NODE_ENV=sit 设置的方式。我们只需要安装一个 cross-env 的插件即可
yarn add cross-env -D // 或者你使用npm 也可
npm install cross-env -dev--save
接下来 继续修改一个 script 语句启动即可
"scripts": {
"dev": "node build/dev-server.js",
"start": "node build/dev-server.js",
"build:sit": "cross-env NODE_ENV=sit node build/build.js",
"build:prod": "cross-env NODE_ENV=production node build/build.js"
},
这样 你启动 npm run build:sit 将构建打包测试环境的代码 生成在 dist 文件目录下 启动 npm run build:prod 将构建打包生产环境的代码 生成在 dist 文件目录下
3.2 结合 fjpublish 自动化发布到服务器。
步骤1
安装 fjpublish
npm install fjpublish -g
在项目根目录下建立一个 fjpublish.config.js 文件(为fjpublish配置文件)
module.exports = {
modules: [{
name: '测试环境',
env: 'sit',
ssh: {
host: '11.11.111.11', // 服务器地址
port: 22, // 端口
username: 'root', // 用户名
password: 'XXXX' // 密码
},
buildCommand: 'build:sit', // 构建命令 === npm run build:sit
localPath: 'dist', // 构建后上传文件
remotePath: '/test/xx', // 服务端路径
},{
name: '其他环境',
env: 'other',
....
}]
}
同样的为了方便我们需要修改 package.json 的script mode
"scripts": {
"dev": "node build/dev-server.js",
"start": "node build/dev-server.js",
"build:sit": "cross-env NODE_ENV=sit node build/build.js",
"build:prod": "cross-env NODE_ENV=production node build/build.js"
"public:sit": "fjpublish env sit"
},
运行命令 npm run public:sit 确认后就会自动打包build:sit的代码,并且压缩后发布带你指定的服务器上,并且执行你的相应配置,如果需要多环境同时发布,只需要在fjpublish.config.js里面的modules里面增加一个对象进行相关配置即可。
至此 Vue-cli 项目的前端自动化已经配置好了