feat: Move notification settings to user profile and add i18n support

- Move notification config from system settings (.env) to user profile (database)
- Add user-specific notification settings API endpoints (GET/PUT /api/user/notification-settings)
- Add notification_settings column to qd_users table
- Update portfolio and trading-assistant to use profile notification settings
- Add notification settings UI in profile page with all channels (browser, telegram, email, phone, discord, webhook)
- Add i18n translations for notification settings in 10 languages
- Fix timestamp parsing in TradingRecords and portfolio (handle both ISO strings and Unix timestamps)
- Fix header icons alignment for mobile responsive layout
- Fix equity curve timestamp bug (handle datetime objects properly)
- Remove unused login.js exports and clean up user.js store
- Remove husky, commitlint and other dev dependencies
- Clean up env.example by removing user-specific notification params
- Update signal_notifier to prioritize user-specific tokens over global env vars
This commit is contained in:
Jinyu Xu
2026-01-17 01:37:32 +07:00
parent 10ad20abf6
commit c5d000e1c9
33 changed files with 1209 additions and 24317 deletions
+2 -23
View File
@@ -68,21 +68,9 @@ MAKER_WAIT_SEC=10
MAKER_OFFSET_BPS=2
# =========================
# Strategy signal notifications (optional)
# Email / SMTP (公共邮件服务,所有用户共用)
# =========================
# The frontend stores per-strategy notification_config.targets.*, but you can also set
# a global fallback webhook URL used when a strategy enables "webhook" channel but
# doesn't provide targets.webhook.
SIGNAL_WEBHOOK_URL=
SIGNAL_WEBHOOK_TOKEN=
# HTTP timeout for outbound notification requests (seconds).
SIGNAL_NOTIFY_TIMEOUT_SEC=6
# Telegram (required if you enable telegram channel)
TELEGRAM_BOT_TOKEN=
# Email / SMTP (required if you enable email channel)
# 用户在个人中心配置自己的通知邮箱,SMTP 服务器由管理员统一配置
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
@@ -170,15 +158,6 @@ OPENROUTER_CONNECT_TIMEOUT=30
# Optional: override model list shown in UI (JSON object: {"model_id":"Display Name", ...})
AI_MODELS_JSON={}
# =========================
# Market presets (optional)
# =========================
# Optional: override market types shown in UI (JSON array)
MARKET_TYPES_JSON=[]
# Optional: supported crypto symbols list (JSON array)
TRADING_SUPPORTED_SYMBOLS_JSON=[]
# =========================
# Data sources (Kline / pricing)
# =========================