Files
iotlcm/server/api/system/v1/menu.go
T
2026-10-29 14:36:49 +08:00

128 lines
5.9 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 v1
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package v1
import (
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"github.com/gogf/gf/v2/frame/g"
)
// 路由菜单
type RouteMenu struct {
Id int64 `json:"id" dc:"路由ID"`
ParentId int64 `json:"parentId" dc:"父路由ID"`
Path string `json:"path" dc:"路由路径"`
Redirect *string `json:"redirect,omitempty" dc:"重定向路径"`
Name string `json:"name" dc:"路由名称"` // 必须唯一
Component string `json:"component" dc:"组件路径"`
Meta *RouteMeta `json:"meta,omitempty" dc:"路由元数据"`
Children []*RouteMenu `json:"children,omitempty" dc:"子路由"`
}
// 路由元数据
// 对应 vue/packages/@core/base/typings/src/vue-router.d.ts
type RouteMeta struct {
Title string `json:"title" dc:"菜单标题"`
Icon *string `json:"icon,omitempty" dc:"菜单图标"`
Order *int `json:"order,omitempty" dc:"菜单排序"`
OpenInNewWindow *bool `json:"openInNewWindow,omitempty" dc:"是否在新窗口打开"`
NoBasicLayout *bool `json:"noBasicLayout,omitempty" dc:"是否不使用基础布局"`
HideInMenu *bool `json:"hideInMenu,omitempty" dc:"是否隐藏菜单"`
HideInBreadcrumb *bool `json:"hideInBreadcrumb,omitempty" dc:"是否隐藏面包屑"`
HideChildrenInMenu *bool `json:"hideChildrenInMenu,omitempty" dc:"是否隐藏子菜单"`
HideInTab *bool `json:"hideInTab,omitempty" dc:"是否隐藏标签页"`
MenuVisibleWithForbidden *bool `json:"menuVisibleWithForbidden,omitempty" dc:"菜单可见但访问会被重定向到403"`
IgnoreAccess *bool `json:"ignoreAccess,omitempty" dc:"忽略权限,直接可以访问"`
KeepAlive *bool `json:"keepAlive,omitempty" dc:"开启KeepAlive缓存"`
Link *string `json:"link,omitempty" dc:"外链-跳转路径"`
Query map[string]string `json:"query,omitempty" dc:"路由所携带的参数"`
IframeSrc *string `json:"iframeSrc,omitempty" dc:"iframe地址"`
MaxNumOfOpenTab *int `json:"maxNumOfOpenTab,omitempty" dc:"标签页最大打开数量"`
Badge *string `json:"badge,omitempty" dc:"徽标"`
BadgeType *string `json:"badgeType,omitempty" dc:"徽标类型"`
BadgeVariants *string `json:"badgeVariants,omitempty" dc:"徽标颜色"`
Authority []string `json:"authority,omitempty" dc:"需要特定的角色标识才可以访问"`
AffixTab *bool `json:"affixTab,omitempty" dc:"是否固定标签页"`
AffixTabOrder *int `json:"affixTabOrder,omitempty" dc:"固定标签页的顺序"`
ActiveIcon *string `json:"activeIcon,omitempty" dc:"激活图标"`
ActivePath *string `json:"activePath,omitempty" dc:"当前激活的菜单"`
}
// 获取用户所有菜单
type MenuAllReq struct {
g.Meta `path:"/menu/all" method:"get" tags:"系统-菜单管理" summary:"获取用户所有菜单" x-check-permission:""`
}
// type MenuAllRes struct {
// Data []RouteMenu `json:"data" dc:"菜单列表"`
// }
type MenuAllRes = []*RouteMenu
type MenuListReq struct {
g.Meta `path:"/menu/list" method:"get" tags:"系统-菜单管理" summary:"获取菜单列表" x-check-permission:"cpm:system:menu:list"`
model.SysMenuListParam
}
type MenuListRes struct {
Data []*model.SysMenuListModel `json:"items" dc:"菜单列表"`
Total int `json:"total" dc:"总数"`
}
type MenuViewReq struct {
g.Meta `path:"/menu/view" method:"get" tags:"系统-菜单管理" summary:"获取菜单详情" x-check-permission:"cpm:system:menu:query"`
MenuId int64 `json:"menuId" dc:"菜单ID"`
}
type MenuViewRes struct {
model.SysMenuViewModel
}
type MenuAddReq struct {
g.Meta `path:"/menu/add" method:"post" tags:"系统-菜单管理" summary:"添加菜单" x-check-permission:"cpm:system:menu:add"`
model.SysMenuAddModel
}
type MenuAddRes struct {
model.SysMenuViewModel
}
type MenuUpdateReq struct {
g.Meta `path:"/menu/update" method:"post" tags:"系统-菜单管理" summary:"更新菜单" x-check-permission:"cpm:system:menu:edit"`
model.SysMenuUpdateModel
}
type MenuUpdateRes struct {
model.SysMenuViewModel
}
type MenuDeleteReq struct {
g.Meta `path:"/menu/delete" method:"post" tags:"系统-菜单管理" summary:"删除菜单" x-check-permission:"cpm:system:menu:remove"`
MenuId int64 `json:"menuId" dc:"菜单ID"`
}
type MenuDeleteRes struct {
}
// MenuTreeReq 菜单树,服务于两个场景:
// 1. 菜单管理页(需要 cpm:system:menu:list)
// 2. 角色管理页里的授权树(需要 cpm:system:role:query)
//
// 二者权限域不同,因此用逗号分隔声明为「或」关系:拥有任一权限即可调用。
// 逗号 OR 语义由中间件实现(internal/logic/middleware/middleware.go 中对
// x-check-permission 按 "," 切分后逐个匹配,任一通过即放行)。
//
// 若只要求 cpm:system:menu:list,则只有角色管理权限、没有菜单管理权限的用户
// 将无法打开授权树。此设计与 /agent/menu/tree 使用角色权限的思路一致。
type MenuTreeReq struct {
g.Meta `path:"/menu/tree" method:"get" tags:"系统-菜单管理" summary:"获取菜单树" x-check-permission:"cpm:system:menu:list,cpm:system:role:query"`
model.SysMenuListParam
}
type MenuTreeRes struct {
Data []*model.SysMenuFullTreeModel `json:"items" dc:"菜单树"`
}