Files
Situation-Awareness-Platfor…/src/views/Jyh/Dashboard/usage.vue

282 lines
6.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<d-content class="content-area">
<div class="usage-container">
<div class="control-bar">
<d-range-date-picker-pro
v-model="rangeDatePickerProValue"
:maxDate="today"
:format="dateFormat"
:placeholder="['开始日期', '结束日期']"
class="dark-picker"
/>
<div class="filter-tabs-container">
<d-tabs type="slider" v-model="activeDaysStr" class="custom-tabs-group time-tabs">
<d-tab id="1天" title="1天"></d-tab>
<d-tab id="7天" title="7天"></d-tab>
<d-tab id="30天" title="30天"></d-tab>
</d-tabs>
</div>
<d-button class="export-btn" variant="text">
<i class="d-icon icon-download"></i> 导出 CSV 文件
</d-button>
</div>
<div class="data-content">
<div class="no-events-found">
<p class="main-text">No Events Found</p>
<p class="sub-text">No usage events found for the selected filters</p>
</div>
</div>
</div>
</d-content>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
// 辅助函数:根据天数设置日期范围
const today = new Date();
today.setHours(23, 59, 59, 999); // 确保 maxDate 覆盖今天全天
const getRangeByDays = (days: number): Date[] => {
const endDate = new Date(today); // 确保结束日期是今天
const startDate = new Date(today);
// 注意:如果是 1天实际是今天这 24小时所以减 1 天
startDate.setDate(today.getDate() - (days - 1));
startDate.setHours(0, 0, 0, 0); // 开始日期从当天 0点开始
return [startDate, endDate];
};
const dateFormat = 'MM月DD日';
// 默认值30天
const rangeDatePickerProValue = ref<Date[]>(getRangeByDays(30));
const activeTag = ref('Bug Bot');
const activeDaysStr = ref('30天'); // 默认选中 30天
watch(activeDaysStr, (newVal) => {
let days: number;
// 从字符串 'X天' 中提取天数
switch (newVal) {
case '1天':
days = 1;
break;
case '7天':
days = 7;
break;
case '30天':
days = 30;
break;
default:
return;
}
// 更新日期范围
rangeDatePickerProValue.value = getRangeByDays(days);
});
</script>
<style lang="scss" scoped>
/* 定义核心暗色变量 */
$bg-secondary: #141414;
$bg-card: #1e1e1e;
$text-primary: #eaeaea;
$text-secondary: #aaaaaa;
$border-color: #333333;
$active-tag-bg: #444444;
.content-area {
background-color: rgb(20, 18, 11);
padding: 40px 60px;
//overflow-y: auto;
}
.usage-page {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: $bg-secondary;
min-height: 100vh;
padding: 40px;
}
.usage-container {
//max-width: 1000px;
margin: 0 auto;
}
/* --- 顶部控制栏样式 --- */
.control-bar {
display: flex;
align-items: center;
gap: 16px;
padding-bottom: 20px;
border-bottom: 1px solid $border-color;
}
/* 日期范围选择器样式重写 (d-range-date-picker-pro) */
:deep(.d-range-date-picker-pro) {
width: 180px;
.devui-input-wrap, .devui-input-affix-wrapper {
background-color: $bg-card !important;
border: 1px solid $border-color !important;
border-radius: 6px !important;
height: 36px !important;
padding: 0 8px !important;
.devui-input {
color: $text-primary !important;
font-weight: 500 !important;
cursor: pointer !important;
padding: 0 4px !important;
}
}
.d-icon-calendar {
display: none !important;
}
.devui-separator {
color: $text-primary !important;
margin: 0 4px !important;
}
}
/* --- 筛选标签区域样式 (d-tabs) --- */
.filter-tabs-container {
display: flex;
gap: 8px; /* 保持两个 Tab 组之间的间隔 */
flex-grow: 1; /* 占据中间空间 */
}
// 统一对 Tab 组进行样式覆盖,以实现标签的外观
:deep(.custom-tabs-group) {
height: 36px; /* 保持与日期选择器高度一致 */
// 隐藏 Tab 的底部边框
.devui-nav-container {
border-bottom: none !important;
margin-bottom: 0 !important;
}
// 针对每个 Tab Item 进行样式覆盖
.devui-nav-item {
margin-right: 8px; /* 调整 Tab Item 之间的间距 */
}
// Tab 内容:实现卡片/标签样式
.devui-nav-item__link {
color: $text-primary !important;
background-color: $bg-card !important;
border: 1px solid $border-color !important;
border-radius: 6px !important;
padding: 6px 12px !important;
height: 36px;
line-height: 24px;
transition: none;
// 隐藏 slider 类型自带的底部滑块
&::after {
display: none !important;
}
// 鼠标悬停效果
&:hover {
border-color: #555555 !important;
}
}
// 选中 Tab 的样式
.devui-nav-item.active .devui-nav-item__link {
background-color: $active-tag-bg !important;
border-color: $active-tag-bg !important;
color: $text-primary !important;
}
}
/* 导出按钮样式 */
.export-btn {
color: $text-secondary !important;
font-size: 14px;
padding: 0 8px !important;
&:hover {
color: $text-primary !important;
}
.d-icon-upload {
font-size: 16px;
margin-right: 4px;
}
}
/* --- 数据内容区样式 --- */
.data-content {
background-color: $bg-card;
border-radius: 8px;
border: 1px solid $border-color;
margin-top: 20px;
height: 500px;
display: flex;
align-items: center;
justify-content: center;
}
.no-events-found {
text-align: center;
color: #666666;
.main-text {
font-size: 18px;
font-weight: 600;
margin-bottom: 8px;
}
.sub-text {
font-size: 14px;
}
}
:deep(.devui-range-date-picker-pro__range-picker) {
background-color: black;
.devui-input__wrapper {
background-color: black;
color: white;
.devui-input__inner {
color: white;
}
}
}
:deep(.devui-tabs__nav) {
background-color: black;
border-color: black;
}
:deep(.devui-tabs__nav--slider) {
li:first-child {
border-left-width: 0;
}
span {
color: white;
}
}
:deep(.devui-tab__content) {
margin-top: 0;
padding: 0;
}
</style>