282 lines
6.1 KiB
Vue
282 lines
6.1 KiB
Vue
<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>
|