<template>
|
<div class="player-page">
|
<!-- 页面标题区域 -->
|
<div class="page-header">
|
<div class="title-section">
|
<h1 class="page-title">报名审核</h1>
|
<p class="page-subtitle">管理参赛选手的报名申请,审核参赛资格和信息</p>
|
</div>
|
</div>
|
|
<!-- 搜索工具栏 -->
|
<div class="search-toolbar">
|
<div class="search-form">
|
<el-input
|
v-model="searchForm.name"
|
placeholder="请输入学员名称"
|
style="width: 180px"
|
clearable
|
@clear="handleClear"
|
/>
|
<el-select
|
v-model="searchForm.activityId"
|
placeholder="选择比赛"
|
style="width: 200px"
|
clearable
|
filterable
|
>
|
<el-option
|
v-for="activity in activityOptions"
|
:key="activity.id"
|
:label="activity.name"
|
:value="activity.id"
|
>
|
{{ activity.name }}
|
</el-option>
|
</el-select>
|
<el-select
|
v-model="searchForm.state"
|
placeholder="选择状态"
|
style="width: 120px"
|
clearable
|
>
|
<el-option label="待审核" value="0" />
|
<el-option label="通过" value="1" />
|
<el-option label="驳回" value="2" />
|
</el-select>
|
<el-button type="primary" @click="handleSearch">
|
<el-icon><Search /></el-icon>
|
查询
|
</el-button>
|
</div>
|
</div>
|
|
<!-- 学员列表 -->
|
<el-table :data="tableData" style="width: 100%" v-loading="loading">
|
<el-table-column label="头像" width="80" align="center">
|
<template #default="{ row }">
|
<el-avatar :src="row.avatar" :size="40">
|
<el-icon><User /></el-icon>
|
</el-avatar>
|
</template>
|
</el-table-column>
|
<el-table-column label="学员名称" min-width="120">
|
<template #default="{ row }">
|
{{ row.name }}
|
</template>
|
</el-table-column>
|
<el-table-column prop="projectName" label="项目名称" min-width="150" />
|
<el-table-column prop="activityName" label="比赛名称" min-width="200" />
|
<el-table-column prop="phone" label="联系电话" width="140" />
|
<el-table-column prop="applyTime" label="申请时间" width="180" />
|
<el-table-column prop="state" label="状态" width="100" align="center">
|
<template #default="{ row }">
|
<el-tag :type="getStateType(row.state)">{{ getStateText(row.state) }}</el-tag>
|
</template>
|
</el-table-column>
|
<el-table-column label="操作" width="80" align="center">
|
<template #default="{ row }">
|
<el-button
|
text
|
:icon="View"
|
@click="handleViewDetail(row)"
|
class="action-btn view-btn"
|
title="查看详情"
|
/>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
<!-- 分页 -->
|
<div class="pagination">
|
<el-pagination
|
v-model:current-page="pagination.page"
|
v-model:page-size="pagination.size"
|
:page-sizes="[10, 20, 50, 100]"
|
:total="pagination.total"
|
layout="total, sizes, prev, pager, next, jumper"
|
@size-change="handleSizeChange"
|
@current-change="handleCurrentChange"
|
/>
|
</div>
|
</div>
|
</template>
|
|
<script setup lang="ts">
|
import { reactive, ref, onMounted } from 'vue'
|
import { useRouter } from 'vue-router'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { Search, User, View } from '@element-plus/icons-vue'
|
import { PlayerApi } from '@/api/player'
|
import { getAllActivities } from '@/api/activity'
|
|
const loading = ref(false)
|
const router = useRouter()
|
|
// 活动选项
|
const activityOptions = ref([])
|
|
// 搜索表单
|
const searchForm = reactive({
|
name: '',
|
activityId: '',
|
state: ''
|
})
|
|
// 分页信息
|
const pagination = reactive({
|
page: 1,
|
size: 10,
|
total: 0
|
})
|
|
// 表格数据
|
const tableData = ref([])
|
|
// 获取状态标签类型
|
const getStateType = (state: number | null | undefined) => {
|
const typeMap: Record<number, string> = {
|
0: 'warning', // 未审核
|
1: 'success', // 审核通过
|
2: 'danger', // 审核驳回
|
3: 'info' // 已结束
|
}
|
return state != null ? (typeMap[state] || 'info') : 'info'
|
}
|
|
// 获取状态文本
|
const getStateText = (state: number | null | undefined) => {
|
const textMap: Record<number, string> = {
|
0: '未审核',
|
1: '审核通过',
|
2: '审核驳回',
|
3: '已结束'
|
}
|
return state != null ? (textMap[state] || '未知') : '未知'
|
}
|
|
// 搜索
|
const handleSearch = () => {
|
pagination.page = 1
|
loadData()
|
}
|
|
const handleClear = () => {
|
searchForm.name = ''
|
pagination.page = 1
|
loadData()
|
}
|
|
// 查看详情(跳转到详情页面,只读模式)
|
const handleViewDetail = (row: any) => {
|
if (!row.id) {
|
ElMessage.error('无法获取报名记录ID')
|
return
|
}
|
// 跳转到详情页面(只读模式)
|
router.push(`/player/${row.id}/detail`)
|
}
|
|
// 查看详情(跳转到评分页面)
|
const handleView = (row: any) => {
|
if (!row.id) {
|
ElMessage.error('无法获取报名记录ID')
|
return
|
}
|
router.push(`/activity-player/${row.id}/rating`)
|
}
|
|
// 分页大小改变
|
const handleSizeChange = (size: number) => {
|
pagination.size = size
|
loadData()
|
}
|
|
// 当前页改变
|
const handleCurrentChange = (page: number) => {
|
pagination.page = page
|
loadData()
|
}
|
|
// 获取比赛名称(如果是阶段,返回父比赛名称;如果是比赛,返回自己的名称)
|
const getActivityName = (activity: any) => {
|
if (activity.pid > 0 && activity.parent) {
|
return activity.parent.name
|
}
|
return activity.name
|
}
|
|
// 加载活动选项
|
const loadActivityOptions = async () => {
|
try {
|
const activities = await getAllActivities()
|
|
if (activities && Array.isArray(activities)) {
|
// 过滤出正在进行的比赛(不是阶段)
|
const filtered = activities.filter(activity =>
|
activity.state === 1 && (activity.pid === 0 || activity.pid === "0")
|
)
|
|
activityOptions.value = filtered
|
}
|
} catch (error) {
|
ElMessage.error('加载活动选项失败')
|
}
|
}
|
|
|
|
// 加载数据
|
const loadData = async () => {
|
loading.value = true
|
try {
|
// 确保activityId是正确的类型
|
let activityId = null
|
if (searchForm.activityId && searchForm.activityId !== '') {
|
activityId = searchForm.activityId
|
}
|
|
const response = await PlayerApi.getApplications(
|
searchForm.name || '',
|
activityId,
|
searchForm.state !== '' ? parseInt(searchForm.state) : null,
|
pagination.page,
|
pagination.size
|
)
|
const list = response.content || []
|
tableData.value = list.map((item: any) => ({
|
id: item.id,
|
name: item.playerName,
|
projectName: item.projectName,
|
avatar: '',
|
activityName: item.activityName,
|
phone: item.phone,
|
applyTime: item.applyTime,
|
state: item.state
|
}))
|
pagination.total = response.totalElements || 0
|
} catch (e: any) {
|
ElMessage.error(String(e?.message || e))
|
} finally {
|
loading.value = false
|
}
|
}
|
|
onMounted(() => {
|
loadActivityOptions()
|
loadData()
|
})
|
</script>
|
|
<style lang="scss" scoped>
|
.player-page {
|
padding: 20px;
|
}
|
|
/* 页面标题区域 */
|
.page-header {
|
margin-bottom: 24px;
|
}
|
|
.title-section {
|
text-align: left;
|
}
|
|
.page-title {
|
font-size: 24px;
|
font-weight: 600;
|
color: #1f2937;
|
margin: 0 0 8px 0;
|
}
|
|
.page-subtitle {
|
font-size: 14px;
|
color: #6b7280;
|
margin: 0;
|
line-height: 1.5;
|
}
|
|
/* 搜索工具栏 */
|
.search-toolbar {
|
display: flex;
|
justify-content: flex-end;
|
margin-bottom: 20px;
|
}
|
|
.search-form {
|
display: flex;
|
gap: 12px;
|
align-items: center;
|
}
|
|
.search-area {
|
display: flex;
|
align-items: center;
|
gap: 12px;
|
}
|
|
.action-area {
|
display: flex;
|
align-items: center;
|
gap: 12px;
|
}
|
|
/* 操作按钮样式 */
|
.action-btn {
|
padding: 8px !important;
|
margin: 0 6px;
|
border-radius: 6px;
|
transition: all 0.2s ease;
|
}
|
|
.view-btn {
|
color: #3b82f6 !important;
|
}
|
|
.view-btn:hover {
|
background-color: rgba(59, 130, 246, 0.1) !important;
|
transform: scale(1.2);
|
}
|
|
.pagination {
|
margin-top: 20px;
|
display: flex;
|
justify-content: center;
|
}
|
|
/* 响应式适配 */
|
@media (max-width: 768px) {
|
.search-toolbar {
|
flex-direction: column;
|
gap: 12px;
|
align-items: stretch;
|
}
|
|
.search-area {
|
justify-content: center;
|
flex-wrap: wrap;
|
}
|
|
.action-area {
|
justify-content: center;
|
}
|
}
|
</style>
|