package system
import (
"errors"
"fmt"
"strconv"
"gin_server_admin/global"
"gin_server_admin/model/common/request"
"gin_server_admin/model/system"
"gorm.io/gorm"
)
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getMenuTreeMap
//@description: 获取路由总树map
//@param: authorityId string
//@return: err error, treeMap map[string][]model.SysMenu
type MenuService struct {
}
var MenuServiceApp = new ( MenuService )
func ( menuService * MenuService ) getMenuTreeMap ( authorityId string ) ( err error , treeMap map [ string ] [ ] system . SysMenu ) {
var allMenus [ ] system . SysMenu
treeMap = make ( map [ string ] [ ] system . SysMenu )
fmt . Printf ( "%v" , global . GVA_DB )
err = global . GVA_DB . Where ( "authority_id = ?" , authorityId ) . Order ( "sort" ) . Preload ( "Parameters" ) . Find ( & allMenus ) . Error
for _ , v := range allMenus {
treeMap [ v . ParentId ] = append ( treeMap [ v . ParentId ] , v )
}
return err , treeMap
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetMenuTree
//@description: 获取动态菜单树
//@param: authorityId string
//@return: err error, menus []model.SysMenu
func ( menuService * MenuService ) GetMenuTree ( authorityId string ) ( err error , menus [ ] system . SysMenu ) {
err , menuTree := menuService . getMenuTreeMap ( authorityId )
menus = menuTree [ "0" ]
for i := 0 ; i < len ( menus ) ; i ++ {
err = menuService . getChildrenList ( & menus [ i ] , menuTree )
}
return err , menus
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getChildrenList
//@description: 获取子菜单
//@param: menu *model.SysMenu, treeMap map[string][]model.SysMenu
//@return: err error
func ( menuService * MenuService ) getChildrenList ( menu * system . SysMenu , treeMap map [ string ] [ ] system . SysMenu ) ( err error ) {
menu . Children = treeMap [ menu . MenuId ]
for i := 0 ; i < len ( menu . Children ) ; i ++ {
err = menuService . getChildrenList ( & menu . Children [ i ] , treeMap )
}
return err
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetInfoList
//@description: 获取路由分页
//@return: err error, list interface{}, total int64
func ( menuService * MenuService ) GetInfoList ( ) ( err error , list interface { } , total int64 ) {
var menuList [ ] system . SysBaseMenu
err , treeMap := menuService . getBaseMenuTreeMap ( )
menuList = treeMap [ "0" ]
for i := 0 ; i < len ( menuList ) ; i ++ {
err = menuService . getBaseChildrenList ( & menuList [ i ] , treeMap )
}
return err , menuList , total
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getBaseChildrenList
//@description: 获取菜单的子菜单
//@param: menu *model.SysBaseMenu, treeMap map[string][]model.SysBaseMenu
//@return: err error
func ( menuService * MenuService ) getBaseChildrenList ( menu * system . SysBaseMenu , treeMap map [ string ] [ ] system . SysBaseMenu ) ( err error ) {
menu . Children = treeMap [ strconv . Itoa ( int ( menu . ID ) ) ]
for i := 0 ; i < len ( menu . Children ) ; i ++ {
err = menuService . getBaseChildrenList ( & menu . Children [ i ] , treeMap )
}
return err
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: AddBaseMenu
//@description: 添加基础路由
//@param: menu model.SysBaseMenu
//@return: error
func ( menuService * MenuService ) AddBaseMenu ( menu system . SysBaseMenu ) error {
if ! errors . Is ( global . GVA_DB . Where ( "name = ?" , menu . Name ) . First ( & system . SysBaseMenu { } ) . Error , gorm . ErrRecordNotFound ) {
return errors . New ( "存在重复name,请修改name" )
}
return global . GVA_DB . Create ( & menu ) . Error
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getBaseMenuTreeMap
//@description: 获取路由总树map
//@return: err error, treeMap map[string][]model.SysBaseMenu
func ( menuService * MenuService ) getBaseMenuTreeMap ( ) ( err error , treeMap map [ string ] [ ] system . SysBaseMenu ) {
var allMenus [ ] system . SysBaseMenu
treeMap = make ( map [ string ] [ ] system . SysBaseMenu )
err = global . GVA_DB . Order ( "sort" ) . Preload ( "Parameters" ) . Find ( & allMenus ) . Error
for _ , v := range allMenus {
treeMap [ v . ParentId ] = append ( treeMap [ v . ParentId ] , v )
}
return err , treeMap
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetBaseMenuTree
//@description: 获取基础路由树
//@return: err error, menus []model.SysBaseMenu
func ( menuService * MenuService ) GetBaseMenuTree ( ) ( err error , menus [ ] system . SysBaseMenu ) {
err , treeMap := menuService . getBaseMenuTreeMap ( )
menus = treeMap [ "0" ]
for i := 0 ; i < len ( menus ) ; i ++ {
err = menuService . getBaseChildrenList ( & menus [ i ] , treeMap )
}
return err , menus
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: AddMenuAuthority
//@description: 为角色增加menu树
//@param: menus []model.SysBaseMenu, authorityId string
//@return: err error
func ( menuService * MenuService ) AddMenuAuthority ( menus [ ] system . SysBaseMenu , authorityId string ) ( err error ) {
var auth system . SysAuthority
auth . AuthorityId = authorityId
auth . SysBaseMenus = menus
err = AuthorityServiceApp . SetMenuAuthority ( & auth )
return err
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetMenuAuthority
//@description: 查看当前角色树
//@param: info *request.GetAuthorityId
//@return: err error, menus []model.SysMenu
func ( menuService * MenuService ) GetMenuAuthority ( info * request . GetAuthorityId ) ( err error , menus [ ] system . SysMenu ) {
err = global . GVA_DB . Where ( "authority_id = ? " , info . AuthorityId ) . Order ( "sort" ) . Find ( & menus ) . Error
//sql := "SELECT authority_menu.keep_alive,authority_menu.default_menu,authority_menu.created_at,authority_menu.updated_at,authority_menu.deleted_at,authority_menu.menu_level,authority_menu.parent_id,authority_menu.path,authority_menu.`name`,authority_menu.hidden,authority_menu.component,authority_menu.title,authority_menu.icon,authority_menu.sort,authority_menu.menu_id,authority_menu.authority_id FROM authority_menu WHERE authority_menu.authority_id = ? ORDER BY authority_menu.sort ASC"
//err = global.GVA_DB.Raw(sql, authorityId).Scan(&menus).Error
return err , menus
}