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(1) php开发环境配置
Feb 15 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
PHP 设计模式之观察者模式介绍
Feb 22 PHP
php画图实例
Nov 05 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
Jun 17 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
PHP PDOStatement::fetch讲解
Jan 31 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
11个PHP 分页脚本推荐
2011/08/15 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
微信红包随机生成算法php版
2016/07/21 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
python中模块查找的原理与方法详解
2017/08/11 Python
详解Python with/as使用说明
2018/12/13 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
入党自我鉴定范文
2013/10/04 职场文书
工程地质勘察专业大学生求职信
2013/10/13 职场文书
2014年大学生自我评价
2014/01/19 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
安全月活动总结
2014/05/05 职场文书
创优争先心得体会
2014/09/11 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL
如何利用python实现Simhash算法
2022/06/28 Python