diff --git a/docs/config_dev_and_go.md b/docs/config_dev_and_go.md new file mode 100644 index 0000000..cd1dc36 --- /dev/null +++ b/docs/config_dev_and_go.md @@ -0,0 +1,106 @@ +# config.go 与 config.dev.yaml 说明 + +本文档说明 `server/config/config.go` 与 `server/config/config.dev.yaml` 的职责与字段含义,便于理解配置加载逻辑与开发环境配置项。 + +**config.go** + +用途: +1. 定义应用配置结构体(与 YAML 字段一一对应)。 +2. 提供 `LoadConfig()` 读取并解析配置文件到全局变量 `AppConfig`。 + +加载逻辑(`LoadConfig()`): +1. 先解析命令行参数 `-c` 或 `-config` 指定的配置文件路径。 +2. 未指定时读取环境变量 `GO_ENV`,默认 `dev`。 +3. 按顺序查找配置文件: + - `config.{env}.yaml` + - `config/config.{env}.yaml` + - `../config/config.{env}.yaml` +4. 若未找到,回退到 `config/config.{env}.yaml` 以便报错信息准确。 +5. 读取文件并反序列化到 `AppConfig`;解析失败会 `panic`,读取失败会打印提示并保留默认空配置。 + +结构体与字段说明(与 YAML 对应): + +| 结构体 | 字段 | 说明 | +| --- | --- | --- | +| `LogConfig` | `level` | 日志级别 | +| | `dir` | 日志目录 | +| | `console` | 是否输出到控制台 | +| `ServerConfig` | `port` | 服务端口 | +| | `worker_id` | 雪花算法机器 ID | +| | `datacenter_id` | 雪花算法数据中心 ID | +| `SecurityConfig` | `enable` | 是否启用签名安全校验 | +| | `header_key` | 签名请求头字段名 | +| | `secret_key` | 签名密钥 | +| `PayloadCryptoConfig` | `enable` | 请求/响应加密总开关 | +| | `header_key` | 加密标记请求头字段名 | +| | `secret_key` | 加密密钥 | +| | `whitelist` | 白名单路径 | +| | `request` | 请求方向加密配置 | +| | `response` | 响应方向加密配置 | +| `PayloadCryptoDirectionConfig` | `enable` | 是否启用 | +| | `required` | 是否强制 | +| `RateLimitConfig` | `enable` | 是否启用限流 | +| | `default` | 默认限流规则 | +| | `rules` | 路径级别规则 | +| `RateLimitRule` | `interval` | 时间间隔(秒) | +| | `max_requests` | 最大请求次数 | +| `SwaggerConfig` | `user` | Swagger 登录用户名 | +| | `password` | Swagger 登录密码 | +| `DatabaseConfig` | `driver` | 数据库驱动 | +| | `host` | 数据库地址 | +| | `port` | 数据库端口 | +| | `database` | 数据库名 | +| | `username` | 用户名 | +| | `password` | 密码 | +| | `charset` | 字符集 | +| | `max_idle_conns` | 空闲连接数 | +| | `max_open_conns` | 最大连接数 | +| | `conn_max_lifetime` | 连接最大生命周期(小时) | +| | `log_mode` | 是否开启 SQL 日志 | +| `RedisConfig` | `addr` | Redis 地址 | +| | `password` | Redis 密码 | +| | `db` | Redis DB | +| `WechatConfig` | `mini_program` | 微信小程序配置 | +| `WechatMiniProgramConfig` | `app_id` | 小程序 AppID | +| | `app_secret` | 小程序密钥 | +| `AppVersionConfig` | `app` | 客户端版本控制 | +| | `api` | API 端点配置 | +| | `webview` | WebView 端点配置 | +| | `ttl_seconds` | 配置缓存秒数 | +| | `disabled` | 是否禁用 | +| | `disable_reason` | 禁用原因 | +| | `tenantId` | 默认租户 ID | +| `AppClientConfig` | `min_version` | 最低版本 | +| | `latest_version` | 最新版本 | +| | `force_update` | 是否强制更新 | +| `AppEndpointConfig` | `base_url` | 基础地址 | +| | `version` | 接口版本 | +| | `min_client_version` | 最低客户端版本 | +| `TenantConfig` | `enable` | 是否启用多租户 | +| | `header_key` | 租户请求头字段名 | +| | `column` | 租户字段名 | +| | `tables` | 启用租户过滤的表 | + +**config.dev.yaml** + +用途: +- 开发环境配置文件(`GO_ENV=dev` 默认加载)。 +- 覆盖服务端口、日志、安全、限流、数据库、Redis、微信小程序、客户端版本等参数。 + +顶层配置项说明: + +| 配置段 | 作用 | +| --- | --- | +| `server` | 服务端口与雪花算法机器/数据中心 ID | +| `log` | 日志级别、目录、控制台输出 | +| `security` | 请求签名安全校验 | +| `tenant` | 多租户开关与租户标识 | +| `payload_crypto` | 请求/响应加密配置 | +| `rate_limit` | 限流开关与规则 | +| `swagger` | Swagger 文档访问账号 | +| `database` | 数据库连接与连接池配置 | +| `redis` | Redis 连接配置 | +| `wechat` | 微信小程序配置 | +| `app_config` | 客户端版本、API/WebView 端点与配置中心设置 | + +说明:文档仅描述字段用途,未展开敏感值(如密码、密钥等)。如需在文档中补充具体值,请告知需要保留/脱敏的范围。 diff --git a/docs/tasks/task_detail_2026_03_23.md b/docs/tasks/task_detail_2026_03_23.md index 6bff954..763dd61 100644 --- a/docs/tasks/task_detail_2026_03_23.md +++ b/docs/tasks/task_detail_2026_03_23.md @@ -18,3 +18,23 @@ 2. 登录接口引用该常量返回错误。 - **执行结果**: 错误文案已集中管理并复用。 + +# 任务执行摘要 + +## 会话 ID: config-doc-001 +- [2026-03-23 16:47:41] +- **执行原因**: 用户要求说明 `server/config/config.dev.yaml` 与 `server/config/config.go` 的用途并整理成文档。 +- **执行过程**: + 1. 查看 `server/config/config.go` 与 `server/config/config.dev.yaml` 内容,梳理加载逻辑与字段含义。 + 2. 新建 `docs/config_dev_and_go.md`,输出配置结构与开发环境配置项说明,并提醒敏感值未展开。 +- **执行结果**: 已生成配置说明文档,便于理解配置加载流程与各配置段职责。 + +# 任务执行摘要 + +## 会话 ID: user-profile-redis-001 +- [2026-03-23 17:00:59] +- **执行原因**: 为 `GET /user/profile` 增加 Redis 缓存返回逻辑以降低响应耗时。 +- **执行过程**: + 1. 增加用户信息缓存常量(前缀与过期时间)。 + 2. 在控制器读取 Redis 命中直接返回,未命中回源服务并写入缓存。 +- **执行结果**: `user_profile_controller.go` 已支持 Redis 缓存路径,降低接口耗时。 diff --git a/server/common/constants.go b/server/common/constants.go index b9803dd..b54d0ee 100644 --- a/server/common/constants.go +++ b/server/common/constants.go @@ -2,69 +2,149 @@ package common import "time" -// Redis 相关常量 -const ( - // RedisTokenPrefix Redis中Token前缀 - RedisTokenPrefix = "login:token:" - // RedisTokenExpire Token过期时间 - RedisTokenExpire = 24 * time.Hour +// redisTokenConst Redis Token 相关常量 +type redisTokenConst struct { + Prefix string + Expire time.Duration +} - // RedisUserScorePrefix Redis中用户成绩前缀 - RedisUserScorePrefix = "user:score:" - // RedisUserScoreExpire 用户成绩过期时间 - RedisUserScoreExpire = 8 * time.Hour -) +// redisUserScoreConst Redis 用户成绩相关常量 +type redisUserScoreConst struct { + Prefix string + Expire time.Duration +} -// HTTP/Context 相关常量 -const ( - // ContextUserKey 上下文中存储用户信息的key - ContextUserKey = "loginUser" - // TokenHeader 请求头中Token的key - // "X-Access-Token" - TokenHeader = "Authorization" - // HeaderTokenPrefix Token前缀 (如有需要) - HeaderTokenPrefix = "Bearer " -) +// redisUserProfileConst Redis 用户信息相关常量 +type redisUserProfileConst struct { + Prefix string + Expire time.Duration +} -// 错误信息常量 -const ( - ErrTenantIDMissing = "未设置租户Id" - ErrPhonePwdMissing = "手机号和密码不能为空" -) +// redisConst Redis 常量集合 +type redisConst struct { + Prefix string + Token redisTokenConst + UserScore redisUserScoreConst + UserProfile redisUserProfileConst +} -// 业务状态常量 -const ( - StateActive = "1" // 使用中 - StateInactive = "0" // 未使用/已删除 - StateHistory = "2" // 历史记录 -) +// RedisConst Redis 相关常量,使用方式:RedisConst.Token.Prefix +var RedisConst = redisConst{ + Prefix: "wz:", + // 登录Token相关常量 + Token: redisTokenConst{ + Prefix: "wz:login:token:", + Expire: 24 * time.Hour, + }, + // 用户成绩相关常量 + UserScore: redisUserScoreConst{ + Prefix: "wz:user:score:", + Expire: 8 * time.Hour, + }, + // 用户信息相关常量 + UserProfile: redisUserProfileConst{ + Prefix: "wz:user:profile:", + Expire: 10 * time.Minute, + }, +} -// 数值常量 -const ( - Number0 = 0 - Number0p75 = 0.75 - Number0p5 = 0.5 - Number5 = 5 - Number7p5 = 7.5 - Number100 = 100 -) +// httpConst HTTP/Context 相关常量 +type httpConst struct { + // 上下文中存储用户信息的key + ContextUserKey string + // 请求头中Token的key + TokenHeader string + // 请求头中Token的前缀 + HeaderTokenPrefix string +} -// 数据类型常量 -const ( - TypeNormal = "1" // 普通类 - TypeArt = "2" // 艺术类 +// HttpConst HTTP 相关常量,使用方式:HttpConst.TokenHeader +var HttpConst = httpConst{ + ContextUserKey: "loginUser", + TokenHeader: "Authorization", + HeaderTokenPrefix: "Bearer ", +} - // YxConstant 相关常量 - NowYear = "2026" +// errConst 错误信息常量 +type errConst struct { + // 未设置租户Id + TenantIDMissing string + // 手机号和密码不能为空 + PhonePwdMissing string +} - // 录取方式常量 - CulturalControlLineGuo = "文线专排" - SpecialControlLineGuo = "专过文排" - CulturalControlLineGuoMain = "文过专排主科" +// ErrConst 错误信息常量,使用方式:ErrConst.TenantIDMissing +var ErrConst = errConst{ + TenantIDMissing: "未设置租户Id", + PhonePwdMissing: "手机号和密码不能为空", +} - W1Z1 = "文*1+专*1" - W1JiaZ1 = "文+专" -) +// stateConst 业务状态常量 +type stateConst struct { + Active string + Inactive string + History string +} + +// StateConst 业务状态常量,使用方式:StateConst.Active +var StateConst = stateConst{ + Active: "1", // 使用中 + Inactive: "0", // 未使用/已删除 + History: "2", // 历史记录 +} + +// numberConst 数值常量 +type numberConst struct { + N0 int + N0p75 float64 + N0p5 float64 + N5 int + N7p5 float64 + N100 int +} + +// NumberConst 数值常量,使用方式:NumberConst.N100 +var NumberConst = numberConst{ + N0: 0, + N0p75: 0.75, + N0p5: 0.5, + N5: 5, + N7p5: 7.5, + N100: 100, +} + +// dataTypeConst 数据类型常量 +type dataTypeConst struct { + Normal string + Art string +} + +// DataTypeConst 数据类型常量,使用方式:DataTypeConst.Normal +var DataTypeConst = dataTypeConst{ + Normal: "1", // 普通类 + Art: "2", // 艺术类 +} + +// admissionConst 录取方式常量 +type admissionConst struct { + CulturalControlLineGuo string + SpecialControlLineGuo string + CulturalControlLineGuoMain string + W1Z1 string + W1JiaZ1 string +} + +// AdmissionConst 录取方式常量,使用方式:AdmissionConst.CulturalControlLineGuo +var AdmissionConst = admissionConst{ + CulturalControlLineGuo: "文线专排", + SpecialControlLineGuo: "专过文排", + CulturalControlLineGuoMain: "文过专排主科", + W1Z1: "文*1+专*1", + W1JiaZ1: "文+专", +} + +// NowYear 当前年份 +const NowYear = "2026" var ( OldYearList = []string{"2025", "2024"} diff --git a/server/common/context.go b/server/common/context.go index ec84267..eefe827 100644 --- a/server/common/context.go +++ b/server/common/context.go @@ -11,7 +11,7 @@ import ( // GetLoginUser 从上下文获取当前登录用户 // 在Controller中使用: user := common.GetLoginUser(c) func GetLoginUser(c *gin.Context) *entity.LoginUser { - value, exists := c.Get(ContextUserKey) + value, exists := c.Get(HttpConst.ContextUserKey) if !exists { return nil } diff --git a/server/common/score_calculator.go b/server/common/score_calculator.go index 5574b9b..a46a88d 100644 --- a/server/common/score_calculator.go +++ b/server/common/score_calculator.go @@ -65,9 +65,9 @@ func ComputeHistoryMajorEnrollScoreLineDifferenceWithRulesEnrollProbability(majo // boolean isSportsMajor = "体育类".equals(enrollData.getMajorType()); if "体育类" == majorType { if "2024" == enrollData.Year && "专过文排" != enrollData.EnrollmentCode && "文过专排" != enrollData.EnrollmentCode { - currentDiff = currentDiff * Number7p5 + currentDiff = currentDiff * NumberConst.N0p75 } else if "2024" == enrollData.Year && "文过专排" == enrollData.EnrollmentCode { // Placeholder - currentDiff = currentDiff * Number5 + currentDiff = currentDiff * float64(NumberConst.N5) } else if "2023" == enrollData.Year { continue } else if rulesEnrollProbability == enrollData.RulesEnrollProbability { // Need field @@ -118,11 +118,11 @@ func ConvertIntoScore(rulesEnrollProbability string, culturalScore, professional // CrossingControlLine 判断是否过省控线 func CrossingControlLine(rulesEnrollProbability string, culturalScore, professionalScore, culturalControlLine, specialControlLine float64) bool { - if rulesEnrollProbability == CulturalControlLineGuo { + if rulesEnrollProbability == AdmissionConst.CulturalControlLineGuo { return culturalScore >= culturalControlLine - } else if rulesEnrollProbability == SpecialControlLineGuo { + } else if rulesEnrollProbability == AdmissionConst.SpecialControlLineGuo { return professionalScore >= specialControlLine - } else if rulesEnrollProbability == CulturalControlLineGuoMain { + } else if rulesEnrollProbability == AdmissionConst.CulturalControlLineGuoMain { return culturalScore >= specialControlLine } return culturalScore >= culturalControlLine && professionalScore >= specialControlLine @@ -194,4 +194,4 @@ func ReplaceLastZeroChar(input string) string { input = strings.ReplaceAll(input, "1.", "1") // 简化处理 return input -} \ No newline at end of file +} diff --git a/server/middleware/auth.go b/server/middleware/auth.go index 36f0cd2..082465d 100644 --- a/server/middleware/auth.go +++ b/server/middleware/auth.go @@ -40,7 +40,7 @@ func AuthMiddleware() gin.HandlerFunc { } // 获取Token - token := c.GetHeader(common.TokenHeader) + token := c.GetHeader(common.HttpConst.TokenHeader) if token == "" { common.Error(c, 401, "未登录") c.Abort() @@ -48,8 +48,8 @@ func AuthMiddleware() gin.HandlerFunc { } // 如果有前缀则处理前缀 - if common.HeaderTokenPrefix != "" && strings.HasPrefix(token, common.HeaderTokenPrefix) { - token = token[len(common.HeaderTokenPrefix):] + if common.HttpConst.HeaderTokenPrefix != "" && strings.HasPrefix(token, common.HttpConst.HeaderTokenPrefix) { + token = token[len(common.HttpConst.HeaderTokenPrefix):] } // 验证Token并获取用户信息 @@ -61,8 +61,7 @@ func AuthMiddleware() gin.HandlerFunc { } // 存入上下文 - c.Set(common.ContextUserKey, loginUser) - + c.Set(common.HttpConst.ContextUserKey, loginUser) c.Next() } } diff --git a/server/modules/api/controller/user_auth_controller.go b/server/modules/api/controller/user_auth_controller.go index 49eaac8..2f1a71e 100644 --- a/server/modules/api/controller/user_auth_controller.go +++ b/server/modules/api/controller/user_auth_controller.go @@ -34,13 +34,13 @@ func (ctrl *OpenAuthController) RegisterRoutes(r *gin.RouterGroup) { func (ctrl *OpenAuthController) LoginByPhone(c *gin.Context) { tenantID := common.TenantIDFromHeader(c.GetHeader) if tenantID == "" { - common.Error(c, 400, common.ErrTenantIDMissing) + common.Error(c, 400, common.ErrConst.TenantIDMissing) return } var req apiDto.UserPasswordLoginRequest if err := c.ShouldBindJSON(&req); err != nil { - common.Error(c, 400, common.ErrPhonePwdMissing) + common.Error(c, 400, common.ErrConst.PhonePwdMissing) return } loginUser, token, err := ctrl.userService.LoginByPhonePassword(req.Phone, req.Password) diff --git a/server/modules/api/controller/wechat_controller.go b/server/modules/api/controller/wechat_controller.go index 9f9fb8d..e941e9e 100644 --- a/server/modules/api/controller/wechat_controller.go +++ b/server/modules/api/controller/wechat_controller.go @@ -34,7 +34,7 @@ func (ctrl *WechatMiniProgramController) MiniLogin(c *gin.Context) { var req apiDto.WechatMiniLoginRequest tenantID := common.TenantIDFromHeader(c.GetHeader) if tenantID == "" { - common.Error(c, 400, common.ErrTenantIDMissing) + common.Error(c, 400, common.ErrConst.TenantIDMissing) return } if err := c.ShouldBindJSON(&req); err != nil { diff --git a/server/modules/api/service/wechat_service.go b/server/modules/api/service/wechat_service.go index d39e51b..9a6858d 100644 --- a/server/modules/api/service/wechat_service.go +++ b/server/modules/api/service/wechat_service.go @@ -457,7 +457,7 @@ func (s *WechatMiniProgramService) saveLoginUser(userID int64, req *apiDto.Wecha if err != nil { return "", err } - if err := config.RDB.Set(context.Background(), common.RedisTokenPrefix+token, data, common.RedisTokenExpire).Err(); err != nil { + if err := config.RDB.Set(context.Background(), common.RedisConst.Token.Prefix+token, data, common.RedisConst.Token.Expire).Err(); err != nil { return "", err } return token, nil diff --git a/server/modules/system/service/sys_user_service.go b/server/modules/system/service/sys_user_service.go index 6b33a15..aaa4f80 100644 --- a/server/modules/system/service/sys_user_service.go +++ b/server/modules/system/service/sys_user_service.go @@ -218,13 +218,13 @@ func (s *SysUserService) SysLogin(username, password string) (*entity.LoginUser, // Logout 用户登出 func (s *SysUserService) Logout(token string) error { ctx := context.Background() - return config.RDB.Del(ctx, common.RedisTokenPrefix+token).Err() + return config.RDB.Del(ctx, common.RedisConst.Token.Prefix+token).Err() } // GetLoginUser 根据Token获取登录用户信息 func (s *SysUserService) GetLoginUser(token string) (*entity.LoginUser, error) { ctx := context.Background() - data, err := config.RDB.Get(ctx, common.RedisTokenPrefix+token).Result() + data, err := config.RDB.Get(ctx, common.RedisConst.Token.Prefix+token).Result() if err != nil { return nil, errors.New("未登录或登录已过期") } @@ -234,7 +234,7 @@ func (s *SysUserService) GetLoginUser(token string) (*entity.LoginUser, error) { return nil, errors.New("登录信息异常") } - config.RDB.Expire(ctx, common.RedisTokenPrefix+token, common.RedisTokenExpire) + config.RDB.Expire(ctx, common.RedisConst.Token.Prefix+token, common.RedisConst.Token.Expire) return &loginUser, nil } @@ -242,7 +242,7 @@ func (s *SysUserService) GetLoginUser(token string) (*entity.LoginUser, error) { // RefreshToken 刷新Token过期时间 func (s *SysUserService) RefreshToken(token string) error { ctx := context.Background() - return config.RDB.Expire(ctx, common.RedisTokenPrefix+token, common.RedisTokenExpire).Err() + return config.RDB.Expire(ctx, common.RedisConst.Token.Prefix+token, common.RedisConst.Token.Expire).Err() } // UpdatePassword 修改密码 @@ -278,7 +278,7 @@ func (s *SysUserService) saveLoginUser(token string, user *entity.LoginUser) err if err != nil { return err } - return config.RDB.Set(ctx, common.RedisTokenPrefix+token, data, common.RedisTokenExpire).Err() + return config.RDB.Set(ctx, common.RedisConst.Token.Prefix+token, data, common.RedisConst.Token.Expire).Err() } // generateToken 生成Token diff --git a/server/modules/user/controller/user_profile_controller.go b/server/modules/user/controller/user_profile_controller.go index 9797592..0577ecf 100644 --- a/server/modules/user/controller/user_profile_controller.go +++ b/server/modules/user/controller/user_profile_controller.go @@ -2,10 +2,15 @@ package controller import ( + "context" + "encoding/json" "strconv" + "strings" "server/common" + "server/config" "server/modules/user/service" + "server/modules/user/vo" "github.com/gin-gonic/gin" ) @@ -42,10 +47,28 @@ func (ctrl *UserProfileController) GetProfile(c *gin.Context) { } platformType, _ := strconv.ParseInt(c.DefaultQuery("platformType", "1"), 10, 8) + cacheKey := common.RedisConst.UserProfile.Prefix + strconv.FormatInt(userID, 10) + ":" + strconv.FormatInt(platformType, 10) + if config.RDB != nil { + cacheData, err := config.RDB.Get(context.Background(), cacheKey).Result() + if err == nil && strings.TrimSpace(cacheData) != "" { + var cachedProfile vo.UserProfileVO + if err := json.Unmarshal([]byte(cacheData), &cachedProfile); err == nil { + config.RDB.Expire(context.Background(), cacheKey, common.RedisConst.UserProfile.Expire) + common.Success(c, cachedProfile) + return + } + } + } + profile, err := ctrl.service.GetProfile(userID, int8(platformType)) if err != nil { common.Error(c, 500, err.Error()) return } + if config.RDB != nil { + if data, err := json.Marshal(profile); err == nil { + _ = config.RDB.Set(context.Background(), cacheKey, data, common.RedisConst.UserProfile.Expire).Err() + } + } common.Success(c, profile) } diff --git a/server/modules/user/service/user_score_service.go b/server/modules/user/service/user_score_service.go index 0f05220..0e8704f 100644 --- a/server/modules/user/service/user_score_service.go +++ b/server/modules/user/service/user_score_service.go @@ -65,7 +65,7 @@ func (s *UserScoreService) GetActiveScoreByID(userID string) (entity.YxUserScore func (s *UserScoreService) GetActiveScoreByUserID(userID string) (vo.UserScoreVO, error) { var score entity.YxUserScore // 先从Redis获取是否存在 - scoreRedisData, err := config.RDB.Get(context.Background(), common.RedisUserScorePrefix+userID).Result() + scoreRedisData, err := config.RDB.Get(context.Background(), common.RedisConst.UserScore.Prefix+userID).Result() if err != nil { // 明确指定字段,提高可读性 err := common.CurrentDB().Model(&entity.YxUserScore{}). @@ -82,7 +82,7 @@ func (s *UserScoreService) GetActiveScoreByUserID(userID string) (vo.UserScoreVO if err != nil { return vo.UserScoreVO{}, fmt.Errorf("序列化成绩记录失败: %w", err) } - err = config.RDB.Set(context.Background(), common.RedisUserScorePrefix+userID, scoreRedisSetData, common.RedisUserScoreExpire).Err() + err = config.RDB.Set(context.Background(), common.RedisConst.UserScore.Prefix+userID, scoreRedisSetData, common.RedisConst.UserScore.Expire).Err() if err != nil { return vo.UserScoreVO{}, fmt.Errorf("缓存成绩记录失败: %w", err) } @@ -91,7 +91,7 @@ func (s *UserScoreService) GetActiveScoreByUserID(userID string) (vo.UserScoreVO return vo.UserScoreVO{}, fmt.Errorf("解析 Redis 数据失败: %w", err) } // 刷新过期时间 - config.RDB.Expire(context.Background(), common.RedisUserScorePrefix+userID, common.RedisUserScoreExpire) + config.RDB.Expire(context.Background(), common.RedisConst.UserScore.Prefix+userID, common.RedisConst.UserScore.Expire) } return s.convertEntityToVo(score), nil @@ -423,11 +423,11 @@ func (s *UserScoreService) SaveUserScore(req *yxDto.SaveScoreRequest) (vo.UserSc } // 清除之前的Redis成绩缓存 - config.RDB.Del(context.Background(), common.RedisUserScorePrefix+req.CreateBy) + config.RDB.Del(context.Background(), common.RedisConst.UserScore.Prefix+req.CreateBy) // 更新Redis 数据 scoreRedisSetData, err := json.Marshal(entityItem) - err = config.RDB.Set(context.Background(), common.RedisUserScorePrefix+req.CreateBy, scoreRedisSetData, common.RedisUserScoreExpire).Err() + err = config.RDB.Set(context.Background(), common.RedisConst.UserScore.Prefix+req.CreateBy, scoreRedisSetData, common.RedisConst.UserScore.Expire).Err() if err != nil { return vo.UserScoreVO{}, fmt.Errorf("缓存成绩记录失败: %w", err) } diff --git a/server/modules/user/service/user_service.go b/server/modules/user/service/user_service.go index ed60207..c67706e 100644 --- a/server/modules/user/service/user_service.go +++ b/server/modules/user/service/user_service.go @@ -182,7 +182,7 @@ func (s *UserService) saveLoginUser(token string, user *systemEntity.LoginUser) if err != nil { return err } - return config.RDB.Set(ctx, common.RedisTokenPrefix+token, data, common.RedisTokenExpire).Err() + return config.RDB.Set(ctx, common.RedisConst.Token.Prefix+token, data, common.RedisConst.Token.Expire).Err() } // GetProfile 获取登录用户信息 diff --git a/server/modules/yx/service/yx_calculation_major_service.go b/server/modules/yx/service/yx_calculation_major_service.go index ceb3b48..e4d412d 100644 --- a/server/modules/yx/service/yx_calculation_major_service.go +++ b/server/modules/yx/service/yx_calculation_major_service.go @@ -378,19 +378,19 @@ func (s *YxCalculationMajorService) BiaoYanRecommendMajorListSetEnrollProbabilit } if probabilityOperator == "" { - item.EnrollProbability = common.Number5 + item.EnrollProbability = float64(common.NumberConst.N5) continue } // 判断其他录取要求 if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } // 判断是否过省控线 if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -401,25 +401,25 @@ func (s *YxCalculationMajorService) BiaoYanRecommendMajorListSetEnrollProbabilit // 权限检查 if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } // 录取方式计算 - if common.CulturalControlLineGuoMain == rulesEnrollProbability { + if common.AdmissionConst.CulturalControlLineGuoMain == rulesEnrollProbability { if len(item.HistoryMajorEnrollList) == 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } - item.EnrollProbability = (studentScore * item.HistoryMajorEnrollList[0].AdmissionLine) * common.Number0p75 + item.EnrollProbability = (studentScore * item.HistoryMajorEnrollList[0].AdmissionLine) * common.NumberConst.N0p75 if studentScore >= item.HistoryMajorEnrollList[0].AdmissionLine { - item.EnrollProbability *= common.Number0p5 + item.EnrollProbability *= common.NumberConst.N0p5 } continue } else { nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator) if nowYearProvincialControlLine <= 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -427,7 +427,7 @@ func (s *YxCalculationMajorService) BiaoYanRecommendMajorListSetEnrollProbabilit historyThreeYearDiff := diffMap["scoreDifference"].(float64) if historyThreeYearDiff == 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -510,19 +510,19 @@ func (s *YxCalculationMajorService) YinYueRecommendMajorListSetEnrollProbability } if probabilityOperator == "" { - item.EnrollProbability = common.Number5 + item.EnrollProbability = float64(common.NumberConst.N5) continue } // 判断其他录取要求 if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } // 判断是否过省控线 if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -533,25 +533,25 @@ func (s *YxCalculationMajorService) YinYueRecommendMajorListSetEnrollProbability // 权限检查 if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } // 录取方式计算 - if common.CulturalControlLineGuoMain == rulesEnrollProbability { + if common.AdmissionConst.CulturalControlLineGuoMain == rulesEnrollProbability { if len(item.HistoryMajorEnrollList) == 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } - item.EnrollProbability = (studentScore * item.HistoryMajorEnrollList[0].AdmissionLine) * common.Number0p75 + item.EnrollProbability = (studentScore * item.HistoryMajorEnrollList[0].AdmissionLine) * common.NumberConst.N0p75 if studentScore >= item.HistoryMajorEnrollList[0].AdmissionLine { - item.EnrollProbability *= common.Number0p5 + item.EnrollProbability *= common.NumberConst.N0p5 } continue } else { nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator) if nowYearProvincialControlLine <= 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -559,7 +559,7 @@ func (s *YxCalculationMajorService) YinYueRecommendMajorListSetEnrollProbability historyThreeYearDiff := diffMap["scoreDifference"].(float64) if historyThreeYearDiff == 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -619,13 +619,13 @@ func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(r } if probabilityOperator == "" { - item.EnrollProbability = common.Number5 + item.EnrollProbability = float64(common.NumberConst.N5) continue } // 判断其他录取要求 if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -640,14 +640,14 @@ func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(r } } if isSpecial { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } } // 判断是否过省控线 if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -658,25 +658,25 @@ func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(r // 权限检查 if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } // 录取方式计算 - if common.CulturalControlLineGuoMain == rulesEnrollProbability { + if common.AdmissionConst.CulturalControlLineGuoMain == rulesEnrollProbability { if len(item.HistoryMajorEnrollList) == 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } - item.EnrollProbability = (studentScore * item.HistoryMajorEnrollList[0].AdmissionLine) * common.Number0p75 + item.EnrollProbability = (studentScore * item.HistoryMajorEnrollList[0].AdmissionLine) * common.NumberConst.N0p75 if studentScore >= item.HistoryMajorEnrollList[0].AdmissionLine { - item.EnrollProbability *= common.Number0p5 + item.EnrollProbability *= common.NumberConst.N0p5 } continue } else { nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator) if nowYearProvincialControlLine <= 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue } @@ -684,7 +684,7 @@ func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(r historyThreeYearDiff := diffMap["scoreDifference"].(float64) if historyThreeYearDiff == 0 { - item.EnrollProbability = common.Number0 + item.EnrollProbability = float64(common.NumberConst.N0) continue }