refactor(api): 重构API请求头添加token认证 feat(auth): 实现微信静默登录功能 docs: 删除冗余的API文档文件 chore: 更新.gitignore文件 style: 调整mock数据中的货币单位显示
369 lines
10 KiB
JavaScript
369 lines
10 KiB
JavaScript
/**
|
||
* API工具类 - 统一封装后端API请求
|
||
*/
|
||
|
||
// API基础URL
|
||
const BASE_URL = 'https://api.assetmanager.com';
|
||
|
||
// 请求超时时间
|
||
const TIMEOUT = 10000;
|
||
|
||
/**
|
||
* 基础请求方法
|
||
* @param {string} url - 请求URL
|
||
* @param {string} method - 请求方法
|
||
* @param {object} data - 请求数据
|
||
* @param {object} headers - 请求头
|
||
* @returns {Promise} - 返回Promise对象
|
||
*/
|
||
const request = (url, method = 'GET', data = {}, headers = {}) => {
|
||
// 获取存储的token
|
||
const token = uni.getStorageSync('token');
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
url: BASE_URL + url,
|
||
method,
|
||
data,
|
||
header: {
|
||
'Content-Type': 'application/json',
|
||
'Authorization': token ? `Bearer ${token}` : '',
|
||
...headers
|
||
},
|
||
timeout: TIMEOUT,
|
||
success: (res) => {
|
||
if (res.statusCode === 200) {
|
||
resolve(res.data);
|
||
} else if (res.statusCode === 401) {
|
||
// 未授权,清除token并重新登录
|
||
uni.removeStorageSync('token');
|
||
uni.removeStorageSync('userInfo');
|
||
console.log('登录已过期,请重新登录');
|
||
reject(new Error('登录已过期'));
|
||
} else {
|
||
reject(new Error(`请求失败: ${res.statusCode}`));
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
// 当实际API不可用时,使用模拟数据
|
||
console.log('API请求失败,使用模拟数据:', err);
|
||
resolve(getMockData(url, method, data));
|
||
}
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* GET请求
|
||
* @param {string} url - 请求URL
|
||
* @param {object} params - 请求参数
|
||
* @param {object} headers - 请求头
|
||
* @returns {Promise} - 返回Promise对象
|
||
*/
|
||
export const get = (url, params = {}, headers = {}) => {
|
||
// 构建查询字符串
|
||
const queryString = Object.keys(params)
|
||
.map(key => `${key}=${encodeURIComponent(params[key])}`)
|
||
.join('&');
|
||
const fullUrl = queryString ? `${url}?${queryString}` : url;
|
||
return request(fullUrl, 'GET', {}, headers);
|
||
};
|
||
|
||
/**
|
||
* POST请求
|
||
* @param {string} url - 请求URL
|
||
* @param {object} data - 请求数据
|
||
* @param {object} headers - 请求头
|
||
* @returns {Promise} - 返回Promise对象
|
||
*/
|
||
export const post = (url, data = {}, headers = {}) => {
|
||
return request(url, 'POST', data, headers);
|
||
};
|
||
|
||
/**
|
||
* PUT请求
|
||
* @param {string} url - 请求URL
|
||
* @param {object} data - 请求数据
|
||
* @param {object} headers - 请求头
|
||
* @returns {Promise} - 返回Promise对象
|
||
*/
|
||
export const put = (url, data = {}, headers = {}) => {
|
||
return request(url, 'PUT', data, headers);
|
||
};
|
||
|
||
/**
|
||
* DELETE请求
|
||
* @param {string} url - 请求URL
|
||
* @param {object} params - 请求参数
|
||
* @param {object} headers - 请求头
|
||
* @returns {Promise} - 返回Promise对象
|
||
*/
|
||
export const del = (url, params = {}, headers = {}) => {
|
||
const queryString = Object.keys(params)
|
||
.map(key => `${key}=${encodeURIComponent(params[key])}`)
|
||
.join('&');
|
||
const fullUrl = queryString ? `${url}?${queryString}` : url;
|
||
return request(fullUrl, 'DELETE', {}, headers);
|
||
};
|
||
|
||
/**
|
||
* 模拟数据
|
||
* @param {string} url - 请求URL
|
||
* @param {string} method - 请求方法
|
||
* @param {object} data - 请求数据
|
||
* @returns {object} - 返回模拟数据
|
||
*/
|
||
const getMockData = (url, method, data) => {
|
||
// 模拟API延迟
|
||
return new Promise(resolve => {
|
||
setTimeout(() => {
|
||
// 资产相关模拟数据
|
||
if (url.includes('/assets')) {
|
||
resolve({
|
||
code: 200,
|
||
data: {
|
||
totalValue: 1284592.40,
|
||
currency: 'CNY',
|
||
todayProfit: 12482.00,
|
||
todayProfitCurrency: 'CNY',
|
||
totalReturnRate: 24.82
|
||
},
|
||
message: 'success'
|
||
});
|
||
}
|
||
|
||
// 持仓相关模拟数据
|
||
if (url.includes('/holdings')) {
|
||
resolve({
|
||
code: 200,
|
||
data: [
|
||
{
|
||
id: 'hfea-001',
|
||
name: '美股全天候杠杆',
|
||
tags: 'HFEA · 季度调仓',
|
||
status: '监控中',
|
||
statusType: 'green',
|
||
iconChar: 'H',
|
||
iconBgClass: 'bg-green-100',
|
||
iconTextClass: 'text-green-700',
|
||
value: 156240.00,
|
||
currency: 'USD',
|
||
returnRate: 42.82,
|
||
returnType: 'positive'
|
||
},
|
||
{
|
||
id: 'ma-002',
|
||
name: '纳指双均线趋势',
|
||
tags: '趋势跟踪 · 日线',
|
||
status: '等待信号',
|
||
statusType: 'gray',
|
||
iconChar: 'T',
|
||
iconBgClass: 'bg-blue-100',
|
||
iconTextClass: 'text-blue-700',
|
||
value: 412500.00,
|
||
currency: 'USD',
|
||
returnRate: -1.79,
|
||
returnType: 'negative'
|
||
},
|
||
{
|
||
id: 'hk-003',
|
||
name: '港股价值投资',
|
||
tags: '价值投资 · 蓝筹',
|
||
status: '持有中',
|
||
statusType: 'green',
|
||
iconChar: 'H',
|
||
iconBgClass: 'bg-green-100',
|
||
iconTextClass: 'text-green-700',
|
||
value: 896000.00,
|
||
currency: 'HKD',
|
||
returnRate: 12.56,
|
||
returnType: 'positive'
|
||
}
|
||
],
|
||
message: 'success'
|
||
});
|
||
}
|
||
|
||
// 策略相关模拟数据
|
||
if (url.includes('/strategies')) {
|
||
resolve({
|
||
code: 200,
|
||
data: [
|
||
{
|
||
id: 'hfea',
|
||
iconChar: 'H',
|
||
title: 'HFEA 风险平价策略',
|
||
tag: '高风险 · 高预期收益',
|
||
desc: '针对杠杆ETF平衡的对冲策略,核心逻辑为 TMF (3x长债) 与 UPRO (3x标普) 的季度平衡。',
|
||
bgClass: 'bg-emerald-900',
|
||
tagClass: 'text-emerald-700',
|
||
tags: ['季调', '止损机制'],
|
||
btnText: '配置参数',
|
||
btnClass: 'btn-primary'
|
||
},
|
||
{
|
||
id: 'ma',
|
||
iconChar: 'T',
|
||
title: '双均线趋势跟随',
|
||
tag: '中风险 · 低回撤要求',
|
||
desc: '利用快线(EMA10)上穿慢线(EMA60)捕捉强势波段,金叉买入,死叉离场。',
|
||
bgClass: 'bg-blue-600',
|
||
tagClass: 'text-blue-700',
|
||
tags: ['日线', '左侧止盈'],
|
||
btnText: '预览模型',
|
||
btnClass: 'btn-secondary'
|
||
},
|
||
{
|
||
id: 'chandelier',
|
||
iconChar: 'S',
|
||
title: '吊灯止损策略',
|
||
tag: '风险控制 · 辅助',
|
||
desc: '基于 ATR 波动率计算的动态止损线,锁住利润,防止回撤过大。',
|
||
bgClass: 'bg-orange-500',
|
||
tagClass: 'text-orange-700',
|
||
tags: ['ATR', '动态止盈'],
|
||
btnText: '配置参数',
|
||
btnClass: 'btn-secondary'
|
||
}
|
||
],
|
||
message: 'success'
|
||
});
|
||
}
|
||
|
||
// 用户信息模拟数据
|
||
if (url.includes('/user/info')) {
|
||
resolve({
|
||
code: 200,
|
||
data: {
|
||
userName: '首席策略员 0x42',
|
||
memberLevel: '全球实验室 Pro',
|
||
runningDays: 412
|
||
},
|
||
message: 'success'
|
||
});
|
||
}
|
||
|
||
// 用户统计数据模拟数据
|
||
if (url.includes('/user/stats')) {
|
||
resolve({
|
||
code: 200,
|
||
data: {
|
||
signalsCaptured: 1248,
|
||
winRate: 58.4
|
||
},
|
||
message: 'success'
|
||
});
|
||
}
|
||
|
||
// 应用信息模拟数据
|
||
if (url.includes('/app/info')) {
|
||
resolve({
|
||
code: 200,
|
||
data: {
|
||
version: 'v2.4.0',
|
||
currentDate: new Date().toISOString().split('T')[0]
|
||
},
|
||
message: 'success'
|
||
});
|
||
}
|
||
|
||
// 微信登录模拟数据
|
||
if (url.includes('/api/auth/wechat/login')) {
|
||
resolve({
|
||
code: 200,
|
||
data: {
|
||
token: 'mock-wechat-token-123456',
|
||
userInfo: {
|
||
id: 'user-001',
|
||
openid: 'mock-openid-123456',
|
||
nickname: '微信用户',
|
||
avatar: 'https://via.placeholder.com/100',
|
||
memberLevel: '全球实验室 Pro',
|
||
runningDays: 412
|
||
}
|
||
},
|
||
message: 'success'
|
||
});
|
||
}
|
||
|
||
// 微信绑定模拟数据
|
||
if (url.includes('/api/auth/wechat/bind')) {
|
||
resolve({
|
||
code: 200,
|
||
data: {
|
||
token: 'mock-wechat-token-789012',
|
||
userInfo: {
|
||
id: 'user-001',
|
||
openid: 'mock-openid-123456',
|
||
email: 'user@example.com',
|
||
nickname: '微信用户',
|
||
avatar: 'https://via.placeholder.com/100',
|
||
memberLevel: '全球实验室 Pro',
|
||
runningDays: 412
|
||
}
|
||
},
|
||
message: 'success'
|
||
});
|
||
}
|
||
|
||
// 默认返回
|
||
resolve({
|
||
code: 200,
|
||
data: null,
|
||
message: 'success'
|
||
});
|
||
}, 500);
|
||
});
|
||
};
|
||
|
||
/**
|
||
* API接口封装
|
||
*/
|
||
export const api = {
|
||
// 资产相关API
|
||
assets: {
|
||
// 获取总资产数据
|
||
getAssetData: () => get('/assets'),
|
||
// 获取持仓组合数据
|
||
getHoldings: () => get('/holdings')
|
||
},
|
||
|
||
// 策略相关API
|
||
strategies: {
|
||
// 获取策略列表
|
||
getStrategies: () => get('/strategies'),
|
||
// 获取单个策略详情
|
||
getStrategyDetail: (id) => get(`/strategies/${id}`),
|
||
// 创建新策略
|
||
createStrategy: (data) => post('/strategies', data),
|
||
// 更新策略
|
||
updateStrategy: (id, data) => put(`/strategies/${id}`, data),
|
||
// 删除策略
|
||
deleteStrategy: (id) => del(`/strategies/${id}`)
|
||
},
|
||
|
||
// 用户相关API
|
||
user: {
|
||
// 获取用户信息
|
||
getUserInfo: () => get('/user/info'),
|
||
// 获取用户统计数据
|
||
getUserStats: () => get('/user/stats'),
|
||
// 更新用户信息
|
||
updateUserInfo: (data) => put('/user/info', data)
|
||
},
|
||
|
||
// 认证相关API
|
||
auth: {
|
||
// 微信登录
|
||
wechatLogin: (code) => post('/api/auth/wechat/login', { code }),
|
||
// 微信绑定
|
||
wechatBind: (data) => post('/api/auth/wechat/bind', data)
|
||
},
|
||
|
||
// 应用相关API
|
||
app: {
|
||
// 获取应用信息
|
||
getAppInfo: () => get('/app/info')
|
||
}
|
||
};
|
||
|
||
export default api; |