feat: 新增 edc-web Flask 前端管理系统 + 需求文档

- edc-web: Flask 项目骨架(设备管理、测试操作、测试信息三大页面)
- edc_server: 升级子模块(tb_serialnet 透传支持)
- docs: 测试工装EDC管理系统需求文档
This commit is contained in:
wangfq
2026-05-28 09:40:45 +08:00
parent 2bfb9602e4
commit 70dd3f8246
2295 changed files with 370008 additions and 1 deletions

View File

@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}EDC 工装管理系统{% endblock %}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<nav class="top-menu">
<a href="/" class="{% if request.path == '/' %}active{% endif %}">设备</a>
<a href="/test-data" class="{% if request.path == '/test-data' %}active{% endif %}">测试信息</a>
</nav>
<main class="container">
{% block content %}{% endblock %}
</main>
{% block scripts %}{% endblock %}
</body>
</html>

View File

@@ -0,0 +1,24 @@
{% extends "base.html" %}
{% block title %}设备列表 - EDC 工装管理系统{% endblock %}
{% block content %}
<h2>联网终端列表</h2>
<table id="device-table">
<thead>
<tr>
<th>设备编码</th>
<th>名称</th>
<th>IP 地址</th>
<th>在线状态</th>
<th>固件版本</th>
<th>最后上线</th>
<th>操作</th>
</tr>
</thead>
<tbody></tbody>
</table>
{% endblock %}
{% block scripts %}
<script src="{{ url_for('static', filename='js/devices.js') }}"></script>
{% endblock %}

View File

@@ -0,0 +1,52 @@
{% extends "base.html" %}
{% block title %}测试信息 - EDC 工装管理系统{% endblock %}
{% block content %}
<h2>测试信息</h2>
<div class="search-bar">
<label>
设备编码:
<input type="text" id="search-serial" placeholder="输入设备编码搜索...">
</label>
<label>
日期范围:
<input type="date" id="search-date-from">
<input type="date" id="search-date-to">
</label>
<button onclick="searchData(1)" class="btn-search">搜索</button>
<button onclick="exportCSV()" class="btn-export">导出 CSV</button>
</div>
<table id="test-data-table">
<thead>
<tr>
<th>ID</th>
<th>设备编码</th>
<th>DG430地址</th>
<th>设备型号</th>
<th>类型</th>
<th>是否完成</th>
<th>故障信息</th>
<th>继电器</th>
<th>峰峰值(V)</th>
<th>开始频率(Hz)</th>
<th>进入频率(Hz)</th>
<th>离开频率(Hz)</th>
<th>进入距离(mm)</th>
<th>离开距离(mm)</th>
<th>进入速度(dm/s)</th>
<th>离开速度(dm/s)</th>
<th>时间</th>
</tr>
</thead>
<tbody></tbody>
</table>
<div class="pagination" id="pagination"></div>
{% endblock %}
{% block scripts %}
<script src="{{ url_for('static', filename='js/test_data.js') }}"></script>
{% endblock %}

View File

@@ -0,0 +1,69 @@
{% extends "base.html" %}
{% block title %}测试操作 - {{ device.serial }} - EDC 工装管理系统{% endblock %}
{% block content %}
<div class="test-page">
<div class="test-header">
<a href="/">← 返回设备列表</a>
<h2>测试操作 — {{ device.serial }} ({{ device.name or '未命名' }})</h2>
</div>
<div class="test-layout">
<!-- 左侧:测试操作区 -->
<div class="test-control">
<h3>手动指令</h3>
<div class="cmd-buttons">
<button onclick="sendCmd('B0')" class="btn-cmd">开始测试 (0xB0)</button>
<button onclick="sendCmd('B1')" class="btn-cmd">测试复原 (0xB1)</button>
<button onclick="sendCmd('BA')" class="btn-cmd">电机前进 (0xBA)</button>
<button onclick="sendCmd('BB')" class="btn-cmd">电机后退 (0xBB)</button>
<button onclick="sendCmd('BC')" class="btn-cmd">电机停止 (0xBC)</button>
</div>
<h3>自动化测试</h3>
<div class="automation">
<label>
测试次数:
<input type="number" id="test-count" value="10" min="1" max="9999">
</label>
<button id="btn-auto" class="btn-start" onclick="toggleAuto()">开始</button>
<div class="progress-container">
<div class="progress-bar" id="progress-bar"></div>
<div class="progress-text" id="progress-text">等待开始...</div>
</div>
<div class="stats" id="stats">
<span>完成:<strong id="stat-done">0</strong></span>
<span>失败:<strong id="stat-failed">0</strong></span>
<span>剩余:<strong id="stat-remaining">0</strong></span>
</div>
</div>
</div>
<!-- 右侧:测试信息显示区 -->
<div class="test-info">
<h3>当前测试数据</h3>
<div id="latest-result">
<p class="placeholder">等待设备上报...</p>
</div>
<h3>自动化平均值</h3>
<table id="avg-table">
<tr><td>平均峰峰值</td><td id="avg-ppvalue">-</td><td>V</td></tr>
<tr><td>平均开始工作频率</td><td id="avg-idle-freq">-</td><td>Hz</td></tr>
<tr><td>平均进入工作频率</td><td id="avg-enter-freq">-</td><td>Hz</td></tr>
<tr><td>平均进入距离</td><td id="avg-enter-dist">-</td><td>mm</td></tr>
<tr><td>平均离开距离</td><td id="avg-exit-dist">-</td><td>mm</td></tr>
<tr><td>平均进入速度</td><td id="avg-enter-speed">-</td><td>dm/s</td></tr>
<tr><td>平均离开速度</td><td id="avg-exit-speed">-</td><td>dm/s</td></tr>
</table>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script>
const DNT_ID = {{ device.id }};
</script>
<script src="{{ url_for('static', filename='js/test_op.js') }}"></script>
{% endblock %}