后台
This commit is contained in:
53
src/api/axiosConfig.js
Normal file
53
src/api/axiosConfig.js
Normal 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;
|
||||
@@ -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, // 保持一致
|
||||
|
||||
133
src/api/login.js
133
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;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user