初始化足球投注平台 MVP Monorepo

包含 NestJS 后端、三端前端、Prisma 数据模型、结算引擎测试与 PRD 文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-02 14:35:48 +08:00
commit 14e49374ac
118 changed files with 15944 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
<script setup lang="ts">
import { ref } from 'vue';
import api from '../api';
import { ElMessage } from 'element-plus';
const preview = ref<Record<string, unknown> | null>(null);
const period = ref({
start: new Date(Date.now() - 7 * 86400000).toISOString().slice(0, 10),
end: new Date().toISOString().slice(0, 10),
});
async function generatePreview() {
const { data } = await api.post('/admin/cashbacks/preview', {
periodStart: period.value.start,
periodEnd: period.value.end,
});
preview.value = data.data;
}
async function confirm() {
if (!preview.value?.batch) return;
await api.post(`/admin/cashbacks/${(preview.value.batch as { id: string }).id}/confirm`);
ElMessage.success('返水已发放');
}
</script>
<template>
<h2>返水管理</h2>
<el-form inline>
<el-date-picker v-model="period.start" type="date" value-format="YYYY-MM-DD" />
<el-date-picker v-model="period.end" type="date" value-format="YYYY-MM-DD" />
<el-button @click="generatePreview">生成预览</el-button>
</el-form>
<el-card v-if="preview" style="margin-top: 16px">
<p>玩家数: {{ (preview.batch as { playerCount: number })?.playerCount }}</p>
<p>总金额: {{ preview.totalAmount }}</p>
<el-button type="success" @click="confirm">确认发放</el-button>
</el-card>
</template>