From 59b7bde12ecb69450e8f959a6b5f0c9dd6121ffb Mon Sep 17 00:00:00 2001 From: zhouwentao Date: Fri, 2 Jan 2026 14:52:25 +0800 Subject: [PATCH] updates --- project_codebase.md | 4 +++- project_doing.md | 33 +++++++++------------------- server/config/config.go | 48 +++++++++++++++++++++++++++++++---------- task_detail.md | 24 ++++++--------------- 4 files changed, 56 insertions(+), 53 deletions(-) diff --git a/project_codebase.md b/project_codebase.md index 3d4f03d..c8f169a 100644 --- a/project_codebase.md +++ b/project_codebase.md @@ -8,7 +8,9 @@ - `Error(c *gin.Context, code int, msg string)`: 发送错误响应。 ## server/config -- `LoadConfig()`: 从 YAML 文件加载配置,根据 `GO_ENV` 环境变量选择配置文件(默认 dev)。 +- `LoadConfig()`: 加载配置。 + - 优先级1:命令行参数 `-c` 或 `-config` 指定的文件。 + - 优先级2:环境变量 `GO_ENV` 决定的文件(查找顺序:`./config.{env}.yaml` -> `config/config.{env}.yaml` -> `../config/config.{env}.yaml`)。 - `InitDB()`: 初始化GORM数据库连接,支持 SQL 日志配置(自动写入 `logs/sql-YYYY-MM-DD.log`)。 - `InitRedis()`: 初始化Redis客户端。 - `AppConfig`: 全局配置变量,包含 `Log`, `Security`, `RateLimit`, `Swagger`, `Database`, `Redis` 配置。 diff --git a/project_doing.md b/project_doing.md index 2e9491f..a9aeb0d 100644 --- a/project_doing.md +++ b/project_doing.md @@ -1,26 +1,13 @@ -### [任务执行] 修复 SQL 日志未写入文件问题 -- **操作目标**: 修改数据库初始化逻辑,使其支持将 SQL 日志写入到指定文件。 -- **影响范围**: `server/config/database.go` -- **修改前记录**: GORM Logger 硬编码输出到 `os.Stdout`。 -- **修改结果**: - - 在 `server/config/database.go` 中增加了 `getLogWriter` 函数。 - - 该函数根据 `AppConfig.Log` 配置创建日志目录和文件(命名为 `sql-YYYY-MM-DD.log`)。 - - 如果配置开启了控制台输出,则使用 `io.MultiWriter` 同时输出到文件和控制台。 - - 验证:在测试环境下临时开启日志模式,成功生成了 `logs/sql-2025-12-25.log` 文件。 - -### [任务执行] 支持计算专业表的动态表名插入 +### [任务执行] 优化配置加载逻辑 - **时间戳**: 2026-01-02 -- **关联任务**: 动态表名支持 -- **操作目标**: 修改 `YxCalculationMajorService` 和 `YxCalculationMajorMapper` 以支持根据用户成绩中的 `CalculationTableName` 动态插入数据。 -- **影响范围**: - - `server/modules/yx/mapper/yx_calculation_major_mapper.go` - - `server/modules/yx/service/yx_calculation_major_service.go` - - `server/modules/user/service/user_score_service.go` - - `server/modules/yx/controller/yx_calculation_major_controller.go` +- **关联任务**: 优化配置加载 +- **操作目标**: 增强 `LoadConfig`,支持命令行参数指定配置文件,并优化查找顺序。 +- **影响范围**: `server/config/config.go` +- **修改前记录**: 仅通过 `GO_ENV` 决定文件名,并在 `config/` 或上级目录查找。 - **修改结果**: - - `YxCalculationMajorMapper.BatchCreate` 增加 `tableName` 参数,支持 `db.Table(tableName)`。 - - `YxCalculationMajorService.BatchCreate` 和 `BatchCreateBySchoolMajorDTO` 增加 `tableName` 参数并透传。 - - `UserScoreService.SaveUserScore` 调用 `BatchCreateBySchoolMajorDTO` 时传入 `entityItem.CalculationTableName`。 - - `YxCalculationMajorController.BatchCreate` 传入空字符串以使用默认表名。 - - **[新增]**: 修复了 `FindRecommendList` 中表名参数传递错误的问题,改为使用 `fmt.Sprintf` 动态注入表名。 + 1. **命令行参数**: 优先检查 `-c` 或 `-config` 参数,如果存在则直接使用指定的配置文件。 + 2. **查找顺序优化**: + * `./config.{env}.yaml` (当前目录,方便生产部署) + * `./config/config.{env}.yaml` (开发环境) + * `../config/config.{env}.yaml` (测试环境) diff --git a/server/config/config.go b/server/config/config.go index 25a3dbe..d0b7deb 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -77,19 +77,45 @@ type RedisConfig struct { // LoadConfig 加载配置 func LoadConfig() { - env := os.Getenv("GO_ENV") - if env == "" { - env = "dev" + var configFile string + + // 1. 优先检查命令行参数 (简单解析) + // 格式: ./app -c config.prod.yaml 或 ./app -config config.prod.yaml + args := os.Args + for i, arg := range args { + if (arg == "-c" || arg == "-config") && i+1 < len(args) { + configFile = args[i+1] + break + } } - configFile := fmt.Sprintf("config/config.%s.yaml", env) - // 如果是测试环境,可能需要从上级目录查找,这里简单处理,如果找不到尝试从根目录找 - if _, err := os.Stat(configFile); os.IsNotExist(err) { - // 尝试在当前目录下找 (比如在 server 目录下运行) - configFile = fmt.Sprintf("config.%s.yaml", env) - if _, err := os.Stat(configFile); os.IsNotExist(err) { - // 如果是单元测试,可能在 tests 目录下 - configFile = fmt.Sprintf("../config/config.%s.yaml", env) + // 2. 如果命令行参数未指定,则根据环境变量查找 + if configFile == "" { + env := os.Getenv("GO_ENV") + if env == "" { + env = "dev" + } + + // 查找顺序: + // 1. 当前目录 config.{env}.yaml (方便部署时直接放在执行文件旁) + // 2. config/config.{env}.yaml (开发习惯) + // 3. ../config/config.{env}.yaml (测试环境习惯) + searchPaths := []string{ + fmt.Sprintf("config.%s.yaml", env), + fmt.Sprintf("config/config.%s.yaml", env), + fmt.Sprintf("../config/config.%s.yaml", env), + } + + for _, path := range searchPaths { + if _, err := os.Stat(path); err == nil { + configFile = path + break + } + } + + // 如果都没找到,默认回退到 config/config.{env}.yaml 以便报错信息准确 + if configFile == "" { + configFile = fmt.Sprintf("config/config.%s.yaml", env) } } diff --git a/task_detail.md b/task_detail.md index bb81874..705e592 100644 --- a/task_detail.md +++ b/task_detail.md @@ -1,20 +1,8 @@ -## 会话 ID: 20251225-02 -- **执行原因**: 用户反馈 SQL 日志未写入文件。 +## 会话 ID: 20260102-02 +- **执行原因**: 用户希望在运行时通过命令行参数指定配置文件,并优化配置文件查找逻辑,优先使用当前目录下的文件。 - **执行过程**: - 1. 分析发现 `server/config/database.go` 中 GORM Logger 硬编码输出到 `os.Stdout`。 - 2. 在 `server/config/database.go` 中实现 `getLogWriter` 函数,根据配置创建文件 Writer。 - 3. 使用 `io.MultiWriter` 支持同时输出到文件和控制台。 - 4. 验证日志文件生成。 -- **执行结果**: SQL 日志现在会根据日期生成独立的文件(如 `logs/sql-2025-12-25.log`),且遵循全局日志配置。 - -## 会话 ID: 20260102-01 -- **执行原因**: 用户询问如何在 `UserScoreService` 中根据 `CalculationTableName` 动态插入数据,并修复了 Mapper 中的查询 Bug。 -- **执行过程**: - 1. 分析 `YxCalculationMajorService` 和 Mapper,发现默认使用硬编码的表名。 - 2. 修改 `YxCalculationMajorMapper.BatchCreate` 增加 `tableName` 参数。 - 3. 修改 `YxCalculationMajorService.BatchCreate` 和 `BatchCreateBySchoolMajorDTO` 增加 `tableName` 参数。 - 4. 更新 `UserScoreService` 调用处,传入 `entityItem.CalculationTableName`。 - 5. 更新 `YxCalculationMajorController` 调用处,传入空字符串以保持默认行为。 - 6. **[修复]** 发现 `FindRecommendList` 中错误地将表名作为参数传递给 `?` 占位符。修改为使用 `fmt.Sprintf` 动态构建 SQL,并移除了无效的字符串替换逻辑。 -- **执行结果**: 实现了计算专业表的动态表名插入功能,并修复了推荐列表查询的 SQL 语法错误。 + 1. 修改 `server/config/config.go` 中的 `LoadConfig` 函数。 + 2. 增加命令行参数解析逻辑,支持 `-c` 或 `-config` 参数。 + 3. 调整配置文件查找顺序:优先检查 `config.{env}.yaml`(当前目录),其次是 `config/config.{env}.yaml`,最后是上级目录。 +- **执行结果**: 现在可以通过命令行参数指定配置文件,或者直接将配置文件放在可执行文件同级目录下,无需严格依赖 `config/` 目录结构。