Ajax+Axios+前后端分离+YApi+Vue-ElementUI组件+Vue路由+nginx【全详解】

目录

一.Ajax技术

二. Axios

三.前后台分离开发介绍

四. YAPI

五.前端工程化

六.vue工程的目录结构

七.Vue项目核心文件

八.Vue组件库ElementUI

AboutView.vue最终代码

AboutView.vue最终代码

九.Vue路由

十.案例

十一.nginx介绍


一.Ajax技术

1.Ajax概述

        Ajax: 全称Asynchronous JavaScript And XML,异步的JavaScript和XML。其作用有如下2点:

        与服务器进行数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。

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

2.Ajax作用

        与服务器进行数据交互

        

        异步交互和局部刷新:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术。

3.同步异步

        

        浏览器页面在发送请求给服务器,在服务器处理请求的过程中,浏览器页面不能做其他的操作。只能等到服务器响应结束后才能,浏览器页面才能继续做其他的操作

        

浏览器页面发送请求给服务器,在服务器处理请求的过程中,浏览器页面还可以做其他的操作。

二. Axios

Ajax技术的实现,常见的有以下方式:

  • 原生的XMLHttpRequest:现在浏览器基本都支持,但是使用繁琐,API落后

  • axios:基于ECMAScript6的Promise技术实现Ajax,简单小巧易于使用

    Axios官网是:Axios中文文档 | Axios中文网

1.使用步骤

  1. 导入axios的js类库。今天的资料里有 axios-0.18.0.js

  2. 使用axios的API发送Ajax请求,得到响应结果

  • GET请求:一般用于查询数据的功能

    axios.get("url地址?word=手机&page=1").then(resp=>{
        //resp的值:就是从服务端得到的响应结果。
        //获取服务端响应的正文数据用:
        let res = resp.data;
    })
  • DELETE请求:一般用于删除数据的功能

    axios.delete("url地址?id=1").then(resp=>{
        //resp的值:就是从服务端得到的响应结果。
        //获取服务端响应的正文数据用:
        let res = resp.data;
    })
  • POST请求:一般用于新增保存数据的功能

    axios.post("url地址", json对象参数).then(resp=>{
        //resp的值:就是从服务端得到的响应结果。
        //获取服务端响应的正文数据用:
        let res = resp.data;
    })
  • PUT请求:一般用于更新修改数据的功能

    axios.put("url地址", json对象参数).then(resp=>{
        //resp的值:就是从服务端得到的响应结果。
        //获取服务端响应的正文数据用:
        let res = resp.data;
    })

2.Axios使用示例

已经准备好了服务端的模拟接口API:

  • 查询所有员工的服务端地址:GET方式, https://yapi.pro/mock/261757/emp/list

  • 根据id查询员工的服务端地址:GET方式,https://yapi.pro/mock/261757/emp/员工id

  • 根据id删除员工的服务端地址:DELETE方式,https://yapi.pro/mock/261757/emp/员工id

  • 新增员工信息的服务端地址:POST方式,https://yapi.pro/mock/261757/emp

<!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>Ajax-Axios使用示例</title>
    <script src="js/axios-0.18.0.js"></script>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <input type="button" value="查询所有员工" @click="queryAll()">
        <input type="button" value="新增员工信息" @click="add()">
    </div>
</body>
<script>
    new Vue({
       el: "#app",
       data: {
         
       },
        methods:{
            queryAll:function(){
                axios.get("https://yapi.pro/mock/261757/emp/list").then(resp=>{
                    console.log(resp.data);
                });
            },
            add:function(){
                let emp = {"name": "tom",
                    "image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg",
                    "gender": 1,
                    "job": "班主任",
                    "entrydate": "2008-05-09",
                    "updatetime": "2022-10-01 12:00:00"
                };
                axios.post("https://yapi.pro/mock/261757/emp", emp).then(resp=>{
                    console.log(resp.data);
                });
            }
        },
       mounted () {
         
       }
    });
</script>
</html>

3.Axios使用案例

        

<!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>Ajax-Axios-案例</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>编号</th>
                <th>姓名</th>
                <th>图像</th>
                <th>性别</th>
                <th>职位</th>
                <th>入职日期</th>
                <th>最后操作时间</th>
            </tr>

            <tr align="center" v-for="(emp,index) in emps">
                <td>{{index + 1}}</td>
                <td>{{emp.name}}</td>
                <td>
                    <img :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("https://yapi.pro/mock/261757/emp/list").then(result => {
            console.log(result.data);
            this.emps = result.data.data;
          })
       }
    });
</script>
</html>

三.前后台分离开发介绍

        web应用的开发有2种方式:前后台混合开发前后台分离开发

        前后台混合开发,顾名思义就是前台后台代码混在一起开发

这种开发模式有如下缺点:

  • 沟通成本高:后台人员发现前端有问题,需要找前端人员修改,前端修改成功,再交给后台人员使用

  • 分工不明确:后台开发人员需要开发后台代码,也需要开发部分前端代码。很难培养专业人才

  • 不便管理:所有的代码都在一个工程中

  • 不便维护和扩展:前端代码更新,和后台无关,但是需要整个工程包括后台一起重新打包部署。

所以我们目前基本都是采用的前后台分离开发方式,如下图所示:

        

我们前后台是分开来开发的,那么前端人员怎么知道后台返回数据的格式呢?后端人员开发,怎么知道前端人员需要的数据格式呢?所以针对这个问题,我们前后台统一指定一套规范!我们前后台开发人员都需要遵循这套规范开发,这就是我们的接口文档。接口文档有离线版和在线版本,接口文档示可以查询今天提供资料/接口文档示例里面的资料。那么接口文档的内容怎么来的呢?是我们后台开发者根据产品经理提供的产品原型和需求文档所撰写出来的,产品原型示例可以参考今天提供资料/页面原型里面的资料。

  1. 需求分析:首先我们需要阅读需求文档,分析需求,理解需求。

  2. 接口定义:查询接口文档中关于需求的接口的定义,包括地址,参数,响应数据类型等等

  3. 前后台并行开发:各自按照接口文档进行开发,实现需求

  4. 测试:前后台开发完了,各自按照接口文档进行测试

  5. 前后段联调测试:前段工程请求后端工程,测试功能

四. YAPI

1.YAPI介绍

        YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

        其官网地址:YApi Pro-高效、易用、功能强大的可视化接口管理平台

YApi主要提供了2个功能:

  • API接口管理:根据需求撰写接口,包括接口的地址,参数,响应等等信息。

  • Mock服务:模拟真实接口,生成接口的模拟测试数据,用于前端的测试。

步骤:

        1.注册登录

        2.创建项目

        3.创建接口分类

        4.创建接口

五.前端工程化

1. 前端工程化介绍

        

但是上述开发模式存在如下问题:

  • 每次开发都是从零开始,比较麻烦

  • 多个页面中的组件共用性不好

  • js、图片等资源没有规范化的存储目录,没有统一的标准,不方便维护

        所以对于前端工程化,就是在企业级的前端项目开发中,把前端开发所需要的工具、技术、流程、经验进行规范化和标准化。从而提升开发效率,降低开发难度等等

2. 前端工程化入门

        1.安装NodeJs和Vue-cli(需要资料加我联系方式QQ:431383685)

3.创建Vue工程

使用Vue-cli创建vue工程,提供了2种创建方式:

  • 命令行创建:直接通过命令行方式创建vue项目。命令: vue create 项目名

  • 图形化界面:通过命令vue ui先进入到图形化界面,然后在图形化界面里按步骤创建vue工程

第二种方式:

  1. 在桌面上打开cmd窗口,执行命令:vue ui进入到vue的图形化界面:

  2. 点击创建,然后点击“在此创建新项目”按钮:

        最后关闭去路径里找

六.vue工程的目录结构

启动运行vue项目,有两种方式:

  • 在VSCode里使用图形化界面,点击按钮启动

  • 在终端里执行命令启动

1.图形化界面启动

        在NPM脚本窗口里找到 serve vue-cli-service..后边的运行按钮,点击启动

        注意:NPM脚本窗口默认不显示,可以参考3.4.3的步骤调出来

        注意:vue工程启动时,默认占用8080端口

第二种方式命令行方式启动:

VSCode如何调出NPM脚本窗口

七.Vue项目核心文件

1.main.js文件

src/main.js,是整个vue工程的入口js,它主要有三个作用:

  • 引入js类库,存储全局变量。整个项目中所有页面都可以使用的js变量

  • 创建了Vue对象

  • 放项目中经常用到的插件和css样式

import Vue from 'vue' //引入Vue类库。 后边能使用Vue,就是因为这里引入了
import App from './App.vue' //引入App.vue页面。vue工程启动后,默认展示的是App.vue页面内容
import router from './router' //引入路由。后边会讲Vue的路由

Vue.config.productionTip = false

//创建Vue对象,关联接管index.html页面中的#app区域,在区域内渲染显示App.vue页面内容
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

2.vue文件

        .vue文件,是vue视图文件,类似于一个页面但又不同。它由3个部分组成

   <template></template>: 模板部分,在这个标签里编写HTML标签,用来展示页面主体结构的。格式要求:

        

<template>
	<div>
        把所有html标签都写到这里
    </div>
</template>


<script>
export default{
    //数据区域
    data(){
        return {
            key1: value1,
            key2: value2,
            ...
        }
    },
    //方法区域
    methods:{
       
    },
    //这是钩子函数mounted。通常在这里写代码从服务端加载数据
    mounted(){
        
    }
}
</script>
<style>
	/*在这里写css样式代码*/
</style>
    

App.vue相当于整个vue工程的默认首页视图,启动vue工程后,打开浏览器直接访问到的就是这个视图。

我们打开App.vue文件

4.vue开发入门

在页面上显示“Hello, World”。打开App.vue,修改代码如下:

八.Vue组件库ElementUI

Element是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库,用于快速构建网页。Element 提供了很多组件(组成网页的部件)供我们使用,例如 超链接、按钮、图片、表格等等。

官网地址:Element - The world's most popular Vue UI framework

1.快速入门

        安装ElementUI组件库

        1.在vscode里停止之前的项目,然后打开终端

        2.在终端执行命令:npm install element-ui@2.15.3

        3.main.js里引入ElementUI

                import ElementUI from 'element-ui';
                import 'element-ui/lib/theme-chalk/index.css';

                Vue.use(ElementUI);

        4.使用ElementUI的组件

                我们的演示代码,都放到About.vue

                最后我们只需要去ElementUI的官网,找到组件库,然后找到按钮组件,抄写代码即可,具体操作如下图所示:

                

紧接着我们复制组件代码到AboutView.vue文件中:

在ElementUI的组件库中找到表格组件

将代码复制到App.vue组件中。注意要复制三部分:

  • template里的内容:是组件的标签。拷贝到我们的template标签中的div标签内

  • script里的内容:组件可能绑定了数据。如果有,我们要把数据拷贝到我们的script标签内的数据区域

  • style里的内容:组件如果有样式。如果有,我们要把样式拷贝到我们的style标签内

template模板部分:

        

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

组件属性详解

再来了解一下表格组件相关的属性。

el-table标签:表格组件标签。有常用属性:

  • data: 主要定义table组件的数据模型

el-table-column标签:表格列的定义信息。表格里有几列,就要有几个el-table-column标签。常用属性:

  • prop: 这一列要展示的data中的数据名

  • label: 列的标题

  • width: 列的宽度

其具体示例含义如下图所示:

Pagination分页

        

组件属性详解

分页组件el-pagination常用的属性:

  • background: 是否为分页按钮添加背景颜色

  • layout: 分页条布局,可包含值sizes, prev, pager, next, jumper, ->, total, slot 用逗号隔开

  • total: 数据的总数量

其中layout使用示例:

        <el-pagination background layout="sizes,prev, pager, next,jumper,total" :total="1000">

        </el-pagination>

事件说明

分页组件是用于页面跳转的,当用户点击按钮时会触发对应的事件:

  • size-change :当每页显示数量被改变时触发,即上边“10条/页”的那个下拉框改变值时触发

  • current-change :当用户改变了页码时会触发 ,例如现在是第1页,跳转到第2页时会触发

AboutView.vue最终代码
<template>
  <div>
    <!-- {{message}} -->

    <!-- 
      表格组件:
        el-table:表格组件
          data:跟表格组件绑定的数据名
        el-table-column:表格列的定义信息
          label:列标题
          prop:这一列要展示的数据名称
     -->
    <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>

    <!-- 分页条 -->
    <el-pagination
      background
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      layout="sizes,prev, pager, next,jumper,total"
      :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: {
    //当每页显示数量变化时,调用这个方法
    handleSizeChange(val) {
      console.log(`每页 ${val} 条`);
    },
    //当 当前页码变化时,调用这个方法
    handleCurrentChange(val) {
      console.log(`当前页: ${val}`);
    }
  },
  mounted() {}
};
</script>
<style>
</style>

AboutView.vue最终代码

        

<template>
  <div>
    <!-- {{message}} -->

    <!-- 
      表格组件:
        el-table:表格组件
          data:跟表格组件绑定的数据名
        el-table-column:表格列的定义信息
          label:列标题
          prop:这一列要展示的数据名称
     -->
    <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>

    <!-- 分页条 -->
    <el-pagination
      background
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      layout="sizes,prev, pager, next,jumper,total"
      :total="1000">
    </el-pagination>

    <el-button type="text" @click="dialogVisible = true">点击打开 Dialog</el-button>

    <!-- dialog窗口 -->
    <el-dialog title="Form表单" :visible.sync="dialogVisible" width="30%">
      <!-- form表单 -->
      <el-form ref="form" :model="form" label-width="80px">
        <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-form-item>
          <el-button type="primary" @click="onSubmit">立即创建</el-button>
          <el-button>取消</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: "",
        region: "",
        date1: "",
        date2: "",
      },
      dialogVisible: 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(val) {
      console.log(`每页 ${val} 条`);
    },
    //当 当前页码变化时,调用这个方法
    handleCurrentChange(val) {
      console.log(`当前页: ${val}`);
    },
    onSubmit() {
      console.log("submit!");
    }
  },
  mounted() {}
};
</script>
<style>
</style>

九.Vue路由

        所谓路由,其实相当于html里的超链接,但实际不是超链接。用于加载显示指定视图组件(或页面),如图:当点击“员工管理”时,右侧显示的是员工管理视图页面

路由的原理

        前端路由:URL中的hash(#号之后的内容)与视图组件之间的对应关系,如下图所示,当我们点击左侧导航栏时,浏览器的地址栏会发生变化,路由自动更新显示与url所对应的vue组件。

vue官方提供了路由插件Vue Router实现了路由功能。所以要使用路由的话,就必须导入路由组件。

路由组件主要有以下两部分组成:

  • <router-link>:请求链接组件,设置跳转路径。浏览器会解析成<a href="跳转路径"></a>

  • <router-view>:动态视图组件,用来渲染展示与路由路径对应的组件。相当于a标签的target属性

    <router-view>标签可以写在任意位置。写在什么地方,视图组件就会在什么地方显示

要想实现路由跳转,就必须要在routes/index.js里维护 ==路径与视图== 的对应关系。这样的话,当我们点击链接时,才会显示链接路径对应的视图内容。

2.路由入门

1.安装vue-router插件(已安装)

        我们在创建vue工程时已经勾选了路由,所以不需要额外再安装了。如果创建时没有勾选路由的话,可执行命令安装vue-router插件:npm install vue-router@3.5.1

在main.js中引入router(已实现)

        在main.js中,我们已经引入了router功能,如下图所示

2.在index.js中定义路由表

        

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    component: () => import('../views/AboutView.vue')
  },
  {
    path: '/emp',
    name: 'emp',
    component: () => import('../views/EmpView.vue')
  },
  {
    path: '/dept',
    name: 'dept',
    component: () => import('../views/DeptView.vue')
  }
]

const router = new VueRouter({
  routes
})

export default router

       3.配置router-link和router-view

十.案例

需求说明:

  1. 制作类似格式的页面

    即上面是标题,左侧栏是导航,右侧是数据展示区域

  2. 右侧需要展示搜索表单

  3. 右侧表格数据是动态展示的,数据来自于后台

  4. 实际示例效果如下图所示:

<template>
  <div>
    <!-- 表单 -->
    <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 prop="image" label="图像" width="180">
            <template slot-scope="scope">
                <img :src="scope.row.image" width="100px" height="70px">
            </template>
        </el-table-column>
        <el-table-column prop="gender" 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>

    <!-- 分页条 -->
    <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            background
            layout="sizes,prev, pager, next,jumper,total"
            :total="1000">
    </el-pagination>
  </div>
</template>
<script>
import axios from 'axios';

export default {
  data() {
    return {
        tableData: [],
        searchForm:{
            name:'',
            gender:''
        }
    };
  },
  methods:{
    handleSizeChange(val) {
        console.log(`每页 ${val} 条`);
    },
    handleCurrentChange(val) {
        console.log(`当前页: ${val}`);
    }
  },
  mounted(){
    axios.get("https://yapi.pro/mock/261757/emp/list").then(resp=>{
        this.tableData = resp.data.data;
    });
  }
};
</script>

十一.nginx介绍

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

niginx在windows中的安装是比较方便的,直接解压即可。所以我们直接将资料中的nginx-1.22.0.zip压缩文件拷贝到无中文的目录下,直接解压即可,如下图所示就是nginx的解压目录以及目录结构说明:

使用步骤:

        1.前端工程打包

 

2.将我们之前打包的前端工程dist目录下得内容拷贝到nginx的html目录下

               

       

        

        

            

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

excel 动态列导出

excel动态列&#xff0c;只好用poi来写了&#xff0c;也并不复杂&#xff0c;一样就这个件事情抽像为几步&#xff0c;就是套路了&#xff0c;开发效率就上去了。 1 准备空模板 导出操作与excel模板的导出一样&#xff0c;可以参考excel导出标准化 2 自定义SheetWriteHandler …

Redis面试问题纯享版

基础内容 1、简单介绍以下你了解的Redis 2、对比一下Redis和Memcache的异同&#xff1f; 3、为什么MySQL选用Redis作为缓存&#xff1f; 4、详细聊聊你对Redis各种数据类型的了解&#xff1f; 5、Redis中五种基本数据类型的底层数据结构是什么样的&#xff1f; Redis线程模型…

图书推荐|Word文稿之美

让你的文档从平凡到出众&#xff01; 本书内容 《Word文稿之美》是一本全面介绍Word排版技巧和应用的实用指南。从初步认识数字排版到高效利用模板、图文配置和表格与图表的排版技巧&#xff0c;再到快速修正错误和保护文件&#xff0c;全面系统地讲解数字排版的技术和能力&…

【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee

目录 1. 编译器 gcc 1.1 背景知识 1.2 gcc如何完成 2.1 Makefile背景 2.2 Makefile原理 2.3 Makefile常用符号 3. 模拟倒计时 4. 模拟进度条 5. 使用 git 命令行 5.1 安装 git 5.2 创建项目下载到本地 5.3 推送本地代码到远端仓库 1. 编译器 gcc 1.1 背景知识 预处…

stm32学习笔记:I2C通信外设原理(未完)

软件实现和硬件实现 串口通信为异步时序&#xff0c;用软件实现很麻烦&#xff0c;基本上用硬件实现 而I2C协议通信为同步时序&#xff0c;软件实现简单且灵活&#xff0c;硬件实现比较麻烦&#xff0c;故软件比较常用 但I2C硬件实现功能比较大&#xff0c;执行效率高&#xff…

Electron-builder打包安装包——编译篇

突然有一天想打包个桌面程序&#xff0c;没有打包过&#xff0c;经过九牛二虎之力终于打包出来&#xff0c;在此感谢那些热于分享的前辈&#xff01; 本篇只讲打包运行和出现的问题 一、准备工作&#xff1a;提前下载相关资源包&#xff0c;否则在国内环境下可能因为网络问题…

python+django_vue旅游酒店预订出行订票系统pycharm项目lw

a.由于对管理信息方面的内容了解尚浅且没有足够的经验&#xff0c;因而很难对数据庞大的线上旅行信息管理系统建立完善的数据库。 b.线上旅行信息管理系统拥有很大的信息量&#xff0c;其中包括数据库的前期开发和后期更新&#xff0c;因此对数据库的安全性&#xff0c;一致性和…

【Java】CAP理论以及它的实际应用案例

目录 简介 不是所谓的“3 选 2” CAP 实际应用案例 总结 CAP 理论/定理起源于 2000年&#xff0c;由加州大学伯克利分校的Eric Brewer教授在分布式计算原理研讨会&#xff08;PODC&#xff09;上提出&#xff0c;因此 CAP定理又被称作 布鲁尔定理&#xff08;Brewer’s the…

html标签之表格标签,程序员必看

突破困境&#xff1a; 1. 提升学历 前端找工作&#xff0c;学历重要吗&#xff1f; 重要。谁要是告诉你不重要那一定是在骗你。现实情况是大专吃紧&#xff0c;本科够用&#xff0c;硕士占优&#xff0c;大专以下找到工作靠运气和 戳这里领取完整开源项目&#xff1a;【一线大…

嵌入式面试

1.关键字static的作用是什么&#xff1f;为什么static变量只初始化一次&#xff1f; 1&#xff09;修饰局部变量&#xff1a;使得变量变成静态变量&#xff0c;存储在静态区&#xff0c;存储在静态区的数据周期和程序相同&#xff0c; 在main函数开始前初始化&#xff0c;在退…

HTML入门:05HTML多媒体

HTML入门&#xff1a;05HTML多媒体 1 video标签1.1 控制按钮&#xff1a;controls1.2 宽度和高度&#xff1a;width和heightt1.3 预载&#xff1a;preload1.4 静音&#xff1a;muted1.5 自动播放&#xff1a;autoplay1.6 无限循环&#xff1a;loop1.7 poster 2 audio标签 在早期…

从零学习Linux操作系统 第三十二部分 ansible中剧本的应用

一、什么是playbook及playbook的组成 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 play就是一个个模块用列表的方式体现出来 playbook的语法是用YAML的预防进行书写的 2.YAML 简介 是一种表达资料序列的格式&#xff0c;类似XM…

ShardingSphere-SQL 解析 Issue 处理流程

ShardingSphere-SQL 解析 Issue 处理流程 这是之前给社区写的 SQL 解析 Issue 的处理流程&#xff0c;可以帮助社区用户快速参与到 ShardingSphere-SQL 解析任务当中。 ShardingSphere SQL 解析 issue 列表 Issue 背景说明 当前 Issue 使用自定义的爬虫脚本从对应的数据库官…

php采集类snoopy2.0使用说明

我们经常采集一些网站数据时会被识别为机器人被网页被拒绝访问&#xff0c;类似这种&#xff1a; failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden网宿云安全平台检测到您当前的访问行为存在异常&#xff0c;请稍后重试... 云安全平台检测到您当前的访问…

【Azure 架构师学习笔记】- Azure Service Endpoint

本文属于【Azure 架构师学习笔记】系列。 前言 在做Azure 架构时&#xff0c;经常会被问到Service Endpoint这个点&#xff0c;那么这篇文章来介绍一下Service Endpoint&#xff08;SE&#xff09;。 Azure Service Endpoint 首先它是一个专用通道&#xff0c;在Azure 资源之…

Kosmos-2: 在多模态大语言模型中引入基准和指代能力

Kosmos-2: 在多模态大语言模型中引入基准和指代能力 FesianXu 20240304 at Baidu Search Team 前言 之前笔者在博文中介绍过kosmos-1模型 [1]&#xff0c;该模型脱胎于MetaLM采用『因果语言模型作为通用任务接口』的思想&#xff0c;采用了多种形式的多模态数据进行训练得到。…

GIS之深度学习07:CUDNN教程(CUDA12.1配套)

CUDNN&#xff08;CUDA Deep Neural Network library&#xff09;是NVIDIA专门针对深度学习应用开发的GPU加速库。它提供了一系列高效的深度学习算法的实现&#xff0c;包括卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;等常用网络结构的…

flutter开发文档,靠着这份面试题跟答案

1、知道它是什么、有什么用 相信很多人在学习的时候&#xff0c;一开始都会在网上找一整套资料或者买一本书来学习&#xff0c;结果就是内容太多&#xff0c;学了记不住或者学到一半感觉很难&#xff0c;便放弃了&#xff0c;更别提写代码了&#xff0c;根本无从入手。 而更好…

echarts柱状图可鼠标左击出现自定义弹框,右击隐藏弹框并阻止默认右击事件

每项x轴数据对应有两条柱图和一条阴影效果是学习其它博客得到的效果&#xff0c;这个是学习的原文链接&#xff1a;echarts两个合并柱体&#xff08;普通柱状图象形柱图&#xff09;共享一个柱体阴影 因为这次情况比较特殊&#xff0c;不仅需要自定义弹框内容&#xff0c;而且…

day12_SpringCloud(Gateway,Nacos配置中心,Sentinel组件)

文章目录 1 Gateway组件1.1 Gateway简介1.2 Gateway入门1.3 网关路由流程图1.4 路由工厂1.5 过滤器1.5.1 过滤器简介1.5.2 内置过滤器1.5.3 路由过滤器1.5.4 默认过滤器1.5.5 全局过滤器1.5.6 过滤器执行顺序 2 Nacos配置中心2.1 统一配置管理2.2 Nacos入门2.2.1 Nacos中添加配…