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

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
}