This commit is contained in:
2025-06-02 21:06:39 +08:00
parent 7d77a11dee
commit 86c7e52551
9 changed files with 380 additions and 228 deletions

53
src/api/axiosConfig.js Normal file
View File

@@ -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;

View File

@@ -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, // 保持一致

View File

@@ -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;
}
}
};

View File

@@ -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) {