《RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习》系列博客_Part4_三模态融合
系列博客目录
文章目录
- 系列博客目录
- 目标
- Step1:之前工作形成子组件
- Step2:弥补缺失的文本子组件,同时举例如何子组件向父组件传数据
- Step3:后端代码需要根据上传的文件传给python服务器
- Step4:python服务器进行分析
目标
实现三模态融合,将文本、图片、音频从前端上传,后端返回数据库数据。主要包含两种类别,电脑和弓。而且电脑和弓的数据在数据库中不同的表中,表的列名存在不同(仅最后一列不同)。
Step1:之前工作形成子组件
之前已经实现了图文识别、音文识别、音图识别的前端页面,而当时的要求,比如图文识别就是用户上传图片,得到相应文字信息(来自数据库)。所以图文识别,就已经写好了上传图片的vue。同理上传音频的vue也写好了。这次直接把之前的组件当作子组件。
Step2:弥补缺失的文本子组件,同时举例如何子组件向父组件传数据
通过下面代码可以看出,当点击按钮时,将文本框中内容传递给父组件。
文本子组件代码如下:
<template><div class="app-container"><label for="textInput">请输入文本内容:</label><textareaid="textInput"v-model="textContent"rows="5"placeholder="在此输入文本内容..."style="width: 100%; margin-bottom: 10px;"></textarea><el-buttontype="primary"@click="submitTextContent":disabled="!textContent.trim()">点击此按钮上传文本</el-button></div>
</template><script>
export default {name: "TextInput",data() {return {textContent: "", // 文本输入框内容};},methods: {submitTextContent() {// 通过事件将文本内容传递给父组件this.$emit("fileUploaded", this.textContent.trim());//trim()去除文本两端的空白字符this.$message.success("文本提交成功!");},},
};
</script>
当上面子组件点击按钮后,调用父组件fileUploaded指定的函数。 <PictureToText v-if="showChild" @fileUploaded="handleImageUpload" />
父组件中的表格的表头是根据后端返回的resultType 动态变化的。
setTimeout()函数是在延迟后,执行里面的代码。
父组件核心代码如下:
<template><div><div class="container"><!-- 模态选择区域 目前不需要,因为要直接提供三个模态的上传 -->
<!-- <el-radio-group v-model="radio2">-->
<!-- <el-radio :label="3">图片</el-radio>-->
<!-- <el-radio :label="6">音频</el-radio>-->
<!-- <el-radio :label="9">文本</el-radio>-->
<!-- </el-radio-group>--><!-- 图片上传区域 --><!-- 动态显示子组件 --><div class="child">
<!-- <PictureToText v-if="radio2 === 3 && showChild" @updateResult="handleResult"/>--><PictureToText v-if="showChild" @fileUploaded="handleImageUpload" /></div><!-- 音频上传区域 --><div class="child">
<!-- <AudioToText v-if="radio2 === 6"/>--><AudioToText v-if="showChild" @fileUploaded="handleAudioUpload" /></div><!-- 文本上传区域 --><div class="child"><TextUploader v-if="showChild" @fileUploaded="handleTextUpload"/></div><!-- 添加提交按钮 -->
<!-- <button v-if="showChild" @click="submitData">提交数据</button>--><!-- 提交按钮,独占一行 --><div class="button-container"><el-buttonv-if="showChild"type="primary"class="action-button"@click="submitData">提交数据进行分析</el-button></div></div><div><el-table v-if="tableOfResultVisible" v-loading="loading" element-loading-text="拼命分析中,预计加载结果需要等待大约10秒钟...." :data="jmwlList" >
<!-- <el-table-column type="selection" width="55" align="center" />--><el-table-column label="交易id" align="center" prop="交易id" show-overflow-tooltip/><el-table-column label="品牌" align="center" prop="品牌" show-overflow-tooltip/><el-table-column label="商品名称" align="center" prop="商品名称" show-overflow-tooltip /><el-table-column label="评论用户名" align="center" prop="评论用户名" show-overflow-tooltip/><el-table-column label="评论内容" align="center" prop="评论内容" show-overflow-tooltip/><el-table-column label="赞数" align="center" prop="赞数" show-overflow-tooltip/><el-table-column label="商品交易客体图片" align="center" ><template slot-scope="scope1"><img v-if="scope1.row.商品交易主体图片" :src="scope1.row.商品交易主体图片" prop="商品交易客体图片" style="width:100px;height:100px;cursor:pointer" @click="showImage(scope1.row.商品交易主体图片)"/><img v-else src="./default.jpg" style="width:100px;height:100px"/><el-dialog :visible="dialogVisible" @close="dialogVisible=false"><img :src="dialogImageUrl" style="width:300px;height:300px"/></el-dialog></template></el-table-column><el-table-column label="商品交易客体图片1" align="center" ><template slot-scope="scope1"><img v-if="scope1.row.商品交易客体图片1" :src="scope1.row.商品交易客体图片1" prop="商品交易客体图片1" style="width:100px;height:100px;cursor:pointer" @click="showImage(scope1.row.商品交易客体图片1)"/><img v-else src="./default.jpg" style="width:100px;height:100px"/><el-dialog :visible="dialogVisible" @close="dialogVisible=false"><img :src="dialogImageUrl" style="width:300px;height:300px"/></el-dialog></template></el-table-column><el-table-column label="产品质量" align="center" prop="产品质量" show-overflow-tooltip/><el-table-column label="产品价格" align="center" prop="产品价格" show-overflow-tooltip/><el-table-column label="客户评分" align="center" prop="客户评分" show-overflow-tooltip/><el-table-column label="店铺总分" align="center" prop="店铺总分" show-overflow-tooltip/><el-table-column label="店铺名称" align="center" prop="店铺名称" show-overflow-tooltip/><el-table-column label="店铺链接" align="center" prop="店铺链接" show-overflow-tooltip/><el-table-column label="评论类别" align="center" prop="评论类别" show-overflow-tooltip/><el-table-column label="交易平台" align="center" prop="交易平台" show-overflow-tooltip/>
<!-- <el-table-column label="疑似假冒伪劣原因" align="center" prop="疑似假冒伪劣原因" show-overflow-tooltip/>--><el-table-column v-if="resultType === 0" label="疑似假冒伪劣原因" align="center" prop="疑似假冒伪劣原因" show-overflow-tooltip/><el-table-column v-else-if="resultType === 1" label="疑似禁限售原因" align="center" prop="疑似禁限售原因" show-overflow-tooltip/></el-table><!-- 条件显示,当数据总数大于 0 时显示分页组件 --><!-- 数据总数,决定分页的总页数 --><!-- 当前页码,使用.sync实现双向绑定 --><!-- 每页显示的数据条数,使用.sync实现双向绑定 --><!-- 当分页发生变化时触发的事件,调用getList函数 --><paginationv-show="tableOfResultVisible":total="total":page.sync="queryParams.pageNum":limit.sync="queryParams.pageSize"@pagination="getList"/></div></div>
</template><script>
import PictureToText from "../../pictureToText/pictureToText/index.vue";
import AudioToText from "../../audioToText/audioToText/index.vue"
import TextUploader from "@/views/3MFusion/3MFusion/TextUploader.vue";
import {uploadAudioToText, uploadPictureToText, uploadTextToText} from "@/api/pictureToText/pictureToText";export default {components: {TextUploader, PictureToText,AudioToText },name: "ThreeMFusion",data() {return {//用来判断哪一类文件已经上传textFile: null,imageFile: null,audioFile: null,showChild: true, // 控制子组件是否显示tableOfResultVisible: false,//控制结果表格是否显示// 遮罩层loading: true,// 总条数total: 0,// 假冒伪劣产品研究表格数据也可以显示禁限售表格数据,通过后端传过来的resultType动态参数决定jmwlList: [],// 弹出层标题title: "",// 表单参数form: {},// 表单校验rules: {}};},methods: {//显示哪一模态的文件已经上传handleTextUpload(file) {this.textFile = file;},handleImageUpload(file) {this.imageFile = file;},handleAudioUpload(file) {this.audioFile = file;},submitData() {this.loading = true;if (this.textFile) {this.tableOfResultVisible = true;this.showChild = false;console.log('提交文本数据:', this.textFile);uploadTextToText({ content: this.textFile }).then((response) => {if (response.code === 200) {setTimeout(() => {this.loading = false;this.jmwlList = response.rows;this.total = response.total;this.resultType = response.resultType;}, 5000);}});} else if (this.imageFile) {this.showChild = false;this.tableOfResultVisible = true;console.log('提交图片数据到3MFusion');uploadPictureToText(this.imageFile).then(response => {if (response.code === 200) {this.imgUrl=response.pictureUrl;console.log(this.imgUrl);setTimeout(() => {this.loading = false;this.jmwlList = response.rows;this.total = response.total;this.resultType = response.resultType;}, 5000);}});} else if (this.audioFile) {this.showChild = false;this.tableOfResultVisible = true;console.log('提交音频数据到3MFusion');uploadAudioToText(this.audioFile).then(response => {if (response.code === 200) {console.log("uploadAudio()已完成");this.audioUrl = response.audioUrlconsole.log(response.audioUrl);setTimeout(() => {this.loading = false;this.jmwlList = response.rows;this.total = response.total;this.resultType = response.resultType;}, 5000);}});} else {this.$message.error("没有可提交的数据!");console.warn('没有可提交的数据');}},}
};
</script>
Step3:后端代码需要根据上传的文件传给python服务器
@PostMapping("/uploadAudioToText")public TableDataInfo insertUploadOfAudio(@RequestParam("audioName") MultipartFile file) throws Exception{List<Integer> idsList = new ArrayList<>();int resulttype = -1;if (!file.isEmpty()){LoginUser loginUser = getLoginUser();String audioPath = FileUploadUtils.upload(RuoYiConfig.getAudioPath(), file, MimeTypeUtils.MEDIA_EXTENSION);Upload upload=new Upload();upload.setUsername(loginUser.getUsername());upload.setAudioPath(audioPath);String pictureName=audioPath.substring(audioPath.lastIndexOf("/")+1,audioPath.length());upload.setPictureName(pictureName);if (iUploadService.insertUpload(upload)!=0){try {// 定义 URLURL url = new URL("http://127.0.0.1:6000/api");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", "application/json; utf-8");connection.setRequestProperty("Accept", "application/json");connection.setDoOutput(true);String number = String.valueOf(6);String jsonInputString = "{\"audioPath\": \"" + audioPath + "\", \"number\": " + number + "}";try (OutputStream os = connection.getOutputStream()) {byte[] input = jsonInputString.getBytes("utf-8");os.write(input, 0, input.length);}// 检查响应码int responseCode = connection.getResponseCode();if (responseCode == 200) {// 读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();// 打印完整的响应内容System.out.println("Python 服务返回的数据: " + response);// 将响应字符串解析为 JSON 数组try {
// JSONArray jsonResponse = new JSONArray(response.toString());JSONArray jsonResponse = JSONArray.parseArray(response.toString());// 查看 jsonResponse 的长度int length = jsonResponse.size(); // 获取 JSONArray 的长度System.out.println("JSON 数组的长度: " + length);// 获取第一个元素,应该是数字(0 或 1)resulttype = jsonResponse.getIntValue(0); // 这里获取 0 或 1JSONArray idsArray = jsonResponse.getJSONArray(1); // 获取 IDs 数组// 打印 type 和 idsSystem.out.println("type: " + resulttype);System.out.println("ids: " + idsArray);// 如果你需要将 ids 转换为 Java List,可以使用以下方法for (int i = 0; i < idsArray.size(); i++) {idsList.add(Integer.valueOf(idsArray.getString(i))); // 添加每个 ID}System.out.println("IDs as List: " + idsList);} catch (Exception e) {e.printStackTrace();System.err.println("解析 JSON 响应时发生错误.");}} else {System.err.println("HTTP 请求失败,响应码: " + responseCode);}connection.disconnect();} catch (Exception e) {e.printStackTrace();}}}if(resulttype==0){List<Jmwl> list = jmwlService.selectJmwlListByIdList(idsList);return getDataTable(list,resulttype);}else {List<Jxs> list = jxsService.selectJxsListByIdList(idsList);System.out.println("resulttype = " + resulttype);return getDataTable(list,resulttype);}}
Step4:python服务器进行分析
from database_server import get_ids_by_keyword # 导入函数
from flask import Flask, jsonify, request
from detectKeyword import detect_keyword
from audio import getKeywordOfAudio
import sys
import os# 将项目根目录添加到 sys.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))from predict import get_keywordOfImage # 导入 predict.py 中的函数app = Flask(__name__)@app.route('/api', methods=['POST'])
def api():data = request.json # 假设数据通过 JSON 格式传递file_type = data.get('number')print("file_type = ", file_type)# 根据类型处理不同逻辑if file_type == 3:# 图像处理逻辑image_path = data.get('imagePath')print("image_path+file_type: " + str(image_path) + str(file_type))keyword = get_keywordOfImage(image_path)elif file_type == 6:# 音频处理逻辑audioPath = data.get('audioPath')print("audioPath =" + str(audioPath))keyword = getKeywordOfAudio(audioPath)keyword = detect_keyword(keyword)else:# 处理不支持的类型contextOfText = data.get('context')keyword = detect_keyword(contextOfText)ids = get_ids_by_keyword(keyword) # 调用函数查询print(f"与关键词 '{keyword}' 相关的 ID 列表: {ids}") # 打印结果if keyword == "电脑":response = [0, ids]elif keyword == "弓":response = [1, ids]else:response = [None, ids]return jsonify(response)if __name__ == "__main__":app.run(port=6000)
python服务器输出示例
file_type = 9
keyword = 弓
与关键词 ‘弓’ 相关的 ID 列表: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71]
返回给java后端的数据示例如下,第一个0,代表电脑。
[0,[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71]]
相关文章:
《RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习》系列博客_Part4_三模态融合
系列博客目录 文章目录 系列博客目录目标Step1:之前工作形成子组件Step2:弥补缺失的文本子组件,同时举例如何子组件向父组件传数据Step3:后端代码需要根据上传的文件传给python服务器Step4:python服务器进行分析 目标 实现三模态融合,将文本、图片、音频…...
springboot365高校疫情防控web系统(论文+源码)_kaic
毕 业 设 计(论 文) 题目:高校疫情防控的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为…...
STM32 USART串口数据包
单片机学习! 目录 前言 一、数据包 二、HEX数据包 三、文本数据包 四、HEX数据包和文本数据包优缺点 4.1 HEX数据包 4.2 文本数据包 五、HEX数据包接收 六、文本数据包接收 总结 前言 本文介绍了串口数据包收发的思路和流程。 一、数据包 数据包的作用是把一个个单独…...
【LC】3232. 判断是否可以赢得数字游戏
题目描述: 给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中,Alice 可以从 nums 中选择所有个位数 或 所有两位数,剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和,则 Alice 获胜。如果…...
Linux基础学习--vi与vim
0.绪论 前面的内容基本学完了相关命令行,后面进行shell与shell script的学习。第一部分就是编辑器的学习,之前有写过vi/vim编辑器,但是我看了一下鸟哥这个非常详细,还是打算重头学习一下。 1.vi/vim的使用 一般命令模式(command…...
JavaScript 高级教程:异步编程、面向对象与性能优化
在前两篇教程中,我们学习了 JavaScript 的基础和进阶内容。这篇文章将带领你进入更深层次,学习 JavaScript 的异步编程模型、面向对象编程(OOP),以及性能优化的技巧。这些内容对于构建复杂、流畅的前端应用至关重要。 …...
qt QToolBox详解
1、概述 QToolBox是Qt框架中的一个控件,它提供了一个带标签页的容器,用户可以通过点击标签页标题来切换不同的页面。QToolBox类似于一个带有多页选项卡的控件,但每个“选项卡”都是一个完整的页面,而不仅仅是标签。这使得QToolBo…...
翁知宜荣获“易学名师”与“国学文化传承人”称号
在2024年10月19日举行的北京第六届国学文化传承峰会上,翁知宜老师以其在易学界的卓越成就和对国学文化的传承与发扬,荣获“易学名师”和“国学文化传承人”两项荣誉称号。 翁知宜老师在易经学术竞赛中荣获第一名,其深厚的易学造诣和对玄学学…...
20241128解决Ubuntu20.04安装libwxgtk3.0-dev异常的问题
20241128解决Ubuntu20.04安装libwxgtk3.0-dev异常的问题 2024/11/28 16:17 缘起:中科创达的高通CM6125开发板的Android10的编译环境需要。 安装异常:rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ sudo apt-get install libwxgtk3.0-de…...
sql分类
SQL(Structured Query Language)是一种用于管理和操作关系数据库管理系统(RDBMS)的编程语言。SQL 可以分为几个主要类别,每个类别都有其特定的用途和功能。以下是 SQL 的主要分类: 1. 数据定义语言&#x…...
stm32里一个定时器可以提供多路信号吗?
在STM32中,一个定时器通常只能提供一组信号(如输出PWM波形、定时中断等)。但是,定时器的多个通道可以提供不同的信号。例如,STM32的定时器可以通过不同的输出通道产生多种PWM信号,每个通道可以配置为不同的…...
Java安全—原生反序列化重写方法链条分析触发类
前言 在Java安全中反序列化是一个非常重要点,有原生态的反序列化,还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化,这部分内容对于没Java基础的来说可能有点难,包括我。 序列化与反序列化 序列化:将内存…...
2023考研王道计算机408数据结构+操作系统+计算机组成原理+计算机网络
from: https://blog.csdn.net/weixin_46118419/article/details/125611299 写得很好! 轻重缓急 2023考研计算机408【王-道计算机408】数据结构操作系统计算机组成原理计算机网络 网盘-链接:https://pan.baidu.com/s/13JraxUYwNVPeupdzprx5hA?pwd5h3d 提…...
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-files.py
files.py ultralytics\utils\files.py 目录 files.py 1.所需的库和模块 2.class WorkingDirectory(contextlib.ContextDecorator): 3.def spaces_in_path(path): 4.def increment_path(path, exist_okFalse, sep"", mkdirFalse): 5.def file_age(path__fi…...
「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器
本篇将带你实现一个颜色选择器应用。用户可以从预设颜色中选择,或者通过输入颜色代码自定义颜色来动态更改界面背景。该应用展示了如何结合用户输入、状态管理和界面动态更新的功能。 关键词 UI互动应用颜色选择器状态管理用户输入界面动态更新 一、功能说明 颜色…...
ELK(Elasticsearch + logstash + kibana + Filebeat + Kafka + Zookeeper)日志分析系统
文章目录 前言架构软件包下载 一、准备工作1. Linux 网络设置2. 配置hosts文件3. 配置免密登录4. 设置 NTP 时钟同步5. 关闭防火墙6. 关闭交换分区7. 调整内存映射区域数限制8. 调整文件、进程、内存资源限制 二、JDK 安装1. 解压软件2. 配置环境变量3. 验证软件 三、安装 Elas…...
07.ES11 08.ES12
7.1、Promise.allSettled 调用 allsettled 方法,返回的结果始终是成功的,返回的是promise结果值 <script>//声明两个promise对象const p1 new Promise((resolve, reject) > {setTimeout(() > {resolve("商品数据 - 1");}, 1000)…...
linux一键部署apache脚本
分享一下自己制作的一键部署apache脚本: 脚本已和当前文章绑定,请移步下载(免费!免费!免费!) (单纯的分享!) 步骤: 将文件/内容上传到终端中 …...
2022 年 6 月青少年软编等考 C 语言三级真题解析
目录 T1. 制作蛋糕思路分析T2. 找和最接近但不超过K的两个元素思路分析T3. 数根思路分析T4. 迷信的病人思路分析T5. 算 24思路分析T1. 制作蛋糕 小 A 擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要 2 2 2 个单位的香蕉, 250 250 250 个单位的面粉, 75 75 75 个单位的…...
MySQL - Why Do We Need a Thread Pool? - mysql8.0
MySQL - Why Do We Need a Thread Pool? - mysql8.0 本文主要由于上次写的感觉又长又臭, 感觉学习方法有问题, 我们这次直接找来了 thread pool 的原文,一起来看看官方的开发者给出的blog – 感觉是个大神 但是好像不是最官方的 ,…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
Linux入门课的思维导图
耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...
