2021-10-29 14:39:50 +08:00
package service
import (
"errors"
"strconv"
2021-10-29 14:44:41 +08:00
"goweb-gin-demo/global"
"goweb-gin-demo/model/common/request"
"goweb-gin-demo/model/web"
2021-10-29 14:39:50 +08:00
"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 ] [ ] web . SysMenu ) {
var allMenus [ ] web . SysMenu
treeMap = make ( map [ string ] [ ] web . SysMenu )
err = global . GLOBAL_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 [ ] web . 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 * web . SysMenu , treeMap map [ string ] [ ] web . 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 [ ] web . 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 * web . SysBaseMenu , treeMap map [ string ] [ ] web . 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 web . SysBaseMenu ) error {
if ! errors . Is ( global . GLOBAL_DB . Where ( "name = ?" , menu . Name ) . First ( & web . SysBaseMenu { } ) . Error , gorm . ErrRecordNotFound ) {
return errors . New ( "存在重复name, 请修改name" )
}
return global . GLOBAL_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 ] [ ] web . SysBaseMenu ) {
var allMenus [ ] web . SysBaseMenu
treeMap = make ( map [ string ] [ ] web . SysBaseMenu )
err = global . GLOBAL_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 [ ] web . 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 [ ] web . SysBaseMenu , authorityId string ) ( err error ) {
var auth web . 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 [ ] web . SysMenu ) {
err = global . GLOBAL_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.GLOBAL_DB.Raw(sql, authorityId).Scan(&menus).Error
return err , menus
}