開這輛車出去半條街的人都盯着看!滿足虛榮心的神器

Ghibli車上有多達13處的儲物空間,足夠日常使用。後備廂的空間有523L以上,足夠一家人出行使用。給Ghibli提供動力的是一台縱置的V6雙渦輪增壓發動機,最大馬力是350匹,最大扭矩是500牛·米。匹配的是一台8AT的變速箱。經過實測,Ghibli的百公里加速時間為6。

當天拍攝瑪莎拉蒂Ghibli的時候,有一位老人家過來跟我們聊了兩句

“這車挺漂亮的,值多少錢?”

“你猜猜”

“150到160萬吧”

“沒有啦,才110萬多。”

為什麼要把這個真實事件放在開頭呢?

因為真正要買的人看完就已經下單了。

下面就是你們的車輛說明書。

一款轎跑的外形不會差到哪兒去,更何況,這是一台瑪莎拉蒂的轎跑。亞平寧半島的設計師用迷人的曲線來描繪Ghibli的車身,而車頭上則配上了最兇悍的進氣格柵和大燈,將優雅與暴力這對二律背反的元素有機地結合在一台Ghibli身上。Ghibli的車身側面充滿着性能車的特徵。修長的車頭,是為了裝下大排量高性能的發動機;溜背的造型,是為了減少風阻。Ghibli的風阻係數僅為0.29,極低極低。

Ghibli定位是一款中大型車,同時,作為一款轎跑,Ghibli的尺寸當然比不上專為國人加長的5系等中大型車。這個尺寸正好能完成4門轎跑定位所賦予它的任務。

作為一款豪華車,Ghibli的做工自然對得起自己的身價。Ghibli的漆面非常厚,而且漆面平整,显示出良好的工藝水平。

Ghibli的內飾就稍顯四平八穩,對稱式的內飾設計讓內飾看上去莊重些。Ghibli的內飾採用了真皮+木紋飾板的組合,觸感溫潤,視覺感官豪華。儀錶盤採用經典的机械轉表+液晶显示屏的組合。時速的机械轉表表底高達310km/h,轉速的紅線區去到6500轉左右。8.4英寸的中控屏幕显示效果清晰,加入carplay后,功能更加完善,更加貼合時代。

Ghibli的座椅明顯是更注重支撐性的,座椅的填充物比較硬,坐墊和靠背兩側都有巨大的側面支撐,靠背與坐墊中央部分。後排中央為了留位置給四驅系統,所以地台高高聳起。既然你選擇了Ghibli,那當然選擇接受它啦。

Ghibli的乘坐空間不算大,以173cm的身高為例,前排頭部空間有四指,後排的頭部空間一拳,腿部空間一拳四指。

Ghibli車上有多達13處的儲物空間,足夠日常使用。後備廂的空間有523L以上,足夠一家人出行使用。

給Ghibli提供動力的是一台縱置的V6雙渦輪增壓發動機,最大馬力是350匹,最大扭矩是500牛·米。匹配的是一台8AT的變速箱。

經過實測,Ghibli的百公里加速時間為6.1秒。這個成績與官方5秒的成績有所出入。這是因為當天廣州高溫天氣導致的,不具有普遍性。

這套V6雙渦輪增壓發動機+8AT變速箱組成的動力系統可謂是天衣無縫。這套動力系統有三種邏輯,一是節能模式,二是普通模式,三是運動模式。節能模式下,整車的響應比較慢,油門的寬容度很大,需要稍微踩深一些才會給你反應。普通模式的油門響應就很快了,隨踩隨有,而且油門比較線性,踩多少就給多少力。運動模式的油門響應跟普通模式的區別不大,運動模式最大的區別就是變速箱邏輯。這時候的變速箱會更願意保持在低擋位,將發動機的轉速維持在較高的區間,以確保你需要動力的時候,能夠立刻給你最大的加速度。

Ghibli的底盤極限要比動力系統還高。Ghibli前後都採用了雙叉臂獨立懸挂的形式,底盤的高度比一般轎車還要低上一點點。豪華版的前輪胎寬是245mm,後輪胎寬是275mm。所以底盤的表現非常穩健,過彎的時候完全沒有察覺出一絲側滑,車身的側傾也非常小。

Ghibli的舒適性並不突出,這跟運動的定位有關。座椅是以支撐性為第一設計目標,偏硬的坐感註定了與舒適無緣。無框車門雖然帥,但是到了舒適性這一步,就成了缺點。還有那台雙渦輪增壓發動機帶來綿綿不絕的吼叫聲。所有這些要素都決定了Ghibli不會那麼舒適,但是,你真的在乎嗎?

毫無疑問,瑪莎拉蒂Ghibli的長處就在於強勁的動力和穩健的底盤。這兩項的組合可以讓你享受到暢快淋漓的駕駛感受。當然,性價比也是瑪莎拉蒂Ghibli的長處,花了110萬,有150萬的效果,這性價比也是沒誰了。所以,下面這個評分表,不看也罷。

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

【其他文章推薦】

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

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

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

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

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

17萬起一款空間超大、一款配置驚人,多數人都會糾結這兩款

內飾上,蒙迪歐採用三輻式方向盤,背後還有換擋撥片,儀錶台是傳統的指針式轉速、速度表。金牛座則與奧迪A6L一樣,用四輻方向盤襯托其成熟穩重風格,儀錶台上雙彩色行車電腦显示信息詳細,旋鈕式換擋現在算不上新奇了,國內大部分電動車都在使用。

長安福特蒙迪歐,一直都是中型車中炙手可熱的車型,曾與阿特茲、凱美瑞斗得難捨難分;當你要出手了,卻殺出一台金牛座,這個時候問題來了,需要在運動與穩重之間取捨,很難!家人說要大台,金牛座有C級車的空間水平!朋友說要運動帥氣,蒙迪歐大“馬丁臉”、雙十輻鋁合金輪圈。選擇困難的人很絕望,I want to die!

來幫你分析一下吧,找到適合你的“卟卟車”。哈哈哈!

蒙迪歐延續福特標誌性家族化設計語言,並且通過時尚、動感的高顏值展現出來,鯊魚鰭天線,小尾翼等細節對提升車輛運動質感起很好的作用。

金牛座作為福特全尺寸旗艦級轎車,功能、配置、空間直逼德系豪華車,前臉依舊是“馬丁臉”,但是相比蒙迪歐確實收斂了很多,反而展現出商務的高貴氣質。

在尺寸方面,金牛座完爆蒙迪歐,虐得不像“車型”,畢竟是全尺寸旗艦級轎車。

內飾上,蒙迪歐採用三輻式方向盤,背後還有換擋撥片,儀錶台是傳統的指針式轉速、速度表。金牛座則與奧迪A6L一樣,用四輻方向盤襯托其成熟穩重風格,儀錶台上雙彩色行車電腦显示信息詳細,旋鈕式換擋現在算不上新奇了,國內大部分電動車都在使用。總的來說兩車內飾設計均是扁平、簡約,中規中矩。

單單從動力數據上來看,兩者沒有差距,但是蒙迪歐動力選擇更加靈活,另外,相同的動力,推動這兩台車,顯然更輕的蒙迪歐推重比更高,動力響應性更好。

雖然價位相近,但是配置方面真的天差地別,典型的做雞頭,選鳳尾問題。蒙迪歐高配的安全配置更高,輔助功能也齊全,按摩座椅也逆天出現了。

另外,金牛座之所以銷量不如蒙迪歐,原因是定價偏高,很多配置與蒙迪歐重疊,或者更遜色,市場整體走年輕運動的路線,明顯金牛座定位稍稍偏離主線。做雞頭,還是選鳳尾,是買車的必經之路。原因就是只有有限的資金,買不到完美的車,這個時候就要按個人氣質或需求來選擇了,就例如很少年輕人買克萊斯勒300C吧,沒有人買轎車越野一樣。那麼這兩台車定位不同,認為心還沒能靜下來和需要高配置的就選蒙迪歐吧,心緒沉澱下來了和需要氣場大、空間大就選金牛座。還是那句話,適合自己的才是最好的!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

※超省錢租車方案

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

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

這5款帥爆的車,多花6、7萬你都覺得不虧?

由於奧迪A5 Coupe的車身線條都偏硬朗,所以它很難體現出Coupe那種優雅,更像一款雙門的大型“小鋼炮”。奧迪A5有一款叫哥特蘭綠的專屬車漆,象徵著“復古騎士”,其實還是挺有味道的。從奧迪A4L的名字我們就可以看出,奧迪A4實現國產時並沒有保留標軸版,所以奧迪A5 Coupe的軸距要比國產奧迪A4L的短。

有許多走高端路線的汽車品牌,為了建立豐富的汽車產品線,基於同一個車型平台往往能衍生出轎跑版、三廂版或旅行版等車型,通過這些車型的差異取向,去滿足不同消費者的個性需求。我們通過對這些車型的特性分析,發現他們的最大差異在於外觀、實用性和售價。

通過這樣的大致分析,我們就可以理解到為什麼傳統的三廂車是銷量最大,因為它的特性很均衡,而且受眾廣,在實現國產的情況下,價格也有很大優勢。不過我們今天的話題是那些很炫酷但又不是太實用,而且賣得很貴的轎跑車型,也就是我們常說的Coupe。

如果問Coupe車型最值錢的地方在於哪裡?我認為是車身側面,一般情況下,Coupe車型與同平台的三廂車型往往在底盤架構和動力總成方面是一致的,最大的區別在於Coupe車型是雙門的,由於是雙門設計,後排空間受到了很大限制,而且後排只能設定兩個座位,乘坐空間也非常拘束,但是也因為由四門變成了雙門,車身側面的美感上升了不止一個層次,而且都是無框車門,這種姿態上的進化,就是Coupe車型的價值所在,這也就是我們所說的“顏值即正義”。

那麼這些Cuope車型到底要比三廂車貴多少呢?又帥了多少呢?我們通過幾款熱門的車型分析一波。

奔馳C級/C級Coupe

首先第一款Coupe車型是奔馳的C級,由於進口版本的奔馳C級Coupe並沒有1.6T動力的版本,最低配置為C 200,指導價38.08萬,相對於同動力同配置(配置接近)的北京奔馳C 200運動版,指導價為31.28萬,兩車差價6.8萬,這6.8萬多了什麼?

外觀方面,C級Coupe的前臉配有星輝大標中網,側面與三廂版一樣是採用雙腰線的設計,但是由於少了兩個門,而且車身高度也更低,所以側面看起來的效果非常優雅;而尾部的設計也有所不同,更小的后風擋,扁平式的尾燈樣式,更簡潔的尾箱蓋設計,都使得C級Coupe的尾部具有更寬大的視覺效果。

尺寸方面,C級Coupe的軸距和C級三廂標軸版的保持一致,這也象徵著它們源自同一平台。但這不意味着它們有相同的空間表現,如果是170cm以上的人,就不要考慮坐進後排了,實在太難受。

內飾樣式也基本保持一致,不過根據車主反映,C級Coupe的內飾會更具質感,畢竟是進口車型,一些用料和做工還是比較優越。

進口的C級Coupe除了沒有1.6T的動力外,2.0T的高低功率版與國產C級保持一致,只是在調校方面有小小差異,但基本感覺不出來。

寶馬3系/4系 Coupe

其實現在的4系Coupe就是過去的3系轎跑版,只是現在獨立出來了,現款寶馬430i M運動套裝版指導價為52.59萬,而國產的華晨寶馬330i M運動曜夜版指導價為45.20萬,兩車差價7.39萬。看上去還好,實際上現在華晨寶馬330i的優惠幅度非常大。

首先4系Coupe由於“雙腎”和“天使眼大燈”的設計跟3系有一點點差異,加上下進氣格柵也比3系更扁平,所以整個前臉都是更扁平的;側面的確也比3系更拉風,但是實際上3系的側面也是非常協調和優美的;尾部除了尾燈的設計有一點點不同,其他的差距並不大。值得一提的是4系有一款專屬的“海岸藍”車漆。

尺寸方面,寶馬4系coupe的軸距與3系標軸版的保持一致,但車身高度也是更低,所以造型當然更拉風。

內飾不要說出自同平台的車了,對於寶馬來說,3系和7系的內飾風格就一個樣。上圖方向盤的樣式不同主要是因為基本版和運動版的差別。

由於寶馬4系Coupe為進口車型,所以也沒有配備1.5T的動力,不過卻多了一個3.0T的動力,但又跟M4的3.0T不一樣,功率比M4的要更低。

奧迪A4L/奧迪A5 Coupe

現款奧迪A5 Coupe 40 TFSI時尚型指導價39.80萬(看似很便宜,實際聽說要加價),而對應的現款國產奧迪A4L 30周年年型 40 TFSI 時尚型指導價為34.57萬(現優惠幅度還不錯,應該有4萬左右),兩車差價5.23萬(所以實際差價應該上10萬,具體以4S店為準)。

相對於奧迪A4L,奧迪A5 Coupe的前臉也有所不同,大燈樣式更簡潔凌厲,六邊形的進氣格柵更扁平,整個前臉也是更扁平的風格;而側面的腰線呈“大波浪”的走勢;尾燈的設計則更運動。由於奧迪A5 Coupe的車身線條都偏硬朗,所以它很難體現出Coupe那種優雅,更像一款雙門的大型“小鋼炮”…?奧迪A5有一款叫哥特蘭綠的專屬車漆,象徵著“復古騎士”,其實還是挺有味道的。

從奧迪A4L的名字我們就可以看出,奧迪A4實現國產時並沒有保留標軸版,所以奧迪A5 Coupe的軸距要比國產奧迪A4L的短。

內飾風格兩個幾乎保持一致,基本也就材質或配置的小小差異。不得不說奧迪內飾的科技感或高級感真非常強。

動力方面,奧迪A5 Coupe除了有沒配備1.4T的動力,2.0T的高低功率版也與國產的奧迪A4L保持一致;如果你要更強的動力,那就要上奧迪S5,甚至奧迪RS5了。

英菲尼迪Q50L/Q60 Coupe

最新款的英菲尼迪Q60 2.0T豪華版指導價為38.98萬,而相同動力,配置接近的最新款英菲尼迪Q50L 2.0T豪華版的指導價為36.98萬(現有5萬左右的優惠幅度),兩車差價2萬元,就指導價來看,差距的確非常小。

要說英菲尼迪Q60 Coupe與英菲尼迪Q50L在外觀上的差距,無論是整體還是細節都有所體現,更大尺寸的中網、更精緻的大燈和尾燈造型、更具動感的C柱設計,整體外觀更寬、更扁。對於英菲尼迪的Q60 Coupe,可以說是以上車型中最動感或最性感的一款了,車身那些流暢且優美的曲線可以說是把Coupe那種美感展現得淋漓盡致。

由於英菲尼迪Q50實現國產時也沒有保留標軸版,所以Q60 Coupe的軸距是和進口版,沒加長的Q50保持一致。

內飾風格兩車也是一個樣,但材質方面應該也有一點點不一樣,或者說座椅的設計不同,Q60的座椅會更偏向運動風格。對於這兩款偏向運動的車型來說,這套內飾並沒有很激進,而是通過大面積的皮質營造比較豪華的氛圍。

動力方面,現款Q60隻有一個動力可選,也就是和Q50L一樣2.0T。但Q60在海外有3.0T的版本,如果你對動力有比較高的追求,就只能選擇平行進口了,但那樣的價格當然也貴得離譜吧。

雷克薩斯IS/RC

其實雷克薩斯RC與以上所有的Coupe都不同,它是出自跑車平台的純種跑車。但是,由於雷克薩斯RC的調節和設定都非常偏向於豪華和舒適,就連排氣聲浪也是模擬出來的,而且它也是跟雷克薩斯IS共享同一套動力總成,所以經常會被誤以為是雷克薩斯IS的Coupe車型。

那麼作為一款跑車,獨立的平台,價格當然會很貴,最受歡迎的200t F SpORT版本指導價為52.80萬,而現款雷克薩斯IS 300 F SpORT版的指導價為36.90萬,由於兩款都是進口車型,所以基本都沒什麼優惠,兩車差價15.9萬。畢竟RC是跑車嘛…可以理解。

由於出自不同的平台,所以軸距也是不同的。而整個外觀造型,比起IS,雷克薩斯RC更長,更寬,更矮,那當然也更帥咯。

同為F SpORT版本,那源自LFA的“机械式液晶”是必不可少的,兩車內飾風格基本保持一致,但細心的朋友就會發現,其實還是有所不同的,就在中央空調出風口下方的中控面板,IS是陷進去的,而RC是揚出來的。還有就是擋桿後面,RC配有一個小型“手寫板”。

動力總成是共享的,講道理,RC比IS少了兩個門,那就應該更輕,也跑得更快。但事實並非如此,同是F SpORT版本,RC的整備質量要重一點點,RC的官方百公里加速為7.5秒,而IS的官方百公里加速為7秒。

總結

最後,通過上述車型對比,如果不考慮終端優惠,其實那些進口的Coupe車型也沒有我們想象中那麼貴,也只不過比同級三廂車型貴個5、6、7萬。至於實用性,你也別指望它們的後排有什麼驚喜了,總之,1米7以上的乘客“免進”後排。其實對於中國市場而言,說後排不重要的人只是少數,但說顏值不重要的人更是少數,那麼對於顏值、後排、價格,你會怎麼選?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

奔馳又一輛大嗓門,將推AMG GT S Roadster,3.8秒破百!

0L V8雙渦輪汽油發動機,能爆發出最大功率522馬力,峰值扭矩670牛·米,傳動系統匹配7速雙離合變速箱,百公里加速性能方面能去到3。8秒,極速高達309km/h。又是一輛貼心為你省下買吹風筒的汽車。都知道梅賽德斯-AMG GT非常迅猛兇惡,它最初的研發目標就是衝著保時捷911而來,無論在跑車市場亦或是各種賽事當中。

梅賽德斯-AMG又來新車了,這回是AMG GT S車型新增了Roadster(敞篷版)版本,官方於近日發布了最新的車型官圖,新車上市后,其定位將介於AMG GT Roadster以及AMG GT C Roadster車型之間。其中,新車還搭載了4.0L V8雙渦輪汽油發動機,最大功率高達522馬力,與AMG GT S硬頂版車型保持一致的強悍性能。

外觀方面,最大的不同就是將硬頂更換為黑色軟頂敞篷,前保險杠的左右兩側進氣口以及翼子板散熱口的內部鍍鉻飾條更換為啞光黑色,且左右兩隻外后視鏡和AMG輪轂均採用為黑色設計,其目的是為了與靚黃色車身配色和剎車卡鉗形成撞色衝擊,增強跑車在外觀上的視覺撞擊感。對於這樣的玩樂型跑車,此設定無可厚非,相信也會討好許多富家公子們的歡心。

內飾部分,Roadster版本相比硬頂版本的變化不多,主要的變化在中控擋把操作區域,將原本的大面積鋼琴烤漆材質更換為鍍鉻材質,空調出風口也由原來的鋼琴烤漆加鍍鉻雙層邊框,統一更換為鍍鉻邊框,極大地提升了車廂戰鬥氣氛,且車廂內隨處可見的縫線顏色也變為黃色,與外觀的主題色形成呼應。

車身尾部方面的變化則更加具有質感,不僅取消了硬頂版車型在下保險桿底部的橫向鍍鉻飾條,且在可升降尾翼部分新增了一處剎車光源,進一步提升對後車的安全距離警示,畢竟AMG來者不善。

動力方面,新車延續了硬頂版AMG GT S車型的動力系統,搭載4.0L V8雙渦輪汽油發動機,能爆發出最大功率522馬力,峰值扭矩670牛·米,傳動系統匹配7速雙離合變速箱,百公里加速性能方面能去到3.8秒,極速高達309km/h。又是一輛貼心為你省下買吹風筒的汽車。

都知道梅賽德斯-AMG GT非常迅猛兇惡,它最初的研發目標就是衝著保時捷911而來,無論在跑車市場亦或是各種賽事當中。有趣的是,在两天前剛結束的2018紐伯格林24小時耐力賽的頒獎台上,兩台梅賽德斯-AMG GT3賽車左右“陪伴”保時捷911 GT3 R登頂,儘管這並不能說明兩款車之間的性能差異,但後者這回免費做了波廣告,而梅賽德斯AMG GT則默默地發布了此新車官圖,有冤家的戲顯然更加有趣。

與保時捷911一樣,梅賽德斯-AMG GT的全系產品還是非常完善,從476馬力到585馬力,無論是“過日子”還是賽道控都能找到對應合適的車型,而此次推出Roadster(敞篷版),更是進一步完善產品線。當然對於這級別的消費者講,同價位同配置這樣的選購對比壓根沒有意義,還不如關心一回,這台AMG GT S Roadster版本,除了在賽道意外,還能滿足我們怎樣的想象力呢?

要不你提提意見試試看?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

最低10多萬,開上這6款車,老同學都說我成了大老闆?

5s,提速時可謂是又快又順,高速再加速也不會有底氣不足的情況。說起商務車,恐怕就不得不提邁騰。儘管外形變得年輕化了不少,整個前臉設計就像一位西裝革履的年輕人,既有朝氣,又不失嚴肅。側麵線條修長,看上去較為舒展,尾部鍍鉻雙出排氣口較為有精緻感。

俗話說:“先敬羅衣后敬人”,意思就是先看一個人的着裝再看一個人的內涵。因此,那些做銷售的人,大多都是西裝革履的樣子外出洽談。同時,談生意難免需要一輛靠譜的交通工具。

就20萬左右這個區間而言,可選的車型還是比較多的。無論是選擇轎車,還是選擇SUV,最重要的一點就是外形足夠端莊,不能給人一種花哨的感覺。下面這6款車就挺適合用來商務洽談的。

BX7的外形設計簡約為主,瀑布式的中網格柵大氣耐看,大燈與中網相連的設計,更好地展現出了設計的一體感,霧燈處的鍍鉻裝飾條實屬畫龍點睛之筆。側面五輻式輪圈頗有高級感,尾部設計簡潔大氣。

BX7的2.0T+6AT調校得頗為平順,低速蠕行時的動作較為自然,深踩油門時的降擋也爽脆不含糊。即使是在高速時再加速,BX7也不會有底氣不足的情況。應對顛簸路面時,雖然BX7的左右晃動稍微多了一些,但是濾震還是足夠厚實的。

柯迪亞克的前臉同樣是採用了豎條形的鍍鉻裝飾條設計,儘管面積沒有BX7那麼大,但是裝飾條看上去更為精緻。大燈的造型頗為嚴肅,與進氣格柵相連的設計,較為有一體感。側麵線條平直,不規則的尾燈設計蠻有特點,隱藏式的排氣足夠簡潔。

柯迪亞克的2.0T低功版車型配的是7擋雙離合變速箱,開起來的感覺還是頗為舒爽的。低速蠕行時的頓挫控製得還算可以,零百成績也能去到8.5s左右。底盤是偏歐洲化的調校,過濾震動時較為有韌性。

冠道是這幾款SUV中尺寸最魁梧的,前臉典型的“大齙牙”設計,鍍鉻裝飾條十分粗壯,長條形的大燈炯炯有神。翼子板上的三個鍍鉻裝飾孔,頗有運動感。鍍鉻裝飾條連接兩尾燈,帶出較好的一體感。

很多人會對冠道的1.5T發動機有所質疑,覺得它的動力帶這麼大一台車會不會很“肉”。實際上,大家都多慮了。1.5T冠道的零百實測成績約為8.5s,提速時可謂是又快又順,高速再加速也不會有底氣不足的情況。

說起商務車,恐怕就不得不提邁騰。儘管外形變得年輕化了不少,整個前臉設計就像一位西裝革履的年輕人,既有朝氣,又不失嚴肅。側麵線條修長,看上去較為舒展,尾部鍍鉻雙出排氣口較為有精緻感。

大眾在調校雙離合變速箱方面走過一些彎路,現在出來的效果已經不太令人擔心。1.4T車型採用的是DQ200的七速乾式雙離合,而1.8T和2.0T則是用DQ380的濕式雙離合,從耐久性出發,還是選1.8T或2.0T車型比較好。

金牛座大嘴式的六邊形中網,無論遠看還是近看,都顯得相當霸氣。發動機艙上拱起的兩條“肌肉線”讓前臉更有中心感。側麵線條平直,門板下方的鍍鉻裝飾條起到畫龍點睛的作用。尾部設計飽滿,雙邊鍍鉻排氣口也較為常見。

金牛座入門的1.5T+6AT整體響應不錯,輕輕踩一下油門就能有相當不錯的動力輸出。整體的動力輸出偏向於前段,稍微深踩一點就能馬上降擋來提供加速度。不過上到高速時,它的動力也是僅僅夠用而已。

君威在年輕化的道路上同樣幹得不錯,瀑布式的黑色中網格柵加上飛翼式的標誌相當帥氣。側麵線條凹凸有致,輪圈樣式簡約耐看。尾部設計飽滿,雙出鍍鉻排氣口更顯高級感。

1.5T的動力配上9AT的變速箱,在日常駕駛時給人的輕快感頗為充足。齒比設置綿密,所以換擋時的平順性頗高。油門鬆開時,9AT又懂得升擋來提升燃油經濟性。

總結

汽車其實就是一個人的另一張卡片,所以如果經常要出去商務洽談的話,挑選一輛外形端莊的車還是很有必要的。這6款車無論是外形還是動力水平,都令人滿意,所以大家不妨考慮一下。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

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

Api接口簽名驗證

通過特性來統一驗證的入口,實現ActionFilterAttribute接口來進行接口的簽名驗證

    /// <summary>
    /// 標準接口基類Controller
    /// </summary>
    [SignVerification]
    public abstract class BaseApiController : Controller
    {
    }
    
    /// <summary>
    /// 接口簽名驗證
    /// </summary>
    public class SignVerificationAttribute : ActionFilterAttribute,IAuthenticationFilter
    {
    }

實現的思路為:

1.不同對接方的接口(插件)定義不同的驗證key,不同的插件間不能混用驗證key

2.不同的插件生成不同的partnerId,partnerKey。請求的Url中需要攜帶partnerId,通過partnerId作為key在redis中找到對應的插件驗證信息(包括:partnerId,partnerKey等)

3.Url參數中必須包含partnerId,ts(時間戳),sign(加密簽名)。ts時間戳的有效時間為5分鐘,sign為(時間戳:formBody:partnerId:partnerKey)的MD5加密

4.如果通過partnerId可以找到對應的驗證信息,再把(時間戳:formBody:partnerId:partnerKey)MD5加密后和sign比較確保請求沒有被篡改

5.確保partnerId為當前插件而非其他插件的,因為redis是共用的,只是通過key去取值而已

簽名方式

將時間戳和請求Form參數以及PartnerKey以冒號連接,如(時間戳:body:partnerId:PartnerKey)
將連接好的字符串進行MD5生成sign

Url參數

參數 說明 類型 必須 備註
pid partnerId string  
ts 時間戳(格式:yyyyMMddHHmmss) string 時間戳的有效時間為5分鐘
sign MD5(時間戳:body:partnerId:pkey) string 參考簽名方式

具體代碼實現

    /// <summary>
    /// 接口簽名驗證
    /// </summary>
    public class SignVerificationAttribute : ActionFilterAttribute, IAuthenticationFilter
    {
        private readonly IDefaultUserService _defaultUserService;
        private readonly IInterfaceSignProvider _interfaceSignProvider;
        public SignVerificationAttribute()
        {
            _defaultUserService = ObjectContainer.GetService<IDefaultUserService>();
            _interfaceSignProvider = ObjectContainer.GetService<IInterfaceSignProvider>();
        }

        public void OnAuthentication(AuthenticationContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            var partnerId = request.QueryString["pid"];
            var timeStamp = request.QueryString["ts"];
            var sign = request.QueryString["sign"];//獲取Url參數
            var body = GetBodyText(request.InputStream);

            if (!ValidSign(filterContext,timeStamp, sign, body,partnerId,out IInterfaceSignInfo signInfo))//加密驗證
            {
                filterContext.Result = new ApiResult {Success = false, ErrorMessage = "無效簽名"};
                return;
            }

            var service = ObjectContainer.GetService<IAuthenticationService>();
            var userId = _defaultUserService.GetDefaultUserId(signInfo.LicNo);
            var identity = service.SignIn(userId, signInfo.LicNo, false, TimeSpan.FromMinutes(5), SessionType.WebApi);
            var newPrincipal = new GenericPrincipal(identity, new string[] { });
            filterContext.Principal = newPrincipal;
        }
        private static string GetBodyText(Stream stream)
        {
            using (var ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }

        private bool ValidSign(AuthenticationContext filterContext,string timeStamp, string sign, string body,string partnerId,out IInterfaceSignInfo signInfo)
        {
            signInfo = null;
            if (!string.IsNullOrEmpty(timeStamp) && !string.IsNullOrEmpty(sign)&& !string.IsNullOrEmpty(partnerId))
            {
                var cache = _interfaceSignProvider.GetInterfaceSignInfo(partnerId);//通過partnerId當key讀取redis
                if (cache.Enabled)
                {
                    var areaName = filterContext.RouteData.DataTokens["area"]?.ToString().ToLower();//獲取請求的area,即請求的是哪個插件
                    if (string.IsNullOrEmpty(areaName) || !cache.PluginCode.ToLower().StartsWith(areaName))
                    {
                        return false;//PluginCode需以areaName開頭,否則意味着不是同一個插件(如:PluginCode=juwov1,areaName=JuWo)
                    }
                    if (DateTime.TryParseExact(timeStamp, "yyyyMMddHHmmss", CultureInfo.CurrentCulture.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces, out var time) &&
                        (DateTime.Now - time).TotalMinutes <= 5)//時間戳有效期為5分鐘
                    {
                        signInfo = cache;
                        var hashKey = EncryptHelper.Hash($"{timeStamp}:{body}:{partnerId}:{cache.PartnerKey}", "MD5").ToLowerInvariant();//MD5加密對比
                        return string.Equals(hashKey, sign);
                    }
                }
                
            }
            return false;
        }
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext){}
    }

 

這樣就實現了接口的簽名驗證了。但是還有一個問題是,如果同時存在多個不同的對接接口(插件)時,partnerId,PartnerKey應該是不一樣的。即插件1和插件2的驗證key是不能混用的。

可以通過路由來區分不同的插件,來選擇進入不同的area,通過area來區分不同的插件驗證key。

    public class JuWoAreaRegistration: AreaRegistration
    {
        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "JuWo_default",
                "api/JuWo/{controller}/{action}/{id}",
                new {action = "Index", id = UrlParameter.Optional},
                new[] {"iERP.Its.Web.Areas.JuWo.Controllers"}
            );
        }

        public override string AreaName => "JuWo";
    }

 在之前的ValidSign方法中,通過var areaName = filterContext.RouteData.DataTokens[“area”]?.ToString().ToLower();來獲取到當前請求的是哪個插件,在把url上獲取到的partnerId與我們之前約定好的比較看是否能對應。

 

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

【其他文章推薦】

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

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

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

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

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

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

看到大廠的面試題,你慌了嗎?,【朝花夕拾】Android多線程之(二)ThreadLocal篇,android中getWidth()和getMeasuredWidth()之間的區別

       最近參加了TX音樂Android工程師崗位的面試,這裏憑記憶記錄了面試中的一些考點,希望能幫到正在面試的你(答案還在整理中)!

1、Java調用函數傳入實際參數時,是值傳遞還是引用傳遞?

2、單例模式的DCL方式,為什麼需要第二次判空?

    單例模式的DCL是一種比較好的單例實現方式,面試中被問及的頻率非常高,考察的方式也多種多樣。根據本題的提問,這裏簡單整理了一下,這裏面的每一個點最好都能夠做到爛熟於心:

 1 public class Test {
 2     private volatile static Test instance;
 3 
 4     private Test() {
 5 
 6     }
 7 
 8     public static Test getInstance() {
 9         if (instance == null) {
10             synchronized (Test.class) {
11                 if (instance == null) {
12                     instance = new Test();
13                 }
14             }
15         }
16         return instance;
17     }
18 }

 這裡有5個要點需要注意:

    (1)第一個注意點:使用私有的構造函數,確保正常情況下該類不能被外部初始化(非正常情況比如通過反射初始化,一般使用反射之後單例模式也就失去效果了)。

    (2)第二個注意點:getInstance方法中第一個判空條件,邏輯上是可以去除的,去除之後並不影響單例的正確性,但是去除之後效率低。因為去掉之後,不管instance是否已經初始化,都會進行synchronized操作,而synchronized是一個重操作消耗性能。加上之後,如果已經初始化直接返回結果,不會進行synchronized操作。

    (3)第三個注意點:加上synchronized是為了防止多個線程同時調用getInstance方法時,各初始化instance一遍的併發問題。

    (4)第四個注意點:getInstance方法中的第二個判空條件是不可以去除,如果去除了,並且剛好有兩個線程a和b都通過了第一個判空條件。此時假設a先獲得鎖,進入synchronized的代碼塊,初始化instance,a釋放鎖。接着b獲得鎖,進入synchronized的代碼塊,也直接初始化instance,instance被初始化多遍不符合單例模式的要求~。加上第二個判空條件之後,b獲得鎖進入synchronized的代碼塊,此時instance不為空,不執行初始化操作。

    (5)第五個注意點:instance的聲明有一個voliate關鍵字,如果不用該關鍵字,有可能會出現異常。因為instance = new Test();並不是一個原子操作,會被編譯成三條指令,如下所示。
          1)給Test的實例分配內存

          2)初始化Test的構造器

          3)將instance對象指向分配的內存空間(注意,此時instance就不為空)

        然後咧,java會指令重排序,JVM根據處理器的特性,充分利用多級緩存,多核等進行適當的指令重排序,使程序在保證業務運行的同時,充分利用CPU的執行特點,最大的發揮機器的性能!簡單來說就是jvm執行上面三條指令的時候,不一定是1-2-3這樣執行,有可能是1-3-2這樣執行。如果jvm是按照1-3-2來執行的話,當1-3執行完2還沒執行的時候,如果另外一個線程調用getInstance(),因為3執行了此時instance不為空,直接返回instance。問題是2還沒執行,此時instance相當於什麼都沒有,肯定是有問題的。然後咧,voliate有一個特性就是禁止指令重排序,上面的三條指令是按照1-2-3執行的,這樣就沒有問題了。

       參考:https://blog.csdn.net/hnd978142833/article/details/81633730

3、volatile有什麼作用?AtomiticInteger有什麼作用,底層實現原理是什麼?與synchronized關鍵字有什麼區別?cas有什麼弊端?

       關於多線程相關的知識點,volatile、AtomiticInteger、synchronized、cas問題都是高頻考點,與之相關的知識點如:重量級鎖/輕量級鎖、樂觀鎖/悲觀鎖、JMM(Java Memmory Mode Java內存模型)、用戶空間/內核空間、多線程三要素(原子性、可見性、順序性)、自旋、ABA問題等,都是需要掌握的要點。

       推薦閱讀:【死磕Synchronized底層實現】

                         【面試官沒想到,volatile能吹上半個小時】

                         【《吊打面試官》系列-樂觀鎖、悲觀鎖】

                         【「每日知識點」什麼是 CAS 機制】

4、Android Log中的tag,用類名.class.getSimpleName()來獲取,會有什麼弊端?

5、反射有什麼作用?有什麼弊端?

6、廣播底層實現機制?為什麼會比AIDL方式慢?與EventBus相比有什麼區別?

7、Handler如何保證每個線程只有一個looper?ThreadLocal有什麼作用?

       這道題其實主要考察ThreadLocal,不了解ThreadLocal的可以閱讀博文:【朝花夕拾】Android多線程之(二)ThreadLocal篇,以及【再有人問你什麼是ThreadLocal,就把這篇文章甩給他!】

8、100個0~100之間的整數,實現排序

9、RxJava介紹

10、Glide介紹

11、measuredWidth和width的區別

      結論:getMeasuredWidth()獲取的是view原始的大小,也就是這個view在XML文件中配置或者是代碼中設置的大小。getWidth()獲取的是這個view最終显示的大小,這個大小有可能等於原始的大小也有可能不等於原始大小。

      推薦閱讀:【android中getWidth()和getMeasuredWidth()之間的區別】

12、SparseArray介紹,為什麼能提高性能

13、MVP與MVVM的區別,MVVM的實現方式

14、分享時,Android N開始對url做了什麼限制?

15、HashSet介紹

16、軟引用和弱引用的區別,什麼時候會GC?System.gc()的時候系統會立即回收系統垃圾嗎?

17、Exception和Error有什麼區別?Error能被捕捉嗎?OOM Error能被捕捉嗎?

18、Sharepreference commit()和apply()的區別。Sharepreference進程安全嗎?線程安全嗎?

19、500×500的png圖片所佔的內存大小。同一張圖片在xxdpi-drawable和drawable中誰佔用的內存更大,大多少?

20、RecyclerView與ListView的區別。

大體上這記得么多,面試官會根據回答的內容進一步深入提問,讀者可以在該知識點上進一步拓展。

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※台北網頁設計公司全省服務真心推薦

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

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

厲害了!除了find命令,還有這麼多文件查找命令,高手必備!

大家好,我是良許。

在系統里查找文件,是所有工程師都必備的技能(不管你用的是 Windows 、Linux、還是 MacOS 系統)。對於 Linux 操作系統,單單一個 find 命令就可以完成非常多的搜索工作。

但是,文件搜索命令遠不止一個 find 命令,還有很多。本文就對 Linux 下文件搜索命令進行一個科普,讓你能夠在短時間內找到自己需要的文件。

1. find

find 命令應該是最經典的命令了,談到搜索工具第一個想到的肯定是 find 命令。但是,find 命令非常強大,想要把它的功能都介紹一遍,恐怕要寫好幾篇文章。

所以,這裏就偷個懶,介紹最基本的,根據文件名查找文件的方法。假如我們想搜索當前目錄(及其子目錄)下所有 .sh 文件,可以這樣搜索:

2. locate

locate 是另外一個根據文件名來搜索文件的命令。區別於 find 命令,locate 命令無需指定路徑,直接搜索即可。

這個命令不是直接去系統的各個角落搜索文件,而是在一個叫 mlocate.db 的數據庫下搜索。這個數據庫位於 /var/lib/mlocate/mlocate.db ,它包含了系統里所有文件的索引,並且會在每天早上的時候由 cron 工具自動更新一次。

正因為如此,locate 的搜索速度遠快於 find 命令,因為它直接在數據庫里檢索,速度自然更快。

locate 命令在找到文件之後,將直接显示該文件的絕對路徑,比如:

但是 locate 命令有個弊端,它無法搜索當天所創建的文件,因為它的數據庫一天只在早上更新一次。比如我現在創建一個新文件,locate 沒辦法搜索到:

為了解決這個問題,我們可以使用 updatedb 命令手動去更新它的數據庫:

$ sudo updadb

然後,我們就可以搜索到新文件了。

3. which

which 命令主要用來查找可執行文件的位置,它搜索的位置指定在 $PATH$MANPATH 環境變量下的值,默認情況下,which 命令將显示可執行文件的第一個存儲位置:

如果某個可執行文件存儲在多個位置,可以使用 -a 選項列出所有的位置。

如果你想一次性查找多個文件,可以直接跟在 which 命令後面即可。

4. whereis

whereis 命令會在系統默認安裝目錄(一般是有root權限時默認安裝的軟件)查找二進制文件、源碼、文檔中包含給定查詢關鍵詞的文件。(默認目錄有 /bin, /sbin, /usr/bin, /usr/lib, /usr/local/man等類似路徑)。

一般包含以下三部分內容:

  • 二進制文件的路徑
  • 二進制文件的源碼路徑
  • 對應 man 文件的路徑

比如我們現在搜索 ls 命令:

我們可以使用 -b 選項來只搜索可執行文件所在位置,使用 -B 選項指定搜索位置,使用 -f 選項列出文件的信息。

同樣地,我們可以使用 -s 限定只搜索源碼路徑,使用 -m 搜索 man page 路徑,使用 -s 指定搜索源代碼文件的路徑,使用 -M 指定搜索幫助文件的路徑。

公眾號:良許Linux

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

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

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

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

※回頭車貨運收費標準

因為我最近忙、所以我寫了它

一、事出有因

       1、上周工作原因項目的事情每天都很忙,周五下班和樂師兄下班的時候已經晚上11點了,然後和師兄吃了一個燒烤吃到了12點了(結果啥也沒吃,錢也花了挺多的。ps:程序員建議養生)扯遠了 ,主要是一周比較忙周六沒有進行我們學校的健康報備信息填寫。導致輔導員給我打了6個電話(現在我還是在實習中,所以還歸學校管)自己剛好在看網絡請求這一塊的東西,說干就干!!!

二、知其所以然

       1、我們學校的健康報備主要是將自己每天的信息填寫到學校的公眾號上面。打開頁面是這樣的。這個時候我們就要想一下我們是要做什麼了。首先我們健康報備的流程是=>打開學校公眾號=>輸入自己的學號點擊查詢=>然後輸入自己的正式情況=>點擊提交。

             

     三、反向分析

            1、做為程序員的我們首先要清楚我們要什麼,現在我們已經清楚了要做什麼了和步驟。現在就是用我們的程序模擬用戶進行正常的報備工作。首先我將報備鏈接從學校公眾號複製出來,然後使用瀏覽器訪問查看我們在進行報備的時候我們向瀏覽器發起了什麼和做了什麼。

            2、在左邊的是我們的頁面,右邊的是網頁請求的文件和信息,我們就一步一步的進行分析。這裏我們可以看到我們在訪問頁面的時候會生成一些信息__EVENTVALIDATION   、 __VIEWSTATEGENERATOR 我以前在長沙寫的也是ASPX頁面使用控件程序的時候也會生成一些這個,需要通過這些東西來獲取我們頁面填寫的信息所以這裏我們需要保留,因為我們等下需要輸入學號然後點擊查詢,不過不傳這些參數獲取不到我輸入的學號,這個是我嘗試過的哈哈。

             3、下面看到的是我輸入了自己的學號點擊查詢獲取到的信息,我們可以看到這裏使用的是formData進行傳遞到後台去的,也可以明顯的看到我填寫的信息了。然後進入到了填寫頁面。然後我們在查看頁面上面生成的東西。

              4、我們輸入完整的信息之後,點擊報備按鈕又會發生什麼呢?可以看到我們提交的formData信息,請求也成功了(今天我已經報備了,所以是這個提示)。現在整個流程我們已經清楚了,以及請求的參數。那就讓我們開始整活吧。

 四、開始動手

        1、廢話不多說直接創建一個.net core 的項目整活。我先寫了一個簡單的html頁面進行填寫學號信息,然後在寫一個定時任務每天晚上12點之後自動執行,健康報備信息。

public async static Task AsyncQuartz()
        {
            await Task.Run(async () =>
             {
                 //創建一個鍵值集合
                 NameValueCollection nameValue = new NameValueCollection {
                    //定時任務的序列類型是二進制的
                    { "quartz.serializer.type", "binary" }
                 };
                 //創建定時任務調度器工廠
                 StdSchedulerFactory factory = new StdSchedulerFactory(nameValue);
                 //獲取工廠中的調度器
                 IScheduler scheduler = await factory.GetScheduler();

                 //開啟調度器
                 await scheduler.Start();

                 //然後就是創建我們的任務
                 //給任務一個身份
                 //在進行建立
                 IJobDetail userServiceJob = JobBuilder.Create<HealthForJob>()
                                              .WithIdentity("UserServiceJob", "UserServiceJobGroup")
                                              .Build();

                 //任務有了創建觸發器
                 ITrigger userServiceTrigger = TriggerBuilder.Create()
                  .WithIdentity("userServiceTrigger", "userServiceTriggerGroup")
                  .StartNow()

                  //給定執行時間,然後在重複執行
                  .WithSimpleSchedule(x => x.WithIntervalInHours(6).RepeatForever())
                  .Build();

                 //將任務和觸發器進行綁定放入觸發器中

                 //單任務調用
                 await scheduler.ScheduleJob(userServiceJob, userServiceTrigger);
             });
        }

            2、首先我們需要模擬用戶向報備網頁發起請求這裏我使用的是HttpClient 對象發起請求,怕被攔截我還填了很多請求頭哈哈。但我們發起get請求的時候獲取的是一段長的html字符串。

            3、然後我們要使用一個神器進行html分析了。HtmlAgilityPack 它可以解析我們獲取的html字符串代碼

          4、我們創建一個HtmlDocument htmlDoc1 = new HtmlDocument(); 對象然後然後將我們獲取的html 對象放到 htmlDoc1.LoadHtml(strHtml);就可以解析成了正常的html了,也可以直接在頁面上面複製xpath結構,然後直接放進來就好了

                            htmlDoc1.LoadHtml(strHtml);
                            //這裏就是通過html結構尋找我們想要的節點信息
                            var liNodes1 = htmlDoc1.DocumentNode.SelectNodes("//div[@class='aspNetHidden']/input");

            5、這裏我們獲取到了html節點之後就可以進行正常取數據啦。

                6、這裏就開始我們的請求三大步了,直接模擬一個form表單請求將我們的數據傳遞就好了

 

using (HttpContent httpContent = new FormUrlEncodedContent(keyValuePairs))
                        {
                            httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
                            strHtml = httpClient.PostAsync("URL", httpContent).Result.Content.ReadAsStringAsync().Result;
                            if (!string.IsNullOrWhiteSpace(strHtml))
                            {
                                htmlDoc1.LoadHtml(strHtml);
                                var liNodes1 = htmlDoc1.DocumentNode.SelectNodes("//div[@class='aspNetHidden']/input");
                                keyValuePairs.Clear();
                                foreach (var item in liNodes1)
                                {
                                    var id = item.Attributes["id"].Value;
                                    var value = item.Attributes["value"].Value;
                                    if (!string.IsNullOrWhiteSpace(id) && !string.IsNullOrWhiteSpace(value))
                                    {
                                        keyValuePairs.Add(id, value);
                                    }
                                }
                            }
                        }

 

五、項目部署

        1、項目部署使用的是Docker +JenKins 實現自動化部署,現在我在公司也想慢慢推廣因為我們公司服務器權限管的比較嚴格,每次發布測試環境都需要找師兄發布,導致師兄很多時間都在幫我們發布項目。所以這個技術我覺得是很有必要在我們部門推廣。這個項目主要使用的了.net core 3.1 作為框架 Dapper作為數據訪問層,Quartz 定時任務 ,HtmlAgilityPack 進行Html結構分析,Docker 部署項目 ,JenKins 實現項目自動化部署。由於篇幅問題這些技術會在後面的文章分享出來。我自己也多研究一下避免誤人子弟。哈哈

六、個人說明

        1、以上就是我寫的全部流程,我們需要重複試錯,因為你要了解寫這個程序的同行的思路哈哈,我還看過一些網站是通過惰性加載信息,還有一些比較重要的信息會通過其他的方式傳遞,就是防止我們爬取,比如京東的商品價格使用Js請求的方式傳遞Jsonp請求,這個這個就需要我們多動手動倒騰了。重點說明一下這個只是自己學習使用的,對於學校健康報備我雙手支持。源碼就不分享了大家動起手來吧。

 

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

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案

協議生成器工具

前言

何為協議生成器?其實就是前後端同學在對協議的時候使用的工具,手動添加對應的內容,最後一鍵發布自己需要的任何與協議有關的內容。
有人會說,我直接寫proto文件用它的命令行也可以生成很多文件的。不過proto本身的能力,我工具都可以使用,因為本身工具就可以調用proto。下面開始介紹一下這款附帶源碼的工具
良心價格,買來不一定要用,但是你可以拿來學習這種思想;用什麼語言開並不重要,重要的還是思想;編程編的就是思想,就跟寫文章一樣。

介紹

  1. 文件功能
  2. 定義服務

    可能我門一款遊戲用到好幾個服務,比如登陸服務,大廳獲得道具服務,戰鬥服務。對於棋牌遊戲或者聯網對戰遊戲尤其如此。而這些服務器有的是長連接,有的是短鏈接,有的是proto格式,有的是json格式。在這個工具里都是可以設置的。

  3. 定義協議號

    我們用socket做遊戲的一般定義格式的時候都是協議號+數據長度+數據段。這個很正常,當然http也是可以這樣定義的。比如http://xxx.xxx.com:80/classname/functionname?xxx=cc&xx=xx
    ip+端口,這個跟socket是一樣的。端口之後和問號之前的就可以定義為協議號了,也就是資源路徑。這樣就可以長短鏈接使用同樣的處理方式。

  4. 定義模塊

    我個人喜歡將不同的功能分為不同的模塊。然後在模塊中定義消息。

  5. 定義消息格式

    比如這個商店模塊,在進入商店時需要給服務器發送獲取商品列表的消息。而服務器需要兩個字段。並設置了類型。而工具是支持註釋的,CNName就是了。有請求格式,自然也有返回格式,所以有GetProductInfoResult,並定義了返回的消息格式。

  6. 使用

    xxxHandler代表了一個請求處理。一個處理會有請求消息,響應消息。所以將剛才定義的兩個消息格式,設置到request和response中就可以了。

導出

xml目錄為項目配置文件,export為導出內容目錄

導出的文檔

導出proto的java類

使用lua腳本解析xml文件

結語

工具介紹就這些,希望對有需求的人提供一定的幫助。關鍵還是思想,結合我微店裡的網絡框架一起學習會更快速。
歡迎關注我的公眾號,獲取更多精彩內容。

歡迎掃碼關注公眾號《微笑遊戲》,瀏覽更多內容。

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

【其他文章推薦】

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

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

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

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

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

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