Tag |
Value Type |
SQL Statment |
DESC |
field:eq |
any |
feild = value |
|
field:neq |
any |
feild <> value |
|
field:gt |
any |
feild > value |
|
field:gte |
any |
feild >= value |
|
field:lt |
any |
feild < value |
|
field:lte |
any |
feild <= value |
|
field:like |
string |
feild LIKE "%value%" |
|
field:llike |
string |
feild LIKE "%value" |
|
field:rlike |
string |
feild LIKE "value%" |
|
field:in |
[]any |
feild IN (value) |
|
field:notin |
[]any |
feild IN (value) |
|
field:isnull |
any |
feild IS NULL |
|
field:notnull |
[]any |
feild IS NOT NULL |
|
field:between |
[]any (len==2) |
feild BETWEEN value[0] AND value[1] |
|
-:sort |
string |
ORDER BY a DESC, b, c DESC |
value is a-,b+,c- |
-:page |
int |
OFFSET (value-1)*per_page |
Default per_page is 50 |
-:per_page |
int |
LIMIT value |
Default 50 |
-:limit |
int |
LIMIT value |
|
-:offset |
int |
OFFSET value |
|
package main
import (
"context"
"database/sql"
"log"
"net/http"
"strconv"
"strings"
"time"
"github.com/brianvoe/gofakeit/v6"
"github.com/feymanlee/storeit"
"github.com/gin-gonic/gin"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
type User struct {
ID int64 `gorm:"column:id;primarykey" json:"id"`
Username string `gorm:"column:username" json:"username"`
Email string `gorm:"column:email" json:"email"`
Mobile string `gorm:"column:mobile" json:"mobile"`
Status string `gorm:"column:status" json:"status"`
Weight int `gorm:"column:weight" json:"weight"`
Source string `gorm:"column:source" json:"source"`
CreatedAt time.Time `gorm:"column:created_at" json:"created_at"`
UpdatedAt time.Time `gorm:"column:updated_at" json:"updated_at"`
DeletedAt sql.NullTime `gorm:"column:email;index"`
}
var db *gorm.DB
func init() {
var err error
db, err = gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
panic(err)
}
}
func main() {
router := gin.Default()
v1 := router.Group("/api/v1")
{
v1.GET("/users", SearchUser)
v1.POST("/users", CreateUser)
v1.GET("/user/:id", FindUser)
v1.PUT("/users/:id", UpdateUser)
v1.DELETE("/users/:id", DeleteUser)
}
router.Run(":8180")
}
func SearchUser(c *gin.Context) {
var req struct {
ID int `form:"id" criteria:"id,eq"`
Keyword string `form:"keyword" criteria:"phone,email:like"`
Name string `form:"name" criteria:"name:llike"`
Phone int `form:"phone" criteria:"phone:eq"`
Status string `form:"status" criteria:"status:eq"`
Weight int `form:"weight" criteria:"weight:eq"`
Source string `form:"source"`
Page int `form:"page" criteria:"-:page"`
PerPage int `form:"per_page" criteria:"-:per_page"`
Sorts string `form:"sorts" criteria:"-:sort"`
}
if err := c.ShouldBindQuery(&req); err != nil {
log.Println(err)
}
criteria, _ := storeit.ExtractCriteria(req)
// source 是多个值,使用英文逗号分隔
criteria.WhereIn("source", strings.Split(req.Source, ","))
// 实现自动分页
ret, _ := storeit.New[User](db).Paginate(c, criteria)
c.JSON(http.StatusOK, ret)
}
func FindUser(c *gin.Context) {
user, _ := storeit.New[User](db).FindByID(c, c.Params.ByName("id"))
c.JSON(200, user)
}
func CreateUser(c *gin.Context) {
var user User
_ = c.ShouldBindJSON(&user)
storeit.New[User](db).Insert(c, &user)
c.JSON(200, user)
}
func UpdateUser(c *gin.Context) {
var user User
_ = c.ShouldBindJSON(&user)
id, _ := strconv.Atoi(c.Params.ByName("id"))
user.ID = int64(id)
storeit.New[User](db).Save(c, &user)
c.JSON(200, user)
}
func DeleteUser(c *gin.Context) {
tx := storeit.New[User](db).DeleteById(c, c.Params.ByName("id"))
if tx.Error != nil {
c.AbortWithStatus(http.StatusBadRequest)
}
c.JSON(200, gin.H{
"id": c.Params.ByName("id"),
})
}