package models import ( "fmt" "ginCms/utils" "gorm.io/gorm" "strings" ) // Role 角色模型 type Role struct { Model Title string `gorm:"type:varchar(255);uniqueIndex" json:"title"` Key string `gorm:"type:varchar(255);uniqueIndex" json:"key"` Enabled bool `gorm:"" json:"enabled"` Weight int `gorm:"index;" json:"weight"` Comment string `gorm:"type:text" json:"comment"` } // RoleRestore 还原 func RoleRestore(idList []uint) (int64, error) { // 还原的记录数 rowsNum := int64(0) err := utils.DB().Transaction(func(tx *gorm.DB) error { result := tx.Model(&Role{}).Unscoped().Where("`id` IN ?", idList).Update("deleted_at", nil) if result.Error != nil { return result.Error } else { // 更新成功 rowsNum = result.RowsAffected } return nil }) return rowsNum, err } // RoleDelete 角色删除 // @param force bool 是否强制删除 // @return 删除的记录数,error func RoleDelete(idList []uint, force bool) (int64, error) { // 将delete操作在事务里完成,删除时,有时会涉及到关联数据的处理 rowsNum := int64(0) err := utils.DB().Transaction(func(tx *gorm.DB) error { query := tx.Model(&Role{}) // 强制 if force { query.Unscoped() } result := query.Delete(&Role{}, idList) if result.Error != nil { return result.Error } else { // 删除成功 rowsNum = result.RowsAffected } return nil }) return rowsNum, err } //func RoleDelete(idList []uint) error { // // 将delete操作在事务里完成,删除时,有时会涉及到关联数据的处理 // return utils.DB().Transaction(func(tx *gorm.DB) error { // if err := tx.Delete(&Role{}, idList).Error; err != nil { // return err // } // return nil // }) //} // 角色插入 func RoleInsert(row *Role) error { // 将insert操作在事务里完成,插入时,有时会涉及到关联数据的处理。 // 数据及关联数据的插入,放在一个事务中 return utils.DB().Transaction(func(tx *gorm.DB) error { // 完成插入 if err := tx.Create(&row).Error; err != nil { return err } return nil }) } // 通用的查询列表过滤类型 type RoleFilter struct { // 指针类型表示该字段可以不填 // omitempty, 非零值才校验 // gt, 字符串长度>0 Keyword *string `form:"keyword" binding:"omitempty,gt=0"` } // Clean 整理Filter func (f *RoleFilter) Clean() { if f.Keyword == nil { temp := "" f.Keyword = &temp } } // RoleFetchList 查询列表 // @param filter RoleFilter 过滤参数 // @param sorter Sorter 排序参数 // @param pager Pager 翻页参数 // @param scope uint8 范围参数 // @param assoc bool 是否查询关联 // @return []*Role Role列表 // @return error func RoleFetchList(filter RoleFilter, sorter Sorter, pager Pager, scope uint8, assoc bool) ([]*Role, error) { // 初始化query query := utils.DB().Model(&Role{}) // 1. 过滤 // 查询范围 switch scope { case SCOPE_ALL: query.Unscoped() case SCOPE_DELETED: query.Unscoped().Where("`deleted_at` IS NOT NULL") case SCOPE_UNDELETED: fallthrough default: // do nothing. default case } // 条件过滤 if *filter.Keyword != "" { query.Where("`title` LIKE ?", "%"+*filter.Keyword+"%") } // 其他字段过滤 // 2. 排序 query.Order(fmt.Sprintf("`%s` %s", *sorter.SortField, strings.ToUpper(*sorter.SortMethod))) // 3. 翻页 offset limit // 在pagesize>0时,才进行翻页 if *pager.PageSize > 0 { // 偏移 ==(当前页码 - 1) 乘以 每页记录数 offset := (*pager.PageNum - 1) * *pager.PageSize query.Offset(offset).Limit(*pager.PageSize) } // 4. 查询 var rows []*Role if err := query.Find(&rows).Error; err != nil { return nil, err } // 5. 关联查询 if assoc { } // 返回 return rows, nil } func RoleFetch(id uint, assoc bool) (*Role, error) { return RoleFetchRow(assoc, "`id` = ?", id) } // RoleFetchRow 根据条件查询单条 // assoc 是否查询管理数据 // where, args 查询条件 func RoleFetchRow(assoc bool, where any, args ...any) (*Role, error) { // 查询本条 row := &Role{} if err := utils.DB().Where(where, args...).First(&row).Error; err != nil { return nil, err } // 关联查询 if assoc { } return row, nil } // 填充数据 func roleSeed() { // 构建数据 rows := []Role{ { Title: "管理员", Key: "administrator", Enabled: true, Model: Model{ID: 1}, }, { Title: "常规用户", Key: "regular", Enabled: true, Model: Model{ID: 2}, }, } // 插入 for _, row := range rows { if err := utils.DB().FirstOrCreate(&row, row.ID).Error; err != nil { utils.Logger().With(err.Error()) } } }