外觀帥翻天,開起來卻超輕鬆,這是你想要的跑車嗎?

在任何轉速和時速下都能找到一個適合的擋位能夠滿足當時的行駛需求。同時還將變速域拓寬,使電動機的轉速有效降低,讓這款只有三百多匹的混合動力跑車也能跑到250公里/小時的時速。當然,LC500h的操控也是不錯的。當然這種不錯並不是超跑那種高極限帶來的刺激感,也不是鋼炮帶來的靈活反應。

在誕生之初雷克薩斯就是為了美國市場而建立的豪華品牌。除了豪華車以外,雷克薩斯也為美國市場推出過兩款豪華跑車,一款是SC300,一款是SC430。不過由於各方面的原因,兩款跑車並不算很成功。不過現在,雷克薩斯再次推出了一款名為LC的雙門豪華GT跑車,將日式豪華GT跑車的理念重新詮釋。

這款全新的LC是基於凌志的GA-L平台所打造,也就是和新LS相同的一個平台,也可以看做LS的Coupe版本。以奔馳S-class為例,它是有一個Coupe版本,但整體外形是和S-Class本身非常相近。而LS一直都沒有Coupe版本,因此LC的外形可以和之前推出的LF-LC概念車非常一致,出來的外觀效果也是非常驚艷。

這次我們試駕的是一台LC500h,採用代號8GR的3.5公升V6自然吸氣發動機為主要動力源,使用阿特金森循環,在性能和能效上取得平衡,最大馬力299匹,加上電動機的輔助是357匹,幫LC在

5秒內完成百公里加速,實力並不俗。而豐田的混合動力和其他品牌的有些區別,它採用了一個行星齒輪組pSD為核心的ECVT結構,將電動機、發電機和汽油機連接在一起,油電切換非常平順,能夠在性能和節能上取得高度平衡。

LC500h的ECVT還加入了一個4AT變速箱,能夠和ECVT結合模擬出10個擋位。在任何轉速和時速下都能找到一個適合的擋位能夠滿足當時的行駛需求。同時還將變速域拓寬,使電動機的轉速有效降低,讓這款只有三百多匹的混合動力跑車也能跑到250公里/小時的時速。

當然,LC500h的操控也是不錯的。當然這種不錯並不是超跑那種高極限帶來的刺激感,也不是鋼炮帶來的靈活反應。而是非常適度的給與恰當的反應,另外較小的轉向半徑也能提升靈活性。當然了,LC500h並不是用來刷賽道刷圈速的車型,更多的是在舒適的環境中給予更佳的操控體驗。

做個比喻,LC500h就是一個樣子好身材棒的女管家。外觀漂亮、內飾舒服、操控靈活、動力飽滿,但各方面好之餘又不會太過火。因此對於筆者來說,這足以成為新的Dream Car。究竟它真的這麼好?請觀看本期視頻。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

我就下車買了包辣條,我的車居然自己跑了?

當遇到等燈情況時,只需深踩或者保持剎車一段時間的話,他就會自行啟動拉起手剎,以防溜車,而當起步時,直接踩油門它又會自行解鎖,是一個非常便利且強大的功能。此功能同樣適用於配有电子手剎的手動擋車型,而且相比之前介紹的坡道輔助功能,AUTO HOLD在坡道起步時要來得更便捷更從容。

最近,看到一則讓人非常驚險而冒冷汗的視頻,

一位司機停車時居然忘記拉起手剎,導致車子被大風吹移,

所幸的是沒有造成人員傷亡,

接下來我們先來看一下這個視頻:

這位司機過後除了買張彩票之外,更應該嚴肅反省一下自己的過錯!

其實,生活中因為忘記拉手剎造成的悲劇有很多,

同樣,為了防止這些類似錯誤造成的悲劇,汽車廠商考慮了許多,而AUTO HOLD就是這樣的一個功能;

AUTO HOLD的中文全稱叫自動駐車功能,是配合电子手剎,並通過ABS、ESp等一些列控制單元來工作;

當遇到等燈情況時,只需深踩或者保持剎車一段時間的話,他就會自行啟動拉起手剎,以防溜車,而當起步時,直接踩油門它又會自行解鎖,是一個非常便利且強大的功能。

此功能同樣適用於配有电子手剎的手動擋車型,而且相比之前介紹的坡道輔助功能,AUTO HOLD在坡道起步時要來得更便捷更從容。

現如今大部分配有电子手剎的車型都附有AUTO HOLD功能,還算是一個較為常見的配置,更是懶人的福音;

拉手剎是停車時必不可少的步驟,因為這個小小的動作會影響自己以及公共的安全,所以小夥伴們一定要養成上車系好安全帶,停車順帶手剎的好習慣!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

※超省錢租車方案

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

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

誰說開寶馬坐奔馳?這幾台奔馳能讓你爽到下不了車!

試着去揣摩一下C63用戶的心理,他們應該不太會在乎載人載物的實用性,花了個一百好幾萬的買高性能車,最先想要收穫的是身份認同感以及駛過街頭被萬眾注視的榮耀感,所以要是四門的C63,在視覺上就難以營造這種效果。其次則關乎到駕控,雖然C63與C63 Coupe的動力總成一模一樣,但實際體驗下來,由於車輛尺寸、車架設計、前後重量比等不同,在駕控上造就的差異還是能夠被感知,相比之下C63 Coupe表現更均衡,無論是做漂移show,還是跑圈時彎中的可控性都要更優秀,所以沒有理由不選它。

當下是AMG家族最鼎盛的時代,63系列都逐漸完成了產品的迭代,新加入的43系列則驟然讓AMG車型有了“性價比”一說,而處在金字塔塔尖的AMG GT系列,也迎來了一位新成員。

4月13日晚間,浙江紹興,伴着蒙蒙細雨和陰冷空氣,梅賽德斯-AMG卻以特殊的方式燃點了周遭的氣氛。一款新車的上市發布,沒有明星站台,沒有歌舞助陣,但新車本身就已是萬眾焦點,當晚,AMG GT C中國特別版正式登陸中國市場,指導價格為197.8萬元。

雖然上市的只有一款車型,但意義卻重大。AMG GT作為AMG家族的頂級車系,無疑是這個品牌形象和產品實力的擔當,而基於頂級車係為中國提供特別版,無疑是AMG向中國消費者的友好示意,同時也是對中國市場的絕對重視。

要知道,AMG GT C在定位上,僅次於現時AMG最Top的跑車車型——AMG GT R,那頭身披一襲綠袍的美麗怪物。

有幸的是,在上市發布會後的AMG駕駛學院中,我體驗的首款車型就是這輛AMG GT R。而在两天時間里充分駕駛過近乎全系AMG車型后,我也挑選出三款我最喜歡和兩款我不太感冒的車型與各位分享。

最喜歡的AMG之:AMG GT R

不禁想起一個梗,《頭文字D》電影里,阿木非要老爹給自己買一輛GT-R,老爹說要不買輛奔馳?這不,奔馳也有“GT R”了,阿木你滿意了嗎?

AMG GT R自然會是我最喜歡的AMG車型之首,這來自於它的純粹。585ps最大馬力和700N·m最大扭矩,共同呈現的是3.6s破百的極致加速,聽上去並沒有比GT S快上很多,但捨棄更多GT性格而向賽車化靠攏,是這輛GT R想要達成的事。

全新設計的空氣動力學套件正如你所見,視覺上讓這輛GT R看着會比GT S更來者不善,同車系中最大的后擾流板和層次豐富的整流器讓你可以不用通過尾標,僅僅是看局部就能確認這不是一輛普通的AMG GT。

而新的這套空氣動力學套件,使得AMG GT R在極速下比AMG GT S多獲得155公斤的下壓力。

駕駛這輛以7分10秒09排在紐北量產車成績第四的GT R,跑浙江國際賽車場基本上是小菜一碟。四條pilot Sport Cup 2輪胎的抓地力十分驚人,我可以放肆地以更高的速度切入那些低速彎而不用擔心推頭。

首次被應用在GT車繫上的後輪主動轉向系統對過彎的幫助也很大,它由電動馬達控制,高於100km/h過彎,後輪能以最高5°轉角與前輪同向轉動;低於100km/h過彎,後輪則能以最高1.5°轉角與前輪反向轉動。

除了全新調校后,採用了比GT S更強大的新型渦輪增壓器的M178發動機外,AMG又為GT R專屬打造了高性能排氣系統,兩者相遇簡直是賽道上的黃金組合,比GT S更高效的動力爆發以及更激昂彭拜的轟鳴、回火,即便是在這裏開着這輛GT R跑上三天三夜,我也不會覺得膩。

最喜歡的AMG之:C63 Coupe

C63 Coupe是我的菜,如果哪天我能有個百來萬的預算購車,定會將它收入囊中。也許有人會問,為何一定是Coupe?基於兩點。

試着去揣摩一下C63用戶的心理,他們應該不太會在乎載人載物的實用性,花了個一百好幾萬的買高性能車,最先想要收穫的是身份認同感以及駛過街頭被萬眾注視的榮耀感,所以要是四門的C63,在視覺上就難以營造這種效果。

其次則關乎到駕控,雖然C63與C63 Coupe的動力總成一模一樣,但實際體驗下來,由於車輛尺寸、車架設計、前後重量比等不同,在駕控上造就的差異還是能夠被感知,相比之下C63 Coupe表現更均衡,無論是做漂移show,還是跑圈時彎中的可控性都要更優秀,所以沒有理由不選它。

最喜歡的AMG之:C43

自43系列出現,市場上也跟隨了不少質疑聲,諸如“43非真AMG”的言論此起彼伏。誠然,從硬件來看,43系的M276發動機並非AMG“一人一機”打造,只是在經過AMG重新調校后獲得了更強的動力。

但梅賽德斯還是大大方方地為它烙上了AMG的徽標,不像奧迪RS下來有S、S Line,M power下來會有M performance,被叫做AMG的就只能是AMG,這點毫無疑問,即便它再入門也好。

2017年,AMG全球銷量已超過13萬輛,這證明AMG已從1967年那個誕生於阿爾法巴赫的不知名小作坊,成長為全球化高性能運動大品牌,而43系列的出現,正是要讓更多喜愛AMG的人擁有它,符合品牌發展理念。

所以說,有興趣入手AMG C 43的消費者,從C300升級上來的用戶一定佔少數,而多數是覺得C63遙不可及,退而求其次的用戶。於我個人,C43則要買四門為好,畢竟車輛性格的兩面性讓它還是具備了不錯的實用功能,所以平日里通勤代步接小孩不成問題,心血來潮飆一下同樣能讓你心滿意足,這就是C43的魅力。

最不感冒的AMG之:A45

再來說說兩款我不太感冒的AMG,首先是45系列,CLA 45還好,畢竟有轎跑造型和無框車門,再配上AMG套件和炸天的排氣聲,觀感聽覺上還是物有所值。

但來到A45就不是這麼回事兒了。小兩廂的設計註定只能被那些鋼炮粉喜愛,在失去了視覺上的裝逼能力后,A45能吸引消費者的大概只有那被極致壓榨的性能。

而恰恰是因為在一具2.0T四缸機器里壓榨出了恐怖的381ps馬力,參數很棒但體驗不佳,行駛中車內隨時伴着發動機引起的共振,同時發動機低扭也不那麼理想。

在這樣的體驗和逼格基礎上,A45的售價其實並不低,指導價在55萬左右。所以AMG應該是有所覺悟,早前已公布消息將推出更入門的A35,300ps左右的馬力會相對更合適,同時售價也會更親民,如果最終能做到福克斯ST一般有趣又接地氣,那就算是成功了。

最不感冒的AMG之:E63 S

AMG E級車型目前並不豐富,一款43系另一款則是E63 S 4MATIS+,算上未來要推出的53系列,它也還是史上最強E級。集新一代E級華麗內飾、612ps/850N·m的接近AMG家族最強動力(第一為S65 L的6.0T)、AMG家族最先進四驅(4MATIC+)於一身,看上去無懈可擊。

就是這樣一款硬件素質爆表的E級,卻未能喚醒我內心的共鳴,或者應該說它用力過猛了。中大型車的車身、軸距限制了它的動態表現,駛過同樣的彎道,E63 S不能像GT R或C63一般敏捷,在組合彎中,懸架壓縮情況也會更明顯。

在駕駛過很多高性能車后,總覺得沒有個五六百匹就很難再取悅自己,但E63 S還是沒有把握好度,生性躁動的車尾,需要駕駛者有豐富的經驗同時足夠細心對待油門。

而偏疲軟的制動和不太好修正的車身姿態,讓這輛E63 S僅僅是聽起來嚇人但開起來並沒有讓我感到得心應手。

寫在最後

也就是在試駕會結束的當晚,梅賽德斯又把眾人的聚焦點,從剛剛舉辦過AMG GT C上市會的紹興,帶到了幾百公裡外的外灘,當晚,十里洋場也終於有了潮流新地標——Mercedes me外灘體驗店。

這是中國大陸第二家、全球第七家Mercedes me體驗店。全球七家,中國大陸獨佔兩席,可見中國市場對梅賽德斯的重要性,這一如為中國提供AMG GT C特別版以及引入AMG 43系列。對消費者而言是值得欣喜的,更多元化的奔馳、AMG正等待我們去迎接。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

爛路山路都能跑,家用也有面子,這款合資SUV還不到17萬?

不存在的,根本不用鎖止后差速鎖,即便是很陡的坡,2。5L發動機足以應付,有些坡度真的非常陡,特別是越到山頂越陡,從拍攝圖中就可以看出來,頭已經昂起來了,還能看到底盤離地面還是比較高的,離地間隙確實很強,總的來說就是爬了一個很陡,很多彎,很泥濘的山,一般的城市SUV不能像途達那樣平穩通過,難度算是中等吧,也能夠體現其的越野性能的了,遺憾的是由於時間和天氣關係,後面有岩石以及坡度高達40°左右的路段就沒能體驗了,“可以說是相當危險”這是教練的原話,只能以後找機會嘗試一下了。

說起硬派越野車,大家首先想到的應該是Jeep牧馬人 或者是豐田普拉多,而如果是真正玩越野的車友,一定知道日產在硬派越野領域也有着豐厚的經驗,從途樂開始,日產便一直深耕專業越野SUV領域,而就在前两天,另一款全新硬派SUV——途達正式上市,上市的價格就非常具有吸引力,17萬不到的起步,對很多同級別的自主車型有不小的威脅。

途達可以看作是小號的途樂,價格非常漂亮,那麼實力怎麼樣?作為硬派越野SUV,四驅性能夠不夠強悍?把它開到終南山體驗一下越野道路為你揭曉。

途達是硬派越野SUV,所以把最重要的駕駛以及越野體驗部分放到最前面。

駕駛&越野

搭載一款代號為QR25的2.5L 自然吸氣發動機,最大馬力184匹,峰值扭矩可達251N·m,匹配6擋手動或者7擋手自一體變速箱。

大,真的很大,這是開這款車第一感覺,寬度1850mm,老實說即使是老司機一開始也有點難適應,很難把車身穩住在車道正中間,潛意識的就會偏離路邊壓着左側路線走,同行前後車的朋友都有這樣的情況;車身高度1835mm,坐上去讓身高1.7米的也能體驗一把俯視眾車的感覺,在收費站也能與收銀員微笑平視。

僅僅是夠用,是覺得這是對這款車動力比較中肯的評價,試駕車為頂配車型,官方車身重量數據就已經達到1926KG,在試駕的過程中,全車四個成年人,再加幾個背包,二噸多的整備重量,整個動力輸出比較平淡。

即便是比較平淡,但加速還是比較線性的,在渦輪增壓浪潮開着這麼大的自吸車型也是種奇特的體驗,有朋友可能會覺得這股動力日常開肯定是很肉的,2000,甚至到3500轉左右都是比較平淡的輸出,峰值扭矩轉速在4000后爆發,事實這個轉速以後給你的推背感並不是很強。

值得肯定的是4000轉以下的隔音是比較好的,怠速時可以說聽不到發動機的聲音,到了峰值扭矩轉速后發動機聲音就來了,動靜較大,但不難聽。

懸挂偏硬,支撐性不錯,但是由於坐墊柔軟度很好,所以即使是中小顛簸有着不錯的舒適性。

然而其實對於硬派越野來說,最重要的是並非動力性能,而是功能性,扭矩夠大就行,鎖止后差速鎖可以把扭矩放大2.7倍,爬坡、走泥路最合適不過了;在低速行駛時,如果是渦輪增壓發動機,動力輸出控制不平順,渦輪介入那一下子或許會措手不及,平時在城市鋪裝路面滿足通勤需求,在野外也能有好的脫困能力,這麼看2.5的自吸其實是更合適的。

油門和剎車前段都很輕,前40%的行程差不多是輸出20%的力度,開起來很佛系;而由於方向盤用的是油壓助力,感覺是略重的,而且轉向不算精確,同車的女生就覺得很好開很順手,在越野的時候其實是不用太精確的轉向,這同樣是出於側重於功能性的,又輕又假的电子轉向在越野過程當中反而會給不了駕駛員紮實的感覺。

以上是基本的駕駛感受,接下來是重頭戲部分,越野性能如何?駕駛路段時秦嶺七十二峪,通過的是其中前小部分以及牛脊樑森林公園再去挑戰一個當地推薦的越野聖地。

進入牛脊樑國家森林公園,整一段十幾公里都是上山連續爬坡路段,連綿多彎,十來二十米就是一個彎道,並且經常有落石,路況有點複雜險峻,而在這時候225mm離地間隙的優勢就有用武之地了,一路開過來,小石頭可以無視,大石頭稍微躲一下就沒事了,如果是開一輛轎車,石子彈到底盤上都會有點小怕。

連綿的爬坡路段其實並沒有感到動力不足,線性的動力輸出,配合沉穩的方向盤,反而能給足夠的信心,有點要注意的是方向盤在轉到後段時,需要轉動更大的角度才能保證不會轉向不足。

來到越野路段,坡度比牛脊樑景區更加大,比較小的坡度都有20°左右,較大難度的30度、40°都有,路面更窄,剛好適合一輛車通過,而且剛下過雨,路面濕滑泥濘。

一上去就是非常陡的坡,然後就是U型彎,這個時候掛空擋,切到低速四驅,可以實現扭矩放大,轉速控制在一千轉出頭,路面有點難度,然而在強大的越野性能下,輕點油門就能緩慢通過。

上了坡就是急轉彎,好在彎還是比較寬的,一把方向就能安全通過,再次感受到液壓方向盤給人足夠的信心,有點難度的是需要判斷兩側的距離,再次強調這車真的大,兩邊的樹枝不斷拍打車身,不過只要跟着車撤走就沒問題。

即便是坡度很大,路面也很泥濘,得意於良好的輪胎性能,打滑?不存在的,根本不用鎖止后差速鎖,即便是很陡的坡,2.5L發動機足以應付,有些坡度真的非常陡,特別是越到山頂越陡,從拍攝圖中就可以看出來,頭已經昂起來了,還能看到底盤離地面還是比較高的,離地間隙確實很強,總的來說就是爬了一個很陡,很多彎,很泥濘的山,一般的城市SUV不能像途達那樣平穩通過,難度算是中等吧,也能夠體現其的越野性能的了,遺憾的是由於時間和天氣關係,後面有岩石以及坡度高達40°左右的路段就沒能體驗了,“可以說是相當危險”這是教練的原話,只能以後找機會嘗試一下了。

很帥氣的硬漢

再看一下的基本情況,雖然途達是定位為中型SUV,但是它的車身尺寸:4882*1850*1835mm,軸距為2850mm,車身長度和軸距都比中大型的普拉多4840和2790還要長,尺寸相當大。

空載情況下,接近角為32°,離去角為27°,最小離地間隙高達22.5厘米,此等通過性,與同為非承載式車身硬派SUV相比,它的數據甚至比普拉多還要長,對比自主車型更是不在話下,途達硬派越野的基本要素毋庸置疑,當然肯定就比不上牧馬人了,牧馬人本身就是專業級的,新款車型更加強悍。

側面非常好看,車屁股很大,也比較方正,再加上很大的一塊擾流板提供了不錯的視覺效果,整一個車身側面也是威風凜凜。

車身很高,整個前臉的造型設計很威武,V-Motion設計前臉設計很年輕,舒展上揚的LED日行燈的形狀很醒目,中間鍍鉻飾條很粗壯,但是用在這個車上則氣勢十足,這張臉可以說是非常帥氣了,相信很多人都會喜歡。

發動機蓋上面的線條很飽滿,滿滿的肌肉感,坐在前排會看到機蓋兩側有兩個比較明顯的凸起。

還有不少亮點,最大的亮點應該是前杠的兩個獠牙了,視覺上極具攻擊力,下方是黑色塑料護板,蹭着不心疼。

戰鬥過後的划痕

車尾也非常很好看,尾部LED視寬燈和前LED日行燈一致,看起來很順眼,在看來,前後左右哪個角度的視覺效果都很棒,果然大的就是耐看。

18寸輪轂,後輪為鼓剎,採訪日本的技術人員表示,廠商認為鼓剎的性能是最適合這款車的設定,當然後期會根據消費者的需求考慮更換成碟剎,在試駕過程中其實並沒有什麼感覺這個剎車有什麼毛病,也沒感覺到有什麼影響,後期使用性能如何有待以後市場反饋。

空間

真皮座椅很鬆軟,日產沙發廠的名號不是蓋的,坐上去很舒服,給人一種很居家的感覺,日常通勤也可以很輕鬆。身高1.7米,調整到合適的駕駛坐姿后(偏高的坐姿),頭部空間很充裕,有一拳。

而到了後排,保持前排座椅不變的情況下,頭部空間就超過兩拳,腿部空間不用比劃了,一目瞭然。

當然1.7米身高參考性有限,所以找來身高1.82米的體驗者,調整到合適的駕駛坐姿后,在前排仍有一拳頭部空間。

而到了後排,頭部空間和腿部空間都是差不多兩拳,空間足夠大的,而且坐墊柔軟度很好,買了這車回去,家裡可以少買一個沙發,而且後排座椅靠背角度比較大,北京癱也沒問題。

後備廂很平整,而且很大,拉貨拉東西什麼的完全沒問題,第二排座椅可以放倒,無法形成一個平面,算是個可以無視的不足吧,這後備廂空間裝什麼都沒問題了。

居家內飾

進入車內,其實跟外形是有點反差的,和硬朗帥氣的外觀想比,內飾的風格是日產以往居家實用走向,內飾基本都是黑的,也可以看到“V”型的布局,副駕側的中控台只有一條曲線,所以設計一點都不花哨,甚至是平淡的,就是一輛普普通通的家用SUV。

方向盤是日產舊款的款式,如果換上新奇駿哪款應該會讓車內看起來年輕很多,方向盤的尺寸和手感都比較平淡,找不到什麼亮點。

7英寸中控屏是傳統的嵌入式,兩側是銀色裝飾,面板有木紋,使得不那麼沉悶,下方是空調控制按鍵,是非常容易上手的實體按鍵,這非常符合越野、實用性定位,有百度CarLife功能。

行車電腦可以显示多種信息

比較奇特的是倒車影像或者全景攝像的显示是位於內后視鏡左側,這是比較少見的,雖然尺寸小,但是不影響觀察判斷,依然很好用。

下面的這個分時四驅操作區就是把它和普通家用SUV區分開來的地方,分時四驅頂配和次頂配配備,並且配備机械牙嵌式后差速鎖,分時四驅可以實現兩輪驅動、四輪高速、以及四輪低速,四輪高/低速均可以實現前後50:50扭矩分配。

重頭戲是這個后差速鎖,鎖止后差速鎖可以讓左右輪作為一個整體旋轉,然後把動力扭矩傳遞到有抓地力的車輪,以實現脫困;好消息是,30萬以內帶机械式後橋差速鎖的硬派越野車,僅此一款,22.58萬帶回家。

總的來說,途達是一款非常具有吸引力的車型,功能性非常強,長得又帥氣,車身又大,二十萬出頭的價格讓很多人都能實現越野夢,是不折不扣的硬派越野車,除了內飾不太新穎以外,並沒有什麼太大缺點了,另外,那鬆軟舒適的座椅,作為日常開也有不錯的舒適性。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

7秒破百的霸氣大7座SUV,賣多少萬能讓你忘了漢蘭達?

0T發動機是同一副,採用時下流行的缸內直噴、雙渦管單渦輪增壓、水中冷、缸蓋集成排氣歧管等方式來提升發動機響應和燃油經濟性。而與之配搭的是大家都很熟悉的ZF 9AT變速箱,帶有4個超比擋以降低巡航轉速提升燃油經濟性。

說到國人對SUV或者越野車最早的記憶,除了以前的BJ212以外,就是當時跑遍中國大江南北的BJ213,也就是第二代切諾基。那可以說是所有越野愛好者的美好回憶,也一定程度上塑造了國人對於SUV這種“全能”的基本印象。甚至很多人說SUV還是會用“吉普車”的話術,說明JEEp品牌一直都在國內深入民心。不過現在國內對於SUV的市場需求日益增大,特別是7座SUV。不過一直以來,JEEp都缺少了一個在中大型7座SUV市場的產品。今天,我們來到了寧波,去JEEp專為中國市場研發的第一台7座中大型SUV,新一代大指揮官。

新一代大指揮官是現在JEEp城市SUV裏面的旗艦車型,也是專為中國市場所打造的一款全新的7座SUV,按照官方的話術叫”專業級全場合高端SUV”,設計定位兼顧商務和家用。和大部分7座SUV都以5座車型為基礎的不一樣,大指揮官在設計之初就定位為“真”7座SUV,這從其宣傳“7人VIp商務艙”就可見。按照其定位及價格區間,競爭對手就鎖定為漢蘭達、銳界等不多的幾款車型上。

很“JEEp”的外觀:

從設計上說,大指揮官沿用了雲圖概念車上的一些設計元素。不過從整體的外觀設計來說,相比於指南者的活潑和自由光的時尚,大指揮官更強調沉穩的外觀設計風格,整體的外觀氣氛也偏向商務。雖然說整車造型基本使用JEEp家族的直線條,也保留了7孔前進氣格柵的的家族元素,不過整車看起來在硬派的整體感覺上加入了一些柔性的線條。

加上前格柵、車燈和轉向燈等部分都採用了扁平的造型,讓整個前臉看起來變得更大和更精緻,看起來並沒有美系的粗枝大恭弘=叶 恭弘。

大指揮官的車身尺寸為4873*1892*1738mm,三圍尺寸相比漢蘭達和銳界兩個競爭對手來說並不算特別大,2800mm的軸距也僅僅處於兩者中等的位置。不過由於線條設計的原因,顯得大指揮官較長也較幹練,並不像銳界這種典型的美國味。很多凸顯肌肉感和力量感的稜線和外拋的恭弘=叶 恭弘子板設計也是點到即止,整體風格很沉穩,很符合大部分人對於商務SUV的印象。

照顧周到的乘坐空間

既然能叫做“7人VIp商務艙”,內飾自然不能馬虎。大指揮官的內飾設計雖然並不能說很“精緻”,但很多設計也很考究,整體感覺更像一台歐洲車,而不像粗枝大恭弘=叶 恭弘的美國車。採用淺色和深色的Two Tone配色,加上一些啞光鍍鉻的邊框來提升細節感,透露出一些豪華的屬性。

特別是材質方面大指揮官並不吝嗇。除了大量使用軟性材質作為中控台和門板的包裹材質以外,也大量使用了皮革以提升檔次感。頂配的座椅甚至有麂皮和Nappa皮,這在這個級別的SUV產品中算是非常越級的表現。

除了設計和用料以外,乘坐舒適性也是“7人VIp商務艙”所注重的部分。不過由於其實際車身尺寸在同級並不算很大,因此它的乘坐空間並不算非常寬闊,甚至比漢蘭達等級別標杆會稍窄小一些。不過大指揮官用了其他方法來提升乘坐舒適性。首先座椅的坐墊和靠背都較厚而且較軟。另外全系標配三區自動空調,各種USB接口、230V電源、12V電源、座椅加熱等配置都比較齊全。

第三排的座椅坐墊厚度和軟硬度適中,而且椅背可以小角度微調,也有獨立出風口和獨立的閱讀燈,基本能照顧到第三排乘客的中短途乘坐舒適性要求。

全景天窗的面積較大,整個車內空間的開陽感非常好。副駕駛的靠背邊上更設計了SUV少見的老闆鍵,讓第二排的乘客能夠擁有更好的乘坐空間,加上有隱私玻璃和手動遮陽簾,滿足商務要求。唯一的缺點就是頭枕較硬,這也是不少車型上的通病了。

同級領先的動力性能

動力方面,這次試駕的大指揮官搭載一台2.0T GME T4發動機,最大馬力265匹,最大扭矩400牛米。實際上這是和Giulia上的2.0T發動機是同一副,採用時下流行的缸內直噴、雙渦管單渦輪增壓、水中冷、缸蓋集成排氣歧管等方式來提升發動機響應和燃油經濟性。而與之配搭的是大家都很熟悉的ZF 9AT變速箱,帶有4個超比擋以降低巡航轉速提升燃油經濟性。再加上適時四驅的幫助下,讓這台7座中型SUV獲得低於8秒的百公里加速時間。相比銳界和漢蘭達,百公里加速時間幾乎短了一秒鐘。可以說,動力性能在同級處於領先水平。

實際駕駛時,動力表現還算比較滿意。即使使用很淺的油門深度,引擎的動力反應也比較迅速。而全油門時也有不錯的加速力,以一台這樣的中大型SUV來說,動力表現已經很好,當然不能和那些動輒三四百匹的高性能SUV作比較,畢竟這還是結合家用和商務需求而設計的。而需要注意的是油門和剎車腳感較重行程也較大,新手來說用力過猛或用力過小都會造成頓挫,需要一些習慣的時間。

另外,大指揮官採用了ZF提供的9AT變速箱。據說這副變速箱的TCU標定按照中國的消費者需求所調校,因此整體表現就四個字“超級平順”。任何換擋基本上感受不到頓挫,但隨之而來的代價就是換擋速度較慢。

另外由於為了降低油耗,變速箱非常积極往超比擋上換。雖然巡航轉速較低燃油經濟性較好,但是遇到需要加速的場合,油門一下去變速箱還要思考一下再退擋,動力的反應變得稍弱。還有一個細節,為了能夠在極低速更有效的推動較大的車身重量,因此1擋的齒比設定較大,導致初段加速較“沖”,但換擋時機較晚(約3000rpm),會造成一些低速的頓挫。當然,這副變速箱以舒適性和行駛質感來說還是不錯的。

並不硬派的駕駛感覺

懸挂方面,大指揮官採用了這個級別較常見的前麥弗遜后多連桿設計,調校也是傾向舒適性的設計。由於要照顧一定的非鋪裝路面需求,因此懸挂行程較長。這次我們試駕的均是頂配車型,都配有自適應懸挂,能根據行駛的需求調整避震的阻尼。在行駛過程中會感到舒適性很好,對於顛簸路面的濾震也不錯。整個底盤給人的感覺過濾顛簸很乾脆,較厚實。不過估計照顧到舒適性,因此彈簧腳軟,在較大動力介入的時候,車頭抬起的現象會比較明顯,剎車的時候也會有些點頭。

而操控性方面,大指揮官也採用了可變助力的設計。低速時整體方向手感傾向輕盈,而高速的時候會加重得比較明顯,不過整個變化還算線性不會有很突兀的感覺,方向指向性也都算靈敏了。雖然說懸挂整體偏軟,不過過彎時傾側抑制卻出乎意料並不會很嚴重,整體駕駛還是頗像轎車的。不過由於體重和身高始終在哪裡,因此即使動力表現較好,大指揮官還是不適合去做過分的激烈駕駛。

而隔音方面,大指揮官的表現還是頗不錯的。據悉,為了提升NVH表現,大指揮官採用了同級別車型較主流的“空腔注泡”的工藝,對車身空腔灌注環保發泡材質來降低噪音,整體隔音得水平在同級表現還是不錯的。。只是四氣缸的發動機始終排氣脈衝不夠綿密,因此傳入駕駛室里的引擎聲較單薄,所幸排氣的聲浪還算厚實,彌補了一些質感上的缺失(如果有六缸就好了)。

值得一提的是,大指揮官有一套智能切換的適時四驅系統,我們進行了輕度的非鋪裝路面體驗。在一些較泥濘的道路上四驅能夠讓行駛軌跡更穩定,同時車身剛性很高,在很顛簸的路面行駛也沒有發生各種扭曲和異響,和競品相比有較大的優勢。

總結

總體來說,大指揮官是一台並不很“JEEp”和很“美式”的SUV,這也和它說的“專為中國市場打造”不謀而合。整體而言,較強的動力是大指揮官的優勢,而舒適性也很不錯,整體的駕駛感受符合國人對歐洲車的總體印象。雖然說乘坐空間和外觀尺寸等並不佔優勢,不過整體外觀和內飾設計沉穩大氣,風格兼顧商務和家用,而且國人對JEEp品牌有一個固有的良好印象,在該級別能夠做到差異化競爭,市場潛力還是很不錯的。

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

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

網頁元素居中的n種方法

導語:元素居中對齊在很多場景看上去很和諧很漂亮。除此之外,對於前端開發面試者的基礎也是很好的一個考察點。下面跟着作者的思路,一起來看下吧。

場景分析

  • 一個元素,它有可能有背景,那我要它的背景居中對齊
  • 一個元素,它還有可能有個父級元素,那我要它居中於其父級元素
  • 一個元素,它也有可能還帶有一些子內容,我要讓它的子內容居中

場景建模

根據場景分析提出的一些假設,我們試着去建立對應的模型,下面是分別根據上面的三個場景設計的相關模型。

  • 搞父子元素居中對齊
  • 搞元素背景居中對齊
  • 搞元素內容居中對齊

場景實現

相關說明

為了統一,這裏我們定義一個400*400px的帶着黑色邊框粉紅色身體的類名為.box的父容器,它有可能會有一個200*200px的帶着原諒色身體的類名為.box-son的子容器。這裏為了效果能夠直觀且明顯,筆者故意把背景圖片的原始大小處理成小於宿主像素的大小。好吧,我們開始吧!

背景居中

我們做這樣一件事,在一個div容器中,我們通過background-image屬性引入一張背景,之後我們期望這張引入的背景呢,它能夠水平垂直居中於宿主元素。

這裏介紹兩個屬性background-repeat和background-position,如果你初中英語好的話,我想你也應該知道了,這裏字面意思就是這個屬性的意思。一個是設置背景圖片怎麼鋪宿主元素(默認時鋪滿的)更美麗的,另一個是設置背景圖片相對於宿主元素的的位置,你可以傳像素、百分比、相關方向單詞(top、bottom、left、right)給它。當其為百分比的時候,它的計算公式如下:

(container width - image width) * (position x%) = (x offset value)
(container height - image height) * (position y%) = (y offset value)

簡言之,就是宿主元素的寬高減去圖片寬高乘以相關百分比就是相對於宿主元素左上角那個原點的位置。

在背景圖片不重複的情況下,你想讓一張圖片居中於宿主元素的方法,可以有background-postion: center center、background-postion: 50%, 50%,也可以簡寫成background-postion: center或者background-postion: 50%

所以,在樓上這些前提下,我們大致能夠歸出一個類,形如:

/** 這裏以複雜寫法的百分比為例, 分別代表距離宿主元素左上角的x和y軸的距離**/
.box-son {
	background-repeat: no-repeat;
	background-position: 50%, 50%;
}

文字內容居中

如果宿主元素的內容是文字之類的,我們期望它能夠居中於宿主元素,這裏用到兩個屬性,一個是text-align,一個是line-height。text-algin:center可以使內容水平居中於宿主元素,將line-height設置成宿主元素相同的高度,便可讓宿主元素垂直居中。

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example11

子元素居中於父元素

相關說明

這裏解釋下,父相子絕,這個是我閹割了“父級元素相對定位,子級元素絕對定位”這句話濃縮后的叫法。後面出現這個概念我就不過多再進行重複介紹了。

父相子絕 + margin: auto

父元素相對定位子元素絕對定位后,設置其top、right、bottom、left都為0,之後我們將其的margin設置為auto。這樣子的話,父級元素與子級元素他們之間空出來的部分都會被這個margin均勻撐開。

.box-position {
    position: relative;
}

.box-example1 {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    margin: auto;
}

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example1

父相子絕 + 負值margin

父元素相對定位子元素絕對定位后,子元素設置top: 50%; left:50%;,這裏的百分比參考值是相對於父元素的寬高,參考的點是父元素的左上角和子元素的左上角,所以我們需要矯正一下,減去子元素寬高的一半。這件事可以讓子元素的margin代勞。

.box-position {
    position: relative;
}

.box-example2 {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-left: -100px;
    margin-top: -100px;
}

相關例子鏈接: https://ataola.github.io/show/zj/center-middle.html#example2

父相子絕 + 平移(translate)

在樓上那個例子的基礎上,為了矯正子元素的偏移,我們其實還可以用css的平移屬性。這個平移的百分比是相對於其本身的寬高的,所以是向反方向50%。

.box-position {
    position: relative;
}

.box-example3 {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example3

父子double相(不推薦,做着玩玩的)

一個不成熟的做法哈,父子都是相對定位也還是可以勉強居中的,硬算嘛,這裏沒有太大價值就不展開了。

.box-position {
    position: relative;
}

.box-example4 {
    position: relative;
    top: 90px;
    left: 90px;
}

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example4

父子double相 + rem(不推薦,同樓上)

沒有太大價值,略過。

相關例子鏈接: https://ataola.github.io/show/zj/center-middle.html#example5

父相子絕 + calc

calc這個css屬性可以允許在聲明css屬性值時執行一些計算,回到我們之前的那個矯正偏移量的模型上,那麼這裏很容易想到子元素top、left屬性設置成50%減去子元素一半的這樣一個模型。

.box-position {
	position: relative;
}
.box-example6 {
    position: absolute;
    top: calc(50% - 100px);
    left: calc(50% - 100px);
}

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example6

新舊flex

flex布局,但凡一個正經點的初面都會遇到的,因為它好用也很常用,這裏介紹兩種,一種是新版的flex布局的寫法,一種是舊版的flex布局的寫法

flex布局你就把它看成是一條軸線,一條長得還挺夯實的軸線,在這條軸線上,我們想要放一個盒子,有很多种放法,具體的可以搜下阮一峰老師的教程這裏不再贅述。一個化繁為簡的想法哈,這個是跟琦瑞哥學到的,就是我們很多時候也不一定能記得住那麼多屬性,我們期望做這樣一件事,就是把它化抽象為形象。我們可以用具體的方位去表達我們的想法,簡言之就是封裝成一個類庫,然後用一些接地氣的類名去控制flex布局。

有興趣的童鞋可以看下我實現的一個低配版的css樣式庫:https://ataola.github.io/show/box/assets/taolaui/flex.css

新版flex的寫法

在不改變軸方向的情況下,其父元素設置align-items: center;表示垂直居中,justify-content: center;表示水平居中。

父元素設置:

.flex {
    display: flex;
}

.flex-middle {
    align-items: center;
}

.flex-center {
    justify-content: center;
}

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example7

舊版flex的寫法

這裏就是提及一下有這麼種存在,讀者用新版的寫法就好。

.box-old {
    display: -webkit-box;
    -webkit-box-pack: center;
    -webkit-box-align: center;
}

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example8

table布局

父元素設置display: table,子元素設置display:table-cell,在只有一個子元素的情況下它會盡可能撐滿父元素,多個子元素的情況下水平均分。設置vertical-align: middle可以使得其內容垂直居中。

.box-table {
	display: table;
}

.box-son-table {
    display: table-cell;
    vertical-align: middle;
}

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example9

grid布局

前面我們提到的flex布局時軸布局是一維的,這裏的grid網格布局時二維的是平面的。將其父元素設置成display:grid,然後子元素設置align-self: center;表示垂直居中,justify-self: center;表示水平居中。

.box-grid {
	display: grid;
}

.box-son-grid {
    align-self: center;
    justify-self: center;
}

相關例子鏈接:https://ataola.github.io/show/zj/center-middle.html#example10

最後

相關實現地址已開源:https://ataola.github.io/show/zj/center-middle.html,若有不足之處,供批評指正!

其他網頁設計基礎總結:https://ataola.github.io/show/

參考文獻

https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-position

https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-repeat

https://developer.mozilla.org/zh-CN/docs/Web/CSS/calc

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

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

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

C# 9.0 新特性之模式匹配簡化

閱讀本文大概需要 2 分鐘。

記得在 MS Build 2020 大會上,C# 語言開發項目經理 Mads Torgersen 宣稱 C# 9.0 將會隨着 .NET 5 在今年 11 月份正式發布。目前 .NET 5 已經到了 Preview 5 階段了,C# 9.0 也已經初具規模。忍不住激動的心情,暫停更新《C#.NET 拾遺補漏》系列幾天,先要和大家分享一下我了解到的 C# 9.0 的新特性。由於新特性比較多,所以會分成幾篇來講。這是第一篇,專講模式匹配這個特性的簡化。

模式匹配(Pattern Matching)是在 C# 7.0 引入的,是對 switch 語句的增強,可以支持實現複雜的條件匹配。下面我先用一個示例來展示一下模式匹配的一般的用法。

假如現在我們要計算各種車輛在某高速的通行費,比如有下面四種車輛,分別定義為以下四個類,各個類中定義了和通行費計算相關的屬性:

public class Car
{
    public int Passengers { get; set; }
}

public class DeliveryTruck
{
    public int GrossWeightClass { get; set; }
}

public class Taxi
{
    public int Fares { get; set; }
}

public class Bus
{
    public int Capacity { get; set; }
    public int Riders { get; set; }
}

下面用用模式匹配的方式來實現一個計算通行費的方法:

public decimal CalculateToll(object vehicle) =>
    vehicle switch
{
    Car { Passengers: 0}        => 2.00m + 0.50m,
    Car { Passengers: 1}        => 2.0m,
    Car { Passengers: 2}        => 2.0m - 0.50m,
    Car c                       => 2.00m - 1.0m,

    Taxi t => t.Fares switch
    {
        0 => 3.50m + 1.00m,
        1 => 3.50m,
        2 => 3.50m - 0.50m,
        _ => 3.50m - 1.00m
    },

    Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m,
    Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m,
    Bus b => 5.00m,

    DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m,
    DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m,
    DeliveryTruck _ => 10.00m,

    { } => throw new ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)),
    null => throw new ArgumentNullException(nameof(vehicle))
};

代碼來源於文末參考鏈接

如果上面代碼閱讀起來感覺吃力,你可以先閱讀文末參考鏈接中的第一個鏈接,關於模式匹配的詳細介紹。

實現這個業務邏輯,若在 C# 7.0 之前,需要用一堆的 if/else 來實現。有了模式匹配后,變得方便了很多,而且使用上很靈活,代碼結構也更優美。

對我來說,模式匹配是個極好的特性!但這還不夠,C# 9.0 對模式匹配的寫法做了進一步的簡化!

以上面代碼為例,模式匹配可以分為三種:簡單模式、關係模式和邏輯模式。下面分別說說 C# 9.0 對三種模式的簡化。

簡單模式

以上面 CalculateToll 方法示例代碼為例,簡單模式是這種:

vehicle switch
{
    ...
    Car c => 2.00m - 1.0m
}

我們其實可以發現,上面的變量 c 聲明了卻沒用被使用,現在 C# 9.0 中可以把它省略了:

vehicle switch
{
    ...
    Car => 2.00m - 1.0m
}

關係模式

以上面 CalculateToll 方法示例代碼為例,關係模式是通過比較(大小)關係來匹配的,對應的代碼片段如下:

DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m,
DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m,
DeliveryTruck _ => 10.00m,

現在 C# 9.0 可以簡寫成:

DeliveryTruck t when t.GrossWeightClass switch
{
    > 5000 => 10.00m + 5.00m,
    < 3000 => 10.00m - 2.00m,
    _ => 10.00m,
}

邏輯模式

在 C# 9.0 中,你可以通過邏輯操作符 and、or 和 not 對模式進行組合,下面是一些示例:

DeliveryTruck t when t.GrossWeightClass switch
{
    < 3000 => 10.00m - 2.00m,
    >= 3000 and <= 5000 => 10.00m,
    > 5000 => 10.00m + 5.00m,
}

not null => throw new ArgumentException($"Not a known vehicle type: {vehicle}", nameof(vehicle)),
null => throw new ArgumentNullException(nameof(vehicle))

另外,not 關鍵字還可以用來替代 if 條件判斷中的邏輯非(!),比如:

// 原來的寫法
if (!(e is Customer)) { ... }

// 新的寫法(易讀性更好)
if (e is not Customer) { ... }

C# 9.0 還有很多其它好用的新特性,下一篇文章繼續與你分享。文章寫短一點不是因為我偷懶哈,而是為了促使大家一次性看完,方便大家在零碎時間閱讀,避免因文章太長而成為“收藏不看”系列。

敬請關注我明天下一篇關於 C# 9.0 新特性的介紹,明天不見不散。

參考:

  1. https://bit.ly/2MNc0DJ
  2. https://bit.ly/2UzEIwu

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

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案

全網最完整的Redis入門指導

前言

本文提供全網最完整的Redis入門指導教程,下面我們從下載Redis安裝包開始,一步一步的學習使用。

下載Redis

官網提供的Redis安裝包是服務於Linux的,而我們需要在Window下使用Redis,所以,我們去下面這個網址中下載。

Redis的下載地址:https://github.com/microsoftarchive/redis/releases。

如下圖所示,Redis的windows版是由microsoftarchive提供,是微軟的一個工作小組,所以我們可以選擇完全信任,下面我們選擇最新版的Redis版本下載(可以看到,儘管是最新版本,但最後一次提交已經是2016年了)

下載完成后解壓到文件夾,得到文件如下:

重要文件講解:

redis-server.exe:Redis服務端宿主程序,運行後會啟動一個控制台窗體,該窗體是宿主程序,如關閉窗體,則Redis服務關閉。

redis-check-dump.exe:本地數據庫檢查程序。

redis-check-aof.exe:更新日誌檢查程序。

redis-benchmark.exe:性能測試,用以模擬同時由N個客戶端發送M個 SETs/GETs 查詢。

redis-cli.exe: Redis客戶端程序,服務端開啟后,可以通過該客戶端進行命令測試。(運行后,會啟動一個控制台窗體,可在控制台內輸入命令)

Windows Service Documentation.docx:Redis服務端使用文檔。

redis.windows-service.conf:Redis啟動服務默認加載的配置文件(下文會介紹如何將Redis服務已Windows服務模式啟動),雙擊redis-server.exe啟動時並不加載該文件,雙擊exe啟動時會提示未指定配置文件,使用默認配置,這個默認配置應該是exe內部編寫的。

redis.windows.conf :Redis配置文件,其內容和redis.windows-service.conf是一模一樣的,相當於一個備份,如果希望Redis讀取的配置文件是redis.windows.conf ,則需要對Redis進行命令操作,重新設置配置文件。

了解Redis文件信息后,我們運行redis-server.exe,然後我們編寫一個C#的控制台項目訪問Redis。

Redis訪問

C#想訪問Redis需要使用開源類庫,那麼應該使用哪個類庫呢?

打開Redis的中文官網http://www.redis.cn/,在客戶端菜單下可以發現C#可用的Redis客戶端很多,如下圖:

這裏我們使用ServiceStack.Redis來訪問Redis。

創建項目

首先我們創建一個項目RedisConsole,然後在Nuget下搜索ServiceStack.Redis,如下圖:

然後創建一個RedisManager類來管理Redis,代碼如下:

using ServiceStack.Redis;
using ServiceStack.Text;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
​
namespace RedisConsole
{
    /// <summary>
    /// RedisManager類主要是創建鏈接池管理對象的
    /// </summary>
    public class RedisManager
    {
        /// <summary>
        /// 綁定本機Redis
        /// </summary>
        private static string ConnStr = "localhost:6379";//password@ip:port  123@localhost:6379
        private static PooledRedisClientManager _prcm;
​
        
        /// <summary>
        /// 靜態構造方法,初始化鏈接池管理對象
        /// </summary>
        static RedisManager()
        {
            _prcm = CreateManager(new string[] { ConnStr }, new string[] { ConnStr });
        }
        /// <summary>
        /// 創建鏈接池管理對象
        /// </summary> 
        private static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
        {
            //WriteServerList:可寫的Redis鏈接地址。
            //ReadServerList:可讀的Redis鏈接地址。
            //MaxWritePoolSize:最大寫鏈接數。
            //MaxReadPoolSize:最大讀鏈接數。
            //AutoStart:自動重啟。
            //LocalCacheTime:本地緩存到期時間,單位:秒。
            //RecordeLog:是否記錄日誌,該設置僅用於排查redis運行時出現的問題,如redis工作正常,請關閉該項。
            //RedisConfigInfo類是記錄redis連接信息,此信息和配置文件中的RedisConfig相呼應
            // 支持讀寫分離,均衡負載 
            return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
            { 
                MaxWritePoolSize = 5, // “寫”鏈接池鏈接數 
                MaxReadPoolSize = 5, // “讀”鏈接池鏈接數 
                AutoStart = true,
            },
            0,//初始化數據庫 默認有16個數據 這裏設置初始化為第0個
            50,//連接池數量
            5//連接池超時秒數
            )
            { 
                ConnectTimeout = 6000,//連接超時時間,毫秒
                SocketSendTimeout = 6000,//數據發送超時時間,毫秒
                SocketReceiveTimeout = 6000,// 數據接收超時時間,毫秒
                IdleTimeOutSecs = 60,//連接最大的空閑時間 默認是240
                PoolTimeout = 6000 //連接池取鏈接的超時時間,毫秒
            };
        }
​
        /// <summary>
        /// 客戶端緩存操作對象
        /// </summary>
        public static IRedisClient GetClient()
        {
            if (_prcm == null)
            {
                _prcm = CreateManager(new string[] { RedisPath }, new string[] { RedisPath });
            }
            return _prcm.GetClient();
        }
    }
 }

然後在Main函數里使用RedisManager來進行寫入和讀取,代碼如下:

static void Main(string[] args)
        { 
            var redisClient = RedisManager.GetClient(); 
            redisClient.Set<string>("Name", "Kiba518");
            redisClient.Set<int>("Age", 10000);  
            Console.WriteLine($"MyName:{redisClient.Get<string>("Name")}====MyAge:{redisClient.Get<int>("Age")}");
            redisClient.Dispose();  //釋放內存
            Console.ReadLine();
        }

運行結果如下圖所示:

可以看到,我們成功的完成了Redis的插入和讀取。

但我們不滿足於此,我們需要一個圖形管理界面更直觀的查看Redis數據庫。

下載RedisStudio。

下載地址:https://github.com/cinience/RedisStudio/releases

運行RedisStudio,連接本地Redis,如下圖:

連接成功后,點擊Data菜單,查看數據。

可以看到,我們添加的數據被寫進了第0個數據庫(Redis默認會創建16個數據庫,數據庫編號以0開頭)。

Redis的Windows服務

使用Cmd的命令窗口作為Redis的宿主進程確實有一些問題,比如關閉了就不能用了,比如不能開機自啟。為了讓Redis服務可以更好的運行,我們需要把Redis的宿主改成Windows是服務。

這件事不需要我們自行開發,redis-server.exe中已經提供了這些功能,它的Main函數會處理一些他接受的參數。

現在我們使用命令行啟動redis-server.exe。

注:使用Redis命令時,需要在先將目錄跳轉到Redis所在文件夾,如【cd/d D:\Redis-x64-3.2.100】

redis-server.exe --service-install redis.windows.conf --loglevel verbose

參數介紹:

service-install:啟動Redis服務安裝,必須是第一個參數。

redis.windows.conf:指定配置文件。

loglevel verbose:日誌級別。

CMD運行結果如下圖所示:

查看服務。

如上圖所示,服務已經成功的安裝到系統中了,右鍵就可以啟動服務了。

當然我們也可以通過命令行啟動和關閉服務,命令如下:

啟動服務命令:redis-server.exe –service-start

關閉服務命令:redis-server.exe –service-stop

CMD運行關閉服務結果如下圖:

配置密碼

我們都知道數據庫是需要密碼的,這樣才能保證安全性,不然任何一個知道你服務器IP的人只要按個端口試一遍就可以連接你的數據庫了。

Redis的數據庫密碼需要在配置文件中設置,默認是沒有密碼的。

因為上文我們配置Windows服務時,指定了redis.windows.conf文件為配置文件,所以我們現在需要在redis.windows.conf文件中配置密碼。

打開redis.windows.conf文件,搜索【# requirepass foobared】定位到配置密碼的行(配置文件中#為註釋符),然後在該行下方輸入requirepass 123456,其中123456就是數據庫的密碼了,如下圖所示:

現在我們測試一下,運行我們剛才的項目,結果如下圖所示:

可以看到,系統提示了驗證錯誤的異常。

這是因為我們上文配置的連接字符串是【localhost:6379】這裏面只有IP和端口,現在因為有了密碼所以這個字符串不在合法了。

現在我們將密碼加入進字符串,修改代碼如下:

private static string ConnStr = "123456@localhost:6379";

項目成功運行,訪問Redis數據庫成功,如下圖:

—————————————————————————————————-

代碼已經傳到Github上了,歡迎大家下載。

Github地址:https://github.com/kiba518/RedisConsole

—————————————————————————————————-

注:此文章為原創,任何形式的轉載都請聯繫作者獲得授權並註明出處!
若您覺得這篇文章還不錯,請點擊下方的【推薦】,非常感謝!

https://www.cnblogs.com/kiba/p/13085327.html

 

 

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

【其他文章推薦】

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

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

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

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

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

基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(六)

系列文章

  1. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用 abp cli 搭建項目
  2. 基於 abp vNext 和 .NET Core 開發博客項目 – 給項目瘦身,讓它跑起來
  3. 基於 abp vNext 和 .NET Core 開發博客項目 – 完善與美化,Swagger登場
  4. 基於 abp vNext 和 .NET Core 開發博客項目 – 數據訪問和代碼優先
  5. 基於 abp vNext 和 .NET Core 開發博客項目 – 自定義倉儲之增刪改查
  6. 基於 abp vNext 和 .NET Core 開發博客項目 – 統一規範API,包裝返回模型
  7. 基於 abp vNext 和 .NET Core 開發博客項目 – 再說Swagger,分組、描述、小綠鎖
  8. 基於 abp vNext 和 .NET Core 開發博客項目 – 接入GitHub,用JWT保護你的API
  9. 基於 abp vNext 和 .NET Core 開發博客項目 – 異常處理和日誌記錄
  10. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用Redis緩存數據
  11. 基於 abp vNext 和 .NET Core 開發博客項目 – 集成Hangfire實現定時任務處理
  12. 基於 abp vNext 和 .NET Core 開發博客項目 – 用AutoMapper搞定對象映射
  13. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(一)
  14. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(二)
  15. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(三)
  16. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(一)
  17. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(二)
  18. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(三)
  19. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(四)
  20. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(五)
  21. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(一)
  22. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(二)
  23. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(三)
  24. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(四)
  25. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(五)
  26. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(六)
  27. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(七)
  28. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(八)
  29. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(九)
  30. 基於 abp vNext 和 .NET Core 開發博客項目 – 終結篇之發布項目

上一篇完成了博客文章詳情頁面的數據展示和基於JWT方式的簡單身份驗證,本篇繼續推進,完成後台分類管理的所有增刪改查等功能。

分類管理

在 Admin 文件夾下新建Razor組件,Categories.razor,設置路由,@page "/admin/categories"。將具體的展示內容放在組件AdminLayout中。

@page "/admin/categories"

<AdminLayout>
      <Loading />
</AdminLayout>

在這裏我會將所有分類展示出來,新增、更新、刪除都會放在一個頁面上去完成。

先將列表查出來,添加API的返回參數,private ServiceResult<IEnumerable<QueryCategoryForAdminDto>> categories;,然後再初始化中去獲取數據。

//QueryCategoryForAdminDto.cs
namespace Meowv.Blog.BlazorApp.Response.Blog
{
    public class QueryCategoryForAdminDto : QueryCategoryDto
    {
        /// <summary>
        /// 主鍵
        /// </summary>
        public int Id { get; set; }
    }
}
/// <summary>
/// API返回的分類列表數據
/// </summary>
private ServiceResult<IEnumerable<QueryCategoryForAdminDto>> categories;

/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
protected override async Task OnInitializedAsync()
{
    var token = await Common.GetStorageAsync("token");
    Http.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");

    categories = await FetchData();
}

/// <summary>
/// 獲取數據
/// </summary>
/// <returns></returns>
private async Task<ServiceResult<IEnumerable<QueryCategoryForAdminDto>>> FetchData()
{
    return await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryCategoryForAdminDto>>>("/blog/admin/categories");
}

初始化的時候,需要將我們存在localStorage中的token讀取出來,因為我們後台的API都需要添加 Authorization Header 請求頭才能成功返回數據。

在Blazor添加請求頭也是比較方便的,直接Http.DefaultRequestHeaders.Add(...)即可,要注意的是 token值前面需要加 Bearer ,跟了一個空格不可以省略。

獲取數據單獨提成了一個方法FetchData(),因為會頻繁用到,現在在頁面上將數據綁定進行展示。

@if (categories == null)
{
    <Loading />
}
else
{
    <div class="post-wrap categories">
        <h2 class="post-title">-&nbsp;Categories&nbsp;-</h2>
        @if (categories.Success && categories.Result.Any())
        {
            <div class="categories-card">
                @foreach (var item in categories.Result)
                {
                    <div class="card-item">
                        <div class="categories">
                            <NavLink title="刪除" @onclick="@(async () => await DeleteAsync(item.Id))"></NavLink>
                            <NavLink title="編輯" @onclick="@(() => ShowBox(item))"></NavLink>
                            <NavLink target="_blank" href="@($"/category/{item.DisplayName}")">
                                <h3>@item.CategoryName</h3>
                                <small>(@item.Count)</small>
                            </NavLink>
                        </div>
                    </div>
                }
                <div class="card-item">
                    <div class="categories">
                        <NavLink><h3 @onclick="@(() => ShowBox())">~~~ 新增分類 ~~~</h3></NavLink>
                    </div>
                </div>
            </div>
        }
        else
        {
            <ErrorTip />
        }
    </div>
}

同樣的當categories還沒成功獲取到數據的時候,我們直接在展示 <Loading />組件。然後就是循環列表數據在foreach中進行綁定數據。

在每條數據最前面,加了刪除和編輯兩個按鈕,刪除的時候調用DeleteAsync方法,將當前分類的Id傳給他即可。新增和編輯的時候調用ShowBox方法,他接受一個參數,當前循環到的分類對象item,即QueryCategoryForAdminDto。

同時這裏考慮到復用性,我寫了一個彈窗組件,Box.Razor,放在Shared文件夾下面,可以先看一下標題為彈窗組件的內容再回來繼續往下看。

刪除分類

接下來看看刪除方法。

/// <summary>
/// 刪除分類
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private async Task DeleteAsync(int id)
{
    // 彈窗確認
    bool confirmed = await Common.InvokeAsync<bool>("confirm", "\n真的要幹掉這個該死的分類嗎");

    if (confirmed)
    {
        var response = await Http.DeleteAsync($"/blog/category?id={id}");

        var result = await response.Content.ReadFromJsonAsync<ServiceResult>();

        if (result.Success)
        {
            categories = await FetchData();
        }
    }
}

刪除之前搞個原生的confirm進行提示,避免手殘誤刪。因為API那邊使用的是HttpDelete,所有我們調用API時候要用Http.DeleteAsync,返回的是HttpResponseMessage對象,需要我們手動處理接收返回數據,將其轉換為ServiceResult對象,如果判斷刪除成功后重新調用FetchData()刷新分類數據。

新增/更新分類

新增和更新數據選擇使用彈窗的方式來進行(彈窗組件在下方),首先是需要一個參數判斷彈窗是否打開,因為是將新增和更新放在一起,所以如何判斷是新增還是更新呢?這裏使用Id來進行判斷,當編輯的時候肯定會有Id參數。新增的時候是沒有參數傳遞的。

當我們打開彈窗后裏面需要展示兩個input框,用來供輸入要保存的數據,同樣是添加兩個變量。

添加所需的這幾個參數。

/// <summary>
/// 默認隱藏Box
/// </summary>
private bool Open { get; set; } = false;

/// <summary>
/// 新增或者更新時候的分類字段值
/// </summary>
private string categoryName, displayName;

/// <summary>
/// 更新分類的Id值
/// </summary>
private int id;

現在可以將Box組件添加到頁面上。

<div class="post-wrap categories">
	...
</div>

<Box OnClickCallback="@SubmitAsync" Open="@Open">
    <div class="box-item">
        <b>DisplayName:</b><input type="text" @bind="@displayName" @bind:event="oninput" />
    </div>
    <div class="box-item">
        <b>CategoryName:</b><input type="text" @bind="@categoryName" @bind:event="oninput" />
    </div>
</Box>

確定按鈕回調事件執行SubmitAsync()方法,打開狀態參數為上面添加的Open,按鈕文字ButtonText為默認值不填。

添加了兩個input,將兩個分類字段分別綁定上去,使用@bind和@bind:event。前者等價於設置其value值,後者等價於一個change事件當值改變後會重新賦給綁定的字段參數。

現在可以來看看點擊了新增或者編輯按鈕的方法ShowBox(...),接收一個參數QueryCategoryForAdminDto讓其默認值為null。

/// <summary>
/// 显示box,綁定字段
/// </summary>
/// <param name="dto"></param>
private void ShowBox(QueryCategoryForAdminDto dto = null)
{
    Open = true;
    id = 0;

    // 新增
    if (dto == null)
    {
        displayName = null;
        categoryName = null;
    }
    else // 更新
    {
        id = dto.Id;
        displayName = dto.DisplayName;
        categoryName = dto.CategoryName;
    }
}

執行ShowBox()方法,將彈窗打開,設置Open = true;和初始化id的值id = 0;。

通過參數是否null進行判斷是新增還是更新,這樣打開彈窗就搞定了,剩下的就交給彈窗來處理了。

因為新增和更新API需要還對應的輸入參數EditCategoryInput,去添加它不要忘了。

那麼現在就只差按鈕回調事件SubmitAsync()了,主要是給輸入參數進行賦值調用API,執行新增或者更新即可。

/// <summary>
/// 確認按鈕點擊事件
/// </summary>
/// <returns></returns>
private async Task SubmitAsync()
{
    var input = new EditCategoryInput()
    {
        DisplayName = displayName.Trim(),
        CategoryName = categoryName.Trim()
    };

    if (string.IsNullOrEmpty(input.DisplayName) || string.IsNullOrEmpty(input.CategoryName))
    {
        return;
    }

    var responseMessage = new HttpResponseMessage();

    if (id > 0)
        responseMessage = await Http.PutAsJsonAsync($"/blog/category?id={id}", input);
    else
        responseMessage = await Http.PostAsJsonAsync("/blog/category", input);

    var result = await responseMessage.Content.ReadFromJsonAsync<ServiceResult>();
    if (result.Success)
    {
        categories = await FetchData();
        Open = false;
    }
}

當參數為空時,直接return什麼都不執行。通過當前Id判斷是新增還是更新操作,調用不同的方法PutAsJsonAsync和PostAsJsonAsync去請求API,同樣返回到是HttpResponseMessage對象,最後如果操作成功,重新請求一個數據,刷新分類列表,將彈窗關閉掉。

分類管理頁面的全部代碼如下:

點擊查看代碼

@page "/admin/categories"

<AdminLayout>
    @if (categories == null)
    {
        <Loading />
    }
    else
    {
        <div class="post-wrap categories">
            <h2 class="post-title">-&nbsp;Categories&nbsp;-</h2>
            @if (categories.Success && categories.Result.Any())
            {
                <div class="categories-card">
                    @foreach (var item in categories.Result)
                    {
                        <div class="card-item">
                            <div class="categories">
                                <NavLink title="刪除" @onclick="@(async () => await DeleteAsync(item.Id))"></NavLink>
                                <NavLink title="編輯" @onclick="@(() => ShowBox(item))"></NavLink>
                                <NavLink target="_blank" href="@($"/category/{item.DisplayName}")">
                                    <h3>@item.CategoryName</h3>
                                    <small>(@item.Count)</small>
                                </NavLink>
                            </div>
                        </div>
                    }
                    <div class="card-item">
                        <div class="categories">
                            <NavLink><h3 @onclick="@(() => ShowBox())">~~~ 新增分類 ~~~</h3></NavLink>
                        </div>
                    </div>
                </div>
            }
            else
            {
                <ErrorTip />
            }
        </div>

        <Box OnClickCallback="@SubmitAsync" Open="@Open">
            <div class="box-item">
                <b>DisplayName:</b><input type="text" @bind="@displayName" @bind:event="oninput" />
            </div>
            <div class="box-item">
                <b>CategoryName:</b><input type="text" @bind="@categoryName" @bind:event="oninput" />
            </div>
        </Box>
    }
</AdminLayout>

@code {
    /// <summary>
    /// 默認隱藏Box
    /// </summary>
    private bool Open { get; set; } = false;

    /// <summary>
    /// 新增或者更新時候的分類字段值
    /// </summary>
    private string categoryName, displayName;

    /// <summary>
    /// 更新分類的Id值
    /// </summary>
    private int id;

    /// <summary>
    /// API返回的分類列表數據
    /// </summary>
    private ServiceResult<IEnumerable<QueryCategoryForAdminDto>> categories;

    /// <summary>
    /// 初始化
    /// </summary>
    /// <returns></returns>
    protected override async Task OnInitializedAsync()
    {
        var token = await Common.GetStorageAsync("token");
        Http.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");

        categories = await FetchData();
    }

    /// <summary>
    /// 獲取數據
    /// </summary>
    /// <returns></returns>
    private async Task<ServiceResult<IEnumerable<QueryCategoryForAdminDto>>> FetchData()
    {
        return await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryCategoryForAdminDto>>>("/blog/admin/categories");
    }

    /// <summary>
    /// 刪除分類
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    private async Task DeleteAsync(int id)
    {
        Open = false;

        // 彈窗確認
        bool confirmed = await Common.InvokeAsync<bool>("confirm", "\n真的要幹掉這個該死的分類嗎");

        if (confirmed)
        {
            var response = await Http.DeleteAsync($"/blog/category?id={id}");

            var result = await response.Content.ReadFromJsonAsync<ServiceResult>();

            if (result.Success)
            {
                categories = await FetchData();
            }
        }
    }

    /// <summary>
    /// 显示box,綁定字段
    /// </summary>
    /// <param name="dto"></param>
    private void ShowBox(QueryCategoryForAdminDto dto = null)
    {
        Open = true;
        id = 0;

        // 新增
        if (dto == null)
        {
            displayName = null;
            categoryName = null;
        }
        else // 更新
        {
            id = dto.Id;
            displayName = dto.DisplayName;
            categoryName = dto.CategoryName;
        }
    }

    /// <summary>
    /// 確認按鈕點擊事件
    /// </summary>
    /// <returns></returns>
    private async Task SubmitAsync()
    {
        var input = new EditCategoryInput()
        {
            DisplayName = displayName.Trim(),
            CategoryName = categoryName.Trim()
        };

        if (string.IsNullOrEmpty(input.DisplayName) || string.IsNullOrEmpty(input.CategoryName))
        {
            return;
        }

        var responseMessage = new HttpResponseMessage();

        if (id > 0)
            responseMessage = await Http.PutAsJsonAsync($"/blog/category?id={id}", input);
        else
            responseMessage = await Http.PostAsJsonAsync("/blog/category", input);

        var result = await responseMessage.Content.ReadFromJsonAsync<ServiceResult>();
        if (result.Success)
        {
            categories = await FetchData();
            Open = false;
        }
    }
}

彈窗組件

考慮到新增和更新數據的時候需要彈窗,這裏就簡單演示一下寫一個小組件。

在 Shared 文件夾下新建一個Box.razor。

在開始之前分析一下彈窗組件所需的元素,彈窗肯定有一個確認和取消按鈕,右上角需要有一個關閉按鈕,關閉按鈕和取消按鈕一個意思。他還需要一個打開或者關閉的狀態,判斷是否打開彈窗,還有就是彈窗內需要自定義展示內容。

確定按鈕的文字可以自定義,所以差不多就需要3個參數,組件內容RenderFragment ChildContent,是否打開彈窗bool Open默認隱藏,按鈕文字string ButtonText默認值給”確定”。然後最重要的是確定按鈕需要一個回調事件,EventCallback<MouseEventArgs> OnClickCallback 用於執行不同的事件。

/// <summary>
/// 組件內容
/// </summary>
[Parameter]
public RenderFragment ChildContent { get; set; }

/// <summary>
/// 是否隱藏
/// </summary>
[Parameter]
public bool Open { get; set; } = true;

/// <summary>
/// 按鈕文字
/// </summary>
[Parameter]
public string ButtonText { get; set; } = "確定";

/// <summary>
/// 確認按鈕點擊事件回調
/// </summary>
[Parameter]
public EventCallback<MouseEventArgs> OnClickCallback { get; set; }

/// <summary>
/// 關閉Box
/// </summary>
private void Close() => Open = false;

右上角關閉和取消按鈕直接在內部進行處理,執行Close()方法,將參數Open值設置為false即可。

對應的html如下。

@if (Open)
{
    <div class="shadow"></div>
    <div class="box">
        <div class="close" @onclick="Close"></div>
        <div class="box-content">
            @ChildContent
            <div class="box-item box-item-btn">
                <button class="box-btn" @onclick="OnClickCallback">@ButtonText</button>
                <button class="box-btn btn-primary" @onclick="Close">取消</button>
            </div>
        </div>
    </div>
}

關於樣式

下面是彈窗組件所需的樣式代碼,大家需要的自取,也可以直接去GitHub實時獲取最新的樣式文件。

.box {
    width: 600px;
    height: 300px;
    border-radius: 5px;
    background-color: #fff;
    position: fixed;
    top: 50%;
    left: 50%;
    margin-top: -150px;
    margin-left: -300px;
    z-index: 997;
}
.close {
    position: absolute;
    right: 3px;
    top: 2px;
    cursor: pointer;
}
.shadow {
    width: 100%;
    height: 100%;
    position: fixed;
    left: 0;
    top: 0;
    z-index: 996;
    background-color: #000;
    opacity: 0.3;
}
.box-content {
    width: 90%;
    margin: 20px auto;
}
.box-item {
    margin-top: 10px;
    height: 30px;
}
.box-item b {
    width: 130px;
    display: inline-block;
}
.box-item input[type=text] {
    padding-left: 5px;
    width: 300px;
    height: 30px;
}
.box-item label {
    width: 100px;
    white-space: nowrap;
}
.box-item input[type=radio] {
    width: auto;
    height: auto;
    visibility: initial;
    display: initial;
    margin-right: 2px;
}
.box-item button {
    height: 30px;
    width: 100px;
}
.box-item-btn {
    position: absolute;
    right: 20px;
    bottom: 20px;
}
.box-btn {
    display: inline-block;
    height: 30px;
    line-height: 30px;
    padding: 0 18px;
    background-color: #5A9600;
    color: #fff;
    white-space: nowrap;
    text-align: center;
    font-size: 14px;
    border: none;
    border-radius: 2px;
    cursor: pointer;
}
button:focus {
    outline: 0;
}
.box-btn:hover {
    opacity: .8;
    filter: alpha(opacity=80);
    color: #fff;
}
.btn-primary {
    border: 1px solid #C9C9C9;
    background-color: #fff;
    color: #555;
}
.btn-primary:hover {
    border-color: #5A9600;
    color: #333;
}
.post-box {
    width: 98%;
    margin: 27px auto 0;
}
.post-box-item {
    width: 100%;
    height: 30px;
    margin-bottom: 5px;
}
.post-box-item input {
    width: 49.5%;
    height: 30px;
    padding-left: 5px;
    border: 1px solid #ddd;
}
.post-box-item input:nth-child(1) {
    float: left;
    margin-right: 1px;
}
.post-box-item input:nth-child(2) {
    float: right;
    margin-left: 1px;
}
.post-box .box-item b {
    width: auto;
}
.post-box .box-item input[type=text] {
    width: 90%;
}

好了,分類模塊的功能都完成了,標籤和友情鏈接的管理界面還會遠嗎?這兩個模塊的做法和分類是一樣的,有興趣的可以自己動手完成,今天到這吧,未完待續…

開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

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

上周熱點回顧(6.8-6.14)

熱點隨筆:

· 真慘!連各大編程語言都擺起地攤了! (軒轅之風)
· .NET開發者省份分佈排名 (張善友)
· C#9.0 終於來了,您還學的動嗎? 帶上VS一起解讀吧!(應該是全網第一篇) (一線碼農)
· WinUI 3 試玩報告 (dino.c)
· [C#.NET 拾遺補漏]04:你必須知道的反射 (LiamWang)
· 120行代碼打造.netcore生產力工具-小而美的後台異步組件 (福祿網絡技術團隊)
· .Net Core實戰之基於角色的訪問控制的設計 (陳珙)
· 面試了 6 輪 Google 中國 之後,還是掛了 (程序猿石頭)
· 手動造輪子——基於.NetCore的RPC框架DotNetCoreRpc (yi念之間)
· .Net Core微服務入門全紀錄(一)——項目搭建 (xhznl)
· 搭上末班車去了京東,終於可以做東哥兄弟… (龍躍十二)
· 8000字長文讓你徹底了解 Java 8 的 Lambda、函數式接口、Stream 用法和原理 (風的姿態)

熱點新聞:

· 中國最慘創業者:3年前我被投資人趕出公司,3年後讓我賠3800萬!
· 馬化騰每天刷Leetcode?代碼你打算寫到幾歲?
· Linux之父親手拒補丁、怒懟亞馬遜程序員 網友:我的快樂又回來了
· 一場屬於少數人的復蘇
· 打破Oracle垄斷!支付寶OceanBase獨立:年內將發布重大版本升級
· 京東真正上岸了
· 關閉微信朋友圈個性化廣告有多難?13 個步驟點擊 16 次,只能關半年
· 27歲程序員轉職賞金獵人:一個漏洞10萬美元,比工資香多了
· .NET 5.0 Preview 5 發布
· 好評率84%,微軟工作室翻身大作《盜賊之海》登陸Steam!
· 阿里雲年度戰略首次公開!中台做厚,硬件擴張,還要再招5000人
· 分析了上千張照片發現:R語言程序員最快樂,Java開發者最年輕

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

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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