feat: Introduce core application structure, configuration, monitoring, and team management features.

This commit is contained in:
2026-02-03 06:45:54 +08:00
parent 637753ddaa
commit b20399a00a
18 changed files with 961 additions and 631 deletions

View File

@@ -128,8 +128,16 @@ func checkAndAutoAdd() {
return
}
// 计算需要多少个 Team每个 Team 产生 4 个账号)
teamsNeeded := (deficit + 3) / 4 // 向上取整
// 读取每 Team 成员数配置
membersPerTeam := 4
if val, _ := database.Instance.GetConfig("monitor_members_per_team"); val != "" {
if v, err := strconv.Atoi(val); err == nil && v >= 1 && v <= 10 {
membersPerTeam = v
}
}
// 计算需要多少个 Team
teamsNeeded := (deficit + membersPerTeam - 1) / membersPerTeam // 向上取整
// 获取可用的 Owner
owners, err := database.Instance.GetPendingOwners()
@@ -164,13 +172,14 @@ func checkAndAutoAdd() {
}
}
// 读取代理配置
// 读取代理配置 - 支持代理池模式
proxyURL := ""
replenishUseProxy := false
if val, _ := database.Instance.GetConfig("monitor_replenish_use_proxy"); val == "true" {
replenishUseProxy = true
}
if replenishUseProxy {
// 使用全局代理配置(支持 pool:random, pool:id:N 等格式)
proxyURL = config.Global.DefaultProxy
}
@@ -180,10 +189,27 @@ func checkAndAutoAdd() {
browserType = val
}
// 读取并发 Team 数配置
concurrentTeams := 2
if val, _ := database.Instance.GetConfig("monitor_concurrent_teams"); val != "" {
if v, err := strconv.Atoi(val); err == nil && v >= 1 && v <= 10 {
concurrentTeams = v
}
}
// 读取入库并发数配置
s2aConcurrency := 2
if val, _ := database.Instance.GetConfig("monitor_s2a_concurrency"); val != "" {
if v, err := strconv.Atoi(val); err == nil && v >= 1 && v <= 4 {
s2aConcurrency = v
}
}
req := TeamProcessRequest{
Owners: reqOwners,
MembersPerTeam: 4,
ConcurrentTeams: 2,
MembersPerTeam: membersPerTeam,
ConcurrentTeams: concurrentTeams,
S2AConcurrency: s2aConcurrency,
IncludeOwner: false,
Headless: true,
BrowserType: browserType,
@@ -192,7 +218,13 @@ func checkAndAutoAdd() {
// 输出代理使用状态日志
if proxyURL != "" {
logger.Info(fmt.Sprintf("自动补号: 使用代理 %s", proxyURL), "", "auto-add")
displayProxy := proxyURL
if proxyURL == "pool:random" {
displayProxy = "代理池轮询模式"
} else if len(proxyURL) > 8 && proxyURL[:8] == "pool:id:" {
displayProxy = fmt.Sprintf("代理池固定项 (ID: %s)", proxyURL[8:])
}
logger.Info(fmt.Sprintf("自动补号: 使用代理 %s", displayProxy), "", "auto-add")
} else {
logger.Info("自动补号: 未使用代理", "", "auto-add")
}
@@ -209,7 +241,8 @@ func checkAndAutoAdd() {
// 异步执行
go runTeamProcess(req)
logger.Success(fmt.Sprintf("自动补号任务已启动: %d 个 Team (浏览器: %s)", actualTeams, browserType), "", "auto-add")
logger.Success(fmt.Sprintf("自动补号任务已启动: %d 个 Team, 每 Team %d 成员, 并发 %d (浏览器: %s)",
actualTeams, membersPerTeam, concurrentTeams, browserType), "", "auto-add")
}
// getS2AAccountCount 获取 S2A 当前账号数量