From c018a63cd39de84aae844b2215e997399cdb650d Mon Sep 17 00:00:00 2001 From: Havoc412 <2993167370@qq.com> Date: Fri, 8 Nov 2024 18:57:08 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=8Ffinish=20name=20selece?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/http/controller/web/animal_controller.go | 22 +++++++------- .../web_register_validator.go | 2 ++ app/http/validator/web/animal/name.go | 30 +++++++++++++++++++ app/model/animal.go | 20 +++++++++++++ app/model/animal_result.go | 5 ++++ app/service/animals/curd/animals_curd.go | 17 +++++++++++ app/utils/gorm_v2/utils.go | 18 ++++++++++- routers/web.go | 3 ++ 8 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 app/http/validator/web/animal/name.go diff --git a/app/http/controller/web/animal_controller.go b/app/http/controller/web/animal_controller.go index 9b39afd..336fce9 100644 --- a/app/http/controller/web/animal_controller.go +++ b/app/http/controller/web/animal_controller.go @@ -21,16 +21,6 @@ import ( type Animals struct { // INFO 起到一个标记的作用,这样 web.xxx 的时候不同模块就不会命名冲突了。 } -// contains 检查 id 是否在 ids 切片中 -func contains(ids []int, id int) bool { - for _, v := range ids { - if v == id { - return true - } - } - return false -} - func (a *Animals) List(context *gin.Context) { // 1. Get Params attrs := context.GetString(consts.ValidatorPrefix + "attrs") @@ -238,3 +228,15 @@ func (a *Animals) Create(context *gin.Context) { response.Fail(context, consts.CurdCreatFailCode, consts.CurdCreatFailMsg+",新增错误", "") } } + +func (a *Animals) Name(context *gin.Context) { + attrs := context.GetString(consts.ValidatorPrefix + "attrs") + name := context.GetString(consts.ValidatorPrefix + "name") + + animals := curd.CreateAnimalsCurdFactory().ShowByName(attrs, name) + if animals != nil { + response.Success(context, consts.CurdStatusOkMsg, animals) + } else { + response.Fail(context, errcode.AnimalNoFind, errcode.ErrMsg[errcode.AnimalNoFind], "") + } +} diff --git a/app/http/validator/common/register_validator/web_register_validator.go b/app/http/validator/common/register_validator/web_register_validator.go index 698252c..7d1dcbb 100644 --- a/app/http/validator/common/register_validator/web_register_validator.go +++ b/app/http/validator/common/register_validator/web_register_validator.go @@ -57,6 +57,8 @@ func WebRegisterValidator() { containers.Set(key, animal.Detail{}) key = consts.ValidatorPrefix + "AnimalCreate" containers.Set(key, animal.Create{}) + key = consts.ValidatorPrefix + "AnimalName" + containers.Set(key, animal.Name{}) key = consts.ValidatorPrefix + "AnimalLikeCreate" containers.Set(key, animal_like.Create{}) diff --git a/app/http/validator/web/animal/name.go b/app/http/validator/web/animal/name.go new file mode 100644 index 0000000..c30407b --- /dev/null +++ b/app/http/validator/web/animal/name.go @@ -0,0 +1,30 @@ +package animal + +import ( + "catface/app/global/consts" + "catface/app/http/controller/web" + "catface/app/http/validator/core/data_transfer" + "catface/app/utils/response" + + "github.com/gin-gonic/gin" +) + +type Name struct { + Attrs string `form:"attrs" json:"attrs"` + Name string `form:"name" json:"name"` +} + +func (n Name) CheckParams(context *gin.Context) { + if err := context.ShouldBind(&n); err != nil { + response.ValidatorError(context, err) + return + } + + extraAddBindDataContext := data_transfer.DataAddContext(n, consts.ValidatorPrefix, context) + if extraAddBindDataContext == nil { + response.ErrorSystem(context, "animialList表单验证器json化失败", "") + } else { + // 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性 + (&web.Animals{}).Name(extraAddBindDataContext) + } +} diff --git a/app/model/animal.go b/app/model/animal.go index 80a1c39..80ef304 100644 --- a/app/model/animal.go +++ b/app/model/animal.go @@ -99,6 +99,26 @@ func (a *Animal) ShowByIDs(ids []int64, attrs ...string) (temp []Animal) { return } +/** + * @description: 采取前后通配符的方式,同时查询 name & nick_names 字段 + * @param {string} name + * @param {...string} attrs + * @return {*} + */ +func (a *Animal) ShowByName(name string, attrs ...string) (temp []Animal) { + db := a.DB.Table(a.TableName()) + + if len(attrs) > 0 { + db = db.Select(attrs) + } + + err := db.Where("name LIKE ? OR nick_names LIKE ?", "%"+name+"%", "%"+name+"%").Find(&temp).Error + if err != nil { + variable.ZapLog.Error("Animal ShowByName Error", zap.Error(err)) + } + return +} + func (a *Animal) InsertDate(c *gin.Context) (int64, bool) { var tmp Animal if err := data_bind.ShouldBindFormDataToModel(c, &tmp); err == nil { diff --git a/app/model/animal_result.go b/app/model/animal_result.go index 8c93b0d..f874ce4 100644 --- a/app/model/animal_result.go +++ b/app/model/animal_result.go @@ -4,3 +4,8 @@ type AnimalWithLikeList struct { Animal Animal `json:"animal"` Like bool `json:"like,omitempty"` } + +type AnimalWithNickNameHit struct { + Animal Animal `json:"animal"` + NickNameHit bool `json:"nick_name_hit,omitempty"` +} diff --git a/app/service/animals/curd/animals_curd.go b/app/service/animals/curd/animals_curd.go index 3ed210b..630dd51 100644 --- a/app/service/animals/curd/animals_curd.go +++ b/app/service/animals/curd/animals_curd.go @@ -2,6 +2,7 @@ package curd import ( "catface/app/model" + "catface/app/utils/gorm_v2" "catface/app/utils/model_handler" "catface/app/utils/query_handler" "fmt" @@ -95,6 +96,22 @@ func (a *AnimalsCurd) List(attrs string, gender string, breed string, sterilizat return } +func (a *AnimalsCurd) ShowByName(attrs string, name string) (temp []model.AnimalWithNickNameHit) { + validSelectedFields := getSelectAttrs(attrs) + + animals := model.CreateAnimalFactory("").ShowByName(name, validSelectedFields...) + + for _, animal := range animals { + animalWithNameHit := model.AnimalWithNickNameHit{ + Animal: animal, + NickNameHit: !gorm_v2.IsLikePatternMatch(animal.Name, name), // 通过对比 name,然后取反。 + } + temp = append(temp, animalWithNameHit) + } + + return +} + func (a *AnimalsCurd) Detail(id string) *model.Animal { idInt, err := strconv.Atoi(id) if err != nil { diff --git a/app/utils/gorm_v2/utils.go b/app/utils/gorm_v2/utils.go index 8e28886..c73c4ef 100644 --- a/app/utils/gorm_v2/utils.go +++ b/app/utils/gorm_v2/utils.go @@ -1,6 +1,10 @@ package gorm_v2 -import "gorm.io/gorm" +import ( + "regexp" + + "gorm.io/gorm" +) /** * @description: 通过检查字段的方式构建 Where 函数。 @@ -20,3 +24,15 @@ func BuildWhere(db *gorm.DB, conditions map[string][]uint8) *gorm.DB { } return db } + +// isLikePatternMatch 检查字符串是否匹配 LIKE '%name%' 模式 +func IsLikePatternMatch(input, pattern string) bool { + // 构建正则表达式 + regexPattern := ".*" + regexp.QuoteMeta(pattern) + ".*" + + // 编译正则表达式 + re := regexp.MustCompile(regexPattern) + + // 检查输入字符串是否匹配正则表达式 + return re.MatchString(input) +} diff --git a/routers/web.go b/routers/web.go index 67938a5..01ae01b 100644 --- a/routers/web.go +++ b/routers/web.go @@ -3,10 +3,12 @@ package routers import ( "catface/app/global/consts" "catface/app/global/variable" + // "catface/app/http/controller/captcha" // 验证码组件 // "catface/app/http/middleware/authorization" "catface/app/http/middleware/cors" validatorFactory "catface/app/http/validator/core/factory" + // TODO validatorFactory "catface/app/http/validator/core/factory" "catface/app/utils/gin_release" "net/http" @@ -122,6 +124,7 @@ func InitWebRouter() *gin.Engine { animal.GET("", validatorFactory.Create(consts.ValidatorPrefix+"AnimalList")) animal.GET(":anm_id", validatorFactory.Create(consts.ValidatorPrefix+"AnimalDetail")) animal.POST("", validatorFactory.Create(consts.ValidatorPrefix+"AnimalCreate")) + animal.GET("name", validatorFactory.Create(consts.ValidatorPrefix+"AnimalName")) animal.POST("like", validatorFactory.Create(consts.ValidatorPrefix+"AnimalLikeCreate")) animal.DELETE("like", validatorFactory.Create(consts.ValidatorPrefix+"AnimalLikeDelete"))