2025-09-05 14:52:28 +08:00
|
|
|
<!-- index.vue -->
|
2025-08-21 14:11:58 +08:00
|
|
|
<template>
|
|
|
|
|
<div class="container">
|
|
|
|
|
<div class="left-panel">
|
|
|
|
|
<div class="hand-container">
|
|
|
|
|
<LeftTopHand @update:topSeriesData="handleUpdateTopSeriesData" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="hand-container">
|
|
|
|
|
<LeftBottomHand @update:bottomSeriesData="handleUpdateBottomSeriesData" />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="right-panel">
|
2025-09-05 14:52:28 +08:00
|
|
|
<RightTopCharts :top-series-data="topSeriesData" style="height: 50%;" />
|
|
|
|
|
<RightBottomCharts :max-data="maxData" :avg-data="avgData" style="height: 50%;" />
|
2025-08-21 14:11:58 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
import { ref } from 'vue';
|
2025-09-05 14:52:28 +08:00
|
|
|
import RightTopCharts from './RightTopCharts.vue';
|
2025-08-21 14:11:58 +08:00
|
|
|
import LeftTopHand from './LeftTopHand.vue';
|
2025-09-05 14:52:28 +08:00
|
|
|
import LeftBottomHand from './LeftBottomHand.vue';
|
2025-08-21 14:11:58 +08:00
|
|
|
import RightBottomCharts from './RightBottomCharts.vue';
|
|
|
|
|
|
|
|
|
|
const topSeriesData = ref([0, 0, 0, 0, 0, 0]);
|
|
|
|
|
const bottomSeriesData = ref([0, 0, 0, 0, 0, 0]);
|
|
|
|
|
const maxData = ref({
|
|
|
|
|
thumb: { end: 0, tip: 0, middle: 0, palm: 0 },
|
|
|
|
|
indexFinger: { end: 0, tip: 0, middle: 0 },
|
|
|
|
|
middleFinger: { end: 0, tip: 0, middle: 0 },
|
|
|
|
|
ringFinger: { end: 0, tip: 0, middle: 0 },
|
|
|
|
|
littleFinger: { end: 0, tip: 0, middle: 0 },
|
|
|
|
|
palm: { touch: 0 }
|
|
|
|
|
});
|
|
|
|
|
const avgData = ref({
|
|
|
|
|
thumb: { end: 0, tip: 0, middle: 0, palm: 0 },
|
|
|
|
|
indexFinger: { end: 0, tip: 0, middle: 0 },
|
|
|
|
|
middleFinger: { end: 0, tip: 0, middle: 0 },
|
|
|
|
|
ringFinger: { end: 0, tip: 0, middle: 0 },
|
|
|
|
|
littleFinger: { end: 0, tip: 0, middle: 0 },
|
|
|
|
|
palm: { touch: 0 }
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const handleUpdateTopSeriesData = (newData) => {
|
|
|
|
|
topSeriesData.value = newData;
|
|
|
|
|
};
|
|
|
|
|
|
2025-09-05 14:52:28 +08:00
|
|
|
const handleUpdateBottomSeriesData = ({ maxData: newMaxData, avgData: newAvgData }) => {
|
|
|
|
|
maxData.value = newMaxData;
|
|
|
|
|
avgData.value = newAvgData;
|
2025-08-21 14:11:58 +08:00
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.container {
|
|
|
|
|
display: flex;
|
2025-09-05 14:52:28 +08:00
|
|
|
flex: 1; /* 占据父容器所有可用空间 */
|
2025-08-21 14:11:58 +08:00
|
|
|
width: 100%;
|
2025-09-05 14:52:28 +08:00
|
|
|
height: 100%; /* 占满父容器高度 */
|
|
|
|
|
min-height: 0; /* 防止 flex 子项最小高度问题 */
|
2025-08-21 14:11:58 +08:00
|
|
|
background-color: #fff;
|
|
|
|
|
border-radius: 20px;
|
2025-09-05 14:52:28 +08:00
|
|
|
overflow: hidden; /* 防止内容溢出 */
|
|
|
|
|
box-sizing: border-box; /* 包含 padding 和 border */
|
|
|
|
|
padding: 20px; /* 与父容器一致,避免双重 padding */
|
2025-08-21 14:11:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.left-panel,
|
|
|
|
|
.right-panel {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
width: 50%;
|
2025-09-05 14:52:28 +08:00
|
|
|
height: 100%; /* 占满 container 高度 */
|
|
|
|
|
padding: 0; /* 移除子面板内边距,交给 container 处理 */
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
overflow: hidden;
|
2025-08-21 14:11:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.hand-container {
|
|
|
|
|
position: relative;
|
2025-09-05 14:52:28 +08:00
|
|
|
height: 50%; /* 每个 hand-container 占左面板的 50% 高度 */
|
|
|
|
|
width: 100%;
|
|
|
|
|
overflow: hidden;
|
2025-08-21 14:11:58 +08:00
|
|
|
}
|
|
|
|
|
</style>
|