Add Binance demo trading key settings and signed demo client

Store demo API key/secret encrypted in a single-row trading_account table,
expose get/put/delete/test endpoints under /api/settings/exchange, and add
a settings card to enter and test the key. The client is hard-wired to
demo-fapi.binance.com.
This commit is contained in:
eezd committed 2026-10-15 09:24:58 +08:00
1 parent 438d6a00d9
commit 20fd5a98b2
8 files changed
+384 -5

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
from datetime import datetime
from sqlalchemy import Boolean, CheckConstraint, DateTime, ForeignKey, LargeBinary, String, func
from sqlalchemy.orm import Mapped, mapped_column
from alphapulse.core.db import Base
class TradingAccount(Base):
"""币安模拟盘账户:单行(id=1)。key 只以密文存储;running 是引擎启停的唯一来源"""
__tablename__ = "trading_account"
__table_args__ = (CheckConstraint("id = 1", name="trading_account_single_row"),)
id: Mapped[int] = mapped_column(primary_key=True, default=1)
api_key_encrypted: Mapped[bytes | None] = mapped_column(LargeBinary)
api_secret_encrypted: Mapped[bytes | None] = mapped_column(LargeBinary)
api_key_hint: Mapped[str | None] = mapped_column(String(8))
running: Mapped[bool] = mapped_column(Boolean, default=False)
running_changed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
# 交易分析用的模型配置;为空时用默认配置
provider_id: Mapped[int | None] = mapped_column(ForeignKey("ai_providers.id", ondelete="SET NULL"))
reasoning_effort: Mapped[str | None] = mapped_column(String(8))
updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())