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,28 @@
package config
import (
"git.apinb.com/bsm-sdk/core/conf"
)
var (
Spec SrvConfig
)
type SrvConfig struct {
conf.Base `yaml:",inline"`
Databases *conf.DBConf `yaml:"Databases"`
Rpc map[string]conf.RpcConf `yaml:"Rpc"`
Apm *conf.ApmConf `yaml:"APM"`
Etcd *conf.EtcdConf `yaml:"Etcd"`
}
func New(srvKey string) {
// 初始化配置 创建一个新的配置实例,用于服务配置
conf.New(srvKey, &Spec)
// 配置校验 服务端口如果不合规,则随机分配端口
Spec.Port = conf.CheckPort(Spec.Port)
// 配置校验 服务名称地址及监听地址不能为空
conf.NotNil(Spec.Service, Spec.Cache)
}

View File

@@ -0,0 +1,36 @@
package impl
import (
"git.apinb.com/bsm-apps/logs/internal/config"
"git.apinb.com/bsm-sdk/core/cache/redis"
"git.apinb.com/bsm-sdk/core/types"
"git.apinb.com/bsm-sdk/core/vars"
"git.apinb.com/bsm-sdk/core/with"
clientv3 "go.etcd.io/etcd/client/v3"
"gorm.io/gorm"
)
var (
RedisService *redis.RedisClient // Redis 客户端服务
EtcdService *clientv3.Client // Etcd 客户端服务
DBService *gorm.DB // 数据库服务
)
// NewImpl 初始化各类服务实例
func NewImpl() {
// 初始化 Redis 缓存
RedisService = with.RedisCache(config.Spec.Cache)
// 初始化数据库服务
opts := &types.SqlOptions{
MaxIdleConns: vars.SqlOptionMaxIdleConns,
MaxOpenConns: vars.SqlOptionMaxOpenConns,
ConnMaxLifetime: vars.SqlOptionConnMaxLifetime,
LogStdout: false,
Debug: false,
}
DBService = with.Databases(config.Spec.Databases, opts)
// 初始化 Etcd 服务
EtcdService = with.Etcd(config.Spec.Etcd)
}

View File

@@ -0,0 +1,10 @@
package hello
import (
"github.com/gin-gonic/gin"
)
// Ping
func Ping(ctx *gin.Context) {
ctx.JSON(200, gin.H{"message": "Pong"})
}

View File

@@ -0,0 +1,47 @@
package log
import (
"errors"
"log"
"strings"
"git.apinb.com/bsm-apps/logs/internal/impl"
"git.apinb.com/bsm-apps/logs/internal/models"
"git.apinb.com/bsm-sdk/core/infra"
"github.com/gin-gonic/gin"
)
func Create(c *gin.Context) {
var (
request = make([]*models.LogData, 0)
)
// 验证请求IP禁止公网网段提交
ip := c.ClientIP()
if ip == "127.0.0.1" || ip == "localhost" || strings.HasPrefix(ip, "10.") || strings.HasPrefix(ip, "172.") || strings.HasPrefix(ip, "192.") {
log.Printf("request ip is not allowed")
err := errors.New("request ip is not allowed")
infra.Response.Error(c, err)
return
}
err := c.BindJSON(&request)
if err != nil {
log.Printf("parse json error: %v", err)
infra.Response.Error(c, err)
return
}
if len(request) == 0 {
log.Printf("request data is empty")
infra.Response.Error(c, errors.New("request data is empty"))
return
}
if err := impl.DBService.Model(&models.LogData{}).Create(&request).Error; err != nil {
log.Printf("save log data error: %v", err)
infra.Response.Error(c, err)
return
}
infra.Response.Success(c, "")
}

View File

@@ -0,0 +1,65 @@
package log
import (
"log"
"git.apinb.com/bsm-apps/logs/internal/impl"
"git.apinb.com/bsm-apps/logs/internal/models"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/infra"
"github.com/gin-gonic/gin"
)
var (
DefaultPage = 1
DefaultSize = 50
)
func LogFetch(c *gin.Context) {
var request map[string]any
err := c.BindJSON(&request)
if err != nil {
log.Printf("解析json异常: %v", err)
infra.Response.Error(c, errcode.ErrJsonUnmarshal)
return
}
var (
data []any
count int64
tx = impl.DBService.Model(&models.LogData{})
)
var size int
var page int
if request["op_name"] != "" {
tx.Where("op_name like ?", "%"+request["op_name"].(string)+"%")
}
if request["service"] != "" {
tx.Where("service like ?", "%"+request["service"].(string)+"%")
}
if request["op_ip"] != "" {
tx.Where("op_ip = ?", "%"+request["ip"].(string)+"%")
}
if request["level"] != "" {
tx.Where("level = ?", request["level"].(int))
}
if page <= 0 {
page = DefaultPage
}
if size <= 0 {
size = DefaultSize
}
if err := tx.Count(&count).Limit(size).Offset((page - 1) * size).Find(&data).Error; err != nil {
log.Printf("查询异常: %v", err)
infra.Response.Error(c, errcode.ErrDB)
return
}
infra.Response.Success(c, map[string]any{
"data": data,
"total": count,
})
}

View File

@@ -0,0 +1,34 @@
package log
import (
"log"
"git.apinb.com/bsm-apps/logs/internal/impl"
"git.apinb.com/bsm-apps/logs/internal/models"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/infra"
"github.com/gin-gonic/gin"
)
func Total(c *gin.Context) {
var request map[string]any
err := c.BindJSON(&request)
if err != nil {
log.Printf("解析json异常: %v", err)
infra.Response.Error(c, errcode.ErrJsonUnmarshal)
return
}
tx := impl.DBService.Model(&models.LogData{})
if request["service"] != "" {
tx.Where("service = ?", request["service"])
}
var result map[string]any
if err := tx.Select("level", "count(level)").Group("level").First(&result).Error; err != nil {
infra.Response.Error(c, errcode.ErrDB)
return
}
infra.Response.Success(c, result)
}

View File

@@ -0,0 +1,25 @@
package models
import (
"time"
"git.apinb.com/bsm-sdk/core/database"
)
type LogData struct {
ID uint `gorm:"column:id;primarykey;" json:"id"`
CreatedAt time.Time `gorm:"column:created_at;type:TIMESTAMP;" json:"created_at"`
Service string `gorm:"column:service;type:varchar(255);def:'def'" json:"service"` // 服务名称
OpID uint `gorm:"column:op_id;" json:"op_id"` // 操作人员ID
OpName string `gorm:"column:op_name;type:varchar(255);" json:"op_name"` // 操作人员姓名
OpIp string `gorm:"column:ip;type:varchar(255);def:'0.0.0.0'" json:"ip"` // 操作IP
DataType string `gorm:"column:data_type;type:varchar(255);" json:"data_type"` // 数据类型
Level uint `gorm:"column:level;def:1" json:"level"` // 日志级别 1:信息 2:警告 3:错误
Content string `gorm:"column:content;" json:"content"` // 日志内容
Hmac string `gorm:"column:hmac;" json:"hmac"`
Encry bool `gorm:"-" json:"encry"`
}
func init() {
database.AppendMigrate(&LogData{})
}

View File

@@ -0,0 +1,29 @@
package routers
import (
"fmt"
"git.apinb.com/bsm-apps/logs/internal/logic/hello"
"git.apinb.com/bsm-apps/logs/internal/logic/log"
"github.com/gin-gonic/gin"
)
func Register(srvKey string, engine *gin.Engine) {
v1_key := fmt.Sprintf("/%s/%s", srvKey, "v1")
registerAnonymous(v1_key, engine)
}
// registerAnonymous 不需要auth的接口
func registerAnonymous(v1_key string, engine *gin.Engine) {
// Anonymous router.
fmt.Println(v1_key)
anonymous := engine.Group(v1_key)
{
// anonymous.Use(middleware.JwtAuth(impl.RedisCache))
anonymous.GET("/ping", hello.Ping)
anonymous.POST("/create", log.Create)
anonymous.POST("/fetch", log.LogFetch)
anonymous.POST("/total", log.Total)
}
}