基于NodeJs和ACE Editor插件實(shí)現(xiàn)簡單的mysql控制臺頁面

頁面說明

在使用NodeJs做配置管理項(xiàng)目時(shí)某弦,遇到經(jīng)常需要查詢數(shù)據(jù)页眯,現(xiàn)在使用堡壘機(jī)+跳板機(jī)查詢數(shù)據(jù)瓣窄,過于麻煩系宫,有時(shí)候僅僅是需要查簡單的使用數(shù)據(jù)索昂,那能不能在配置項(xiàng)目里寫一個簡單的數(shù)據(jù)庫查詢應(yīng)用呢?
在內(nèi)部管理項(xiàng)目中可以使用扩借,但是需要注意數(shù)據(jù)的安全性和操作權(quán)限椒惨,在此僅介紹使用bootstrap寫一個類似SQLyog的頁面,并做屏幕適配潮罪,安全性就先不展開討論康谆。

頁面demo

  • 寫好的頁面展示


    update.png

頁面分為四個部分:左側(cè)、右上嫉到、右中秉宿、右下,分別對應(yīng)數(shù)據(jù)庫表名屯碴、SQL編寫區(qū)域、控制臺按鈕膊存、控制臺結(jié)果展示

  • 頁面div布局
<div class="page-content" >
    <div class="con">
        <div class="left" >
            <ul class="list-group">
                <!-- <li class="list-group-item">
                    tbl_app
                </li>
                <li class="list-group-item">
                    <span class="badge">表</span>
                    tbl_app
                </li> -->
            </ul>
        </div>

        <div class="top" >
            <div id="editor"></div>
        </div>

        <div class="middle" >
            <div class="option">
                <button class="btn btn-primary" type="button" id="run">執(zhí)行</button>
                <button class="btn btn-danger" type="button" id="clear">清空</button>
                <button class="btn" type="buttom" id="demo">demo</button>
                <button class="btn" type="buttom" id="demo2">demo2</button>
                <button class="btn btn-danger" type="button" id="clear_console">清空控制臺</button>
            </div>
        </div>

        <div class="bottom" contenteditable="true">
            <span style="color: #6b6b6a;">console:</span>
            <span style="color: #6b6b6a;">F8-執(zhí)行命令</span>
            <table>
                <tr>
                    <th></th>
                </tr>
                <tr>
                    <td></td>
                </tr>
            </table>
        </div>
    </div>
</div>
  • 左側(cè)表名稱從數(shù)據(jù)庫加載
// 查詢所有表名
    $.ajax({
        url: '/page/queryData',
        type:'post',
        dataType:'json',
        data:JSON.stringify({"sql":"show tables;"}),
        contentType:"application/json",
        success:function(data){
            if(data.success){
                $('.left .list-group').html(createLeftTable(data.data) );
            }
        }
        ,error:function(e){
            console.log(data);
        }
    });
    //創(chuàng)建左側(cè)表li
    function createLeftTable(data){
        var lis_html = '';
        if( data.length > 0 ){
            for(var i = 0; i < data.length ; i++){
                var item = data[i];
                if(i == 0){
                    $.each(item, function(k) {
                        lis_html = lis_html + '<li class="list-group-item">' + k + '</li>';
                    });
                }
                $.each(item, function(k) {
                    lis_html = lis_html + '<li class="list-group-item"><span class="badge">表</span>' + item[k] + '</li>';
                });
            }

        }
        return lis_html;
    }
    ace.require("ace/ext/language_tools");
    var editor = ace.edit("editor");
    editor.setTheme("ace/theme/monokai");
    editor.getSession().setMode("ace/mode/sql");
  • 執(zhí)行按鈕js
$('.option #run').click(function(){ // 執(zhí)行
        var sql = editor.getValue().trim();
        console.log("sql = " + sql);
        if( !sql || '' == sql){
            $('.bottom').append('<br>請輸入執(zhí)行內(nèi)容:');
            return false;
        }
        $.ajax({
            url: '/page/queryData',
            type:'post',
            dataType:'json',
            data:JSON.stringify({"sql":sql}),
            contentType:"application/json",
            success:function(data){
                if(data.success){
                    $('.bottom').html(parseJson(data.data) );
                }
                App.unblockUI('#def-form-save .modal-content');
            }
            ,error:function(e){
                console.log(data);
                App.unblockUI('#def-form-save .modal-content');
            }
        });
    });
  • 右下是使用table簡單封裝了數(shù)據(jù)
    function parseJson(data){
        console.log(typeof data);
        console.log(data.length);
        console.log(data);
        var table_html = '<table class="console-tab">';
        if( data.length > 0 ){
            for(var i = 0; i < data.length ; i++){
                var item = data[i];
                if(i == 0){
                    table_html += '<tr>';
                    $.each(item, function(k) {
                        console.log(k);
                        table_html = table_html + '<th>'+ k +'</th>';
                    });
                    table_html += '</tr>';
                }
                table_html += '<tr>';
                $.each(item, function(k) {
                    table_html = table_html + '<th>'+ item[k] +'</th>';
                });
                table_html += '</tr>';

            }

        }else{
            if(data.affectedRows){
                table_html = '受影響的行數(shù):' + data.affectedRows;
            }else{
                //其他情況
                table_html = JSON.stringify(data);
            }
            
        }

        return table_html;
    }
  • 其他按鈕事件和F8鍵盤事件
    // 按鍵捕捉事件
    document.onkeydown=function(event){
        var e = event || window.event || arguments.callee.caller.arguments[0];
        console.log(e.keyCode);
        if(e && e.keyCode==119){ // F8 鍵
            $('.option #run').click();
        }
    };

    $('.option #clear').click(function(){ // 清空
        editor.setValue("");
    });

    $('.option #demo').click(function(){ // demo
        editor.setValue("SELECT * FROM `tbl_app`;");
    });
    $('.option #demo2').click(function(){ // demo
        editor.setValue("SELECT * FROM `tbl_server`;");
    });

    $('.option #clear_console').click(function(){ // demo
        $('.bottom').html('');
    });
  • 頁面的樣式說明
* {margin:0; padding:0;}

.page-content-wrapper .page-content {
    padding: 0;
    background: #3b3c39;
}
.page-header-fixed .page-container {
    margin-top: 30px;
}

/* 判斷屏幕寬度 */ 
@media screen and (max-height: 1080px) { 
.page-content-wrapper .page-content {min-height: 850px ! important;}  
}
@media screen and (max-height: 768px) { 
.page-content-wrapper .page-content {min-height: 680px ! important;}  
}

.con{
    width: 100%;
}
/* 判斷屏幕寬度 */ 
@media screen and (max-height: 1080px) { 
.con {height: 820px;}  
}
@media screen and (max-height: 768px) { 
.con {height: 650px;}  
}

.con .left, .top, .middle, .bottom{
    float: left;
    
}
.con .left{
    width: 15%;
    height: 100%;
    background: #393a36;
    color: #c0c1bc;
}
.con .left .list-group-item{
    background: #393a36;
    color: #c0c1bc;
    border-color: #4c4646;
}
.con .top{
    width: 85%;
    height: 60%;
    
}
.con .middle{
    width: 85%;
    height: 5%;
    background: #393a36;
    color: #c0c1bc;
    
}
.con .bottom{
    width: 85%;
    height: 38%;
    margin-bottom: 0;
    background: #272822;
    color: #c0c1bc;
    border-top: 1px solid black;
    overflow: auto;
}
.left-ul li{
    list-style: none;
    border:0.1px solid #9e9393;
    margin: 0;
}

#editor{ 
    width: 100%;
    height: 100%;
    
}

.console-tab tr{
    border: 1px solid black;
}
.console-tab tr th,td{
    padding-left: 6px;
}
.option button{
    margin: 3px 0 0 5px;
}

使用@media判斷屏幕的大小并選擇合適的css進(jìn)行不同大小的屏幕適配
簡單適配了筆記本的14寸屏幕和臺式機(jī)的1080p大屏幕

  • 寫查詢sql并執(zhí)行导而,顯示結(jié)果


    select.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隔崎,隨后出現(xiàn)的幾起案子今艺,更是在濱河造成了極大的恐慌,老刑警劉巖爵卒,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虚缎,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)实牡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門陌僵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人创坞,你說我怎么就攤上這事碗短。” “怎么了题涨?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵偎谁,是天一觀的道長。 經(jīng)常有香客問我纲堵,道長巡雨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任席函,我火速辦了婚禮铐望,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘向挖。我一直安慰自己蝌以,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布何之。 她就那樣靜靜地躺著跟畅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溶推。 梳的紋絲不亂的頭發(fā)上徊件,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音蒜危,去河邊找鬼虱痕。 笑死,一個胖子當(dāng)著我的面吹牛辐赞,可吹牛的內(nèi)容都是我干的部翘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼响委,長吁一口氣:“原來是場噩夢啊……” “哼新思!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赘风,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤夹囚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邀窃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荸哟,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鞍历。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舵抹。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堰燎,靈堂內(nèi)的尸體忽然破棺而出掏父,到底是詐尸還是另有隱情,我是刑警寧澤秆剪,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布赊淑,位于F島的核電站,受9級特大地震影響仅讽,放射性物質(zhì)發(fā)生泄漏陶缺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一洁灵、第九天 我趴在偏房一處隱蔽的房頂上張望饱岸。 院中可真熱鬧,春花似錦徽千、人聲如沸苫费。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽百框。三九已至,卻和暖如春牍汹,著一層夾襖步出監(jiān)牢的瞬間铐维,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工慎菲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫁蛇,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓露该,卻偏偏與公主長得像睬棚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子解幼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容