This commit is contained in:
zhouwentao 2026-01-02 14:52:25 +08:00
parent 0c787bc441
commit 59b7bde12e
4 changed files with 56 additions and 53 deletions

View File

@ -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` 配置。

View File

@ -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` (测试环境)

View File

@ -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)
}
}

View File

@ -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/` 目录结构。