125 lines
3.6 KiB
Go
125 lines
3.6 KiB
Go
|
package web
|
||
|
|
||
|
import (
|
||
|
"catface/app/global/consts"
|
||
|
"catface/app/global/errcode"
|
||
|
"catface/app/global/variable"
|
||
|
"catface/app/model"
|
||
|
"catface/app/utils/model_handler"
|
||
|
"catface/app/utils/query_handler"
|
||
|
"catface/app/utils/response"
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
|
||
|
"github.com/gin-gonic/gin"
|
||
|
"gorm.io/gorm"
|
||
|
)
|
||
|
|
||
|
type Animals struct { // INFO 起到一个标记的作用,这样 web.xxx 的时候不同模块就不会命名冲突了。
|
||
|
}
|
||
|
|
||
|
func buildSelectAttrs(db *gorm.DB, attrs string) *gorm.DB {
|
||
|
if len(attrs) > 0 {
|
||
|
// 1. 获取空 Field
|
||
|
fieldMap := model_handler.GetModelField(model.Animal{})
|
||
|
|
||
|
// 2. 开始检查请求字段
|
||
|
attrsArray := query_handler.StringToStringArray(attrs)
|
||
|
for _, attr := range attrsArray {
|
||
|
if attr == "*" { // 不需要过滤,直接返回
|
||
|
return db
|
||
|
} else if attr == "avatar" {
|
||
|
fieldMap["avatar_height"] = true
|
||
|
fieldMap["avatar_width"] = true
|
||
|
}
|
||
|
// 过滤 无效 的请求字段
|
||
|
if _, ok := fieldMap[attr]; ok {
|
||
|
fieldMap[attr] = true
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 3. 装填字段,并 Select
|
||
|
var validSelectedFields []string
|
||
|
for key, value := range fieldMap {
|
||
|
if value {
|
||
|
validSelectedFields = append(validSelectedFields, key)
|
||
|
}
|
||
|
}
|
||
|
db = db.Select(validSelectedFields)
|
||
|
}
|
||
|
return db
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @description: 通过检查字段的方式构建 Where 函数。
|
||
|
* @param {*gorm.DB} db
|
||
|
* @param {map[string][]uint8} conditions
|
||
|
* @return {*}
|
||
|
*/
|
||
|
func buildQuery(db *gorm.DB, conditions map[string][]uint8) *gorm.DB {
|
||
|
for field, values := range conditions {
|
||
|
if len(values) == 0 || len(values) == 1 && values[0] == 0 {
|
||
|
continue
|
||
|
}
|
||
|
db = db.Where(field+" in (?)", values)
|
||
|
}
|
||
|
return db
|
||
|
}
|
||
|
|
||
|
func (a *Animals) List(context *gin.Context) {
|
||
|
// 1. Get Params
|
||
|
attrs := context.GetString(consts.ValidatorPrefix + "attrs")
|
||
|
gender := query_handler.StringToUint8Array(context.GetString(consts.ValidatorPrefix + "gender"))
|
||
|
breed := query_handler.StringToUint8Array(context.GetString(consts.ValidatorPrefix + "breed"))
|
||
|
sterilzation := query_handler.StringToUint8Array(context.GetString(consts.ValidatorPrefix + "sterilzation"))
|
||
|
status := query_handler.StringToUint8Array(context.GetString(consts.ValidatorPrefix + "status"))
|
||
|
num := context.GetFloat64(consts.ValidatorPrefix + "num")
|
||
|
skip := context.GetFloat64(consts.ValidatorPrefix + "skip")
|
||
|
|
||
|
// 创建条件映射
|
||
|
conditions := map[string][]uint8{
|
||
|
"gender": gender,
|
||
|
"breed": breed,
|
||
|
"sterilization": sterilzation,
|
||
|
"status": status,
|
||
|
}
|
||
|
|
||
|
// 2. Select & Filter
|
||
|
if num == 0 {
|
||
|
num = 10
|
||
|
}
|
||
|
db := variable.GormDbMysql.Table("animals").Limit(int(num)).Offset(int(skip))
|
||
|
db = buildSelectAttrs(db, attrs)
|
||
|
db = buildQuery(db, conditions)
|
||
|
|
||
|
// 3. Find
|
||
|
var animals []model.Animal
|
||
|
err := db.Find(&animals).Error
|
||
|
if err != nil {
|
||
|
response.Fail(context, errcode.ErrAnimalSqlFind, errcode.ErrMsg[errcode.ErrAnimalSqlFind], err) // UPDATE consts ?
|
||
|
} else {
|
||
|
response.Success(context, consts.CurdStatusOkMsg, animals)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (a *Animals) Detail(context *gin.Context) {
|
||
|
// 1. Get Params
|
||
|
anmId, err := strconv.Atoi(context.Param("anm_id"))
|
||
|
if err != nil {
|
||
|
response.Fail(context, errcode.ErrAnimalSqlFind, errcode.ErrMsg[errcode.ErrAnimalSqlFind], err)
|
||
|
return
|
||
|
}
|
||
|
fmt.Println("anmId:", anmId)
|
||
|
|
||
|
// 2. Select & Filter
|
||
|
var animal model.Animal
|
||
|
err = variable.GormDbMysql.Table("animals").Model(&animal).Where("id = ?", anmId).Scan(&animal).Error // TIP GORM.First 采取默认的
|
||
|
if err != nil {
|
||
|
response.Fail(context, errcode.ErrAnimalSqlFind, errcode.ErrMsg[errcode.ErrAnimalSqlFind], err) // UPDATE consts ?
|
||
|
} else {
|
||
|
response.Success(context, consts.CurdStatusOkMsg, animal)
|
||
|
}
|
||
|
|
||
|
}
|