赛事新增限制

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({ const rules = ref({
eventName: [{ required: true, message: '请输入赛事名称', trigger: 'blur' }], eventName: [{ required: true, message: '请输入赛事名称', trigger: 'blur' }],
coverImage: [{ required: true, message: '请上传封面', trigger: 'change' }], coverImage: [{ required: true, message: '请上传封面', trigger: 'change' }],
eventType: [{ required: true, message: '请选择赛事类型', trigger: 'change' }], eventType: [{ required: true, message: '请选择赛事类型', trigger: 'change' }],
registrationType: [{ required: true, message: '请选择报名方式', trigger: 'change' }], registrationType: [{ required: true, message: '请选择报名方式', trigger: 'change' }],
pointsRuleId: [{ required: true, message: '请选择积分规则', trigger: 'change' }], pointsRuleId: [{ required: true, message: '请选择积分规则', trigger: 'change' }],
registrationTime: [{ type: 'array', required: true, message: '请选择报名起止时间', trigger: 'change' }], registrationTime: [
matchTime: [{ type: 'array', required: true, message: '请选择比赛起止时间', trigger: 'change' }], { type: 'array', required: true, message: '请选择报名起止时间', trigger: 'change' },
{ validator: validateEventTime, trigger: 'change' }
],
matchTime: [
{ type: 'array', required: true, message: '请选择比赛起止时间', trigger: 'change' },
{ validator: validateEventTime, trigger: 'change' }
],
materialUploadTime: [ materialUploadTime: [
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {

View File

@ -20,8 +20,8 @@
<el-image :src="scope.row.coverImage" style="height: 80px" fit="cover" /> <el-image :src="scope.row.coverImage" style="height: 80px" fit="cover" />
</template> </template>
<template #eventStatus="scope"> <template #eventStatus="scope">
<el-tag :type="scope.row.eventStatus === 0 ? 'success' : scope.row.eventStatus === 1 ? 'warning' : 'danger'"> <el-tag :type="getEventStatusTagType(scope.row.eventStatus)">
{{ scope.row.eventStatus === 0 ? '报名中' : scope.row.eventStatus === 1 ? '比赛中' : '已结束' }} {{ getEventStatusText(scope.row.eventStatus) }}
</el-tag> </el-tag>
</template> </template>
<template #action="scope"> <template #action="scope">
@ -56,6 +56,25 @@ const initParam = ref({
refresh: true, 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 = () =>{ const refreshTable = () =>{
initParam.value.refresh = !initParam.value.refresh initParam.value.refresh = !initParam.value.refresh
} }
@ -130,9 +149,11 @@ const columns = reactive([
el: 'select', el: 'select',
}, },
enum: [ enum: [
{ label: '报名中', value: 0 }, { label: '未开始', value: 0 },
{ label: '比赛中', value: 1 }, { label: '报名中', value: 1 },
{ label: '已结束', value: 2 }, { label: '报名结束', value: 2 },
{ label: '比赛中', value: 3 },
{ label: '已结束', value: 4 },
], ],
}, },
{ {

View File

@ -22,8 +22,8 @@
<span v-else>-</span> <span v-else>-</span>
</template> </template>
<template #eventStatus="scope"> <template #eventStatus="scope">
<el-tag :type="scope.row.eventStatus === 0 ? 'success' : scope.row.eventStatus === 1 ? 'warning' : 'danger'"> <el-tag :type="getEventStatusTagType(scope.row.eventStatus)">
{{ scope.row.eventStatus === 0 ? '报名中' : scope.row.eventStatus === 1 ? '比赛中' : '已结束' }} {{ getEventStatusText(scope.row.eventStatus) }}
</el-tag> </el-tag>
</template> </template>
<template #registrationStartTime="scope"> <template #registrationStartTime="scope">
@ -464,6 +464,25 @@ const chargeModeMap = {
const getEventTypeText = (v) => eventTypeMap[normalizeToNumber(v)] ?? (v ?? '-'); const getEventTypeText = (v) => eventTypeMap[normalizeToNumber(v)] ?? (v ?? '-');
const getChargeModeText = (v) => chargeModeMap[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(() => { const disableCancel = computed(() => {
if (!currentRow.value) return true; if (!currentRow.value) return true;
const status = normalizeToNumber(currentRow.value.status); const status = normalizeToNumber(currentRow.value.status);

View File

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