You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
5.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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"`
}
// RoleUpdateEnabled 更新多个字段的Enabled值
func RoleUpdateEnabled(idList []uint, enabled bool) (int64, error) {
rowsNum := int64(0)
err := utils.DB().Transaction(func(tx *gorm.DB) error {
result := tx.Model(&Role{}).Where("`id` IN ?", idList).Update("enabled", enabled)
if result.Error != nil {
return result.Error
} else {
// 更新成功
rowsNum = result.RowsAffected
}
return nil
})
return rowsNum, err
}
// RoleUpdates 更新某个模型的部分字段
func RoleUpdates(fieldMap FieldMap, id uint) error {
return utils.DB().Transaction(func(tx *gorm.DB) error {
// 完成更新
if err := tx.Model(&Role{}).Where("`id` = ?", id).Updates(fieldMap).Error; err != nil {
return err
}
return nil
})
}
// 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())
}
}
}