196 lines
4.4 KiB
Vue
Raw Normal View History

2025-05-20 08:53:11 +08:00
<template>
<div class="usage-monitor">
2025-05-20 13:32:43 +08:00
<!-- 顶部 TabPane居中显示 -->
2025-05-21 13:44:54 +08:00
<el-tabs v-model="activeTab" class="tabs-wrapper">
<el-tab-pane label="在售中" name="onSale" />
<el-tab-pane label="未上架" name="offShelf" />
<el-tab-pane label="已失效" name="expired" />
</el-tabs>
2025-05-20 13:32:43 +08:00
<!-- 列表内容 -->
<div class="list-wrapper">
<div v-for="(p, idx) in filteredProducts" :key="p.id" class="list-item" :class="{ 'has-border': idx > 0 }">
<!-- 商品图 -->
<img class="item-img" :src="p.img" alt="商品图" />
<!-- 名称 + 月售/库存 -->
<div class="item-info">
<div class="item-name">{{ p.name }}</div>
<div class="item-stats">月售 {{ p.monthlySales }} · 库存 {{ p.stock }}</div>
2025-05-21 13:44:54 +08:00
<div class="item-price">¥ {{ p.price }} /kg</div>
2025-05-20 13:32:43 +08:00
</div>
2025-05-21 13:44:54 +08:00
<div class="item-buttom">
<div class="item-status" :class="statusClass(activeTab)">
{{ tabLabels[activeTab] }}
</div>
<div class="item-actions">
<el-button size="large" class="button" @click="onInspect(p)">抽查</el-button>
<el-button size="large" class="button" type="danger" @click="onRevoke(p)">取消授权</el-button>
</div>
2025-05-20 13:32:43 +08:00
</div>
</div>
</div>
2025-05-20 08:53:11 +08:00
</div>
</template>
<script setup>
import { ref, computed } from 'vue';
2025-05-21 13:44:54 +08:00
import { getAssetsFile } from '@/utils/index.js';
import { getMonitorList } from '@/apis/brand';
2025-05-20 08:53:11 +08:00
2025-05-20 13:32:43 +08:00
const activeTab = ref('onSale');
2025-05-20 08:53:11 +08:00
2025-05-20 13:32:43 +08:00
const tabLabels = {
onSale: '在售中',
offShelf: '未上架',
expired: '已失效',
2025-05-20 08:53:11 +08:00
};
2025-05-20 13:32:43 +08:00
// 示例数据,替换为真实接口数据
2025-05-20 08:53:11 +08:00
const products = ref([
{
id: 1,
2025-05-20 13:32:43 +08:00
name: '耿马镇沙疆西红柿',
2025-05-21 13:44:54 +08:00
img: getAssetsFile('images/brand/product4.png'),
2025-05-20 08:53:11 +08:00
monthlySales: 999,
stock: 10000,
2025-05-20 13:32:43 +08:00
price: 3.0,
2025-05-20 08:53:11 +08:00
status: 'onSale',
},
{
id: 2,
2025-05-20 13:32:43 +08:00
name: '耿马镇沙疆土豆',
2025-05-21 13:44:54 +08:00
img: getAssetsFile('images/brand/product6.png'),
2025-05-20 13:32:43 +08:00
monthlySales: 123,
stock: 5000,
price: 2.5,
2025-05-20 08:53:11 +08:00
status: 'onSale',
},
{
id: 3,
2025-05-20 13:32:43 +08:00
name: '彩椒南瓜混合',
2025-05-21 13:44:54 +08:00
img: getAssetsFile('images/brand/product1.png'),
2025-05-20 13:32:43 +08:00
monthlySales: 456,
stock: 8000,
price: 4.2,
status: 'offShelf',
2025-05-20 08:53:11 +08:00
},
2025-05-20 13:32:43 +08:00
// … 更多数据
2025-05-20 08:53:11 +08:00
]);
2025-05-20 13:32:43 +08:00
// 根据当前 Tab 过滤
const filteredProducts = computed(() => products.value.filter((p) => p.status === activeTab.value));
2025-05-20 08:53:11 +08:00
2025-05-20 13:32:43 +08:00
// 操作回调
const onInspect = (p) => {
console.log('抽查商品', p);
};
const onRevoke = (p) => {
console.log('取消授权', p);
2025-05-20 08:53:11 +08:00
};
2025-05-20 13:32:43 +08:00
// 状态文字的颜色
const statusClass = (tab) => {
if (tab === 'offShelf') return 'text-warning';
if (tab === 'expired') return 'text-danger';
return 'text-success';
2025-05-20 08:53:11 +08:00
};
</script>
2025-05-20 13:32:43 +08:00
<style scoped lang="scss">
2025-05-20 08:53:11 +08:00
.usage-monitor {
padding: 20px;
2025-05-20 13:32:43 +08:00
background: #fff;
2025-05-21 13:44:54 +08:00
border-radius: 16px;
height: 100%;
2025-05-20 08:53:11 +08:00
2025-05-20 13:32:43 +08:00
.tabs-wrapper {
2025-05-21 13:44:54 +08:00
width: 100%;
2025-05-20 13:32:43 +08:00
display: flex;
2025-05-21 13:44:54 +08:00
align-items: center;
background-color: #fff;
2025-05-20 08:53:11 +08:00
2025-05-21 13:44:54 +08:00
:deep(.el-tabs__item) {
font-size: 24px;
font-weight: 700;
// border: 1 solid #f000;
2025-05-20 08:53:11 +08:00
}
2025-05-20 13:32:43 +08:00
}
2025-05-20 08:53:11 +08:00
2025-05-20 13:32:43 +08:00
.list-wrapper {
.list-item {
2025-05-21 13:44:54 +08:00
display: flex;
justify-content: start;
2025-05-20 13:32:43 +08:00
align-items: center;
2025-05-21 13:44:54 +08:00
padding: 20px 0;
2025-05-20 08:53:11 +08:00
2025-05-20 13:32:43 +08:00
.item-img {
2025-05-21 13:44:54 +08:00
width: 120px;
height: 120px;
2025-05-20 13:32:43 +08:00
object-fit: cover;
border-radius: 8px;
2025-05-20 08:53:11 +08:00
}
2025-05-20 13:32:43 +08:00
.item-info {
padding-left: 16px;
2025-05-21 13:44:54 +08:00
// background-color: #909399;
2025-05-20 13:32:43 +08:00
.item-name {
2025-05-21 13:44:54 +08:00
font-size: 20px;
font-weight: 700;
2025-05-20 13:32:43 +08:00
margin-bottom: 8px;
}
.item-stats {
color: #909399;
font-size: 14px;
2025-05-20 08:53:11 +08:00
}
}
2025-05-20 13:32:43 +08:00
.item-price {
2025-05-21 13:44:54 +08:00
font-size: 28px;
font-weight: 700;
2025-05-20 13:32:43 +08:00
color: #67c23a;
2025-05-21 13:44:54 +08:00
text-align: left;
padding-top: 8px;
}
.item-buttom {
display: flex;
flex-direction: column;
justify-content: space-between;
height: 110px;
flex: 1;
2025-05-20 08:53:11 +08:00
}
2025-05-20 13:32:43 +08:00
.item-actions {
display: flex;
2025-05-21 13:44:54 +08:00
justify-content: flex-end;
2025-05-20 13:32:43 +08:00
gap: 8px;
2025-05-21 13:44:54 +08:00
.button {
font-size: 20px;
font-weight: 400;
border-radius: 8px;
}
2025-05-20 13:32:43 +08:00
}
.item-status {
text-align: right;
2025-05-21 13:44:54 +08:00
font-size: 20px;
font-weight: 700;
2025-05-20 13:32:43 +08:00
&.text-success {
color: #67c23a;
}
&.text-warning {
color: #e6a23c;
}
&.text-danger {
color: #f56c6c;
}
}
2025-05-20 08:53:11 +08:00
}
}
}
</style>