Files
ai_game/client/js/utils/http.js

181 lines
4.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 网络请求工具 - 支持本地/云托管切换
*/
// ============================================
// 环境配置(切换这里即可)
// ============================================
const ENV = 'cloud'; // 'local' = 本地后端, 'cloud' = 微信云托管
const CONFIG = {
local: {
baseUrl: 'http://localhost:8000/api',
staticUrl: 'http://localhost:8000'
},
cloud: {
env: 'prod-6gjx1rd4c40f5884',
serviceName: 'express-fuvd',
staticUrl: 'https://7072-prod-6gjx1rd4c40f5884-1409819450.tcb.qcloud.la'
}
};
/**
* 发送HTTP请求
*/
export function request(options) {
if (ENV === 'local') {
return requestLocal(options);
} else {
return requestCloud(options);
}
}
/**
* 本地后端请求wx.request
*/
function requestLocal(options) {
return new Promise((resolve, reject) => {
wx.request({
url: CONFIG.local.baseUrl + options.url,
method: options.method || 'GET',
data: options.data || {},
timeout: options.timeout || 30000,
header: {
'Content-Type': 'application/json',
...options.header
},
success(res) {
if (res.data && res.data.code === 0) {
resolve(res.data.data);
} else {
console.error('[HTTP-Local] 响应异常:', res.statusCode, res.data);
reject(new Error(res.data?.message || res.data?.detail || `请求失败(${res.statusCode})`));
}
},
fail(err) {
console.error('[HTTP-Local] 请求失败:', err);
reject(err);
}
});
});
}
/**
* 云托管请求wx.cloud.callContainer
*/
function requestCloud(options) {
return new Promise((resolve, reject) => {
wx.cloud.callContainer({
config: {
env: CONFIG.cloud.env
},
path: '/api' + options.url,
method: options.method || 'GET',
data: options.data || {},
header: {
'X-WX-SERVICE': CONFIG.cloud.serviceName,
'Content-Type': 'application/json',
...options.header
},
success(res) {
if (res.data && res.data.code === 0) {
resolve(res.data.data);
} else if (res.data) {
console.error('[HTTP-Cloud] 响应异常:', res.statusCode, res.data);
reject(new Error(res.data.message || res.data.detail || `请求失败(${res.statusCode})`));
} else {
console.error('[HTTP-Cloud] 响应数据异常:', res);
reject(new Error('响应数据异常'));
}
},
fail(err) {
console.error('[HTTP-Cloud] 请求失败:', err);
reject(err);
}
});
});
}
/**
* GET请求
*/
export function get(url, data) {
return request({ url, method: 'GET', data });
}
/**
* POST请求
*/
export function post(url, data, options = {}) {
return request({ url, method: 'POST', data, ...options });
}
/**
* DELETE请求
*/
export function del(url, data) {
return request({ url, method: 'DELETE', data });
}
/**
* 获取静态资源完整URL图片等
* @param {string} path - 相对路径,如 /uploads/stories/1/characters/1.jpg
* @returns {string} 完整URL
*/
export function getStaticUrl(path) {
if (!path) return '';
// 如果已经是完整URL直接返回
if (path.startsWith('http://') || path.startsWith('https://')) {
return path;
}
const config = ENV === 'local' ? CONFIG.local : CONFIG.cloud;
return config.staticUrl + path;
}
/**
* 获取角色头像URL
* @param {number} storyId - 故事ID
* @param {number} characterId - 角色ID
*/
export function getCharacterAvatar(storyId, characterId) {
return getStaticUrl(`/uploads/stories/${storyId}/characters/${characterId}.jpg`);
}
/**
* 获取故事封面URL
* @param {number} storyId - 故事ID
*/
export function getStoryCover(storyId) {
return getStaticUrl(`/uploads/stories/${storyId}/cover/cover.jpg`);
}
/**
* 获取节点背景图URL
* @param {number} storyId - 故事ID
* @param {string} nodeKey - 节点key
*/
export function getNodeBackground(storyId, nodeKey) {
return getStaticUrl(`/uploads/stories/${storyId}/nodes/${nodeKey}/background.jpg`);
}
/**
* 获取节点角色立绘URL
* @param {number} storyId - 故事ID
* @param {string} nodeKey - 节点key
*/
export function getNodeCharacter(storyId, nodeKey) {
return getStaticUrl(`/uploads/stories/${storyId}/nodes/${nodeKey}/character.jpg`);
}
/**
* 获取草稿节点背景图URL
* @param {number} storyId - 故事ID
* @param {number} draftId - 草稿ID
* @param {string} nodeKey - 节点key
*/
export function getDraftNodeBackground(storyId, draftId, nodeKey) {
return getStaticUrl(`/uploads/stories/${storyId}/drafts/${draftId}/${nodeKey}/background.jpg`);
}
export default { request, get, post, del, getStaticUrl, getCharacterAvatar, getStoryCover, getNodeBackground, getNodeCharacter, getDraftNodeBackground };