8c33617073
- deploy/server.Dockerfile、deploy/client-h5.Dockerfile(自 ai-art 仓库迁出,去重) - docker-compose.yml 迁入并修正路径(admin 上下文 ./admin),新增可选 h5 服务(profile 隔离) - admin/:管理前端完整源码(Vite+Vue3,自 workspace/dimension-admin 合并)
41 lines
1.6 KiB
Vue
41 lines
1.6 KiB
Vue
<template>
|
|
<div>
|
|
<h2>数据看板</h2>
|
|
<div class="cards">
|
|
<el-card><div class="num">{{ s.newUsers ?? '-' }}</div><div class="lbl">今日新增</div></el-card>
|
|
<el-card><div class="num">{{ s.activeUsers ?? '-' }}</div><div class="lbl">今日活跃</div></el-card>
|
|
<el-card><div class="num">{{ s.newOrders ?? '-' }}</div><div class="lbl">今日订单</div></el-card>
|
|
<el-card><div class="num ok">{{ s.aiChatToday ?? '-' }}</div><div class="lbl">问答总数</div></el-card>
|
|
<el-card><div class="num">{{ s.aiChatUsers ?? '-' }}</div><div class="lbl">问答用户</div></el-card>
|
|
<el-card><div class="num">{{ s.aiChatShares ?? '-' }}</div><div class="lbl">分享次数</div></el-card>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { onMounted, ref } from 'vue'
|
|
import { apiGet } from '../api'
|
|
const s = ref({})
|
|
onMounted(async () => {
|
|
try {
|
|
const d = await apiGet('/api/admin/dashboard')
|
|
const stats = await apiGet('/api/admin/ai-chat/stats').catch(() => ({}))
|
|
s.value = {
|
|
newUsers: d?.today?.newUsers ?? '-',
|
|
activeUsers: d?.today?.activeUsers ?? '-',
|
|
newOrders: d?.today?.newOrders ?? '-',
|
|
aiChatToday: stats?.totalQuestions ?? '-',
|
|
aiChatUsers: stats?.totalUsers ?? '-',
|
|
aiChatShares: stats?.totalShares ?? '-',
|
|
}
|
|
} catch (e) { console.error(e) }
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
.cards { display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:12px; }
|
|
.num { font-size:26px; font-weight:700; color:#1f2333; }
|
|
.num.ok { color:#18a058; }
|
|
.lbl { font-size:12px; color:#8a8fa3; margin-top:4px; }
|
|
</style>
|