《AI大模型趣味实战》第10集:开发一个基于Mermaid的AI绘图网站
《AI大模型趣味实战》第10集:开发一个基于Mermaid的AI绘图网站
抱歉不按顺序出牌,先出一个第10集,第1到第9集慢慢来,后续也不会按顺序,总之凑满36集,可能或补充12集。
AI大模型趣味实战专栏 所有36个主题预告,请阅读预告篇
https://blog.csdn.net/yweng18/article/details/145838940
主题:用AI生成流程图、架构图等
在现代软件开发和系统设计中,流程图、架构图、时序图等图表工具是不可或缺的。然而,手动绘制这些图表往往耗时且繁琐。本文将带你了解如何结合 Mermaid 和 AI大模型,开发一个能够根据自然语言描述自动生成图表的 Web 应用,并将其集成到 Flask 框架中。最终,我们还将实现导出功能,支持用户下载 SVG 格式的图表。
废话不多说,先上系统实际运行截图

全部源代码如下,两个文件,注意,要先下载 ollama并启动运行,作为本地大模型资源为系统提供AI生成接口,至少下载一个ollama大模型,我用的是 qwen2.5:latest 版本,ollama 不知道怎么部署的请自行搜索 :
- main.py, 主程序文件
- ./templates/index.html 新建一个templates文件夹,放置前端页面
建议通过 python -m venv merimaid_ai 创建虚拟环境,请在bash或cmd窗口中安装以下依赖模块:
演示程序的 python 版本:3.11.5
#安装 flask 框架
pip install flask
#运行主程序
# 必须先启动ollama并下载一个大模型,7B左右的规格就行,glm4 9B规格,qwen2.5 7B规格都可以
#不本地部署,直接调用 大模型 API 也可以,修改一下 generate_mermaid_code(prompt) 函数方法的代码即可。
python main.py
main.py 主程序文件源代码
from flask import Flask, request, render_template
import requestsapp = Flask(__name__)# 假设你有一个大模型 API 的访问函数
def generate_mermaid_code(prompt):#对prompt进行处理prompt = '''请根据以下用户需求,请生成并返回Mermaid语句:{prompt}.具体格式要求如下:#1 根据用户意图,生成合适的Mermaid语法#2. 只生成Mermaid语法,不要生成任何其他内容#3. 如果用户需求不明确,请返回一个带有单个文字框的Mermaid语法,文字框内容为"用户需求不明确,请重新输入"#4. 如果用户需求明确,请返回Mermaid语法#5. 如果用户需求是绘制甘特图,请生成英文版的Mermaid语句。''' + prompt# 调用本地 Ollama 模型 APIresponse = requests.post('http://localhost:11434/api/generate', json={#"model": "glm4:latest","model": "qwen2.5:latest", "prompt": prompt,"stream": False # 设置为False,确保返回完整的响应})# 检查响应状态if response.status_code == 200:# 假设返回的 JSON 中有一个 'text' 字段包含生成的 Mermaid 代码#mermaid_code = response.json().get('text', '')mermaid_code = response.json()['response'].replace('```mermaid', '').replace('```', '')print(mermaid_code)else:mermaid_code = "生成失败,请重试。"return mermaid_code@app.route('/', methods=['GET', 'POST'])
def index():mermaid_code = "" # 初始化 mermaid_codeis_generated = False # 初始化生成状态if request.method == 'POST':user_input = request.form['user_input']# 调用大模型生成 Mermaid 语法mermaid_code = generate_mermaid_code(user_input)if mermaid_code: # 如果生成成功is_generated = Truereturn render_template('index.html', mermaid_code=mermaid_code, is_generated=is_generated)if __name__ == '__main__':app.run(debug=True)
./templates/index.html 前端页面源代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Mermaid图形生成器</title><script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script><script>mermaid.initialize({startOnLoad:true});</script><style>body {display: flex;height: 100vh;background: #004d00; /* 墨绿色背景 */color: white;font-family: Arial, sans-serif;}.left-panel {width: 20%; /* 左侧占 20% */padding: 20px; /* 添加内边距 */display: flex;flex-direction: column; /* 垂直排列 */justify-content: flex-start; /* 顶部对齐 */background: #0ca00c; /* 白色背景 */}.right-panel {width: 80%; /* 右侧占 80% */padding: 20px; /* 添加内边距 */display: flex;flex-direction: column; /* 垂直排列 */align-items: center; /* 水平居中对齐 */background: #f0d47a; /* 白色背景 */}.mermaid {background: rgba(255, 255, 255, 0.1);padding: 20px;border-radius: 10px;width: 100%; /* 适应右侧宽度 */max-height: 400px; /* 设置最大高度 */overflow-y: auto; /* 允许垂直滚动 */}#mermaid_output {width: 100%; /* 设置输出框的宽度 */height: 100px; /* 设置输出框的高度 */background: rgb(206, 228, 109); /* 设置背景 */color: rgb(24, 7, 7); /* 设置文本颜色 */border: none; /* 去掉边框 */border-radius: 5px; /* 圆角 */padding: 10px; /* 内边距 */margin-top: 10px; /* 添加上边距 */}#download_button {margin-top: 10px; /* 添加上边距 */}h1 {width: 100%; /* 使标题占据整行 */text-align: left; /* 左对齐 */margin: 0; /* 去掉默认的外边距 */} </style><script>function clearInput() {document.getElementById('user_input').value = '';document.getElementById('mermaid_output').value = '';document.getElementById('download_button').disabled = true; // 禁用下载按钮}function enableDownloadButton() {document.getElementById('download_button').disabled = false; // 启用下载按钮}function downloadImage() {const mermaidCode = document.getElementById('mermaid_output').value;const svgElement = document.querySelector('.mermaid svg');const serializer = new XMLSerializer();const svgString = serializer.serializeToString(svgElement);const blob = new Blob([svgString], { type: 'image/svg+xml;charset=utf-8' });const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'mermaid_diagram.svg'; // 设置下载文件名document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(url); // 释放 URL 对象}</script>
</head>
<body><div class="left-panel"><h1>Mermaid-AI</h1><br><h1>图形生成器</h1><br> <form method="POST"><label for="user_input">请输入你的绘图需求(点击右下区域文字标签可以快速复制需求样本):</label><br><textarea id="user_input" name="user_input" style="width: 100%;height: 100px; resize:none;"></textarea><br><br><div><br><input type="submit" value="生成Mermaid图形" style="width: 100%;height: 68px;" color="black" margin="10px"><button type="button" onclick="clearInput()" style="width: 100%;height: 68px; margin-top: 10px;">清空</button><button type="button" id="download_button" style="width: 100%;height: 68px; margin-top: 10px;" onclick="downloadImage()" style="width: 100%;height: 68px;">下载图片</button> <!-- 新增的下载按钮 --></div><label for="mermaid_output">生成的Mermaid语句:</label><br><textarea id="mermaid_output" readonly style="width: 100%; height: 250px;">{{ mermaid_code|safe }}</textarea> <!-- 新增的文本框 --></form> </div><div class="right-panel"><h2 style="color: rgb(24, 18, 18);">生成的Mermaid图形:</h2><br><div class="mermaid" style="width: 100%; height: 100%;">{{ mermaid_code|safe }}</div><div><h3 style="color: rgb(24, 18, 18);">示例需求:</h3><span onclick="document.getElementById('user_input').value='我需要一个流程图来表示用户登录系统的过程。首先用户输入用户名和密码,然后系统验证信息是否正确。如果正确,显示欢迎页面;如果不正确,提示重新输入。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">我需要一个流程图来表示用户登录系统的过程。首先用户输入用户名和密码,然后系统验证信息是否正确。如果正确,显示欢迎页面;如果不正确,提示重新输入。</span><span onclick="document.getElementById('user_input').value='绘制一个流程图,展示在线购物的步骤:用户浏览商品 -> 添加到购物车 -> 确认订单 -> 选择支付方式 -> 完成支付 -> 显示订单成功页面。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">绘制一个流程图,展示在线购物的步骤:用户浏览商品 -> 添加到购物车 -> 确认订单 -> 选择支付方式 -> 完成支付 -> 显示订单成功页面。</span><span onclick="document.getElementById('user_input').value='创建一个流程图,表示学生选课的过程:学生登录系统 -> 浏览课程列表 -> 选择课程 -> 提交选课申请 -> 系统确认选课结果 -> 显示选课成功或失败。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">创建一个流程图,表示学生选课的过程:学生登录系统 -> 浏览课程列表 -> 选择课程 -> 提交选课申请 -> 系统确认选课结果 -> 显示选课成功或失败。</span><span onclick="document.getElementById('user_input').value='我需要一个流程图,表示文件上传的逻辑:用户选择文件 -> 检查文件格式是否正确 -> 如果正确,上传文件;如果不正确,提示错误并重新选择文件。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">我需要一个流程图,表示文件上传的逻辑:用户选择文件 -> 检查文件格式是否正确 -> 如果正确,上传文件;如果不正确,提示错误并重新选择文件。</span><span onclick="document.getElementById('user_input').value='绘制一个流程图,表示审批流程:员工提交请假申请 -> 主管审核 -> 如果通过,通知 HR 部门;如果不通过,通知员工修改申请。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">绘制一个流程图,表示审批流程:员工提交请假申请 -> 主管审核 -> 如果通过,通知 HR 部门;如果不通过,通知员工修改申请。</span><span onclick="document.getElementById('user_input').value='我需要一个时序图,展示用户与银行系统的交互过程:用户发起转账请求 -> 系统验证账户余额 -> 如果余额充足,执行转账操作;否则,返回余额不足的提示';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">我需要一个时序图,展示用户与银行系统的交互过程:用户发起转账请求 -> 系统验证账户余额 -> 如果余额充足,执行转账操作;否则,返回余额不足的提示</span><span onclick="document.getElementById('user_input').value='创建一个时序图,表示在线客服系统的对话流程:用户发送问题 -> 系统接收问题并分配给客服 -> 客服回复问题 -> 用户收到回复。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">创建一个时序图,表示在线客服系统的对话流程:用户发送问题 -> 系统接收问题并分配给客服 -> 客服回复问题 -> 用户收到回复。</span><span onclick="document.getElementById('user_input').value='绘制一个时序图,表示 API 调用的交互:客户端发送 HTTP 请求 -> 服务器接收请求并处理 -> 返回 JSON 数据 -> 客户端解析数据并显示结果。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">绘制一个时序图,表示 API 调用的交互:客户端发送 HTTP 请求 -> 服务器接收请求并处理 -> 返回 JSON 数据 -> 客户端解析数据并显示结果。</span><span onclick="document.getElementById('user_input').value='我需要一个时序图,表示快递物流的跟踪过程:用户下单 -> 商家发货 -> 物流公司接收包裹 -> 包裹运输中 -> 快递员派送 -> 用户签收。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">我需要一个时序图,表示快递物流的跟踪过程:用户下单 -> 商家发货 -> 物流公司接收包裹 -> 包裹运输中 -> 快递员派送 -> 用户签收。</span><span onclick="document.getElementById('user_input').value='创建一个时序图,表示多人协作编辑文档的过程:用户 A 修改文档 -> 文档保存到云端 -> 用户 B 同步更新 -> 用户 C 查看最新版本。';" style="cursor: pointer; color: rgb(24, 18, 18); text-decoration: underline; display: block;">创建一个时序图,表示多人协作编辑文档的过程:用户 A 修改文档 -> 文档保存到云端 -> 用户 B 同步更新 -> 用户 C 查看最新版本。</span><span onclick="document.getElementById('user_input').value='我需要一个甘特图,表示一个项目的开发计划:项目启动(第 1 周) -> 需求分析(第 2-3 周) -> 设计阶段(第 4-5 周) -> 开发阶段(第 6-10 周) -> 测试阶段(第 11-12 周) -> 上线(第 13 周)。请输出英文。';" style="cursor: pointer; color: rgb(17, 8, 8); text-decoration: underline; display: block;">我需要一个甘特图,表示一个项目的开发计划:项目启动(第 1 周) -> 需求分析(第 2-3 周) -> 设计阶段(第 4-5 周) -> 开发阶段(第 6-10 周) -> 测试阶段(第 11-12 周) -> 上线(第 13 周)。请输出英文</span><span onclick="document.getElementById('user_input').value='绘制一个甘特图,表示一个活动策划的时间安排:确定主题(第 1 天) -> 制定预算(第 2 天) -> 场地预订(第 3-4 天) -> 宣传推广(第 5-7 天) -> 活动执行(第 8 天) -> 总结反馈(第 9 天)。请输出英文';" style="cursor: pointer; color: rgb(12, 6, 6); text-decoration: underline; display: block;">绘制一个甘特图,表示一个活动策划的时间安排:确定主题(第 1 天) -> 制定预算(第 2 天) -> 场地预订(第 3-4 天) -> 宣传推广(第 5-7 天) -> 活动执行(第 8 天) -> 总结反馈(第 9 天)。请输出英文</span><span onclick="document.getElementById('user_input').value='创建一个甘特图,表示一个软件版本发布的里程碑:需求收集(第 1-2 周) -> 开发(第 3-6 周) -> 内部测试(第 7 周) -> 用户测试(第 8 周) -> 正式发布(第 9 周)。请输出英文';" style="cursor: pointer; color: rgb(12, 6, 6); text-decoration: underline; display: block;">创建一个甘特图,表示一个软件版本发布的里程碑:需求收集(第 1-2 周) -> 开发(第 3-6 周) -> 内部测试(第 7 周) -> 用户测试(第 8 周) -> 正式发布(第 9 周)。请输出英文</span><span onclick="document.getElementById('user_input').value='我需要一个类图,表示一个简单的学校管理系统:Student 类有属性 name 和 student_id,方法 enroll() 和 submit_assignment();Teacher 类有属性 name 和 teacher_id,方法 assign_homework() 和 grade_assignment()。';" style="cursor: pointer; color: rgb(14, 11, 11); text-decoration: underline; display: block;">我需要一个类图,表示一个简单的学校管理系统:Student 类有属性 name 和 student_id,方法 enroll() 和 submit_assignment();Teacher 类有属性 name 和 teacher_id,方法 assign_homework() 和 grade_assignment()。</span><span onclick="document.getElementById('user_input').value='绘制一个类图,表示一个电子商务系统:Product 类有属性 name 和 price,方法 get_details();Order 类有属性 order_id 和 products,方法 calculate_total();Customer 类有属性 name 和 address,方法 place_order()。';" style="cursor: pointer; color: rgb(14, 11, 11); text-decoration: underline; display: block;">绘制一个类图,表示一个电子商务系统:Product 类有属性 name 和 price,方法 get_details();Order 类有属性 order_id 和 products,方法 calculate_total();Customer 类有属性 name 和 address,方法 place_order()。</span></div></div>
</body>
</html>
一、Mermaid的基本语法与功能
Mermaid 是一种轻量级的标记语言,用于生成各种类型的图表,包括流程图、时序图、甘特图、类图等。它的语法简单易学,非常适合快速绘制图表。
常见的 Mermaid 图表类型
-
流程图 (Flowchart)
示例: -
时序图 (Sequence Diagram)
示例: -
甘特图 (Gantt Chart)
示例: -
类图 (Class Diagram)
示例:
Mermaid 的强大之处在于其语法简洁,同时支持动态渲染,非常适合嵌入到网页中。
二、使用大模型生成Mermaid代码
为了实现用户通过自然语言描述生成图表的功能,我们需要借助 AI 大模型的能力。大模型可以根据用户的输入,生成符合 Mermaid 语法的代码。
实现思路
-
用户输入自然语言需求
用户可以输入类似以下的需求:- “我需要一个流程图来表示用户登录系统的过程。首先用户输入用户名和密码,然后系统验证信息是否正确。如果正确,显示欢迎页面;如果不正确,提示重新输入。”
- “创建一个甘特图,表示一个项目的开发计划:项目启动(第 1 周) -> 需求分析(第 2-3 周) -> 设计阶段(第 4-5 周) -> 开发阶段(第 6-10 周) -> 测试阶段(第 11-12 周) -> 上线(第 13 周)。”
-
大模型生成 Mermaid 代码
我们调用本地部署的 Ollama 大模型 API,将用户输入的自然语言转换为标准的 Mermaid 语法。例如,上述需求可能生成如下代码: -
格式要求
为了确保生成的代码可以直接渲染,我们在程序中对大模型的输出进行了处理,去除了多余的内容,只保留纯 Mermaid 语法。
三、用户输入自然语言描述,自动生成图表
功能实现
-
前端界面
我们使用 HTML 和 CSS 构建了一个简单的 Web 页面,用户可以在左侧输入框中输入需求。页面右侧会实时显示生成的图表。 -
后端逻辑
后端基于 Flask 框架,主要实现了以下功能:- 接收用户输入。
- 调用大模型 API 生成 Mermaid 代码。
- 将生成的代码嵌入到 HTML 中,并通过 Mermaid.js 渲染为图表。
核心代码片段
@app.route('/', methods=['GET', 'POST'])
def index():mermaid_code = "" # 初始化 mermaid_codeis_generated = False # 初始化生成状态if request.method == 'POST':user_input = request.form['user_input']# 调用大模型生成 Mermaid 语法mermaid_code = generate_mermaid_code(user_input)if mermaid_code: # 如果生成成功is_generated = Truereturn render_template('index.html', mermaid_code=mermaid_code, is_generated=is_generated)
四、集成到Flask Web应用中
我们将整个功能集成到了一个 Flask Web 应用中,用户可以通过浏览器访问并使用该工具。
关键点
-
前后端分离
前端负责展示界面和用户交互,后端负责处理用户输入并生成图表。 -
Mermaid.js 渲染
在 HTML 中引入 Mermaid.js,通过<div class="mermaid">嵌入生成的 Mermaid 代码,页面加载时自动渲染为图表。 -
示例需求预设
为了方便用户使用,我们在页面中提供了 15 条预设的需求样本文字,用户可以直接点击复制并提交。
五、提供导出功能(SVG)
为了让用户能够保存生成的图表,我们还实现了导出功能,支持下载 SVG 格式的图片。
实现方式
-
提取 SVG 元素
使用 JavaScript 提取页面中渲染的 SVG 元素。const svgElement = document.querySelector('.mermaid svg'); const serializer = new XMLSerializer(); const svgString = serializer.serializeToString(svgElement); -
生成下载链接
将 SVG 字符串转换为 Blob 对象,并生成下载链接。const blob = new Blob([svgString], { type: 'image/svg+xml;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'mermaid_diagram.svg'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url);
总结
通过本文的介绍,我们完成了一个基于 Mermaid 和 AI 大模型的绘图网站的开发。该网站具有以下特点:
- 用户可以通过自然语言描述生成流程图、时序图、甘特图等。
- 图表实时渲染,支持动态更新。
- 提供导出功能,支持下载 SVG 格式的图表。
这个项目不仅展示了 AI 大模型的强大能力,也体现了 Mermaid 在图表绘制领域的灵活性。未来,我们可以进一步扩展功能,例如支持更多图表类型、优化用户界面、增加上传excel文件进行分析生成图表等。如果你对这个项目感兴趣,不妨动手尝试一下吧!
相关文章:
《AI大模型趣味实战》第10集:开发一个基于Mermaid的AI绘图网站
《AI大模型趣味实战》第10集:开发一个基于Mermaid的AI绘图网站 抱歉不按顺序出牌,先出一个第10集,第1到第9集慢慢来,后续也不会按顺序,总之凑满36集,可能或补充12集。 AI大模型趣味实战专栏 所有36个主题预…...
androidstudio 运行项目加载很慢,优化方法
一、Android Studio 运行项目加载缓慢可能由多种原因引起,以下是一些优化建议: 1. 升级硬件配置 内存:建议至少 8GB,16GB 或以上更佳。 SSD:使用 SSD 替代 HDD 以加快读写速度。 CPU:多核处理器有助于提…...
python脚本实现接入企微机器人
企业微信中的群聊机器人在日常办公中无处不在,对提升工作效率、保证消息及时送达提供了重要的技术保障。例如:DevOps助手、JIRA、构建通知等;还常常使用在运维服务器中配合Prometheus监控体系及时发送告警信息等 文章目录 源码示例Demo源码处…...
《论面向对象的建模及应用》审题技巧 - 系统架构设计师
论面向对象的建模及应用写作框架 一、考点概述 本论题“论面向对象的建模及应用”主要考察软件测试工程师对面向对象建模技术的理解和应用能力。具体涵盖以下几个方面: 面向对象建模的基本概念 :这包括理解面向对象编程(OOP)的基…...
【Godot4.3】自定义圆角容器
概述 Godot控件想要完全实现现代UI风格,需要进行大量的自定义组件设计。本篇就依托于笔者自己对现代UI设计中的圆角面板元素模仿来制作圆角容器组件。 圆角容器 圆角元素在现代的扁平UI设计中非常常见,在Godot中可以通过改进PanelContainer来或者自定…...
开源RAG主流框架有哪些?如何选型?
开源RAG主流框架有哪些?如何选型? 一、开源RAG框架全景图 (一)核心框架类型对比 类型典型工具技术特征适用场景传统RAGLangChain, Haystack线性流程(检索→生成)通用问答、知识库检索增强型RAGRAGFlow, AutoRAG支持重排序、多路召回优化高精度问答、复杂文档处理轻量级…...
【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注
MAC一键删除PPT中的所有备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码,并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“清除当前文稿中的所有备注”,PPT中应用。 MAC没自带,需要自己配置 1.搜…...
【UML】统一建模语言 UML 基础
【UML】统一建模语言UML 基础 文章目录 一、概述1.1 - 什么是建模1.2 建模的原则1.3 软件建模的实现过程 二、 UML2.1 UML中10种图 三、用例图3.1 用例之间的关系 —— 泛化关系3.2 用例之间的关系 —— 包含关系3.3 用例之间的关系 —— 扩展关系 四、类图4.1 类的表示方法4.2…...
AWS S3深度解析:十大核心应用场景与高可用架构设计实践
摘要:作为全球领先的对象存储服务,Amazon S3凭借其高扩展性、持久性和安全性,已成为企业云原生架构的核心组件。本文将深入探讨S3的典型技术场景,并揭秘其背后的架构设计逻辑。 一、AWS S3核心技术特性解析 Amazon Simple Storag…...
如何用Python 3自动打开exe程序
诸神缄默不语-个人CSDN博文目录 本文所说的exe程序特指那种双击直接就能打开的Windows软件。本文中给出的具体例子是C:\Users\user_name\AppData\Local\Postman\Postman.exe,这串字符串在示例代码中都用exe_path代替了,方便你用的时候直接换成自己的软件…...
计算机网络之路由协议(自治系统)
一、自治系统(AS) 自治系统是由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。它是网络的基本构成单位,每个自治系统是一个独立运营并自主决定与谁交换流量的实体。自治系统内部运行内部网关协议(IGP)…...
MFC笔记:本专栏课件
专栏导航 上一篇:在VS2019里面,调整代码字体大小 回到目录 下一篇:无 本节前言 在之前的讲解里面,我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始,我们进入预备章。 本节内容,属于是 …...
springboot集成jackson-dataformat-xml实现发送XML请求和XML响应参数处理
背景 最近在做发票相关的业务,需要对接第三方进行开发票等一系列操作,对方的系统是较老系统,需要采用XML的请求方式。 思路 一般来说,基于springboot的项目采用的都是JSON格式的请求参数和响应参数,因此需要做一个转…...
Spring Cloud Gateway 网关的使用
在之前的学习中,所有的微服务接口都是对外开放的,这就意味着用户可以直接访问,为了保证对外服务的安全性,服务端实现的微服务接口都带有一定的权限校验机制,但是由于使用了微服务,就需要每一个服务都进行一…...
超高速工业相机的应用
超高速工业相机一般安装在机器流水线上代替人眼来做测量和判断,通过数字图像摄取目标转换成图像信号,传送给专用的图像处理系统。图像处理系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。一般来说&…...
学习笔记--电磁兼容性EMC
一、基本概念 电磁兼容性(Electromagnetic Compatibility,EMC)是电子电气设备在特定电磁环境中正常工作的能力,同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰,又能避…...
利用开源小智AI制作桌宠机器狗
本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…...
基于PSO-LSTM长短期记忆神经网络的多分类预测【MATLAB】
一、研究背景与意义 在时间序列分类、信号识别、故障诊断等领域,多分类预测任务对模型的时序特征捕捉能力提出了极高要求。传统LSTM网络虽能有效建模长程依赖关系,但其性能高度依赖超参数的选择,例如隐含层神经元数量、学习率、迭代次数等。…...
Qt中C++与QML交互从原理、方法与实践陷阱深度解析
在我们使用Qt开发中,现在以及普遍通过 C 与 QML 的交互,将 C 的强大功能与 QML 的界面设计优势相结合,既保证了应用程序的性能和稳定性,又能快速实现美观、易用的用户界面。接下来专门讲下C与QML交互原理、方法与实践中的一些陷阱…...
基于SpringBoot和Leaflet的邻省GDP可视化实战
目录 前言 一、技术实现路径 1、空间数据检索 2、数据展示检索流程 二、SpringBoot后台实现 1、模型层实现 2、控制层实现 三、WebGIS前端实现 1、控制面展示 2、成果展示 四、总结 前言 在数字化浪潮席卷全球的今天,数据已成为驱动社会经济发展、指导政策…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
