diff --git a/src/views/match/manage/Steps/Step1BasicInfo.vue b/src/views/match/manage/Steps/Step1BasicInfo.vue
index 6bce080..f54d3a8 100644
--- a/src/views/match/manage/Steps/Step1BasicInfo.vue
+++ b/src/views/match/manage/Steps/Step1BasicInfo.vue
@@ -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) => {
diff --git a/src/views/match/manage/index.vue b/src/views/match/manage/index.vue
index 06f6893..ce74f36 100644
--- a/src/views/match/manage/index.vue
+++ b/src/views/match/manage/index.vue
@@ -20,8 +20,8 @@
-
- {{ scope.row.eventStatus === 0 ? '报名中' : scope.row.eventStatus === 1 ? '比赛中' : '已结束' }}
+
+ {{ getEventStatusText(scope.row.eventStatus) }}
@@ -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 },
],
},
{
diff --git a/src/views/user/record/index.vue b/src/views/user/record/index.vue
index 4fe7114..93e6c12 100644
--- a/src/views/user/record/index.vue
+++ b/src/views/user/record/index.vue
@@ -22,8 +22,8 @@
-
-
- {{ scope.row.eventStatus === 0 ? '报名中' : scope.row.eventStatus === 1 ? '比赛中' : '已结束' }}
+
+ {{ getEventStatusText(scope.row.eventStatus) }}
@@ -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);
diff --git a/src/views/user/registration/index.vue b/src/views/user/registration/index.vue
index a18af1d..ff71a3c 100644
--- a/src/views/user/registration/index.vue
+++ b/src/views/user/registration/index.vue
@@ -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 '不限';
};