月銷量過萬的自主品牌家轎 外觀時尚配置實用車主們滿意嗎_貨運

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

1萬最值得表揚的地方:外觀絕對算是最滿意的,很漂亮時尚,大氣穩重,改款后增加的配置也很多,內飾也上檔次了,空間也能滿足家庭日常使用,給人很寬敞的感覺,動力完全夠用,性價比非常高。尚有不足:整車做工方面還有待提高,一擋換二擋有點不順暢,低扭有點不足,後排座椅不能比例放倒。

長安汽車-逸動

指導價:8.09-24.99萬

基本資料

長*寬*高(mm) 4620*1820*1490

軸距(mm) 2660

動力系統

1.6L+5擋手動/4擋手自一體

車主一

購買車型:2016款 1.6L 手動風尚型

裸車價格:7.1萬

最值得表揚的地方:外觀絕對算是最滿意的,很漂亮時尚,大氣穩重,改款后增加的配置也很多,內飾也上檔次了,空間也能滿足家庭日常使用,給人很寬敞的感覺,

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

動力完全夠用,性價比非常高。

尚有不足:整車做工方面還有待提高,一擋換二擋有點不順暢,低扭有點不足,後排座椅不能比例放倒。

車主二

購買車型:2016款 1.6L 自動風尚型

裸車價格:7.5萬

最值得表揚的地方:外觀時尚動感,線條流暢,給人十分耐看而大氣的感覺,小改款后的內飾中控台材質有改良過,質感比較好,主被動安全配置明顯提高了,乘坐空間和舒適性都令人滿意,綜合實力強。

尚有不足:後排座椅沒有中間頭枕,油耗稍微高點,液壓助力方向盤有點重,4AT變速箱有點落後,開起來感覺比較肉。

編輯點評:逸動在自主品牌當中做工算是比較出色的,但細節上還和合資品牌有一定差距,配置上已經跟得上主流,但是發動機、變速箱等技術還有待進一步提升。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

各督察組組長深入一線推進中央生態環境保護督察工作_貨運

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

2020-09-20

2020-09-20
分享到:
[打印]
字號:[大] [中] [小]

  第二輪第二批中央生態環境保護督察進駐以來,各督察組組長身體力行,率先垂範,深入學習貫徹習近平生態文明思想,堅決扛起政治責任,把握督察方向,狠抓隊伍建設,帶領督察組紮實開展工作。

  張寶順組長要求對標對錶習近平生態文明思想和習近平總書記對北京市一系列重要講話精神,深刻領會習近平總書記給建設和守護密雲水庫鄉親們的重要回信精神,堅持高標準、嚴要求,堅持以人民為中心的發展理念,聚焦突出生態環境問題,精準、科學、依法開展督察。督察進駐以來,他先後帶隊赴北京石景山、昌平、門頭溝、房山、通州等區開展實地督察調研,深入宣貫習近平生態文明思想,深入了解基層生態環境保護工作情況,特別是第一輪中央環保督察整改情況,督促地方高度重視生態環境整治工作。

  焦煥成組長要求將全面從嚴治黨貫穿於督察工作始終,充分發揮督察組臨時黨支部戰鬥堡壘作用和全體黨員先鋒模範作用,堅決貫徹落實習近平生態文明思想,堅決扛起政治責任。他先後帶隊赴天津津南、薊州、武清等7個區現場督察調研七裏海濕地修復治理、獨流減河污染整治等20多個問題點位,在調研獨流減河北堤水產養殖尾水治理、農業面源整治、濕地修復等情況和咸陽路污水處理廠、靜海區楊成庄鄉東寨村污水處理站等點位后,他強調,生態修復治理要因地制宜、分類施策,不能搞“一刀切”。

  耿惠昌組長帶頭學習習近平總書記關於中央生態環境保護督察工作、浙江省生態環境保護方面的重要指示批示精神,先後赴杭州、紹興、嘉興等地現場督察調研,現場察看紹興市賀家池區域環境綜合整治情況,詳細詢問整治工作面臨的困難和具體做法,了解督察整改落實、群眾信訪投訴舉報調查處理和服務“六穩”“六保”大局等情況,要求地方要深入貫徹落實習近平生態文明思想,對標對錶習近平總書記賦予浙江的新目標、新定位,進一步扛起生態文明建設先行示範的使命擔當。

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

  李家祥組長要求督察組全體黨員幹部要深入學習貫徹習近平生態文明思想和習近平總書記關於生態環境保護的重要指示批示精神,嚴格按照部門督察規範組織開展工作,主動加強與國家能源局的交流溝通。他還帶隊赴河北張家口、山西大同下沉走訪,實地了解我國新能源建設和煤炭行業清潔生產情況。在現場調研時指出,要堅決貫徹落實習近平總書記關於能源發展的重要指示精神和黨中央、國務院決策部署,推動能源供給側結構性改革,堅持生態優先,积極化解過剩煤炭產能,推動能源綠色發展,助力打贏污染防治攻堅戰。

  於廣洲組長在對國家林草局的督察工作中,反覆強調要深入學習貫徹習近平生態文明思想,並用習近平生態文明思想指導推進督察工作。在大興安嶺督察調研期間,面對地處偏遠,交通不便的大興安嶺林區總部,他表示,來林草局督察,大興安嶺的情況不掌握不行。在察看大興安嶺林木種苗基地和南瓮河濕地國家級自然保護區等地后,他指出,大興安嶺的森林和濕地是東北地區的生態屏障,是保護黑土地的重要依託,廣大林草工作者要深入領會習近平總書記重要指示批示精神,統一思想、提高認識、加強研究、強化保護。

  黃龍雲組長帶頭學習貫徹習近平生態文明思想,在工作中始終堅持問題導向,把握督察重點方向,身體力行深入一線督察調研生態環境問題。督察進駐以來,先後帶隊赴中國鋁業集團公司所屬8家重點企業開展現場督察調研。每到一處,都詳細了解企業生產經營和生態環境保護情況,直奔產污節點和環境風險點,查看台賬記錄、在線監測數據等,對生態環保做得好的企業給予充分肯定,對發現的問題嚴肅指出,並督促企業邊督邊改、立行立改,有效傳導壓力,推進突出生態環境問題解決。

  蔣巨峰組長先後深入中國建材集團所屬7家企業,聚焦重點,直奔問題開展現場督察調研,並以座談會形式與企業有關人員開展深入交流,對發現的共性問題,要求集團公司有關部門及企業上一級公司要認真研究、舉一反三,深入學習領會貫徹落實習近平生態文明思想,將新發展理念貫穿到企業發展戰略布局和生產經營中。下沉督察期間,他始終走在隊伍最前面,在浩源水泥所屬金鑫礦山,他不顧道路崎嶇,現場檢查了3個礦坑的生態修復情況,他邊走邊問,邊看邊督,切實推動環境保護主體責任落到實處。

  在各位督察組組長的帶領下,第二輪第二批中央生態環境保護督察順利進駐,各項督察工作有序開展,並取得較好的督察效果,特別是推動解決一批群眾身邊的生態環境問題,獲得人民群眾的認可和稱讚。

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

知名虐機頻道評選 2020 年智慧型手機耐用獎,誰是最堅固的贏家?_貨運

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

虐機,大概是所有消費者最感興趣的話題,哪一款手機最耐用、哪一款手機耐用性最差,還有更深奧的那些手機最容易被修復等。知名虐機頻道 JerryRigEverything 更是相當有名的其中翹楚,只要提到虐機就絕對不能沒有看過這頻道,近日該頻道評選出 2020 年的各種智慧型手機耐用性獎項,分享給大家一看。

知名虐機頻道評選 2020 年智慧型手機耐用獎,誰是最堅固的贏家?

要說專業拆機,大家會想到的 iFixit,如果講到專業虐機,那當然非 JerryRigEverything 莫屬。在2020 年裡面,該頻道虐盡市面上的主流機型,並且在豐富的經驗累積之下評選出 2020 年的各得獎者,接下來就來為大家列出到底有哪些獎項,又有哪些機型獲選為該獎項的得獎者吧!

(點選後面機型可前往查看虐機影片)

可維修性最高:Google Pixel 5
可維修性最低:黑鯊 3
最具創新性機型:ZTE Axon 20
榮譽獎:LG Wing
內部結構最好看的機型:iPhone 12 Pro Max
耐用性最差手機:OnePlus Nord
最讓人迷惑的手機:Google Pixel 5
耐用性最佳手機:Google Pixel 4a

從 2016 年開始,該頻道每年都會將虐過的手機整理起來,在看似無目的的破壞同時了解各手機的耐用度,並且在隔年初進行最終評分,讓大家都能了解過去這一年裡面哪些手機最是頭好壯壯。下面就與大家分享完整版的影片(前半段大概講了投入各種公益,還有自家買了什麼東西…)。

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

當然這裡被列入的機型都是比較大眾化、一般消費型手機,所以那些本來就是特定職業人士或專門設計在嚴峻環境中所使用的三防手機自然不在其中。

您也許會喜歡:

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

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

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

Redis詳解(十二)—— 緩存穿透、緩存擊穿、緩存雪崩_貨運

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

  本篇博客我們來介紹Redis使用過程中需要注意的三種問題:緩存穿透、緩存擊穿、緩存雪崩。

1、緩存穿透

一、概念

  緩存穿透:緩存和數據庫中都沒有的數據,可用戶還是源源不斷的發起請求,導致每次請求都會到數據庫,從而壓垮數據庫。

  如下圖紅色的流程:

  

 

   比如客戶查詢一個根本不存在的東西,首先從Redis中查不到,然後會去數據庫中查詢,數據庫中也查詢不到,那麼就不會將數據放入到緩存中,後面如果還有類似源源不斷的請求,最後都會壓到數據庫來處理,從而給數據庫造成巨大的壓力。

二、解決辦法

  ①、業務層校驗

  用戶發過來的請求,根據請求參數進行校驗,對於明顯錯誤的參數,直接攔截返回。

  比如,請求參數為主鍵自增id,那麼對於請求小於0的id參數,明顯不符合,可以直接返回錯誤請求。

  ②、不存在數據設置短過期時間

  對於某個查詢為空的數據,可以將這個空結果進行Redis緩存,但是設置很短的過期時間,比如30s,可以根據實際業務設定。注意一定不要影響正常業務。

  ③、布隆過濾器

  關於布隆過濾器,後面會詳細介紹。布隆過濾器是一種數據結構,利用極小的內存,可以判斷大量的數據“一定不存在或者可能存在”。

  對於緩存擊穿,我們可以將查詢的數據條件都哈希到一個足夠大的布隆過濾器中,用戶發送的請求會先被布隆過濾器攔截,一定不存在的數據就直接攔截返回了,從而避免下一步對數據庫的壓力。

2、緩存擊穿

一、概念

  緩存擊穿:Redis中一個熱點key在失效的同時,大量的請求過來,從而會全部到達數據庫,壓垮數據庫。

  

   這裏要注意的是這是某一個熱點key過期失效,和後面介紹緩存雪崩是有區別的。比如淘寶雙十一,對於某個特價熱門的商品信息,緩存在Redis中,剛好0點,這個商品信息在Redis中過期查不到了,這時候大量的用戶又同時正好訪問這個商品,就會造成大量的請求同時到達數據庫。

二、解決辦法

  ①、設置熱點數據永不過期

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

  對於某個需要頻繁獲取的信息,緩存在Redis中,並設置其永不過期。當然這種方式比較粗暴,對於某些業務場景是不適合的。

  ②、定時更新

  比如這個熱點數據的過期時間是1h,那麼每到59minutes時,通過定時任務去更新這個熱點key,並重新設置其過期時間。

  ③、互斥鎖

  這是解決緩存穿透比較常用的方法。

  互斥鎖簡單來說就是在Redis中根據key獲得的value值為空時,先鎖上,然後從數據庫加載,加載完畢,釋放鎖。若其他線程也在請求該key時,發現獲取鎖失敗,則睡眠一段時間(比如100ms)后重試。

3、緩存雪崩

一、概念

  緩存雪崩:Redis中緩存的數據大面積同時失效,或者Redis宕機,從而會導致大量請求直接到數據庫,壓垮數據庫。

  

   對於一個業務系統,如果Redis宕機或大面積的key同時過期,會導致大量請求同時打到數據庫,這是災難性的問題。

二、解決辦法

  ①、設置有效期均勻分佈

  避免緩存設置相近的有效期,我們可以在設置有效期時增加隨機值;

  或者統一規劃有效期,使得過期時間均勻分佈。

  ②、數據預熱

  對於即將來臨的大量請求,我們可以提前走一遍系統,將數據提前緩存在Redis中,並設置不同的過期時間。

  ③、保證Redis服務高可用

  前面我們介紹過Redis的哨兵模式和集群模式,為防止Redis集群單節點故障,可以通過這兩種模式實現高可用。

  

 

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

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

一反常態:疫情關店潮下,6000億美業市場為何堅挺?_貨運

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

不可否認,2020新冠疫情市場衝擊還在蔓延。

餐飲行業閉店潮未能平息,業內人稱“比2003年SARS期間還嚴重”;服裝行業每天都能看到閉店消息,專家預測整個行業全年可能蒸發掉4000億。

這是一場全球性全行業的覆蓋式衝擊。在美國,今年零售業閉店數量或超過2萬家,是去年兩倍多;在日本,最為熱門的拉麵館接連閉店,倒閉數量或將創近20年來之最。

但唯獨一個行業倖免於難——美業。

根據美團平台大數據統計,2020年美團平台美業店閉店率達到17.5%。但相較於2019年,這個数字居然下降了2.2個百分點。

可謂一反常態。

01

曾靠閉店賺錢的美業灰產

為什麼說美業的韌性存續一反常態?這源於兩點:

首先,疫情期間全行業式微,橫向比較來看,美業的堅挺令人匪夷所思。

其次,縱向來看,美業閉店率常年接近於20%,今年不增反降引人深思。

按照劃分,我們所提及的美業(生活美容服務業)包括生活美容、美甲、美髮、紋綉服務等細分行業。經美團研究院測算,這個行業在2020年的市場規模約為6373億元。

其中,美容美髮行業佔了半壁江山。中商產業研究院分析,預計到2022年中國美容美髮行業市場規模將突破4000億元。

可以說,美容美髮行業的發展,直接影響到整個美業的數據樣本。但從過往表現來看,這個行業卻是一個“賽博朋克”般的存在。

2019年,中國美容美髮行業參与者超過34萬。如此龐大的基數下,行業里沒有一家上市公司,反倒是渾水摸魚者眾。

他們最為外界所熟知的商業模式,就是“閉店割韭菜”。

模式一:割會員的韭菜

《廈門晚報》就曾報道,當地一家名為“造星計劃”的美容美髮機構,選址在商場角落,儘管生意蕭條,髮型師卻每天忙於拉消費者充值VIP卡。

短短5個月之後,該店人去樓空,商家捲走了近90萬元會員費。后經律師事務所判斷,這可能本就是一場早有預謀的圈錢跑路行為。

這不是孤例。大連一家剛開不久的美髮機構突然停業倒閉,老闆不知所蹤。而門店裡,張女士投放了2.4萬元的化妝品才上架4天就消失了。

而與張女士一同去報警的,還有200多名充值VIP卡的消費者。

類似的事情,2019年2月江西發生一例、4月石家莊發生一例、5月福州發生一例、8月濟南發生一例……

整合網絡各路消息,當年倒閉的大小理髮門店,特別是一二線城市的中低價位大店,至少達到了10000家。

模式二:割加盟商的韭菜

加盟被割韭菜,成為了近兩年的熱門關鍵詞。

特別是喜茶、奈雪の茶推動起來的奶茶加盟熱潮。在最終一年新增奶茶店2萬多家,90%都虧損的現實下,加盟韭菜逐漸被大眾所看清。

但在美容美髮領域,這已經成為了公認的套路。

據一位投資人朋友介紹,目前國內知名的某養發品牌,老闆賺到的第一桶金就來自於割韭菜。

20年前,這位老闆建立連鎖品牌搞生髮、療發、養發等各種業務,通過平面媒體大肆傳播后,收割了一波又一波加盟商。

平均下來,這位老闆每隔2年換一個品牌洗一遍加盟連鎖,翻了幾輪才有現在這個全國化品牌。

到底是哪家品牌?留言討論。

02

割韭菜背後的行業苦情

傳統美業鏈條上,其實各級經銷商都寄生在實體美業商家身上。加之實體門店租金、人力、水電等成本高企,部分商家為了自身存續,基本以賣貨為主要動力,最終忽略了產品質量、效果、品牌、口碑等因素。

虛假宣傳、強制消費、辦卡跑路……在那個“銷售即服務”的時代,他們在消費者心智中慢慢烙下了暴利者、商業騙子、割韭菜的形象。

但儘管如此,關於“割韭菜”的論述,業內人士其實是不承認的。他們給到的回應大多是:一顆老鼠屎壞了一鍋粥、圈錢跑路的都是極少數。

確也如此。從社會八卦回歸到商業本質,一切灰產、套路都不可能成為行業主流。只不過是負面內容易於傳播,遮掩掉了這個行業最本質的問題。

美業市場的本質問題是什麼?

美團研究院發布的《中國生活美容行業發展報告(2020)》显示:經營成本高、客流量低和人才不足,仍是生活美容服務業商戶面臨的主要問題。

報告數據甚至显示,超過50%的受訪商戶表示其經營成本占其門店收入的40%-50%;還有約30%的受訪商戶經營成本佔到了營收的70%以上。

難以節流的固定成本佔比過半,這意味着商戶用於開源的經營效率過低。要知道,商業的本質就是效率,低效增長相當於慢性自殺。

展開美業“拉新-留存-裂變”的經營閉環,不難發現其中的問題。

一、拉新環節:玩法傳統,獲客成本高企

就目前而言,市面上主流的拉新手段有兩種:

①通過爆款產品口碑傳播,多次曝光在微博、微信、小紅書等平台,吸引種子用戶。

②通過與當地擁有潛在用戶群的品牌進行異業合作,再通過線上營銷放大品牌聲量,圈攏第一批種子用戶。

作為線下實體門店,美業潛在用戶覆蓋範圍最多是周邊三公里,甚至單個社區。這樣說來,第二種玩法似乎靠譜。

但我們看到的美業拉新,不過是“姐妹同行一人免單”“只要你來,就打五折”“充值會員卡半價優惠”……

拉新轉化低,獲客成本高。

二、留存環節:忽略服務細節,顧客體驗感較差

用戶留存與否,在於他對整個消費流程的體驗評判。如果在你的門店消費體驗不好,就沒有留存可談。

傳統美業門店,進店就讓等座,等座就有人在打聽需求並推銷VIP,就連是服務過程中Tony、Anne等工作人員沒話找話聊會員卡。

專業美容中心艾維庭,服務細節把控比較精細。比如客人進店倒水,要求一定要有托盤,不能直接用手。

美髮品牌美聯社則更為乾脆。全國門店堅持不做銷售,13年來不賣一張卡,不賣任何產品。

進店環節的空間體驗、等待環節的時間體驗、消費環節的產品體驗,每一環都是影響用戶留存的關鍵。

三、裂變環節:傳統美業口碑不再

傳統大型美業,其實是靠信息不對稱來賺錢,靠推銷、類金融等手段快速擴張。但互聯網時代下,消費驅動難走,口碑驅動的時代到來。

但在忽略服務細節,顧客體驗感較差的情況下,口碑往往會變成差評。

“拉新-留存-裂變”的經營閉環難以打通,美業經營效率難以提升,高閉店率理所當然。

從滲透率和市場體量來看,6000億美業市場與咖啡茶飲略微相似,就連加盟割韭菜的橋段都曾一致地出現過。

但飲品行業新媒體《咖門》,在統計美團、大眾點評實時數據后發現:疫情期間咖啡館閉店率約為3.7%,茶飲店約為4%。

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

相較之下,美業17.5%的閉店率已然處在高位。

03

高閉店率下的行業轉型

從商業角度而言,行業有痛點就有需求,有需求就有市場。

2016年前後,一撥提供美業細分領域解決方案的創業者湧現。當時,一位從騰訊離職的朋友就打算在重慶市場免費幫助美業商家管理會員、產品分銷、營銷裂變等。

這套解決方案里,商家還可以在線採購物料,比如洗髮水、護髮素、吹風機等日常耗材。公司則靠這些產品的銷售,賺取上下游的差價。

沒想到的是,這些商家原本就有穩定的供貨商。他們在朝天門的批發市場里,可以用9元每桶的價格拿到高仿洗髮水。

這桶洗髮水,足夠洗100次頭。

這位朋友最終轉型了做了外包業務,但行業里其他的生活服務电子商務平台不斷出現,這些服務商正在重構傳統美業。

美團可謂其中代表。

美業領域,美團第一個推出了團購業務、第一個推出了基於LBS的本地生活營銷解決方案,第一個探索動態定價策略。

為我們熟知的營銷手段,是美團主導的多次行業聯動大促。比如,龍抬頭美髮大促、七夕大促、雙12大促等本地生活服務大促活動。

今年疫情期間,考慮到用戶宅家裡一兩個月沒有理髮,美團就在“龍抬頭”之際聯合本地生活服務商家推出安心理發活動,提供“3+N”項安心消費服務保障。

1個月下來,美髮服務訂單量暴漲898%,美甲訂單量上漲635%,美容服務訂單量上漲579%,美睫訂單量上漲301%。

而在後來的七夕聯動大促中,Tony老師亦然成為了七夕最忙碌的群體。

數據显示,七夕前3天,美髮、醫療整形、化妝品、美睫紋綉、養發等訂單量增長最快,其中,美髮訂單數量增長50.06%。

而現在打開美團的麗人頻道,也可以發現商家直播、達人探店、UGC點評等內容。美業在用戶拉新方面,玩出了線上線下聯動的新套路。

南京東路金牌精品店Nice Salon的美髮手藝人Justin就坦言,自己是藉助美團平台做起來的一個設計師,較沒上線美團時門店客人增加了至少50%。

Justin是學徒出身。通過每天工作11個小時,和不定期進修之後,他才自己出來創業開了一家美髮店。

美業市場和Justin一樣的人很多。他們幾乎沒有經管知識,店長的能力直接決定了門店的經營狀況。

就像疫情期間,各行業數據都顯現出一個市場洞察:用戶對價格的敏感度更高了,他們更願意選擇低價商品了。

可惜的是,大多數美業商家店長不清楚。

這時,美團只能為商家增加一項“任務”——上線一個低價的團購,比如19.9元洗吹、9.9元剪劉海,或者9.9元修眉。如果完成這條任務,美團給予相應商家的評分將提升。

儘管任務下達,還會有很多商家不理解為什麼要這麼做。但按要求完成任務的商家就會發現,其店鋪瀏覽量和轉化率得到了明顯提升。

這其實是美團上線的一套經營評分體系。針對那些不太懂“why”和“how”的商家,這個體系正“傻瓜式”地告訴他們怎麼去經營。

數據显示,該體系自2019年12月上線以來,美業商戶優質達標率從4%提升至21%,優質商戶訪問量提升33.4%。

訪問量的提升,能夠直接提升門店客流量的規模。但如此低價的引流,如果不搞點二次消費引導、提前鎖客等玩法,商家資金難以回籠。

辦張會員卡的老套路又回來了?

明顯行不通。“會員卡”三個,字早已透支了用戶對行業的信任度。另外,實體卡折扣計算邏輯複雜、會員管理程序繁瑣,反而會降低門店的運營成本。

美團則為商戶上線了数字會員卡。5次剪髮卡、3次美容卡,其試圖通過一次購買多次服務解決美業商家提前鎖客、回籠資金的需求。

從用戶角度而言,在美團為未來服務預付費,就像先團購后核銷一樣平常。整個交易過程中,最影響消費決策的信任問題得以解決。

從經營角度上看,第三方服務商更多是通過一系列的標準化工具去引導商家。這個行業大多是手藝人從商,真正會做生意的還是少數。

這估計才是傳統美業最大的癥結。當手藝人只會打磨產品,無法將產品巧妙地轉變為商品,這個行業的商業化必然走向畸形發展。

人,才是你的最佳商業模式。

為此,美團也在2017年推出了國內第一家“互聯網+美業”學習培訓平台——美團大學美業學院。

據悉,該平台上線1年就有66萬學員學習了1700多個課程。“怎麼玩轉美團”“怎麼玩轉互聯網+美業”,這個培訓平台就像一個商學院,為美業領域不斷輸出經營人才。

除了經營人才培訓,這裏還是行業人力資源交流中心。平台上,擁有超過35萬認證的手藝人信息,商家招聘、培訓學習等都能在這個集中地實現。

營銷、經營、人才,美團正在全方位保姆式助力傳統美業轉型升級。當然在這期間,有贊、博卡、美克拉等新入局者,都在用SaaS、培訓等方面賦能傳統美業。

但也有不少遺憾。

美團數據显示,就經營規模而言,接入平台的商戶中有64.0%的商戶為連鎖經營,有27.8%的商戶連鎖店鋪數量多於 5 家,有0.6%的商戶擁有50家以上的連鎖店鋪;未接入平台的商戶中有 75.6%的商戶為單店經營。

這意味着,藉助互聯網工具轉型的,雖然是行業腰部力量,但依舊是小部分。在這個頭部品牌市場份額不足2%的行業里,單店經營的螞蟻雄兵才是主流。

這是一群難以打動的人。在重慶南岸,40多歲的章磊就是一家美髮店老闆。他曾在新店階段試過美團,效果是:低價引流還有10多個點被提走,用戶卻沒有來過第二次。

從此,章磊也沒有再用過美團。

包括美團在內的諸多服務商也很苦惱。他們的業務員一再指導章磊這種單店小老闆經營,但後者從一開始認定的就是,只要上線美團就能引流。

在他們的字典里,只有打遊戲刷抖音,未曾想過空不下來學習怎麼經營。

服務商們對於美業数字化的探索還在初期階段。一種模式是否能夠通用於大品牌、中小連鎖、單店等全業態?目前並沒有可靠的數據回答這一點。

服務本來就需要一把活動扳手,去扭動行業里不同大小的螺絲。而真正要打造出這樣一把扳手,美團和它的同行還需要更多的時間。

04

美業迎來蓬勃新機遇

率先轉型的美業商業,在疫情中的韌性已得到了驗證。

武漢的MG美貫造型,歇業3-4個月後恢復營業。由於積壓需求得到報復性消費,其業績較去年還有所增長。

容顏管理中心Wake me,2-3月份沒有營業通過直播贈送洗手洗、酒精等維繫客情。4月初開業之後,1個月時間就恢復到了疫情前水平。

美聯社亦然。疫情之後,其營業收入就環比增長30%,4月恢復正常並反超2019年同期。

這些都是借力美團轉型的商家。也正是這些商家的韌性存續,疫情期間美團平台美業店閉店率較2019年下降了2.2個百分點。

當然,我們這不只歸功於美團数字化賦能,關鍵還在整個美業市場的增長。

比如后疫情時代,消費升級全面加速,人們更願意為提升生活品質而埋單。這聚焦到美業市場的表現,就是客單價提升、復購頻次增加,次線城市市場增長加速。

數據可以佐證一切。美團平台大數據显示,與2018年相比,2020年養發客單價提升了 26.4%,美甲、美髮客單價分別提升了 4.4%、2.9%。

城市市場的發展亦如所料。美團平台中 2019年一線城市活躍商戶數量同比增長率為 41.0%,新一線城市增長率為53.2%,二線城市增長率為58.1%,而三線城市和其他城市的增長率則分別達到了66.3%和81.3%。

就在增速達到66.3%的三線城市,我們曾遇到一個真實的小場景:

幾個女孩在逛商場,要為一個正要結婚的閨蜜參謀新衣服。到中午飯點時,衣服沒有選好,閨蜜則打算請大家一起吃飯。

這其中,一個女孩第一時間拒絕參加這場飯局。她給出的理由是:要去另一個商場找小姐姐做美甲,午飯就隨便吃點。

這是一個直男理解不到的理由,也是大多數經營者沒有看清的新女性商業趨勢。

在美業客單價中,女性較男性高出了30.6%。而在這群女性的消費鄙視鏈中,服裝、餐飲已經讓位於了美業。

美團研究所預計,到2025 年,中國生活美容服務業的市場規模將達到8375億元,線上化率將提升6.4倍。

美業蓬勃發展的新機遇正撲面而來。

【本文作者快刀財經編輯部,由合作夥伴微信公眾號:快刀財經授權發布,文章版權歸原作者及原出處所有,轉載請聯繫原出處。文章系作者個人觀點,不代表立場。如內容、圖片有任何版權問題,請聯繫(editor@zero2ipo.com.cn)處理。】

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

Intel 第 11 代「Rocket Lake」與第 12 代「Alder Lake」搶先看_貨運

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

在本次 CES 發表會中,Intel 除發表系列第 11 代行動處理器外,還花了一些時間來預告即將問世的第 11 代桌上處理器「Rocket Lake」與命名為「Alder Lake」的第 12 代Core 處理器,雖然並沒有講得太多新細節,但已經夠讓人流口水了。

Intel 第 11 代「Rocket Lake」與第 12 代「Alder Lake」搶先看

「Alder Lake」與其前身 Lakefield 一樣將會採用與 Arm 的 BIG.little 相似的方式,將高效能核心與高速率核心封裝在一起,以實現功率與效率兩方面的最大化,但不同之處是 Lakefield 主要用在筆電上,而下一世代的 Alder Lake 將可用於桌上電腦與筆電,而首批搭載這種可擴展功率系統的產品將會在下半年出現。第 12 代 Alder Lake 處理器將採用在第 11 代 Tiger Lake 中已經存在的 10nm SuperFin 設計強化版本,並結合了新的大功率核心 Golden Lake 和新的 Gracemont 核心來提高效率。在發表會中更直接展示了搭載 Alder Lake 的電腦開啟狀態(上圖),讓大家先睹為快。

桌上型電腦用戶敲碗許久的第 11 代「Rocket Lake」即將問世,正式名稱 Intel Core S 系列處理器以旗艦 i9-11900K 為首,IPC 提高 19%,內顯效能提高 50%,另外也首度將 AI 運算能力導入主流 PC 平台中。雖說已預計在 3 月份推出,但此次並沒有透漏太多新的細節,也並未完全展示整個第 11 代 Rocket Lake-S 陣容,僅簡單講述全新核心架構、14nm 製程,以及處理器可提供 20 條 PCIe 4.0 通道,可容納 x16 顯卡與 x4 SSD。 

在實力展示方面,以第 11 代 Intel Core i7 8 核心處理器與 AMD R9 12 核心處理器對比,在配備相同 GPU 的情況下執行 Metro Exodus,可以看到 Intel 在 FPS 上的平均表現優於對手。

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

您也許會喜歡:

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

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

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

設計模式之單例模式_貨運

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

目錄:

  • 什麼是單例模式
  • 單例模式的應用場景
  • 單例模式的優缺點
  • 單例模式的實現
  • 總借

一、什麼是單例模式

  單例模式顧名思義就是只存在一個實例,也就是系統代碼中只需要一個對象的實例應用到全局代碼中,有點類似全局變量。例如,在系統運行時,系統需要讀取配置文件中的參數,在設計系統的時候讀取配置文件的類往往設計成單例類。因為系統從啟動運行到結束,只需要讀取一次配置文件,這個讀取配置文件全部由該類負責讀取,在全局代碼中只需要使用該類即可。這樣不僅簡化了配置文件的管理,也避免了代碼讀取配置文件數據的不一致性。

 

 單例模式的特點:

  1、該類的構造方法聲明為private,這樣其他類無法初始花該類,只能通過該類的public方法獲取該類的對象。

  2、裏面有個私有的對象成員,該成員對象是類本身,用於public方法返回該類的實例。

  3、該類中提供一個public的靜態方法,返回該類的私有成員對象。

 

二、單例的應用場景

 

  舉一個小例子,在我們的windows桌面上,我們打開了一個回收站,當我們試圖再次打開一個新的回收站時,Windows系統並不會為你彈出一個新的回收站窗口。,也就是說在整個系統運行的過程中,系統只維護一個回收站的實例。這就是一個典型的單例模式運用。

 

  繼續說回收站,我們在實際使用中並不存在需要同時打開兩個回收站窗口的必要性。假如我每次創建回收站時都需要消耗大量的資源,而每個回收站之間資源是共享的,那麼在沒有必要多次重複創建該實例的情況下,創建了多個實例,這樣做就會給系統造成不必要的負擔,造成資源浪費。

 

  再舉一個例子,網站的計數器,一般也是採用單例模式實現,如果你存在多個計數器,每一個用戶的訪問都刷新計數器的值,這樣的話你的實計數的值是難以同步的。但是如果採用單例模式實現就不會存在這樣的問題,而且還可以避免線程安全問題。同樣多線程的線程池的設計一般也是採用單例模式,這是由於線程池需要方便對池中的線程進行控制

 

  同樣,對於一些應用程序的日誌應用,或者web開發中讀取配置文件都適合使用單例模式,如HttpApplication 就是單例的典型應用。

 

  從上述的例子中我們可以總結出適合使用單例模式的場景和優缺點:  

 

   適用場景:

  1.需要生成唯一序列的環境

  2.需要頻繁實例化然後銷毀的對象。

  3.創建對象時耗時過多或者耗資源過多,但又經常用到的對象。 

  4.方便資源相互通信的環境

 

 

三、單例模式的優缺點

  優點

    1、在內存中只有一個對象,節省內存空間;

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

    2、避免頻繁的創建銷毀對象,可以提高性能;

    3、避免對共享資源的多重佔用,簡化訪問;

    4、為整個系統提供一個全局訪問點。

  缺點

    1、不適用於變化頻繁的對象;

    2、濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;

    3、如果實例化的對象長時間不被利用,系統會認為該對象是垃圾而被回收,這可能會導致對象狀態的丟失;

 

四、單例模式的實現

  1、餓漢式

public class Mgr{
    //創建自己的實例,並初始化私有靜態final成員
    private static final Mgr mgr = new Mgr();
    //私有構造方法
    private Mgr() {}; 
    //公共方法,返回自己的實例化成員
    public static Mgr getMgr() { 
        return  mgr;
    }
}

  備註:該單例實現方法簡單明了,推薦使用。該類被JVM加到內存的時候,只會加載一次,並且只實例化一個單例,優點是具有線程安全性,缺點是:不用他也在內存中實例化,浪費內存。所以提出了懶散式實現方式。

  2、懶漢式

public class Mgr{
   //聲明私有靜態對象成員,作為返回值
    private static Mgr mgr;
   //私有構造函數
    private Mgr() {}; 
   //懶漢的特點,提供公共靜態方法,如果該成員對象為空,實例化並返回
    public static Mgr getMgr() {
        if(mgr == null){
            mgr =  = new Mgr();
        }
         return  mgr;
     }
}

  備註:(不推薦用)這種實現方法只有程序在調用該類的getMgr方法才實例話對象並返回,特點就是調用的時候再實例化並返回,延遲加載的被動形式。但是該實現方法不是線程安全的,因為當同時有有兩個線程執行到if(mgr==null)語句的時候,由於某些原因其中一個線程先一步執行下一句,實例化了對象並返回;兩一個線程再實例化對象在返回,這兩個線程返回的對象不是同一個對象(這難道還是單例嗎!),所以該實現方法的缺點也很明顯。那為了避免線程不安全問題,在懶漢寫法上提出加鎖的實現方式。

  3、給公共方法加鎖

public class Mgr{
    //聲明私有靜態對象成員,作為返回值
    private static Mgr mgr;
    //私有構造函數
    private Mgr() {}; 
    //給公共方法加鎖,只有一個線程第一次獲得鎖實例化對象並返回
    public static syncnronized Mgr getMgr() {
        if(mgr == null){
            mgr = new Mgr();
        }
        return  mgr;
   }
}

  備註:(推薦使用)這種實現方式比較完善,既保證了懶散式的延遲加載方式,也保證了線程安全。缺點是在整個方法上加鎖,導致性能下降。因為只有第一次獲得鎖的線程實例化對象並返回,以後的線程獲得鎖的時候執行 if(mgr == null)語句的時候,由於mgr已經實例化了不為空,直接跳過返回實例。整個過程要競爭鎖,不能併發執行導致性能下降。那為優化性能下降問題,那我只在mgr = new Mgr()上加鎖,保證鎖粒度最小化的同時保證單例實例化。

  4、給實例化加鎖

public class Mgr{
    //私有靜態成員對象
    private static Mgr mgr;
    //私有構造函數
    private Mgr() {}; 
    //公共方法,在實例化語句塊加鎖,保證單例
    public static  Mgr getMgr() {
        if(mgr == null){
            syncnronized(Mgr.class){
                mgr = new Mgr();
            }
        }
         return  mgr;
  }
}

  備註:(不推薦使用)該實現方法雖然相較方法3性能有所提升,但並不能保證線程安全。因為當兩個線程同時執行if(mgr == null)語句時,其中線程1獲取鎖,實例化對象並返回,線程2在獲得鎖又在實例化對象並返回。線程1和線程2獲取的對象並不是同一個。所以在此基礎上提出了雙重判斷方式。

5、雙重判斷加鎖

public class Mgr{
    //私有靜態成員對象
    private static  Mgr mgr;
    //私有構造函數
    private Mgr() {}; 
    //公共方法提供雙重判斷並在實例化代碼塊加鎖
    public static  Mgr getMgr() {
        if(mgr == null){ //第一次判斷
            syncnronized(Mgr.class){
                if(mgr == null){ //第二次判斷
                    mgr =  = new Mgr();
                }      
            }
        }
         return  mgr;
  }
}

  備註:(推薦使用)相較於方法4,該方法雙重判定,如果多線程同時執行到第一次判斷語句位置,其中一個線程獲得鎖,由於是第一次該對象成員為空,實例化后並返回。其後其它線程調用公共方法的時候,由於實例化了,在第一次判斷自接返回實例,不在產生鎖競爭。大大提高了效率,保證了線程的安全性,也保證了延遲加載的特性。

 6、靜態內部類

public class Mgr{
    private Mgr() {};
    //定義靜態內部類
    private static class MgrHolder{
        private final static Mgr mgr = new Mgr();
    } 
    //公共方法直接返回靜態內部類的實例對象
    public static  Mgr getMgr() {
        return  MgrHolder.mgr;
  }
}

  備註:(可使用)該實現方法通過JVM來保證線程安全性,靜態內部類MgrHolder來New一個Mgr對象,JVM只會加載一次Mgr類(靜態內部類不會加載),當類調用getMgr方法的時候,也只會調用一次,公共方法調用靜態內部類,獲取一個對象(也是實現懶加載)。所以也是線程安全的。

7、枚舉類單例模式

public enum Mgr{
    mgr;
    public void m(){} //業務方法
}

  備註:(推薦使用)jdk1.5之後才能正常達到單例效果,參考來自《Effective Java》。注意枚舉類的枚舉變量必須寫在第一行,後面實現業務代碼。調用方式是:Mgr.mgr.Function_Name();具備枚舉類型的特點,有點是:線程同步,防止反序列化。

五、總結

  通過上面幾種單例模式的實現方式的列舉,但是在實際應用中其中的2,3,4三種方式並不適用,列出來只是讓讀者更好的理解方式5的由來,起到拋磚引玉的作用,更好的理解單例模式。總之常用的四種,懶漢,雙重校驗鎖,靜態內部類,枚舉單例。

  餓漢:類加載的時候就創建實例,所以是線程安全的,但不能延遲加載。

  雙重校驗鎖:線程安全,效率較高,延遲加載。

  靜態內部類:實現起來比較麻煩,在不同的編譯器上會出現不可預知的錯誤。

  枚舉單例:很好,不僅避免了多線程同步問題,而且能反正反序列化重新創建對象,但是不能延遲加載,用的人少。

 

  • 讀者發現有什麼有問題的地方謝謝留言指正。部分參考自:https://www.cnblogs.com/xuwendong/p/9633985.html#_label0

 

 

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

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

這些“消失”的經典汽車設計 你有錢都買不到!_貨運

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

而到了現在就是常見手握式把手了。車身防擦條當年因為汽車還不算普及,開車技巧也沒有那麼好,所以會在車身周圍和保險杠的位置安置軟朔膠的防擦條,從而發生輕微碰撞和摩擦的時候損壞到漆面。而現在,幾乎看到不到咯,保險杠還在就算良心了。

隨着時代的進步,科技也在慢慢發展,人們的審美也隨着變化,當然,這也包括了汽車產業,在以前經常看到汽車上的一些設計,現在慢慢的也“消失”不見了。

自動伸縮天線

想當年,汽車身上那根細細的天線成為了當時汽車的一種“時髦”,不管是不是真假的,幾乎有車的人都加裝了這一根“天線”,就好像現在加裝包圍一樣流行。在當年,原配有天線的車可都是豪車。到了現在,為了美觀和空氣動力學,就設計成了“鯊魚鰭”的形狀。

上翻式門把手

也許,在一些很老的車型上還能找到這種設計的把手,捨棄這種設計的原因是把手位置容易給指甲刮花,

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

發生碰撞時,上翻式把手的設計原理容易導致門打不開。而到了現在就是常見手握式把手了。

車身防擦條

當年因為汽車還不算普及,開車技巧也沒有那麼好,所以會在車身周圍和保險杠的位置安置軟朔膠的防擦條,從而發生輕微碰撞和摩擦的時候損壞到漆面。而現在,幾乎看到不到咯,保險杠還在就算良心了。

跳燈

說起跳燈,相信很多人會先想起《頭文字D》裏面的AE86,在當年,跳燈也是一種潮流的設計,到後來,設計師們發現,跳燈會增加車輛的風阻,故障率也高,慢慢的就“消失了”。不過我依然覺得,跳燈很帥。

尾語:考慮到實用性,安全性,美觀性等問題,一些兒時的經典已經慢慢“消失”,當然,這些“消失”的設計並不是完全的消失,而是進化了,新舊交替是必然的事。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

最多10萬元 選國產SUV還是合資家用轎車_貨運

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

朗逸較簡單內飾這東西跟價格絕對是成正比的,雖然這兩個車價格差不多,但是由於GS是自主品牌,所以內飾絕對要比朗逸“豪華”一個檔次。尺寸和空間基本處在一個檔次視覺上朗逸稍微大一點,但是真的坐進去了會發現其實都差不多,可能朗逸確實大那麼一點點。

如今十萬級別的車子日漸成為大多數消費者的主流選擇,所以今天我們就選取了目前比較熱的兩款車,帝豪GS和大眾朗逸做對比,看看誰的性價比更高。

為了對比的公平,我們就選取了帝豪GS的頂配車型-運動版 1.3T 自動臻尚型,指導價為10.88萬。朗逸為1.6L 自動風尚版,指導價為12.19萬元(優惠下來和帝豪GS價格相近)。為了方便閱讀下文帝豪GS簡稱為GS。之所以選擇朗逸和GS對比,是因為後台有很多讀者經常糾結這兩個車怎麼選擇,所以今天就統一給大家做個介紹。

外觀

GS的更具設計感;朗逸更中庸

因為帝豪GS是吉利精品2.0時代的最新產品,所以外觀設計上緊跟時代的步伐,看起來非常時尚動感。朗逸則是更多的採用大眾中庸化的設計,整體上並沒有太大的特色。不過,有很多消費者就是很喜歡朗逸的外觀設計。

內飾

GS更精緻;朗逸較簡單

內飾這東西跟價格絕對是成正比的,雖然這兩個車價格差不多,但是由於GS是自主品牌,所以內飾絕對要比朗逸“豪華”一個檔次。

尺寸和空間

基本處在一個檔次

視覺上朗逸稍微大一點,但是真的坐進去了會發現其實都差不多,可能朗逸確實大那麼一點點。

配置

毫無懸念GS完勝,

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

不管舒適性配置還是安全配置GS都“吊打”朗逸

動力系統

GS雙離合不太靠譜;朗逸動力系統較老但是穩定耐操

雖然帝豪1.3T發動機是最新研發的,性能還是比較先進的,但是雙離合變速箱遭到了不少消費者的吐槽。朗逸的動力系統雖然沒有什麼亮點,但是質量確實非常好。

由於朗逸車子較輕,再加上調教的很好,所以朗逸的百公里油耗約為7.5L,GS則比較高,約為9L。對於駕駛感受來說,由於朗逸屬於老舊平台的產物,所以駕駛感受很一般,帝豪GS由於調教的很不錯,駕駛起來會給你不小的驚喜。

其實這兩台車子硬件比起來肯定是GS完勝,但是軟實力也就是品牌知名度來看,GS顯然差距還很大。雖然GS外觀好看,還是大家喜歡的SUV車型,但是大家還是更傾向於選擇朗逸。畢竟,大家覺得,朗逸的質量,要比GS好太多。

其實我們並不是十分推薦GS的雙離合車型,本文只是為了方便做對比,因為只有最貴的GS才和1.6L 自動風尚版的朗逸價格差不多。所以我們更推薦GS的手動擋車型,質量更可靠,最值得推薦。如果真的喜歡雙離合,那麼小編還是更推薦大眾的雙離合。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

Angular 從入坑到挖坑 – 路由守衛連連看_貨運

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

一、Overview

Angular 入坑記錄的筆記第六篇,介紹 Angular 路由模塊中關於路由守衛的相關知識點,了解常用到的路由守衛接口,知道如何通過實現路由守衛接口來實現特定的功能需求,以及實現對於特性模塊的惰性加載

對應官方文檔地址:

  • 路由與導航

配套代碼地址:angular-practice/src/router-combat

二、Contents

  1. Angular 從入坑到棄坑 – Angular 使用入門
  2. Angular 從入坑到挖坑 – 組件食用指南
  3. Angular 從入坑到挖坑 – 表單控件概覽
  4. Angular 從入坑到挖坑 – HTTP 請求概覽
  5. Angular 從入坑到挖坑 – Router 路由使用入門指北
  6. Angular 從入坑到挖坑 – 路由守衛連連看

三、Knowledge Graph

四、Step by Step

4.1、基礎準備

重複上一篇筆記的內容,搭建一個包含路由配置的 Angualr 項目

新建四個組件,分別對應於三個實際使用到的頁面與一個設置為通配路由的 404 頁面

-- 危機中心頁面
ng g component crisis-list

-- 英雄中心頁面
ng g component hero-list

-- 英雄相親頁面
ng g component hero-detail

-- 404 頁面
ng g component page-not-found 

在 app-routing.module.ts 文件中完成對於項目路由的定義,這裏包含了對於路由的重定向、通配路由,以及通過動態路由進行參數傳遞的使用

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

// 引入組件
import { CrisisListComponent } from './crisis-list/crisis-list.component';
import { HeroListComponent } from './hero-list/hero-list.component';
import { HeroDetailComponent } from './hero-detail/hero-detail.component';
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';

const routes: Routes = [
  {
    path: 'crisis-center',
    component: CrisisListComponent,
  },
  {
    path: 'heroes',
    component: HeroListComponent,
  },
  {
    path: 'hero/:id',
    component: HeroDetailComponent,
  },
  {
    path: '',
    redirectTo: '/heroes',
    pathMatch: 'full',
  },
  {
    path: '**',
    component: PageNotFoundComponent,
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule { }

之後,在根組件中,添加 router-outlet 標籤用來聲明路由在頁面上渲染的出口

<h1>Angular Router</h1>
<nav>
  <a routerLink="/crisis-center" routerLinkActive="active">Crisis Center</a> &nbsp;&nbsp;
  <a routerLink="/heroes" routerLinkActive="active">Heroes</a>
</nav>
<router-outlet></router-outlet>

4.2、路由守衛

在 Angular 中,路由守衛主要可以解決以下的問題

  • 對於用戶訪問頁面的權限校驗(是否已經登錄?已經登錄的角色是否有權限進入?)
  • 在跳轉到組件前獲取某些必須的數據
  • 離開頁面時,提示用戶是否保存未提交的修改

Angular 路由模塊提供了如下的幾個接口用來幫助我們解決上面的問題

  • CanActivate:用來處理系統跳轉到到某個路由地址的操作(判斷是否可以進行訪問)
  • CanActivateChild:功能同 CanActivate,只不過針對的是子路由
  • CanDeactivate:用來處理從當前路由離開的情況(判斷是否存在未提交的信息)
  • CanLoad:是否允許通過延遲加載的方式加載某個模塊

在添加了路由守衛之後,通過路由守衛返回的值,從而達到我們控制路由的目的

  • true:導航將會繼續
  • false:導航將會中斷,用戶停留在當前的頁面或者是跳轉到指定的頁面
  • UrlTree:取消當前的導航,並導航到路由守衛返回的這個 UrlTree 上(一個新的路由信息)
4.2.1、CanActivate:認證授權

在實現路由守衛之前,可以通過 Angular CLI 來生成路由守衛的接口實現類,通過命令行,在 app/auth 路徑下生成一個授權守衛類,CLI 會提示我們選擇繼承的路由守衛接口,這裏選擇 CanActivate 即可

ng g guard auth/auth

在 AuthGuard 這個路由守衛類中,我們模擬了是否允許訪問一個路由地址的認證授權。首先判斷是否已經登錄,如果登錄后再判斷當前登錄人是否具有當前路由地址的訪問權限

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {

  /**
   * ctor
   * @param router 路由
   */
  constructor(private router: Router) { }

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    // 判斷是否有 token 信息
    let token = localStorage.getItem('auth-token') || '';
    if (token === '') {
      this.router.navigate(['/login']);
      return false;
    }

    // 判斷是否可以訪問當前連接
    let url: string = state.url;
    if (token === 'admin' && url === '/crisis-center') {
      return true;
    }

    this.router.navigate(['/login']);
    return false;
  }
}

之後我們就可以在 app-routing.module.ts 文件中引入 AuthGuard 類,針對需要保護的路由進行路由守衛的配置

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

// 引入組件
import { CrisisListComponent } from './crisis-list/crisis-list.component';

// 引入路由守衛
import { AuthGuard } from './auth/auth.guard';

const routes: Routes = [
  {
    path: 'crisis-center',
    component: CrisisListComponent,
    canActivate: [AuthGuard], // 添加針對當前路由的 canActivate 路由守衛
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule { }

4.2.2、CanActivateChild:針對子路由的認證授權

與繼承 CanActivate 接口進行路由守衛的方式相似,針對子路由的認證授權可以通過繼承 CanActivateChild 接口來實現,因為授權的邏輯很相似,這裏通過多重繼承的方式,擴展 AuthGuard 的功能,從而達到同時針對路由和子路由的路由守衛

改造下原先 canActivate 方法的實現,將認證邏輯修改為用戶的 token 信息中包含 admin 即可訪問 crisis-center 頁面,在針對子路由進行認證授權的 canActivateChild 方法中,通過判斷 token 信息是否為 admin-master 模擬完成對於子路由的訪問認證

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router, CanActivateChild } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate, CanActivateChild {

  /**
   * ctor
   * @param router 路由
   */
  constructor(private router: Router) { }

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    // 判斷是否有 token 信息
    let token = localStorage.getItem('auth-token') || '';
    if (token === '') {
      this.router.navigate(['/login']);
      return false;
    }

    // 判斷是否可以訪問當前連接
    let url: string = state.url;
    if (token.indexOf('admin') !== -1 && url.indexOf('/crisis-center') !== -1) {
      return true;
    }

    this.router.navigate(['/login']);
    return false;
  }

  canActivateChild(
    childRoute: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
    let token = localStorage.getItem('auth-token') || '';
    if (token === '') {
      this.router.navigate(['/login']);
      return false;
    }

    return token === 'admin-master';
  }
}

通過 Angular CLI 新增一個 crisis-detail 組件,作為 crisis-list 的子組件

ng g component crisis-detail

接下來在 crisis-list 中添加 router-outlet 標籤,用來定義子路由的渲染出口

<h2>危機中心</h2>

<ul class="crises">
  <li *ngFor="let crisis of crisisList">
    <a [routerLink]="[crisis.id]">
      <span class="badge">{{ crisis.id }}</span>{{ crisis.name }}
    </a>
  </li>
</ul>

<!-- 定義子路由的渲染出口 -->
<router-outlet></router-outlet>

在針對子路由的認證授權配置時,我們可以選擇針對每個子路由添加 canActivateChild 屬性,也可以定義一個空地址的子路由,將所有歸屬於 crisis-list 的子路由作為這個空路由的子路由,通過針對這個空路徑添加 canActivateChild 屬性,從而實現將守護規則應用到所有的子路由上

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

這裏其實相當於將原先兩級的路由模式(父:crisis-list,子:crisis-detail)改成了三級(父:crisis-list,子:’ ‘(空路徑),孫:crisis-detail)

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

// 引入組件
import { CrisisListComponent } from './crisis-list/crisis-list.component';
import { CrisisDetailComponent } from './crisis-detail/crisis-detail.component';

// 引入路由守衛
import { AuthGuard } from './auth/auth.guard';

const routes: Routes = [
  {
    path: 'crisis-center',
    component: CrisisListComponent,
    canActivate: [AuthGuard], // 添加針對當前路由的 canActivate 路由守衛
    children: [{
      path: '',
      canActivateChild: [AuthGuard], // 添加針對子路由的 canActivate 路由守衛
      children: [{
        path: 'detail',
        component: CrisisDetailComponent
      }]
    }]
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule { }

4.2.3、CanDeactivate:處理用戶未提交的修改

當進行表單填報之類的操作時,因為會涉及到一個提交的動作,當用戶沒有點擊保存按鈕就離開時,最好能暫停,對用戶進行一個友好性的提示,由用戶選擇後續的操作

創建一個路由守衛,繼承於 CanDeactivate 接口

ng g guard hero-list/guards/hero-can-deactivate

與上面的 CanActivate、CanActivateChild 路由守衛的使用方式不同,對於 CanDeactivate 守衛來說,我們需要將參數中的 unknown 替換成我們實際需要進行路由守衛的組件

import { Injectable } from '@angular/core';
import { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class HeroCanDeactivateGuard implements CanDeactivate<unknown> {
  canDeactivate(
    component: unknown,
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState?: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return true;
  }
  
}

例如,這裏針對的是 HeroListComponent 這個組件,因此我們需要將泛型的參數 unknown 改為 HeroListComponent,通過 component 參數,就可以獲得需要進行路由守衛的組件的相關信息

import { Injectable } from '@angular/core';
import {
  CanDeactivate,
  ActivatedRouteSnapshot,
  RouterStateSnapshot,
  UrlTree,
} from '@angular/router';
import { Observable } from 'rxjs';

// 引入需要進行路由守衛的組件
import { HeroListComponent } from '../hero-list.component';

@Injectable({
  providedIn: 'root',
})
export class HeroCanDeactivateGuard
  implements CanDeactivate<HeroListComponent> {
  canDeactivate(
    component: HeroListComponent,
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState?: RouterStateSnapshot
  ):
    | Observable<boolean | UrlTree>
    | Promise<boolean | UrlTree>
    | boolean
    | UrlTree {

    // 判斷是否修改了原始數據
    //
    const data = component.hero;
    if (data === undefined) {
      return true;
    }
    const origin = component.heroList.find(hero => hero.id === data.id);
    if (data.name === origin.name) {
      return true;
    }

    return window.confirm('內容未提交,確認離開?');
  }
}

這裏模擬判斷用戶有沒有修改原始的數據,當用戶修改了數據並移動到別的頁面時,觸發路由守衛,提示用戶是否保存后再離開當前頁面

4.3、異步路由

4.3.1、惰性加載

當應用逐漸擴大,使用現有的加載方式會造成應用在第一次訪問時就加載了全部的組件,從而導致系統首次渲染過慢。因此這裏可以使用惰性加載的方式在請求具體的模塊時才加載對應的組件

惰性加載只針對於特性模塊(NgModule),因此為了使用惰性加載這個功能點,我們需要將系統按照功能劃分,拆分出一個個獨立的模塊

首先通過 Angular CLI 創建一個危機中心模塊(crisis 模塊)

-- 查看創建模塊的相關參數
ng g module --help

-- 創建危機中心模塊(自動在 app.moudule.ts 中引入新創建的 CrisisModule、添加當前模塊的路由配置)
ng g module crisis --module app --routing

將 crisis-list、crisis-detail 組件全部移動到 crisis 模塊下面,並在 CrisisModule 中添加對於 crisis-list、crisis-detail 組件的聲明,同時將原來在 app.module.ts 中聲明的組件代碼移除

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { CrisisRoutingModule } from './crisis-routing.module';

import { FormsModule } from '@angular/forms';

// 引入模塊中使用到的組件
import { CrisisListComponent } from './crisis-list/crisis-list.component';
import { CrisisDetailComponent } from './crisis-detail/crisis-detail.component';


@NgModule({
  declarations: [
    CrisisListComponent,
    CrisisDetailComponent
  ],
  imports: [
    CommonModule,
    FormsModule,
    CrisisRoutingModule
  ]
})
export class CrisisModule { }

同樣的,將當前模塊的路由配置移動到專門的路由配置文件 crisis-routing.module.ts 中,並將 app-routing.module.ts 中相關的路由配置刪除

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

// 引入組件
import { CrisisListComponent } from './crisis-list/crisis-list.component';
import { CrisisDetailComponent } from './crisis-detail/crisis-detail.component';

// 引入路由守衛
import { AuthGuard } from '../auth/auth.guard';

const routes: Routes = [{
  path: '',
  component: CrisisListComponent,
  canActivate: [AuthGuard], // 添加針對當前路由的 canActivate 路由守衛
  children: [{
    path: '',
    canActivateChild: [AuthGuard], // 添加針對子路由的 canActivate 路由守衛
    children: [{
      path: 'detail',
      component: CrisisDetailComponent
    }]
  }]
}];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class CrisisRoutingModule { }

重新運行項目,如果你在創建模塊的命令中設置了自動引入當前模塊到 app.module.ts 文件中,大概率會遇到下面的問題

這裏的問題與配置通配路由需要放到最後的原因相似,因為腳手架在幫我們將創建的模塊導入到 app.module.ts 中時,是添加到整個數組的最後,同時因為我們已經將 crisis 模塊的路由配置移動到專門的 crisis-routing.module.ts 中了,框架在進行路由匹配時會預先匹配上 app-routing.module.ts 中設置的通配路由,從而導致無法找到實際應該對應的組件,因此這裏我們需要將 AppRoutingModule 放到聲明的最後

當問題解決后,就可以針對 crisis 模塊設置惰性加載

在配置惰性路由時,我們需要以一種類似於子路由的方式進行配置,通過路由的 loadChildren 屬性來加載對應的模塊,而不是具體的組件,修改后的 AppRoutingModule 代碼如下

import { HeroCanDeactivateGuard } from './hero-list/guards/hero-can-deactivate.guard';
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const routes: Routes = [
  {
    path: 'crisis-center',
    loadChildren: () => import('./crisis/crisis.module').then(m => m.CrisisModule)
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes, { enableTracing: true })],
  exports: [RouterModule],
})
export class AppRoutingModule { }

當導航到這個 /crisis-center 路由時,框架會通過 loadChildren 字符串來動態加載 CrisisModule,然後把 CrisisModule 添加到當前的路由配置中,而惰性加載和重新配置工作只會發生一次,也就是在該路由首次被請求時執行,在後續請求時,該模塊和路由都是立即可用的

4.3.2、CanLoad:杜絕未通過認證授權的組件加載

在上面的代碼中,對於 CrisisModule 模塊我們已經使用 CanActivate、CanActivateChild 路由守衛來進行路由的認證授權,但是當我們並沒有權限訪問該路由的權限,卻依然點擊了鏈接時,此時框架路由仍會加載該模塊。為了杜絕這種授權未通過仍加載模塊的問題發生,這裏需要使用到 CanLoad 守衛

因為這裏的判斷邏輯與認證授權的邏輯相同,因此在 AuthGuard 中,繼承 CanLoad 接口即可,修改后的 AuthGuard 代碼如下

import { Injectable } from '@angular/core';
import {
  CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router, CanActivateChild, CanLoad, Route, UrlSegment
} from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate, CanActivateChild, CanLoad {

  /**
   * ctor
   * @param router 路由
   */
  constructor(private router: Router) { }


  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    // 判斷是否有 token 信息
    let token = localStorage.getItem('auth-token') || '';
    if (token === '') {
      this.router.navigate(['/login']);
      return false;
    }

    // 判斷是否可以訪問當前連接
    let url: string = state.url;
    if (token.indexOf('admin') !== -1 && url.indexOf('/crisis-center') !== -1) {
      return true;
    }

    this.router.navigate(['/login']);
    return false;
  }

  canActivateChild(
    childRoute: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
    let token = localStorage.getItem('auth-token') || '';
    if (token === '') {
      this.router.navigate(['/login']);
      return false;
    }

    return token === 'admin-master';
  }

  canLoad(route: Route, segments: UrlSegment[]): boolean | Observable<boolean> | Promise<boolean> {
    let token = localStorage.getItem('auth-token') || '';
    if (token === '') {
      this.router.navigate(['/login']);
      return false;
    }

    let url = `/${route.path}`;

    if (token.indexOf('admin') !== -1 && url.indexOf('/crisis-center') !== -1) {
      return true;
    }
  }
}

同樣的,針對路由守衛的實現完成后,將需要使用到的路由守衛添加到 crisis-center 路由的 canLoad 數組中即可實現授權認證不通過時不加載模塊

import { HeroCanDeactivateGuard } from './hero-list/guards/hero-can-deactivate.guard';
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const routes: Routes = [
  {
    path: 'crisis-center',
    loadChildren: () => import('./crisis/crisis.module').then(m => m.CrisisModule)
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes, { enableTracing: true })],
  exports: [RouterModule],
})
export class AppRoutingModule { }

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

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。