IDEA 插件推薦 —— 讓你寫出好代碼的神器!_包裝設計

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

概述

今天介紹的插件主要是圍繞編碼規範的。有追求的程序員,往往都有代碼潔癖,要盡量減少代碼的「壞味道」。

代碼靜態檢查是有很多種類,例如圈複雜度、重複率等。業界提供了很多靜態檢查的插件來識別這些不合規的代碼,幫助提高項目的質量。比較知名的一個產品是 SonarQube,它提供了一個「門禁」平台,集成了很多靜態檢查檢查。下次有機會介紹一下該平台的搭建。

本文主要介紹 IDEA 中對於 Java 語言靜態檢查的好插件:

  • Alibaba Java Coding Guidelines 阿里基於他們 Java 規範提供的插件
  • CheckStyle-IDEA 檢查代碼的格式是否符合規範
  • FindBugs-IDEA 檢查代碼是否有常見的一些 Bug

Alibaba Java Coding Guidelines

阿里巴巴 Java 編碼指南插件支持。

首先說說阿里的 p3c 項目,它的 Github 主頁地址是:https://github.com/alibaba/p3c 阿里之前開源過一份 Java 開發手冊。手冊從編程規約、異常日誌、單元測試、MySQL 數據庫、工程結構、設計規約等角度,介紹了阿里的 Java 開發規範,這個對於 Java 新手幫助挺大的,能夠學到不少東西。有一些坑可能老司機也會翻車。

開發人員 Coding 時,可能就忘記規範了,寫出來的代碼還是會有『壞味道』。這時候Alibaba Java Coding Guidelines 插件就派上用場了。它會根據上面的 Java 開發規範對你的代碼進行檢查,不符合規範的代碼會有提示,並給出修改建議。阿里作為國內 Java 大廠,基於成千上萬的工程師總結出來的踩坑經驗,我相信給出的規範建議還是比較可靠的。

上個栗子:

  String str = "hello";
  for (int i = 0; i < 100; i++) {
      str = str + "world!";
  }

先不要往下看,試着分析一下這段代碼哪裡可以優化?

其實,插鍵掃描的結果不僅有這個問題,還有『魔法数字』的問題。插件的用法,見下面的截圖。

除此以外,建議在 IDEA 進行代碼提交時,勾選上它提供的檢查項按鈕,這樣如果有不合規的代碼進行提交,就會提醒你修改:

CheckStyle-IDEA

項目主頁:https://github.com/jshiell/checkstyle-idea

安裝好之後,進入設置,勾選上你要選用的默認檢查規範:

大廠往往都有自己的語言規範,可以導入選用:

右鍵菜單,選擇 Check Current File 即可檢查當前文件是否符合編碼規範:

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

檢查結果:

如果不符合規範的寫法有點多,整改起來就會很痛苦了,這時候該怎麼辦?有一個功能叫格式化代碼(Reformat Code),快捷鍵是:

  • Mac:Command+Option+L
  • Win:Ctrl+Shift+L

如果想按照你指定的規則進行格式化,可以按照如下方式進行自定義:

FindBugs-IDEA

FindBugs 是一款老牌 Java 靜態檢查插件了。它的功能和阿里 p3c 那個插件很像,只不過它歷史悠久、國際化一點。它同樣的可以掃描代碼,發現一些可能會引入 Bug 的代碼段,給出參考建議。

啟動 FindBugs 的方式,右鍵菜單中,Findbugs 提供了好幾個選項:

  • Analyze Current File:檢查當前文件
  • Analyze Class uner Cursor:檢查光標處的類
  • Analyze Package Files:檢查包文件
  • Analyze Modul Files:檢查 Module 文件
  • Analyze Project Files:檢查項目文件
  • Analyze Scope Files:檢查指定範圍內的文件
  • Analyze All Modified Files:檢查所有修改過的文件
  • Analyze changelist files:檢查變更列表中的文件

檢查結果:

檢查結果分為如下類別:

  • Bad practice:不好的做法,代碼違反了公認的最佳實踐標準;
  • Malicious code vulnerbility:惡意的代碼漏洞;
  • Correctness:可能不正確,比如錯誤的強制類型轉換;
  • Performance:潛在的性能問題;
  • Security:安全性;
  • Dodgy code:糟糕的代碼,FindBugs團隊認為該類型下的問題代碼導 Bug 的可能性很高;
  • Experimental:實驗;
  • Multithreaded correctness:關注於同步和多線程問題;
  • Internationalization:國際化

掃描出來的結果怎麼看懂,官網有專門的一頁介紹 FindBugs Bug Description http://findbugs.sourceforge.net/bugDescriptions.html

除了上面右鍵菜單啟動檢查之外,還可以在相應文件夾右鍵菜單中啟動:

針對檢查的嚴格程度,其實是可以調節的,建議修改為 low,這樣會盡可能的掃描出有潛在 Bug 的代碼片段:

總結

以上是目前工作中經常用到的靜態代碼檢查插鍵,雖然不是用了它們就真的能寫出好代碼,但是這些工具的確能夠讓你能夠在前人的肩膀上少踩一些坑。比如阿里的那個檢查插鍵,你可以按照它的提示,對照着他們的 Java 開發手冊查看,分析一下,為何他們會有如此的規約。高樓大廈不都是一磚一瓦砌成的嘛?小知識點的基礎打紮實了,才能走得更高!

由於國內網絡問題,我提前將最新版的《阿里巴巴 Java 開發手冊(泰山版).pdf》上傳至雲盤了,有需要的小夥伴公眾號後台回復 泰山版 即可獲得下載鏈接。

一言

上周的寫的一篇文章分享到微信群里,群友有人指出來標題有錯別字,真是有點尷尬!其實,我寫文章也比較隨意,也是最近才開始堅持每周至少輸出一篇分享的。但想想既然寫了,就要盡量保證質量。引以為戒,以後要認真點才行!

目前分享的內容主要是開發環境、效率工具等。自己一直對這方面的文章比較感興趣,因此之前就有相關積累。今後希望能通過閱讀帶來一些讀書總結的分享,也希望關注的同學後台多留言,給出你的建議,感謝~

生命不息,折騰不止!關注 「Coder魔法院」,祝你 Niubilitiy !

參考

  • 代碼缺陷掃描神器——FindBugs:https://juejin.im/entry/591ad01ba22b9d005833903e

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

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

移動端適配-rem(新)_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

概念

對於移動端開發來說,無可避免的就是直面各種設備不同分辨率和不同DPR(設備像素比)的問題,在此忽略其他兼容性問題的探討。

移動端像素

  1. 設備像素(dp),也叫物理像素。指設備能控制显示的最小物理單位,意指显示器上一個個的點。從屏幕在工廠生產出的那天起,它上面設備像素點就固定不變了。

  2. 分辨率,屏幕上物理像素的數量。

  3. 設備獨立像素(dip),又稱密度無關像素。可以認為是計算機坐標系統中的一個點,這個點代表一個可以由程序使用並控制的虛擬像素。由相關係統轉化為物理像素在設備上體現。

  4. css像素,web編程中的概念,屬於設備獨立像素中的一種,獨立於設備,屬於邏輯上衡量像素的單位。

  5. 設備像素比(dpr) = 設備像素值(dps) / 設備獨立像素值(dips),代表系統轉化時一個css像素佔有多少個物理像素。

  6. 像素密度(ppi),設備(屏幕)每英寸內有多少個像素點。

移動端三個視口

移動端視口 viewport(div100%時的css大小):移動設備上的 viewport 就是設備的屏幕上能用來显示我們的網頁的那一塊區域,可能與瀏覽器的可視區域不同。默認比瀏覽器可視區域要大(980px),這也是為什麼一般的PC端網頁放在移動端會出現橫向滾動條的原因。

移動端中的三個不同的可視區域大小,來自於ppk關於移動設備的viewport研究:

  1. 布局視口(layout viewport),瀏覽器默認的viewport,一般比瀏覽器可視區域大。

  2. 視覺視口(visual viewport),瀏覽器的可視區域大小(瀏覽器的可見區域css像素值)

  3. 理想視口(ideal viewport),設備的實際物理寬度(device-width),是一種與ppi無關的設備原始的寬度(英寸),例如320px和660px下的iphone的理想視口都是320px。

位圖像素

一個位圖像素是柵格圖像(如:png, jpg, gif等)最小的數據單元。每一個位圖像素都包含着一些自身的显示信息(如:显示位置,顏色值,透明度等)。

理論上,1個位圖像素對應於1個物理像素,圖片才能得到完美清晰的展示。當遇上對應的位圖像素與物理像素不統一的時候。

  1. 位圖像素 < 物理像素。 1個位圖像素對應於多個物理像素,由於單個位圖像素不可以再進一步分割,所以只能就近取色,從而導致圖片模糊。(具體取決於設備系統的圖像算法,並不是簡單的切割圖片)(圖片拉伸)

  2. 位圖像素 > 物理像素。1個物理像素對應多個位圖像素,所以它的取色也只能通過一定的算法(显示結果就是一張位圖像素只有原圖像素總數四分之一的圖片),肉眼看上去雖然圖片不會模糊,但是會覺得圖片缺少一些銳利度,或者是有點色差(但還是可以接受的)(圖片擠壓)

rem適配

什麼是rem

即以根節點(html)的字體大小作為基準值進行長度計算。

假定 html 的 fontSize 為 16px,則 1rem = 16px

如果我們更改 html 的 fontSize,rem 也會更新,總是保持 1rem = 1 fontSize (html)

為什麼使用rem

開發過移動端項目的同學應該都知道,不同手機設備的大小是不一樣的,在進行移動端開發時,我們通常會為 html 加上 viewport meta

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">

這裏得結合上面的移動端像素和移動端視口進行分析,width=device-width將此時的頁面寬度設置為設備寬度(理想視口),所以此時頁面寬度等於設備寬度,不同手機的設備寬度是不同的所以頁面寬度也不同

iPhone4 頁面寬度 = window.innerWidth = 設備寬度 = 320px

iPhone6 頁面寬度 = window.innerWidth = 設備寬度 = 375px

所以為了適配不同的設備寬度,我們通常不直接用px來寫css代碼,因為在不同手機中頁面寬度不同,此時px的相對大小也是不同的。如果我們把一個元素設置為375px來達到100%寬度效果的話,在320設備寬度的手機就出問題了。

由此我們引入了 rem 來做適配,在 css 中直接使用 rem 作為計量單位,如果不做些什麼的話,1rem = 16px(瀏覽器默認字體大小),在不同手機上都是一樣,還是無法適配,所以要點在於如何根據設備寬度在做轉化

// 假定設計稿寬度750px
const designWidth = 750;

// 通過設備寬度(window.innerWidth)和設計稿寬度(designWidth)的比例來設置 html fontSize
document.documentElement.style.fontSize =  (window.innerWidth / designWidth) + 'px';

通過上面代碼的設置,我們就可以很輕鬆的適配移動端項目了,假定設計稿上一個元素寬度750px,那我們就在css定義750rem

在設備寬度為320px的手機上

750rem = 750 * 1rem = 750 * (window.innerWidth / designWidth) px = 750 * (320 / 750) px = 320px

同理,在設備寬度為375px的手機上

750rem = 750 * 1rem = 750 * (window.innerWidth / designWidth) px = 750 * (375 / 750) px = 375px

可能還有個問題,為什麼不直接用百分比來適配?因為百分比在很多情況下是除不盡或者帶有小數的,顯然帶有小數點的px會帶來各種各樣的誤差

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

高清適配

如果你覺得移動端適配像上面一樣簡單轉化下就行,那就 too young too sample

1px問題

什麼是 1px 問題?

以 iphone6 為例,大家應該聽過啥視網膜像素之類的,2倍屏之類的吧。其實也就是此時 設備像素比(dpr) = 設備像素值(dps) / 設備獨立像素值(dips),即一個css像素對應兩個物理像素,也就是你在css中寫的1px其實在設備显示的是兩個像素,當你設置 border = 1px 時看起來就沒有那種1px的纖細效果,總感覺不盡如人意,差那麼一點點味道。

你以為的1px

用戶看到的1px(請忽略顏色不同)

追求用戶體驗的公司通常是不能容忍 1px 問題的

圖片的模糊問題

同樣的以 iphone6 為例,我們如果定義一張圖片寬度為375px,如果圖片的像素(位圖像素),此時一個像素的圖片會對應兩個物理像素(參考上面的位圖像素),就會造成圖片模糊的問題了。你可能會問?那我直接加載750px像素的圖片不就好了(位圖像素大於物理像素時很多人是看不出失真的)。

答案當然是可以的,但你覺得追求用戶體驗的公司能容忍無故的流量耗費和性能浪費么?當然不能

解決方案

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">

前面也有介紹過這部分代碼,但是沒有說明 initial-scale=1 的作用,initial-scale 定義了頁面的初始縮放,1代表不縮放。initial-scale的值也會影響頁面寬度,即此時的css像素。

前面我們說過,在 viewport meta 的約束下

頁面寬度 = window.innerWidth = 設備寬度,但其實正確的是 頁面寬度 = window.innerWidth = 設備寬度 / scale,為什麼是除呢?大家可以想象一下,當頁面縮放時(例如scale=0.5),是不是會導致更多的內容內容展示在當前可見區域中,css像素(頁面)是變大了。

以 iphone6 為例,當我們設置

<meta name="viewport" content="width=device-width, initial-scale=0.5, user-scalable=no">

此時頁面寬度 = window.innerWidth = 設備寬度 / scale = 375 / 0.5 = 750px,也就是說現在頁面寬度(對應css像素)和物理像素是相等的,所以我們設置的 1px 在手機中將真正显示 1pt(1個物理像素),也就解決了1px的問題。

所以解決方法如下

// 獲取設備dpr
const dpr = window.devicePixelRatio;

// 計算縮放比例
const scale = 1 / dpr;

// 動態設置meta
const metaEl = doc.createElement('meta');
metaEl.setAttribute('name', 'viewport');
metaEl.setAttribute('content', 'width=device-width,initial-scale=' + scale + ', user-scalable=no');

對應圖片而言,要想達到最清晰的显示狀態則要使圖片的位圖像素與設備的物理像素對應,所以可以對圖片做如下適配

[dpr=1] img {
width: 200rem;
background: ‘@1x.png’;
}

[dpr=2] img {
width: 200rem;
background: ‘@2x.png’;
}

此方案的原理就是利用meta來更過css像素(因為css像素是虛擬像素由計算機定義的,見上文),以此達到一個css像素對應一個物理像素的效果,1px == 1pt

rem高清適配

利用上文提供的rem移動端適配思路,加上現在的高清適配思路,就可以完成移動端高清適配啦

直接貼代碼,來自前端:『REM』手機屏幕高清適配方案

(function(designWidth, rem2px) {
  var win = window;
  var doc = win.document;
  var docEl = doc.documentElement;
  var metaEl = doc.querySelector('meta[name="viewport"]');
  var dpr = 0;
  var scale = 0;
  var tid;

  if (!dpr && !scale) {
    var devicePixelRatio = win.devicePixelRatio;
    if (win.navigator.appVersion.match(/iphone/gi)) {
      if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
        dpr = 3;
      } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
        dpr = 2;
      } else {
        dpr = 1;
      }
    } else {
      dpr = 1;
    }
    scale = 1 / dpr;
  }

  docEl.setAttribute('data-dpr', dpr);
  if (!metaEl) {
    metaEl = doc.createElement('meta');
    metaEl.setAttribute('name', 'viewport');
    metaEl.setAttribute('content', 'width=device-width,initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');

    if (docEl.firstElementChild) {
      docEl.firstElementChild.appendChild(metaEl);
    } else {
      var wrap = doc.createElement('div');
      wrap.appendChild(metaEl);
      doc.write(wrap.innerHTML);
    }
  } else {
    metaEl.setAttribute('name', 'viewport');
    metaEl.setAttribute('content', 'width=device-width,initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
  }
  // 以上代碼是對 dpr 和 viewport 的處理,代碼來自 lib-flexible。

  // 一下代碼是處理 rem,來自上篇文章。不同的是獲取屏幕寬度使用的是 
  // document.documentElement.getBoundingClientRect
  // 也是來自 lib-flexible ,tb的技術還是很強啊。
  function refreshRem(_designWidth, _rem2px){
    // 修改viewport后,對網頁寬度的影響,會立刻反應到 
    // document.documentElement.getBoundingClientRect().width
    // 而這個改變反應到 window.innerWidth ,需要等較長的時間
    // 相應的對高度的反應,
    // document.documentElement.getBoundingClientRect().height 
    // 要稍微慢點,沒有準確的數據,應該會受到機器的影響。
    var width = docEl.getBoundingClientRect().width;
    var d = window.document.createElement('div');
    d.style.width = '1rem';
    d.style.display = "none";
    docEl.firstElementChild.appendChild(d);
    var defaultFontSize = parseFloat(window.getComputedStyle(d, null).getPropertyValue('width'));
    // d.remove();
    var portrait = "@media screen and (width: "+ width +"px) {html{font-size:"+ ((width/(_designWidth/_rem2px)/defaultFontSize)*100) +"%;}}";
    var dpStyleEl = doc.getElementById('dpAdapt');
    if(!dpStyleEl) {
      dpStyleEl = document.createElement('style');
      dpStyleEl.id = 'dpAdapt';
      dpStyleEl.innerHTML = portrait;
      docEl.firstElementChild.appendChild(dpStyleEl);
    } else {
      dpStyleEl.innerHTML = portrait;
    }
    // 由於 height 的響應速度比較慢,所以在加個延時處理橫屏的情況。
    setTimeout(function(){
      var height = docEl.getBoundingClientRect().height;
      var landscape = "@media screen and (width: "+ height +"px) {html{font-size:"+ ((height/(_designWidth/_rem2px)/defaultFontSize)*100) +"%;}}"
      var dlStyleEl = doc.getElementById('dlAdapt');
      if(!dlStyleEl) {
        dlStyleEl = document.createElement('style');
        dlStyleEl.id = 'dlAdapt'
        dlStyleEl.innerHTML = landscape;
        docEl.firstElementChild.appendChild(dlStyleEl);
      } else {
        dlStyleEl.innerHTML = landscape;
      }
    },500);
  }

  // 延時,讓瀏覽器處理完viewport造成的影響,然後再計算root font-size。
  setTimeout(function(){
    refreshRem(designWidth, rem2px);
  }, 1);

})(750, 100);

代碼比較多,有興趣的可以直接上github上找到源代碼(https://github.com/hbxeagle/rem/blob/master/HD_ADAPTER.md)

後記

這是一篇很早之前寫的總結了,今天又複習修改了一下,寫的有錯誤或者寫的不清楚的地方請大家多多指正。

這麼多年過去,其實現在已經逐漸流行直接使用 vw vh 來做移動端適配了,因為隨着設備的更新兼容性的問題已經大大減少。但使用 rem 模式還是有一定需求的,畢竟vw還沒有全部兼容,可以參考vw兼容性。還有就是有pc瀏覽器打開並限制最大寬度的需求使用vw就不可以了。

後面有時間將寫寫利用 vw vh 來進行移動端適配的總結,會比這個簡單。

參考

  • meta name=”viewport” content=”width=device-width,initial-scale=1.0″ 解釋

  • CSS像素、物理像素、邏輯像素、設備像素比、PPI、Viewport

  • 前端:『REM』手機屏幕高清適配方案

歡迎到前端學習打卡群一起學習~516913974

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

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

一個 json 轉換工具_台中搬家公司

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

      在前後端的數據協議(主要指httpwebsocket)的問題上,如果前期溝通好了,那麼數據協議上問題會很好解決,前後端商議一種都可以接受的格式即可。但是如果接入的是老系統、第三方系統,或者由於某些奇怪的需求(如為了節省流量,json 數據使用單字母作為key值,或者對某一段數據進行了加密),這些情況下就無法商議,需要在前端做數據轉換,如果不轉換,那麼奔放的數據格式可讀性差,也會造成項目難以維護。

 

      這也正是我在項目種遇到的問題,網上也找了一些方案,要麼過於複雜,要麼有些功能不能很好的支持,於是有了這個工具 class-converter。歡迎提 issue 和 star~~https://github.com/zquancai/class-converter

 

下面我們用例子來說明下:

面對如下的Server返回的一個用戶user數據:

{
    "i": 1234,
    "n": "name",
    "a": "1a2b3c4d5e6f7a8b"
}

或者這個樣的: 

{
    "user_id": 1234,
    "user_name": "name",
    "u_avatar": "1a2b3c4d5e6f7a8b"
}

數據里的 avatar 字段在使用時,可能需要拼接成一個 url,例如 https://xxx.cdn.com/1a2b3c4d5e6f7a8b.png

當然可以直接這麼做:

const json = {
    "i": 1234,
    "n": "name",
    "a": "1a2b3c4d5e6f7a8b",
};
const data = {};
const keyMap = {
    i: 'id',
    n: 'name',
    a: 'avatar',
}
Object.entries(json).forEach(([key, value]) => {
    data[keyMap[key]] = value;
});
// data = { id: 1234, name: 'name', avatar: '1a2b3c4d5e6f7a8b' }

然後我們進一步就可以把這個抽象成一個方法,像下面這個樣:

const jsonConverter = (json, keyMap) => {
    const data = {};
    Object.entries(json).forEach(([key, value]) => {
        data[keyMap[key]] = value;
    });
    return data;
}

如果這個數據擴展了,添加了教育信息,user 數據結構看起來這個樣:

{
    "i": 1234,
    "n": "name",
    "a": "1a2b3c4d5e6f7a8b",
    "edu": {
        "u": "South China Normal University",
        "ea": 1
    }
}

此時的 jsonConverter 方法已經無法正確轉換 edu 字段的數據,需要做一些修改:

const json = {
    "i": 1234,
    "n": "name",
    "a": "1a2b3c4d5e6f7a8b",
    "edu": {
        "u": "South China Normal University",
        "ea": 1
    }
};
const data = {};
const keyMap = {
    i: 'id',
    n: 'name',
    a: 'avatar',
    edu: {
        key: 'education',
        keyMap: {
            u: 'universityName',
            ea: 'attainment'
        }
    },
}

隨着數據複雜度的上升,keyMap 數據結構會變成一個臃腫的配置文件,此外 jsonConverter 方法會越來越複雜,以至於後面同樣難以維護。但是轉換后的數據格式,對於項目來說,數據的可讀性是很高的。所以,這個轉換必須做,但是方式可以更優雅一點。

寫這個工具的初衷也是為了更優雅的進行數據轉換。

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

 

工具用法

還是上面的例子(這裏使用typescript寫法):

import { toClass, property } from 'class-converter';
// 待解析的數據
const json = {
    "i": 1234,
    "n": "name",
    "a": "1a2b3c4d5e6f7a8b",
};
class User {
    @property('i')
    id: number;
    
    @property('n')
    name: string;
    
    @property('a')
    avatar: string;
}
const userIns = toClass(json, User);

你可以輕而易舉的獲得下面的數據:

// userIns 是 User 的一個實例
const userIns = {
    id: 1234,
    name: 'name',
    avatar: '1a2b3c4d5e6f7a8b',
}
userIns instanceof User // true

Json 類既是文檔又是類似於上文說的與keyMap類似的配置文件,並且可以反向使用。

import { toPlain } from 'class-converter';
const user = toPlain(userIns, User);
// user 數據結構
{
    i: 1234,
    n: 'name',
    a: '1a2b3c4d5e6f7a8b',
};

  

這是一個最簡單的例子,我們來一個複雜的數據結構:

{
  "i": 10000,
  "n": "name",
  "user": {
    "i": 20000,
    "n": "name1",
    "email": "zqczqc",
    // {"i":1111,"n":"department"}
    "d": "eyJpIjoxMTExLCJuIjoiZGVwYXJ0bWVudCJ9",
    "edu": [
      {
        "i": 1111,
        "sn": "szzx"
      },
      {
        "i": 2222,
        "sn": "scnu"
      },
      {
         "i": 3333
      }
    ]
  }
}

這是後端返回的一個叫package的json對象,字段意義在文檔中這麼解釋:

  • i:package 的 id
  • n:package 的名字
  • user:package 的所有者,一個用戶
    • i:用戶 id
    • n:用戶名稱
    • email:用戶email,但是只有郵箱前綴
    • d:用戶的所在部門,使用了base64編碼了一個json字符串
      • i:部門 id
      • n:部門名稱
    • edu:用戶的教育信息,數組格式
      • i:學校 id
      • sn:學校名稱

我們的期望是將這一段數據解析成,不看文檔也能讀懂的一個json對象,首先我們經過分析得出上面一共有4類實體對象:package、用戶信息、部門信息、教育信息。

下面是代碼實現:

import {
    toClass, property, array, defaultVal,
    beforeDeserialize, deserialize, optional
} from 'class-converter';
// 教育信息
class Education {
    @property('i')
    id: number;
    
    // 提供一個默認值
    @defaultVal('unknow')
    @prperty('sn')
    schoolName: string;
}
// 部門信息
class Department {
    @property('i')
    id: number;
    
    @prperty('n')
    name: string;
}
// 用戶信息
class User {
  @property('i')
  id: number;
  @property('n')
  name: string;
  
  // 保留一份郵箱前綴數據
  @optional()
  @property()
  emailPrefix: string;
  
  @optional()
  // 這裏希望自動把後綴加上去
  @deserialize(val => `${val}@xxx.com`)
  @property()
  email: string;
  
  @beforeDeserialize(val => JSON.parse(atob(val)))
  @typed(Department)
  @property('d')
  department: Department;
  
  @array()
  @typed(Education)
  @property('edu')
  educations: Education[];
}
// package
class Package {
  @property('i')
  id: number;
  
  @property('n')
  name: string;
  
  @property('user', User)
  owner: User;
} 

數據已經定義完畢,這時只要我們執行toClass方法就可以得到我們想要的數據格式:

{
  id: 10000,
  name: 'name',
  owner: {
    id: 20000,
    name: 'name1',
    emailPrefix: 'zqczqc',
    email: "zqczqc@xxx.com",
    department: {
        id: 1111,
        name: 'department'
    },
    educations: [
      {
        id: 1111,
        schoolName: 'szzx'
      },
      {
        id: 2222,
        schoolName: 'scnu'
      },
      {
        id: 3333,
        schoolName: 'unknow'
      }
    ]
  }
}

上面這一份數據,相比後端返回的數據格式,可讀性大大提升。這裏的用法出現了@deserialize@beforeDeserialize@yped的裝飾器,這裏對這幾個裝飾器是管道方式調用的(前一個的輸出一個的輸入),這裏做一個解釋:

  • beforeDeserialize 第一個參數可以最早拿到當前屬性值,這裏可以做一些解碼操作
  • typed這個是轉換的類型,入參是一個類,相當於自動調用toClass,並且調動時的第一個參數是beforeDeserialize的返回值或者當前屬性值(如果沒有@beforeDeserialize裝飾器)。如果使用了@array裝飾器,則會對每一項數組元素都執行這個轉換
  • deserialize這個裝飾器是最後執行的,第一個參數是beforeDeserialize返回值,@typed返回值,或者當前屬性值(如果前面兩個裝飾器都沒設置的話)。在這個裝飾器里可以做一些數據訂正的操作

這三個裝飾器是在執行toClass時才會調用的,同樣的,當調用toPlain時也會有對應的裝飾器@serialize@fterSerialize,結合@typed進行一個相反的過程。下面將這兩個轉換過程的流程繪製出來。

調用 toClass的過程:

調用 toPlain的過程是調用 toClass的逆過程,但是有些許不一樣,有一個注意點就是:在調用 toClass時允許出現一對多的情況,就是一個屬性可以派生出多個屬性,所以調用調用 toPlain時需要使用 @serializeTarget來標記使用哪一個值作為逆過程的原始值,具體用法可以參考文檔。

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

艾溪湖濕地的美_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

  攝影:傅建斌(影像中國)

  “四面碧樹三面水,一城香樟半城湖”,說的是南昌的景緻。南昌東面有溪流穿稻田而過,經年累月,數頃之地漸現湖光,世人稱之為艾溪湖,是南昌的城市天然濕地。

  秋天時節,艾溪湖濕地依然青草蔥蘢,綠意盎然。深吸幾口清甜空氣,能明顯感覺到一顆心正在走向遼遠空曠。落單的天鵝低着頭,用長長的喙專心揀覓食物;一隻鶴,孤傲地眺望蒼穹;只有那一群接一群的大雁們,無所顧忌地沖湖邊的行人鳴叫,似乎在表達喜悅的心情。

  “啊——啊——”天空傳來一陣聲響,一群飛鳥在濕地上空盤旋、流連、久久不散。“是灰鶴、千歲鶴!”人群傳來一聲驚嘆。正在湖邊給錦鯉餵食的孩子們,約好似的齊刷刷將頭抬起,打着節拍使勁鼓掌,齊聲喊道:“千歲鶴!千歲鶴!”

  “小廖,候鳥通道發現千歲鶴,應該是想在咱們雁島‘打尖’,你迅速隱蔽,別打擾它們。”

  “老高,船往東靠邊,暫停巡邏。”

  “小美,架好設備,做好記錄。”

  ……

  鄒進蓮手持對講機,一邊忙着聯絡,一邊在人群中穿梭。黑衣、黑褲、黑鞋、黑髮、黑框眼鏡,顯得簡約而幹練。

  都說,窮人的孩子早當家。鄒進蓮出生於湖北荊州一個貧困家庭,從小獨立且倔強。大學四年,她沒向家裡要過一分錢,從擺地攤賣襪子算起,先後嘗試過二十多種行當:鐵通卡代銷員、書店店長、校內公司設計員……畢業前夕,當許多同學還在為找工作奔波時,鄒進蓮早早便接到武漢一家國有企業的錄用通知,成了一名都市白領。

  然而,在鄒進蓮看來,年紀輕輕就過上安逸的生活容易讓人喪失鬥志。“不闖蕩,你要青春干什麼?”鄒進蓮不停問自己。凌晨三點,鄒進蓮依然沒有睡意,她漫無目的在網上閑逛,突然,一段人鶴相伴相依的視頻闖入她的眼帘,像一束光照亮了她的心靈。

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

  “這才是我想要的!”鄒進蓮突然間找到了奮鬥的方向。她很快辭掉工作,踏上南下的火車,開始拜師學養鳥。

  深山老林,簡易工棚,荒無人煙,缺水少電,鄒進蓮彷彿從世界的一極直接蹦到另一極,生活極端的反差讓她措手不及。與此同時,身邊質疑、批評的聲音一陣接一陣:“心血來潮、不務正業……”鄒進蓮的倔脾氣反而上來了:“我就要干出個樣子給你們看看。撞南牆也不回頭,走出一條別人未走過的路!”

  在學藝的那段日子里,風雨雷電、鳥獸蟲魚、花草樹木是鄒進蓮最忠實的夥伴,也是鄒進蓮最特別的老師。它們的存在賦予荒野奇妙的動感和蓬勃的哲思,也讓鄒進蓮的內心世界越來越豐盈,越來越強大。

  定下心神的鄒進蓮,陸續掌握了候鳥飼養、馴化、繁育、疫病防治等許多技能,2010年12月,鄱陽湖國家濕地公園告急:園內白天鵝大面積染病,鄒進蓮臨危受命趕往江西。一個月後,病危的四十多隻白天鵝全部康復,鄒進蓮被留在鄱陽湖白沙洲島工作,一干就是四年。

  地球上的候鳥依然定時守信地遵從着體內基因的召喚,感受着地球的每一次脈動和季節里最微妙的變化,振翅而飛,迎風而起,南來北往,飛越過雄奇壯闊的高山大海,飛越過水泥鋼筋的城市森林,周而復始地完成一次次遷徙……全世界主要的候鳥遷徙路線一共有八條,其中有三條經過中國。地處華中、與鄱陽湖相近的南昌,成為許多候鳥在西伯利亞與澳大利亞之間往返時的必經之地。

  城市發展,寸土寸金。南昌放棄艾溪湖周邊多個地產及工業投資項目,圍繞湖泊投資數十億元,保護自然生態,堅持原土護坡,緩處草坡入水,陡處生態綠格網保護,建了一座兩千六百多畝的純公益性的艾溪湖濕地公園,並精心打造了一條跨越市區的空中“鳥道”。2014年,鄒進蓮被這條雄奇、詩意的空中“鳥道”打動,接受高新區的邀請,出任艾溪湖濕地公園候鳥保護中心主任。

  上任后的鄒進蓮繞着艾溪湖濕地走了一圈,發現植物多,動物少,太過靜謐了。依她的知識和經驗,哪裡生態好,鳥就往哪裡去,艾溪湖濕地生態那麼好,只要築好“巢”,就一定可以引來無數“鳳凰”。經過一個月的深思熟慮,鄒進蓮提出創建艾溪湖濕地候鳥樂園的設想,先引進一批,待這一批扎了根,便能在鳥的世界里“口耳傳播、呼朋引伴”。

  從選址、規劃、設計到施工、馴養、招聘,鄒進蓮團隊只用了短短几個月時間。2015年6月1日,候鳥樂園揭開面紗,蓑羽鶴、疣鼻天鵝、小天鵝、黑天鵝、鴻雁、灰雁、白鷺……成百上千隻美麗候鳥,或游弋湖面,或淺立沙洲,或棲息樹林,或飛行天空。“落霞與孤鶩齊飛,秋水共長天一色”,南昌享譽千載的瑰麗景色,那一刻,重新鮮活在孩子們純凈的眼眸里。

  越來越多中小學校、幼兒園帶着孩子們來濕地開展科普活動,每次來,他們都想讓鄒進蓮做一個鳥類知識講座,可鄒進蓮都婉拒了。在她看來,應留更多的時間讓孩子們近距離接觸候鳥,與候鳥一起玩、一起互動、一起成長,這才是最有效的科普教育。一個顛撲不破的道理是:親近才會喜歡,喜歡才會主動學習和保護。

  不喜歡做講座的鄒進蓮卻特別喜歡講故事,一有空,她就和來濕地的遊人們分享候鳥的故事。“一隻叫‘灰灰’的灰雁很通人性,很講感情。有一次,它的飼養員老何請假三天回家辦事,老何前腳剛走,‘灰灰’就‘失蹤’了,到處找也找不到。第四天,老何剛回來上班,‘灰灰’立即出現,飛到老何跟前,不停叫喚,其意綿綿……”這些年,來艾溪湖的候鳥越來越多,獨立湖畔的鄒進蓮覺得自己擁有了一個充滿生機的王國。

  “小吃貨,別吃了,趕緊練飛去!”去看天鵝繁育的路上,鄒進蓮像幼兒園園長一樣對一群剛出生一個多月的小天鵝喊話。她說,她最享受的事情,就是蹲下來觀察候鳥寶貝們最細微的神情。這真是一種智慧——只有走進候鳥的世界,精通它們的“道”,才能真正懂得它們,讓它們心甘情願留下來。

  “保護候鳥不該是少數人的行為,我要做的就是通過自己的努力,讓更多人喜歡候鳥,把保護變成一種習慣。”鄒進蓮說,“我想把艾溪湖濕地候鳥樂園打造成集科普教育、生態旅遊、攝影寫生、休閑養生等為一體的候鳥生態旅遊文化景區,成為‘人的樂園+鳥的家園’。當生態效益轉為經濟效益,不僅能維持濕地正常運轉,還能反哺候鳥的馴養、繁育、保護和科研。在都市裡給予鳥兒們一片最安全、最適宜的棲息地,在城市的天空能時時看到鳥類,這樣鳥與人和諧共存的畫面,就是我最大的夢想。”

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

節約與風尚_貨運

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

  攝影:楊 敏(影像中國)

  初冬的周末,邀兩位摯友吃茶,隔着茶館玻璃,看到飄灑落恭弘=叶 恭弘的銀杏林,在夕陽照射下,恍如一片金色的世界。朋友們從眼前的景色,談到春夏秋冬四季變幻的顏色,一直談到生活中節約與浪費的故事。

  在某科技公司就職的凱哥向來直言直語,他說,我們公司給來得早的員工提供早餐,每天大概七點開飯。每頓早餐,總有那麼幾個人,手拿兩個雞蛋,把蛋白吃了,把蛋黃丟掉。而送餐公司是按吃早餐的人數帶雞蛋,一人一個,略有盈餘;若一人拿兩個,有的人就吃不到了。他們倒好,一人拿兩個,吃一半,扔一半。據說這些人是怕膽固醇增高,要我說,怕膽固醇高,不吃不就得了!凱哥說著便有些來氣,把眼鏡摘下來往茶几上一扔。

  在機關上班的王兄,慢條斯理地說,我們機關食堂牆上,醒目地貼着“節約糧食”“吃多少拿多少”的提示性標語,誰都能看見。可是每天中午打飯時,還是有那麼幾個人,在排着長隊的一大隊人前面,用勺子攪來攪去,精挑細選,可勁兒往自己盤子里堆;可他們又多是眼大肚子小,挑挑揀揀吃上幾口,就扯幾張餐巾紙遮蓋一下,把剩下的飯菜統統倒進垃圾桶里去了……王兄搖着頭,深深的惋惜與憂慮,溢於言表。

  我說,是不是單位里個別年輕人,沒過過苦日子,不了解“汗滴禾下土”的辛勞,所以不懂得珍惜糧食。

  凱哥道,也不是,有的年輕人很懂得節約,也有一大把年紀的人天天浪費。

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

  王兄語氣沉重地說,在某些人的潛意識里,不認為這是浪費,覺得丟掉兩個蛋黃、半盒飯菜,多大一丁點兒事啊,值得大驚小怪嗎?他們是習慣成自然,這才是問題的嚴重性所在。勤儉節約與奢靡浪費,看似是細小的生活問題,實質上是個大是大非問題。

  王兄呷口茶,瞥一眼窗外,繼續說,改革開放四十多年來,我們富起來了,但不能因此就不注重節儉了,就開始鋪張浪費了。其實,中華傳統文化向來崇尚節約。我們今天仍然可以從兩千多年前先哲們創立的哲學範疇中,汲取對建設現代社會有益的因子。譬如《易經·節卦》就是講“度”的問題,其中就包含節約的合度性,既講求節儉、節約,更講究節制、調節。《節卦》所謂“節以制度,不傷財,不害民”,不正與我們今天所倡導的節約資源、保護環境、構建生態文明制度體系相契合嗎?《節卦》所講的“君子以制數度,議德行”,不就是講節約其實也是一個操行問題、品格問題嗎?種種浪費現象,其實也關乎一個人的操行與品格。

  王兄接着說,咱打小在農村長大,從父輩身上不僅看到了勤勞儉樸的良好品質,同時也親身感受到他們年年月月日日時時都在奉行着尊崇自然、保護自然的美好理念。比如,我的父親從不讓我們兄弟姐妹乃至孫輩兒們,把用過洗衣粉、洗髮水的髒水倒進菜園子里。老人家說,摻和“化學水”的肥料“有毒”,澆了“化學水”土地會板結,以後打不下好糧食。老人家要求兒女和孫輩們,把洗髮、洗臉、洗衣的水,潑在磚砌的路面上,風吹日晒就能風乾,不要糟害了土地和莊稼。老輩人常說,“但留方寸地,留與子孫耕”,作為一輩子跟土地打交道的莊戶人,他們的感受最為深切。所以,他們是在用自己樸素的理念和實實在在的具體行動,保護生態資產,呵護生態文明,踐行可持續發展。

  我說,是啊!古人說得好,“歷覽前賢國與家,成由勤儉敗由奢”,俗話也說,“習慣之初如蛛絲,習慣之成如繩索”。決不能讓鋪張浪費的行為,形成一種不良的社會風氣。講節約,就是為了保護生態、愛護資源,促使人們養成良好習慣。所以當務之急,就是要讓節約優先、綠色發展和生態文明建設的理念,成為一種普遍的公民共識,形成一種良好的社會風尚。

  凱哥贊成說,我們在日常生活中,不丟棄一個蛋黃、半碗米飯;把自家廚餘垃圾、有害垃圾和可回收垃圾,分類投放到垃圾桶里;每天在單位喝多少水打多少水,避免次日早晨大量傾倒;盡量少開車出行,條件允許騎自行車上班;孩子在學校讀書,要叮囑其養成勤儉節約的好習慣……凡此種種節約理念、環保理念、綠色理念,往長遠去想,往大處去講,都是在為子孫後代永續發展的千年大計,盡一份自己的責任和義務。

  茶上三壺,高談轉清。我起身以茶代酒,舉杯相碰。我說,今兒個聊得開心!今晚恭聆二兄之高論,更知一個“節”字,意蘊如此深遠。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

臘月_網頁設計公司

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

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

臘月一到,天地就顯得空曠起來。雪要是在晚上降臨,規模又不小,就能給人們十足的驚喜。夜裡,那幾聲竹折的聲音,已經把夢的暖意加重了。清晨,打開門,偌大的雪光馬上席捲了你,你的思緒飛揚在群山和原野。無論小雪和大雪,臘月的雪總是喜氣的,所以都叫做“瑞雪”,表達着一種憧憬的歡喜。臘月是農曆的最後一個月,既然是“最後”,就必須要有一個了結,如此,一場紛紛揚揚的大雪,不妨看作是一場對季節盛大的祭掃,掃掉塵垢,掃掉陰霾,掃掉煩憂。

其實,從正月開始,時令都是搖擺和躁動的,那些紅紅綠綠,那些喧鬧奔放,你來我往地熱鬧着。而時間抵達臘月,抵達大雪以後,就是抵達了冷峻和深寒,茫茫原野,除了點染着幾抹幾點樹木、斷崖、牆壁、瘦瘦的水,皆是雪的天地。

在臘月,花信風也吹着。瑞香、蘭草、水仙、山茶……這些花骨朵,要麼雅緻,要麼野性,叫臘月有了些許的浪漫。尤其是梅花,因為文人騷客的渲染和寄託,似乎把臘月的風姿都佔盡了,其實,對於尋常百姓家,倒是特別惦記着臘梅的。臘梅比梅花來得早些,屬於灌木一類。在牆角,在籬邊,在園子那頭,不管寒冷天氣的意見如何,臘梅自顧自就動了靈氣,於光溜溜的枝頭笑出聲來。開始是一絲絲的淺笑,後來一棵樹、兩棵樹都笑開了去。臘梅的出身在低處、在偏僻、在旮旯,她無所謂,那些花瓣即使被雪裹着、被冰割着,也總是金燦燦地呼吸着,幽幽的清香不動聲色、不卑不亢、不絕如縷。臘梅,不想風光,也不甘沉淪寂寞,真是一個頑強的精靈。“疏林凍水熬寒月,唯見一株在喚春”“枝橫碧玉天然瘦,戀破黃金分外香”,這樣的詩句寫臘梅,也算貼切,但又覺得有點矯情了:臘梅的品性,本比這更超然。

想來想去,臘月的許多生機,也是聚在菜園子里的。“小寒大寒,凍作一團”,天再冷,園子凍不死,那一園子的青蔥總是鮮活着。“冰凍響,蘿蔔長”,蘿蔔堅決和嚴寒叫板,把自己往高處舉、往土裡深掘,最後,身板被錘鍊得結結實實,而甜嫩脆的品質,更叫我們充滿了期待——蘿蔔燉羊肉,饞人喲。

菠菜、矮腳白、包菜、黃心菜、芹菜、芫荽、胡蘿蔔、大蒜、冬莧菜、香蔥、韭菜……也都在勇敢地和季節抗衡,這些尋常的蔬菜,其實是臘月里蟄伏的許多小小的幸福,不驚天動地,卻把每一個日子點綴得不凝滯、不呆板。當然,它們能夠在臘月里天天向上,長得滋潤,還是因為農人們日常細心呵護照料的結果。每一戶農家,對菜園子的拾掇,其實和對待四季里的每一項勞作是一樣的,都含了實實在在的念想,手心裏攥着綿綿的勁道。

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

年年歲歲,村裡的柴煙延續着平常的日子,到了臘月,柴煙的身姿和內涵就要豐富很多,因為一個最大的節日在等着:年。

“臘七臘八,腌魚腌鴨。”臘月一項要緊事,就是準備吃貨。月初,魚鴨就差不多腌透了,晴好的日子,每家每戶的屋檐下,油汪汪晾着那一串一串的,受用着陽光溫和的咂摸。整整一個月,農家的灶間難得消停,磨豆腐、蒸米酒、做糍粑,瀰漫的香味香氣,抵消了寒冷侵襲,人心,被烘得暖暖的。

這當口,女人們除了準備關於吃的一切,還要掃揚塵、納鞋底、購年貨、照顧母雞抱窩。農事也沒停,男人們忙着積肥、造肥、修倉、修理農具,等等。“人勤春早”,大伙兒明白,好日子都是頂着風霜雨雪干出來的,臘月,每一個人都在盡最大的本事,把凜凜的冬天過成一個熱烈的期盼。

大年三十晚,臘月只剩下很短的時光。所有的念想都沉澱下來:平安是福,團圓是福,一家樂呵是福。這個晚上,過得快,也過得慢,要祭祖,要放開門炮仗,要守歲,要給晚輩壓歲錢,當然,高潮就是年夜飯了。

不管年景咋樣,也要把年夜飯弄得歡實起來:要湊成雙數的碗,至少要有八個菜,寓意發達;肘子是有的,下了許多功夫,蒸成一大碗,滑嫩,溜光,如琥珀,香氣逼人;魚是有的,紅燒為主,紅辣椒把魚身子蓋滿了,看着就想出汗;雞肯定也是有的,大都用燉的做法,湯黃亮亮的,點綴着桂圓、荔枝、紅枸杞。馬上,一家人圍成一桌,吃上個把小時,吃得熱氣騰騰、熱汗淋漓,吃得滿面紅光光、油光光,滿屋子儘是快活,儘是喜氣。

“野興疏,冬寥落,爐前沉醉酒一壺。”是啊,臘月已經來了,春天也會捂不住的,不如,今夜,在夢裡,潛回老家的山村去,守着一盆炭火,陪着父母,聽他們嘮叨你的小名,嘮叨整整一個晚上……

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

小米11 正式發表:首款搭載高通 S888 5G 旗艦手機降臨!售價約 17,217 元起_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

今(28)日晚間,小米搶在 2020 年的倒數幾天發表了「小米11」新機,也是全球首款搭載高通最新的 Snapdragon 888 行動平台的 5G 旗艦手機。除了強悍的性能,這次包括螢幕、玻璃、音效都有明顯升級,相機配置 1.08 億像素三鏡頭主相機維持旗艦水準。至於售價則是比起預估便宜許多,小米11 起售價僅約 17,217 元起。

小米11 正式發表:首款搭載高通 S888 5G 旗艦手機降臨!售價約 17,217 元起

在迎接 2021 年之前,小米搶在 2020 年再次發表新一代的小米旗艦新機「小米11」,也是之前就已知道是首款搭載高通 S888 新旗艦處理器的機種。雖然小米11 的外型在之前就已經提早被洩露,不過實際發表的機身尺厚度和重量還是比預期來得更吸引人。小米11 在機身厚度僅 8.06mm(比起前一代薄了 0.9mm)、機身重量僅 196g(比起前一代減輕 12g):

效能

小米11 為全球首款搭載 Qualcomm Snapdragon 888 5G 行動平台、配備最高 12GB LPDDR5 RAM、256GB ROM:

小米公布實測安兔兔跑分達到 745,942 分:

Geekbench 效能實測單核跑分 1135 分、多核跑分 3818 分:

Wi-Fi 連線方面,小米11 採用全新的 WiFi6 增強版,在網速比起之前 WiFi6 標準版快 2.1 倍、最大下載速度高達 3.5Gbps:

螢幕

螢幕方面,小米11 配備 6.81 吋 2K(3200×1440 WQHD)AMOLED 四曲面柔性螢幕,螢幕支持最高 120Hz 螢幕更新率、480Hz 觸控採樣率, 1500nit 峰值亮度、480Hz  觸控採樣率、5,000,000:1 對比度,螢幕也擁有 100% P3 色域和 HDR10+ 認證。螢幕也支持自動亮度調整,小米11 前後配置雙感光感應器,可支持 8192 級亮度調節。

螢幕採用 E4 發光材料,也獲得 DisplayMate 的 A+ 頂級評價:

此外,小米11 螢幕保護的玻璃則採用康寧最新大猩猩玻璃 Gorilla Glass Victus 保護,抗摔性相較前代提升 1.5倍、耐刮性能提升 2 倍。

相機

相機方面,小米11 配備 1.08 億像素三鏡頭主相機,分別為 1.08 億像素(1 / 1.33″超大感光元件)、1300 萬像素 123° 超廣角鏡頭、 500 萬像素 50mm 微距長焦鏡頭,前置鏡頭則配備 2000 萬像素自拍相機。

1.08 億像素的 1/1.33″ 超大感光元件尺寸為 iPhone 12 Pro Max 的兩倍:

也支援 OIS 四軸光學防手震:

鏡頭採用 7P 光學鏡片:

有著 Snapdragon 888 強大的性能,小米11 在拍攝 108MP 的相片速度相較過去提升 30% 的表現:

除了支持最高 8K 30fps 錄影外,在影片錄製也加入超級夜景模式:

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

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

電量

電量方面,小米11 內建等效 4600mAh 大電池,支持 55W 有線閃充、50W 無線閃充以及10W 反向無線充電, 55W 有線閃充可在 45 分鐘充滿 100% 電量、50W 無線閃充可在 53 分鐘充滿 100% 電量。

音效&其他硬玉

在這次小米 找來了 harman/kardon 金耳朵團隊為小米11 的立體聲雙揚聲器調校音效,同時音效方面也通過 Hi-Res 認證並支持藍牙音效共享,可同時與兩組藍牙耳機連接使用:

震動方面小米11 配備超大橫向線性馬達,震動量更大、啟停時間更短:

小米11 配備超薄螢幕下指紋感應器,也首次支持指紋檢測心率功能,只需在螢幕指紋感應區即可檢測心率:

配色

小米11 在機身背蓋分為「磨砂玻璃」與「素皮(環保皮革)」兩種材質處理:

「磨砂玻璃版」提供黑色、白色、藍色三種顏色選擇:

另外在「素皮(環保皮革)」版則推出卡其色、煙紫色兩種顏色選擇:

另外,小米11 也推出限量的雷軍簽名版:

售價

小米為響應 Apple 的環保政策,今日也終於在小米11 取消附贈充電器甚至連同 Type-C 傳輸線都取消附贈。然而,小米日前在微博預告這項消息後也引起眾人討論,雷軍表示原先計劃以套裝方式讓消費者「加購」 55W 小米 GaN 充電器,但最終決定分為無充電器、傳輸線的「標準版」,以及包含 55W 小米 GaN 充電器的「套裝版」,兩款版本以相同的建議售價進行販售,等同購買套裝版的消費者免費贈送 55W 小米 GaN 充電器套裝。而雷軍也呼籲已經有快充充電器的消費者,盡量選擇「標準版」來響應環保政策。

小米11 共推出三種規格配置, 8GB+128GB 售價人民幣 3,999 元(約合新台幣 17,217 元)、8GB+256GB 售價人民幣 4,299 元(約合新台幣 18,509 元)、12GB+256GB 售價人民幣 4,699 元(約合新台幣 20,231 元)。

圖片/消息來源:小米手機(微博)|小米(中國)

延伸閱讀:
小米路由器AX6000 正式發表:首款 Wi-Fi 6E 標準的小米高階路由器,售價僅約 2,580 元

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

小米路由器AX6000 正式發表:首款 Wi-Fi 6E 標準的小米高階路由器,售價僅約 2,580 元_台北網頁設計

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

之前在九月初,華碩推出了全球首款 Wi-Fi 6E 路由器「ROG Rapture GT-AXE11000」,隨後在稍早小米11 發表會同時也帶來了小米的 Wi-Fi 6E 旗艦路由器「小米路由器AX6000」,除了是小米首款以 Wi-Fi 6E 為標準的高階路由器產品,在價格方面依舊相當有競爭力。

小米路由器AX6000 正式發表:首款 Wi-Fi 6E 標準的小米高階路由器,售價僅約 2,580 元

在小米11 旗艦新機發表會期間,也提到了小米11 支持 Wi-Fi 6 增強版(也就是 Wi-Fi 6E)的連接能力,小米也分享了使用 Wi-Fi 6E 路由器「小米路由器AX6000」實測在不同距離條件下小米11 和 iPhone 12 Pro Max 的網路測速結果。

今年 1月 Wi-Fi 聯盟就正式公布了 Wi-Fi 6E 的標準,將頻段從 WiFi 6 的 2.4GHz 和 5GHz 頻段擴展至 6GHz頻段。而多出來的「E」即為「Extended」。 WiFi 6E 相比 WiFi 6 主要是加入了6GHz 頻段(5925-7125 MHz),6GHz 頻段寬度為 1.2GHz,可以容納 7 個 160MHz 的頻道或 14 個80MHz的頻道,相比 WiFi 6來說它的容量呈現倍數提升。

小米路由器AX6000 採用了 7 根天線設計,其中包含了 6 根高增益天線和 1 根 AIoT 智能天線,可覆蓋家中更大面積的範圍、支持4×4 160MHz 規格:

小米路由器AX6000 除了支持 4K QAM 調製調度技術,讓同一時間傳輸的數據量增加 20%。在速率方面 2.4G 頻寬的理論最高速率為 574Mbps,5G 頻寬的理論最高速率為 4804Mbps ,配合 Multilink 技術 2.4G + 5G 最高併發速度能達到 3456Mbps 。

接口方面,小米路由器AX6000 擁有一個WAN/LAN 可切換的 2.5G 高速接口,另外還有三個網路接口。

WiFi 6E 實際上主要功能是提升了數據容量、可以讓更多的設備同時上網,並同時進行高速下載。小米路由器AX6000 也支持 MU-MIMO + OFDMA ,可一次傳輸就完成多達 16 台設備的數據傳送。

此外,小米路由器AX6000 也支持 Mesh 組網,可實現全屋訊號無死角覆蓋:

硬體規格方面,小米路由器AX6000 搭載高通 IPQ5018 處理器,這顆處理器擁有 A53 構架的雙核CPU 搭配單核 NPU,運行內存為 512MB。

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

小米路由器AX6000 在機身頂部、側面、底部均設有散熱孔,形成一個快速循環的散熱通道,能有效讓路由器溫度和性能保持在理想狀態。

小米路由器AX6000 也支援小米暢快連功能,只需打開米家App 就能輕鬆將身邊尚未配對的小米智慧家電完成網路連接:

當路由器修改 Wi-Fi 密碼後,小米路由器AX6000 的 WiFI 改密同步功能則會將新的密碼自動同步連接給所有小米智慧家電設備:

此外,作為小米路由器的旗艦新機,小米路由器AX6000 還支持智慧識別小米手機實現遊戲加速等功能。

價格方面,小米路由器AX6000 也維持小米一貫的超高性價比特色,建議售價只要人民幣 599 元(約合新台幣 2,580 元),倘若之後有機會入手一款 Snapdragon 888 處理器的手機/平板,那麼小米路由器AX6000 將是目前最適合搭配的路由器選擇。
不過,單單升級路由器也不代表裝置可使用到 Wi-Fi 6 ,還必須購買支持 Wi-Fi 6E 標準的裝置,目前市面上支持 Wi-Fi 6E 的裝置選擇還相當稀少,這次發表小米路由器AX6000 有一大主因也是為了小米11 而誕生。

圖片/消息來源:小米(中國)|小米路由器(微博)|小米手機(微博)

延伸閱讀:
小米11 正式發表:首款搭載高通 S888 5G 旗艦手機降臨!售價約 17,217 元起

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

小米氮化鎵GaN充電器Type-C 55W 推出:體積更小、價格更親民_網頁設計公司

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

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

除了今年九月引進台灣市場販售的小米 GaN 充電器 Type-C 65W ,在小米11 新機發表會也同步推出新款小米氮化鎵充電器「小米氮化鎵 GaN 充電器 Type-C 55W」。小米氮化鎵 GaN 充電器 Type-C 55W 擁有更小巧的體積、輸入接口改為 USB-A  ,這款充電器不僅搭配在小米11「套裝版」附贈,同時以約新台幣 426 元的價格單獨販售(附帶 USB 轉 Type-C 傳輸線)。

小米氮化鎵GaN充電器Type-C 55W 推出:體積更小、價格更親民

因應小米11 支持 55W 超級閃充的快充能力,小米也對應推出了全新的「小米氮化鎵 GaN 充電器 Type-C 55W」,可支持最大 55W 功率輸出。外觀延續過往小米充電器一樣採用白色的 PC 材質外殼,在側邊印著 GaN 字樣代表這是款氮化鎵充電器,插頭部分與之前 65W 版本一樣不可收折。

小米氮化鎵 GaN 充電器 Type-C 55W 可為小米11 提供最高 55W 的充電功率,能在 46 分鐘為小米11 充電至 100% :

機身尺寸方面,小米氮化鎵 GaN 充電器 Type-C 55W 擁有更短小的體積,方便放入背包外出攜帶使用,而不可收折插頭也是未來有意入手這款充電器的消費者得額外留意的。
充電安全部分,支援包括短路保護、過流保護、過壓保護、過溫保護、欠壓保護等,能確保正常電流範圍內充電保持安全的充電過程。另外,採用 100-240V 國際電壓,出國旅行也能使用。

另外,內建智慧晶片也可用於手機、筆電等裝置充電使用。輸出方面,小米氮化鎵 GaN 充電器 Type-C 55W 支持 5V/3A、9V/3A、11V/5A、20V/2.5A 。雖然小米氮化鎵 GaN 充電器 Type-C 55W 名為 Type-C ,但與 65W 版本不同的還有接口採用的是 USB-A 輸出接口,並附贈 USB-A 轉 USB-C 傳輸線。

圖片/消息來源:小米(中國)

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

延伸閱讀:
小米路由器AX6000 正式發表:首款 Wi-Fi 6E 標準的小米高階路由器,售價僅約 2,580 元

小米11 正式發表:首款搭載高通 S888 5G 旗艦手機降臨!售價約 17,217 元起

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

abp(net core)+easyui+efcore實現倉儲管理系統——出庫管理之一(四十九)_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

abp(net core)+easyui+efcore實現倉儲管理系統目錄

abp(net core)+easyui+efcore實現倉儲管理系統——ABP總體介紹(一)
abp(net core)+easyui+efcore實現倉儲管理系統——解決方案介紹(二)
abp(net core)+easyui+efcore實現倉儲管理系統——領域層創建實體(三)
 abp(net core)+easyui+efcore實現倉儲管理系統——定義倉儲並實現 (四)
abp(net core)+easyui+efcore實現倉儲管理系統——創建應用服務(五)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之控制器(六)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之列表視圖(七)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之增刪改視圖(八)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之菜單與測試(九)
abp(net core)+easyui+efcore實現倉儲管理系統——使用 WEBAPI實現CURD (十一)

abp(net core)+easyui+efcore實現倉儲管理系統——EasyUI前端頁面框架 (十八)

abp(net core)+easyui+efcore實現倉儲管理系統——EasyUI之貨物管理一 (十九)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之一(二十七)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之三(二十九)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之八(三十四)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之十(三十六)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之一(三十七)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之二(三十八)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之三存儲過程(三十九)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之四(四十)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之五(四十一)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之六(四十二)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之七(四十三)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之八(四十四)   
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之九(四十五)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十(四十六)

abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十一(四十七)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十二(四十八)

.前言

        出庫單的功能。能學習了出庫單管理之後,WMS的 最基本的功能算是完成了。當然一個成熟的WMS還包括了盤點,報表,策略規則,移庫功能及與其他系統(ERP、TMS等)的接口,實現無縫集成,打破信息孤島,讓數據實時、準確和同步。

二、出庫單的流程

    1.一般情況下會有一個前置的OMS系統——即訂單管理系統。主要功能之一是由客戶填寫訂單。

      2.客戶把訂單下第三方物流公司時,第三方物流公司會生成出貨單推送到倉庫時,系統會自動生成揀貨單,理貨員根據揀貨單揀貨,並製作出庫單,然後打印標籤,粘貼條碼標籤,分配托盤,核驗條碼標籤,貨物裝箱,訂艙出庫,並在系統中對出庫單進行審核通過。整個流程如下圖。

 

     當然我們接下來要實現的出庫單功能,沒有這麼複雜。

 

三、創建出庫單實體

    1. 做為一個出庫單,在數據庫中一般存在兩張表,表頭OutStockOrder,表體OutStockDetail

    2.Visual Studio 2017的“解決方案資源管理器”中,右鍵單擊“ABP.TPLMS.Core”項目的“Entitys”文件夾,在彈出菜單中選擇“添加” >

 > “類”。 將類命名為 OutStockOrder,然後選擇“添加”。

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

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

    3.創建OutStockOrder類繼承自Entity<int>,通過實現審計模塊中的IHasCreationTime來實現保存創建時間。代碼如下:

using Abp.Domain.Entities; using Abp.Domain.Entities.Auditing; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; namespace ABP.TPLMS.Entitys { public class OutStockOrder: Entity<int>, IHasCreationTime { public const int MaxLength = 255; public OutStockOrder() { No = string.Empty; CustomerCode = string.Empty; CustomerName = string.Empty; WarehouseNo = string.Empty; DeliveryNo = string.Empty; TallyClerk = string.Empty; TallyTime = string.Empty; CreationTime = DateTime.Now; Oper = string.Empty; Checker = string.Empty; CheckTime = string.Empty; Gwt = 0; Nwt = 0; PackageQty = 0; OwnerCode = string.Empty; OwnerName = string.Empty; Remark = string.Empty; Status = 0; PreOutStockTime = string.Empty; } [StringLength(50)] [Required] public string No { get; set; } /// <summary>
        /// 客戶名稱 /// </summary>
 [StringLength(MaxLength)] [Required] public string CustomerName { get; set; } /// <summary>
        /// 車牌號 /// </summary>
        public string VehicleNo { get; set; } /// <summary>
        /// 客戶代碼 /// </summary>
        [StringLength(50)] [Required] public string CustomerCode { get; set; } /// <summary>
        /// 收貨人代碼 /// </summary>
        public string ConsigneeCode { get; set; } /// <summary>
        /// 收貨人 /// </summary>
        public string Consignee{get ;set;} /// <summary>
        /// 收貨人社會信用代碼 /// </summary>
        public string ConsigneeSCCD { get; set; } /// <summary>
        /// 託運人,發貨人 /// </summary>
        public string Shipper { get; set; } /// <summary>
        /// 託運人,發貨人代碼 /// </summary>
        public string ShipperCode { get; set; } /// <summary>
        /// 託運人,發貨人社會信用代碼 /// </summary>
        public string ShipperSCCD { get; set; } /// <summary>
        /// 通知人 /// </summary>
        public string Notify { get; set; } /// <summary>
        /// 通知人代碼 /// </summary>
        public string NotifyCode { get; set; } /// <summary>
        /// 通知人社會信用代碼 /// </summary>
        public string NotifySCCD { get; set; } /// <summary>
        /// 出貨單號 /// </summary>
        public string DeliveryNo { get; set; } /// <summary>
        /// 倉庫號 /// </summary>
        public string WarehouseNo { get; set; } /// <summary>
        /// 貨主 /// </summary>
 [StringLength(MaxLength)] [Required] public string OwnerName { get; set; } public decimal Gwt { get; set; } public decimal Nwt { get; set; } public int PackageQty { get; set; } /// <summary>
        /// 理貨時間 /// </summary>
        [StringLength(20)] public string TallyTime { get; set; } /// <summary>
        /// 理貨員 /// </summary>
        [StringLength(50)] public string TallyClerk { get; set; } [StringLength(50)] public string Oper { get; set; } public int Status { get; set; } [StringLength(50)] public string OwnerCode { get; set; } /// <summary>
        /// 預計出庫時間 /// </summary>
        [StringLength(20)] public string PreOutStockTime { get; set; } /// <summary>
        /// 審核人 /// </summary>
        [StringLength(50)] public string Checker { get; set; } [StringLength(20)] public string CheckTime { get; set; } [StringLength(1000)] public string Remark { get; set; } public DateTime CreationTime { get; set; } [StringLength(20)] public string LastUpdateTime { get; set; } [StringLength(50)] public string LastOper { get; set; } } } 

    4. 重得第2,3步,我們在“ABP.TPLMS.Core”項目的“Entitys”文件夾,創建OutStockOrderDetail類。代碼如下:

using Abp.Domain.Entities; using Abp.Domain.Entities.Auditing; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text; namespace ABP.TPLMS.Entitys { public class OutStockOrderDetail : Entity<int>, IHasCreationTime { public const int MaxLength = 255; public OutStockOrderDetail() { this.Qty = 0; this.CargoCode = string.Empty; this.CargoName = string.Empty; this.Brand = string.Empty; this.Country = string.Empty; this.CreationTime = DateTime.Now; this.Curr = string.Empty; this.GrossWt = 0; this.Height = 0; this.HSCode = string.Empty; this.Length = 0; this.SecdLawfQty = 0; this.LawfQty = 0; this.NetWt = 0; this.Package = string.Empty; this.Price = 0; this.Spcf = string.Empty; this.Unit = string.Empty; this.InStockNo = string.Empty; this.LawfUnit = string.Empty; this.Vol = 0; this.Width = 0; this.LawfUnit = string.Empty; this.SecdLawfUnit = string.Empty; this.Batch = string.Empty; this.InStockOrderDetailId = 0; } public int SupplierId { get; set; } [MaxLength(50)] public string CargoCode { get; set; } [MaxLength(10)] public string HSCode { get; set; } [MaxLength(MaxLength)] public string CargoName { get; set; } [MaxLength(MaxLength)] public string Spcf { get; set; } [MaxLength(20)] public string Unit { get; set; } /// <summary>
        /// 目的國 /// </summary>
        [MaxLength(20)] public string DestCountry { get; set; } /// <summary>
        /// 原產國 /// </summary>
 [MaxLength(20)] public string Country { get; set; } [MaxLength(50)] public string Brand { get; set; } [MaxLength(20)] public string Curr { get; set; } [MaxLength(20)] public string Package { get; set; } public decimal Length { get; set; } public decimal Width { get; set; } public decimal Height { get; set; } public decimal Vol { get; set; } public decimal Price { get; set; } public decimal TotalAmt { get; set; } public decimal GrossWt { get; set; } public decimal NetWt { get; set; } public DateTime CreationTime { get; set; } [MaxLength(20)] public string InStockNo { get; set; } public int InStockOrderDetailId { get; set; } public decimal Qty { get; set; } public decimal LawfQty { get; set; } public decimal SecdLawfQty { get; set; } [MaxLength(20)] public string LawfUnit { get; set; } [MaxLength(20)] public string SecdLawfUnit { get; set; } [MaxLength(20)] public string Batch { get; set; } public string  Loc { get; set; } } }

5.定義入庫單的實體之後,我們去“ABP.TPLMS.EntityFrameworkCore”項目中的“TPLMSDbContext”類中定義實體對應的DbSet,以應用Code First 數據遷移。添加以下代碼

using Microsoft.EntityFrameworkCore; using Abp.Zero.EntityFrameworkCore; using ABP.TPLMS.Authorization.Roles; using ABP.TPLMS.Authorization.Users; using ABP.TPLMS.MultiTenancy; using ABP.TPLMS.Entitys; namespace ABP.TPLMS.EntityFrameworkCore { public class TPLMSDbContext : AbpZeroDbContext<Tenant, Role, User, TPLMSDbContext> { /* Define a DbSet for each entity of the application */
      

        public TPLMSDbContext(DbContextOptions<TPLMSDbContext> options) : base(options) { } public DbSet<Module> Modules { get; set; } public DbSet<Supplier> Suppliers { get; set; } public DbSet<Cargo> Cargos { get; set; } public DbSet<Org> Orgs { get; set; } public virtual DbSet<InStockOrder> InStockOrder { get; set; } public virtual DbSet<InStockOrderDetail> InStockOrderDetail { get; set; } public virtual DbSet<InStockOrderDetailLoc> InStockOrderDetailLoc { get; set; } public virtual DbSet<OutStockOrder> OutStockOrder { get; set; } public virtual DbSet<OutStockOrderDetail> OutStockOrderDetail { get; set; } } }

     6.從菜單中選擇“工具->NuGet包管理器器—>程序包管理器控制台”菜單。

    7. 在PMC中,默認項目選擇EntityframeworkCore對應的項目后。輸入以下命令:Add-Migration AddEntityOutStock,創建遷移。如下圖。

 

    8. 在上面的命令執行完畢之後,創建成功后,會在Migrations文件夾下創建時間_AddEntityOutStock格式的類文件,這些代碼是基於DbContext指定的模型。如下圖。

 

    9.在程序包管理器控制台,輸入Update-Database,回車執行遷移。執行成功后,如下圖。

 

    10. 在SQL Server Management Studio中查看數據庫,OutStockOrder、OutStockOrderDetail兩張表創建成功。

 

 

 

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

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污