fix version 1

This commit is contained in:
2026-09-22 21:15:34 +08:00
parent 9f86366638
commit d63d7e8b3a
277 changed files with 9959 additions and 1514 deletions

View File

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

View File

@@ -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 返回 1a 低于 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
}