detail.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <div class="game-event-detail">
  3. <el-card shadow="never">
  4. <template #header>
  5. <div class="page-header">
  6. <el-button @click="goBack" icon="ArrowLeft">返回</el-button>
  7. <span class="page-title">赛事详情</span>
  8. </div>
  9. </template>
  10. <!-- 上部分:赛事信息 -->
  11. <el-card class="mb-4" shadow="never">
  12. <template #header>
  13. <div class="event-header">
  14. <h3>赛事信息</h3>
  15. </div>
  16. </template>
  17. <el-row :gutter="20">
  18. <el-col :span="12">
  19. <el-descriptions :column="1" border>
  20. <el-descriptions-item label="赛事编号">{{ eventData.eventCode }}</el-descriptions-item>
  21. <el-descriptions-item label="赛事名称">{{ eventData.eventName }}</el-descriptions-item>
  22. <el-descriptions-item label="赛事类型">
  23. <dict-tag :options="game_event_type" :value="eventData.eventType" />
  24. </el-descriptions-item>
  25. <el-descriptions-item label="举办地点">{{ eventData.location }}</el-descriptions-item>
  26. </el-descriptions>
  27. </el-col>
  28. <el-col :span="12">
  29. <el-descriptions :column="1" border>
  30. <el-descriptions-item label="开始时间">{{ parseTime(eventData.startTime, '{y}-{m}-{d}') }} </el-descriptions-item>
  31. <el-descriptions-item label="结束时间">{{ parseTime(eventData.endTime, '{y}-{m}-{d}') }} </el-descriptions-item>
  32. <el-descriptions-item label="举办单位">{{ eventData.unit }}</el-descriptions-item>
  33. <el-descriptions-item label="状态">
  34. <dict-tag :options="game_event_status" :value="eventData.status" />
  35. </el-descriptions-item>
  36. </el-descriptions>
  37. </el-col>
  38. </el-row>
  39. <!-- <el-row :gutter="20" class="mt-4">
  40. <el-col :span="24">
  41. <el-descriptions :column="1" border>
  42. <el-descriptions-item label="备注" label-width="10%">{{ eventData.remark }}</el-descriptions-item>
  43. </el-descriptions>
  44. </el-col>
  45. </el-row> -->
  46. </el-card>
  47. <!-- 下部分:赛事项目分组信息 -->
  48. <el-card shadow="never">
  49. <template #header>
  50. <div class="project-header">
  51. <h3>赛事项目</h3>
  52. </div>
  53. </template>
  54. <el-table :data="projectData" border>
  55. <el-table-column label="项目类型" prop="projectType" align="center">
  56. <template #default="scope">
  57. <dict-tag :options="game_project_type" :value="scope.row.projectType" />
  58. </template>
  59. </el-table-column>
  60. <el-table-column label="项目名称" prop="projectName" align="center" />
  61. <!-- <el-table-column label="项目组别" prop="groupType" align="center" /> -->
  62. <el-table-column label="比赛场地" prop="location" align="center" />
  63. <el-table-column label="开始时间" prop="startTime" align="center" width="180">
  64. <template #default="scope">
  65. {{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}
  66. </template>
  67. </el-table-column>
  68. <el-table-column label="结束时间" prop="endTime" align="center" width="180">
  69. <template #default="scope">
  70. {{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}
  71. </template>
  72. </el-table-column>
  73. <el-table-column label="参赛组数" prop="groupNum" align="center" />
  74. <el-table-column label="参赛人数" prop="participateNum" align="center" />
  75. <el-table-column label="状态" prop="status" align="center">
  76. <template #default="scope">
  77. <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
  78. </template>
  79. </el-table-column>
  80. </el-table>
  81. </el-card>
  82. </el-card>
  83. </div>
  84. </template>
  85. <script setup name="GameEventDetail" lang="ts">
  86. import { ref, onMounted } from 'vue';
  87. import { useRoute, useRouter } from 'vue-router';
  88. import { getGameEvent } from '@/api/system/gameEvent';
  89. import { listGameEventProject } from '@/api/system/gameEventProject';
  90. import { GameEventVO } from '@/api/system/gameEvent/types';
  91. import { GameEventProjectVO } from '@/api/system/gameEventProject/types';
  92. import { parseTime } from '@/utils/ruoyi';
  93. const route = useRoute();
  94. const router = useRouter();
  95. // 获取字典数据
  96. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  97. const { game_event_type, game_event_status, sys_normal_disable, game_project_type } = toRefs<any>(
  98. proxy?.useDict('game_event_type', 'game_event_status', 'sys_normal_disable', 'game_project_type')
  99. );
  100. // 赛事数据
  101. const eventData = ref<GameEventVO>({
  102. eventId: '',
  103. eventCode: '',
  104. eventName: '',
  105. eventType: '',
  106. location: '',
  107. purpose: '',
  108. startTime: '',
  109. endTime: '',
  110. eventUrl: '',
  111. eventUrlUrl: '',
  112. refereeUrl: '',
  113. refereeUrlUrl: '',
  114. registerUrl: '',
  115. registerUrlUrl: '',
  116. unit: '',
  117. isDefault: '',
  118. status: '',
  119. remark: '',
  120. limitApplication: 0
  121. });
  122. // 项目数据
  123. const projectData = ref<GameEventProjectVO[]>([]);
  124. // 返回上一页
  125. const goBack = () => {
  126. router.go(-1);
  127. };
  128. // 加载赛事详情
  129. const loadEventData = async (eventId: string) => {
  130. try {
  131. const res = await getGameEvent(eventId);
  132. eventData.value = res.data;
  133. } catch (error) {
  134. proxy?.$modal.msgError('加载赛事信息失败');
  135. }
  136. };
  137. // 加载赛事项目
  138. const loadProjectData = async (eventId: string) => {
  139. try {
  140. const res = await listGameEventProject({
  141. eventId: eventId,
  142. pageNum: 1,
  143. pageSize: 1000,
  144. orderByColumn: undefined,
  145. isAsc: undefined
  146. });
  147. projectData.value = res.rows;
  148. } catch (error) {
  149. proxy?.$modal.msgError('加载赛事项目失败');
  150. }
  151. };
  152. onMounted(async () => {
  153. const eventId = route.params.eventId as string;
  154. if (eventId) {
  155. await loadEventData(eventId);
  156. await loadProjectData(eventId);
  157. }
  158. });
  159. </script>
  160. <style scoped lang="scss">
  161. .game-event-detail {
  162. .page-header {
  163. display: flex;
  164. align-items: center;
  165. .page-title {
  166. margin-left: 10px;
  167. font-size: 16px;
  168. font-weight: bold;
  169. }
  170. }
  171. .event-header h3,
  172. .project-header h3 {
  173. margin: 0;
  174. font-size: 16px;
  175. font-weight: bold;
  176. }
  177. .mb-4 {
  178. margin-bottom: 1rem;
  179. }
  180. .mt-4 {
  181. margin-top: 1rem;
  182. }
  183. }
  184. </style>