新增菜单和角色关联接口
This commit is contained in:
189
internal/logic/menu/menu.go
Normal file
189
internal/logic/menu/menu.go
Normal file
@ -0,0 +1,189 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user