From 93bcb51190ed17efc83205adec1e7791e13a163e Mon Sep 17 00:00:00 2001 From: Kunagisa <1549184870@qq.com> Date: Mon, 26 May 2025 20:35:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B5=9B=E4=BA=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/tournament.js | 286 ++++++ src/assets/备案图标.png | Bin 0 -> 1403 bytes src/components/RankContestant.vue | 221 +++++ src/components/TournamentBracket.vue | 552 +++++++--- src/components/login_module.vue | 2 +- src/components/register_module.vue | 133 +-- src/router/index.js | 26 +- src/utils/http.js | 0 src/views/backend/Dashboard.vue | 3 +- src/views/index.vue | 59 +- src/views/index/AddContestant.vue | 678 +++++++++++++ src/views/index/Competition.vue | 542 ++++++++-- src/views/index/CompetitionDetail.vue | 1326 ++++++++++++++++++++++--- src/views/index/CompetitionSignUp.vue | 518 ++++++++++ src/views/index/WeaponMatch.vue | 693 ++++++++++++- 15 files changed, 4519 insertions(+), 520 deletions(-) create mode 100644 src/api/tournament.js create mode 100644 src/assets/备案图标.png create mode 100644 src/components/RankContestant.vue delete mode 100644 src/utils/http.js create mode 100644 src/views/index/AddContestant.vue create mode 100644 src/views/index/CompetitionSignUp.vue diff --git a/src/api/tournament.js b/src/api/tournament.js new file mode 100644 index 0000000..305a949 --- /dev/null +++ b/src/api/tournament.js @@ -0,0 +1,286 @@ +import axios from 'axios' + +const API_BASE_URL = 'http://zybdatasupport.online:8000' + +// 创建 axios 实例 +const axiosInstance = axios.create({ + baseURL: API_BASE_URL, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'X-Requested-With': 'XMLHttpRequest' + }, + timeout: 10000 +}) + +// 设置请求拦截器,自动添加 token +axiosInstance.interceptors.request.use( + config => { + const token = localStorage.getItem('access_token') + if (token) { + config.headers.Authorization = `bearer ${token}` + } + return config + }, + error => { + return Promise.reject(error) + } +) + +// 添加响应拦截器 +axiosInstance.interceptors.response.use( + response => response, + error => { + if (error.response) { + console.error('请求错误:', { + status: error.response.status, + data: error.response.data, + config: error.config + }) + } else if (error.request) { + console.error('网络错误:', error.request) + } else { + console.error('请求配置错误:', error.message) + } + return Promise.reject(error) + } +) + +/** + * 添加赛事 + * @param {Object} tournamentData - 赛事数据 + * @param {string} tournamentData.name - 赛事名称 + * @param {string} tournamentData.format - 赛事类型(single, double, count) + * @param {string} tournamentData.organizer - 组织者 + * @param {string} tournamentData.qq_code - QQ号 + * @param {string} tournamentData.status - 状态(prepare, finish, starting) + * @param {string} tournamentData.start_time - 开始时间(格式年/月/日,例2025/05/24) + * @param {string} tournamentData.end_time - 结束时间(格式年/月/日,例2025/05/24) + * @returns {Promise} 返回添加赛事的响应数据 + */ +export const addTournament = async (tournamentData) => { + try { + const response = await axiosInstance.post('/tournament/add', tournamentData) + return response.data + } catch (error) { + console.error('添加赛事失败:', { + status: error.response?.status, + data: error.response?.data, + message: error.message + }) + throw error + } +} + +/** + * 获取赛事列表 + * @returns {Promise} 返回赛事列表数据 + */ +export const getTournamentList = async () => { + try { + const response = await axiosInstance.get('/tournament/getlist') + return response.data + } catch (error) { + console.error('获取赛事列表失败:', { + status: error.response?.status, + data: error.response?.data, + message: error.message + }) + throw error + } +} + + +// 更新赛事 +export const updateTournament = async (id, data) => { + try { + console.log('更新赛事,发送数据:', data) + const response = await axiosInstance.put(`/tournament/update/${id}`, { + name: data.name, + format: data.format, + organizer: data.organizer, + qq_code: data.qq_code, + start_time: data.start_time, + end_time: data.end_time, + status: data.status + }) + return response.data + } catch (error) { + console.error('更新赛事失败:', error) + if (error.response) { + console.error('错误详情:', { + status: error.response.status, + data: error.response.data, + headers: error.response.headers, + config: error.config + }) + // 如果有详细的错误信息,抛出它 + if (error.response.data?.detail) { + throw new Error(error.response.data.detail) + } + } + throw error + } +} + +// 删除赛事 +export const deleteTournament = async (id) => { + try { + const response = await axiosInstance.delete(`/tournament/delete/${id}`) + return response.data + } catch (error) { + console.error('删除赛事失败:', error) + throw error + } +} + + +// 添加报名结果 +export const addSignUpResult = async (data) => { + try { + const response = await axiosInstance.post('/tournament/signup_result/add', { + tournament_id: parseInt(data.tournament_id), + tournament_name: data.tournament_name, + team_name: data.team_name, + sign_name: data.sign_name.trim(), + win: '0', + lose: '0', + status: 'tie' + }) + return response.data + } catch (error) { + console.error('请求错误:', error) + if (error.response?.data?.detail) { + throw new Error(error.response.data.detail) + } + throw error + } +} + +// 获取参赛结果列表 +export const getSignUpResultList = async () => { + try { + const response = await axiosInstance.get('/tournament/signup_result/getlist') + return response.data + } catch (error) { + console.error('获取参赛结果列表失败:', { + status: error.response?.status, + data: error.response?.data, + message: error.message + }) + throw error + } +} + +// 更新参赛结果 +export const updateSignUpResult = async (id, data) => { + try { + // 更新报名信息 + console.log('更新报名信息...') + await axiosInstance.put(`/tournament/signup/update/${id}`, { + tournament_id: parseInt(data.tournament_id), + type: data.team_name ? 'teamname' : 'individual', + teamname: data.team_name || '', + faction: data.faction || 'random', + username: data.sign_name, + qq: data.qq || '' + }) + console.log('报名信息更新成功') + // 更新报名结果 + console.log('更新报名结果...') + await axiosInstance.put(`/tournament/signup_result/update/${id}`, { + tournament_id: parseInt(data.tournament_id), + tournament_name: data.tournament_name, + team_name: data.team_name || null, + sign_name: data.sign_name, + win: data.win || '0', + lose: data.lose || '0', + status: data.status || 'tie' + }) + console.log('报名结果更新成功') + + return { success: true } + } catch (error) { + console.error('更新参赛结果失败:', { + status: error.response?.status, + data: error.response?.data, + message: error.message + }) + throw error + } +} + +// 删除参赛选手 +export const deleteSignUpResult = async (id) => { + try { + // 删除报名结果 + console.log('删除报名结果...') + await axiosInstance.delete(`/tournament/signup_result/delete/${id}`) + console.log('报名结果删除成功') + + // 删除报名信息 + console.log('删除报名信息...') + await axiosInstance.delete(`/tournament/signup/delete/${id}`) + console.log('报名信息删除成功') + + return { success: true } + } catch (error) { + console.error('删除参赛选手失败:', { + status: error.response?.status, + data: error.response?.data, + message: error.message + }) + throw error + } +} + +// 添加报名 +export const addSignUp = async (data) => { + try { + console.log('开始报名流程,数据:', data) + + // 调用报名 API + console.log('调用报名 API...') + await axiosInstance.post('/tournament/signup/add', { + tournament_id: data.id, + type: data.type, + teamname: data.team_name || '', + faction: data.faction || 'random', + username: data.sign_name, + qq: data.qq || '' + }) + console.log('报名 API 调用成功') + + // 调用报名结果 API + console.log('调用报名结果 API...') + await axiosInstance.post('/tournament/signup_result/add', { + tournament_id: data.id, + tournament_name: data.tournament_name, + team_name: data.team_name || null, + sign_name: data.sign_name, + win: '0', + lose: '0', + status: 'tie' + }) + console.log('报名结果 API 调用成功') + + return { + signup: { success: true }, + result: { success: true } + } + } catch (error) { + console.error('报名请求错误:', { + message: error.message, + response: error.response?.data, + status: error.response?.status, + config: error.config + }) + + // 如果是服务器返回的错误信息,直接使用 + if (error.response?.data?.detail) { + throw new Error(error.response.data.detail) + } + // 其他错误,包装成更友好的错误信息 + throw new Error('报名失败,请检查网络连接后重试') + } +} \ No newline at end of file diff --git a/src/assets/备案图标.png b/src/assets/备案图标.png new file mode 100644 index 0000000000000000000000000000000000000000..2a13ba2f4b92c4b531945a66e3e35e3ead3739f9 GIT binary patch literal 1403 zcmV->1%&#EP)OmFb0;G+d=2euy)cVjh{yJKZrd}noklB1~I~M zd*Iw5A@r@E47IO}f%*@p@Jx)Mdh7(KwK9h?&H%c+rbB*i1aRDTI20QU&l)3V6a5Y9 zt}ZYoLj`MYk|T#A7~w_+L-y{4&}u&!WZY<|pJEIR0yEx1Uj3A};EwJdNrUZFkX8l* zHzEMS!$N`e#$JPgJ~RCcs?G=sAOmNu899?20~{9tS;_A3OOz#4aigG2I0I^r2|!us z49#&4Q2mAxbnlo4RX29P@XC_nqk&1>K&!}%*3Y1(+}IODb9^2n#p&U|879DXA0K#D zWCyt`&7s8h9jNo01F|3+kc$^U!+v{Uts5b9lQ(c&C=}=KgZ_()Kvj4+ML&aNKZx6i zJl2Yl2ju}^YI__;juOLFM+@kT5@VldO3ezHkB9?S>Aj#VY+}m;B$XP?? zxN%T4$p}iOy$+QxG_IHqmA13M-@p>M@nKM&69R)Z0ie9J2DDXslk_!c&n?oFu$Yn7 z)OEmWd?Ds=G7Nu8xDmcQZUZ=ta{}+lt6?nX2^_cOg%H>o76q))6WX$Q%Ja*it2DIe z|DeAVq%H{`B+^svj5H*;g7T;U9#)8bLc4Yg{E`D zE~35ntsT+-p#J;&bICyKE=GE!LC~7x1**#)pvmVcFRlhnp%?Eb7f_t|7@BnlgS21q z;L&<@v{ioaNVSuvIdXyMe-LZ0G$Ng{n4?6MC+sKcE2|iJSmp*j*H(ija|LL1*N8fO z84Rzqr_=+~1y0ae?gQP5-7Tb7eL9>l7HL5AKj`-(OAee!Dq=i5$<0XHZ-^q*rG&^& zI@b_onyZSavqhjd_h|{~$QS34uIl3li8MWWDPfVifXF`&_zeY2VF9#&n4 +
+
+

选手排名

+
+
+
+
+
+ {{ item.rank }} +
+
+
{{ item.username }}
+
{{ item.faction }}
+
{{ item.score }}
+
+
+
+
+
+
{{ item.rank }}
+
+
{{ item.username }}
+
{{ item.faction }}
+
{{ item.score }}
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/src/components/TournamentBracket.vue b/src/components/TournamentBracket.vue index dcd3b2a..bf6df04 100644 --- a/src/components/TournamentBracket.vue +++ b/src/components/TournamentBracket.vue @@ -1,204 +1,436 @@ -