| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 | package modelimport (	"kpt-pasture/util"	"time"	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow")const (	PermissionBtnAdd    = "permission:btn:add"	PermissionBtnEdit   = "permission:btn:edit"	PermissionBtnDelete = "permission:btn:delete")var PermissionBtnMap = map[pasturePb.ButtonType_Kind]string{	pasturePb.ButtonType_Add:    PermissionBtnAdd,	pasturePb.ButtonType_Edit:   PermissionBtnEdit,	pasturePb.ButtonType_Delete: PermissionBtnDelete,}type SystemMenu struct {	Id              int64                     `json:"id"`	Name            string                    `json:"name"`	Title           string                    `json:"title"`	Path            string                    `json:"path"`	Icon            string                    `json:"icon"`	Component       string                    `json:"component"`	Redirect        string                    `json:"redirect"`	Auths           string                    `json:"auths"`	MenuType        pasturePb.MenuType_Kind   `json:"menuType"`	ButtonType      pasturePb.ButtonType_Kind `json:"buttonType"`	ParentId        int64                     `json:"parentId"`	Rank            int32                     `json:"rank"`	ExtraIcon       string                    `json:"extraIcon"`	EnterTransition string                    `json:"enterTransition"`	ActivePath      string                    `json:"activePath"`	FrameSrc        string                    `json:"frameSrc"`	FrameLoading    pasturePb.IsShow_Kind     `json:"frameLoading"`	Keepalive       pasturePb.IsShow_Kind     `json:"keepalive"`	HiddenTag       pasturePb.IsShow_Kind     `json:"hiddenTag"`	ShowLink        pasturePb.IsShow_Kind     `json:"showLink"`	ShowParent      pasturePb.IsShow_Kind     `json:"showParent"`	IsShow          pasturePb.IsShow_Kind     `json:"isShow"`	IsDelete        pasturePb.IsShow_Kind     `json:"isDelete"`	CreatedAt       int64                     `json:"createdAt"`	UpdatedAt       int64                     `json:"updatedAt"`}func (s *SystemMenu) TableName() string {	return "system_menu"}func (s *SystemMenu) MenuUpdate(req *pasturePb.SearchMenuRequest) {	s.Name = req.Name	s.Path = req.Path	s.MenuType = req.MenuType	s.Title = req.Title	s.ParentId = int64(req.ParentId)	s.FrameSrc = req.FrameSrc	s.FrameLoading = util.BooleanToIsShow(req.FrameLoading)	s.Keepalive = util.BooleanToIsShow(req.Keepalive)	s.HiddenTag = util.BooleanToIsShow(req.HiddenTag)	s.ShowLink = util.BooleanToIsShow(req.ShowLink)	s.ShowParent = util.BooleanToIsShow(req.ShowParent)	s.Icon = req.Icon	s.Component = req.Component	s.Redirect = req.Redirect	s.Auths = req.Auths	s.Rank = req.Rank	s.ExtraIcon = req.ExtraIcon	s.EnterTransition = req.EnterTransition	s.ActivePath = req.ActivePath	s.IsShow = req.IsShow}// NewSystemMenu AddMenuRequestfunc NewSystemMenu(req *pasturePb.SearchMenuRequest) *SystemMenu {	return &SystemMenu{		Name:            req.Name,		Title:           req.Title,		Path:            req.Path,		Icon:            req.Icon,		Component:       req.Component,		Redirect:        req.Redirect,		Auths:           req.Auths,		MenuType:        req.MenuType,		ParentId:        int64(req.ParentId),		Rank:            req.Rank,		ExtraIcon:       req.ExtraIcon,		EnterTransition: req.EnterTransition,		ActivePath:      req.ActivePath,		FrameSrc:        req.FrameSrc,		FrameLoading:    util.BooleanToIsShow(req.FrameLoading),		Keepalive:       util.BooleanToIsShow(req.Keepalive),		HiddenTag:       util.BooleanToIsShow(req.HiddenTag),		ShowLink:        util.BooleanToIsShow(req.ShowLink),		ShowParent:      util.BooleanToIsShow(req.ShowParent),		IsShow:          pasturePb.IsShow_Ok,		IsDelete:        pasturePb.IsShow_Ok,	}}type SystemMenuSlice []*SystemMenufunc (s SystemMenuSlice) ToPB() []*pasturePb.SearchMenuRequest {	res := make([]*pasturePb.SearchMenuRequest, len(s))	for i, menu := range s {		var frameLoading, keepalive, hiddenTag, showLink, showParent bool		if menu.FrameLoading == pasturePb.IsShow_Ok {			frameLoading = true		}		if menu.Keepalive == pasturePb.IsShow_Ok {			keepalive = true		}		if menu.HiddenTag == pasturePb.IsShow_Ok {			hiddenTag = true		}		if menu.ShowLink == pasturePb.IsShow_Ok {			showLink = true		}		if menu.ShowParent == pasturePb.IsShow_Ok {			showParent = true		}		res[i] = &pasturePb.SearchMenuRequest{			Id:              int32(menu.Id),			Name:            menu.Name,			ParentId:        int32(menu.ParentId),			MenuType:        menu.MenuType,			Title:           menu.Title,			Path:            menu.Path,			IsShow:          menu.IsShow,			Component:       menu.Component,			Icon:            menu.Icon,			Redirect:        menu.Redirect,			Auths:           menu.Auths,			Rank:            menu.Rank,			ExtraIcon:       menu.ExtraIcon,			EnterTransition: menu.EnterTransition,			ActivePath:      menu.ActivePath,			FrameSrc:        menu.FrameSrc,			FrameLoading:    frameLoading,			Keepalive:       keepalive,			HiddenTag:       hiddenTag,			ShowLink:        showLink,			ShowParent:      showParent,			CreatedAtFormat: time.Unix(menu.CreatedAt, 0).Local().Format(LayoutTime),			UpdatedAtFormat: time.Unix(menu.UpdatedAt, 0).Local().Format(LayoutTime),		}	}	return res}func (s SystemMenuSlice) ToTree() []*pasturePb.MenuTree {	if len(s) == 0 {		return make([]*pasturePb.MenuTree, 0)	}	// 1. 一次性创建所有节点并建立ID映射	nodeMap := make(map[int32]*pasturePb.MenuTree, len(s))	allNodes := make([]*pasturePb.MenuTree, len(s))	for i, v := range s {		node := &pasturePb.MenuTree{			Id:         int32(v.Id),			Path:       v.Path,			ParentId:   int32(v.ParentId),			Name:       v.Name,			ButtonType: v.ButtonType,			MenuType:   v.MenuType,			Meta: &pasturePb.MenuMeta{				Icon:     v.Icon,				Title:    v.Title,				Rank:     v.Rank,				Roles:    []string{},				ShowLink: v.ShowLink == pasturePb.IsShow_Ok,				Auths:    make([]string, 0),			},			Children: make([]*pasturePb.MenuTree, 0),		}		allNodes[i] = node		nodeMap[node.Id] = node	}	// 2. 构建树结构	rootNodes := make([]*pasturePb.MenuTree, 0, len(s)/2) // 假设约一半是根节点	for _, node := range allNodes {		if node.ParentId == 0 {			rootNodes = append(rootNodes, node)		} else {			if parent, exists := nodeMap[node.ParentId]; exists {				parent.Children = append(parent.Children, node)			}		}	}	// 3. 处理特殊节点类型	for _, node := range nodeMap {		if node.MenuType == pasturePb.MenuType_Button && node.ButtonType > pasturePb.ButtonType_Invalid {			if parent, ok := nodeMap[node.ParentId]; ok && parent.Meta != nil {				parent.Meta.Auths = append(parent.Meta.Auths, PermissionBtnMap[node.ButtonType])			}		}	}	return rootNodes}type MenuItem struct {	Path     string      `json:"path"`	Name     string      `json:"name"`	Meta     MenuMeta    `json:"meta"`	Children []*MenuItem `json:"children"`}type MenuMeta struct {	Icon     string `json:"icon"`	Title    string `json:"title"`	Rank     int32  `json:"rank"`	ShowLink bool   `json:"showLink"`	Hidden   bool   `json:"hidden"`}
 |