這幾款應該是SUV里最保值的 而且優惠普遍達到2萬_網頁設計公司

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

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

18-26。78萬元優惠幅度:2-3萬元(僅供參考)兩大日系車都推出了城市SUV,後知后覺的日產也在00年推出自家的城市SUV車型X-TRAIL,並且01-10年連續十年獲得日本SUV銷量冠軍,實力不容小覷。在二手車市場里,11年的第二代奇駿,跑了近7萬多公里后依然能夠賣出接近13萬的價格,算是很保值的了。

對於那些炸天的富二代來說,買車當然是性能第一,但是對於我們普通的老百姓來說,一輛便宜、品質好的車才是最佳選擇。有沒有一些車優惠比較大,然後保值率又足夠高,到下次換車的時候還能賣個好價錢的?這肯定是有的,想要買既優惠又保值的SUV嗎?馬上給你介紹。

東風本田-CRV

指導價:17.98-24.98萬元

優惠幅度:1.8萬元(僅供參考)

本田CR-V的起源要追溯到96年的第一代CR-V,但CR-V真正火起來,是07年的第三代CR-V上市,一時間,等車、加價,開始走入了消費者的生活。在一些二手車網站發現,12年上牌,10萬公里的CR-V,商家依然敢報價14.98萬,保值率高得驚人啊。

第四代的CR-V在15年迎來了中期改款,主要的變化在於中網的造型,那塊碩大的亮黑色飾板辨識度還是頗高的。大燈也進行了升級,現在我們可以在頂配車型找到氙氣近光燈和LED日行燈。和07年那時不同,現在CR-V的外觀在云云眾車中已經漸顯中庸,新意相對少了。

CR-V的內飾布局還是熟悉的味道,變速箱依然是在靠近中控台的位置,給扶手箱前方留下不少的儲物空間。做工方面是值得肯定的,本田一直被詬病使用過多的塑料,而在這一款的CR-V中,副駕前方就加入了一大片的軟質內飾材料,還有縫線的工藝,質感是有所提升的。

CR-V採用2.0L和2.4L的發動機,搭配CVT無級變速箱。只有2.4L版本是本田地球夢發動機,最大馬力達到186ps,這個參數對於一輛SUV來說不算特別的出色,但實際的駕駛感受沒有讓失望,起步輕快、直接,沒有很明顯的拖沓。自吸加CVT的動力系統,主打的就是平順,只要逐步的加深油門,CR-V能給你持續的加速感。

底盤的質感很溫柔,同時又能夠快速的過濾掉路面的顛簸,給人很舒適的乘坐感受。而操控就更加接近轎車,即使重心高了,側傾的現象也不是很明顯,彎道循跡性很好。

一汽豐田-Rav4榮放

指導價:17.98-26.98萬

優惠幅度:1萬(僅供參考)

早在1994年,第一代Rav4就首次在日本銷售,隨後的市場表現也十分出色,真的無愧於“城市SUV”這一稱號。當然,以可靠性聞名的豐田,該品牌下的車子保值率自然很高,一輛有5年車齡,開了11萬公里的Rav4,現在還能輕輕鬆松的賣到12萬,也是真不虧了。

今年新上市的Rav4,除了外觀進行了調整,加入了豐田“Keen Look”的設計元素以外,在內飾和動力方面都進行了一些調整。Rav4的造型和車身線條營造出一種年輕化、運動化的效果,也這也是豐田對Rav4的定位。

內飾在造型和布局上的變化不大,分上下層式的設計,上層採用了硬質塑料材質,下層則使用皮革材料,觸感不錯。除此之外,配置的提升也很重要,全系標配了車身穩定系統、前排側氣囊和頭部氣簾等等,安全性能有所提高。

動力方面,2.0L版本的發動機是升級了的,馬力比上一款車型提升了4ps,但是實際駕駛的感受並沒有明顯的提升。原本Rav4搭載的這套動力系統就比較輕快的,2.0L的變速箱是CVT,2.5L的變速箱是AT,

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

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

動力輸出是以平順為主。

至於操控方面,Rav4的方向盤並不靈敏,力度比較輕,但出彎時還是會有點粘手,整體轉向的質感不夠乾脆。至於懸挂,支撐是十分到位的,操控信心很足,作為家用車的話就會過硬了,坐過Rav4的後排,能感受到經過坑窪時會有明顯的跳動,舒適感遠不如CR-V啊。

東風日產-奇駿

指導價:18.18-26.78萬元

優惠幅度:2-3萬元(僅供參考)

兩大日系車都推出了城市SUV,後知后覺的日產也在00年推出自家的城市SUV車型X-TRAIL,並且01-10年連續十年獲得日本SUV銷量冠軍,實力不容小覷。在二手車市場里,11年的第二代奇駿,跑了近7萬多公里后依然能夠賣出接近13萬的價格,算是很保值的了。

從初代奇駿到現在的最新款奇駿,我們可以看到該車的外觀從平直硬朗的線條一路演變到現在的流暢立體的車身外觀。前臉是毫無疑問的加入了V-motion的設計了,除此以外,引擎蓋、腰線、輪拱等位置的複雜線條,讓奇駿看起來更加的有立體感,這車的外觀雖然說不上超級美,但還是十分耐看。

內飾方面其實大有向天籟看起的趨勢,用料方面主要是硬質的塑料,這跟同級別的多數日系車相似,但做工卻毫不含糊,絲毫沒有低檔的感覺。配置方面,除了低配車型的中控屏面子偏小以外,平時常用的功能基本都齊全。

動力方面則是日產的兩套經典的動力系統,2.0L或者2.5L加手動擋活CVT的變速箱。看上去並不出彩的2.0L發動機能提供150ps馬力,實際上表現卻不差,日常駕駛很輕快,而且發動機並沒有煩人的嘶吼聲。配合CVT變速箱,動力平順且有勁,維持了日產的一貫作風。

別看奇駿體積較大,其方向盤用起來虛位並不誇張,且阻尼適中並伴有一定的路感反饋,一定程度提升了駕駛樂趣。至於底盤就還是那樣的舒適,對一些小顛簸的過濾是很淡定自如的,只是過一些大減速帶時,彈跳就會有點多,緊緻度還是不足啊。

長安馬自達-CX5

指導價:16.98-24.58萬元

優惠幅度:1.9萬元(僅供參考)

馬自達,算是對市場不太敏銳的一家廠商,喜歡做他們認為好的東西(實際也是很好),而不是最迎合市場的東西。同樣定位城市SUV的CX-5,也是13年6月才上市的年輕車型。至於保值率,13款跑了6萬公里的CX-5,依然能賣15.5萬元。

外觀方面,魂動的外觀設計也是夠出色,車身線條十分流暢,並不會找到一些不協調的元素出來。外型上追求年輕、運動,配合紅色的主色調,作為年輕人的也會忍不住多看幾眼。

內飾方面,CX-5在原本全黑的基礎上加入了一些鍍鉻飾條作裝飾,恰到好處的讓其更顯年輕。用料方面當然主要是塑料的了,大體的做工是不錯的,只是細節方面的處理還是有較大的進步空間。採用了為第二代MZD CONNECT悅聯繫統,多媒體功能更加豐富了。

動力方面,2.0L或2.5L的創馳藍天發動機分別提供155ps和196ps的馬力,即使是2.0L的動力其實也足夠市區通勤的使用。但更加讓拍掌的,是那個6AT變速箱,無論是換擋邏輯、換擋速度還是平順性,都是同級別的頂級水平。這套動力系統可以讓你在自動擋的車裡感受人車合一的感覺。

至於行駛品質,馬自達也沒有含糊,底盤的質感是比較紮實穩重的,舒適性良好,同時實測在120km/h時的噪音值為65.6分貝,也是較舒適的範圍。CX-5還是偏向於一輛舒適型的家用SUV,只是其綜合表現也是實在優秀。

為什麼說這四輛車優惠大?因為其處於當代車型的中期,像CR-V,新一代車型已經發布,換代只是時間問題。這些有一定時間的車型價格一般都很少水分。可靠性良好且價格優惠,它們確實是你買了不會後悔的車型。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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

抗疫不忘環保 梅克爾重申「歐盟綠色協議」_網頁設計公司

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

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

摘錄自2020年4月29日聯合報報導

德國總理梅克爾4月28日在「第十一屆彼得斯堡氣候對話」所召開的視頻會議上說,盡管世界各國都面臨到疫情對經濟的沖擊,仍然必須「密切關注氣候保護問題」。

梅克爾也重申了她對歐盟「歐盟綠色協議」(European Green Deal、歐洲綠色政綱)的支持。該協議致力於在2030年前將歐盟整體的碳排放量降低到1990年水平的50%以下。目前會員國之間同意減少40%的碳排放量。

梅克爾說德國將會繼續逐步汰換掉燃煤的發電廠,並且持續投資永續能源。她也支持藉由對二氧化碳定價的方式來降低碳排放。

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

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

 

 

污染治理
國際新聞
德國
武漢肺炎
疫情
歐盟
救經濟靠綠色振興

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

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

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

30萬選大SUV要7座還是要配置真糾結_網頁設計公司

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

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

而考慮到漢蘭達有七座的設計,它的內部空間更加靈活,而且它的車尾造型要比冠道更加的平直,所以在尾箱空間上漢蘭達有車不小的優勢。動力冠道碾壓漢蘭達如果說前面三個部分都是半斤八兩。那麼在動力系統上的差距可真不小了,兩款車型都使用2。

本田冠道不久前剛剛上市。這一款被本田寄予厚望的中型SUV還沒有上市便火了一把。由於保密工作做得十分好,所以冠道的價格直到發布前都沒有消息,而就在冠道發布之後。其26.98到32.98萬的售價倍受吐槽。用網友的一句話來說。昂科威毫無壓力,銳界鬆了口氣,漢蘭達決定繼續加價,樓蘭覺得自己不再孤單。那麼在這個看似偏高的定價背後。冠道真的賣的貴嗎?

我們挑選漢蘭達和本田冠道進行對比。漢蘭達也可以說是冠道最大的競爭對手。我們都挑選29萬左右的版本。

冠道 2017款 370TURBO 四驅尊享版

指導價:29.28萬 下文簡稱冠道 文中圖片為370TURBO 四驅至尊版

漢蘭達 2015款 2.0T 四驅豪華版 7座

指導價:29.48萬 下文簡稱漢蘭達

他們都使用的2.0T的發動機。並且都使用了四驅系統。兩款車型究竟哪一款更加具有性價比呢?

外觀

半斤八兩各具特色

從外觀上來說,其實兩款車是見仁見智的,在長度上漢蘭達要稍微的長那麼一點點。但是在寬度上冠道更加有優勢。所以在外觀的尺寸尚兩款車型算是打成一個平手。(冠道尺寸4816*1942*1669mm,漢蘭達尺寸4855*1925*1720)

而冠道不到一米七的高度則更加具有運動感。從外觀設計的風格來看,漢蘭達更加的圓潤,而冠道則更加的犀利剛硬。這也比較貼合兩款車型的設計風格。

內飾

冠道更精緻

內飾上來說漢蘭達的內飾是屬於比較實用的。巨大的儲物格,較大的車內按鈕這些設計都是偏向於實用性而寬敞的車內空間優秀的人機工程學設計。都是漢蘭達的優勢所在。簡單的車廂設計,並含着深厚的設計功底這也是豐田一直以來的特點。

冠道的內飾和它的外觀一樣,都是偏向於硬朗的風格。值得注意的是冠道的中控大屏是可以電動調節角度的非常貼心,非常人性化的一個設計。冠道的內飾更有設計感,

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

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

一改之前本田比較偏向於廉價的設計感覺。冠道的內飾十分值得好評,相比以往的本田來說精緻度和設計感都提升了不少。

空間

漢蘭達更加優秀

這兩款車型漢蘭達使用的是七座設計,而冠道是五座車給因此我們只對比兩款車型的前兩排空間。在前兩排的空間表現上漢蘭達和冠道真的是半斤八兩,不分伯仲,兩款車型都是十分注重車內空間的車型,它們非常大的車身尺寸也決定了他們的空間表現註定不會差。

而考慮到漢蘭達有七座的設計,它的內部空間更加靈活,而且它的車尾造型要比冠道更加的平直,所以在尾箱空間上漢蘭達有車不小的優勢。

動力

冠道碾壓漢蘭達

如果說前面三個部分都是半斤八兩。那麼在動力系統上的差距可真不小了,兩款車型都使用2.0T的渦輪增壓發動機。但是冠道的2.0T最大功率272馬力(漢蘭達為220馬力),比漢蘭達的2.0T整整大了52馬力。最大扭矩也高出了20牛米(冠道370牛米,漢蘭達為350牛米)。而且冠道的車身重量比漢蘭達要輕了204公斤。所以在最終的加速表現上兩款車型差異巨大。冠道的官方百公里加速時間為8秒,而漢蘭達的實測百公里加速時間為9.61秒。而在剎車距離上冠道也在38.6米左右。漢蘭達實測則需要41.38米。在加速和急剎車性能上的差距可是實實在在存在的。

這裏額外說一句冠道標稱使用93號汽油而漢蘭達需要97號汽油。但是漢蘭達的油箱容積為72升,冠道為55升。綜合他倆的平均油耗來看漢蘭達在續航能力上的優勢也不小。

冠道使用9AT變速箱而漢蘭達使用6AT的變速箱。好壞沒有體驗不作評價,但是冠道的9AT顯然能夠給他帶來更加好的高速靜謐性和燃油經濟性。

配置

冠道碾壓漢蘭達

在配置上兩款車型差異也十分大,而結論是冠道的配置要比漢蘭達好很多。

冠道比漢蘭達多出了

电子手剎

胎壓監測

自動駐車

可變轉向比

電動後備箱

后倒車雷達

方向盤換擋

GpS導航系統

定位互動服務

12喇叭音響

全LED大燈

轉向輔助燈

車內氛圍燈

后視鏡加熱

內后視鏡自動防炫目

和小編十分推薦的併線輔助系統

相比冠道漢蘭達則多出了

膝部氣囊

全尺寸備胎

陡坡緩降

中央差速器鎖止功能

以及腰部支撐調節

第二排靠背角度調節

第二排移動

和第三排座椅

CD支持Mp3/WMA

單碟CD系統

相比較來說冠道配置要實在很多。

總結

冠道性價比更加高

冠道和漢蘭達在外觀內飾以及空間方面勉強打成平手。而在動力方面冠道的優勢十分明顯在配置上冠道也要更加的好。所以相比漢蘭達冠道賣的貴嗎?在小編看來冠道賣的一點都不貴。那麼,為什麼冠道賣到這個價錢呢?

其實這隻是本田戰略的一部分而已。首先我們可以看到26萬多起價的本田冠道它的基礎配置就已經十分高了。所以這也不排除未來會推出更加低配車型的可能用以下探價格。冠道除了那個十分讓人心潮澎湃的動力之外,寬敞的空間優秀的隔音和底盤表現也是許多人關心的,因此對於那些開車節奏比較緩慢。不那麼注重動力的人和更加關心舒適與質感的人來說在明年三月份冠道還將推出一個1.5T版本供大家選擇,價格在22萬左右,因此如果你覺得2.0T的冠道貴不妨再等等。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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

Redis詳解(十三)—— Redis布隆過濾器_網頁設計公司

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

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

  本篇博客我們主要介紹如何用Redis實現布隆過濾器,但是在介紹布隆過濾器之前,我們首先介紹一下,為啥要使用布隆過濾器。

1、布隆過濾器使用場景

  比如有如下幾個需求:

  ①、原本有10億個號碼,現在又來了10萬個號碼,要快速準確判斷這10萬個號碼是否在10億個號碼庫中?

  解決辦法一:將10億個號碼存入數據庫中,進行數據庫查詢,準確性有了,但是速度會比較慢。

  解決辦法二:將10億號碼放入內存中,比如Redis緩存中,這裏我們算一下佔用內存大小:10億*8字節=8GB,通過內存查詢,準確性和速度都有了,但是大約8gb的內存空間,挺浪費內存空間的。

  ②、接觸過爬蟲的,應該有這麼一個需求,需要爬蟲的網站千千萬萬,對於一個新的網站url,我們如何判斷這個url我們是否已經爬過了?

  解決辦法還是上面的兩種,很顯然,都不太好。

  ③、同理還有垃圾郵箱的過濾。

  那麼對於類似這種,大數據量集合,如何準確快速的判斷某個數據是否在大數據量集合中,並且不佔用內存,布隆過濾器應運而生了。

2、布隆過濾器簡介

  帶着上面的幾個疑問,我們來看看到底什麼是布隆過濾器。

  布隆過濾器:一種數據結構,是由一串很長的二進制向量組成,可以將其看成一個二進制數組。既然是二進制,那麼裏面存放的不是0,就是1,但是初始默認值都是0。

  如下所示:

  

  ①、添加數據

  介紹概念的時候,我們說可以將布隆過濾器看成一個容器,那麼如何向布隆過濾器中添加一個數據呢?

  如下圖所示:當要向布隆過濾器中添加一個元素key時,我們通過多個hash函數,算出一個值,然後將這個值所在的方格置為1。

  比如,下圖hash1(key)=1,那麼在第2個格子將0變為1(數組是從0開始計數的),hash2(key)=7,那麼將第8個格子置位1,依次類推。

  

 

  ②、判斷數據是否存在?

  知道了如何向布隆過濾器中添加一個數據,那麼新來一個數據,我們如何判斷其是否存在於這個布隆過濾器中呢?

  很簡單,我們只需要將這個新的數據通過上面自定義的幾個哈希函數,分別算出各個值,然後看其對應的地方是否都是1,如果存在一個不是1的情況,那麼我們可以說,該新數據一定不存在於這個布隆過濾器中。

  反過來說,如果通過哈希函數算出來的值,對應的地方都是1,那麼我們能夠肯定的得出:這個數據一定存在於這個布隆過濾器中嗎?

  答案是否定的,因為多個不同的數據通過hash函數算出來的結果是會有重複的,所以會存在某個位置是別的數據通過hash函數置為的1。

  我們可以得到一個結論:布隆過濾器可以判斷某個數據一定不存在,但是無法判斷一定存在

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

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

  ③、布隆過濾器優缺點

  優點:優點很明顯,二進制組成的數組,佔用內存極少,並且插入和查詢速度都足夠快。

  缺點:隨着數據的增加,誤判率會增加;還有無法判斷數據一定存在;另外還有一個重要缺點,無法刪除數據。

3、Redis實現布隆過濾器

①、bitmaps

  我們知道計算機是以二進制位作為底層存儲的基礎單位,一個字節等於8位。

  比如“big”字符串是由三個字符組成的,這三個字符對應的ASCII碼分為是98、105、103,對應的二進制存儲如下:

  

 

 

  在Redis中,Bitmaps 提供了一套命令用來操作類似上面字符串中的每一個位。

  一、設置值

setbit key offset value

  

 

   我們知道”b”的二進製表示為0110 0010,我們將第7位(從0開始)設置為1,那0110 0011 表示的就是字符“c”,所以最後的字符 “big”變成了“cig”。

  二、獲取值

gitbit key offset

  

   三、獲取位圖指定範圍值為1的個數

bitcount key [start end]

  如果不指定,那就是獲取全部值為1的個數。

  注意:start和end指定的是字節的個數,而不是位數組下標。

  

②、Redisson

  Redis 實現布隆過濾器的底層就是通過 bitmap 這種數據結構,至於如何實現,這裏就不重複造輪子了,介紹業界比較好用的一個客戶端工具——Redisson。

  Redisson 是用於在 Java 程序中操作 Redis 的庫,利用Redisson 我們可以在程序中輕鬆地使用 Redis。

  下面我們就通過 Redisson 來構造布隆過濾器。

 1 package com.ys.rediscluster.bloomfilter.redisson;
 2 
 3 import org.redisson.Redisson;
 4 import org.redisson.api.RBloomFilter;
 5 import org.redisson.api.RedissonClient;
 6 import org.redisson.config.Config;
 7 
 8 public class RedissonBloomFilter {
 9 
10     public static void main(String[] args) {
11         Config config = new Config();
12         config.useSingleServer().setAddress("redis://192.168.14.104:6379");
13         config.useSingleServer().setPassword("123");
14         //構造Redisson
15         RedissonClient redisson = Redisson.create(config);
16 
17         RBloomFilter<String> bloomFilter = redisson.getBloomFilter("phoneList");
18         //初始化布隆過濾器:預計元素為100000000L,誤差率為3%
19         bloomFilter.tryInit(100000000L,0.03);
20         //將號碼10086插入到布隆過濾器中
21         bloomFilter.add("10086");
22 
23         //判斷下面號碼是否在布隆過濾器中
24         System.out.println(bloomFilter.contains("123456"));//false
25         System.out.println(bloomFilter.contains("10086"));//true
26     }
27 }

  這是單節點的Redis實現方式,如果數據量比較大,期望的誤差率又很低,那單節點所提供的內存是無法滿足的,這時候可以使用分佈式布隆過濾器,同樣也可以用 Redisson 來實現,這裏我就不做代碼演示了,大家有興趣可以試試。

4、guava 工具

  最後提一下不用Redis如何來實現布隆過濾器。

  guava 工具包相信大家都用過,這是谷歌公司提供的,裏面也提供了布隆過濾器的實現。

 1 package com.ys.rediscluster.bloomfilter;
 2 
 3 import com.google.common.base.Charsets;
 4 import com.google.common.hash.BloomFilter;
 5 import com.google.common.hash.Funnel;
 6 import com.google.common.hash.Funnels;
 7 
 8 public class GuavaBloomFilter {
 9     public static void main(String[] args) {
10         BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8),100000,0.01);
11 
12         bloomFilter.put("10086");
13 
14         System.out.println(bloomFilter.mightContain("123456"));
15         System.out.println(bloomFilter.mightContain("10086"));
16     }
17 }

 

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

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

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

從聚合支付業務的設計來聊聊策略模式_網頁設計公司

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

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

六月福利

2020年6月公眾號碼農小胖哥原創文章轉發第一名將送全新《Spring Boot實戰》實體書一本,該書是學習熱門框架 Spring Boot的經典之作。你不再需要依靠運氣,而是勤奮。截止統計日期2020年6月30日,統計數據以官方公眾號工具為準,運營人員不參加活動,本次活動圖書由掘金社區贊助。

1. 前言

前幾天講了設計模式中的命令模式,今天來看看另一個模式。移動支付目前在國內已經是非常普及了,連樓下早餐攤的七十多歲大媽也使用支付寶和微信支付賣雞蛋餅。如果讓你做一個App你肯定要考慮多個渠道支付,以保證獲客渠道。如果讓你來接入多種支付渠道你會怎麼設計?

2. 通常寫法

一般下面這種寫法很容易被創造出來:

    public boolean pay(BigDecimal amount){
        
        boolean ret =false;
        if (alipay){
            //todo 支付寶的邏輯
        }else if (wechatpay){
            //todo 微信支付的邏輯
        }else if (ooxx){
           // …… 
        }
        return ret;
    }

如果集成了四五種支付,這個代碼就沒法看了少說幾千行,而且改動某個支付的邏輯很容易改了其它支付的邏輯。因此需要合理的設計來避免這種風險。

3. 策略模式

大部分的支付可以簡化為這個流程:

中間的發起支付前邏輯支付后處理邏輯是客戶端的自定義業務邏輯,向支付服務器發送的請求只會攜帶對應支付服務器特定要求的參數調用不同的支付SDK。所以我們分別建立對應支付方式的策略來隔離區分它們,降低它們的耦合度。當準備支付時我們只需要選擇對應的策略就可以了。

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

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

這就用到了設計模式中的策略模式:

結合上面的類圖,我們就來結合著需求來聊聊策略模式中的主要幾個角色。

  • Strategy接口。這個接口用來聲明每一種方式的獨立執行策略,用來封裝具體策略的特有算法邏輯。
  • ConcreteStrategyStrategy的實現類。實現了不同策略的算法邏輯。比如每種支付的調用細節等等。
  • Context上下文。它通過策略接口來引用了具體的策略並使用具體的策略來執行邏輯,同時所有策略的共性也可以在該類中進行統一處理。在聚合支付需求中我們傳入一個策略,先執行支付前的邏輯,然後使用策略,策略執行完畢后,再執行後置的共性邏輯。
  • Client客戶端。創建策略對象並傳遞給上下文Context,然後由上下文運行具體的策略。

結合業務邏輯是這樣的:請求到達客戶端,客戶端根據請求中包含的支付渠道來構建對應的策略對象並把它交給上下文對象去執行支付流程。

然後我們就可以分別為支付寶、微信支付、銀聯支付構造三個策略對象 AliPayStrategyWechatPayStrategyUnionPayStrategy ,我們來模擬一下執行策略:

public class Client {

    public static void main(String[] args) {
        // 獲取請求中的支付渠道標識
        String code = "p01";
        PayStrategy payStrategy = null;
        PayRequest request = null;
        
        if (PayType.ALI.getCode().equals(code)) {
            //組裝為支付寶支付策略
            payStrategy = new AliPayStrategy();
            // 構造支付寶請求參數
            request = new AliPayRequest();
        }
        if (PayType.WECHAT.getCode().equals(code)) {
            //組裝為微信支付策略
            payStrategy = new AliPayStrategy();
            // 構造微信支付請求參數
            request = new WechatPayRequest();
        }

        if (PayType.UNION.getCode().equals(code)) {
            //組裝為銀聯支付策略
            payStrategy = new UnionPayStrategy();
            // 構造銀聯支付請求參數
            request = new UnionPayRequest();
        }

        if (Objects.nonNull(payStrategy)) {
            PayContext payContext = new PayContext();
            payContext.setPayStrategy(payStrategy);
            payContext.pay(request);
        }
    }
}

我們拿到請求中的支付標識,然後初始化對應的支付策略,封裝指定的請求參數,交給上下文對象PayContext 來執行請求。如果你再增加什麼ApplePay之類的去實現ApplePayStrategy就行了。

4. 優缺點

策略模式並不都帶來正面的作用。

4.1 優點

  • 我們將算法的實現和算法的使用進行了隔離,算法實現只關心算法邏輯,使用算法只關心什麼條件下使用什麼算法。
  • 開閉原則,無需修改上下文對象,想擴展只需要引入新的策略。
  • 運行時根據條件動態的去切換算法。
  • 適應個性的同時也可以兼容共性。

4.2 缺點

  • 客戶端必須明確知道激活策略的條件。
  • 引入太多的策略類。
  • 可被一些函數式接口所代替。偽代碼Pay.request(data).strategy(data->{ })

5. 總結

策略模式也是很常見而且有着廣泛使用場景的設計模式。今天我們從聚合支付來學習了策略模式,對它的優缺點也進行了一個分析。隨着函數式編程的普及,策略模式開始被逐漸的代替,但是它依然值得我們去學習。感謝你的閱讀,多多關注:碼農小胖哥,更多編程乾貨奉上。

關注公眾號:Felordcn 獲取更多資訊

個人博客:https://felord.cn

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

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

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

小心吃虧 這些4-7萬熱點車乞丐版真不值得買_網頁設計公司

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

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

98-10。08萬帝豪 2017款 三廂百萬款 1。5L 手動時尚型作為全系最低配車型,其6。98萬的售價十分吸引人,也為帝豪消費者拉低了准入門檻,但是這款車型卻是帝豪全系唯一沒有配備ESp的車型。寶駿560指導價:6。98-9。48萬寶駿560的指導價為指導價:6。

所謂乞丐版就是車系中最低配的版本,那麼為什麼小編說買車不要買乞丐版呢?主要是因為乞丐版配置低,這裏不關指的是舒適性配置,還包括安全配置等。

安全

有人說,這個車是五星級安全呢,但是你以為全系都是5星安全嗎?除去那幾個加分項呢?

廠家宣傳的安全測試成績主要以C-NCAp測試成績為主,而車輛也是廠家送測的,所以參加測試的車輛自然是該車系中的頂配車型,我們再看看C-NCAp測試中的三個加分項

1、安全帶提醒裝置 0.5分~1分

2、側面安全氣囊和氣簾 1分

3、电子穩定性控制系統 1分

加起來就是3分,很多頂配車型都是帶有這三個配置的,但是低配車型沒有,所以頂配車能夠拿到5星安全成績,

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

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

低配的就不好說了。

而ESp的重要性也無需小編多費口舌了。

配置

而配置上也是差別待遇,乞丐版的車配置也少得可憐,有的沒有遙控鑰匙、中控鎖甚至是ABS都沒有,它們更多的作用還是為了拉低售價。

比如:

比亞迪F3

指導價:4.39-7.79萬

比亞迪F3的2016款車型的乞丐版(比亞迪F3 2016款 1.5L 手動舒適型)車型只有駕駛席方向盤上可憐巴巴的一個安全氣囊,副駕駛的位置是沒有安全氣囊的,卻還使用了仿皮座椅,只能說比亞迪太懂消費者的心理了——裡子我不管,看得到的一定要好。

帝豪燃油版

指導價:6.98-10.08萬

帝豪 2017款 三廂百萬款 1.5L 手動時尚型作為全系最低配車型,其6.98萬的售價十分吸引人,也為帝豪消費者拉低了准入門檻,但是這款車型卻是帝豪全系唯一沒有配備ESp的車型。

寶駿560

指導價:6.98-9.48萬

寶駿560的指導價為指導價:6.98-9.48萬,為什麼價格是6.98萬起了呢?並非寶駿官方降價了,而是推出了一個6.98萬的版本,6.98萬買這麼大的SUV看似划算,而且這個低配版還有ESp車身穩定系統,但是和F3乞丐版一樣只有1個安全氣囊,不知道你們怎麼想的反正我不能接受。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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

菅義偉施政方針演說 2050年溫室氣體達淨零排放_網頁設計公司

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

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

摘錄自2020年10月26日中央社報導

日本首相菅義偉今(26日)在國會臨時會上,發表上任後首次施政方針演說。他在演說中宣布,日本2050年要達到溫室氣體淨零排放的新目標。

日本朝日新聞報導,菅義偉在施政方針演說中表示,要讓「實現綠色社會」成為成長戰略的台柱,並宣示2050年要達到溫室氣體實質零排放。

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

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

目前日本僅設定2050年達到溫室氣體減排80%,對於何時要達到溫室氣體實質淨零排放,沒有設定具體的年限目標。

菅義偉說,為實現2050年溫室氣體淨零排放目標,關鍵是促進研發次世代太陽能電池、再次利用二氧化碳的「碳回收」技術等。並推進核能發電政策,對於排出大量溫室氣體的火力發電,要用政策從根本去改變。

氣候變遷
國際新聞
日本
碳中和
減少溫室氣體排放

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

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

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

OPPO Find X3 Lite 完整實機開箱照洩漏!只是外觀有點眼熟?_網頁設計公司

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

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

前段時間 OPPO 正式在台灣推出 Reno5 系列新機,在 2021 年也傳聞將在第一季 Find X 系列就會推出最新的 Find X3 系列新機。不過在稍早有一款 OPPO Find X3 Lite 的實機外觀提前被曝光!從這些提前被洩漏的完整盒裝配件和標籤,都能肯定這就是 Find X3 Lite 國外市售版的實機。不過眼尖的人可能會發現,這款手機其實有些眼熟。

▲圖片來源:Sudhanshu(Twitter/@Sudhanshu1414)

OPPO Find X3 Lite 完整實機開箱照洩漏!只是外觀有點眼熟?

稍早在 Twitter 由 Sudhanshu 釋出了一批 OPPO Find X3 Lite 的完整實機開箱照片,從中我們可見到 Find X3 Lite 採用四鏡頭主相機、支持螢幕指紋辨識並附贈了軟質保護套和 SuperVOOC 快速充電器。

▲圖片來源:Sudhanshu(Twitter/@Sudhanshu1414)

從其他張照片能清楚看到 Find X3 Lite 的機身正反面,其螢幕採用平面的 OLED 挖孔全螢幕,在機身背面配備四鏡頭主相機。從這些照片各位想必已經覺得它有些眼熟吧?其實這款 OPPO Find X3 Lite 5G 應是針對特定市場推出的更名機型,而它的「本體」正是兩週前才剛在台灣正式發表的 OPPO Reno5 。

▲圖片來源:Sudhanshu(Twitter/@Sudhanshu1414)

OPPO Reno5(Find X3 Lite)與 Reno5 Pro 單從機身背面很難分辨,但從機身正面的螢幕則可區分兩者之間的不同。首先, OPPO Reno5 配備 6.43 吋 FHD+ 解析度 OLED 螢幕,螢幕為平面。至於 Reno5 Pro 則配備更大的 6.55 吋 FHD+ 解析度 OLED 曲面螢幕,兩者皆支援 90Hz 螢幕更新率和 180Hz 觸控採樣率。

▲Reno5(圖左)|Reno5 Pro(圖右)

然而,其實最早提出這則爆料的事 Evan Blass(@evleaks),他在兩週前就已經於 Voice 預告 OPPO 將以 Reno5 推出換名在其他市場上市的 Find X3 Lite ,當時也釋出官方渲染圖(如下):

▲圖片來源:Evan Blass(Voice/@evleaks)

這類將同款產品,針對不同銷售市場更換新的名稱在當地上市是相當常見的。例如之前部分 Redmi 和小米的手機、智慧手錶在引進台灣後,可能會採用不同的名稱。另外,前陣子 realme 在中國市場推出 realme V15 ,近期也將在印度市場更名為 realme X7 在印度上市。

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

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

消息來源:Sudhanshu(Twitter/@Sudhanshu1414)|Evan Blass(Voice/@evleaks)

延伸閱讀:
OPPO Reno5 、Reno5 Pro 正式在台發表:全新升級 AI 錄影、獨家 Reno Glow 2.0 星鑽工藝打造精緻外觀

realme Watch 2 智慧手錶通過 FCC 認證,外觀、規格提前曝光!電池容量增加、續航翻倍

您也許會喜歡:

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

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

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

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

api.versioning 版本控制 自動識別最高版本_網頁設計公司

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

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

Microsoft.AspNetCore.Mvc.Versioning //引入程序集

.net core 下面api的版本控製作用不需要多說,可以查閱https://www.cnblogs.com/dc20181010/p/11313738.html

普通的版本控制一般是通過鏈接、header此類方法進行控制,對ApiVersionReader進行設置,例如

services.AddApiVersioning(o => {
                //o.ReportApiVersions = true;//返回版本可使用的版本
                o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version"));//通過Header或QueryString進行傳值來判斷api的版本
//o.DefaultApiVersion
= new ApiVersion(1, 0);//默認版本號
});

或者使用https://www.cnblogs.com/tdfblog/p/asp-net-core-api-versioning.html這種方式

這兩種方式都需要傳遞api的版本信息,如果不傳遞將會報錯

{"error":{"code":"ApiVersionUnspecified","message":"An API version is required, but was not specified.","innerError":null}}

如果我們不想傳遞api的版本信息時,可以將

o.AssumeDefaultVersionWhenUnspecified = true; //此選項將用於在沒有版本的情況下提供請求
o.DefaultApiVersion = new ApiVersion(1, 0); //設置默認Api版本是1.0

打開,這個我們每次請求如果不傳遞版本信息也不會報錯了,但我們的請求將會指向1.0版本,那麼我想讓默認版本指向我寫的api裏面的最高版本怎麼做?

我們將默認版本修改為最高版本可以嗎?

這裏將會出現一個問題,我的api版本可能由於各種各樣原因造成最高版本不一致的問題

所以我們不能採用指定默認版本是最高版本的方法來解決,這個最高版本還必須要是動態的,通過翻閱https://github.com/microsoft/aspnet-api-versioning/wiki/API-Version-Selector#current-implementation-api-selector可以得知

The CurrentImplementationApiVersionSelector selects the maximum API version available which does not have a version status. 
If no match is found, it falls back to the configured DefaultApiVersion. For example, if the versions "1.0", "2.0", and "3.0-Alpha" are available,
then "2.0" will be selected because it's the highest, implemented or released API version. CurrentImplementationApiVersionSelector選擇不具有版本狀態的最大可用API版本。 如果找不到匹配項,它將回退到配置的DefaultApiVersion。
例如,如果提供版本“
1.0”,“ 2.0”和“ 3.0-Alpha”,則將選擇“ 2.0”,因為它是最高,已實施或已發布的API版本。

services.AddApiVersioning( options => options.ApiVersionSelector = new CurrentImplementationApiVersionSelector( options ) );

通過這個版本選擇器,我們可以將最大版本得出,修改上面services.AddApiVersioning

services.AddApiVersioning(o => {
                o.ReportApiVersions = true;//返回版本可使用的版本
                //o.ApiVersionReader = new UrlSegmentApiVersionReader();
                //o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version"));
                //o.ApiVersionReader = ApiVersionReader.Combine(new QueryStringApiVersionReader("api-version"));
                o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"));//版本號以什麼形式,什麼字段傳遞
                o.AssumeDefaultVersionWhenUnspecified = true;//此選項將用於在沒有版本的情況下提供請求
                o.DefaultApiVersion = new ApiVersion(1, 0);//默認版本號
                o.ApiVersionSelector = new CurrentImplementationApiVersionSelector(o);//默認以當前最高版本進行訪問
            });

舉個栗子

namespace Default.v1.Controllers
{
    [ApiVersion("1.0")]
    [Route("[controller]/[action]")]
    [ApiController]
    public class HomeController : Controller, IBaseController
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController (ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public JsonResult GetJson()
        {
            return Json("Home 1.0");
        }
}

Default.v1.Controllers.Home

namespace Default.v2.Controllers
{
    [ApiVersion("2.0")]
    [Route("[controller]/[action]")]
    [ApiController]
    public class HomeController : Controller, IBaseController
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController (ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public JsonResult GetJson()
        {
            return Json("Home 2.0");
        }
}

Default.v2.Controllers.Home

namespace Default.v1.Controllers
{
    [ApiVersion("1.0")]
    [Route("[controller]/[action]")]
    [ApiController]
    public class TestController : Controller, IBaseController
    {
        private readonly ILogger<HomeController> _logger;

        public TestController (ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public JsonResult GetJson()
        {
            return Json("Test 1.0");
        }
}

Default.v1.Controllers.Test

 

 

 

 我們在

請求/home/getjson 時返回“Home 2.0”

請求/test/getjson 時返回“Test 1.0”

這樣就可以動態的請求最高版本了

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

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

 

但是還是會有問題的,比如,在我添加了Area和User區域下的HomeController,且User區域下的HomeController增加了1.0和3.0版本之後,神奇的一幕出現了

我的HomeController進不去了。。。

{"error":{"code":"UnsupportedApiVersion","message":"The HTTP resource that matches the request URI 'https://localhost:44311/home/getjson' is not supported.","innerError":null}}

這個時候去google都查不到原因。。。

查看api-supported-versions,返回的是1.0,2.0,3.0。。。我的api版本控制被污染了3.0版本從哪裡來的哪?第一反應是從User區域來的

我現在在User區域下添加一個除了Home和Test以外Name的Controller就可以請求成功,這個讓我懷疑到是不是api.versioning本身的問題,首先懷疑的是Controller的Name問題,源碼拉取下來,從添加版本控制的地方(services.AddApiVersioning)開始找

 

 

 

最後終於在ApiVersionCollator中找到了蛛絲馬跡

///https://github.com/microsoft/aspnet-api-versioning/blob/master/src/Microsoft.AspNetCore.Mvc.Versioning/Versioning/ApiVersionCollator.cs

namespace Microsoft.AspNetCore.Mvc.Versioning
{
    using Microsoft.AspNetCore.Mvc.Abstractions;
    using Microsoft.AspNetCore.Mvc.Controllers;
    using Microsoft.Extensions.Options;
    using System;
    using System.Collections.Generic;
    using System.Linq;

    /// <summary>
    /// Represents an object that collates <see cref="ApiVersion">API versions</see> per <see cref="ActionDescriptor">action</see>.
    /// </summary>
    [CLSCompliant( false )]
    public class ApiVersionCollator : IActionDescriptorProvider
    {
        readonly IOptions<ApiVersioningOptions> options;

        /// <summary>
        /// Initializes a new instance of the <see cref="ApiVersionCollator"/> class.
        /// </summary>
        /// <param name="options">The current <see cref="ApiVersioningOptions">API versioning options</see>.</param>
        public ApiVersionCollator( IOptions<ApiVersioningOptions> options ) => this.options = options;

        /// <summary>
        /// Gets the API versioning options associated with the collator.
        /// </summary>
        /// <value>The current <see cref="ApiVersioningOptions">API versioning options</see>.</value>
        protected ApiVersioningOptions Options => options.Value;

        /// <inheritdoc />
        public int Order { get; protected set; }

        /// <inheritdoc />
        public virtual void OnProvidersExecuted( ActionDescriptorProviderContext context )
        {
            if ( context == null )
            {
                throw new ArgumentNullException( nameof( context ) );
            }

            foreach ( var actions in GroupActionsByController( context.Results ) )
            {
                var collatedModel = CollateModel( actions );

                foreach ( var action in actions )
                {
                    var model = action.GetProperty<ApiVersionModel>();

                    if ( model != null && !model.IsApiVersionNeutral )
                    {
                        action.SetProperty( model.Aggregate( collatedModel ) );
                    }
                }
            }
        }

        /// <inheritdoc />
        public virtual void OnProvidersExecuting( ActionDescriptorProviderContext context ) { }

        /// <summary>
        /// Resolves and returns the logical controller name for the specified action.
        /// </summary>
        /// <param name="action">The <see cref="ActionDescriptor">action</see> to get the controller name from.</param>
        /// <returns>The logical name of the associated controller.</returns>
        /// <remarks>
        /// <para>
        /// The logical controller name is used to collate actions together and aggregate API versions. The
        /// default implementation uses the "controller" route parameter and falls back to the
        /// <see cref="ControllerActionDescriptor.ControllerName"/> property when available.
        /// </para>
        /// <para>
        /// The default implementation will also trim trailing numbers in the controller name by convention. For example,
        /// the type "Values2Controller" will have the controller name "Values2", which will be trimmed to just "Values".
        /// This behavior can be changed by using the <see cref="ControllerNameAttribute"/> or overriding the default
        /// implementation.
        /// </para>
        /// </remarks>
        protected virtual string GetControllerName( ActionDescriptor action )
        {
            if ( action == null )
            {
                throw new ArgumentNullException( nameof( action ) );
            }

            if ( !action.RouteValues.TryGetValue( "controller", out var key ) )
            {
                if ( action is ControllerActionDescriptor controllerAction )
                {
                    key = controllerAction.ControllerName;
                }
            }

            return TrimTrailingNumbers( key );
        }

        IEnumerable<IEnumerable<ActionDescriptor>> GroupActionsByController( IEnumerable<ActionDescriptor> actions )
        {
            var groups = new Dictionary<string, List<ActionDescriptor>>( StringComparer.OrdinalIgnoreCase );

            foreach ( var action in actions )
            {
                var key = GetControllerName( action );

                if ( string.IsNullOrEmpty( key ) )
                {
                    continue;
                }

                if ( !groups.TryGetValue( key, out var values ) )
                {
                    groups.Add( key, values = new List<ActionDescriptor>() );
                }

                values.Add( action );
            }

            foreach ( var value in groups.Values )
            {
                yield return value;
            }
        }

        static string TrimTrailingNumbers( string? name )
        {
            if ( string.IsNullOrEmpty( name ) )
            {
                return string.Empty;
            }

            var last = name!.Length - 1;

            for ( var i = last; i >= 0; i-- )
            {
                if ( !char.IsNumber( name[i] ) )
                {
                    if ( i < last )
                    {
                        return name.Substring( 0, i + 1 );
                    }

                    return name;
                }
            }

            return name;
        }

        static ApiVersionModel CollateModel( IEnumerable<ActionDescriptor> actions ) => actions.Select( a => a.GetApiVersionModel() ).Aggregate();
    }
}

View Code

 

其中GroupActionsByController將Controller按照Controller的名字進行分組,再看看內部,分組的時候將GetControllerName( action )作為key,那麼GetControllerName是幹嘛的,

protected virtual string GetControllerName( ActionDescriptor action )
        {
            if ( action == null )
            {
                throw new ArgumentNullException( nameof( action ) );
            }

            if ( !action.RouteValues.TryGetValue( "controller", out var key ) )
            {
                if ( action is ControllerActionDescriptor controllerAction )
                {
                    key = controllerAction.ControllerName;
                }
            }

            return TrimTrailingNumbers( key );
        }

這個方法原本是沒有問題的,但是牽扯到Area的時候就會出問題了。。它將根目錄下的HomeController和User.HomeController視為同一類的Controller然後去做版本的屬性注入,造成CurrentImplementationApiVersionSelector選擇器選不到正確的版本,所以返回了上面的錯誤,我們將GetControllerName內部修改為

protected virtual string GetControllerName( ActionDescriptor action )
        {
            if ( action == null )
            {
                throw new ArgumentNullException( nameof( action ) );
            }

            if ( !action.RouteValues.TryGetValue( "controller", out var key ) )
            {
                if ( action is ControllerActionDescriptor controllerAction )
                {
                    key = controllerAction.ControllerName;
                }
            }

            if ( !action.RouteValues.TryGetValue( "area", out var area ) )
            {
            }

            return TrimTrailingNumbers( area + key );
        }

這樣就可以走通了

 

我們有兩種解決辦法,一個是把源碼拉取下來,方法修改掉,項目的依賴項替換為自己修改的Microsoft.AspNetCore.Mvc.Versioning,另一種辦法是將services.AddApiVersioning重寫。。。請相信我,拉取修改替換依賴比重寫services.AddApiVersioning快且簡便。。。

issue:https://github.com/microsoft/aspnet-api-versioning/issues/630

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

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

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

月銷2萬!國產SUV又一爆款誕生了!_網頁設計公司

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

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

5的最低投訴銷量比奪得第一,大幅超越主流合資產品,成為有口皆碑的A級車“品質王”。榮威360憑藉“藍芯”科技在動力總成上的核心優勢,以榮威RX5和榮威360為代表的產品“量價齊收”,還將持續帶動榮威品牌的快速增長。新能源:獲中國汽車界“諾貝爾”獎,勇奪專業賽道“插混王”10月,上汽新能源不僅在技術、整車性能等方面得到了行業和消費者的認可,市場銷量也在不斷攀升。

在榮威RX5強勁熱銷勢頭的帶動下,上汽乘用車10月銷量破4萬,同比激增147%!榮威品牌更是以245%的增速,蟬聯中國品牌增速王!

10月,榮威RX5月銷量首次突破2萬輛,截至目前訂單量已突破10萬輛。第4.5萬輛榮威RX5已於日前在上汽臨港生產基地下線,南京工廠榮威RX5生產線也如期改造完成並將全面投產。榮威RX5的熱銷還帶動了榮威、MG名爵各款車型的銷售,上汽乘用車10月份總銷量超過4萬輛,同比激增147%。

上汽乘用車堅持中高端發展路線,十年磨一劍,通過品質和技術的提升來打造最好的產品。隨着今年“芯動戰略”成果的集中爆發,上汽也正式駛入“品質+銷量”發展階段的“快車道”,引領中國品牌走進品價比時代。

榮威RX5月銷量破2萬 好爸爸聯手領跑市場

10月,榮威RX5銷量突破2萬輛。在榮威RX5熱銷帶動下,上汽榮威品牌從8月同比增長205%,9月增214%,到10月的245%,銷量連續翻番,勢如破竹,帶領上汽乘用車重回發展快車道。爆款SUV榮威RX5上市第三個月銷量即破2萬,還獲得李克強總理親切“接見”,以及工博會工業設計金獎、2017年度德國紅點“中國好設計”榮譽獎、2016“上海市優秀工業設計金獎”等榮譽;榮威360和榮威350組成的“榮威3系”,9月、10月銷量接連破萬,實現了銷量與口碑的雙豐收。

榮威RX5獲工博會工業設計金獎

從上市不到2周互聯網車型訂單破萬,到上市首月交車近萬輛,次月銷量近1.4萬輛,再到第三個月銷量超過2萬輛,榮威RX5的爆款熱銷之勢根本停不下來!作為首款成功突破合資價格區間的中國品牌SUV,真正讓消費者“買得起、用得爽”,成為10-20萬元SUV首選。隨着榮威RX5持續熱賣,勢必將進一步撬動車市格局。

榮威RX5在SUV市場上的大獲全勝,離不開陳虹“爸爸”和馬雲“爸爸”的聯手助攻。在10月的全球首次互聯網汽車拉力賽中,榮威RX5憑藉上汽世界級“藍芯”高效動力科技,以及阿里的互聯網黑科技,創下3.7L/百公里的超低油耗紀錄,刷新SUV節油標準。憑藉互聯網“黑科技”在複雜生活場景中的實際應用,榮威RX5率先開啟了未來交通密碼,為用戶探索追求新生活方式的可能性。

榮威RX5全球首次互聯網汽車拉力賽啟動

不只在SUV市場發力,在家轎市場上,榮威品牌勢頭同樣強勁。上市一周年的榮威360,憑藉全方位高品質和紮實的用戶口碑,累計銷售9萬輛,成為囊括“Carplay車型銷量王”、“品質王”及“A級車節油王”的“三冠王”,更是榮獲德國紅點“中國好設計”唯一汽車類大獎。此前的“千公里一箱油”極限油耗挑戰總決賽中,榮威360一箱油可行駛1496km,創下3.7L/100km的最低油耗紀錄,力證“藍芯”世界級高效動力的領先燃油經濟性。在權威汽車平台《車質網》公布的投訴排行榜中,榮威360以萬分之2.5的最低投訴銷量比奪得第一,大幅超越主流合資產品,成為有口皆碑的A級車“品質王”。

榮威360

憑藉“藍芯”科技在動力總成上的核心優勢,以榮威RX5和榮威360為代表的產品“量價齊收”,

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

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

還將持續帶動榮威品牌的快速增長。

新能源:獲中國汽車界“諾貝爾”獎,勇奪專業賽道“插混王”

10月,上汽新能源不僅在技術、整車性能等方面得到了行業和消費者的認可,市場銷量也在不斷攀升。

10月28日,中國汽車工業科學技術獎揭曉,上汽新能源憑藉在EDU電驅、HCU電控和ESS電池方面的創新,成為今年插電混動領域唯一獲一等獎的車企,這也是上汽時隔5年再次獲得中國汽車界最高榮譽。中國汽車工業科學技術獎是經國家科委批准,業內公認的最能代表中國汽車科技發展水平的獎項,被譽為中國汽車界“諾貝爾獎”。擁有百餘項國內外專利授權和技術認證,上汽插電混動技術突破了混合動力技術的專利壁壘,成為最先進的新能源汽車動力科技。

榮威e550

得益於上汽世界級新能源科技的運用,榮威e550首次參加中國量產車性能大賽(CCpC),便以總成績第一的表現摘得冠軍,並分別在長距離經濟性、制動性、舒適性等方面共斬獲了6個單項冠軍,充分驗證了上汽新能源領先世界的產品性能,大大增強了消費者的購買信心。

截止10月,上汽新能源今年已累計銷售17474輛,同比大增114%。其中,主銷車型榮威e550共銷售了13600輛,同比增長72%,多次獲得新能源中級車“銷量王”稱號。今年上市的中國首款插電混動高級轎車榮威e950,已連續三個月成為上海B級車銷量冠軍,並成為中國首款月銷過千的新能源B級車。

榮威e950

接下來,上汽新能源還將推出SUV車型,豐富消費者選擇,並引領中高端SUV市場消費趨勢,給消費者提供最智能便捷、最節能環保的出行方案。

MG名爵:前10月同比增長30% 名爵銳騰高性能領跑SUV細分市場

MG名爵10月繼續保持穩步攀升的態勢。今年1-10月,MG名爵全系車型銷量達到58797輛,與去年同比勁增27%!“高性能中級SUV”名爵銳騰更是以全面越級的產品力強勢領跑,同比增長30%。

征戰,不是我們的習慣,而是我們的傳統!作為“高性能中級SUV”,名爵銳騰7月從新疆天山開啟征程,以“十項全能 挑戰巔峰”的高性能姿態全面征服嚴苛複雜的山路環境。得益於上汽世界級“藍芯”動力科技與保時捷專業級底盤調校強強聯手,名爵銳騰從絕壁斷崖到5000米海拔全面制霸,並用自己獨有的方式和態度號召更多年輕人加入到征戰的隊伍中,把自己的愛車真正“開出趣”、綻放年輕的魅力。

名爵銳騰

除了SUV產品的出色表現,高性能風尚中級車MG GT名爵銳行勢頭同樣強勁,1-10月銷量同比增長更是高達61%。今年推出2016款MG GT名爵銳行並新增1.5L車型后,其價格下探至7萬區間,幫助更多年輕消費者實現購車夢想。此外,9月起MG GT名爵銳行的智能娛樂行車系統全面升級,可支持百度CarLife,適配手機的型號更寬泛,名爵銳行也成為首款同時兼容蘋果Carplay和百度CarLife的中級車,全面進入“雙Car”時代。

MG名爵與生俱來的競速基因,讓更多的消費者享受駕控樂趣和汽車生活,綻放獨有的個性魅力,將愛車“開出趣”。即將進入年底收官的關鍵,高性能、高智能、高安全的核心優勢,將帶動MG名爵品牌持續高速增長。

隨着品價比時代的到來,上汽始終堅持品質為王,打造符合時代的最好產品。在“芯動戰略”的整體戰略布局下,上汽乘用車以“藍芯”和“綠芯”兩大技術品牌為支撐,搭載互聯網思維,堅持創新發展,突破傳統局限。未來上汽乘用車還將不斷超越創新,為消費者帶來更多高品質的越級之作。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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