文章目录
Ajax与Vue
Ajax概念与作用
Ajax:
- 概念:Asynchronous Javascript And XML,异步的JavaScript和XML
- 作用:
- 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据.
- 异步交换:可以在不重新加载整个页面 的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想,用户名是否可用的校验等等.
原生Ajax
- 准备数据地址
- 创建XMLHttpRequest对象:用于和服务器交换数据
- 向服务器发送请求
- 获取服务器响应数据
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
<script src="js/axios-0.18.0.js"></script>
</head>
<body>
<input type="button" value="获取数据">
<div id="div1"></div>
</body>
<script>
function getData(){
//创建 XMLHttpRequest
var xmlHttpRequest = new XMLHttpRequest();
//发送异步请求
xmlHttpRequest.open('GET',http://yapi.smart-xwork.cn/mock/169327/emp/list);
xmlHttpRequest.send(); //发送请求
//获取服务端响应数据
xmlHttpRequest.onreadystatechange = function(){
if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){
document.getElementById('div1').innerHTML = xmlHttpRequest.responseText;
}
}
}
</script>
</html>
Axios
- 介绍:Axios对原生的Ajax进行了封装,简化了书写,快速开发
Axios入门
-
引入Axios的js文件
html<script src="js/axios-0.18.0.js"></script>
-
使用Axios发送请求,并获取响应结果
html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Ajax-Axios</title> <script src="js/axios-0.18.0.js"></script> </head> <body> <input type="button" value="获取数据GET" onclick="get()"> <input type="button" value="删除数据POST" onclick="post()"> </body> <script> function get(){ //通过axios发送异步请求get axios({ method:"get", url:"http://ajax-api.itheima.net/api/province" }).then(result => ( console.log(result.data), alert(result.data) )) } function post(){ //通过axios发送异步请求-post axios({ method:"post", url:"http://ajax-api.itheima.net/api/login", data:{ username:"admin", password:"111" } }).then(result=>{ console.log(result.data) }) } </script> </html>
-
Axios请求方式别名
- axios.get(url,[,config])
- axios.delete(url,[,config])
- axios.post(url,[,config])
- axios.put(url,[,config])
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajax-Axios</title>
<script src="js/axios-0.18.0.js"></script>
</head>
<body>
<input type="button" value="获取数据GET" onclick="get()">
<input type="button" value="删除数据POST" onclick="post()">
</body>
<script>
function get(){
//通过axios发送异步请求get
/* axios({
method:"get",
url:"http://ajax-api.itheima.net/api/province"
}).then(result => (
console.log(result.data),
alert(result.data)
)) */
axios.get("http://ajax-api.itheima.net/api/province").then(result=>{
console.log(result.data);
})
}
function post(){
//通过axios发送异步请求-post
/* axios({
method:"post",
url:"http://ajax-api.itheima.net/api/login",
data:{
username:"admin",
password:"111"
}
}).then(result=>{
console.log(result.data)
}) */
axios.post("url","id = 1").then(result=>{
console.log(result.data);
})
}
</script>
</html>
案例
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/axios-0.18.0.js"></script>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<table border="1" cellspacing="0" width="60%">
<tr>
<th>id</th>
<th>作者</th>
<th>书名</th>
<th>出版社</th>
</tr>
<tr v-for="(emp, index) in emps">
<td>{{index+1}}</td>
<td>{{emp.author}}</td>
<td>{{emp.bookname}}</td>
<td>{{emp.publisher}}</td>
</tr>
</table>
</div>
</body>
<script>
new Vue({
el:"#app",
data:{
emps:[]
},
mounted() {
axios({
method:"get",
url:"http://ajax-api.itheima.net/api/books"
}).then(result=>(
this.emps = result.data.data
))
},
})
</script>
</html>
前后端分离开发
介绍
需求分析---> 接口定义(API接口文档)--->前后端并行开发(遵守规范)--->测试(前端,后端)--->前后端联调测试
YAPI
- 介绍:YApi是高效、易用、功能强大的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务.
- 添加项目
- 添加分类
- 添加接口
前端工程化
模块化 组件化 规范化 自动化
前端工程化:在企业级的前端项目开发中,把前端开发所需要的工具、技术、流程、经验等进行规范化、标准化.
环境准备
Vue-cli
- 介绍:Vue-cli是Vue官方提供的一个脚手架,用于快速生成一个Vue的项目模板
- Vue-cli提供了如下功能:
- 统一的目录结构
- 本地调试
- 热部署
- 单元测试
- 集成打包上线
- 依赖环境:NodeJS
Vue项目简介
Vue项目-创建
- 使用命令行创建 :
vue create vue-project01
- 图形化界面:
vue ui
Vue项目-目录结构
- 基于Vue脚手架创建出来的工程,有标准的目录结构
- node_moudules整个项目的依赖包
- public 存放项目的静态文件
- src 存放项目的源代码
- assets 静态资源
- components 可重用的组件
- router 路由配置
- views 视图组件(页面)
- App.vue 入口页面(根组件)
- main.js 入口js文件
- package.json 模块基本信息,项目开发所需要模块,版本信息
- vue.config.js 保存vue配置的文件 如,代理,端口的配置等
Vue项目-配置端口
javascript
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true
deServer:{
port:7000,
}
})
Vue项目开发流程
- 根组件: 以.vue结尾的文件
html
<template>
//模板部分,由它生成HTML代码
</template>
<script>
//控制模板的数据来源和行为
</script>
<style>
//控制css样式
</style>
Vue组件库Element
- Element : 是饿了么团队研发,一套为开发者、设计者和铲平经理准备的基于Vue2.0的桌面端组件库
- 组件:组成网页的不见,例如,超链接、按钮、图片、表格、表单、分页条等等
快速入门
-
安装ElementUI组件库,(在当前的工程目录下),命令行执行指令
cmdnpm install element-ui@2.15.3
-
引入ElementUI组件库
javascriptimport ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI);
-
访问官网,组织组件代码,调正。
常见组件
- Table表格:用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。
html
<template>
<div>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="date" label="日期" width="180"> </el-table-column>
<el-table-column prop="name" label="姓名" width="180"> </el-table-column>
<el-table-column prop="address" label="地址"> </el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}]
}
}
};
</script>
<style></style>
- 常见组件-分页
Pagination分页:当数据量过多时,使用分页分解数据。
html
<template>
<div>
<el-pagination background layout="total,sizes,prev,prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="1000">
</el-pagination>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
date: "2016-05-02",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "2016-05-04",
name: "王小虎",
address: "上海市普陀区金沙江路 1517 弄",
},
{
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
},
{
date: "2016-05-03",
name: "王小虎",
address: "上海市普陀区金沙江路 1516 弄",
},
],
};
},
methods: {
handleCurrentChange:function(val){
alert("页码变化为:"+val);
},
handleSizeChange:function(val){
alert("每页记录数变化为:"+val)
}
},
};
</script>
<style></style>
- 常见组件-对话框
Dialog对话框:在保留当前页面状态的情况下,告知用户并承载相关操作。
html
<template>
<div>
<!-- <el-pagination background layout="total,sizes,prev,prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="1000">
</el-pagination> -->
<!-- Table -->
<!-- Table -->
<el-button type="text" @click="dialogTableVisible = true"
>打开嵌套表格的 Dialog</el-button
>
<el-dialog title="收货地址" :visible.sync="dialogTableVisible">
<el-table :data="gridData">
<el-table-column
property="date"
label="日期"
width="150"
></el-table-column>
<el-table-column
property="name"
label="姓名"
width="200"
></el-table-column>
<el-table-column property="address" label="地址"></el-table-column>
</el-table>
</el-dialog>
<!-- Form -->
<el-button type="text" @click="dialogFormVisible = true"
>打开嵌套表单的 Dialog</el-button
>
<el-dialog title="收货地址" :visible.sync="dialogFormVisible">
<el-form :model="form">
<el-form-item label="活动名称" :label-width="formLabelWidth">
<el-input v-model="form.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="活动区域" :label-width="formLabelWidth">
<el-select v-model="form.region" placeholder="请选择活动区域">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="dialogFormVisible = false"
>确 定</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
gridData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}],
dialogTableVisible: false,
dialogFormVisible: false,
form: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: ''
},
formLabelWidth: '120px'
};
}
};
</script>
<style></style>
- 常见组件-From表单
html
<template>
<div>
<!-- Table -->
<el-button type="text" @click="dialogFormVisible = true">打开嵌套表格的 Dialog</el-button>
<el-dialog title="From表单" :visible.sync="dialogFormVisible">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="审批人">
<el-input v-model="formInline.user" placeholder="审批人"></el-input>
</el-form-item>
<el-form-item label="活动区域">
<el-select v-model="formInline.region" placeholder="活动区域">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
</el-form>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
formInline: {
user: '',
region: ''
},
dialogFormVisible: false,
}
},
methods: {
onSubmit() {
alert(JSON.stringify(this.formInline))
}
}
}
</script>
<style></style>
案例
根据页面原型完成员工管理页面开发,并通过Axios完成数据异步加载
步骤:
- 创建页面,完成页面的整体布局规划
- 布局中每个部分的组件实现
- 列表数据的异步加载,并渲染展示
Vue项目中使用Axios:
- 在项目目录下安装axios: npm install axios;
- 需要使用axios时,导入axios: import axios from 'axios';
html
<template>
<div>
<el-container style="height: 700px; border: 1px solid #eee">
<el-header style="font-size:40px; background-color: rgb(238, 241, 246);">tlias智能学习辅助系统</el-header>
<el-container >
<el-aside width="230px" style=" border: 1px solid #eee">
<el-menu :default-openeds="['1', '3']">
<el-submenu index="1">
<template slot="title"><i class="el-icon-message"></i>系统信息管理</template>
<el-menu-item-group>
<template slot="title">分组一</template>
<el-menu-item index="1-1">部门管理</el-menu-item>
<el-menu-item index="1-2">员工管理</el-menu-item>
</el-menu-item-group>
</el-submenu>
</el-menu>
</el-aside>
<el-main>
<!-- 表单 -->
<el-form :inline="true" :model="searchForm" class="demo-form-inline">
<el-form-item label="姓名">
<el-input v-model="searchForm.name" placeholder="姓名"></el-input>
</el-form-item>
<el-form-item label="性别">
<el-select v-model="searchForm.gender" placeholder="性别">
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="入职日期">
<!-- 日期选择器 -->
<el-date-picker v-model="searchForm.entryDate" type="daterange" range-separator="至"
start-placeholder="开始日期" end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
</el-form>
<!-- 表格 -->
<el-table :data="tableData">
<el-table-column prop="name" label="姓名" width="180"></el-table-column>
<el-table-column label="图像" width="180">
<template slot-scope="scope">
<img :src = "scope.row.image" width="70px" height="100px" >
</template>
</el-table-column>
<el-table-column label="性别" width="140">
<template slot-scope="scope">
{{ scope.row.gender ==1? '男':'女' }}
</template>
</el-table-column>
<el-table-column prop="job" label="职位" width="140"></el-table-column>
<el-table-column prop="entrydate" label="入职日期" width="180"></el-table-column>
<el-table-column prop="updatetime" label="最后操作时间" width="230"></el-table-column>
<el-table-column label="操作">
<el-button type="primary" size="mini">编辑</el-button>
<el-button type="danger" size="mini">删除</el-button>
</el-table-column>
</el-table>
<br>
<br>
<br>
<!-- 分页条 -->
<el-pagination background layout="total,sizes,prev,prev, pager, next"
@size-change="handleSizeChange" @current-change="handleCurrentChange" :total="1000">
</el-pagination>
</el-main>
</el-container>
</el-container>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
tableData: [],
searchForm: {
name: "",
gender: "",
entryDate: [],
}
}
},
methods: {
onSubmit() {
alert("查询数据");
},
handleCurrentChange: function (val) {
alert("页码变化为:" + val);
},
handleSizeChange: function (val) {
alert("每页记录数变化为:" + val)
},
},
mounted() {
//发送异步请求,获取数据
axios.get("https://mock.apifox.cn/m1/3128855-0-default/emp/list").then((result) => {
this.tableData = result.data.data;
})
},
}
</script>
<style></style>
Vue路由
前端路由:URL中的hash(#号)与组件之间的对应关系
Vue Router
-
介绍 : Vue Router 是 Vue 的官方路由
-
组成
- VueRouter : 路由器类,根据路由请求在路由视图中动态渲染选中的组件。
<router-link>
: 请求链接组件,浏览器会解析成<a>
。<router-view>
: 动态试图组件,用来渲染展示与路由路径对应的组件。
-
安装(创建Vue项目时选择路由功能自动安装)
htmlnpm install vue-router@3.5.1
-
定义路由
在router/index.js路径下
打包部署
打包: 使用npm脚本 build
部署:Nginx
- 介绍: Nginx 是一款轻量级的Web服务器\反向代理服务器及电子邮件(IMAP/POP3) 代理服务器。其特点是占用内存少,并发能力强,在各大型互联网公司都有非常广泛的使用。
- 部署: 将打包好的 dist 目录下的文件,复制到nginx 安装目录的 html 目录下。
Nginx默认占用80 端口号,如果80端口号被占用,可以在nginx.conf中修改端口号
使用cmd命令 `netstat -ano|findStr 80 可以查询哪个进程占用了80端口
在nginx根目录下调用cmd,输入nginx -s quit关闭
Nginx目录:
- conf 配置文件目录
- contrib
- docs
- html 静态资源文件目录
- logs 日志文件目录
- temp 临时文件目录
- nginx.exe