|
@@ -1,238 +1,230 @@
|
|
|
<template>
|
|
|
- <el-container>
|
|
|
- <el-main>
|
|
|
- <!-- 报表头部信息 -->
|
|
|
- <div class="report-header">
|
|
|
- <div class="header-left">
|
|
|
- <div class="report-title">
|
|
|
- <h3>{{ reportData?.name || '未命名报表' }}</h3>
|
|
|
- <div class="report-meta">
|
|
|
- <el-tag :type="getStatusType(reportData?.status)">{{ getStatusText(reportData?.status) }}</el-tag>
|
|
|
- <span class="meta-item">创建时间:{{ formatDate(reportData?.createTime) }}</span>
|
|
|
- <span class="meta-item">更新时间:{{ formatDate(reportData?.updateTime) }}</span>
|
|
|
- </div>
|
|
|
+ <div class="report-detail-modal">
|
|
|
+ <!-- 报表头部信息 -->
|
|
|
+ <div class="report-header">
|
|
|
+ <div class="header-left">
|
|
|
+ <div class="report-title">
|
|
|
+ <h3>{{ reportData?.name || '未命名报表' }}</h3>
|
|
|
+ <div class="report-meta">
|
|
|
+ <el-tag :type="getStatusType(reportData?.status)">{{ getStatusText(reportData?.status) }}</el-tag>
|
|
|
+ <span class="meta-item">创建时间:{{ formatDate(reportData?.createTime) }}</span>
|
|
|
+ <span class="meta-item">更新时间:{{ formatDate(reportData?.updateTime) }}</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="header-right">
|
|
|
- <el-button-group>
|
|
|
- <el-button @click="refreshReport" :loading="refreshing">
|
|
|
- <el-icon><Refresh /></el-icon>
|
|
|
- 刷新
|
|
|
- </el-button>
|
|
|
- <el-button @click="exportReport">
|
|
|
- <el-icon><Download /></el-icon>
|
|
|
- 导出
|
|
|
- </el-button>
|
|
|
- <el-button @click="editReport">
|
|
|
- <el-icon><Edit /></el-icon>
|
|
|
- 编辑
|
|
|
- </el-button>
|
|
|
- <el-button type="primary" @click="shareReport">
|
|
|
- <el-icon><Share /></el-icon>
|
|
|
- 分享
|
|
|
- </el-button>
|
|
|
- </el-button-group>
|
|
|
- </div>
|
|
|
</div>
|
|
|
-
|
|
|
- <!-- 筛选条件 -->
|
|
|
- <div class="filter-section">
|
|
|
- <el-card shadow="never" class="filter-card">
|
|
|
- <template #header>
|
|
|
- <div class="card-header">
|
|
|
- <span>筛选条件</span>
|
|
|
- <el-button text @click="toggleFilterExpand">
|
|
|
- <el-icon><component :is="filterExpanded ? 'ArrowUp' : 'ArrowDown'" /></el-icon>
|
|
|
- {{ filterExpanded ? '收起' : '展开' }}
|
|
|
- </el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <div v-show="filterExpanded" class="filter-content">
|
|
|
- <el-form :model="filterForm" inline>
|
|
|
- <el-form-item label="时间范围">
|
|
|
- <el-date-picker
|
|
|
- v-model="filterForm.dateRange"
|
|
|
- type="daterange"
|
|
|
- range-separator="至"
|
|
|
- start-placeholder="开始日期"
|
|
|
- end-placeholder="结束日期"
|
|
|
- format="YYYY-MM-DD"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- @change="handleFilterChange"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="数据类型">
|
|
|
- <el-select v-model="filterForm.dataType" placeholder="请选择" @change="handleFilterChange">
|
|
|
- <el-option label="全部" value="" />
|
|
|
- <el-option label="销售数据" value="sales" />
|
|
|
- <el-option label="订单数据" value="orders" />
|
|
|
- <el-option label="用户数据" value="users" />
|
|
|
- <el-option label="商品数据" value="goods" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="状态">
|
|
|
- <el-select v-model="filterForm.status" placeholder="请选择" @change="handleFilterChange">
|
|
|
- <el-option label="全部" value="" />
|
|
|
- <el-option label="正常" value="normal" />
|
|
|
- <el-option label="异常" value="error" />
|
|
|
- <el-option label="待处理" value="pending" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" @click="applyFilter">
|
|
|
- <el-icon><Search /></el-icon>
|
|
|
- 查询
|
|
|
- </el-button>
|
|
|
- <el-button @click="resetFilter">
|
|
|
- <el-icon><RefreshLeft /></el-icon>
|
|
|
- 重置
|
|
|
- </el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </div>
|
|
|
- </el-card>
|
|
|
+ <div class="header-right">
|
|
|
+ <el-button-group>
|
|
|
+ <el-button @click="refreshReport" :loading="refreshing">
|
|
|
+ <el-icon><Refresh /></el-icon>
|
|
|
+ 刷新
|
|
|
+ </el-button>
|
|
|
+ <el-button @click="exportReport">
|
|
|
+ <el-icon><Download /></el-icon>
|
|
|
+ 导出
|
|
|
+ </el-button>
|
|
|
+ <el-button @click="editReport">
|
|
|
+ <el-icon><Edit /></el-icon>
|
|
|
+ 编辑
|
|
|
+ </el-button>
|
|
|
+ <el-button type="primary" @click="shareReport">
|
|
|
+ <el-icon><Share /></el-icon>
|
|
|
+ 分享
|
|
|
+ </el-button>
|
|
|
+ </el-button-group>
|
|
|
</div>
|
|
|
-
|
|
|
- <!-- 数据概览 -->
|
|
|
- <div class="overview-section">
|
|
|
- <el-row :gutter="20">
|
|
|
- <el-col :span="6" v-for="(item, index) in overviewData" :key="index">
|
|
|
- <el-card shadow="hover" class="overview-card">
|
|
|
- <div class="overview-item">
|
|
|
- <div class="overview-icon" :class="item.type">
|
|
|
- <el-icon><component :is="item.icon" /></el-icon>
|
|
|
- </div>
|
|
|
- <div class="overview-content">
|
|
|
- <div class="overview-value">{{ item.value }}</div>
|
|
|
- <div class="overview-label">{{ item.label }}</div>
|
|
|
- <div class="overview-trend" :class="item.trend > 0 ? 'up' : 'down'">
|
|
|
- <el-icon><component :is="item.trend > 0 ? 'TrendCharts' : 'Bottom'" /></el-icon>
|
|
|
- {{ Math.abs(item.trend) }}%
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 筛选条件 -->
|
|
|
+ <div class="filter-section">
|
|
|
+ <el-card shadow="never" class="filter-card">
|
|
|
+ <template #header>
|
|
|
+ <div class="card-header">
|
|
|
+ <span>筛选条件</span>
|
|
|
+ <el-button text @click="toggleFilterExpand">
|
|
|
+ <el-icon><component :is="filterExpanded ? 'ArrowUp' : 'ArrowDown'" /></el-icon>
|
|
|
+ {{ filterExpanded ? '收起' : '展开' }}
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div v-show="filterExpanded" class="filter-content">
|
|
|
+ <el-form :model="filterForm" inline>
|
|
|
+ <el-form-item label="时间范围">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="filterForm.dateRange"
|
|
|
+ type="daterange"
|
|
|
+ range-separator="至"
|
|
|
+ start-placeholder="开始日期"
|
|
|
+ end-placeholder="结束日期"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ @change="handleFilterChange"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="数据类型">
|
|
|
+ <el-select v-model="filterForm.dataType" placeholder="请选择" @change="handleFilterChange">
|
|
|
+ <el-option label="全部" value="" />
|
|
|
+ <el-option label="销售数据" value="sales" />
|
|
|
+ <el-option label="订单数据" value="orders" />
|
|
|
+ <el-option label="用户数据" value="users" />
|
|
|
+ <el-option label="商品数据" value="goods" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="状态">
|
|
|
+ <el-select v-model="filterForm.status" placeholder="请选择" @change="handleFilterChange">
|
|
|
+ <el-option label="全部" value="" />
|
|
|
+ <el-option label="正常" value="normal" />
|
|
|
+ <el-option label="异常" value="error" />
|
|
|
+ <el-option label="待处理" value="pending" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" @click="applyFilter">
|
|
|
+ <el-icon><Search /></el-icon>
|
|
|
+ 查询
|
|
|
+ </el-button>
|
|
|
+ <el-button @click="resetFilter">
|
|
|
+ <el-icon><RefreshLeft /></el-icon>
|
|
|
+ 重置
|
|
|
+ </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 数据概览 -->
|
|
|
+ <div class="overview-section">
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="6" v-for="(item, index) in overviewData" :key="index">
|
|
|
+ <el-card shadow="hover" class="overview-card">
|
|
|
+ <div class="overview-item">
|
|
|
+ <div class="overview-icon" :class="item.type">
|
|
|
+ <el-icon><component :is="item.icon" /></el-icon>
|
|
|
</div>
|
|
|
- </el-card>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 图表展示区域 -->
|
|
|
- <div class="charts-section">
|
|
|
- <el-card shadow="never">
|
|
|
- <template #header>
|
|
|
- <div class="card-header">
|
|
|
- <span>数据图表</span>
|
|
|
- <div class="chart-controls">
|
|
|
- <el-radio-group v-model="chartType" @change="handleChartTypeChange">
|
|
|
- <el-radio-button label="line">折线图</el-radio-button>
|
|
|
- <el-radio-button label="bar">柱状图</el-radio-button>
|
|
|
- <el-radio-button label="pie">饼图</el-radio-button>
|
|
|
- <el-radio-button label="area">面积图</el-radio-button>
|
|
|
- </el-radio-group>
|
|
|
+ <div class="overview-content">
|
|
|
+ <div class="overview-value">{{ item.value }}</div>
|
|
|
+ <div class="overview-label">{{ item.label }}</div>
|
|
|
+ <div class="overview-trend" :class="item.trend > 0 ? 'up' : 'down'">
|
|
|
+ <el-icon><component :is="item.trend > 0 ? 'TrendCharts' : 'Bottom'" /></el-icon>
|
|
|
+ {{ Math.abs(item.trend) }}%
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </template>
|
|
|
- <div class="chart-container" v-loading="chartLoading">
|
|
|
- <v-chart :option="chartOption" autoresize style="height: 400px;" />
|
|
|
+ </el-card>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 图表展示区域 -->
|
|
|
+ <div class="charts-section">
|
|
|
+ <el-card shadow="never">
|
|
|
+ <template #header>
|
|
|
+ <div class="card-header">
|
|
|
+ <span>数据图表</span>
|
|
|
+ <div class="chart-controls">
|
|
|
+ <el-radio-group v-model="chartType" @change="handleChartTypeChange">
|
|
|
+ <el-radio-button label="line">折线图</el-radio-button>
|
|
|
+ <el-radio-button label="bar">柱状图</el-radio-button>
|
|
|
+ <el-radio-button label="pie">饼图</el-radio-button>
|
|
|
+ <el-radio-button label="area">面积图</el-radio-button>
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </el-card>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 详细数据表格 -->
|
|
|
- <div class="table-section">
|
|
|
- <el-card shadow="never">
|
|
|
- <template #header>
|
|
|
- <div class="card-header">
|
|
|
- <span>详细数据</span>
|
|
|
- <div class="table-controls">
|
|
|
- <el-input
|
|
|
- v-model="searchKeyword"
|
|
|
- placeholder="搜索数据..."
|
|
|
- style="width: 200px; margin-right: 12px;"
|
|
|
- @input="handleSearch"
|
|
|
- >
|
|
|
- <template #prefix>
|
|
|
- <el-icon><Search /></el-icon>
|
|
|
- </template>
|
|
|
- </el-input>
|
|
|
- <el-button @click="exportTableData">
|
|
|
- <el-icon><Download /></el-icon>
|
|
|
- 导出表格
|
|
|
- </el-button>
|
|
|
- </div>
|
|
|
+ </template>
|
|
|
+ <div class="chart-container" v-loading="chartLoading">
|
|
|
+ <v-chart :option="chartOption" autoresize style="height: 400px;" />
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 详细数据表格 -->
|
|
|
+ <div class="table-section">
|
|
|
+ <el-card shadow="never">
|
|
|
+ <template #header>
|
|
|
+ <div class="card-header">
|
|
|
+ <span>详细数据</span>
|
|
|
+ <div class="table-controls">
|
|
|
+ <el-input
|
|
|
+ v-model="searchKeyword"
|
|
|
+ placeholder="搜索数据..."
|
|
|
+ style="width: 200px; margin-right: 12px;"
|
|
|
+ @input="handleSearch"
|
|
|
+ >
|
|
|
+ <template #prefix>
|
|
|
+ <el-icon><Search /></el-icon>
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
+ <el-button @click="exportTableData">
|
|
|
+ <el-icon><Download /></el-icon>
|
|
|
+ 导出
|
|
|
+ </el-button>
|
|
|
</div>
|
|
|
- </template>
|
|
|
- <el-table
|
|
|
- :data="tableData"
|
|
|
- v-loading="tableLoading"
|
|
|
- stripe
|
|
|
- border
|
|
|
- style="width: 100%"
|
|
|
- @sort-change="handleSortChange"
|
|
|
- >
|
|
|
- <el-table-column prop="date" label="日期" width="120" sortable />
|
|
|
- <el-table-column prop="type" label="数据类型" width="100">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-tag :type="getDataTypeColor(row.type)">{{ getDataTypeLabel(row.type) }}</el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="value" label="数值" width="120" sortable>
|
|
|
- <template #default="{ row }">
|
|
|
- <span class="number-value">{{ formatNumber(row.value) }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="growth" label="增长率" width="100" sortable>
|
|
|
- <template #default="{ row }">
|
|
|
- <span :class="row.growth >= 0 ? 'growth-positive' : 'growth-negative'">
|
|
|
- {{ row.growth >= 0 ? '+' : '' }}{{ row.growth }}%
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="status" label="状态" width="100">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="remark" label="备注" min-width="150" show-overflow-tooltip />
|
|
|
- <el-table-column label="操作" width="120" fixed="right">
|
|
|
- <template #default="{ row, $index }">
|
|
|
- <el-button size="small" @click="viewDetail(row)">
|
|
|
- 查看
|
|
|
- </el-button>
|
|
|
- <el-button size="small" type="primary" @click="editRow(row, $index)">
|
|
|
- 编辑
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
-
|
|
|
- <!-- 分页 -->
|
|
|
- <div class="pagination-wrapper">
|
|
|
- <el-pagination
|
|
|
- v-model:current-page="pagination.currentPage"
|
|
|
- v-model:page-size="pagination.pageSize"
|
|
|
- :page-sizes="[10, 20, 50, 100]"
|
|
|
- :total="pagination.total"
|
|
|
- layout="total, sizes, prev, pager, next, jumper"
|
|
|
- @size-change="handleSizeChange"
|
|
|
- @current-change="handleCurrentChange"
|
|
|
- />
|
|
|
</div>
|
|
|
- </el-card>
|
|
|
- </div>
|
|
|
- </el-main>
|
|
|
- <el-footer class="sa-footer--submit">
|
|
|
- <el-button @click="handleClose">关闭</el-button>
|
|
|
- <el-button type="primary" @click="saveReport">
|
|
|
- 保存报表
|
|
|
- </el-button>
|
|
|
- </el-footer>
|
|
|
- </el-container>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-table
|
|
|
+ :data="tableData"
|
|
|
+ v-loading="tableLoading"
|
|
|
+ @sort-change="handleSortChange"
|
|
|
+ stripe
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-table-column prop="date" label="日期" sortable width="120" />
|
|
|
+ <el-table-column prop="type" label="数据类型" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-tag :type="getDataTypeColor(row.type)">{{ getDataTypeLabel(row.type) }}</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="value" label="数值" sortable width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span class="number-value">{{ formatNumber(row.value) }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="growth" label="增长率" sortable width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span :class="row.growth >= 0 ? 'growth-positive' : 'growth-negative'">
|
|
|
+ {{ row.growth >= 0 ? '+' : '' }}{{ row.growth.toFixed(1) }}%
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="status" label="状态" width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="remark" label="备注" show-overflow-tooltip />
|
|
|
+ <el-table-column label="操作" width="150" fixed="right">
|
|
|
+ <template #default="{ row, $index }">
|
|
|
+ <el-button size="small" @click="viewDetail(row)">
|
|
|
+ 查看
|
|
|
+ </el-button>
|
|
|
+ <el-button size="small" type="primary" @click="editRow(row, $index)">
|
|
|
+ 编辑
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <!-- 分页 -->
|
|
|
+ <div class="pagination-wrapper">
|
|
|
+ <el-pagination
|
|
|
+ v-model:current-page="pagination.currentPage"
|
|
|
+ v-model:page-size="pagination.pageSize"
|
|
|
+ :page-sizes="[10, 20, 50, 100]"
|
|
|
+ :total="pagination.total"
|
|
|
+ layout="total, sizes, prev, pager, next, jumper"
|
|
|
+ @size-change="handleSizeChange"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
-import { ref, reactive, computed, watch, onMounted } from 'vue';
|
|
|
-import { ElMessage, ElMessageBox } from 'element-plus';
|
|
|
+import { ref, reactive, onMounted } from 'vue';
|
|
|
+import { ElMessage } from 'element-plus';
|
|
|
import {
|
|
|
Refresh,
|
|
|
Download,
|
|
@@ -244,9 +236,6 @@ import {
|
|
|
ArrowDown,
|
|
|
TrendCharts,
|
|
|
Bottom,
|
|
|
- DataLine,
|
|
|
- Histogram,
|
|
|
- PieChart,
|
|
|
Money,
|
|
|
ShoppingCart,
|
|
|
User,
|
|
@@ -287,8 +276,6 @@ const props = defineProps({
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-const emit = defineEmits(['save', 'close']);
|
|
|
-
|
|
|
// 响应式数据
|
|
|
const refreshing = ref(false);
|
|
|
const filterExpanded = ref(true);
|
|
@@ -348,10 +335,6 @@ const tableData = ref([]);
|
|
|
const chartOption = ref({});
|
|
|
|
|
|
// 方法
|
|
|
-const handleClose = () => {
|
|
|
- emit('close');
|
|
|
-};
|
|
|
-
|
|
|
const refreshReport = async () => {
|
|
|
refreshing.value = true;
|
|
|
try {
|
|
@@ -437,11 +420,6 @@ const editRow = (row, index) => {
|
|
|
ElMessage.info(`编辑行: ${index + 1}`);
|
|
|
};
|
|
|
|
|
|
-const saveReport = () => {
|
|
|
- ElMessage.success('报表保存成功');
|
|
|
- handleClose();
|
|
|
-};
|
|
|
-
|
|
|
// 工具方法
|
|
|
const formatDate = (date) => {
|
|
|
if (!date) return '-';
|
|
@@ -606,28 +584,14 @@ const loadChartData = async () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-// 监听器
|
|
|
-watch(() => props.visible, (newVal) => {
|
|
|
- if (newVal) {
|
|
|
- loadReportData();
|
|
|
- }
|
|
|
-});
|
|
|
-
|
|
|
// 生命周期
|
|
|
onMounted(() => {
|
|
|
- if (props.visible) {
|
|
|
- loadReportData();
|
|
|
- }
|
|
|
+ loadReportData();
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
|
-.report-detail-dialog {
|
|
|
- .dialog-content {
|
|
|
- max-height: 80vh;
|
|
|
- overflow-y: auto;
|
|
|
- }
|
|
|
-
|
|
|
+.report-detail-modal {
|
|
|
.report-header {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
@@ -807,11 +771,5 @@ onMounted(() => {
|
|
|
justify-content: center;
|
|
|
margin-top: 20px;
|
|
|
}
|
|
|
-
|
|
|
- .dialog-footer {
|
|
|
- display: flex;
|
|
|
- justify-content: flex-end;
|
|
|
- gap: 12px;
|
|
|
- }
|
|
|
}
|
|
|
</style>
|