190 lines
4.3 KiB
Go
190 lines
4.3 KiB
Go
package menu
|
||
|
||
import (
|
||
"context"
|
||
"server/internal/dao"
|
||
"server/internal/model"
|
||
"server/internal/model/do"
|
||
"server/internal/model/entity"
|
||
"server/internal/service"
|
||
"server/utility/ecode"
|
||
)
|
||
|
||
type sMenu struct {
|
||
}
|
||
|
||
func New() service.IMenu {
|
||
return &sMenu{}
|
||
}
|
||
|
||
func init() {
|
||
service.RegisterMenu(New())
|
||
}
|
||
|
||
// Create 创建菜单
|
||
func (s *sMenu) Create(ctx context.Context, in *model.MenuCreateInput) (out *model.CreateOut, err error) {
|
||
// 检查菜单名称是否已存在
|
||
exist, err := dao.Menus.Ctx(ctx).Where(do.Menus{Name: in.Name}).Exist()
|
||
if err != nil {
|
||
return nil, ecode.Fail.Sub("插入菜单查重出现异常")
|
||
}
|
||
if exist {
|
||
return nil, ecode.Params.Sub("菜单名称已存在")
|
||
}
|
||
|
||
id, err := dao.Menus.Ctx(ctx).InsertAndGetId(do.Menus{
|
||
ParentId: in.ParentId,
|
||
Name: in.Name,
|
||
Path: in.Path,
|
||
Component: in.Component,
|
||
Type: in.Type,
|
||
Icon: in.Icon,
|
||
Sort: in.Sort,
|
||
Hidden: in.Hidden,
|
||
Status: in.Status,
|
||
})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &model.CreateOut{Id: id}, nil
|
||
}
|
||
|
||
// Delete 删除菜单
|
||
func (s *sMenu) Delete(ctx context.Context, in *model.MenuDeleteInput) (out *model.DeleteOut, err error) {
|
||
// 检查是否存在子菜单
|
||
count, err := dao.Menus.Ctx(ctx).Where(do.Menus{ParentId: in.Id}).Count()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if count > 0 {
|
||
return nil, ecode.Params.Sub("存在子菜单,请先删除子菜单")
|
||
}
|
||
|
||
// 删除菜单
|
||
_, err = dao.Menus.Ctx(ctx).Where(do.Menus{Id: in.Id}).Delete()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &model.DeleteOut{}, nil
|
||
}
|
||
|
||
// BatchDelete 批量删除菜单
|
||
func (s *sMenu) BatchDelete(ctx context.Context, in *model.BatchDeleteIn) (out *model.BatchDeleteOut, err error) {
|
||
// 检查是否存在子菜单
|
||
var menus []*entity.Menus
|
||
err = dao.Menus.Ctx(ctx).WhereIn(dao.Menus.Columns().ParentId, in.Ids).Scan(&menus)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
// 获取有子菜单的ID
|
||
hasChildrenIds := make(map[int]bool)
|
||
for _, menu := range menus {
|
||
hasChildrenIds[int(menu.ParentId)] = true
|
||
}
|
||
|
||
// 找出可以删除的ID
|
||
var deletableIds []int
|
||
var undeletableIds []int
|
||
for _, id := range in.Ids {
|
||
if hasChildrenIds[id] {
|
||
undeletableIds = append(undeletableIds, id)
|
||
} else {
|
||
deletableIds = append(deletableIds, id)
|
||
}
|
||
}
|
||
|
||
// 如果有可删除的ID,执行删除操作
|
||
if len(deletableIds) > 0 {
|
||
_, err = dao.Menus.Ctx(ctx).WhereIn(dao.Menus.Columns().Id, deletableIds).Delete()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
}
|
||
|
||
return &model.BatchDeleteOut{
|
||
Ids: undeletableIds,
|
||
}, nil
|
||
}
|
||
|
||
// Update 更新菜单
|
||
func (s *sMenu) Update(ctx context.Context, in *model.MenuUpdateInput) (out *model.UpdateOut, err error) {
|
||
// 检查菜单是否存在
|
||
exist, err := dao.Menus.Ctx(ctx).WherePri(in.Id).Exist()
|
||
if err != nil {
|
||
return nil, ecode.Fail.Sub("查询菜单失败")
|
||
}
|
||
if !exist {
|
||
return nil, ecode.Params.Sub("菜单不存在")
|
||
}
|
||
exist, err = dao.Menus.Ctx(ctx).Where(do.Menus{Name: in.Name}).WhereNot(dao.Menus.Columns().Id, in.Id).Exist()
|
||
if err != nil {
|
||
return nil, ecode.Fail.Sub("查询菜单失败")
|
||
}
|
||
if exist {
|
||
return nil, ecode.Params.Sub("菜单名称已存在")
|
||
}
|
||
|
||
// 更新菜单
|
||
_, err = dao.Menus.Ctx(ctx).Where(do.Menus{
|
||
Id: in.Id,
|
||
}).Update(do.Menus{
|
||
ParentId: in.ParentId,
|
||
Name: in.Name,
|
||
Path: in.Path,
|
||
Component: in.Component,
|
||
Type: in.Type,
|
||
Icon: in.Icon,
|
||
Sort: in.Sort,
|
||
Hidden: in.Hidden,
|
||
Status: in.Status,
|
||
})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &model.UpdateOut{}, nil
|
||
}
|
||
|
||
// List 获取菜单列表
|
||
func (s *sMenu) List(ctx context.Context, in *model.MenuListInput) (out *model.MenuListOutput, err error) {
|
||
m := dao.Menus.Ctx(ctx)
|
||
|
||
// 构建查询条件
|
||
if in.ParentId > 0 {
|
||
m = m.Where(do.Menus{
|
||
ParentId: in.ParentId,
|
||
})
|
||
}
|
||
if in.Name != "" {
|
||
m = m.WhereLike(dao.Menus.Columns().Name, "%"+in.Name+"%")
|
||
}
|
||
if in.Path != "" {
|
||
m = m.WhereLike(dao.Menus.Columns().Path, "%"+in.Path+"%")
|
||
}
|
||
if in.Type > 0 {
|
||
m = m.Where(do.Menus{
|
||
Type: in.Type,
|
||
})
|
||
}
|
||
if in.Status > 0 {
|
||
m = m.Where(do.Menus{
|
||
Status: in.Status,
|
||
})
|
||
}
|
||
|
||
// 分页查询
|
||
list := make([]model.Menu, 0)
|
||
var total int
|
||
err = m.Page(in.Page, in.Size).OrderAsc(dao.Menus.Columns().Sort).ScanAndCount(&list, &total, false)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &model.MenuListOutput{
|
||
List: list,
|
||
Total: total,
|
||
}, nil
|
||
}
|