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显示MySQL数据的三种方法
Jun 05 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 PHP
php常用的url处理函数总结
Nov 19 PHP
简单谈谈favicon
Jun 10 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
thinkphp框架下实现登录、注册、找回密码功能
Apr 06 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
详解PHP序列化和反序列化原理
Jan 15 PHP
YII框架关联查询操作示例
Apr 29 PHP
Yii框架常见缓存应用实例小结
Sep 09 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学习笔记 数组遍历实现代码
2011/06/09 PHP
php文件操作实例代码
2012/05/10 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
vuejs实现标签选项卡动态更改css样式的方法
2018/05/31 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
简单了解Django项目应用创建过程
2020/07/06 Python
Django数据统计功能count()的使用
2020/11/30 Python
开办大学饮食联盟创业计划书
2014/01/29 职场文书
幼儿教师研修感言
2014/02/12 职场文书
公务员诚信承诺书
2014/05/26 职场文书
活动总结结尾怎么写
2014/08/30 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
领导欢迎词致辞
2015/01/23 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书