92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

首頁

如何復制網頁上不能復制的文本!!!

seo達人

   我們經常需要引用(白嫖)一些網頁上的文字,但是豆丁網,百度文庫等等設置的有復制權限,我們無法直接復制,或者復制文字有上限,提示付費。

    這里介紹幾種,都是些花里胡哨的白嫖方案:

1.手機掃描:

    拿著手機,用手機QQ的文字掃描直接去識別問題,遇上好識別的文章短的直接就識別,但是這種方法遇到文章比較長的就十分麻煩??梢葬槍δ切┻x中



2.魔鬼牽引:

    原來在計蒜客就這樣搞,選中網站上的文字,然后用鼠標一直拖到別的頁面,或者一個記事本什么的,屢試不爽。



3.側邊翻譯:

    側邊翻譯,火狐或者谷歌下載一些插件,比如說側邊翻譯,這個東西小巧玲瓏,選中文字側邊翻譯之后你就可以對文本進行復制了。



4.原始查看法:

    在瀏覽器中直接F12,打開瀏覽器查看,就下面這個東西,瀏覽器你要復制的文本就在這里面,里面封裝的html語言,你可以搜索你需要找的文字,然后可以直接復制,如果想要復制多一點你也可以直接把里面的html語言拿出來解析到自己的網頁里面,然后再進行復制。





5.氪金法:

    沒別的,充錢就完事了。



6.某巨巨提供:

    下載一個ocr工具,類似qq掃描的功能。






詳解函數和變量的聲明提升

seo達人

詳細解讀—函數和變量的聲明提升

一 - 聲明提升常見面試題

?我們先以幾道面試題開頭來引入,

?大家可以先給自己做出一個答案,然后再看文章的思路捋一捋喲。



來一道基礎的吧~



var a="Hello";  

function test(){  

  alert(a); 

  var a="World";

  alert(a);

}

test();



難度+1



var a = 1;

function outer(){ 

  a = 2; 

  function inner(){       

      alert(a); 

      a = 4; 

  } 

  inner();



outer(); 

alert(a);



繼續加油



(function(){

  f1(); 

  f2();

  var f1 = function(){};

  function f2(){

      alert(1);

  }

})();



最后一道



(function () {

   console.log(a);

   var a=1;

   function a() {

       console.log("biu~");

   }

})()



二 - 究竟什么是聲明提升?

引擎在解釋JS代碼之前,首先要對JS代碼進行編譯,其中編譯的一部分工作就是找到所有的聲明,包括變量和函數的所有聲明都會在任何代碼被執行前首先被處理。

var a = 1這句話會被瀏覽器讀成 var a和a = 1兩句話執行,其中var a會在編譯階段就先執行了,而a = 1這段賦值代碼會在原地等待執行階段。

console.log(a); 

var a = 2;



上邊這段代碼,如果代碼按照順序由上自下執行,那么執行到console.log(a);時,a還沒有聲明,所以會包一個找不到變量a的錯,但是事實上,這句話打印了一個undefined,說明a被聲明了,但是沒有被賦值,那么結合上一段的文字,我們可以得出代碼實際運行的是這樣的:



var a;

console.log(a);

a = 2;



三 - 函數的提升

大家可能在書寫代碼的時候發現,無論函數封裝寫在前或者后,我們的函數調用都可以順利執行。



fn1();//可以執行

function fn1() {

    console.log("hello");

}



為什么呢?其實函數聲明,包括函數的代碼塊都i會被提升,所以調用函數的時候,函數聲明已經被執行過了。



但是有個案例大家了解一下:



fn2();//報錯,fn2不是一個函數

var fn2 = function () {

   console.log("world");

}



我們可以看到 以給匿名函數賦值的形式定義函數,只會提升函數聲明,但是函數表達式卻不會被提升。因為變量fn2被提升,但是并沒有賦值,我們書寫的fn2()無法運行,而拋出了異常。

以下就是實際執行的順序:



var fn2;

fn2();

fn2 = function () {

   console.log("world")

}



函數優先提升

我們都知道了,函數聲明和變量聲明都會被提升,那么遇到這樣的情況會怎么辦?



fn3();

var fn3=function () {

    console.log("fn3-1");

}

fn3();

function fn3() {

    console.log("fn3-2");

}



哎呦,嘛情況,突然迷了?。?!

? 這個時候你就要考慮,同樣的一個變量名稱,到底是把var fn3給先提聲上去,再提升 fn3函數體?還是先提升 fn3函數體,再提升var fn3???其實都不對?。?!



? 答案是:函數會被優先提升,但后才是變量提升,但是當函數提升后,然后發現還有一個變量聲明和函數聲明一樣的名稱,這個就是重復聲明,那么這個var fn3 是不生效直接忽略的。



所以實際代碼運行順序是:



function fn3() {

   console.log("fn3-2");

}

fn3();//fn3-2

fn3=function () {//var fn3因為重復聲明被忽略

   console.log("fn3-1");

}

fn3();//fn3-1



當然,我們還是建議再同一個作用域重復聲明是很爛的選擇



說在最后

再代碼作用域中的聲明,都會在代碼執行前被首先處理,所有的聲明都會被移動到各自作用域的最頂端,這個過程就叫做聲明提升。



四 - 答案:

問題1:



var a="Hello";  

function test(){  

  alert(a); 

  var a="World";

  alert(a);

}

test();



實際執行:

var a="Hello";

function test(){

   //作用域有聲明a,聲明提升到這里

   var a;

   alert(a);//本作用域聲明a,所以不去使用父作用域的a,但是本作用域的a沒有賦值,所以彈出undefined

   a="World";

   alert(a);//賦值后 ,彈出world

}

test();



問題2:



var a = 1;

function outer(){ 

  a = 2; 

  function inner(){       

      alert(a); 

      a = 4; 

  } 

  inner();



outer(); 

alert(a);



執行結果:



var a = 1;

function outer(){

   a = 2;

   function inner(){

       //本作用域沒有聲明a,所以沒有任何提升,直接執行

       alert(a); // 所以彈出 a為 2

       a = 4;

   }

   inner();

}

outer();

alert(a);//只有全局聲明了a,所以所有作用域使用的都是全局的a,所以a最后被賦值為4 彈出4



問題3



(function(){

  f1(); 

  f2();

  var f1 = function(){};

  function f2(){

      alert(1);

  }

})();

實際執行結果:



(function(){

   function f2(){

       alert(1);

   }

   var fn1;

   f1();//提升后先執行fn1(),但是fn1被提升的是變量不是函數,所以這里報錯,不是一個函數

   f2();//上一句話報錯,這句話不再運行

   f1 = function(){};

})();



問題4:



(function () {

   console.log(a);

   var a=1;

   function a() {

       console.log("biu~");

   }

})()

實際執行結果:



(function () {

   function a() {

       console.log("biu~");

   }

   console.log(a);//打印了a這個函數的函數體

   a=1;//因為函數有限聲明提升,所以這里的var a被提升時,發現重復聲明,故被忽略了var a;    

})()


我的 Input框 不可能這么可愛

seo達人

作者:陳大魚頭

github: KRISACHAN

<input /> 標簽是我們日常開發中非常常見的替換元素了,但是最近在刷 whattwg 跟 MDN 的時候發現 跟 <input /> 有很多相關的屬性,選擇器都沒怎么用過,所以就開篇文章來整理一下一些比較有趣或者實用的知識點。



本篇文章默認大家已經知道 <input /> 標簽的基本用法,不會做過多的基礎說明~







沒想到,這些選擇器居然跟 input …

到寫文章為止,根據的 drafts 指出,一共有3大類,16種跟 input 相關的選擇。其實都挺有用的,善用它們,會讓我們的用戶體驗更加美好。



下面我們來分享一下這3大類選擇器的作用:







第一類:控制系(Input Control States)

選擇器 作用

:enabled 選擇可使用狀態的 <input /> 元素

:disabled 選擇不可使用狀態的 <input /> 元素

:read-only 選擇不可編輯狀態的元素(不僅僅是 <input /> )

:read-write 選擇可編輯狀態的元素(不僅僅是 <input /> )

:placeholder-shown 選擇 placeholder text 顯示時的元素

:default 選擇在 <button>,<input type="checkbox" />, <input type="radio" />, 以及 <option> 上的默認狀態

第二類:輸出系(Input Value States)

選擇器 作用

:checked 選擇處于選中狀態的 <input type="radio" />

:indeterminate 選擇狀態不確定的表單元素與 <progress>

第三類:偵查系(Input Value-checking)

選擇器 作用

:blank 選擇處于空值時的 <input>,暫未被瀏覽器支持

:valid 選擇驗證通過的表單元素

:invalid 選擇驗證不通過的表單元素

:in-range 選擇處于指定范圍內的 <input />

:out-of-range 選擇不處于指定范圍內的 <input />

:required 選擇必填的表單元素

:optional 選擇選填的表單元素

:user-invalid 選擇用戶輸入但值非法時的 <input />,暫未被瀏覽器支持

可怕,除了選擇器,居然還跟這些屬性有關系

<input> 除了有很多相關的選擇器,結合不同的type還有不同的屬性可以供使用。他們的作用如下:



屬性 作用

maxlength 可輸入的最大長度

minlength 可輸入的最小長度

size 輸入框的長度

readonly 輸入框是否只讀

required 輸入框是否必填

multiple 輸入框是否可以多選

pattern 輸入框驗證規則

min 可輸入的最小值

max 可輸入的最大值

step 輸入框每次的增量

list 輸入框綁定的可選值數據

placeholder 輸入框預選文字

實戰

通過上面的三類說明,我們大致了解了 <input /> 標簽的相關信息,但是你們以為我是來列list的嗎?



當然不是,還有實操啊~







純CSS實現表單提交功能

首先我們來看個效果圖







上面的效果就是一個純CSS實現的表單提交功能,這是怎么實現的呢?下面我們直接看源碼,然后一步一步地來分拆(不想看的可以直接CV下面的源碼自己做測試~)



<style>

    :root {

      --error-color: red;

    }

    .form > input {

      margin-bottom: 10px;

    }

    .form > .f-tips {

      color: var(--error-color);

      display: none;

    }

    input[type="text"]:invalid ~ input[type="submit"],

    input[type="password"]:invalid ~ input[type="submit"] {

      display: none;

    }

    input[required]:focus:invalid + span {

      display: inline;

    }

    input[required]:empty + span {

      display: none;

    }

    input[required]:invalid:not(:placeholder-shown) + span {

      display: inline;

    }

</style>

<form class="form" id="form" method="get" action="/api/form">

    賬號:

    <input data-title="賬號" placeholder="請輸入正確的賬號" pattern="\w{6,10}" name="account" type="text" required />

    <span class="f-tips">請輸入正確的賬號</span>

    <br />

    密碼:

    <input data-title="密碼" placeholder="請輸入正確的密碼" pattern="\w{6,10}" name="password" type="password" required />

    <span class="f-tips">請輸入正確的密碼</span>

    <br />

    <input name="button" type="submit" value="提交" />

</form>



第一步:寫好基礎結構

首先我們來把基礎結構給寫好,代碼如下:



<style>

    :root {

      --error-color: red;

    }

    .form > input {

      margin-bottom: 10px;

    }

    .form > .f-tips {

      color: var(--error-color);

      display: none;

    }

</style>

<form class="form" id="form" method="get" action="/api/form">

    賬號:

    <input data-title="賬號" placeholder="請輸入正確的賬號" pattern="\w{6,10}" name="account" type="text" required />

    <span class="f-tips">請輸入正確的賬號</span>

    <br />

    密碼:

    <input data-title="密碼" placeholder="請輸入正確的密碼" pattern="\w{6,10}" name="password" type="password" required />

    <span class="f-tips">請輸入正確的密碼</span>

    <br />

    <input name="button" type="submit" value="提交" />

</form>



掃一眼,嗯,挺簡單的,都是常用的東西。咦,不對,這個 pattern 是什么東西?



在這里我們重點分享下 pattern 這個屬性,這是一個用來驗證 input[value] 是否合法的屬性,里面的內容就是匹配value的,語法便是正則的語法,例子如下:



<label>

    <!--

當前pattern的內容就是驗證input[name="part"]的value的,其規則如同里面的正則一樣,匹配input[name="part"]的value是否是一個數字+3個大寫字母

-->

    <input pattern="[0-9][A-Z]{3}" name="part" />

</label>



當然,不同的 input[type] 也會默認帶有相應的 pattern ,例如 input[type="email"] 就是默認匹配了以下規則:



/^[a-zA-Z0-9.!#$%&'+\/=?^_`{|}~-]+@a-zA-Z0-9?(?:.a-zA-Z0-9?)$/

1

第二步:重點功能

input[type="text"]:invalid ~ input[type="submit"],

input[type="password"]:invalid ~ input[type="submit"] {

    display: none;

}

input[required]:focus:invalid + span {

    display: inline;

}

input[required]:empty + span {

    display: none;

}

input[required]:invalid:not(:placeholder-shown) + span {

    display: inline;

}



上面便是核心交互的實現。



首先第一個class就是保證了在兩個輸入框不通過的時候隱藏,就是當輸入框值為空或者不符合驗證規則,則隱藏提交按鈕。



第二個,第三個class則是控制當用戶在輸入框輸入內容時,如果不符合驗證規則,則顯示錯誤信息,否則則隱藏。



第四個class則是用過 placeholder 是否存在來控制錯誤信息的顯隱,如果 placeholder 不顯示,則證明用戶正在輸入,錯誤信息則根據用戶輸入的值來判斷是否顯隱,否則則隱藏。



狀態切換

上面我們有提到一個選擇器 :indeterminate ,這個是用于選擇狀態不確定的表單元素與 <progress> ,玩過掃雷的人都知道,右擊除了可以選擇紅旗,還可以選擇問號,就是選中,但不確定;又跟 promise 的 pending 狀態類型,介于 resolve 與 reject 之間。



多了 :indeterminate 會給我們帶來很多很有趣的體驗。



首先我們來看看它的使用案例。



基礎使用法

先看效果







代碼如下:



<style>

    body {

        background: #333;

        color: #fff;

        padding: 20px;

        text-align: center;

    }

    input {

        margin-right: .25em;

        width: 30px;

        height: 30px;

    }

    label {

        position: relative;

        top: 1px;

        font-size: 30px;

    }

</style>

<form>

    <input type="checkbox" id="checkbox">

    <label for="option">點擊左邊</label>

</form>

<script>

      'use strict';

      checkbox.addEventListener('click', ev => {

        if (ev.target.readOnly) {

          ev.target.checked = ev.target.readOnly = false;

        } else if (!ev.target.checked) {

          ev.target.readOnly = ev.target.indeterminate = true;

        };

      });

</script>



這里面其實沒有什么復雜的實現,只是做了個中間態的判斷,就非常輕松的實現了radio的三種狀態切換。



秀到頭皮發麻法

先看效果







(此天秀效果來自于 Ben Szabo 的 codepen,有興趣的可以仔細研究下,我何時才能有大佬這么優秀,嚶嚶嚶~)



輸入框綁定的可選值

先看效果







其實代碼很簡單:



<input type="text" list="names" multiple />

<datalist id="names">

    <option value="kris">

    <option value="陳大魚頭">

    <option value="深圳金城武">

</datalist>



<input type="email" list="emails" multiple />

<datalist id="emails">

    <option value="chenjinwen77@foxmail.com" label="kris">

    <option value="chenjinwen77@gmail.com" label="kris">

</datalist>



<input type="date" list="dates" />

<datalist id="dates">

    <option value="2019-09-03">

</datalist>



這里原理就是通過 <input list="dates" /> 來綁定需要下拉顯示的數據列表 <datalist id="dates"> 。



那么當我們要實現輸入聯想的時候,也可以通過修改 <datalist id="dates"> 的子元素來實現,而不是再寫一大堆的操作函數來實現。



總結


JS----預編譯及變量提升詳解

seo達人

JS----預編譯及變量提升詳解

JS屬于解釋型語言,在執行過程中順序執行,但是會分塊先預編譯然后才執行。因此在JS中存在一種變量提升的現象。搞懂預編譯環節,變量提升自然而然也就懂了。本文講圍繞以下幾點進行介紹(變量提升會穿插在其中講解):



預編譯執行步驟

示例演示



預編譯執行步驟

預編譯發生在函數執行的前一刻,過程如下:



創建AO對象,執行期上下文(后面更新關于執行期上下文詳解)。

尋找函數的形參和變量聲明,將變量和形參名作為AO對象的屬性名,值設定為undefined.

將形參和實參相統一,即更改形參后的undefined為具體的形參值。

尋找函數中的函數聲明,將函數名作為AO屬性名,值為函數體。



至此,預編譯環節結束,函數中咯變量按照最終AO對象中的值開始執行。接下來,結合示例演示就會更加清晰。



作者:北海北方

鏈接:https://juejin.im/post/5aa6693df265da23884cb571

來源:掘金

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。



示例演示

我們先來看下面這段代碼:

function fn(a){

console.log(a);

var a = 123;

console.log(a);



    function a(){};

    console.log(a);

    

    var b = function(){};

    console.log(b);

    

    function d(){};

 }

 

 //調用函數

 fn(1);



作者:北海北方

鏈接:https://juejin.im/post/5aa6693df265da23884cb571

來源:掘金

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

接下來我們來按照前面的步驟詳細分析它的預編譯執行過程:



創建AO對象



AO{

    //空對象    

}

復制代碼

找形參和變量聲明



AO{

    a : undefined,

    b : undefined

}

復制代碼

形參和實參相統一



AO{

    a : 1,

    b : undefined

}

復制代碼

找函數聲明



AO{

    a : function a(){},

    b : undefined,

    d : function d(){}

}

復制代碼預編譯環節就此結束,此時的AO對象已經更新為:

AO{

    a : function a(){},

    b : undefined,

    d : function d(){}

}

復制代碼函數開始逐行順序執行:

 function fn(a){

    console.log(a);// 輸出functiona(){}

    var a = 123;//執行到這里重新對a賦,AO對象再一次更新

    console.log(a);// 輸出123

    

    function a(){};//預編譯環節已經進行了變量提升,故執行時不在看這行代碼

    console.log(a);// 輸出123

    

    var b = function(){};//這個是函數表達式不是函數聲明,故不能提升,會對AO中的b重新賦值

    console.log(b);//輸出function(){}

    

    function d(){};

 }

復制代碼至此,函數執行完畢,銷毀AO對象。

我們再來看幾個例子,熟悉函數的預編譯過程。

示例一:

function test (a,b){

    console.log(a);

    c = 0;

    var c;

    a = 3;

    b = 2;

    console.log(b);

    function b(){};

    function d(){};

    console.log(b);



//調用函數

test(1);

復制代碼它的AO創建過程如下(此處省略創建空AO對象的部分,下文同):

AO1{

    a : undefined,

    b : undefined,

    c : undefined

}



AO2{

    a : 1,

    b : undefined,

    c : undefined

}



AO3{

    a : 1,

    b : function b(){},

    c : undefined,

    d : function d(){}

}

復制代碼至此預編譯環節完成,開始執行:

function test (a,b){

    console.log(a); //輸出1

    c = 0; //給AO對象中的c重新賦值0

    var c;//預編譯環節變量提升,不再讀此行代碼

    a = 3;//給AO對象中的a重新賦值3

    b = 2;//給AO對象中的b重新賦值2

    console.log(b);//輸出2

    function b(){};//預編譯環節變量提升,執行時不再讀這行代碼

    function d(){};//預編譯環節變量提升,執行時不再讀這行代碼

    console.log(b);//輸出2



//調用函數

test(1);



復制代碼示例二:

這個例子中我們引入全局對象GO。GO與AO的過程類似

function test(){

var a = b = 123;

}

test();

復制代碼此函數的執行過程:先把123賦給b,再聲明a,再把b賦給a。此時變量b未經聲明就賦值,為全局變量。預編譯環節如下:

GO1{

b : undefined

}

AO1{

a : undefined

}



GO2{

    b : 123;

}

AO2{

    a : 123;

}

復制代碼示例三 :

console.log(test);

function test(test){

   console.log(test);

   var test = 234;

   console.log(test);

   function test(){};

}

test(1);

var test = 123;

復制代碼我們來看它的預編譯過程:

//執行前(頁面加載完成時)生成GO對象

GO1{

    test : undefined

}

GO2{

    test : function(){}

}



//輸出 function test(){...}



//執行test()前生成它的AO對象

AO1{

    test : undefined

}

AO2{

    test : 1

}

AO3{

    test : function test(){}

}



//預編譯結束開始執行test(1);

AO4{

    test : 234

}

//輸出234

復制代碼示例四:

function demo(){

    console.log(b);

    if(a){

        var b = 100;

    }

    console.log(b);

    c = 234;

    console.log(c);

}

var a;

demo();

a = 10;

console.log(c);

復制代碼我們來看它的預編譯過程:

//首先是全局對象GO 

GO1{

    a : undefined

}

G02{

    a : undefined,

    demo : function demo(){}

}

//執行demo()前預編譯,由于demo中的c未聲明就使用故為全局對象



//輸出undefined

GO3{

    a : undefined,

    demo : function demo(){}

    c : undefined

}

//此時a還是undefined,故不執行if()代碼塊

//輸出還是undefined

GO4{

    a : undefined,

    demo : function demo(){}

    c : 234;

}

//輸出234

GO5{

    a : 10,

    demo : function demo(){}

    c : 234;

}

//輸出234


解決nodejs koa express以及vue,nuxt項目中使用別名映射vscode不提示的問題,兼容webpack的@和best-require 的:xxx 別名映射

seo達人

nodejs中使用別名映射,兼容webpack的@和best-require 的:xxx 別名映射

項目地址: https://github.com/langyuxiansheng/biu-server-admin



寫在前面

研究了很久,找了很多資料發現都沒有,只好自己去想辦法,查資料.才弄好的,凌晨發布的,轉載請注明出處.

在做nodejs項目開發的時候,你是不是也在為

require('./posts');

require('./controllers/posts');

require('../controllers/posts');

require('../../controllers/posts');

require('../../../apis/controllers/posts');



或者



require(ROOT_PATH + '/application/apis/controllers/posts');

// other require()...

require(ROOT_PATH + '/application/apis/controllers/users');

require(ROOT_PATH + '/application/apis/controllers/products');

require(ROOT_PATH + '/application/apis/services/rest');

require(ROOT_PATH + '/application/apis/config');



這樣的寫法而困擾;



那看完這篇文章,從此之后就可以告別這個煩惱了;



感謝一下 best-require 這個模塊包的作者,不然還需要自己去寫這個

npmjs 鏈接 https://www.npmjs.com/package/best-require

github 鏈接 https://github.com/yuezhihan/best-require



不廢話了,進入正題 往下看:

  1. 安裝庫 best-require 進行別名映射





    npm i best-require --save


  2. 映射別名. 實例在本項目中 server/index.js 中





    const path = require('path');

    const ROOT_PATH = process.cwd();

    const SRC_PATH = path.join(ROOT_PATH, /server/src);

    console.log(ROOT_PATH, SRC_PATH);

    //映射目錄別名

    require('best-require')(ROOT_PATH, {

        root: ROOT_PATH,

        src: SRC_PATH,

        controllers: path.join(SRC_PATH, '/controllers'),

        models: path.join(SRC_PATH, '/models'),

        routes: path.join(SRC_PATH, '/routes'),

        crawlers: path.join(SRC_PATH, '/crawlers'),

        services: path.join(SRC_PATH, '/services'),

        middleware: path.join(SRC_PATH, '/middleware'),

        lib: path.join(SRC_PATH, '/lib'),

        config: path.join(SRC_PATH, '/config'),

        logs: path.join(SRC_PATH, '/logs')

    });



    //運行服務

    require('./src/bin/Server').run();


  3. 設置 jsconfig.json





    {

        "compilerOptions": {

            "allowSyntheticDefaultImports": true,

            "baseUrl": "./",

            "paths": {

                "@/": ["client/"],

                ":root/": [""],

                ":config/": ["server/src/config/"],

                ":lib/": ["server/src/lib/"],

                ":services/": ["server/src/services/"],

                ":controllers/":["server/src/controllers/"],

                ":models/": ["server/src/models/"],

                ":routes/": ["server/src/routes/"],

                ":crawlers/": ["server/src/crawlers/"],

                ":middleware/": ["server/src/middleware/"],

                ":logs/": ["server/src/logs/"]

            }

        },

        "include": ["server/*/","client/*/"],

        "exclude": [

            "node_modules",

            "nuxt-dist",

            "server-dist"

        ]

    }


  4. vscode要安裝 path-intellisense 插件 并在設置中配置setting.json



    vscode 中的設置,setting.json



    workspaceRoot 是當前的工作空間,就是當前編輯器打開的目錄.



    配置如下





    {

        "path-intellisense.mappings": {

            "@": "${workspaceRoot}/client",

            ":root": "${workspaceRoot}",

            ":lib": "${workspaceRoot}/server/src/lib",

            ":controllers": "${workspaceRoot}/server/src/controllers",

            ":models": "${workspaceRoot}/server/src/models",

            ":routes": "${workspaceRoot}/server/src/routes",

            ":crawlers": "${workspaceRoot}/server/src/crawlers",

            ":services": "${workspaceRoot}/server/src/services",

            ":middleware": "${workspaceRoot}/server/src/middleware",

            ":config": "${workspaceRoot}/server/src/config",

            ":logs": "${workspaceRoot}/server/src/logs",

        }

    }


  5. 重啟vscode,試試看吧!

    作者的目錄結構









    vue中使用







    后續更新

    nodejs中使用sequelize的model映射,這樣就解決了沒得提示的煩惱了,讓你的效率提升2個檔次

    寫在后面

    如果你遇到難題或者有疑問,有好的建議請留言反饋.

    這種提示以及Ctrl + 鼠標左鍵的跳轉,只針對 .js 的文件, .vue的沒試過.這個也只是為了解決 js方法映射后沒提示的問題.


vue生命周期過程簡單敘述

seo達人

vue 生命周期

每個 Vue 實例在被創建時都要經過一系列的初始化過程。設置數據監聽、編譯模板、掛載等等。vue生命周期還是不太容易理解,這里就簡單地說一下它的整個過程。

1創建一個vue實例



new vue({

data () {

return {

}

    }

})



2 初始化事件和生命周期 beforeCreate 創建實例之前執行的鉤子函數

3 初始化·注入和校驗 created 實例創建完成后執行的鉤子



new vue ({

data () {

return {

a: 1

}

},

created: function () {

console.log('created')

}

})



4 渲染頁面 編譯 beforeMount 將編譯完成的html掛載在虛擬dom時執行的鉤子

5 mouted鉤子 掛載完畢對數據進行渲染 會做一些ajax情求初始化數據 mounted整個實例過程中只執行一次



new vue ({

data () {

return {

a: 1

}

},

created: function () {

console.log('created')

},

// 一些鉤子函數

mouted: function () {

console.log('mounted')

}

})



6 修改數據 beforeUpdate 更新之前的鉤子

7 updated 修改完成重新渲染

8 準備解除綁定子組件以及事件監聽器 beforeDestroy

9 銷毀完成 destroyed


圖片切換簡易版

seo達人

css:

*{margin:0;padding:0;}

tu{margin: 50px auto;padding: 10px;width: 500px;

background: rgb(201, 230, 128);text-align: center;}



html:



<body>

    <div id="tu">

        <P id="info"></P>

        <img src="jiao.jpg" alt="冰棒">

        <input type="button" id="yi" value="第一張">

        <input type="button" id="er" value="第二張">

    </div>

</body>



javascript:

window.onload = function(){

var yi = document.getElementById(“yi”);

var er = document.getElementById(“er”);

var img = document.getElementsByTagName(“img”)[0];

var imgArr = [ “jiao.jpg”,“san.jpg”,“bao.jpg”,“hua.jpg”,“pei.jpg”,“tu.jpg”,“xin.jpg”,“niu.jpg”]

var index = 0 ;

var info = document.getElementById(“info”);



    info.innerHTML = "一共" + imgArr.length + "張圖片,當前第"+(index+1)+"張";

    yi.onclick = function(){

        index--;

        if(index < 0){

            index = imgArr.length - 1; 

        }

        img.src = imgArr[index];

        info.innerHTML = "一共" + imgArr.length + "張圖片,當前第"+(index+1)+"張";

    }



    er.onclick = function(){

        index++;

         if(index > imgArr.length - 1){               

            index = 0; 

        }

        img.src = imgArr[index];

        info.innerHTML = "一共" + imgArr.length + "張圖片,當前第"+(index+1)+"張";

    }

}


遞推和遞歸的區別

seo達人

1,從程序上看,遞歸表現為自己調用自己,遞推則沒有這樣的形式。



2,遞歸是從問題的最終目標出發,逐漸將復雜問題化為簡單問題,最終求得問題



是逆向的。遞推是從簡單問題出發,一步步的向前發展,最終求得問題。是正向的。



3,遞歸中,問題的n要求是計算之前就知道的,而遞推可以在計算中確定,不要求計算前就知道n。



4,一般來說,遞推的效率高于遞歸(當然是遞推可以計算的情況下)



最容易理解就是結合一個經典的例子:斐波那契數列



遞歸求解





int fib(n){

    return n < 2 ? 1 : fib(n-1)+f(n-2);

}



遞推求解



int fib(int n){

    int fn   = 1;

    int fn_1 = 0;

    for(int i=0; i<n; i++) {

       int t = fn

       fn    = fn + fn_1;

       fn_1  = t;

    }

    return fn;

}



遞推 Inductive 是從1 往 n推(未知)



遞歸Recursive是從n(未知)往1推, 再層層返回


HTML第一課

seo達人

HTML基本概況





HTML文檔基本格式

樣式如下:



注意:文章以下出現的“《》”書名號僅代表大于號“>”和小于號“<”。

主要包括:<!DOCTYPE>文檔類型聲明、《html》根標記、《head》頭部標記、《bady》主題標記。

1.<!DOCTYPE>標記

標記位于文檔的最前面,用于向瀏覽器說明 當前文檔使用哪種 HTML 或 XHTML 標準規范。

2.《html》標記

《html》標記位于<!DOCTYPE>標記之后,也稱根標記。用于告知瀏覽器其本身是一個HTML文檔?!秇tml》標記標志著HTML文檔的開始,《/html》標記標志著HTML文檔的結束,在他們之間的是文檔的頭部和主體內容。

3.《head》標記

《head》標記用于定義HTML文檔的頭部信息,也稱頭部信息。緊跟在《html》標記之后,主要用來封存其他位于文檔頭部的標記,一個HTML文檔只能有一對《head》標記。

4.《body》標記

《body》標記用于定義HTML文檔所要顯示的內容,也稱主體標記。瀏覽器中所要顯示的所有文本、圖像、音頻、和視頻等信息都必須位于《body》標記內。一個HTML文檔只能有一對《body》標記。



HTML標記

所謂標記就是放在”<>"標記中表示 某個功能的編碼命令,也稱為HTML標簽或HTML元素。

1.單標記和雙標記

雙標記:也稱體標記,是指由開始和結束兩個標記符組成的標記?;菊Z法格式如下:

<標記名>內容</標記名>

單標記:也稱空標記,是指用一個標記符號即可完整的描述某個功能的標記?;菊Z法格式如下:

<標記名/>

2.注釋標記



注意:注釋標記中不能嵌套注釋標記



標記屬性

《h1 align = center》標題文本《h1》其中align為屬性名,center位屬性值,表示“標題文本”居中對齊,對于標題標記還可以設置文本左對齊、右對齊,對應的屬性值是left和right。

在鑲嵌結構中,HTML 元素總是遵循“就近原則”。



HTML文檔頭部相關標記

1.設置頁面標題標記

《title》標記用于定義HTML頁面的標題,必須位于《head》標記之內。一個HTML文檔只能有一對《title》《/title》標記,《title》《/title》之間的內容將顯示在瀏覽器窗口的標題欄中,基本語法格式如下:

《title》網頁標題名稱《/title》

2.定義頁面元信息標記《meta/》

《meta/》標記用于定義頁面的元信息,可重復在《head》頭部標記中,在HTML中是一個單標記。

基本語法格式:

1.1《meta name=“名稱” content="值“/》

(1)設置網頁關鍵字

《meta name=“keywords” content="…"》

content屬性的值用于定義關鍵字的具體內容,多個關鍵字內容之間可以用“,”分隔。

(2)設置網頁描述

《meta name=“description” content=“…"》

content屬性的值是用于定義描述的具體內容。需要注意的是網頁描述的文字不必過多。

(3)設置網頁作者

《meta name=“auther” content=“…”》

content屬性的值是用于定義具體的作者信息。

2.1《meta http-equiv=“名稱“ content=”值“

(1)設置字符集

《meta http-equiv=“Content-Type” content=“text/html;charset=utf-8“/》

(2)設置頁面自動刷新與跳轉

《meta http-equiv=“refresh” content=“10;url=http;//www.itcast.cn“/》



HTML文本控制標記

1.標題和段落標記

(1)標題標記

HTML提供了6個等級的標題,即《h1》《h2》《h3》《h4》《h5》《h6》.基本語法格式如下:

《hn align=“對齊方式“》標題文本《/hn》

(2)段落標記

段落的標記就是《/p》基本語法格式如下:

《p align=“對齊方式”》段落文本《/p》

(3)水平線標記《hr/》



含義 屬性值

屬性名:align,設置水平線的對齊方式 可選擇left、right、center三種值,默認為center,居中對齊

屬性名:size,設置水平線的粗細 以像素為單位,默認為2像素

屬性名:color,設置水平線的顏色 可用顏色名稱、十六進制#RGB、right(r,g,b)

屬性名:width,設置水平線的寬度 可以是確定的像素值,也可以是瀏覽器窗口的百分比,默認為100%

(4)換行標記《br/》

使用Enter鍵換行的段落在瀏覽器中實際上并沒有換行,只是多出來了一個字符的空格,而使用換行標記的段落卻實現了強制換行的效果。

2.文本樣式標記

文本樣式標記《font》,用來控制網頁中的字體、字號和顏色?;菊Z法格式如下:

《font 屬性=“屬性值”》文本內容《/font》



屬性名 含義

face 設置文字的字體,例如微軟雅黑、黑體、宋體等

size 設置文字的大小,可以取1~7之間的整數值

color 設置文字的顏色

注意:XHTML中不贊同使用《font》標記,可使用CSS樣式代替《font》來定義文本的字體、大小和顏色。

3.文本格式化標記



標記 顯示效果

《i》《/b》 字體以粗體方式顯示

《i》《/i》 字體以斜體方式顯示

《s》《/s》 字體以加刪除線方式顯示

《u》《/u》 字體以加下劃線方式顯示

4.特殊字符標記






關于 XSS攻擊

seo達人

XSS攻擊是什么

簡介

攻擊原理

例子

防御方法

簡介

XSS(Cross Site Scripting, 跨站腳本攻擊)又稱是 CSS, 在 Web攻擊中比較常見的方式, 通過此攻擊可以控制用戶終端做一系列的惡意操作, 如 可以盜取, 篡改, 添加用戶的數據或誘導到釣魚網站等

攻擊原理

比較常見的方式是利用未做好過濾的參數傳入一些腳本語言代碼塊通常是 JavaScript, PHP, Java, ASP, Flash, ActiveX等等, 直接傳入到頁面或直接存入數據庫通過用戶瀏覽器閱讀此數據時可以修改當前頁面的一些信息或竊取會話和 Cookie等, 這樣完成一次 XSS攻擊

例子

http://example.com/list?memo=&lt;script&gt;alert(“Javascript代碼塊”)&lt;/script&gt;

http://example.com/list?memo=&lt;strong οnclick=‘alert(“驚喜不斷”)’>誘惑點擊語句</strong>

http://example.com/list?memo=&lt;img src=’./logo.jpg’ οnclick=‘location.href=“https://blog.csdn.net/qcl108”;’/&gt;

以上例子只是大概描述了方式, 在實際攻擊時代碼不會如此簡單

防御方法

防止 XSS安全漏洞主要依靠程序員較高的編程能力和安全意識

去掉任何對遠程內容的引用 如 樣式或 JavaScript等

Cookie內不要存重要信息為了避免 Cookie被盜, 最好 Cookie設置 HttpOnly屬性防止 JavaScript腳本讀取 Cookie信息

不要信任用戶的輸入, 必須對每一個參數值做好過濾或轉譯: (& 轉譯后 &amp;), (< 轉譯后 &lt;), (> 轉譯后 &gt;), (" 轉譯后 &quot;), (\ 轉譯后 &#x27;), (/ 轉譯后 &#x2F;), (;)等


日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
色婷婷香蕉在线一区二区| 精品国产乱码久久久久久浪潮| bl视频在线免费观看| 国产综合av| 九九久久成人| 日本不良网站在线观看| 亚洲va欧美va人人爽成人影院| 久久综合偷偷噜噜噜色| 91久久偷偷做嫩草影院| 国内精品伊人久久久久av一坑| 国产欧美日韩精品一区二区三区| 成人黄色a**站在线观看| 午夜美女久久久久爽久久| av人人综合网| 在线一区欧美| 精品三级在线观看| 日本一区免费在线观看| 三妻四妾的电影电视剧在线观看| 不卡的av影片| 欧洲一区二区视频| 国产美女精品在线| 欧美xxxx18国产| 欧美精品色一区二区三区| 草莓视频成人appios| 911久久香蕉国产线看观看| 97免费中文视频在线观看| 最近更新的2019中文字幕| 亚洲人成小说网站色在线| 日韩午夜在线观看| 韩国毛片一区二区三区| 成人亚洲综合天堂| 成人国产精品一区二区| 中文字幕在线视频一区| 色一情一乱一乱一91av| 亚洲欧美一区二区三区久本道91| 成年人在线看| 久久99精品久久久久久久久久| 久久久久久国产精品| 99久久婷婷| 欧美极品少妇全裸体| 激情亚洲综合在线| 爱啪视频在线观看视频免费| 欧美91视频| 免费国产自久久久久三四区久久| 亚洲欧美另类图片小说| 91视频成人| 亚洲免费不卡| 国产精品91一区二区三区| 亚洲综合色成人| 欧美日韩黄色一区二区| 桃色av一区二区| 超清av在线| 精品一区免费| 日韩中文av| 国产精品高潮粉嫩av| 日韩成人在线一区| 成人看片黄a免费看在线| 国产999精品在线观看| 欧美精品九九| 久久久久久久亚洲精品| 国产精品色噜噜| 国产厕拍一区| 亚洲不卡av不卡一区二区| 欧美激情网址| 在线黄色网页| 91亚洲国产成人久久精品网站| 国产一区二区三区91| 精品国产乱码91久久久久久网站| 日韩久久99| 成人激情开心网| 午夜亚洲伦理| 亚洲成av人影院在线观看网| 国产精品99一区二区| 亚洲视频资源在线| 国产精品538一区二区在线| 亚洲黄色一区| 热门国产精品亚洲第一区在线| 国产成人在线视频网址| 日韩精品久久久久久久电影99爱| 欧美日韩精品专区| 国产精品2区| 亚洲成av人影院| 午夜精品影院在线观看| 欧美成人三级视频网站| 亚洲天堂1区| 日韩免费av一区二区三区| 国产日产亚洲精品系列| 国产一区二区精品久久91| 久久久久久久久久久久久夜| av日韩中文| 午夜亚洲国产au精品一区二区| 日韩av片电影专区| 国产精品久久精品视| 亚洲欧洲在线看| 亚洲第一区中文字幕| 最近中文字幕免费mv2018在线| www.com.cn成人| 欧美成人综合网站| 国产精品国产三级国产普通话三级| 日韩不卡在线| 国色天香久久精品国产一区| 欧美人与物videos另类xxxxx| 一级毛片视频在线| 亚洲一区日韩精品中文字幕| 欧美日韩国产综合在线| 久久综合久久88| 成人一级视频在线观看| 精品国产乱码久久久久久樱花| 成人午夜电影免费在线观看| 日韩午夜高潮| 亚洲高清免费| 性色av一区二区三区免费| 欧美日韩一区二区三区四区不卡| 欧美日韩高清一区二区不卡| av成人男女| 欧美富婆性猛交| 中文字幕日韩在线播放| 蜜桃在线一区二区三区| av黄色在线观看| 免费国产自久久久久三四区久久| 国产亚洲一卡2卡3卡4卡新区| 亚洲精品自拍视频| 日韩成人高清在线| 精品一区二区三区在线视频| 国产乱人伦偷精品视频不卡| 亚洲在线第一页| 日韩精品一区二区三区视频在线观看| 亚洲欧美在线人成swag| 在线a人片免费观看视频| 欧美日韩五码| 欧美一区二区三区视频| 不卡的av一区| 国产传媒一区二区三区| 欧美日韩综合网| www.在线视频| 91精品欧美久久久久久动漫| 2025国产精品视频| 91精品网站在线观看| 久久精品国产99国产| 欧美极品少妇xxxxⅹ高跟鞋| 国产成人精品在线播放| 亚洲摸摸操操av| 97色伦图片97综合影院| 三级精品视频| 亚洲国产中文字幕| 波波电影院一区二区三区| 欧美专区在线播放| 欧美成人精品激情在线观看| 超碰caoporn久久| 在线观看日韩www视频免费| 亚洲免费资源在线播放| 爱情电影社保片一区| 国产精品看片资源| 婷婷成人综合网| 亚洲精品一区av| 成人午夜激情免费视频| 国产精品96久久久久久| 黑人精品xxx一区| 国产精品国产三级国产aⅴ原创| 精品国精品国产自在久国产应用| 国产视频欧美视频| 国产成人在线视频| 欧美日韩国产综合新一区| 18+视频在线观看|