分類
發燒車訊

實測傳說中的最強斯柯達SUV!如果定價十來萬肯定要賣瘋…

高配車型還有電動尾門,實用性非常出色。至於它的第三排座椅,在看來更多的是應急使用。進入第三排仍然會有些困難,對於家裡的一些上了年紀的家人來說,還是安安分分坐在第二排吧,較高的離地間隙也是一個硬傷。因此7座的柯迪亞克更多是讓消費者有更多的選擇,5座的車型仍然廠家宣傳的主力車型。

作為整篇的開頭,可以下一個結論了;試完柯迪亞克之後,我的心裏已經有一個答案了,看厭了大眾千篇一律的設計造型,如今的年輕人是時候換一台具有大眾品質但外觀與空間都表現更加出色的SUV了。

作為大眾旗下的一個子公司,斯柯達一直受到的關注相對來說還是少了一點。但作為一家公司而言,斯柯達肯定不會一直甘於人下,被所有人都認為是大眾小弟的。於是斯柯達在醞釀已久之後,開始在全世界展示這台充滿北歐風情,但卻符合大眾消費者審美的SUV車型。

犀利的外觀造型,人性化的設計

之前得知柯迪亞克要在廣州車展做展示的消息,尋思着在車展期間好好欣賞一下這款出自斯柯達首款7座SUV,無奈是由於眾多媒體的圍觀,雖然對它非常感興趣,但能觸摸到的時間真的不多。如今不遠萬里來到充滿熱情的西班牙,我仍然按捺住自己心裏的躁動,只想靜靜品味它獨特的外觀造型。

柯迪亞克這個有點拗口的名字是來源自身形龐大的棕熊,第一次看到它時候覺得這個名字改得相當貼切。龐大的車身採用凌厲的線條勾勒出動感的車身造型,飽滿之餘卻不臃腫。極富張力的前臉設計給人的印象相當深刻,粗壯的直瀑式進氣格柵與犀利的LED前大燈營造出的前臉氣場很足,一如它的名字。

從大燈延伸要車尾的三維腰線使得車身具有不錯的立體感,C柱與D柱之間的小舷窗的設計使得車身的造型非常協調,配合外擴式輪罩設計,使得車身充滿力量感。簡潔的車尾卻不缺少變化,標誌性的C型LED尾燈造型與視覺效果相當出色。

除了出色的外觀造型,柯迪亞克也變得相當的人性化,設計師有時候觀念的轉變最後受益是我們消費者。這個從它的一些設計小細節就可以看出。開門的時候,由於很多人都非常擔心碩大的車門會碰到隔壁的牆壁或者車,而柯迪亞克則設計了一套可伸縮的防擦條,開門的時候自動車身,很巧妙的設計卻不會影響美觀。之前在速派出現過的門板處設計摺疊傘存放槽,這在柯迪亞克也有看到,而且正副駕駛都有,是非常貼心的裝置。

熟悉的內飾,貼心的配置

進入車內,依然是熟悉的大眾設計風格,卻擁有斯柯達自家的基因,一切以實用為主。規整的中控造型配上仿木紋的裝飾面板,相當具有檔次。應用多年的老氣多輻式方向盤終於壽終正寢,換裝了一個手感良好大小適中的三輻式方向盤。

8英寸的觸摸屏显示效果比較清晰,配合觸摸式的按鍵,上手比較簡單,由於海外版本搭載是谷歌地圖,在試駕途中沒有好好體驗。分區明確的中控台無論做工還是按鍵的手感都都相當出色,符合一款旗艦SUV的身價。中控下方的儲物格空間很大,能放置I7 plus,還有無線充電功能,希望到時國內上市時還有這個提升逼格的配置。

讓驚喜是它的副駕駛後方設置了一個小桌板與手機支架,可以讓後排乘客在旅途當中不僅看看自己喜歡的電影,還能就着電影吃零食。後排頭枕兩側還有貼心護翼,後排乘客看累了電影還能舒服地睡個覺。

五座為主,7座為輔

進入車內,前排空間就不用多說了,雖然身材不算很高,但頭部空間與腿部空間都非常充裕。得益於2791mm的軸距,它的第二排空間非常寬敞,雖然坐墊有些短,但對這些身高一米7多點還是足夠的,舒適性不差。配合碩大的全景天窗,後排乘客體驗非常出色。後排整體放倒比較規整,後備箱的空間非常寬敞;高配車型還有電動尾門,實用性非常出色。

至於它的第三排座椅,在看來更多的是應急使用。進入第三排仍然會有些困難,對於家裡的一些上了年紀的家人來說,還是安安分分坐在第二排吧,較高的離地間隙也是一個硬傷。因此7座的柯迪亞克更多是讓消費者有更多的選擇,5座的車型仍然廠家宣傳的主力車型。

這是一台年輕人的SUV

聊完最基礎的外觀、內飾與空間,剩下來的肯定就是好好試駕一番這台身材不少的SUV了。它的尺寸比目前剛上市的進口途觀還要大點,這樣的龐大的身軀,看到需要比較強勁的動力總成了,因此那款1.4T的發動機不會搭載在柯迪亞克身上。

雖然歐洲是柴油車的天下,但為了更好與國內市場相一致,捨棄了試駕柴油版的柯迪亞克,選擇了一台搭載了2.0T發動機,可是號稱7.5秒能把柯迪亞克從0加速到100Km/h的車型。至於1.8T車型,想留着到時國內上市之後再來試駕。

只要你開過斯柯達,那麼柯迪亞克是相當的容易上手。相比其他斯柯達車型,它有着更高的坐姿與更出色的視野,當然它的調校與其他斯柯達的車型還是有所區別的,那就是整體會更硬朗一些,很貼合它的名字與造型。

在試駕的過程中,這台2.0T的發動機動力輸出非常直接,與其匹配的DQ500平順性做得相當出色,只是一路試駕的途中基本沒有體驗頓挫的酸爽感,換擋的非常积極聰明。如今唯一的念想就是希望國產之後仍然是這台出色的變速箱了。硬朗的懸挂調校,讓人在行駛當中非常踏實。雖然在試駕過程中路面不算很好,但柯迪亞克在靜音水平做得比較出色,相比途觀真的進步很大。

試駕的這台車型還是四驅版本,車尾的4×4出賣了它的身份。它搭載的這台四驅系統與Tiguan相差不大,是一台適時四驅系統,通過多片離合器式限滑差速器來分配動力,但主要還是以前驅為主,對於操控有一定的提升,千萬不要以為能進行極限越野。

合理的定價,將會是斯柯達的雄起之作

從最近這幾年斯柯達的發展來說,已經有了很大的進步了;在明銳與晶銳身上可以逐漸看到全新的設計元素,以前比較老氣造型已經被丟進博物館了。再到最新的速派,採用MQB平台生產的中級車,雖然銷量仍然比不上帕薩特,但已經上了不止一個台階了。那麼未來的成績要想更上一層樓的話,就肯定需要一個非常切合年輕人的定價。

柯迪亞克擁有着出眾的外觀顏值,非常實用的空間體驗,這些優勢已經吸引了許多消費者的關注,但是如果真的要賣到我們手中,恐怕差的只是一個合適的價格了。這個從它亮相以來不斷的有網友跟說,只要它性價比不錯,首選SUV一定是它了。既然這樣,就來猜測一下,假如定一個比較低的起步價的話,例如18萬的起步價格、同時爭取上市的時間比國產途觀更早,相信一定有很多年輕人會把它收入囊中的。如今消費者已經出好題目了,就看斯柯達會不會給個令人滿意的答案了。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

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

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

分類
發燒車訊

致G20領袖 全球醫療工作者呼籲採納綠色振興

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

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

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

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

分類
發燒車訊

印度猴群闖醫學院「毆打研究員」 下秒洗劫待驗的武肺檢體

摘錄自2020年05月30日三立新聞網印度報導

武漢肺炎(COVID-19)仍持續在印度延燒,然29日卻發生一起「搶劫事件」,一群猴子突闖入北方省勒克瑙(Lucknow)一處醫學院、出手攻擊醫事人員,並將多個待檢驗新冠病毒的血液檢體劫走;消息一出,附近居民紛表擔憂,害怕病毒會因檢體洩漏而進一步擴散。

醫學院領導人賈格(S. K. Garg)指出,現在沒有證據顯示人會傳染病毒給猴子,但不知道若猴子接觸有病毒的血液之後,是否會遭受感染。有關單位也表示,目前還沒掌握到猴子是否有把血液灑出來,但附近居民得知消息後,都很擔心若猴子將檢體帶到住宅區,恐會造成病毒擴散。

猴子闖入人類居住區、造成騷亂甚至攻擊人類的事件近來在印度頻傳,環保人士對此表示,主要原因是猴子的棲息地遭破壞,而牠們為了尋找食物才會闖入人類的居住空間。

※ 本文與 行政院農業委員會 林務局   合作刊登

國際新聞
印度
武漢肺炎
猴子
公共衛生
處變不驚──與野生動物相遇
人與動物衝突事件簿

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

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

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

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

分類
發燒車訊

躲過大火又來疫情 無尾熊面臨斷炊危機

摘錄自2020年05月31日TVBS新聞網澳洲報導

澳洲在去年年底,發生世紀森林大火,至少造成8,000隻無尾熊喪命,沒想到躲過大火,現在澳洲無尾熊卻因為疫情,可能面臨斷炊危機。以澳洲雪梨郊區的野生動物園來說,因為七成以上收入是靠外國觀光客,現在因為疫情根本沒有收入,現在只能期待澳洲政府紓困,才能讓園內50隻無尾熊的飼料費有著落。

費瑟代爾野生動物園公關:「就像大家知道的,夏天的時候,森林大火燒到動物園附近,剛想說逃過一劫,這下沒問題了,結果又遇到新冠病毒疫情。」

這家野生動物園的無尾熊,儘管躲過了大火奪命,如今卻可能因為疫情,面臨斷炊危機,原來每頭無尾熊,每年的飼料費是1萬9000澳幣,現在沒了觀光客,業者只能期待澳洲政府救濟。

生態保育
物種保育
生物多樣性
國際新聞
澳洲
無尾熊
動物與大環境變遷

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

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

分類
發燒車訊

歐企推環保轉型 呼應下一代歐盟計劃

摘錄自2020年05月31日台灣醒報歐洲報導

面對疫情歐洲企業提倡環保轉型,配合歐盟永續發展新計劃。歐洲最大的時裝網購平台Zalando日前宣佈,將要求其合作品牌在2023年前達到永續發展的環保目標。如果不能符合規定將會強制下架該公司所有商品。

目前約有2000個時尚品牌經由Zalando的平台銷售,包括Nike、Gucci、Ted Baker等。各界認為,此舉不僅提升環保意識,也能讓時尚圈有更明確的未來目標。

據《科學人》報導,歐盟日前公佈一項金額高達7500億歐元,名為「下一代歐盟」的經濟復甦計劃,內容特別強調阻止氣候變遷的重要性。歐盟執委會主席馮德萊恩向媒體表示:「我們必須確保企業在疫情期間進行產業轉型時,也要符合環保的大方向。」

環境哲學
生活環境
綠色消費
全球變遷
氣候變遷
循環經濟
國際新聞
歐洲
環境正義

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

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

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

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

分類
發燒車訊

真的假的?10萬級的國產SUV已經擁有媲美合資的能力了!

東風風神AX5新車指導價:8。97-12。87萬在外觀方面東風風神AX5擁有一個極高的原創外觀,採用了雙橫幅的鍍鉻前格柵,下部進氣口採用梯形設計,同時保險杠兩側還配備有類似進氣口造型的豎條狀LED日間行車燈,此外紅色卡鉗以及使用18寸風火輪式輪轂更能彰顯AX5的運動氣質,而AX5的離地間距達到190mm,處於中上游水準。

合資水平是目前眾多國產車廠商一直追求境界。為什麼總有的人會說國產車追不上合資車型?在看來最主要的原因是個人的感受方面。

國產品牌與合資到底差在哪兒?

品牌影響力上的差距!“國產”“合資”看起來就覺得合資更高端,在這裏也存在一種崇洋媚外的心理。現在的消費者買車更看重面子!國產品牌在眾多人心中依舊是“山寨”“廉價”的代名詞,如果讓親戚朋友看到你開一台國產車,總是會覺得低人一等。在很多人看來,為什麼要買國產車?並不是因為愛過情懷,而是錢不夠。

外觀內飾設計上的差距?認為設計是一種很主觀的東西,但凡有一些比較潮流的設計出現,喜歡的人會被吸引進來,不喜歡的人只會吐槽。所以在汽車設計方面越平庸的車型越受廣大消費者所喜愛,而且中國人更喜歡“大”這一個詞語,於是現在的新款車型在尺寸方面都越做越大。至於合資和國產是否存在差距?覺得現在國產車的設計已經相當不錯,除了那幾個不爭氣堅持模仿的廠商,大多都擁有了自己的一套家族式設計語言,而且原創度都相當高!

行駛質感的差距!有的人說國產車型開上幾年底盤感覺就像要散掉一般,跟合資車型完全無法比較。決定汽車行駛整體的質感與汽車廠家的調校功力成正比關係,就像法系車能把扭力梁調得比你的獨立懸挂更牛逼一樣,幾乎所有的廠家將自己那套底盤數據當成國家機密一樣。而調校就是國產品牌的硬傷,有能力的國產品牌可以選擇直接向合資廠家買比較過時的底盤數據、或者直接給錢外包給國外的調校團隊,投入資金是相龐大的。說句難聽點的,有部分的國產廠商的車型在看來壓根就是跳過了“調校”這個步驟。

國產品牌就這麼菜?

其實並不是,相反10萬左右的購車預算,選擇國產車型性價比更高!首先是配置更高、而且車子比合資車型更為大氣!有的人說國產車質量不行,國產車型的故障率是稍高,但這是對於故障率極低的品牌而言(就像豐田這些),不是所有的合資品牌故障率都很低的!10年前的國產車都在路上跑着,也不要說現在的新車型了。

外觀夠大氣、配置夠高、內飾檔次夠高、車型質量過關!是判斷一台國產車型能否擁有與合資車競爭的最主要因素!

東風風神AX5

新車指導價:8.97-12.87萬

在外觀方面東風風神AX5擁有一個極高的原創外觀,採用了雙橫幅的鍍鉻前格柵,下部進氣口採用梯形設計,同時保險杠兩側還配備有類似進氣口造型的豎條狀LED日間行車燈,此外紅色卡鉗以及使用18寸風火輪式輪轂更能彰顯AX5的運動氣質,而AX5的離地間距達到190mm,處於中上游水準。

中控台設計層次感挺高,採用了軟性材料覆蓋給到的質感也非常不錯,而且最讓喜歡的是它的實用性配置上,像副駕駛地下的鞋盒給愛穿高跟鞋的女生提供了放鞋的地方、配備了獨立的8英寸液晶屏和一鍵啟動等配置,內置的Windlink系統支持與安卓手機的連接。

AX5提供1.4T渦輪增壓發動機,與之匹配的是一台5擋手動/6擋擋雙離合,在質量方面值得肯定,另外AX5的底盤平台源自東風與pSA集團共同研發的DF2平台,在行駛質感方面真心不錯。

榮威RX5

新車指導價:9.98-18.68萬

榮威RX5在上市之初一直以“網紅”的形式登場,極高的顏值受到廣泛消費者的關注,作為榮威“律動設計”理念下的首款車型,“展翼格柵”的中控與矩陣式LED大燈相連,整體造型時尚大氣,原創度極高,逼格十足。

採用黃金比例進行打造設計的中控台也是滿滿的逼格,大面積使用軟材料包裹,摸到哪兒都是軟的,中控10.4英寸的大显示屏更是成為了中控台的點睛之筆,整體給人的質感相當高檔。另外與阿里共同打造出來的車載互聯繫統更是將其“網紅”的定位推上了頂峰。

在動力方面,1.5T的動力更適合家用、2.0T的動力能帶給你非常不俗的駕駛樂趣,在質量方面,榮威背後有着通用這個大集團的撐腰,無論在品控還是質量方面都值得肯定。

合資的选手實力也不俗!

雪鐵龍C3-XR

新車指導價:10.88-17.18萬

法系車一直不被人看好,車頭採用了更多平直的線條,彰顯飽滿風格。大燈簡單耐看,內部線條與前格柵相連接,整體感更強。而側面的線條緊湊動感,不規則的輪圈樣式也頗為個性。儘管它擁有着同級領先的底盤調校技術,但是配置搭配不合理是它主要的缺點,不過法系車也就有一個優點:那就是底盤紮實好開。

現代ix25

新車指導價:11.98-18.68萬

韓國車一直以高顏值作為賣點,所以無論旗下哪款車型,無疑不是顏值極高的选手,當然韓系車另外一個賣點就是配置比同級別的合資車型配置更高,而且韓系車在終端優惠方面很大,所以在新車落地價上會比較便宜。也可以這麼說,現代ix25在實用性與家用兩方面是做得相當不錯的。

國產車型配置高、價格更低,性價比十足。很多人對國產車存在偏見,但是這個困境將會隨着國產車型的日益發展得到改善,如果國產車的整體質量上來了,你還會覺得國產車比不上合資嗎?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

分類
發燒車訊

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

前言

從今天開始將使用 Blazor 完成博客的前端開發,如果你不了解 Blazor ,建議你還是去微軟官網學習學習基礎知識。本篇不做普及,因為這是實戰系列,重點是完成項目開發。

還有,在開始 Blazor 實戰之前,建議動手完成之前的系列文章,這樣更有連貫性,不至於懵圈。

因為我也是第一次使用 Blazor 開發項目,所以無法保證代碼的最優性,如果有不對的地方,或者有更好的做法,歡迎大家指正,謝謝。

接下來,我將現學現做帶來一個完整的博客項目,來吧,Just do it 。

我這裏選擇的是 Blazor WebAssembly,需要你有 .NET Core 3.1 的開發環境,並且你還要有 Visual Studio 2019 IDE。

給大家看看我的開發環境,終端工具是:Window Terminal ,配置一下用起來太爽了,五星強烈推薦。

搭建

Blazor WebAssembly 是一個單頁應用框架,可用它通過 .NET 生成交互式客戶端 Web 應用。 Blazor WebAssembly 使用開放的 Web 標準(沒有插件或代碼轉換),適用於移動瀏覽器等各種新式 Web 瀏覽器。

不啰嗦了,直接開干吧,在項目中新建 Blazor Web 應用。

然後將項目設置為啟動項目,Ctrl+F5 運行一下看看,官網默認示例我這裏也懶得說了,直接進入主題吧。

改造

我這裏使用的UI還是我目前博客的樣式,你可以選擇任意你喜歡的UI界面,這部分就隨意了,不是本實戰系列的重點,所以有關樣式這些東西我就直接 Ctrl CV 了。

替換下面css代碼到 wwwroot/css/app.css 中。

點擊查看代碼

*,
*:after,
*:before {
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}

html {
	line-height: 1.15;
	-webkit-text-size-adjust: 100%;
}

body {
	margin: 0;
}

h1 {
	font-size: 2em;
	margin: 0.67em 0;
}

hr {
	box-sizing: content-box;
	height: 0;
	overflow: visible;
}

pre {
	font-family: monospace, monospace;
	font-size: 1em;
}

a {
	background-color: transparent;
}

abbr[title] {
	border-bottom: none;
	text-decoration: underline;
	text-decoration: underline dotted;
}

b,
strong {
	font-weight: bolder;
}

code,
kbd,
samp {
	font-family: monospace, monospace;
	font-size: 1em;
}

small {
	font-size: 80%;
}

sub,
sup {
	font-size: 75%;
	line-height: 0;
	position: relative;
	vertical-align: baseline;
}

sub {
	bottom: -0.25em;
}

sup {
	top: -0.5em;
}

img {
	border-style: none;
}

button,
input,
optgroup,
select,
textarea {
	font-family: inherit;
	font-size: 100%;
	line-height: 1.15;
	margin: 0;
}

button,
input {
	overflow: visible;
}

button,
select {
	text-transform: none;
}

button,
[type="button"],
[type="reset"],
[type="submit"] {
	-webkit-appearance: button;
}

button::-moz-focus-inner,
    [type="button"]::-moz-focus-inner,
    [type="reset"]::-moz-focus-inner,
    [type="submit"]::-moz-focus-inner {
	border-style: none;
	padding: 0;
}

button:-moz-focusring,
    [type="button"]-moz-focusring,
    [type="reset"]-moz-focusring,
    [type="submit"]-moz-focusring {
	outline: 1px dotted ButtonText;
}

fieldset {
	padding: 0.35em 0.75em 0.625em;
}

legend {
	box-sizing: border-box;
	color: inherit;
	display: table;
	max-width: 100%;
	padding: 0;
	white-space: normal;
}

progress {
	vertical-align: baseline;
}

textarea {
	overflow: auto;
}

[type="checkbox"],
[type="radio"] {
	box-sizing: border-box;
	padding: 0;
}

[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
	height: auto;
}

[type="search"] {
	-webkit-appearance: textfield;
	outline-offset: -2px;
}

    [type="search"]::-webkit-search-decoration {
	-webkit-appearance: none;
}

::-webkit-file-upload-button {
	-webkit-appearance: button;
	font: inherit;
}

details {
	display: block;
}

summary {
	display: list-item;
}

template {
	display: none;
}

[hidden] {
	display: none;
}

@font-face {
	font-family: 'Fira Code Medium';
    src: url('https://static.meowv.com/fonts/FiraCode-Medium.woff2') format('woff2'), url("https://static.meowv.com/fonts/FiraCode-Medium.woff") format("woff");
    font-weight: 500;
    font-style: normal;
}

html {
	font-family: 'Fira Code Medium', Microsoft Yahei, monospace;
	overflow-x: hidden;
}

html::-webkit-scrollbar {
	width: 5px;
	height: 5px;
}

html::-webkit-scrollbar-thumb {
	height: 20px;
	background-color: #5A9600;
}

html::-webkit-scrollbar-thumb:hover {
	background-color: #5A9600;
}

body {
	font-size: 11pt;
	font-weight: normal;
	line-height: 2em;
	background-color: #fff;
	color: #161209;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

body:before {
	content: "";
	background-repeat: no-repeat;
	background-position: center;
	opacity: 0.05;
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	z-index: -1;
}

body.dark-theme {
	background-color: #292a2d;
	color: #a9a9b3;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

a {
	color: #161209;
	text-decoration: none;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
	cursor: pointer;
}

a:hover {
	color: #5A9600;
	text-decoration: none;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

.dark-theme a {
	color: #a9a9b3;
	text-decoration: none;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

.dark-theme a:hover {
	color: #fff;
	text-decoration: none;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

.wrapper {
	display: flex;
	flex-direction: column;
	min-height: 100vh;
	width: 100%;
}

.navbar {
	height: 4rem;
	line-height: 4rem;
	width: 100%;
}

.navbar .container {
	width: auto;
	max-width: 1200px;
	text-align: center;
	margin: 0 auto;
	display: flex;
	justify-content: space-between;
}

.main {
	flex-grow: 1;
	flex-shrink: 0;
	flex-basis: auto;
}

.container {
	padding-left: 1em;
	padding-right: 1em;
}

.footer {
	width: 100%;
	text-align: center;
}


/*input css begin*/

* {
	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

input[type="checkbox"],
input[type="radio"] {
	display: none;
	width: 0;
	height: 0;
	visibility: hidden;
}

input[type="checkbox"]:checked + label:after {
	transition: all 0.3s ease-in;
}

input[type="checkbox"]:not(:checked) + label:after {
	transition: all 0.3s ease-out;
}

input[type="checkbox"]:checked + label,
    input[type="checkbox"]:not(:checked) + label {
	transition: all 0.3s ease-in-out;
}

input[type="checkbox"]:checked + label:before,
        input[type="checkbox"]:checked + label i:before,
        input[type="checkbox"]:not(:checked) + label i:before,
        input[type="checkbox"]:checked + label i:after,
        input[type="checkbox"]:not(:checked) + label i:after,
        input[type="checkbox"]:not(:checked) + label:before {
	transition: all 0.3s ease-in-out;
}

input[type="radio"]:checked + label:after,
    input[type="radio"]:not(:checked) + label:after {
	transition: all 0.3s ease-in-out;
}

.switch_default + label {
	background-color: #e6e6e6;
	border-radius: 7px;
	cursor: pointer;
	display: inline-block;
	height: 14px;
	position: relative;
	box-shadow: 0.2px 0.2px 1px 0.5px rgb(180, 180, 180);
	width: 30px;
}

.switch_default + label:after {
	background-color: #fff;
	border-radius: 50%;
	content: "";
	height: 12px;
	left: 1px;
	position: absolute;
	top: .5px;
	width: 12px;
	box-shadow: 0.2px 0.2px 1px 0.5px rgb(180, 180, 180);
}

.switch_default:checked + label {
	background-color: #1ABC9C;
	box-shadow: none;
}

.switch_default:checked + label:after {
	left: 17px;
}

@font-face {
	font-family: "iconfont";
    src: url('//at.alicdn.com/t/font_1313145_r9szngeugmj.eot?t=1566619028667'); /* IE9 */
    src: url('//at.alicdn.com/t/font_1313145_r9szngeugmj.eot?t=1566619028667#iefix') format('embedded-opentype'), /* IE6-IE8 */
    url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), url('//at.alicdn.com/t/font_1313145_r9szngeugmj.woff?t=1566619028667') format('woff'), url('//at.alicdn.com/t/font_1313145_r9szngeugmj.ttf?t=1566619028667') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
    url('//at.alicdn.com/t/font_1313145_r9szngeugmj.svg?t=1566619028667#iconfont') format('svg'); /* iOS 4.1- */
}

.iconfont {
	font-family: "iconfont" !important;
	font-size: 16px;
	font-style: normal;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.iconread:before {
	content: "\e742";
}

.iconweixin:before {
	content: "\e632";
}

.iconmanage:before {
	content: "\e610";
}

.iconapi:before {
	content: "\e668";
}

.iconcode:before {
	content: "\e654";
}

.icongithub:before {
	content: "\ea0a";
}

.iconnotes:before {
	content: "\e687";
}

.header-logo a {
	padding: 0;
}

.navbar .menu a {
	padding: 0 8px;
}

.navbar .menu .active {
	font-weight: 900;
	color: #161209;
}

.dark-theme .navbar .menu .active {
	color: #fff;
}

.navbar-header a:hover,
.navbar .menu a:hover {
	background-color: transparent;
}

header label {
	margin-left: 15px;
	position: relative;
	-webkit-transform: translateY(0.1em) translateX(0.5em);
}

.copyright {
	font-size: 14px;
}

.pagination {
	display: flex;
	flex-direction: row;
	justify-content: center;
	list-style: none;
	white-space: nowrap;
	width: 100%;
	padding-top: 2em;
}

.pagination a,
    .pagination span {
	-webkit-font-smoothing: antialiased;
	font-size: 12px;
	color: #bfbfbf;
	letter-spacing: 0.1em;
	font-weight: 700;
	padding: 5px 5px;
	text-decoration: none;
	transition: 0.3s;
}

.pagination .page-number {
	padding-bottom: 3px;
	margin: 0 20px;
	box-sizing: border-box;
	position: relative;
	display: inline;
}

.pagination .page-number.disabled {
	display: none;
}

.pagination .page-number:hover a {
	color: #000;
}

.dark-theme .pagination .page-number:hover a {
	color: #fff;
}

.pagination .page-number:before,
.pagination .page-number:after {
	position: absolute;
	content: "";
	width: 0;
	height: 1px;
	background: #000;
	transition: 0.3s;
	bottom: 0px;
}

.dark-theme .pagination .page-number:before,
.dark-theme .pagination .page-number:after {
	background: #fff;
}

.pagination .page-number:before .current,
.pagination .page-number:after .current {
	width: 100%;
}

.pagination .page-number:before {
	left: 50%;
}

.pagination .page-number:after {
	right: 50%;
}

.pagination .page-number:hover:before,
.pagination .page-number:hover:after {
	width: 50%;
}

.pagination .page-number.current {
	color: #000;
}

.dark-theme .pagination .page-number.current {
	color: #fff;
}

.pagination .page-number.current:before,
.pagination .page-number.current:after {
	width: 60%;
}

.intro {
	transform: translateY(20vh);
	text-align: center;
}

.intro .avatar {
	padding: 10px;
}

.intro .avatar img {
	width: 128px;
	height: auto;
	display: inline-block;
	-webkit-border-radius: 100%;
	border-radius: 100%;
	-webkit-box-shadow: 0 0 0 0.3618em rgba(0, 0, 0, 0.05);
	box-shadow: 0 0 0 0.3618em rgba(0, 0, 0, 0.05);
	margin: 0 auto;
	-webkit-transition: all ease 0.4s;
	-moz-transition: all ease 0.4s;
	-o-transition: all ease 0.4s;
	transition: all ease 0.4s;
	cursor: pointer;
}

.intro .avatar img:hover {
	position: relative;
	-webkit-transform: translateY(-0.75em);
	-moz-transform: translateY(-0.75em);
	-ms-transform: translateY(-0.75em);
	-o-transform: translateY(-0.75em);
	transform: translateY(-0.75em);
	cursor: pointer;
}

.nickname {
	font-size: 2em;
	font-weight: normal;
}

.links a {
	padding: 0 5px;
}

.links a:hover {
	background-color: transparent;
}

.links .iconfont {
	font-size: 2em;
}

.post-wrap {
	position: relative;
	width: 100%;
	max-width: 1024px;
	margin: 0 auto;
	padding-top: 2rem;
}

.archive-item-date {
	float: right;
	text-align: right;
	color: #a9a9b3;
}

.dark-theme .archive-item-date {
	color: #87878d;
}

.post-wrap .categories-card {
	margin: 0 auto;
	margin-top: 1em;
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-direction: row;
	flex-wrap: wrap;
	padding: 0 2.5em;
	line-height: 1.6em;
}

.post-wrap .categories-card .card-item {
	font-size: 14px;
	text-align: left;
	width: 50%;
	display: flex;
	align-items: flex-start;
	position: relative;
}

.post-wrap .categories-card .card-item .categories {
	overflow: hidden;
}

.categories h3 {
	display: inline-block;
}

.categories span {
	float: right;
	padding-right: 1em;
}

.categories .more-post-link {
	float: right;
}

.tag-cloud-tags {
	margin: 10px 0;
	padding-top: 2em;
}

.tag-cloud-tags a {
	display: inline-block;
	position: relative;
	margin: 5px 10px;
	word-wrap: break-word;
	transition-duration: 0.3s;
	transition-property: transform;
	transition-timing-function: ease-out;
}

.tag-cloud-tags a:active,
        .tag-cloud-tags a:focus,
        .tag-cloud-tags a:hover {
	color: #5A9600;
	transform: scale(1.1);
}

.dark-theme .tag-cloud-tags a:active,
.dark-theme .tag-cloud-tags a:focus,
.dark-theme .tag-cloud-tags a:hover {
	color: #fff;
}

.tag-cloud-tags a small {
	margin: 0 0.3em;
	color: #a9a9b3;
}

.dark-theme .tag-cloud-tags a small {
	color: #fff;
}

.page {
	padding-top: 0;
}

.page .post-content {
	margin: 0;
	padding-top: 0;
}

.post-wrap p {
	font-size: 1em;
	margin: 0.5em 0 0.5em 0;
}

.post-wrap .post-header h1 {
	margin: 0 !important;
}

.post-wrap .post-title {
	font-size: 2em;
	line-height: 1.5em;
}

.post-wrap .eror-tip {
	text-align: center;
	line-height: 1.5em;
	margin-top: 250px;
}

.post-wrap .post-meta {
	color: rgba(85, 85, 85, 0.529) !important;
}

.dark-theme .post-wrap .post-meta {
	color: #87878d !important;
}

.post-wrap .post-meta a {
	color: #000;
}

.dark-theme .post-wrap .post-meta a {
	color: #eee;
}

.post-wrap .post-meta a:hover {
	color: #5A9600;
}

.dark-theme .post-wrap .post-meta a:hover {
	color: #fff;
}

.post-content {
	padding-top: 2rem;
	text-align: justify;
}

.post-copyright {
	margin-top: 5rem;
	border-top: 1px solid #e8e8e8;
	border-bottom: 1px solid #e8e8e8;
}

.post-copyright a {
	color: #000;
}

.dark-theme .post-copyright a {
	color: #eee;
}

.post-copyright a:hover {
	color: #5A9600;
}

.dark-theme .post-copyright a:hover {
	color: #fff;
}

.post-copyright .copyright-item {
	margin: 5px 0;
}

.post-copyright .lincese {
	font-weight: bold;
}

.dark-theme .post-copyright {
	border-top: 1px solid #909196;
	border-bottom: 1px solid #909196;
}

.post-tags {
	padding: 1rem 0 1rem;
	display: flex;
	justify-content: space-between;
}

.post-nav:before,
.post-nav:after {
	content: " ";
	display: table;
}

.post-nav a.prev,
.post-nav a.next {
	font-weight: 600;
	font-size: 16px;
	transition-property: transform;
	transition-timing-function: ease-out;
	transition-duration: 0.3s;
}

.post-nav a.prev {
	float: left;
}

.post-nav a.prev::before {
	content: "<";
	margin-right: 0.5em;
}

.post-nav a.prev:hover {
	transform: translateX(-4px);
}

.post-nav a.next {
	float: right;
}

.post-nav a.next::after {
	content: ">";
	margin-left: 0.5em;
}

.post-nav a.next:hover {
	transform: translateX(4px);
}

.post-nav a.prev::before,
    .post-nav a.next::after {
	font-weight: bold;
}

.tag:not(:last-child) a::after {
	content: " / ";
}

@media only screen and (min-device-width: 320px) and (max-device-width: 1024px) {
	.main {
		padding-top: 40pt;
	}

	.navbar {
		display: none;
	}

	.navbar-mobile {
		display: block !important;
		position: fixed;
		width: 100%;
		z-index: 100;
		transition: all 0.6s ease 0s;
	}

	.navbar-mobile .container {
		padding: 0;
		margin: 0;
		line-height: 5.5em;
		background: #fff;
	}

	.navbar-mobile .container .navbar-header {
		display: flex;
		justify-content: space-between;
		align-items: center;
		width: 100%;
		padding-right: 1em;
		padding-left: 1em;
		box-sizing: border-box;
		position: relative;
	}

	.navbar-mobile .container .navbar-header .menu-toggle {
		cursor: pointer;
		line-height: 5.5em;
		padding: auto 2em;
	}

	.navbar-mobile .container .navbar-header .menu-toggle span {
		display: block;
		background: #000;
		width: 36px;
		height: 2px;
		-webkit-border-radius: 3px;
		-moz-border-radius: 3px;
		border-radius: 3px;
		-webkit-transition: 0.25s margin 0.25s, 0.25s transform;
		-moz-transition: 0.25s margin 0.25s, 0.25s transform;
		transition: 0.25s margin 0.25s, 0.25s transform;
	}

	.dark-theme .navbar-mobile .container .navbar-header .menu-toggle span {
		background: #a9a9b3;
	}

	.navbar-mobile .container .navbar-header .menu-toggle span:nth-child(1) {
		margin-bottom: 8px;
	}

	.navbar-mobile .container .navbar-header .menu-toggle span:nth-child(3) {
		margin-top: 8px;
	}

	.navbar-mobile .container .navbar-header .menu-toggle.active span {
		-webkit-transition: 0.25s margin, 0.25s transform 0.25s;
		-moz-transition: 0.25s margin, 0.25s transform 0.25s;
		transition: 0.25s margin, 0.25s transform 0.25s;
	}

	.navbar-mobile .container .navbar-header .menu-toggle.active span:nth-child(1) {
		-moz-transform: rotate(45deg) translate(4px, 6px);
		-ms-transform: rotate(45deg) translate(4px, 6px);
		-webkit-transform: rotate(45deg) translate(4px, 6px);
		transform: rotate(45deg) translate(4px, 6px);
	}

	.navbar-mobile .container .navbar-header .menu-toggle.active span:nth-child(2) {
		opacity: 0;
	}

	.navbar-mobile .container .navbar-header .menu-toggle.active span:nth-child(3) {
		-moz-transform: rotate(-45deg) translate(8px, -10px);
		-ms-transform: rotate(-45deg) translate(8px, -10px);
		-webkit-transform: rotate(-45deg) translate(8px, -10px);
		transform: rotate(-45deg) translate(8px, -10px);
	}

	.navbar-mobile .container .menu {
		text-align: center;
		background: #fff;
        /*border-top: 1px solid #000;*/
		padding-top: 1em;
		padding-bottom: 1em;
		display: none;
		box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1), 0px 4px 8px rgba(0, 0, 0, 0.1);
	}

	.navbar-mobile .container .menu a {
		display: inline-block;
		margin: 0 1em;
		line-height: 2.5em;
	}

	.navbar-mobile .container .menu.active {
		display: block;
		white-space: nowrap;
		box-sizing: border-box;
		overflow-x: auto;
	}

	.dark-theme .navbar-mobile .container .menu {
		background: #292a2d;
        /*border-top: 1px solid #87878d;*/
	}

	.dark-theme .navbar-mobile .container {
		background: #292a2d !important;
	}

	.archive {
		width: 90%;
	}

	.archive .archive-item .archive-item-date {
		display: none;
	}

	#dynamic-to-top {
		display: none !important;
	}

	.footer {
		height: 3rem;
		width: 100%;
		text-align: center;
		line-height: 1.5rem;
		padding-top: 2em;
	}

	.post-warp {
		padding-top: 6em;
	}

	.post-warp .archive-item-date {
		display: none;
	}

	.categories .categories-card .card-item {
		width: 100%;
		display: flex;
		min-height: 0;
	}

	.categories .categories-card .card-item .categories {
		overflow: hidden;
	}

	.signature-img {
		width: 100%;
	}

	.signature-box img {
		height: 100px !important;
	}

	.signature-img img {
		height: 100px;
	}

	.signature-action, .vip-action {
		width: 100%;
	}

	.signature-action select, .vip-action select {
		width: 100%;
	}

	.signature-action input, .vip-action input {
		width: 200px;
		float: left;
		margin-top: 5px;
	}

	.signature-action button, .vip-action button {
		width: 200px;
		margin-top: 5px;
	}

	.mta-box {
		width: 100% !important;
	}

	.mta-a ul li {
		width: 100% !important;
	}

	.navbar-mobile {
		display: none;
	}
}

@media only screen and (min-device-width: 768px) {
	.navbar-mobile {
		display: none;
	}
}

@media only screen and (min-width: 1024px) {
	.navbar-mobile {
		display: none;
	}
}

.loader {
	box-sizing: content-box;
	display: block;
	position: absolute;
	top: 50%;
	left: 50%;
	margin: 0;
	text-align: center;
	z-index: 1000;
	-webkit-transform: translateX(-50%) translateY(-50%);
	transform: translateX(-50%) translateY(-50%);
}

.loader:before {
	position: absolute;
	content: '';
	top: 0;
	left: 50%;
	width: 50px;
	height: 50px;
	margin: 0 0 0 -25px;
	border-radius: 50px;
	border: 4px solid rgba(0, 0, 0, .1);
}

.loader:after {
	position: absolute;
	content: '';
	top: 0;
	left: 50%;
	width: 50px;
	height: 50px;
	margin: 0 0 0 -25px;
	animation: loader .6s linear;
	animation-iteration-count: infinite;
	border-radius: 50px;
	border: 4px solid transparent;
	border-top-color: #767676;
	box-shadow: 0 0 0 1px transparent;
}

@keyframes loader {
	from {
		-webkit-transform: rotate(0deg);
		transform: rotate(0deg);
	}

	to {
		-webkit-transform: rotate(360deg);
		transform: rotate(360deg);
	}
}

.dark-theme .post-content {
	background: #292a2d !important;
	color: #eee !important;
}

.dark-theme .post-content p code, .dark-theme .post-content ul li code {
	background: #292a2d !important;
}

.apps {
	color: red;
	font-weight: bold;
}

.signature-box {
	margin-top: 100px;
	text-align: center;
}

.signature-box img {
	border: none;
	height: 145px;
	margin-bottom: 50px;
}

.signature-action select, .vip-action select {
	height: 30px;
}

.signature-action input, .vip-action input {
	height: 25px;
	padding-left: 5px;
}

.signature-action input:focus, .vip-action input:focus {
	outline: none;
}

.signature-action button, .vip-action button {
	width: 135px;
	height: 30px;
}

.tag-cloud-tags-extend {
	padding-top: 0;
}

.hidden {
	display: none;
}

.vip-action {
	text-align: center;
}

.imgbox {
	width: 70%;
	text-align: center;
	margin: 80px auto 0;
}

.imgbox img {
	max-width: 100%;
	max-height: 100%;
}

.girl-qrcode {
	text-align: center;
}

.girl-img {
	width: 20%;
}

.btnbox {
	text-align: center;
	margin-top: 20px;
}

.tab-box {
	margin: 0 auto;
	margin-top: 50px;
	width: 1150px;
}

.top-tab {
	font-weight: bold;
	float: left;
	margin-top: 5px;
}

.top-tab ul li {
	list-style: none;
}

.top-tab ul li a.archive {
	color: #5A9600;
}

.top-content {
	float: left;
}

.top-content ul li {
	list-style: none;
	height: 35px;
	line-height: 35px;
	width: 888px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.mta-box {
	width: 75%;
	margin: 100px auto 0;
}

.mta-a {
	margin: 20px 68px 50px 20px;
}

.mta-a ul {
	width: auto;
	display: none;
}

.mta-a ul li {
	float: left;
	width: 25%;
	list-style: none;
}

.mta-a-item {
	margin: 0 10px;
	border: 1px solid #e1e1e1;
	background: #fff;
	min-height: 60px;
}

.mta-a-title {
	padding: 16px 16px 0;
	height: 20px;
	line-height: 20px;
}

.mta-a-value {
	height: 100%;
	font-size: 30px;
	height: 24px;
	margin: 20px 0 20px 30px;
}

.mta-date {
	text-align: right;
	padding-right: 5px;
}

.dark-theme .mta-a-item {
	border: 1px solid #a9a9b3;
	background: transparent;
}

.qrcode {
	width: 120px;
	z-index: 99999;
	opacity: 0.8;
	margin: 20px auto 0;
}

.qrcode img {
	width: 100%;
}

.soul {
	text-align: center;
	margin-top: 200px;
}

.soul-btn {
	background-color: #5a9600;
	border: 5px;
	color: white;
	padding: 15px 32px;
	text-align: center;
	text-decoration: none;
	display: inline-block;
	font-size: 16px;
	margin: 4px 2px;
	cursor: pointer;
	-webkit-transition-duration: 0.4s;
	transition-duration: 0.4s;
}

.soul-btn:hover {
	box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
}

在css中用到了開源的 FiraCode 字體,可以自己去下載,不過在css中我已經改為遠程地址了。

刪掉 wwwroot/sample-data、wwwroot/css/bootstrap、wwwroot/css/open-iconic 三個文件夾。

在wwwroot文件夾下,有一個index.html,這個是我們網站的入口,注意裏面有一對標籤:<app>Loading...</app>,這個標籤裏面的內容會在 wasm 加載完畢后自動清除掉,所以,一般可以用來做加載提示。

現在改造一下index.html,代碼如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <meta name="keywords" content="Meowv,qix,阿星Plus,個人博客">
    <meta name="description" content="阿星Plus的個人博客,用於發表原創文章,關注微信公眾號:『阿星Plus』了解更多。">
    <title>阿星Plus⭐⭐⭐</title>
    <base href="/" />
    <link href="css/app.css" rel="stylesheet" />
</head>

<body>
    <app>
        <div class="loader"></div>
    </app>
    <script src="_framework/blazor.webassembly.js"></script>
</body>

</html>

千萬注意,blazor.webassembly.js 這個js不可以刪除,會在項目打包后自動生成這個js文件。

然後我們一點一點完善,Program.cs默認就行暫時不需要做任何改動。

Pages文件夾內的Razor組件就是我們的具體頁面了,幹掉默認的Counter.razorFetchData.razor,留下Index.razor,當作我們的首頁。

Shared文件夾內可以放一些共享的組件,比如我們的模板MainLayout.razor就在裏面,它需要繼承LayoutComponentBase

所以現在可以來修改一下我們的模板內容。

以我博客的UI架構而言,博客分為了三個部分,頭部、尾部、內容。

@inherits LayoutComponentBase

<div class="wrapper">
    <Header />
    @Body
    <Footer />
</div>

@Body為固定語法,表示這裡是內容部分,其他的不變,只在這裏填充內容。

在Shared文件夾中添加兩個組件,頭部:Header.razor、尾部:Footer.razor

Header.razor的內容如下:

<!-- Header.razor -->
<header>
    <nav class="navbar">
        <div class="container">
            <div class="navbar-header header-logo">
                <NavLink class="menu-item" href="/" Match="NavLinkMatch.All">
                    阿星Plus
                </NavLink>
            </div>
            <div class="menu navbar-right">
                <NavLink class="menu-item" href="posts">Posts</NavLink>
                <NavLink class="menu-item" href="categories">Categories</NavLink>
                <NavLink class="menu-item" href="tags">Tags</NavLink>
                <NavLink class="menu-item apps" href="apps">Apps</NavLink>
                <input id="switch_default" type="checkbox" class="switch_default" />
                <label for="switch_default" class="toggleBtn"></label>
            </div>
        </div>
    </nav>
    <nav class="navbar-mobile">
        <div class="container">
            <div class="navbar-header">
                <div>
                    <NavLink class="menu-item" href="" Match="NavLinkMatch.All">阿星Plus</NavLink>
                    <NavLink >&nbsp;·&nbsp;Light</NavLink>
                </div>
                <div class="menu-toggle">&#9776; Menu</div>
            </div>
            <div class="menu">
                <NavLink class="menu-item" href="posts">Posts</NavLink>
                <NavLink class="menu-item" href="categories">Categories</NavLink>
                <NavLink class="menu-item" href="tags">Tags</NavLink>
                <NavLink class="menu-item apps" href="apps">Apps</NavLink>
            </div>
        </div>
    </nav>
</header>

可以看到有很多的NavLink組件,這是我將a標籤轉換后的內容,其實最終生成的也是我們熟悉的a標籤,不過他自然有獨特用處,看介紹:

創建導航鏈接時,請使用 NavLink 組件代替 HTML 超鏈接元素 (<a>)。 NavLink 組件的行為方式類似於 <a> 元素,但它根據其 href 是否與當前 URL 匹配來切換 active CSS 類。 active 類可幫助用戶了解所显示導航鏈接中的哪個頁面是活動頁面。

Footer.razor的內容如下:

<!-- Footer.razor -->
<footer id="footer" class="footer">
    <div class="copyright">
        <span>
            Powered by <a target="_blank" href="http://dot.net">.NET Core 3.1</a> and <a href="http://blazor.net/">Blazor</a> on Linux
        </span>
    </div>
</footer>

然後刪掉默認的多餘的組件:NavMenu.razorSurveyPrompt.razor

還有一個_Imports.razor,這個就是用來導入命名空間的,放在這裏面就相當於全局引用了。

現在去編輯我們的首頁Index.razor

@page "/"

<div class="main">
    <div class="container">
        <div class="intro">
            <div class="avatar">
                <a href="javascript:;"><img src="https://static.meowv.com/images/avatar.jpg"></a>
            </div>
            <div class="nickname">阿星Plus</div>
            <div class="description">
                <p>
                    生命不息,奮鬥不止
                    <br>Cease to struggle and you cease to live
                </p>
            </div>
            <div class="links">
                <NavLink class="link-item" title="Posts" href="posts">
                    <i class="iconfont iconread"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="Notes" href="https://notes.meowv.com/">
                    <i class="iconfont iconnotes"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="API" href="https://api.meowv.com/">
                    <i class="iconfont iconapi"></i>
                </NavLink>
                <NavLink class="link-item" title="Manage" href="/account/auth">
                    <i class="iconfont iconcode"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="Github" href="https://github.com/Meowv/">
                    <i class="iconfont icongithub"></i>
                </NavLink>
                <NavLink class="link-item weixin" title="掃碼關注微信公眾號:『阿星Plus』查看更多。">
                    <i class="iconfont iconweixin"></i>
                </NavLink>
                <div class="qrcode">
                    <img src="https://static.meowv.com/images/wx_qrcode.jpg" />
                </div>
            </div>
        </div>
    </div>
</div>

@page指令用於設置頁面路由地址,因為是首頁,所以直接給一個”/”就可以了。

至此項目算是搭建完成並且將其改造了一番,現在可以去運行一下看看效果了。

第一次打開或者強制刷新頁面會出現加載中的界面,我這裏就是一個小圈圈在那裡轉,當加載完畢后就會自動消失,什麼都不需要干,太方便了。

現在已經成功將首頁的显示搞定了,隨便點擊幾個按鈕試試,會輸出一個錯誤提示:Sorry, there’s nothing at this address,因為沒有找到這些路由,所以就…

默認的有點丑,並且這句提示當然也可以自定義的,現在來看最後的一個組件App.razor

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <p>Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>

通過語義化的代碼不難理解,Found就是找到與之匹配的路由,然後調用模板MainLayoutNotFound就是沒有找到的情況下,使用MainLayout並且在@body輸出一句提示。

將這句錯誤提示做成一個公共的組件並且美化一下,在Shared文件夾下新建組件:ErrorTip.razor,內容如下:

<div class="main">
    <div class="post-wrap">
        <h2 class="eror-tip">Sorry, there's nothing at this address.</h2>
    </div>
</div>

使用組件也很簡單,在App.razor中刪掉默認的p標籤然後調用ErrorTip

...
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <ErrorTip />
        </LayoutView>
    </NotFound>
...

再看一下打開了不存在路由的頁面的錯誤提示吧。

哈哈哈,是不是好看許多,接下來會完成主題切換,菜單展開關閉等等功能,其實這些可以用JavaScript很方便的實現,但是既然用了 Blazor 開發,所以還是用 .NET 代碼實現吧。

本篇就先到這裏,未完待續…

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

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

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

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

分類
發燒車訊

別再重複造輪子了,幾個值得應用到項目中的 Java 開源庫送給你

我是風箏,公眾號「古時的風箏」。文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裏面。公眾號回復『666』獲取高清大圖。

風箏我作為一個野路子開發者,直到遇見下面的這幾個工具庫,才知道之前重複造了不少輪子,而且輪子還不一定有人家的圓。相信跟我一樣,沒事兒造輪子的人還不在少數,有些人就是對造輪子感興趣,這個咱也無話可說,但是,比如我,我是造輪子之前不知道這世上已經有好用的輪子了,害,無知限制了我的想象力。

比如我們在拿到一個 List 集合之後,要對這個集合進行判空操作,以前我一直是這樣寫的:

List<String> list = getList();
if (list != null && list.size() > 0) {
    //do something
}

雖然這樣也沒什麼問題,但是,我懶啊,每次敲這麼多代碼,也挺累啊。有同學說,那你包裝成一個方法不就行了,每次調用個方法就 OK 啦。這不,同學,你就在造輪子了,已經有人幫你寫好了這樣類似的一系列方法了。

來讓我們認識認識這些輪子吧。

Java 8 Stream

Stream 不算是工具庫,但是通過 stream 提供的一系列方法,可以實現集合的過濾、分組、集合轉換等諸多操作。

例如下面的方法,實現列表元素根據某個字段去重的功能。

List<User> userList = new ArrayList();
//添加元素
userList =  userList.stream().filter(distinctByKey(user->user.getUserId())).collect(Collectors.toList());

private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
      Map<Object,Boolean> seen = new ConcurrentHashMap<>();
      return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

apache commons

官方地址:http://commons.apache.org/

這不是一個庫,而是一系列的工具庫。

由於包含的庫過多,我就不一一列舉了,可以到官網一探。有集合處理的、數學計算的、IO 操作的等等,其中最常用的莫過於 Apache Commons Lang 和 Apache Commons Collections 這兩個。

Apache Commons Lang 包括一系列工具類,有字符串相關的、時間處理的、反射的、併發包的等等,Apache Commons Collections 專門用作集合處理。

下面舉幾個例子說明一下,更詳細的內容可以到官網查看文檔。

字符串判空操作

String s = "";
Boolean isEmpty = StringUtils.isEmpty(s);

獲取類的全名稱

ClassUtils.getName(ClassUtils.class);

判斷集合是否為空

Boolean isNotEmpty = CollectionUtils.isNotEmpty(list);

反射獲取某個類的所有 Field

Field[] fields = FieldUtils.getAllFields(User.class);

Google Guava

官方地址:https://github.com/google/guava

和 Apache Commons 有點兒類似,它也是包含了一系列的比如字符串、集合、反射、數學計算等的操作封裝,還可以用作 JVM 緩存。

舉幾個例子說明:

New 各種對象

List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String,Object> map = Maps.newConcurrentMap();

// 不可變集合
ImmutableList<String> immutableList = ImmutableList.of("1", "2", "3");

列錶轉符號分隔的字符串

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
String result = Joiner.on("-").join(list);

> 1-2-3

求交集、並集、差集等

例如下面代碼求 set1 和 set2 的交集

Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5, 6);
Set<Integer> set2 = Sets.newHashSet(1,2,3,4);
       
Sets.SetView<Integer> intersection = Sets.intersection(set1, set2);

Joda Time

官方地址:https://www.joda.org/joda-time/

一個日期、時間處理的工具庫。如果你不是經常做日期處理,那差不多每次需要的時候都需要查詢相關的 API,而有了工具類就不一樣了,只要一個 “.”,你想要的方法就出現了,而 Joda Time 就是一款好用的工具庫。

比如下面這個方法,計算到新年還有多少天。

public Days daysToNewYear(LocalDate fromDate) {
  LocalDate newYear = fromDate.plusYears(1).withDayOfYear(1);
  return Days.daysBetween(fromDate, newYear);
}

OkHttp3

官方地址:https://square.github.io/okhttp/

一個 HTTP 客戶端,使用簡單,性能良好,是時候放棄 HttpClient 了。

一個 get 請求:

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

一個 post 請求:

public static final MediaType JSON
    = MediaType.get("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(json, JSON);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

Json 系列

Jackson

Spring 默認的 Json 序列化工具,其實已經足夠用了。

Gson

Google 出品,功能齊全。

FastJson

阿里出品,算法良好,性能最優。

EasyExcel

官方地址:https://www.yuque.com/easyexcel/doc/easyexcel

阿里開源的 Excel 操作工具庫,可以看做是 Apache POI 的增強封裝版、優化版。

如果你的數據量很大,那用 EasyExcel 可以節省內存,提升效率,並且沒有併發風險。

如果你的 Excel 足夠複雜,那用 EasyExcel 會比你直接用 POI 少些很多代碼。

比如我實現了下面這個 Excel 動態導出,包括動態表頭、動態合併單元格的功能,只用了很少的代碼,如果是使用 POI 的話,那可能代碼量增加不止一倍啊。

TinyPinyin

官方地址:https://github.com/promeG/TinyPinyin

中文轉拼音,把你輸入的中文轉換成拼音。比如搜索功能要實現這樣的功能,輸入 “fengzheng” 搜索,會匹配到 “風箏”這個詞語,這就需要中文轉拼音了。

有的同學說了,這不是拼音轉英文嗎?當然不是在輸入“fengzheng”的時候轉換了,而是在包含“風箏”的這條記錄中有一個拼音的額外字段,這樣搜索的時候直接匹配拼音那個字段。

chinese_name pinyin_name
風箏 fengzheng

反射工具庫 – jOOR

官方地址:https://github.com/jOOQ/jOOR

它是 JDK 反射包的友好封裝,通過一系列簡單友好的鏈式操作實現反射調用。比如下面這個例子

public interface StringProxy {
  String substring(int beginIndex);
}

String substring = on("java.lang.String")
                    .create("Hello World")
                    .as(StringProxy.class)
                    .substring(6);    

簡單的代碼實現 JDK 動態代理,節省了不少代碼。

MyBatis-Plus

官方地址:https://mp.baomidou.com/

只要你的項目中有數據庫訪問,那你肯定用過或者至少聽說過 MyBatis ,但是如果你只用 MyBatis 需要針對每個DAO方法寫對應的 SQL Statement(也就是 mapper.xml 中的代碼塊),當然有一些自動生成的工具,MyBatis 就有它提供的 MyBatis Generator,比如我也稍做加工,做過一個web 版的 MyBatis Generator,開發效率是提高了,但是每個 mapper.xml 文件的代碼量很大,於是 MyBatis-Plus 就要出場了。

官網上對他的定義如下:

  1. 只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑。
  2. 只需簡單配置,即可快速進行 CRUD 操作,從而節省大量時間。
  3. 熱加載、代碼生成、分頁、性能分析等功能一應俱全。

最後,在配上 MybatisX IDEA 插件,也是可以了。

vjtools

官方地址:https://github.com/vipshop/vjtools

這是唯品會的開源工具包,這裏主要介紹其中的 vjkit 模塊,是關於文本,集合,併發等基礎功能的核心類庫。這個庫是我很早之前搜索日期操作的時候偶然發現的,我發現裏面日期處理的 API 相當全面而且很實用,還在我的項目中用過一段時間。

最後

好用的工具庫可以提高我們的開發效率,而且也是我們學習源碼的好去處,和其他的開源框架(比如 Spring、Dubbo)一樣,看看優秀的代碼是如何實現的。

如果你還知道什麼好用、強大的開源工具包,歡迎在留言區分享,好東西不能獨享,讓更多的人受益。

各位大佬,給個推薦,讓我奮發圖強

我是風箏,公眾號「古時的風箏」。一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!你可選擇現在就關注我,或者看看歷史文章再關注也不遲。

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

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

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

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

分類
發燒車訊

如何優雅地向公司提加薪

二哥,你好呀,我是你鐵杆粉絲,想向你請教一個問題。我是 2019 年 3 月份入職的,當時很菜,接手的是一個要離職同事的代碼,可把我害慘了,一邊推進度,一邊修 bug,7 月份一整個月都沒有在凌晨 3 點前睡過。幸好挺了過來,截止目前在公司待了一年零兩個月了,想找領導談薪水的問題,但不知道如何開口。

以上是讀者奔三十私信我的問題,很有代表性,我計劃着好好寫一篇文章來統一回復下,結果一拖再拖,拖了快一個月時間,真的非常非常抱歉。

我之所以拖,有兩個原因。第一個原因就是這個問題確實不太好回答,因為我自己親身經歷的漲薪就那麼幾次,並且我沒去過大廠,經驗不一定具備普適性;第二個原因就是,拖延症犯了,呵呵(戰術性)。

那接下來,就談談我自己僅有的幾次加薪情況吧,希望給小夥伴們一些參考。

我是大三就出去實習的,當時工資 1200 塊一個月,一起進來的二十多名新人都這個標準。這個不算是加薪,但起點大家要了解一下。

簡單介紹一下背景,可能一些新來的讀者不太清楚。

我是一名大專生,這沒什麼可恥的,真的。經常有一些讀者私信我說,“二哥,我學歷不好,大專生,畢業后被歧視怎麼辦?”

起點低,被歧視是正常的,要學會接受。人生下來就不是平等的,我們要做的就是自尊自愛。網絡上經常遇到一些噴子,留言噴我垃圾,我就回一句話:“我與你的區別就是,我越來越強大,而你,還是那個噴子,而已。”

大二結束后,我就去蘇州一家軟件園培訓了倆月,然後入職了一家日企(江蘇富士通,讀者群體里有沒有知道這家公司的?),當時軟件部剛剛成立,急需新鮮血液的融入,而我們這些廉價的勞動力正好是壓榨的對象。

實習結束后,回學校拿了畢業證(順帶和女朋友團聚了倆月時間),然後正式入職。但記不得當時具體的工資是多少了,四五千吧。

這次加薪我是沒有資本吭聲的,因為有一份工作就不錯了。況且這家公司發展的真不錯,項目部不斷擴大,剛開始一個部門,我回洛陽的時候已經四個部門了。

關鍵是,不缺項目啊,日方那邊源源不斷地供給着項目,最重要的是,資金。公司本來還有一片地,在鄧蔚路的綠寶廣場附近,修地鐵的時候賣了,然後在一個叫什麼區的地方買了幾棟樓,名字我忘記了,當時挺偏僻的。

女朋友畢業后,去蘇州過一段時間,我們在市區租了一間房子,每次上班我要先走一段路,搭公司的大巴去上班,要一個小時左右車程呢。

由於我是大專生,所以這次加薪,要比本科學歷的同事少三四百,具體数字同事之間也不太方便交底,反正是確實少一些,但差額並沒有很離譜。

正式入職一年後,我換了一個項目組, 改做 Flex 了。之前基本上是打雜,搞過 SQL、搞過 Ruby、搞過 Spring + Hibernate + Postgresql,基本上是哪需要就往哪插。

這一年時間里,我了解到公司的發展重心將會是 Flex,就私下里研究了整個框架的源碼,並且寫了一個內部聊天工具,供幾個老資格的同事聊魔獸世界用。這點我在之前的文章里提到過。

(心機 boy,有沒有?)

正是憑藉這個不起眼的工具,我被這幾個老資格的同事推薦給了後來的直屬領導,說我這個年輕人有技術,頭腦又靈活,是塊好材料。

新成立的項目組,加上翻譯,好像是二十三個人,不算小的一個團隊了。我帶五個新人編碼。

就這樣幹了半年,領導覺得我的表現無可挑剔,確實能攻堅,就主動找我提加薪。當時激動壞了,內心告訴自己,一定要多要點,超過那幾個一塊來的本科生。

然後我就順嘴說了一個數目,自己覺得不算少了,領導也二話沒說就欣然答應了。

結果,我特么天真了,當時要太少了。後來幾個同事透露說,我提的額度和他們差不多。麻蛋,白白錯過了一次拉開差距的機會啊。

事後諸葛亮一下,要提加薪,最好了解一下公司內部的行情(想辦法)。領導他自己那是有個標準的,如果你確實表現優異,要想盡辦法知道領導這個線是多少,然後再這個基線上往上浮動一些,尤其是領導主動過來問價的時候。

第二次加薪是我離開蘇州的前一個月,2013 年底。這次加薪是公司主動加的,因為之前的合同到期了。

我當時和之前的那個領導鬧翻了,被調換到了另外一個開發部,所以動了離開的心思。再加上女朋友已經回到了洛陽,確實到了該和蘇州說再見的時候了。

拿到第一筆獎金后,我提了離職。結果公司比我精明得多,年底的獎金是分批發的,況且第二筆獎金比第一筆獎金多得多。我顯然是沒機會拿第二筆了。

過年前,領導終於批了我的離職申請,手續辦完,公積金取了出來后,我就回洛陽了——帶着不舍,畢竟在蘇州生活了三年半,有感情了。

第三次加薪是我回到洛陽工作后的第二個月,2014 年 3 月份。當時實習工資只有 2500,實在是受不了,第二個月過了一周我就迫不及待地找領導申請轉正了。

公司是一家挂名北大青鳥的培訓機構,不過我不是做講師,而是在獨立運營的開發部——承接一些政府或者個人項目。

團隊小,而我的實力確實過硬,再加上和領導、人事之間的關係好,公司就破格給我轉正了,工資上漲了 2/3,並且繳納了五險一金,加上績效獎,每個月到手的工資超過了當時洛陽的平均房價。

為什麼敢提轉正,敢提漲薪,這裏很重要的一點就是,我在團隊的表現是獨一檔的,工作上沒有解決不掉的難題,還能給領導提出建設性的意見,關係處得非常好。

每天早上,我基本上是第一個到工作崗位的,因為辦公室鑰匙我拿着,不去早也不行啊——當然了,這件事是我主動請纓的。

(心機 boy,有沒有?)

因為是指紋打卡嘛,我打卡的時間還被人事在月度總結會議上表揚過一次。上班早,下班我也不甘示弱,領導啥時候走我就啥時候走。

所以,綜合工作表現,為人處事的表現,公司不給我轉正說不過去啊,對不對?

簡單總結一下,也算是對讀者奔三十的一些建議。如何優雅地向公司提加薪?必須得做好以下三點:

第一,工作表現確實沒得說,該抗的事得能抗下來。逼着領導過來找你加薪,前提是自己一定要了解公司內部的漲薪結構,不要少要,也不要獅子大開口。

第二,如果是小公司的話,和領導的關係走得近一些,和同事之間的關係處得好一些,不要背後捅刀子。這樣提加薪的時候,領導不為難。

第三,臉皮要厚,臉皮要厚,臉皮要厚,重要的事情說三遍。

如果覺得文章對你有點幫助,請微信搜索「 沉默王二 」第一時間閱讀。回復關鍵字「簡歷」更有一份技術大佬整理的優質簡歷模板,助你一臂之力。

本文已收錄 GitHub,傳送門~ ,裏面更有大廠面試完整考點,歡迎 Star。

我是沉默王二,一枚有顏值卻靠才華苟且的程序員。關注即可提升學習效率,別忘了三連啊,點贊、收藏、留言,我不挑,嘻嘻

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

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

分類
發燒車訊

移動UI系列 – 簡單地使用半衰期算法來預測手勢的滑動方向與速度

前言

有一個問題, 給定一個物體的運動軌跡, 包含時間和坐標的數組, 如何使用這個數據來預測物體未來的運動走勢??

本文提供了一個很簡單的方式去實現這個算法. 效果夠用, 又簡單, 有一定的準確程度. 

 

緣由

以前做過的一些手機應用, 沒有做動畫的, 也沒做手勢. 這個做起來挺麻煩的. 

最近開始了新的手機項目(微信項目模板) , 基於 Blazor server side , 其組件化的方式可以很方便地把各種常用的通用的東西封裝成 組件/控件 

於是, 就打算讓這段時間辛苦一些, 一次過把動畫的部分補上, 讓以後的項目更加牛逼, 意思是讓客戶更加樂意地掏錢. 

 

問題

手勢的一個問題是力度/速度判斷, 劃得快, 劃得慢, 先快後慢, 先慢後快, 都得有一個合適的算法來得到一個最後速度. 

這個算法一定要滿足基本的需求後, 要盡量簡單, 要目測, 理論上沒有bug . 

這個時候, 半衰期算法就派上用場了. (不知道有沒有半衰期算法這玩意, 應該說是使用半衰期的原理)

 

原理

這是一個很簡單的權重計算, 有很多個不同時間點的坐標, 每個相鄰時間的兩個數據, 有距離差, 有時間差

關鍵是解決先慢後快, 先快後慢的數據的處理問題, 那麼我們只需要

把新的數據, 乘以更大的權重, 把老的數據, 乘以更小的權重, 最後得到這個距離權重的合成值, 就OK了. 

 

預覽效果:

注意, 因為gif的幀數不夠, 要更好效果還是複製代碼運行一遍. 

 

 

測試代碼:

<! DOCTYPE html > 
< html > 
< head > 
    < meta charset ="utf-8"  /> 
    < title > Half Life </ title > 
    < style > 
        html, body, canvas { width : 100% ; height : 100% ; margin : 0 ; padding : 0 ; box-sizing : border-box ; overflow : hidden ; }
    </ style > 
</ head > 
< body >

    < canvas ></ canvas >

    < script type ="text/javascript" >

        var CONST_HALF_LIFE_SPAN =  50 ;     //半衰期,設置得越小,就越看淡以前的速度
        var CONST_MAX_SAMPLES =  15 ;         //保留最後15個點的數據減少無意義的運算量,主要看瀏覽器觸發onmousemove的頻率來調整.

        var pts = [];
        document.onmousemove =  function (e) {

            //儲存數據
            pts.push({ time: Date.now(), x: e.clientX, y: e.clientY });
             if (pts.length > CONST_MAX_SAMPLES) pts.shift();

            //計算

            var xs =  0 , ys =  0 ;     //走過的路的長度. 
            var previtem = pts[ 0 ];
             for ( var index =  1 ; index < pts.length; index ++ ) {
                 var newitem = pts[index ];
                 var t = newitem.time - previtem.time;

                //讓這個數據衰減一次,衰減程度由時間差決定. 
                var halflifefactor = Math.pow( 0.5 , t / CONST_HALF_LIFE_SPAN);

                //注意,這裏沒有計算速度,而是直接用距離來預測將來要走過的距離.

                //走過的距離每一次都要衰減,每一段的路程都多次乘以各時間差的factor, 
                //原理是, 0.5 ^ (t1 + t2 + t3...)等於0.5 ^ t1 * 0.5 ^ t2 * 0.5 ^ t3 * ... 
                xs = xs * halflifefactor + newitem.x - previtem.x;
                ys = ys * halflifefactor + newitem.y - previtem.y;

                previtem = newitem;
            }

            //畫圖

            var CONST_EFFECT_FACTOR =  2 ;     //乘以一個因素來畫圖用,這裏數值可以充當'摩擦係數'大小的效果. 
            xs = Math.floor(xs * CONST_EFFECT_FACTOR);
            ys = Math.floor(ys * CONST_EFFECT_FACTOR);

            var x0 = e.clientX, y0 = e.clientY;

            var canvas = document.querySelector( " canvas " );
             var ctx = canvas.getContext( " 2d " );
             var w = canvas.width = canvas.offsetWidth;
             var h = canvas.height = canvas.offsetHeight;
            ctx.clearRect( 0 , 0 , w, h);
            ctx.lineWidth =  5 ;
            ctx.strokeStyle =  " blue " ;
            ctx.beginPath();
            ctx.moveTo(x0, y0);
            ctx.lineTo(x0 + xs, y0 + ys);
            ctx.closePath();
            ctx.stroke();

            console.log(xs, ys)
        }
    </ script >

</ body >

</ html >

 

簡單講解

可以看出, 代碼量非常少. 與其說這是一種”算法” , 不然說是一種”思路” 

 

代碼先是記錄每一點的數據, 然後放進 pts 數組 

在鼠標移動後, 使用pts 數組, 計算出每一點的x , y 的移動量, 讓每一段的移動量都使用 半衰期 的方式進行調整. 

最後得出的xs , ys ,是理論上“最近移動的距離.”

使用這個數值,作為“參考值” ,就可以用於更多的判斷. 

 

例如我最近做的一個簡單的 swipe 組件, 

手指滑動了1/4個屏幕,然後再加上理論的參考值,  一共超過了1/2個屏幕,就切換到下一個panel 

這個參考值很重要. 如果手指只是很慢地滑動, 那麼參考值就很小, 就不應該切換. 如果手指很快地滑動, 那麼就應該切換panel

 

可改良的方案

上面方案, 是計算’移動距離’ 的, 它有一個弊端, 無論劃得多快, 移動的總數是有上限的. 

這段代碼完全可以 除以t , 得到一個 速度值,

這更加合理, 但是注意速度的合成方式不能普通地累加. 

 

這就留給有興趣的網友自己嘗試了. 也不難. 畢竟本文傳播的是 半衰期 的思路. 不宜說太細. 

 

 

擴展思路

其實這種算法, 一直都有人用. 很奇怪的就是, 沒有看到什麼人專門寫文章介紹? 

半衰期除了計算運動軌跡, 還可以很好地去統計熱度. 

例如一篇文章, 一個視頻, 有不同時段的點擊數量. 每一天都不一樣. 

 

怎樣使用最少的儲存方式, 去儲存一個合理的熱度參考值? 

可行的方法是,儲存兩個數值 (就夠了) : 

articleRateValue 用於儲存熱度值

articleRateTime 用於儲存熱度時間

 

每一次點擊, 都使用這個公式儲存: 

articleRateValue = newclickcount + articleRateValue * POW(0.5, (NOW – articleRateTime) / HALF_LIFE_SPAN )

articleRateTime = NOW 

排序的時候麻煩點, 要實時的計算 articleRateValue * POW(0.5, (NOW – articleRateTime) / HALF_LIFE_SPAN ) 來得到每個文章的熱度值. 

(對於排序的問題, 還有兩個變通的做法, 如果以後有時間寫一篇文章細說這個熱度方案, 再詳細解說)

(最簡單的變通方法是, 每晚找服務器空閑的時候, 把表裡的數值都重新計算一次, 平時排序的時候不計算) 

 

注意這裡有一個 HALF_LIFE_SPAN 的概念. 如果 HALF_LIFE_SPAN 是一天, 那麼昨天的熱度就佔1/2 權重, 前天的就佔 1/4 權重, 大前天的佔1/8 

這樣按天算也有個弊端, 我想按週, 按月算那怎麼辦? 

再存兩組數值 :

weeklyRateValue

weeklyRateTime

monthlyRateValue

monthlyRateTime 

如此類推. 

 

這樣做的最大好處是, 無需詳細地紀錄每一次的點擊數據. 非常節省空間.  

缺點是, 每一組數據, 只適合一個半衰期時段的數值, 要儲存多個參考值得準備多組數據. 

 

最後

時間過得真快. 這段時間挖的坑太多, 在業餘時間內根本沒有時間填坑..

5月初的時候實現了BlazorCefApp , 到現在開了幾個有意義的坑, Blazor微信項目模板 算是一個. 

但是由於沒有時間寫博客, 有時只是偶爾把測試的視頻放到B站: https://space.bilibili.com/540073960 

有興趣用Blazor 來做微信項目或手機網頁項目的, 可以去了解一下. 當項目成熟後, 會發佈到github上. 

—-

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

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

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

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

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

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

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