016-Vue-黑马2023:前后端分离开发(在线接口文档),前端工程化、Element、nginx

第三节 前后端分离开发

1、介绍

开发模式

  • 前后端混合开发:传统开发模式
    在这里插入图片描述

  • 前后端分离开发:当前最为主流的开发模式
    在这里插入图片描述

  • 页面原型+需求案例:分析出接口文档
    在这里插入图片描述

  • 离线开发文档示例:
    在这里插入图片描述

2、YAPI(官网已停用)

2023.7停止维护了,已经登录不上官网了。

在线接口文档管理平台:

  • 介绍:YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务
  • 地址: http://yapi.smart-xwork.cn/
  • 2个功能:
    • API接口管理
    • Mock服务:通过YAPI平台模拟真实接口,生成接口的模拟测试数据,用于前端工程测试。这样即使后端的人员没有开发完毕,前端开发人员也可以使用YAPI平台所提供的Mock地址来进行模拟数据的测试。
      在这里插入图片描述

使用:

  • 可以部署在公司内部服务器,公司内部自己使用。也可以使用YAPI官方提供的公网部署的YAPI平台,注册一个账号使用。

2.1、添加项目

  • 步骤:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.2、添加分类

  • 步骤:
    在这里插入图片描述

2.3、添加接口

  • 步骤:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.4、编辑接口详细信息

  • 步骤:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.5、预览效果

  • 接口文档保存后,会自动生成一个Mock地址
    在这里插入图片描述
  • 点击此地址可以看到会自动的生成Mock测试数据:前端人员在测试的时候就可以直接访问此地址进行测试。
    在这里插入图片描述
  • 这个数据是根据定义接口时,指定的返回数据格式生成的
    在这里插入图片描述

2.6、高级Mock

  • 当然这个返回数据里面的值是个比较宽泛的数据,可以在高级Mock功能中,手动指定当前接口生成的测试数据是什么。
    在这里插入图片描述
    在这里插入图片描述
    修改value中的值:
    在这里插入图片描述
    再次点击预览中的MocK地址,可以看到生成的测试数据已经被改变了。
    在这里插入图片描述

第四节 前端工程化

1、说明

  • 当前开发中使用到的前端资源,我们什么时候使用就什么时候引用。
    在这里插入图片描述

    • 最终形成的工程结构如下:
      在这里插入图片描述
    • 缺点:在大型项目开发中会存在很多问题,每一次开发一个功能都是从0开始,多个页面当中的组件或者是功能复用性并不好,并且js文件、图片文件没有规范化的存储目录,想怎么定义就怎么定义,团队协作开发时每个开发人员都有自己的开发习惯,这样就很不方便项目的维护以及管理。
  • 现在的前端开发都讲究前端开发的模块化、组件化、规范化、自动化:
    在这里插入图片描述

    • 模块化:把js、css制作成一个个可以复用的模块

    • 组件化:把UI组件,css样式,js行为封装为一个个的组件,便于管理。

    • 规范化:提供一套标准规范的目录结构和编码规范,所有开发人员都遵循这一套统一的规范进行开发。

    • 自动化:项目的构建、项目的部署、项目的测试都可以自动化的完成。

    • 问题:使用前端工程化以后,在使用vue开发大型项目的时候,我们就需要考虑代码的目录结构,项目的目录结构,部署,以及代码的单元测试等事情。如果每一个项目都手动的完成这些工作那么效率是非常低下的。

      • 所以通常会使用一些现成的工具来帮助我们完成这些事情,这个工具就是vue官方提供的脚手架工具。

2、Vue脚手架的环境准备

  • 介绍:Vue-cli 是Vue官方提供的一个脚手架,用于快速生成一个Vue的项目模板。
  • Vue-cli提供了如下功能:
    • 统一的目录结构
    • 本地调试
    • 热部署
    • 单元测试
    • 集成打包上线
  • 依赖环境:Node]s(类似于java当中的jdk)

2.1、安装NodeJS

  • 官网:https://nodejs.org/en
    在这里插入图片描述
    在这里插入图片描述

  • 安装步骤:

    • 双击资料中提供的安装包
      在这里插入图片描述
      在这里插入图片描述

    • 选择安装目录:选择安装到一个,没有中文,没有空格的目录下(新建一个文件夹NodeJS)
      在这里插入图片描述
      在这里插入图片描述

    • 验证NodeJS环境变量:
      NodeJS 安装完毕后,会自动配置好环境变量,我们验证一下是否安装成功,通过: node -v
      在这里插入图片描述

    • 配置npm的全局安装路径
      在这里插入图片描述
      使用管理员身份运行命令行,在命令行中,执行如下指令:
      npm config set prefix "E:\develop\NodeJS"
      注意:E:\develop\NodeJS 这个目录是NodeJS的安装目录

    • 切换npm的淘宝镜像:可以加速资源下载
      使用管理员身份运行命令行,在命令行中,执行如下指令:
      npm config set registry https://registry.npm.taobao.org

    • 安装Vue-cli
      使用管理员身份运行命令行,在命令行中,执行如下指令:
      npm install -g @vue/cli
      这个过程中,会联网下载,可能会耗时几分钟,耐心等待。
      在这里插入图片描述

    • 查看Vue-cli是否安装成功:vue --version
      在这里插入图片描述

3、Vue项目简介

3.1、基于脚手架创建Vue项目

  • 基于脚手架创建好一个工程化的vue项目
    • 方式一:命令行(直接在命令行中输入vue create 项目名称
      在这里插入图片描述
    • 方式二:图形化界面(在命令行中输入命令vue ui,回车后就会vue的项目管理器图形化界面,在此界面中再来创建vue项目)
      在这里插入图片描述
  • 案例测试:以方式二为例
    • 在F盘新创建一个文件夹,以管理员身份打开命令提示符窗口,在窗口中进入到这个新创建的文件夹目录。输入指令vue ui,调出图形化界面。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 可以看到磁盘目录已经创建好vue项目了:
      在这里插入图片描述
      在这里插入图片描述

3.2、项目目录结构

  • 基于Vue脚手架创建出来的工程,有标准的目录结构,如下:
    在这里插入图片描述

4、使用vscode打开vue项目

  • 打开vue项目所在的文件夹
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5、运行vue项目

  • 2种方式:
    • 图形化界面
    • 命令行
      在这里插入图片描述
  • 说明:图形化界面方式需要使用npm脚本运行vue项目,所以要先打开npm脚本工具栏。
    在这里插入图片描述在这里插入图片描述
    重启VSCode,点开项目中的package.json,在资源管理器右边的...中勾选npm脚本,就可以在左下看到NPM脚本
    在这里插入图片描述
  • 以图形化界面方式为例,运行当前案例的vue项目:
    • 以管理员方式打开vscode,之后使用npm运行
    • vue项目构建完毕后它会自动启动一个服务,运行在8080端口号上,所以可以通过此链接访问当前项目。
      在这里插入图片描述
      在这里插入图片描述
    • 这个页面是vue项目中自动提供的根组件App.vue,这个组件指的就是一个页面。
      在这里插入图片描述
    • 修改页面的文本:Home—>Vue Home,之后ctrl+s保存,发现没有重启项目,也没有刷新浏览器,页面仍然发生了变化,这就是vue项目提供的热部署功能。
      在这里插入图片描述
      在这里插入图片描述

6、修改前端vue项目的端口号

  • 在vue的配置文件vue.config.js中进行修改,ctrl+s进行保存。
  • 由于修改了端口号,所以在终端中停掉当前的服务,之后重新启动。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

7、Vue项目开发流程

说明:

  • 启动工程化的vue项目,访问到的页面其实就是vue项目项目默认提供的首页index.html。
    在这里插入图片描述
    创建好vue项目之后,public这个目录下自带的一个页面index.html
    在这里插入图片描述

开发流程:

  • 在index.html首页中(public目录下)它是默认引入了入口文件main.js(此文件是vue项目的入口js文件,在src目录下)
  • 在入口文件main.js中又引入了很多的公共组件,import关键字引入模块,export关键字将对象或函数导出为模块。
    • 这样就可以通过export关键字来导出一个模块,然后在使用到的地方通过import这个关键字再将其导入进来。
  • eg:import App from './App.vue',表示导入当前目录下的App.vue这个组件,并且给它起个名字为App,之后就可以在这个main.js文件中使用这个App组件了。
    在这里插入图片描述在这里插入图片描述
  • 在index.htm只是定义了一个空的div标签,但是界面中展示了很多的信息,那么它是怎么做到的呢???
  • 答:在创建vue对象的时候,通过render函数创建了对应的虚拟Dom元素,这部分Dom元素是在App.vue这个根组件中定义的。
  • 在vue项目中会看到很多的以.vue为结尾的文件,被叫做组件文件,每个组件文件都由三部分组成。

在这里插入图片描述

  • 案例测试:改造App.vue组件
    在这里插入图片描述
<template>
  <div >
    <!-- 当我们定义好了一个数据模型之后,就可以在上面的模版中
         通过插值表达式来展示出数据模型当中的数据
 -->
 <h1>{{message}}</h1>
  </div>
</template>



/* 快捷键:script,选择javascript.vue生成。
  export default:表示将定义的这一部分对象导出去,只有在这个地方将它
  导出一个模块,在别的地方才可以通过import关键字导入进来。

  定义vue当中的数据模型:之前,new一个vue对象,之后声明一个属性data,然后在里面指定一个对象。
                        现在,不能指定一个对象只能是指定一个函数function,之后在function函数
                        中声明一个对象,并且要把对象return回去,

 */
<script>
export default {
  data() {
    return {
      message: "Hello vue"
    }
  },
  //如果还想要定义方法,则使用methods属性,在此属性中定义一个个的方法。
  methods: {
    
  }
}
</script>



<style>

</style>

  • 使用管理员方式打开vscode,并运行,发现数据模型的数据已经被改变了
    在这里插入图片描述
  • 说明:vue项目的开发,其实很少操作main.js入口文件和首页index.heml,主要操作的就是一些组件文件(.vue结尾的文件)。

第五节 Vue组件库Element

1、什么是Element

  • Element:是饿了么团队研发的,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。
  • 组件:组成网页的部件,例如 超链接、按钮、图片、表格、表单、分页条等等。
  • 官网https://element.eleme.cn/#/zh-CNListener
  • 为什么要学Element,通过下图的原始html标签所构建的网页和Element提供的各个的网页组件构建的网页效果对比,可以看出右边的完胜。
    在这里插入图片描述

2、快速入门

步骤说明:

  • 安装ElementUI组件库 (在当前工程的目录下),在命令行执行指令:
    在这里插入图片描述

  • 引入ElementUI组件库
    在这里插入图片描述

  • 访问官网,复制组件代码,调整
    在这里插入图片描述

案例演示

  • 步骤1:安装ElementUI组件库 :
    npm install element-ui@2.15.3,回车后他会联网下载ElementUI的2.15.3版本,并将其安装在当前项目中,会存放在node_modules这个目录下
    在这里插入图片描述
    在这里插入图片描述
    在node_modules这个目录下,可以看到element-ui目录,说明组件库安装成功。
    在这里插入图片描述
  • 步骤2:在入口文件main.js中,引入ElementUI组件库
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    Vue.use(ElementUI);
    在这里插入图片描述
  • 步骤3:定义一个组件文件访问官网,复制组件代码。(根组件只有一个App.vue,其它的组件可以放在views这个目录下,它自带的有2个vue组件。)
  • 定义文件夹:element,定义文件:ElementView.vue,在文件中定义基本的结构。
    在这里插入图片描述
<template>
    
</template>




<script>
export default {
    
}
</script>



<style>

</style>

  • 复制官网的组件代码,之后进行调整
    在这里插入图片描述
    把样式复制到div标签内部:
    在这里插入图片描述
    <div>
        <!-- button按钮,如果我们复制的组件比较繁琐,还要往下看一下是否还有一些其它的数据模型
           或者vue中方法的定义,如果有也要一并复制过来。 -->
        <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>

    </div>
  • 运行测试:管理员方式打开vscode并运行,发现显示的结果是之前修改后的根组件首页。因为默认情况下展示的是根组件的内容。
    在这里插入图片描述
  • 修改:在根组件App.vue中,引入ElementView.vue这个组件
  • 直接使用</element-view>标,此时它会自动在script标签中使用import关键字将这个组件导入进来,并且在vue对象中已经把这个组件加入进来了。
    在这里插入图片描述
  • 再次测试:
    在这里插入图片描述

3、常用组件

  • 学习思路:那对于element当中的常见组件的学习呢,只需要去参照element的官方网站,然后找到对应的组件,查找到组件的源代码,之后复制到vscode的组件中,然后做一些简单地调整即可,把它改成我们想要的样式。

3.1、常见组件-表格

  • Table 表格:用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。
    在这里插入图片描述
  • 官方网站:以带边框表格为例
    在这里插入图片描述
    可以看到表格还要展示数据模型,所以可以把要展示的数据模型也复制进来。
    在这里插入图片描述
  • 组件代码:复制进来后ctrl+alt+L,页面格式化 更规整的显示。
    在这里插入图片描述
    在这里插入图片描述
    <!-- Table表格 -->
    <el-table :data="tableData" border 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>



    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 弄'
        }]
        }
    },
  • 如果不清楚表格中的属性代表的含义,可以在官网中每一个组件的最下面找到对属性的解释:
    在这里插入图片描述
  • 测试:由于自带的热部署,所以不需要启动项目也不用刷新浏览器
    在这里插入图片描述

3.2、常见组件-分页

  • Pagination 分页:当数据量过多时,使用分页分解数据。
    在这里插入图片描述
  • 官网:
    在这里插入图片描述
  • 组件代码:
    在这里插入图片描述
    <!-- Pagination 分页 -->
    <el-pagination background layout="prev, pager, next" :total="1000">
    </el-pagination>
  • 效果:
    在这里插入图片描述
  • 添加事件:重听
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    <!-- Pagination 分页 -->
    <el-pagination background layout="total,sizes, prev, pager, next, jumper" 
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
     :total="1000"></el-pagination>

    methods: {
    handleSizeChange:function(val){
        alert("每页记录数变化" + val)
    },
    handleCurrentChange:function(val){
        alert("页码发生变化" + val)
    },
    onSubmit:function(){
        alert(JSON.stringify(this.form));
    }
  }

在这里插入图片描述
在这里插入图片描述

3.3、常见组件-对话框

  • Dialog 对话框:在保留当前页面状态的情况下,告知用户并承载相关操作。
    在这里插入图片描述

  • 官网:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 组件代码
    在这里插入图片描述
    在这里插入图片描述

     <!-- Dialog对话框 -->
     <!-- Table -->
    <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="地址" width="200"></el-table-column>
      </el-table>
    </el-dialog>


        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 弄'
        }],
        dialogTableVisible: false
  • 效果:
    在这里插入图片描述

3.4、常见组件-表单

重听

  • Form 表单:由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据。
    在这里插入图片描述

  • 官网:
    在这里插入图片描述

  • 功能:点击按钮呈现一个表单,要用到上面的Dialog对话框,只不过里面的内容展示的是form表单。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    <!-- Dialog对话框-Form表单 -->
    <el-button type="text" @click="dialogFormVisible = true">打开嵌套Form的 Dialog</el-button>

    <el-dialog title="Form表单" :visible.sync="dialogFormVisible">
      <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>
/* 表单项绑定的数据模型 */
      form: {
        name: '',
        region: '',
        date1: '',
        date2: ''
      },   
       
//声明表单的数据模型      
dialogFormVisible: false,

    /* 提交按钮的事件 */
    onSubmit:function(){
        /*提交按钮时拿到表单数据,因为这些表单项的数据都绑定在了form数据模型中,
        所以要查看表达项数据直接把form这个对象输出出来就可以了,直接输出的是
        对象,需要把它转化为字符串输出才可以看到里面的数据*/
        alert(JSON.stringify(this.form));
    }
  • 效果:
    在这里插入图片描述

4、案例

4.1、需求分析&开发步骤

  • 案例需求:根据页面原型完成员工管理页面开发,并通过Axios完成数据异步加载。
    在这里插入图片描述
  • 服务端数据获取地址:http://yapi.smart-xwork.cn/mock/169327/emp/list
    通过在线文档YAPI生成的测试数据。
    在这里插入图片描述
  • 最终实现的页面效果
    在这里插入图片描述
  • 实现步骤:
    在这里插入图片描述

4.2、基本页面布局

  • 添加组件,在组件中编写基本结构
    在这里插入图片描述
<template>
    <div>

    </div>
</template>


<script>
export default {
    
}
</script>


<style>

</style>
  • 修改根组件的引入方式
    在这里插入图片描述

  • 编写页面布局:这个页面布局不需要自己编写,在Element中还提供了一个布局组件(Container 布局容器)
    在这里插入图片描述

  • 可以选择一个常见的页面布局,符合当前案例的开发页面的
    在这里插入图片描述
    在这里插入图片描述

  • 效果:
    在这里插入图片描述

  • 添加css样式
    在这里插入图片描述

<template>
  <div>
    <el-container style="height: 700px; border: 1px solid #eee">
      <el-header style="font-size: 40px; background-color: rgb(238, 241, 246)"
        >tlias 智能学习辅助系统</el-header
      >
      <el-container>
        <el-aside width="200px">
          <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-table :data="tableData">
                <el-table-column prop="name" label="姓名" width="180"></el-table-column>
                <el-table-column prop="image" label="图像" width="180"></el-table-column>
                <el-table-column prop="gender" label="性别" width="140"></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-main>
      </el-container>
    </el-container>
  </div>
</template>


<script>
export default {
    data() {
        return {
            tableData: []
        }
    },
};
</script>


<style>
</style>
  • 最终效果:
    在这里插入图片描述

4.3、页面组件实现

  • 效果
    在这里插入图片描述

4.4、axios异步加载数据

Vue项目中使用Axios:

  • 在项目目录下安装axios:npm install axios;
  • 需要使用axios时,导入axios:import axios from 'axios';

案例测试:

  • 打开集成终端,输入命令进行安装
    在这里插入图片描述
    在这里插入图片描述
  • 导入axios,在钩子函数中编写axios发送请求
<template>
    <div>
        <el-container  style="height: 700px; 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" 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" 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" width="100px" height="70px">
                            </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="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>

                    <br>
                    
                    <!-- 分页条 -->
                    <!-- Pagination 分页 -->
                    <el-pagination background layout="total,sizes, prev, pager, next, jumper" 
                    @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:"",
               entrydate:[]
            }
        }
    },
    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>
  • 效果
    在这里插入图片描述

5、Vue路由

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、打包部署

6.1、说明

  • 前后端分离开发模式中,前端人员开发前端工程,后端人员开发后端工程,最终将前端工程和后端工程分开部署在对应的服务器上,而前端服务器当前最流行的就是nginx。
    在这里插入图片描述

6.2、步骤-打包

  • 打包:打包后会将项目放在dist这个目录下
    在这里插入图片描述
  • 案例测试:
    在这里插入图片描述
    打开dist所在的磁盘目录
    在这里插入图片描述
    打包后的文件
    在这里插入图片描述
    在这里插入图片描述

6.3、步骤-部署

说明:

  • 将dist这个目录下打包后的这些资源呢部署在服务器上就可以了
  • nginx服务器介绍:
    • 介绍:Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,在各大型互联网公司都有非常广泛的使用。
    • 官网:https://nginx.org/

在这里插入图片描述

案例测试:

  • 下载解压nginx稳定版到一个没有中文的目录
    在这里插入图片描述
    在这里插入图片描述

  • 部署:将打包好的 dist 目录下的文件,复制到nginx安装目录的html目录下。
    在这里插入图片描述

    • 有2个默认的页面可以删除掉
      在这里插入图片描述
      在这里插入图片描述
  • 启动:双击 nginx.exe 文件即可,Nginx服务器默认占用 80 端口号
    在这里插入图片描述

    • 启动:
      在这里插入图片描述
    • 注意事项:Nginx默认占用80端口号,如果80端口号被占用,可以在nginx.conf中修改端口号。(netstat –ano | findStr 80)
      在这里插入图片描述
      比如修改为90,之后重启nginx。
      在这里插入图片描述
    • 访问测试:
      注意:这里只是演示的是nginx部署静态资源,它本身还可以反向代理,负载均衡等功能。
      在这里插入图片描述

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

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

相关文章

【工作记录】基于springboot3+springsecurity6实现多种登录方式(一)

前言 springboot3已经推出有一段时间了&#xff0c;近期公司里面的小项目使用的都是springboot3版本的&#xff0c;安全框架还是以springsecurity为主&#xff0c;毕竟亲生的。 本文针对基于springboot3和springsecurity实现用户登录认证访问以及异常处理做个记录总结&#x…

NVMe-oF RDMA vs. TCP延时测试对比:端到端SPDK的意义

前不久看到一篇《NVIDIA BlueField 再创 DPU 性能世界纪录》的新闻&#xff0c;该测试环境是2台服务器&#xff0c;每台各安装2块NVIDIA Bluefield-2 DPU&#xff0c;形成4条100GbE以太网直连&#xff0c;两端分别跑NVMe-oF Target&#xff08;存储目标&#xff09;和Initiator…

Spring IoC 和 DI

文章目录 1. 什么是 Spring2. 什么是 IoC3. 什么是 DI4. IoC & DI 使用5. 获取 Bean 的方式5.1 根据类型获取 bean5.2 根据名称获取 bean5.3 获取bean对象的其他方式5.4 五大注解的关联 6. 方法注解7. 扫描路径8. Bean 的名称9. DI 详解9.1 属性注入9.2 构造方法注入9.3 Se…

残差网络 ResNet

目录 1.1 ResNet 2.代码实现 1.1 ResNet 如上图函数的大小代表函数的复杂程度&#xff0c;星星代表最优解&#xff0c;可见加了更多层之后的预测比小模型的预测离真实最优解更远了&#xff0c; ResNet做的事情就是使得模型加深一定会使效果变好而不是变差。 2.代码实现 impo…

【OpenAI】自定义GPTs应用(GPT助手应用)及外部API接口请求

11月10日&#xff0c;OpenAI正式宣布向所有ChatGPT Plus用户开放GPTs功能 简而言之&#xff1a;GPT应用市场(简称GPTs, 全称GPT Store) Ps&#xff1a; 上图为首次进入时的页面&#xff0c;第一部分是自己创建的GPTs应用&#xff0c;下面是公开可以使用的GPTs应用 一、创建GPTs…

Spring Cloud 微服务中 gateway 网关如何设置健康检测端点

主要是为了让 k8s 识别到网关项目已经就绪&#xff0c;但是又不想在里面通过 Controller 实现。因为在 Controller 中这样做并不是最佳实践&#xff0c;因为 Gateway 的设计初衷是专注于路由和过滤&#xff0c;而不是业务逻辑的处理。 在 Gateway 中配置健康检查端点可以通过以…

单向不带头链表的使用

单向不带头链表的使用 链表的创建&#xff1a; typedef struct LNode {SLDataType data;struct LNode* next; }LNode,*LinkList; 按位查找 LNode* GetElem(LinkList L, int i) {int j 1;LNode* p L->next;if (i < 0)return NULL;if (i 0)return L;while (p &&…

4种方法用Python批量实现多Excel多Sheet合并

目录 方法一&#xff1a;使用pandas库 方法二&#xff1a;使用openpyxl库 方法三&#xff1a;使用xlrd和xlwt库 方法四&#xff1a;使用os和glob库 在数据处理中&#xff0c;经常需要将多个Excel文件中的多个工作表进行合并。以下介绍了4种方法&#xff0c;使用Python批量实…

消费增值模式:引领消费者与平台共创双赢的新篇章

在数字化时代&#xff0c;消费模式正在发生深刻变革。消费者不再满足于单纯的购物行为&#xff0c;而是寻求更加个性化和有价值的消费体验。而平台也面临着如何吸引和留住消费者的挑战。消费增值模式作为一种新型的商业模式&#xff0c;正逐渐成为解决这一问题的关键。 消费增…

Java多线程并发篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、寄存器二、程序计数器三、PCB-“切换桢”四、上下文切换的活动五、引起线程上下文切换的原因前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了…

3D Guassians Splatting相关解读

从已有的点云模型出发&#xff0c;以每个点为中心&#xff0c;建立可学习的高斯表达&#xff0c;用Splatting即抛雪球的方法进行渲染&#xff0c;实现高分辨率的实时渲染。 1、主要思想 1.引入了一种各向异性&#xff08;anisotropic&#xff09;的3D高斯分布作为高质量、非结…

查看centos的CPU、内存、磁盘空间等配置信息

目录 查看CPU/proc/cpuinfo中的信息 查看内存/proc/meminfo中的信息 查看磁盘空间df 命令du命令使用fdisk命令 查看CPU /proc/cpuinfo中的信息 前置&#xff1a; [ltkjltkj front]$ cat /proc/cpuinfo| grep "physical id" physical id : 0 physical id : 0 physi…

智慧校园大数据平台架构

平台架构 基础硬件层 基础硬件层是由一组低廉的PC或服务器组合构建而成。基础硬件层主要承载着数据的存储、运算、容错、调度和通信等任务,对基础应用层下达的指令进行执行和反馈。 数据集成 大数据特征表现在实时、交互、海量等方面,并且以半结构化、非结构化数据为主,价…

机器学习系统或者SysMLDL笔记

在使用过TVM、TensorRT等优秀的机器学习编译优化系统以及Pytorch、Keras等深度学习框架后&#xff0c;总觉得有必要从理论上对这些系统进行一些分析&#xff0c;虽然说在实践中学习是最快最直接的(指哪儿打哪儿、不会哪儿查哪儿)&#xff0c;但恶补一些关于系统设计的一些知识还…

搜索经典题——填充 9*9矩阵

题目&#xff1a;给定一个九行九列矩阵&#xff0c;填充矩阵元素&#xff0c;要求&#xff1a; 1、每一行每一列&#xff0c;每个小九宫格&#xff08;图片画粗的地方就是&#xff09;不能包含相同元素 2、每一行&#xff0c;每一列&#xff0c;每个小九宫格均会完整出现1-9的数…

Python进程池multiprocessing.Pool

环境&#xff1a; 鲲鹏920:192核心 内存&#xff1a;756G python&#xff1a;3.9 python单进程的耗时 在做单纯的cpu计算的场景&#xff0c;使用单进程核多进程的耗时做如下测试&#xff1a; 单进程情况下cpu的占用了如下&#xff0c;占用一半的核心数&#xff1a; 每一步…

第二百六十九回

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容&#xff0c;本章回中将介绍国际化设置.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作&#xff0c;这样可以让不同国家的…

SAP PI之Rest adapter

一&#xff0c;简介 REST风格接口是以http为传输协议&#xff0c;以xml或json或text为有效负载。下图展示了REST到XI再返回的一个过程&#xff0c;一个REST接口包含的信息有&#xff1a;服务URL、URL中带的参数、http方法(post/get/put等)、http头部、body部分的有效载荷。而X…

2023年全球软件质量效能大会(QECon北京站):核心内容与学习收获(附大会核心PPT下载)

此次大会的主题为“智能时代的质量新篇章”。来自全球的软件质量与效能专家、企业领袖、技术研发人员等齐聚一堂&#xff0c;共同探讨软件质量与效能的新理念、新技术、新实践。 一、大会的核心内容 1、智能时代软件质量的新挑战与机遇 随着人工智能、大数据等技术的快速发展…

react、Vue打包直接运行index.html不空白方法

react vue 在根目录下创建 vue.config.js 文件&#xff0c;写入 module.exports {publicPath: ./, }