苍穹外卖--sky-take-out(五)前端

大部分笔记都是写在语雀的,这是一次性从本人语雀复制过来的,可能结构有些错乱


基础创建

环境要求

node.js

npm

Vue CLI

创建前端工程

使用vue ui命令创建

项目结构

启动项目

  1. 打开命令行窗口

快捷键ctrl+j

或者

  1. 运行

输入:npm run serve

  1. 停止服务

ctrl+c

修改端口号

与后端的tomcat端口号冲突

如何修改

在vue.config.js中配置前端服务号端口

devServe: {

port: 7070

}

小结

vue的基本使用

vue组件

  1. 以.vue结尾
  2. template--html
  3. style--css
  4. script--js

文本插值

作用:用来绑定data方法返回的对象属性

用法:{{}}

举例:

属性绑定

作用:为标签的属性绑定data方法中返回的属性

用法:v-bind:xxx简写::xxx

举例:

<input>标签:输入框

<input type="text" value="xxx"> 表示:输入框为文本输入框,value是文本框里面的内容;

<img>:图片标签;

<br>:换行

<hr>:分割线

事件绑定

作用:为元素绑定对应的事件

用法:v-on:xxx,简写为@xxx

<input type="button" value="xxx" @xxx> 按钮标签

添加方法的时候需要在methods里面定义

双向绑定

作用:表单输入项和data方法中的属性进行绑定,任意一方改变都会同步给另一方

用法:v-model

条件渲染

作用:根据表达式的值来动态渲染页面元素

用法:v-if、v-else、v-else-if

axios

Axios是一个基于promise的网络请求库,作用于浏览器和nodejs中

安装命令:

npm install axios

导入命令:

import axios from 'axios'

跨域问题

在vue.config.json配置

发送post和get请求

问题

  1. res =>{ console.log(res.data) }什么意思

这是一个简单的箭头函数(arrow function)在 JavaScript 中。这个函数接受一个参数 res 并打印 res.data 到控制台。

具体来说:

  • res => { ... }:这是一个箭头函数,它接受一个参数 res。
  • console.log(res.data):这是函数体中的代码,用于打印 res.data 的值到控制台。

这个函数通常在处理异步操作(如 AJAX 请求或 Promise)的回调中看到,特别是当你使用像 Axios 这样的 HTTP 客户端库进行 API 调用时。在这种情况下,res 通常是一个包含 API 响应信息的对象,而 res.data 通常包含实际的响应数据。

例如,在使用 Axios 进行 GET 请求时,你可能会看到这样的代码:

axios.get('https://api.example.com/data')  .then(res => {  console.log(res.data);  })  .catch(error => {  console.error(error);  });

在这个例子中,当 Axios 的 GET 请求成功时,它会调用 .then() 方法,并传递一个包含响应信息的对象作为参数(在这里是 res)。然后,箭头函数 res => { console.log(res.data); } 会被调用,并打印 res.data 的值到控制台。如果请求失败,.catch() 方法会被调用,并打印错误到控制台。

  1. get请求时没有jwt令牌
axios.get('/api/admin/shop/status',{headers: {token: 'eyJhbGciOiJIUzI1NiJ9.eyJlbXBJZCI6MSwiZXhwIjoxNzE1Nzc3Mjk4fQ.eMABPnG4Y6xboMZry8ulLq_RUGdo4o1b_Sm7M_vmxPg'}})

添加令牌在请求头中;

第一个参数是路径,第二则就是在请求头中加入jwt令牌

  1. 报错

记得开启redis,后端的查询需要redis

统一相应方式

小结

Vue-Router路由

不同访问路径展示不同的访问界面

vue属于单页面应用,所谓的路由,就是根据浏览器路径不同,用不同的视图组件替换这个页面内容

创建

在vue ui时勾选router选项即可

这样就创建好了

小结

为什么我们没有进行第二步?

因为我们是可视化创建的,所以勾选router时自动就下载了

路由配置

路由组成

具体的配置

  1. 路由路径和视图的对应关系

在/src/router/index.js文件中

  1. 路由链接组件<router-link>

在/src/App.vue中

  1. 路由视图组件<router-view>

不用加什么东西,就当作是一个占位符;

加上就行

  1. 视图的位置

在/src/views/文件夹里

路由跳转

问题

如果用户访问的路由地址不存在,该如何处理?

创建一个404界面来提示用户,该界面不存在

  1. 在/src/router/index.js中,加入/404的路由路径和视图的联系

  1. 在src/views/里面创建404View.vue文件

  1. 重定向

当访问不存在时,并不是访问/404,所以需要将没有存在的路径转到404去

在/src/router/index.js中

小结

嵌套路由

嵌套路由:组件内要切换内容,就需要用到嵌套路由(子路由)

实现步骤

  1. 导入elementui

前往element官网:Element - The world's most popular Vue UI framework

执行npm i element-ui -S进行下载安装

  1. 引入文件

  1. 使用布局容器

在views目录下面创建一个包container/containerView

自动生成模板代码的插件:vetur

去官网找到相关代码,复制到对应的区域

  1. 创建3个子视图

  1. 在src/router/index.js中配置路由映射规则(嵌套路由配置)

  1. 在布局容器视图中添加<router-view>,实现子视图组件展示

在containerView.vue中

将原来的main换成占位符

  1. 添加<router-link>实现路由请求

注意

问题

如果直接访问/container时,如何默认展示某个子视图组件

可以使用redirect重定向;

小结

vuex

介绍

安装

npm install vuex@next --save

概念

使用

  1. 创建带有vuex功能的脚手架工程(在ui界面创建时勾选)

  1. 定义和展示共享数据

在src/store/index.js中集中定义共享数据;

  1. 修改共享数据

在mutations中定义函数,且之能在mutations中修改

在/src/store/index.js中

必须同步操作

在/src/app.vue中

  1. 异步共享数据

在actions中定义函数,用于调用mutation

比如axios

调用actions的方法

小结

TypeScript

介绍

解决tsc -v错误的问题:typeScript安装及TypeScript tsc 不是内部或外部命令,也不是可运行的程序或批处理文件解决办法_tsc' 不是内部或外部命令,也不是可运行的程序 或批处理文件。-CSDN博客

ts为什么要增加类型支持

小结

ts的常用类型

类型标注的位置

字符串、数字、布尔类型

字面量类型

interface类型

class类

小结

前端项目开发

技术选型

node.js

vue

ElementUI

axios

vuex

vue-router

typescript

代码结构

 


员工管理

解决npm install报错的问题

npm install 报错问题解决合集-CSDN博客

导入代码环境部署

直接导入代码即可

node版本下降到12.18.2版本:

windows中如何将已安装的nodejs高版本降级为低版本_nodejs降低版本windows-CSDN博客

- api:存放封装了Ajax请求文件的目录

- components:公共组件存放目录

- views:存放视图组件的目录

- App.vue:项目的主组件,页面的入口文件

- main.ts:整个项目的入口文件

- router.ts:路由文件

axios与Ajax请求的联系

axios与Ajax请求的联系主要体现在以下几个方面:

  1. 技术基础:
    • Ajax:即Asynchronous Javascript And XML(异步JavaScript和XML),是Jesse James Garrett在2005年提出的一种使用现有技术集合的“新”方法,这些技术包括HTML或XHTML、CSS、JavaScript、DOM、XML、XSLT等,以及最重要的XMLHttpRequest。
    • axios:是一个基于Promise的网络请求库,既可以用于node.js,也可以用于浏览器中。它的底层实现同样依赖于XMLHttpRequest(在浏览器中)或http模块(在node.js中)。
  1. 功能特性:
    • Ajax:允许在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。它使用异步方式与服务器通信,通过XMLHttpRequest对象在浏览器与服务器之间传输数据。
    • axios:从功能上讲,它封装了原生的XMLHttpRequest(或node.js的http模块),提供了更简洁、更易于使用的API。它支持Promise API,可以方便地处理异步请求,并且具有请求和响应拦截、数据转换、取消请求、自动转换JSON数据等特性。
  1. 使用方式:
    • Ajax:通常使用原生的JavaScript代码或jQuery等库来编写Ajax请求。代码相对繁琐,需要手动处理请求和响应的各个环节。
    • axios:通过Promise实现了对Ajax技术的一种封装,使得请求处理更加简洁和优雅。例如,可以使用axios.get()、axios.post()等方法来发送请求,并通过.then()和.catch()来处理请求成功和失败的情况。
  1. 关系总结:
    • 可以说,axios是对Ajax技术的一种封装和扩展。它通过提供更易用、更强大的API和功能,使得开发人员可以更方便地进行网络请求处理。在实际应用中,axios已经成为前端开发中广泛使用的网络请求库之一。

综上所述,axios与Ajax请求的联系主要体现在它们都是用于实现浏览器与服务器之间异步通信的技术,而axios则是对Ajax技术的一种封装和扩展,提供了更简洁、更易于使用的API和功能。

启动项目

npm run serve

跟踪login登录视图组件

① 获得登录页面路由地址

登录页面完整的访问地址为 http://localhost:8888/#/login,其中登录页面的路由地址为 /login,我们需要通过此路由地址找到对应的登录视图组件

② 从main.ts中找到路由文件

main.ts是整个前端项目的入口文件,在此文件中会创建Vue实例,在创建Vue实例时需要传入路由对象,所以从此文件中可以找到对应的路由文件位置。如下所示:

③ 从路由文件中找到登录视图组件

在路由文件中会配置整个项目所有的路由映射规则,我们只需要找到 /login 这个路径对应的实体组件即可。如下所示:

④ 从登录视图组件中找到登录方法

从上面的路由文件可以确定登录视图组件就是src/views/login/index.vue,此时就可以打开这个文件,然后仔细阅读代码,找到登录方法,如下所示:

⑤ 跟踪登录方法的执行过程

找到登录方法后,就需要跟踪代码的执行过程,主要就是观察前后端的交互过程。例如前端如何发送的Ajax请求,后端返回的数据格式等等

员工分页查询实现

需求分析与接口设计

业务规则:

  • 根据页码展示员工信息(员工姓名、账号、手机号、账号状态、最后操作时间等)
  • 每页展示10条数据
  • 分页查询时可以根据需要,输入员工姓名进行查询

接口基本信息

Path: /admin/employee/page

Method: GET

请求参数

Query

参数名称

是否必须

示例

备注

name

张三

员工姓名

page

1

页码

pageSize

10

每页记录数

返回数据

名称

类型

是否必须

默认值

备注

其他信息

code

number

必须

msg

null

非必须

data

object

必须

├─ total

number

必须

├─ records

object []

必须

item 类型: object

├─ id

number

必须

├─ username

string

必须

├─ name

string

必须

├─ password

string

必须

├─ phone

string

必须

├─ sex

string

必须

├─ idNumber

string

必须

├─ status

number

必须

├─ createTime

string,null

必须

├─ updateTime

string

必须

├─ createUser

number,null

必须

├─ updateUser

number

必须

代码开发

要开发前端代码,首先需要找到对应的组件。从路由文件 router.ts 中找到员工管理页面(组件)。

可以看到,员工管理页面(组件)的位置为:src/views/employee/index.vue。我们只需要在此文件中开发员工分页查询相关的前端代码即可,整个开发过程大概可以分为以下几个关键步骤:

  1. 根据产品原型,制作页面头部效果(输入框、查询按钮等)
  2. 为查询按钮绑定单击事件,发送Ajax请求,查询员工分页数据,实现前后端交互
  3. 提供 vue 的初始化方法,在页面加载后就查询分页数据
  4. 使用ElementUI提供的表格组件展示分页数据
  5. 使用ElementUI提供的分页条组件实现翻页效果

注意:开发过程中,并不是所有的代码都实现了再测试,而是开发一部分,就需要测试一下,看效果,如果有问题再调整。没有问题,再继续开发、测试。所以,这是一个逐渐完善的过程。下面我们就按照上面的几个关键步骤来开发,每开发完一个关键步骤,就需要测试一下,来验证我们的代码是否正确。

制作页面头部效果

注意:输入框和按钮都是使用 ElementUI 提供的组件,对于前端的组件只需要参考 ElementUI 提供的文档,进行修改即可。实现代码如下:

<div class="tableBar"><label style="margin-right: 5px">员工姓名: </label><el-input placeholder="请输入员工姓名" style="width: 15%" /><el-button type="primary" style="margin-left: 20px">查询</el-button><el-button type="primary" style="float: right">+添加员工</el-button>
</div>

结果展示:

完成前后端数据交互

第一步:为查询按钮绑定单击事件

第二步:在methods中定义 pageQuery 方法,先验证当前方法能否正常执行

注意:按照开发规范,真正发送Ajax请求的代码需要封装到 api目录下的ts文件中(src/api/employee.ts)

第三步:在src/api/employee.ts 中定义 getEmployeeList 方法,实现发送Ajax请求获取分页数据

注意:发送 Ajax 请求的URL地址需要和前面我们设计的分页查询接口对应

第四步:在员工管理组件中导入 employee.ts 中定义的方法,并在data() 方法中定义分页相关的模型数据

注意:需要将name属性和上面的员工姓名输入框进行双向绑定,如下:

第五步:在pageQuery 方法中调用 getEmployeeList 方法

自动发送Ajax请求

前面的代码我们已经实现了前后端数据交互,但是有一个问题,就是只有在点击查询按钮时才会发生Ajax请求,实现分页数据查询。我们通常需要的是在当前页面(组件)加载后,就需要发送Ajax请求,查询第一页的数据。要实现这个效果,我们可以通过vue的生命周期方法,即created方法来做到,代码如下:

使用表格展示分页数据

前面我们已经实现了前后端数据交互,现在就需要将后端返回的数据通过表格展示出来,我们可以使用ElementUI提供的表格组件,具体使用方法可以参照官方提供的示例 Element - The world's most popular Vue UI framework

效果展示:

实现分页条实现翻页效果

结果展示

启用禁用员工状态

接口设计

新增员工

产品原型

接口设计

代码开发

  1. 在员工管理列表页面,点击 “添加员工”按钮,跳转到新增页面
  2. 在新增员工页面录入员工相关信息
  3. 点击“保存”按钮完成新增操作

第一步

为“添加员工”按钮绑定单击事件

第二步

编写 handleAddEmp 方法,进行路由跳转

注意:在路由文件中已经配置了如下路由规则

第三步

根据产品原型,开发页面元素

页面效果为:

第四步

定义模型数据和表单校验规则(elment去复制修改)

第五步

在 employee.ts 中封装新增员工方法,发送Ajax请求,实现前后端交互

注意:

  • 发送请求的方式和相关参数,必须和前面的接口设计保持一致
  • 使用此方法时,别忘了在组件中通过import导入

第六步

在 methods 中定义提交表单的方法 submitForm

修改员工

需求分析

修改员工功能涉及到2个接口,分别是根据id查询员工信息和根据id修改员工信息。具体接口设计如下:

(1)根据id查询员工 接口

基本信息

Path: /admin/employee/{id}

Method: GET

请求参数

路径参数

参数名称

示例

备注

id

100

员工id

返回数据

名称

类型

是否必须

默认值

备注

其他信息

code

integer

必须

format: int32

data

object

必须

├─ createTime

string

非必须

format: date-time

├─ createUser

integer

非必须

format: int64

├─ id

integer

非必须

format: int64

├─ idNumber

string

非必须

├─ name

string

非必须

├─ password

string

非必须

├─ phone

string

非必须

├─ sex

string

非必须

├─ status

integer

非必须

format: int32

├─ updateTime

string

非必须

format: date-time

├─ updateUser

integer

非必须

format: int64

├─ username

string

非必须

msg

string

非必须

(2)根据id修改员工信息 接口

基本信息

Path: /admin/employee

Method: PUT

请求参数

Headers

参数名称

参数值

是否必须

示例

备注

Content-Type

application/json

Body

名称

类型

是否必须

默认值

备注

其他信息

id

integer

必须

format: int64

idNumber

string

必须

name

string

必须

phone

string

必须

sex

string

必须

username

string

必须

返回数据

名称

类型

是否必须

默认值

备注

其他信息

code

integer

必须

format: int32

data

string

非必须

msg

string

非必须

代码开发

  1. 在员工管理列表页面点击 “修改”按钮,跳转到修改页面
  2. 在修改员工页面录入员工相关信息
  3. 点击“保存”按钮完成修改操作

注意:

  • 由于添加员工和修改员工的表单项非常类似,所以添加和修改操作可以共用同一个页面(addEmployee.vue)
  • 修改员工涉及到原始数据回显,所以页面跳转时需要传递员工id作为参数


第一步

在员工管理页面中,为“修改”按钮绑定单击事件,用于跳转到修改页面

第二步

在methods中编写 handleUpdateEmp 方法,实现路由跳转

注意:使用路由对象的push方法在进行路由跳转时,可以通过地址栏传递参数,具体语法为:

this.$router.push({path: 路由路径, query:{参数名:参数值}})

第三步

在 addEmployee.vue 组件中定义模型数据optType,用于区分本次操作是新增还是修改


注意:区分当前操作是新增员工还是修改员工,只需要尝试获取路由参数id。如果能获取到则当前操作为修改,否则为新增。具体获取路由参数的语法为:

this.$router.query.参数名

第四步

如果是修改操作,需要根据id查询员工原始信息用于页面回显,需要在 employee.ts 中创建queryEmployeeById方法

注意:

  • 发送请求的方式和相关参数,必须和前面的接口设计保持一致
  • 使用此方法时,别忘了在组件中通过import导入

第五步:在 addEmployee.vue 组件的 created 方法中查询员工原始信息用于页面数据回显


到目前位置已经实现了员工信息的回显,可以进行简单的测试,如果回显没有问题再继续开发后面的代码

第六步

如果是修改操作,“保存并继续添加员工” 按钮则不需要显示,通过 v-if 指令进行判断

第七步

在 employee.ts 中创建方法,用于修改员工,发送Ajax请求

注意:

  • 发送请求的方式和相关参数,必须和前面的接口设计保持一致
  • 使用此方法时,别忘了在组件中通过import导入

第八步

修改 addEmployee.vue 组件中的 submitForm 方法,需要根据当前操作类型执行新增或者修改操作

套餐管理

套餐分页查询

需求分析与接口

要展示套餐分页数据,就需要前后端进行数据交互,对应的接口有两个:

  • 分类查询接口(用于套餐分类下拉框中分类数据展示)
  • 套餐分页查询接口

1)分类查询接口

基本信息

Path: /admin/category/list

Method: GET

请求参数

Query

参数名称

是否必须

示例

备注

type

2

分类类型:1为菜品分类,2为套餐分类

返回数据

名称

类型

是否必须

默认值

备注

其他信息

code

integer

必须

format: int32

data

object []

非必须

item 类型: object

├─ createTime

string

非必须

format: date-time

├─ createUser

integer

非必须

format: int64

├─ id

integer

非必须

format: int64

├─ name

string

非必须

├─ sort

integer

非必须

format: int32

├─ status

integer

非必须

format: int32

├─ type

integer

非必须

format: int32

├─ updateTime

string

非必须

format: date-time

├─ updateUser

integer

非必须

format: int64

msg

string

非必须

(2)套餐分页查询接口

基本信息

Path: /admin/setmeal/page

Method: GET

请求参数

Query

参数名称

是否必须

示例

备注

categoryId

分类id

name

套餐名称

page

页码

pageSize

每页记录数

status

套餐起售状态

返回数据

名称

类型

是否必须

默认值

备注

其他信息

code

number

必须

msg

null

非必须

data

object

非必须

├─ total

number

非必须

├─ records

object []

非必须

item 类型: object

├─ id

number

必须

├─ categoryId

number

必须

├─ name

string

必须

├─ price

number

必须

├─ status

number

必须

├─ description

string

必须

├─ image

string

必须

├─ updateTime

string

必须

├─ categoryName

string

必须


代码开发

先找到对应组件

router.ts

  1. 根据产品原型,制作页面头部效果(输入框、下拉框、查询按钮等)
  2. 动态填充套餐分类下拉框中的分类数据
  3. 为查询按钮绑定单击事件,发送Ajax请求,查询套餐分页数据,实现前后端交互
  4. 提供 vue 的初始化方法,在页面加载后就查询分页数据
  5. 使用ElementUI提供的表格组件展示分页数据
  6. 使用ElementUI提供的分页条组件实现翻页效果

制作页面头部效果

<template><div class="dashboard-container"><div class="container"><div class="tableBar"><label style="margin-right:5px">套餐名称:</label><el-input v-model="name" placeholder="请输入套餐名称" style="width:15%" /><!-- 选择器 --><label style="margin-right:5px">套餐分类:</label><el-select v-model="value" placeholder="请选择"><el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option></el-select><label style="margin-right:5px">套餐状态:</label><el-select v-model="saleStatus" placeholder="请选择"><el-option v-for="item in saleStatusArr" :key="item.value" :label="item.label" :value="item.value"></el-option></el-select><el-button type="primary" style="margin-left: 20px" @click="pageQuery()">查询</el-button><div style="float: right"><el-button type="danger">批量删除</el-button><el-button type="info">+新建套餐</el-button></div></div></div></div>
</template><script lang="ts">export default {data() {return {name: '', //套餐名称,对应上面的输入框page: 1, //当前页码pageSize: 10, //每页记录数total: 0, //总记录数records: [], //当前页要展示的数据集合options: [{value: '选项1',label: '黄金糕'}, {value: '选项2',label: '双皮奶'}, {value: '选项3',label: '蚵仔煎'}, {value: '选项4',label: '龙须面'}, {value: '选项5',label: '北京烤鸭'}],value: '',saleStatusArr:[{value:'0',label: '起售'},{value: '1',label: '停售'}]}}}
</script>

注意:当前套餐分类下拉框中的数据是直接在页面固定写死的,后续需要改为从后端动态获取。

动态填充套餐分类下拉框数据

现在需要将套餐分类下拉框中的数据改为动态获取,即前端需要发送Ajax请求,调用后端的分类查询接口,然后将后端返回的套餐分类数据动态展示在下拉框中。因为本次前后端交互是需要查询分类数据,所以按照项目规范,发送Ajax请求的代码需要定义到 src/api/category.ts 文件中。

此处只需要将此方法(getCategoryByType)导入当前组件,然后在 created 方法中调用此方法,获取套餐分类数据,动态填充套餐分类下拉框即可。

注意:因为此处我们要查询的是套餐分类,所以传递的参数type值为2。

前面我们已经初步实现了页面头部制作,并且可以填充下拉框中的数据了。但是命名上并不是特别规范,所以我们需要进行一个调整,具体修改后端的代码如下:

效果展示:


 

动态获取套餐分页数据

1、为查询按钮绑定单击事件

2、 在methods中定义 pageQuery 方法,先验证当前方法能否正常执行

注意:按照开发规范,真正发送Ajax请求的代码需要封装到 api目录下的ts文件中(src/api/setMeal.ts)

3、在src/api/setMeal.ts 中定义 getSetmealPage 方法,实现发送Ajax请求获取分页数据

注意:发送 Ajax 请求的URL地址需要和前面我们设计的分页查询接口对应

4、在套餐管理组件中导入 setMeal.ts 中定义的方法,并在data() 方法中定义分页相关的模型数据

注意:需要将属性和上面的输入框、下拉框进行双向绑定。

5、在pageQuery 方法中调用 getSetmealPage方法,实现前后端数据交互

自动发送Ajax请求

前面的代码我们已经实现了前后端数据交互,但是有一个问题,就是只有在点击查询按钮时才会发生Ajax请求,实现分页数据查询。我们通常需要的是在当前页面(组件)加载后,就需要发送Ajax请求,查询第一页的数据。要实现这个效果,我们可以通过vue的生命周期方法,即created方法来做到,

使用表格展示分页数据

使用ElementUI提供的表格组件

<div><el-table :data="records" stripe class="tableBox" style="width: 100%"><el-table-column type="selection" wide="25"/><el-table-column prop="name" label="套餐名字" width="180"></el-table-column><el-table-column label="图片"><template slot-scope="scope"><el-image style="width: 80px; height: 40px; border: none" :src="scope.row.image"></el-image></template></el-table-column><el-table-column prop="categoryName" label="套餐分类"></el-table-column><el-table-column prop="price" label="套餐价格"></el-table-column><el-table-column label="售卖状态"><div class="tableColumn-status" :class="{'stop-usr': scope.row.status === 0}">{{ scope.row.status === 0 ? "禁用" : "启用" }}</div></el-table-column><el-table-column prop="updateTime" label="最后操作时间"></el-table-column><el-table-column label="操作" align="center" width="250px"><template slot-scope="scope"><el-button type="text" size="small">修改</el-button><el-button type="text" size="small">{{ scope.row.status === 0 ? "启用" : "禁用"}}</el-button><el-button type="text" size="small">删除</el-button></template></el-table-column></el-table></div>

使用分页条实现翻页效果

使用 ElementUI 提供的分页条组件,并绑定事件处理函数

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

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

相关文章

010-GeoGebra基础篇-动态验证三角形外接圆的圆心是否可以位于三角形的外部

接下来我们将进行一些稍微高级一点操作&#xff0c;一边学习新东西的同时&#xff0c;也开始对数学、物理等内容的研究。 目录 一、项目截图二、涉及内容三、问题设置1. 问题提出2. 验证方案 三、做图步骤1. 绘制定点A、B&#xff1b;2. 绘制动点C&#xff1b;&#xff08;1&am…

万界星空科技铜管加工行业MES系统解决方案

一、行业背景与挑战 随着铜管加工行业的快速发展&#xff0c;传统的管理模式已难以满足日益增长的生产需求。为满足市场的高效率、高质量、低成本要求&#xff0c;企业急需一套智能化的管理系统来提升生产效率、优化资源配置和确保产品质量。因此&#xff0c;我们针对铜管加工行…

常用的限流算法有哪些?你听说过几种?

限流&#xff0c;就是指限制流量请求的频次。 在高并发情况下&#xff0c;它是一种保护系统的策略&#xff0c;避免了在流量高峰时系统崩溃&#xff0c;造成系统的不可用。 常见的限流算法有&#xff1a; 计数器限流算法滑动窗口限流算法漏桶限流算法令牌桶限流算法 1. 计数器…

【Python程序开发系列】教你使用Docker部署一个简单的Python应用程序(案例+源码)

这是我的第313篇原创文章。 一、引言 Docker 对于程序员来说&#xff0c;其实和Git差不多&#xff0c;基本上属于一个必备工具。如果你想使用这个工具&#xff0c;你就必须安装这个应用工具&#xff0c;至于在不同操作系统上安装Docker的方式网上有很多教程&#xff0c;这里不…

每天五分钟深度学习:解决for循环效率慢的关键在于向量化

本文重点 上一节课程中,我们学习了多样本的线性回归模型,但是我们的伪代码实现中使用了大量的for循环,这样代码的问题是效率很低。为了克服这一瓶颈,向量化技术应运而生,成为提升程序执行效率、加速数据处理速度的重要手段。 向量化技术概述 向量化(Vectorization)是…

MySQL-核心知识要点

1、索引的数据结构-Btree BTree的优势&#xff1a; B树的内节点无data&#xff0c;一个节点可以存储更多的K-V对。在构造树时&#xff0c;需要的内节点会更少&#xff0c;那么树的层级也会越低。查询一条数据时&#xff0c;1. 扫描的层级低&#xff0c;扫描过的节点更少&…

【netty系列-04】反应堆模式的种类和具体实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

数字化转型中,数字化如何重塑中小企业发展力?

引言&#xff1a;当前&#xff0c;我国中小微企业数字化转型处于“不平衡、不充分、不规范”阶段&#xff0c;普遍面临“不会转”“不能转”“不敢转”的困境。数字化转型可以帮助企业突破这些困境&#xff0c;实现更大的发展。更进一步&#xff0c;数字化转型是中小企业高质量…

学习笔记——动态路由——IS-IS中间系统到中间系统(基本概念)

二、IS-IS基本概念 1、IS-IS概述 IS-IS是ISO定义的OSI协议栈中的无连接网络服务(ConnectionLess Network Service&#xff0c;CLNS)的一部分&#xff0c;IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似&#xff0c;例如&#xff0c;运行IS-IS协议的直…

4.BeanFactory

可以看出BeanFactory表面上只有getBean相关的方法。 实际上控制反转、基本的依赖注入、Bean的生命周期的各种功能&#xff0c;都是由BeanFactory的实现类来实现的。&#xff08;DefaultListableBeanFactory&#xff09; DefaultListableBeanFactory管理单例对象DefaultSinglet…

杨万里,诚斋体的开创者

杨万里&#xff0c;字廷秀&#xff0c;号诚斋&#xff0c;生于南宋绍兴元年&#xff08;公元1127年&#xff09;&#xff0c;卒于南宋庆元二年&#xff08;公元1206年&#xff09;&#xff0c;享年79岁。在中国古代文学的璀璨星河中&#xff0c;南宋诗人杨万里以其清新脱俗、贴…

Android- Framework 非Root权限实现修改hosts

一、背景 修改system/etc/hosts&#xff0c;需要具备root权限&#xff0c;而且remount后&#xff0c;才能修改&#xff0c;本文介绍非root状态下修改system/etc/hosts方案。 环境&#xff1a;高通 Android 13 二、方案 非root&#xff0c;system/etc/hosts只有只读权限&…

机器学习python实践——关于管道模型Pipeline和网格搜索GridSearchCV的一些个人思考

最近在利用python跟着指导书进行机器学习的实践&#xff0c;在实践中使用到了Pipeline类方法和GridSearchCV类方法&#xff0c;并且使用过程中发现了一些问题&#xff0c;所以本文主要想记录并分享一下个人对于这两种类方法的思考&#xff0c;如果有误&#xff0c;请见谅&#…

【微服务】微服务之Feign 与 Ribbon

文章目录 强烈推荐引言优点Feign示例什么是Ribbon&#xff1f;Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件&#xff08;application.yml&#xff09;说明&#xff1a; Feign 与 Ribbon 结合使用的应用场景1. 动态服…

物联网的技术和应用有哪些?

随着科技的飞速发展&#xff0c;物联网已经成为连接世界的重要纽带&#xff0c;塑造着我们未来的生活。我们一起深入探索物联网的前沿技术和前瞻性应用&#xff0c;一窥未来的可能性。 获取物联网解决方案&#xff0c;YesPMP平台一站式物联网开发服务。 提示&#xff1a;智慧家…

图形的搭建

例一&#xff1a; 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输入&#xff0c;输出用“*”组成的X形图案。 示例一&…

爬数据是什么意思?

爬数据的意思是&#xff1a;通过网络爬虫程序来获取需要的网站上的内容信息&#xff0c;比如文字、视频、图片等数据。网络爬虫&#xff08;网页蜘蛛&#xff09;是一种按照一定的规则&#xff0c;自动的抓取万维网信息的程序或者脚本。 学习一些爬数据的知识有什么用呢&#x…

IPIDEA代理IP助力高效数据采集

IPIDEA代理IP助力高效数据采集 文章目录 IPIDEA代理IP助力高效数据采集&#x1f4d1;前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 选择代理IP的关键因素 三、IPIDEA海外IP代理的优势3.1 IPIDEA的显著优势3.2 IPIDEA的代理类型及应用 四、IPIDEA爬虫实战4…

Fragment+Viewpage2+FragmentStateAdapter实现滑动式标签布局

大家好&#xff0c;我是网创有方&#xff0c;今天记录下标签布局的实现方法&#xff0c;先看下效果图。 第一步&#xff1a;编写一个activity或者fragment。内含有一个viewpager2的适配器&#xff0c;适配器类型为FragmentStateAdapter。 ​ public class MediaCreateFragment…

VideoView视频组件

简介 VideoView 在Android中是一个用户界面组件&#xff0c;它允许开发者在Android设备的屏幕上播放视频文件。它是Android SDK的一部分&#xff0c;位于android.widget包中。VideoView提供了一种简单的方法来嵌入和控制视频播放&#xff0c;包括设置视频源、开始、暂停、 seek…