问题:14 寸非 4:3 屏幕上,表格列挤压、换行、表头筛选器拥挤;CPU 拱桥遮挡数字 时间:2026-07-23
- 5 列(协议、本地地址、识别服务、真实进程/PID、端口提示)没有固定比例
- 窄屏下内容换行或相互挤压,布局混乱
- 期望比例:10 : 25 : 25 : 25 : 15
- 状态筛选原本嵌在"状态"表头
<th>里,和文本挤在同一行 - 改为独立筛选栏后用户反馈不符合整体格局
- 最终方案:表头内嵌
<select>下拉框(状态/运行中/已退出/失败),默认显示"状态"不过滤
- 前列内容过长时,自动换行把后面列"推"下去
- 期望:后列遮挡前列溢出(推拉门效果)
- 保持固定列宽,超出部分用
...省略
- 拱桥宽度 16px 时,
fontSize: 28的数字左侧被拱桥裁切 - 底部
stat-row使用display: flex; justify-content: space-between,长 CPU 型号把2 核推到第二行 - 缩放 100% 时,flex item 亚像素舍入导致 CPU 卡片占比异常(70-80% 正常)
.data-table th, .data-table td {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.data-table td { max-width: 0; }- 前置条件: Go 1.24+ 和 Node.js 18+
- 前端改动只需
make web(无需重编 Go)
.net-table th:nth-child(1) { width: 10%; } /* 协议 */
.net-table th:nth-child(2) { width: 25%; } /* 本地地址 */
.net-table th:nth-child(3) { width: 25%; } /* 识别服务 */
.net-table th:nth-child(4) { width: 25%; } /* 真实进程/PID */
.net-table th:nth-child(5) { width: 15%; } /* 端口提示 */- 前置条件: Docker 20.10+ 和 Docker Compose 2.0+
- 适合不想装 Go/Node.js 的服务器
.data-table th:nth-child(1) { width: 16%; }
.data-table th:nth-child(2) { width: 10%; }
.data-table th:nth-child(3) { width: 22%; }
.data-table th:nth-child(4) { width: 6%; }
.data-table th:nth-child(5) { width: 6%; }
.data-table th:nth-child(6) { width: 18%; }
.data-table th:nth-child(7) { width: 14%; }
.data-table th:nth-child(8) { width: 8%; }.sel-xs { font-size: 11px; padding: 2px 6px; margin-left: 6px; border-radius: 6px; }
.toast-copy { position: fixed; bottom: 28px; left: 50%; transform: translateX(-50%); background: var(--text); color: var(--bg); padding: 8px 22px; border-radius: 10px; font-size: 13px; z-index: 100; animation: toast-in 0.25s ease; }
@keyframes toast-in { from { opacity: 0; transform: translateX(-50%) translateY(12px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }仅调整 gauge 数字大小和底部布局,不改变卡片结构:
// 仪表数字缩小,约束在拱桥内: 28px → 22px
detail: { valueAnimation: true, fontSize: 22, color: txt, offsetCenter: [0, 0], formatter: (value) => value.toFixed(2) + '%' },
// stat-row 改为自然文本流(消除 flex 亚像素舍入导致的缩放比例异常)
<div className="stat-row" style={{ display: 'block' }}>
<span style={{ fontSize: 13, fontWeight: 700 }}>{snap.cpu.cores} 核</span>{' '}
<span className="dim" style={{ fontSize: 11.5 }}>{snap.cpu.model || '—'}</span>
</div>- 网络接口表格:增加
className="data-table net-table" - 监听端口表格:增加
className="data-table net-table"
- 现有规则表格:增加
className="data-table net-table"
- 移除:独立筛选栏
<div className="filter-bar"> - 表头状态列改为下拉:
<th> <select className="sel sel-xs" value={statusFilter} onChange={(e) => setStatusFilter(e.target.value as ...)}> <option value="all">状态</option> <option value="running">运行中</option> <option value="exited">已退出</option> <option value="failed">失败</option> </select> </th>
- 新增:日志命令双击复制功能
copyCmd()+cursor:copy+ Toast 提示"已复制"
| 检查项 | 结果 |
|---|---|
| 前端构建成功 | ✅ .net-table 和 .toast-copy 已进入构建产物 |
| 服务重启成功 | ✅ systemd opscore.service active |
| 页面访问正常 | ✅ http://192.168.207.10:8081 |
| 表格列宽固定 | ✅ table-layout: fixed + 百分比宽度 |
| 溢出隐藏 | ✅ 后列遮挡前列,无换行 |
| 状态筛选 | ✅ 表头内嵌 <select> 下拉,默认"状态" |
| CPU 数字在拱桥内 | ✅ fontSize: 22,居中不裁切 |
| CPU 底部不换行 | ✅ display: block 自然文本流,型号自动截断 |
| 卡片布局一致 | ✅ 未改动 grid-5 / Card 结构 |
| 缩放 100% / 80% 比例一致 | ✅ 消除 flex 亚像素舍入问题 |
| 日志命令双击复制 | ✅ onDoubleClick + Toast "已复制" |
/opt/opscore/web/src/index.css
- 全局表格溢出隐藏
- .net-table 列宽比例 10:25:25:25:15
- 服务发现表格列宽微调
- .sel-xs 下拉框样式(已有)
- .toast-copy / @keyframes toast-in(新增双‑击复制提示)
- 注意:未改动 .grid / .card 等布局类
/opt/opscore/web/src/modules/ResourcesModule.tsx
- cpuOption: detail.fontSize 28→22
- cpu stat-row: display:flex → display:block (inline style)
- 底部两 span 缩小字号 + 自然文本流
/opt/opscore/web/src/modules/NetworkModule.tsx
- 接口表格 + 监听端口表格增加 net-table class
/opt/opscore/web/src/modules/FirewallModule.tsx
- 现有规则表格增加 net-table class
/opt/opscore/web/src/modules/ServicesModule.tsx
- 状态筛选从表头内嵌 select 改为独立 filter-bar → 最终改回表头 `<select>` 下拉
- 日志命令双击复制(copyCmd + Toast)
.grid-5/.grid-2网格布局.card/.card-head/.stat-row卡片结构- EChart 容器高度(
height={240}/height={260}) - 内存波浪图、磁盘饼图等其他卡片
- gauge
progress/axisLinewidth 保持 16px 不变 .filter-bar/.filter-btn/.filter-on已删除(不再使用)