AssetManager.UniApp/utils/api.js
fanfpy bc48e8f7a3 feat: 初始化项目并添加基础功能
- 添加uni-ui组件库依赖
- 实现微信静默登录功能
- 创建资产、策略、我的等核心页面
- 添加策略组合配置功能
- 实现持仓详情展示
- 完善用户信息展示
- 添加全局样式和工具类
- 配置小程序项目设置
2026-02-18 20:51:42 +08:00

351 lines
9.7 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.

/**
* 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,
todayProfit: 12482.00,
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,
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,
returnRate: -1.79,
returnType: 'negative'
}
],
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;