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

news2024/11/26 16:42:00

目录

一.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目录下

               

       

        

        

            

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

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

相关文章

【粉丝福利】一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

&#x1f33c;一、前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎&#xf…

TRIZ理论破解重量与强度难题:材料科学的革命性突破!

在机械结构设计的领域里&#xff0c;工程师们常常面临着一个难以抉择的问题&#xff1a;如何在保证结构强度的同时&#xff0c;尽可能地减轻重量&#xff1f;传统的惯性思维可能会让我们倾向于增加材料的厚度来增强结构的稳固性&#xff0c;但这样一来&#xff0c;结构的重量也…

电网数字孪生的开发流程

电网的数字孪生是指利用数字化技术和模拟仿真技术&#xff0c;建立起一个与真实电网系统相对应的虚拟仿真系统。它可以帮助电网管理者进行实时监测、预测、优化和管理电网系统&#xff0c;提高电网的运行效率、安全性和可靠性。以下是电网数字孪生的典型开发流程&#xff0c;希…

Unity角色动画变成半跪\半蹲\下沉 的问题

导入的人物动画发生如图形态 解决方法&#xff1a;找到动画模型&#xff0c;Rig - AnimationType 改为Humanoid &#xff0c;然后Apply一下

【电路笔记】-双极晶体管

双极晶体管 文章目录 双极晶体管1、概述2、双极晶体管结构3、双极晶体管配置3.1 共基极 (CB) 配置3.2 共发射极 (CE) 配置3.3 共集极 (CC) 配置4、总结1、概述 双极结型晶体管是一种可用于开关或放大的半导体器件。 与半导体二极管不同,半导体二极管由两片半导体材料组成,形…

rabbitmq3

指定通过通道将消息发送给哪个消息队列 同一个通道可以向不同的队列发送消息的&#xff0c;如果你绑定的队列和发布消息的队列不一致也是可以的&#xff0c;这个才是真正的发布消息去具体的某一个队列&#xff1a; 如果队列没有持久化&#xff0c;就不会把这个消息队列保存在磁…

StarRocks实战——特来电StarRocks应用实践

目录 一、为何引入StarRocks 二、主要应用场景 三、封装或扩展 四、集群监控预警 五、总结规划展望 5.1 使用经验分享 5.2 下一步计划 5.2.1 StarRocks集群自动安装 5.2.2 StarRocks集群高可用架构 原文大佬的这篇StarRocks应用实践有借鉴意义&#xff0c;这里摘抄下来…

智慧城市的未来:利用数字孪生技术推动智慧城市的智能化升级

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、城市规划与建设 2、城市管理与运营 3、公共服务与民生改善 4、应急管理与灾害防控 四、数字孪生技术推动智慧城市的智能化升级的价值 1、提高城市管理的智能化水平 2、优化城市资源配置 …

9.9 指针数组、指针的指针、main函数参数、小结

9.9 指针数组、指针的指针、main函数参数、小结 一.指针数组概念回顾二.指向指针的指针三.指针数组做main函数形参四.小结1.指针数据类型小结表&#xff1a;2.指针运算小结2.1 指针变量的加减2.2 指针变量的赋值2.3 指针变量可以为空值&#xff0c;表示不指向任何变量 3.void *…

OSI 的七层模型

OSI七层模型 一般指开放系统 互连参考模型 (Open System Interconnect 简称OSI) 是国际标准化组 织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系 统提供了一种功能结构的框架。 应用层&#xff1a;各种应用程序协议&#xff0c;比…

Oracle.xs.dll‘ for module DBD::Oracle: load_file:找不到指定的模块

安装Ora2pg时,碰到 异常现象 D:\ProgramFiles\ora2pg>ora2pg -t show_report --estimate_cost -c ora2pg_conf.dist install_driver(Oracle) failed: Cant load D:/ProgramFiles/strawberry/perl/site/lib/auto/DBD/Oracle/Oracle.xs.dll for module DBD::Oracle: load_fil…

FedAsync Asynchronous Federated Optimization

文章目录 IntroductionMethodologyConvergence analysisExperiments Introduction 联邦学习有三个关键属性: 不频繁的任务激活。对于弱边缘设备&#xff0c;学习任务只在设备空闲、充电、连接非计量网络时执行.沟通不频繁。边缘设备和远程服务器之间的连接可能经常不可用、缓…

基于SpringBoot+MYSQL的网页时装购物系统

目录 1、 前言介绍 2、主要技术 3、系统流程分析 3.1、系统登录流程图 3.2、添加信息流程图 3.3、删除信息流程图 4、系统体系结构 4.1、时装购物系统的结构图 4.2、登录系统结构图 4.3、时装购物系统结构图 5、数据库设计原则 5.1、管理员信息属性图 5.2、用户管…

ElevenLabs用AI为Sora文生视频模型配音 ,景联文科技提供高质量真人音频数据集助力生成逼真音效

随着Open AI公司推出的Sora文生视频模型惊艳亮相互联网&#xff0c;AI语音克隆创企ElevenLabs又为Sora的演示视频生成了配音&#xff0c;所有的音效均由AI创造&#xff0c;与视频内容完美融合。 ElevenLabs的语音克隆技术能够从一分钟的音频样本中创建逼真的声音。为了实现这一…

在nginx 服务器部署vue项目

以人人快速开发的开源项目&#xff1a;renren-fast-vue 为例 注&#xff1a;这里开始认为各位都会使用nginx 打包vue项目 npm run build 测试打包的项目是否可以运行 serve dist 可以正常运行 编译报错请移步到&#xff1a;renren-fast-vue1.2.2 项目编译报错: build g…

SpringCloud微服务-DockerCompose(初识、安装、部署)

DockerCompose&#xff08;初识、安装、部署&#xff09; 文章目录 DockerCompose&#xff08;初识、安装、部署&#xff09;初识DockerCompose&#xff1f;DockerCompose安装DockerCompose部署微服务问题解决&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09…

C++ 归并排序OJ

目录 1、912. 排序数组 2、LCR 170. 交易逆序对的总数 3、315. 计算右侧小于当前元素的个数 4、493. 翻转对 1、912. 排序数组 思路&#xff1a;本次使用归并排序 &#xff0c;快速排序相当于二叉树的前序遍历&#xff0c;而归并排序相当于后序遍历。 归并排序是一种有效的…

【Java设计模式】三、简单工厂、工厂方法模式、抽象工厂模式

文章目录 0、案例&#xff1a;咖啡屋1、简单工厂模式 静态工厂&#xff08;不属于23种之列&#xff09;2、工厂方法模式3、抽象工厂模式4、简单工厂模式 配置文件解除耦合5、JDK源码中对工厂模式的应用 0、案例&#xff1a;咖啡屋 模拟咖啡店点餐。咖啡有多种&#xff0c;抽…

vue3+element plus 实现百度地图显示路径

添加依赖 <!-- index.html --><script type"text/javascript" src"//api.map.baidu.com/getscript?v3.0&akyI6kBeC9G4LntEWXklE2iNHwRUrmFEQc"></script><script type"text/javascript" src"//api.map.baidu.co…

【vue/组件封装】封装一个带条件筛选的搜索框组件(多组条件思路、可多选)详细流程

引入&#xff1a;实现一个带有筛选功能的搜索框&#xff0c;封装成组件&#xff1b; 搜索框长这样子&#xff1a; 点击右侧筛选图标后弹出层&#xff0c;长这样子&#xff1a; 实际应用中有多组筛选条件&#xff0c;这里为了举栗子就展示一组&#xff1b; 预览&#xff1a;…