Files
wk-backend/codestable/refactors/2026-04-25-backend-cleanup/2026-04-25-backend-cleanup-refactor-design.md
zhilv 536aa506f9 refactor: 后端代码优化 11 项(codestable/refactors/2026-04-25-backend-cleanup)
- 提取 getWKFromContext 辅助函数,消除 handler 中 5 处重复代码
- 提取 retryCode 函数,消除 Login/performStudy 中验证码重试重复
- 提取 removeSession 内部方法,消除 Del/ClearAll/ClearExpired 中 3 处重复
- 提取 WK.UserKey() 方法,消除 4 处 userKey 手动拼接
- SessionManager.Get() 改用 RLock 优化读性能
- GetRecords 递归分页改为迭代,避免栈溢出
- prepareRequestClient 添加配置缓存,仅在 debug 设置变化时重建
- 修正 schedule.go 时区为 Asia/Shanghai + cron "0 6 * * *"
- 修正 typo "以达到" → "已达到"
- 删除未使用的 QAList struct
- 修复 bufferHub.append 切片内存泄漏

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-26 13:07:45 +08:00

5.1 KiB
Raw Blame History

doc_type, refactor, status, scope, summary
doc_type refactor status scope summary
refactor-design 2026-04-25-backend-cleanup approved 后端 Go 代码全部internal/、pkg/、cmd/21 文件 ~2485 行 执行 11 条低中风险重构6 条提取函数消除重复、2 条性能修复递归改迭代、锁优化、3 条小修typo、删除死代码、内存泄漏

backend-cleanup refactor design

1. 本次范围

  • 勾选:#1 #2 #3 #4 #5 #6 #7 #8 #9 #10 #12
  • 明确不做:#11Handler 层业务逻辑下沉——高风险、跨模块,建议单独开一轮 refactor
  • 预估总工作量:小 / 总风险:低

2. 前置依赖

  • 无需补测试(本次全部为纯提取/等价替换,不改变控制流)
  • #8 需要用户确认业务意图(北京时间 6 点 vs 新加坡时间凌晨 2 点)

3. 执行顺序

步骤 1删除未使用的 QAList struct#10

  • 引用方法M-L2-02
  • 具体操作:删除 internal/ckwk/types.gotype QAList struct{}
  • 退出信号:go build ./internal/ckwk/... 通过
  • 验证责任AI 自证
  • 回滚git revert

步骤 2修正 typo "以达到" → "已达到"#9

  • 引用方法M-L2-03
  • 具体操作:internal/ckwk/api.go 两处 "以达到" 改为 "已达到"(约第 168 行和第 416 行)
  • 退出信号:go build ./... 通过
  • 验证责任AI 自证
  • 回滚git revert

步骤 3确认 schedule.go 时区意图并修正(#8

  • 引用方法M-L2-03
  • 具体操作:注释写"每天 6 点执行",改为 Asia/Shanghai + 0 6 * * * 对齐注释意图
  • 退出信号:go build ./... 通过
  • 验证责任AI 自证(确认编译通过)+ HUMAN确认业务意图
  • 回滚git revert

步骤 4提取 userKey 构造为 WK.UserKey() 方法(#4

  • 引用方法M-L2-03
  • 具体操作:
    1. internal/ckwk/api.goWK struct 上添加 func (wk *WK) UserKey() string { return wk.Host + ":" + wk.Username }
    2. session_manager.go 中替换 4 处手动拼接为 wk.UserKey()item.Instance.UserKey()
  • 退出信号:go build ./... 通过 + grep 确认无残留的 Host + ":" + Username 拼接
  • 验证责任AI 自证
  • 回滚git revert

步骤 5提取 getWKFromContext 辅助函数(#1

  • 引用方法M-L2-01
  • 具体操作:
    1. internal/handler/ckwk.go 添加 func getWKFromContext(ctx *gin.Context) (*ckwk.WK, bool)
    2. 替换 5 处重复代码为调用此函数
  • 退出信号:go build ./... 通过 + grep 确认无残留的 ctx.Get("wk_instance") 模式
  • 验证责任AI 自证
  • 回滚git revert

步骤 6提取 retryCode 函数(#2

  • 引用方法M-L2-01
  • 具体操作:
    1. internal/ckwk/api.go 添加 func retryCode(wk *WK, maxRetries int) (string, error)
    2. 替换 Login()performStudy() 中的重复重试代码为调用
  • 退出信号:go build ./... 通过
  • 验证责任AI 自证
  • 回滚git revert

步骤 7提取 removeSession 内部方法(#3

  • 引用方法M-L2-01
  • 具体操作:
    1. SessionManager 上添加 func (m *SessionManager) removeSession(sessionID string, item SessionItem)
    2. 替换 Del()ClearAll()ClearExpired() 中的重复清理代码
  • 退出信号:go build ./... 通过
  • 验证责任AI 自证
  • 回滚git revert

步骤 8SessionManager.Get() 优化锁策略(#5

  • 引用方法M-L4-01
  • 具体操作:
    1. Get() 改为先 RLock 读取,只更新 LastValue 时升级为写锁
    2. 由于 Go 的 RWMutex 不支持锁升级改为RLock 读 → 检查存在 → RUnlock → Lock 更新 LastValue → Unlock
  • 退出信号:go build ./... 通过
  • 验证责任AI 自证
  • 回滚git revert

步骤 9GetRecords 递归改迭代(#6

  • 引用方法M-L2-01
  • 具体操作:将 GetRecords 中的递归分页改为 for 循环,逐页追加到 result.List
  • 退出信号:go build ./... 通过
  • 验证责任AI 自证
  • 回滚git revert

步骤 10prepareRequestClient 缓存配置(#7

  • 引用方法M-L4-01
  • 具体操作:
    1. WK struct 上缓存上次配置的 debug/proxy/ssl-verify 状态
    2. prepareRequestClient() 只在配置变化时重建,否则跳过
    3. conf.SetRuntimeDebugEnabled 被调用后,下次请求时自动触发重建
  • 退出信号:go build ./... 通过
  • 验证责任AI 自证 + HUMAN切换 debug 开关确认代理/SSL 行为生效)
  • 回滚git revert

步骤 11修复 bufferHub.append 切片内存泄漏(#12

  • 引用方法M-L4-01
  • 具体操作:在 h.entries = append(h.entries[1:], entry) 之前,将 h.entries[0] 置为零值 Entry{}
  • 退出信号:go build ./... 通过
  • 验证责任AI 自证
  • 回滚git revert

4. 风险与看点

  • 步骤 8锁优化Go RWMutex 不支持锁升级,需 RLock→RUnlock→Lock 两步走,中间可能有竞态导致 LastValue 偶尔不准但不影响正确性LastValue 只用于过期清理的时间戳判断)
  • 步骤 10配置缓存需确保 debug 开关切换后首次请求即生效,不能有"延迟一拍"问题