经过模块化重构,项目现在采用清晰的分层架构,每个模块负责特定的功能领域。
qoder-logout/
├── main.go # CLI入口点
├── internal/ # 内部包
│ ├── config/ # 配置管理
│ │ ├── config.go # 常量和配置定义
│ │ └── config_test.go # 配置测试
│ ├── paths/ # 路径管理
│ │ └── paths.go # 路径相关操作
│ ├── database/ # 数据库操作
│ │ ├── database.go # SQLite数据库清理和替换
│ │ ├── database_test.go # 数据库基础测试
│ │ ├── integration_test.go # 数据库集成测试
│ │ └── advanced_test.go # 高级数据库测试
│ ├── generator/ # 智能数据生成器
│ │ ├── generator.go # 生成器接口和实现
│ │ ├── generator_test.go # 生成器基础测试
│ │ └── performance_test.go # 性能和并发测试
│ ├── files/ # 文件操作
│ │ ├── files.go # 文件和缓存清理
│ │ └── files_test.go # 文件操作测试
│ ├── utils/ # 工具函数
│ │ └── cli.go # CLI参数解析和帮助
│ └── logout/ # 核心业务逻辑
│ ├── logout.go # 登出服务编排
│ └── integration_test.go # 系统集成测试
├── go.mod
├── go.sum
└── Makefile
- 职责: 管理所有的常量和配置信息
- 内容:
- 文件路径常量
- 数据处理策略配置(新增)
- 认证密钥列表(包含机器标识符、历史记录等)
- 替换键列表(新增)
- 缓存文件列表
- 缓存目录列表(新增)
- 系统配置参数
- 职责: 处理所有路径相关的操作
- 功能:
- 获取Qoder安装路径
- 生成各种文件的完整路径
- 路径验证和检查
- 职责: 处理SQLite数据库相关操作
- 功能:
- 清除状态数据库中的认证信息和机器标识
- 智能数据替换:支持UUID v4、十六进制字符串等数据的替换(新增)
- 清除工作空间存储中的所有项目数据库(新增)
- 备份和删除本地数据库
- 事务安全:使用SQL事务确保操作的原子性(新增)
- 预览模式下的数据库操作模拟
- 职责: 智能数据生成和替换操作
- 功能:
- UUID v4 生成器: 符合RFC4122标准的UUID v4生成
- 十六进制生成器: 支持大小写的十六进制字符串生成
- 随机字节生成器: 作为兜底策略的通用生成器
- 数据替换器: 协调各种生成器完成数据替换
- 格式验证: 验证生成数据的格式正确性
- 加密安全: 使用crypto/rand生成加密级随机数
- 职责: 处理文件系统操作
- 功能:
- 删除缓存文件
- 清除缓存目录(会话存储、工作缓存、用户历史)(新增)
- 备份配置文件
- 检查Qoder运行状态
- 智能保护MCP配置文件(新增)
- 文件复制操作
- 职责: 提供通用工具函数
- 功能:
- CLI参数解析
- 帮助信息显示
- 用户交互确认
- 职责: 核心业务逻辑编排
- 功能:
- 协调各个模块完成完整的登出流程
- 处理Qoder运行状态检查
- 统一的服务接口
- 支持预览模式和实际执行模式
- 整合所有清理功能:认证、缓存、工作空间、历史、智能替换(更新)
- 每个包只负责一个特定的功能领域
- 代码更容易理解和维护
- 明确的依赖关系
- 避免循环依赖
- 每个模块可以独立测试
- 便于单元测试和集成测试
- 新功能可以在对应模块中添加
- 不影响其他模块的稳定性
- 各个模块可以在其他项目中复用
- 工具函数和配置管理可以独立使用
// 创建登出服务
logoutService, err := logout.NewService(dryRun)
if err != nil {
log.Fatal(err)
}
// 检查Qoder运行状态
if !logoutService.HandleRunningQoder() {
return
}
// 执行登出流程
if err := logoutService.Logout(); err != nil {
log.Fatal(err)
}- 在相应的模块中添加新方法
- 在
logout.Service中调用新方法 - 必要时在
config包中添加新的配置
- 在
utils.ParseArgs()中添加参数解析 - 在
utils.PrintHelp()中添加帮助信息 - 在主流程中处理新参数
- 在
config包中添加路径常量 - 在
paths.Manager中添加获取方法 - 在相应的业务模块中使用
这种模块化的架构使得代码更加清晰、可维护,并且便于团队协作开发。