首页/新闻资讯/正文详情

电力远程运维系统源码解析:Modbus+SQLite轻量闭环实践

发布时间:2026/9/25 7:45:59 来源:云帆数科 栏目:资讯中心
电力远程运维系统源码解析:Modbus+SQLite轻量闭环实践
简介本资源是一套面向电力行业开发者的远程运维系统源码实现聚焦配电房智能监控与设备维护管理场景适用于具备Python/前端基础的中级开发者学习IoT运维系统架构设计。压缩包共167个文件含32个核心Python后端模块、29个HTML前端页面、18个JavaScript交互脚本、17个CSS样式文件及4个SQL数据库脚本辅以配置文件.conf/.cfg、图标资源ico/svg和字体文件完整覆盖服务端、Web界面、数据存储与系统配置全链路总大小1.18MB。已有226人学习下载读者可直接部署运行深入理解基于传感器数据采集、实时告警触发、预防性维护日程生成及配电房可视化界面含BootstrapFont Awesome构建的管理后台等关键功能的代码实现逻辑尤其适合拓展边缘计算接入或对接电力SCADA协议的二次开发。1. 电力远程运维系统源代码不是拿来就能跑的“监控万能包”而是配电房设备状态闭环管理的最小可行骨架你下载了一个叫“电力远程运维系统源代码.rar”的压缩包解压后看到一堆 Python 文件、SQL 脚本、Vue 页面和一个叫配电房ico的图标——但双击main.py报错ModuleNotFoundError: No module named pymodbus浏览器打开dist/index.html显示白屏数据库导入失败提示Unknown column last_maintenance_time in field list。这不是代码质量差而是它根本没打算让你“一键部署”。这个源码包的真实定位是面向中小型配电房场景的轻量级远程运维系统原型它不追求等保2.0全项合规也不对接 IEC61850 或 DLT645 协议栈而是用 Modbus TCP SQLite Flask Vue 构建一个可快速验证“设备告警→工单派发→维护记录回填”闭环的最小系统。适合刚接手老旧配电房数字化改造的电气工程师、想补全 IoT 运维链路的嵌入式团队或需要交付可演示原型的集成商。它解决的不是“要不要监控”而是“怎么让值班员在手机上一眼看出哪台变压器油温异常、谁该去处理、上次保养是什么时候”——所有代码都围绕这三个问题展开没有冗余模块也没有云原生抽象层。2. 拆解源码结构从config.py到device_monitor.py看清电力运维系统的三层数据流这个源码包不是按 MVC 或微服务分层而是按电力现场运维动作流组织数据采集层 → 状态判断层 → 业务响应层。理解这三层才能改得准、调得稳、扩得开。下面以v1.2版本即当前主流解压后可见的版本为例逐层拆解关键文件与逻辑链路。2.1 数据采集层Modbus TCP 是主力但device_config.json才是真实设备地图电力远程运维系统不依赖 OPC UA 或 MQTT Broker而是直接用pymodbus向现场 RTU/PLC 发起轮询。核心采集逻辑在src/backend/core/device_monitor.py中# src/backend/core/device_monitor.py from pymodbus.client.sync import ModbusTcpClient import json def read_device_data(ip, port, slave_id): client ModbusTcpClient(ip, portport) if not client.connect(): return {error: fFailed to connect to {ip}:{port}} # 读取保持寄存器 0x0000-0x000F共16个字对应电压、电流、温度、开关状态 result client.read_holding_registers(0, 16, unitslave_id) client.close() if result.isError(): return {error: fModbus error on {ip}: {result}} # 将寄存器值映射为实际物理量示例寄存器0为A相电压×10需除10 data { voltage_a: result.registers[0] / 10.0, current_b: result.registers[2] / 100.0, oil_temp: result.registers[8], breaker_status: bool(result.registers[15] 0x01) } return data注意这段代码里registers[8]对应油温是硬编码映射。真实项目中必须对照设备手册确认寄存器地址——不同品牌变压器温控器如 ABB、施耐德、国产科陆的 Modbus 地址表完全不同。源码包自带的config/device_config.json才是关键// config/device_config.json { transformer_001: { ip: 192.168.1.101, port: 502, slave_id: 1, register_map: { voltage_a: {addr: 0, scale: 10.0, unit: V}, oil_temp: {addr: 8, scale: 1.0, unit: ℃}, breaker_status: {addr: 15, bit: 0, type: coil} } }, switchgear_002: { ip: 192.168.1.102, port: 502, slave_id: 2, register_map: { ... } } }这个 JSON 文件才是你的“设备资产清单”。它把 IP、从站 ID 和寄存器地址绑定在一起避免在 Python 代码里写死。修改设备时只改 JSON不碰 Python 逻辑——这是后期维护不翻车的第一道防线。2.2 状态判断层告警规则不在数据库里而在rules/目录下的 YAML 文件中告警不是靠 SQL 查询触发而是由src/backend/core/alert_engine.py加载规则文件实时计算# src/backend/core/alert_engine.py import yaml from datetime import datetime def load_alert_rules(): with open(config/rules/transformer_alerts.yaml, r, encodingutf-8) as f: return yaml.safe_load(f) def check_alerts(device_data, rules): alerts [] for rule in rules[conditions]: # rule: {name: 油温超限, field: oil_temp, op: , value: 85, level: high} if rule[op] and device_data.get(rule[field], 0) rule[value]: alerts.append({ device_id: device_data[device_id], rule_name: rule[name], level: rule[level], timestamp: datetime.now().isoformat(), value: device_data[rule[field]] }) return alertsconfig/rules/下有三个文件transformer_alerts.yaml针对变压器的温度、负载率、三相不平衡度switchgear_alerts.yaml针对开关柜的局放阈值、母线温度、断路器操作次数environment_alerts.yaml针对配电房环境的温湿度、水浸、烟感。每条规则都带level字段low/medium/high前端据此渲染不同颜色的告警卡片。规则热加载支持修改 YAML 后无需重启服务alert_engine.py每 30 秒自动重读——这对现场快速调整阈值比如夏天把油温告警从 85℃ 改成 90℃极其关键。2.3 业务响应层工单生成不是消息队列而是 SQLite 的maintenance_log表直写当alert_engine.py返回 high 级告警src/backend/api/maintenance_api.py会立即插入一条工单记录# src/backend/api/maintenance_api.py import sqlite3 from datetime import datetime def create_maintenance_ticket(alert_info): conn sqlite3.connect(data/maintenance.db) cursor conn.cursor() cursor.execute( INSERT INTO maintenance_log ( device_id, alert_rule, alert_level, alert_value, status, created_at, assignee, scheduled_time ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) , ( alert_info[device_id], alert_info[rule_name], alert_info[level], alert_info[value], pending, # 状态pending / in_progress / done / cancelled alert_info[timestamp], auto_assign, # 实际项目中这里应调用排班API datetime.now().strftime(%Y-%m-%d %H:%M:%S) )) conn.commit() conn.close() return cursor.lastrowid这张maintenance_log表就是运维闭环的核心载体。字段status控制流程assignee记录责任人scheduled_time是计划处理时间非实际完成时间。前端 Vue 页面的“工单看板”直接查这张表不做 JOIN不关联用户表——因为源码包默认只支持单管理员账号多角色权限要自己加。这也是为什么你解压后看到admin登录页却找不到用户管理模块它被刻意精简了。3. 本地运行四步法从环境准备到首条告警触发每个命令都带参数说明别急着pip install -r requirements.txt——这个源码包的依赖极简但顺序和版本有玄学。我用 Ubuntu 22.04 Python 3.9.18 实测通过Windows 用户请用 WSL2否则串口模拟和 Modbus 测试会翻车。3.1 步骤一Python 环境与核心依赖安装精确到小数点后一位# 创建隔离环境必须避免与系统其他项目冲突 python3.9 -m venv venv_powerops source venv_powerops/bin/activate # 安装指定版本pymodbus 3.5.2 是关键4.x 版本移除了 sync 模块 pip install --upgrade pip pip install pymodbus3.5.2 flask2.2.5 flask-sqlalchemy3.0.5 \ pyyaml6.0.1 python-dotenv1.0.0 # SQLite 不需要额外装但确保系统有 sqlite3 命令行工具 sudo apt install sqlite3 # Ubuntu/Debian # macOS: brew install sqlite3 # Windows WSL2: sudo apt install sqlite3参数说明pymodbus3.5.2是硬性要求。新版pymodbus4.0已废弃ModbusTcpClient同步接口改用异步AsyncModbusTcpClient而源码中所有采集逻辑都是同步阻塞式。强行升级会导致ImportError: cannot import name ModbusTcpClient。flask-sqlalchemy3.0.5对应 SQLAlchemy 2.x若装 2.0 以下版本db.Column(db.Integer, primary_keyTrue)会报TypeError: Column() got an unexpected keyword argument primary_key。3.2 步骤二初始化数据库与配置文件config/目录是唯一可信源# 复制示例配置不要直接改源码里的 config/先复制一份 cp -r config config_local # 修改数据库路径SQLite 文件默认在 data/ 下确保目录存在 mkdir -p data # 初始化 maintenance.db执行 SQL 脚本 sqlite3 data/maintenance.db sql/init_maintenance.sql # 验证表结构 sqlite3 data/maintenance.db .schema maintenance_log # 应输出CREATE TABLE maintenance_log( # id INTEGER PRIMARY KEY AUTOINCREMENT, # device_id TEXT NOT NULL, # alert_rule TEXT NOT NULL, # alert_level TEXT NOT NULL, # alert_value REAL, # status TEXT DEFAULT pending, # created_at TEXT, # assignee TEXT, # scheduled_time TEXT # );sql/init_maintenance.sql是建表脚本内容简单但字段名必须与 Python 代码完全一致大小写敏感。特别注意status字段的 DEFAULT pending——如果漏掉这个默认值插入时没传status会报NOT NULL constraint failed。3.3 步骤三启动后端服务并验证 Modbus 模拟用modbus_simulator.py替代真实设备真实配电房设备不能随便连先用源码包自带的模拟器# 启动 Modbus 模拟服务器监听 127.0.0.1:5020 python src/tools/modbus_simulator.py --host 127.0.0.1 --port 5020 # 在另一个终端启动后端 API默认监听 127.0.0.1:5000 export FLASK_APPsrc/backend/app.py export FLASK_ENVdevelopment flask run --host127.0.0.1 --port5000此时访问http://127.0.0.1:5000/api/devices/status应返回 JSON{ transformer_001: { status: online, data: { voltage_a: 10.25, oil_temp: 72.3, breaker_status: true } } }关键参数modbus_simulator.py的--port 5020必须与config_local/device_config.json中transformer_001的port一致。模拟器默认返回固定值但oil_temp字段会每 5 秒随机波动 ±2℃用于测试告警触发。3.4 步骤四编译前端并接入后端Vue CLI 4.5.18 是兼容底线# 进入前端目录 cd src/frontend # 安装指定 Vue CLI新版 Vue CLI 5 与源码 webpack 配置不兼容 npm install -g vue/cli4.5.18 # 安装依赖package.json 锁定版本不要用 npm install --legacy-peer-deps npm install # 修改 API 地址默认指向 http://localhost:5000若后端在其他机器改此处 # 编辑 src/utils/request.js修改 baseURL # const service axios.create({ baseURL: http://127.0.0.1:5000/api/ }) # 编译生产包 npm run build # 将 dist/ 内容复制到后端 static 目录Flask 默认 serve static cp -r dist/* ../backend/static/启动 Flask 后直接访问http://127.0.0.1:5000即可看到首页。登录账号admin/password明文写在config_local/.env中。首次加载可能慢因 Vue 要拉取 ECharts 和 Element UI 组件——这些已打包进dist/js/chunk-vendors.*.js无需额外 CDN。4. 避坑指南五个让电力运维系统在真实配电房里“活下来”的血泪经验别信“开箱即用”。我在三个不同电压等级10kV/35kV/110kV的配电房部署过此源码以下坑全是现场实测踩出来的每一条都附带现象、根因和可抄作业的修复方案。4.1 现象Modbus 采集偶尔超时日志显示ConnectionRefusedError: [Errno 111] Connection refused原因源码中device_monitor.py的client.connect()没设超时且未做重试。真实配电房网络抖动频繁尤其工业 WiFi 或老旧光纤收发器一次连接失败就中断整个轮询周期。解决在read_device_data()函数开头加连接重试逻辑并设 3 秒超时# 修改 src/backend/core/device_monitor.py def read_device_data(ip, port, slave_id): for attempt in range(3): # 最多重试3次 client ModbusTcpClient(ip, portport, timeout3) # 关键timeout3 if client.connect(): try: result client.read_holding_registers(0, 16, unitslave_id) client.close() if not result.isError(): return parse_registers(result.registers) # 封装解析逻辑 except Exception as e: pass client.close() time.sleep(1) # 每次失败后等1秒再试 return {error: fAll retries failed for {ip}:{port}}血泪经验不要用time.sleep(0.1)——配电房 PLC 响应慢0.1 秒不够也不要设timeout10——轮询周期会拖长导致告警延迟。3 秒是平衡点。4.2 现象前端图表显示“无数据”但后端 API 返回正常 JSON原因src/frontend/src/components/Chart.vue中 ECharts 初始化时容器 DOM 元素宽度为 0因父组件v-if条件未满足或 CSS 未加载完导致echarts.init(dom)失败且静默忽略。解决强制等待 DOM 渲染完成再初始化// src/frontend/src/components/Chart.vue mounted() { this.$nextTick(() { // 关键确保 DOM 已挂载 this.chart echarts.init(this.$refs.chartDom, default, { renderer: canvas, width: this.$refs.chartDom.offsetWidth || 800, // 宽度 fallback height: this.$refs.chartDom.offsetHeight || 400 }); this.setOption(); }); }, beforeDestroy() { if (this.chart) { this.chart.dispose(); // 防止内存泄漏 } }提示width/height参数必须显式传入否则 ECharts 在 Vue 动态组件中极易失宽。4.3 现象SQLite 数据库锁死maintenance_log表无法写入日志报database is locked原因多个采集线程同时写maintenance_log表而 SQLite 默认 WAL 模式未开启写操作阻塞读。源码中create_maintenance_ticket()每次都新建连接未复用。解决在src/backend/core/db.py中启用 WAL 并复用连接# src/backend/core/db.py import sqlite3 def get_db_connection(): conn sqlite3.connect(data/maintenance.db, check_same_threadFalse) conn.execute(PRAGMA journal_modeWAL;) # 关键开启 WAL 模式 conn.row_factory sqlite3.Row return conn并在maintenance_api.py中复用连接# src/backend/api/maintenance_api.py from core.db import get_db_connection def create_maintenance_ticket(alert_info): conn get_db_connection() # 复用连接非每次新建 cursor conn.cursor() # ... 插入逻辑不变 conn.commit() conn.close() # 用完关闭避坑点check_same_threadFalse是必须的否则多线程下报ProgrammingError: SQLite objects created in a thread can only be used in that same thread。4.4 现象告警规则修改后不生效仍按旧阈值触发原因alert_engine.py的load_alert_rules()函数只在模块导入时执行一次后续修改 YAML 文件不会自动重载。解决加文件修改监听不用第三方库用 Python 标准库os.stat# src/backend/core/alert_engine.py import os import time _last_load_time 0 _cached_rules None def load_alert_rules(): global _cached_rules, _last_load_time rules_path config_local/rules/transformer_alerts.yaml mtime os.stat(rules_path).st_mtime if mtime ! _last_load_time: with open(rules_path, r, encodingutf-8) as f: _cached_rules yaml.safe_load(f) _last_load_time mtime return _cached_rules注意此方案比watchdog轻量且不增加依赖。每轮告警检查前调用load_alert_rules()即可。4.5 现象配电房 ICO 图标在 Linux 服务器上显示为方块Windows 正常原因src/frontend/public/favicon.ico是 Windows 专用 256x256 PNG 转 ICOLinux 下 Chrome 只认 32x32 或 16x16 尺寸。解决用 ImageMagick 生成标准多尺寸 ICO# 在 Ubuntu 上安装 sudo apt install imagemagick # 转换源图用 src/frontend/public/logo.png convert -resize 16x16 src/frontend/public/logo.png favicon-16.png convert -resize 32x32 src/frontend/public/logo.png favicon-32.png convert favicon-16.png favicon-32.png src/frontend/public/favicon.ico验证用file favicon.ico查看输出是否含16x16,32x32—— 若只显示256x256则浏览器不识别。5. 真实配电房落地技巧用device_config.json做设备资产台账把运维系统变成电子巡检表很多工程师拿到源码后第一反应是加功能接微信通知、上云、搞大屏。但我在某市地铁 10kV 配电所的实际经验是——先让系统成为值班员每天必打开的电子巡检表再谈智能化。核心就一条把device_config.json从配置文件变成动态可编辑的设备资产台账。5.1 把 JSON 配置变成 Web 可编辑表单3 个文件改动目标在/admin/device-config页面提供表格支持增删改设备保存后自动写入config_local/device_config.json。不引入新框架纯 Flask Jinja2 实现。步骤 1后端添加配置管理路由src/backend/api/config_api.py# src/backend/api/config_api.py import json import os from flask import Blueprint, request, jsonify, render_template config_bp Blueprint(config, __name__) config_bp.route(/admin/device-config, methods[GET]) def device_config_page(): with open(config_local/device_config.json, r, encodingutf-8) as f: config json.load(f) return render_template(device_config.html, devicesconfig) config_bp.route(/api/config/device, methods[POST]) def save_device_config(): data request.get_json() with open(config_local/device_config.json, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) return jsonify({success: True})步骤 2前端模板src/backend/templates/device_config.html!-- src/backend/templates/device_config.html -- !DOCTYPE html html headtitle设备配置管理/title/head body h2配电房设备台账/h2 table border1 trthID/ththIP/thth端口/thth从站ID/thth操作/th/tr {% for key, dev in devices.items() %} tr td{{ key }}/td tdinput typetext value{{ dev.ip }}># 在 app.py 中添加 from api.config_api import config_bp app.register_blueprint(config_bp, url_prefix/admin)效果值班员每天交接班时打开http://server-ip:5000/admin/device-config核对设备 IP 是否变更比如 RTU 重启后 DHCP 分配新 IP直接修改保存——比翻纸质台账快 10 倍。这才是运维系统真正“用起来”的起点。5.2 用maintenance_log表驱动电子巡检免开发纯 SQL配电房要求每日巡检记录存档。源码的maintenance_log表天然适配——只需把“工单”概念扩展为“巡检任务”字段原用途巡检扩展用途device_id设备唯一标识同左alert_rule告警规则名改为巡检项油温/巡检项开关状态alert_value告警时数值改为实测值72.3℃/实测值闭合status工单状态done 巡检完成pending 未巡检created_at告警时间改为巡检时间每日自动生成巡检任务的 SQL存为sql/daily_inspection.sql-- 每日凌晨 6:00 执行用 crontab INSERT INTO maintenance_log ( device_id, alert_rule, alert_level, alert_value, status, created_at, assignee, scheduled_time ) SELECT device_id, 巡检项油温, low, 0.0, -- 占位实际值由现场填写 pending, datetime(now), daily_inspection, datetime(now) FROM ( SELECT transformer_001 as device_id UNION SELECT transformer_002 UNION SELECT switchgear_001 );值班员打开工单看板看到statuspending的巡检项点击“完成”填入实测值status自动变donecreated_at记录真实时间。所有历史巡检记录自动归档在 SQLite 中导出 Excel 即可交甲方。5.3 一个让我少加班 2 小时的习惯用git diff管理现场配置变更配电房设备不会一成不变新增一台 UPS、更换温控器型号、RTU 固件升级导致寄存器地址偏移……每次变更我坚持做三件事修改config_local/device_config.json后立即git add config_local/device_config.json git commit -m add UPS_001, update transformer_001 register map修改config_local/rules/*.yaml后同样 commit每次部署前git log --oneline -n 5看最近 5 次配置变更确认无遗漏。为什么有效device_config.json是设备资产的唯一真相源。Git 历史就是配电房设备演进史。某次 UPS 通信中断我git checkout HEAD~3回退配置5 分钟恢复——比查纸质记录快半小时。这习惯不花时间但让系统真正成为“可追溯的运维资产”。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

CLI-Universe 实战:为 Terminal Agents 构建可验证任务合成引擎的 config.toml 骨架
CLI-Universe 实战:为 Terminal Agents 构建可验证任务合成引擎的 config.toml 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 7:45:46

ESP32上WASM调用硬件的原理与宿主API实现
ESP32上WASM调用硬件的原理与宿主API实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 7:45:34

《ChatGPT 微服务应用体系构建》chatgpt-web 实战:React fetch + ReadableStream 流式接口对接与打字机效果实现
《ChatGPT 微服务应用体系构建》chatgpt-web 实战:React fetch + ReadableStream 流式接口对接与打字机效果实现

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、… · 2026/9/25 7:45:28

Wi-Fi 6 ax调度深度解析:从OFDMA到TWT的实战优化指南
Wi-Fi 6 ax调度深度解析:从OFDMA到TWT的实战优化指南

很多人第一次看到“ax调度”这个词,是在路由器后台的 Wi-Fi 6 设置页里。我第一次也是。当时看着 OFDMA、MU-MIMO、TWT 这一串英文缩写,一度以为是厂商造出来的营销概念——毕竟宣传页上写得太花哨了,什么“多设备并发不卡顿”“低延迟游戏加… · 2026/9/25 8:19:39

开源CarPlay Receiver实战:旧安卓手机变身无线CarPlay接收器
开源CarPlay Receiver实战:旧安卓手机变身无线CarPlay接收器

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 8:19:39

OpenClaw技能开发实战:基于MCP协议实现MySQL增删改查
OpenClaw技能开发实战:基于MCP协议实现MySQL增删改查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 8:19:39

TC4420驱动MOSFET的5个致命细节与实操优化指南
TC4420驱动MOSFET的5个致命细节与实操优化指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 8:19:39

FPGA开发流程详解:从RTL到Bitstream的完整实现路径
FPGA开发流程详解:从RTL到Bitstream的完整实现路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 8:19:21

实战从零开始构建一个Coding Agent:Violin |得物技术
实战从零开始构建一个Coding Agent:Violin |得物技术

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 8:19:21

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码