Files
Web_BLV_OA_Exam_Prod/src/services/api.ts

116 lines
3.5 KiB
TypeScript
Raw Normal View History

import axios from 'axios';
const API_BASE_URL = '/api';
const api = axios.create({
baseURL: API_BASE_URL,
timeout: 10000,
headers: {
'Content-Type': 'application/json',
},
});
// 请求拦截器
api.interceptors.request.use(
(config: any) => {
// 添加管理员token
if (typeof window !== 'undefined') {
const adminToken = localStorage.getItem('survey_admin');
if (adminToken) {
const { token } = JSON.parse(adminToken);
config.headers.Authorization = `Bearer ${token}`;
}
}
return config;
},
(error: any) => {
return Promise.reject(error);
}
);
// 响应拦截器
api.interceptors.response.use(
(response: any) => {
// 如果响应类型是 blob直接返回原始响应
if (response.config.responseType === 'blob') {
return response.data;
}
const { data } = response;
if (data.success) {
return data;
} else {
throw new Error(data.message || '请求失败');
}
},
(error: any) => {
if (error.response?.status === 401) {
// 未授权,清除管理员信息
if (typeof window !== 'undefined') {
localStorage.removeItem('survey_admin');
window.location.href = '/admin/login';
}
}
return Promise.reject(error);
}
);
// 用户相关API
export const userAPI = {
createUser: (data: { name: string; phone: string; password?: string }) => api.post('/users', data),
getUser: (id: string) => api.get(`/users/${id}`),
validateUserInfo: (data: { name: string; phone: string }) => api.post('/users/validate', data),
};
// 题目相关API
export const questionAPI = {
getQuestions: (params?: { type?: string; page?: number; limit?: number }) =>
api.get('/questions', { params }),
getQuestion: (id: string) => api.get(`/questions/${id}`),
createQuestion: (data: any) => api.post('/questions', data),
updateQuestion: (id: string, data: any) => api.put(`/questions/${id}`, data),
deleteQuestion: (id: string) => api.delete(`/questions/${id}`),
importQuestions: (file: File) => {
const formData = new FormData();
formData.append('file', file);
return api.post('/questions/import', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
});
},
exportQuestions: (params?: { type?: string; category?: string }) =>
api.get('/questions/export', {
params,
responseType: 'blob',
headers: {
'Content-Type': 'application/json',
},
}),
};
// 答题相关API
export const quizAPI = {
generateQuiz: (userId: string, subjectId?: string, taskId?: string) =>
api.post('/quiz/generate', { userId, subjectId, taskId }),
submitQuiz: (data: { userId: string; subjectId?: string; taskId?: string; answers: any[] }) =>
api.post('/quiz/submit', data),
getUserRecords: (userId: string, params?: { page?: number; limit?: number }) =>
api.get(`/quiz/records/${userId}`, { params }),
getRecordDetail: (recordId: string) => api.get(`/quiz/records/detail/${recordId}`),
getAllRecords: (params?: { page?: number; limit?: number }) =>
api.get('/quiz/records', { params }),
};
// 管理员相关API
export const adminAPI = {
login: (data: { username: string; password: string }) => api.post('/admin/login', data),
getQuizConfig: () => api.get('/admin/config'),
updateQuizConfig: (data: any) => api.put('/admin/config', data),
getStatistics: () => api.get('/admin/statistics'),
updatePassword: (data: { username: string; oldPassword: string; newPassword: string }) =>
api.put('/admin/password', data),
};
export default api;