實(shí)用小工具(持續(xù)更新)

JWT##


一種可以把token保存在cookie中的前端會話解決方案。相對于傳統(tǒng)的session,它有效的減輕了后端的存儲和隨之而來的增刪改查的壓力。但相應(yīng)的,由于是保存在前端cookie中,處于對其安全性的考量,加密/解密的過程會帶來一定的服務(wù)器壓力。
其構(gòu)成分為三部分:
header

{ typ:"jwt", alg:"HS256" }

可以看出,頭部用來保存兩個(gè)信息:token的類型和其加密的算法。
claims(payload)

{
    iss:"temp.com",
    sub:"uid123",
    exp:"123456789",
    iat:"123456789",
    jtd:"hiy5td656fifs85yd"
}

jwt的實(shí)體,保存了這個(gè)jwt的發(fā)布者(iss),其實(shí)就是這個(gè)站點(diǎn)標(biāo)識;操作的對象,也稱之為這個(gè)jwt的主題(sub),我在操作的時(shí)候保存的是用戶id,不過鑒于其json的數(shù)據(jù)存儲形式,我覺得直接保存用戶對象也何嘗不可(以后可以嘗試一下)。既然描述的是主題,那么意味著這其中也應(yīng)當(dāng)填寫操作的動詞(究竟干了什么);這個(gè)jwt的創(chuàng)建時(shí)間(iat)和過期時(shí)間(exp),這個(gè)沒什么好說的,但是后端的過期邏輯得注意一點(diǎn),不然時(shí)間間隔太久,這一塊的測試工作可能會遺漏(我就是,寫了兩塊登陸狀態(tài)的判斷邏輯,結(jié)果其中一塊有bug,直接導(dǎo)致流程來回跳轉(zhuǎn)不停,一邊提示未登錄,一邊提示已登陸);由于我是使用的jwt模塊,所以未給出jtd(jwt的id)這個(gè)參數(shù),可能模塊幫助我生成了(官網(wǎng)上我已經(jīng)找不到這個(gè)字段的說明了)。
signature

    const sig = [
        encode(header),
        encode(claims)
    ].join(".");
    const signature = identifiedAlg(sig + secret);

有效性驗(yàn)證塊,一般拿前面兩塊的encode字段配合服務(wù)器給出的secret的標(biāo)識同時(shí)加密所得,主要用于jwt的惡意篡改。
組合
三塊內(nèi)容各自按照指定算法加密之后,用"."字符連接起來作為jwt發(fā)送給客戶端。在客戶端中,jwt會已httponly的狀態(tài)保存在cookie中(httponly:無法通過js訪問和修改),每次向指定站點(diǎn)發(fā)送請求的時(shí)候(一般也是這個(gè)jwt的發(fā)布者),這個(gè)jwt都會寫在請求頭中發(fā)送給服務(wù)器做數(shù)據(jù)驗(yàn)證。

dataTable##


一個(gè)基于jquery的表格拓展工具,支持多種動態(tài)表格功能的使用和開發(fā),高度自定義選項(xiàng)。不過需要引用自己指定的jquery(用前端框架的話),因而會對其他前端工具有覆蓋,建議獨(dú)立出去,然后再以模塊的形式引入。
使用過程很簡單,首先需要在頁面定義一個(gè)table,并提供一種方式訪問:

<table id="dataTable" class="display">
    <thead>
        <tr>
            <td>id</td>
            <td>名字</td>
            <td>單位</td>
        </tr>
    </thead>
</table>

之后調(diào)用dataTable為jquery添加的接口dataTable/DataTable即可,當(dāng)然,如果使用的是前端框架,則需要保證在生成頁面之后調(diào)用接口。

    $("#dataTable").DataTable();

dataTable提供了兩個(gè)版本的接口(dataTable和DataTable),兩者的不同之處在于其返回值,dataTable返回的是$("#dataTable"),而DataTable返回的是表的API,可以用來做一些特殊的修改,之后我們會用到。

這樣操作完之后,應(yīng)該就能在頁面上顯示一個(gè)0參數(shù)的dataTable表格了。
表格的作用是用來呈現(xiàn)數(shù)據(jù),dataTable允許我們直接把數(shù)據(jù)填寫進(jìn)表格中,或者定義成js數(shù)組,但這在實(shí)際生產(chǎn)過程中是不太現(xiàn)實(shí)的。絕大多數(shù)的數(shù)據(jù)都會以ajax請求返回值的形式發(fā)送給dataTable,因此,我們需要在調(diào)用接口的時(shí)候給出指定的參數(shù)

    $("#dataTable").DataTable({
        ajax: "/json/data.txt"
    });

這樣,我們就可以獲取到本地服務(wù)器靜態(tài)目錄json下的data.txt文件了。這里除了填寫url之外,我們還可以填寫完整的ajax參數(shù)表,即

    $("#dataTable").DataTable({
        ajax: {
            url: "/json/data.txt",
            data: {
                from: 0,
                to: -1,
            }
        }
    });

dataTable的ajax和jquery的基本一樣,但是有個(gè)參數(shù)需要特別注意,即dataSrc,這個(gè)參數(shù)的意義在于指定這個(gè)返回值的key,比如一般的json返回為:{data: [...]},那么這時(shí)候就需要指定dataSrc為"data"了。當(dāng)然如果不指定,dataSrc的默認(rèn)值就是"data";如果沒有鍵值,則指定空字符串;如果返回的是XML格式,也可以將dataSrc定義為函數(shù)function(json) { ... }以便進(jìn)行轉(zhuǎn)化。

在ajax中也可以定義success用于接受傳過來的結(jié)果,不過這貌似會替換dataTable自身的處理函數(shù),所以可以用success檢測返回值正不正確,但檢測完畢之后應(yīng)當(dāng)將處理權(quán)交由dataTable。

數(shù)據(jù)收到后第二步就是應(yīng)該做項(xiàng)綁定了,傳統(tǒng)的ejs方式是做一個(gè)循環(huán),根據(jù)數(shù)據(jù)的多少生成多少tr。dataTable提供了列綁定的功能,可以處理簡單的數(shù)據(jù)填充

    //  假設(shè)返回的數(shù)據(jù)是 
    //  { data: [ { id: 123, name: "張三", company: [ { name: "煎餅果子學(xué)院" } ] } ] }
    $("#dataTable").DataTable({
        ajax: "/json/data.txt",
        columns: [
            {data: "id"},
            {data: "name"},
            {data: "company.0.name"}
        ]
    });

這里,數(shù)據(jù)是按照列數(shù)組的順序依次綁定的,我們這邊還演示了嵌套對象和嵌套數(shù)組的處理方法。
數(shù)據(jù)如果都是這樣依次填入的,那我們的工作會很輕松。但實(shí)際需求往往會復(fù)雜的多:比如想在每行表格的最后一個(gè)表格顯示一組操作按鈕、比如在第一列設(shè)定自增長的行ID、比如某列數(shù)據(jù)是結(jié)果中幾個(gè)參數(shù)共同計(jì)算的結(jié)果。面對那樣的情況,簡單的列指定是不夠的,因此dataTable提供了createdRow回調(diào)函數(shù)來讓我們在數(shù)據(jù)填充完之后,對每行數(shù)據(jù)進(jìn)行進(jìn)一步的修改

    $("#dataTable").DataTable({
        ajax: "/json/data.txt",
        columns: [
            {data: "id"},
            {data: "name"},
            {data: "company.0.name"}
        ],
        createdRow: (row, data, index) => {
            const td0 = $("td", row).eq(0);
            td0.html(index);

            const td4 = $("td", row).eq(4);
            td4.html("");
            td4.append("<button>操作</button>");

            const td3 = $("td", row).eq(3);
            const staffNum = data.company[0].managers.length + data.company[0].workers.length;
            td3.html(String(staffNum));
        }
    });

隨著jquery的介入,表格的排版可以變得異常靈活。
行的修改我們用createdRow,表其他部分的修改怎么辦呢?比如修改表頭。這里我們使用initComplete屬性(在初始化完成之后),下面這個(gè)例子就是為表頭添加下拉列表:

initComplete: (settings, json) => {
    //  還記得之前說過的dataTable()和DataTable()的區(qū)別嗎?這里的話如果之前
    //  初始化時(shí)用的是DataTable,則其返回值就是api
    const api = $("#dataTable").dataTable().api();
    api.columns().indexes().flatten().each((i) => {

        //  用于指定列的表頭生成下拉列表,如果不加這個(gè)判斷,則所有的th都會包含過濾用的下拉列表
        if (i !== 2) { return; }
        const column = api.column(i);

        //  這里就是jquery表現(xiàn)的時(shí)候了,我們往這個(gè)列的列頭中append一個(gè)select
        const select = $("<select><option value=''></option></select>")
            .appendTo($(column.header()))
            .on("change", (event) => {
                //  如果下拉表發(fā)生了變化,則把選中的項(xiàng)的value作為查詢的key組裝成正則表達(dá)式
                //  交給列查詢之后重繪
                const vlu = $.fn.dataTable.util.escapeRegex($(event.target).val());
                column.search(vlu ? "^" + vlu + "$" : "", true, false).draw();
            });

        //  對該列的數(shù)據(jù)做group篩選掉重復(fù)的,然后排序之后插入select
        column.data().unique().sort().each((d, j) => {
            select.append("<option value='" + d + "'>" + d + "</option>");
        });
    });
}

這個(gè)例子相對復(fù)雜,但通過它,可以有很多拓展的方向。initComplete函數(shù)意味著在表繪制完成之后可以進(jìn)行很多操作(雖然之后用jquery選擇器也可以,但從整體的角度來看,在這里面寫比較合理);下拉列表可以對列進(jìn)行操作,那么意味著我們也可以設(shè)置其他空間來對列里的項(xiàng)進(jìn)行整體操作。
至此,對表,我們可以做到隨意修改了。但同時(shí)會發(fā)現(xiàn),除了表,dataTable會幫我們生成一些其他組件:每頁顯示的項(xiàng)數(shù)、查找框、信息、分頁。這些東西也可以通過設(shè)置初始化參數(shù)來操作,我們可以分配給dataTable一個(gè)dom屬性,該屬性是一個(gè)字符串,dataTable的設(shè)計(jì)者開發(fā)了一組簡易的組件標(biāo)識,然后配合類似于xml的結(jié)構(gòu)組裝起來,便可以對表以及表四周的這一套組件進(jìn)行定位了

    //  <> - 代表一個(gè)div,可以指定類和id,id的指定和jquery一樣:#id,不同的是類,
    //    類單獨(dú)存在的時(shí)候,類不需要在類名前加【.】
    //  l - Length changing 每頁顯示多少條數(shù)據(jù)選項(xiàng)
    //  f - Filtering input 搜索框
    //  t - The Table 表格
    //  i - Information 表格信息
    //  p - Pagination 分頁按鈕
    //  r - pRocessing 加載等待顯示信息
    
    //  最近寫的dataTable模板用的dom(左上角指定id的div是用來存放新建按鈕的)
    dom: "<'row'<'#btnCreateBtn.col-md-1'><lf>><'row'rt><'row'p>"

可以選擇dataTable是否生成某些組件,也可以綁定監(jiān)聽組件的觸發(fā)事件

    //  是否生成組件的選項(xiàng)(設(shè)置true/false)
    //  paging:分頁
    //  ordering:表頭排序
    //  info:表信息
    //  searching:查找
    //  lengthChange:頁長

    //  組件事件(用on來監(jiān)聽,表相關(guān)的需要追加dt命名空間)
    //  page:翻頁事件
    //  length:選擇單頁顯示的項(xiàng)數(shù)
    //  search:查找框變化事件
    //  processing:請求過程中間事件
    table.on("search.dt", (e, settings) => {
        console.log(table.search());
    });

bootstrap-datepicker##

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評論 2 379

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