<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          提升語義分割性能的幾種方法

          seo達人

          本文主要記錄幾種提升基于深度學習的圖像語義分割精度的方法,以防忘記!

                                                  By zhengzibing2011, 2017年10月21日-星期六

          1

          1.圖像語義分割面臨的挑戰

          (1).特征分辨率減?。褐饕怯缮窠浘W絡中的重復最大池化和降采樣(stride跨越)操作造成的,而采用此種操作的原因是 

          A.降維,以免參數過多難以優化; 

          B.基于DL的語義分割是從用于分類任務的CNN轉化而來,而在分類任務中,分類器要求對輸入的空間變換具有不變性,池化恰能滿足這樣的要求。



          (2).不同scale下的目標存在的狀況:主要是目標在multi-scale圖像中的狀態造成的,因為在同一種尺度下,不同目標的特征往往響應并不相同。如需要在較大的尺度下才能較好地提取圖像中比較小的目標,而較大的目標為了獲取全局性信息也必須在較小的尺度下才能實現。



          (3). CNN的空間不變性造成定位精度的下降:對于分割任務而言,由于pooling操作引起的分類器對輸入的空間變換具有不變性丟失空間信息,內在的限制了分割的空間精度。



          2.潛在的解決方法

          FCN作為將CNN應用于semantic segmentation的forerunner,貢獻巨大。但不可回避,其提出的方法具有一些不足。為保證卻終的feature map不至于過小,FCN的conv1引入pad=100,引入了較大的噪聲; 

          32倍upsample(deconvolution)非常粗糙,而且deconvolution的filter不可學習; skip architecture雖能有效提高精度,但需要3次訓練即FCN-32s->FCN-16s->FCN-8s。除skip architecture外。隨著研究的深入,針對以上挑戰,有以下幾種方法解決:



          (1). Encoder-Decoder結構

          采用此種思想的代表為DeconvNet,SegNet,其基本思想是采用一種對稱結構將由于pooling操作而減小的feature map通過逐步的upsample逐漸恢復到原圖像大小,同時在upsample階段,融合了subsample中pooling index,具體細節可參見原文。 





          (2). Atrous convolution

          feature map的減小是由于pooling造成的,為確保一定精度的feature map,能否不使用或減少使用pooling呢?理論上是可行的,但如果這樣做會使得需要優化的參數過多,重要的是難以基于以前的model進行fine-tuning,atrous convolution解決了這個問題。 

          在DeepLab中令pool4,pool5的stride=1,再加上1 padding,這樣經過pooling后feature map大小不變,但后層的感受野發生了變化,為使感受野不變,后面的卷積層使用atrous convolution,其作用是在不增加參數的前提下,增加感受野。因此,解決了feature map空間分辨率下降的問題。







          (3). ASPP

          針對不同scale下的目標存在的狀況問題,可通過兩種方法解決: 

          A.標準的多尺度處理方法,用共享相同參數的并行CNN的分支,從不同尺度的Input image中提取score map,然后進行雙線性差值,最終對它們進行融合,在不同尺度上獲得每個位置的最大響應。訓練和測試時均這樣處理,比較繁瑣的是需要計算輸入圖像的每個尺度在各layer上的特征響應。 





          B.基于任意尺度上的區域都可以用在這個單一尺度上重采樣卷積特征進行有效地分類的思想,使用多個不同采樣率上的多個并行多空卷積,每個采樣率上提取的特征再用單獨的分支處理,融合生成最后的結果。











          (4). FC-CRF

          CRF幾乎可以用于所有的分割任務中圖像精度的提高。CNN可用于對圖像中的目標進行分類并預測出目標的大致位置,但并不能真正描繪他們的邊界。因此,將DCNN的識別能力和全連接CRF優化定位精度耦合在一起,能成功的處理定位挑戰問題,生成了的語義分割結果。全連接CRF理論較為復雜,在此不作闡述。類似的概率圖模型(PGM)還有MRF,G-CRF(高斯-條件隨機場)。







          3.總結

          目前,暫且先記錄以上4種提高分割精度的方法。后續若有新的方法,予以追加!

          ————————————————

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計  cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

          JS作用域與聲名提升

          seo達人

          JS的作用域一共有三個范圍,分別是:



          全局作用域

          定義在所有函數之外的變量,其作用范圍是在整個腳本中

          局部作用域(函數作用域)

          使用var定義在函數內部的變量,其作用范圍是整個函數結構,超出函數 {} 花括號的范圍則不能使用。

          塊級作用域

          ES6聲明變量的方式:let / const

          let 變量名 = 變量值;

          const 變量名 = 變量值;

          PS:注意: 使用const修飾的變量,賦值確定后,不允許再重新賦值。(一般修飾常量或者數組對象之類的)

          而且必須給予初始值。

          const修飾數組對象后雖然不可以再對變量進行等號賦值了,但是還是可以用數組和對象的方法去改變它的內部結構。

          IIFE(立即調用函數表達式 - - 自執行匿名函數):

          英文全名:(Immediately Invoked Function Expression)

          語法:

          //這三種都屬于IIFE寫法

          (function () {})();

          (function () {}());

          +function () {}();

          //作用與ES6當中的let是一樣的,只不過用這個語法是為了解決個別瀏覽器的兼容問題。

          1

          2

          3

          4

          5

          聲名提升:

          將使用var定義的變量聲名提升到對應作用域的最頂部,賦值部分位置不變。



          使用ES6的let與const沒有聲名提升。



          函數的定義也存在聲名提升:



          如果是聲名的方式定義的函數,將整個函數(聲名及函數主體)都提升到作用域的最頂部。

          如果是表達式的方式定義的函數,只提升聲名,不提升賦值(函數主體部分)

          示例:



          //在聲名函數前面輸出它。輸出的結果就是整個聲名函數的內容

          console.log(testArg)

          function testArg(a, b, c){

          console.log(arguments)

          }

          1

          2

          3

          4

          5

          輸出結果:





          //在函數表達式之前輸出函數

          console.log(testArg)

          var testArg = function(a, b, c) {

          console.log(arguments)

          }

          1

          2

          3

          4

          5

          輸出結果:



          這就是聲名提升的特點,只提升聲名部分,不提升賦值部分。大家一定要牢牢記住哦~

          ————————————————

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計  包裝設計 、 圖標定制  用戶體驗 、交互設計、 網站建設 、平面設計服務。

          ECharts的resize失效原因以及使用方法

          seo達人

          很多朋友在開發的過程中要把ECharts圖標做成自適應瀏覽器寬高的效果。于是去翻看ECharts官網發現了resize方法,結果用了之后發現沒用,而且根本不知道什么原因。



          解決辦法:

          不能給ECharts的容器設置固定的寬高。



          寬度要寫百分比

          高度要寫vh

          然后再搭配resize方法才可以實現根據瀏覽器大小而改變大小的功能



          示例代碼:

          let ECharts = echarts.init(document.getElementById('wrapBox'));

          //ECharts的配置項和數據

          let option = {

          title: {

          text: 'demo'

          },

          tooltip: {},

          legend: {

          data: ['dataSource']

          },

          xAxis: {

          data: ['aa', 'bb', 'cc']

          },

          yAxis: {},

          series: [{

          name: 'dataSource',

          type: 'bar',

          data: [2, 5, 6],

          }]

          };

          //配置圖表數據及配置項

          ECharts.setOption(option);



          //根據瀏覽器大小改變大小

          window.onresize = () => {

          ECarts.resize();

          //如果有多個表變動在下方依次寫下去就可以了

          }

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計  cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

          vue單頁面標題設置 title

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          推薦使用 vue-wechat-title

          vue-wechat-title作用
          Vuejs 單頁應用在iOS系統下部分APP的webview中 標題不能通過 document.title = xxx 的方式修改 該插件只為解決該問題而生(兼容安卓)

          已測試APP 
          微信 
          QQ 
          支付寶 
          淘寶

          安裝
          npm install vue-wechat-title --save
          1
          用法
          1,在 main.js 中引入
          import VueWechatTitle from 'vue-wechat-title'
          Vue.use(VueWechatTitle)
          1
          2
          2,在路由文件 index.js 中給每個路由添加 title
          // 掛載路由
          const router =  new Router({
             mode: 'history',
             routes:[
                  {
                    path: '/',
                    name: 'Index',
                    component: Index,
                    meta: {
                      title: '首頁'   // 標題設置
                    }
                  },
                  {
                    path: '/lists',
                    name: 'Lists',
                    component: Lists,
                    meta: {
                      title: '列表'  // 標題設置
                    }
                  }
               ]
          });

          3,在 app.vue 中修改 router-view 組件
          <router-view v-wechat-title='$route.meta.title'></router-view>
          1
          自定義加載的圖片地址 默認是 ./favicon.ico 可以是相對或者絕對的

          <div v-wechat-title="$route.meta.title" img-set="/static/logo.png"></div>
          1
          ok !重啟看看

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          char[] 和 String 類型占用字節大小問題

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          在 C 語言中
          1、char a[10] = {"China"} 中,這個 a 占用多少字節?

          答:占用 10 個字節。

          解析:上面代碼對 a 做了賦值的操作,

          a[0]='C' ,a[1]='h' ,a[2]='i' ,a[3]='n' ,a[4]='a' ,a[5]='\0',a[6]='\0',a[7]='\0',a[8]='\0',a[9]='\0'

          所以,它占用的是 10 個字節。

          2、如果單指 ”China“ ?

          答:共 6 個字節。China 占 5 個字節,最后以 '\0' 結束,占 1 個字節。

          在 Java 語言中
          1、String s = "China"; 占多少字節?

          答:占 5 個字節。

          System.out.println(Charset.defaultCharset());//獲取ide默認編碼類型
          String s = new String("China".getBytes());
          byte[] b = s.getBytes();
          System.out.println("" + b.length);
           以上代碼,可以輸出 "China" 所占的字節長度為 5

          2、String s = "中國"; 占多少字節?

          答:如果是 漢字 的情況需要考慮編碼。

          (1)GBK 編碼(ide默認)時,每一個漢字占用 2 個字節,那么中國占 4 個字節。

          (2)UTF-8 編碼時,每一個漢字占用 3 個字節,那么中國占用 6 個字節。

          3、轉碼問題,GBK 轉 UTF-8 時,字節占用會變大嗎?反過來呢?

          //獲取的是 UTF-8編碼
          System.out.println(Charset.defaultCharset());
          String s;
          try {
                  s = new String("中國".getBytes(),"GBK");
                  byte[] b = s.getBytes();
                  System.out.println("" + b.length);
              } catch (UnsupportedEncodingException e) {
                  e.printStackTrace();
          }
          如上代碼是:UTF-8 轉 GBK 編碼格式,s 長度從 6 字節變為 9 字節。
          s 內容變化:中國 —> 涓浗
          因為當前編碼是 UTF-8,轉碼之后變成了 3 個文字,占用 9 個字節。然而,反過來的情況是這樣的:

          中國 (gbk) —> ?й? (utf-8)
          s 長度從 4字節 變成了 4字節,雖然長度沒發生改變,但是文字已經改變。這里的 ? 占用 1 個字節。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

          一個 npm 包的坎坷“續命”之生

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          如果說 npm 的大新聞,莫過于之前的 left-pad 撤包事件,event-stream 投毒事件,Ant Design 彩蛋事件。使得很多前端開發者又開始重新思考 npm 生態時候真的存在問題?

          今天我們文章的主角是 memwatch,一個用來幫助我們檢查 Node.js 是否存在內存泄漏的庫,和這個庫傳奇的一生。

          2012 年 02 月 06 日,一位 Mozilla 的工程師 lloyd 創建了這個庫,并寫了一篇博文“Is My NodeJS Program Leaking?”(我的 Node.js 程序是否存在內存泄漏?)。這個包最初被命名為 gcstats,代碼上傳到了 github。

          6 月 27 日,npm 包改名為 memwatch,發布 0.1.1 版。

          7 月 4 日,lloyd 為這個庫添加了開源許可協議:WTFPL,發布 0.1.2 版。很多人對這個開源許可協議可能比較陌生,WTFPL 的全稱是 Do What The Fuck You Want To Public License,中文譯名:你他媽的想干嘛就干嘛公共許可證。也許就是這份協議開啟了 memwatch 庫不尋常的一生。

          2013 年 3 月 14 日,作者 lloyd 提交了最后一次代碼,發布了 0.2.2 版本。支持的 Node.js 版本為 0.6.0。隨后這個庫再也沒有更新過。

          從作者的博文和推文可以看到,作者在 2014 年離開了 Mozilla。而從作者的 github 動態更可以看出,作者應該是轉入了 golang 陣營。

          2014 年 6 月 28 日,作者的一位前同事 deepak1556 fork 了這個庫,增加了對 Node.js 0.11 的支持,并發起了合并請求。但是作者并沒有回復,也沒有合并此次請求。此時距離原作者放棄這個庫也已經過去一年多了。

          2015 年 2 月 7 日,marcominetti 又 fork 了 deepak1556 的庫,增加了對 Node.js 0.12 的支持,并向原庫發起了合并請求,同樣沒有得到作者的任何回復。于是 marcominetti 決定自立門戶,于是將 memwatch 改名為 memwatch-next 發布到了 npm。

          2017 年 1 月 27 日,如同前兩位維護者一樣,marcominetti 也最終放棄了繼續更新這個庫。到此時,此庫支持的 Node.js 版本為 4、5、6。

          2018 年 5 月 6 日,eduardbcom 又 fork 了 marcominetti 的庫,增加了 Node.js 9 的支持,并且放棄了對 Node.js 9 以下所有版本的支持。改名為 node-memwatch 并發布到了 npm。隨后再也沒有更新過代碼。

          2018 年 7 月 17 日,一位開發者 dyatko 又 fork 了 eduardbcom 的庫,增加了對 Node.js 8 的支持,并向原庫發起了合并請求,同樣沒有得到作者的任何回復。

          但在此次 pr 的評論中,另一位開發者說,airbnb 也 fork 了 marcominetti 的庫,并改名為 @airbnb/node-memwatch 發布到了 npm。

          有了大廠接手,也算是這個庫最終的歸宿吧。


          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

          waterfull——ajax分析

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          把項目放在wampserver的www目錄下,啟動wampserver,并且瀏覽器打開后手動修改url為localhost

          index.js=》getData():

          ajax.js以及index。js對它的調用:

          ajax的參數:method、data、url都是字符串

          index.js =》getData()=》調用ajax

          ajax('GET', 'http://localhost/web/ajax/waterfall2/src/js/getPics.php', addDom, 'cpage=' + num, true)

          并且url是localhost下——localhost/web/ajax/waterfall2/src/js/getPics.php

          不是直接圖片資源地址

          圖片資源地址寫在php中,只管調用就行

          data:

          ajax調用是data是這樣的=》'cpage=' + num

           

          測試用的data.txt:

          一個數組里有很多對象,每個對象都是一張圖片的全部信息,每條信息都是json.stringify格式

          所以測試用ajax的callback這樣寫:

          function addDom(data) {
              console.log(JSON.parse(data));
          }

          這個data不是自己定義的,是xhr.responseText,是接口的數據

          這個data是callback的參數

          回調函數的data參數和使用方法:

          xhr.onreadystatechange = function() {

          ////////狀態改變
                  if(xhr.readyState == 4) {
                      if(xhr.status == 200) {
                          callback(xhr.responseText);

          ////////滿足兩個條件時,callback才獲取數據成功,才能用數據做些什么


                      }else {
                          console.log('error');
                      }
                  }
              }

          ajax()中callback是參數,而callback的定義和對數據的操作通常在ajax()調用之后

          例如:

          (1)

          ajax('GET', 'http://localhost/web/ajax/waterfall2/src/js/data.txt', addDom, 'cpage=2', true);
          function addDom(data) {
              console.log(JSON.parse(data));
          }

          如此簡單明了

          (2)

          function getData() {
          //         if(!flag) {
          //             flag = true;
          //             ajax('GET', 'http://localhost/web/ajax/waterfall2/src/js/getPics.php', addDom, 'cpage=' + num, true)
          //             num++;
          //         }
          //     }
          //     getData();
          //     function addDom(data) {

          ……

          }

          回來…………

          ajax中的data在本例中是字符串'cpage=' + num  或者 'cpage=2'這種

          get中作用:

          xhr.open(method, url + '?' + data + '&timer=' + timer, flag);

          post中作用:

          xhr.send(data);

          話說回來…………

          都是獲取數據,data.txt和getPics.php區別:

          一個只有第2頁的地址,一個是動態獲取很多頁數據

          反正就那么傳吧  

          而ajax

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。

          Vue教程(組件-切換案例)

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          前面介紹了Vue中組件的創建方式和data及methods屬性,本文我們來做一個Vue組件的切換案例,效果如下:

          這個效果相信大家都能搞定,本文希望通過這個案例來加深下組件的使用,

          Vue 組件切換案例
          基礎頁面

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Document</title>
              <script src="./lib/vue-2.4.0.js"></script>
          </head>
          <body>
              <div id="app">

              </div>
              <script>
                  var vm = new Vue({
                      el: "#app",
                      data: {

                      },
                      methods: {
                          
                      }
                  })
              </script>
          </body>
          </html>


          一、通過v-if控制實現
          首先我們通過前面介紹的v-if標簽來實現下這種效果

          1.創建組件
          創建我們需要的兩個全局組件,并通過標簽使用。

          <div id="app">

              <login></login>
              <register ></register>
          </div>
          <script>

              // 創建登錄的組件
              Vue.component("login",{
                  template: "<h3>這是一個登錄LOGIN組件</h3>"
              })
              // 創建注冊的組件
              Vue.component("register",{
                  template: "<h3>這是一個注冊組件</h3>"
              })

              var vm = new Vue({
                  el: "#app",
                  data: {

                  },
                  methods: {
                      
                  }
              })
          </script>

          2.控制顯示
          添加鏈接標簽,通過 v-if 和 v-else 標簽來控制顯示和隱藏,如下



          效果



          完整代碼:

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Document</title>
              <script src="./lib/vue-2.4.0.js"></script>
          </head>
          <body>
              <div id="app">
                  <a href="" @click.prevent="flag=true">登錄</a>
                  <a href="" @click.prevent="flag=false">注冊</a>
                  <!--注意: v-if v-else-if v-else 使用^_^ -->
                  <login v-if="flag"></login>
                  <register v-else></register>
              </div>
              <script>

                  // 創建登錄的組件
                  Vue.component("login",{
                      template: "<h3>這是一個登錄LOGIN組件</h3>"
                  })
                  // 創建注冊的組件
                  Vue.component("register",{
                      template: "<h3>這是一個注冊組件</h3>"
                  })
                  var vm = new Vue({
                      el: "#app",
                      data: {
                          flag: false
                      },
                      methods: {}
                  })
              </script>
          </body>
          </html>

          二、通過component標簽來實現
          除了上面介紹的這種方式以外我們還可以通過Vue組件中給我們提供的一個component標簽來實現



          Vue提供了 component 來展示對應名稱的組件,component 是一個占位符, :is 屬性,可以用來指定要展示的組件的名稱

          效果



          完整代碼

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Document</title>
              <script src="./lib/vue-2.4.0.js"></script>
          </head>
          <body>
              <div id="app">
                      <a href="" @click.prevent="comName='login'">登錄</a>
                      <a href="" @click.prevent="comName='register'">注冊</a>

                      <component :is="comName"></component>
              </div>
              <script>

                  // 創建登錄的組件
                  Vue.component("login",{
                      template: "<h3>這是一個登錄LOGIN組件</h3>"
                  })
                  // 創建注冊的組件
                  Vue.component("register",{
                      template: "<h3>這是一個注冊組件</h3>"
                  })

                  var vm = new Vue({
                      el: "#app",
                      data: {
                          comName: "login"
                      },
                      methods: {

                      }
                  })
              </script>
          </body>
          </html>

          35
          36
          37
          38
          39
          組件切換-動畫
          前面我們介紹了 動畫 的使用,那么剛好我們可以在切換的時候把動畫效果給加上。
          添加動畫樣式:

          <style>
              .v-enter,
              .v-leave-to{
                  opacity: 0;
                  transform: translateX(150px) ;
              }

              .v-enter-active,
              .v-leave-active{
                  transition: all 1s ease;
              }
          </style>

          組件包裹 標簽



          效果



          我們發現動畫切換的時候兩個是一塊執行的,這時我們可以在 transition 標簽添加一個 mode屬性 來設置動畫的模式



          搞定~

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          XJ項目關于新增保險時輸入各類保險金額后計算總和插入到總費用后查詢顯示

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          第一種情況
          新增框內既有各類保險金額,也有保險總費用。當輸入一類保險金額時,保險總費用自動累加顯示,點擊保存之后將所有數據插入數據庫。然后查詢查詢顯示在結果列表即可。如下圖:

          第一種情況可以在前端js中寫一個計費方法。獲取每個不同類的保險金額,值取到之后在點擊保存之前將變量中的值賦值給保險總費用,然后點擊保存。代碼如下(js中計費的方法寫在代碼一開始中的method{}中,也就是新增,查詢,刪除,修改下方即可):

          //計費方法
          Vehicle_sum:function(){
          var sum  = /^[0-9]\d{0,5}$/;
          var trafficCompulsoryInsuranceCost=$("#vehicleInsurance_add_trafficCompulsoryInsuranceCost").textbox('getValue');
          trafficCompulsoryInsuranceCost=parseInt(trafficCompulsoryInsuranceCost);
          if(!trafficCompulsoryInsuranceCost == ''){
          if(!sum.test(trafficCompulsoryInsuranceCost)){
          Message.error("請輸入正確的保險!");
          return;
          }
          }
          var commercialInsuranceCost=$("#vehicleInsurance_add_commercialInsuranceCost").textbox('getValue');
          commercialInsuranceCost=parseInt(commercialInsuranceCost);
          if(!commercialInsuranceCost == ''){
          if(!sum.test(commercialInsuranceCost)){
          Message.error("請輸入正確的保險!");
          return;
          }
          }
          var carrierInsuranceCost=$("#vehicleInsurance_add_carrierInsuranceCost").textbox('getValue');
          carrierInsuranceCost=parseInt(carrierInsuranceCost);
          if(!carrierInsuranceCost == ''){
          if(!sum.test(carrierInsuranceCost)){
          Message.error("請輸入正確的保險!");
          return;
          }
          }
          var vehicleAndVesselTaxCost=$("#vehicleInsurance_add_vehicleAndVesselTaxCost").textbox('getValue');
          vehicleAndVesselTaxCost=parseInt(vehicleAndVesselTaxCost);
          if(!vehicleAndVesselTaxCost == ''){
          if(!sum.test(vehicleAndVesselTaxCost)){
          Message.error("請輸入正確的保險!");
          return;
          }
          }
          var total = trafficCompulsoryInsuranceCost+commercialInsuranceCost+carrierInsuranceCost+vehicleAndVesselTaxCost;
          $("#vehicleInsurance_add_totalCost").textbox("setValue",total);
          },

          第二種情況
          新增的表單中只有各種類別的保險費用,并沒有保險費用合計的字段。意思是在新增時只輸入各種類別的保險金額,后臺拿到各種類型的保險金額之后,在后臺將各類保險金額累加,用set方法給totalcost(保險總費用)賦值,插入數據庫中。查詢是從數據庫查詢顯示在結果列表即可。如下圖


          第二種情況可以在后臺中寫一個計費的累加方法。用BigDecimal的add方法進行累加。首先實例化一個BigDecimal的對象totalCost,賦一個初始值為0,然后用保險的對象insurance的get方法獲取各種保險的金額,然后用totalCost.add方法將獲取每個不同類的保險金額一次加到totalCost中,然后將totalCost用insurance的set方法set到保險總費用的字段中,然后進行插入操作。代碼如下(后臺中計費的方法寫在Service中的新增方法中):

          /**
          * 車輛保險新增
          * 陳通
          * @param insurance
          * @param request
          * @return
          * @throws IOException
          */
          public Result insertVehicleInsurance(VehicleInsurance insurance,HttpServletRequest request) throws IOException{
          Result result = Result.getInstance();
          insurance.setKeyID(IDGenerator.uuid());
          //計費方法開始
          BigDecimal totalCost = new BigDecimal("0");
                  if(insurance.getTrafficCompulsoryInsuranceCost()!=null){
                  totalCost=totalCost.add(insurance.getTrafficCompulsoryInsuranceCost());
                  }
                  if(insurance.getCommercialInsuranceCost()!=null){
                  totalCost=totalCost.add(insurance.getCommercialInsuranceCost());
                  }
                  if(insurance.getCarrierInsuranceCost()!=null){
                  totalCost=totalCost.add(insurance.getCarrierInsuranceCost());
                  }
                  if(insurance.getVehicleAndVesselTaxCost()!=null){
                  totalCost=totalCost.add(insurance.getVehicleAndVesselTaxCost());
                  }
                  insurance.setTotalCost(totalCost);
                  //計費方法結束
          //插入車輛保險信息,返回受影響的行數
          int count=vehicleInsuranceDao.insertVehicleInsurance(insurance);
          //插入附件
          sysFileService.saveFile(insurance.getKeyID(), Enums.FILE_CATALOG.INSURANCEFILE.getValue(), request);
          if (count>0) {
          result.setFlag(true);
          result.setMessage("車輛保險新增成功!");
          }else{
          result.setFlag(false);
          result.setMessage("車輛保險新增失敗!");
          }
          return result;
          }

          以上是兩種計費方法(前臺和后臺)。
          --------------------- 
          作者:ct_?? 
          來源:CSDN 
          原文:https://blog.csdn.net/weixin_40418595/article/details/94736305 
          版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

          柯里化、原生bind、防抖節流函數、實現promise

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          多參數柯里
          原生bind
          實現promise
          防抖節流函數
          多參數柯里化

          參數fn可以是function(a,b,c){},也可以是function(a,b,c,d,f){}

          // 支持多參數傳遞
          function progressCurrying(fn, args) {

              var _this = this
              var len = fn.length;
              var args = args || [];
              return function() {
                  var _args = Array.prototype.slice.call(arguments).concat(args);
                  // 如果參數個數小于最初的fn.length,則遞歸調用,繼續收集參數
                  if (_args.length < len) {
                      return progressCurrying.call(_this, fn, _args);
                  }

                  // 參數收集完畢,則執行fn
                  return fn.apply(this, _args);
              }
          }

          原生js實現bind

          Function.prototype.myBind = function(Othis){
            if(typeof this !== "function"){
              return new TypeError("not a function");
            }
            let _this = this;
            let args = [...arguments].slice(1);
            let func = function(){};
            let fBound = function () {
              return _this.apply(this instanceof func ?this:Othis,[...arguments].concat(args));
            }
            func.prototype = _this.prototype;
            fBound.prototype = new func();
            return fBound;
          }

          防抖函數

          //每wait時間內執行一次,若期間被觸發,則重新執行
          function debounce(func,wait) {
            var timeout ;
            return function(){
              let args = [...arguments];
              let _this = this;
              if(timeout){
                clearTimeout(timeout);
              }
              timeout = setTimeout(function() {
                func.apply(_this,args);
              }, wait);
            }
          }

          節流函數

          //每wait時間執行一次
          function throttle(func,wait){
            var timeStart = 0 ;
            return function(){
              let _this = this;
              let args = [...arguments];
              let now = Date().now();
              if(now - timeStart >wait){
                func.apply(_this,args);
                timeStart = now;
              }
            }
          }

          實現一個promise

              function _Promise(func){
                  this.status = 'pending'
                  this.result = '' ;
                  func(this.resolve.bind(this),this.reject.bind(this));
              }
              _Promise.prototype.resolve = function(result){
                  if(this.status == 'pending'){
                      this.status = 'fullfilled';
                      this.result = result;
                  }
              }
              _Promise.prototype.reject = function(error){
                  if(this.status == 'pending'){
                      this.status = 'rejected';
                      this.result = error;
                  }
              }
              _Promise.prototype.then = function(preResolve,preReject){
                  let _isPromise ;
                  if(this.status == 'fullfilled'){
                      _isPromise = preResolve(this.result);
                  }else if(this.status == 'rejected' && arguments[1]){
                       _isPromise = preReject(this.result);
                  }
                  return _isPromise instanceof _Promise ? _isPromise:this;
              }

          實現一個promise.all()

           function promiseAll(promiseArray){
                  //首先參數一定是一個數組
                  //然后此函數返回的是一個promise,如果全部成功,則返回結果的數組,只要有一個失敗,則返回失敗的結果
                  return new Promise(function (resolve,reject){
                      if(!Array.isArray(promiseArray)){
                          return reject(new TypeError("not a function"));
                      }
                      let resolveNum = 0;
                      let arrNum = promiseArray.length;
                      let resolveResult = [];
                      for(let i=0; i<arrNum ;i++){
                          (function (i){
                              Promise.resolve(promiseArray[i]).then(function(result){
                                  resolveNum ++;
                                  resolveResult.push(result);
                                  if(resolveNum == arrNum){
                                      return resolve(resolveResult);
                                  }
                              },function(error){
                                  return reject(error);
                              })
                          })(i);
                      }
                  }) //返回的promise結束
                  
              }
          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、網站建設 平面設計服務。

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合