mirror of
https://github.com/laoxong/nofx.git
synced 2026-06-07 03:07:56 +08:00
7ce7c64fa8
- Add soft delete support for AI models * Add deleted field to ai_models table * Implement soft delete with sensitive data cleanup * Filter deleted records in queries - Replace browser confirm dialogs with custom styled modals * Create DeleteConfirmModal component with Binance theme * Add proper warning messages and icons * Improve user experience with consistent styling - Fix duplicate model/exchange display in selection dropdowns * Use supportedModels/supportedExchanges for modal selectors * Use configuredModels/configuredExchanges for panel display * Remove redundant selectableModels/selectableExchanges logic - Enhance data management * Refresh data after deletion operations * Proper state cleanup after modal operations * Clear sensitive data during soft delete 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: tinkle-community <tinklefund@gmail.com>
180 lines
6.2 KiB
PL/PgSQL
180 lines
6.2 KiB
PL/PgSQL
-- PostgreSQL初始化脚本
|
|
-- AI交易系统数据库迁移
|
|
|
|
-- 用户表
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id TEXT PRIMARY KEY,
|
|
email TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
otp_secret TEXT,
|
|
otp_verified BOOLEAN DEFAULT FALSE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- AI模型配置表
|
|
CREATE TABLE IF NOT EXISTS ai_models (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL DEFAULT 'default',
|
|
name TEXT NOT NULL,
|
|
provider TEXT NOT NULL,
|
|
enabled BOOLEAN DEFAULT FALSE,
|
|
api_key TEXT DEFAULT '',
|
|
custom_api_url TEXT DEFAULT '',
|
|
custom_model_name TEXT DEFAULT '',
|
|
deleted BOOLEAN DEFAULT FALSE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- 交易所配置表
|
|
CREATE TABLE IF NOT EXISTS exchanges (
|
|
id TEXT NOT NULL,
|
|
user_id TEXT NOT NULL DEFAULT 'default',
|
|
name TEXT NOT NULL,
|
|
type TEXT NOT NULL, -- 'cex' or 'dex'
|
|
enabled BOOLEAN DEFAULT FALSE,
|
|
api_key TEXT DEFAULT '',
|
|
secret_key TEXT DEFAULT '',
|
|
testnet BOOLEAN DEFAULT FALSE,
|
|
-- Hyperliquid 特定字段
|
|
hyperliquid_wallet_addr TEXT DEFAULT '',
|
|
-- Aster 特定字段
|
|
aster_user TEXT DEFAULT '',
|
|
aster_signer TEXT DEFAULT '',
|
|
aster_private_key TEXT DEFAULT '',
|
|
deleted BOOLEAN DEFAULT FALSE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (id, user_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- 用户信号源配置表
|
|
CREATE TABLE IF NOT EXISTS user_signal_sources (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id TEXT NOT NULL,
|
|
coin_pool_url TEXT DEFAULT '',
|
|
oi_top_url TEXT DEFAULT '',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
UNIQUE(user_id)
|
|
);
|
|
|
|
-- 交易员配置表
|
|
CREATE TABLE IF NOT EXISTS traders (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL DEFAULT 'default',
|
|
name TEXT NOT NULL,
|
|
ai_model_id TEXT NOT NULL,
|
|
exchange_id TEXT NOT NULL,
|
|
initial_balance REAL NOT NULL,
|
|
scan_interval_minutes INTEGER DEFAULT 3,
|
|
is_running BOOLEAN DEFAULT FALSE,
|
|
btc_eth_leverage INTEGER DEFAULT 5,
|
|
altcoin_leverage INTEGER DEFAULT 5,
|
|
trading_symbols TEXT DEFAULT '',
|
|
use_coin_pool BOOLEAN DEFAULT FALSE,
|
|
use_oi_top BOOLEAN DEFAULT FALSE,
|
|
custom_prompt TEXT DEFAULT '',
|
|
override_base_prompt BOOLEAN DEFAULT FALSE,
|
|
system_prompt_template TEXT DEFAULT 'default',
|
|
is_cross_margin BOOLEAN DEFAULT TRUE,
|
|
custom_coins TEXT DEFAULT '',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (ai_model_id) REFERENCES ai_models(id),
|
|
FOREIGN KEY (exchange_id, user_id) REFERENCES exchanges(id, user_id)
|
|
);
|
|
|
|
-- 系统配置表
|
|
CREATE TABLE IF NOT EXISTS system_config (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- 内测码表
|
|
CREATE TABLE IF NOT EXISTS beta_codes (
|
|
code TEXT PRIMARY KEY,
|
|
used BOOLEAN DEFAULT FALSE,
|
|
used_by TEXT DEFAULT '',
|
|
used_at TIMESTAMP DEFAULT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- 自动更新 updated_at 函数
|
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
|
|
-- 创建触发器:自动更新 updated_at
|
|
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
CREATE TRIGGER update_ai_models_updated_at BEFORE UPDATE ON ai_models
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
CREATE TRIGGER update_exchanges_updated_at BEFORE UPDATE ON exchanges
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
CREATE TRIGGER update_traders_updated_at BEFORE UPDATE ON traders
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
CREATE TRIGGER update_user_signal_sources_updated_at BEFORE UPDATE ON user_signal_sources
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
CREATE TRIGGER update_system_config_updated_at BEFORE UPDATE ON system_config
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
-- 插入默认数据
|
|
|
|
-- 创建default用户(如果不存在)
|
|
INSERT INTO users (id, email, password_hash, otp_secret, otp_verified) VALUES
|
|
('default', 'default@localhost', '', '', TRUE)
|
|
ON CONFLICT (id) DO NOTHING;
|
|
|
|
-- 初始化AI模型(使用default用户)
|
|
INSERT INTO ai_models (id, user_id, name, provider, enabled) VALUES
|
|
('deepseek', 'default', 'DeepSeek', 'deepseek', FALSE),
|
|
('qwen', 'default', 'Qwen', 'qwen', FALSE)
|
|
ON CONFLICT (id) DO NOTHING;
|
|
|
|
-- 初始化交易所(使用default用户)
|
|
INSERT INTO exchanges (id, user_id, name, type, enabled) VALUES
|
|
('binance', 'default', 'Binance Futures', 'binance', FALSE),
|
|
('hyperliquid', 'default', 'Hyperliquid', 'hyperliquid', FALSE),
|
|
('aster', 'default', 'Aster DEX', 'aster', FALSE)
|
|
ON CONFLICT (id, user_id) DO NOTHING;
|
|
|
|
-- 初始化系统配置
|
|
INSERT INTO system_config (key, value) VALUES
|
|
('beta_mode', 'false'),
|
|
('api_server_port', '8080'),
|
|
('use_default_coins', 'true'),
|
|
('default_coins', '["BTCUSDT","ETHUSDT","SOLUSDT","BNBUSDT","XRPUSDT","DOGEUSDT","ADAUSDT","HYPEUSDT"]'),
|
|
('max_daily_loss', '10.0'),
|
|
('max_drawdown', '20.0'),
|
|
('stop_trading_minutes', '60'),
|
|
('btc_eth_leverage', '5'),
|
|
('altcoin_leverage', '5'),
|
|
('jwt_secret', '')
|
|
ON CONFLICT (key) DO NOTHING;
|
|
|
|
-- 数据库迁移:添加 deleted 字段到现有 ai_models 表
|
|
ALTER TABLE ai_models ADD COLUMN IF NOT EXISTS deleted BOOLEAN DEFAULT FALSE;
|
|
|
|
-- 创建索引
|
|
CREATE INDEX IF NOT EXISTS idx_ai_models_user_id ON ai_models(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_exchanges_user_id ON exchanges(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_traders_user_id ON traders(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_traders_running ON traders(is_running);
|
|
CREATE INDEX IF NOT EXISTS idx_beta_codes_used ON beta_codes(used);
|