diff --git a/src/api/axiosConfig.js b/src/api/axiosConfig.js new file mode 100644 index 0000000..472849e --- /dev/null +++ b/src/api/axiosConfig.js @@ -0,0 +1,53 @@ +import axios from 'axios'; +import { logoutUser } from '../utils/jwt'; // logoutUser会处理清除存储和重定向 + +const API_BASE_URL = 'http://zybdatasupport.online:8000'; + +const axiosInstance = axios.create({ + baseURL: API_BASE_URL, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'X-Requested-With': 'XMLHttpRequest' + }, + timeout: 10000 +}); + +// 请求拦截器 +axiosInstance.interceptors.request.use( + config => { + const token = localStorage.getItem('access_token'); + const url = config.url; + + // 定义不需要Token的接口条件 + const noAuthRequired = + url === '/user/login' || + url === '/user/register' || // 明确添加注册接口 + url.endsWith('/getlist'); + + if (token && !noAuthRequired) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + error => { + return Promise.reject(error); + } +); + +// 响应拦截器 +axiosInstance.interceptors.response.use( + response => response, + error => { + const originalRequest = error.config; + + // 如果收到401错误,并且不是来自登录请求本身 + if (error.response && error.response.status === 401 && originalRequest.url !== '/user/login') { + logoutUser(); // 调用简化的logoutUser,它只清除token,不导航 + } + // 不需要额外的console.error,错误会自然地在调用处被捕获或显示在网络请求中 + return Promise.reject(error); + } +); + +export default axiosInstance; \ No newline at end of file diff --git a/src/api/demands.js b/src/api/demands.js index 5d4fcca..776125e 100644 --- a/src/api/demands.js +++ b/src/api/demands.js @@ -1,50 +1,4 @@ -import axios from 'axios'; - -const API_BASE_URL = 'http://zybdatasupport.online:8000'; // 与 tournament.js 一致 - -// 创建 axios 实例,可以复用 tournament.js 中的拦截器逻辑,或者单独设置 -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('API请求错误 (demands.js):', { - status: error.response.status, - data: error.response.data, - config: error.config - }); - } else if (error.request) { - console.error('网络错误 (demands.js):', error.request); - } else { - console.error('请求配置错误 (demands.js):', error.message); - } - return Promise.reject(error); - } -); +import axiosInstance from './axiosConfig'; /** * 获取需求列表 @@ -94,18 +48,9 @@ export const addDemand = async (demandData) => { */ export const updateDemand = async (id, dataToUpdate) => { try { - // 根据后端PUT /demands/update/{id} 的定义,它期望整个DemandModel作为item - // 但只更新了 sendcontent。为安全起见,先获取原始数据,再更新。 - // 或者,如果API设计为只接受要修改的字段,则直接发送 { sendcontent: dataToUpdate.sendcontent } - // 这里假设API会处理部分更新,或者前端会发送完整的模型(即使只改一个字段) - // 为简单起见,我们先假设API能接受只包含sendcontent的更新,或者前端需要先获取完整模型再提交 - // 参照后端 item: DemandModel, 它会接收一个完整的模型,但仅使用了 item.sendcontent - // 因此,我们需要传递一个至少包含 sendcontent 的对象,但为了模型验证,最好是完整的模型结构 const payload = { sendcontent: dataToUpdate.sendcontent, // 根据 DemandModel,补齐其他必填或可选字段,即使它们不被后端 update 逻辑使用 - // 这部分需要参照 DemandModel 的具体定义来决定哪些字段是必要的 - // 以下为推测,需要根据实际 DemandModel 调整 requester: dataToUpdate.requester || '', qq_code: dataToUpdate.qq_code || '', content: dataToUpdate.sendcontent, // 保持一致 diff --git a/src/api/login.js b/src/api/login.js index 2275850..c346993 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,80 +1,75 @@ -import axios from 'axios' +import axiosInstance from './axiosConfig'; +import { loginSuccess } from '../utils/jwt'; -const API_BASE_URL = 'http://zybdatasupport.online:8000' +// 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 // 添加超时设置 -}) +// // 创建 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) - } -) +// // 设置请求拦截器,自动添加 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) - } -) +// // 添加响应拦截器 // 不再需要 +// 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) +// } +// ) export const userLogin = async (username, password, server, token) => { try { - console.log('登录请求参数:', { username, password, server, token }) + // console.log('登录请求参数:', { username, password, server, token }); // 保留此调试日志以备将来使用,或按需移除 const response = await axiosInstance.post('/user/login', { username, password, server, token - }) + }); - // 保存 token 到 localStorage if (response.data.access_token) { - localStorage.setItem('access_token', response.data.access_token) + loginSuccess(response.data.access_token, username); // 使用 username 作为 userId } - return response.data + return response.data; } catch (error) { - console.error('登录失败:', { - status: error.response?.status, - data: error.response?.data, - message: error.message, - config: error.config - }) - throw error + // 错误将由响应拦截器统一处理和记录,这里可以直接抛出 + throw error; } -} +}; export const userRegister = async (qq_code, password, server, token) => { try { @@ -83,20 +78,14 @@ export const userRegister = async (qq_code, password, server, token) => { password, server, token - } - console.log('注册请求URL:', `${API_BASE_URL}/user/register/`) + }; + // console.log('注册请求参数:', requestData); // 保留此调试日志以备将来使用,或按需移除 - const response = await axiosInstance.post('/user/register', requestData) - console.log('注册响应数据:', response.data) - return response.data + const response = await axiosInstance.post('/user/register', requestData); + // console.log('注册响应数据:', response.data); // 保留此调试日志以备将来使用,或按需移除 + return response.data; } catch (error) { - console.error('注册请求失败:', { - status: error.response?.status, - data: error.response?.data, - message: error.message, - url: error.config?.url - }) - throw error + throw error; } -} +}; diff --git a/src/api/tournament.js b/src/api/tournament.js index 305a949..5cf7a1c 100644 --- a/src/api/tournament.js +++ b/src/api/tournament.js @@ -1,50 +1,50 @@ -import axios from 'axios' +import axiosInstance from './axiosConfig'; -const API_BASE_URL = 'http://zybdatasupport.online:8000' +// 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 -}) +// // 创建 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) - } -) +// // 设置请求拦截器,自动添加 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) - } -) +// // 添加响应拦截器 // 不再需要 +// 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) +// } +// ) /** * 添加赛事 @@ -175,17 +175,18 @@ export const getSignUpResultList = async () => { // 更新参赛结果 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/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}`, { @@ -217,11 +218,11 @@ export const deleteSignUpResult = async (id) => { console.log('删除报名结果...') await axiosInstance.delete(`/tournament/signup_result/delete/${id}`) console.log('报名结果删除成功') - - // 删除报名信息 - console.log('删除报名信息...') - await axiosInstance.delete(`/tournament/signup/delete/${id}`) - console.log('报名信息删除成功') + + // // 删除报名信息 (这部分逻辑根据您的要求被注释掉) + // console.log('删除报名信息...') + // await axiosInstance.delete(`/tournament/signup/delete/${id}`) + // console.log('报名信息删除成功') return { success: true } } catch (error) { diff --git a/src/components/backend/PlayerForm.vue b/src/components/backend/PlayerForm.vue index 6d52c80..9b432b9 100644 --- a/src/components/backend/PlayerForm.vue +++ b/src/components/backend/PlayerForm.vue @@ -64,7 +64,7 @@