使用jQueryGantt實現進度甘特圖

??由于項目需要,需要做一個進度甘特圖。要求使用jQueryGantt來實現啄刹,在網上看了很多博客忆嗜,終于找了幾篇比較有用的。但是僅僅靠這幾篇文章和一個demo無法滿足項目的需求淑玫,所以研究了下jQueryGantt的源碼巾腕,根據項目需求進行了一些改動。由于網上對于jQueryGantt的文章較少絮蒿,很多都不完整尊搬,所以特此寫下這篇文章進行記錄,順便分享有需要的人土涝。

1.jQueryGantt下載

官方演示地址:http://taitems.github.io/jQuery.Gantt
我此次使用的是Github上一位網友發(fā)布的一個版本:https://github.com/ybx13579/jQuery.Gantt
這是他寫的一份指南:https://blog.csdn.net/yangbingx/article/details/73470030
非常感謝佛寿,大家喜歡的記得給他一個star。

2.運行

這里的說明并不是很詳細但壮,具體參考test1文件夾中的index.html
將css冀泻,js,img放入工程項目中蜡饵,并參考test1/index.html 中的引入弹渔。

注:如果需要甘特圖中顯示中文,則需要在js文件引用中加上charset特性并設置為GB2312溯祸,否則中文內容將顯示為亂碼肢专。
<script src="js/jquery.fn.gantt.js" charset ="GB2312"></script>

之后在html頁面上寫一個div

   <style type="text/css">
        body {
            font-family: Helvetica, Arial, sans-serif;
            font-size: 13px;
            padding: 0 0 50px 0;
        }

        .contain {
            width: 800px;
            margin: 0 auto;
        }
    </style>


    <div class="gantt_ot" style="width:800px; margin:100px auto;">
        <div class="gantt"></div>
    </div>

復制相應的js方法

<script type="text/javascript">
    $(function () {
        var sourceData;
        $.ajax({
            url: "/test/getGanttData", //請求后臺,并返回甘特圖需要的json數據
            type: "post",
            dataType: "json",
            cache: false, //關閉AJAX緩存
            data: {"id": 1}, //傳入的查詢參數
            success: function (data) {

                //初始化gantt
                $(".gantt").gantt({
                    source: data,
                    navigate: 'scroll',//// 底部使用拖拽的刻度尺還是按鈕:scroll和buttons
                    scale: "weeks",// 這里是設置默認比例焦辅。這里總共有四個參數:months  weeks days  hours.
                    maxScale: "months", // 這里是設置最大比例博杖。這里總共有四個參數:months  weeks days  hours.
                    minScale: "days", // 這里是設置最小比例。這里總共有四個參數:months  weeks days  hours.
                    itemsPerPage: 20, //設置甘特圖每頁顯示多少條
                    onItemClick: function (data) {//有數據范圍內的點擊事件
                        // alert("Item clicked - show some details");
                    },
                    onAddClick: function (dt, rowId) {//無數據范圍內的點擊事件
                        // alert("Empty space clicked - add an item!");
                    },
                    onRender: function () {//渲染事件
                        if (window.console && typeof console.log === "function") {
                            // console.log("chart rendered");
                        }
                    }
                });
            }
        });

        /*  //彈窗功能
          $(".gantt").popover({
              selector: ".bar",
              title: "I'm a popover",
              content: "And I'm the content of said popover.",
              trigger: "hover",
              placement: "auto right"
          });*/

        //prettyPrint();
    });


</script>

JQueryGantt需要的Json數據格式

[

                {
                    name: "task1",
                    desc: "",
                    values: [{
                        from: "/Date(1320192000000)/", //這里需要的時間為毫秒
            //筷登。計算方式為時間變量減去時間初始值(1970-1-1)的差值換算為毫秒
                          to: "/Date(1320592000000)/",
                        label: "這是label",
                        customClass: "ganttRed" //這里是這條記錄的在甘特圖上的顏色
                    }]
                }, {
                    name: "task2",
                    desc: "這是描述",
                    values: [{
                        from: "/Date(1322611200000)/",
                        to: "/Date(1323302400000)/",
                        label: "",
                        customClass: "ganttGreen"
                    }]
                }]

如果你是使用的Java來編寫的話剃根,我這里提供一下后臺處理json數據的思路。
首先仆抵,最外層的是一個List集合跟继。然后里面的name,desc,values使用Map進行封裝。而values里面又是一個集合镣丑,所以values整個呢誒容是一個List集合舔糖。而內部的from,to,label等參數又需要使用Map以[key,value]的形式保存。所以又要封裝一個Map莺匠。

靈魂畫手已上線
image.png

看了看自己畫的圖金吗,還是貼代碼吧。。摇庙。

//SpringMvc Framwork
@RequestMapping(value = "ganttData", method = RequestMethod.POST)
    @ResponseBody
    public String ganttData(String id) throws Exception {
          //查詢出需要的多條進度數據
            List<Project> scheduleDataList = scheduleMgrService.selectScheduleDataListByPid(pt);
            //用于保存整個數據集
            List<Object> dataList = new ArrayList<>();
            //循環(huán)遍歷旱物,對數據進行重新封裝
            for (ScheduleData data : scheduleDataList) {
               //用于存放 name,desc,value三個對象
                Map<String, Object> planItemMap = new HashMap<>();
                planItemMap.put("name", data.getSd_process_name() + "(計劃)");
                planItemMap.put("desc", data.getSd_plan_remark());
                //用于存放value中的from,to,label,customClass
                Map<String, Object> valueMap = new HashMap<>();
                valueMap.put("from", "/Date(" + data.getSd_plan_start_date().getTime() + ")/");
                valueMap.put("to", "/Date(" + data.getSd_plan_end_date().getTime() + ")/");
                valueMap.put("label", "");
                valueMap.put("customClass", "ganttRed");
                //將封裝的value的map封裝到一個List集合中去
                List<Object> planValueList = new ArrayList<>();
                planValueList.add(valueMap);
                //將封裝的value List集合添加到保存整個數據集的List里面去
                planItemMap.put("values", planValueList);
                dataList.add(planItemMap);
                }
          //將封裝的數據集轉換為Json數組
           JSONArray array = JSONArray.fromObject(dataList);
            //將Json數組轉換為字符串并返回給前端
            return array.toString();
}
jQueryGantt.jpg

3.修改jQueryGantt的核心文件來滿足項目的需求

問題:

下載的Demo中的jQueryGantt是一個寬度為800px的甘特圖,但是項目中需要將甘特圖橫向鋪滿卫袒,所以必須將寬度設置為100%宵呛。但是jQueryGantt頂部的時間刻度是根據數據的時間長度生成的,在數據時間比較短并且在橫向鋪滿屏幕的情況下就會出現時間刻度不全的情況夕凝。


image.png

當我只修改了div的寬度為自動或者100%的時候出現了上述情況宝穗。

    <div class="gantt_ot" style="width:auto; margin:100px auto;">
        <div class="gantt"></div>
    </div>

解決方法:

我不得不說,為了找到這個解決辦法码秉,我花了三個小時來閱讀逮矛,調試,修改這個jquery.fn.gantt.js來解決這個問題转砖。(可能是自己太菜了 2333333)须鼎。

(敲黑板) 重點來了~~
思路:空出來的地方用一年的刻度時間應該能填滿,所以只要將jQueryGantt根據數據中的結束時間計算刻度尺長度的時間追加一年府蔗,就會多出一年的刻度時間出來晋控。
打開jquery.fn.gantt.js
找到getMaxDate這個function
在所有的getFullYear()方法后面都追加一個 +1
maxDate.getFullYear()+1

貼出修改后的maxDate方法
// Return the maximum available date in data depending on the scale
//根據比例返回數據中的最大可用日期。
    getMaxDate: function (element) {
                var maxDate = null;
                $.each(element.data, function (i, entry) {
                    $.each(entry.values, function (i, date) {
                        maxDate = maxDate < tools.dateDeserialize(date.to) ? tools.dateDeserialize(date.to) : maxDate;
                    });
                });
                maxDate = maxDate || new Date();
                var bd;
                switch (settings.scale) {
                    case "hours":
                        maxDate.setHours(Math.ceil((maxDate.getHours()) / element.scaleStep) * element.scaleStep);
                        maxDate.setHours(maxDate.getHours() + element.scaleStep * 3);
                        break;
                    case "weeks":
                        // wtf is happening here?
                        bd = new Date(maxDate.getTime());
                        bd = new Date(bd.setDate(bd.getDate() + 3 * 7));
                        var md = Math.floor(bd.getDate() / 7) * 7;
                        maxDate = new Date(bd.getFullYear() + 1, bd.getMonth(), md === 0 ? 4 : md - 3);
                        break;
                    case "months":
                        bd = new Date(maxDate.getFullYear() + 1, maxDate.getMonth(), 1);
                        bd.setMonth(bd.getMonth() + 2);
                        maxDate = new Date(bd.getFullYear() + 1, bd.getMonth(), 1);
                        break;
                    case "days":
                    /* falls through */
                    default:
                        maxDate.setHours(0);
                        maxDate.setDate(maxDate.getDate() + 3);
                }
                return maxDate;
            },

這時你再刷新一下頁面就會發(fā)現空白部分的網格和時間刻度被填上了礁竞。像這個樣子


image.png

4.小優(yōu)化

雖然最麻煩的問題得以解決糖荒。但是用戶體驗上還存在一些可以優(yōu)化的地方,例如:月份為英文模捂,星期為英文捶朵,底部的控件沒有居中,這樣用戶感覺不太好狂男。接下來我們逐一解決這些問題综看。

1.修改英文月份和周為中文。

打開jquery.fn.gantt.js
找到var settings這個變量的定義的地方岖食,這里是jQueryGantt初始化參數的位置红碑。

//Default settings 默認設置
var settings = {
            source: [],
            holidays: [],
            // 默認的頁數
            itemsPerPage: 7,
            // localisation
            // dow: ["S", "M", "T", "W", "T", "F", "S"],
            //面板上的星期,只能為一個字泡垃,兩個字會被擠出來
            dow: ["日", "一", "二", "三", "四", "五", "六"],
            //面板上的月份
            months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
          //甘特圖在渲染的時候顯示的提示文字
            waitText: "加載中析珊,請稍候...",
            // 底部使用拖拽的刻度尺還是按鈕:scroll和buttons
            navigate: "buttons",
            //網格加載完畢后是否自動滾動到今天,true為是 false為不需要
            scrollToToday: false,
            // cookie options
            useCookie: false,
            cookieKey: "jquery.fn.gantt",
            // scale parameters
            scale: "days",
            maxScale: "months",
            minScale: "hours",
            // callbacks
            onItemClick: function (data) {
                return;
            },
            onAddClick: function (dt, rowId) {
                return;
            },
            onRender: $.noop
        };
2.底部的控件居中

打開jQueryGantt的style.css

.gantt {
    width: 100%;
    margin: 0 auto; //清除掉上下間距
    border: 14px solid #ddd;
    position: relative;
    -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
        border-radius: 6px;
  -webkit-box-sizing: border-box;
   -moz-box-sizing: border-box;
        box-sizing: border-box;
}

//設置底部控件位置(前端技術有限蔑穴,就這樣簡單的處理了一下)
.nav-slider {
    margin-left: 20%;
}
修改完后的效果圖

到此為止忠寻,我的問題基本上都解決了~

參考文章:
https://blog.csdn.net/yangbingx/article/details/73470030
https://github.com/ybx13579/jQuery.Gantt
https://blog.csdn.net/weixin_41916005/article/details/80851748
https://blog.csdn.net/weixin_41916005/article/details/80851748
https://www.cnblogs.com/marksfly/p/4561165.html
https://blog.csdn.net/l3922768721/article/details/79933327
http://taitems.github.io/jQuery.Gantt/?yyue=a21bo.50862.201879
https://github.com/ybx13579/jQuery.Gantt

轉載請注明出處及作者,謝謝存和。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末奕剃,一起剝皮案震驚了整個濱河市衷旅,隨后出現的幾起案子,更是在濱河造成了極大的恐慌纵朋,老刑警劉巖柿顶,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異操软,居然都是意外死亡嘁锯,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門聂薪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猪钮,“玉大人,你說我怎么就攤上這事胆建。” “怎么了肘交?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵笆载,是天一觀的道長。 經常有香客問我涯呻,道長凉驻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任复罐,我火速辦了婚禮涝登,結果婚禮上,老公的妹妹穿的比我還像新娘效诅。我一直安慰自己胀滚,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布乱投。 她就那樣靜靜地躺著咽笼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪戚炫。 梳的紋絲不亂的頭發(fā)上剑刑,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音双肤,去河邊找鬼施掏。 笑死,一個胖子當著我的面吹牛茅糜,可吹牛的內容都是我干的七芭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼限匣,長吁一口氣:“原來是場噩夢啊……” “哼抖苦!你這毒婦竟也來了毁菱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤锌历,失蹤者是張志新(化名)和其女友劉穎贮庞,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體究西,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窗慎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了卤材。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遮斥。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扇丛,靈堂內的尸體忽然破棺而出术吗,到底是詐尸還是另有隱情,我是刑警寧澤帆精,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布较屿,位于F島的核電站,受9級特大地震影響卓练,放射性物質發(fā)生泄漏隘蝎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一襟企、第九天 我趴在偏房一處隱蔽的房頂上張望嘱么。 院中可真熱鬧,春花似錦顽悼、人聲如沸曼振。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拴测。三九已至,卻和暖如春府蛇,著一層夾襖步出監(jiān)牢的瞬間集索,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工汇跨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留务荆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓穷遂,卻偏偏與公主長得像函匕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚪黑,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評論 25 707
  • 用兩張圖告訴你盅惜,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料中剩? 從這篇文章中你...
    hw1212閱讀 12,693評論 2 59
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準抒寂。 注意:講述HT...
    kismetajun閱讀 27,424評論 1 45
  • 年末的集市最熱鬧结啼。 年就像一位已經定了婚期的待嫁閨女一樣,需要置辦嫁妝屈芜,從頭換到腳郊愧,從里換到外,這買年貨就像置辦嫁...
    靜篤流年閱讀 414評論 10 7
  • 有一憐人兮井佑,流落他鄉(xiāng) 影只形單兮属铁,滿懷惆悵 涕淚縱橫兮,情滿隴上 問何所傷兮躬翁,唯念家鄉(xiāng) 家之所在兮焦蘑,遙指北方
    無謂的穿行者zr閱讀 189評論 0 0