最個性最拉風!14-25萬你能買到的最騷的幾台SUV都在這_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

謳歌CDX指導價:22。98-30。98萬CDX的外觀設計很多人說丑,但是CDX是一台不怎麼上相的車,如果你真的貼近看了它的實車你就明白它的車身線條以及細節設計真的很騷氣,車身尺寸為4496*1840*1615mm,軸距2660mm,使用1。5T+8擋雙離合變速箱的動力組合,作為一台豪車CDX的氣場也是足夠的,CDX是一台適合年輕人的SUV這話一點都沒錯。

對於年輕人來說,喜歡明星最直接的理由就是顏值,就像最近十分流行的一句話:“你那麼美說什麼都對”,這確實是一個看臉的社會。

比如小編美美的日常寫照↓↓↓

而買車也一樣,汽車的顏值同樣也十分重要,有多少人買車最終因為顏值的問題選擇了一款性價比不那麼高的產品,抑或是因為那款車型長得丑而放棄了性價比不錯的車型。

對於許多年輕人來說買車十分重要的一個特點就是要騷氣,能夠契合自己的氣質,而現在百花齊放的汽車市場越來越多的SUV也更有個性了,比如下面這些選擇。

有人說它是拉高車身的昂克賽拉,也有人說它是拍扁了的CX-5,不過這都不重要,很大一部分最早認識CX-4都是因為CX-4帥氣的外觀設計,轎跑般的設計讓它行駛在街上的回頭率十分高,不過低矮的車身與大多數人預期的那種SUV該有的高高在上的感覺不同,

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

CX-4開着仍然很像一台轎車,而且在空間上也需要作出一定的妥協,不過這麼帥,總得付出點代價吧。

科雷嘉的外觀保持了法國設計的浪漫情調和獨特性,也是屬於很騷氣的外觀,4503*1836*1610mm的車身尺寸足夠大,不過2645mm的軸距就顯得不那麼寬裕了,而且全系目前只有2.0L+CVT的動力組合,未免顯得有些單調了。

CDX的外觀設計很多人說丑,但是CDX是一台不怎麼上相的車,如果你真的貼近看了它的實車你就明白它的車身線條以及細節設計真的很騷氣,車身尺寸為4496*1840*1615mm,軸距2660mm,使用1.5T+8擋雙離合變速箱的動力組合,作為一台豪車CDX的氣場也是足夠的,CDX是一台適合年輕人的SUV這話一點都沒錯。

作為韓系車的顏值擔當,KX5的外觀設計可以說十分驚艷,冰塊式的霧燈設計十分獨特,有點像手電筒的感覺,而大燈造型和位置有些神似卡宴,不過據說它的回頭率比卡宴還要高哦。

吉普自由俠定位於小型SUV,也是吉普目前定位最低價格最便宜的SUV車型,不過這一點也不影響它成為一台很有個性很騷氣的SUV車型。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

盡“扇”盡美風自來

2{icon} {views}

王明德迎亮看一看扇骨,手一捋,依次推開;拿起刷子,估量一下,蘸着膠水往扇骨上刷起來。雪白扇面緊貼着扇骨,發出輕快的聲音,靈巧的雙手在竹與紙間穿梭,動作絲毫不拖泥帶水。

竹深樹密蟲鳴處,時有微涼不是風。竹,自古被譽為君子。在王明德看來,“它沒被做成筷子和籃子,而是在我手中變成了有靈氣的竹扇。”

一把竹扇,看上去簡單,做起來卻很麻煩。“傳統的竹扇製作有67道工序。”71歲的王明德一邊拿刮刀打磨扇骨,一邊介紹。

在王明德看來,選料是最重要的環節。“我們一般要用生長周期在6至8年間的竹子,竹節少,形體直,才算標準。”而這竹子,鋸斷竹根后,就不能落地了,要靠人力一根一節從高上山背下來。究其原因,不過是竹子落地會碰壞竹青,這樣做出的扇骨或有黑斑,不符合要求。選好料后,通過蒸煮、晒乾使竹骨定型,再將之打磨成扇骨,並賦予扇面色彩,二者組合,就是一把精巧的竹扇。

作為竹扇的省級非遺傳承人,王明德的竹扇之路,並非一帆風順。“我雖然喜歡做扇子,但一開始並沒有用這個來謀生,而是當作一種愛好。”直到1989年,他才把這門手藝撿起來,開起了竹扇廠。

建廠之初,王明德就接到了日本一筆大單:生產七八萬白竹片,用作日本馬路上的護欄和家裡的裝修材料。當王明德趕工一個多月完成了客戶需要的貨物時,對方卻反悔了。“他們說我的產品質量不符合要求。我當時把全部家當都投進去了,結果賣不出去。”

王明德最終找到了另一家日本公司,承諾對方半個月內做好一萬片未加工的扇骨,免費打樣供對方參考,若是滿意,就簽合同。萬片扇骨,數萬斤毛竹,零星幾個工人,在高溫的竹扇廠中熬了半個月,王明德終於將成品打磨完成,並得到了對方認可。“當時我們幾乎沒怎麼閉眼,甚至還自造了設備。”王明德指着廠中打磨拋光扇骨的機器說,“那會兒就是木頭做的設備,很簡陋,卻陪着我們度過了最難的歲月。”

如今,26歲的王亞凌也傳承了爺爺的手藝,成為新的省級非遺傳承人。自2019年3月起,她每周都會去東亭小學兩次,給感興趣的孩子們介紹竹扇知識,並手把手教他們製作竹扇(見圖)。“其實爺爺也想來,但他畢竟年紀大了,所以就由我負責。”

細雨如絲,從屋檐上滴落。身着旗袍的王亞凌細心地教5年級的陳思涵搭面:“左手握緊,右手均勻展開,就這樣,慢慢來……”

做了一輩子竹扇的王明德也沒停下來。他又在家裡搗鼓掛扇了。他那雙布滿老繭的手拿起了刮刀,和手中青色的毛竹映襯着,似已融為一體。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

“線上音樂會”是情懷也是未來

9{icon} {views}

古琴名家李鳳雲正在演奏。

疫情發生以來,為減少人員聚集,各大劇場相繼取消了近期活動,中山公園音樂堂也不例外。這两天,音樂堂宣布將繼續取消三月份演出。不能相聚在劇場中的這段日子,音樂卻仍然沒有遠離熱愛它的人們。打開中山公園音樂堂的微信公眾號,管風琴莊重肅穆,琴簫意境悠遠,吉他浪漫輕柔,十幾期公益“線上音樂會”風格各異,卻無不觸動人心。把“演出”帶到線上,既是藝術家的情懷所系,也是劇場未來發展的機遇所在。

演出暫時停擺,並不意味着劇場能夠放假歇業。1月24日,大年三十當天,中山公園音樂堂宣布取消春節期間的演出,此後,二月份和三月份的演出又相繼取消。沒有了來來往往的觀眾,劇場遠比平時冷清,但該做的工作還有許多。“一個演出場所,設備設施需要維護,也需要安全方面的日常巡視。”在接受電話採訪前,北京保利紫禁城劇院管理有限公司、中山公園音樂堂總經理徐堅剛剛到劇場里轉了一圈。

諮詢電話旁也有工作人員值班。每天上午九點到下午五點,總會有幾個電話打來。為了盡可能地避免人員接觸,讓觀眾安心地待在家裡,幾輪退票全部通過線上進行,具體的操作方法已經寫在了微信公眾號的相關推送里,但因為涉及的演出場次眾多,購票方式不一,還是有觀眾更希望通過電話了解詳情。

“我們一直都在關注疫情的發展。”疫情暴發后,所有人都從新聞和數據中預感到,這次疫情不會很快結束,“總不能一直等下去吧?”劇場不能來了,但網絡沒斷,於是音樂堂從現有的實況錄像中精心挑選了一些效果不錯的視頻,通過微信公眾號免費分享給樂迷。

2月8日,元宵佳節,去年4月21日音樂堂重張二十周年慶典音樂會的上半場作為第一期“線上音樂會”推出,在《康定情歌》《在那遙遠的地方》等曲目的動人旋律里,這個特殊的元宵節多了幾分喜氣。接下來,胡琴名家宋飛、琵琶名家吳玉霞、鋼琴名家盛原、古琴名家李鳳雲等藝術家的演奏視頻陸續上線,每一張面孔都是這裏的老朋友,觀眾們熟悉的那個音樂堂又“回來”了。

每條“線上音樂會”的推送,都有這樣一句話:“本系列視頻均為藝術家免費授權。”在聽到音樂堂的提議后,沒有推辭和猶豫,出鏡的藝術家們很快響應,“所有人都在想,自己能做些什麼。”授權視頻的同時,藝術家們還送上了最真摯的寄語:著名女高音歌唱家張立萍就在武漢出生長大,一句“身為湖北人,心繫在武漢”,寥寥十字,盡訴思念和牽挂;青年豎琴演奏家孫詩萌曾多次在武漢琴台音樂廳演出,那裡的觀眾“熱情而專業”。她用一首誕生在湖北的《洪湖水浪打浪》遙寄祝福,“就像這首歌中所表達的,戰鬥終會勝利,祥和安寧終會回歸。盼望所有醫護人員平安,我們攜手共克時艱,盼望冬去春來!”

這次的疫情,總是不免讓人聯想起2003年的“非典”。那一年,音樂堂也經歷過與現在相似的情況。

徐堅一直記得,春天到了,音樂堂所在的中山公園鮮花盛開,但偌大的公園裡空空蕩蕩,幾乎不見人影,音樂堂取消了全部演出,直到暑假前後才慢慢恢復。“那個時候,能做的只有等待。”徐堅回憶。網絡讓一切變得與從前不同,“大家多了一種方式,能互相保持溝通,表達惦念。”也正是得益於網絡,儘管劇場暫時關閉,觀眾仍然可以從線上的“演出”中尋找藝術帶來的慰藉。

像中山公園音樂堂一樣,把演出、藝術普及等內容轉移到線上的劇場還有很多。經此一“疫”,對於“實體”劇場來說,精良的演出實況“囤貨”、開拓線上傳播的重要性變得越發不言而喻,國內的劇場藝術普及尚在起步階段,再加上疫情的影響,這段時間,線上“演出”多是免費的公益之舉,而在古典藝術耕耘更深的歐美地區,許多類似的視頻都需付費。維也納國家歌劇院数字發展部部長克里斯托弗·魏道爾曾說,他希望藉助付費,向觀眾傳遞“藝術有價”的理念,“沒有哪座劇院指望藉此來增加經濟收益,但這些東西一定是有價值的,你不需要付多少錢,但你需要付錢。”無論版權還是藝術家和幕後工作人員的努力,付費都代表着一種尊重。(記者 高倩)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家公司費用怎麼算?

故宮博物院—— 数字展生機 文化添活力

5{icon} {views}

如今,觀眾在家便可逛故宮、看展覽、賞文物、學歷史。走在数字博物館建設前列的“数字故宮”,以越來越開放的姿態,讓古老的故宮與時代相接,讓更多的觀眾與文化相遇。正如故宮博物院院長王旭東所說,願5000年的中華文明、600年的紫禁城,通過数字故宮,走入觀眾心田,讓其承載的中華優秀傳統文化,在人們心中種下一粒種子,並生根、發芽,築牢每一位中國人的文化自信。

故宮博物院首先為延遲開學的孩子們送上了一門公開課:該院和中信出版集團聯合推出《我要去故宮》少兒讀本和同名公益視頻課,以新穎的形式、有趣的內容,為小朋友揭開紫禁城的奧秘,讓他們足不出戶就能“雲遊故宮”。

說到“雲遊故宮”,打開故宮博物院官網和官方微信便能隨時隨地來一場“深度游”。進入以高清影像記錄故宮各個院落的“全景故宮”欄目,全部開放區域以及養心殿、重華宮等暫未開放區域的外部空間和內部空間可盡收眼底;同時觀眾可以跨越時空,欣賞故宮一年四季之美景。通過“V故宮”,可以身臨其境般地深度探訪頗具人氣的養心殿、虛擬修繕后的“水晶宮”靈沼軒、乾隆“秘密花園”中的倦勤齋等“神秘”宮殿,在沉浸式互動體驗中多層次解析皇家生活以及建築背後蘊含的歷史文化。

故宮博物院擁有超過186萬件/套藏品。為了進一步活化典藏,以“小”空間呈現“大”庫藏,故宮博物院利用網絡平台推出“故宮名畫記”“数字文物庫”“数字多寶閣”,三者各有側重。“故宮名畫記”現收錄歷代名畫334幅,通過超高清数字影像無極縮放,《清明上河圖》街邊商販的表情、《千里江山圖》山間亭台的構造等,一覽無餘,纖毫畢現;與之相關的論文資料、研究成果等內容也一應俱全,集審美與知識於一體。2019年建成的“数字文物庫”,一次性推出故宮博物院藏二十五大類文物的5萬餘張高清影像,滿足公眾博古賞析、學習研究之需求。“数字多寶閣”目前上線金銀器、玉石器、銅器等十二大類共200餘件三維文物,高精度全方位立體式地展示文物的細節和全貌,觀眾輕輕滑動鼠標便能零距離“觸摸”文物。

近期,故宮博物院官網還推出虛擬展覽——《淳化閣帖》版本展等。《淳化閣帖》版本複雜。該展彙集故宮博物院藏品,以宋刻《淳化閣帖》、明刻《淳化閣帖》和清刻《淳化閣帖》三個部分高清展示各版本細節,方便觀眾進行直觀對比欣賞。同時,為讓觀眾有機會“重回展廳”,“故宮展覽”APP集合“賀歲迎祥”“須彌福壽”等2015年以來推出的76個主題各異的展覽,觀眾可在展廳全景中虛擬漫遊,全方位了解展覽、展品信息,讓展覽真正實現“不落幕”。

除此以外,故宮博物院官網推出的“視聽館”,使觀眾可以聆聽故宮博物院研究人員對古代名畫的解析,聆聽中國傳統音樂以及現代年輕人用音樂詮釋古代名畫中的故事及意蘊。“文創”欄目下的“故宮壁紙”,將古代精品文物設計成可供下載的電腦和手機壁紙;“故宮回聲”則以連載漫畫的形式,呈現了抗戰時期故宮國寶南遷及西遷的故事……可以預見,隨着時代發展,故宮博物院的数字體驗內容和層次將不斷豐富。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

※推薦台中搬家公司優質服務,可到府估價

南科大研發護目鏡防霧濕巾 60萬片已抵一線

1{icon} {views}

本報訊(記者 匡小穎)一線醫護人員長時間佩戴口罩、護目鏡,護目鏡上滿是霧氣,影響工作效率,又很難受。近日,南方科技大學副教授孫大陟團隊自主研發出防霧新材料——防霧消毒濕巾和防霧酒精噴劑。用濕巾擦拭過的護目鏡,防霧效果可持續24小時。第一批產品經試用效果較好,團隊迅速擴大產能,5天內生產出60萬片防霧酒精濕巾和2萬瓶防霧酒精噴劑,全力支援武漢。

2月26日,在南方科技大學校園內一個簡短的捐贈交接儀式后,載着60萬片防霧酒精濕巾和2萬瓶防霧酒精噴劑的貨車出發,馳援湖北武漢。

這批濕巾和噴劑是一批防霧新材料,由南科大材料科學與工程系副教授孫大陟和南科大首屆本科畢業生張至共同發起創立的深圳南科新材科技有限公司,以及孫大陟課題組學生創業團隊共同緊急研發趕製。

張至對北京青年報記者介紹,護目鏡起霧,是因水蒸氣在鏡片等表面遇冷液化形成了小水滴。光線產生散射,造成視線模糊不清。他們團隊研發的濕巾加入了一種納米親水材料,濕巾擦拭后,能在鏡片等表面形成一層持久的透明親水保護膜。這層保護膜會降低水滴表面張力,使小水滴形成水膜,大大降低光線被散射的可能性,從而消除霧氣。而且團隊在溶劑中加入了75%酒精,讓濕巾又有了消毒效果。張至說,防霧加消毒二合一的效果,是目前市面上的產品不具備的。張至說,擦拭後防霧效果可保持至少24小時。 理論上,一片濕巾可以擦一到兩個護目鏡,那這次捐贈的60萬片濕巾可以擦60萬個護目鏡。這還不包括那2萬瓶防霧消毒噴霧。

張至介紹,研發成功新材料后,第一批產品做出100罐濕巾,其中50罐捐贈給了南科大第二附屬醫院(深圳市第三人民醫院)。醫護人員對第一批產品反饋很好。所以,團隊決定擴大產能,支援武漢。濕巾的原材料是無紡布,無紡布也是口罩的原材料,所以非常緊缺。在聯繫多家單位后,最終從東北緊急採購了無紡布,並空運到深圳。學校各部門抽調員工、課題組成員增援團隊,當了幾天的工人。最終他們用不到五天的時間生產出1萬桶濕巾,2萬瓶噴劑。

2月27日晚,這批物資已被送達武漢抗疫一線醫院。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

這輛號稱快過邁凱倫的超跑 終於要發布了!

6{icon} {views}

這個陣容相當於中國的半個互聯網都投了蔚來汽車。與此同時,業界發出了一些質疑之聲:搞互聯網的人會造出什麼樣的車。有意思的是,李斌極少回應,蔚來汽車至今也沒舉辦過哪怕一場新聞發布會。(蔚來汽車聖何塞辦公室)(蔚來汽車慕尼黑辦公室)(蔚來汽車上海辦公室)(蔚來汽車南京工廠)而有跡可循的事實是,在短短兩年間,這家新創車企已先後在美國聖何塞、德國慕尼黑、英國倫敦和中國上海、北京、香港、南京、合肥等12地設立了研發、設計、生產和商務機構,全球僱員達2000餘人,來自近40個國家和地區。

對大多數人來說,蔚來汽車是熟悉又陌生的存在。

熟悉的是它的創始人——李斌,一手帶領易車成為中國第一家在海外上市的汽車互聯網公司。易車之後,他創辦了蔚來汽車。

陌生的是迄今為止,除了幾張照片、幾條被瘋狂轉發的微博外,沒有任何官方對蔚來汽車旗下有關車型的回應或宣傳。我們所知道的,就是蔚來汽車做出了一輛電動超跑,它很厲害,可與邁凱倫等頂級跑車抗衡,僅此而已。

“哥不在江湖,但江湖裡總有哥的傳說”。在競爭如此激烈的汽車界,在大家都在推崇“品牌營銷”理念的市場環境中,蔚來汽車顯得太低調了。如果要列舉一份至今沒有舉辦過發布會的新創車企名單,“蔚來汽車”肯定不會缺席。為何蔚來反而“低調做事”?

因為他們曾公開表示,“一旦我們舉辦發布會,那就是要發布真正可以使用、可以跑的車了。”

今年10月14日,英國知名超跑博主Shemee150在社交應用Instagram上曝光了一組蔚來汽車純電動超跑的賽道測試照。

邁凱倫p1看到這兒消息的時候也懵逼了,直呼:“what do we think 我們該怎麼看”。

對此蔚來汽車官方遲遲沒有回應,直到前幾天官網突然發布了一條公告:“11月21日,蔚來汽車將於倫敦舉行全球發布會,正式發布新品牌並推出限量版電動超級跑車。”

這家異常低調神秘的新創車企,終於要開發布會了。

如果仔細推敲,蔚來的這款超跑,是目前公開報道中第一台脫離了ppT、非概念、能在賽道上飛馳的實體電動跑車。有傳言這款超跑前幾天在德國紐博格林北環進行的賽道速度測試中成功刷新世界紀錄,成為該賽道上速度最快的電動超跑。

回顧“蔚來汽車”的發展之路

創辦蔚來汽車前,在接受許多媒體採訪時,李斌都表達了一個相似的觀點。他發現在傳統的汽車公司架構中,企業與用戶交流的方式以及產業鏈與汽車用戶之間的互動平台無法滿足移動互聯網時代用戶對汽車品牌的全方位服務需求。他開始萌生了要重新定義汽車的用戶體驗,創造一個真正為用戶考慮的“用戶企業”的想法。

(李斌內部分享)

真正讓他把這個想法落到實處的,多少和北京近幾年嚴重的霧霾有關。蔚來汽車官方微信發布的一篇文章显示,李斌在一次內部講話中談及他創辦蔚來的初衷時直言:“在霧霾天空下生活是很絕望的,會讓人覺得人生非常沒有意義。趁着自己還清醒的時候,我們應該做一點事情。”

於是2014年11月,蔚來汽車誕生。

第一次聽到“蔚來汽車”,很多人會誤以為是“未來汽車”,但據稱蔚來汽車的寓意應該理解為“讓蔚藍的天空回到我們身邊”。

蔚來汽車的投資背景堪稱豪華。公開報道显示,蔚來汽車的創始投資方包括騰訊、易車創始人李斌、汽車之家創始人李想、京東創始人劉強東以及順為資本(雷軍創辦)、高瓴資本、紅杉資本和愉悅資本。今年年中公布的新一輪投資機構名單中,淡馬錫、聯想、TpG和厚朴也赫然在列。這個陣容相當於中國的半個互聯網都投了蔚來汽車。

與此同時,業界發出了一些質疑之聲:搞互聯網的人會造出什麼樣的車?有意思的是,李斌極少回應,蔚來汽車至今也沒舉辦過哪怕一場新聞發布會。

(蔚來汽車聖何塞辦公室)

(蔚來汽車慕尼黑辦公室)

(蔚來汽車上海辦公室)

(蔚來汽車南京工廠)

而有跡可循的事實是,在短短兩年間,這家新創車企已先後在美國聖何塞、德國慕尼黑、英國倫敦和中國上海、北京、香港、南京、合肥等12地設立了研發、設計、生產和商務機構,全球僱員達2000餘人,來自近40個國家和地區。

(李斌與伍絲麗)

去年12月,蔚來汽車挖來了“硅谷女王”伍絲麗,擔任公司首席發展官兼北美公司CEO。這位前思科首席技術和戰略官、摩托羅拉首席技術官的履新,引發了硅谷不小震動。

默默完成了產業鏈的布局,最可怕的不是對手太強大,而是強大的對手太低調。

“蔚來汽車”的速度

當不少新創車企在“ppT造車”的道路上越走越遠時,蔚來汽車已將電能技術運用到自己的電動方程式賽車上。

早在2014年,蔚來汽車就參加了第一屆由國際汽聯主辦的“電動方程式世界錦標賽”(Formula E,簡稱“FE”),這項賽事可以簡單理解為“F1的電動版”,是全球第一項依靠全電力驅動的賽車比賽。

(FE 蔚來賽車)

2015年FE第一賽季結束時,蔚來車隊有些出人意料地奪得該項賽事史上首個年度車手總冠軍。今年已是蔚來車隊連續第三年參加該項賽事。

“很多人誤認為我們只是冠名贊助商,這是一個很大的誤解。這就是蔚來汽車自己的車隊,賽車和車手都是我們自己的,而且我們擁有賽車的核心技術。”蔚來汽車相關消息人士透露。

而在2016年,這家低調的車企所取得的進展則有些令人吃驚。

今年4月,蔚來汽車悄然發布了兩條新聞:一是與江淮汽車達成戰略合作協議,雙方將在電動汽車領域進行全面戰略合作,整體合作規模達到100億元;二是當月底,蔚來汽車總投資30億元人民幣的高性能電機及電控系統生產基地在南京經濟技術開發區落成。

半年後的10月28日,一條公眾號消息未讀提醒推送到了很多人的手機屏幕上:“蔚來汽車首批電驅動總成在南京下線”。

11月21日,蔚來汽車第一款電動超跑的神秘面紗終於要揭開。

“蔚來汽車”未來要重新定義汽車?

在不少論壇現場,李斌都會被主辦方有意無意地安排與滴滴的高層同台。

“汽車產業現在得了一種‘互聯網焦慮症’的病,最焦慮的東西其實就是前面柳青提到的他們的目標:將來大家不用買車了!”今年6月的中國互聯網大會開幕論壇上,李斌在國家發改委、工信部、國家互聯網信息辦的領導面前慷慨陳詞。

他在現場舉了兩個很有說服力的例子,美國灣區和中國北京的汽車銷量,都沒有因為優步、滴滴的風行而減少,銷量反而大幅度增加。

“汽車用戶的購車需求並沒有因為移動出行軟件的興起而下降。之所以出現這樣的一個跟想象不一樣的判斷,主要是我們大部分時候簡單地把出行等同於汽車!”李斌認為,汽車行業最大的問題是把汽車當成一個交通工具,“如果你把手機只當成一個通話的工具,那就永遠沒有智能手機的出現。所以重新定義汽車的用戶體驗,才能重新定義汽車。”本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

這SUV空間逆天動力超猛 銷量王的昂科威都怕了嗎?

2{icon} {views}

在副駕駛座前方的大塊大理石紋路木板更顯高貴。冠道的內飾則是樸實無華,各方面都按部就班,難以帶來什麼越級享受。採用按鈕式擋桿,令擋桿下方可抽空放東西。由此可見,冠道的設計都是偏向實用為主。空間對比可以看得出,冠道的後座空間是如此的變態,就算乘客在後排葛優躺,恐怕也很難頂到前排。

前言冠道是本田最新推出的5座中型SUV,意欲沖高來撼動別克昂科威在這個領域的王者地位。可是,昂科威亦絕非等閑之輩,馬上降價來迎戰強敵。究竟兩大高手誰更勝一籌?下面我就列舉兩個指導價相近的車型來對比。

昂科威 2017款 28T 四驅精英型

指導價:26.99萬

優惠幅度:兩萬元左右

冠道 2017款 370TURBO 兩驅精英版

指導價:26.98萬

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家公司費用怎麼算?

沒天理!回頭率爆表的總統級座駕 竟然比寶馬5系還便宜?

1{icon} {views}

0T兩款發動機,匹配6AT變速箱,高配車型有四驅系統搭配,整體動力輸出數值十分高,尤其是3。0T車型的參數十分恐怖。就目前的信息來看,預售的三款車型配置都十分高,可變懸挂/胎壓監測/一鍵啟動/電動後備廂/前後雷達/真皮座椅/主動剎車系統都是標配。

外觀

霸氣敦實

外觀上林肯新大陸的設計和上次咱們試駕過的林肯MKZ有很大的相似度,除了車尾之外,其它地方設計基本相同,不過在車門把手上大陸還是十分有標誌性,由於車身尺寸碩大,加上碩大的中網和犀利的大燈,林肯大陸的氣場十分強大,看上去有幾分大型豪華轎車的感覺。

內飾

用料奢華

內飾上林肯大陸的用料十分值得讚歎,雖然在中控台的造型設計上不算多麼出彩,和德系車的車廂相比設計感欠缺,但是細膩的皮革到處都是,配置也十分豐富,大陸的內飾也值得讚歎,在MKZ上那個十分有福特味道的儀錶盤並沒有出現在大陸上,大陸使用一塊液晶儀錶盤,显示信息更加豐富,效果也更加棒。

空間

足夠寬敞

由於大陸的尺寸十分龐大,軸距也接近3米,所以大陸的內部空間還是十分有保障的,和同價位的加長對手相比也絲毫不遜色,後備箱空間十分規整但是寬度比較窄,實用性受到一定的影響。

動力

數據強大

動力上林肯大陸使用了2.0T/3.0T兩款發動機,匹配6AT變速箱,高配車型有四驅系統搭配,整體動力輸出數值十分高,尤其是3.0T車型的參數十分恐怖。

就目前的信息來看,預售的三款車型配置都十分高,可變懸挂/胎壓監測/一鍵啟動/電動後備廂/前後雷達/真皮座椅/主動剎車系統都是標配。結合42萬的預售價來看相比德系對手優勢不小。林肯大陸有着龐大的尺寸,精緻豪華的內飾氛圍和寬敞的空間,和德系對手相比它的價格更有誘惑力,配置更加豐富,唯一需要擔心的就是品牌了,還是那句話,人家不認識林肯標啊!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

※推薦台中搬家公司優質服務,可到府估價

這款歐系SUV品質好 而且20萬內配置完虐日產奇駿?

1{icon} {views}

內飾設計兩台車的內飾設計都屬於乏善可陳,沒有什麼太大的亮點。不過,奇駿烤黑鋼琴漆的中控面板會更顯高級,而科雷嘉的設計則偏向於簡潔,甚至略顯可愛。乘坐空間與感受奇駿的後排奇駿的軸距2706mm,而科雷嘉的軸距則為2645mm,這就有了61mm的差距。

科雷嘉與逍客同為雷諾-日產聯盟CMF的產物,但是科雷嘉的價格已經越級去挑戰了奇駿的售價區間,那麼下面編者我就分析一下科雷嘉可否有能力挑戰奇駿的地位。首先,為了公平起見,我會拿科雷嘉的2.0L 兩驅尊貴版與奇駿的2.0L CVT舒適版 2WD來作對比,兩者售價均為19.68萬,而終端優惠都在2萬元左右,可能奇駿還能有更大一點點的優惠。

外觀設計

科雷嘉的前臉看上去很有流線感,而且很妖嬈,充滿法式浪漫。大燈處,兩個半矩形框分別把遠近光燈半包圍住,盡顯銳利。尾部則略為簡潔,僅僅是尾燈處向側面作了延伸。

奇駿的前臉用了倒梯形的設計,各處有棱有角,既具時尚,也不失陽剛之氣。整個側面相當簡練,C柱往後線條開始上揚。

動力總成

雖然兩者的發動機型號不一樣,但是各種參數均高度一致,最大輸出150馬力和200牛米。同樣地,兩款車都搭載了CVT變速箱,不過開起來就略有差異了。

科雷嘉給人的感覺是不緊不慢,踩下油門,轉速先升上去,然後車速再慢慢攀升。雖然是CVT變速箱,但模擬出了7個擋位,因此,在換擋時,能感受到變速箱的節奏感。

奇駿則與科雷嘉調性相反,油門響應很快,市區中開起來相當輕快。然而,一旦開快以後再加速,則會有多數小排量發動機存在的問題,就是光吼不走。至於CVT的匹配很好,開起來也平順,動力銜接流暢。

內飾設計

兩台車的內飾設計都屬於乏善可陳,沒有什麼太大的亮點。不過,奇駿烤黑鋼琴漆的中控面板會更顯高級,而科雷嘉的設計則偏向於簡潔,甚至略顯可愛。

乘坐空間與感受

奇駿的後排

奇駿的軸距2706mm,而科雷嘉的軸距則為2645mm,這就有了61mm的差距。進到車廂內的後排會發現奇駿的腿部空間相當富餘,不過座椅太大,包裹性略顯不足,但舒適性可以給高分,很柔軟。值得表揚的一點就是配有後座出風口。

科雷嘉的後排

科雷嘉的後排空間就不是那麼樂觀了,腿部空間尚還可以,然而座椅靠背較直,填充料較硬大大影響了乘坐舒適性。還有一點就是缺乏後座出風口,這就不太對得起次頂配這個配置了。

配置對比

奇駿用的是腳剎,而科雷嘉用的是电子駐車。而且,科雷嘉的18寸輪胎從視覺感受與抓地力上要優於奇駿的17寸輪胎,不過油耗上會略有吃虧。除此以外,科雷嘉比奇駿多出了前後排頭部氣囊和車頂行李架。其餘的配置差異,可以看下錶對比。

油耗及保養費用

鑒於動力總成上的一致性,同時整備質量也只差了十幾公斤。因此,兩台車均做出了百公里綜合油耗8.9L的好成績。

在保養費用的對比上,奇駿以6萬公里總保養費用5225元勝出,而科雷嘉的費用為6562元。奇駿送兩次保養,同時變速箱油終身免維護,而火花塞每10萬公里更換一次,這些都是它的保養費用低於科雷嘉的原因。

編者總結:

從以上對比不難看出,科雷嘉對比奇駿優勝在更時尚的外觀,以及一些配置。但是在駕駛和乘坐感受上都要遜於奇駿。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(三)

1{icon} {views}

系列文章

  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 開發博客項目 – 博客接口實戰篇(二)

上篇文章完成了分類和標籤頁面相關的共6個接口,本篇繼續來寫博客增刪改查API的業務。

供前端查詢用的接口還剩下一個,這裏先補上。

友鏈列表

分析:返回標題和對應的鏈接即可,傳輸對象FriendLinkDto.cs

//FriendLinkDto.cs
namespace Meowv.Blog.Application.Contracts.Blog
{
    public class FriendLinkDto
    {
        /// <summary>
        /// 標題
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 鏈接
        /// </summary>
        public string LinkUrl { get; set; }
    }
}

添加查詢友鏈列表接口和緩存接口。

//IBlogService.FriendLink.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Blog
{
    public partial interface IBlogService
    {
        /// <summary>
        /// 查詢友鏈列表
        /// </summary>
        /// <returns></returns>
        Task<ServiceResult<IEnumerable<FriendLinkDto>>> QueryFriendLinksAsync();
    }
}
//IBlogCacheService.FriendLink.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Caching.Blog
{
    public partial interface IBlogCacheService
    {
        /// <summary>
        /// 查詢友鏈列表
        /// </summary>
        /// <param name="factory"></param>
        /// <returns></returns>
        Task<ServiceResult<IEnumerable<FriendLinkDto>>> QueryFriendLinksAsync(Func<Task<ServiceResult<IEnumerable<FriendLinkDto>>>> factory);
    }
}

接下來,實現他們。

//BlogCacheService.FriendLink.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Meowv.Blog.Domain.Shared.MeowvBlogConsts;

namespace Meowv.Blog.Application.Caching.Blog.Impl
{
    public partial class BlogCacheService
    {
        private const string KEY_QueryFriendLinks = "Blog:FriendLink:QueryFriendLinks";

        /// <summary>
        /// 查詢友鏈列表
        /// </summary>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task<ServiceResult<IEnumerable<FriendLinkDto>>> QueryFriendLinksAsync(Func<Task<ServiceResult<IEnumerable<FriendLinkDto>>>> factory)
        {
            return await Cache.GetOrAddAsync(KEY_QueryFriendLinks, factory, CacheStrategy.ONE_DAY);
        }
    }
}
//BlogService.FriendLink.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.Domain.Blog;
using Meowv.Blog.ToolKits.Base;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Blog.Impl
{
    public partial class BlogService
    {
        /// <summary>
        /// 查詢友鏈列表
        /// </summary>
        /// <returns></returns>
        public async Task<ServiceResult<IEnumerable<FriendLinkDto>>> QueryFriendLinksAsync()
        {
            return await _blogCacheService.QueryFriendLinksAsync(async () =>
            {
                var result = new ServiceResult<IEnumerable<FriendLinkDto>>();

                var friendLinks = await _friendLinksRepository.GetListAsync();
                var list = ObjectMapper.Map<IEnumerable<FriendLink>, IEnumerable<FriendLinkDto>>(friendLinks);

                result.IsSuccess(list);
                return result;
            });
        }
    }
}

直接查詢所有的友鏈數據,這裏使用前面講到的AutoMapper處理對象映射,將IEnumerable<FriendLink>轉換為IEnumerable<FriendLinkDto>

MeowvBlogAutoMapperProfile.cs中添加一條配置:CreateMap<FriendLink, FriendLinkDto>();,在BlogController中添加API。

/// <summary>
/// 查詢友鏈列表
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("friendlinks")]
public async Task<ServiceResult<IEnumerable<FriendLinkDto>>> QueryFriendLinksAsync()
{
    return await _blogService.QueryFriendLinksAsync();
}

編譯運行,打開查詢友鏈的API,此時沒數據,手動添加幾條數據進去再試試吧。

文章管理

後台文章管理包含:文章列表、新增、更新、刪除文章,接下來依次完成這些接口。

文章列表

這裏的文章列表和前台的文章列表差不多,就是多了一個Id,以供編輯和刪除使用,所以可以新建一個模型類QueryPostForAdminDto繼承QueryPostDto,添加PostBriefForAdminDto繼承PostBriefDto同時新增一個字段主鍵Id。

QueryPostForAdminDto中隱藏基類成員Posts,使用新的接收類型:IEnumerable<PostBriefForAdminDto>

//PostBriefForAdminDto.cs
namespace Meowv.Blog.Application.Contracts.Blog
{
    public class PostBriefForAdminDto : PostBriefDto
    {
        /// <summary>
        /// 主鍵
        /// </summary>
        public int Id { get; set; }
    }
}
//QueryPostForAdminDto.cs
using System.Collections.Generic;

namespace Meowv.Blog.Application.Contracts.Blog
{
    public class QueryPostForAdminDto : QueryPostDto
    {
        /// <summary>
        /// Posts
        /// </summary>
        public new IEnumerable<PostBriefForAdminDto> Posts { get; set; }
    }
}

添加分頁查詢文章列表的接口:QueryPostsForAdminAsync(),關於後台的一些接口就不添加緩存了。

//IBlogService.Admin.cs
using Meowv.Blog.Application.Contracts;
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Blog
{
    public partial interface IBlogService
    {
        /// <summary>
        /// 分頁查詢文章列表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        Task<ServiceResult<PagedList<QueryPostForAdminDto>>> QueryPostsForAdminAsync(PagingInput input);
    }
}

然後實現這個接口。

//BlogService.Admin.cs
using Meowv.Blog.Application.Contracts;
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using Meowv.Blog.ToolKits.Extensions;
using System.Linq;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Blog.Impl
{
    public partial class BlogService
    {
        /// <summary>
        /// 分頁查詢文章列表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<ServiceResult<PagedList<QueryPostForAdminDto>>> QueryPostsForAdminAsync(PagingInput input)
        {
            var result = new ServiceResult<PagedList<QueryPostForAdminDto>>();

            var count = await _postRepository.GetCountAsync();

            var list = _postRepository.OrderByDescending(x => x.CreationTime)
                                      .PageByIndex(input.Page, input.Limit)
                                      .Select(x => new PostBriefForAdminDto
                                      {
                                          Id = x.Id,
                                          Title = x.Title,
                                          Url = x.Url,
                                          Year = x.CreationTime.Year,
                                          CreationTime = x.CreationTime.TryToDateTime()
                                      })
                                      .GroupBy(x => x.Year)
                                      .Select(x => new QueryPostForAdminDto
                                      {
                                          Year = x.Key,
                                          Posts = x.ToList()
                                      }).ToList();

            result.IsSuccess(new PagedList<QueryPostForAdminDto>(count.TryToInt(), list));
            return result;
        }
    }
}

實現邏輯也非常簡單和之前一樣,就是在Select的時候多了一個Id,添加一個新的Controller:BlogController.Admin.cs,添加這個接口。

//BlogController.Admin.cs
using Meowv.Blog.Application.Contracts;
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using static Meowv.Blog.Domain.Shared.MeowvBlogConsts;

namespace Meowv.Blog.HttpApi.Controllers
{
    public partial class BlogController
    {
        /// <summary>
        /// 分頁查詢文章列表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet]
        [Authorize]
        [Route("admin/posts")]
        [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
        public async Task<ServiceResult<PagedList<QueryPostForAdminDto>>> QueryPostsForAdminAsync([FromQuery] PagingInput input)
        {
            return await _blogService.QueryPostsForAdminAsync(input);
        }
    }
}

因為是後台的接口,所以加上AuthorizeAttribute,指定接口組為GroupName_v2,參數方式為[FromQuery]

當沒有進行授權的時候,是無法訪問接口的。

新增文章

在做新增文章的時候要注意幾點,不是單純的添加文章數據就結束了,要指定文章分類,添加文章的標籤。添加標籤我這裡是從標籤庫中去取得數據,只存標籤Id,所以添加標籤的時候就可能存在添加了標籤庫中已有的標籤。

新建一個新增和更新文章的通用輸出參數模型類,起名:EditPostInput,繼承PostDto,然後添加標籤Tags字段,返回類型IEnumerable<string>

//EditPostInput.cs
using System.Collections.Generic;

namespace Meowv.Blog.Application.Contracts.Blog.Params
{
    public class EditPostInput : PostDto
    {
        /// <summary>
        /// 標籤列表
        /// </summary>
        public IEnumerable<string> Tags { get; set; }
    }
}

添加新增文章的接口:InsertPostAsync

/// <summary>
/// 新增文章
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<ServiceResult> InsertPostAsync(EditPostInput input);

然後去實現這個接口,實現之前,配置AutoMapper實體映射。

CreateMap<EditPostInput, Post>().ForMember(x => x.Id, opt => opt.Ignore());

EditPostInput轉換為Post,並且忽略Id字段。

/// <summary>
/// 新增文章
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<ServiceResult> InsertPostAsync(EditPostInput input)
{
    var result = new ServiceResult();

    var post = ObjectMapper.Map<EditPostInput, Post>(input);
    post.Url = $"{post.CreationTime.ToString(" yyyy MM dd ").Replace(" ", "/")}{post.Url}/";
    await _postRepository.InsertAsync(post);

    var tags = await _tagRepository.GetListAsync();

    var newTags = input.Tags
                       .Where(item => !tags.Any(x => x.TagName.Equals(item)))
                       .Select(item => new Tag
                       {
                           TagName = item,
                           DisplayName = item
                       });
    await _tagRepository.BulkInsertAsync(newTags);

    var postTags = input.Tags.Select(item => new PostTag
    {
        PostId = post.Id,
        TagId = _tagRepository.FirstOrDefault(x => x.TagName == item).Id
    });
    await _postTagRepository.BulkInsertAsync(postTags);

    result.IsSuccess(ResponseText.INSERT_SUCCESS);
    return result;
}

URL字段,根據創建時間按照yyyy/MM/dd/name/格式拼接。

然後找出是否有新標籤,有的話批量添加至標籤表。

再根據input.Tags構建PostTag列表,也進行批量保存,這樣才算是新增好一篇文章,最後輸出ResponseText.INSERT_SUCCESS常量,提示成功。

BlogController.Admin.cs添加API。

/// <summary>
/// 新增文章
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
[Authorize]
[Route("post")]
[ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
public async Task<ServiceResult> InsertPostAsync([FromBody] EditPostInput input)
{
    return await _blogService.InsertPostAsync(input);
}

更新文章

更新操作和新增操作輸入參數一樣,只新增一個Id用來標識更新那篇文章,添加UpdatePostAsync更新文章接口。

/// <summary>
/// 更新文章
/// </summary>
/// <param name="id"></param>
/// <param name="input"></param>
/// <returns></returns>
Task<ServiceResult> UpdatePostAsync(int id, EditPostInput input);

同樣的實現這個接口。

/// <summary>
/// 更新文章
/// </summary>
/// <param name="id"></param>
/// <param name="input"></param>
/// <returns></returns>
public async Task<ServiceResult> UpdatePostAsync(int id, EditPostInput input)
{
    var result = new ServiceResult();

    var post = await _postRepository.GetAsync(id);
    post.Title = input.Title;
    post.Author = input.Author;
    post.Url = $"{input.CreationTime.ToString(" yyyy MM dd ").Replace(" ", "/")}{input.Url}/";
    post.Html = input.Html;
    post.Markdown = input.Markdown;
    post.CreationTime = input.CreationTime;
    post.CategoryId = input.CategoryId;

    await _postRepository.UpdateAsync(post);

    var tags = await _tagRepository.GetListAsync();

    var oldPostTags = from post_tags in await _postTagRepository.GetListAsync()
                      join tag in await _tagRepository.GetListAsync()
                      on post_tags.TagId equals tag.Id
                      where post_tags.PostId.Equals(post.Id)
                      select new
                      {
                          post_tags.Id,
                          tag.TagName
                      };

    var removedIds = oldPostTags.Where(item => !input.Tags.Any(x => x == item.TagName) &&
                                               tags.Any(t => t.TagName == item.TagName))
                                .Select(item => item.Id);
    await _postTagRepository.DeleteAsync(x => removedIds.Contains(x.Id));

    var newTags = input.Tags
                       .Where(item => !tags.Any(x => x.TagName == item))
                       .Select(item => new Tag
                       {
                           TagName = item,
                           DisplayName = item
                       });
    await _tagRepository.BulkInsertAsync(newTags);

    var postTags = input.Tags
                        .Where(item => !oldPostTags.Any(x => x.TagName == item))
                        .Select(item => new PostTag
                        {
                            PostId = id,
                            TagId = _tagRepository.FirstOrDefault(x => x.TagName == item).Id
                        });
    await _postTagRepository.BulkInsertAsync(postTags);

    result.IsSuccess(ResponseText.UPDATE_SUCCESS);
    return result;
}

ResponseText.UPDATE_SUCCESS是常量更新成功。

先根據Id查詢到數據庫中的這篇文章數據,然後根據input參數,修改需要修改的數據,最後保存。

注意的是,如果修改的時候修改了標籤,有可能新增也有可能刪除,也許會又有新增又有刪除。

這時候就需要注意,這裏做了一個比較通用的方法,找到數據庫中當前文章Id的所有Tags,然後根據參數input.Tags可以找出被刪掉的標籤的PostTags的Id,調用刪除方法刪掉即可,同時也可以獲取到新增的標籤,批量進行保存。

完成上面操作后,才保存新加標籤與文章對應的數據,最後提示更新成功,在BlogController.Admin添加API。

/// <summary>
/// 更新文章
/// </summary>
/// <param name="id"></param>
/// <param name="input"></param>
/// <returns></returns>
[HttpPut]
[Authorize]
[Route("post")]
[ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
public async Task<ServiceResult> UpdatePostAsync([Required] int id, [FromBody] EditPostInput input)
{
    return await _blogService.UpdatePostAsync(id, input);
}

[HttpPut]指定請求方式為put請求,一般需要修改用put,添加用post。

[Required]指定參數id必填且是FromQuery的方式,input為[FromBody]

更新一下上面新增的數據試試。

刪除文章

刪除相對來說就非常簡單了,一般刪除都會做邏輯刪除,就是避免某些手殘刪除了,有找回的餘地,我們這裏就直接Delete了,也沒什麼重要數據。

添加接口:DeletePostAsync

/// <summary>
/// 刪除文章
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ServiceResult> DeletePostAsync(int id);

實現接口。

/// <summary>
/// 刪除文章
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<ServiceResult> DeletePostAsync(int id)
{
    var result = new ServiceResult();

    var post = await _postRepository.GetAsync(id);
    if (null == post)
    {
        result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith("Id", id));
        return result;
    }

    await _postRepository.DeleteAsync(id);
    await _postTagRepository.DeleteAsync(x => x.PostId == id);

    result.IsSuccess(ResponseText.DELETE_SUCCESS);
    return result;
}

刪除的時候同樣去查詢一下數據,來判斷是否存在。

ResponseText.DELETE_SUCCESS是添加的常量刪除成功,刪除成功同時也要將post_tags表的標籤對應關係也幹掉才算完整,在BlogController.Admin添加API。

/// <summary>
/// 刪除文章
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete]
[Authorize]
[Route("post")]
[ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
public async Task<ServiceResult> DeletePostAsync([Required] int id)
{
    return await _blogService.DeletePostAsync(id);
}

[HttpDelete]指定請求方式是刪除資源,[Required]指定參數Id必填。

刪掉上面添加的文章看看效果。

至此,完成了博客文章的增刪改接口,未完待續…

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

搭配下方課程學習更佳 ↓ ↓ ↓

http://gk.link/a/10iQ7

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

台中搬家公司費用怎麼算?