Ajax--用于异步调用JavaScript与HTML
Ajax仅当了解
作用:
- 对服务器进行收发数据。
- 在不刷新页面的前提下,实现【1】、并能使得部分的页面更新(热更新)。
同步与异步的区分:
同步:浏览器发送请求到服务器时,服务器发送响应信息需要时间,这时候的浏览器只能干等,不能进行操作。
异步:浏览器发送请求到服务器时,服务器发送响应信息需要的时间被利用起来,可以在浏览器中进行操作。
现今大环境对Ajax的使用情况:基本不用。被下面要介绍的Axios所代替。
Axios--用于异步调用JavaScript与HTML
地位:是Ajax的替代品。现在多数企业使用该技术来完成项目的制作。
来由:两者底层实现差不多,但Axios的调用比Ajax方便。
使用:其使用放到下面实际开发时讲,使用过程并不复杂。
前后端分离的历史与使用的技术
早期开发模式:
早期的开发模式中,前后端混合在一起开发,开发人员要开发一个项目,他既需要使用前端的技术站来开发前端的功能,又需要使用Java的技术栈来编写后端的功能实现,还需要操作。
这时候前后端的代码都写在一个工程中。这种开发模式要求后端开发人员既需要熟悉前端开发的技术栈,也需要熟悉服务器端开发的技术栈。
主要会存在以下几个问题:
- 沟通成本高
- 分工不明确
- 项目不便于管理
- 项目不便于维护与拓展
主流的开发模式:
前后端分离。我们会讲一个项目拆成两个部分,一个为前端工程,一个为后端工程。前后端有各自不同的开发人员进行开发。最后开发好的前后端程序进行交互。
接口文档:
在前后端分离的开发模式当中,前端程序和后端程序都是由独立的团队进行开发的。前后端程序要想最终能够正常的交互对接起来,他们在进行开发的时候,就必须要遵守某种开发规范,这个规范是定义在文档中的,这个文档就叫做接口文档。这里的接口指的是一个业务功能。
文档里面会描述一些详细信息,比如接口的请求路径,请求方式,接口的基本描述信息等。
在描述信息下面会有一个接口响应数据。即,向服务器发送请求,服务器给我返回来的数据,这个数据一般是json格式。
如果前后端开发工程师都严格遵循同一份接口文档,最终开发的前后端工程是可以无缝集成在一起的。
接口文档的维护:
维护分为在线和离线,在线就是通过一些接口文档管理平台进行维护,离线就是用markdown、Excel等软件写这个文档。
谁写? 产品经理
怎么写? 通过页面原型以及需求文档分析得来
Elink Apikit接口文档维护平台
在本章中,我将使用这个平台来对前端进行数据测试。
下面是操作演示截图:
前端环境搭建
一个大型的项目,如果每一次开发一个功能都是从零开始,将需要投入大量的时间和精力,但是这样的投入是不太值得的。故在现在的前端开发当中,都讲究前端开发的模块化、组件化、规范化和自动化。
使用前端工程化后,我们会使用一些工具来提高工作效率,降低工作时间。
需要用到的环境:
- vue的脚手架 -- 用于快速生成一个工程化的项目模板,我们就在这个模板上进行开发。
- node.js vue的脚手架的运行需要这个环境 推荐安装16.17.1
- vue.cla
Vue项目
创建项目脚手架:
命令行: 输入vue ui,进入浏览器,按下面进行操作
当命令行最后一行看到有project created,项目就创建完成了。
vue的目录结构:
下面就开始让vue第一次跑起来。跑起来的方式有两种,一种是npm的脚本,
按一下就能开始启动。
vue文件的内部代码结构解释:
vue项目的开发流程:
修改vue的项目端口:
在vue.config.js中,加入
安装ElementUI
现在真正的开发大多不会使用原生开发,而是使用ElementUI。故我们的学习重点会放在ElementUI上。推荐版本号与图片的一样。
安装步骤:
下面这三行可以去官网复制。
Element入门
Element是饿了么外卖平台团队研发的。等一下写完就点份外卖,饿死我了。
首先它是基于Vue框架的,是一套组件。什么是组件呢?
组件就是组成网页的各个部件,比如超链接,图片,按钮等。
就比如。原生的button比较原生,而Element的Button直接拿来用就已经比较好看了。
项目:卡特琳娜员工管理系统
效果图:
DeptVue模块的代码:
<template>
<el-container style="height: 900px; border: 1px solid #eee">
<el-header style="font-size: 40px; background-color: rgb(238, 241, 246)">Katarina员工系统</el-header>
<el-container>
<el-aside width="210px" 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 index="1-1">
<router-link to="/emp">员工管理</router-link>
</el-menu-item>
<el-menu-item index="1-2">
<router-link to="/dept">部门管理</router-link>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<el-main>
<el-table :data="deptData" border style="width: 100%">
<el-table-column fixed prop="name" label="名称" width="150"></el-table-column>
<el-table-column fixed prop="updatetime" label="最后操作时间" width="280"></el-table-column>
<el-table-column label="操作" width="700">
<el-button type="primary" size="small">编辑</el-button>
<el-button type="danger" size="small">删除</el-button>
</el-table-column>
</el-table>
</el-main>
</el-container>
</el-container>
</template>
<script>
import axios from 'axios'
export default {
components: {},
data() {
return {
deptData: []
}
},
mounted() {
axios.get("https://result.eolink.com/zYisy7Y6950de7e106fe3806aa8351852f3b8ea5355e118?uri=/dept/getDeptInfo").then(res => {
this.deptData = res.data.data;
})
},
methods: {},
}
</script>
<style>
</style>
ElpVue模块代码:
<template>
<div>
<el-container style="height: 900px; border: 1px solid #eee">
<el-header style="font-size: 40px; background-color: rgb(238, 241, 246)">Katarina员工系统</el-header>
<el-container>
<el-aside width="210px" 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 index="1-1">
<router-link to="/emp">员工管理</router-link>
</el-menu-item>
<el-menu-item index="1-2">
<router-link to="/dept">部门管理</router-link>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<el-main>
<!-- form -->
<el-form :inline="true" :model="serachForm" class="demo-form-inline">
<el-form-item label="姓名">
<el-input v-model="serachForm.name" placeholder="请输入员工姓名"></el-input>
</el-form-item>
<el-form-item label="性别">
<el-select v-model="serachForm.gender" placeholder="请选择">
<el-option label="男" value="1"></el-option>
<el-option label="女" value="0"></el-option>
</el-select>
</el-form-item>
<el-date-picker v-model="serachForm.entrydate" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
</el-date-picker>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
</el-form>
<!-- table -->
<el-table :data="tableData" border>
<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" style="width: 100px; 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="180"></el-table-column>
<el-table-column prop="entrydate" label="入职日期" width="180"></el-table-column>
<el-table-column prop="updatetime" label="最后操作时间" width="240"></el-table-column>
<el-table-column label="操作" width="180">
<el-button type="primary" size="mini">编辑</el-button>
<el-button type="danger" size="mini">删除</el-button>
</el-table-column>
</el-table>
<br>
<!-- pagination -->
<el-pagination @size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="currentPage3"
:page-size="100" layout="prev, pager, next, jumper" :total="1000">
</el-pagination>
</el-main>
</el-container>
</el-container>
</div>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
tableData: [],
serachForm: {
name: "",
image: "",
gender: "",
job: "",
entrydate: [],
updatetime: "",
}
}
},
methods: {
onSubmit() {
this.$message({
message: '提交成功',
type: 'success'
});
},
handleSizeChange(val) {
this.$message(`每页 ${val} 条`);
},
handleCurrentChange(val) {
this.$message(`当前页: ${val}`);
}
},
mounted(){
axios.get("https://result.eolink.com/zYisy7Y6950de7e106fe3806aa8351852f3b8ea5355e118?uri=/emp/getEmpInfo").then(res => {
this.tableData = res.data.data;
})
},
};
</script>
<style></style>
其中的重点是Router路由。
这里重点讲讲:
首先要去route文件夹下的index.js 添加对应的路由。
const routes = [
{
path:'/dept',
name:'dept',
component:()=>import('../views/katarina/DeptView.vue')
},
{
path: '/emp',
name: 'employee',
component: EmpView
},
{
path: '/',
redirect: '/dept'
},
]
这里我用了两种方式添加,第二个对象如果大家上面没有import对应路径的话(代码里面没有写出来我说的这个import),直接学着第一个对象这样加就不用在上面import了。第三个对象是项目重启进去页面会在/下,这个是让他重定向跳到/dept路由下面。
第二步要改App.vue
不改的话这个页面跳转后,不会刷新。
第三步改对应模块的路由部分,我上面给出来了,这里画一下。
其实就是最后的使用路由了。
最后讲一下nginx。
打包部署
打包和部署是分开的,打包很简单。如图:
点一下,就会生成一个文件夹,这个文件夹中帮我们把这个项目都给包装了,让我们好带走使用。
说到带走使用,我想到食用,现在晚上11点了,饿了,但没关系,快写完了。
生成的文件:
带走使用?用到哪去呢?我们现在开这个网页要在vscode中开服务才能打开,我们总不能让用户也在vscode开网页把?所以打包是为了部署到服务器上,让用户输入正确的网址就能访问我们的网页。
nginx
用于部署前端工程,是现在很多公司都在用的主流部署工具。
部署完能干嘛?
不开Vscode就能进入网页,但要开着nginx。
看我上面的项目结果图,输入网址就能进。
下载:去官网下载
照着下,不要换版本。
运行可能会出问题,一般是端口被占用了,它默认端口是80. 就需要改一下端口。
怎么改?
本章完结。