feat: import services and standardize Go 1.26.5

This commit is contained in:
2026-08-09 10:43:45 +08:00
parent 689c74b28f
commit 86024fa81d
1456 changed files with 220765 additions and 2 deletions

View File

@@ -0,0 +1,55 @@
package check
import (
"context"
"git.apinb.com/bsm-apps/initial/internal/models"
pb "git.apinb.com/bsm-apps/initial/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 获取应用的相关配置信息
func Config(ctx context.Context, in *pb.ConfigRequest) (reply *pb.ConfigReply, err error) {
// 输入验证
if in == nil || in.App == "" || in.Os == "" {
return nil, errcode.ErrInvalidArgument
}
var (
configs []*models.InitialConfig
data []*pb.ConfigItem
)
// 查询配置优先返回特定OS的配置然后是通用配置
configs, err = GetConfigByCache(in.App, in.Os)
if err != nil {
printer.Error("GetConfigByCache", err)
return nil, errcode.ErrDB
}
// 去重处理同一个key只保留优先级最高的配置
configMap := make(map[string]*models.InitialConfig)
for _, item := range configs {
if existing, exists := configMap[item.Key]; !exists || item.Os != "ALL" {
configMap[item.Key] = item
} else if existing.Os == "ALL" && item.Os != "ALL" {
configMap[item.Key] = item
}
}
// 转换为响应格式
for _, item := range configMap {
data = append(data, &pb.ConfigItem{
Identity: item.Identity,
Key: item.Key,
Value: item.Value,
Version: item.Version,
})
}
return &pb.ConfigReply{
Data: data,
}, nil
}

View File

@@ -0,0 +1,29 @@
package check
import (
"git.apinb.com/bsm-apps/initial/internal/impl"
"git.apinb.com/bsm-apps/initial/internal/models"
"git.apinb.com/bsm-sdk/core/vars"
)
// GetConfigCache 获取配置缓存
func GetConfigByCache(app, os string) ([]*models.InitialConfig, error) {
var configs []*models.InitialConfig
key := impl.RedisService.BuildKey("config", app, os)
err := impl.RedisService.Get(key, &configs)
if err == nil {
return configs, nil
}
err = impl.DBService.Where("app = ? AND (os = ? OR os = ?)", app, os, "ALL").
Order("CASE WHEN os = '" + os + "' THEN 0 ELSE 1 END, id DESC").
Find(&configs).Error
if err != nil {
return nil, err
}
err = impl.RedisService.Set(key, configs, vars.DefaultTTL)
return configs, err
}

View File

@@ -0,0 +1,32 @@
package check
import (
"context"
"time"
pb "git.apinb.com/bsm-apps/initial/pb"
"git.apinb.com/bsm-sdk/core/vars"
)
// HELLO - 健康检查接口
func Hello(ctx context.Context, in *pb.Crc) (reply *pb.StatusReply, err error) {
// 输入验证
if in.Code != "" {
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Details: "Hello " + in.Code,
Timeseq: time.Now().Unix(),
}, nil
}
// 可以在这里添加更多的健康检查逻辑
// 例如检查数据库连接、Redis连接等
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Details: "",
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,55 @@
package check
import (
"context"
"git.apinb.com/bsm-apps/initial/internal/impl"
"git.apinb.com/bsm-apps/initial/internal/models"
pb "git.apinb.com/bsm-apps/initial/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"gorm.io/gorm"
)
// 检查更新
func Updates(ctx context.Context, in *pb.CheckForUpdatesRequest) (reply *pb.CheckForUpdatesReply, err error) {
// 输入验证
if in == nil || in.App == "" || in.Os == "" || in.Arch == "" || in.Version == "" {
return nil, errcode.ErrInvalidArgument
}
var data models.InitialApps
// 查询最新版本
err = impl.DBService.Where("app = ? AND os = ? AND arch = ?", in.App, in.Os, in.Arch).
Order("pubdate DESC, id DESC").
First(&data).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
// 没有找到对应的应用版本
return &pb.CheckForUpdatesReply{
Identity: "0",
Version: "0",
}, nil
}
return nil, errcode.ErrDB
}
// 比较版本号
if in.Version != data.Version {
// 有新版本可用
return &pb.CheckForUpdatesReply{
Identity: data.Identity,
Version: data.Version,
Summary: data.Summary,
Files: data.Files,
Pubdate: data.Pubdate.Format("2006-01-02 15:04:05"),
}, nil
}
// 当前版本是最新的
return &pb.CheckForUpdatesReply{
Identity: data.Identity,
Version: data.Version,
}, nil
}

View File

@@ -0,0 +1,44 @@
package data
import (
"context"
"fmt"
pb "git.apinb.com/bsm-apps/initial/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 区域数据,默认级别:市
func Areas(ctx context.Context, in *pb.AreasRequest) (reply *pb.AreasReply, err error) {
// 参数检查 - 如果都没有提供,默认使用中国(ID=1)
if in.GetCountryCode() == "" && in.GetCountryId() == 0 {
in.CountryId = 1 // 默认中国
}
// 查询条件:国家代码优先
areas, err := GetAreasByCache(in)
if err != nil {
printer.Error("GetAreasByCache", err)
return nil, errcode.ErrDB
}
// 转换为响应格式
var data []*pb.AreasItem
for _, area := range areas {
data = append(data, &pb.AreasItem{
Id: fmt.Sprintf("%d", area.Id),
Pid: fmt.Sprintf("%d", area.Pid),
Deep: area.Deep,
Name: area.Name,
PinyinPrefix: area.PinyinPrefix,
Pinyin: area.Pinyin,
ExtId: area.ExtId,
ExtName: area.ExtName,
})
}
return &pb.AreasReply{
Areas: data,
}, nil
}

View File

@@ -0,0 +1,39 @@
package data
import (
"git.apinb.com/bsm-apps/initial/internal/impl"
"git.apinb.com/bsm-apps/initial/internal/models"
pb "git.apinb.com/bsm-apps/initial/pb"
"git.apinb.com/bsm-sdk/core/vars"
)
func GetAreasByCache(in *pb.AreasRequest) ([]*models.InitialAreas, error) {
var areas []*models.InitialAreas
var (
key string
val any
)
if in.GetCountryCode() != "" {
key = "country_code = ?"
val = in.GetCountryCode()
} else if in.GetCountryId() != 0 {
key = "country_id = ?"
val = in.GetCountryId()
}
cacheKey := impl.RedisService.BuildKey("areas", key, val, in.ShowTown)
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").
Find(&areas).Error
err = impl.RedisService.Set(cacheKey, areas, vars.DefaultTTL)
return areas, err
}

View File

@@ -0,0 +1,43 @@
package data
import (
"context"
pb "git.apinb.com/bsm-apps/initial/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
func Country(ctx context.Context, in *pb.Empty) (reply *pb.CountryReply, err error) {
// 查询启用的国家,按排序字段和名称排序
countries, err := GetCountryByCache()
if err != nil {
printer.Error("GetCountryByCache", err)
return nil, errcode.ErrDB
}
// 转换为响应格式
var data []*pb.CountryItem
for _, country := range countries {
data = append(data, &pb.CountryItem{
Id: uint32(country.Id),
Iso2: country.Iso2,
Iso3: country.Iso3,
NumCode: country.NumCode,
PhoneCode: country.PhoneCode,
Currency: country.Currency,
CurrencySymbol: country.CurrencySymbol,
Region: country.Region,
Timezones: country.Timezones,
Translations: country.Translations,
Name: country.Name,
LocalName: country.LocalName,
Enabled: country.Enabled,
SortOrder: country.SortOrder,
})
}
return &pb.CountryReply{
Countries: data,
}, nil
}

View File

@@ -0,0 +1,25 @@
package data
import (
"git.apinb.com/bsm-apps/initial/internal/impl"
"git.apinb.com/bsm-apps/initial/internal/models"
"git.apinb.com/bsm-sdk/core/vars"
)
func GetCountryByCache() ([]*models.InitialCountry, error) {
var country []*models.InitialCountry
cacheKey := impl.RedisService.BuildKey("country")
err := impl.RedisService.Get(cacheKey, &country)
if err == nil {
return country, nil
}
err = impl.DBService.Where("enabled = ?", true).
Order("sort_order ASC, name ASC").
Find(&country).Error
err = impl.RedisService.Set(cacheKey, country, vars.DefaultTTL)
return country, err
}

View File

@@ -0,0 +1,48 @@
package data
import (
"context"
pb "git.apinb.com/bsm-apps/initial/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 系统标签数据
func Datas(ctx context.Context, in *pb.Empty) (reply *pb.DatasReply, err error) {
// 查询系统数据按数据类型和ID排序
datas, err := GetDatasByCache()
if err != nil {
printer.Error("GetDatasByCache", err)
return nil, errcode.ErrDB
}
// 转换为响应格式
var data []*pb.DatasItem
// 添加默认的"全部"选项
data = append(data, &pb.DatasItem{
Id: 0,
DataType: "default",
Key: "all",
Title: "全部",
Remark: "默认全部选项",
Icon: "",
})
// 添加数据库中的数据
for _, item := range datas {
data = append(data, &pb.DatasItem{
Id: int64(item.ID),
DataType: item.DataType,
Key: item.Key,
Title: item.Title,
Remark: item.Remark,
Icon: item.Icon,
})
}
return &pb.DatasReply{
Datas: data,
}, nil
}

View File

@@ -0,0 +1,29 @@
package data
import (
"git.apinb.com/bsm-apps/initial/internal/impl"
"git.apinb.com/bsm-apps/initial/internal/models"
"gorm.io/gorm"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/vars"
)
func GetDatasByCache() ([]*models.InitialDatas, error) {
var datas []*models.InitialDatas
cacheKey := impl.RedisService.BuildKey("datas")
err := impl.RedisService.Get(cacheKey, &datas)
if err == nil {
return datas, nil
}
err = impl.DBService.Order("data_type ASC, id ASC").Find(&datas).Error
if err != nil && err != gorm.ErrRecordNotFound {
return nil, errcode.ErrDB
}
err = impl.RedisService.Set(cacheKey, datas, vars.DefaultTTL)
return datas, err
}