通过代码获取接口文档工具
通过代码获取接口文档工具
- 介绍
- 使用到的技术
- 使用说明
- 核心源码
- 演示截图
- 工具源码
介绍
1.通过前后端代码来生成规格化的接口文档
2.支持拖拽上传或点击选择文件,可以一次选择多个文件或选择文件夹
3.用户选择前后端代码,工具调用GPT解析,得到规范化的接口文档
4.接口文档为markdown格式,可在线预览,也可以将文档导出
使用到的技术
1.vue3
2.v-md-editor
3.通义千问的接口
4.代码由mastergo设计页面,trae进一步调整代码
使用说明
需要配置sk,可在阿里云申请;然后替换代码 util/util.js 的sk
核心源码
App.vue
<script setup>
import {nextTick, ref} from 'vue'
import Message from './utils/message.js'
import {callGpt} from "@/utils/util";// 存储选中的文件
const selectedFiles = ref([])
// 预览的markdown内容
const previewContent = ref('')
// 控制预览对话框显示
const showPreview = ref(false)// 处理文件拖拽
const handleDrop = (e) => {e.preventDefault()const files = e.dataTransfer.fileshandleFiles(files)
}const fileInputLoading = ref(false);
const fileInput = ref();// 处理文件选择
const handleFileSelect = (e) => {const files = e.target.fileshandleFiles(files)nextTick(() => {fileInputLoading.value = true;});
}const selectBtn = () => {fileInputLoading.value = false;nextTick(() => {fileInput.value.click()});
}const selectDirBtn = async () => {try {const dirHandle = await window.showDirectoryPicker()// 清空已选择的文件selectedFiles.value = []// 递归处理文件夹await processDirectory(dirHandle, '')Message.success('文件夹导入成功')} catch (err) {if (err.name !== 'AbortError') {Message.error('选择文件夹失败')console.error(err)}}
}// 递归处理文件夹
const processDirectory = async (dirHandle, path) => {for await (const entry of dirHandle.values()) {if (entry.kind === 'file') {const file = await entry.getFile()selectedFiles.value.push({file: file,relativePath: path ? `${path}/${file.name}` : file.name})} else if (entry.kind === 'directory') {const newPath = path ? `${path}/${entry.name}` : entry.nameawait processDirectory(entry, newPath)}}
}// 处理文件
const handleFiles = (files) => {for (let file of files) {// 检查文件类型if (!isValidFileType(file)) {Message.warning(`不支持的文件类型: ${file.name}`)continue}selectedFiles.value.push({file: file,relativePath: file.name})}
}// 检查文件类型
const isValidFileType = (file) => {const validTypes = ['.java', '.py', '.js', '.ts', '.go', '.cpp', '.c', '.h', '.txt', '.json']return validTypes.some(type => file.name.toLowerCase().endsWith(type))
}// 清空文件列表
const clearFiles = () => {selectedFiles.value = []Message.info('文件列表已清空')
}// 移除单个文件
const removeFile = (index) => {selectedFiles.value.splice(index, 1)
}// 生成接口文档
const generateDocs = async () => {if (selectedFiles.value.length === 0) {Message.warning('请先选择文件');return;}try {// 读取所有文件内容const fileContents = await Promise.all(selectedFiles.value.map(async (item) => {const content = await item.file.text();return {path: item.relativePath,content: content};}));// 构建提示词const prompt = `请帮我分析以下代码文件,生成一份完整的接口文档,接口文档要规范化,要包含请求和返回示例:\n\n${fileContents.map(file =>`文件路径:${file.path}\n文件内容:\n${file.content}\n---\n`).join('\n')}`;Message.info('正在生成文档...');previewContent.value = ''; // 清空之前的内容showPreview.value = true;await callGpt(prompt, (content) => {// 实时更新预览内容previewContent.value = content;}, ()=> {Message.success('文档生成成功');});} catch (error) {Message.error('文档生成失败');console.error(error);}
}// 导出markdown文档
const exportMarkdown = () => {const blob = new Blob([previewContent.value], { type: 'text/markdown' })const url = URL.createObjectURL(blob)const link = document.createElement('a')link.href = urllink.download = 'api-docs.md'document.body.appendChild(link)link.click()document.body.removeChild(link)URL.revokeObjectURL(url)Message.success('文档导出成功')
}
</script><template><div class="bg-gray-50" style="width: 100%; height: 100%"><div class="w-[1200px] mx-auto"><nav class="h-16 bg-white shadow-sm flex items-center justify-between px-8"><div class="flex items-center space-x-2"><span class="text-2xl font-['Pacifico'] text-primary">logo</span><span class="text-lg font-medium">接口文档生成器</span></div><button class="w-10 h-10 rounded-button flex items-center justify-center hover:bg-gray-100 transition-colors"><i class="fas fa-sun text-gray-600"></i></button></nav><main class="px-8 py-12"><div class="max-w-3xl mx-auto"><div class="bg-white rounded-lg shadow-sm p-8"><div id="dropArea"class="drag-area rounded-lg p-12 text-center"@drop="handleDrop"@dragover.prevent@dragenter.prevent><input v-if="!fileInputLoading"ref="fileInput"type="file"id="fileInput"class="file-input"multiple@change="handleFileSelect"><div class="space-y-4"><div class="w-20 h-20 mx-auto bg-gray-50 rounded-full flex items-center justify-center"><i class="fas fa-cloud-upload-alt text-4xl text-gray-400"></i></div><div><h3 class="text-lg font-medium">拖拽文件到这里,或</h3><button @click="selectBtn"class="mt-2 px-6 py-2 bg-primary text-white rounded-button hover:bg-primary/90 button-hover whitespace-nowrap">点击选择文件</button><button @click="selectDirBtn"class="ml-4 mt-2 px-6 py-2 bg-primary text-white rounded-button hover:bg-primary/90 button-hover whitespace-nowrap">点击选择文件夹</button></div><p class="text-sm text-gray-500">支持的文件格式:.java, .py, .js, .ts, .go, .cpp, .c, .h, .txt, .json</p></div></div><div id="fileList" class="mt-8 space-y-4" :class="selectedFiles.length > 0 ? '' : ' hidden'"><div class="text-lg font-medium mb-4">已选择的文件</div><div class="space-y-3"><template v-for="(item, index) in selectedFiles" :key="index"><div class="flex items-center justify-between p-3 bg-gray-50 rounded-md"><div class="flex items-center"><i class="fas fa-file-code text-primary mr-3"></i><span class="text-gray-600 text-sm mr-2">{{ item.relativePath }}</span><span>{{ item.file.name }}</span></div><button class="text-red-500 hover:text-red-700" @click="removeFile(index)"><i class="fas fa-times"></i></button></div></template></div><div class="flex justify-end space-x-3 mt-6"><button @click="clearFiles"class="px-6 py-2 text-gray-600 bg-gray-100 rounded-button hover:bg-gray-200 button-hover whitespace-nowrap">清空列表</button><button @click="generateDocs"class="px-6 py-2 text-white bg-primary rounded-button hover:bg-primary/90 button-hover whitespace-nowrap">生成接口文档</button></div></div></div><div class="mt-12 bg-white rounded-lg shadow-sm p-8"><h2 class="text-xl font-medium mb-6">使用说明</h2><div class="space-y-4 text-gray-600"><div class="flex items-start space-x-3"><div class="w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5"><i class="fas fa-check text-sm text-primary"></i></div><p>支持拖拽上传或点击选择文件,可以一次选择多个文件或选择文件夹</p></div><div class="flex items-start space-x-3"><div class="w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5"><i class="fas fa-check text-sm text-primary"></i></div><p>在选择文件夹时会将之前选择的文件列表清空,请注意操作</p></div><div class="flex items-start space-x-3"><div class="w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5"><i class="fas fa-check text-sm text-primary"></i></div><p>用户选择前后端代码,工具调用GPT解析,得到规范化的接口文档</p></div><div class="flex items-start space-x-3"><div class="w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5"><i class="fas fa-check text-sm text-primary"></i></div><p>接口文档为markdown格式,可在线预览,也可以将文档导出</p></div></div></div></div></main></div></div><!-- 添加预览对话框 --><div v-if="showPreview" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50"><div class="bg-white w-4/5 h-4/5 rounded-lg p-6 flex flex-col"><div class="flex justify-between items-center mb-4"><h3 class="text-xl font-medium">接口文档预览</h3><div class="space-x-2"><button @click="exportMarkdown" class="px-4 py-2 bg-primary text-white rounded-button hover:bg-primary/90">导出文档</button><button @click="showPreview = false" class="px-4 py-2 bg-gray-100 text-gray-600 rounded-button hover:bg-gray-200">关闭</button></div></div><div class="flex-1 overflow-auto preview"><v-md-editor v-model="previewContent" mode="preview"></v-md-editor></div></div></div>
</template><style>
body {min-height: 100vh;
}#app {min-height: 100vh;
}body::-webkit-scrollbar {width: 15px;
}body::-webkit-scrollbar-track {background: #f1f5f9;border-radius: 8px;
}body::-webkit-scrollbar-thumb {background: #6366f1;border-radius: 8px;border: 2px solid #f1f5f9;
}body::-webkit-scrollbar-thumb:hover {background: #4f46e5;
}.drag-area {border: 2px dashed #E5E7EB;transition: all 0.3s ease;
}.drag-area:hover {border-color: #4F46E5;
}.file-input {display: none;
}.button-hover {transition: transform 0.2s ease;
}.button-hover:active {transform: translateY(2px);
}.preview::-webkit-scrollbar {width: 15px;
}.preview::-webkit-scrollbar-track {background: #f1f5f9;border-radius: 8px;
}.preview::-webkit-scrollbar-thumb {background: #6366f1;border-radius: 8px;border: 2px solid #f1f5f9;
}.preview::-webkit-scrollbar-thumb:hover {background: #4f46e5;
}
</style>
演示截图
1.工具首页
2.操作页面-选择文件
3.生成接口文档页面1
4.生成接口文档页面2
工具源码
接口文档工具
相关文章:
通过代码获取接口文档工具
通过代码获取接口文档工具 介绍使用到的技术使用说明核心源码演示截图工具源码 介绍 1.通过前后端代码来生成规格化的接口文档 2.支持拖拽上传或点击选择文件,可以一次选择多个文件或选择文件夹 3.用户选择前后端代码,工具调用GPT解析,得到规…...
不再卡顿!如何根据使用需求挑选合适的电脑内存?
电脑运行内存多大合适?在选购或升级电脑时,除了关注处理器的速度、硬盘的容量之外,内存(RAM)的大小也是决定电脑性能的一个重要因素。但究竟电脑运行内存多大才合适呢?这篇文章将帮助你理解不同使用场景下适…...
leetcode589 N叉树的前序遍历
前序遍历的顺序是:根节点 -> 子节点1 -> 子节点2 -> ... -> 子节点N 递归: class Solution { private:void traverse(Node* cur, vector<int>& res){if(cur NULL) return;res.push_back(cur->val);for(Node* child: cur->…...
游戏引擎学习第216天
回顾并为当天做准备 你可以看到,游戏现在正在运行。如果我没记错的话,我们之前把调试系统关闭了,留下一个状态,让任何想要在这段时间内进行实验的人可以自由操作,因为我们还没有完全完成这个系统。所以这样做是为了确…...
JavaSE反射机制干货
1.反射(Relection) 理解 定义:程序运行状态,动态地获取程序信息及调用程序功能即为java反射机制 2.获取class对象 掌握 2.1 Java代码的3个阶段 Java代码在计算机中经历的三个阶段:Source源代码阶段-Class类对象阶段-Runt…...
[特殊字符] 第十一讲 | 空间回归模型实战:SAR / SEM / GWR逐个击破
📘 专栏:科研统计方法实战分享 | 地学/农学人的数据分析工具箱 ✍️ 作者:平常心0715 🔑 本讲关键词:空间滞后模型(SAR)、空间误差模型(SEM)、地理加权回归(G…...
AI前沿周报:2025年3月技术深度解析
以下是基于2024-2025年AI技术前沿动态的深度技术周报示例,结合行业最新突破与研究进展,突出技术原理与应用场景分析: AI前沿周报:2025年3月技术深度解析 时间范围:2025年3月1日-3月31日 本期焦点:模型透明…...
aidigu开源微博项目程序,PHP开发的开源微博系统,自媒体个人创业、网盘推广首先
一、软件介绍 文末提供程序和源码下载学习 PHP开发的开源微博系统,采用PHP MySQL开发,框架采用ThinkPHP5.1,用户登录后拥有专属ID,支持表情、关注用户,网盘分享等功能,支持图片上传,视频上传,网盘存储分享…...
Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor
Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor Decision ManifoldsTabNet1.核心思想2. 架构组成3. 工作流程4. 优点PyTorch TabNetTabNetRegressor参数1. 模型相关参数`n_d``n_a``n_steps``gamma``cat_idxs``cat_dims``cat_emb_dim`2. 训练相关参数`opti…...
格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商!
格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商! 为飞手赋能,为赛事护航! Tattu是深圳市格瑞普电池有限公司(Grepow)旗下的子品牌之一,专注为无人机、FPV和模型爱好者提供专业可靠的电池和充电器等一站式电源解决方案。凭借卓越的放电性能、稳…...
PySide6 监测设备变更事件
在PySide6中监听系统事件,判断是否有串口设备插拔,进而当串口状态变更时,实现列表数据实时更新。 在Qt中,可以使用 nativeEvent 接口来完成这一操作: [virtual protected] bool QWidget::nativeEvent(const QByteArray…...
嵌入式系统的历史与发展
目录 引言 一、嵌入式系统的早期萌芽 1、首个现代嵌入式系统 2、早期未成形嵌入式系统的应用 二、以单片机为主的初级阶段 1、工业领域应用 2、大型家电领域应用 三、处理器升级与多样化应用阶段 1、数字化电子化设备涌现 (1)智能仪表…...
mysql调试记录
ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY password; 该命令在调试python使用pymysql连接数据库出现错误时, 报错为pymysql.err.OperationalError: (1045, "Access denied for user rootlocalhost (using password: NO)") m…...
【后端开发】Spring MVC阶段总结
文章目录 快捷引入依赖lombok的使用Lombok依赖Lombok使用Lombok注解 三层架构分层的目的MVC与分层的区别三层架构分层的好处 企业命名规范常见命名命名风格介绍大驼峰风格小驼峰风格包名 常见注解Cookie与Session 快捷引入依赖 这个方法可以快捷引入依赖,但是引入依…...
netty-socketio + springboot 消息推送服务
netty-socketio springboot 消息推送服务 后端1. 目录结构:代码pom文件:application.yml:SocketIOConfig:PushMessage:ISocketIOServiceSocketIOServiceImpl:pushMessageController:启动类&…...
基于 JavaWeb 的 SSM 在线视频教育系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
同时打开多个Microchip MPLAB X IDE
0.引用 Microchip 32位MCU CAN驱动图文教程-附源码 - 哔哩哔哩 https://bbs.21ic.com/icview-3391426-1-1.html https://bbs.21ic.com/icview-3393632-1-1.html 1.前言 工作中接触到使用Microchip 的 MPLAB X IDE 开发工具,使用的MCU是Microchip SAMD21J18A MCU…...
dify 500错误
问题 升级到1.2.0 后所有页面接口均报错500, 环境: docker 本地部署 version:1.2.0 解决办法 1.首先关闭服务 docker compose down2.找到docker-compose.yaml里的plugin_daemon,参照下面修改参数 plugin_daemon:environment:PLUGIN_MAX_EXECUTION…...
WPF设计标准学习记录26
画刷名称功能说明SolidColorBrush使用单一的连续颜色填充区域LinearGradientBrush使用线性渐变绘制区域。RadialGradientBrush使用径向渐变绘制区域。 焦点定义渐变的开始,而圆定义渐变的终点。ImageBrush使用图像绘制区域。VisualBrush使用一个视图绘制区域。BitmapCacheBrus…...
cin,cin.get(),getchar(),getline(),cin.get line()异同点
文章目录 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin (1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。 (2)当cin>>从缓冲区中读取数据时&…...
7# 5多线-7 不会停
7# 5多线-7 不会停 分析,明显线接错了,打自动时也能手动启停,打手动无法启停,这时远程只能启ka3,无法启ka4。排查手自转换2上没接线,接到8上了(13和12接错了,也就是sac的5和6接错了)…...
基于混合编码器和边缘引导的拉普拉斯金字塔网络用于遥感变化检测
Laplacian Pyramid Network With HybridEncoder and Edge Guidance for RemoteSensing Change Detection 0、摘要 遥感变化检测(CD)是观测和分析动态土地覆盖变化的一项关键任务。许多基于深度学习的CD方法表现出强大的性能,但它们的有效性…...
机器学习 从入门到精通 day_04
1. 决策树-分类 1.1 概念 1. 决策节点 通过条件判断而进行分支选择的节点。如:将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。 2. 叶子节点 没有子节点的节点,表示最终的决策结果。 3. 决策树的…...
CLAHE算法介绍
限制对比度自适应直方图增强 CLAHE 算法介绍 1. CLAHE算法框图2.直方图clip及重分配2.1 opencv自带2.2 scikit-image2.3 结果对比2.4 clip limit的性质3.插值参考文献上图来自 K. Zuiderveld: Contrast Limited Adaptive Histogram Equalization。 图中可以看到各种直方图均衡的…...
高并发的业务场景下,如何防止数据库事务死锁
一、 一致的锁定顺序 定义: 死锁的常见原因之一是不同的事务以不同的顺序获取锁。当多个事务获取了不同资源的锁,并且这些资源之间发生了互相依赖,就会形成死锁。 解决方法: 确保所有的事务在获取多个锁时,按照相同的顺序请求锁。例如,如果事务A需要锁定表A和表B,事务…...
使用Python从零实现一个端到端多模态 Transformer大模型
嘿,各位!今天咱们要来一场超级酷炫的多模态 Transformer 冒险之旅!想象一下,让一个模型既能看懂图片,又能理解文字,然后还能生成有趣的回答。听起来是不是很像超级英雄的超能力?别急,…...
elestio memos SSRF漏洞复现(CVE-2025-22952)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前言…...
倚光科技:以创新之光,雕琢全球领先光学设计公司
在光学技术飞速发展的当下,每一次突破都可能为众多领域带来变革性的影响。而倚光(深圳)科技有限公司,作为光学设计公司的一颗璀璨之星,正以其卓越的创新能力和深厚的技术底蕴,引领着光学设计行业的发展潮流…...
Linux安装Elasticsearch详细教程
准备工作 下载地址:Download Elasticsearch | Elastic 下载时需要注意es与jdk版本对应关系 ES 7.x 及之前版本,选择 Java 8 ES 8.x 及之后版本,选择 Java 17 或者 Java 18,建议 Java 17,因为对应版本的 Logstash 不支持 Java 1…...
C++字符串操作详解
引言 字符串处理是编程中最常见的任务之一,而在C中,我们有多种处理字符串的方式。本文将详细介绍C中的字符串操作,包括C风格字符串和C的string类。无论你是C新手还是想巩固基础的老手,这篇文章都能帮你梳理字符串处理的关键知识点…...
PromptPro|提示词生成和管理专家
大家好,我是吾鳴。 今天吾鳴给大家分享一个实用的提示词管理网站,它的名称叫做产品化管理提示词,英文名叫做PromptPro,是一个可以帮你管理你的大模型提示词的网站,同时你也可以告诉它你的需求,让它帮你生成…...
计算机视觉图像特征提取入门:Harris角点与SIFT算法
计算机视觉图像特征提取入门:Harris角点与SIFT算法 一、前言二、Harris 角点检测算法2.1 Harris 角点的定义与直观理解2.1.1 角点的概念2.1.2 Harris 角点的判定依据 2.2 Harris 角点检测的实现步骤2.2.1 计算图像的梯度2.2.2 构建结构张量矩阵2.2.3 …...
swift菜鸟教程1-5(语法,变量,类型,常量,字面量)
一个朴实无华的目录 今日学习内容:1.基本语法引入空格规范输入输出 2.变量声明变量变量输出加反斜杠括号 \\( ) 3.可选(Optionals)类型可选类型强制解析可选绑定 4.常量常量声明常量命名 5.字面量整数 and 浮点数 实例字符串 实例 今日学习内容: 1.基本…...
02142数据结构导论
初学者,怎样理解这道题,怎样大白话分析 答案解析 00、概念 29、 28、 27、 26、 25、 24、 23、 22、有5个元素,其入栈次序为:A、B、C、D、E,写出以元素C、D最先出栈(即C第一个且D第二个出栈)的各种可能的出栈次序。 (来…...
如何在AMD MI300X 服务器上部署 DeepSeek R1模型?
DeepSeek-R1凭借其深度推理能力备受关注,在语言模型性能基准测试中可与顶级闭源模型匹敌。 AMD Instinct MI300X GPU可在单节点上高效运行新发布的DeepSeek-R1和V3模型。 用户通过SGLang优化,将MI300X的性能提升至初始版本的4倍,且更多优化将…...
【Django】教程-15-注册页面
【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...
OpenAI即将上线新一代重磅选手——GPT-4.1
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
参照Spring Boot后端框架实现序列化工具类
本文参照Jackson实现序列化工具类,旨在于简化开发 JacksonUtil.class public class JacksonUtil {private JacksonUtil() {}/*** 单例*/private final static ObjectMapper OBJECT_MAPPER;static {OBJECT_MAPPER new ObjectMapper();}private static ObjectMappe…...
C_内存 内存地址概念
1. 计算机内存的基本概念 计算机的内存(RAM,随机存取存储器)是用来存储程序运行时的数据和指令的地方。内存被划分为许多小单元,每个单元有一个唯一的地址,这些地址从0开始编号。 内存单元:每个内存单元通…...
Rust重定义数据库内核:从内存安全到性能革命的破界之路
Rust语言正在颠覆传统数据库开发范式,其独特的所有权系统与零成本抽象能力,为攻克C/C时代遗留的内存泄漏、并发缺陷等顽疾提供全新解决方案。本文通过TiKV、Materialize等新一代数据库核心组件的实践案例,剖析Rust如何重塑存储引擎、查询优化…...
tree 显示到二级目录
要使用 tree 命令显示到二级目录,可以通过 -L 参数指定目录层级。具体命令如下: tree -L 2 参数说明: -L 数字:控制显示的目录深度。-L 2 表示显示到第二级目录(即当前目录下的直接子目录及其内容)。 示例输出: 复制 . ├── dir1 │ ├── file1.txt │ └─…...
UE5 在UE中创建骨骼动画
文章目录 创建动画的三种方式修改骨骼动画 创建动画的三种方式 方法一 打开一个已有的动画,左上角“创建资产/创建动画/参考姿势” 这将创建一个默认的A字形的骨骼,不建议这么做 方法二 打开一个已有的动画,左上角“创建资产/创建动画/当前…...
工业相机使用笔记
目前工业相机有多种分类方式,以下是基于不同原理和特点的类别总结: 按维度分类 2D相机: 原理:通过镜头将二维平面上的物体成像在图像传感器上,传感器上的像素点阵列捕捉物体的光信号,并转换为电信号或数字…...
深度兼容性测试和自助兼容性测试的区别,如何正确的选择?
泽众云经过几年业务快速发展,特别是泽众云兼容性测试服务已成为市场热门供应商之一,也根据用户不同需求推出了超高性价比服务,主要有深度兼容性测试和自助兼容性测试两种方式。2025年上半云真机平台的机型已升级到1000,全面覆盖了…...
Windows下安装depot_tools
一、引言 Chromium和Chromium OS使用名为depot_tools的脚本包来管理检出和审查代码。depot_tools工具集包括gclient、gcl、git-cl、repo等。它也是WebRTC开发者所需的工具集,用于构建和管理WebRTC项目。本文介绍Windows系统下安装depot_tools的方法。 二、下载depo…...
学术分享:基于 ARCADE 数据集评估 Grounding DINO、YOLO 和 DINO 在血管狭窄检测中的效果
一、引言 冠状动脉疾病(CAD)作为全球主要死亡原因之一,其早期准确检测对有效治疗至关重要。X 射线冠状动脉造影(XCA)虽然是诊断 CAD 的金标准,但这些图像的人工解读不仅耗时,还易受观察者间差异…...
NLP高频面试题(四十一)——什么是 IA3 微调?
随着大型语言模型的广泛应用,如何高效地将这些模型适配到特定任务中,成为了研究和工程实践中的重要课题。IA3(Infused Adapter by Adding and Adjusting)微调技术,作为参数高效微调的一种新颖方法,提供了在保持模型性能的同时,显著减少可训练参数数量的解决方案。 IA3 …...
STM32 模块化开发指南 · 第 3 篇 环形缓冲区 RingBuffer 模块设计与单元测试
本文是《STM32 模块化开发实战指南》第 3 篇,聚焦于“如何设计一个高性能、稳定、安全的环形缓冲区模块”。我们将从基本结构讲起,逐步完成接口定义、边界处理、API 实现与单元测试,最终实现一个可移植、线程安全、可嵌入 UART/BLE/协议模块的通用 RingBuffer。 一、RingBuf…...
软件测试岗位:IT行业中的质量守护者
在当今数字化飞速发展的IT行业,软件如同空气般无处不在,从日常的手机应用到复杂的企业级管理系统,软件的稳定性和可靠性至关重要。而软件测试岗位的从业者,就像是软件世界的质检员,精心守护着软件的质量。 一、软件测…...
单片机方案开发 代写程序/烧录芯片 九齐/应广等 电动玩具 小家电 语音开发
在电子产品设计中,单片机(MCU)无疑是最重要的组成部分之一。无论是消费电子、智能家居、工业控制,还是可穿戴设备,小家电等,单片机的应用无处不在。 单片机,简而言之,就是将计算机…...