You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

209 lines
5.3 KiB

/**
* API服务模块
* 处理前后端通信
*/
const API_BASE_URL = 'http://192.168.1.75:8080/api'; // API基础路径
const TOKEN_KEY = 'auth_token'; // Token存储键名
/**
* 获取存储的Token
* @returns {string|null} - 返回Token或null
*/
function getToken() {
return localStorage.getItem(TOKEN_KEY);
}
/**
* 设置Token
* @param {string} token - Token字符串
*/
function setToken(token) {
localStorage.setItem(TOKEN_KEY, token);
}
/**
* 清除Token
*/
function clearToken() {
localStorage.removeItem(TOKEN_KEY);
}
/**
* 基础请求函数
* @param {string} url - 请求路径
* @param {Object} options - 请求选项
* @returns {Promise} - 返回Promise对象
*/
async function request(url, options = {}) {
try {
// 构建完整的请求URL
const fullUrl = `${API_BASE_URL}${url}`;
// 设置默认请求头
const headers = {
'Content-Type': 'application/json',
...options.headers
};
// 获取Token并添加到请求头(登录接口除外)
const token = getToken();
if (token && !url.includes('/auth/login')) {
headers['Authorization'] = `Bearer ${token}`;
console.log('使用Token发送请求:', url);
console.log('Token:', token);
}
// 发送请求
const response = await fetch(fullUrl, {
...options,
headers
});
// 检查响应状态
if (!response.ok) {
// 如果是401错误,清除Token并提示重新登录
if (response.status === 401) {
clearToken();
throw new Error('登录已过期,请重新登录');
}
const errorData = await response.json().catch(() => ({}));
throw new Error(errorData.message || `请求失败: ${response.status}`);
}
// 解析响应数据
return await response.json();
} catch (error) {
console.error('API请求错误:', error);
throw error;
}
}
/**
* 认证相关API
*/
const authApi = {
/**
* 用户登录
* @param {Object} data - 登录数据
* @param {string} data.mobile - 手机号
* @param {string} data.password - 密码
* @returns {Promise} - 返回登录结果
*/
login: async (data) => {
return request('/auth/login', {
method: 'POST',
body: JSON.stringify(data)
});
},
/**
* 用户注册
* @param {Object} data - 注册数据
* @param {number} data.companyId - 公司ID
* @param {number} data.deptId - 部门ID
* @param {number} data.positionId - 职位ID
* @param {string} data.empName - 姓名
* @param {string} data.mobile - 手机号
* @param {string} data.password - 密码
* @param {string} data.captcha - 验证码
* @returns {Promise} - 返回注册结果
*/
register: async (data) => {
return request('/auth/register', {
method: 'POST',
body: JSON.stringify(data)
});
},
/**
* 获取验证码
* @returns {Promise} - 返回验证码数据
*/
getCaptcha: async () => {
return request('/captcha', {
method: 'GET'
});
}
};
/**
* 数据模型相关API
*/
const modelApi = {
/**
* 获取模型列表
* @param {string} modelName - 模型名称
* @param {Object} params - 查询参数
* @returns {Promise} - 返回模型列表
*/
getList: async (modelName, params = {}) => {
// 构建查询字符串
const queryString = new URLSearchParams(params).toString();
const url = `/models/${modelName}${queryString ? `?${queryString}` : ''}`;
return request(url);
},
/**
* 获取模型详情
* @param {string} modelName - 模型名称
* @param {number} id - 模型ID
* @returns {Promise} - 返回模型详情
*/
getDetail: async (modelName, id) => {
return request(`/models/${modelName}/${id}`);
},
/**
* 创建模型
* @param {string} modelName - 模型名称
* @param {Object} data - 模型数据
* @returns {Promise} - 返回创建结果
*/
create: async (modelName, data) => {
return request(`/models/${modelName}`, {
method: 'POST',
body: JSON.stringify(data)
});
},
/**
* 更新模型
* @param {string} modelName - 模型名称
* @param {number} id - 模型ID
* @param {Object} data - 模型数据
* @returns {Promise} - 返回更新结果
*/
update: async (modelName, id, data) => {
return request(`/models/${modelName}/${id}`, {
method: 'PUT',
body: JSON.stringify(data)
});
},
/**
* 删除模型
* @param {string} modelName - 模型名称
* @param {number} id - 模型ID
* @returns {Promise} - 返回删除结果
*/
delete: async (modelName, id) => {
return request(`/models/${modelName}/${id}`, {
method: 'DELETE'
});
}
};
// 导出API服务
const API = {
auth: authApi,
model: modelApi,
request, // 导出基础请求函数,方便扩展
// Token管理方法
getToken,
setToken,
clearToken
};
// 导出为全局变量
window.API = API;