base controller and base model

This commit is contained in:
w-mj 2023-04-02 22:51:34 +08:00
parent 66e9a60bf4
commit 5e02216d65
No known key found for this signature in database
GPG Key ID: 3A2CB5BE2F835897
6 changed files with 195 additions and 11 deletions

View File

@ -80,6 +80,8 @@ func main() {
r.DELETE("/image", controller.DeleteImage)
r.GET("/images", controller.GetImages)
//r.POST("/data", controller.Add[model.DataModel])
err := r.Run(":8000")
if err != nil {
log.Fatal(err)

View File

@ -0,0 +1,82 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"k8s-manager/src/model"
"k8s-manager/src/utils"
"net/http"
"reflect"
"strconv"
)
type BaseController[T model.DataModel, PT model.ModalInterface[T]] struct {
}
func (BaseController[T, PT]) Add(c *gin.Context) {
data := PT(new(T))
fmt.Println(reflect.TypeOf(data))
if utils.GinErrorCheck(c, c.BindJSON(&data)) {
return
}
username := c.MustGet("username").(string)
data.SetUserName(username)
data.Create()
utils.GinOk(c, "ok")
}
func (BaseController[T, PT]) Delete(c *gin.Context) {
id := c.Query("ID")
if id == "" {
utils.GinError(c, http.StatusBadRequest, "no id")
return
}
username := c.MustGet("username").(string)
idi, err := strconv.Atoi(id)
if utils.GinErrorCheck(c, err) {
return
}
data := PT(new(T))
data.SetID(uint(idi))
data.Fill()
if data.GetUserName() != username {
utils.GinError(c, http.StatusUnauthorized, "username error")
return
}
data.Delete()
}
func (BaseController[T, PT]) Update(c *gin.Context) {
data := PT(new(T))
if utils.GinErrorCheck(c, c.BindJSON(data)) {
return
}
username := c.MustGet("username").(string)
oldData := PT(new(T))
oldData.SetID(data.GetID())
oldData.Fill()
if oldData.GetUserName() != username {
utils.GinError(c, http.StatusUnauthorized, "username error")
return
}
data.Save()
}
func (BaseController[T, PT]) Gets(c *gin.Context) {
username := c.MustGet("username").(string)
var ans []T
query := map[string]interface{}{}
if c.Query("UserName") != "" {
if username != c.Query("UserName") {
utils.GinError(c, http.StatusUnauthorized, "username error")
return
}
query["UserName"] = username
} else if c.Query("IsPublic") != "" {
query["IsPublic"] = true
} else {
utils.GinError(c, http.StatusBadRequest, "param error.")
return
}
c.JSON(http.StatusOK, gin.H{"data": ans})
}

View File

@ -0,0 +1,7 @@
package controller
import "github.com/gin-gonic/gin"
func AddData(c *gin.Context) {
}

93
src/model/base_model.go Normal file
View File

@ -0,0 +1,93 @@
package model
import (
"gorm.io/gorm"
k8s_manager "k8s-manager/src"
"reflect"
"unsafe"
)
type ModalType interface {
DataModel | ImageModel
}
type ModalInterface[T ModalType] interface {
*T
Create()
Fill()
Delete()
Save()
Gets(map[string]interface{}) []T
//Gets() []T
GetUserName() string
SetUserName(string)
SetID(uint)
GetID() uint
}
type BaseModel[T any] struct {
gorm.Model
}
func (b *BaseModel[T]) Fill() {
db := k8s_manager.DB()
p := (*T)(unsafe.Pointer(b))
db.First(p, b.ID)
}
func (b *BaseModel[T]) Create() {
db := k8s_manager.DB()
p := (*T)(unsafe.Pointer(b))
db.Create(p)
}
func (b *BaseModel[T]) Save() {
db := k8s_manager.DB()
p := (*T)(unsafe.Pointer(b))
db.Save(p)
}
func (b *BaseModel[T]) Delete() {
db := k8s_manager.DB()
p := (*T)(unsafe.Pointer(b))
db.Delete(p)
}
func (b *BaseModel[T]) Gets(query map[string]interface{}) []T {
db := k8s_manager.DB()
ans := make([]T, 0)
db.Where(query).Find(&ans)
return ans
}
func (b *BaseModel[T]) Get(query map[string]interface{}) *T {
db := k8s_manager.DB()
p := (*T)(unsafe.Pointer(b))
db.Where(query).First(p)
return p
}
func (b *BaseModel[T]) SetUserName(name string) {
p := (*T)(unsafe.Pointer(b))
a := reflect.ValueOf(p)
reflect.Indirect(a).FieldByName("UserName").SetString(name)
}
func (b *BaseModel[T]) SetID(ID uint) {
p := (*T)(unsafe.Pointer(b))
a := reflect.ValueOf(p)
reflect.Indirect(a).FieldByName("ID").SetUint(uint64(ID))
}
func (b *BaseModel[T]) GetUserName() string {
p := (*T)(unsafe.Pointer(b))
a := reflect.ValueOf(p)
return reflect.Indirect(a).FieldByName("UserName").String()
}
func (b *BaseModel[T]) GetID() uint {
p := (*T)(unsafe.Pointer(b))
a := reflect.ValueOf(p)
return uint(reflect.Indirect(a).FieldByName("ID").Uint())
}

View File

@ -1,12 +1,7 @@
package model
import (
"gorm.io/gorm"
k8s_manager "k8s-manager/src"
)
type DataModel struct {
gorm.Model
BaseModel[DataModel]
Type string
Name string
Comment string
@ -20,8 +15,3 @@ type DataModel struct {
func (*DataModel) TableName() string {
return "data"
}
func (d *DataModel) Fill() {
db := k8s_manager.DB()
db.First(d, d.ID)
}

10
test/test_generic.go Normal file
View File

@ -0,0 +1,10 @@
package main
import (
"k8s-manager/src/controller"
"k8s-manager/src/model"
)
func main() {
controller.BaseController[model.DataModel, *model.DataModel]{}.Add(nil)
}