php单文件版在线代码编辑器


Posted in PHP onMarch 12, 2015

密码加密方式:
 * md5(自设密码+$ace) //$ace为cdn镜像地址

使用方法:

 * 1.确认 $pwd 变量值为 false, 上传本文件到PHP空间并访问
 * 2.第一次访问提示设置密码,设置密码并牢记
 * 3.使用第一次设置的密码登录后,默认编辑的是本php文件,
 * 4.本文件是编辑器核心文件,请不要随意修改
 * 5.保存编辑的文件请用 Ctrl + S 按键组合,等待执行结果
 * 6.保存动作执行后请务必等待保存成功信息返回
 * 7.重置操作会修改本程序的文件名,以防他人猜测路径
 * 8.刷新功能仅是刷新本程序文件,不能刷新其他

建议在 chrome 浏览器中使用本编辑器

<?php

session_start();

$curr_file = __FILE__; //默认编辑当前文件

$curr_file_path = str_replace(dirname(__FILE__), '', __FILE__);

$pwd = "57574d98bc6ebe77b07e59d87065cd9e"; //密码初始化默认值为 false

$ace = 'ace.js'; //编辑器核心js

$tip['core'] = 'alertify.core.min.css';

$tip['css'] = 'alertify.default.min.css';

$tip['js'] = 'alertify.min.js';

$jquery = 'jquery.min.js';

if ( false !== $pwd ) {

    define('DEFAULT_PWD', $pwd);

}

//文件后缀名对应的语法解析器

$lng = array(

    'as' => 'actionscript', 'js' => 'javascript',

    'php' => 'php', 'css' => 'css', 'html' => 'html',

    'htm' => 'html', 'ini' => 'ini', 'json' => 'json',

    'jsp' => 'jsp', 'txt' => 'text', 'sql' => 'mysql',

    'xml' => 'xml', 'yaml' => 'yaml', 'py' => 'python',

    'md' => 'markdown', 'htaccess' => 'apache_conf',

    'bat' => 'batchfile', 'go' => 'golang',

);

//判断用户是否登录

function is_logged() {

    $flag = false;

    if ( isset($_SESSION['pwd']) && defined('DEFAULT_PWD') ) {

        if ( $_SESSION['pwd'] === DEFAULT_PWD ) {

            $flag = true;

        }

    }

    return $flag;

}

//重新载入到本页面

function reload() {

    $file = pathinfo(__FILE__, PATHINFO_BASENAME);

    die(header("Location: {$file}"));

}

//判断请求是否是ajax请求

function is_ajax() {

    $flag = false;

    if ( isset($_SERVER['HTTP_X_REQUESTED_WITH']) ) {

        $flag = strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';

    }

    return $flag;

}

//销毁SESSION和COOKIE

function exterminate() {

    $_SESSION = array();

    foreach ( $_COOKIE as $key ) {

        setcookie($key, null);

    }

    session_destroy();

    $_COOKIE = array();

    return true;

}

//获取一个目录下的文件列表

function list_dir($path, $type = 'array') {

    $flag = false;

    $lst = array('dir'=>array(), 'file'=>array());

    $base = !is_dir($path) ? dirname($path) : $path;

    $tmp = scandir($base);

    foreach ( $tmp as $k=>$v ) {

        //过滤掉上级目录,本级目录和程序自身文件名

        if ( !in_array($v, array('.', '..')) ) {

            $file = $full_path = rtrim($base, '/').DIRECTORY_SEPARATOR.$v;

            if ( $full_path == __FILE__ ) {

                continue; //屏蔽自身文件不在列表出现

            }

            $file = str_replace(dirname(__FILE__), '', $file);

            $file = str_replace("\\", '/', $file); //过滤win下的路径

            $file = str_replace('//', '/', $file); //过滤双斜杠

            if ( is_dir($full_path) ) {

                if ( 'html' === $type ) {

                    $v = '<li class="dir" path="'.$file

                    .'" onclick="load();"><span>'.$v.'</span></li>';

                }

                array_push($lst['dir'], $v);

            } else {

                if ( 'html' === $type ) {

                    $v = '<li class="file" path="'.$file

                    .'" onclick="load()"><span>'.$v.'</span></li>';

                }

                array_push($lst['file'], $v);

            }

        }

    }

    $lst = array_merge($lst['dir'], $lst['file']);

    $lst = array_filter($lst);

    $flag = $lst;

    if ( 'html' === $type ) {

        $flag = '<ul>'. implode('', $lst) .'</ul>';

    }

    return $flag;

}

//递归删除一个非空目录

function deldir($dir) {

    $dh = opendir($dir);

    while ( $file = readdir($dh) ) {

        if ( $file != '.' && $file != '..' ) {

            $fullpath = $dir.'/'.$file;

            if ( !is_dir($fullpath) ) {

                unlink($fullpath);

            } else {

                deldir($fullpath);

            }

        }

    }

    return rmdir($dir);

}

//退出登录

if ( isset($_GET['logout']) ) {

    if ( exterminate() ) {

        reload();

    }

}

//ajax输出文件内容

if ( is_logged() && is_ajax() && isset($_POST['file']) ) {

    $file = dirname(__FILE__).$_POST['file'];

    $ext = pathinfo($file, PATHINFO_EXTENSION);

    $mode = isset($lng[$ext]) ? $lng[$ext] : false;

    die(json_encode(array(

        'file' => $file, 'html' => file_get_contents($file),

        'mode' => $mode,     

    )));

}

//ajax输出目录列表

if ( is_logged() && is_ajax() && isset($_POST['dir']) ) {

    $dir = dirname(__FILE__).$_POST['dir'];

    $list_dir = list_dir($dir, 'html');

    die(json_encode(array(

        'dir' => $dir, 'html' => $list_dir,

    )));

}

//ajax保存文件

if ( is_logged() && is_ajax() && isset($_POST['action']) ) {

    $arr = array('result'=>'error', 'msg'=>'文件保存失败!');

    $content = $_POST['content'];

    if ( 'save_file' === $_POST['action'] ) {

        if ( isset($_POST['file_path']) ) {

            $file = dirname(__FILE__).$_POST['file_path'];

        } else {

            $file = __FILE__;

        }

        file_put_contents($file, $content);

        $arr['result'] = 'success';

        $arr['msg'] = '保存成功!';

    }

    die(json_encode($arr));

}

//ajax删除文件或文件夹

if ( is_logged() && is_ajax() && isset($_POST['del']) ) {

    $path = dirname(__FILE__).$_POST['del'];

    $arr = array('result'=>'error', 'msg'=>'删除操作失败!');

    if ( $_POST['del'] && $path ) {

        $flag = is_dir($path) ? deldir($path) : unlink($path);

        if ( $flag ) {

           $arr['msg'] = '删除操作成功!';

           $arr['result'] = 'success';

        }

    }

    die(json_encode($arr));

}

//ajax新建文件或文件夹

if ( is_logged() && is_ajax() && isset($_POST['create']) ) {

    $flag = false;

    $arr = array('result'=>'error', 'msg'=>'操作失败!');

    if ( isset($_POST['target']) ) {

        $target = dirname(__FILE__).$_POST['target'];

        $target = is_dir($target) ? $target : dirname($target);

    }

    if ( $_POST['create'] && $target ) {

        $base_name = pathinfo($_POST['create'], PATHINFO_BASENAME);

        $exp = explode('.', $base_name);

        $full_path = $target.'/'.$base_name;

        $new_path = str_replace(dirname(__FILE__), '', $full_path);

        if ( count($exp) > 1 && isset($lng[array_pop($exp)]) ) {

            file_put_contents($full_path, '');

            $arr['result'] = 'success';

            $arr['msg'] = '新建文件成功!';

            $arr['type'] = 'file';

        } else {

            mkdir($full_path, 0777, true);

            $arr['result'] = 'success';

            $arr['msg'] = '新建目录成功!';

            $arr['type'] = 'dir';

        }

        if ( $base_name && $new_path ) {

            $arr['new_name'] = $base_name;

            $arr['new_path'] = $new_path;

        }

    }

    die(json_encode($arr));

}

//ajax重命名文件或文件夹

if ( is_logged() && is_ajax() && isset($_POST['rename']) ) {

    $arr = array('result'=>'error', 'msg'=>'重命名操作失败!');

    if ( isset($_POST['target']) ) {

        $target = dirname(__FILE__).$_POST['target'];

    }

    if ( $_POST['rename'] ) {

        $base_name = pathinfo($_POST['rename'], PATHINFO_BASENAME);

        if ( $base_name ) {

            $rename = dirname($target).'/'.$base_name;

            $new_path = str_replace(dirname(__FILE__), '', $rename);

        }

    }

    if ( $rename && $target && rename($target, $rename) ) {

       $arr['new_name'] = $base_name;

       $arr['new_path'] = $new_path;

       $arr['msg'] = '重命名操作成功!';

       $arr['result'] = 'success';

    }

    if ( $target == __FILE__ ) {

        $arr['redirect'] = $new_path;

    }

    die(json_encode($arr));

}

//获取代码文件内容

$code = file_get_contents($curr_file);

$tree = '<ul id="dir_tree">

    <li class="dir" path="/" onclick="load()">ROOT'.list_dir($curr_file, 'html').'</li>

</ul>';

//登陆和设置密码共用模版

$first = <<<HTMLSTR

<!DOCTYPE html>

<html><head><meta charset="UTF-8">

<title>【标题】</title>

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<style type="text/css" media="screen">

body {

    overflow: hidden; background-color: #2D2D2D; color: #CCCCCC; font-size: 12px; margin: 0;

    font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;

}

form { display: none; position: absolute; }

form h5 { font-size: 14px; font-weight: normal; margin: 0; line-height: 2em; }

form input {

    color: #fff; border: 1px solid #369; border-radius: 3px; background: #333; height: 22px;

    line-height: 1.6em; width: 125px; margin-right: 5px; vertical-align: middle;

}

form button {

    line-height: 1.6em; border: 1px solid #369; border-radius: 3px;

    background: #369; color: #fff; vertical-align: middle;

}

</style>

<link rel="stylesheet" href="{$tip['core']}" />

<link rel="stylesheet" href="{$tip['css']}" />

</head>

<body>

    <form method="post">

        <input name="pwd" type="password" /><button type="submit">【动作】</button>

    </form>

    <script src="{$jquery}" type="text/javascript" charset="utf-8"></script>

    <script src="{$ace}" type="text/javascript" charset="utf-8"></script>

    <script src="{$tip['js']}" type="text/javascript"></script>

    <script type="text/javascript">

    var editor = false;

    $(function(){

        $('form').prepend('<h5>'+ document.title +'</h5>');

        $('form').css({

            left: ($(window).width()-$('form').width())/2,

            top: ($(window).height()-$('form').height())/2

        });

        $('form').show();

    });

    </script>

</body></html>

HTMLSTR;

//判断是否第一次登录

if ( false === $pwd && empty($_POST) ) {

    die(str_replace(

        array('【标题】', '【动作】'),

        array('第一次使用,请先设置密码!', '设置'),

        $first

    ));

}

//第一次设置登录密码

if ( false === $pwd && !empty($_POST) ) {

    if ( isset($_POST['pwd']) && strlen($_POST['pwd']) ) {

        $pwd = $_SESSION['pwd'] = md5($_POST['pwd'].$ace);

        $code = preg_replace('#\$pwd = false;#', '$pwd = "'.$pwd.'";', $code, 1);

        file_put_contents($curr_file, $code);

    } else {

        reload();

    }

}

//用户登录验证

if ( false !== $pwd && !empty($_POST) ) {

    $tmp = md5($_POST['pwd'].$ace);

    if ( $tmp && $pwd && $tmp === $pwd ) {

        $_SESSION['pwd'] = $pwd;

        reload();

    }

}

//处理一下html实体

$code = htmlspecialchars($code);

$dir_icon = str_replace(array("\r\n", "\r", "\n"), '',

'data:image/jpg;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAAGXRFWHRTb2Z0d2

FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQVJREFUeNqkkk1uwjAQhd84bsNP1FUXLCtu0H3XPSoX4Qrd9wR

sCjQEcIY3DiiJUYiqRhp5Mra/92YSUVVgLSW49B7H+NApRh75XkHfFoCG+02tyflUeQTw2y9UYYP8cCStc9SM

PeVA/Sy6Dw555q3au1z+EhBYk1cgO7OSNdaFNT0x5sCkYDha0WPiHZgVqPzLO+8seai6E2jed42bCL06tNyEH

AX9kv3jh3HqH7BctFWLMOmAbcg05mHK5+sQpd1HYijN47zcDUCShGEHtzxtwQS9WTcAQmJROrJDLXQB9s1Tu6

MtRED4bwsHLnUzxEeKac3+GeP6eo8yevhjC3F1qC4CDAAl3HwuyNAIdwAAAABJRU5ErkJggg==');

$file_icon = str_replace(array("\r\n", "\r", "\n"), '',

'data:image/jpg;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAAGXRFWHRTb2Z0d2

FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAS1JREFUeNqMU01KxkAMTaez7aYbNwreQdBzeopS6EXEW+jug7Z

C6X+/iUloSr6xioFHJkPee5mUJgBwT7gjpPB3XAgfiBjs5dOyLF/btl0pkEFngdbzPGNRFK/U+0hwJAAMjmcm

DsOA4zge6Pseu67DpmlEqK5rLMvyRkDJor6uq2SGktu2FfdpmpANqqoSASYnO/kthABJkoCOxCASkCBkWSYuQ

qCeNE1fqHz3fMkXzjnJ2sRinL33QBNIzWJ5nh/L8npQohVTJwYTyfFm/d6Oo2HGE8ffwseuZ1PEjhrOutmsRF

0iC8QmPibEtT4hftrhHI95JqJT/HC2JOt0to+zN6MVsZ/oZKqwmyCTA33DkbN1sws0i+Pega6v0kd42H9JB/8

LJl5I6PNbgAEAa9MP7QWoNLoAAAAASUVORK5CYII=');

$loading = str_replace(array("\r\n", "\r", "\n"), '',

'data:image/gif;base64,R0lGODlhFAAUALMIAPh2AP+TMsZiALlcAKNOAOp4ANVqAP+PFv///wAAAAAAAA

AAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAIACwAAAAAFAAUAAAEUxDJSau9iBDMteb

TMEjehgTBJYqkiaLWOlZvGs8WDO6UIPCHw8TnAwWDEuKPcxQml0Ynj2cwYACAS7VqwWItWyuiUJB4s2AxmWxG

g9bl6YQtl0cAACH5BAUKAAgALAEAAQASABIAAAROEMkpx6A4W5upENUmEQT2feFIltMJYivbvhnZ3Z1h4FMQI

Dodz+cL7nDEn5CH8DGZhcLtcMBEoxkqlXKVIgAAibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAAQASABIAAA

ROEMkphaA4W5upMdUmDQP2feFIltMJYivbvhnZ3V1R4BNBIDodz+cL7nDEn5CH8DGZAMAtEMBEoxkqlXKVIg4

HibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAAQASABIAAAROEMkpjaE4W5tpKdUmCQL2feFIltMJYivbvhnZ

3R0A4NMwIDodz+cL7nDEn5CH8DGZh8ONQMBEoxkqlXKVIgIBibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAA

QASABIAAAROEMkpS6E4W5spANUmGQb2feFIltMJYivbvhnZ3d1x4JMgIDodz+cL7nDEn5CH8DGZgcBtMMBEox

kqlXKVIggEibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAAQASABIAAAROEMkpAaA4W5vpOdUmFQX2feFIltM

JYivbvhnZ3V0Q4JNhIDodz+cL7nDEn5CH8DGZBMJNIMBEoxkqlXKVIgYDibbK9YLBYvLtHH5K0J0IACH5BAUK

AAgALAEAAQASABIAAAROEMkpz6E4W5tpCNUmAQD2feFIltMJYivbvhnZ3R1B4FNRIDodz+cL7nDEn5CH8DGZg

8HNYMBEoxkqlXKVIgQCibbK9YLBYvLtHH5K0J0IACH5BAkKAAgALAEAAQASABIAAAROEMkpQ6A4W5spIdUmHQ

f2feFIltMJYivbvhnZ3d0w4BMAIDodz+cL7nDEn5CH8DGZAsGtUMBEoxkqlXKVIgwGibbK9YLBYvLtHH5K0J0

IADs=');

//编辑器模版

$html = <<<HTMLSTR

<!DOCTYPE html>

<html><head><meta charset="UTF-8">

<title>ACE代码编辑器</title>

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<style type="text/css" media="screen">

a { text-decoration: none; }

body {

    overflow: hidden; background-color: #2D2D2D; font-size: 12px;

    font-family: 'Consolas', 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;

    scrollbar-arrow-color: #ccc; scrollbar-base-color: #333;

    scrollbar-dark-shadow-color: #00ffff; scrollbar-track-color: #272822;

    scrollbar-highlight-color: #272822; scrollbar-3d-light-color: #272822;

    scrollbar-face-color: #2D2D2D; scrollbar-shadow-color: #333;

}

::-webkit-scrollbar { width:5px; height:6px; background-color:#444; }

::-webkit-scrollbar:hover { background-color:#444; }

::-webkit-scrollbar-thumb:hover { min-height:5px; min-width:5px; background-color: #AAA; }

::-webkit-scrollbar-thumb:active { -webkit-border-radius:20px; background-color: #AAA; }

::-webkit-scrollbar-thumb {

    min-height:5px; min-width:5px; -webkit-border-radius:20px; 

    ::-webkit-border-radius:1px; background-color: #AAA;

}

body > pre { color: #666; }

#sider { margin: 0; position: absolute; top:  25px; bottom: 0; left: 0; right: 85%; }

#editor { margin: 0; position: absolute; top: 0; bottom: 0; left: 15%; right: 0; }

#dir_tree { margin:0; padding: 0; height: 100%; overflow: auto; position: relative; left: 5px; } 

#dir_tree, #dir_tree ul, #dir_tree li { margin: 0; padding: 0; list-style: none inside; }

#dir_tree ul { padding-left: 20px; position: relative; }

#dir_tree li { text-indent: 2em; line-height: 1.6em; cursor: default; color: #ccc; }

#dir_tree li.hover > span, #dir_tree li:hover > span { color: #66D9EF; }

#dir_tree li#on > span { color: red; }

#dir_tree li.dir { background: url({$dir_icon}) no-repeat 3px 3px; }

#dir_tree li.file { background: url({$file_icon}) no-repeat 3px 0; }

#dir_tree li.loading { background: url({$loading}) no-repeat 3px 0; }

#logout { position: absolute; top: 0; left: 0; }

#logout a { display: inline-block; color: #aaa; line-height: 25px; padding: 0 4px; }

#logout a:hover { background: #000; color: #ddd; }

#contextmenu { position: absolute; top: 0; left: 0; background: #fff; color: #333; border: 1px solid #000; padding: 1px; }

#contextmenu span { display: block; line-height: 24px; text-indent: 20px; width: 80px; cursor: default; }

#contextmenu span:hover { background-color: #369; color: #fff; }

#alertify .alertify-message, #alertify .alertify-message {

    text-align: left !important; text-indent: 0; font-weight: bold; font-size: 16px;

}

#alertify .alertify-dialog, #alertify .alertify-dialog {

    font-family: 'Consolas'; padding: 10px !important; color: #333 !important;

}

#alertify .alertify-button { 

    border-radius: 3px !important; font-weight: normal !important; 

    font-size: 14px !important; padding: 3px 15px !important;

}

.alertify-buttons { text-align: right !important; }

</style>

<link rel="stylesheet" href="{$tip['core']}" />

<link rel="stylesheet" href="{$tip['css']}" />

</head><body>

<div id="logout">

    <a href="javascript:void(0);">保存</a>

    <a href="javascript:void(0);">刷新</a>

    <a href="javascript:void(0);">重置</a>

    <a href="?logout">退出</a>

</div>

<div id="sider">{$tree}</div><pre id="editor">{$code}</pre>

<script src="{$jquery}" type="text/javascript" charset="utf-8"></script>

<script src="{$ace}" type="text/javascript" charset="utf-8"></script>

<script src="{$tip['js']}" type="text/javascript"></script>

<script type="text/javascript">

var load = false;

var curr_file = false;

window.location.hash = '';

alertify.set({delay: 1000}); //n秒后自动消失

alertify.set({labels: {ok:'确定',cancel:'取消'}});

var editor = false;

$(function(){

    //实例化代码编辑器

    editor = ace.edit("editor");

    //设置编辑器的语法和高亮

    editor.setTheme("ace/theme/monokai");

    editor.getSession().setMode("ace/mode/php");

    //设置编辑器自动换行

    editor.getSession().setWrapLimitRange(null, null);

    editor.getSession().setUseWrapMode(true);

    //不显示垂直衬线

    editor.renderer.setShowPrintMargin(false);

    //editor.setReadOnly(true); //设置编辑器为只读

    //editor.gotoLine(325); //跳转到指定行

    //使编辑器获得输入焦点

    editor.focus();

    //绑定组合按键

    var commands = editor.commands;

    commands.addCommand({

        name: "save",

        bindKey: {win: "Ctrl-S", mac: "Command-S"},

        exec: save_file

    });

    //保存动作

    function save_file() {

        if ( false == editor ) { return false; }

        var obj = {

            content: editor.getValue(),

            action: 'save_file'

        };

        if ( false !== curr_file ) {

            obj.file_path = curr_file;

        }

        alertify.log('正在保存...');

        $.post(window.location.href, obj, function(data){

            if ( data.msg && 'success' == data.result ) {

                alertify.success(data.msg);

            } else {

                alertify.error(data.msg);

            }

        }, 'json');

    }

    //加载目录列表或文件

    load = function(ele) {

        var curr = $(event.srcElement);

        if ( ele ) { curr = ele; }

        if ( curr.is('span') ) { curr = curr.parent('li'); }

        $('#dir_tree #on').removeAttr('id');

        curr.attr('id', 'on');

        var type = curr.attr('class');

        var path = curr.attr('path');

        window.location.hash = path;

        if ( 'file' === type ) {

            alertify.log('正在加载...');

            curr.addClass('loading');

            $.post(window.location.href, {file:path}, function(data){

                curr.removeClass('loading');

                if ( data.mode ) {

                    editor.getSession().setMode("ace/mode/"+data.mode);

                }

                //注意,空文件应当允许编辑

                if ( true || data.html ) {

                    curr.attr('disabled', 'disabled');

                    curr_file = path; //当前编辑的文件路径

                    //动态赋值编辑器中的内容

                    editor.session.doc.setValue(data.html);

                    editor.renderer.scrollToRow(0); //滚动到第一行

                    editor.focus(); //编辑器获得焦点

                    setTimeout(function(){

                        editor.gotoLine(0);

                    }, 800);

                }

            }, 'json');

            event.stopPropagation();

            event.preventDefault();

            return false;

        }

        if ( 'dir' === type ) {

            if ( curr.attr('loaded') ) {

                curr.children('ul').toggle();

                event.stopPropagation();

                event.preventDefault();

                return false;

            } else {

                curr.attr('loaded', 'yes');

            }

            alertify.log('正在加载...');

            curr.addClass('loading');

            $.post(window.location.href, {dir:path}, function(data){

                curr.find('ul').remove();

                curr.removeClass('loading');

                if ( data.html ) {

                    curr.append(data.html);

                }

            }, 'json');

        }

        return false;

    }

    //绑定右键菜单

    $('#sider').bind('contextmenu', function(e){

        var path = false;

        var target = $(event.srcElement);

        if ( target.is('span') ) {

            target = target.parent('li');

        }

        if ( target.attr('path') ) {

            path = target.attr('path');

        } else {

            return false;

        }

        target.addClass('hover');

        var right_menu = $('#contextmenu');

        if ( !right_menu.get(0) ) {

            var timer = false;

            right_menu = $('<div id="contextmenu"></div>');

            right_menu.hover(function(){

                if ( timer ) { clearTimeout(timer); }

            }, function(){

                timer = setTimeout(function(){

                    hide_menu(right_menu);

                }, 500);

            });

            $('body').append(right_menu);

        }

        if ( path ) {

            right_menu.html('');

            var menu = $('<span>新建</span><span>浏览</span><span>重命名</span><span>删除</span>');

            right_menu.append(menu);

            menu_area(right_menu, {left: e.pageX, top: e.pageY});

            right_menu.find('span').click(function(){

                switch ( $(this).text() ) {

                    case '新建' : create_new(target, path); break;

                    case '浏览' : preview(target, path); break;

                    case '重命名' : re_name(target, path); break;

                    case '删除' : del_file(target, path); break;

                }

                hide_menu(right_menu);

            });

        }

        path ? right_menu.show() : hide_menu(right_menu);

        return false;

    });

    //隐藏右键菜单

    function hide_menu(menu) {

        $('#sider li.hover').removeClass('hover');

        if ( menu ) {

            menu.hide();

        }

    }

    //右键菜单区域

    function menu_area(menu, cfg) {

        if ( menu && cfg ) {

            var w = $('#sider').width() - menu.width();

            var h = $('#sider').height() - menu.height();

            if ( cfg.left > w ) { cfg.left = w; }

            if ( cfg.top > h ) { cfg.top = h; }

            menu.css(cfg);

        }

    }

    //保存按钮

    $('#logout>a:contains("保存")').click(function(){

        save_file();

        return false;

    });

    //刷新按钮

    $('#logout>a:contains("刷新")').click(function(){

        window.location.href = window.location.pathname;

        return false;

    });

    //重置按钮

    $('#logout>a:contains("重置")').click(function(){

        alertify.confirm('是否修改 {$curr_file_path} 程序文件名?', function (e) {

            if ( !e ) { return 'cancel'; }

            re_name($('<a>'), '{$curr_file_path}');

        });

        return false;

    });

    //新建操作

    function create_new(obj, path) {

        if ( !obj || !path ) { return false; }

        alertify.prompt('请输入新建文件或文件夹名:', function (e, str) {

            if ( !e || !str ) { return false; }

            alertify.log('正在操作中...');

            $('#dir_tree #on').removeAttr('loaded').removeAttr('id');

            $.post(window.location.href, {create:str,target:path}, function(data){

                if ( data.msg && 'success' == data.result ) {

                    alertify.success(data.msg);

                    if ( obj.attr('class') == 'dir' ) {

                        load(obj); //重新加载子节点

                    } else {

                        load(obj.parent().parent());

                    }

                } else {

                    alertify.error(data.msg);

                }

            }, 'json');

        });

    }

    //浏览操作

    function preview(obj, path) {

        if ( !obj || !path ) { return false; }

        window.open(path, '_blank');

    }

    //重命名

    function re_name(obj, path) {

        if ( !obj || !path ) { return false; }

        alertify.prompt('重命名 '+path+' 为:', function (e, str) {

            if ( !e || !str ) { return false; }

            alertify.log('正在操作中...');

            $.post(window.location.href, {rename:str,target:path}, function(data){

                if ( data.msg && 'success' == data.result ) {

                    alertify.success(data.msg);

                    if ( data.redirect ) {

                        window.location.href = data.redirect;

                    }

                    if ( data.new_name ) {

                        obj.children('span').first().text(data.new_name);

                        obj.attr('path', data.new_path);

                    }

                } else {

                    alertify.error(data.msg);

                }

            }, 'json');

        });

    }

    //删除文件动作

    function del_file(obj, path) {

        if ( !obj || !path ) { return false; }

        alertify.confirm('您确定要删除:'+path+' 吗?', function (e) {

            if ( !e ) { return 'cancel'; }

            alertify.log('正在删除中...');

            $.post(window.location.href, {del:path}, function(data){

                if ( data.msg && 'success' == data.result ) {

                    alertify.success(data.msg);

                    obj.remove();

                } else {

                    alertify.error(data.msg);

                }

            }, 'json');

        });

    }

});

</script>

</body></html>

HTMLSTR;

//判断是否已经登录

if ( !is_logged() ) {

    die(str_replace(

        array('【标题】', '【动作】'),

        array('请输入您第一次设置的密码!', '登录'),

        $first

    )); 

} else {

    echo $html;

}

以上就是本文所述的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
PHP连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
php学习笔记之面向对象编程
Dec 29 PHP
基于header的一些常用指令详解
Jun 06 PHP
探讨PHP JSON中文乱码的解决方法详解
Jun 06 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
php简单socket服务器客户端代码实例
May 18 PHP
PHP概率计算函数汇总
Sep 13 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
php HTML无刷新提交表单
Apr 05 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
php数据序列化测试实例详解
Aug 12 PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 PHP
php实现ip白名单黑名单功能
Mar 12 #PHP
php操作(删除,提取,增加)zip文件方法详解
Mar 12 #PHP
PHP往XML中添加节点的方法
Mar 12 #PHP
PHP遍历XML文档所有节点的方法
Mar 12 #PHP
标准PHP的AES加密算法类
Mar 12 #PHP
php接口数据加密、解密、验证签名
Mar 12 #PHP
php查询相似度最高的字符串的方法
Mar 12 #PHP
You might like
PHP抽象类 介绍
2012/06/13 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
PHP时间处理类操作示例
2018/09/05 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
JavaScript的代码编写格式规范指南
2015/12/07 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
javascript History对象原理解析
2020/02/17 Javascript
解读python logging模块的使用方法
2018/04/17 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
python多进程重复加载的解决方式
2019/12/13 Python
如何基于Python实现数字类型转换
2020/02/07 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
《乌塔》教学反思
2014/02/17 职场文书
四年大学自我鉴定
2014/02/17 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
公司考勤管理制度
2015/08/04 职场文书
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js