feat: 添加微信静默登录功能并更新API文档
refactor(api): 重构API请求头添加token认证 feat(auth): 实现微信静默登录功能 docs: 删除冗余的API文档文件 chore: 更新.gitignore文件 style: 调整mock数据中的货币单位显示
This commit is contained in:
parent
bc48e8f7a3
commit
630d2f8f15
64
.gitignore
vendored
Normal file
64
.gitignore
vendored
Normal file
@ -0,0 +1,64 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Build outputs
|
||||
unpackage/
|
||||
dist/
|
||||
build/
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea/
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.temp
|
||||
.cache/
|
||||
|
||||
# OS generated files
|
||||
Thumbs.db
|
||||
.DS_Store
|
||||
|
||||
# Test coverage
|
||||
coverage/
|
||||
*.lcov
|
||||
|
||||
# TypeScript
|
||||
*.tsbuildinfo
|
||||
|
||||
# Misc
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# Debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Built Visual Studio Code Extensions
|
||||
*.vsix
|
||||
681
API 接口设计文档.md
Normal file
681
API 接口设计文档.md
Normal file
@ -0,0 +1,681 @@
|
||||
# API 接口设计文档
|
||||
|
||||
## 模块一:页面 API 需求汇总 (API Summary)
|
||||
|
||||
| 接口名称 | 请求方式 | 接口路径 (Route) | 业务功能描述 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| 获取总资产数据 | GET | `/api/v1/assets` | 获取用户总资产估值、今日盈亏、累计收益率 |
|
||||
| 获取持仓组合数据 | GET | `/api/v1/holdings` | 获取用户当前所有持仓组合列表 |
|
||||
| 获取策略列表 | GET | `/api/v1/strategies` | 获取策略模板列表 |
|
||||
| 获取策略详情 | GET | `/api/v1/strategies/{id}` | 获取单个策略的详细信息 |
|
||||
| 创建策略 | POST | `/api/v1/strategies` | 创建新的策略配置 |
|
||||
| 更新策略 | PUT | `/api/v1/strategies/{id}` | 更新策略配置 |
|
||||
| 删除策略 | DELETE | `/api/v1/strategies/{id}` | 删除策略 |
|
||||
| 获取用户信息 | GET | `/api/v1/user/info` | 获取用户基本信息 |
|
||||
| 获取用户统计数据 | GET | `/api/v1/user/stats` | 获取用户交易统计数据 |
|
||||
| 更新用户信息 | PUT | `/api/v1/user/info` | 更新用户基本信息 |
|
||||
| 微信登录 | POST | `/api/v1/auth/wechat/login` | 通过微信code进行登录 |
|
||||
| 微信绑定 | POST | `/api/v1/auth/wechat/bind` | 绑定微信账号 |
|
||||
| 获取应用信息 | GET | `/api/v1/app/info` | 获取应用版本和当前日期 |
|
||||
| 创建投资组合 | POST | `/api/v1/portfolios` | 创建新的投资组合 |
|
||||
| 获取投资组合详情 | GET | `/api/v1/portfolios/{id}` | 获取单个投资组合的详细信息 |
|
||||
| 获取交易记录 | GET | `/api/v1/transactions` | 获取交易历史记录 |
|
||||
| 执行交易 | POST | `/api/v1/transactions` | 执行买入或卖出操作 |
|
||||
|
||||
## 模块二:API 接口详细定义 (API Specifications)
|
||||
|
||||
### 1. 获取总资产数据
|
||||
|
||||
* **功能描述**:获取用户总资产估值、今日盈亏和累计收益率等核心资产数据。
|
||||
* **Method & URL**:`GET /api/v1/assets`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"totalValue": 1284592.40, // decimal,总资产估值
|
||||
"currency": "CNY", // string,币种 (CNY/USD/HKD)
|
||||
"todayProfit": 12482.00, // decimal,今日盈亏
|
||||
"todayProfitCurrency": "CNY", // string,今日盈亏币种
|
||||
"totalReturnRate": 24.82 // decimal,累计收益率(%)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 获取持仓组合数据
|
||||
|
||||
* **功能描述**:获取用户当前所有持仓组合的列表,包含每个组合的基本信息和状态。
|
||||
* **Method & URL**:`GET /api/v1/holdings`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": "hfea-001", // string,组合ID
|
||||
"name": "美股全天候杠杆", // string,组合名称
|
||||
"tags": "HFEA · 季度调仓", // string,组合标签
|
||||
"status": "监控中", // string,状态描述
|
||||
"statusType": "green", // string,状态类型
|
||||
"iconChar": "H", // string,图标字符
|
||||
"iconBgClass": "bg-green-100", // string,图标背景类
|
||||
"iconTextClass": "text-green-700", // string,图标文本类
|
||||
"value": 156240.00, // decimal,当前市值
|
||||
"currency": "USD", // string,币种 (CNY/USD/HKD)
|
||||
"returnRate": 42.82, // decimal,累计收益率(%)
|
||||
"returnType": "positive" // string,收益类型
|
||||
},
|
||||
{
|
||||
"id": "ma-002", // string,组合ID
|
||||
"name": "纳指双均线趋势", // string,组合名称
|
||||
"tags": "趋势跟踪 · 日线", // string,组合标签
|
||||
"status": "等待信号", // string,状态描述
|
||||
"statusType": "gray", // string,状态类型
|
||||
"iconChar": "T", // string,图标字符
|
||||
"iconBgClass": "bg-blue-100", // string,图标背景类
|
||||
"iconTextClass": "text-blue-700", // string,图标文本类
|
||||
"value": 412500.00, // decimal,当前市值
|
||||
"currency": "USD", // string,币种 (CNY/USD/HKD)
|
||||
"returnRate": -1.79, // decimal,累计收益率(%)
|
||||
"returnType": "negative" // string,收益类型
|
||||
},
|
||||
{
|
||||
"id": "hk-003", // string,组合ID
|
||||
"name": "港股价值投资", // string,组合名称
|
||||
"tags": "价值投资 · 蓝筹", // string,组合标签
|
||||
"status": "持有中", // string,状态描述
|
||||
"statusType": "green", // string,状态类型
|
||||
"iconChar": "H", // string,图标字符
|
||||
"iconBgClass": "bg-green-100", // string,图标背景类
|
||||
"iconTextClass": "text-green-700", // string,图标文本类
|
||||
"value": 896000.00, // decimal,当前市值
|
||||
"currency": "HKD", // string,币种 (CNY/USD/HKD)
|
||||
"returnRate": 12.56, // decimal,累计收益率(%)
|
||||
"returnType": "positive" // string,收益类型
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 获取策略列表
|
||||
|
||||
* **功能描述**:获取策略模板列表,用于创建投资组合时选择策略。
|
||||
* **Method & URL**:`GET /api/v1/strategies`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": "hfea", // string,策略ID
|
||||
"iconChar": "H", // string,图标字符
|
||||
"title": "HFEA 风险平价策略", // string,策略标题
|
||||
"tag": "高风险 · 高预期收益", // string,策略标签
|
||||
"desc": "针对杠杆ETF平衡的对冲策略,核心逻辑为 TMF (3x长债) 与 UPRO (3x标普) 的季度平衡。", // string,策略描述
|
||||
"bgClass": "bg-emerald-900", // string,背景类
|
||||
"tagClass": "text-emerald-700", // string,标签类
|
||||
"tags": ["季调", "止损机制"], // string[],策略特性标签
|
||||
"btnText": "配置参数", // string,按钮文本
|
||||
"btnClass": "btn-primary" // string,按钮类
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 获取策略详情
|
||||
|
||||
* **功能描述**:获取单个策略的详细信息,包含策略原理和配置参数。
|
||||
* **Method & URL**:`GET /api/v1/strategies/{id}`
|
||||
* **Request Parameters**:
|
||||
* `id`:string,路径参数,必填,策略ID
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": "hfea", // string,策略ID
|
||||
"name": "HFEA 风险平价策略", // string,策略名称
|
||||
"description": "针对杠杆ETF平衡的对冲策略,核心逻辑为 TMF (3x长债) 与 UPRO (3x标普) 的季度平衡。", // string,策略描述
|
||||
"riskLevel": "high", // string,风险等级
|
||||
"parameters": [ // object[],策略参数列表
|
||||
{
|
||||
"name": "rebalancePeriod", // string,参数名称
|
||||
"displayName": "再平衡周期", // string,显示名称
|
||||
"type": "select", // string,参数类型
|
||||
"options": ["每日", "每周", "每月", "每季度", "每年"], // string[],可选值
|
||||
"defaultValue": "每季度" // string,默认值
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 创建策略
|
||||
|
||||
* **功能描述**:创建新的策略配置。
|
||||
* **Method & URL**:`POST /api/v1/strategies`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:
|
||||
```json
|
||||
{
|
||||
"alias": "纳指长期定投", // string,必填,策略别名
|
||||
"type": "weight", // string,必填,策略类型
|
||||
"config": { // object,必填,策略配置参数
|
||||
"period": "每季度", // string,再平衡周期
|
||||
"threshold": 5, // decimal,偏离阈值(%)
|
||||
"assets": [ // object[],资产配置
|
||||
{
|
||||
"code": "UPRO", // string,资产代码
|
||||
"targetWeight": 55 // decimal,目标权重(%)
|
||||
},
|
||||
{
|
||||
"code": "TMF", // string,资产代码
|
||||
"targetWeight": 45 // decimal,目标权重(%)
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": "strategy-001", // string,策略ID
|
||||
"alias": "纳指长期定投", // string,策略别名
|
||||
"type": "weight", // string,策略类型
|
||||
"config": { // object,策略配置
|
||||
"period": "每季度",
|
||||
"threshold": 5,
|
||||
"assets": [
|
||||
{
|
||||
"code": "UPRO",
|
||||
"targetWeight": 55
|
||||
},
|
||||
{
|
||||
"code": "TMF",
|
||||
"targetWeight": 45
|
||||
}
|
||||
]
|
||||
},
|
||||
"createdAt": "2024-01-01T00:00:00Z" // DateTime,创建时间
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6. 更新策略
|
||||
|
||||
* **功能描述**:更新现有策略的配置。
|
||||
* **Method & URL**:`PUT /api/v1/strategies/{id}`
|
||||
* **Request Parameters**:
|
||||
* `id`:string,路径参数,必填,策略ID
|
||||
* **Request Body**:
|
||||
```json
|
||||
{
|
||||
"alias": "纳指长期定投优化版", // string,必填,策略别名
|
||||
"config": { // object,必填,策略配置参数
|
||||
"period": "每月", // string,再平衡周期
|
||||
"threshold": 3, // decimal,偏离阈值(%)
|
||||
"assets": [ // object[],资产配置
|
||||
{
|
||||
"code": "UPRO", // string,资产代码
|
||||
"targetWeight": 60 // decimal,目标权重(%)
|
||||
},
|
||||
{
|
||||
"code": "TMF", // string,资产代码
|
||||
"targetWeight": 40 // decimal,目标权重(%)
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": "strategy-001", // string,策略ID
|
||||
"alias": "纳指长期定投优化版", // string,策略别名
|
||||
"type": "weight", // string,策略类型
|
||||
"config": { // object,策略配置
|
||||
"period": "每月",
|
||||
"threshold": 3,
|
||||
"assets": [
|
||||
{
|
||||
"code": "UPRO",
|
||||
"targetWeight": 60
|
||||
},
|
||||
{
|
||||
"code": "TMF",
|
||||
"targetWeight": 40
|
||||
}
|
||||
]
|
||||
},
|
||||
"updatedAt": "2024-01-02T00:00:00Z" // DateTime,更新时间
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7. 删除策略
|
||||
|
||||
* **功能描述**:删除指定的策略。
|
||||
* **Method & URL**:`DELETE /api/v1/strategies/{id}`
|
||||
* **Request Parameters**:
|
||||
* `id`:string,路径参数,必填,策略ID
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"deleted": true // bool,删除成功状态
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 8. 获取用户信息
|
||||
|
||||
* **功能描述**:获取用户基本信息,包含用户名、会员等级、连续运行天数等。
|
||||
* **Method & URL**:`GET /api/v1/user/info`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"userName": "首席策略员 0x42", // string,用户名
|
||||
"memberLevel": "全球实验室 Pro", // string,会员等级
|
||||
"runningDays": 412, // int,连续运行天数
|
||||
"avatar": "https://via.placeholder.com/100", // string,头像URL
|
||||
"email": "user@example.com" // string,邮箱
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 9. 获取用户统计数据
|
||||
|
||||
* **功能描述**:获取用户交易统计数据,包含已捕获信号数、模拟胜率等。
|
||||
* **Method & URL**:`GET /api/v1/user/stats`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"signalsCaptured": 1248, // int,已捕获信号数
|
||||
"winRate": 58.4, // decimal,模拟胜率(%)
|
||||
"totalTrades": 2136, // int,总交易次数
|
||||
"totalReturn": 124820.50 // decimal,总收益金额
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 10. 更新用户信息
|
||||
|
||||
* **功能描述**:更新用户基本信息。
|
||||
* **Method & URL**:`PUT /api/v1/user/info`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:
|
||||
```json
|
||||
{
|
||||
"userName": "新用户名", // string,用户名
|
||||
"email": "newemail@example.com", // string,邮箱
|
||||
"avatar": "https://new-avatar-url.com/avatar.jpg" // string,头像URL
|
||||
}
|
||||
```
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"userName": "新用户名", // string,用户名
|
||||
"memberLevel": "全球实验室 Pro", // string,会员等级
|
||||
"runningDays": 412, // int,连续运行天数
|
||||
"avatar": "https://new-avatar-url.com/avatar.jpg", // string,头像URL
|
||||
"email": "newemail@example.com", // string,邮箱
|
||||
"updatedAt": "2024-01-01T00:00:00Z" // DateTime,更新时间
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 11. 微信登录
|
||||
|
||||
* **功能描述**:通过微信code进行登录认证。
|
||||
* **Method & URL**:`POST /api/v1/auth/wechat/login`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:
|
||||
```json
|
||||
{
|
||||
"code": "wx-code-123456", // string,必填,微信登录code
|
||||
"encryptedData": "encrypted-data", // string,可选,加密数据
|
||||
"iv": "initialization-vector" // string,可选,初始化向量
|
||||
}
|
||||
```
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"token": "mock-wechat-token-123456", // string,认证令牌
|
||||
"userInfo": { // object,用户信息
|
||||
"id": "user-001", // string,用户ID
|
||||
"openid": "mock-openid-123456", // string,微信openid
|
||||
"nickname": "微信用户", // string,昵称
|
||||
"avatar": "https://via.placeholder.com/100", // string,头像URL
|
||||
"memberLevel": "全球实验室 Pro", // string,会员等级
|
||||
"runningDays": 412 // int,连续运行天数
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 12. 微信绑定
|
||||
|
||||
* **功能描述**:绑定微信账号到现有用户。
|
||||
* **Method & URL**:`POST /api/v1/auth/wechat/bind`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:
|
||||
```json
|
||||
{
|
||||
"code": "wx-code-789012", // string,必填,微信登录code
|
||||
"encryptedData": "encrypted-data", // string,可选,加密数据
|
||||
"iv": "initialization-vector" // string,可选,初始化向量
|
||||
}
|
||||
```
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"token": "mock-wechat-token-789012", // string,认证令牌
|
||||
"userInfo": { // object,用户信息
|
||||
"id": "user-001", // string,用户ID
|
||||
"openid": "mock-openid-123456", // string,微信openid
|
||||
"email": "user@example.com", // string,邮箱
|
||||
"nickname": "微信用户", // string,昵称
|
||||
"avatar": "https://via.placeholder.com/100", // string,头像URL
|
||||
"memberLevel": "全球实验室 Pro", // string,会员等级
|
||||
"runningDays": 412 // int,连续运行天数
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 13. 获取应用信息
|
||||
|
||||
* **功能描述**:获取应用版本信息和当前日期。
|
||||
* **Method & URL**:`GET /api/v1/app/info`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"version": "v2.4.0", // string,应用版本
|
||||
"currentDate": "2024-01-01" // string,当前日期
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 14. 创建投资组合
|
||||
|
||||
* **功能描述**:创建新的投资组合,包含基础设置和初始持仓。
|
||||
* **Method & URL**:`POST /api/v1/portfolios`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:
|
||||
```json
|
||||
{
|
||||
"name": "养老定投", // string,必填,组合名称
|
||||
"strategyId": "hfea", // string,必填,策略ID
|
||||
"currency": "USD", // string,必填,组合币种 (CNY/USD/HKD)
|
||||
"stocks": [ // object[],必填,初始持仓
|
||||
{
|
||||
"name": "UPRO", // string,必填,标的名称
|
||||
"code": "UPRO.US", // string,必填,标的代码
|
||||
"price": 605.15, // decimal,必填,买入均价
|
||||
"amount": 142, // int,必填,持有数量
|
||||
"date": "2024-01-01", // string,必填,建仓日期
|
||||
"currency": "USD" // string,必填,标的币种
|
||||
},
|
||||
{
|
||||
"name": "TMF", // string,必填,标的名称
|
||||
"code": "TMF.US", // string,必填,标的代码
|
||||
"price": 87.89, // decimal,必填,买入均价
|
||||
"amount": 800, // int,必填,持有数量
|
||||
"date": "2024-01-01", // string,必填,建仓日期
|
||||
"currency": "USD" // string,必填,标的币种
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": "portfolio-001", // string,组合ID
|
||||
"name": "养老定投", // string,组合名称
|
||||
"strategyId": "hfea", // string,策略ID
|
||||
"currency": "USD", // string,组合币种 (CNY/USD/HKD)
|
||||
"totalValue": 156240.00, // decimal,总市值
|
||||
"returnRate": 0, // decimal,收益率
|
||||
"status": "运行中", // string,状态
|
||||
"createdAt": "2024-01-01T00:00:00Z" // DateTime,创建时间
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 15. 获取投资组合详情
|
||||
|
||||
* **功能描述**:获取单个投资组合的详细信息,包含资产状况、持仓明细和交易记录。
|
||||
* **Method & URL**:`GET /api/v1/portfolios/{id}`
|
||||
* **Request Parameters**:
|
||||
* `id`:string,路径参数,必填,组合ID
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": "portfolio-001", // string,组合ID
|
||||
"name": "美股全天候杠杆", // string,组合名称
|
||||
"currency": "USD", // string,组合币种 (CNY/USD/HKD)
|
||||
"strategy": { // object,策略信息
|
||||
"id": "hfea", // string,策略ID
|
||||
"name": "HFEA 风险平价", // string,策略名称
|
||||
"status": "监控中" // string,策略状态
|
||||
},
|
||||
"portfolioValue": 156240.00, // decimal,组合净值
|
||||
"totalReturn": 42.82, // decimal,历史收益率(%)
|
||||
"todayProfit": 1240.50, // decimal,今日盈亏
|
||||
"todayProfitCurrency": "USD", // string,今日盈亏币种
|
||||
"positions": [ // object[],持仓明细
|
||||
{
|
||||
"name": "UPRO", // string,标的名称
|
||||
"code": "UPRO.US", // string,标的代码
|
||||
"shares": 142, // int,持有数量
|
||||
"marketValue": "85,932.00", // string,市值
|
||||
"currency": "USD", // string,标的币种
|
||||
"weight": 55, // decimal,仓位占比(%)
|
||||
"pnl": 12400.00, // decimal,持仓盈亏
|
||||
"pnlPercent": 16.8 // decimal,盈亏比例(%)
|
||||
},
|
||||
{
|
||||
"name": "TMF", // string,标的名称
|
||||
"code": "TMF.US", // string,标的代码
|
||||
"shares": 800, // int,持有数量
|
||||
"marketValue": "70,308.00", // string,市值
|
||||
"currency": "USD", // string,标的币种
|
||||
"weight": 45, // decimal,仓位占比(%)
|
||||
"pnl": -3200.50, // decimal,持仓盈亏
|
||||
"pnlPercent": -4.3 // decimal,盈亏比例(%)
|
||||
}
|
||||
],
|
||||
"transactions": [ // object[],交易记录
|
||||
{
|
||||
"date": "02-14", // string,交易日期
|
||||
"time": "14:30", // string,交易时间
|
||||
"type": "buy", // string,交易类型
|
||||
"title": "定期定投 UPRO", // string,交易标题
|
||||
"amount": "$500.00", // string,交易金额
|
||||
"currency": "USD" // string,交易币种
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 16. 获取交易记录
|
||||
|
||||
* **功能描述**:获取用户的交易历史记录。
|
||||
* **Method & URL**:`GET /api/v1/transactions`
|
||||
* **Request Parameters**:
|
||||
* `portfolioId`:string,查询参数,可选,组合ID
|
||||
* `limit`:int,查询参数,可选,返回数量限制
|
||||
* `offset`:int,查询参数,可选,偏移量
|
||||
* **Request Body**:无
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": "tx-001", // string,交易ID
|
||||
"portfolioId": "portfolio-001", // string,组合ID
|
||||
"date": "2024-02-14", // string,交易日期
|
||||
"time": "14:30:00", // string,交易时间
|
||||
"type": "buy", // string,交易类型
|
||||
"title": "定期定投 UPRO", // string,交易标题
|
||||
"amount": 500.00, // decimal,交易金额
|
||||
"currency": "USD", // string,货币类型
|
||||
"status": "completed" // string,交易状态
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 17. 执行交易
|
||||
|
||||
* **功能描述**:执行买入或卖出操作。
|
||||
* **Method & URL**:`POST /api/v1/transactions`
|
||||
* **Request Parameters**:无
|
||||
* **Request Body**:
|
||||
```json
|
||||
{
|
||||
"portfolioId": "portfolio-001", // string,必填,组合ID
|
||||
"type": "buy", // string,必填,交易类型(buy/sell)
|
||||
"stockCode": "UPRO.US", // string,必填,标的代码
|
||||
"amount": 10, // int,必填,交易数量
|
||||
"price": 605.15, // decimal,必填,交易价格
|
||||
"currency": "USD", // string,必填,交易币种 (CNY/USD/HKD)
|
||||
"remark": "定期定投" // string,可选,交易备注
|
||||
}
|
||||
```
|
||||
* **Response**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": "tx-002", // string,交易ID
|
||||
"portfolioId": "portfolio-001", // string,组合ID
|
||||
"type": "buy", // string,交易类型
|
||||
"stockCode": "UPRO.US", // string,标的代码
|
||||
"amount": 10, // int,交易数量
|
||||
"price": 605.15, // decimal,交易价格
|
||||
"currency": "USD", // string,交易币种 (CNY/USD/HKD)
|
||||
"totalAmount": 6051.50, // decimal,交易总金额
|
||||
"status": "processing", // string,交易状态
|
||||
"createdAt": "2024-01-01T00:00:00Z" // DateTime,创建时间
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 统一响应格式
|
||||
|
||||
所有接口均返回统一格式的响应体:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
### 响应码说明
|
||||
|
||||
| 响应码 | 说明 |
|
||||
| :--- | :--- |
|
||||
| 200 | 成功 |
|
||||
| 400 | 请求参数错误 |
|
||||
| 401 | 未授权,需要重新登录 |
|
||||
| 403 | 权限不足 |
|
||||
| 404 | 资源不存在 |
|
||||
| 500 | 服务器内部错误 |
|
||||
| 502 | 网关错误 |
|
||||
| 503 | 服务不可用 |
|
||||
|
||||
### 数据类型说明
|
||||
|
||||
| 类型 | 说明 | 示例 |
|
||||
| :--- | :--- | :--- |
|
||||
| int | 整数 | 412 |
|
||||
| string | 字符串 | "养老定投" |
|
||||
| decimal | 小数 | 42.82 |
|
||||
| bool | 布尔值 | true |
|
||||
| DateTime | 日期时间 | "2024-01-01T00:00:00Z" |
|
||||
| object | 对象 | {"name": "UPRO", "code": "UPRO.US"} |
|
||||
| array | 数组 | ["季调", "止损机制"] |
|
||||
|
||||
## 安全要求
|
||||
|
||||
1. **认证授权**:所有接口(除登录外)均需在请求头中携带 `Authorization: Bearer {token}`
|
||||
2. **数据验证**:所有输入参数均需进行严格的数据类型和业务规则验证
|
||||
3. **错误处理**:统一的错误处理机制,避免敏感信息泄露
|
||||
4. **日志记录**:关键操作需记录详细日志,但避免记录敏感信息
|
||||
5. **CORS配置**:正确配置跨域资源共享,仅允许指定域名访问
|
||||
|
||||
## 性能要求
|
||||
|
||||
1. **响应时间**:常规接口响应时间不超过 500ms
|
||||
2. **缓存策略**:合理使用缓存,减少重复计算
|
||||
3. **并发处理**:支持高并发请求,合理使用数据库连接池
|
||||
4. **数据分页**:列表接口必须支持分页,默认每页 20 条数据
|
||||
|
||||
## 部署要求
|
||||
|
||||
1. **环境配置**:支持多环境部署(开发、测试、生产)
|
||||
2. **监控告警**:集成监控系统,及时发现和处理异常
|
||||
3. **版本管理**:API 版本号通过 URL 路径管理(如 /api/v1/)
|
||||
4. **文档更新**:API 文档需与代码同步更新,保持一致性
|
||||
|
||||
---
|
||||
|
||||
**注**:本文档严格遵循 RESTful API 设计规范,所有字段均明确标注了数据类型和是否必填,可直接用于自动生成 C# 强类型实体类和 Controller。
|
||||
@ -1,709 +0,0 @@
|
||||
# 个人资产策略管理系统 - 后端API文档
|
||||
|
||||
## 文档概述
|
||||
|
||||
本文档定义了个人资产策略管理系统的后端API接口规范,包括资产管理、策略管理、用户管理等功能模块的API接口。前端通过这些接口与后端进行数据交互,实现完整的业务功能。
|
||||
|
||||
## 基础信息
|
||||
|
||||
### 基础URL
|
||||
```
|
||||
https://api.demo.com
|
||||
```
|
||||
|
||||
### 认证方式
|
||||
- **Bearer Token**:在请求头中添加 `Authorization: Bearer <token>`
|
||||
- **Token获取**:通过登录接口获取,有效期为24小时
|
||||
|
||||
### 响应格式
|
||||
|
||||
所有API接口返回统一的JSON格式:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200, // 状态码,200表示成功,其他表示错误
|
||||
"data": {}, // 响应数据,根据接口不同返回不同结构
|
||||
"message": "success" // 响应消息,错误时返回错误信息
|
||||
}
|
||||
```
|
||||
|
||||
### 状态码说明
|
||||
|
||||
| 状态码 | 描述 |
|
||||
|-------|------|
|
||||
| 200 | 成功 |
|
||||
| 400 | 请求参数错误 |
|
||||
| 401 | 未授权 |
|
||||
| 403 | 禁止访问 |
|
||||
| 404 | 资源不存在 |
|
||||
| 500 | 服务器内部错误 |
|
||||
|
||||
## API接口列表
|
||||
|
||||
### 1. 资产相关API
|
||||
|
||||
#### 1.1 获取总资产数据
|
||||
|
||||
**接口**:`GET /api/assets`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| totalValue | number | 总资产估值(CNY) |
|
||||
| todayProfit | number | 今日盈亏(CNY) |
|
||||
| totalReturnRate | number | 累计收益率(%) |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"totalValue": 1284592.40,
|
||||
"todayProfit": 12482.00,
|
||||
"totalReturnRate": 24.82
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.2 获取持仓组合数据
|
||||
|
||||
**接口**:`GET /api/holdings`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 持仓组合ID |
|
||||
| name | string | 持仓组合名称 |
|
||||
| tags | string | 持仓组合标签 |
|
||||
| status | string | 状态(监控中/等待信号) |
|
||||
| statusType | string | 状态类型(green/gray) |
|
||||
| iconChar | string | 图标字符 |
|
||||
| iconBgClass | string | 图标背景样式类 |
|
||||
| iconTextClass | string | 图标文本样式类 |
|
||||
| value | number | 当前市值(CNY) |
|
||||
| returnRate | number | 累计收益率(%) |
|
||||
| returnType | string | 收益类型(positive/negative) |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"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"
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 策略相关API
|
||||
|
||||
#### 2.1 获取策略列表
|
||||
|
||||
**接口**:`GET /api/strategies`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| iconChar | string | 图标字符 |
|
||||
| title | string | 策略标题 |
|
||||
| tag | string | 策略标签 |
|
||||
| desc | string | 策略描述 |
|
||||
| bgClass | string | 背景样式类 |
|
||||
| tagClass | string | 标签样式类 |
|
||||
| tags | array<string> | 策略标签数组 |
|
||||
| btnText | string | 按钮文本 |
|
||||
| btnClass | string | 按钮样式类 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 获取单个策略详情
|
||||
|
||||
**接口**:`GET /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| iconChar | string | 图标字符 |
|
||||
| title | string | 策略标题 |
|
||||
| tag | string | 策略标签 |
|
||||
| desc | string | 策略描述 |
|
||||
| bgClass | string | 背景样式类 |
|
||||
| tagClass | string | 标签样式类 |
|
||||
| tags | array<string> | 策略标签数组 |
|
||||
| parameters | object | 策略参数配置 |
|
||||
| backtest | object | 回测数据 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"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": ["季调", "止损机制"],
|
||||
"parameters": {
|
||||
"tmfRatio": 0.55,
|
||||
"uproRatio": 0.45,
|
||||
"rebalanceInterval": "quarterly",
|
||||
"stopLoss": 0.2
|
||||
},
|
||||
"backtest": {
|
||||
"totalReturn": 1.85,
|
||||
"maxDrawdown": 0.32,
|
||||
"sharpeRatio": 0.87,
|
||||
"winRate": 0.58
|
||||
}
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.3 创建新策略
|
||||
|
||||
**接口**:`POST /api/strategies`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| title | string | 策略标题 | 是 |
|
||||
| tag | string | 策略标签 | 是 |
|
||||
| desc | string | 策略描述 | 是 |
|
||||
| tags | array<string> | 策略标签数组 | 是 |
|
||||
| parameters | object | 策略参数配置 | 是 |
|
||||
| iconChar | string | 图标字符 | 否 |
|
||||
| bgClass | string | 背景样式类 | 否 |
|
||||
| tagClass | string | 标签样式类 | 否 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "自定义策略",
|
||||
"tag": "中风险 · 自定义",
|
||||
"desc": "基于移动平均线的趋势策略",
|
||||
"tags": ["日线", "趋势跟踪"],
|
||||
"parameters": {
|
||||
"fastPeriod": 10,
|
||||
"slowPeriod": 60,
|
||||
"stopLoss": 0.15
|
||||
},
|
||||
"iconChar": "C",
|
||||
"bgClass": "bg-purple-600",
|
||||
"tagClass": "text-purple-700"
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 新创建的策略ID |
|
||||
| title | string | 策略标题 |
|
||||
| status | string | 创建状态 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "custom-001",
|
||||
"title": "自定义策略",
|
||||
"status": "created"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.4 更新策略
|
||||
|
||||
**接口**:`PUT /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**请求体**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| title | string | 策略标题 | 否 |
|
||||
| tag | string | 策略标签 | 否 |
|
||||
| desc | string | 策略描述 | 否 |
|
||||
| tags | array<string> | 策略标签数组 | 否 |
|
||||
| parameters | object | 策略参数配置 | 否 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "更新后的策略",
|
||||
"parameters": {
|
||||
"tmfRatio": 0.6,
|
||||
"uproRatio": 0.4
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| status | string | 更新状态 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "hfea",
|
||||
"status": "updated"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.5 删除策略
|
||||
|
||||
**接口**:`DELETE /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| status | string | 删除状态 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "custom-001",
|
||||
"status": "deleted"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 用户相关API
|
||||
|
||||
#### 3.1 获取用户信息
|
||||
|
||||
**接口**:`GET /api/user/info`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| userName | string | 用户名 |
|
||||
| memberLevel | string | 会员等级 |
|
||||
| runningDays | number | 连续运行天数 |
|
||||
| avatar | string | 头像URL |
|
||||
| email | string | 邮箱 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"userName": "首席策略员 0x42",
|
||||
"memberLevel": "全球实验室 Pro",
|
||||
"runningDays": 412,
|
||||
"avatar": "https://example.com/avatar.png",
|
||||
"email": "user@example.com"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2 获取用户统计数据
|
||||
|
||||
**接口**:`GET /api/user/stats`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| signalsCaptured | number | 已捕获信号数量 |
|
||||
| winRate | number | 模拟胜率(%) |
|
||||
| totalTrades | number | 总交易次数 |
|
||||
| averageProfit | number | 平均收益(%) |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"signalsCaptured": 1248,
|
||||
"winRate": 58.4,
|
||||
"totalTrades": 2138,
|
||||
"averageProfit": 2.3
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.3 更新用户信息
|
||||
|
||||
**接口**:`PUT /api/user/info`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| userName | string | 用户名 | 否 |
|
||||
| avatar | string | 头像URL | 否 |
|
||||
| email | string | 邮箱 | 否 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"userName": "策略大师 0x42",
|
||||
"email": "newemail@example.com"
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| status | string | 更新状态 |
|
||||
| userName | string | 更新后的用户名 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"status": "updated",
|
||||
"userName": "策略大师 0x42"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 应用相关API
|
||||
|
||||
#### 4.1 获取应用信息
|
||||
|
||||
**接口**:`GET /api/app/info`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| version | string | 应用版本 |
|
||||
| currentDate | string | 当前日期(YYYY-MM-DD) |
|
||||
| latestVersion | string | 最新版本 |
|
||||
| updateAvailable | boolean | 是否有更新 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"version": "v2.4.0",
|
||||
"currentDate": "2026-02-16",
|
||||
"latestVersion": "v2.4.0",
|
||||
"updateAvailable": false
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 认证相关API
|
||||
|
||||
#### 5.1 用户登录
|
||||
|
||||
**接口**:`POST /api/auth/login`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| email | string | 邮箱 | 是 |
|
||||
| password | string | 密码 | 是 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"email": "user@example.com",
|
||||
"password": "password123"
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| token | string | 认证令牌 |
|
||||
| expireAt | string | 令牌过期时间 |
|
||||
| user | object | 用户基本信息 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||
"expireAt": "2026-02-17T10:00:00Z",
|
||||
"user": {
|
||||
"userName": "首席策略员 0x42",
|
||||
"memberLevel": "全球实验室 Pro"
|
||||
}
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.2 用户注册
|
||||
|
||||
**接口**:`POST /api/auth/register`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| email | string | 邮箱 | 是 |
|
||||
| password | string | 密码 | 是 |
|
||||
| userName | string | 用户名 | 是 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"email": "newuser@example.com",
|
||||
"password": "password123",
|
||||
"userName": "新用户"
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 用户ID |
|
||||
| status | string | 注册状态 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "user-001",
|
||||
"status": "registered"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
## 6. 部署与集成
|
||||
|
||||
### 6.1 环境变量配置
|
||||
|
||||
后端服务需要配置以下环境变量:
|
||||
|
||||
| 环境变量 | 描述 | 默认值 |
|
||||
|---------|------|--------|
|
||||
| PORT | 服务端口 | 3000 |
|
||||
| DATABASE_URL | 数据库连接URL | - |
|
||||
| JWT_SECRET | JWT密钥 | - |
|
||||
| JWT_EXPIRES_IN | JWT过期时间 | 24h |
|
||||
| CORS_ORIGIN | CORS允许的源 | * |
|
||||
|
||||
### 6.2 API集成示例
|
||||
|
||||
前端使用示例(基于之前的API工具类):
|
||||
|
||||
```javascript
|
||||
// 导入API工具类
|
||||
import { api } from '@/utils/api';
|
||||
|
||||
// 登录获取token
|
||||
const login = async (email, password) => {
|
||||
const response = await api.auth.login({ email, password });
|
||||
if (response.code === 200) {
|
||||
// 存储token
|
||||
localStorage.setItem('token', response.data.token);
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
|
||||
// 获取资产数据
|
||||
const fetchAssetData = async () => {
|
||||
const response = await api.assets.getAssetData();
|
||||
if (response.code === 200) {
|
||||
return response.data;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## 7. 监控与维护
|
||||
|
||||
### 7.1 日志记录
|
||||
|
||||
后端服务应记录以下类型的日志:
|
||||
- 访问日志:记录API请求和响应
|
||||
- 错误日志:记录系统错误和异常
|
||||
- 业务日志:记录重要的业务操作
|
||||
|
||||
### 7.2 健康检查
|
||||
|
||||
提供健康检查接口:
|
||||
|
||||
**接口**:`GET /api/health`
|
||||
|
||||
**响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "healthy",
|
||||
"timestamp": "2026-02-16T10:00:00Z",
|
||||
"services": {
|
||||
"database": "connected",
|
||||
"cache": "connected"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 8. 安全考虑
|
||||
|
||||
### 8.1 数据安全
|
||||
- 使用HTTPS加密传输
|
||||
- 密码使用bcrypt等算法加密存储
|
||||
- 敏感数据脱敏处理
|
||||
|
||||
### 8.2 API安全
|
||||
- 实现请求频率限制
|
||||
- 验证请求参数
|
||||
- 防止SQL注入和XSS攻击
|
||||
- 定期更新依赖包,修复安全漏洞
|
||||
|
||||
## 9. 版本控制
|
||||
|
||||
API版本控制采用URL路径前缀方式:
|
||||
|
||||
```
|
||||
https://api.demo.com/v1/...
|
||||
https://api.demo.com/v2/...
|
||||
```
|
||||
|
||||
当API接口发生重大变更时,应增加版本号,保持向后兼容。
|
||||
|
||||
## 10. 总结
|
||||
|
||||
本文档定义了个人资产策略管理系统的后端API接口规范,覆盖了资产管理、策略管理、用户管理等核心功能模块。后端开发团队应严格按照本文档实现API接口,确保与前端的无缝集成。
|
||||
|
||||
随着业务的发展,API接口可能需要不断调整和扩展,文档应及时更新以反映最新的API规范。
|
||||
@ -1,351 +0,0 @@
|
||||
# 个人资产策略管理系统 - 后端API文档
|
||||
|
||||
## 1. 基础信息
|
||||
|
||||
### 1.1 基础URL
|
||||
```
|
||||
https://api.demo.com
|
||||
```
|
||||
|
||||
### 1.2 认证方式
|
||||
- **Bearer Token**:在请求头中添加 `Authorization: Bearer <token>`
|
||||
- **Token获取**:通过登录接口获取,有效期为24小时
|
||||
|
||||
### 1.3 响应格式
|
||||
|
||||
所有API接口返回统一的JSON格式:
|
||||
|
||||
```typescript
|
||||
interface ApiResponse<T> {
|
||||
code: number; // 状态码,200表示成功,其他表示错误
|
||||
data: T; // 响应数据,根据接口不同返回不同结构
|
||||
message: string; // 响应消息,错误时返回错误信息
|
||||
}
|
||||
```
|
||||
|
||||
### 1.4 状态码说明
|
||||
|
||||
| 状态码 | 描述 |
|
||||
|-------|------|
|
||||
| 200 | 成功 |
|
||||
| 400 | 请求参数错误 |
|
||||
| 401 | 未授权 |
|
||||
| 403 | 禁止访问 |
|
||||
| 404 | 资源不存在 |
|
||||
| 500 | 服务器内部错误 |
|
||||
|
||||
## 2. API接口列表
|
||||
|
||||
### 2.1 资产相关API
|
||||
|
||||
#### 2.1.1 获取总资产数据
|
||||
|
||||
**接口**:`GET /api/assets`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| totalValue | number | 总资产估值(CNY) |
|
||||
| todayProfit | number | 今日盈亏(CNY) |
|
||||
| totalReturnRate | number | 累计收益率(%) |
|
||||
|
||||
#### 2.1.2 获取持仓组合数据
|
||||
|
||||
**接口**:`GET /api/holdings`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 持仓组合ID |
|
||||
| name | string | 持仓组合名称 |
|
||||
| tags | string | 持仓组合标签 |
|
||||
| status | string | 状态(监控中/等待信号) |
|
||||
| statusType | string | 状态类型(green/gray) |
|
||||
| iconChar | string | 图标字符 |
|
||||
| iconBgClass | string | 图标背景样式类 |
|
||||
| iconTextClass | string | 图标文本样式类 |
|
||||
| value | number | 当前市值(CNY) |
|
||||
| returnRate | number | 累计收益率(%) |
|
||||
| returnType | string | 收益类型(positive/negative) |
|
||||
|
||||
### 2.2 策略相关API
|
||||
|
||||
#### 2.2.1 获取策略列表
|
||||
|
||||
**接口**:`GET /api/strategies`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| iconChar | string | 图标字符 |
|
||||
| title | string | 策略标题 |
|
||||
| tag | string | 策略标签 |
|
||||
| desc | string | 策略描述 |
|
||||
| bgClass | string | 背景样式类 |
|
||||
| tagClass | string | 标签样式类 |
|
||||
| tags | array<string> | 策略标签数组 |
|
||||
| btnText | string | 按钮文本 |
|
||||
| btnClass | string | 按钮样式类 |
|
||||
|
||||
#### 2.2.2 获取单个策略详情
|
||||
|
||||
**接口**:`GET /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| iconChar | string | 图标字符 |
|
||||
| title | string | 策略标题 |
|
||||
| tag | string | 策略标签 |
|
||||
| desc | string | 策略描述 |
|
||||
| bgClass | string | 背景样式类 |
|
||||
| tagClass | string | 标签样式类 |
|
||||
| tags | array<string> | 策略标签数组 |
|
||||
| parameters | object | 策略参数配置 |
|
||||
| backtest | object | 回测数据 |
|
||||
|
||||
#### 2.2.3 创建新策略
|
||||
|
||||
**接口**:`POST /api/strategies`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| title | string | 策略标题 | 是 |
|
||||
| tag | string | 策略标签 | 是 |
|
||||
| desc | string | 策略描述 | 是 |
|
||||
| tags | array<string> | 策略标签数组 | 是 |
|
||||
| parameters | object | 策略参数配置 | 是 |
|
||||
| iconChar | string | 图标字符 | 否 |
|
||||
| bgClass | string | 背景样式类 | 否 |
|
||||
| tagClass | string | 标签样式类 | 否 |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 新创建的策略ID |
|
||||
| title | string | 策略标题 |
|
||||
| status | string | 创建状态 |
|
||||
|
||||
#### 2.2.4 更新策略
|
||||
|
||||
**接口**:`PUT /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**请求体**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| title | string | 策略标题 | 否 |
|
||||
| tag | string | 策略标签 | 否 |
|
||||
| desc | string | 策略描述 | 否 |
|
||||
| tags | array<string> | 策略标签数组 | 否 |
|
||||
| parameters | object | 策略参数配置 | 否 |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| status | string | 更新状态 |
|
||||
|
||||
#### 2.2.5 删除策略
|
||||
|
||||
**接口**:`DELETE /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| status | string | 删除状态 |
|
||||
|
||||
### 2.3 用户相关API
|
||||
|
||||
#### 2.3.1 获取用户信息
|
||||
|
||||
**接口**:`GET /api/user/info`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| userName | string | 用户名 |
|
||||
| memberLevel | string | 会员等级 |
|
||||
| runningDays | number | 连续运行天数 |
|
||||
| avatar | string | 头像URL |
|
||||
| email | string | 邮箱 |
|
||||
|
||||
#### 2.3.2 获取用户统计数据
|
||||
|
||||
**接口**:`GET /api/user/stats`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| signalsCaptured | number | 已捕获信号数量 |
|
||||
| winRate | number | 模拟胜率(%) |
|
||||
| totalTrades | number | 总交易次数 |
|
||||
| averageProfit | number | 平均收益(%) |
|
||||
|
||||
#### 2.3.3 更新用户信息
|
||||
|
||||
**接口**:`PUT /api/user/info`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| userName | string | 用户名 | 否 |
|
||||
| avatar | string | 头像URL | 否 |
|
||||
| email | string | 邮箱 | 否 |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| status | string | 更新状态 |
|
||||
| userName | string | 更新后的用户名 |
|
||||
|
||||
### 2.4 应用相关API
|
||||
|
||||
#### 2.4.1 获取应用信息
|
||||
|
||||
**接口**:`GET /api/app/info`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| version | string | 应用版本 |
|
||||
| currentDate | string | 当前日期(YYYY-MM-DD) |
|
||||
| latestVersion | string | 最新版本 |
|
||||
| updateAvailable | boolean | 是否有更新 |
|
||||
|
||||
### 2.5 认证相关API
|
||||
|
||||
#### 2.5.1 用户登录
|
||||
|
||||
**接口**:`POST /api/auth/login`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| email | string | 邮箱 | 是 |
|
||||
| password | string | 密码 | 是 |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| token | string | 认证令牌 |
|
||||
| expireAt | string | 令牌过期时间 |
|
||||
| user | object | 用户基本信息 |
|
||||
|
||||
#### 2.5.2 用户注册
|
||||
|
||||
**接口**:`POST /api/auth/register`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| email | string | 邮箱 | 是 |
|
||||
| password | string | 密码 | 是 |
|
||||
| userName | string | 用户名 | 是 |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 用户ID |
|
||||
| status | string | 注册状态 |
|
||||
|
||||
#### 2.5.3 微信静默登录
|
||||
|
||||
**接口**:`POST /api/auth/wechat/login`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| code | string | 微信登录凭证code | 是 |
|
||||
| encryptedData | string | 加密数据(可选,需要用户信息时提供) | 否 |
|
||||
| iv | string | 加密算法的初始向量(可选,需要用户信息时提供) | 否 |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| token | string | 认证令牌 |
|
||||
| expireAt | string | 令牌过期时间 |
|
||||
| user | object | 用户基本信息 |
|
||||
| isNewUser | boolean | 是否为新用户 |
|
||||
|
||||
#### 2.5.4 微信绑定邮箱
|
||||
|
||||
**接口**:`POST /api/auth/wechat/bind`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| email | string | 邮箱 | 是 |
|
||||
| code | string | 微信登录凭证code | 是 |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| status | string | 绑定状态 |
|
||||
| userId | string | 用户ID |
|
||||
|
||||
|
||||
## 4. 环境变量配置
|
||||
|
||||
| 环境变量 | 描述 | 默认值 |
|
||||
|---------|------|--------|
|
||||
| PORT | 服务端口 | 3000 |
|
||||
| DATABASE_URL | 数据库连接URL | - |
|
||||
| JWT_SECRET | JWT密钥 | - |
|
||||
| JWT_EXPIRES_IN | JWT过期时间 | 24h |
|
||||
| CORS_ORIGIN | CORS允许的源 | * |
|
||||
@ -1,785 +0,0 @@
|
||||
# 个人资产策略管理系统 - 后端API文档
|
||||
|
||||
## 1. 基础信息
|
||||
|
||||
### 1.1 基础URL
|
||||
```
|
||||
https://api.demo.com
|
||||
```
|
||||
|
||||
### 1.2 认证方式
|
||||
- **Bearer Token**:在请求头中添加 `Authorization: Bearer <token>`
|
||||
- **Token获取**:通过登录接口获取,有效期为24小时
|
||||
|
||||
### 1.3 响应格式
|
||||
|
||||
所有API接口返回统一的JSON格式:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200, // 状态码,200表示成功,其他表示错误
|
||||
"data": {}, // 响应数据,根据接口不同返回不同结构
|
||||
"message": "success" // 响应消息,错误时返回错误信息
|
||||
}
|
||||
```
|
||||
|
||||
### 1.4 状态码说明
|
||||
|
||||
| 状态码 | 描述 |
|
||||
|-------|------|
|
||||
| 200 | 成功 |
|
||||
| 400 | 请求参数错误 |
|
||||
| 401 | 未授权 |
|
||||
| 403 | 禁止访问 |
|
||||
| 404 | 资源不存在 |
|
||||
| 500 | 服务器内部错误 |
|
||||
|
||||
## 2. API接口列表
|
||||
|
||||
### 2.1 资产相关API
|
||||
|
||||
#### 2.1.1 获取总资产数据
|
||||
|
||||
**接口**:`GET /api/assets`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| totalValue | number | 总资产估值(CNY) |
|
||||
| todayProfit | number | 今日盈亏(CNY) |
|
||||
| totalReturnRate | number | 累计收益率(%) |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"totalValue": 1284592.40,
|
||||
"todayProfit": 12482.00,
|
||||
"totalReturnRate": 24.82
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.1.2 获取持仓组合数据
|
||||
|
||||
**接口**:`GET /api/holdings`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 持仓组合ID |
|
||||
| name | string | 持仓组合名称 |
|
||||
| tags | string | 持仓组合标签 |
|
||||
| status | string | 状态(监控中/等待信号) |
|
||||
| statusType | string | 状态类型(green/gray) |
|
||||
| iconChar | string | 图标字符 |
|
||||
| iconBgClass | string | 图标背景样式类 |
|
||||
| iconTextClass | string | 图标文本样式类 |
|
||||
| value | number | 当前市值(CNY) |
|
||||
| returnRate | number | 累计收益率(%) |
|
||||
| returnType | string | 收益类型(positive/negative) |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"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"
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 策略相关API
|
||||
|
||||
#### 2.2.1 获取策略列表
|
||||
|
||||
**接口**:`GET /api/strategies`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| iconChar | string | 图标字符 |
|
||||
| title | string | 策略标题 |
|
||||
| tag | string | 策略标签 |
|
||||
| desc | string | 策略描述 |
|
||||
| bgClass | string | 背景样式类 |
|
||||
| tagClass | string | 标签样式类 |
|
||||
| tags | array<string> | 策略标签数组 |
|
||||
| btnText | string | 按钮文本 |
|
||||
| btnClass | string | 按钮样式类 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2.2 获取单个策略详情
|
||||
|
||||
**接口**:`GET /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| iconChar | string | 图标字符 |
|
||||
| title | string | 策略标题 |
|
||||
| tag | string | 策略标签 |
|
||||
| desc | string | 策略描述 |
|
||||
| bgClass | string | 背景样式类 |
|
||||
| tagClass | string | 标签样式类 |
|
||||
| tags | array<string> | 策略标签数组 |
|
||||
| parameters | object | 策略参数配置 |
|
||||
| backtest | object | 回测数据 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"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": ["季调", "止损机制"],
|
||||
"parameters": {
|
||||
"tmfRatio": 0.55,
|
||||
"uproRatio": 0.45,
|
||||
"rebalanceInterval": "quarterly",
|
||||
"stopLoss": 0.2
|
||||
},
|
||||
"backtest": {
|
||||
"totalReturn": 1.85,
|
||||
"maxDrawdown": 0.32,
|
||||
"sharpeRatio": 0.87,
|
||||
"winRate": 0.58
|
||||
}
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2.3 创建新策略
|
||||
|
||||
**接口**:`POST /api/strategies`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| title | string | 策略标题 | 是 |
|
||||
| tag | string | 策略标签 | 是 |
|
||||
| desc | string | 策略描述 | 是 |
|
||||
| tags | array<string> | 策略标签数组 | 是 |
|
||||
| parameters | object | 策略参数配置 | 是 |
|
||||
| iconChar | string | 图标字符 | 否 |
|
||||
| bgClass | string | 背景样式类 | 否 |
|
||||
| tagClass | string | 标签样式类 | 否 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "自定义策略",
|
||||
"tag": "中风险 · 自定义",
|
||||
"desc": "基于移动平均线的趋势策略",
|
||||
"tags": ["日线", "趋势跟踪"],
|
||||
"parameters": {
|
||||
"fastPeriod": 10,
|
||||
"slowPeriod": 60,
|
||||
"stopLoss": 0.15
|
||||
},
|
||||
"iconChar": "C",
|
||||
"bgClass": "bg-purple-600",
|
||||
"tagClass": "text-purple-700"
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 新创建的策略ID |
|
||||
| title | string | 策略标题 |
|
||||
| status | string | 创建状态 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "custom-001",
|
||||
"title": "自定义策略",
|
||||
"status": "created"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2.4 更新策略
|
||||
|
||||
**接口**:`PUT /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**请求体**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| title | string | 策略标题 | 否 |
|
||||
| tag | string | 策略标签 | 否 |
|
||||
| desc | string | 策略描述 | 否 |
|
||||
| tags | array<string> | 策略标签数组 | 否 |
|
||||
| parameters | object | 策略参数配置 | 否 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "更新后的策略",
|
||||
"parameters": {
|
||||
"tmfRatio": 0.6,
|
||||
"uproRatio": 0.4
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| status | string | 更新状态 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "hfea",
|
||||
"status": "updated"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2.5 删除策略
|
||||
|
||||
**接口**:`DELETE /api/strategies/{id}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 位置 | 描述 |
|
||||
|-------|------|------|------|
|
||||
| id | string | 路径参数 | 策略ID |
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 策略ID |
|
||||
| status | string | 删除状态 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "custom-001",
|
||||
"status": "deleted"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
### 2.3 用户相关API
|
||||
|
||||
#### 2.3.1 获取用户信息
|
||||
|
||||
**接口**:`GET /api/user/info`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| userName | string | 用户名 |
|
||||
| memberLevel | string | 会员等级 |
|
||||
| runningDays | number | 连续运行天数 |
|
||||
| avatar | string | 头像URL |
|
||||
| email | string | 邮箱 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"userName": "首席策略员 0x42",
|
||||
"memberLevel": "全球实验室 Pro",
|
||||
"runningDays": 412,
|
||||
"avatar": "https://example.com/avatar.png",
|
||||
"email": "user@example.com"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.3.2 获取用户统计数据
|
||||
|
||||
**接口**:`GET /api/user/stats`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| signalsCaptured | number | 已捕获信号数量 |
|
||||
| winRate | number | 模拟胜率(%) |
|
||||
| totalTrades | number | 总交易次数 |
|
||||
| averageProfit | number | 平均收益(%) |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"signalsCaptured": 1248,
|
||||
"winRate": 58.4,
|
||||
"totalTrades": 2138,
|
||||
"averageProfit": 2.3
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.3.3 更新用户信息
|
||||
|
||||
**接口**:`PUT /api/user/info`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| userName | string | 用户名 | 否 |
|
||||
| avatar | string | 头像URL | 否 |
|
||||
| email | string | 邮箱 | 否 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"userName": "策略大师 0x42",
|
||||
"email": "newemail@example.com"
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| status | string | 更新状态 |
|
||||
| userName | string | 更新后的用户名 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"status": "updated",
|
||||
"userName": "策略大师 0x42"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
### 2.4 应用相关API
|
||||
|
||||
#### 2.4.1 获取应用信息
|
||||
|
||||
**接口**:`GET /api/app/info`
|
||||
|
||||
**请求参数**:无
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| version | string | 应用版本 |
|
||||
| currentDate | string | 当前日期(YYYY-MM-DD) |
|
||||
| latestVersion | string | 最新版本 |
|
||||
| updateAvailable | boolean | 是否有更新 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"version": "v2.4.0",
|
||||
"currentDate": "2026-02-16",
|
||||
"latestVersion": "v2.4.0",
|
||||
"updateAvailable": false
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
### 2.5 认证相关API
|
||||
|
||||
#### 2.5.1 用户登录
|
||||
|
||||
**接口**:`POST /api/auth/login`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| email | string | 邮箱 | 是 |
|
||||
| password | string | 密码 | 是 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"email": "user@example.com",
|
||||
"password": "password123"
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| token | string | 认证令牌 |
|
||||
| expireAt | string | 令牌过期时间 |
|
||||
| user | object | 用户基本信息 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||
"expireAt": "2026-02-17T10:00:00Z",
|
||||
"user": {
|
||||
"userName": "首席策略员 0x42",
|
||||
"memberLevel": "全球实验室 Pro"
|
||||
}
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.5.2 用户注册
|
||||
|
||||
**接口**:`POST /api/auth/register`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|-------|------|------|------|
|
||||
| email | string | 邮箱 | 是 |
|
||||
| password | string | 密码 | 是 |
|
||||
| userName | string | 用户名 | 是 |
|
||||
|
||||
**示例请求**:
|
||||
|
||||
```json
|
||||
{
|
||||
"email": "newuser@example.com",
|
||||
"password": "password123",
|
||||
"userName": "新用户"
|
||||
}
|
||||
```
|
||||
|
||||
**响应参数**:
|
||||
|
||||
| 字段名 | 类型 | 描述 |
|
||||
|-------|------|------|
|
||||
| id | string | 用户ID |
|
||||
| status | string | 注册状态 |
|
||||
|
||||
**示例响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "user-001",
|
||||
"status": "registered"
|
||||
},
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
|
||||
## 3. 实体类定义
|
||||
|
||||
### 3.1 资产相关实体
|
||||
|
||||
#### 3.1.1 AssetData
|
||||
```typescript
|
||||
interface AssetData {
|
||||
totalValue: number; // 总资产估值(CNY)
|
||||
todayProfit: number; // 今日盈亏(CNY)
|
||||
totalReturnRate: number; // 累计收益率(%)
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.1.2 Holding
|
||||
```typescript
|
||||
interface Holding {
|
||||
id: string; // 持仓组合ID
|
||||
name: string; // 持仓组合名称
|
||||
tags: string; // 持仓组合标签
|
||||
status: string; // 状态(监控中/等待信号)
|
||||
statusType: string; // 状态类型(green/gray)
|
||||
iconChar: string; // 图标字符
|
||||
iconBgClass: string; // 图标背景样式类
|
||||
iconTextClass: string; // 图标文本样式类
|
||||
value: number; // 当前市值(CNY)
|
||||
returnRate: number; // 累计收益率(%)
|
||||
returnType: string; // 收益类型(positive/negative)
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 策略相关实体
|
||||
|
||||
#### 3.2.1 Strategy
|
||||
```typescript
|
||||
interface Strategy {
|
||||
id: string; // 策略ID
|
||||
iconChar: string; // 图标字符
|
||||
title: string; // 策略标题
|
||||
tag: string; // 策略标签
|
||||
desc: string; // 策略描述
|
||||
bgClass: string; // 背景样式类
|
||||
tagClass: string; // 标签样式类
|
||||
tags: string[]; // 策略标签数组
|
||||
btnText: string; // 按钮文本
|
||||
btnClass: string; // 按钮样式类
|
||||
parameters?: object; // 策略参数配置(可选)
|
||||
backtest?: BacktestData; // 回测数据(可选)
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.2 BacktestData
|
||||
```typescript
|
||||
interface BacktestData {
|
||||
totalReturn: number; // 总收益
|
||||
maxDrawdown: number; // 最大回撤
|
||||
sharpeRatio: number; // 夏普比率
|
||||
winRate: number; // 胜率
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.3 StrategyCreate
|
||||
```typescript
|
||||
interface StrategyCreate {
|
||||
title: string; // 策略标题
|
||||
tag: string; // 策略标签
|
||||
desc: string; // 策略描述
|
||||
tags: string[]; // 策略标签数组
|
||||
parameters: object; // 策略参数配置
|
||||
iconChar?: string; // 图标字符(可选)
|
||||
bgClass?: string; // 背景样式类(可选)
|
||||
tagClass?: string; // 标签样式类(可选)
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.4 StrategyUpdate
|
||||
```typescript
|
||||
interface StrategyUpdate {
|
||||
title?: string; // 策略标题(可选)
|
||||
tag?: string; // 策略标签(可选)
|
||||
desc?: string; // 策略描述(可选)
|
||||
tags?: string[]; // 策略标签数组(可选)
|
||||
parameters?: object; // 策略参数配置(可选)
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 用户相关实体
|
||||
|
||||
#### 3.3.1 UserInfo
|
||||
```typescript
|
||||
interface UserInfo {
|
||||
userName: string; // 用户名
|
||||
memberLevel: string; // 会员等级
|
||||
runningDays: number; // 连续运行天数
|
||||
avatar?: string; // 头像URL(可选)
|
||||
email?: string; // 邮箱(可选)
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.3.2 UserStats
|
||||
```typescript
|
||||
interface UserStats {
|
||||
signalsCaptured: number; // 已捕获信号数量
|
||||
winRate: number; // 模拟胜率(%)
|
||||
totalTrades: number; // 总交易次数
|
||||
averageProfit: number; // 平均收益(%)
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.3.3 UserUpdate
|
||||
```typescript
|
||||
interface UserUpdate {
|
||||
userName?: string; // 用户名(可选)
|
||||
avatar?: string; // 头像URL(可选)
|
||||
email?: string; // 邮箱(可选)
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.3.4 LoginRequest
|
||||
```typescript
|
||||
interface LoginRequest {
|
||||
email: string; // 邮箱
|
||||
password: string; // 密码
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.3.5 RegisterRequest
|
||||
```typescript
|
||||
interface RegisterRequest {
|
||||
email: string; // 邮箱
|
||||
password: string; // 密码
|
||||
userName: string; // 用户名
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.3.6 AuthResponse
|
||||
```typescript
|
||||
interface AuthResponse {
|
||||
token: string; // 认证令牌
|
||||
expireAt: string; // 令牌过期时间
|
||||
user: {
|
||||
userName: string; // 用户名
|
||||
memberLevel: string; // 会员等级
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 3.4 应用相关实体
|
||||
|
||||
#### 3.4.1 AppInfo
|
||||
```typescript
|
||||
interface AppInfo {
|
||||
version: string; // 应用版本
|
||||
currentDate: string; // 当前日期(YYYY-MM-DD)
|
||||
latestVersion: string; // 最新版本
|
||||
updateAvailable: boolean; // 是否有更新
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 响应包装类
|
||||
|
||||
### 4.1 ApiResponse
|
||||
```typescript
|
||||
interface ApiResponse<T> {
|
||||
code: number; // 状态码,200表示成功
|
||||
data: T; // 响应数据
|
||||
message: string; // 响应消息
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 环境变量配置
|
||||
|
||||
| 环境变量 | 描述 | 默认值 |
|
||||
|---------|------|--------|
|
||||
| PORT | 服务端口 | 3000 |
|
||||
| DATABASE_URL | 数据库连接URL | - |
|
||||
| JWT_SECRET | JWT密钥 | - |
|
||||
| JWT_EXPIRES_IN | JWT过期时间 | 24h |
|
||||
| CORS_ORIGIN | CORS允许的源 | * |
|
||||
48
README.md
Normal file
48
README.md
Normal file
@ -0,0 +1,48 @@
|
||||
# 智投策略管家 (Smart Strategy Portfolio) - 移动端
|
||||
|
||||
[](https://vuejs.org/)
|
||||
[](https://uniapp.dcloud.net.cn/)
|
||||
[](LICENSE)
|
||||
|
||||
> 专注为个人投资者打造的**多策略、信号驱动**的量化资产管理工具前端项目。
|
||||
> *“不要让混杂的持仓影响你的判断,让纪律和策略接管交易。”*
|
||||
|
||||
## 🎯 为什么做这个项目?
|
||||
|
||||
在实际投资中,成熟的投资者通常会在同一个证券账户中运行多种不同的交易策略(例如:50% 资金跑 **HFEA 资产配置**,20% 资金跑 **TQQQ 吊灯止损**)。
|
||||
传统券商 App 只能提供“账户维度”的汇总,导致资产混杂、信号钝化、极易引发情绪化交易。
|
||||
|
||||
本项目旨在通过**“虚拟策略子账户”**的概念,在 UI 层面上将物理账户中的资产进行逻辑隔离,并以可视化的方式输出明确的交易信号(买入/卖出/再平衡),辅助投资者坚守交易纪律。
|
||||
|
||||
## ✨ 前端核心特性
|
||||
|
||||
* **🚥 信号驱动看板**:首页摒弃传统的“总资产金额”视觉中心,重点展示各策略的分组卡片及当前状态(安全/预警/触发止损)。
|
||||
* **🧩 策略深度隔离**:每个自定义组合等同于一个独立的“虚拟子账户”,内聚对应的持仓明细、盈亏状况及交易记录。
|
||||
* **🛠️ 完善的 Mock 机制**:内置离线 Mock 数据拦截(位于 `utils/api.js`),即使在无后端服务的情况下也能完整体验核心交互流程。
|
||||
* **📱 极简金融 UI**:采用统一的深绿色主题 (`#064E3B`),配合精致的卡片阴影与响应式交互,遵循 WeUI 极简设计规范。
|
||||
|
||||
## 🏗️ 技术栈
|
||||
|
||||
* **核心框架**:[uni-app](https://uniapp.dcloud.net.cn/) (跨端应用框架)
|
||||
* **视图层**:Vue 3.x (Composition API 组合式注入)
|
||||
* **样式处理**:Tailwind-like utility classes + CSS 变量
|
||||
* **运行平台**:优先适配**微信小程序**,支持编译至 H5 及 App 端。
|
||||
|
||||
## 📁 目录结构
|
||||
|
||||
```text
|
||||
AssetManager.UniApp/
|
||||
├── pages/ # 核心业务页面
|
||||
│ ├── index/ # 首页:资产总览与策略看板
|
||||
│ ├── strategies/ # 策略中心:内置经典量化策略库
|
||||
│ ├── detail/ # 详情页:特定策略的持仓与信号明细
|
||||
│ ├── config/ # 配置页:策略参数调节
|
||||
│ └── me/ # 我的:个人中心与设置
|
||||
├── utils/ # 工具类库
|
||||
│ └── api.js # 统一 API 封装与 Mock 数据拦截
|
||||
├── static/ # 静态资源 (图片、Icon 等)
|
||||
├── uni_modules/ # uni-app 官方或第三方插件模块
|
||||
├── App.vue # 应用全局生命周期与状态入口
|
||||
├── main.js # Vue 3 初始化入口
|
||||
├── manifest.json # 跨端编译及应用信息配置
|
||||
└── pages.json # 路由注册与全局外观配置
|
||||
@ -1,8 +1,8 @@
|
||||
{
|
||||
"hash": "5ac74707",
|
||||
"configHash": "e7d4de71",
|
||||
"hash": "304f64a0",
|
||||
"configHash": "76c6f0ab",
|
||||
"lockfileHash": "e3b0c442",
|
||||
"browserHash": "5cc1b7e0",
|
||||
"browserHash": "9bd62ce4",
|
||||
"optimized": {},
|
||||
"chunks": {}
|
||||
}
|
||||
@ -1 +1 @@
|
||||
{"version":3,"file":"app.js","sources":["App.vue","main.js"],"sourcesContent":["<script>\n\texport default {\n\t\tonLaunch: function() {\n\t\t\tconsole.log('App Launch')\n\t\t},\n\t\tonShow: function() {\n\t\t\tconsole.log('App Show')\n\t\t},\n\t\tonHide: function() {\n\t\t\tconsole.log('App Hide')\n\t\t}\n\t}\n</script>\n\n<style>\n\t/* 每个页面公共css */\n\tpage {\n\t\tbackground-color: #F3F4F6;\n\t\tfont-family: 'Inter', 'Noto Sans SC', sans-serif;\n\t\t--brand-color: #064e3b;\n\t\t--brand-light: #10B981;\n\t}\n\t\n\t/* 通用工具类 */\n\t.bg-white { background-color: #ffffff; }\n\t.rounded-2xl { border-radius: 32rpx; }\n\t.shadow-sm { box-shadow: 0 2rpx 6rpx rgba(0,0,0,0.05); }\n\t.flex-row { display: flex; flex-direction: row; }\n\t.flex-col { display: flex; flex-direction: column; }\n\t.items-center { align-items: center; }\n\t.justify-between { justify-content: space-between; }\n</style>","import App from './App'\n\n// #ifndef VUE3\nimport Vue from 'vue'\nimport './uni.promisify.adaptor'\nVue.config.productionTip = false\nApp.mpType = 'app'\nconst app = new Vue({\n ...App\n})\napp.$mount()\n// #endif\n\n// #ifdef VUE3\nimport { createSSRApp } from 'vue'\nexport function createApp() {\n const app = createSSRApp(App)\n return {\n app\n }\n}\n// #endif"],"names":["uni","createSSRApp","App"],"mappings":";;;;;;;;;;;AACC,MAAK,YAAU;AAAA,EACd,UAAU,WAAW;AACpBA,kBAAAA,MAAY,MAAA,OAAA,gBAAA,YAAY;AAAA,EACxB;AAAA,EACD,QAAQ,WAAW;AAClBA,kBAAAA,MAAY,MAAA,OAAA,gBAAA,UAAU;AAAA,EACtB;AAAA,EACD,QAAQ,WAAW;AAClBA,kBAAAA,MAAY,MAAA,OAAA,iBAAA,UAAU;AAAA,EACvB;AACD;ACIM,SAAS,YAAY;AAC1B,QAAM,MAAMC,cAAY,aAACC,SAAG;AAC5B,SAAO;AAAA,IACL;AAAA,EACD;AACH;;;"}
|
||||
{"version":3,"file":"app.js","sources":["App.vue","main.js"],"sourcesContent":["<script>\r\n\timport api from './utils/api'\r\n\texport default {\r\n\t\tonLaunch: function() {\r\n\t\t\tconsole.log('App Launch')\r\n\t\t\t// 执行微信静默登录\r\n\t\t\tthis.wechatSilentLogin()\r\n\t\t},\r\n\t\tonShow: function() {\r\n\t\t\tconsole.log('App Show')\r\n\t\t},\r\n\t\tonHide: function() {\r\n\t\t\tconsole.log('App Hide')\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 微信静默登录\r\n\t\t\twechatSilentLogin() {\r\n\t\t\t\t// 检查是否在微信小程序环境中\r\n\t\t\t\tif (uni.getSystemInfoSync().platform === 'devtools' || uni.getSystemInfoSync().platform === 'mp-weixin') {\r\n\t\t\t\t\t// 调用微信登录API获取code\r\n\t\t\t\t\tuni.login({\r\n\t\t\t\t\t\tprovider: 'weixin',\r\n\t\t\t\t\t\tsuccess: (loginRes) => {\r\n\t\t\t\t\t\t\tif (loginRes.code) {\r\n\t\t\t\t\t\t\t\t// 将code发送到后端进行登录\r\n\t\t\t\t\t\t\t\tapi.auth.wechatLogin(loginRes.code)\r\n\t\t\t\t\t\t\t\t\t.then(res => {\r\n\t\t\t\t\t\t\t\t\t\tif (res.code === 200) {\r\n\t\t\t\t\t\t\t\t\t\t\t// 登录成功,存储token\r\n\t\t\t\t\t\t\t\t\t\t\tuni.setStorageSync('token', res.data.token)\r\n\t\t\t\t\t\t\t\t\t\t\tuni.setStorageSync('userInfo', res.data.userInfo)\r\n\t\t\t\t\t\t\t\t\t\t\tconsole.log('微信静默登录成功')\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\tconsole.log('微信静默登录失败:', res.message)\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t.catch(err => {\r\n\t\t\t\t\t\t\t\t\t\tconsole.log('微信登录API调用失败:', err)\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tconsole.log('获取微信登录code失败:', loginRes.errMsg)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tfail: (err) => {\r\n\t\t\t\t\t\t\tconsole.log('微信登录失败:', err)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style>\r\n\t/* 每个页面公共css */\r\n\tpage {\r\n\t\tbackground-color: #F3F4F6;\r\n\t\tfont-family: 'Inter', 'Noto Sans SC', sans-serif;\r\n\t\t--brand-color: #064e3b;\r\n\t\t--brand-light: #10B981;\r\n\t}\r\n\t\r\n\t/* 通用工具类 */\r\n\t.bg-white { background-color: #ffffff; }\r\n\t.rounded-2xl { border-radius: 32rpx; }\r\n\t.shadow-sm { box-shadow: 0 2rpx 6rpx rgba(0,0,0,0.05); }\r\n\t.flex-row { display: flex; flex-direction: row; }\r\n\t.flex-col { display: flex; flex-direction: column; }\r\n\t.items-center { align-items: center; }\r\n\t.justify-between { justify-content: space-between; }\r\n</style>","import App from './App'\r\n\r\n// #ifndef VUE3\r\nimport Vue from 'vue'\r\nimport './uni.promisify.adaptor'\r\nVue.config.productionTip = false\r\nApp.mpType = 'app'\r\nconst app = new Vue({\r\n ...App\r\n})\r\napp.$mount()\r\n// #endif\r\n\r\n// #ifdef VUE3\r\nimport { createSSRApp } from 'vue'\r\nexport function createApp() {\r\n const app = createSSRApp(App)\r\n return {\r\n app\r\n }\r\n}\r\n// #endif"],"names":["uni","api","createSSRApp","App"],"mappings":";;;;;;;;;;;;AAEC,MAAK,YAAU;AAAA,EACd,UAAU,WAAW;AACpBA,kBAAAA,MAAA,MAAA,OAAA,gBAAY,YAAY;AAExB,SAAK,kBAAkB;AAAA,EACvB;AAAA,EACD,QAAQ,WAAW;AAClBA,kBAAAA,MAAY,MAAA,OAAA,iBAAA,UAAU;AAAA,EACtB;AAAA,EACD,QAAQ,WAAW;AAClBA,kBAAAA,MAAY,MAAA,OAAA,iBAAA,UAAU;AAAA,EACtB;AAAA,EACD,SAAS;AAAA;AAAA,IAER,oBAAoB;AAEnB,UAAIA,cAAG,MAAC,kBAAmB,EAAC,aAAa,cAAcA,cAAAA,MAAI,kBAAiB,EAAG,aAAa,aAAa;AAExGA,sBAAAA,MAAI,MAAM;AAAA,UACT,UAAU;AAAA,UACV,SAAS,CAAC,aAAa;AACtB,gBAAI,SAAS,MAAM;AAElBC,wBAAAA,IAAI,KAAK,YAAY,SAAS,IAAI,EAChC,KAAK,SAAO;AACZ,oBAAI,IAAI,SAAS,KAAK;AAErBD,gCAAAA,MAAI,eAAe,SAAS,IAAI,KAAK,KAAK;AAC1CA,gCAAAA,MAAI,eAAe,YAAY,IAAI,KAAK,QAAQ;AAChDA,gCAAAA,MAAA,MAAA,OAAA,iBAAY,UAAU;AAAA,uBAChB;AACNA,oEAAY,aAAa,IAAI,OAAO;AAAA,gBACrC;AAAA,eACA,EACA,MAAM,SAAO;AACbA,8BAAAA,MAAA,MAAA,OAAA,iBAAY,gBAAgB,GAAG;AAAA,eAC/B;AAAA,mBACI;AACNA,4BAAY,MAAA,MAAA,OAAA,iBAAA,iBAAiB,SAAS,MAAM;AAAA,YAC7C;AAAA,UACA;AAAA,UACD,MAAM,CAAC,QAAQ;AACdA,0BAAAA,MAAA,MAAA,OAAA,iBAAY,WAAW,GAAG;AAAA,UAC3B;AAAA,SACA;AAAA,MACF;AAAA,IACD;AAAA,EACD;AACD;ACnCM,SAAS,YAAY;AAC1B,QAAM,MAAME,cAAY,aAACC,SAAG;AAC5B,SAAO;AAAA,IACL;AAAA,EACD;AACH;;;"}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
{"version":3,"file":"uni-icons.js","sources":["uni_modules/uni-icons/components/uni-icons/uni-icons.vue","/Users/fanfpy/Documents/HBuilderProjects/个人资产策略管理/uni_modules/uni-icons/components/uni-icons/uni-icons.vue?type=component"],"sourcesContent":["<template>\r\n\t<!-- #ifdef APP-NVUE -->\r\n\t<text :style=\"styleObj\" class=\"uni-icons\" @click=\"_onClick\">{{unicode}}</text>\r\n\t<!-- #endif -->\r\n\t<!-- #ifndef APP-NVUE -->\r\n\t<text :style=\"styleObj\" class=\"uni-icons\" :class=\"['uniui-'+type,customPrefix,customPrefix?type:'']\" @click=\"_onClick\">\r\n\t\t<slot></slot>\r\n\t</text>\r\n\t<!-- #endif -->\r\n</template>\r\n\r\n<script>\r\n\timport { fontData } from './uniicons_file_vue.js';\r\n\r\n\tconst getVal = (val) => {\r\n\t\tconst reg = /^[0-9]*$/g\r\n\t\treturn (typeof val === 'number' || reg.test(val)) ? val + 'px' : val;\r\n\t}\r\n\r\n\t// #ifdef APP-NVUE\r\n\tvar domModule = weex.requireModule('dom');\r\n\timport iconUrl from './uniicons.ttf'\r\n\tdomModule.addRule('fontFace', {\r\n\t\t'fontFamily': \"uniicons\",\r\n\t\t'src': \"url('\" + iconUrl + \"')\"\r\n\t});\r\n\t// #endif\r\n\r\n\t/**\r\n\t * Icons 图标\r\n\t * @description 用于展示 icons 图标\r\n\t * @tutorial https://ext.dcloud.net.cn/plugin?id=28\r\n\t * @property {Number} size 图标大小\r\n\t * @property {String} type 图标图案,参考示例\r\n\t * @property {String} color 图标颜色\r\n\t * @property {String} customPrefix 自定义图标\r\n\t * @event {Function} click 点击 Icon 触发事件\r\n\t */\r\n\texport default {\r\n\t\tname: 'UniIcons',\r\n\t\temits: ['click'],\r\n\t\tprops: {\r\n\t\t\ttype: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#333333'\r\n\t\t\t},\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 16\r\n\t\t\t},\r\n\t\t\tcustomPrefix: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\tfontFamily: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\ticons: fontData\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tunicode() {\r\n\t\t\t\tlet code = this.icons.find(v => v.font_class === this.type)\r\n\t\t\t\tif (code) {\r\n\t\t\t\t\treturn code.unicode\r\n\t\t\t\t}\r\n\t\t\t\treturn ''\r\n\t\t\t},\r\n\t\t\ticonSize() {\r\n\t\t\t\treturn getVal(this.size)\r\n\t\t\t},\r\n\t\t\tstyleObj() {\r\n\t\t\t\tif (this.fontFamily !== '') {\r\n\t\t\t\t\treturn `color: ${this.color}; font-size: ${this.iconSize}; font-family: ${this.fontFamily};`\r\n\t\t\t\t}\r\n\t\t\t\treturn `color: ${this.color}; font-size: ${this.iconSize};`\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t_onClick(e) {\r\n\t\t\t\tthis.$emit('click', e)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n\t/* #ifndef APP-NVUE */\r\n\t@import './uniicons.css';\r\n\r\n\t@font-face {\r\n\t\tfont-family: uniicons;\r\n\t\tsrc: url('./uniicons.ttf');\r\n\t}\r\n\r\n\t/* #endif */\r\n\t.uni-icons {\r\n\t\tfont-family: uniicons;\r\n\t\ttext-decoration: none;\r\n\t\ttext-align: center;\r\n\t}\r\n</style>","import Component from '/Users/fanfpy/Documents/HBuilderProjects/个人资产策略管理/uni_modules/uni-icons/components/uni-icons/uni-icons.vue'\nwx.createComponent(Component)"],"names":["fontData"],"mappings":";;;AAcC,MAAM,SAAS,CAAC,QAAQ;AACvB,QAAM,MAAM;AACZ,SAAQ,OAAO,QAAQ,YAAY,IAAI,KAAK,GAAG,IAAK,MAAM,OAAO;AAClE;AAqBA,MAAK,YAAU;AAAA,EACd,MAAM;AAAA,EACN,OAAO,CAAC,OAAO;AAAA,EACf,OAAO;AAAA,IACN,MAAM;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,OAAO;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,MAAM;AAAA,MACL,MAAM,CAAC,QAAQ,MAAM;AAAA,MACrB,SAAS;AAAA,IACT;AAAA,IACD,cAAc;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,YAAY;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,EACA;AAAA,EACD,OAAO;AACN,WAAO;AAAA,MACN,OAAOA,2DAAO;AAAA,IACf;AAAA,EACA;AAAA,EACD,UAAU;AAAA,IACT,UAAU;AACT,UAAI,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,eAAe,KAAK,IAAI;AAC1D,UAAI,MAAM;AACT,eAAO,KAAK;AAAA,MACb;AACA,aAAO;AAAA,IACP;AAAA,IACD,WAAW;AACV,aAAO,OAAO,KAAK,IAAI;AAAA,IACvB;AAAA,IACD,WAAW;AACV,UAAI,KAAK,eAAe,IAAI;AAC3B,eAAO,UAAU,KAAK,KAAK,gBAAgB,KAAK,QAAQ,kBAAkB,KAAK,UAAU;AAAA,MAC1F;AACA,aAAO,UAAU,KAAK,KAAK,gBAAgB,KAAK,QAAQ;AAAA,IACzD;AAAA,EACA;AAAA,EACD,SAAS;AAAA,IACR,SAAS,GAAG;AACX,WAAK,MAAM,SAAS,CAAC;AAAA,IACtB;AAAA,EACD;AACD;;;;;;;;;;;AC1FD,GAAG,gBAAgB,SAAS;"}
|
||||
{"version":3,"file":"uni-icons.js","sources":["uni_modules/uni-icons/components/uni-icons/uni-icons.vue","D:/Program Files/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/QzovVXNlcnMvYWRtaW4vc291cmNlL3JlcG9zL0Fzc2V0TWFuYWdlci5VbmlBcHAvdW5pX21vZHVsZXMvdW5pLWljb25zL2NvbXBvbmVudHMvdW5pLWljb25zL3VuaS1pY29ucy52dWU"],"sourcesContent":["<template>\r\n\t<!-- #ifdef APP-NVUE -->\r\n\t<text :style=\"styleObj\" class=\"uni-icons\" @click=\"_onClick\">{{unicode}}</text>\r\n\t<!-- #endif -->\r\n\t<!-- #ifndef APP-NVUE -->\r\n\t<text :style=\"styleObj\" class=\"uni-icons\" :class=\"['uniui-'+type,customPrefix,customPrefix?type:'']\" @click=\"_onClick\">\r\n\t\t<slot></slot>\r\n\t</text>\r\n\t<!-- #endif -->\r\n</template>\r\n\r\n<script>\r\n\timport { fontData } from './uniicons_file_vue.js';\r\n\r\n\tconst getVal = (val) => {\r\n\t\tconst reg = /^[0-9]*$/g\r\n\t\treturn (typeof val === 'number' || reg.test(val)) ? val + 'px' : val;\r\n\t}\r\n\r\n\t// #ifdef APP-NVUE\r\n\tvar domModule = weex.requireModule('dom');\r\n\timport iconUrl from './uniicons.ttf'\r\n\tdomModule.addRule('fontFace', {\r\n\t\t'fontFamily': \"uniicons\",\r\n\t\t'src': \"url('\" + iconUrl + \"')\"\r\n\t});\r\n\t// #endif\r\n\r\n\t/**\r\n\t * Icons 图标\r\n\t * @description 用于展示 icons 图标\r\n\t * @tutorial https://ext.dcloud.net.cn/plugin?id=28\r\n\t * @property {Number} size 图标大小\r\n\t * @property {String} type 图标图案,参考示例\r\n\t * @property {String} color 图标颜色\r\n\t * @property {String} customPrefix 自定义图标\r\n\t * @event {Function} click 点击 Icon 触发事件\r\n\t */\r\n\texport default {\r\n\t\tname: 'UniIcons',\r\n\t\temits: ['click'],\r\n\t\tprops: {\r\n\t\t\ttype: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#333333'\r\n\t\t\t},\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 16\r\n\t\t\t},\r\n\t\t\tcustomPrefix: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\tfontFamily: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\ticons: fontData\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tunicode() {\r\n\t\t\t\tlet code = this.icons.find(v => v.font_class === this.type)\r\n\t\t\t\tif (code) {\r\n\t\t\t\t\treturn code.unicode\r\n\t\t\t\t}\r\n\t\t\t\treturn ''\r\n\t\t\t},\r\n\t\t\ticonSize() {\r\n\t\t\t\treturn getVal(this.size)\r\n\t\t\t},\r\n\t\t\tstyleObj() {\r\n\t\t\t\tif (this.fontFamily !== '') {\r\n\t\t\t\t\treturn `color: ${this.color}; font-size: ${this.iconSize}; font-family: ${this.fontFamily};`\r\n\t\t\t\t}\r\n\t\t\t\treturn `color: ${this.color}; font-size: ${this.iconSize};`\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t_onClick(e) {\r\n\t\t\t\tthis.$emit('click', e)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n\t/* #ifndef APP-NVUE */\r\n\t@import './uniicons.css';\r\n\r\n\t@font-face {\r\n\t\tfont-family: uniicons;\r\n\t\tsrc: url('./uniicons.ttf');\r\n\t}\r\n\r\n\t/* #endif */\r\n\t.uni-icons {\r\n\t\tfont-family: uniicons;\r\n\t\ttext-decoration: none;\r\n\t\ttext-align: center;\r\n\t}\r\n</style>","import Component from 'C:/Users/admin/source/repos/AssetManager.UniApp/uni_modules/uni-icons/components/uni-icons/uni-icons.vue'\nwx.createComponent(Component)"],"names":["fontData"],"mappings":";;;AAcC,MAAM,SAAS,CAAC,QAAQ;AACvB,QAAM,MAAM;AACZ,SAAQ,OAAO,QAAQ,YAAY,IAAI,KAAK,GAAG,IAAK,MAAM,OAAO;AAClE;AAqBA,MAAK,YAAU;AAAA,EACd,MAAM;AAAA,EACN,OAAO,CAAC,OAAO;AAAA,EACf,OAAO;AAAA,IACN,MAAM;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,OAAO;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,MAAM;AAAA,MACL,MAAM,CAAC,QAAQ,MAAM;AAAA,MACrB,SAAS;AAAA,IACT;AAAA,IACD,cAAc;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,YAAY;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,EACA;AAAA,EACD,OAAO;AACN,WAAO;AAAA,MACN,OAAOA,2DAAO;AAAA,IACf;AAAA,EACA;AAAA,EACD,UAAU;AAAA,IACT,UAAU;AACT,UAAI,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,eAAe,KAAK,IAAI;AAC1D,UAAI,MAAM;AACT,eAAO,KAAK;AAAA,MACb;AACA,aAAO;AAAA,IACP;AAAA,IACD,WAAW;AACV,aAAO,OAAO,KAAK,IAAI;AAAA,IACvB;AAAA,IACD,WAAW;AACV,UAAI,KAAK,eAAe,IAAI;AAC3B,eAAO,UAAU,KAAK,KAAK,gBAAgB,KAAK,QAAQ,kBAAkB,KAAK,UAAU;AAAA,MAC1F;AACA,aAAO,UAAU,KAAK,KAAK,gBAAgB,KAAK,QAAQ;AAAA,IACzD;AAAA,EACA;AAAA,EACD,SAAS;AAAA,IACR,SAAS,GAAG;AACX,WAAK,MAAM,SAAS,CAAC;AAAA,IACtB;AAAA,EACD;AACD;;;;;;;;;;;AC1FD,GAAG,gBAAgB,SAAS;"}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
38
unpackage/dist/dev/mp-weixin/app.js
vendored
38
unpackage/dist/dev/mp-weixin/app.js
vendored
@ -1,6 +1,7 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
const common_vendor = require("./common/vendor.js");
|
||||
const utils_api = require("./utils/api.js");
|
||||
if (!Math) {
|
||||
"./pages/index/index.js";
|
||||
"./pages/strategies/strategies.js";
|
||||
@ -11,13 +12,44 @@ if (!Math) {
|
||||
}
|
||||
const _sfc_main = {
|
||||
onLaunch: function() {
|
||||
common_vendor.index.__f__("log", "at App.vue:4", "App Launch");
|
||||
common_vendor.index.__f__("log", "at App.vue:5", "App Launch");
|
||||
this.wechatSilentLogin();
|
||||
},
|
||||
onShow: function() {
|
||||
common_vendor.index.__f__("log", "at App.vue:7", "App Show");
|
||||
common_vendor.index.__f__("log", "at App.vue:10", "App Show");
|
||||
},
|
||||
onHide: function() {
|
||||
common_vendor.index.__f__("log", "at App.vue:10", "App Hide");
|
||||
common_vendor.index.__f__("log", "at App.vue:13", "App Hide");
|
||||
},
|
||||
methods: {
|
||||
// 微信静默登录
|
||||
wechatSilentLogin() {
|
||||
if (common_vendor.index.getSystemInfoSync().platform === "devtools" || common_vendor.index.getSystemInfoSync().platform === "mp-weixin") {
|
||||
common_vendor.index.login({
|
||||
provider: "weixin",
|
||||
success: (loginRes) => {
|
||||
if (loginRes.code) {
|
||||
utils_api.api.auth.wechatLogin(loginRes.code).then((res) => {
|
||||
if (res.code === 200) {
|
||||
common_vendor.index.setStorageSync("token", res.data.token);
|
||||
common_vendor.index.setStorageSync("userInfo", res.data.userInfo);
|
||||
common_vendor.index.__f__("log", "at App.vue:32", "微信静默登录成功");
|
||||
} else {
|
||||
common_vendor.index.__f__("log", "at App.vue:34", "微信静默登录失败:", res.message);
|
||||
}
|
||||
}).catch((err) => {
|
||||
common_vendor.index.__f__("log", "at App.vue:38", "微信登录API调用失败:", err);
|
||||
});
|
||||
} else {
|
||||
common_vendor.index.__f__("log", "at App.vue:41", "获取微信登录code失败:", loginRes.errMsg);
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
common_vendor.index.__f__("log", "at App.vue:45", "微信登录失败:", err);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
function createApp() {
|
||||
|
||||
@ -7046,9 +7046,9 @@ function isConsoleWritable() {
|
||||
return isWritable;
|
||||
}
|
||||
function initRuntimeSocketService() {
|
||||
const hosts = "127.0.0.1,192.168.124.7,10.195.102.1,198.18.0.1";
|
||||
const port = "8090";
|
||||
const id = "mp-weixin_XkPWEE";
|
||||
const hosts = "198.18.0.1,100.117.139.1,192.168.0.236,10.195.102.223,127.0.0.1";
|
||||
const port = "8092";
|
||||
const id = "mp-weixin_ZuGrLn";
|
||||
const lazy = typeof swan !== "undefined";
|
||||
let restoreError = lazy ? () => {
|
||||
} : initOnError();
|
||||
|
||||
51
unpackage/dist/dev/mp-weixin/utils/api.js
vendored
51
unpackage/dist/dev/mp-weixin/utils/api.js
vendored
@ -3,6 +3,7 @@ const common_vendor = require("../common/vendor.js");
|
||||
const BASE_URL = "https://api.assetmanager.com";
|
||||
const TIMEOUT = 1e4;
|
||||
const request = (url, method = "GET", data = {}, headers = {}) => {
|
||||
const token = common_vendor.index.getStorageSync("token");
|
||||
return new Promise((resolve, reject) => {
|
||||
common_vendor.index.request({
|
||||
url: BASE_URL + url,
|
||||
@ -10,18 +11,24 @@ const request = (url, method = "GET", data = {}, headers = {}) => {
|
||||
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) {
|
||||
common_vendor.index.removeStorageSync("token");
|
||||
common_vendor.index.removeStorageSync("userInfo");
|
||||
common_vendor.index.__f__("log", "at utils/api.js:40", "登录已过期,请重新登录");
|
||||
reject(new Error("登录已过期"));
|
||||
} else {
|
||||
reject(new Error(`请求失败: ${res.statusCode}`));
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
common_vendor.index.__f__("log", "at utils/api.js:39", "API请求失败,使用模拟数据:", err);
|
||||
common_vendor.index.__f__("log", "at utils/api.js:48", "API请求失败,使用模拟数据:", err);
|
||||
resolve(getMockData(url));
|
||||
}
|
||||
});
|
||||
@ -166,6 +173,41 @@ const getMockData = (url, method, data) => {
|
||||
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,
|
||||
@ -204,6 +246,13 @@ const api = {
|
||||
// 更新用户信息
|
||||
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: {
|
||||
// 获取应用信息
|
||||
|
||||
18
utils/api.js
18
utils/api.js
@ -122,7 +122,9 @@ const getMockData = (url, method, data) => {
|
||||
code: 200,
|
||||
data: {
|
||||
totalValue: 1284592.40,
|
||||
currency: 'CNY',
|
||||
todayProfit: 12482.00,
|
||||
todayProfitCurrency: 'CNY',
|
||||
totalReturnRate: 24.82
|
||||
},
|
||||
message: 'success'
|
||||
@ -144,6 +146,7 @@ const getMockData = (url, method, data) => {
|
||||
iconBgClass: 'bg-green-100',
|
||||
iconTextClass: 'text-green-700',
|
||||
value: 156240.00,
|
||||
currency: 'USD',
|
||||
returnRate: 42.82,
|
||||
returnType: 'positive'
|
||||
},
|
||||
@ -157,8 +160,23 @@ const getMockData = (url, method, data) => {
|
||||
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'
|
||||
|
||||
Loading…
Reference in New Issue
Block a user