標籤: 新北清潔

  • 談談 Promise 以及實現 Fetch 的思路

    談談 Promise 以及實現 Fetch 的思路

    Promise 是異步編程的一種解決方案。

    Promise

    
    /**
     * 屬性
     */
    Promise.length
    Promise.prototype
    
    /**
     * 方法
     */
    Promise.all(iterable)   // 所有成功觸發成功  任何失敗觸發失敗
    Promise.race(iterable)  // 任意一個成功或失敗后觸發
    Promise.reject(reason)
    Promise.resolve(value)
    
    /**
     * 原型
     */
    Promise.prototype.constructor
    //方法
    Promise.prototype.catch(onRejected)
    Promise.prototype.then(onFulfilled, onRejected)
    Promise.prototype.finally(onFinally)
    

    Promise 有三種狀態

    • pending: 初始狀態,既不是成功,也不是失敗狀態。
    • resolve: 意味着操作成功完成。(resoloved)
    • reject: 意味着操作失敗。

    pending

    pending 是初始狀態,執行 resolve/reject 會進入對應狀態,如果不執行,責一直為 pending 狀態

    例如下面代碼,promise 將一直在 pending 狀態,不會執行 then/catch.

    new Promise(function (resolve, reject) { })
      .then(res => console.log(res))
      .catch(err => console.log(err))
    

    resolve

    resolve 意味着操作成功完成, 如果有 .then,值會傳入 .then 的第一個參數函數里。

    new Promise(function (resolve, reject) {
      resolve(1)
    })
      .then(res => console.log(res))
    

    then 的第一個參數是成功的回調,第一個參數的返回值會影響接下來鏈的去向。第一個參數的返回值一般有三種情況

    • 無返回值:會去執行下一個 .then ,沒有參數
    • 返回值非promise:調用下一個then的函數,參數為返回值
    • 返回值為promise:根據promise的執行結果,執行 下一個then/catch,如果一直是pending,則不執行下一個then/catch

    例如想要在當前 then 終止,可以這樣操作:

      .then((res) => new Promise(() => {}))
    

    reject

    reject 意味着操作失敗。

    使用 .catch 會捕獲到錯誤信息。

    與代碼報錯(如 undefined.a)不同的是, 代碼報錯如果不使用 catch 捕獲,會向外傳遞,最終傳遞到根結點;而 reject 屬於 promise 錯誤,即使不使用 catch 捕獲也不會對全局有影響。

    用 promise 實現 fetch

    先來看幾個問題:

    1. 如果請求 code 404, 會走 then 還是 catch? (答案:then)
    2. 控制台能看到一行 404 的錯誤, 為什麼還是走 then 不是 catch 呢
    3. 如果請求跨域失敗,走 then 還是 catch?(答案:catch)
    4. 同樣是控制台看到錯誤,兩者有什麼區別呢?
    5. 跨域失敗的報錯, 和 then 中 undefined.a 報錯,如果都不 catch,後者在 react 腳手架開發環境頁面會蹦,兩者有什麼區別?

    帶着這幾個問題,來看看 fetch。

    fetch 返回值是 promise,所以有三種狀態 pending、resolve、reject.

    • pending: 請求中
    • resolve: 請求成功(code 200/404/500 等, 非 200 控制台輸出錯誤)
    • reject: 請求失敗(跨域失敗、連接超時、無網絡等,控制台輸出錯誤)

    我們還發現,請求失敗時,只能 catch 到最後一行錯誤, 如圖

    捕獲后

    為什麼 404 在控制台看到錯誤,還走 then, resolve 如何實現

    實現有幾個難點,

    1. throw 後面代碼不會執行;
    2. 先報錯,后執行 then;
    3. catch 后錯誤不會打印在控制台;

    試了下,Promise.reject(‘xxx’) 這樣的報錯方式雖然是微觀任務,但是總是在.then之後才在控制台輸出,更像是宏觀任務。所以也加個setTImeout宏觀任務調至後面。

    var fetch = function () {
      return new Promise(function (resolve, reject) {
        setTimeout(function () {
          if ('請求成功 200') {
            resolve('Response數據結構');
          } else if ('請求成功 404,500等') {
            Promise.reject('GET xxxxxxxx 404');
            setTimeout(function () {
              resolve('Response數據結構');
            });
          }
        })
      })
    }
    

    請求失敗 例如跨域失敗 reject 如何實現呢

    同樣加個 setTimeout

    var fetch = function () {
      return new Promise(function (resolve, reject) {
        setTimeout(function () {
          if ('請求成功 200') {
            resolve('Response數據結構');
          } else if ('請求成功 404,500等') {
            Promise.reject('GET xxxxxxxx 404');
            setTimeout(function () {
              resolve('Response數據結構');
            });
          } else if ('請求失敗') {
            Promise.reject('Access to fetch xxxxx with CORS disabled.');
            Promise.reject('GET xxxxx net::ERR_FAILED');
            setTimeout(function () {
              reject('TypeError: Failed to fetch');
            });
          }
        })
      })
    }
    

    還是有些問題,我們實現的因為在promise 中,錯誤會有前綴 Uncaught (in promise)。瀏覽器客戶端應該有更好的實現方式。

    最後總結一下 fetch 的三種情況

    • pending: 請求中
    • resolve: 請求成功(code 200: 調用 resolve 返回數據; code: 404/500 等, 先拋錯,再調用 resolve 返回數據。)
    • reject: 請求失敗(跨域失敗、連接超時、無網絡等,先控制台拋錯,再調用 reject)

    拋錯均不影響代碼執行,與 undefined.a 不同。

    whosmeya.com

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • Linux-權限詳解

    目錄

    • 前言
    • alias / unalias 命令別名
    • cd 切換目錄
    • cp 複製文件或目錄
    • cat 查看文件內容
    • chage 設置密碼有效期
    • chown 更改文件所屬
    • chmod 設置文件rwx權限
    • chattr / lsattr 隱藏屬性
    • crontab 定時任務
    • df 磁盤使用情況
    • date 系統時間 / hwclock 硬件時鐘
    • diff 文件比較
    • echo 標準輸出
    • find / locate 文件搜索
    • free 查看內存使用
    • head 查看文件前面的內容
    • history 命令歷史
    • ip 網絡配置管理
    • kill 結束進程
    • ln 創建鏈接(快捷方式)
    • ls 查看目錄中的內容
    • less 分頁查看文件
    • mv 剪切 / 重命名 文件或目錄
    • mkdir 創建目錄
    • ps 查看進程
    • pwd 显示當前目錄
    • passwd 修改密碼
    • rm 刪除文件或目錄
    • su 切換用戶
    • stat 查看文件詳細信息
    • sort 排序 / uniq 去重
    • split 分割文件
    • tar 打包
    • top 動態查看進程
    • tail 查看文件末尾內容
    • touch 修改文件的時間屬性或創建空文件
    • useradd / groupadd 用戶和組管理
    • vi / vim 文本編輯器
    • wc 統計字數行數
    • xargs 參數傳遞
    • yum 紅帽系列包管理工具
    • zip / unzip 壓縮與解壓

    前言

    • 以下命令測試環境為CentOS7.8
    • 使用的shell為系統默認的bash
    • Linux下是區分大小寫的,這點和Windows不同
    • Linux大部分命令語法為命令 [選項] [參數],我所介紹的選項為常用選項並不包含全部

    alias / unalias 命令別名

    alias命令用於給指令設置一個別名,unalias命令用於取消設置

    • 可以給長命令起一個簡單的別名便於使用,如:

      alias ens33="vi /etc/sysconfig/network-scripts/ifcfg-ens33"
      
    • 取消已設置的別名命令

      unalias ens33
      
    • 可以避免危險操作,如系統默認的命令rm mv cp等,都是通過alias加了-i參數的

      # 查看所有的使用別名的命令
      [root@God ~]# alias  
      alias cp='cp -i'
      alias l.='ls -d .* --color=auto'
      alias ll='ls -l --color=auto'
      alias ls='ls --color=auto'
      alias mv='mv -i'
      alias rm='rm -i'
      
    • 在命令前加\或者使用命令全路徑可忽略使用別名

      # 不進行詢問直接刪除mail.log文件
      \rm /var/log/mail.log  
      或
      /usr/bin/rm  /var/log/mail.log
      
    • 在命令行通過aliasunalias設置或取消的別名都是暫時性的,僅作用於當前登錄的會話。如果想要永久生效,可以在~/.bashrc文件添加別名設置

    cd 切換目錄

    cd命令用於切換工作目錄至指定的目錄,可用相對路徑和絕對路徑

    • 選項

      • / 表示根目錄
      • . 表示當前目錄
      • .. 表示上一級目錄
      • - 表示上次所在的目錄
      • ~ 表示當前用戶的家目錄
      # 進入用戶家目錄
      cd ~
      
      # 進入指定目錄
      cd /etc
      
      # 進入上兩級目錄
      cd ../..
      

    cp 複製文件或目錄

    cp用來複制文件或目錄到指定位置

    • 語法

      cp [選項] 源 目標
      
    • 選項

      • -a 相當於同時指定-dpr
      • -d 複製時保留鏈接(相當於Windows系統中的快捷方式)
      • -p 保留源文件或目錄的屬性
      • -r|R 對目錄進行遞歸處理,複製目錄時必須加上它才能複製
      • -f 覆蓋已存在的目標而不給出提示
      • -i-f相反,如果目標文件存在,則提示是否覆蓋
      # 複製文件/etc/hosts到目錄/local下
      cp /etc/hosts /local
      
      # 複製文件/etc/hosts到目錄/local下並命名為hosts.bak
      cp /etc/hosts /local/hosts.bak
      
      # 複製目錄/etc到目錄/local下,如果/local/etc已存在直接覆蓋
      cp -af /etc /local
      
      # 複製目錄/etc到目錄/local下並重命名為etc.bak
      cp -a /etc /local/etc.bak
      

    cat 查看文件內容

    cat命令適合查看少量內容,並可將多個文件連接到一起進行標準輸出,當文本數據內容量過大時,推薦使用lessmore進行查看

    • 語法

      cat [選項] 文件1 [文件2 文件N]
      
    • 選項

      • -n 輸出時显示行號
      • -s 當遇到有連續兩行以上的空白行,就替換成一個空白行
      # 查看resolv.conf的內容
      cat /etc/resolv.conf
      
      # 將/etc/resolv.conf和/etc/hosts兩個文件連接到一起進行標準輸出,並显示行號
      cat -n /etc/resolv.conf  /etc/hosts
      
    • cat還可以配合重定向將標準輸入寫到文件中

      [root@God ~]# cat > demo.txt << EOF
      > 我在命令行打上 cat > demo.txt << EOF
      > 在 > 後面寫的東西都能寫入到文件中
      > 寫完了所有內容后,在最後單獨寫個EOF就可以了
      > EOF
      [root@God ~]# cat -n demo.txt 
           1	我在命令行打上 cat > demo.txt << EOF
           2	在 > 後面寫的東西都能寫入到文件中
           3	寫完了所有內容后,在最後單獨寫個EOF就可以了
      

    chage 設置密碼有效期

    chage 命令本質是修改通過/etc/shadow文件中的內容來設置賬號密碼有效期限的

    • 語法

      chage [選項] 用戶
      
    • 選項

      • -l 列出用戶的當前設置
      • -d DATE DATE為日期,格式YYYY-MM-DD,即設置上次修改密碼的時間,設置為0則下次登錄時必須改密碼,設置為-1則密碼永不過期,密碼是否過期就是根據這個時間計算的
      • -E DATE DATE為日期,格式YYYY-MM-DD,設置賬號失效日期(對root慎用),設置為0則立即失效,設置為-1則永不失效
      • -M N N為天數,密碼有效期,即每過N天不修改密碼的話密碼就會過期
      • -m N N為天數,即距離上次修改日期N天後,才可以更改密碼,設置為0表示隨時可更改
      • -W N N為天數,即距離密碼過期日N天前開始發出警告信息
      • -I N N為天數,即如果一個密碼已過期N天,那麼該賬號將失效
      # 列出 jet 用戶的賬號密碼有效日期詳細信息
      chage -l jet
      
      # 使 jet 用戶下次登陸時必須修改密碼
      chage -d 0 jet
      
      # 設置 jet 用戶2020年8月8日賬號失效
      chage -E '2020-8-8' jet
      
      # 設置用戶至少每90天就需要改一次密碼,並在15天之前提醒
      chage -M 90 -W 15 jet
      

    chown 更改文件所屬

    chown命令可以更改Linux下文件或目錄的所屬用戶、所屬組,Linux下一切皆文件,而文件必須有所屬

    • 語法

      chown [用戶][:用戶組] 文件或目錄              
      
    • 選項

      • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
      • -v 显示執行過程
      # 更改/local/myfile.txt的擁有者為root用戶
      chown root /local/myfile.txt
      
      # 更改/local/myfile.txt的群組的使用者為root組
      chown :root /local/myfile.txt
      
      # 更改/local/myfile.txt的擁有者為root用戶,群組的使用者為root組
      chown root:root /local/myfile.txt
      
      # 更改目錄/local的擁有者為root用戶
      chown -R root /local
      

    chmod 設置文件rwx權限

    chmod命令可用於更改文件的r讀、w寫、x執行權限, 通過ls -lstat命令可查看文件的權限-rw-r--r-- 第一位表示文件類型,后9位每三位為一組,分別表示所屬用戶、所屬組、其他用戶的權限。

    • 語法

      chmod [選項] rwx的權限分值 文件或目錄
      
      • 權限分值 r=4, w=2, x=1
      chmod [選項] 身份標識(+|-)(r|w|x) 文件或目錄
      
      • 身份標識 u=user所屬用戶 , g=group所屬組, o=other其他用戶, a=all(u+g+o)所有用戶
    • 選項

      • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
      # 更改文件/local/myscript.sh的權限
      # 文件擁有者權限=7(r+w+x) 同組用戶權限=5(r+x) 其他用戶權限=5(r+x)
      chmod 755 /local/myscript.sh
      
      # 去掉其他用戶對文件/local/myscript.sh的寫權限
      chmod o-w /local/myscript.sh
      
      # 去掉其他用戶對文件/local/myscript.sh的寫權限,給同組用戶加上執行權限
      chmod o-w,g+x /local/myscript.sh
      
      # 更改目錄/local的權限
      chmod -R 754 /local
      

    chattr / lsattr 隱藏屬性

    chattr命令可以用來修改文件或目錄的隱藏屬性,只有root用戶可以使用

    • 語法

      chattr [選項] (+|-|=)屬性 文件或目錄
      
      • + 表示增加該屬性
      • - 表示去掉該屬性
      • = 表示去掉其他屬性,只保留該屬性
    • 選項

      • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
    • 屬性

      • a 設置后只能增加數據,而不能刪除或修改數據
      • i 設置后不能被刪除、改名、設定鏈接也無法新增,相當於鎖定
      • s 徹底刪除的屬性,即有該屬性的文件刪除后無法恢復
      • u 當一個應用程序請求刪除這個文件,系統會保留其數據塊以便以後能夠恢復,預防意外刪除
      # 給test.txt文件添加a屬性,使其只能增加數據
      chattr +a /local/test.txt
      
      # 去掉改屬性
      chattr -a /local/test.txt
      

    lsattr 命令可以查看隱藏屬性

    • 語法

      lsattr [選項] [文件或目錄]
      
    • 選項

      • -a 显示隱藏文件
      • -d 显示目錄的屬性,而不是目錄中內容
      # 查看test.txt文件的隱藏屬性
      lsattr /local/test.txt
      
      # 查看/local目錄的隱藏屬性
      lsattr -d /local
      
      # 查看當前目錄下的文件或目錄的隱藏屬性,包含吟唱文件
      lsattr -a
      

    crontab 定時任務

    crontab命令用來管理需要周期性執行的任務,與Windows下的計劃任務類似,依賴於crond服務執行,定時任務的配置文件一般以用戶為單位,放在/var/spool/cron目錄中,執行日誌是/var/log/croncrontab通過cron 表達式來進行定時任務的配置

    • 避免資源分配不均勻,即多個定時任務在同一時間點執行時,盡量錯開
    • 取消不要的輸出選項,將執行結果 >> /dev/null中,避免一直發郵件
    • 一般情況下周與日、月不可同時共存
    • anacron是可喚醒關機期間的工作任務的配置,有檢測機制,針對不24小時開機的服務器,需要的自行百度
    # cron表達式 分時日月周:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    # *    代表任何時刻
    # ,    代表分隔時段
    # -    代表時間範圍
    # /N   N為数字,表示執行幾次
    
    • crontab 常用命令

      # 显示當前用戶crontab配置
      crontab -l
      
      # 編輯當前用戶crontab配置
      crontab -e
      
      # root用戶可以幫其他用戶新建/刪除crontab配置
      crontab -u guest
      
    • crontab 配置示例

      # 每1分鐘執行一次
      * * * * * echo $(date) >> /dev/null
      
      # 每5分鐘執行一次後面的命令
      */5 * * * * echo $(date) >> /local/my_crontab.txt
      
      # 每2小時執行一次後面的命令
      * */2 * * * echo $(date) >> /local/my_crontab.txt
      
      # 在3:00與10:00的時候執行一次
      * 3,10 * * * echo $(date) >> /local/my_crontab.txt
      
      # 在10:00到22:00之間每2小時執行一次
      * 10-22/2 * * * echo $(date) >> /local/my_crontab.txt
      
      # 在21:00到21:30之間每5分鐘執行一次
      0-30/5 21 * * * echo $(date) >> /local/my_crontab.txt
      
      # 每周一0點執行一次
      0 0 * * 1 echo $(date) >> /local/my_crontab.txt
      
      # 每年的5月20日00:00分都會給rose發一封情書郵件
      0 0 20 5 * mail rose < /home/jack/lover.txt
      

    df 磁盤使用情況

    df命令用於显示文件系統的磁盤使用信息

    • 語法

      df [選項] 
      
    • 選項

      • -h 以人類可讀的格式显示(K|M|G)
      • -i 显示inode文件的數量和使用量
      • -T 显示磁盤的文件系統類型
      # 显示磁盤使用情況
      df -h
      # 显示inode信息
      df -hi
      

    date 系統時間 / hwclock 硬件時鐘

    linux系統有兩個時鐘:一個是由主板電池驅動的硬件時鐘(Real Time Clock),也叫做RTC或者叫CMOS時鐘。當操作系統關機的時候,用這個來記錄時間,但是對於運行的系統是不用這個時間的;另一個時間是系統時鐘(System clock)也叫內核時鐘或者軟件時鐘,是由軟件根據時間中斷來進行計數的,內核時鐘在系統關機的情況下是不存在的,所以,當操作系統啟動的時候,內核時鐘是要讀取RTC時間來進行時間同步。並且在系統關機的時候將系統時間寫回RTC中進行同步。

    date 命令比較常用,可以用來显示和設定系統的日期和時間,在显示方面還可以自定義格式

    • 語法

      date [+格式] [選項]
      
    • 格式

      • %Y 年 {0000..9999}
      • %m 月 {1..12}
      • %d 日 {01..31}
      • %H 時 {00..23}
      • %M 分 {00..59}
      • %S 秒 {00..59}
      • %N 納秒 {000000000..999999999}
      • %u 星期 {1..7}
      • %j 一年的第多少天 {001..366}
      • %F 完整的日期,相當於 %Y-%m-%d
      • %T 完整的時間,相當於 %H:%M:%S
      • %R 鐘錶上显示的時間, 相當於 %H:%M
      • %s 從1970-01-01 00:00:00 UTC 到現在的秒數
      # 格式化显示當前系統時間
      [root@God ~]# date "+%F %T.%N"
      2020-06-22 20:34:36.179451922
      
      # 显示今天是今年的第多少天
      [root@God ~]# date "+%j"
      174
      
      # 設置系統時間為2012-12-12 12:12:12
      [root@God ~]# date -s "2012-12-12 12:12:12"
      Wed Dec 12 12:12:12 CST 2012
      [root@God ~]# date
      Wed Dec 12 12:12:12 CST 2012
      
    • 選項

      • -d DATESTR 該選項非常強大,可以根據DATESTR的描述显示時間
      • -s DATESTR 根據DATESTR的描述,設置系統時間,把-d換成-s即可
      # 年year 月month 日day 時hour 分min 秒seconds 
      
      # 显示1天前的時間
      date -d "-1day"
      
      # 显示100天後的時間
      date "+%F %T" -d "+100day"
      
      # 显示新中國成立100周年是哪天
      date "+%F" -d "1949-10-01 +100year"
      # 設置日期為新中國成立100周年那天
      date "+%F" -s "1949-10-01 +100year"
      
    • 硬件時鐘hwclock的常用命令

      # 显示硬件時鐘時間
      hwclock
      
      # 將當前系統時間寫入硬件時鐘
      hwclock -w
      
      # 以系統時鐘為準,同步硬件時鐘
      hwclock --systohc
      
      # 以硬件時鐘為準,同步系統時鐘
      hwclock --hctosys
      
      # 將硬件時鐘設置成指定的時間
      hwclock --set --date="2008-08-08 08:08:08"
      
    • 使用ntpdate命令將本機時間與時間服務器的時間進行同步,沒有這個命令使用yum install ntpdate安裝

      # 將本機時間與阿里雲時間服務器時間進行同步 ntp[1-7].aliyun.com
      ntpdate ntp7.aliyun.com
      

    diff 文件比較

    diff命令可以快速比較兩個文件或目錄是否有不同

    • 語法

      # 比較文件
      diff [選項] 文件1 文件2
      # 比較目錄
      diff [選項] 目錄1 目錄2
      
    • 選項

      • -b 忽略一行當中僅有多個空白的區別(例如”about me”與”about me”視為相同)
      • -B 忽略空白行的區別
      • -i 忽略大小寫的區別
      # 比較兩個文件
      diff /etc/hosts /etc/hosts.bak
      

    echo 標準輸出

    echo命令用於打印字符串或變量的值,在shell腳本中極為常用,可以做出進度條效果,也可以打印彩色文字,詳情自行百度

    • 選項

      • -e 開啟轉義字符
      # 轉義:開啟與不開啟的區別
      [root@God test]# echo "Hello \n World"
      Hello \n World
      [root@God test]# echo -e "Hello \n World"
      Hello 
       World
       
      # echo 單引號與雙引號的區別
      [root@God test]# echo "$PATH"
      /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
      [root@God test]# echo '$PATH'
      $PATH
      
      [root@God test]# echo "Hello,World!"
      -bash: !": event not found
      [root@God test]# echo 'Hello,World!'
      Hello,World!
      

    find / locate 文件搜索

    find支持各種姿勢的查找方式,提供了相當多的查找條件,功能很強大。也正因如此它的選項也很多,有時使用起來也是比較耗費系統資源的,特別是直接從 / 下查找的時候,在實際使用中應盡量縮小查找目錄範圍,把/替換成你指定的查找路徑即可

    • 語法

      find [選項] 查找路徑 查找條件 動作
      
    • 選項

      • -L 跟隨符號鏈接,加上此選項意味着會搜索鏈接指向的目錄
    • 條件

      • -name NAME 根據名稱進行查找,支持通配符
      • -mtime +-DAY 根據修改時間按天查找。如+7代表7天(不含)前,-7代表7天(含)內
      • -mmin +-MIN 根據修改時間按分鐘查找。
      • -type TYPE 根據文件類型查找 TYPE的值有d目錄,f普通文件, l符號鏈接等
      • -size +-SIZE 根據文件大小查找。如+100M代表大於100MB的文件,-50M代表小於50MB的文件
      • -perm MODE 根據文件權限查找
      • -maxdepth N N為数字,表示查找深度
      • -user USER 根據用戶名查找
      • -uid UID 根據用戶ID查找
      • -gid GID 根據組ID查找
      • -empty 查找空文件或空目錄,即大小為0bytes
    • 動作

      • -delete 刪除查找出來的文件,目錄只能刪除空目錄
      • -ok CMD {} \; 交互式執行命令,每次執行前會詢問
      • -exec CMD {} \; 直接執行命令,不詢問
      • 說明
        • {} 表示的是查找出來的結果
        • ; 表示的是結束命令,因為;在各個系統中會有不同的意義,所以在前面的\是轉義字符,為了防止系統出錯。如果你不願意\,使用';'結束也是可以的
      # 查找下1層的目錄
      find / -maxdepth 1 -type d 
      
      # 查找下2層的目錄
      find / -maxdepth 2 -type d 
      
      # 根據名稱精確查找
      find / -name "restart_tomcat.sh"
      
      # 根據名稱模糊查找
      find / -name "*.log"
      
      # 根據修改時間查找
      find / -name "*.log" -mtime +7 
      
      # 查找是否有權限為777的文件
      find / -type f -perm 777 | xargs ls -l
      
      # 找到7天前的日誌文件,直接將其刪除
      find / -type f -name '*.log' -mtime +7 -delete
      
      # 找到7天前的日誌文件,並詢問是否將其刪除
      find / -type f -name '*.log' -mtime +7 -ok rm -rf {} \;
      
      # 找到7天前的日誌文件,直接將其刪除
      find / -type f -name '*.log' -mtime +7 -exec rm -rf {} \;
      
      # 使用 xrags 命令實現刪除
      find / -type f -name '*.log' -mtime +7 | xargs rm -rf
      

    locate命令用來查找文件或目錄,要比find命令快很多,原因在於它不搜索具體目錄,而是通過/var/lib/mlocate/mlocate.db自身創建的數據庫進行搜索,這個數據庫含有本地所有文件信息。每天自動更新一次庫中的數據,有時剛創建的文件使用locate搜索不到時就是因為庫中的數據沒有及時更新,為了避免這種情況,在使用locate命令之前可以使用updatedb命令手動更新。如果沒有locate命令,則需要安裝一下yum -y install mlocate

    • 語法

      locate [選項] 查找條件    # 查找條件支持通配符和正則表達式
      
    • 選項

      • -c 只显示找到的數量
      • -i 忽略大小寫
      • -r 使用基礎正則表達式
      • --regex 使用擴展正則表達式
      # 使用前最好先更新一下數據庫
      updatedb
      
      # 查找包含 myfile 的文件和目錄
      locate myfile
      
      # 查找以myfile開頭的文件和目錄
      locate myfile*
      
      # 查找以myfile結尾的文件和目錄
      locate *myfile
      
      # 查找文件名為 1.txt 的文件
      locate -r "/1.txt$"
      

    free 查看內存使用

    free命令可以显示系統內存的使用情況,包括物理內存、交換內存(swap)和內核緩衝區內存

    • 語法

      free [選項]
      
    • 選項

      • -k 以KB為單位進行显示
      • -m 以MB為單位進行显示
      • -g 以GB為單位進行显示
      • -h 以人類可讀的格式显示(K|M|G)
      • -s N N為数字,表示間隔描述,用於持續觀察內存使用狀況
      # 3秒一刷新,显示內存使用情況
      free -h -s 3
      

    head 查看文件前面的內容

    head命令用於查看文件頭部或行內頭部的內容

    • 語法

      head [選項] 文件
      
    • 選項

      • -n N N為数字,表示前N行
      • -c N N為数字,表示行內的前N個字節。UTF-8編碼中一個字母佔1字節,一個漢字佔3字節
    # 显示前100行內容
    head -n 100 /local/
    
    # 显示前5個字節的內容
    echo "Hello,World" | head -c 5
    

    history 命令歷史

    history 命令用於記錄和显示你在命令行敲過的每一條命令,相鄰的重複命令默認會合併成一個。命令歷史記錄太多會讓系統變得不安全,可以根據自己的需求自定義以下環境變量進行限制

    # 記錄命令歷史的文件
    HISTFILE=/root/.bash_history
    # 記錄命令歷史的文件最大記錄條數
    HISTFILESIZE=1000
    # 內存中命令歷史的最大記錄條數
    HISTSIZE=1000
    # 可以通過添加HISTTIMEFORMAT環境變量,記錄命令執行時間
    HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
    
    • 語法

      history [選項] 
      
    • 選項

      • N N為数字,显示最近執行過的N條命令
      • -c 清空內存中的歷史命令
      • -rHISTFILE設置的文件中的內容讀取到內存
      • -w-r相反,把內存中的命令歷史寫入到文件中
      # 查看命令歷史
      history
      
      # 執行第66條命令
      !66
      
      # 執行上一條命令
      !!
      

    ip 網絡配置管理

    ip命令作為iproute2工具包的核心命令,它是linux下管理網絡和流量控制的工具包,旨在替代老牌的工具鏈net-tools,即ifconfig, arp, route, netstat等命令。net-tools通過procfs(/proc)ioctl系統調用去訪問和改變內核網絡配置,而iproute2則通過netlink套接字接口與內核通訊。拋開性能而言,net-tools的用法給人的感覺是比較亂,而iproute2的用戶接口相對net-tools來說相對來說,更加直觀。比如,各種網絡資源(如link、IP地址、路由和隧道等)均使用合適的對象抽象去定義,使得用戶可使用一致的語法去管理不同的對象。如今很多系統管理員依然通過net-tools配置管理網絡,但自2001年起,Linux社區已經對齊停止維護。同時,一些Linux發行版比如Arch Linux和CentOS/RHEL 7則已經完全拋棄了net-tools,只支持iproute2。如果你仍在使用net-tools,而且尤其需要跟上新版Linux內核中的最新最重要的網絡特性的話,那麼是時候轉到iproute2的陣營了。原因就在於使用iproute2可以做很多net-tools無法做到的事情。ip命令非常強大,如果要完全運用的話估計能寫一本書了。這裏就隨用隨加了,需要深入自行查閱官方文檔。

    • 語法

      ip [選項] 對象 {命令}
      
      • ip 命令的選項不支持連着寫,每個都要加-並用空格分隔
    • 選項

      • -c 加上顏色显示
      • -s 显示更多的信息
    • 對象

      • address IP協議設備
      • link 網絡設備
      • route 路由表
      • 所有對象的名稱均支持完整寫法和縮寫,如address可寫成addr add a
      # 查看IP地址
      ip -c addr
      

    kill 結束進程

    kill命令可以發送一個信號SIGTERM默認為15給進程,可將指定程序終止。程序或工作的編號可以利用ps命令和jobs命令查看

    • 語法

      kill -信號  進程ID|工作ID
      
    • 信號

      • 1 啟動被終止的進程,可讓該PID重新讀取自己的配置文件,類似重新啟動
      • 2 相當於用鍵盤Ctrl+c來中斷一個進程的進行
      • 9 強制中斷一個進程的執行,如果該進程進行到一半,那麼尚未完成的部分可能會有”半產品”產生,比如vim會有.filename.swp保留下來
      • 15 以正常的進程結束方式來結束進程
      • 17 相當於用鍵盤Ctrl+z來暫停一個進程的進行
      # 強制結束PID為8886的進程
      kill -9 8886
      
      # 強制結束JOBNUMBER為2的進程
      kill -9 %2
      
      # 強制結束所有的以httpd啟動的進程
      killall -9 httpd
      

    ln 創建鏈接(快捷方式)

    ln 命令可以為文件或目錄創建一個鏈接(link),鏈接可分為兩種:硬鏈接和軟鏈接。軟鏈接相當於windows下的快捷方式

    • 語法

      ln [選項] 源  目標
      
    • 選項

      • -s 創建為軟鏈接
      # 在家目錄下創建一軟連接
      ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 ~/ifcfg-ens33
      

    ls 查看目錄中的內容

    ls命令用於显示指定工作目錄下之內容(列出目前工作目錄所含之文件及子目錄)。ll命令是系統自帶的一個別名命令,主要用於進行長列表显示內容

    • 語法

      ls [選項] [文件或目錄]
      
    • 選項

      • -a 显示所有內容,包括隱藏文件
      • -d 显示目錄本身,而不是目錄中的內容
      • -t 按照時間進行排序,最新的在最上面
      • -r 對排序進行翻轉
      • -l 使用長列表显示內容
      • -h 以人類可讀的格式显示(K|M|G)
      • --full-time 显示精確時間
      # 显示目錄下的所有內容
      ls -a 
      
      # 快速找到修改時間最新的文件,最下面那個就是
      ls -lrth
      

    less 分頁查看文件

    less是對文件或其他輸出進行分頁显示的工具,功能十分強大,而且不會一開始就加載整個文件,在性能和用法上比more更加的有彈性。使用less命令打開的內容可以使用各種功能按鍵來操作,個人感覺完全可以替代more,所以有人說less is more,相比於more,我更喜歡用less

    • 語法

      less [選項] 文件
      
    • 選項

      • -s 显示連續的空行為一個空行
      • -N 显示行號
      • -m 显示類似於more命令的百分比
      • -g 只標記最後搜索的關鍵詞
      • -i 搜索時忽略大小寫
    • 按鍵

      • h 查看幫助
      • ↑↓ 向上或向下一行
      • b 向上滾動一頁 PageUp
      • space 向下滾動一頁 PageDown
      • g 移動到第一行
      • G 移動到最後一行
      • N g/G N為数字,移動到第N行
      • q/Q 退出
      • / KEYWORD 進入向下搜索模式,可根據關鍵字進行搜索,n繼續往下找,N繼續往上找
      • & KEYWORD 輸入關鍵字,可僅显示包含關鍵字的行
      • F 類似於tail -f,實時讀取文件最新內容,按ctrl + c 停止
      # 使用 less 命令查看文件
      less -smN /etc/service
      
      # 使用 less 命令接收其他命令的標準輸出
      history | Dless
      

    mv 剪切 / 重命名 文件或目錄

    mv命令用來為文件或目錄重命名或移動文件或目錄(剪切)

    • 語法

      mv [選項] 源 目標
      
    • 選項

      • -i 若指定目錄已有同名文件,則先詢問是否覆蓋舊文件;
      • -f 如果目標存在,直接覆蓋不提示
      # 移動文件/local/hosts.bak到/local目錄下
      mv /etc/hosts.bak /local
      
      # 重命名文件hosts.bak為hosts
      mv /etc/hosts.bak /etc/hosts
      

    mkdir 創建目錄

    mkdir命令用來創建目錄

    • 語法

      mkdir [選項] 目錄
      
    • 選項

      • -m 創建目錄的同時設置權限
      • -p 如果父目錄不存在,則創建
      # 創建目錄/local/script,如果目錄/local不存在,會報錯
      mkdir /local/script
      
      # 創建目錄/local/script,如果目錄/local不存在,則創建
      mkdir -p /local/script
      
      # 創建目錄/local/script,如果目錄/local不存在,則創建,並給script目錄設定755的權限分數
      mkdir -pm 755 /local/script
      

    ps 查看進程

    ps命令用於显示當前進程的狀態,這個狀態是當前那些進程的快照,如果想要動態查看進程,請使用top命令,常用來通過管道命令搭配grep命令進行查詢,然後通過kill命令,刪除不需要的進程

    • 語法

      ps [選項]
      
    • 選項

      • -e 显示所有進程
      • -f 显示全格式列表,增加 UID、PPID、C與STIME欄位的显示
      # 根據關鍵字查找進程
      ps -ef | grep tomcat
      

    pwd 显示當前目錄

    pwd用於显示當前所在的路徑,加-P可显示真實路徑,而非鏈接路徑

    [root@God /]# ll -d /sbin
    lrwxrwxrwx. 1 root root 8 Jun 21 11:20 /sbin -> usr/sbin
    [root@God /]# cd sbin/
    [root@God sbin]# pwd    
    /sbin
    [root@God sbin]# pwd -P  
    /usr/sbin
    

    passwd 修改密碼

    passwd可以用來更改用戶的密碼,還可以鎖定與解鎖用戶

    • 語法

      passwd [選項] 用戶
      
    • 選項

      • -d 刪除密碼
      • -f 強迫用戶下次登錄時必須修改密碼
      • -w 設置密碼到期前提前警告的天數
      • -l 鎖定賬戶
      • -u 解鎖賬戶
      • -x 設置密碼有效天數
      # 修改當前用戶的密碼
      passwd
      
      # 修改其他用戶的密碼,root用戶修改其他用戶密碼,不需要提供原密碼
      passwd jack
      
      # 鎖定用戶
      passwd -l jack
      
      # 解鎖鎖定的用戶
      passwd -u jack
      

    rm 刪除文件或目錄

    rm 用於刪除文件或目錄,生產服務器執行刪除命令前一定要備份

    • 語法

      rm [選項] 文件或目錄
      
    • 選項

      • -i 刪除前詢問
      • -f 直接刪除,不確認
      • -r 刪除目錄時使用,否則無法刪除目錄
      # 刪除目錄下所有內容,並且不經過確認,慎用
      rm -rf /local
      
      # rm 刪除目錄下所有隱藏文件
      rm /local/.*
      
      # rmdir 只能刪除空目錄,目錄不為空無法刪除
      rmdir /local
      

    su 切換用戶

    su命令用於切換當前用戶,除了root外,需要輸入該用戶的密碼

    su命令和su -命令最大的本質區別就是:前者只是切換了root身份,但Shell環境仍然是普通用戶的Shell;而後者連用戶和Shell環境一起切換成root身份了。只有切換了Shell環境才不會出現PATH環境變量錯誤。su切換成root用戶以後,pwd一下,發現工作目錄仍然是普通用戶的工作目錄;而用su -命令切換以後,工作目錄變成root的工作目錄了。用echo $PATH命令看一下susu -以後的環境變量有何不同。以此類推,要從當前用戶切換到其它用戶也一樣,應該使用su -命令。

    # 切換到用戶執行命令,命令執行完在自動切換回來
    [root@God ~]# su jet -c ls
    ls: cannot open directory .: Permission denied
    [root@God ~]# su - jet -c ls
    1.txt
    

    stat 查看文件詳細信息

    stat命令可以查看文件的詳細信息

    • 語法

      stat [選項] 文件
      
    • 選項

      • -c FORMAT 格式化显示 FORMAT的取值可以查看幫助
      # 查看文件的權限
      [root@God ~]# stat -c %A testfile 
      -rw-r--r--
      [root@God ~]# stat -c %a testdir/
      755
      

    sort 排序 / uniq 去重

    sort命令用於對文本內容或者是對其他命令的輸出進行排序显示。

    • 語法

      sort [選項] 文件
      
    • 選項

      • -u 合併重複的行
      • -r 反向排序
      • -g 按照数字大小排序
      • -t SEP 按照SEP進行分列,默認為空格
      • -k N N為数字,表示根據第N列排序
      # 根據進程號排序查看進程
      ps -ef | sort -rgk 2
      

    uniq 命令用於去除重複的行,一般與sort搭配使用

    • 語法

      uniq [選項]  源數據
      
    • 選項

      • -c 統計重複行出現的次數
      • -d 僅显示重複出現的行
      • -u 僅显示出現一次的行
      # 統計IP地址出現的次數
      cat ip.txt | sort | uniq -c 
      

    split 分割文件

    split可以將大文件分割成若干個小文件

    • 語法

      split [選項] 文件 前綴
      
    • 選項

      • -d 給文件添加数字後綴
      • -b SIZE 根據大小進行分割,可以添加單位(b|k|m|g)等
      • -l N N為數字錶示行數,按照行數進行分割
      # 將catalina.out按照300m的大小進行分割,分割的文件會以catalog00,catalog01,catalog02的方式來建立
      split -db 300m catalina.out catalog
      
      # 將分割后的若干個小文件在還原
      more catalog* >> catalina.out
      

    tar 打包

    tar 命令用來打包或壓縮文件,選項相當多。一般只打包不壓縮的文件以.tar結尾,通過gzip進行打包壓縮的文件以.tar.gz結尾,通過bzip2進行打包壓縮的文件以.tar.bz2 結尾

    • 語法

      tar [選項] 壓縮文件名 操作目標
      
    • 選項

      • -c 創建打包文件
      • -x 釋放打包文件
      • -t 查看包文件內容
      • -v 显示詳細過程
      • -z 使用gzip的方式進行壓縮或解壓
      • -j 使用bzip2的方式進行壓縮或解壓
      • -h 同時打包鏈接指向的文件
      • -C 指定解壓目錄
      # 將目錄/local進行打包並使用gzip進行壓縮
      tar -zcvf local.tar.gz /local
      
      # 將local.tar.gz進行解壓並將打包文件釋放到當前目錄
      tar -zxvf local.tar.gz
      
      # 僅解壓指定的檔案local/script到當前工作目錄
      tar -zxvf local.tar.gz local/script
      
      # 將目錄/local進行打包並使用gzip進行壓縮,但排除以.log結尾的文件
      tar -zcvf local.tar.gz --exclude=*.log /local
      

    top 動態查看進程

    top命令可以實時的查看系統運行的整體情況,是一個綜合了多方信息監測系統性能和運行信息的實用工具。

    • 語法

      top [選項]
      
    • 選項

      • -d N N為数字,表示刷新秒數間隔
      • -b 以追加的方式显示結果
      • -n N N為数字,表示刷新次數
      • -p PIDLIST 只显示指定PID的進程,多個PID之間用,分隔
      • -u USER 只显示指定用戶的進程
      # 以1秒的時間間隔來動態查看進程
      top -d 1
      
      # 查看進程ID為 1 12 38 的進程信息
      top -d 1 -p 1,12,38
      

    tail 查看文件末尾內容

    tail 命令和head命令相反,用於查看文件末尾的內容,而且可以實時刷新

    • 語法

      tail [選項] 文件
      
    • 選項

      • -n N N為数字,表示末尾N行
      • -c N N為数字,表示行內的末尾的N個字節。UTF-8編碼中一個字母佔1字節,一個漢字佔3字節
      • -f 實時刷新显示文件內容
      # 實時查看文件/local/mylog.log末尾100行的內容
      tail -100f  /local/mylog.log
      

    touch 修改文件的時間屬性或創建空文件

    touch命令用於修改文件或者目錄的時間屬性,若文件不存在,則創建一個新的空文件。Linux下的三個時間屬性概念分別是atime(access time)讀取時間 、 mtime(modify time)修改時間、ctime(change time),注意ctime不是create time。實際工作中使用touch修改這些時間屬性的需求極少,相反大多數是用來創建一個或多個空文件。有點喧賓奪主的意思~

    • 語法

      touch [選項] 文件或目錄
      
    • 選項

      • -a 修改文件或目錄的讀取時間
      • -m 修改文件或目錄的修改時間
      • -t STAMP 指定時間戳,格式為[YYYY]MMDDhhmm[.ss]
      • -c 如果文件不存在,不要創建文件
      # 使用{}可一次性創建多個空文件,如 {1..10}  {a..z}  {1,3,5,7,9}
      # 創建一個空文件
      touch olympic.txt
      
      # 創建99空文件
      touch olympic{1..99}.txt
      
      # 修改文件的修改時間 mtime
      touch -cmt 200808080808.08 olympic.txt
      

    useradd / groupadd 用戶和組管理

    Linux系統是一個多用戶多任務的分時操作系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員申請一個賬號,然後以這個賬號的身份進入系統。用戶的賬號一方面可以幫助系統管理員對使用系統的用戶進行跟蹤,並控制他們對系統資源的訪問;另一方面也可以幫助用戶組織文件,併為用戶提供安全性保護。每個用戶賬號都擁有一個唯一的用戶名和各自的密碼。用戶在登錄時鍵入正確的用戶名和密碼后,就能夠進入系統和自己的家目錄。

    • 添加用戶

      # 添加一個普通用戶,不指定組的話會自動創建一個同名組
      useradd jack 
      
      # 添加一個普通用戶,並指定現有的組(組必須先存在)
      useradd -g root jet
      
      # 添加一個系統用戶,並不讓其登錄 -r 代表系統用戶,系統用戶不會有家目錄
      useradd -r -s /sbin/nologin  rose 
      
    • 刪除用戶

      # 只刪除用戶
      userdel jack
      
      # 刪除用戶,並刪除該用戶的家目錄(包括目錄中的內容)
      # 家目錄外的用戶所屬文件會替換成用戶ID,當有新的用戶使用這個ID時,該文件自動歸屬新用戶
      userdel -r jack
      
    • 修改用戶

      # 修改用戶的初始用戶組,通過名稱修改
      usermod -g root jack
      
      # 修改用戶的初始用戶組,通過GID修改
      usermod -g 888 jack
      
      # 相當於passwd -l,鎖定用戶
      usermod -L jack
      
      # 相當於passwd -u,解除鎖定
      usermod -U jack 
      
      # 禁止用戶登錄
      usermod -s /sbin/nologin jack
      
      # 修改用戶ID
      usermod -u 888 jack
      
    • 查看用戶

      # 查看當前用戶
      id
      
      # 查看當前登錄的用戶
      w
      
      # 查看所有的用戶
      cat /etc/passwd
      cat /etc/passwd | cut -d ':' -f 1
      
    • 添加用戶組

      # 建立一個一般用戶組
      groupadd mygroup
      
      # 建立一個系統用戶組
      groupadd -r admingroup
      
    • 刪除用戶組

      # 刪除用戶組
      groupdel admingroup
      
    • 修改用戶組

      # 修改組ID
      groupmod -g 888 mygroup
      
      # 修改組名稱 CIA為新名稱
      groupmod -n CIA mygroup
      
    • 查看用戶組

      cat /etc/group
      

    vi / vim 文本編輯器

    vivim用法基本一致,它們的關係有些類似於Windows下notepad與notepad++的關係,不過vim有時默認沒有安裝,需要yum -y install vim手動安裝一下。因為vim相比vi,功能更強大,又有語法高亮等功能。所以個人還是習慣並推薦使用vim。下面介紹的vim的使用方法,通常在vi上同樣適用,網上介紹vim使用的方式基本上就是說在三種模式下使用總結,即命令模式、輸入模式、底線命令模式,介紹十分詳盡,簡直快把整個vim的幫助給弄下來了。我這裏介紹的常用操作為單位,不是很全,但日常使用應該足夠了。

    • 打開文件

      # 打開一個文件
      vim /tmp/yum.log
      
      # 按 ctrl+w 然後按 上下左右鍵 可在窗口之間切換
      # 打開多個文件,縱向窗口分割,左右一邊一個窗口
      vim -O /etc/hosts /etc/hosts.bak
      # 打開多個文件,橫向窗口分割,上下一遍一個窗口
      vim -o /etc/hosts /etc/hosts.bak
      
    • 編輯文本

      • 打開文件后,按i鍵可在光標處插入內容;按o鍵可在光標處的下一行插入內容。此時底部會显示-- INSERT --字樣,按Esc鍵可退出編輯模式
    • 快速定位

      • : set nu 显示行號, 按 : 然後輸入set nu敲回車
      • : set nonu 取消显示行號
      • : N N為数字,表示行號,按 : 然後輸入11,敲回車即可快速移動光標到第11行,輸入$則移動到最後一行
      • N% N為数字,表示百分比,比如按58然後按一下%,即可移動光標到文件58%的部分
      • H | M | L 按這三個鍵可快速移動光標到屏幕的頂部、中間、底部位置
      • ctrl+u 往上翻半頁
      • ctrl+d 往下翻半頁
      • ↑↓←→ 移動光標
      • Home/End 移動光標到行首或行末
      • PageUp/PageDown 翻頁
    • 快速編輯

      • N yy N為数字,複製光標所在行以下的N行,默認N為1,即當前行。如複製 20 行,就按20,然後按yy就複製了
      • N ddyy用法一樣,只不過它是剪切。所以它也能當刪除使用
      • p 在光標所在行的下一行粘貼剛複製或剪切的內容
      • uu鍵,撤銷剛才的操作
      • ctrl+r 反撤銷
      • v 進入視圖模式,可通過上下左右移動光標選擇一片文本,此時底部會显示-- VISUAL --字樣(按Esc鍵可退出視圖模式)然後按y複製或按d剪切,按p在光標處後面粘貼
      • Vv一樣,只不過是以行為單位
      • ctrl+vv一樣,只不過是以列為單位,類似於在notepad++中,按住Alt選文字
    • 查找

      • / KEYWORD/進入查找,在底部/的後面輸入想查找的內容,按回車搜索,然後按n往下繼續查找,按N往上查找
    • 替換

      • :%s#OLD#NEW#gic 個人習慣先按:%s###g,然後移動光標到OLD位置輸入要替換的字符串,在移動光標到NEW位置,輸入新字符串,敲回車進行文字替換,%表示全文,不加代表當前行,用10,20替換百分號則表示替換10到20行;後面的gicg表示全局替換不加只替換每行的第一個;i 表示忽略大小寫,c表示在替換前進行確認,需要哪個加哪個
    • 退出和保存

      • Esc 當你進入編輯模式、命令模式等其他模式時,都可按Esc鍵退出
      • :w 保存
      • :wq 保存並退出
      • q! 強制退出不保存

    wc 統計字數行數

    wc命令可以統計字節數、行數、單詞數

    • 語法

      wc [選項] 文件
      
    • 選項

      • -l 統計行數
      • -c 統計字節數
      • -m 統計字符數
      # 依次列出/etc/passwd中的 行數、字數、字符數
      wc /etc/passwd
      
      # 查看有多少個進程數
      ps -ef | wc -l
      

    xargs 參數傳遞

    xargs是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具,它可以將管道或標準輸入的數據轉換成命令行參數,也能夠從文件的輸出中讀取數據。它能夠捕獲一個命令的輸出,然後傳遞給另外一個命令,一般與管道在一起使用

    # 找到修改日期在7天前的日誌,並將其刪除
    find /local/server -name "*.log" -mtime +7 | xargs rm -rf
    

    yum 紅帽系列包管理工具

    yum,是Yellow dog Updater, Modified 的簡稱,是杜克大學為了提高RPM 軟件包安裝性而開發的一種軟件包管理器,適用於Redhat系列的系統。用python寫成,yum 的宗旨是自動化地升級,安裝/移除rpm 包,收集rpm 包的相關信息,檢查依賴性並自動提示用戶解決。yum 主要功能是更方便的添加/刪除/更新rpm 包,自動解決包的依賴性問題,便於管理大量系統的更新問題。yum 可以同時配置多個資源庫(Repository),簡潔的配置文件(/etc/yum.conf),自動解決增加或刪除rpm包時遇到的依賴性問題。

    • 語法

      yum [選項] 命令 [包名]
      
    • 選項

      • -y 對所有的確認都回答yes
    • 命令

      • install PACKAGE 安裝包,PACKAGE替換成要安裝的包名
      • update PACKAGE 更新包
      • remove PACKAGE 卸載包
      # 安裝 vim 
      yum -y install vim
      

    zip / unzip 壓縮與解壓

    zip 是個廣泛使用的壓縮程序,壓縮后的文件後綴名為.zip

    # 將當前目錄下所有txt文本壓縮在一起
    zip txt.zip *.txt
    
    # 將目錄/local壓縮成local.zip文件
    zip -r local.zip /local
    
    # 將local.zip解壓縮到指定目錄,不加-d選項,則解壓到當前目錄
    unzip local.zip -d ~/
    

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    南投搬家公司費用需注意的眉眉角角,別等搬了再說!

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※教你寫出一流的銷售文案?

  • 【Spring註解驅動開發】關於BeanPostProcessor後置處理器,你了解多少?

    寫在前面

    有些小夥伴問我,學習Spring是不是不用學習到這麼細節的程度啊?感覺這些細節的部分在實際工作中使用不到啊,我到底需不需要學習到這麼細節的程度呢?我的答案是:有必要學習到這麼細節的程度,而且是有機會、有條件一定要學!吃透Spring的原理和源碼!往往拉開人與人之間差距的就是這些細節的部分,當前只要是使用Java技術棧開發的Web項目,幾乎都會使用Spring框架。而且目前各招聘網站上對於Java開發的要求幾乎清一色的都是熟悉或者精通Spring。所以,你,很有必要學習Spring的細節知識點。

    項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

    BeanPostProcessor後置處理器概述

    首先,我們來看下BeanPostProcessor的源碼,看下它到底是個什麼鬼,如下所示。

    package org.springframework.beans.factory.config;
    import org.springframework.beans.BeansException;
    import org.springframework.lang.Nullable;
    public interface BeanPostProcessor {
    	@Nullable
    	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    	@Nullable
    	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    }
    

    從源碼可以看出:BeanPostProcessor是一個接口,其中有兩個方法,postProcessBeforeInitialization和postProcessAfterInitialization兩個方法,這兩個方法分別是在spring容器中的bean初始化前後執行,所以spring容器中的每一個bean對象初始化前後,都會執行BeanPostProcessor接口的實現類的這兩個方法。

    也就是說,postProcessBeforeInitialization方法會在bean實例化和屬性設置之後,自定義初始化方法之前被調用,而postProcessAfterInitialization方法會在自定義初始化方法之後被調用。當容器中存在多個BeanPostProcessor的實現類時,會按照它們在容器中註冊的順序執行。對於自定義BeanPostProcessor實現類,還可以讓其實現Ordered接口自定義排序。

    因此我們可以在每個bean對象初始化前後,加上自己的邏輯。實現方式:自定義一個BeanPostProcessor接口的實現類MyBeanPostProcessor,然後在類MyBeanPostProcessor的postProcessBeforeInitialization和postProcessAfterInitialization方法裏面寫上自己的邏輯。

    BeanPostProcessor後置處理器實例

    我們創建一個MyBeanPostProcessor類,實現BeanPostProcessor接口,如下所示。

    package io.mykit.spring.plugins.register.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    
    /**
     * @author binghe
     * @version 1.0.0
     * @description 測試BeanPostProcessor
     */
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("調用了postProcessBeforeInitialization方法,beanName = " + beanName + ", bean = " + bean);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("調用了postProcessAfterInitialization,beanName = " + beanName + ", bean = " + bean);
            return bean;
        }
    }
    

    接下來,我們運行BeanLifeCircleTest類的testBeanLifeCircle04()方法,輸出的結果信息如下所示。

    調用了postProcessBeforeInitialization方法,beanName = animalConfig, bean = io.mykit.spring.plugins.register.config.AnimalConfig$$EnhancerBySpringCGLIB$$e8ab4f2e@56528192
    調用了postProcessAfterInitialization,beanName = animalConfig, bean = io.mykit.spring.plugins.register.config.AnimalConfig$$EnhancerBySpringCGLIB$$e8ab4f2e@56528192
    Cat類的構造方法...
    調用了postProcessBeforeInitialization方法,beanName = cat, bean = io.mykit.spring.plugins.register.bean.Cat@1b1473ab
    Cat的postConstruct()方法...
    Cat的init()方法...
    調用了postProcessAfterInitialization,beanName = cat, bean = io.mykit.spring.plugins.register.bean.Cat@1b1473ab
    Cat的preDestroy()方法...
    Cat的destroy()方法...
    

    可以看到,postProcessBeforeInitialization方法會在bean實例化和屬性設置之後,自定義初始化方法之前被調用,而postProcessAfterInitialization方法會在自定義初始化方法之後被調用。

    也可以讓實現Ordered接口自定義排序,如下所示。

    package io.mykit.spring.plugins.register.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.core.Ordered;
    import org.springframework.stereotype.Component;
    
    /**
     * @author binghe
     * @version 1.0.0
     * @description 測試BeanPostProcessor
     */
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("調用了postProcessBeforeInitialization方法,beanName = " + beanName + ", bean = " + bean);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("調用了postProcessAfterInitialization,beanName = " + beanName + ", bean = " + bean);
            return bean;
        }
    
        @Override
        public int getOrder() {
            return 3;
        }
    }
    

    再次運行BeanLifeCircleTest類的testBeanLifeCircle04()方法,輸出的結果信息如下所示。

    調用了postProcessBeforeInitialization方法,beanName = animalConfig, bean = io.mykit.spring.plugins.register.config.AnimalConfig$$EnhancerBySpringCGLIB$$b045438a@1ed1993a
    調用了postProcessAfterInitialization,beanName = animalConfig, bean = io.mykit.spring.plugins.register.config.AnimalConfig$$EnhancerBySpringCGLIB$$b045438a@1ed1993a
    Cat類的構造方法...
    調用了postProcessBeforeInitialization方法,beanName = cat, bean = io.mykit.spring.plugins.register.bean.Cat@36c88a32
    Cat的postConstruct()方法...
    Cat的init()方法...
    調用了postProcessAfterInitialization,beanName = cat, bean = io.mykit.spring.plugins.register.bean.Cat@36c88a32
    Cat的preDestroy()方法...
    Cat的destroy()方法...
    

    BeanPostProcessor後置處理器作用

    後置處理器用於bean對象初始化前後進行邏輯增強。spring提供了BeanPostProcessor的很多實現類,例如AutowiredAnnotationBeanPostProcessor用於@Autowired註解的實現,AnnotationAwareAspectJAutoProxyCreator用於SpringAOP的動態代理等等。

    除此之外,我們還可以自定義BeanPostProcessor的實現類,在其中寫入需要的邏輯。下面以AnnotationAwareAspectJAutoProxyCreator為例,說明後置處理器是怎樣工作的。我們都知道springAOP的實現原理是動態代理,最終放入容器的是代理類的對象,而不是bean本身的對象,那麼spring是什麼時候做到這一步的?就是在AnnotationAwareAspectJAutoProxyCreator後置處理器的postProcessAfterInitialization方法,即bean對象初始化完成之後,後置處理器會判斷該bean是否註冊了切面,如果是,則生成代理對象注入容器。Spring中的關鍵代碼如下所示。

    /**
      * Create a proxy with the configured interceptors if the bean is
      * identified as one to proxy by the subclass.
      * @see #getAdvicesAndAdvisorsForBean
      */
    @Override
    public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
        if (bean != null) {
            Object cacheKey = getCacheKey(bean.getClass(), beanName);
            if (this.earlyProxyReferences.remove(cacheKey) != bean) {
                return wrapIfNecessary(bean, beanName, cacheKey);
            }
        }
        return bean;
    }
    

    好了,咱們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一起學習一起進步!!

    項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

    寫在最後

    如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Spring註解驅動開發。公眾號回復“spring註解”關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發不再迷茫。

    部分參考:https://www.cnblogs.com/dubhlinn/p/10668156.html

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※別再煩惱如何寫文案,掌握八大原則!

  • NFC芯片選型及基本電路框架

    NFC芯片選型及基本電路框架

    RFID作為一項專業度較高的技術,在一些公司,可能還會專門招聘專業的RFID工程師。本篇闡述的涉及到的只是基本選型設計、電路框架,關於RFID天線調試、低功耗檢卡調試等,後續再其他篇章會繼續更新!

     

    NFC(Near Field Communication)芯片選型:

     

    主要考量點:

    芯片支持的協議、是否支持低功耗檢卡、是否能過金融認證、芯片價格

     

    芯片支持協議:

    • ISO14443A/B、ISO15693、 ISO18092 和 ISO21481 等

    • ISO14443A 卡:Mifare 系列、 Ultralight 系列、 Plus 系列、 CPU 卡系列等。

    • ISO14443B 卡:身份證、 SR176、 SRI512 等。

    • ISO15693:NXP 的 ICODE 系列、 TI 的 Tag_it HF-I、 ST LRI 等。

    • ISO18092:包括讀卡模式、卡模式、點對點通信模式。

    • ISO21481:在 ISO18092 基礎上兼容 ISO15693 協議。

    • LPCD 功能:芯片低功耗檢測卡片功能。沒有卡片靠近時,芯片處於低功耗狀態, 僅需10uA 電流,就能完成卡片偵測, 當卡片靠近時,芯片偵測到卡片,喚醒單片機讀卡。

    • 金融認證:PBOC2.0/3.0 標準、 EMV 標準

     

    電路架構:

     

    NFC芯片外部電路通常由以下幾個部分組成:供電電路、通信接口電路、天線電路、振蕩電路;

    供電電路:主要包括模擬電源AVDD、数字電源DVDD、發射器電源TVDD、引腳電源PVDD、測試引腳電源PVDD2;

    a. 如果需要提高發射功率可提高TVDD的電壓,例如5V供電的TVDD形成的發射功率會比3V的要強;

    b. 芯片的供電電流通常在幾十到幾百mA,主要的能量消耗在發射器的電路上。例如FM175xx的天線發射電流在100mA,RC663則可以達250mA,因此選擇供電芯片、電感器件時,需要注意留足余量;

    c.讀卡芯片天線13.56MHz的正弦波信號會幹擾電源,為減少傳導干擾,可以在電源端加π型濾波器,但為減少電路設計冗餘度,一般情況下不添加。

     

    通信接口:

    通常都支持SPI/I2C/UART,一般通過外部引腳配置選擇,為方便升級,可做兼容設計;

     

    天線設計:

    天線電路主要由4部分組成:EMC濾波、匹配電路、天線、接收電路。以FM17550為例,如下:

    濾波電路:

    由L1、C1組成的低通濾波器用於濾除13.56MHz的衍生諧波,該濾波器截止頻率應設計在14MHz以上。L1電感不可靠近擺放,以免互相干擾(互感效應)。濾波電路元件匹配公式:f=1/(2π√LC)

     

    匹配電路:

    用於調節發射負載和諧振頻率。射頻電路功率受芯片內阻和外阻抗影響,當芯片內阻和外阻抗一致時,發射功率效率最高。C2是負載電容,天線感量越大,C2取值越小。C3是諧振電容,取值和天線電感量直接相關,使得諧振頻率在13.56MHz。

     

    接收電路:

    C4濾除直流信號,R2和R3組成分壓電路,使得RX接收端正弦波信號幅度在1.5-3V之間。

     

    天線:

    • 由R1電阻(通常是1ohm或0ohm)和印製PCB組成。

    • 天線越大,讀卡距離越遠,當天線面積達到5cm x 5cm以後,再增大天線,讀卡距離沒有明顯提升。

    • 天線線寬建議選擇0.5mm – 1mm。天線大於5cm x 5cm不能多於3圈,小於3cm x 3cm不能小於4圈

    • 為減小EMC輻射干擾,需要將PCB走線轉角處畫成圓弧。

    • 天線區域內和天線邊緣禁止將信號、電源、地線畫成圈或者半圓,天線圈內不可有大面積金屬物體、金屬鍍膜,避免引起磁場渦流效應造成能力嚴重損耗。

    • 天線PCB繞線方式是相對的,不是同向。

    • 天線電路設計元件的精度應控制在2%以內,否則容易導致天線諧振頻點偏差,導致讀卡性能嚴重下降,產品一致性難以保證

    天線大小和讀卡距離關係

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※別再煩惱如何寫文案,掌握八大原則!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

  • 測試同學動手搭個簡易web開發項目

    測試同學動手搭個簡易web開發項目

    技術棧

    node.js, vue.js, axios, python, django, orm, restful api, djangorestframework, mysql, nginx, jenkins.

    環境配置

    操作系統

    Windows 7 旗艦版,Service Pack 1。

    前端

    Node.js

    >node -v
    v12.18.0
    >npm -v
    6.14.4
    

    Vue.js

    >vue -V(大寫)
    @vue/cli 4.4.1
    

    後端

    Python

    >python --version
    Python 3.7.2
    

    Django

    >python -m django --version
    3.0.7
    

    數據庫

    MySQL

    >mysqladmin --version
    mysqladmin  Ver 8.0.19 for Win64 on x86_64 (MySQL Community Server - GPL)
    

    命令行登錄mysql,

    >mysql -u root -p
    Enter password: ******
    

    查詢數據庫,

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | new_schema         |
    | performance_schema |
    | sakila             |
    | sys                |
    | world              |
    +--------------------+
    7 rows in set (0.00 sec)
    

    代理

    Nginx

    在nginx安裝目錄執行start nginx,瀏覽器訪問http://localhost:80,

    持續集成

    Jenkins

    安裝后,會自動打開http://localhost:8080/,

    軟件安裝過程就不贅述了,聰明的你一定知道怎麼安。

    項目搭建

    本文的目的是走通整個項目的鏈路,於是會“弱化”掉系統功能的實現。

    創建後端工程

    執行django-admin startproject djangotest創建項目。

    cd djangotest,執行python manage.py startapp myapp創建應用。

    python manage.py runserver,啟動服務,訪問http://localhost:8000/,

    創建RESTful API

    安裝mysqlclient和djangorestframework,

    pip --default-timeout=6000 install -i https://pypi.tuna.tsinghua.edu.cn/simple mysqlclient
    
    pip --default-timeout=6000 install -i https://pypi.tuna.tsinghua.edu.cn/simple djangorestframework
    

    在settings.py中,添加’rest_framework’和’myapp’,

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    
        'rest_framework',
    
        'myapp',
    ]
    

    同時修改數據庫配置,

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'NAME': 'world',
            'USER': 'root',
            'PASSWORD': '123456'
        }
    }
    

    在myapp\models.py添加model,model叫做HellloDjango,有2個字段id和name,

    from django.db import models
    
    # Create your models here.
    
    
    class HelloDjango(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(null=False, max_length=64, unique=True)
    

    執行python manage.py makemigrations,提交,

    >python manage.py makemigrations
    Migrations for 'myapp':
      myapp\migrations\0001_initial.py
        - Create model HelloDjango
    

    執行python manage.py migrate,創建,

    >python manage.py migrate
    Operations to perform:
      Apply all migrations: admin, auth, contenttypes, myapp, sessions
    Running migrations:
      Applying contenttypes.0001_initial... OK
      Applying auth.0001_initial... OK
      Applying admin.0001_initial... OK
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying admin.0003_logentry_add_action_flag_choices... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0002_alter_permission_name_max_length... OK
      Applying auth.0003_alter_user_email_max_length... OK
      Applying auth.0004_alter_user_username_opts... OK
      Applying auth.0005_alter_user_last_login_null... OK
      Applying auth.0006_require_contenttypes_0002... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying auth.0009_alter_user_last_name_max_length... OK
      Applying auth.0010_alter_group_name_max_length... OK
      Applying auth.0011_update_proxy_permissions... OK
      Applying myapp.0001_initial... OK
      Applying sessions.0001_initial... OK
    

    看看數據庫,新增了auth_和django_開頭的表,以及model映射的表myapp_hellodjango,

    mysql> show tables;
    +----------------------------+
    | Tables_in_world            |
    +----------------------------+
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | city                       |
    | country                    |
    | countrylanguage            |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    | myapp_hellodjango          |
    +----------------------------+
    14 rows in set (0.00 sec)
    

    插入2條測試數據,

    mysql> insert into myapp_hellodjango(name) values('hello');
    Query OK, 1 row affected (0.09 sec)
    
    mysql> insert into myapp_hellodjango(name) values('django');
    Query OK, 1 row affected (0.20 sec)
    
    mysql> select * from myapp_hellodjango;
    +----+--------+
    | id | name   |
    +----+--------+
    |  2 | django |
    |  1 | hello  |
    +----+--------+
    2 rows in set (0.00 sec)
    

    照着官網的例子,在myapp目錄下新增urls.py,添加rest代碼,

    from django.conf.urls import url, include
    from rest_framework import routers, serializers, viewsets
    
    from .models import HelloDjango
    
    
    # Serializers define the API representation.
    class HelloSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = HelloDjango
            fields = ['id', 'name']
    
    
    # ViewSets define the view behavior.
    class HelloViewSet(viewsets.ModelViewSet):
        queryset = HelloDjango.objects.all()
        serializer_class = HelloSerializer
    
    
    # Routers provide an easy way of automatically determining the URL conf.
    router = routers.DefaultRouter()
    router.register(r'hello', HelloViewSet)
    
    urlpatterns = [
        url(r'demo/', include(router.urls)),
    ]
    
    

    在djangotest下的urls.py中添加路由,

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('api/', include('myapp.urls'))
    ]
    

    通過這2個urls.py文件的指定,api接口的路徑為,/api/demo/hello。

    執行python manage.py runserver啟動服務,使用postman來調用http://127.0.0.1:8000/api/demo/hello/。先發1個post請求,往數據庫新增1條數據,

    再發1個get請求,會看到返回了3條數據,2條預先插入的數據,1條post請求新增的數據,

    創建前端工程

    在djangotest根目錄下,執行vue create vuetest,創建vue工程。

    默認安裝,一路回車,啪啪啪。

    開始創建,

    Vue CLI v4.4.1
    a  Creating project in D:\cicd\vuetest.
    a  Initializing git repository...
    aa Installing CLI plugins. This might take a while...
    

    創建成功,

    a  Successfully created project vuetest.
    a  Get started with the following commands:
    
     $ cd vuetest
     $ npm run serve
    

    執行cd vuetestnpm run serve,前端工程就啟動起來了,訪問http://localhost:8080/,Welcome to Your Vue.js App,

    前端調後端接口

    此時djangotest的目錄結構為,

    ├─djangotest
    │  ├─djangotest
    │  ├─myapp  # app
    │  ├─vuetest  # 前端
    │  ├─manage.py
    

    修改vuetest\src\components\HelloWorld.vue,添加{{info}},用來展示後端api返回的數據,

    <div class="hello">
      {{info}}
        <h1>{{ msg }}</h1>
    

    同時在<script>中使用axios添加ajax請求,請求http://127.0.0.1:8000/api/demo/hello/,將response.data賦值給info,

    <script>
    export default {
      name: 'HelloWorld',
      props: {
        msg: String
      },
      data() {
        return {
            info: 123
        }
      },
      mounted () {
        this.$axios
          .get('http://127.0.0.1:8000/api/demo/hello/')
          .then(response => (this.info = response.data))
          .catch(function (error) { // 請求失敗處理
            console.log(error);
          });
      }
    }
    </script>
    

    為了運行起來,需要安裝axios,

    npm install --save axios
    

    並在vuetest\src\main.js中引入,

    import Vue from 'vue'
    import App from './App.vue'
    import axios from 'axios'
    
    Vue.config.productionTip = false
    
    Vue.prototype.$axios = axios;
    
    new Vue({
      render: h => h(App)
    }).$mount('#app')
    

    分別啟動後端和前端服務,

    python manage.py runserver
    
    cd vuetest
    npm run serve
    

    嚯!ajax請求失敗了,F12可以看到報錯信息,

    localhost/:1 Access to XMLHttpRequest at ‘http://127.0.0.1:8000/api/demo/hello/’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

    django的端口是8000,vue的端口是8080,vue在請求django的時候,出現了跨域問題。瀏覽器有個同源策略,域名+端口+協議都相同才認為是同一來源。

    通過配置django來解決,先安裝django-cors-headers,

    pip install django-cors-headers
    

    在settings.py中添加中間件和開關,

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'corsheaders.middleware.CorsMiddleware',  # 添加
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    CORS_ORIGIN_ALLOW_ALL = True  # 添加
    

    此時vue就可以請求到django提供的接口了,http://localhost:8080/

    前後端結合

    vuetest目錄下創建vue.config.js,這是因為django只能識別static目錄下的靜態文件,這裏指定vue生成靜態文件時套一層static目錄,

    module.exports = {
        assetsDir: 'static'
    };
    

    在vuetest目錄下執行npm run build,生成靜態文件到vuetest/dist文件夾。

    修改urls.py,指定django的模板視圖,

    from django.conf.urls import url
    from django.contrib import admin
    from django.urls import path, include
    from django.views.generic import TemplateView
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('api/', include('myapp.urls')),
        url(r'^$', TemplateView.as_view(template_name="index.html")),
    ]
    

    在settings.py中配置模板目錄為dist文件夾,

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': ['vuetest/dist'],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    指定靜態文件目錄為vuetest/dist/static,

    # Add for vuejs
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "vuetest/dist/static"),
    ]
    

    瀏覽器訪問http://localhost:8000/,显示的不再是django的歡迎頁面,而是vue的頁面。

    前後端結合完成。vue的8080可以停了。

    Nginx轉發

    nginx常用3個命令,啟動,重新加載,停止,

    nginx start
    nginx -s reload
    nginx -s stop
    

    修改\conf\nginx.conf,監聽端口改為8090,添加轉發proxy_pass http://localhost:8000;

       server {
            listen       8090;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm;
                proxy_pass http://localhost:8000;
            }
    

    執行nginx start,瀏覽器訪問http://localhost:8090/,也能正常訪問djangotest。

    通過nginx將8090轉發到了8000。

    持續集成

    本來想弄個pipline的,無奈家裡這台破機器安裝失敗,windows也沒有linux對jenkins支持好,只能將就做個雞肋版本。

    New Item,命名為vuetest,添加vue的build腳本,

    d:
    cd D:\cicd\djangotest\vuetest
    npm run build
    

    New Item,命名為djangotest,添加django的build腳本,

    d:
    cd D:\cicd\djangotest
    python manage.py runserver
    

    直接執行會報錯python不是可運行命令。添加python環境變量,在首頁左下角,

    把路徑D:\Python37添加為環境變量path並保存,

    建好的這2個job就可以用來編譯vue和啟動django了,

    專註測試,堅持原創,只做精品。歡迎關注公眾號『東方er』
    版權申明:本文為博主原創文章,轉載請保留原文鏈接及作者。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※超省錢租車方案

    ※教你寫出一流的銷售文案?

  • 新物種!泰國發現巨大「鯊齒龍」 位居食物鏈頂端

    摘錄自2019年10月11日自由時報報導

    由泰國、日本大學合力進行的研究,在泰國發現一種具有鯊狀齒的大型肉食性恐龍,長逾8公尺,是同一時期已知最大體型的掠食性恐龍。

    這份研究由泰國NRRU大學及日本福井縣立大學的研究人員合作進行,9日發表於,研究人員表示,從泰國出土、帶有鯊魚狀牙齒的掠食性恐龍被證實是前所未見的新物種,生存於1.15億年前的下白堊紀,並獲命名為「Siamraptor suwati」。

    研究報告指出,在這次考古研究中,科學家發現的化石至少來自4隻不同恐龍的個別部位,其中包括頭骨、齒骨、脊椎、尾部及四肢,推測其行進時以後二肢站立,前足則負責抓扣、撕扯。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※台北網頁設計公司全省服務真心推薦

    ※想知道最厲害的網頁設計公司"嚨底家"!

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※推薦評價好的iphone維修中心

  • 大數據:全球1/3碳排放 來自這20間公司

    環境資訊中心綜合外電;姜唯 編譯;林大利 審校

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • 歐盟執委會副主席被提名人 力挺2030碳排降50%目標

    環境資訊中心綜合外電;姜唯 編譯;林大利 審校

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    南投搬家公司費用需注意的眉眉角角,別等搬了再說!

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※教你寫出一流的銷售文案?

  • 稻米進口米價暴跌 菲農民世界糧食日上街抗議

    摘錄自2019年10月16日中央社報導

    菲律賓總統杜特蒂(Rodrigo Duterte)2月簽署稻米關稅法,取消稻米進口數量限制,允許民間貿易商選擇國家進口稻米,盼藉此改善國內稻米供應情形,降低市場價格。

    但在16日世界糧食日這一天,菲律賓農民運動(KMP)、全國務農婦女聯盟(Amihan)和守護稻米(Bantay Bigas)等農民組織率領10多名農民,帶著全空的鍋瓢到農業部前抗議稻米關稅法讓農民無米可下鍋。他們表示稻米關稅法(RTL)實施後,越南、泰國的廉價稻米進口使菲律賓米價暴跌,嚴重影響農民生計。

    菲律賓農民運動主席、農業改革部(DAR)前部長馬利安諾(Rafael Mariano)說,稻米關稅法實施後,「世界糧食日」在菲律賓已變成「世界無糧食日」。

    因應米價暴跌和農民訴求,馬尼拉當局正研議對進口稻米設定建議零售價。與此同時,「守護稻米」和婦女組織「嘉布瑞拉」(Gabriela)也發起連署,預計11月把連署書呈交參眾兩院議員,希望促成廢除稻米關稅法。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※別再煩惱如何寫文案,掌握八大原則!

  • 氣候變遷示威者中斷倫敦交通 與通勤民眾爆衝突

    摘錄自2019年10月17日中央社報導

    自「反抗滅絕」10月7日在倫敦發動新一波公民不服從運動以來,社運人士17日中斷了英國倫敦東區的鐵路交通,社群媒體影片顯示,一名爬上地鐵車廂的示威者與憤怒的通勤民眾爆發肢體衝突。

    英國交通警察局(BTP)表示,警方正因應在靠近倫敦金絲雀碼頭(Canary Wharf)金融區的沙德韋爾(Shadwell)、斯特拉特福(Stratford)及坎寧鎮(Canning Town)發生的事件。警方在聲明中指出:「已經展開逮捕行動,警方正致力迅速恢復服務。」

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※別再煩惱如何寫文案,掌握八大原則!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案