athlete.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <template>
  2. <div class="game-event-athlete">
  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. <el-form ref="athleteFormRef" :model="athleteForm" :rules="athleteRules" label-width="80px">
  11. <el-row :gutter="20">
  12. <el-col :span="12">
  13. <el-form-item label="赛事" prop="eventName">
  14. <el-input v-model="athleteForm.eventName" disabled />
  15. </el-form-item>
  16. </el-col>
  17. <el-col :span="12">
  18. <el-form-item label="单位" prop="unit">
  19. <el-input v-model="athleteForm.unit" placeholder="输入单位" />
  20. </el-form-item>
  21. </el-col>
  22. </el-row>
  23. <el-row :gutter="20">
  24. <el-col :span="12">
  25. <el-form-item label="姓名" prop="name">
  26. <el-input v-model="athleteForm.name" placeholder="输入姓名" />
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="12">
  30. <el-form-item label="编号" prop="athleteCode">
  31. <el-input v-model="athleteForm.athleteCode" placeholder="输入号码" />
  32. </el-form-item>
  33. </el-col>
  34. </el-row>
  35. <el-row :gutter="20">
  36. <el-col :span="12">
  37. <el-form-item label="年龄" prop="age">
  38. <el-input-number v-model="athleteForm.age" :min="0" />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="12">
  42. <el-form-item label="性别" prop="gender">
  43. <el-radio-group v-model="athleteForm.gender">
  44. <el-radio value="0">男</el-radio>
  45. <el-radio value="1">女</el-radio>
  46. </el-radio-group>
  47. </el-form-item>
  48. </el-col>
  49. </el-row>
  50. <el-row :gutter="20">
  51. <el-col :span="24">
  52. <el-form-item label="赛事项目" prop="projectValue">
  53. <el-transfer
  54. v-model="athleteForm.projectValue"
  55. :data="allProjects"
  56. :titles="['可选项目', '已选项目']"
  57. />
  58. </el-form-item>
  59. </el-col>
  60. </el-row>
  61. <el-form-item>
  62. <el-button @click="goBack">取消</el-button>
  63. <el-button type="primary" @click="submitForm">提交</el-button>
  64. </el-form-item>
  65. </el-form>
  66. </el-card>
  67. </div>
  68. </template>
  69. <script setup name="GameEventAthlete" lang="ts">
  70. import { ref, reactive, onMounted } from 'vue';
  71. import { useRouter, useRoute } from 'vue-router';
  72. import { ElMessage } from 'element-plus';
  73. import { listGameEventProject } from '@/api/system/gameEventProject';
  74. import { addGameAthlete } from '@/api/system/gameAthlete';
  75. import { GameAthleteForm } from '@/api/system/gameAthlete/types';
  76. const router = useRouter();
  77. const route = useRoute();
  78. const athleteFormRef = ref<any>(null);
  79. const athleteForm = reactive({
  80. eventId: route.params.eventId as string,
  81. eventName: '',
  82. name: '',
  83. athleteCode: '',
  84. unit: '',
  85. age: 0,
  86. gender: '',
  87. projectValue: [] as string[] // 确保初始化为数组
  88. });
  89. const athleteRules = {
  90. name: [
  91. { required: true, message: '请输入姓名', trigger: 'blur' }
  92. ],
  93. athleteCode: [
  94. { required: true, message: '请输入号码', trigger: 'blur' }
  95. ],
  96. age: [
  97. { required: true, message: '请输入年龄', trigger: 'blur' }
  98. ]
  99. };
  100. const allProjects = ref<{ key: string; label: string }[]>([]);
  101. onMounted(async () => {
  102. const eventName = route.params.eventName as string;
  103. athleteForm.eventName = eventName;
  104. // 加载赛事项目数据
  105. await loadProjects();
  106. });
  107. const loadProjects = async () => {
  108. // console.log(route.params.eventId);
  109. const res = await listGameEventProject({
  110. eventId: route.params.eventId as string,
  111. pageNum: 1,
  112. pageSize: 100
  113. });
  114. allProjects.value = res.rows.map(item => ({
  115. key: String(item.projectId),
  116. label: `${item.projectName}`
  117. }));
  118. };
  119. const goBack = () => {
  120. router.go(-1);
  121. };
  122. const submitForm = () => {
  123. athleteFormRef.value.validate(async (valid: boolean) => {
  124. if (valid) {
  125. // 准备提交的数据
  126. let projectValue = athleteForm.projectValue;
  127. // if (!Array.isArray(projectValue)) { // 检查 projectValue 是否为数组
  128. // projectValue = [];
  129. // }
  130. const submitData: GameAthleteForm = {
  131. eventId: route.params.eventId as string,
  132. name: athleteForm.name,
  133. unit: athleteForm.unit,
  134. athleteCode: athleteForm.athleteCode,
  135. age: athleteForm.age,
  136. gender: athleteForm.gender,
  137. projectValue: `${projectValue.join(',')}`, // 安全地进行 join 操作
  138. };
  139. console.log(athleteForm.projectValue);
  140. try {
  141. // 保存数据到game_athlete表
  142. await addGameAthlete(submitData);
  143. ElMessage.success('提交成功');
  144. goBack();
  145. } catch (error) {
  146. ElMessage.error('提交失败');
  147. console.error('提交失败:', error);
  148. }
  149. }
  150. });
  151. };
  152. </script>
  153. <style scoped lang="scss">
  154. .game-event-athlete {
  155. .page-header {
  156. display: flex;
  157. align-items: center;
  158. .page-title {
  159. margin-left: 10px;
  160. font-size: 16px;
  161. }
  162. }
  163. }
  164. </style>