mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-09-21 18:20:50 +00:00
该方法先在开头追加了 Id,随后 else 分支中又追加一次:仅传 Id 时返回
[5 5],删除接口会对同一条记录执行两次 DELETE。
if g.Id != 0 { ids = append(ids, g.Id) }
if len(g.Ids) > 0 { ... } else {
if g.Id > 0 { ids = append(ids, g.Id) } // 重复
}
去掉冗余分支,同时将首个判断由 != 0 收紧为 > 0,与 Ids 中逐个元素的
过滤条件保持一致(负数 Id 无意义)。
补充单元测试,覆盖仅 Id、仅 Ids、二者并存、含非正数、全空回退等场景。
问题由 PR #848 指出。
81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package dto
|
|
|
|
import (
|
|
"github.com/go-admin-team/go-admin-core/tools/search"
|
|
"go-admin/common/global"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type GeneralDelDto struct {
|
|
Id int `uri:"id" json:"id" validate:"required"`
|
|
Ids []int `json:"ids"`
|
|
}
|
|
|
|
func (g GeneralDelDto) GetIds() []int {
|
|
ids := make([]int, 0)
|
|
// Id 此前在 else 分支里被重复追加:仅传 Id 时会得到 [5 5],
|
|
// 同一条记录被执行两次删除
|
|
if g.Id > 0 {
|
|
ids = append(ids, g.Id)
|
|
}
|
|
for _, id := range g.Ids {
|
|
if id > 0 {
|
|
ids = append(ids, id)
|
|
}
|
|
}
|
|
if len(ids) == 0 {
|
|
//方式全部删除
|
|
ids = append(ids, 0)
|
|
}
|
|
return ids
|
|
}
|
|
|
|
type GeneralGetDto struct {
|
|
Id int `uri:"id" json:"id" validate:"required"`
|
|
}
|
|
|
|
func MakeCondition(q interface{}) func(db *gorm.DB) *gorm.DB {
|
|
return func(db *gorm.DB) *gorm.DB {
|
|
condition := &search.GormCondition{
|
|
GormPublic: search.GormPublic{},
|
|
Join: make([]*search.GormJoin, 0),
|
|
}
|
|
search.ResolveSearchQuery(global.Driver, q, condition)
|
|
for _, join := range condition.Join {
|
|
if join == nil {
|
|
continue
|
|
}
|
|
db = db.Joins(join.JoinOn)
|
|
for k, v := range join.Where {
|
|
db = db.Where(k, v...)
|
|
}
|
|
for k, v := range join.Or {
|
|
db = db.Or(k, v...)
|
|
}
|
|
for _, o := range join.Order {
|
|
db = db.Order(o)
|
|
}
|
|
}
|
|
for k, v := range condition.Where {
|
|
db = db.Where(k, v...)
|
|
}
|
|
for k, v := range condition.Or {
|
|
db = db.Or(k, v...)
|
|
}
|
|
for _, o := range condition.Order {
|
|
db = db.Order(o)
|
|
}
|
|
return db
|
|
}
|
|
}
|
|
|
|
func Paginate(pageSize, pageIndex int) func(db *gorm.DB) *gorm.DB {
|
|
return func(db *gorm.DB) *gorm.DB {
|
|
offset := (pageIndex - 1) * pageSize
|
|
if offset < 0 {
|
|
offset = 0
|
|
}
|
|
return db.Offset(offset).Limit(pageSize)
|
|
}
|
|
}
|