【Day 3】Ajax + Vue 项目、路由 + Nginx

news2024/11/18 9:07:15

1 Ajax

Asynchronous JavaScript And XML

异步的 JavaScript 和 XML

作用:

  • 数据交换

        通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据

  • 异步交互

        可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等

1.1 原生的异步请求

使用 XMLHttpRequest 进行异步请求:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <input type="button" value="get data" onclick="getData()">
    <div id="div1">

    </div>
</body>
<script>
    function getData() {
        // 第一步 创建 XMLHttpRequest
        var xmlHttpRequest = new XMLHttpRequest();

        // 第二步 发送异步请求
        xmlHttpRequest.open("GET", "https://mock.apifox.cn/m1/3128855-0-default/emp/list");
        xmlHttpRequest.send();

        xmlHttpRequest.onreadystatechange = function () {
            if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {
                document.getElementById("div1").innerHTML = xmlHttpRequest.responseText;
            }
        }

    }
</script>

</html>

 这是 HTML 自带的异步请求,比较繁琐

1.2 Axios

Axios 对原生的 Ajax 进行了封装,简化书写,快速开发

Axios 用法:

        1. 引入 Axios

<script src="js/axios-0.18.0.js"></script>

         2. 使用 Axios 发送请求,并获取响应结果

<!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>
</head>

<body>
    <input type="button" value="get data" onclick="getData()"><br><br>
    <input type="button" value="delete data" onclick="deleteData()">
</body>
<script>
    function getData() {
        axios({
            method: "get",
            url: "https://mock.apifox.cn/m1/3128855-0-default/emp/list",
        }).then(result => {
            console.log(result.data);
        })
    }

    function deleteData() {
        axios({
            method: "post",
            url: "https://mock.apifox.cn/m1/3128855-0-default/emp/deleteById",
            data: "id=1"
        }).then(result => {
            console.log(result.data);
        })
    }

</script>

</html>

这和原生方法是一致的

1.3 Axios 请求方式别名

  • axios.get(url[,config])
  • axios.delete(url[,config])
  • axios.post(url[,data[,config]])
  • axios.put(url[,data[,config]])

注:方括号为可选参数

这样可以对上面进行简化:

  • 发送 get 请求
axios.get("https://mock.apifox.cn/m1/3128855-0-default/emp/list").then((result)=>{
            console.log(result.data);
        })
  •  发送 post 请求
axios.post("https://mock.apifox.cn/m1/3128855-0-default/emp/deleteById","id=1").then((result)=>{
            console.log(result.data);
        })

2 案例一


 

<!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>
    <style>

        table{
            border-collapse: collapse;
            
        }
        th,td{
            border: 1px solid black;
            text-align: center;
        }
    </style>
</head>

<body>
    <table id="app">
        <tr>
            <th>id</th>
            <th>name</th>
            <th>img</th>
            <th>gender</th>
            <th>job</th>
            <th>entrydate</th>
            <th>updatetime</th>
        </tr>

        <tr v-for="(emp, index) in emps">
            <td>{{index+1}}</td>
            <td>{{emp.name}}</td>
            <td>
                <img v-bind:src="emp.image" width="30px" height="30px">
            </td>
            <td>
                <span v-if="gender == 1">male</span>
                <span v-else>female</span>
            </td>
            <td>{{emp.job}}</td>
            <td>{{emp.entrydate}}</td>
            <td>{{emp.updatetime}}</td>
        </tr>
    </table>
</body>
<script>
    new Vue({
        el: "#app",
        data: {
            emps: []
        },
        mounted() {
            // 发送异步请求,加载数据
            axios.get("https://mock.apifox.cn/m1/3128855-0-default/emp/list").then((result) => {
                this.emps = result.data.data;
            })
        },
    })
</script>

</html>

3 YAPI

接口管理平台

4 前端工程化

Vue-cli:Vue 官方提供的一个脚手架,用于快速生成一个 Vue 的项目模板

功能:

  • 统一的目录结构
  • 本地调试
  • 热部署
  • 单元测试
  • 继承打包上线

依赖环境:NodeJS

4.1 Vue 项目

在 cmd 中 vue ui,就在当前文件夹下创建了 vue project

vue项目的目录结构:

 Vue项目的启动:

运行:

Local 的 URL 打开是:

 而且在 APP.vue 中进行修改,保存之后,页面也会更改----->热部署

但是默认端口号是8080,与后面的 Tomcat 冲突,所以现在改变一下 Vue 的端口号:

在 config 下增加:

4.2 Vue 开发流程

注:

  1. .$mount '#app' 和 之前的 el 是等价的,都是挂载到 DOM 元素
  2. router:router,如果对象和对象值相同,则可以省略冒号和值
  3. h 是一个虚拟 DOM 元素

.vue 文件:

4.3 Vue 的 Element 组件库

Element 是基于 Vue 2.0 的桌面端组件

组件:组成网页的部件,例如 超链接、按钮、图片、表格、表单、分页条等

Element - The world's most popular Vue UI framework

注:安装时在当前目录下安装,右键-在集成终端打开,然后输入npm install ...

 

 还有很多组件都在官方文档

5 案例一

 EmpView.vue 文件

<template>
    <div>
        <el-container style="height: 500px; 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 index="1-1">部门管理</el-menu-item>
                            <el-menu-item index="1-2">员工管理</el-menu-item>
                        </el-submenu>
                    </el-menu>
                </el-aside>


                <el-main>
                    <!-- 表单 -->
                    <el-form :inline="true" :model="searchForm">
                        <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>
                            <el-button type="primary" @click="onSubmit">查询</el-button>
                        </el-form-item>

                        <el-form-item label="入职日期">
                            <div class="block">
                                <span class="demonstration">从</span>
                                <el-date-picker v-model="searchForm.entrydate" type="daterange" range-separator="至"
                                    start-placeholder="开始日期" end-placeholder="结束日期">
                                </el-date-picker>
                            </div>
                        </el-form-item>
                    </el-form>

                    <!-- 表格 -->
                    <el-table :data="tableData" border>
                        <el-table-column prop="name" label="姓名"></el-table-column>
                        <el-table-column prop="image" label="图像">
                            <template slot-scope="scope">
                                <img :src="scope.row.image" width="80px">
                            </template>
                        </el-table-column>
                        <el-table-column label="性别">
                            <template slot-scope="scope">
                                {{ scope.row.gender==1?"男":"女" }}
                            </template>
                        </el-table-column>
                        <el-table-column prop="position" label="职位"></el-table-column>
                        <el-table-column prop="entrydate" label="入职日期"></el-table-column>
                        <el-table-column prop="updatetime" label="最后操作时间"></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>
                    <!-- 分页条 -->
                    <el-pagination background layout="prev, pager, next" :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: function () {
            alert("submit");
        }
    },
    mounted() {
        axios.get("https://mock.apifox.cn/m1/3128855-0-default/emp/list").then((result) => {
            this.tableData = result.data.data;
        })
    }
}
</script>

<style></style>

现在不能页面跳转,只是静态页面,想要动态跳转---->路由

6 Vue 路由

前端路由: URL 中的 hash(#号)与组件之间的对应关系

点击一个按钮,直接在地址栏的URL改变

地址栏发生改变,路由自动更新显示与 URL 有关的组件

Vue Router

组件:

<router-link to="/..">

请求链接组件,浏览器会解析成 <a>

<router-view></router-view>

动态视图组件,用来渲染展示与路由路径对应的组件

6.1 配置路由

(在 views 里面又加了一个 vue 文件 DeptView.vue )

变成了:

然后在 APP.vue

注释掉不用的代码

使用 <router-view></router-view>

 

效果:(注意 URL 的变化)

点击部门管理:

 点击员工管理:

最后设置一个根路径,以便第一次进入的时候不会不显示

重定向( redirect )

7 打包部署

前后端项目需要分别在前后端服务器上部署,在此之前需要打包

7.1 打包

打包完成,出现 dist(distribution)文件夹

7.2 部署

        Nginx:是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,在各大型互联网公司都有非常广泛的使用

可以用 Nginx 做:部署静态资源反向代理实现负载均衡

下面以部署静态资源为例:

官网:nginx news

将打包好的 dist 目录下的文件,复制到 nginx 的 html 目录下

双击 nginx 可执行文件,Nginx 服务器占用 80 端口号

注意事项:Nginx 默认占用80端口号,如果80端口号被占用,可以在 nginx.conf 中修改端口号

部署完成后,在浏览器输入

localhost:80

出现:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaSE】浅谈Java异常

前言 本篇文章是对Java异常体系相关内容及部分注意事项的的讲解。 一. 认识异常 在每个人的生命历程中&#xff0c;或多或少都会遇到生病或受伤的情况&#xff0c;比如&#xff1a;皮肤擦伤、感冒、发烧、患上某些传染病等等。不管“病情”严重与否&#xff0c;这些都可以算…

java学习笔记1

1 初识java 1.1 jdk安装 1.1.1 下载jdk https://www.oracle.com/java/technologies/downloads/#java8-windows1.1.2 安装jdk jdk-8u361-windows-x64.exe安装到D:\Program Files\Java\jdk1.8.0_361安装jre,修改地址到D:\Program Files\Java\jre1.8.0_361jdk安装成功1.1.3 配置…

常见的七种排序

目录 一、插入排序 1、直接插入排序 2、希尔排序&#xff08;缩小增量排序&#xff09; 二、选择排序 3、直接选择排序 4、堆排序 三、交换排序 5、冒泡排序 6、快速排序 四、归并排序 7、归并排序 五、总结 一、插入排序 1、直接插入排序 思路&#xff1a; i 用来…

Python革命:如何利用AI数据分析引领人工智能的未来

在人工智能迅速发展的今天&#xff0c;Python语言已经成为了推动AI领域发展的一大利器。作为一种高级编程语言&#xff0c;Python以其简洁的语法和强大的功能&#xff0c;为AI数据分析提供了强有力的支持&#xff0c;帮助开启了人工智能的新时代。 Python的核心优势 Python的最…

NLP_知识图谱_三元组实战

文章目录 三元组含义如何构建知识图谱模型的整体结构基于transformers框架的三元组抽取baselinehow to use预训练模型下载地址训练数据下载地址 结构图代码及数据bertconfig.jsonvocab.txt datadev.jsonschemas.jsontrain.jsonvocab.json 与bert跟data同个目录model.pytrain.py…

Java——继承方式

在现实生活中&#xff0c;事物之间的关系是非常复杂&#xff0c;灵活多样&#xff0c;比如&#xff1a; 但在Java中只支持以下几种继承方式&#xff1a; 注意&#xff1a;Java中不支持多继承。 时刻牢记&#xff0c;我们写的类是现实事物的抽象。而我们真正在公司中所遇到的…

基于SpringBoot+Vue的外卖点餐网站 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;12张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue html 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&…

MATLAB设置变量

您可以通过简单的方式分配变量。例如&#xff0c; 示例 x 3 %定义x并用值初始化它 MATLAB将执行上述语句并返回以下结果- x 3 它创建一个名为x的1乘1矩阵&#xff0c;并将值3存储在其元素中。再举一个实例&#xff0c; 示例 x sqrt(16) %定义x并用表达式初始化它 MATLAB将…

Arduino UNO驱动MPR121接近电容式触摸传感器控制WS2812彩灯

简介 MPR121芯片功能强大可用作触摸,电容检测,驱动LED等等.在低速扫描下可以将功 耗降低到8μA,可以处理多达12个独立的触摸板。支持I2C,几乎可以用任何微控 制器连接。可以使用ADDR引脚选择4个地址中的一个,一个I2C2线总线上共有48 个电容触摸板。使用该芯片比使用模拟输入进行…

Tcpdump -r 解析pcap文件

当我们使用命令抓包后&#xff0c;想在命令行直接读取筛选怎么办&#xff1f;-r参数就支持了这个 当你使用 tcpdump 的 -r 选项读取一个之前捕获的数据包文件&#xff0c;并想要筛选指定 IP 地址和端口的包时&#xff0c;你可以在命令中直接加入过滤表达式。这些过滤表达式可以…

SpringMVC(三)【REST 风格】

1、REST 风格 1.1、REST 简介 REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表现形式状态转换 在开发中&#xff0c;它其实指的就是访问网络资源的格式 1.1.1、传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user…

吴恩达机器学习笔记 三十五 异常检测与监督学习

什么时候选择异常检测&#xff1f; 正样本 ( y 1 ) 的数量非常少 负样本 ( y 0 ) 的数量非常多 有很多不同的异常&#xff0c;现有的算法不能从正样本中得知什么是异常&#xff0c;或未来可能出现完全没见过的异常情况。 例如金融欺诈&#xff0c;隔几个月或几年就有新的…

智慧公厕是如何诞生的?

在城市化进程中&#xff0c;公共卫生设施的建设一直是重要议题之一。而随着科技的不断发展&#xff0c;智慧公厕作为一种创新的解决方案&#xff0c;逐渐成为了现代城市管理的亮点。那么&#xff0c;智慧公厕是如何产生的呢&#xff1f; 一、城市化进程的推动 城市人口的增加和…

vue elmentui 可编辑table 实现

废话不多说上图&#xff1a; 1.可编辑input 2.可编辑下来框 3.点击chechbox 4.可编辑radio 其实后面两种可以直接显示值 需要修改直接改就行 保持风格统一所以就做了点击之后出现修改功能 上代码&#xff0c;不要哔哔 哈哈 粗暴 真得是曲不离口 拳不离手&#xff0c; 几天…

java学习笔记5

9. 类和对象 9.1 类 9.1.1 类的定义 ​ 类是具有相同属性和方法的具体实例的集合,类是对象的抽象,对象是类的具体实例 9.1.2 类语法 public class 类名{// 1. 属性public 变量的类型 变量名称1;public 变量的类型 变量名称2;...// 2. 方法public void 方法1(){}public v…

pandas/python 一个实战小案例

上次写坦克游戏的时候&#xff0c;接触了一点pandas&#xff0c;当时只是简单了解了一下如何遍历行和列并获取值来替换图片&#xff0c;想更多了解pandas。正好有一些数据需要筛选&#xff0c;试试能不能用通过代码实现。虽然总的来说不复杂&#xff0c;但由于原始数据在命名、…

【重要】Perplexity订阅问题看这一篇就够了!Perplexity免费版和订阅版区别?免费使用G|P|T-4!

常见问题 Q&#xff1a;Perplexity是什么&#xff1f;Perplexity有什么用&#xff1f; A&#xff1a;Perplexity是一个AI搜索引擎&#xff0c;可以理解为可以检索网络结果的G|P|T&#xff0c;尤其是选中“Academic”后支持特定学术论文的检索。并且文献是真是可查到的而不是G|P…

启明智显应用分享|基于ESP32-S3方案的SC01PLUS彩屏与chatgpt融合应用DEMO

今天将带大家真实体验科技与智慧的完美融合——SC01PLUS与ChatGPT的深度融合DEMO效果呈现。 彩屏的清晰显示与ChatGPT的精准回答&#xff0c;将为我们带来前所未有的便捷与高效。 SC01PLUS是启明智显基于ESP32-S3打造的一款3.5寸480*320分辨率的彩屏产品&#xff0c;您可以看…

【算法刷题 | 回溯思想 06】4.17(子集、子集||)

文章目录 9.子集9.1题目9.2解法&#xff1a;回溯9.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;终止条件&#xff08;3&#xff09;遍历过程 9.2.2代码实现 10.子集 ||10.1题目10.2解法&#xff1a;回溯10.2.1回溯思路10.2.2代码实现 9.子…

SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出

目录 介绍 快速开始 引入依赖 简单导出 定义实体类 自定义转换器 定义接口 测试接口 复杂导出 自定义注解 定义实体类 数据映射与平铺 自定义单元格合并策略 定义接口 测试接口 一对多导出 自定义单元格合并策略 测试数据 简单导入 定义接口 测试接口 参…