|
|
@@ -129,119 +129,94 @@
|
|
|
<div class="menu-config">
|
|
|
<div class="menu-header">
|
|
|
<h3>赛事菜单</h3>
|
|
|
- <el-button type="primary" @click="addMenuItem" icon="Plus">添加菜单项</el-button>
|
|
|
+ <el-button type="primary" @click="showMenuSelectDialog" icon="Plus">添加菜单项</el-button>
|
|
|
</div>
|
|
|
|
|
|
<el-table :data="menuItems" border style="width: 100%">
|
|
|
- <el-table-column label="菜单名称" prop="menuName">
|
|
|
+ <el-table-column label="菜单名称" prop="name" width="200">
|
|
|
<template #default="scope">
|
|
|
- <el-input v-model="scope.row.menuName" placeholder="请输入菜单名称" />
|
|
|
+ <span>{{ scope.row.name }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="活动类型" prop="activityStatus">
|
|
|
+ <el-table-column label="图标" prop="pic" width="80">
|
|
|
<template #default="scope">
|
|
|
- <el-radio-group v-model="scope.row.activityStatus">
|
|
|
- <el-radio :value="0">赛前</el-radio>
|
|
|
- <el-radio :value="1">赛中</el-radio>
|
|
|
- <el-radio :value="2">赛后</el-radio>
|
|
|
- </el-radio-group>
|
|
|
+ <el-image v-if="scope.row.pic" :src="scope.row.pic" style="width: 40px; height: 40px" fit="cover" />
|
|
|
+ <span v-else>-</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="图标" prop="icon">
|
|
|
+ <el-table-column label="跳转类型" prop="jumpType" width="100">
|
|
|
<template #default="scope">
|
|
|
- <el-input v-model="scope.row.icon" placeholder="请输入图标" />
|
|
|
+ <span>{{ getJumpTypeLabel(scope.row.jumpType) }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="颜色" prop="color">
|
|
|
+ <el-table-column label="颜色" prop="color" width="100">
|
|
|
<template #default="scope">
|
|
|
- <el-input v-model="scope.row.color" placeholder="请输入颜色" />
|
|
|
+ <div v-if="scope.row.color" :style="{ backgroundColor: scope.row.color, width: '30px', height: '20px', borderRadius: '4px' }"></div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="是否站外" prop="isFrame">
|
|
|
+ <el-table-column label="跳转路径" prop="jumpPath">
|
|
|
<template #default="scope">
|
|
|
- <el-radio-group v-model="scope.row.isFrame">
|
|
|
- <el-radio :value="1">站内</el-radio>
|
|
|
- <el-radio :value="0">站外</el-radio>
|
|
|
- </el-radio-group>
|
|
|
+ <span>{{ scope.row.jumpPath }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="链接" prop="siteLink">
|
|
|
+ <el-table-column label="排序" prop="sortNum" width="80">
|
|
|
<template #default="scope">
|
|
|
- <el-input v-model="scope.row.siteLink" placeholder="请输入链接" />
|
|
|
+ <span>{{ scope.row.sortNum }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="排序" prop="orderNum">
|
|
|
+ <el-table-column label="活动类型" prop="activityType" width="100">
|
|
|
<template #default="scope">
|
|
|
- <el-input-number v-model="scope.row.orderNum" :min="1" :max="999" />
|
|
|
+ <span>{{ scope.row.activityType === 0 ? '赛前' : scope.row.activityType === 1 ? '赛中' : '赛后' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="操作">
|
|
|
+ <el-table-column label="操作" width="100">
|
|
|
<template #default="scope">
|
|
|
<el-button type="danger" size="small" @click="removeMenuItem(scope.$index)" icon="Delete">删除 </el-button>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
</div>
|
|
|
- </el-tab-pane>
|
|
|
|
|
|
- <!-- 赛事项目标签页 -->
|
|
|
- <el-tab-pane label="赛事项目" name="projects">
|
|
|
- <div class="project-config">
|
|
|
- <div class="project-header">
|
|
|
- <h3>赛事项目配置</h3>
|
|
|
- <el-button type="primary" @click="addProjectItem" icon="Plus">添加项目</el-button>
|
|
|
+ <!-- 菜单选择弹框 -->
|
|
|
+ <el-dialog v-model="menuSelectDialogVisible" title="选择菜单" width="60%" :close-on-click-modal="false">
|
|
|
+ <div class="menu-select-content">
|
|
|
+ <div class="search-bar" style="margin-bottom: 16px">
|
|
|
+ <el-input v-model="menuSearchKeyword" placeholder="搜索菜单名称" clearable style="width: 300px" />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-table :data="filteredAvailableMenus" border style="width: 100%" @selection-change="handleMenuSelectionChange" max-height="400">
|
|
|
+ <el-table-column type="selection" width="55" />
|
|
|
+ <el-table-column label="菜单名称" prop="name" width="200" />
|
|
|
+ <el-table-column label="图标" prop="pic" width="80">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-image v-if="scope.row.pic" :src="scope.row.pic" style="width: 40px; height: 40px" fit="cover" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="颜色" prop="color" width="100">
|
|
|
+ <template #default="scope">
|
|
|
+ <div
|
|
|
+ v-if="scope.row.color"
|
|
|
+ :style="{ backgroundColor: scope.row.color, width: '30px', height: '20px', borderRadius: '4px' }"
|
|
|
+ ></div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="跳转类型" prop="jumpType" width="120">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ getJumpTypeLabel(scope.row.jumpType) }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="跳转路径" prop="jumpPath" />
|
|
|
+ <el-table-column label="排序" prop="sortNum" width="80" />
|
|
|
+ </el-table>
|
|
|
</div>
|
|
|
|
|
|
- <el-table :data="projectItems" border style="width: 100%">
|
|
|
- <el-table-column label="項目类型" prop="projectType">
|
|
|
- <template #default="scope">
|
|
|
- <el-select v-model="scope.row.projectType" placeholder="请选择項目类型" style="width: 100%">
|
|
|
- <el-option v-for="dict in game_project_type" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
- </el-select>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="项目名称" prop="projectName">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.projectName" placeholder="请输入项目名称" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="项目组别" prop="groupType">
|
|
|
- <template #default="scope">
|
|
|
- <el-select v-model="scope.row.groupType" placeholder="请选择项目组别" style="width: 100%">
|
|
|
- <el-option v-for="group in groupItems" :key="group.groupId" :label="group.groupName" :value="group.groupName" />
|
|
|
- </el-select>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="排序" prop="orderType">
|
|
|
- <template #default="scope">
|
|
|
- <el-radio-group v-model="scope.row.orderType">
|
|
|
- <el-radio value="0">降序</el-radio>
|
|
|
- <el-radio value="1">升序</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="比赛地点" prop="location">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.location" placeholder="请输入比赛地点" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="录取名次" prop="roundType">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.roundType" placeholder="请输入录取名次" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="分数" prop="scoreValue">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.scoreValue" placeholder="请输入分数" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作">
|
|
|
- <template #default="scope">
|
|
|
- <el-button type="danger" size="small" @click="removeProjectItem(scope.$index)" icon="Delete">移除 </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
+ <template #footer>
|
|
|
+ <span class="dialog-footer">
|
|
|
+ <el-button @click="menuSelectDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="confirmAddMenuItems">确认添加</el-button>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
<!-- 配置信息标签页 -->
|
|
|
@@ -288,71 +263,6 @@
|
|
|
</el-table>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
-
|
|
|
- <!-- 参赛队伍标签页 -->
|
|
|
- <el-tab-pane label="参赛队伍" name="teams">
|
|
|
- <div class="team-config">
|
|
|
- <div class="team-header">
|
|
|
- <h3>参赛队伍</h3>
|
|
|
- <el-button type="primary" @click="addTeamItem" icon="Plus">新增队伍</el-button>
|
|
|
- </div>
|
|
|
-
|
|
|
- <el-table :data="teamItems" border style="width: 100%">
|
|
|
- <el-table-column label="单位名称" prop="teamName">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.teamName" placeholder="请输入单位名称" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="编号" prop="teamCode">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.teamCode" placeholder="请输入编号" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="团队描述" prop="teamDescribe">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.teamDescribe" placeholder="请描述一下你的团队吧~" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作">
|
|
|
- <template #default="scope">
|
|
|
- <el-button type="danger" size="small" @click="removeTeamItem(scope.$index)" icon="Delete">删除 </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
- <!-- 赛事分组标签页 -->
|
|
|
- <el-tab-pane label="赛事分组" name="groups">
|
|
|
- <div class="group-config">
|
|
|
- <div class="group-header">
|
|
|
- <h3>赛事分组</h3>
|
|
|
- <el-button type="primary" @click="addGroupItem" icon="Plus">添加分组</el-button>
|
|
|
- </div>
|
|
|
-
|
|
|
- <el-table :data="groupItems" border style="width: 100%">
|
|
|
- <el-table-column label="分组名称" prop="groupName">
|
|
|
- <template #default="scope">
|
|
|
- <el-input v-model="scope.row.groupName" placeholder="请输入分组名称" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="成员性别" prop="memberGender">
|
|
|
- <template #default="scope">
|
|
|
- <el-radio-group v-model="scope.row.memberGender">
|
|
|
- <el-radio value="0">不分男女</el-radio>
|
|
|
- <el-radio value="1">男</el-radio>
|
|
|
- <el-radio value="2">女</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作">
|
|
|
- <template #default="scope">
|
|
|
- <el-button type="danger" size="small" @click="removeGroupItem(scope.$index)" icon="Delete">删除 </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- </el-tab-pane>
|
|
|
</el-tabs>
|
|
|
|
|
|
<!-- 底部操作按钮 -->
|
|
|
@@ -368,18 +278,11 @@
|
|
|
import { getGameEvent, addGameEvent, updateGameEvent, changeEventDefault } from '@/api/system/gameEvent';
|
|
|
import { GameEventVO, GameEventForm } from '@/api/system/gameEvent/types';
|
|
|
import { listGameEventConfig, addGameEventConfig, updateGameEventConfig, delGameEventConfig } from '@/api/system/gameEventConfig';
|
|
|
-import { GameEventConfigVO, GameEventConfigForm } from '@/api/system/gameEventConfig/types';
|
|
|
+import { GameEventConfigForm } from '@/api/system/gameEventConfig/types';
|
|
|
import { listGameEventConfigType } from '@/api/system/gameEventConfigType'; // 添加导入
|
|
|
import { GameEventConfigTypeVO } from '@/api/system/gameEventConfigType/types'; // 添加导入
|
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
|
-import { listGameEventMenu, addGameEventMenu, updateGameEventMenu, delGameEventMenu } from '@/api/system/gameEventMenu';
|
|
|
-import { GameEventMenuVO, GameEventMenuForm } from '@/api/system/gameEventMenu/types';
|
|
|
-import { listGameTeam, addGameTeam, updateGameTeam, delGameTeam } from '@/api/system/gameTeam';
|
|
|
-import { GameTeamVO, GameTeamForm } from '@/api/system/gameTeam/types';
|
|
|
-import { listGameEventGroup, addGameEventGroup, updateGameEventGroup, delGameEventGroup } from '@/api/system/gameEventGroup';
|
|
|
-import { GameEventGroupForm, GameEventGroupVO } from '@/api/system/gameEventGroup/types';
|
|
|
-import { addGameEventProject, listGameEventProject, updateGameEventProject, delGameEventProject } from '@/api/system/gameEventProject';
|
|
|
-import { GameEventProjectForm, GameEventProjectVO } from '@/api/system/gameEventProject/types';
|
|
|
+import { listRelateMenu, getEnabledNavigator, editRelate, type EditRelateMenuParams, GameNavigatorVo } from '@/api/system/common/nav/gameNavigator';
|
|
|
|
|
|
const route = useRoute();
|
|
|
const router = useRouter();
|
|
|
@@ -436,11 +339,14 @@ const basicRules = {
|
|
|
endTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }]
|
|
|
};
|
|
|
|
|
|
+const currentEventId = ref<number>();
|
|
|
+
|
|
|
// 初始化页面
|
|
|
onMounted(async () => {
|
|
|
const eventId = route.params.id as string;
|
|
|
if (eventId) {
|
|
|
isEdit.value = true;
|
|
|
+ currentEventId.value = Number(eventId);
|
|
|
await loadEventData(eventId);
|
|
|
} else {
|
|
|
// 新增模式,加载图片配置模板
|
|
|
@@ -448,7 +354,6 @@ onMounted(async () => {
|
|
|
}
|
|
|
// 加载配置类型选项
|
|
|
await loadConfigTypes();
|
|
|
- // console.log('Initial image configs:', imageConfigItems.value); // 添加调试信息
|
|
|
});
|
|
|
|
|
|
// 加载赛事数据
|
|
|
@@ -460,22 +365,16 @@ const loadEventData = async (eventId: string | number) => {
|
|
|
// 填充基本信息
|
|
|
Object.assign(basicForm.value, data);
|
|
|
|
|
|
- // 获取有效的赛事ID
|
|
|
- const effectiveEventId = getEffectiveEventId(eventId);
|
|
|
-
|
|
|
// 加载图片配置数据
|
|
|
try {
|
|
|
- await loadImageConfigData(effectiveEventId);
|
|
|
+ await loadImageConfigData(eventId);
|
|
|
} catch (error) {
|
|
|
console.warn('加载图片配置数据失败,继续加载其他数据:', error);
|
|
|
// 不中断其他数据的加载
|
|
|
}
|
|
|
|
|
|
- await loadMenuData(effectiveEventId); // 加载菜单数据
|
|
|
- await loadGroupData(effectiveEventId); // 加载分组数据
|
|
|
- await loadProjectData(effectiveEventId); // 加载项目数据
|
|
|
- await loadTeamData(effectiveEventId); // 加载队伍数据
|
|
|
- await loadConfigData(effectiveEventId); // 加载配置数据
|
|
|
+ await loadMenuData(eventId); // 加载菜单数据
|
|
|
+ await loadConfigData(eventId); // 加载配置数据
|
|
|
} catch (error) {
|
|
|
proxy?.$modal.msgError('加载赛事数据失败');
|
|
|
}
|
|
|
@@ -495,123 +394,125 @@ const handleStatusChange = async (row: GameEventVO) => {
|
|
|
row.isDefault = row.isDefault === '0' ? '1' : '0';
|
|
|
}
|
|
|
};
|
|
|
+// 菜单列表数据
|
|
|
+const menuItems = ref<GameNavigatorVo[]>([]);
|
|
|
+
|
|
|
+// 菜单选择弹框相关数据
|
|
|
+const menuSelectDialogVisible = ref(false);
|
|
|
+const availableMenus = ref<any[]>([]);
|
|
|
+const selectedMenus = ref<any[]>([]);
|
|
|
+const menuSearchKeyword = ref('');
|
|
|
+
|
|
|
+// 过滤可用菜单的计算属性
|
|
|
+const filteredAvailableMenus = computed(() => {
|
|
|
+ if (!menuSearchKeyword.value) {
|
|
|
+ return availableMenus.value;
|
|
|
+ }
|
|
|
+ return availableMenus.value.filter((menu) => menu.name?.toLowerCase().includes(menuSearchKeyword.value.toLowerCase()));
|
|
|
+});
|
|
|
|
|
|
-// 赛事分组数据
|
|
|
-const groupItems = ref<GameEventGroupForm[]>([]);
|
|
|
-// 加载项目分组数据
|
|
|
-const loadGroupData = async (eventId: string | number) => {
|
|
|
+// 加载菜单数据
|
|
|
+const loadMenuData = async (eventId: string | number) => {
|
|
|
try {
|
|
|
- const res = await listGameEventGroup({
|
|
|
- eventId: eventId === '' ? '' : eventId,
|
|
|
+ const res = await listRelateMenu({
|
|
|
+ eventId: eventId,
|
|
|
pageNum: 1,
|
|
|
pageSize: 1000,
|
|
|
orderByColumn: '',
|
|
|
isAsc: ''
|
|
|
});
|
|
|
- groupItems.value = Array.isArray(res.rows) ? res.rows : [];
|
|
|
+ menuItems.value = Array.isArray(res.rows) ? res.rows : [];
|
|
|
} catch (error) {
|
|
|
- proxy?.$modal.msgError('加载项目分组数据失败');
|
|
|
- }
|
|
|
-};
|
|
|
-// 添加赛事分组项
|
|
|
-const addGroupItem = () => {
|
|
|
- groupItems.value.push({
|
|
|
- groupId: '',
|
|
|
- eventId: getEffectiveEventId(),
|
|
|
- groupName: '',
|
|
|
- memberGender: ''
|
|
|
- });
|
|
|
-};
|
|
|
-// 删除赛事分组项
|
|
|
-const removeGroupItem = (index: number) => {
|
|
|
- const groupItem = groupItems.value[index];
|
|
|
- if (groupItem.groupId) {
|
|
|
- delGameEventGroup(groupItem.groupId).then(() => {
|
|
|
- groupItems.value.splice(index, 1);
|
|
|
- });
|
|
|
- } else {
|
|
|
- groupItems.value.splice(index, 1);
|
|
|
+ proxy?.$modal.msgError('加载菜单数据失败');
|
|
|
}
|
|
|
};
|
|
|
-// 保存赛事分组数据
|
|
|
-const saveGroupData = async (eventId: string | number) => {
|
|
|
+
|
|
|
+// 显示菜单选择弹框
|
|
|
+const showMenuSelectDialog = async () => {
|
|
|
try {
|
|
|
- for (const item of groupItems.value) {
|
|
|
- // 确保eventId被正确设置
|
|
|
- const groupData = { ...item, eventId };
|
|
|
-
|
|
|
- if (item.groupId) {
|
|
|
- // 更新现有分组
|
|
|
- await updateGameEventGroup(groupData);
|
|
|
- } else if (item.groupName) {
|
|
|
- // 只有有名称的新分组才保存
|
|
|
- await addGameEventGroup(groupData);
|
|
|
- }
|
|
|
- }
|
|
|
+ // 加载可用的导航菜单
|
|
|
+ const res = await getEnabledNavigator();
|
|
|
+ availableMenus.value = Array.isArray(res.data) ? res.data : [];
|
|
|
+ selectedMenus.value = [];
|
|
|
+ menuSearchKeyword.value = '';
|
|
|
+ menuSelectDialogVisible.value = true;
|
|
|
} catch (error) {
|
|
|
- console.error('保存赛事分组数据失败:', error);
|
|
|
- throw new Error('保存赛事分组失败');
|
|
|
+ proxy?.$modal.msgError('加载可用菜单失败');
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-// 菜单列表数据
|
|
|
-const menuItems = ref<GameEventMenuForm[]>([]);
|
|
|
-// 加载菜单数据
|
|
|
-const loadMenuData = async (eventId: string | number) => {
|
|
|
- try {
|
|
|
- const res = await listGameEventMenu({
|
|
|
- eventId: eventId === '' ? '' : eventId,
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- orderByColumn: undefined,
|
|
|
- isAsc: undefined,
|
|
|
- });
|
|
|
- menuItems.value = Array.isArray(res.rows) ? res.rows : [];
|
|
|
- } catch (error) {
|
|
|
- proxy?.$modal.msgError('加载菜单数据失败');
|
|
|
- }
|
|
|
+// 处理菜单选择变化
|
|
|
+const handleMenuSelectionChange = (selection: any[]) => {
|
|
|
+ selectedMenus.value = selection;
|
|
|
};
|
|
|
-// 添加菜单项
|
|
|
-const addMenuItem = () => {
|
|
|
- menuItems.value.push({
|
|
|
- menuId: '',
|
|
|
- parentId: 0,
|
|
|
- menuName: '',
|
|
|
- activityStatus: 0,
|
|
|
- icon: '',
|
|
|
- color: '',
|
|
|
- isFrame: 1,
|
|
|
- siteLink: '',
|
|
|
- orderNum: menuItems.value.length + 1,
|
|
|
- eventId: getEffectiveEventId() // 使用有效的赛事ID
|
|
|
+
|
|
|
+// 确认添加菜单项
|
|
|
+const confirmAddMenuItems = () => {
|
|
|
+ console.log('selectedMenus:', selectedMenus.value);
|
|
|
+ if (selectedMenus.value.length === 0) {
|
|
|
+ proxy?.$modal.msgWarning('请选择要添加的菜单');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 将选中的菜单添加到菜单列表中
|
|
|
+ selectedMenus.value.forEach((menu) => {
|
|
|
+ // 检查是否已存在相同的菜单(根据menu的navId和当前menuItems的icon字段比较)
|
|
|
+ const exists = menuItems.value.some((item) => item.navId === Number(menu.navId));
|
|
|
+ if (!exists) {
|
|
|
+ menuItems.value.push(menu);
|
|
|
+ }
|
|
|
});
|
|
|
+ console.log('menuItems:', menuItems.value);
|
|
|
+ menuSelectDialogVisible.value = false;
|
|
|
+ proxy?.$modal.msgSuccess(`成功添加 ${selectedMenus.value.length} 个菜单项`);
|
|
|
+};
|
|
|
+
|
|
|
+// 获取跳转类型标签
|
|
|
+const getJumpTypeLabel = (jumpType: number) => {
|
|
|
+ const typeMap = {
|
|
|
+ 1: '跳转链接',
|
|
|
+ 2: '不跳转',
|
|
|
+ 3: '小程序内链',
|
|
|
+ 4: '小程序外链',
|
|
|
+ 5: 'H5外链',
|
|
|
+ 6: '公众号文章',
|
|
|
+ 7: '公众号',
|
|
|
+ 8: '电话拨号'
|
|
|
+ };
|
|
|
+ return typeMap[jumpType as keyof typeof typeMap] || '未知类型';
|
|
|
};
|
|
|
+
|
|
|
// 删除菜单项
|
|
|
-const removeMenuItem = (index: number) => {
|
|
|
- const menuItem = menuItems.value[index];
|
|
|
- if (menuItem.menuId) {
|
|
|
- delGameEventMenu(menuItem.menuId).then(() => {
|
|
|
- menuItems.value.splice(index, 1);
|
|
|
- });
|
|
|
- } else {
|
|
|
+const removeMenuItem = async (index: number) => {
|
|
|
+ try {
|
|
|
+ // 从本地数组中删除元素
|
|
|
menuItems.value.splice(index, 1);
|
|
|
+
|
|
|
+ // 获取当前赛事ID
|
|
|
+ const eventId = (route.params.id as string) || '';
|
|
|
+
|
|
|
+ // 调用saveMenuData方法同步到后端
|
|
|
+ await saveMenuData(eventId);
|
|
|
+
|
|
|
+ proxy?.$modal.msgSuccess('删除菜单项成功');
|
|
|
+ } catch (error) {
|
|
|
+ console.error('删除菜单项失败:', error);
|
|
|
+ proxy?.$modal.msgError('删除菜单项失败');
|
|
|
}
|
|
|
};
|
|
|
+
|
|
|
// 保存菜单数据
|
|
|
const saveMenuData = async (eventId: string | number) => {
|
|
|
try {
|
|
|
- for (const item of menuItems.value) {
|
|
|
- // 确保eventId被正确设置
|
|
|
- const menuData = { ...item, eventId };
|
|
|
-
|
|
|
- if (item.menuId) {
|
|
|
- // 更新现有菜单
|
|
|
- await updateGameEventMenu(menuData);
|
|
|
- } else if (item.menuName) {
|
|
|
- // 只有有名称的新菜单才保存
|
|
|
- await addGameEventMenu(menuData);
|
|
|
- }
|
|
|
- }
|
|
|
+ // 提取所有菜单的navId
|
|
|
+ const menus = menuItems.value.map((item) => Number(item.navId)); // 转换为数字类型
|
|
|
+ // 调用editRelate接口保存赛事关联菜单
|
|
|
+ const relateData: EditRelateMenuParams = {
|
|
|
+ eventId: eventId,
|
|
|
+ menus: menus
|
|
|
+ };
|
|
|
+
|
|
|
+ await editRelate(relateData);
|
|
|
} catch (error) {
|
|
|
console.error('保存菜单数据失败:', error);
|
|
|
throw new Error('保存菜单失败');
|
|
|
@@ -675,35 +576,6 @@ const refreshImageConfigs = async () => {
|
|
|
// await loadImageConfigTemplates();
|
|
|
}
|
|
|
};
|
|
|
-// 加载图片配置模板(用于新增模式)
|
|
|
-// const loadImageConfigTemplates = async () => {
|
|
|
-// try {
|
|
|
-// const res = await listGameEventConfig({
|
|
|
-// eventId: '',
|
|
|
-// configType: 'IMAGE',
|
|
|
-// pageNum: 1,
|
|
|
-// pageSize: 100
|
|
|
-// });
|
|
|
-
|
|
|
-// // console.log('Template response (new mode):', res);
|
|
|
-
|
|
|
-// const imageData = Array.isArray(res.rows) ? res.rows : []; // 修改此处,确保正确访问数组数据
|
|
|
-// // console.log('Image data (new mode):', imageData);
|
|
|
-
|
|
|
-// imageConfigItems.value = imageData.map(item => ({
|
|
|
-// ...item,
|
|
|
-// configValue: item.configValue || '', // 确保 configValue 初始化正确
|
|
|
-// isEnabled: item.isEnabled || '0', // 确保 isEnabled 初始化正确
|
|
|
-// status: item.status || '0' // 确保 status 初始化正确
|
|
|
-// }));
|
|
|
-
|
|
|
-// // console.log('Image config items (new mode):', imageConfigItems.value);
|
|
|
-// } catch (error) {
|
|
|
-// console.error('加载图片配置模板失败:', error);
|
|
|
-// proxy?.$modal.msgError('加载图片配置模板失败: ' + (error as Error).message);
|
|
|
-// imageConfigItems.value = [];
|
|
|
-// }
|
|
|
-// };
|
|
|
// 保存图片配置数据
|
|
|
const saveImageConfigData = async (eventId?: string | number) => {
|
|
|
try {
|
|
|
@@ -749,68 +621,6 @@ const handleTabClick = () => {
|
|
|
// 可以在这里添加标签页切换的逻辑
|
|
|
};
|
|
|
|
|
|
-// 项目数据
|
|
|
-const projectItems = ref<GameEventProjectForm[]>([]);
|
|
|
-// 加载项目数据
|
|
|
-const loadProjectData = async (eventId: string | number) => {
|
|
|
- try {
|
|
|
- const res = await listGameEventProject({
|
|
|
- eventId: eventId === '' ? '' : eventId,
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 1000,
|
|
|
- orderByColumn: '',
|
|
|
- isAsc: ''
|
|
|
- });
|
|
|
- projectItems.value = Array.isArray(res.rows) ? res.rows : [];
|
|
|
- } catch (error) {
|
|
|
- proxy?.$modal.msgError('加载项目数据失败');
|
|
|
- }
|
|
|
-};
|
|
|
-// 添加项目项
|
|
|
-const addProjectItem = () => {
|
|
|
- projectItems.value.push({
|
|
|
- eventId: getEffectiveEventId(),
|
|
|
- projectId: '',
|
|
|
- projectName: '',
|
|
|
- projectType: '',
|
|
|
- remark: '',
|
|
|
- location: '',
|
|
|
- scoreValue: '',
|
|
|
- groupType: ''
|
|
|
- });
|
|
|
-};
|
|
|
-// 删除项目项
|
|
|
-const removeProjectItem = (index: number) => {
|
|
|
- const projectItem = projectItems.value[index];
|
|
|
- if (projectItem.projectId) {
|
|
|
- delGameEventProject(projectItem.projectId).then(() => {
|
|
|
- projectItems.value.splice(index, 1);
|
|
|
- });
|
|
|
- } else {
|
|
|
- projectItems.value.splice(index, 1);
|
|
|
- }
|
|
|
-};
|
|
|
-//保存项目数据
|
|
|
-const saveProjectData = async (eventId: string | number) => {
|
|
|
- try {
|
|
|
- for (const item of projectItems.value) {
|
|
|
- // 确保eventId被正确设置
|
|
|
- const projectData = { ...item, eventId };
|
|
|
-
|
|
|
- if (item.projectId) {
|
|
|
- // 更新现有队伍
|
|
|
- await updateGameEventProject(projectData);
|
|
|
- } else if (item.projectName) {
|
|
|
- // 只有有名称的新队伍才保存
|
|
|
- await addGameEventProject(projectData);
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error('保存赛事项目数据失败:', error);
|
|
|
- throw new Error('保存赛事项目失败');
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
// 配置信息数据
|
|
|
const configItems = ref<GameEventConfigForm[]>([]);
|
|
|
// 配置类型选项
|
|
|
@@ -891,65 +701,6 @@ const saveconfigData = async (eventId: string | number) => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-// 参赛队伍数据
|
|
|
-const teamItems = ref<GameTeamForm[]>([]);
|
|
|
-// 加载队伍数据
|
|
|
-const loadTeamData = async (eventId: string | number) => {
|
|
|
- try {
|
|
|
- const res = await listGameTeam({
|
|
|
- eventId: eventId === '' ? '' : eventId,
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 1000,
|
|
|
- orderByColumn: '',
|
|
|
- isAsc: ''
|
|
|
- });
|
|
|
- teamItems.value = Array.isArray(res.rows) ? res.rows : [];
|
|
|
- } catch (error) {
|
|
|
- proxy?.$modal.msgError('加载队伍数据失败');
|
|
|
- }
|
|
|
-};
|
|
|
-// 添加参赛队伍项
|
|
|
-const addTeamItem = () => {
|
|
|
- teamItems.value.push({
|
|
|
- teamName: '',
|
|
|
- teamCode: '',
|
|
|
- eventId: getEffectiveEventId(),
|
|
|
- teamDescribe: '',
|
|
|
- remark: ''
|
|
|
- });
|
|
|
-};
|
|
|
-// 删除参赛队伍项
|
|
|
-const removeTeamItem = (index: number) => {
|
|
|
- const teamItem = teamItems.value[index];
|
|
|
- if (teamItem.teamId) {
|
|
|
- delGameTeam(teamItem.teamId).then(() => {
|
|
|
- teamItems.value.splice(index, 1);
|
|
|
- });
|
|
|
- } else {
|
|
|
- teamItems.value.splice(index, 1);
|
|
|
- }
|
|
|
-};
|
|
|
-// 保存参赛队伍数据
|
|
|
-const saveTeamData = async (eventId: string | number) => {
|
|
|
- try {
|
|
|
- for (const item of teamItems.value) {
|
|
|
- // 确保eventId被正确设置
|
|
|
- const teamData = { ...item, eventId };
|
|
|
-
|
|
|
- if (item.teamId) {
|
|
|
- // 更新现有队伍
|
|
|
- await updateGameTeam(teamData);
|
|
|
- } else if (item.teamName) {
|
|
|
- // 只有有名称的新队伍才保存
|
|
|
- await addGameTeam(teamData);
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error('保存参赛队伍数据失败:', error);
|
|
|
- throw new Error('保存参赛队伍失败');
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
// 保存赛事信息
|
|
|
const saveEvent = async () => {
|
|
|
try {
|
|
|
@@ -974,30 +725,24 @@ const saveEvent = async () => {
|
|
|
}
|
|
|
|
|
|
// 保存基本信息
|
|
|
- if (isEdit.value) {
|
|
|
- await updateGameEvent(formData);
|
|
|
- savedEventId = route.params.id as string;
|
|
|
- } else {
|
|
|
+ if (!isEdit.value) {
|
|
|
const addRes = await addGameEvent(formData);
|
|
|
// 假设返回的数据中包含新创建的赛事ID
|
|
|
savedEventId = addRes?.data as string;
|
|
|
+ } else {
|
|
|
+ savedEventId = route.params.id as string;
|
|
|
}
|
|
|
-
|
|
|
- // 获取有效的赛事ID用于保存相关数据
|
|
|
- const effectiveEventId = getEffectiveEventId(savedEventId);
|
|
|
-
|
|
|
// 保存图片配置数据
|
|
|
- await saveImageConfigData(effectiveEventId);
|
|
|
+ await saveImageConfigData(savedEventId);
|
|
|
// 保存赛事配置项数据
|
|
|
- await saveconfigData(effectiveEventId);
|
|
|
+ await saveconfigData(savedEventId);
|
|
|
// 保存菜单数据
|
|
|
- await saveMenuData(effectiveEventId);
|
|
|
- // 保存参赛队伍数据
|
|
|
- await saveTeamData(effectiveEventId);
|
|
|
- // 保存赛事项目分组数据
|
|
|
- await saveGroupData(effectiveEventId);
|
|
|
- // 保存赛事项目数据
|
|
|
- await saveProjectData(effectiveEventId);
|
|
|
+ await saveMenuData(savedEventId);
|
|
|
+
|
|
|
+ // 保存基本信息
|
|
|
+ if (isEdit.value) {
|
|
|
+ await updateGameEvent(formData);
|
|
|
+ }
|
|
|
|
|
|
proxy?.$modal.msgSuccess('保存成功');
|
|
|
|