前端代码后后端代码分开运行,后端有后端的服务器去运行,前端有前端的服务器去运行,前端和后端通过 HTTP Restful 方式进行交互,通常是前端向后端发送AJAX请求获取数据。
注意:有些人认为 前段人员写前段,后端人员写后端就是前后端分离了,其实这样说不准确,前后端分离不是前后端分工,只有前端代码和后端代码分开各自都有独立的容器运行这才是前后端分离,谁写前端谁写后端其实并不重要。
成本高,公司不仅要招聘后端人员,也要招聘前端人员,人力成本是很高的(工资),小项目,小公司不适合前后端分离
前后端分离后,后端可以使用postman进行测试,前端可以使用mock/Easymock模拟后端数据进行测试,那么前端怎么知道后端的接口如何对接?比如:接口地址,接口参数,请求方式,返回值等等。方式一:我们可以手写接口文档规范,前后端都通过这个接口文档进行开发和调试,方式二:我们可以使用Swagger接口文档生成工具,该工具集成在后端,通过扫描Controller接口自动生成API文档,那么前端小姐姐就可以根据Swagger接口文档对接后端应用,当前后端都开发完成,前后端一起联调测试。
饿了么Element UI 文档 http://element-cn.eleme.io/#/zh-CN
Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库,类似于easyui一样,提供了很多的ui组件。资料下载网站:https://unpkg.com/[email protected]/lib/
Element UI 可以使用cdn方式和NPM方式进行安装,我们使用Npm
创建一个static web工程
vue init webpack
npm方式安装
推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用。
npm i element-ui -S
如果出现报错:npm WARN [email protected] requires a peer of ajv@^6.9.1 but none is installed. You must install peer dependencies yourself. ,就执行 npm i ajv
安装ajv.
在main.js中导入Element ui
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI)
也可以通过CND方式安装-不推荐
拷贝HelloWorld.vue重命名为ElementUI.vue ,内容如下
默认按钮
主要按钮
成功按钮
信息按钮
警告按钮
危险按钮
router.js导入ElementUI.vue
import ElementUI from '@/components/ElementUI'
增加路由配置
{
path: '/ElementUI',
name: 'ElementUI',
component: ElementUI
}
ElementUI简单的组件这个不 一 一 做演示,同学们自己去根据官网文档去尝试。
创建页面名字为 user.vue
router.js导入user
import ElementUI from '@/components/user'
增加路由配置
{
path: '/user',
name: 'user',
component: user
}
去官网拷贝table页面代码
使用mock模拟数据,Mock.js (官网http://mockjs.com/)是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。
npm install mockjs
创建 src/js/user.js , 引入mockjs用来模拟后台数据
// 使用 Mock
var Mock = require('mockjs')
var data = Mock.mock({
// 属性 list 的值是一个数组,随机产生 1 到 10 个元素
'list|1-10': [{
// 属性 id 是一个自增数,起始值为 1,每次增 1
'id|+1': 1
}]
})
// 输出结果
console.log(JSON.stringify(data, null, 4))
cd src/js
node user.js
user.js模拟列表数据,并向外暴露资源
//模拟列表数据=======================================
var dataList = []
for (var i = 0; i < 15; i++) {
dataList.push(Mock.mock({
'id': '@increment',
'name': '@cname',
'phone': /^1[0-9]{10}$/,
'email': '@email',
'address': '@county(true)',
'createTime': '@date("yyyy-MM-dd")'
}))
}
//开始的位置 size 每页显示的条数 list 总结数据
function pagination(page, size, list) {
// page = 2 size 10 list.slice(10,20)
return list.slice((page-1)*size, page*size)
}
// 获取用户列表 opts:参数
Mock.mock(new RegExp('/user/list'), 'post', (opts) => {
//列表所有数据
var list =dataList;
//当前页
var page = JSON.parse(opts.body).page || 1;
//每页条数
var size = JSON.parse(opts.body).size || 10;
//总条数
var total = list.length
//枫叶后的列表数据
list = pagination(page, size, list)
//返回分页结果
return {
'total': total,
'data': list
}
})
npm install axios --save
main.js配置axios
import axios from 'axios'
//配置axios的全局基本路径
axios.defaults.baseURL='http://localhost:80'
//全局属性配置,在任意组件内可以使用this.$http获取axios对象
Vue.prototype.$http = axios
修改user.js,在vue挂载完成之后,通过发送ajax请求获取user.js中的模拟数据
<el-table-column fixed="right" label="操作" width="200">
<template slot-scope="scope">
<el-button @click="handleEdit(scope.row)" type="primary" round size="small">编辑el-button>
<el-popconfirm
confirmButtonText='一干到底'
cancelButtonText='我后悔了'
icon="el-icon-info"
iconColor="red"
title="你确定要删除当前数据?"
@onConfirm="handleRemove(scope.row)"
>
<el-button slot="reference" type="danger" round size="small">删除el-button>
el-popconfirm>
template>
el-table-column>
handleRemove(row){
this.$http.post("/user/delete",{id:row.id}).then(res=>{
if(res.data.success){
this.$message({message: '恭喜你,你已经成功的抛弃了他',type: 'success'});
}else{
this.$message.error('删除失败['+res.data.message+"]");
}
}).catch(error=>{
this.$message.error('删除失败['+error.message+"]");
})
}
user.js添加删除逻辑
Mock.mock(new RegExp('/user/delete'), 'post', (opts) => {
console.log(opts);
//返回删除结果
return {
'success': true,
'message': "删除成功"
}
})
<el-popconfirm
confirmButtonText='忍心抛弃'
cancelButtonText='再给一次机会'
icon="el-icon-info"
iconColor="red"
title="你确定要离我而去?"
@onConfirm="handleBatchRemove"
>
<el-button :disabled="batchRemoveDiabled" slot="reference"
type="danger" size="large" style="float: left;margin: 20px">批量删除el-button>
el-popconfirm>
//批量删除
handleBatchRemove(){
//把对象数组转成 id数组
let ids = this.selectedRows.map(function (obj,index,arr) {
return obj.id;
});
this.$http.post("/user/batchDelete",ids).then(res=>{
if(res.data.success){
this.$message({message: '恭喜你,你已经成功的抛弃了他们',type: 'success'});
}else{
this.$message.error('删除失败['+res.data.message+"]");
}
}).catch(error=>{
this.$message.error('删除失败['+error.message+"]");
})
},
user.js添加删除逻辑
Mock.mock(new RegExp('/user/batchDelete'), 'post', (opts) => {
console.log(opts);
//返回删除结果
return {
'success': true,
'message': "删除成功"
}
})
<el-col :span="24" class="toolbar">
<el-form :inline="true" :model="queryParam" class="demo-form-inline" style="float: left;margin-left: 20px">
<el-form-item label="用户名">
<el-input v-model="queryParam.username" placeholder="用户名">el-input>
el-form-item>
<el-form-item label="注册时间">
<el-date-picker
v-model="queryParam.registerDate"
type="date"
placeholder="选择日期">
el-date-picker>
el-form-item>
<el-form-item>
<el-button type="primary" @click="loadListData">查询el-button>
el-form-item>
el-form>
el-col>
data() {
return {
queryParam:{
username:'',
registerDate:'',
},
...
直接调用列表的查询方法,添加查询条件作为参数即可
<el-dialog title="新增用户" ref="addForm" :visible.sync="dialogFormVisible" >
<el-form :model="addForm" label-width="50px" >
<el-form-item label="姓名" >
<el-input v-model="addForm.name" autocomplete="off" >el-input>
el-form-item>
<el-form-item label="电话" >
<el-input v-model="addForm.phone" autocomplete="off">el-input>
el-form-item>
el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消el-button>
<el-button type="primary" @click="handlerAddSubmit">确 定el-button>
div>
el-dialog>
新增按钮
<el-button type="success" @click="handleShowAddDialog()">新增el-button>
编辑按钮
<el-button @click="handleShowEditDialog(scope.row)" type="primary" round size="small">编辑el-button>
return {
dialogFormVisible:false,
addForm:{
name:'',
phone:''
},
...
//编辑显示弹窗
handleShowEditDialog(row){
//数据回显
this.addForm = row;
this.dialogFormVisible=true
},
//显示添加弹窗
handleShowAddDialog(){
this.addForm.name = '';
this.addForm.phone = '';
this.dialogFormVisible=true
},
Mock.mock(new RegExp('/user/saveOrUpdate'), 'post', (opts) => {
console.log(opts);
//返回结果
return {
'success': true,
'message': ""
}
})