Files
blind-select/frontend-admin/src/views/Dashboard.vue
T
admin 06488f0237 Initial commit: 帮我选盲选应用
功能:
- Go后端 (Gin + GORM + PostgreSQL)
- UniApp用户端 (iOS/Android/小程序)
- DaisyUI5后台管理
- JWT认证 + 微信登录
- 盲选加权算法
- 会员系统 + 优惠券
- 打分评价 + 偏好学习
2026-06-08 20:18:31 +00:00

142 lines
5.0 KiB
Vue

<template>
<div>
<h1 class="text-3xl font-bold mb-6">📊 仪表盘</h1>
<!-- 统计卡片 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-6">
<div class="stats shadow">
<div class="stat">
<div class="stat-figure text-primary">👤</div>
<div class="stat-title">总用户</div>
<div class="stat-value text-primary">{{ stats.users }}</div>
<div class="stat-desc">今日新增: <span class="text-success">+{{ stats.newUsers }}</span></div>
</div>
</div>
<div class="stats shadow">
<div class="stat">
<div class="stat-figure text-secondary">🏪</div>
<div class="stat-title">商家</div>
<div class="stat-value text-secondary">{{ stats.merchants }}</div>
<div class="stat-desc">待审核: <span class="text-warning">{{ stats.pending }}</span></div>
</div>
</div>
<div class="stats shadow">
<div class="stat">
<div class="stat-figure text-accent">📦</div>
<div class="stat-title">套餐</div>
<div class="stat-value text-accent">{{ stats.packages }}</div>
<div class="stat-desc">上架中: {{ stats.active }}</div>
</div>
</div>
<div class="stats shadow">
<div class="stat">
<div class="stat-figure">🎲</div>
<div class="stat-title">盲选次数</div>
<div class="stat-value">{{ stats.blinds }}</div>
<div class="stat-desc">今日: {{ stats.todayBlinds }}</div>
</div>
</div>
</div>
<!-- 会员收入 -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-4 mb-6">
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">💰 会员收入</h2>
<div class="flex items-baseline">
<span class="text-4xl font-bold text-success">¥{{ stats.monthRevenue }}</span>
<span class="text-sm text-base-content/50 ml-2">本月</span>
</div>
<div class="divider my-0"></div>
<div class="flex justify-between text-sm">
<span>付费会员: <b>{{ stats.payingMembers }}</b></span>
<span>转化率: <b class="text-success">{{ stats.conversionRate }}%</b></span>
</div>
</div>
</div>
<!-- 热门分类 -->
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">🔥 热门盲选分类</h2>
<div class="space-y-3">
<div v-for="item in hotCategories" :key="item.name">
<div class="flex justify-between text-sm mb-1">
<span>{{ item.icon }} {{ item.name }}</span>
<span>{{ item.count }} </span>
</div>
<progress class="progress progress-primary" :value="item.percent" max="100"></progress>
</div>
</div>
</div>
</div>
</div>
<!-- 最近用户 -->
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">👥 最近注册用户</h2>
<div class="overflow-x-auto">
<table class="table table-zebra">
<thead>
<tr>
<th>#</th>
<th>昵称</th>
<th>手机号</th>
<th>会员</th>
<th>注册时间</th>
</tr>
</thead>
<tbody>
<tr v-for="(user, i) in recentUsers" :key="i">
<td>{{ i + 1 }}</td>
<td>{{ user.nickname }}</td>
<td>{{ user.phone }}</td>
<td>
<div class="badge" :class="user.member ? 'badge-success' : 'badge-ghost'">
{{ user.member ? 'VIP' : '免费' }}
</div>
</td>
<td class="text-sm text-base-content/50">{{ user.time }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
const stats = ref({
users: 12847,
newUsers: 156,
merchants: 328,
pending: 12,
packages: 1256,
active: 1198,
blinds: 45623,
todayBlinds: 892,
monthRevenue: '14,500',
payingMembers: 523,
conversionRate: 4.1,
})
const hotCategories = ref([
{ name: '日料', icon: '🍣', count: 8923, percent: 85 },
{ name: '火锅', icon: '🍲', count: 7654, percent: 73 },
{ name: '剧本杀', icon: '🔍', count: 6234, percent: 59 },
{ name: '西餐', icon: '🥩', count: 5123, percent: 49 },
{ name: '甜品', icon: '🍰', count: 3890, percent: 37 },
])
const recentUsers = ref([
{ nickname: '小明同学', phone: '138****1234', member: true, time: '2026-06-06 10:30' },
{ nickname: '吃货王', phone: '139****5678', member: false, time: '2026-06-06 09:15' },
{ nickname: '探店达人', phone: '137****9012', member: true, time: '2026-06-06 08:42' },
{ nickname: 'Luna', phone: '136****3456', member: false, time: '2026-06-05 22:10' },
])
</script>