This commit is contained in:
zxr
2026-06-21 17:50:24 +08:00
parent 360317fba8
commit 17063cbad0
291 changed files with 35717 additions and 1 deletions

View File

@@ -0,0 +1,33 @@
package config
import (
"net"
"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"`
}
func New(srvKey string) {
// 初始化配置 创建一个新的配置实例,用于服务配置
conf.New(srvKey, &Spec)
// 配置校验 服务IP,端口; 端口如果不合规,则随机分配端口
Spec.Port = conf.CheckPort(Spec.Port)
Spec.BindIP = conf.CheckIP(Spec.BindIP)
Spec.Addr = net.JoinHostPort(Spec.BindIP, Spec.Port)
// 配置校验 服务名称地址及监听地址不能为空
conf.NotNil(Spec.Service, Spec.Cache)
conf.PrintInfo(Spec.Addr)
}

View File

@@ -0,0 +1,29 @@
package impl
import (
"git.apinb.com/bsm-sdk/core/cache/redis"
"git.apinb.com/bsm-sdk/core/logger"
"git.apinb.com/bsm-sdk/core/with"
"git.apinb.com/ops/sample/internal/config"
"github.com/patrickmn/go-cache"
"gorm.io/gorm"
)
var (
RedisService *redis.RedisClient // Redis 客户端服务
DBService *gorm.DB // 数据库服务
MemoryService *cache.Cache // 内存缓存服务
Logger *logger.Logger
)
// NewImpl 初始化各类服务实例
func NewImpl() {
// 初始化内存缓存
MemoryService = with.Memory(nil)
// 初始化 Redis 缓存
RedisService = with.RedisCache(config.Spec.Cache)
// 初始化数据库服务
DBService = with.Databases(config.Spec.Databases, nil)
// 初始化 日志服务
logger.New(nil)
}

View File

@@ -0,0 +1,125 @@
package demo
import (
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/infra"
"git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/ops/sample/internal/models"
"github.com/gin-gonic/gin"
)
type CreateRequest struct {
Name string `json:"name" binding:"required,max=255"`
Age int `json:"age"`
}
type UpdateRequest struct {
Name string `json:"name" binding:"required,max=255"`
Age int `json:"age"`
}
type ListReply struct {
Total int64 `json:"total"`
List []models.SampleDemo `json:"list"`
}
func Create(ctx *gin.Context) {
var req CreateRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
data := models.SampleDemo{
Name: req.Name,
Age: req.Age,
}
data.Identity = utils.UUID()
data.Status = 1
if err := models.CreateSampleDemo(&data); err != nil {
infra.Response.Error(ctx, err)
return
}
infra.Response.Success(ctx, data)
}
func List(ctx *gin.Context) {
page := utils.String2Int(ctx.DefaultQuery("page", "1"))
size := utils.String2Int(ctx.DefaultQuery("size", "20"))
if page < 1 {
page = 1
}
if size < 1 || size > 100 {
size = 20
}
list, total, err := models.ListSampleDemos(page, size)
if err != nil {
infra.Response.Error(ctx, err)
return
}
infra.Response.Success(ctx, ListReply{Total: total, List: list})
}
func Get(ctx *gin.Context) {
identity := ctx.Param("identity")
if identity == "" {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
data, err := models.GetSampleDemoByField("identity", identity)
if err != nil {
infra.Response.Error(ctx, err)
return
}
infra.Response.Success(ctx, data)
}
func Update(ctx *gin.Context) {
identity := ctx.Param("identity")
if identity == "" {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
var req UpdateRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
data, err := models.GetSampleDemoByField("identity", identity)
if err != nil {
infra.Response.Error(ctx, err)
return
}
data.Name = req.Name
data.Age = req.Age
if err := models.UpdateSampleDemo(data); err != nil {
infra.Response.Error(ctx, err)
return
}
infra.Response.Success(ctx, data)
}
func Delete(ctx *gin.Context) {
identity := ctx.Param("identity")
if identity == "" {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
data, err := models.GetSampleDemoByField("identity", identity)
if err != nil {
infra.Response.Error(ctx, err)
return
}
if err := models.DeleteSampleDemo(data); err != nil {
infra.Response.Error(ctx, err)
return
}
infra.Response.Success(ctx, identity)
}

View File

@@ -0,0 +1,10 @@
package ping
import (
"git.apinb.com/bsm-sdk/core/infra"
"github.com/gin-gonic/gin"
)
func Hello(ctx *gin.Context) {
infra.Response.Success(ctx, "OK")
}

View File

@@ -0,0 +1,6 @@
/**
* @Author: David Yan(david.yan@qq.com)
* @Description: 自定义查询方法
*/
package models

View File

@@ -0,0 +1,86 @@
package models
import (
"errors"
"git.apinb.com/bsm-sdk/core/database"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/types"
"git.apinb.com/ops/sample/internal/impl"
"gorm.io/gorm"
)
/*
* SampleDemo
* Comment: 示例数据表
* Version: 10
* Created: 2022-04-12 10:44:51 , Updated:0001-01-01 00:00:00
*/
type SampleDemo struct {
types.Std_IICUDS
Name string `gorm:"column:name;type:varchar(255);default:'';" json:"name"` // 名称
Age int `gorm:"column:age;type:int;default:0;" json:"age"` // 年龄
}
func init() {
database.AppendMigrate(&SampleDemo{})
}
// TableName .
func (table *SampleDemo) TableName() string {
return "sample_demo" //对应数据库表名
}
// GetSampleDemoByField 根据特定字段值获取 SampleDemo 对象
func GetSampleDemoByField(field string, value any) (*SampleDemo, error) {
var (
data SampleDemo
condition = map[string]any{field: value}
)
err := impl.DBService.Where(condition).First(&data).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errcode.ErrRecordNotFound
}
return nil, errcode.ErrDB
}
return &data, nil
}
func CreateSampleDemo(data *SampleDemo) error {
if err := impl.DBService.Create(data).Error; err != nil {
return errcode.ErrDB
}
return nil
}
func ListSampleDemos(page, size int) ([]SampleDemo, int64, error) {
var (
list []SampleDemo
total int64
)
db := impl.DBService.Model(&SampleDemo{})
if err := db.Count(&total).Error; err != nil {
return nil, 0, errcode.ErrDB
}
offset := (page - 1) * size
if err := db.Order("id desc").Offset(offset).Limit(size).Find(&list).Error; err != nil {
return nil, 0, errcode.ErrDB
}
return list, total, nil
}
func UpdateSampleDemo(data *SampleDemo) error {
if err := impl.DBService.Save(data).Error; err != nil {
return errcode.ErrDB
}
return nil
}
func DeleteSampleDemo(data *SampleDemo) error {
if err := impl.DBService.Delete(data).Error; err != nil {
return errcode.ErrDB
}
return nil
}

View File

@@ -0,0 +1,36 @@
package routers
import (
"fmt"
"git.apinb.com/bsm-sdk/core/middleware"
"git.apinb.com/ops/sample/internal/logic/demo"
"git.apinb.com/ops/sample/internal/logic/ping"
"github.com/gin-gonic/gin"
)
// Register 注册路由,请求地址格式: ip:port/{srvKey}/v1/{group}/{action}
func Register(srvKey string, engine *gin.Engine) {
v1Key := fmt.Sprintf("/%s/%s", srvKey, "v1")
registerAnonymous(v1Key, engine)
registerRouters(v1Key, engine)
}
func registerAnonymous(v1Key string, engine *gin.Engine) {
anonymous := engine.Group(v1Key)
{
anonymous.GET("/ping/hello", ping.Hello)
}
}
func registerRouters(v1Key string, engine *gin.Engine) {
demoGroup := engine.Group(fmt.Sprintf("/%s/%s", v1Key, "demo"))
demoGroup.Use(middleware.JwtAuth(true))
{
demoGroup.POST("", demo.Create)
demoGroup.GET("", demo.List)
demoGroup.GET("/:identity", demo.Get)
demoGroup.PUT("/:identity", demo.Update)
demoGroup.DELETE("/:identity", demo.Delete)
}
}