HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot//cs.wgegeghx.com/application/common/library/Menu.php
<?php





// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )





// | 菜单类

namespace app\common\library;

use app\admin\model\Menu as MenuModel;
use think\Exception;

class Menu
{

    /**
     * 添加插件后台管理菜单
     * @param type $info
     * @param type $adminlist
     * @return boolean
     */
    public static function addAddonMenu($info, $admin_list = null)
    {
        if (empty($info)) {
            throw new Exception('没有数据!');
        }
        //查询出“插件后台列表”菜单ID
        $menuId = MenuModel::where(array("app" => "addons", "controller" => "addons", "action" => "addonadmin"))->value('id') ?: 41;
        $data   = array(
            //父ID
            "parentid"   => $menuId,
            'icon'       => isset($info['icon']) ? $info['icon'] : 'icon-circle-line',
            //模块目录名称,也是项目名称
            "app"        => "addons",
            //插件名称
            "controller" => $info['name'],
            //方法名称
            "action"     => "index",
            //附加参数 例如:a=12&id=777
            "parameter"  => "isadmin=1",
            //状态,1是显示,0是不显示
            "status"     => 1,
            //名称
            "title"      => $info['title'],
            //备注
            "tip"        => $info['title'] . "插件管理后台!",
            //排序
            "listorder"  => 0,
        );
        //添加插件后台
        $parentid = MenuModel::create($data);
        //显示“插件后台列表”菜单
        MenuModel::where('id', $menuId)->update(array('status' => 1));
        //插件具体菜单
        if (!empty($admin_list)) {
            foreach ($admin_list as $key => $menu) {
                //检查参数是否存在
                if (empty($menu['title']) || empty($menu['action'])) {
                    continue;
                }
                //如果是index,跳过,因为已经有了。。。
                if ($menu['action'] == 'index') {
                    continue;
                }
                $data = array(
                    //父ID
                    "parentid"   => $parentid->getAttr('parentid'),
                    //模块目录名称,也是项目名称
                    "app"        => "addons",
                    //文件名称,比如LinksAction.class.php就填写 Links
                    "controller" => $info['name'],
                    //方法名称
                    "action"     => $menu['action'],
                    //附加参数 例如:a=12&id=777
                    "parameter"  => 'isadmin=1',
                    //状态,1是显示,0是不显示
                    "status"     => (int) $menu['status'],
                    //名称
                    "title"      => $menu['title'],
                    //备注
                    "tip"        => $menu['tip'] ?: '',
                    //排序
                    "listorder"  => (int) $menu['listorder'],
                );
                MenuModel::create($data);
            }
        }
        return true;
    }

    /**
     * 模块安装时进行菜单注册
     * @param array $data 菜单数据
     * @param array $config 模块配置
     * @param type $parentid 父菜单ID
     * @return boolean
     */
    public static function installModuleMenu(array $data, array $config, $parentid = 0)
    {
        if (empty($data) || !is_array($data)) {
            throw new Exception('没有数据!');
        }
        if (empty($config)) {
            throw new Exception('模块配置信息为空!');
        }
        //默认安装时父级ID
        $defaultMenuParentid = MenuModel::where(array('app' => 'admin', 'controller' => 'module', 'action' => 'list'))->value('id') ?: 45;
        //安装模块名称
        $moduleNama = $config['module'];
        foreach ($data as $rs) {
            if (empty($rs['route'])) {
                throw new Exception('菜单信息配置有误,route 不能为空!');
            }
            $route   = self::menuRoute($rs['route'], $moduleNama);
            $pid     = $parentid ?: ((is_null($rs['parentid']) || !isset($rs['parentid'])) ? (int) $defaultMenuParentid : $rs['parentid']);
            $newData = array_merge(array(
                'title'     => $rs['name'],
                'icon'      => isset($rs['icon']) ? $rs['icon'] : '',
                'parentid'  => $pid,
                'status'    => isset($rs['status']) ? $rs['status'] : 0,
                'tip'       => isset($rs['remark']) ? $rs['remark'] : '',
                'listorder' => isset($rs['listorder']) ? $rs['listorder'] : 0,
            ), $route);

            $result = MenuModel::create($newData);
            //是否有子菜单
            if (!empty($rs['child'])) {
                self::installModuleMenu($rs['child'], $config, $result['id']);
            }
        }
        //清除缓存
        cache('Menu', null);
        return true;
    }

    /**
     * 删除对应插件菜单和权限
     * @param type $info 插件信息
     * @return boolean
     */
    public static function delAddonMenu($info)
    {
        if (empty($info)) {
            throw new Exception('没有数据!');
        }
        //查询出“插件后台列表”菜单ID
        $menuId = MenuModel::where(array("app" => "Addons", "controller" => "Addons", "action" => "addonadmin"))->value('id') ?: 41;
        //删除对应菜单
        MenuModel::where(array('app' => 'Addons', 'controller' => $info['name']))->delete();
        //删除权限
        //M("Access")->where(array("app" => "Addons", 'controller' => $info['name']))->delete();
        //检查“插件后台列表”菜单下还有没有菜单,没有就隐藏
        $count = MenuModel::where('parentid', $menuId)->count();
        if (!$count) {
            MenuModel::where('id', $menuId)->update(array('status' => 0));
        }
        return true;
    }

    /**
     * 把模块安装时,Menu.php中配置的route进行转换
     * @param type $route route内容
     * @param type $moduleNama 安装模块名称
     * @return array
     */
    private static function menuRoute($route, $moduleNama)
    {
        $route = explode('/', $route, 3);
        if (count($route) < 3) {
            array_unshift($route, $moduleNama);
        }
        $data = array(
            'app'        => $route[0],
            'controller' => $route[1],
            'action'     => $route[2],
        );
        return $data;
    }

}