Files
go-admin/template/v4/no_actions/service.go.template
T
zhangwenjian 3112896a83 fix🐛: stop a generated Update when its row is not found
Update looked its row up and ignored the result. When nothing matched -
because the key does not exist, or because the caller's data scope filters
the row out - the model stayed at its zero value, Generate copied the
request onto it, and Save, finding a zero key, inserted a new row. The
update of a row the caller may not see became a row they now own, and the
RowsAffected check meant to refuse it never fired, because the insert did
affect one.

A missing row now ends the update with the same "无权更新该数据" the
RowsAffected check returns, and any other lookup error is returned as is.
This applies to every generated table, an int id included.
2026-09-25 20:00:30 +08:00

128 lines
3.6 KiB
Plaintext

package service
import (
"errors"
"github.com/go-admin-team/go-admin-core/v2/sdk/service"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"go-admin/app/{{.PackageName}}/models"
"go-admin/app/{{.PackageName}}/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
)
type {{.ClassName}} struct {
service.Service
}
// GetPage 获取{{.ClassName}}列表
func (e *{{.ClassName}}) GetPage(c *dto.{{.ClassName}}GetPageReq, p *actions.DataPermission, list *[]models.{{.ClassName}}, count *int64) error {
var err error
var data models.{{.ClassName}}
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
actions.Permission(data.TableName(), p),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("{{.ClassName}}Service GetPage error:%s \r\n", err)
return err
}
return nil
}
// Get 获取{{.ClassName}}对象
//
// The key is matched as a value of the model's primary-key column. Handed to
// First on its own, a string key would be read as a SQL condition.
func (e *{{.ClassName}}) Get(d *dto.{{.ClassName}}GetReq, p *actions.DataPermission, model *models.{{.ClassName}}) error {
var data models.{{.ClassName}}
err := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).
Where(clause.Eq{Column: clause.PrimaryColumn, Value: d.GetId()}).
First(model).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service Get{{.ClassName}} error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建{{.ClassName}}对象
func (e *{{.ClassName}}) Insert(c *dto.{{.ClassName}}InsertReq) error {
var err error
var data models.{{.ClassName}}
c.Generate(&data)
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("{{.ClassName}}Service Insert error:%s \r\n", err)
return err
}
return nil
}
// Update 修改{{.ClassName}}对象
//
// The row has to be found first. Save on a model whose key is still zero
// inserts, so a row that is missing - or that p filters out - must stop here
// rather than turn the update into a new row.
func (e *{{.ClassName}}) Update(c *dto.{{.ClassName}}UpdateReq, p *actions.DataPermission) error {
var err error
var data = models.{{.ClassName}}{}
err = e.Orm.Scopes(
actions.Permission(data.TableName(), p),
).
Where(clause.Eq{Column: clause.PrimaryColumn, Value: c.GetId()}).
First(&data).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return errors.New("无权更新该数据")
}
if err != nil {
e.Log.Errorf("{{.ClassName}}Service Update error:%s \r\n", err)
return err
}
c.Generate(&data)
db := e.Orm.Save(&data)
if err = db.Error; err != nil {
e.Log.Errorf("{{.ClassName}}Service Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除{{.ClassName}}
func (e *{{.ClassName}}) Remove(d *dto.{{.ClassName}}DeleteReq, p *actions.DataPermission) error {
var data models.{{.ClassName}}
db := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, d.GetId())
if err := db.Error; err != nil {
e.Log.Errorf("Service Remove{{.ClassName}} error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}