|
|
@@ -391,6 +391,16 @@ async function sendCode(code: string) {
|
|
|
<div class="section-title">今日工作时长</div>
|
|
|
<div class="work-duration">{{ workDuration }}</div>
|
|
|
</div>
|
|
|
+ <div class="stats-section">
|
|
|
+ <div class="section-title">今日统计</div>
|
|
|
+ <div v-if="todayStats.length === 0" class="stats-empty">暂无数据</div>
|
|
|
+ <div v-else class="stats-grid">
|
|
|
+ <div v-for="item in todayStats" :key="item.code" class="stats-item">
|
|
|
+ <a-tag :color="item.color" size="small">{{ item.label }}</a-tag>
|
|
|
+ <span class="stats-count">{{ item.count }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
<div class="device-status-section">
|
|
|
<div class="section-title">设备状态</div>
|
|
|
<div v-if="deviceStatus?.mqtt.connected" class="device-connected">
|
|
|
@@ -403,16 +413,6 @@ async function sendCode(code: string) {
|
|
|
<span class="device-dot disconnected"/> 设备未连接
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="stats-section">
|
|
|
- <div class="section-title">今日统计</div>
|
|
|
- <div v-if="todayStats.length === 0" class="stats-empty">暂无数据</div>
|
|
|
- <div v-else class="stats-grid">
|
|
|
- <div v-for="item in todayStats" :key="item.code" class="stats-item">
|
|
|
- <a-tag :color="item.color" size="small">{{ item.label }}</a-tag>
|
|
|
- <span class="stats-count">{{ item.count }}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
</div>
|
|
|
|
|
|
<div class="chart-row">
|
|
|
@@ -640,6 +640,8 @@ async function sendCode(code: string) {
|
|
|
border: 1px solid var(--border-color);
|
|
|
border-radius: 8px;
|
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
}
|
|
|
|
|
|
.work-duration {
|
|
|
@@ -648,6 +650,7 @@ async function sendCode(code: string) {
|
|
|
color: #1890ff;
|
|
|
font-variant-numeric: tabular-nums;
|
|
|
line-height: 1;
|
|
|
+ margin-top: auto;
|
|
|
}
|
|
|
|
|
|
.device-status-section {
|
|
|
@@ -658,6 +661,8 @@ async function sendCode(code: string) {
|
|
|
border: 1px solid var(--border-color);
|
|
|
border-radius: 8px;
|
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
}
|
|
|
|
|
|
.device-connected {
|
|
|
@@ -667,6 +672,7 @@ async function sendCode(code: string) {
|
|
|
font-size: 14px;
|
|
|
font-weight: 600;
|
|
|
color: #52c41a;
|
|
|
+ margin-top: auto;
|
|
|
}
|
|
|
|
|
|
.device-disconnected {
|
|
|
@@ -676,6 +682,7 @@ async function sendCode(code: string) {
|
|
|
font-size: 14px;
|
|
|
font-weight: 600;
|
|
|
color: var(--text-secondary);
|
|
|
+ margin-top: auto;
|
|
|
}
|
|
|
|
|
|
.device-dot {
|
|
|
@@ -702,12 +709,15 @@ async function sendCode(code: string) {
|
|
|
border: 1px solid var(--border-color);
|
|
|
border-radius: 8px;
|
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
}
|
|
|
|
|
|
.stats-grid {
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
gap: 10px 16px;
|
|
|
+ margin-top: auto;
|
|
|
}
|
|
|
|
|
|
.stats-item {
|
|
|
@@ -726,6 +736,7 @@ async function sendCode(code: string) {
|
|
|
.stats-empty {
|
|
|
color: var(--text-secondary);
|
|
|
font-size: 13px;
|
|
|
+ margin-top: auto;
|
|
|
}
|
|
|
|
|
|
.log-section {
|