ce4f05b60f
- 更新登录响应模拟数据以匹配真实的AppLoginVo结构 - 添加认证客户端租户和授权字段验证 - 增加操作码枚举验证测试用例 - 移除对旧token别名的兼容性测试 - 修复测试用例中的短信验证码长度一致性问题 - 更新区域接口路径为PC专用路径 - 调整分片上传接口参数以符合新契约定义 refactor(api): 重构API客户端实现以严格遵循YAML契约 - 添加认证操作码和短信操作码枚举验证 - 实现严格的token响应解析只接受access_token字段 - 使用pickDefined函数过滤请求体中未定义的字段 - 重构认证接口参数映射以符合契约定义 - 更新区域接口路径为PC专用路径/genealogy/pc/region/* - 优化分片上传接口参数结构与契约保持一致 - 添加操作码枚举验证函数toRequiredOperationCode - 实现请求体字段选择性提取功能 feat(auth): 优化认证页面的验证码处理流程 - 添加takeCaptchaToken函数用于一次性获取验证码票据 - 更新短信验证码长度验证从4-6位改为精确4位 - 在登录和密码重置流程中集成验证码票据处理 - 修复验证码发送后票据清理逻辑 - 更新HTML模板中的验证码输入字段属性 chore(config): 提取常量配置并扩展配置对象结构 - 将客户端ID、租户ID和令牌键提取为常量 - 扩展配置对象返回客户端配置信息 - 更新配置测试用例以验证新增配置项 docs(planning): 更新PC接口对接规划文档 - 更新契约源说明以反映YAML冻结契约 - 添加YAML与在线Apifox复核对比内容 - 更新阻断项状态表格 - 修订登录响应token字段处理规范 - 更新文件上传和行政区划接口规范说明 style(profile): 优化相册管理页面的文件上传交互 - 将封面和照片OSS ID输入改为隐藏字段 - 添加文件选择标签以改善用户体验 - 移除手动输入OSS ID的选项保持界面简洁
122 lines
3.4 KiB
JavaScript
122 lines
3.4 KiB
JavaScript
(function (root, factory) {
|
|
// Axios 请求工具同时支持浏览器页面和 Node 单元测试加载。
|
|
if (typeof module === 'object' && module.exports) {
|
|
module.exports = factory(root);
|
|
return;
|
|
}
|
|
|
|
root.AxiosRequestUtil = factory(root);
|
|
})(typeof globalThis !== 'undefined' ? globalThis : window, function (root) {
|
|
'use strict';
|
|
|
|
function isFormData(body) {
|
|
return typeof FormData !== 'undefined' && body instanceof FormData;
|
|
}
|
|
|
|
function createHttpError(message, detail) {
|
|
var error = new Error(message);
|
|
|
|
Object.keys(detail || {}).forEach(function (key) {
|
|
error[key] = detail[key];
|
|
});
|
|
|
|
return error;
|
|
}
|
|
|
|
function unwrapResponse(payload) {
|
|
if (!payload || typeof payload !== 'object') return payload;
|
|
|
|
if (payload.code !== undefined && Number(payload.code) !== 200) {
|
|
throw createHttpError(payload.msg || '接口请求失败', {
|
|
code: payload.code,
|
|
response: payload
|
|
});
|
|
}
|
|
|
|
if (Object.prototype.hasOwnProperty.call(payload, 'data')) return payload.data;
|
|
if (Object.prototype.hasOwnProperty.call(payload, 'rows')) {
|
|
return {
|
|
rows: payload.rows,
|
|
total: payload.total
|
|
};
|
|
}
|
|
|
|
return payload;
|
|
}
|
|
|
|
function getAxiosInstance(options) {
|
|
var settings = options || {};
|
|
var axios = settings.axiosInstance || root.axios;
|
|
|
|
if (!axios || typeof axios.request !== 'function' && typeof axios.create !== 'function') {
|
|
throw new Error('缺少 Axios 公共依赖');
|
|
}
|
|
|
|
if (typeof axios.create === 'function') {
|
|
return axios.create({
|
|
baseURL: settings.baseUrl
|
|
});
|
|
}
|
|
|
|
return axios;
|
|
}
|
|
|
|
function createRequester(options) {
|
|
var settings = options || {};
|
|
var axiosInstance = getAxiosInstance(settings);
|
|
|
|
function handleUnauthorized(status) {
|
|
if (Number(status) === 401 && settings.onUnauthorized) settings.onUnauthorized();
|
|
}
|
|
|
|
return async function request(method, path, requestOptions) {
|
|
var req = requestOptions || {};
|
|
var headers = Object.assign({}, req.headers || {});
|
|
var token = settings.getToken ? settings.getToken() : '';
|
|
var tokenHeaderName = settings.tokenHeaderName || 'Authorization';
|
|
var body = req.body;
|
|
var response;
|
|
|
|
headers.clientid = settings.clientId;
|
|
if (token && req.auth !== false) headers[tokenHeaderName] = 'Bearer ' + token;
|
|
|
|
if (body !== undefined && body !== null && !isFormData(body)) {
|
|
headers['Content-Type'] = headers['Content-Type'] || 'application/json';
|
|
}
|
|
|
|
try {
|
|
response = await axiosInstance.request({
|
|
method: String(method || 'GET').toLowerCase(),
|
|
url: path,
|
|
params: req.query,
|
|
data: body,
|
|
headers: headers
|
|
});
|
|
} catch (error) {
|
|
var responseData = error.response && error.response.data;
|
|
var status = error.response && error.response.status;
|
|
|
|
handleUnauthorized(status);
|
|
|
|
throw createHttpError((responseData && responseData.msg) || error.message || '接口请求失败', {
|
|
status: status,
|
|
response: responseData,
|
|
cause: error
|
|
});
|
|
}
|
|
|
|
try {
|
|
return unwrapResponse(response.data);
|
|
} catch (error) {
|
|
handleUnauthorized(error.code);
|
|
throw error;
|
|
}
|
|
};
|
|
}
|
|
|
|
return {
|
|
createRequester: createRequester,
|
|
unwrapResponse: unwrapResponse
|
|
};
|
|
});
|