赛事新增限制

This commit is contained in:
马梓彭 2026-04-06 14:14:58 +08:00
parent b87373ee94
commit 1c15442978
4 changed files with 97 additions and 9 deletions

View File

@ -218,14 +218,60 @@ const handleCityChange = async () => {
}
};
const validateEventTime = (rule, value, callback) => {
const regTime = localFormData.value.registrationTime;
const matchTime = localFormData.value.matchTime;
if (!regTime || !Array.isArray(regTime) || regTime.length !== 2 || !regTime[0] || !regTime[1]) {
return callback();
}
if (!matchTime || !Array.isArray(matchTime) || matchTime.length !== 2 || !matchTime[0] || !matchTime[1]) {
return callback();
}
const regStart = new Date(regTime[0]);
const regEnd = new Date(regTime[1]);
const matchStart = new Date(matchTime[0]);
const matchEnd = new Date(matchTime[1]);
if (regStart >= regEnd) {
return callback(new Error('报名结束时间必须晚于报名开始时间'));
}
if (matchStart >= matchEnd) {
return callback(new Error('比赛结束时间必须晚于比赛开始时间'));
}
if (matchStart <= regStart) {
return callback(new Error('比赛开始时间必须晚于报名开始时间'));
}
if (matchStart <= regEnd) {
return callback(new Error('比赛开始时间必须晚于报名结束时间'));
}
if (matchEnd <= regEnd) {
return callback(new Error('比赛结束时间必须晚于报名结束时间'));
}
callback();
};
const rules = ref({
eventName: [{ required: true, message: '请输入赛事名称', trigger: 'blur' }],
coverImage: [{ required: true, message: '请上传封面', trigger: 'change' }],
eventType: [{ required: true, message: '请选择赛事类型', trigger: 'change' }],
registrationType: [{ required: true, message: '请选择报名方式', trigger: 'change' }],
pointsRuleId: [{ required: true, message: '请选择积分规则', trigger: 'change' }],
registrationTime: [{ type: 'array', required: true, message: '请选择报名起止时间', trigger: 'change' }],
matchTime: [{ type: 'array', required: true, message: '请选择比赛起止时间', trigger: 'change' }],
registrationTime: [
{ type: 'array', required: true, message: '请选择报名起止时间', trigger: 'change' },
{ validator: validateEventTime, trigger: 'change' }
],
matchTime: [
{ type: 'array', required: true, message: '请选择比赛起止时间', trigger: 'change' },
{ validator: validateEventTime, trigger: 'change' }
],
materialUploadTime: [
{
validator: (rule, value, callback) => {

View File

@ -20,8 +20,8 @@
<el-image :src="scope.row.coverImage" style="height: 80px" fit="cover" />
</template>
<template #eventStatus="scope">
<el-tag :type="scope.row.eventStatus === 0 ? 'success' : scope.row.eventStatus === 1 ? 'warning' : 'danger'">
{{ scope.row.eventStatus === 0 ? '报名中' : scope.row.eventStatus === 1 ? '比赛中' : '已结束' }}
<el-tag :type="getEventStatusTagType(scope.row.eventStatus)">
{{ getEventStatusText(scope.row.eventStatus) }}
</el-tag>
</template>
<template #action="scope">
@ -56,6 +56,25 @@ const initParam = ref({
refresh: true,
});
// 赛事状态映射
const eventStatusMap = {
0: { type: 'info', text: '未开始' },
1: { type: 'success', text: '报名中' },
2: { type: 'warning', text: '报名结束' },
3: { type: 'primary', text: '比赛中' },
4: { type: 'danger', text: '已结束' },
};
const getEventStatusTagType = (status) => {
const normalizedStatus = typeof status === 'string' ? Number(status) : status;
return eventStatusMap[normalizedStatus]?.type ?? 'info';
};
const getEventStatusText = (status) => {
const normalizedStatus = typeof status === 'string' ? Number(status) : status;
return eventStatusMap[normalizedStatus]?.text ?? (status ?? '-');
};
const refreshTable = () =>{
initParam.value.refresh = !initParam.value.refresh
}
@ -130,9 +149,11 @@ const columns = reactive([
el: 'select',
},
enum: [
{ label: '报名中', value: 0 },
{ label: '比赛中', value: 1 },
{ label: '已结束', value: 2 },
{ label: '未开始', value: 0 },
{ label: '报名中', value: 1 },
{ label: '报名结束', value: 2 },
{ label: '比赛中', value: 3 },
{ label: '已结束', value: 4 },
],
},
{

View File

@ -22,8 +22,8 @@
<span v-else>-</span>
</template>
<template #eventStatus="scope">
<el-tag :type="scope.row.eventStatus === 0 ? 'success' : scope.row.eventStatus === 1 ? 'warning' : 'danger'">
{{ scope.row.eventStatus === 0 ? '报名中' : scope.row.eventStatus === 1 ? '比赛中' : '已结束' }}
<el-tag :type="getEventStatusTagType(scope.row.eventStatus)">
{{ getEventStatusText(scope.row.eventStatus) }}
</el-tag>
</template>
<template #registrationStartTime="scope">
@ -464,6 +464,25 @@ const chargeModeMap = {
const getEventTypeText = (v) => eventTypeMap[normalizeToNumber(v)] ?? (v ?? '-');
const getChargeModeText = (v) => chargeModeMap[normalizeToNumber(v)] ?? (v ?? '-');
// 赛事状态映射
const eventStatusMap = {
0: { type: 'info', text: '未开始' },
1: { type: 'success', text: '报名中' },
2: { type: 'warning', text: '报名结束' },
3: { type: 'primary', text: '比赛中' },
4: { type: 'danger', text: '已结束' },
};
const getEventStatusTagType = (status) => {
const normalizedStatus = typeof status === 'string' ? Number(status) : status;
return eventStatusMap[normalizedStatus]?.type ?? 'info';
};
const getEventStatusText = (status) => {
const normalizedStatus = typeof status === 'string' ? Number(status) : status;
return eventStatusMap[normalizedStatus]?.text ?? (status ?? '-');
};
const disableCancel = computed(() => {
if (!currentRow.value) return true;
const status = normalizeToNumber(currentRow.value.status);

View File

@ -824,6 +824,8 @@ const formatGender = (gender) => {
const v = Number(gender);
if (v === 0) return '男';
if (v === 1) return '女';
if (v === 2) return '保密';
if (v === 3) return '不限';
return '不限';
};