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.
127 lines
3.5 KiB
127 lines
3.5 KiB
package repository |
|
|
|
import ( |
|
"gofaster/internal/auth/model" |
|
|
|
"gorm.io/gorm" |
|
) |
|
|
|
// MenuGroupRepository 菜单分组仓库 |
|
type MenuGroupRepository struct { |
|
db *gorm.DB |
|
} |
|
|
|
// NewMenuGroupRepository 创建菜单分组仓库实例 |
|
func NewMenuGroupRepository(db *gorm.DB) *MenuGroupRepository { |
|
return &MenuGroupRepository{db: db} |
|
} |
|
|
|
// Create 创建菜单分组 |
|
func (r *MenuGroupRepository) Create(menuGroup *model.MenuGroup) error { |
|
return r.db.Create(menuGroup).Error |
|
} |
|
|
|
// FindByID 根据ID查找菜单分组 |
|
func (r *MenuGroupRepository) FindByID(id uint) (*model.MenuGroup, error) { |
|
var menuGroup model.MenuGroup |
|
err := r.db.Where("id = ?", id).First(&menuGroup).Error |
|
if err != nil { |
|
return nil, err |
|
} |
|
return &menuGroup, nil |
|
} |
|
|
|
// FindByName 根据名称查找菜单分组 |
|
func (r *MenuGroupRepository) FindByName(name string) (*model.MenuGroup, error) { |
|
var menuGroup model.MenuGroup |
|
err := r.db.Where("name = ?", name).First(&menuGroup).Error |
|
if err != nil { |
|
return nil, err |
|
} |
|
return &menuGroup, nil |
|
} |
|
|
|
// List 获取菜单分组列表 |
|
func (r *MenuGroupRepository) List() ([]*model.MenuGroup, error) { |
|
var menuGroups []*model.MenuGroup |
|
err := r.db.Order("sort ASC, id ASC").Find(&menuGroups).Error |
|
return menuGroups, err |
|
} |
|
|
|
// ListByStatus 根据状态获取菜单分组列表 |
|
func (r *MenuGroupRepository) ListByStatus(status int) ([]*model.MenuGroup, error) { |
|
var menuGroups []*model.MenuGroup |
|
err := r.db.Where("status = ?", status).Order("sort ASC, id ASC").Find(&menuGroups).Error |
|
return menuGroups, err |
|
} |
|
|
|
// Update 更新菜单分组 |
|
func (r *MenuGroupRepository) Update(menuGroup *model.MenuGroup) error { |
|
return r.db.Save(menuGroup).Error |
|
} |
|
|
|
// Delete 删除菜单分组 |
|
func (r *MenuGroupRepository) Delete(id uint) error { |
|
return r.db.Delete(&model.MenuGroup{}, id).Error |
|
} |
|
|
|
// BatchDelete 批量删除菜单分组 |
|
func (r *MenuGroupRepository) BatchDelete(ids []uint) error { |
|
return r.db.Where("id IN ?", ids).Delete(&model.MenuGroup{}).Error |
|
} |
|
|
|
// UpdateStatus 更新菜单分组状态 |
|
func (r *MenuGroupRepository) UpdateStatus(id uint, status int) error { |
|
return r.db.Model(&model.MenuGroup{}).Where("id = ?", id).Update("status", status).Error |
|
} |
|
|
|
// UpdateSort 更新菜单分组排序 |
|
func (r *MenuGroupRepository) UpdateSort(id uint, sort int) error { |
|
return r.db.Model(&model.MenuGroup{}).Where("id = ?", id).Update("sort", sort).Error |
|
} |
|
|
|
// BatchUpdateSort 批量更新菜单分组排序 |
|
func (r *MenuGroupRepository) BatchUpdateSort(sorts map[uint]int) error { |
|
for id, sort := range sorts { |
|
if err := r.UpdateSort(id, sort); err != nil { |
|
return err |
|
} |
|
} |
|
return nil |
|
} |
|
|
|
// GetStats 获取菜单分组统计信息 |
|
func (r *MenuGroupRepository) GetStats() (map[string]interface{}, error) { |
|
var total int64 |
|
var statusStats []struct { |
|
Status int `json:"status"` |
|
Count int64 `json:"count"` |
|
} |
|
|
|
if err := r.db.Model(&model.MenuGroup{}).Count(&total).Error; err != nil { |
|
return nil, err |
|
} |
|
|
|
if err := r.db.Model(&model.MenuGroup{}). |
|
Select("status, count(*) as count"). |
|
Group("status"). |
|
Scan(&statusStats).Error; err != nil { |
|
return nil, err |
|
} |
|
|
|
return map[string]interface{}{ |
|
"total": total, |
|
"status_stats": statusStats, |
|
}, nil |
|
} |
|
|
|
// ExistsByName 检查名称是否存在(排除指定ID) |
|
func (r *MenuGroupRepository) ExistsByName(name string, excludeID ...uint) bool { |
|
query := r.db.Model(&model.MenuGroup{}).Where("name = ?", name) |
|
if len(excludeID) > 0 && excludeID[0] > 0 { |
|
query = query.Where("id != ?", excludeID[0]) |
|
} |
|
var count int64 |
|
query.Count(&count) |
|
return count > 0 |
|
}
|
|
|