Files
arenax-server/internal/logic/menu/menu.go

190 lines
4.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}