fix(frontend): 为 table 添加 thead/tbody 消除 Vite 构建警告

HTML 规范要求 <tr> 必须是 <thead>/<tbody>/<tfoot> 的直接子元素,
不能直接作为 <table> 的子节点。Vite/Vue 会报告 warning 并可能导致
hydration 错误。

修复以下文件中的表格结构:
- StatusBoard.vue: 2 个表格添加 <thead> + <tbody>
- Index.vue: 1 个表格添加 <tbody>
- Monitor.vue: 2 个表格添加 <tbody>
- TaskCenter.vue: 1 个表格添加 <tbody>
This commit is contained in:
2026-07-14 16:07:09 +08:00
parent 9ddaa0bf6f
commit f3d8a1335c
4 changed files with 132 additions and 116 deletions
+27 -25
View File
@@ -86,31 +86,33 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<table> <table>
<tr class="tr-hover"> <tbody>
<td class="status-text ok">● 成功</td> <tr class="tr-hover">
<td class="strong">MySQL 主从部署</td> <td class="status-text ok">● 成功</td>
<td class="mono">2m14s</td> <td class="strong">MySQL 主从部署</td>
</tr> <td class="mono">2m14s</td>
<tr class="tr-hover"> </tr>
<td class="status-text warn">● 执行中</td> <tr class="tr-hover">
<td class="strong">RKE2 节点加入</td> <td class="status-text warn">● 执行中</td>
<td class="mono">38s</td> <td class="strong">RKE2 节点加入</td>
</tr> <td class="mono">38s</td>
<tr class="tr-hover"> </tr>
<td class="status-text ok">● 成功</td> <tr class="tr-hover">
<td class="strong">Redis Cluster 部署</td> <td class="status-text ok">● 成功</td>
<td class="mono">3m02s</td> <td class="strong">Redis Cluster 部署</td>
</tr> <td class="mono">3m02s</td>
<tr class="tr-hover"> </tr>
<td class="status-text err">● 失败</td> <tr class="tr-hover">
<td class="strong">openresty 网关部署</td> <td class="status-text err">● 失败</td>
<td class="mono">41s</td> <td class="strong">openresty 网关部署</td>
</tr> <td class="mono">41s</td>
<tr class="tr-hover"> </tr>
<td class="status-text ok">● 成功</td> <tr class="tr-hover">
<td class="strong">业务线标签同步</td> <td class="status-text ok">● 成功</td>
<td class="mono">5s</td> <td class="strong">业务线标签同步</td>
</tr> <td class="mono">5s</td>
</tr>
</tbody>
</table> </table>
</div> </div>
</div> </div>
+36 -32
View File
@@ -15,22 +15,24 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<table> <table>
<tr class="tr-hover"> <tbody>
<td>七机房采集节点数</td> <tr class="tr-hover">
<td class="mono strong">128</td> <td>七机房采集节点数</td>
</tr> <td class="mono strong">128</td>
<tr class="tr-hover"> </tr>
<td>活跃时序数量</td> <tr class="tr-hover">
<td class="mono strong">42.6M</td> <td>活跃时序数量</td>
</tr> <td class="mono strong">42.6M</td>
<tr class="tr-hover"> </tr>
<td>Prometheus 接口接入</td> <tr class="tr-hover">
<td class="status-text ok">● 正常</td> <td>Prometheus 接口接入</td>
</tr> <td class="status-text ok">● 正常</td>
<tr class="tr-hover"> </tr>
<td>Grafana 仪表盘数</td> <tr class="tr-hover">
<td class="mono strong">37</td> <td>Grafana 仪表盘数</td>
</tr> <td class="mono strong">37</td>
</tr>
</tbody>
</table> </table>
</div> </div>
</div> </div>
@@ -42,22 +44,24 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<table> <table>
<tr class="tr-hover"> <tbody>
<td>物理机监控覆盖</td> <tr class="tr-hover">
<td class="mono strong">186 / 186</td> <td>物理机监控覆盖</td>
</tr> <td class="mono strong">186 / 186</td>
<tr class="tr-hover"> </tr>
<td>当前告警</td> <tr class="tr-hover">
<td class="status-text warn">● 2 条(风扇转速异常)</td> <td>当前告警</td>
</tr> <td class="status-text warn">● 2 条(风扇转速异常)</td>
<tr class="tr-hover"> </tr>
<td>网络设备健康</td> <tr class="tr-hover">
<td class="status-text ok">● 正常</td> <td>网络设备健康</td>
</tr> <td class="status-text ok">● 正常</td>
<tr class="tr-hover"> </tr>
<td>存储健康度</td> <tr class="tr-hover">
<td class="status-text ok">● 正常</td> <td>存储健康度</td>
</tr> <td class="status-text ok">● 正常</td>
</tr>
</tbody>
</table> </table>
</div> </div>
</div> </div>
+62 -54
View File
@@ -44,35 +44,39 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<table> <table>
<tr><th>机房</th><th>总数</th><th>在线</th><th>健康率</th><th>状态</th></tr> <thead>
<tr class="tr-hover"> <tr><th>机房</th><th>总数</th><th>在线</th><th>健康率</th><th>状态</th></tr>
<td class="strong mono">YZH 机房</td> </thead>
<td class="mono">78</td> <tbody>
<td class="mono">78</td> <tr class="tr-hover">
<td><span class="bar-wrap"><span class="bar-fill" style="width: 98%"></span></span>98%</td> <td class="strong mono">YZH 机房</td>
<td class="status-text ok">● 正常</td> <td class="mono">78</td>
</tr> <td class="mono">78</td>
<tr class="tr-hover"> <td><span class="bar-wrap"><span class="bar-fill" style="width: 98%"></span></span>98%</td>
<td class="strong mono">XS 机房</td> <td class="status-text ok">● 正常</td>
<td class="mono">64</td> </tr>
<td class="mono">63</td> <tr class="tr-hover">
<td><span class="bar-wrap"><span class="bar-fill warn" style="width: 91%"></span></span>91%</td> <td class="strong mono">XS 机房</td>
<td class="status-text warn">● 1 条告警</td> <td class="mono">64</td>
</tr> <td class="mono">63</td>
<tr class="tr-hover"> <td><span class="bar-wrap"><span class="bar-fill warn" style="width: 91%"></span></span>91%</td>
<td class="strong mono">JF 机房</td> <td class="status-text warn">● 1 条告警</td>
<td class="mono">22</td> </tr>
<td class="mono">22</td> <tr class="tr-hover">
<td><span class="bar-wrap"><span class="bar-fill" style="width: 100%"></span></span>100%</td> <td class="strong mono">JF 机房</td>
<td class="status-text ok">● 正常</td> <td class="mono">22</td>
</tr> <td class="mono">22</td>
<tr class="tr-hover"> <td><span class="bar-wrap"><span class="bar-fill" style="width: 100%"></span></span>100%</td>
<td class="strong mono">海外 IDC(4)</td> <td class="status-text ok">● 正常</td>
<td class="mono">22</td> </tr>
<td class="mono">21</td> <tr class="tr-hover">
<td><span class="bar-wrap"><span class="bar-fill err" style="width: 86%"></span></span>86%</td> <td class="strong mono">海外 IDC(4)</td>
<td class="status-text err">● 1 条严重</td> <td class="mono">22</td>
</tr> <td class="mono">21</td>
<td><span class="bar-wrap"><span class="bar-fill err" style="width: 86%"></span></span>86%</td>
<td class="status-text err">● 1 条严重</td>
</tr>
</tbody>
</table> </table>
</div> </div>
</div> </div>
@@ -84,31 +88,35 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<table> <table>
<tr><th>业务线</th><th>虚机数</th><th>CPU 均值</th><th>状态</th></tr> <thead>
<tr class="tr-hover"> <tr><th>业务线</th><th>虚机数</th><th>CPU 均值</th><th>状态</th></tr>
<td class="strong mono">Kodo</td> </thead>
<td class="mono">218</td> <tbody>
<td><span class="bar-wrap"><span class="bar-fill" style="width: 64%"></span></span>64%</td> <tr class="tr-hover">
<td class="status-text ok">● 正常</td> <td class="strong mono">Kodo</td>
</tr> <td class="mono">218</td>
<tr class="tr-hover"> <td><span class="bar-wrap"><span class="bar-fill" style="width: 64%"></span></span>64%</td>
<td class="strong mono">LAS</td> <td class="status-text ok">● 正常</td>
<td class="mono">164</td> </tr>
<td><span class="bar-wrap"><span class="bar-fill warn" style="width: 82%"></span></span>82%</td> <tr class="tr-hover">
<td class="status-text warn">● 1 条告警</td> <td class="strong mono">LAS</td>
</tr> <td class="mono">164</td>
<tr class="tr-hover"> <td><span class="bar-wrap"><span class="bar-fill warn" style="width: 82%"></span></span>82%</td>
<td class="strong mono">灵矽</td> <td class="status-text warn">● 1 条告警</td>
<td class="mono">96</td> </tr>
<td><span class="bar-wrap"><span class="bar-fill" style="width: 57%"></span></span>57%</td> <tr class="tr-hover">
<td class="status-text ok">● 正常</td> <td class="strong mono">灵矽</td>
</tr> <td class="mono">96</td>
<tr class="tr-hover"> <td><span class="bar-wrap"><span class="bar-fill" style="width: 57%"></span></span>57%</td>
<td class="strong mono">共享池 / 未分配</td> <td class="status-text ok">● 正常</td>
<td class="mono">34</td> </tr>
<td><span class="bar-wrap"><span class="bar-fill" style="width: 31%"></span></span>31%</td> <tr class="tr-hover">
<td class="status-text ok">● 正常</td> <td class="strong mono">共享池 / 未分配</td>
</tr> <td class="mono">34</td>
<td><span class="bar-wrap"><span class="bar-fill" style="width: 31%"></span></span>31%</td>
<td class="status-text ok">● 正常</td>
</tr>
</tbody>
</table> </table>
</div> </div>
</div> </div>
+7 -5
View File
@@ -14,11 +14,13 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<table> <table>
<tr v-for="task in tasks" :key="task.id" class="tr-hover" :class="{ active: task.id === selectedTask }" @click="selectedTask = task.id"> <tbody>
<td :class="['status-text', task.statusClass]">● {{ task.status }}</td> <tr v-for="task in tasks" :key="task.id" class="tr-hover" :class="{ active: task.id === selectedTask }" @click="selectedTask = task.id">
<td class="strong">{{ task.name }}</td> <td :class="['status-text', task.statusClass]">● {{ task.status }}</td>
<td class="mono" style="font-size: 11px; color: var(--text-dim)">{{ task.playbook }}</td> <td class="strong">{{ task.name }}</td>
</tr> <td class="mono" style="font-size: 11px; color: var(--text-dim)">{{ task.playbook }}</td>
</tr>
</tbody>
</table> </table>
<div class="pagination"> <div class="pagination">
<span>共 86 条 · 每页 6 条</span> <span>共 86 条 · 每页 6 条</span>