|
|
@@ -54,9 +54,13 @@
|
|
|
<text class="footer-value">{{ overview.monthOrders || 0 }}</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
+ <view class="sales-stats-link" @click="navigateTo('/pages/statistics/overview')">
|
|
|
+ <text class="stats-link-text">查看完整数据统计</text>
|
|
|
+ <text class="stats-link-arrow">›</text>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
|
|
|
- <!-- 设备状态 + 数据入口 -->
|
|
|
+ <!-- 设备概况 -->
|
|
|
<view class="device-card">
|
|
|
<view class="card-title">
|
|
|
<text>设备概况</text>
|
|
|
@@ -78,46 +82,14 @@
|
|
|
<text class="device-num">{{ overview.offlineDevices || 0 }}</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
- <view class="data-entry-row">
|
|
|
- <view class="data-entry" @click="navigateTo('/pages/statistics/overview')">
|
|
|
- <view class="data-entry-icon chart">
|
|
|
- <view class="icon-chart"></view>
|
|
|
- </view>
|
|
|
- <view class="data-entry-info">
|
|
|
- <text class="data-entry-title">数据统计</text>
|
|
|
- <text class="data-entry-sub">销售 · 订单分析</text>
|
|
|
- </view>
|
|
|
- <text class="data-entry-arrow">›</text>
|
|
|
- </view>
|
|
|
- <view class="data-entry" @click="navigateTo('/pages/statistics/overview')">
|
|
|
- <view class="data-entry-icon analytics">
|
|
|
- <view class="icon-analytics"></view>
|
|
|
- </view>
|
|
|
- <view class="data-entry-info">
|
|
|
- <text class="data-entry-title">生意参谋</text>
|
|
|
- <text class="data-entry-sub">经营决策助手</text>
|
|
|
- </view>
|
|
|
- <text class="data-entry-arrow">›</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
</view>
|
|
|
|
|
|
<!-- 待办事项 -->
|
|
|
<view class="todo-card">
|
|
|
- <view class="card-title">
|
|
|
- <text>待办事项</text>
|
|
|
- <text class="card-sub" v-if="totalTodo > 0">共 {{ totalTodo }} 项待处理</text>
|
|
|
- <text class="card-sub" v-else>暂无待办</text>
|
|
|
- </view>
|
|
|
- <view class="todo-grid">
|
|
|
+ <view class="todo-row">
|
|
|
<view class="todo-item" v-for="item in todoItems" :key="item.key" @click="navigateTo(item.url)">
|
|
|
- <view :class="['todo-icon', item.color, { disabled: !item.count }]">
|
|
|
- <view :class="item.iconClass"></view>
|
|
|
- </view>
|
|
|
- <view class="todo-info">
|
|
|
- <text :class="['todo-value', { active: item.count > 0 }]">{{ item.count }}</text>
|
|
|
- <text class="todo-label">{{ item.label }}</text>
|
|
|
- </view>
|
|
|
+ <text :class="['todo-value', { active: item.count > 0 }]">{{ item.count }}</text>
|
|
|
+ <text class="todo-label">{{ item.label }}</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
@@ -129,25 +101,25 @@
|
|
|
</view>
|
|
|
<view class="quick-grid">
|
|
|
<view class="quick-item" @click="navigateTo('/pages/products/apply')">
|
|
|
- <view class="quick-icon primary">
|
|
|
+ <view class="quick-icon">
|
|
|
<view class="icon-apply"></view>
|
|
|
</view>
|
|
|
<text class="quick-name">新品申请</text>
|
|
|
</view>
|
|
|
<view class="quick-item" @click="navigateTo('/pages/marketing/list')">
|
|
|
- <view class="quick-icon orange">
|
|
|
+ <view class="quick-icon">
|
|
|
<view class="icon-marketing"></view>
|
|
|
</view>
|
|
|
<text class="quick-name">营销管理</text>
|
|
|
</view>
|
|
|
<view class="quick-item" @click="navigateTo('/pages/staff/list')">
|
|
|
- <view class="quick-icon green">
|
|
|
+ <view class="quick-icon">
|
|
|
<view class="icon-staff"></view>
|
|
|
</view>
|
|
|
<text class="quick-name">人员管理</text>
|
|
|
</view>
|
|
|
<view class="quick-item" @click="navigateTo('/pages/shop/list')">
|
|
|
- <view class="quick-icon blue">
|
|
|
+ <view class="quick-icon">
|
|
|
<view class="icon-shop-quick"></view>
|
|
|
</view>
|
|
|
<text class="quick-name">门店管理</text>
|
|
|
@@ -163,6 +135,7 @@
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
import { ref, computed, onMounted } from 'vue';
|
|
|
+import { logger } from '@/utils/logger';
|
|
|
import { getDashboardOverview, getTodoList } from '@/api/dashboard';
|
|
|
import { formatMoney as formatMoneyUtil } from '@/utils/common';
|
|
|
import CustomTabBar from '@/components/CustomTabBar.vue';
|
|
|
@@ -171,11 +144,8 @@ const statusBarHeight = ref(20); // 状态栏高度,默认20px
|
|
|
const overview = ref<any>({});
|
|
|
const todo = ref<any>({
|
|
|
pendingRefunds: 0,
|
|
|
- pendingAlerts: 0,
|
|
|
unpaidOrders: 0,
|
|
|
- lowStockItems: 0,
|
|
|
- pendingInvoices: 0,
|
|
|
- expiringProducts: 0
|
|
|
+ lowStockItems: 0
|
|
|
});
|
|
|
|
|
|
// 系统通知列表
|
|
|
@@ -184,20 +154,12 @@ const noticeList = ref<any[]>([
|
|
|
{ id: 2, content: '应政府监管要求,请尽快完成资质备案信息填写', type: 'important' }
|
|
|
]);
|
|
|
|
|
|
-// 待办项结构化配置
|
|
|
const todoItems = computed(() => [
|
|
|
- { key: 'pendingRefunds', label: '待处理退款', count: todo.value.pendingRefunds || 0, color: 'red', iconClass: 'icon-refund', url: '/pages/orders/list?tab=refund' },
|
|
|
- { key: 'pendingAlerts', label: '待处理异常', count: todo.value.pendingAlerts || 0, color: 'orange', iconClass: 'icon-alert', url: '/pages/device/list?tab=alert' },
|
|
|
- { key: 'unpaidOrders', label: '未支付订单', count: todo.value.unpaidOrders || 0, color: 'yellow', iconClass: 'icon-unpaid', url: '/pages/orders/list?tab=unpaid' },
|
|
|
- { key: 'lowStockItems', label: '待补货', count: todo.value.lowStockItems || 0, color: 'blue', iconClass: 'icon-restock', url: '/pages/inventory/list' },
|
|
|
- { key: 'pendingInvoices', label: '待开发票', count: todo.value.pendingInvoices || 0, color: 'purple', iconClass: 'icon-invoice', url: '/pages/invoice/list' },
|
|
|
- { key: 'expiringProducts', label: '临期商品', count: todo.value.expiringProducts || 0, color: 'cyan', iconClass: 'icon-expire', url: '/pages/products/expire' }
|
|
|
+ { key: 'pendingRefunds', label: '待处理退款', count: todo.value.pendingRefunds || 0, url: '/pages/orders/list?tab=refund' },
|
|
|
+ { key: 'unpaidOrders', label: '未支付订单', count: todo.value.unpaidOrders || 0, url: '/pages/orders/list?tab=unpaid' },
|
|
|
+ { key: 'lowStockItems', label: '待补货', count: todo.value.lowStockItems || 0, url: '/pages/inventory/list' }
|
|
|
]);
|
|
|
|
|
|
-const totalTodo = computed(() =>
|
|
|
- todoItems.value.reduce((sum, item) => sum + (item.count || 0), 0)
|
|
|
-);
|
|
|
-
|
|
|
const formatMoney = (amount: number | string) => {
|
|
|
const num = typeof amount === 'string' ? parseFloat(amount) : amount;
|
|
|
return formatMoneyUtil(num || 0);
|
|
|
@@ -221,15 +183,12 @@ const loadData = async () => {
|
|
|
if (todoRes) {
|
|
|
todo.value = {
|
|
|
pendingRefunds: todoRes.pendingRefunds || 0,
|
|
|
- pendingAlerts: todoRes.pendingAlerts || 0,
|
|
|
unpaidOrders: todoRes.unpaidOrders || 0,
|
|
|
- lowStockItems: todoRes.lowStockItems || 0,
|
|
|
- pendingInvoices: todoRes.pendingInvoices || 0,
|
|
|
- expiringProducts: todoRes.expiringProducts || 0
|
|
|
+ lowStockItems: todoRes.lowStockItems || 0
|
|
|
};
|
|
|
}
|
|
|
} catch (error) {
|
|
|
- console.error('获取仪表盘数据失败', error);
|
|
|
+ logger.warn('获取仪表盘数据失败', error);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
@@ -247,14 +206,14 @@ onMounted(() => {
|
|
|
<style lang="scss" scoped>
|
|
|
.page {
|
|
|
min-height: 100vh;
|
|
|
- background: #f4f5f7;
|
|
|
- padding-bottom: 180rpx;
|
|
|
+ background: $bg-color-page;
|
|
|
+ padding-bottom: 140rpx;
|
|
|
}
|
|
|
|
|
|
/* ========== 顶部品牌栏 ========== */
|
|
|
.header {
|
|
|
- background: #fdd835;
|
|
|
- padding: 0 32rpx 120rpx;
|
|
|
+ background: $primary-color;
|
|
|
+ padding: 0 32rpx 90rpx;
|
|
|
position: relative;
|
|
|
}
|
|
|
|
|
|
@@ -271,29 +230,29 @@ onMounted(() => {
|
|
|
}
|
|
|
|
|
|
.avatar {
|
|
|
- width: 88rpx;
|
|
|
- height: 88rpx;
|
|
|
- border-radius: 20rpx;
|
|
|
- background: #ffffff;
|
|
|
- color: #333333;
|
|
|
- font-size: 40rpx;
|
|
|
+ width: 72rpx;
|
|
|
+ height: 72rpx;
|
|
|
+ border-radius: 18rpx;
|
|
|
+ background: $bg-color-card;
|
|
|
+ color: $text-color-primary;
|
|
|
+ font-size: 34rpx;
|
|
|
font-weight: 700;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- margin-right: 20rpx;
|
|
|
+ margin-right: 16rpx;
|
|
|
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
|
|
|
}
|
|
|
|
|
|
.name-text {
|
|
|
- font-size: 34rpx;
|
|
|
+ font-size: 30rpx;
|
|
|
font-weight: 700;
|
|
|
- color: #1a1a1a;
|
|
|
+ color: $text-color-primary;
|
|
|
}
|
|
|
|
|
|
/* ========== 内容区域(上浮) ========== */
|
|
|
.content {
|
|
|
- margin-top: -100rpx;
|
|
|
+ margin-top: -50rpx;
|
|
|
padding: 0 24rpx;
|
|
|
position: relative;
|
|
|
z-index: 2;
|
|
|
@@ -304,57 +263,57 @@ onMounted(() => {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
|
- margin-bottom: 24rpx;
|
|
|
+ margin-bottom: 16rpx;
|
|
|
|
|
|
> text:first-child {
|
|
|
- font-size: 30rpx;
|
|
|
+ font-size: 28rpx;
|
|
|
font-weight: 600;
|
|
|
- color: #1a1a1a;
|
|
|
+ color: $text-color-primary;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.card-more {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #999999;
|
|
|
+ font-size: 22rpx;
|
|
|
+ color: $text-color-muted;
|
|
|
|
|
|
&:active { opacity: 0.6; }
|
|
|
}
|
|
|
|
|
|
.card-sub {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #999999;
|
|
|
+ font-size: 22rpx;
|
|
|
+ color: $text-color-muted;
|
|
|
}
|
|
|
|
|
|
/* ========== 通知栏 ========== */
|
|
|
.notice-bar {
|
|
|
- background: #ffffff;
|
|
|
- padding: 18rpx 20rpx;
|
|
|
- border-radius: 16rpx;
|
|
|
+ background: $bg-color-card;
|
|
|
+ padding: 14rpx 20rpx;
|
|
|
+ border-radius: 14rpx;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- margin-bottom: 20rpx;
|
|
|
- box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
|
|
|
+ margin-bottom: 12rpx;
|
|
|
+ box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.04);
|
|
|
|
|
|
&:active { opacity: 0.85; }
|
|
|
}
|
|
|
|
|
|
.notice-tag {
|
|
|
- padding: 4rpx 14rpx;
|
|
|
- background: #fff7ed;
|
|
|
- color: #f97316;
|
|
|
- font-size: 22rpx;
|
|
|
+ padding: 4rpx 12rpx;
|
|
|
+ background: $accent-color-bg;
|
|
|
+ color: $accent-color;
|
|
|
+ font-size: 20rpx;
|
|
|
font-weight: 600;
|
|
|
- border-radius: 8rpx;
|
|
|
- margin-right: 16rpx;
|
|
|
+ border-radius: 6rpx;
|
|
|
+ margin-right: 12rpx;
|
|
|
flex-shrink: 0;
|
|
|
}
|
|
|
|
|
|
.notice-content { flex: 1; overflow: hidden; }
|
|
|
-.notice-swiper { height: 40rpx; }
|
|
|
+.notice-swiper { height: 36rpx; }
|
|
|
.notice-text {
|
|
|
- font-size: 26rpx;
|
|
|
- color: #333333;
|
|
|
- line-height: 40rpx;
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: $text-color-primary;
|
|
|
+ line-height: 36rpx;
|
|
|
display: block;
|
|
|
overflow: hidden;
|
|
|
text-overflow: ellipsis;
|
|
|
@@ -363,25 +322,25 @@ onMounted(() => {
|
|
|
|
|
|
.notice-arrow {
|
|
|
font-size: 36rpx;
|
|
|
- color: #cccccc;
|
|
|
+ color: $text-color-placeholder;
|
|
|
margin-left: 12rpx;
|
|
|
}
|
|
|
|
|
|
/* ========== 核心销售卡片 ========== */
|
|
|
.sales-card {
|
|
|
- background: #ffffff;
|
|
|
- border-radius: 20rpx;
|
|
|
- padding: 32rpx;
|
|
|
- margin-bottom: 20rpx;
|
|
|
- box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
|
|
|
+ background: $bg-color-card;
|
|
|
+ border-radius: 18rpx;
|
|
|
+ padding: 24rpx;
|
|
|
+ margin-bottom: 12rpx;
|
|
|
+ box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.04);
|
|
|
}
|
|
|
|
|
|
.sales-main {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
|
align-items: stretch;
|
|
|
- padding-bottom: 24rpx;
|
|
|
- border-bottom: 1rpx solid #f0f0f0;
|
|
|
+ padding-bottom: 16rpx;
|
|
|
+ border-bottom: 1rpx solid $border-color-light;
|
|
|
}
|
|
|
|
|
|
.sales-primary {
|
|
|
@@ -391,24 +350,24 @@ onMounted(() => {
|
|
|
flex: 1;
|
|
|
}
|
|
|
.sales-primary .label {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #888888;
|
|
|
- margin-bottom: 12rpx;
|
|
|
+ font-size: 22rpx;
|
|
|
+ color: $text-color-tertiary;
|
|
|
+ margin-bottom: 8rpx;
|
|
|
}
|
|
|
.primary-value {
|
|
|
- font-size: 64rpx;
|
|
|
+ font-size: 56rpx;
|
|
|
font-weight: 700;
|
|
|
- color: #10b981;
|
|
|
+ color: $primary-color;
|
|
|
line-height: 1;
|
|
|
- margin-bottom: 10rpx;
|
|
|
+ margin-bottom: 8rpx;
|
|
|
}
|
|
|
.compare {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
font-size: 22rpx;
|
|
|
}
|
|
|
-.compare-text { color: #999999; margin-right: 8rpx; }
|
|
|
-.compare-value { color: #10b981; font-weight: 600; }
|
|
|
+.compare-text { color: $text-color-muted; margin-right: 8rpx; }
|
|
|
+.compare-value { color: $primary-color; font-weight: 600; }
|
|
|
|
|
|
.sales-secondary {
|
|
|
display: flex;
|
|
|
@@ -419,19 +378,19 @@ onMounted(() => {
|
|
|
}
|
|
|
|
|
|
.sales-secondary .label {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #888888;
|
|
|
- margin-bottom: 12rpx;
|
|
|
+ font-size: 22rpx;
|
|
|
+ color: $text-color-tertiary;
|
|
|
+ margin-bottom: 8rpx;
|
|
|
}
|
|
|
.secondary-value {
|
|
|
- font-size: 44rpx;
|
|
|
+ font-size: 36rpx;
|
|
|
font-weight: 700;
|
|
|
- color: #1a1a1a;
|
|
|
+ color: $text-color-primary;
|
|
|
line-height: 1;
|
|
|
}
|
|
|
.unit {
|
|
|
font-size: 22rpx;
|
|
|
- color: #999999;
|
|
|
+ color: $text-color-muted;
|
|
|
margin-top: 6rpx;
|
|
|
}
|
|
|
|
|
|
@@ -439,7 +398,7 @@ onMounted(() => {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
|
- margin-top: 24rpx;
|
|
|
+ margin-top: 16rpx;
|
|
|
gap: 0;
|
|
|
}
|
|
|
.footer-item {
|
|
|
@@ -449,46 +408,45 @@ onMounted(() => {
|
|
|
flex: 1;
|
|
|
}
|
|
|
.footer-label {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #888888;
|
|
|
- margin-bottom: 8rpx;
|
|
|
+ font-size: 22rpx;
|
|
|
+ color: $text-color-tertiary;
|
|
|
+ margin-bottom: 6rpx;
|
|
|
}
|
|
|
.footer-value {
|
|
|
- font-size: 30rpx;
|
|
|
+ font-size: 28rpx;
|
|
|
font-weight: 600;
|
|
|
- color: #1a1a1a;
|
|
|
+ color: $text-color-primary;
|
|
|
}
|
|
|
.footer-divider {
|
|
|
width: 1rpx;
|
|
|
- height: 40rpx;
|
|
|
- background: #e5e7eb;
|
|
|
+ height: 36rpx;
|
|
|
+ background: $border-color;
|
|
|
}
|
|
|
|
|
|
/* ========== 设备卡片 ========== */
|
|
|
.device-card {
|
|
|
- background: #ffffff;
|
|
|
- border-radius: 20rpx;
|
|
|
- padding: 28rpx;
|
|
|
- margin-bottom: 20rpx;
|
|
|
- box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
|
|
|
+ background: $bg-color-card;
|
|
|
+ border-radius: 18rpx;
|
|
|
+ padding: 20rpx;
|
|
|
+ margin-bottom: 12rpx;
|
|
|
+ box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.04);
|
|
|
}
|
|
|
|
|
|
.device-row {
|
|
|
display: flex;
|
|
|
- gap: 20rpx;
|
|
|
- margin-bottom: 24rpx;
|
|
|
+ gap: 16rpx;
|
|
|
}
|
|
|
|
|
|
.device-box {
|
|
|
flex: 1;
|
|
|
- padding: 24rpx;
|
|
|
- border-radius: 16rpx;
|
|
|
+ padding: 18rpx;
|
|
|
+ border-radius: 14rpx;
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
align-items: center;
|
|
|
|
|
|
- &.online { background: #ecfdf5; }
|
|
|
- &.offline { background: #fff7ed; }
|
|
|
+ &.online { background: $primary-color-bg; }
|
|
|
+ &.offline { background: $accent-color-bg; }
|
|
|
|
|
|
&:active { opacity: 0.85; }
|
|
|
}
|
|
|
@@ -496,361 +454,103 @@ onMounted(() => {
|
|
|
.device-top {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- margin-bottom: 12rpx;
|
|
|
+ margin-bottom: 10rpx;
|
|
|
}
|
|
|
|
|
|
.device-dot {
|
|
|
- width: 14rpx;
|
|
|
- height: 14rpx;
|
|
|
+ width: 12rpx;
|
|
|
+ height: 12rpx;
|
|
|
border-radius: 50%;
|
|
|
- margin-right: 10rpx;
|
|
|
+ margin-right: 8rpx;
|
|
|
|
|
|
- &.online-dot { background: #10b981; }
|
|
|
- &.offline-dot { background: #f97316; }
|
|
|
+ &.online-dot { background: $primary-color; }
|
|
|
+ &.offline-dot { background: $accent-color; }
|
|
|
}
|
|
|
|
|
|
.device-label {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #666666;
|
|
|
+ font-size: 22rpx;
|
|
|
+ color: $text-color-secondary;
|
|
|
}
|
|
|
|
|
|
.device-num {
|
|
|
- font-size: 48rpx;
|
|
|
+ font-size: 40rpx;
|
|
|
font-weight: 700;
|
|
|
- color: #1a1a1a;
|
|
|
+ color: $text-color-primary;
|
|
|
line-height: 1;
|
|
|
}
|
|
|
|
|
|
-.data-entry-row {
|
|
|
- display: flex;
|
|
|
- gap: 20rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.data-entry {
|
|
|
- flex: 1;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- padding: 20rpx;
|
|
|
- background: #f9fafb;
|
|
|
- border-radius: 16rpx;
|
|
|
-
|
|
|
- &:active { opacity: 0.8; }
|
|
|
-}
|
|
|
-
|
|
|
-.data-entry-icon {
|
|
|
- width: 60rpx;
|
|
|
- height: 60rpx;
|
|
|
- border-radius: 14rpx;
|
|
|
+.sales-stats-link {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- margin-right: 14rpx;
|
|
|
- flex-shrink: 0;
|
|
|
-
|
|
|
- &.chart { background: #ecfdf5; }
|
|
|
- &.analytics { background: #fff7ed; }
|
|
|
-}
|
|
|
-
|
|
|
-.data-entry-info {
|
|
|
- flex: 1;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- min-width: 0;
|
|
|
-}
|
|
|
-
|
|
|
-.data-entry-title {
|
|
|
- font-size: 26rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #1a1a1a;
|
|
|
- margin-bottom: 4rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.data-entry-sub {
|
|
|
- font-size: 20rpx;
|
|
|
- color: #999999;
|
|
|
- overflow: hidden;
|
|
|
- text-overflow: ellipsis;
|
|
|
- white-space: nowrap;
|
|
|
-}
|
|
|
+ margin-top: 14rpx;
|
|
|
+ padding: 12rpx 0 0;
|
|
|
+ border-top: 1rpx solid $border-color-light;
|
|
|
|
|
|
-.data-entry-arrow {
|
|
|
- font-size: 32rpx;
|
|
|
- color: #cccccc;
|
|
|
- margin-left: 8rpx;
|
|
|
+ &:active { opacity: 0.7; }
|
|
|
}
|
|
|
|
|
|
-.icon-chart {
|
|
|
- display: flex;
|
|
|
- align-items: flex-end;
|
|
|
- width: 30rpx;
|
|
|
- height: 28rpx;
|
|
|
-
|
|
|
- &::before, &::after {
|
|
|
- content: '';
|
|
|
- width: 7rpx;
|
|
|
- background: #10b981;
|
|
|
- border-radius: 2rpx;
|
|
|
- margin-right: 3rpx;
|
|
|
- }
|
|
|
- &::before { height: 14rpx; }
|
|
|
- &::after { height: 24rpx; margin-right: 0; }
|
|
|
+.stats-link-text {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: $primary-color;
|
|
|
+ font-weight: 500;
|
|
|
}
|
|
|
|
|
|
-.icon-analytics {
|
|
|
- width: 28rpx;
|
|
|
- height: 28rpx;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 0;
|
|
|
- left: 0;
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
- border: 3rpx solid #f97316;
|
|
|
- border-radius: 50%;
|
|
|
- }
|
|
|
- &::after {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 50%;
|
|
|
- left: 50%;
|
|
|
- width: 3rpx;
|
|
|
- height: 14rpx;
|
|
|
- background: #f97316;
|
|
|
- transform-origin: bottom center;
|
|
|
- transform: translate(-50%, -100%) rotate(35deg);
|
|
|
- }
|
|
|
+.stats-link-arrow {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: $primary-color;
|
|
|
+ margin-left: 4rpx;
|
|
|
}
|
|
|
|
|
|
/* ========== 待办事项 ========== */
|
|
|
.todo-card {
|
|
|
- background: #ffffff;
|
|
|
- border-radius: 20rpx;
|
|
|
- padding: 28rpx;
|
|
|
- margin-bottom: 20rpx;
|
|
|
- box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
|
|
|
+ background: $bg-color-card;
|
|
|
+ border-radius: 18rpx;
|
|
|
+ padding: 24rpx 20rpx;
|
|
|
+ margin-bottom: 12rpx;
|
|
|
+ box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.04);
|
|
|
}
|
|
|
|
|
|
-.todo-grid {
|
|
|
+.todo-row {
|
|
|
display: flex;
|
|
|
- flex-wrap: wrap;
|
|
|
+ justify-content: space-between;
|
|
|
}
|
|
|
|
|
|
.todo-item {
|
|
|
- width: 33.333%;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- padding: 14rpx 6rpx;
|
|
|
- box-sizing: border-box;
|
|
|
-
|
|
|
- &:active { opacity: 0.7; }
|
|
|
-}
|
|
|
-
|
|
|
-.todo-icon {
|
|
|
- width: 64rpx;
|
|
|
- height: 64rpx;
|
|
|
- border-radius: 16rpx;
|
|
|
+ flex: 1;
|
|
|
display: flex;
|
|
|
+ flex-direction: column;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- margin-right: 14rpx;
|
|
|
- flex-shrink: 0;
|
|
|
-
|
|
|
- &.red { background: #fef2f2; }
|
|
|
- &.orange { background: #fff7ed; }
|
|
|
- &.yellow { background: #fefce8; }
|
|
|
- &.blue { background: #eff6ff; }
|
|
|
- &.purple { background: #f5f3ff; }
|
|
|
- &.cyan { background: #ecfeff; }
|
|
|
-
|
|
|
- &.disabled { opacity: 0.6; }
|
|
|
-}
|
|
|
+ padding: 8rpx 6rpx;
|
|
|
|
|
|
-.todo-info {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- min-width: 0;
|
|
|
+ &:active { opacity: 0.7; }
|
|
|
}
|
|
|
|
|
|
.todo-value {
|
|
|
font-size: 32rpx;
|
|
|
font-weight: 700;
|
|
|
- color: #cccccc;
|
|
|
+ color: $text-color-placeholder;
|
|
|
line-height: 1.2;
|
|
|
|
|
|
- &.active { color: #1a1a1a; }
|
|
|
+ &.active { color: $primary-color; }
|
|
|
}
|
|
|
|
|
|
.todo-label {
|
|
|
font-size: 22rpx;
|
|
|
- color: #666666;
|
|
|
+ color: $text-color-secondary;
|
|
|
margin-top: 2rpx;
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
|
|
|
-/* 待办图标 */
|
|
|
-.icon-refund {
|
|
|
- width: 30rpx;
|
|
|
- height: 30rpx;
|
|
|
- border: 3rpx solid #ef4444;
|
|
|
- border-radius: 50%;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 50%;
|
|
|
- left: 50%;
|
|
|
- transform: translate(-50%, -50%);
|
|
|
- width: 14rpx;
|
|
|
- height: 3rpx;
|
|
|
- background: #ef4444;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-.icon-alert {
|
|
|
- width: 0;
|
|
|
- height: 0;
|
|
|
- border-left: 16rpx solid transparent;
|
|
|
- border-right: 16rpx solid transparent;
|
|
|
- border-bottom: 28rpx solid #f97316;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- bottom: -20rpx;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 3rpx;
|
|
|
- height: 10rpx;
|
|
|
- background: #ffffff;
|
|
|
- }
|
|
|
- &::after {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- bottom: -26rpx;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 3rpx;
|
|
|
- height: 3rpx;
|
|
|
- background: #ffffff;
|
|
|
- border-radius: 50%;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-.icon-unpaid {
|
|
|
- width: 30rpx;
|
|
|
- height: 30rpx;
|
|
|
- border: 3rpx solid #eab308;
|
|
|
- border-radius: 50%;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '¥';
|
|
|
- position: absolute;
|
|
|
- top: 50%;
|
|
|
- left: 50%;
|
|
|
- transform: translate(-50%, -50%);
|
|
|
- font-size: 22rpx;
|
|
|
- font-weight: 700;
|
|
|
- color: #eab308;
|
|
|
- line-height: 1;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-.icon-restock {
|
|
|
- width: 30rpx;
|
|
|
- height: 28rpx;
|
|
|
- background: #3b82f6;
|
|
|
- border-radius: 3rpx;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 0;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 14rpx;
|
|
|
- height: 6rpx;
|
|
|
- background: #3b82f6;
|
|
|
- border-radius: 3rpx 3rpx 0 0;
|
|
|
- top: -4rpx;
|
|
|
- }
|
|
|
- &::after {
|
|
|
- content: '+';
|
|
|
- position: absolute;
|
|
|
- top: 50%;
|
|
|
- left: 50%;
|
|
|
- transform: translate(-50%, -50%);
|
|
|
- font-size: 24rpx;
|
|
|
- color: #ffffff;
|
|
|
- font-weight: 700;
|
|
|
- line-height: 1;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-.icon-invoice {
|
|
|
- width: 28rpx;
|
|
|
- height: 32rpx;
|
|
|
- background: #8b5cf6;
|
|
|
- border-radius: 3rpx;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 10rpx;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 16rpx;
|
|
|
- height: 2rpx;
|
|
|
- background: #ffffff;
|
|
|
- box-shadow: 0 5rpx 0 #ffffff, 0 10rpx 0 #ffffff;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-.icon-expire {
|
|
|
- width: 30rpx;
|
|
|
- height: 30rpx;
|
|
|
- border: 3rpx solid #06b6d4;
|
|
|
- border-radius: 50%;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 50%;
|
|
|
- left: 50%;
|
|
|
- width: 3rpx;
|
|
|
- height: 10rpx;
|
|
|
- background: #06b6d4;
|
|
|
- transform-origin: bottom center;
|
|
|
- transform: translate(-50%, -100%);
|
|
|
- }
|
|
|
- &::after {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 50%;
|
|
|
- left: 50%;
|
|
|
- width: 3rpx;
|
|
|
- height: 7rpx;
|
|
|
- background: #06b6d4;
|
|
|
- transform-origin: bottom center;
|
|
|
- transform: translate(-50%, -100%) rotate(90deg);
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
/* ========== 商户运营 ========== */
|
|
|
.quick-card {
|
|
|
- background: #ffffff;
|
|
|
- border-radius: 20rpx;
|
|
|
- padding: 28rpx 20rpx 20rpx;
|
|
|
- margin-bottom: 20rpx;
|
|
|
- box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
|
|
|
+ background: $bg-color-card;
|
|
|
+ border-radius: 18rpx;
|
|
|
+ padding: 20rpx 16rpx 16rpx;
|
|
|
+ margin-bottom: 12rpx;
|
|
|
+ box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.04);
|
|
|
|
|
|
.card-title {
|
|
|
padding: 0 8rpx;
|
|
|
@@ -867,30 +567,26 @@ onMounted(() => {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
align-items: center;
|
|
|
- padding: 8rpx 0;
|
|
|
+ padding: 4rpx 0;
|
|
|
|
|
|
&:active .quick-icon { transform: scale(0.92); }
|
|
|
}
|
|
|
|
|
|
.quick-icon {
|
|
|
- width: 92rpx;
|
|
|
- height: 92rpx;
|
|
|
- border-radius: 22rpx;
|
|
|
+ width: 72rpx;
|
|
|
+ height: 72rpx;
|
|
|
+ border-radius: 18rpx;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- margin-bottom: 12rpx;
|
|
|
+ margin-bottom: 8rpx;
|
|
|
transition: transform 0.15s;
|
|
|
-
|
|
|
- &.primary { background: #ecfdf5; }
|
|
|
- &.orange { background: #fff7ed; }
|
|
|
- &.green { background: #f0fdf4; }
|
|
|
- &.blue { background: #eff6ff; }
|
|
|
+ background: $primary-color-bg;
|
|
|
}
|
|
|
|
|
|
.quick-name {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #333333;
|
|
|
+ font-size: 22rpx;
|
|
|
+ color: $text-color-primary;
|
|
|
}
|
|
|
|
|
|
.icon-apply {
|
|
|
@@ -905,7 +601,7 @@ onMounted(() => {
|
|
|
left: 0;
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
- border: 3rpx solid #10b981;
|
|
|
+ border: 3rpx solid $primary-color;
|
|
|
border-radius: 6rpx;
|
|
|
}
|
|
|
&::after {
|
|
|
@@ -915,7 +611,7 @@ onMounted(() => {
|
|
|
left: 50%;
|
|
|
transform: translate(-50%, -50%);
|
|
|
font-size: 28rpx;
|
|
|
- color: #10b981;
|
|
|
+ color: $primary-color;
|
|
|
font-weight: 700;
|
|
|
line-height: 1;
|
|
|
}
|
|
|
@@ -934,7 +630,7 @@ onMounted(() => {
|
|
|
transform: translateY(-50%);
|
|
|
width: 26rpx;
|
|
|
height: 16rpx;
|
|
|
- background: #f97316;
|
|
|
+ background: $primary-color;
|
|
|
border-radius: 2rpx 0 0 2rpx;
|
|
|
}
|
|
|
&::after {
|
|
|
@@ -947,7 +643,7 @@ onMounted(() => {
|
|
|
height: 0;
|
|
|
border-top: 14rpx solid transparent;
|
|
|
border-bottom: 14rpx solid transparent;
|
|
|
- border-left: 14rpx solid #f97316;
|
|
|
+ border-left: 14rpx solid $primary-color;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -964,7 +660,7 @@ onMounted(() => {
|
|
|
transform: translateX(-50%);
|
|
|
width: 18rpx;
|
|
|
height: 18rpx;
|
|
|
- background: #22c55e;
|
|
|
+ background: $primary-color;
|
|
|
border-radius: 50%;
|
|
|
}
|
|
|
&::after {
|
|
|
@@ -975,7 +671,7 @@ onMounted(() => {
|
|
|
transform: translateX(-50%);
|
|
|
width: 30rpx;
|
|
|
height: 14rpx;
|
|
|
- background: #22c55e;
|
|
|
+ background: $primary-color;
|
|
|
border-radius: 14rpx 14rpx 0 0;
|
|
|
}
|
|
|
}
|
|
|
@@ -995,7 +691,7 @@ onMounted(() => {
|
|
|
height: 0;
|
|
|
border-left: 20rpx solid transparent;
|
|
|
border-right: 20rpx solid transparent;
|
|
|
- border-bottom: 14rpx solid #3b82f6;
|
|
|
+ border-bottom: 14rpx solid $primary-color;
|
|
|
}
|
|
|
&::after {
|
|
|
content: '';
|
|
|
@@ -1005,7 +701,7 @@ onMounted(() => {
|
|
|
transform: translateX(-50%);
|
|
|
width: 30rpx;
|
|
|
height: 20rpx;
|
|
|
- background: #3b82f6;
|
|
|
+ background: $primary-color;
|
|
|
border-radius: 2rpx;
|
|
|
}
|
|
|
}
|