文章目录

  • 计算属性配置项 computed
    • HTML 结构
    • Vue 实例
    • 数据
    • 方法
    • 计算属性
    • 绑定数据和方法
    • 完整代码
  • vue3商品加减案例
  • 监听器配置项 watch
    • 简单类型写法
    • 深度监听写法


计算属性配置项 computed

使用 Vue 实现一个商品价格计算器,设置一个初始单价,初始数量为 1,用户可以通过加减按钮修改数量,并实时计算出总价。

下面将一步步详细解释上述代码的实现过程

HTML 结构

首先,我们需要在 HTML 文件中添加一个 div 元素作为 Vue 应用的根元素,并给其一个 id 值作为挂载点:

<div id="app"><!-- 在这里添加商品价格计算器的 HTML 结构 -->
</div>

在这个 div 元素中,我们可以添加一个标题标签、三个段落标签,前两个段落标签显示单价和数量,第三个段落标签用于显示计算出来的总价,其中加减按钮用于增加或减少数量:

<h1>商品价格计算器</h1>
<p>单价:{{ price }}</p>
<p>数量: <button v-show="num>0" @click="minus">-</button>{{num}}<button @click="plus">+</button></p>
<p>总价:{{ total }}</p>

这里我们使用了 Vue 的模板语法,通过 {{ }} 将数据绑定到 HTML 中。

Vue 实例

接下来,在 JavaScript 文件中创建一个 Vue 实例,将其挂载到 HTML 页面中的 div#app 元素上:

<script src="../js/vue3.js"></script>
<script>let vm = Vue.createApp({data() {return {price: 998,num: 1}},methods: {minus(){this.num--},plus(){this.num++}},// 计算属性配置项 实际应用中 某个数据是需要使用data中其他数据计算得到computed:{// 计算属性的具体配置是函数形式total(){// 必须返回一个数据return this.num*this.price}}})vm.mount('#app')
</script>

在 Vue 实例的选项中,我们需要先定义一些数据和方法。

数据

首先,我们需要设置一个初始单价、初始数量和总价的值,这里我们设置单价为 998 元,数量为 1,总价为 998 元:

data() {return {price: 998,num: 1}
},

这里使用了 Vue 实例的 data 选项,用于定义数据和变量。

方法

接着,我们需要定义两个方法 plusminus,用于增加或减少商品数量,并且实时计算出总价:

methods: {minus(){this.num--},plus(){this.num++}
}

这里我们使用了 Vue 实例的 methods 选项,用于定义方法。

计算属性

使用 computed 选项定义一个计算属性 total,用于计算商品的总价,其中计算方法是将 num 值乘以 price 值:

computed:{// 计算属性的具体配置是函数形式total(){// 必须返回一个数据return this.num*this.price}
}

绑定数据和方法

最后,我们需要将定义好的数据和方法绑定到 HTML 页面中的模板语法中:

<p>单价:{{ price }}</p>
<p>数量: <button v-show="num>0" @click="minus">-</button>{{num}}<button @click="plus">+</button></p>
<p>总价:{{ total }}</p>

这里使用了 Vue 的模板语法,通过 {{ }} 将数据绑定到 HTML 中,通过 v-show@click 将方法绑定到按钮的点击事件上。

完整代码

综上,以下是完整的商品价格计算器代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>商品价格计算器</title>
</head>
<body><div id="app"><h1>商品价格计算器</h1><p>单价:{{ price }}</p><p>数量: <button v-show="num>0" @click="minus">-</button>{{num}}<button @click="plus">+</button></p><p>总价:{{ total }}</p><!-- 计算属性的使用直接通过插值语法使用 --></div><script src="../js/vue3.js"></script><script>let vm = Vue.createApp({data() {return {price: 998,num: 1}},methods: {minus(){this.num--},plus(){this.num++}},// 计算属性配置项 实际应用中 某个数据是需要使用data中其他数据计算得到computed:{// 计算属性的具体配置是函数形式total(){// 必须返回一个数据return this.num*this.price}}})vm.mount('#app')</script>
</body>
</html>

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

vue3商品加减案例

在这里插入图片描述

这段代码是商家信息页面的 Vue 组件,主要作用是展示商家的基本信息和食品列表,并实现选择食品和结算功能。
它通过发送请求获取商家信息和食品列表数据,并在页面中展示出来。
用户可以通过点击加号和减号来选择需要购买的食品,同时底部购物车栏会实时更新已选择的食品的数量和总价格。
当用户点击去结算按钮时,会跳转到订单页面并将已选择的食品和总价格存储到 sessionStorage 中。
在页面加载前,组件会从 sessionStorage 中获取商家信息。

详细代码:

template 页面布局部分

<!-- 食品列表 --><ul class="choese"><li class="choese-img" v-for="(food, index) in foods" :key="index"><div><img src="../assets/img/sp01.png" alt=""><div><p>{{ food.foodName }}</p><p>{{ food.foodExplain }}</p><p>&yen;{{ food.foodPrice }}</p></div></div><div><i class="fa fa-minus-circle" @click="minus(index)"></i><span id="num">{{ food.num }}</span><i class="fa fa-plus-circle" @click="add(index)"></i></div></li></ul><!-- 底部购物车栏 --><div class="bottom-tab"><div><div><p>&yen;{{ allmoney }}</p><p>配送费{{ this.business.deliveryPrice }}</p></div><div><div><i class="fa fa-shopping-cart fa-lg"></i></div></div><div>{{ allnum }}</div></div><div id="pay" @click="gotoOrders">去结算</div></div></div>

script 部分主要定义了数据和方法,computed 部分定义了计算属性,watch 部分监听总价格变化,beforeMount 和 mounted 部分则分别在挂载前和挂载后发送请求获取数据。

<script>
import router from '@/router';
import axios from 'axios';export default {data () {return {// 商家信息business: {},// 食品列表foods: [],// 已选择的食品buyfoods: [],// 底部购物车栏样式paystyle: {pointerEvents: 'none',backgroundColor: 'gray'}}},methods: {// 去结算gotoOrders() {let login = sessionStorage.getItem('login')if (login == null) {router.push('/login')} else {// 跳转到订单页面router.push('/orders')// 筛选已选择的食品this.buyfoods = this.foods.filter((food) => {return food.num > 0})// 将已选择的食品和总价格存储到 sessionStoragesessionStorage.setItem('buyfoods',JSON.stringify(this.buyfoods))sessionStorage.setItem('allmoney',this.allmoney)}},// 增加已选择的食品数量add(index) {this.foods[index].num++},// 减少已选择的食品数量minus(index) {if (this.foods[index].num>0) {this.foods[index].num--}}},components: {},computed: {// 所有已选择食品的数量allnum() {let allnum = 0this.foods.forEach(food => {allnum += food.num});return allnum},// 所有已选择食品的总价格allmoney() {let allmoney = 0this.foods.forEach(food => {allmoney += food.foodPrice*food.num});allmoney += this.business.deliveryPricereturn allmoney}},watch: {// 监控总价格变化,根据商家的起送价格调整底部购物车栏样式allmoney(newVal,oldVal) {if (newVal > this.business.startPrice) {this.paystyle.pointerEvents = 'auto'this.paystyle.backgroundColor = 'rgb(77, 212, 77)'} else {this.paystyle.pointerEvents = 'none'this.paystyle.backgroundColor = 'gray'}}},// 生命周期钩子,在挂载前从 sessionStorage 中获取商家信息,并发送请求获取食品列表beforeMount(){this.business = JSON.parse(sessionStorage.getItem('business'))},mounted () {axios.get(`http://localhost:8888/elmjavaweb/food?businessId=${this.business.businessId}&action=query&foodName=&foodExplain=`).then((resp) => {this.foods = resp.data// 定义已选择的食品数量为 0this.foods.forEach(food => {food['num'] = 0});})},
}
</script>

样式部分定义了页面样式。

<style scoped>
/* 定义页面元素的样式 */
.wrapper{margin-bottom: 14vw;  /* 下边距为14vw */width: 100vw;  /* 宽度为100vw */
}
.location{width: 100vw;  /* 宽度为100vw */height: 12vw;  /* 高度为12vw */background-color: #0097ff;  /* 背景颜色为#0097ff */font-size: 3.5vw;  /* 字体大小为3.5vw */color: white;  /* 字体颜色为白色 */display: flex;  /* 设置为弹性盒子布局 */justify-content: center;  /* 主轴居中对齐 */align-items: center;  /* 交叉轴居中对齐 */font-size: 5vw;  /* 字体大小为5vw */
}
.business-img{width: 100vw;  /* 宽度为100vw */height: 60vw;  /* 高度为60vw */display: flex;  /* 设置为弹性盒子布局 */flex-direction: column;  /* 垂直方向排列 */align-items: center;  /* 交叉轴居中对齐 */
}
.business-img img{width: 40vw;  /* 宽度为40vw */height: 30vw;  /* 高度为30vw */margin-top: 3vw;  /* 上边距为3vw */margin-bottom: 3vw;  /* 下边距为3vw */
}
.business-img p:first-of-type{font-size: 5vw;  /* 字体大小为5vw */font-weight: bold;  /* 字体加粗 */
}
.business-img p:nth-of-type(2),p:last-of-type{color: #666;  /* 字体颜色为#666 */margin-top: 2vw;  /* 上边距为2vw */
}
.choese{width: 100vw;  /* 宽度为100vw */display: flex;  /* 设置为弹性盒子布局 */flex-direction: column;  /* 垂直方向排列 */margin-top: 0;  /* 上边距为0 */
}
.choese-img{height: 25vw;  /* 高度为25vw */display: flex;  /* 设置为弹性盒子布局 */justify-content: space-between;  /* 主轴空间平均分配 */align-content: center;  /* 交叉轴居中对齐 */margin-top: 0;  /* 上边距为0 */
}
.choese-img div:first-of-type{display: flex;  /* 设置为弹性盒子布局 */
}
.choese-img div:first-of-type img{width: 20vw;  /* 宽度为20vw */height: 20vw;  /* 高度为20vw */margin: 2.5vw;  /* 上下左右边距均为2.5vw */
}
.choese-img div:first-of-type div{display: flex;  /* 设置为弹性盒子布局 */flex-direction: column;  /* 垂直方向排列 */align-items: start;  /* 交叉轴起始对齐 */justify-content: space-around;  /* 主轴空间平均分配 */
}
.choese-img div:first-of-type div p{color: #666;  /* 字体颜色为#666 */font-size: 3.5vw;  /* 字体大小为3.5vw */
}
.choese-img div:first-of-type div p:first-of-type{font-weight: bold;  /* 字体加粗 */font-size: 4.5vw;  /* 字体大小为4.5vw */margin: 2vw 0;  /* 上边距为2vw,下边距为0 */
}
.choese-img div:first-of-type div p:last-of-type{margin-bottom: 2vw;  /* 下边距为2vw */
}
.choese-img div:last-of-type{display: flex;  /* 设置为弹性盒子布局 */justify-content: center;  /* 主轴居中对齐 */align-items: center;  /* 交叉轴居中对齐 */margin-top: 0;  /* 上边距为0 */margin-right: 2.5vw;  /* 右边距为2.5vw */
}
.fa-plus-circle{margin-top: 0;  /* 上边距为0 */color: #0097ff;  /* 字体颜色为#0097ff */
}
.fa-minus-circle{color: #888;  /* 字体颜色为#888 */
}
.bottom-tab{width: 100vw;  /* 宽度为100vw */height: 15vw;  /* 高度为15vw */position: fixed;  /* 定位方式为fixed */left: 0;  /* 左边距为0 */bottom: 0;  /* 下边距为0 */display: flex;  /* 设置为弹性盒子布局 */margin-top: 0;  /* 上边距为0 */
}
.bottom-tab div:first-of-type{background-color: #555;  /* 背景颜色为#555 */flex: 7;  /* 弹性盒子占据7份空间 */display: flex;  /* 设置为弹性盒子布局 */justify-content: center;  /* 主轴居中对齐 */
}
.bottom-tab div:first-of-type div:first-of-type{display: flex;  /* 设置为弹性盒子布局 */flex-direction: column;  /* 垂直方向排列 */align-items: start;  /* 交叉轴起始对齐 */color: #fff;  /* 字体颜色为白色 */font-size: 4.5vw;  /* 字体大小为4.5vw */margin-left: 20vw;  /* 左边距为20vw */
}
.bottom-tab div:first-of-type div:nth-of-type(2){position: fixed;  /* 定位方式为fixed */background-color: #555;  /* 背景颜色为#555 */width: 15vw;  /* 宽度为15vw */height: 15vw;  /* 高度为15vw */border-radius: 10vw;  /* 边框半径为10vw */left: 5vw;  /* 左边距为5vw */bottom: 5vw;  /* 下边距为5vw */
}
.bottom-tab div:first-of-type div:nth-of-type(2) div{width: 12vw;  /* 宽度为12vw */height: 12vw;  /* 高度为12vw */border-radius: 10vw;  /* 边框半径为10vw */background-color: #0097ff;  /* 背景颜色为#0097ff */display: flex;  /* 设置为弹性盒子布局 */justify-content: center;  /* 主轴居中对齐 */align-items: center;  /* 交叉轴居中对齐 */position: fixed;  /* 定位方式为fixed */margin: 0;  /* 边距为0 */left: 6.5vw;  /* 左边距为6.5vw */bottom: 6.5vw;  /* 下边距为6.5vw */
}
.bottom-tab div:first-of-type div:last-of-type{background-color: red;  /* 背景颜色为红色 */position: fixed;  /* 定位方式为fixed */width: 5vw;  /* 宽度为5vw */height: 5vw;  /* 高度为5vw */border-radius: 5vw;  /* 边框半径为5vw */font-size: 3.5vw;  /* 字体大小为3.5vw */left: 15vw;  /* 左边距为15vw */bottom: 15vw;  /* 离页面底部距离15vw */
}
.bottom-tab div:first-of-type div:first-of-type p:last-of-type{margin-top: 0; /* 上边距0 */font-size: 3vw; /* 字体大小3vw */color: #999; /* 字体颜色#999 */
}
.bottom-tab div:last-of-type{flex: 3;  /* flex子项占比3 */background-color: rgb(77, 212, 77);  /* 背景色rgb(77, 212, 77) */margin-top: 0;  /* 上边距0 */color: #fff;  /* 字体颜色白色 */display: flex;  /* 布局方式:flex */justify-content: center;  /* 在flex容器里居中显示 */align-items: center;  /* 在flex容器里居中显示 */font-size: 5vw;  /* 字体大小5vw */font-weight: bold; /* 字体加粗 */
}
#num{margin: 0 2vw;  /* 左右边距2vw */
}
</style>

监听器配置项 watch

提示:这里可以添加本文要记录的大概内容:

监听器配置项:监听某个数据的变化
定义函数:函数名必须是监听的数据名
Vue 调用此函数时会传入两个参:新值、旧值

Vue3 的监听器可以监听 Vue 实例中某个数据的变化,当这个数据变化时,就会自动执行相应的函数,这样可以实现一些自动更新页面、数据校验等功能。

具体来说,监听器主要有以下作用:

  1. 自动更新页面:当 Vue 实例的某个数据变化时,监听器可以自动更新相关的页面内容,而不需要手动修改 DOM。

  2. 数据校验:当 Vue 实例中的某个数据变化时,可通过监听器对输入的数据进行校验,保证数据的有效性。

  3. 数据同步:当 Vue 实例中的某个数据绑定到多个组件中时,可通过监听器实现数据的同步,保证数据的一致性。

  4. 监控数据变化:当 Vue 实例中的某个数据发生变化时,通过监听器可以获取到新旧值,从而实现数据的监控和统计。

Vue3 监听器是 Vue3 中非常重要的一个特性,它可以让我们的开发变得更加高效和灵活,使得我们能够更好地处理和管理数据。

简单类型写法

【示例代码】:
让数据减到零不再往下减

<!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><div id="app"><button @click="minus">-</button>{{num}}</div>
</body>
<script src="../js/vue3.js"></script>
<script>let vm = Vue.createApp({data() {return {num: 1}},methods: {minus(){this.num--}},})vm.mount('#app')
</script>
</html>

这段代码使用了 Vue3 的 createApp 方法创建了一个 Vue 实例 vm,实现了一个简单的计数器功能,点击按钮可以将 num 值递减。具体解释如下:

  1. 首先,使用 createApp 方法创建了一个 Vue 实例 vm,这个实例包含了 data、methods 等选项。

  2. 在 data 中定义了 num 属性,初始值为 1。

  3. 在 methods 中定义了一个 minus 方法,当按钮被点击时,会将 num 的值减 1。

  4. 最后,使用 vm.mount 方法将 Vue 实例挂载到页面上的 #app 元素上,使其生效。

但是现在可以减到负数

接下来加上监听器,用这种方式控制num的数量,到零就不在让他往下减

        // 监听器配置项:监听某个数据的变化watch: {// 定义函数 函数名必须是监听的数据名// Vue 调用此函数时会传入两个参 新值 旧值num(a,b){this.num = a<0?0:a// a<0吗?如果小于0正常赋值}}

深度监听写法

如果监听的事件在对象中,那么监听器的写法必须是深度监听写法

<!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><div id="app"><button @click="minus">-</button>{{goods.num}}</div>
</body>
<script src="../js/vue3.js"></script>
<script>let vm = Vue.createApp({data() {return {goods: {num: 1}}},methods: {minus(){this.goods.num--}},// 监听器配置项:监听某个数据的变化watch: {// 如果监听的事件在对象中,那么监听器的写法必须是深度监听写法goods:{deep:true,handler(a,b){this.goods.num = a.num<0?0:a.num}}}})vm.mount('#app')
</script>
</html>

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

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

相关文章

Mysql如何迁移数据库数据

文章目录一、使用 mysqldump 工具&#xff08;最常用&#xff09;&#xff08;一&#xff09;导出数据&#xff08;二&#xff09;导出数据库&#xff08;不含数据&#xff09;&#xff08;三&#xff09;导出指定表&#xff08;四&#xff09;导入数据二、直接拷贝文件三、使用…

为什么输入 URL 后会显示页面?HTTP 协议的 “幕后操作”

&#x1f680; 浏览器输入URL后&#xff0c;到底发生了什么&#xff1f;前端面试HTTP协议深度解析 今天咱们不聊八卦&#xff0c;来点硬核的——前端面试中绕不开的HTTP协议。是不是一提到“浏览器输入URL后发生了什么”&#xff0c;你就开始头大&#xff1f;别担心&#xff0c…

内网穿透原理和部署教程

前言&#xff1a;本文介绍了内网穿透技术原理及frp工具的部署方法。由于NAT映射表是临时且单向的&#xff0c;外网无法直接访问内网服务。通过部署公网服务器作为中转&#xff0c;frp实现了内网服务的穿透访问。具体步骤包括&#xff1a;下载frp软件包&#xff0c;详细说明了配…

Ping32:为企业数据安全筑起铜墙铁壁​

Ping32&#xff1a;为企业数据安全筑起铜墙铁壁在数字经济飞速发展的今天&#xff0c;企业数据已成为核心竞争力的重要组成部分。然而&#xff0c;数据泄露事件频发&#xff0c;给企业带来的损失难以估量。从商业机密外泄到客户信息曝光&#xff0c;每一次数据安全事故都可能让…

2025年国内iPaaS平台精选

在过去几年里&#xff0c;许多企业在业务系统中面临了诸多有关集成的难题&#xff1a;系统建好了&#xff0c;数据流不动&#xff1b;接口打通了&#xff0c;流程仍卡顿&#xff1b;工具堆叠越来越多&#xff0c;但协同效率反而走低。 这并不是架构设计的问题&#xff0c;也不是…

AD绘制PCB之-板外形设计

1、通过机械层1 【Mechanical 1】绘制出板子轮廓2、选中上面绘制得轮廓先选中一条边&#xff0c;然后按tab键&#xff0c;可以自动选择这条边闭合得线条3、按照选择对象定义设计--->板子形状------>按照选择对象定义执行后得效果&#xff1a;4、根据需要设置板子四角为半…

《汇编语言:基于X86处理器》第12章 浮点数处理与指令编码(2)

Intel X86架构数据的运算主要由通用寄存器处理&#xff0c;但浮点数例外&#xff0c;浮点数的运算由专门的FPU寄存器处理。二进制浮点数由三部分组成&#xff1a;符号&#xff0c;有效数字和阶码。这些格式都出自由IEEE组织制定的标准754-1985&#xff1a;以下是三种浮点数的格…

vue3通过按钮实现横向滚动、鼠标滚动横坐标滚动

效果图&#xff1a;可点击左右文字进行滚动、或通过滚动鼠标 内容左右滚动<template><div class"Home"><div style"display: flex;height: 100%;align-items: center;"><div click"scrollLeft()" style"width: 80px;t…

【Agent】AutoGen:LLM驱动的多Agent对话框架

文章目录一、AutoGen简介1.1 AutoGen的特点1.2 AutoGen的实现1.2.1 可对话Agent1.2.2 对话编程二、基于AutoGen构建多智能体系统2.1 构建步骤2.1 协作模式2.2 通信模型2.3 人机协同2.4 具体示例参考资料一、AutoGen简介 AutoGen是微软推出的一个Multi-Agent框架&#xff0c;允…

乙巳年闰六月十六凌晨感怀

乙巳年闰六月十六凌晨感怀 一段历程一段情&#xff0c;儿郎峥嵘儿郎行。 岁月流金建功业&#xff0c;春秋风尚能潮赢。 路途苦乐人生度&#xff0c;评说成败当下名。 百年孤寂留水墨&#xff0c;千载独步守安宁。

Redis 分布式Session

一、引入依赖引入spring-session-data-redis依赖&#xff0c;不需要指定version&#xff0c;默认和springboot的version保持一致<!-- Spring Session Redis --> <dependency><groupId>org.springframework.session</groupId><artifactId>spring…

JAVA实现附件分片上传

项目需求由于文件服务器的限制&#xff0c;单次调用文件上传接口上传的附件的大小不能超过500MB&#xff0c;对于超过500MB的附件需要分片上传程序示例private Boolean uploadFile(File uploadFile, String uploadUrl, List<Object> fileList) {final long CHUNK_SIZE 5…

PyTorch环境安装

pytorch安装 建议&#xff08;非常强烈的那种&#xff09;用Anaconda创建一个虚拟环境&#xff0c;用于运行安装你的PyTorch conda create -n universal python3.9 1. 基础认知 cuDNN&#xff08;CUDA Deep Neural Network library&#xff09;是 NVIDIA 开发的用于深度学习…

机场风云:AI 云厂商的暗战,广告大战一触即发

文 | 大力财经机场广告牌背后&#xff0c;一场决定云计算未来格局的隐形战争已悄然打响。当你匆匆走过首都机场T3航站楼的通道&#xff0c;巨幅屏幕上“阿里云&#xff1a;开源的力量”与不远处“百度智能云&#xff1a;AI落地领导者”的广告交相辉映。它们精准锁定着日均10万的…

MLE-STAR:谷歌AI推出的机器学习工程新范式,一种搜索驱动、精准优化的智能代理

最近看到 Google AI 发布了一个叫 MLE-STAR&#xff08;Machine Learning Engineering via Search and Targeted Refinement&#xff09;的新系统&#xff0c;说实话&#xff0c;第一眼看完论文和相关介绍后&#xff0c;我是有点震撼的。这不只是一次简单的“LLM 自动化”拼凑…

3-防火墙

防火墙 一 防火墙概述防火墙概述防火墙是一个位于内部网络与外部网络之间的安全系统&#xff08;网络中不同区域之间&#xff09;&#xff0c;是按照一定的安全策略建立起来的硬件或软件系统&#xff0c;用于流量控制的系统&#xff08;隔离&#xff09;&#xff0c;保护内部网…

python opencv 调用 海康威视工业相机(又全又细又简洁)

1.准备工作 准备一个海康相机 下载MVS 和SDK 海康机器人-机器视觉-下载中心 2.python MVS示例 &#xff08;说明&#xff1a;MVS里有很多python示例&#xff0c;可以直接运行&#xff0c;但没有用opencv&#xff09; 下载完MVS后&#xff0c;我们打开路径安装路径 我的&#…

计算机基础·linux系统

Finalshell 用于远程操控vmware中的linux系统 获取虚拟机的IP地址 ifconfig命令&#xff0c;重启系统后IP地址可能会变化&#xff01;问题&#xff1a;vmware子系统没有网络连接 winRservices.msc启动这些服务问题&#xff1a;配置正确但是finalshell连接失败 更新子系统中的ss…

8.结构健康监测选自动化:实时数据 + 智能分析,远超人工

第一次接触结构健康自动化监测系统&#xff0c;感觉成本很高&#xff0c;比人工好在哪里&#xff1f; 人工检测是依靠目测检查或借助于便携式仪器测量得到的信息&#xff0c;但是随着整个行业的发展&#xff0c;传统的人工检测方法已经不能满足检测需求&#xff0c;从人工检测到…

【慕伏白】Android Studio 配置国内镜像源

文章目录配置HTTP代理修改 gradle 镜像地址修改 maven 镜像源重新同步配置HTTP代理 进入File --> Settings --> Appearance & Behavior --> System Settings --> HTTP Proxy 勾选 Auto-detect proxy settings --> Automatic proxy configuration URL &…