feat: 调整constant

This commit is contained in:
zwt13703 2026-03-23 17:28:13 +08:00
parent 009a290135
commit 3104263c27
14 changed files with 340 additions and 112 deletions

106
docs/config_dev_and_go.md Normal file
View File

@ -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 端点与配置中心设置 |
说明:文档仅描述字段用途,未展开敏感值(如密码、密钥等)。如需在文档中补充具体值,请告知需要保留/脱敏的范围。

View File

@ -18,3 +18,23 @@
2. 登录接口引用该常量返回错误。 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 缓存路径,降低接口耗时。

View File

@ -2,69 +2,149 @@ package common
import "time" import "time"
// Redis 相关常量 // redisTokenConst Redis Token 相关常量
const ( type redisTokenConst struct {
// RedisTokenPrefix Redis中Token前缀 Prefix string
RedisTokenPrefix = "login:token:" Expire time.Duration
// RedisTokenExpire Token过期时间 }
RedisTokenExpire = 24 * time.Hour
// RedisUserScorePrefix Redis中用户成绩前缀 // redisUserScoreConst Redis 用户成绩相关常量
RedisUserScorePrefix = "user:score:" type redisUserScoreConst struct {
// RedisUserScoreExpire 用户成绩过期时间 Prefix string
RedisUserScoreExpire = 8 * time.Hour Expire time.Duration
) }
// HTTP/Context 相关常量 // redisUserProfileConst Redis 用户信息相关常量
const ( type redisUserProfileConst struct {
// ContextUserKey 上下文中存储用户信息的key Prefix string
ContextUserKey = "loginUser" Expire time.Duration
// TokenHeader 请求头中Token的key }
// "X-Access-Token"
TokenHeader = "Authorization"
// HeaderTokenPrefix Token前缀 (如有需要)
HeaderTokenPrefix = "Bearer "
)
// 错误信息常量 // redisConst Redis 常量集合
const ( type redisConst struct {
ErrTenantIDMissing = "未设置租户Id" Prefix string
ErrPhonePwdMissing = "手机号和密码不能为空" Token redisTokenConst
) UserScore redisUserScoreConst
UserProfile redisUserProfileConst
}
// 业务状态常量 // RedisConst Redis 相关常量使用方式RedisConst.Token.Prefix
const ( var RedisConst = redisConst{
StateActive = "1" // 使用中 Prefix: "wz:",
StateInactive = "0" // 未使用/已删除 // 登录Token相关常量
StateHistory = "2" // 历史记录 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,
},
}
// 数值常量 // httpConst HTTP/Context 相关常量
const ( type httpConst struct {
Number0 = 0 // 上下文中存储用户信息的key
Number0p75 = 0.75 ContextUserKey string
Number0p5 = 0.5 // 请求头中Token的key
Number5 = 5 TokenHeader string
Number7p5 = 7.5 // 请求头中Token的前缀
Number100 = 100 HeaderTokenPrefix string
) }
// 数据类型常量 // HttpConst HTTP 相关常量使用方式HttpConst.TokenHeader
const ( var HttpConst = httpConst{
TypeNormal = "1" // 普通类 ContextUserKey: "loginUser",
TypeArt = "2" // 艺术类 TokenHeader: "Authorization",
HeaderTokenPrefix: "Bearer ",
}
// YxConstant 相关常量 // errConst 错误信息常量
NowYear = "2026" type errConst struct {
// 未设置租户Id
TenantIDMissing string
// 手机号和密码不能为空
PhonePwdMissing string
}
// 录取方式常量 // ErrConst 错误信息常量使用方式ErrConst.TenantIDMissing
CulturalControlLineGuo = "文线专排" var ErrConst = errConst{
SpecialControlLineGuo = "专过文排" TenantIDMissing: "未设置租户Id",
CulturalControlLineGuoMain = "文过专排主科" PhonePwdMissing: "手机号和密码不能为空",
}
W1Z1 = "文*1+专*1" // stateConst 业务状态常量
W1JiaZ1 = "文+专" 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 ( var (
OldYearList = []string{"2025", "2024"} OldYearList = []string{"2025", "2024"}

View File

@ -11,7 +11,7 @@ import (
// GetLoginUser 从上下文获取当前登录用户 // GetLoginUser 从上下文获取当前登录用户
// 在Controller中使用: user := common.GetLoginUser(c) // 在Controller中使用: user := common.GetLoginUser(c)
func GetLoginUser(c *gin.Context) *entity.LoginUser { func GetLoginUser(c *gin.Context) *entity.LoginUser {
value, exists := c.Get(ContextUserKey) value, exists := c.Get(HttpConst.ContextUserKey)
if !exists { if !exists {
return nil return nil
} }

View File

@ -65,9 +65,9 @@ func ComputeHistoryMajorEnrollScoreLineDifferenceWithRulesEnrollProbability(majo
// boolean isSportsMajor = "体育类".equals(enrollData.getMajorType()); // boolean isSportsMajor = "体育类".equals(enrollData.getMajorType());
if "体育类" == majorType { if "体育类" == majorType {
if "2024" == enrollData.Year && "专过文排" != enrollData.EnrollmentCode && "文过专排" != enrollData.EnrollmentCode { if "2024" == enrollData.Year && "专过文排" != enrollData.EnrollmentCode && "文过专排" != enrollData.EnrollmentCode {
currentDiff = currentDiff * Number7p5 currentDiff = currentDiff * NumberConst.N0p75
} else if "2024" == enrollData.Year && "文过专排" == enrollData.EnrollmentCode { // Placeholder } else if "2024" == enrollData.Year && "文过专排" == enrollData.EnrollmentCode { // Placeholder
currentDiff = currentDiff * Number5 currentDiff = currentDiff * float64(NumberConst.N5)
} else if "2023" == enrollData.Year { } else if "2023" == enrollData.Year {
continue continue
} else if rulesEnrollProbability == enrollData.RulesEnrollProbability { // Need field } else if rulesEnrollProbability == enrollData.RulesEnrollProbability { // Need field
@ -118,11 +118,11 @@ func ConvertIntoScore(rulesEnrollProbability string, culturalScore, professional
// CrossingControlLine 判断是否过省控线 // CrossingControlLine 判断是否过省控线
func CrossingControlLine(rulesEnrollProbability string, culturalScore, professionalScore, culturalControlLine, specialControlLine float64) bool { func CrossingControlLine(rulesEnrollProbability string, culturalScore, professionalScore, culturalControlLine, specialControlLine float64) bool {
if rulesEnrollProbability == CulturalControlLineGuo { if rulesEnrollProbability == AdmissionConst.CulturalControlLineGuo {
return culturalScore >= culturalControlLine return culturalScore >= culturalControlLine
} else if rulesEnrollProbability == SpecialControlLineGuo { } else if rulesEnrollProbability == AdmissionConst.SpecialControlLineGuo {
return professionalScore >= specialControlLine return professionalScore >= specialControlLine
} else if rulesEnrollProbability == CulturalControlLineGuoMain { } else if rulesEnrollProbability == AdmissionConst.CulturalControlLineGuoMain {
return culturalScore >= specialControlLine return culturalScore >= specialControlLine
} }
return culturalScore >= culturalControlLine && professionalScore >= specialControlLine return culturalScore >= culturalControlLine && professionalScore >= specialControlLine
@ -194,4 +194,4 @@ func ReplaceLastZeroChar(input string) string {
input = strings.ReplaceAll(input, "1.", "1") input = strings.ReplaceAll(input, "1.", "1")
// 简化处理 // 简化处理
return input return input
} }

View File

@ -40,7 +40,7 @@ func AuthMiddleware() gin.HandlerFunc {
} }
// 获取Token // 获取Token
token := c.GetHeader(common.TokenHeader) token := c.GetHeader(common.HttpConst.TokenHeader)
if token == "" { if token == "" {
common.Error(c, 401, "未登录") common.Error(c, 401, "未登录")
c.Abort() c.Abort()
@ -48,8 +48,8 @@ func AuthMiddleware() gin.HandlerFunc {
} }
// 如果有前缀则处理前缀 // 如果有前缀则处理前缀
if common.HeaderTokenPrefix != "" && strings.HasPrefix(token, common.HeaderTokenPrefix) { if common.HttpConst.HeaderTokenPrefix != "" && strings.HasPrefix(token, common.HttpConst.HeaderTokenPrefix) {
token = token[len(common.HeaderTokenPrefix):] token = token[len(common.HttpConst.HeaderTokenPrefix):]
} }
// 验证Token并获取用户信息 // 验证Token并获取用户信息
@ -61,8 +61,7 @@ func AuthMiddleware() gin.HandlerFunc {
} }
// 存入上下文 // 存入上下文
c.Set(common.ContextUserKey, loginUser) c.Set(common.HttpConst.ContextUserKey, loginUser)
c.Next() c.Next()
} }
} }

View File

@ -34,13 +34,13 @@ func (ctrl *OpenAuthController) RegisterRoutes(r *gin.RouterGroup) {
func (ctrl *OpenAuthController) LoginByPhone(c *gin.Context) { func (ctrl *OpenAuthController) LoginByPhone(c *gin.Context) {
tenantID := common.TenantIDFromHeader(c.GetHeader) tenantID := common.TenantIDFromHeader(c.GetHeader)
if tenantID == "" { if tenantID == "" {
common.Error(c, 400, common.ErrTenantIDMissing) common.Error(c, 400, common.ErrConst.TenantIDMissing)
return return
} }
var req apiDto.UserPasswordLoginRequest var req apiDto.UserPasswordLoginRequest
if err := c.ShouldBindJSON(&req); err != nil { if err := c.ShouldBindJSON(&req); err != nil {
common.Error(c, 400, common.ErrPhonePwdMissing) common.Error(c, 400, common.ErrConst.PhonePwdMissing)
return return
} }
loginUser, token, err := ctrl.userService.LoginByPhonePassword(req.Phone, req.Password) loginUser, token, err := ctrl.userService.LoginByPhonePassword(req.Phone, req.Password)

View File

@ -34,7 +34,7 @@ func (ctrl *WechatMiniProgramController) MiniLogin(c *gin.Context) {
var req apiDto.WechatMiniLoginRequest var req apiDto.WechatMiniLoginRequest
tenantID := common.TenantIDFromHeader(c.GetHeader) tenantID := common.TenantIDFromHeader(c.GetHeader)
if tenantID == "" { if tenantID == "" {
common.Error(c, 400, common.ErrTenantIDMissing) common.Error(c, 400, common.ErrConst.TenantIDMissing)
return return
} }
if err := c.ShouldBindJSON(&req); err != nil { if err := c.ShouldBindJSON(&req); err != nil {

View File

@ -457,7 +457,7 @@ func (s *WechatMiniProgramService) saveLoginUser(userID int64, req *apiDto.Wecha
if err != nil { if err != nil {
return "", err 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 "", err
} }
return token, nil return token, nil

View File

@ -218,13 +218,13 @@ func (s *SysUserService) SysLogin(username, password string) (*entity.LoginUser,
// Logout 用户登出 // Logout 用户登出
func (s *SysUserService) Logout(token string) error { func (s *SysUserService) Logout(token string) error {
ctx := context.Background() 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获取登录用户信息 // GetLoginUser 根据Token获取登录用户信息
func (s *SysUserService) GetLoginUser(token string) (*entity.LoginUser, error) { func (s *SysUserService) GetLoginUser(token string) (*entity.LoginUser, error) {
ctx := context.Background() 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 { if err != nil {
return nil, errors.New("未登录或登录已过期") return nil, errors.New("未登录或登录已过期")
} }
@ -234,7 +234,7 @@ func (s *SysUserService) GetLoginUser(token string) (*entity.LoginUser, error) {
return nil, errors.New("登录信息异常") 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 return &loginUser, nil
} }
@ -242,7 +242,7 @@ func (s *SysUserService) GetLoginUser(token string) (*entity.LoginUser, error) {
// RefreshToken 刷新Token过期时间 // RefreshToken 刷新Token过期时间
func (s *SysUserService) RefreshToken(token string) error { func (s *SysUserService) RefreshToken(token string) error {
ctx := context.Background() 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 修改密码 // UpdatePassword 修改密码
@ -278,7 +278,7 @@ func (s *SysUserService) saveLoginUser(token string, user *entity.LoginUser) err
if err != nil { if err != nil {
return err 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 // generateToken 生成Token

View File

@ -2,10 +2,15 @@
package controller package controller
import ( import (
"context"
"encoding/json"
"strconv" "strconv"
"strings"
"server/common" "server/common"
"server/config"
"server/modules/user/service" "server/modules/user/service"
"server/modules/user/vo"
"github.com/gin-gonic/gin" "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) 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)) profile, err := ctrl.service.GetProfile(userID, int8(platformType))
if err != nil { if err != nil {
common.Error(c, 500, err.Error()) common.Error(c, 500, err.Error())
return 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) common.Success(c, profile)
} }

View File

@ -65,7 +65,7 @@ func (s *UserScoreService) GetActiveScoreByID(userID string) (entity.YxUserScore
func (s *UserScoreService) GetActiveScoreByUserID(userID string) (vo.UserScoreVO, error) { func (s *UserScoreService) GetActiveScoreByUserID(userID string) (vo.UserScoreVO, error) {
var score entity.YxUserScore var score entity.YxUserScore
// 先从Redis获取是否存在 // 先从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 { if err != nil {
// 明确指定字段,提高可读性 // 明确指定字段,提高可读性
err := common.CurrentDB().Model(&entity.YxUserScore{}). err := common.CurrentDB().Model(&entity.YxUserScore{}).
@ -82,7 +82,7 @@ func (s *UserScoreService) GetActiveScoreByUserID(userID string) (vo.UserScoreVO
if err != nil { if err != nil {
return vo.UserScoreVO{}, fmt.Errorf("序列化成绩记录失败: %w", err) 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 { if err != nil {
return vo.UserScoreVO{}, fmt.Errorf("缓存成绩记录失败: %w", err) 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) 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 return s.convertEntityToVo(score), nil
@ -423,11 +423,11 @@ func (s *UserScoreService) SaveUserScore(req *yxDto.SaveScoreRequest) (vo.UserSc
} }
// 清除之前的Redis成绩缓存 // 清除之前的Redis成绩缓存
config.RDB.Del(context.Background(), common.RedisUserScorePrefix+req.CreateBy) config.RDB.Del(context.Background(), common.RedisConst.UserScore.Prefix+req.CreateBy)
// 更新Redis 数据 // 更新Redis 数据
scoreRedisSetData, err := json.Marshal(entityItem) 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 { if err != nil {
return vo.UserScoreVO{}, fmt.Errorf("缓存成绩记录失败: %w", err) return vo.UserScoreVO{}, fmt.Errorf("缓存成绩记录失败: %w", err)
} }

View File

@ -182,7 +182,7 @@ func (s *UserService) saveLoginUser(token string, user *systemEntity.LoginUser)
if err != nil { if err != nil {
return err 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 获取登录用户信息 // GetProfile 获取登录用户信息

View File

@ -378,19 +378,19 @@ func (s *YxCalculationMajorService) BiaoYanRecommendMajorListSetEnrollProbabilit
} }
if probabilityOperator == "" { if probabilityOperator == "" {
item.EnrollProbability = common.Number5 item.EnrollProbability = float64(common.NumberConst.N5)
continue continue
} }
// 判断其他录取要求 // 判断其他录取要求
if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) { if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
// 判断是否过省控线 // 判断是否过省控线
if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) { if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -401,25 +401,25 @@ func (s *YxCalculationMajorService) BiaoYanRecommendMajorListSetEnrollProbabilit
// 权限检查 // 权限检查
if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) { if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
// 录取方式计算 // 录取方式计算
if common.CulturalControlLineGuoMain == rulesEnrollProbability { if common.AdmissionConst.CulturalControlLineGuoMain == rulesEnrollProbability {
if len(item.HistoryMajorEnrollList) == 0 { if len(item.HistoryMajorEnrollList) == 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue 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 { if studentScore >= item.HistoryMajorEnrollList[0].AdmissionLine {
item.EnrollProbability *= common.Number0p5 item.EnrollProbability *= common.NumberConst.N0p5
} }
continue continue
} else { } else {
nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator) nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator)
if nowYearProvincialControlLine <= 0 { if nowYearProvincialControlLine <= 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -427,7 +427,7 @@ func (s *YxCalculationMajorService) BiaoYanRecommendMajorListSetEnrollProbabilit
historyThreeYearDiff := diffMap["scoreDifference"].(float64) historyThreeYearDiff := diffMap["scoreDifference"].(float64)
if historyThreeYearDiff == 0 { if historyThreeYearDiff == 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -510,19 +510,19 @@ func (s *YxCalculationMajorService) YinYueRecommendMajorListSetEnrollProbability
} }
if probabilityOperator == "" { if probabilityOperator == "" {
item.EnrollProbability = common.Number5 item.EnrollProbability = float64(common.NumberConst.N5)
continue continue
} }
// 判断其他录取要求 // 判断其他录取要求
if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) { if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
// 判断是否过省控线 // 判断是否过省控线
if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) { if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -533,25 +533,25 @@ func (s *YxCalculationMajorService) YinYueRecommendMajorListSetEnrollProbability
// 权限检查 // 权限检查
if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) { if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
// 录取方式计算 // 录取方式计算
if common.CulturalControlLineGuoMain == rulesEnrollProbability { if common.AdmissionConst.CulturalControlLineGuoMain == rulesEnrollProbability {
if len(item.HistoryMajorEnrollList) == 0 { if len(item.HistoryMajorEnrollList) == 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue 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 { if studentScore >= item.HistoryMajorEnrollList[0].AdmissionLine {
item.EnrollProbability *= common.Number0p5 item.EnrollProbability *= common.NumberConst.N0p5
} }
continue continue
} else { } else {
nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator) nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator)
if nowYearProvincialControlLine <= 0 { if nowYearProvincialControlLine <= 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -559,7 +559,7 @@ func (s *YxCalculationMajorService) YinYueRecommendMajorListSetEnrollProbability
historyThreeYearDiff := diffMap["scoreDifference"].(float64) historyThreeYearDiff := diffMap["scoreDifference"].(float64)
if historyThreeYearDiff == 0 { if historyThreeYearDiff == 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -619,13 +619,13 @@ func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(r
} }
if probabilityOperator == "" { if probabilityOperator == "" {
item.EnrollProbability = common.Number5 item.EnrollProbability = float64(common.NumberConst.N5)
continue continue
} }
// 判断其他录取要求 // 判断其他录取要求
if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) { if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -640,14 +640,14 @@ func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(r
} }
} }
if isSpecial { if isSpecial {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
} }
// 判断是否过省控线 // 判断是否过省控线
if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) { if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -658,25 +658,25 @@ func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(r
// 权限检查 // 权限检查
if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) { if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
// 录取方式计算 // 录取方式计算
if common.CulturalControlLineGuoMain == rulesEnrollProbability { if common.AdmissionConst.CulturalControlLineGuoMain == rulesEnrollProbability {
if len(item.HistoryMajorEnrollList) == 0 { if len(item.HistoryMajorEnrollList) == 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue 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 { if studentScore >= item.HistoryMajorEnrollList[0].AdmissionLine {
item.EnrollProbability *= common.Number0p5 item.EnrollProbability *= common.NumberConst.N0p5
} }
continue continue
} else { } else {
nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator) nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator)
if nowYearProvincialControlLine <= 0 { if nowYearProvincialControlLine <= 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }
@ -684,7 +684,7 @@ func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(r
historyThreeYearDiff := diffMap["scoreDifference"].(float64) historyThreeYearDiff := diffMap["scoreDifference"].(float64)
if historyThreeYearDiff == 0 { if historyThreeYearDiff == 0 {
item.EnrollProbability = common.Number0 item.EnrollProbability = float64(common.NumberConst.N0)
continue continue
} }