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:
line-6000
2026-04-22 02:28:31 +08:00
parent 097c716714
commit 6bb47d4b00
247 changed files with 9933 additions and 1279 deletions
+8 -12
View File
@@ -122,7 +122,9 @@ func WalletList(c tb.Context) error {
InlineKeyboard: rows,
})
})
btnList = append(btnList, []tb.InlineButton{addBtn})
refreshBtn := tb.InlineButton{Text: "刷新列表", Unique: "WalletRefresh"}
bots.Handle(&refreshBtn, WalletList)
btnList = append(btnList, []tb.InlineButton{addBtn, refreshBtn})
return c.EditOrSend("请选择钱包继续操作", &tb.ReplyMarkup{
InlineKeyboard: btnList,
@@ -257,21 +259,15 @@ func getPendingWalletAddressState(userID int64) (pendingWalletAddressState, bool
}
func getEnabledSupportedNetworks() ([]string, error) {
assets, err := data.ListEnabledSupportedAssets()
chains, err := data.ListEnabledChains()
if err != nil {
return nil, err
}
set := make(map[string]struct{})
for _, a := range assets {
n := strings.ToLower(strings.TrimSpace(a.Network))
if n == "" {
continue
networks := make([]string, 0, len(chains))
for _, ch := range chains {
if n := strings.ToLower(strings.TrimSpace(ch.Network)); n != "" {
networks = append(networks, n)
}
set[n] = struct{}{}
}
networks := make([]string, 0, len(set))
for n := range set {
networks = append(networks, n)
}
sort.Strings(networks)
return networks, nil