《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、成果展示 四、总结 前言 在数字化浪潮席卷全球的今天,数据已成为驱动社会经济发展、指导政策…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...