初始化足球投注平台 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,46 @@
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { useRoute } from 'vue-router';
import api from '../api';
import { ElMessage } from 'element-plus';
const route = useRoute();
const score = ref({ htHome: 0, htAway: 0, ftHome: 0, ftAway: 0 });
const preview = ref<Record<string, unknown> | null>(null);
async function recordScore() {
await api.post(`/admin/matches/${route.params.id}/settlement/score`, score.value);
ElMessage.success('比分已录入');
}
async function previewSettlement() {
const { data } = await api.post(`/admin/matches/${route.params.id}/settlement/preview`);
preview.value = data.data;
}
async function confirm() {
if (!preview.value?.batch) return;
await api.post(`/admin/settlement/${(preview.value.batch as { id: string }).id}/confirm`);
ElMessage.success('结算已确认');
}
</script>
<template>
<h2>赛事结算 #{{ route.params.id }}</h2>
<el-form inline style="margin: 16px 0">
<el-input-number v-model="score.htHome" :min="0" />
<el-input-number v-model="score.htAway" :min="0" />
<span>半场</span>
<el-input-number v-model="score.ftHome" :min="0" />
<el-input-number v-model="score.ftAway" :min="0" />
<span>全场</span>
<el-button @click="recordScore">录入比分</el-button>
<el-button type="primary" @click="previewSettlement">生成预览</el-button>
</el-form>
<el-card v-if="preview">
<p>单关注单: {{ preview.singleBetCount }}</p>
<p>预计派彩: {{ preview.totalPayout }}</p>
<p>退款: {{ preview.totalRefund }}</p>
<el-button type="success" @click="confirm">确认结算</el-button>
</el-card>
</template>