升级版本并改用内部账号存储

This commit is contained in:
yml2213
2026-08-09 13:04:54 +08:00
parent 1cd94c0179
commit 8cf29598a5
13 changed files with 271 additions and 54 deletions
+7 -1
View File
@@ -42,7 +42,7 @@ type App struct {
products []types.Product
productsAt time.Time
// accountsMu 串行化账号文件修改,避免并发导入、编辑或删除互相覆盖。
// accountsMu 串行化内部账号库修改,避免并发导入、编辑或删除互相覆盖。
accountsMu sync.Mutex
closeLog func()
@@ -123,8 +123,14 @@ func (a *App) Startup(ctx context.Context) {
a.ctx = ctx
a.paths = config.DefaultAppPaths()
configMigrated, configMigrationErr := config.MigrateLegacyFile(a.paths.ConfigFile, a.paths.LegacyConfigFile)
a.logStore = logger.NewMemoryLogStore(800)
a.closeLog = logger.InitLogging(a.logStore, a.paths.LogDir)
if configMigrationErr != nil {
logger.LogEvent("配置", "warn", "旧配置迁移失败: %s: %v", a.paths.LegacyConfigFile, configMigrationErr)
} else if configMigrated {
logger.LogEvent("配置", "success", "已迁移旧配置到应用内部目录: %s", a.paths.ConfigFile)
}
// 加载配置并应用运行时设置
a.cfg = config.LoadConfig(a.paths.ConfigFile)
+7 -7
View File
@@ -8,7 +8,7 @@ import (
"douyu_go/internal/types"
)
// ImportAccounts 将剪贴板中的账号行追加到账号文件。每行格式必须为
// ImportAccounts 将剪贴板中的账号行追加到内部账号库。每行格式必须为
// 账号名----密码----Cookie,账号名不能与已有账号重复。
func (a *App) ImportAccounts(content string) types.AccountMutationResult {
entries, err := parseAccountImport(content)
@@ -22,7 +22,7 @@ func (a *App) ImportAccounts(content string) types.AccountMutationResult {
accountFile := a.scheduler.AccountFilePath()
lines, err := parseAccountFile(accountFile)
if err != nil {
return types.AccountMutationResult{Error: "读取账号文件失败: " + err.Error()}
return types.AccountMutationResult{Error: "读取内部账号库失败: " + err.Error()}
}
existingNames := make(map[string]struct{}, len(lines))
@@ -46,7 +46,7 @@ func (a *App) ImportAccounts(content string) types.AccountMutationResult {
return types.AccountMutationResult{Success: true, Count: len(entries)}
}
// UpdateAccount 更新账号名或 Cookie。newCookie 留空时保留文件中的原 Cookie。
// UpdateAccount 更新账号名或 Cookie。newCookie 留空时保留内部账号库中的原 Cookie。
func (a *App) UpdateAccount(originalName, newName, newCookie string) types.AccountMutationResult {
originalName = strings.TrimSpace(originalName)
newName = strings.TrimSpace(newName)
@@ -64,7 +64,7 @@ func (a *App) UpdateAccount(originalName, newName, newCookie string) types.Accou
accountFile := a.scheduler.AccountFilePath()
lines, err := parseAccountFile(accountFile)
if err != nil {
return types.AccountMutationResult{Error: "读取账号文件失败: " + err.Error()}
return types.AccountMutationResult{Error: "读取内部账号库失败: " + err.Error()}
}
targetIndex := -1
@@ -108,7 +108,7 @@ func (a *App) UpdateAccount(originalName, newName, newCookie string) types.Accou
return types.AccountMutationResult{Success: true, Count: 1}
}
// DeleteAccounts 从账号文件中删除指定账号,可一次删除多个账号。
// DeleteAccounts 从内部账号库中删除指定账号,可一次删除多个账号。
func (a *App) DeleteAccounts(accountNames []string) types.AccountMutationResult {
nameSet := make(map[string]struct{}, len(accountNames))
for _, name := range accountNames {
@@ -126,7 +126,7 @@ func (a *App) DeleteAccounts(accountNames []string) types.AccountMutationResult
accountFile := a.scheduler.AccountFilePath()
lines, err := parseAccountFile(accountFile)
if err != nil {
return types.AccountMutationResult{Error: "读取账号文件失败: " + err.Error()}
return types.AccountMutationResult{Error: "读取内部账号库失败: " + err.Error()}
}
kept := make([]accountLine, 0, len(lines))
deleted := 0
@@ -194,7 +194,7 @@ func (a *App) saveAccountLines(accountFile string, lines []accountLine) error {
content += "\r\n"
}
if _, err := writeFileWithBackup(accountFile, []byte(content)); err != nil {
return fmt.Errorf("更新账号文件失败: %w", err)
return fmt.Errorf("更新内部账号库失败: %w", err)
}
a.scheduler.LoadAccounts()
return nil
+8 -5
View File
@@ -53,7 +53,7 @@ func (a *App) ExportAccounts(accountNames []string, filename string) types.Expor
accountFile := a.scheduler.AccountFilePath()
lines, err := parseAccountFile(accountFile)
if err != nil {
return types.ExportAccountsResult{Error: "读取账号文件失败: " + err.Error()}
return types.ExportAccountsResult{Error: "读取内部账号库失败: " + err.Error()}
}
nameSet := make(map[string]bool)
@@ -79,7 +79,10 @@ func (a *App) ExportAccounts(accountNames []string, filename string) types.Expor
exportPath := filepath.Join(filepath.Dir(accountFile), filename)
content := strings.Join(matchedLines, "\n") + "\n"
if err := os.WriteFile(exportPath, []byte(content), 0644); err != nil {
if err := os.MkdirAll(filepath.Dir(exportPath), 0700); err != nil {
return types.ExportAccountsResult{Error: "创建导出目录失败: " + err.Error()}
}
if err := os.WriteFile(exportPath, []byte(content), 0600); err != nil {
return types.ExportAccountsResult{Error: "写入文件失败: " + err.Error()}
}
@@ -137,7 +140,7 @@ func (a *App) OrganizeAccounts(commodityID, commodityName string, startTime, end
accountFile := a.scheduler.AccountFilePath()
lines, err := parseAccountFile(accountFile)
if err != nil {
return types.OrganizeAccountsResult{Error: "读取账号文件失败: " + err.Error()}
return types.OrganizeAccountsResult{Error: "读取内部账号库失败: " + err.Error()}
}
missSet := make(map[string]bool)
@@ -160,9 +163,9 @@ func (a *App) OrganizeAccounts(commodityID, commodityName string, startTime, end
newContent := strings.Join(keepLines, "\r\n") + "\r\n"
backupPath, err := writeFileWithBackup(accountFile, []byte(newContent))
if err != nil {
return types.OrganizeAccountsResult{Error: "更新账号文件失败: " + err.Error()}
return types.OrganizeAccountsResult{Error: "更新内部账号库失败: " + err.Error()}
}
logger.LogEvent("整理", "success", "账号文件已安全更新,备份=%s", backupPath)
logger.LogEvent("整理", "success", "内部账号库已安全更新,备份=%s", backupPath)
// 重新加载账号
a.scheduler.LoadAccounts()
+1 -1
View File
@@ -55,7 +55,7 @@ func (a *App) GetAccounts() []types.AccountView {
return list
}
// ReloadAccounts 重新加载账号文件。
// ReloadAccounts 重新加载内部账号库。
func (a *App) ReloadAccounts() types.ReloadAccountsResult {
a.scheduler.LoadAccounts()
return types.ReloadAccountsResult{Success: true, Count: a.scheduler.AccountCount()}