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 0000000..2a13ba2 Binary files /dev/null and b/src/assets/备案图标.png differ diff --git a/src/components/RankContestant.vue b/src/components/RankContestant.vue new file mode 100644 index 0000000..bc72d04 --- /dev/null +++ b/src/components/RankContestant.vue @@ -0,0 +1,221 @@ + + + + + \ 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 @@ -