Files
PolyHermes/backend/src/main/resources/db/migration/V1__init_database.sql
T
WrBug 4679080d55 feat: 添加系统管理功能(代理配置和API健康检查)
- 新增代理配置管理功能,支持HTTP代理配置(host、port、用户名、密码)
- 代理配置存储在数据库中,支持实时生效,无需重启服务
- 代理配置变更时自动重连WebSocket连接(订单推送和跟单服务)
- 新增API健康状态检查功能,监控Polymarket各API和Polygon RPC的可用性
- 优化API健康状态UI,支持响应式设计(移动端和桌面端)
- 将Ethereum RPC相关配置和代码统一改为Polygon RPC
- 修复代理检查时的SSL证书验证问题
- 优化代理配置:关闭代理时保留配置信息,避免重新输入
2025-12-03 01:44:35 +08:00

212 lines
13 KiB
SQL
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.
-- ============================================
-- 数据库初始化脚本(合并所有迁移版本)
-- ============================================
-- ============================================
-- 1. 创建账户表
-- ============================================
CREATE TABLE IF NOT EXISTS copy_trading_accounts (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
private_key VARCHAR(500) NOT NULL COMMENT '私钥(加密存储)',
wallet_address VARCHAR(42) NOT NULL UNIQUE COMMENT '钱包地址(从私钥推导)',
proxy_address VARCHAR(42) NOT NULL COMMENT 'Polymarket 代理钱包地址(从合约获取,必须)',
api_key VARCHAR(500) NULL COMMENT 'Polymarket API Key(可选,加密存储)',
api_secret VARCHAR(500) NULL COMMENT 'Polymarket API Secret(可选,加密存储)',
api_passphrase VARCHAR(500) NULL COMMENT 'Polymarket API Passphrase(可选,加密存储)',
account_name VARCHAR(100) NULL COMMENT '账户名称',
is_default BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否默认账户',
is_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用(用于订单推送等功能的开关)',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
updated_at BIGINT NOT NULL COMMENT '更新时间(毫秒时间戳)',
INDEX idx_wallet_address (wallet_address),
INDEX idx_is_default (is_default)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='跟单系统账户表';
-- ============================================
-- 2. 创建被跟单者(Leader)表
-- ============================================
CREATE TABLE IF NOT EXISTS copy_trading_leaders (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
leader_address VARCHAR(42) NOT NULL UNIQUE COMMENT '被跟单者的钱包地址',
leader_name VARCHAR(100) NULL COMMENT '被跟单者名称',
category VARCHAR(20) NULL COMMENT '分类筛选(sports/crypto),null表示不筛选',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
updated_at BIGINT NOT NULL COMMENT '更新时间(毫秒时间戳)',
INDEX idx_leader_address (leader_address),
INDEX idx_category (category)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='被跟单者表';
-- ============================================
-- 3. 创建跟单模板表
-- ============================================
CREATE TABLE IF NOT EXISTS copy_trading_templates (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
template_name VARCHAR(100) NOT NULL UNIQUE COMMENT '模板名称',
copy_mode VARCHAR(10) NOT NULL DEFAULT 'RATIO' COMMENT '跟单金额模式(RATIO/FIXED',
copy_ratio DECIMAL(10, 2) NOT NULL DEFAULT 1.00 COMMENT '跟单比例(仅在copyMode=RATIO时生效)',
fixed_amount DECIMAL(20, 8) NULL COMMENT '固定跟单金额(仅在copyMode=FIXED时生效)',
max_order_size DECIMAL(20, 8) NOT NULL DEFAULT 1000.00000000 COMMENT '单笔订单最大金额(USDC',
min_order_size DECIMAL(20, 8) NOT NULL DEFAULT 1.00000000 COMMENT '单笔订单最小金额(USDC',
max_daily_loss DECIMAL(20, 8) NOT NULL DEFAULT 10000.00000000 COMMENT '每日最大亏损限制(USDC',
max_daily_orders INT NOT NULL DEFAULT 100 COMMENT '每日最大跟单订单数',
price_tolerance DECIMAL(5, 2) NOT NULL DEFAULT 5.00 COMMENT '价格容忍度(百分比,0-100',
delay_seconds INT NOT NULL DEFAULT 0 COMMENT '跟单延迟(秒,默认0立即跟单)',
poll_interval_seconds INT NOT NULL DEFAULT 5 COMMENT '轮询间隔(秒,仅在WebSocket不可用时使用)',
use_websocket BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否优先使用WebSocket推送',
websocket_reconnect_interval INT NOT NULL DEFAULT 5000 COMMENT 'WebSocket重连间隔(毫秒)',
websocket_max_retries INT NOT NULL DEFAULT 10 COMMENT 'WebSocket最大重试次数',
support_sell BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否支持跟单卖出',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
updated_at BIGINT NOT NULL COMMENT '更新时间(毫秒时间戳)',
INDEX idx_template_name (template_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='跟单模板表';
-- ============================================
-- 4. 创建跟单关系表(钱包-模板关联,多对多关系)
-- ============================================
CREATE TABLE IF NOT EXISTS copy_trading (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
account_id BIGINT NOT NULL COMMENT '钱包账户ID',
template_id BIGINT NOT NULL COMMENT '模板ID',
leader_id BIGINT NOT NULL COMMENT 'Leader ID',
enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
updated_at BIGINT NOT NULL COMMENT '更新时间(毫秒时间戳)',
UNIQUE KEY uk_account_template_leader (account_id, template_id, leader_id),
INDEX idx_account_id (account_id),
INDEX idx_template_id (template_id),
INDEX idx_leader_id (leader_id),
INDEX idx_enabled (enabled),
FOREIGN KEY (account_id) REFERENCES copy_trading_accounts(id) ON DELETE CASCADE,
FOREIGN KEY (template_id) REFERENCES copy_trading_templates(id) ON DELETE RESTRICT,
FOREIGN KEY (leader_id) REFERENCES copy_trading_leaders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='跟单关系表(钱包-模板关联)';
-- ============================================
-- 5. 创建订单跟踪表
-- ============================================
CREATE TABLE IF NOT EXISTS copy_order_tracking (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
copy_trading_id BIGINT NOT NULL COMMENT '跟单关系ID',
account_id BIGINT NOT NULL COMMENT '账户ID',
leader_id BIGINT NOT NULL COMMENT 'Leader ID',
template_id BIGINT NOT NULL COMMENT '模板ID',
market_id VARCHAR(100) NOT NULL COMMENT '市场地址',
side VARCHAR(10) NOT NULL COMMENT '方向:YES/NO',
outcome_index INT NULL COMMENT '结果索引(0, 1, 2, ...),支持多元市场',
buy_order_id VARCHAR(100) NOT NULL COMMENT '跟单买入订单ID',
leader_buy_trade_id VARCHAR(100) NOT NULL COMMENT 'Leader 买入交易ID',
quantity DECIMAL(20, 8) NOT NULL COMMENT '买入数量',
price DECIMAL(20, 8) NOT NULL COMMENT '买入价格',
matched_quantity DECIMAL(20, 8) NOT NULL DEFAULT 0 COMMENT '已匹配卖出数量',
remaining_quantity DECIMAL(20, 8) NOT NULL COMMENT '剩余未匹配数量',
status VARCHAR(20) NOT NULL COMMENT '状态:filled, fully_matched, partially_matched',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
updated_at BIGINT NOT NULL COMMENT '更新时间(毫秒时间戳)',
INDEX idx_copy_trading (copy_trading_id),
INDEX idx_remaining (remaining_quantity, status),
INDEX idx_market_side (market_id, side),
INDEX idx_market_outcome (market_id, outcome_index),
INDEX idx_leader_trade (leader_id, leader_buy_trade_id),
FOREIGN KEY (copy_trading_id) REFERENCES copy_trading(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单跟踪表';
-- ============================================
-- 6. 创建卖出匹配记录表
-- ============================================
CREATE TABLE IF NOT EXISTS sell_match_record (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
copy_trading_id BIGINT NOT NULL COMMENT '跟单关系ID',
sell_order_id VARCHAR(100) NOT NULL COMMENT '跟单卖出订单ID',
leader_sell_trade_id VARCHAR(100) NOT NULL COMMENT 'Leader 卖出交易ID',
market_id VARCHAR(100) NOT NULL COMMENT '市场地址',
side VARCHAR(10) NOT NULL COMMENT '方向:YES/NO',
outcome_index INT NULL COMMENT '结果索引(0, 1, 2, ...),支持多元市场',
total_matched_quantity DECIMAL(20, 8) NOT NULL COMMENT '总匹配数量',
sell_price DECIMAL(20, 8) NOT NULL COMMENT '卖出价格',
total_realized_pnl DECIMAL(20, 8) NOT NULL COMMENT '总已实现盈亏',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
INDEX idx_copy_trading (copy_trading_id),
INDEX idx_sell_order (sell_order_id),
INDEX idx_market_outcome (market_id, outcome_index),
INDEX idx_leader_trade (leader_sell_trade_id),
FOREIGN KEY (copy_trading_id) REFERENCES copy_trading(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='卖出匹配记录表';
-- ============================================
-- 7. 创建匹配明细表
-- ============================================
CREATE TABLE IF NOT EXISTS sell_match_detail (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
match_record_id BIGINT NOT NULL COMMENT '关联 sell_match_record.id',
tracking_id BIGINT NOT NULL COMMENT '关联 copy_order_tracking.id',
buy_order_id VARCHAR(100) NOT NULL COMMENT '买入订单ID',
matched_quantity DECIMAL(20, 8) NOT NULL COMMENT '匹配的数量',
buy_price DECIMAL(20, 8) NOT NULL COMMENT '买入价格',
sell_price DECIMAL(20, 8) NOT NULL COMMENT '卖出价格',
realized_pnl DECIMAL(20, 8) NOT NULL COMMENT '盈亏 = (sell_price - buy_price) * matched_quantity',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
INDEX idx_match_record (match_record_id),
INDEX idx_tracking (tracking_id),
INDEX idx_buy_order (buy_order_id),
FOREIGN KEY (match_record_id) REFERENCES sell_match_record(id) ON DELETE CASCADE,
FOREIGN KEY (tracking_id) REFERENCES copy_order_tracking(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='匹配明细表';
-- ============================================
-- 8. 创建已处理交易表(用于去重)
-- ============================================
CREATE TABLE IF NOT EXISTS processed_trade (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
leader_id BIGINT NOT NULL COMMENT 'Leader ID',
leader_trade_id VARCHAR(100) NOT NULL COMMENT 'Leader 的交易IDtrade.id,唯一标识)',
trade_type VARCHAR(10) NOT NULL COMMENT '交易类型:BUY 或 SELL',
source VARCHAR(20) NOT NULL COMMENT '数据来源:websocket 或 polling',
status VARCHAR(20) NOT NULL DEFAULT 'SUCCESS' COMMENT '处理状态:SUCCESS(成功)、FAILED(失败)',
processed_at BIGINT NOT NULL COMMENT '处理时间(毫秒时间戳)',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
UNIQUE KEY uk_leader_trade (leader_id, leader_trade_id),
INDEX idx_processed_at (processed_at),
INDEX idx_leader_id (leader_id),
FOREIGN KEY (leader_id) REFERENCES copy_trading_leaders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='已处理交易表(用于去重)';
-- ============================================
-- 9. 创建失败交易记录表
-- ============================================
CREATE TABLE IF NOT EXISTS failed_trade (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
leader_id BIGINT NOT NULL COMMENT 'Leader ID',
leader_trade_id VARCHAR(100) NOT NULL COMMENT 'Leader 的交易ID',
trade_type VARCHAR(10) NOT NULL COMMENT '交易类型:BUY 或 SELL',
copy_trading_id BIGINT NOT NULL COMMENT '跟单关系ID',
account_id BIGINT NOT NULL COMMENT '账户ID',
market_id VARCHAR(100) NOT NULL COMMENT '市场地址',
side VARCHAR(10) NOT NULL COMMENT '方向:YES/NO',
price VARCHAR(50) NOT NULL COMMENT '价格',
size VARCHAR(50) NOT NULL COMMENT '数量',
error_message TEXT COMMENT '错误信息',
retry_count INT NOT NULL DEFAULT 0 COMMENT '重试次数',
failed_at BIGINT NOT NULL COMMENT '失败时间(毫秒时间戳)',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
INDEX idx_leader_trade (leader_id, leader_trade_id),
INDEX idx_copy_trading (copy_trading_id),
INDEX idx_failed_at (failed_at),
FOREIGN KEY (copy_trading_id) REFERENCES copy_trading(id) ON DELETE CASCADE,
FOREIGN KEY (leader_id) REFERENCES copy_trading_leaders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='失败交易记录表';
-- ============================================
-- 10. 创建用户表(用于JWT登录鉴权)
-- ============================================
CREATE TABLE IF NOT EXISTS users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名(唯一)',
password VARCHAR(255) NOT NULL COMMENT '密码(BCrypt加密)',
is_default BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否默认账户(首次创建的用户)',
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
updated_at BIGINT NOT NULL COMMENT '更新时间(毫秒时间戳)',
INDEX idx_username (username),
INDEX idx_is_default (is_default)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表(JWT登录鉴权)';