fix version 1
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"bsm/full/module/base/initial/internal/impl"
|
||||
"bsm/full/module/base/initial/internal/models"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
// GetConfigCache 获取配置缓存
|
||||
@@ -18,7 +19,11 @@ func GetConfigByCache(app, os string) ([]*models.InitialConfig, error) {
|
||||
}
|
||||
|
||||
err = impl.DBService.Where("app = ? AND (os = ? OR os = ?)", app, os, "ALL").
|
||||
Order("CASE WHEN os = '" + os + "' THEN 0 ELSE 1 END, id DESC").
|
||||
// 使用结构化排序并以占位符绑定 os,禁止把请求参数拼接进 ORDER BY
|
||||
Order(clause.OrderBy{Expression: clause.Expr{
|
||||
SQL: "CASE WHEN os = ? THEN 0 ELSE 1 END, id DESC",
|
||||
Vars: []any{os},
|
||||
}}).
|
||||
Find(&configs).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -2,6 +2,8 @@ package check
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"bsm/full/module/base/initial/internal/impl"
|
||||
"bsm/full/module/base/initial/internal/models"
|
||||
@@ -35,8 +37,8 @@ func Updates(ctx context.Context, in *pb.CheckForUpdatesRequest) (reply *pb.Chec
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
// 比较版本号
|
||||
if in.Version != data.Version {
|
||||
// 比较版本号,仅当服务端记录的版本高于客户端上报版本时才下发更新
|
||||
if compareVersion(data.Version, in.Version) > 0 {
|
||||
// 有新版本可用
|
||||
return &pb.CheckForUpdatesReply{
|
||||
Identity: data.Identity,
|
||||
@@ -53,3 +55,54 @@ func Updates(ctx context.Context, in *pb.CheckForUpdatesRequest) (reply *pb.Chec
|
||||
Version: data.Version,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// compareVersion 比较两个版本号:a 高于 b 返回 1,a 低于 b 返回 -1,相同返回 0。
|
||||
// 按 "." 分段转数字逐段比较,忽略前缀 "v" 与预发布后缀(如 -beta),非数字段按 0 处理。
|
||||
func compareVersion(a, b string) int {
|
||||
segsA := versionSegments(a)
|
||||
segsB := versionSegments(b)
|
||||
|
||||
length := len(segsA)
|
||||
if len(segsB) > length {
|
||||
length = len(segsB)
|
||||
}
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
var numA, numB int
|
||||
if i < len(segsA) {
|
||||
numA = segsA[i]
|
||||
}
|
||||
if i < len(segsB) {
|
||||
numB = segsB[i]
|
||||
}
|
||||
if numA > numB {
|
||||
return 1
|
||||
}
|
||||
if numA < numB {
|
||||
return -1
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// versionSegments 把版本号拆分为数字段
|
||||
func versionSegments(version string) []int {
|
||||
version = strings.TrimPrefix(strings.TrimSpace(version), "v")
|
||||
// 去掉预发布与构建后缀,只比较主版本数字段
|
||||
if idx := strings.IndexAny(version, "-+"); idx >= 0 {
|
||||
version = version[:idx]
|
||||
}
|
||||
|
||||
parts := strings.Split(version, ".")
|
||||
segments := make([]int, 0, len(parts))
|
||||
for _, part := range parts {
|
||||
num, err := strconv.Atoi(strings.TrimSpace(part))
|
||||
if err != nil {
|
||||
num = 0
|
||||
}
|
||||
segments = append(segments, num)
|
||||
}
|
||||
|
||||
return segments
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"bsm/full/module/base/initial/internal/impl"
|
||||
"bsm/full/module/base/initial/internal/models"
|
||||
pb "bsm/full/module/base/initial/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
@@ -23,16 +24,22 @@ func GetAreasByCache(in *pb.AreasRequest) ([]*models.InitialAreas, error) {
|
||||
val = in.GetCountryId()
|
||||
}
|
||||
|
||||
cacheKey := impl.RedisService.BuildKey("areas", key, val, in.ShowTown)
|
||||
// 缓存键只包含实际参与查询的条件(show_town 在现有模型下无对应列,不参与查询)
|
||||
cacheKey := impl.RedisService.BuildKey("areas", key, val)
|
||||
|
||||
err := impl.RedisService.Get(cacheKey, &areas)
|
||||
if err == nil {
|
||||
return areas, nil
|
||||
}
|
||||
|
||||
err = impl.DBService.Where("enabled = ?", true).Where(key, val).Where("show_town = ?", in.ShowTown).
|
||||
Order("sort_order ASC, name ASC").
|
||||
// 按模型真实列查询(InitialAreas 没有 enabled/show_town/sort_order 列)
|
||||
err = impl.DBService.Where(key, val).
|
||||
Order("name ASC").
|
||||
Find(&areas).Error
|
||||
if err != nil {
|
||||
// 查询失败不写缓存,避免空结果污染缓存
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
err = impl.RedisService.Set(cacheKey, areas, vars.DefaultTTL)
|
||||
return areas, err
|
||||
|
||||
Reference in New Issue
Block a user