feat: 调整constant
This commit is contained in:
parent
009a290135
commit
3104263c27
|
|
@ -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 端点与配置中心设置 |
|
||||
|
||||
说明:文档仅描述字段用途,未展开敏感值(如密码、密钥等)。如需在文档中补充具体值,请告知需要保留/脱敏的范围。
|
||||
|
|
@ -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 缓存路径,降低接口耗时。
|
||||
|
|
|
|||
|
|
@ -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"}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 获取登录用户信息
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue