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

首頁

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

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種提高分割精度的方法。后續若有新的方法,予以追加!

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

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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

輸出結果:



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

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

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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();

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

}

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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 !重啟看看

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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 個字節。

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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。

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


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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屬性 來設置動畫的模式



搞定~

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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結束
        
    }
藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、網站建設 、平面設計服務。

日歷

鏈接

個人資料

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

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
日韩精品一区二区在线观看| 欧美性xxx| 91免费视频网站| www.在线视频.com| 色8久久久久| 日本午夜一区二区三区| 99re热这里只有精品免费视频| 久久久久久久久99精品| 国产亚洲欧美一区在线观看| 欧美极品在线观看| 国产精品一区二区美女视频免费看| 国产亚洲激情视频在线| 欧美日韩免费看| 欧美综合视频| 看国产成人h片视频| 久久精品国产96久久久香蕉| 99国产视频在线| 少妇高潮一区二区三区| 一区精品在线播放| 欧美一级大片在线免费观看| 国产精品自在线| 欧美黄色一级视频| 欧美一区二区成人| 51精品视频一区二区三区| 国产精品字幕| 色综合一本到久久亚洲91| 337p日本欧洲亚洲大胆色噜噜| 国产精品丝袜久久久久久app| 午夜精品电影在线观看| 国产尤物一区二区| 日韩精品久久一区| 国内精品伊人久久久久av影院| 免费污视频在线观看| 日韩av在线看| 欧洲成人一区| 亚洲男同gay网站| 国产精品资源网| 啪一啪鲁一鲁2019在线视频| 午夜电影一区二区| 色综合网色综合| 精品亚洲aⅴ在线观看| 亚洲欧洲日韩av| 丁香高清在线观看完整电影视频| 厕沟全景美女厕沟精品| 亚洲黄色免费三级| 国产麻豆欧美日韩一区| 91精品国产综合久久福利| 成人黄色片视频网站| 日韩视频精品在线观看| 久久精品超碰| 51精品久久久久久久蜜臀| 91涩漫在线观看| 欧美综合亚洲图片综合区| 欧美日韩在线另类| 亚洲精品欧美专区| 色视频成人在线观看免| 天天干在线视频论坛| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩精品极品视频免费观看| 亚洲一区欧美二区| 美女写真理伦片在线看| 精品69视频一区二区三区| 色综合久久88色综合天天6| 国产精品x8x8一区二区| 热re91久久精品国99热蜜臀| 国产精品久久久91| 激情综合亚洲精品| 欧美成人第一页| 高清不卡日本v二区在线| 成人免费观看视频| 精品精品国产高清一毛片一天堂| 国产亚洲成av人在线观看导航| 亚洲三区欧美一区国产二区| 大桥未久av一区二区三区| 久久九九久精品国产免费直播| 色偷偷色偷偷色偷偷在线视频| 国产精品久久久久久妇女6080| 欧美日韩另类国产亚洲欧美一级| 老司机精品视频网| 国产精品久久久久精k8| 一本色道久久综合亚洲精品小说| 国产精品久久久久永久免费观看| 激情综合网五月| 日韩一区二区三区在线看| 51vv免费精品视频一区二区| 日日夜夜亚洲精品| 国内一区二区在线| 欧美jizz18性欧美| 欧美俄罗斯乱妇| 亚洲高清在线精品| 国产精品爱久久久久久久| 久久人人超碰| 欧美精品一区二区在线播放| 久久在线视频| 欧美成人免费在线视频| 中日韩美女免费视频网站在线观看| 久久国产精品高清| 亚洲欧美日本另类| 国产suv精品一区二区四区视频| 久久伊人国产| 欧美伊人亚洲伊人色综合动图| 国产日韩欧美精品| 九九九久久久| 国产91精品露脸国语对白| 亚洲宅男网av| 香蕉久久夜色精品国产| 精品久久久久久久人人人人传媒| 国产精品99一区二区| 国产一区二区三区高清在线观看| 精品盗摄女厕tp美女嘘嘘| 国产主播一区二区三区| 欧美成人艳星乳罩| 国产精品白丝av嫩草影院| eeuss鲁片一区二区三区| 秋霞影视一区二区三区| 一区二区三区四区在线观看视频| 欧美国产美女| 亚洲特级毛片| 亚洲精品中字| 日韩少妇视频| 亚洲男女网站| 国产精品素人一区二区| 北条麻妃国产九九九精品小说| av午夜精品一区二区三区| 亚洲www免费| 欧洲色大大久久| 国产成人精品一区二区三区四区| 51国偷自产一区二区三区| 国产香蕉精品视频一区二区三区| 免费黄网站在线播放| 欧美在线高清| 亚洲国产欧美日本视频| 韩国三级中文字幕hd久久精品| 亚洲国产精品ⅴa在线观看| 99av国产精品欲麻豆| 国产精品专区免费| 欧美一区亚洲| 日韩欧美在线观看视频| 日韩欧美另类中文字幕| 亚洲国产成人av在线| 欧美激情综合网| 91国偷自产一区二区开放时间| 亚洲一级在线| 老牛国内精品亚洲成av人片| 精品一二三四在线| 亚洲成人在线网站| 一区二区三区四区在线播放| 久热精品视频在线观看| 亚洲娇小xxxx欧美娇小| 欧美精品久久一区| 精品午夜久久| 成人精品一区二区三区中文字幕| 国产精品免费久久久| 久久综合色综合88| 青青草精品毛片| 亚洲精品国产美女| 激情久久久久| 伊人影院久久| 色婷婷av一区二区| 91精品蜜臀一区二区三区在线| 亚洲最快最全在线视频| 国产综合久久久久久鬼色| 亚洲精品电影| 涩涩视频在线播放|