mirror of
https://github.com/GMWalletApp/epusdt.git
synced 2026-07-07 18:26:16 +00:00
feat: add admin panel with multi-chain support and notification system
- Add full admin REST API: auth, API keys, chains, chain tokens, wallets, orders, RPC nodes, settings, dashboard stats, notifications - Add JWT-based admin authentication and API key auth middleware - Add multi-chain listeners: BSC, ETH, Polygon, Plasma, EVM WebSocket - Add RPC node health check job with automatic failover - Add Telegram notification channel for order events - Add installer for first-run database initialization - Add new DB models: admin_user, api_key, chain, chain_token, rpc_node, settings, notification_channel - Add order statistics aggregation (daily/monthly/by-chain) - Serve built admin SPA from embedded www/ assets - Add comprehensive test coverage for all new features
This commit is contained in:
@@ -5,10 +5,13 @@ import (
|
||||
|
||||
"github.com/assimon/luuu/config"
|
||||
"github.com/assimon/luuu/model/dao"
|
||||
"github.com/assimon/luuu/model/data"
|
||||
"github.com/assimon/luuu/mq"
|
||||
"github.com/assimon/luuu/task"
|
||||
"github.com/assimon/luuu/telegram"
|
||||
appjwt "github.com/assimon/luuu/util/jwt"
|
||||
"github.com/assimon/luuu/util/log"
|
||||
"github.com/gookit/color"
|
||||
)
|
||||
|
||||
var initOnce sync.Once
|
||||
@@ -18,6 +21,46 @@ func InitApp() {
|
||||
config.Init()
|
||||
log.Init()
|
||||
dao.Init()
|
||||
// Wire settings-table lookups into the config package so
|
||||
// GetRateApiUrl / GetUsdtRate prefer DB-backed overrides.
|
||||
config.SettingsGetString = func(key string) string {
|
||||
return data.GetSettingString(key, "")
|
||||
}
|
||||
// Seed rate.api_url from .env into the settings table on first run
|
||||
// so the admin UI can display and change it without a code restart.
|
||||
// Only written if the key is not already present in the DB.
|
||||
if data.GetSettingString("rate.api_url", "") == "" {
|
||||
if envURL := config.GetRateApiUrlFromEnv(); envURL != "" {
|
||||
if err := data.SetSetting("rate", "rate.api_url", envURL, "string"); err != nil {
|
||||
color.Red.Printf("[bootstrap] seed rate.api_url err=%s\n", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
// config.Init() computes RateApiUrl before SettingsGetString is
|
||||
// installed, so refresh the cache once DB-backed settings are available.
|
||||
config.RateApiUrl = config.GetRateApiUrl()
|
||||
// Seed admin account and JWT secret so the management console is
|
||||
// immediately usable on a fresh install. Both are idempotent.
|
||||
adminPwd, isNew, err := data.EnsureDefaultAdmin()
|
||||
if err != nil {
|
||||
color.Red.Printf("[bootstrap] ensure default admin err=%s\n", err)
|
||||
}
|
||||
if isNew {
|
||||
color.Yellow.Println("╔════════════════════════════════════════════════════════════════════════╗")
|
||||
color.Yellow.Println("║ Default admin account created. Change the password via admin console! ║")
|
||||
color.Yellow.Printf("║ Username: admin ║\n")
|
||||
color.Yellow.Printf("║ Password: %-60s ║\n", adminPwd)
|
||||
color.Yellow.Println("╚════════════════════════════════════════════════════════════════════════╝")
|
||||
}
|
||||
if _, err := appjwt.EnsureSecret(); err != nil {
|
||||
color.Red.Printf("[bootstrap] ensure jwt secret err=%s\n", err)
|
||||
}
|
||||
// Seed one universal default API key on fresh installs. The seeded
|
||||
// key (PID=1000) works for all three gateway flows.
|
||||
_, err = data.EnsureDefaultApiKey()
|
||||
if err != nil {
|
||||
color.Red.Printf("[bootstrap] ensure default api key err=%s\n", err)
|
||||
}
|
||||
mq.Start()
|
||||
go telegram.BotStart()
|
||||
go task.Start()
|
||||
|
||||
Reference in New Issue
Block a user