fusenapi/utils/handlers/gormHandler.go
2023-08-03 17:37:25 +08:00

147 lines
3.5 KiB
Go

package handlers
import (
"encoding/json"
"fmt"
"fusenapi/constants"
"strconv"
"strings"
"unicode"
"gorm.io/gorm"
)
// FilterData 条件过滤
func FilterData(filterMap map[string]string) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
// 组合索引
db = db.Where("id <> ?", 0)
for fieldName, item := range filterMap {
options := strings.Split(item, "|")
conditionKey := options[1]
var conditionValueType string
if len(options) == 3 {
conditionValueType = options[2]
}
var conditionValue interface{}
if conditionKey == "=" || conditionKey == "<>" || conditionKey == ">=" || conditionKey == "<=" {
conditionStr := options[0]
if conditionValueType == "string" {
conditionValue = options[0]
} else {
if ss := CheckIsDigit(conditionStr); ss != 0 {
conditionValue = ss
} else {
conditionValue = options[0]
}
}
} else {
var conditionArrNew []int64
conditionArr := strings.Split(options[0], ",")
for _, s := range conditionArr {
if ss := CheckIsDigit(s); ss != 0 {
conditionArrNew = append(conditionArrNew, ss)
}
}
if len(conditionArrNew) > 0 {
conditionValue = conditionArrNew
} else {
conditionValue = conditionArr
}
}
switch conditionKey {
case "LIKE":
db = db.Where(fmt.Sprintf("%v LIKE ?", fieldName), fmt.Sprintf("%%%v%%", conditionValue))
case "BETWEEN":
db = db.Where(fmt.Sprintf("%v BETWEEN ? AND ?", fieldName), conditionValue.([]interface{})[0], conditionValue.([]interface{})[1])
default:
db = db.Where(fmt.Sprintf("%v %v ?", fieldName, conditionKey), conditionValue)
}
}
return db
}
}
// OrderCheck 公共排序--检测
func OrderCheck(orderData string, fields map[string]struct{}) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
var orderType = "desc"
if orderData != "" {
var sortData []map[string]interface{}
_ = json.Unmarshal([]byte(orderData), &sortData)
sortCount := len(sortData)
for i := 0; i < sortCount; i++ {
data := sortData[i]
prop, existProp := data["prop"]
sort, existSort := data["order"]
if existProp && existSort {
propData := strings.TrimSpace(prop.(string))
sortData := strings.TrimSpace(sort.(string))
if propData != "" && sortData != "" {
// 判断数据库字段
_, existFields := fields[propData]
if existFields {
if sortData == "descending" || sortData == "desc" {
orderType = "desc"
} else {
orderType = "asc"
}
db.Order(fmt.Sprintf("%v %v", prop, orderType))
}
}
}
}
return db
} else {
return db.Order("id asc")
}
}
}
// Paginate 公共分页
func Paginate(page *int64, pageSize *int64) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
page, _ := strconv.Atoi(strconv.FormatInt(*page, 10))
switch {
case page == 0:
page = constants.DEFAULT_PAGE
case page > constants.MAX_PAGE:
page = constants.MAX_PAGE
}
pageSize, _ := strconv.Atoi(strconv.FormatInt(*pageSize, 10))
switch {
case pageSize > constants.MAX_PAGE_SIZE:
pageSize = constants.MAX_PAGE_SIZE
case pageSize <= 0:
pageSize = constants.DEFAULT_PAGE_SIZE
}
offset := (page - 1) * pageSize
return db.Offset(offset).Limit(pageSize)
}
}
// CheckIsDigit 判断int
func CheckIsDigit(s string) int64 {
isDigit := true
for _, r := range s {
if !unicode.IsDigit(r) {
isDigit = false
break
}
}
if isDigit {
ss, _ := strconv.ParseInt(s, 10, 64)
return ss
} else {
return 0
}
}