147 lines
3.5 KiB
Go
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
|
|
}
|
|
}
|