Ajax
介绍
概念: Asynchronous JavaScript And XML, 异步的JavaScript和XML
作用:
- 数据交换: 通过Ajax可以给服务器发送请求, 并获取服务器响应的数据
- 异步交互: 可以在不重新加载整个页面的情况下, 与服务器交换数据并更新部分网页的技术, 如: 搜索联想, 用户名是否可用的校验等等
同步与异步
</head> <body> <div id="demo"> <h2>让 AJAX 更改这段文本</h2> <button type="button" onclick="loadDoc()">更改文本</button> </div> </body> <script> function loadDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("demo").innerHTML = this.responseText; } }; xhttp.open("GET", "http://yapi.smart-xwork.cn/mock/169327/emp/list", true); xhttp.send(); } </script> </html>
Axios
介绍: Axios对原生的Ajax进行了封装, 简化书写, 快速开发
入门:
- 引入Axios的js文件
- shiyongAxios发送请求, 并获取响应结果
请求方式别名:(推荐简化)
-
axios.get(url[, config])
-
axios.delete(url[, config])
-
axios.post(url[, data[, config]])
-
axios.put(url[, data[,config]])
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Axios</title> <script src="js/axios.js"></script> </head> <body> <input type="button" value="获取数据Get" onclick="get()"> <input type="button" value="删除数据post" onclick="post()"> </body> <script> function get(){ /* //通过axios发送异步请求 axios({ method: "get", url:"http://yapi.smart-xwork.cn/mock/169327/emp/list" }).then(result =>{ console.log(result.data); }) */ //简化 axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then(result=>{ console.log(result.data); }) } function post(){ /* //通过axios发送异步请求 axios({ method: "post", url:"http://yapi.smart-xwork.cn/mock/169327/emp/deleteById", data: "id=1" }).then(result =>{ console.log(result.data); }) */ //简化 axios.post("http://yapi.smart-xwork.cn/mock/169327/emp/deleteById","id=1").then(result=>{ console.log(result.data); }) } </script> </html>
案例
基于Vue及Axios完成数据的动态加载展示
- 数据准备的url: http://yapi.smart-xwork.cn/mock/169327/emp/list
- 在页面加载完成后, 自动发送异步请求, 加载数据, 渲染展示页面(性别: 1 代表男, 2 代表女)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>案例</title> <script src="js/vue.js"></script> <script src="js/axios.js"></script> </head> <body> <div id="app" align="center"> <table cellspacing="0px" width="60%" border="1px"> <tr align="center"> <th>编号</th> <th>姓名</th> <th>图像</th> <th>性别</th> <th>职位</th> <th>入职日期</th> <th>最后操作事件</th> </tr> <tr align="center" v-for="emp in emps"> <td>{{emp.id}}</td> <td>{{emp.name}}</td> <td><img v-bind:src="emp.image" width="70px" height="50px"></td> <td ><span v-if="emp.gender==1">男</span><span v-if="emp.gender==2">女</span></td> <td>{{emp.job}}</td> <td>{{emp.entrydate}}</td> <td>{{emp.updatetime}}</td> </tr> </table> </div> </body> <script> new Vue({ el: app, data: { emps:[] }, mounted() { //发送异步请求 axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then(result=>{ this.emps=result.data.data; }) }, }) </script> </html>
前端工程化
介绍
前后端混合开发,:
- 沟通成本高, 分工不明确, 项目不便管理, 不便维护扩展
前后端分离开发
-
当前最为主流的开发模式: 前后端分离, 通过接口文档
-
开发流程:
- 需求分析
- 接口定义(API接口文档)
- 前后端并行开发(遵守规范)
- 测试(前端 后端)
- 前后端联调测试
YApi
介绍: YApi是高效, 易用, 功能强大的api管理平台, 旨在为开发, 产品, 测试人员提供更优雅的接口管理服务
地址: http://yapi.smart-xwork.cn/
使用步骤:
- 添加项目
- 添加分类
- 添加接口
环境准备
前端工程化: 是指在企业级的前端项目开发中, 把前端开发所需的工具, 技术, 流程, 经验等进行规范化, 标准化
vue-cli
介绍: Vue-cli 是官方提供的一个脚手架, 用于快速生成一个Vue的项目模板
Vue-cli提供了如下功能:
- 统一的目录结构
- 本地测试
- 热部署
- 单元测试
- 集成打包上线
依赖环境: NodeJS
安装教程: 黑马程序员p37
Vue项目简介
创建
- 命令行: vue create vue-project01
- 图形化界面: vue ui
目录结构:
- 基于Vue脚手架创建出来的工程, 有标准的目录结构
node_nodules
: 整个项目的依赖包public
: 存放项目的静态文件src
: 存放项目的源代码assets
: 静态资源components
: 可重用的组件router
: 路由配置views
: 视图组件(页面)App.vue
: 入口页面(根组件)main.js
: 入口js文件
package.json
: 模块的基本信息, 项目开发所需要的模块, 版本信息vue.config.js
: 保存vue配置的文件, 如: 代理, 端口的配置等
启动
方式一: 以图形化界面的形式启动
方式二: 在项目目录下以命令行npm run serve
启动
打开NPM脚本参考这篇博客
Vue项目开发流程
Vue的组件文件以 .vue结尾, 每个组件由三个部分组成, <template>
<script>
<style>
<template>
: 模板部分, 由它生成HTML代码<script>
: 控制模板的数据来源和行为<style>
: css样式部分
<template> <div > <h1>{{ message }}</h1> </div> </template> <script> export default { data(){ return { message: "Hello vue" } }, methods: { } } </script> <style> </style>
Element
简介
Element: 是饿了么团队研发的, 一套为开发者,设计师和产品经理准备的基于Vue2.0的桌面端组件库
组件: 组成网页的部件, 例如: 超链接, 按钮, 图片, 表格, 表单, 分页条等等
官网: https://element.eleme.cn/#/zh-CHListener
快速入门
- 安装Element组件库(在当前工程的目录下), 在命令行执行命令
npm install element-ui@2.15.3
- 引入ElementUI组件库
import Element from 'element-ui'; import 'element-ui/theme-chalk/index.css'; Vue.use(ElementUI);
-
在src下新建element文件夹用来存放element组件
-
访问官网, 复制组件代码, 调整
<template> <el-row> <el-button>默认按钮</el-button> <el-button type="primary">主要按钮</el-button> <el-button type="success">成功按钮</el-button> <el-button type="info">信息按钮</el-button> <el-button type="warning">警告按钮</el-button> <el-button type="danger">危险按钮</el-button> </el-row> </template> <script> export default { } </script> <style> </style>
- 在app.vue中引用element
<template> <div > <element-view></element-view> </div> </template> <script> import ElementView from './views/element/ElementView.vue' export default { components: { ElementView }, } </script> <style> </style>
记得安装 Vscode-element-helper
和 element-ui-helper
插件, 要不然可能不会自动补全, 在<element-vue>
标签自动补全要加左尖括号
常见组件
-
Table 表格: 用于展示多条结构类似的数据, 可对数据进行排序, 筛选, 对比或其他自定义操作
-
Pagination 分页: 当数据量过多时, 使用分页分解数据
这里我出现了一个错误, 当在<template>
标签中同时加入以上两个组件时报错
- Dialog对话框: 在保留当前页面状态的情况下, 告知用户并承载相关操作
这里按下第二次时会报错: ResizeObserver loop limit exceeded at eval (webpack-internal:///./node_modules/webpack-dev-server/client/overlay.js:296:58)
- form 表单: 由输入框, 选择器, 多选框, 等控件组成, 用以收集, 校验, 提交数据
<template> <div> <!-- table --> <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> <br /> <!-- pagination分页 --> <el-pagination background layout="sizes, prev, pager, next, jumper, total" @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="1000" > </el-pagination> <br /> <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> <br /> <el-button type="text" @click="dialogFormVisible = true" >打开嵌套表单的 Dialog</el-button > <el-dialog title="收货地址" :visible.sync="dialogFormVisible"> <el-form ref="form" :model="form" label-width="80px" vis> <el-form-item label="活动名称"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="活动区域"> <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-item label="活动时间"> <el-col :span="11"> <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%" ></el-date-picker> </el-col> <el-col class="line" :span="2">-</el-col> <el-col :span="11"> <el-time-picker placeholder="选择时间" v-model="form.date2" style="width: 100%" ></el-time-picker> </el-col> </el-form-item> <el-button type="primary" @click="onSubmit">立即创建</el-button> <el-button>取消</el-button> </el-form> </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 弄", }, ], form: { name: "", region: "", date1: "", date2: "", delivery: false, type: [], resource: "", desc: "", }, dialogFormVisible: false, dialogTableVisible: false, 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: { handleSizeChange: function (val) { alert("每页记录发生变化" + val + "条"); }, handleCurrentChange: function (val) { alert("页码发生变化" + val + "页"); }, onSubmit() { alert(JSON.stringify(this.form)); }, }, }; </script> <style> </style>
案例
<template> <div> <br> <el-container style="height: 1000px; border: 1px solid #eee"> <el-header style="font-size: 40px; background-color: aqua">智能辅助系统</el-header> <br> <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> <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.enterdata" type="datetimerange" :picker-options="pickerOptions" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" align="right"> </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" border> <el-table-column prop="name" label="姓名" width="140"> </el-table-column> <el-table-column prop="img" label="图像" width="180"> <template slot-scope="scope"> <!-- 动态展示 --> <img :src="scope.row.image" width="150" height="100"> </template> </el-table-column> <el-table-column label="性别" width="120"> <template slot-scope="scope"> {{ scope.row.gender == 1 ? "男" : "女" }} </template> </el-table-column> <el-table-column prop="job" label="职位" width="120"> </el-table-column> <el-table-column prop="entrydate" label="入职日期" width="180"> </el-table-column> <el-table-column prop="updatetime" label="最后操作时间" width="200"> </el-table-column> <el-table-column prop="address" label="操作"> <el-button type="primary" size="mini">编辑</el-button> <el-button type="danger" size="mini">删除</el-button> </el-table-column> </el-table> <!-- 分页 --> <el-pagination background layout="sizes, prev, pager, next, jumper, total" @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: "", enterdata: [] } } }, methods: { onSubmit: function () { alert("查询数据"); }, handleSizeChange: function (val) { alert("每页记录发生变化" + val + "条"); }, handleCurrentChange: function (val) { alert("页码发生变化" + val + "页"); }, }, mounted (){ axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then(result=>{ this.tableData = result.data.data; }); } } </script> <style></style>
Axios在项目目录下使用npm install axios
安装, 然后在使用的页面引用import axios from "axios"
, 然后在钩子方法`mounted()中使用
Vue路由
简介
前端路由: URL中的hash(#号)与组件之间的对应关系
Vue Router
介绍: Vue Router是Vue的官方路由
组成:
- VueRouter: 路由器类, 根据路由请求在路由视图中动态渲染选中的组件
<router>
: 请求链接组件, 浏览器会解析成<a>
<router-view>
: 动态视图组件, 用来渲染展示与路由路径对应的组件
安装(创建Vue项目时已选择):
npm install vue-router@3.5.1
定义路由:
-
需要在router文件夹下的index.js文件夹下定义
-
在想要跳转的地方进行修改:
<el-menu-item index="1-1"><router-link to="/home">部门管理</router-link></el-menu-item> <el-menu-item index="1-2"><router-link to="/emp">员工管理</router-link></el-menu-item> -
在App.vue中让路由视图动态展示
<router-view></router-view>
打包部署
打包
在NPM脚本下运行build vue-cli-service build
选项
部署
Nginx
简介: Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器, 其特点是占有内存少, 并发能力强, 在各大型互联网公司都有非常广泛的使用
安装:
conf
: 配置文件目录
html
: 静态资源目录
logs
: 日志文件目录
temp
: 临时文件目录
部署
将打包好的dist目录下的文件, 复制到nginx安装目录的html目录下, 启动双击nginx.exe文件, Nginx服务器默认占用80端口号
注意: 如果80端口号被占用, 可以在nginx.conf中修改端口号
cmd中查询端口号指令为netstat -ano | findStr 80
访问: http://locahost:设置的端口号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现