设计
This commit is contained in:
33
server/internal/config/config.go
Normal file
33
server/internal/config/config.go
Normal 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)
|
||||
}
|
||||
29
server/internal/impl/new.go
Normal file
29
server/internal/impl/new.go
Normal 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)
|
||||
}
|
||||
125
server/internal/logic/demo/demo.go
Normal file
125
server/internal/logic/demo/demo.go
Normal 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)
|
||||
}
|
||||
10
server/internal/logic/ping/hello.go
Normal file
10
server/internal/logic/ping/hello.go
Normal 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")
|
||||
}
|
||||
6
server/internal/models/query.go
Normal file
6
server/internal/models/query.go
Normal file
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* @Author: David Yan(david.yan@qq.com)
|
||||
* @Description: 自定义查询方法
|
||||
*/
|
||||
|
||||
package models
|
||||
86
server/internal/models/sample_demo.go
Normal file
86
server/internal/models/sample_demo.go
Normal 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
|
||||
}
|
||||
36
server/internal/routers/register.go
Normal file
36
server/internal/routers/register.go
Normal 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user