35歲就能開上霸氣SUV 說明你已經成功了!_網頁設計

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

3T的最低配車型舒適性上的配置稍微少了之外,其他車型的配置基本沒什麼差別,探險者沒有配備可變懸挂,在不同路況上的舒適度稍微單一了一些。但如座椅高低調節,第二排座椅移動/靠背調節這些提高舒適度的配置也是有配備的。

SUV,全稱是Sport Utility Vehicle,即運動型多用途汽車,和純越野車是有一定區別的,但在我的理解上,既然是多用途,那麼就具備有一定的越野能力,而像現在10來萬內所謂的SUV,在我看來,只是個擴大版的兩廂車。

而我個人認為,所以SUV,至少都要像漢蘭達,銳界,昂科威這種,四驅的版本的車型,具備有一定的越野能力,而如果要嚴格來說的話,普拉多,探險者,大切諾基才能真的算得上是,運動型多用途汽車,但如果你說這根本就是越野車,那你肯定不了解什麼才叫純越野車,四驅加差速鎖?不,如果要按照專業的越野賽車手或者資深越野狂熱分子的標準而言的話,沒有個三把差速鎖和4L,非承載車身這些基本的,對,只是基本,就別稱越野車。

而為什麼普拉多,探險者,大切諾基會被人叫為越野車,很簡單,只是大家熟悉的只是10來萬的那些所謂的“大型”兩廂車,而這些越野性稍微出眾一些車型,反而成了越野車。當然,這三輛車也不一定是只能去越野,既然是多用途,那也就是說,它在城市道路上也能給到一個舒適性。並且,你會發現,往往開着這些車的人,都有一種霸氣總裁的感覺,並且是有時間去玩玩越野,享受下生活。而在我看來,如果能在35-40歲這段時間能,擁有這麼一輛真正的SUV,我覺得會一種霸氣且成功的代表。

一汽豐田-普拉多

沉穩中的硬漢,雖不像美系車那麼“硬”,但霸氣依然不弱,城市中行車也顯得很協調。內飾保持硬派風格,基本都是方正的造型設計,配色上比較沉穩,雖然主打硬漢風,但是保持了豐田細膩的做工。

很多人說買普拉多不買3.5L車型,簡直對不起這輛車,因為兩噸的車重,

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

2.7L的發動機,163馬力,確實,很可憐,更別說去越野了。到了這個價位的車,配置其實少不到哪裡去,不過,3.5L的車型要比2.7L車型要豐富一些。頂配有配備有軟硬+高低調節的可變懸挂,這對於城市用車和野外用車的不同路況有一定舒適度幫助。還有座椅電動調節,高低調節,座椅記憶,前後排靠背可調節,後排獨立空調,等等城市用車中常用的舒適性配置都有,並不會說只是主打越野性能。

福特(進口)-探險者

很濃郁的美系純硬派的風格,似乎絲毫看不到一些較為圓潤的線條存在,寬大的車身,也顯得夠霸氣。內飾很美系風,簡單說就是粗狂,但並是說做工不好,畢竟到了這樣的價格,也不可能做個幾萬廉價車的內飾吧。

探險者無論是除了2.3T的最低配車型舒適性上的配置稍微少了之外,其他車型的配置基本沒什麼差別,探險者沒有配備可變懸挂,在不同路況上的舒適度稍微單一了一些。但如座椅高低調節,第二排座椅移動/靠背調節這些提高舒適度的配置也是有配備的。而和其他兩款車型不同的是,探險者是一輛七座車,2+3+2的座椅布局,第三排的乘坐舒適度不算太低,可以比例放倒。這對於出行時比較多人的家庭,就方便了不少。

Jeep(進口)-大切諾基(進口)

“九條杠”這是專屬jeep的一種“味道”,大切諾基一代比一代更大的車身尺寸,顯得越來越霸氣,如果你開着小車停在旁邊,也許會有那麼些壓迫感。內飾稍微圓潤一些,但基本還是有很濃郁的硬派風,值得一提的是,這代的大切諾基在做工用料上有不少的提升。

大切若基3.0L車型車重2291kg,而3.0T柴油版的車型重2447kg,3.6L的車型車重2304kg,簡單來說,想要買大切諾基,建議還是往3.0T柴油版或者3.6L的車型考慮吧。3.0T的低配車型和3.0L車型配置相差不大,高低可調的可變懸挂和空氣懸挂只有在3.0T柴油版的次低配車型和3.6L車型才有搭載,其餘無論是舒適還是安全配置,全系都基本一樣,柴油版沒有發動機啟停,3.6L的頂配和次頂配多了併線輔助,主動剎車/主動安全系統,自適應巡航。

總結:總的來說,三款車不管是越野用途還是城市用途,都能完全的勝任,並不會有那方面短板,而這也是為什麼個人覺得這些才叫運動型多用途汽車,也就是SUV。相比之下,大切若基的價格稍微比較貴,優惠也不算大,而探險者雖然價格較低,但相比普拉多的還是沒有什麼有優勢,如果對這種車型有需求話,三款車型中,普拉多的性價比還是比較高的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

生態環境部一周要聞(9.6-9.12)_網頁設計

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

2020-09-13

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

  1.生態環境部召開部黨組會議

  9月8日,生態環境部黨組書記孫金龍主持召開部黨組會議,傳達學習習近平總書記在全國抗擊新冠肺炎疫情表彰大會上的重要講話和大會精神、中央政治局會議研究黃河流域生態保護和高質量發展規劃綱要有關精神,研究貫徹落實習近平總書記關於紮實推進長三角一體化發展重要指示精神的具體措施,審議並原則通過中央巡視生態環境部黨組反饋意見相關整改方案,成立部黨建工作領導小組和部黨風廉政建設領導小組、調整部黨組巡視工作領導小組。生態環境部部長黃潤秋列席會議。更多內容,點擊閱讀

  2.生態環境部黨組書記孫金龍赴圍場、隆化兩縣開展扶貧調研和督促指導並召開座談會

  9月10日至11日,生態環境部黨組書記孫金龍赴河北省承德市圍場、隆化兩縣開展扶貧調研和督促指導並召開座談會。他強調,要深入學習貫徹習近平總書記關於扶貧工作的重要論述和習近平生態文明思想,紮實做好生態環保扶貧工作,協同打贏打好精準脫貧和污染防治攻堅戰,為全面建成小康社會作出新的更大貢獻。更多內容,點擊閱讀

  3.生態環境部召開部常務會議

  9月8日,生態環境部部長黃潤秋主持召開生態環境部常務會議,審議並原則通過《自然保護地生態環境監管工作暫行辦法》《關於嚴懲弄虛作假提高環評質量的意見》《關於優化小微企業項目環評工作的意見》。生態環境部黨組書記孫金龍出席會議。更多內容,點擊閱讀

  4.生態環境部部長以視頻形式會見法國生態轉型部部長

  生態環境部部長黃潤秋近日在京以視頻形式會見法國生態轉型與團結部部長芭芭拉·蓬皮利女士。雙方就《生物多樣性公約》第十五次締約方大會(COP15)與世界自然保護大會協同增效、共同應對氣候變化等議題進行交流。更多內容,點擊閱讀

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

  5.“重建更美好”在線會議召開 生態環境部部長黃潤秋視頻講話

  《生物多樣性公約》第十四次締約方大會主席國埃及與公約秘書處聯合主辦的“重建更美好:保護生物多樣性、防治土地退化、抗擊氣候變化,減少未來大流行病的風險”在線會議於2020年9月10日召開。《生物多樣性公約》《聯合國氣候變化框架公約》《聯合國防治荒漠化公約》公約執行秘書,全球環境基金首席執行官,聯合國環境署、開發署、糧農組織、世衛組織等國際組織代表,以及《聯合國防治荒漠化公約》第十四次締約方大會主席國印度、《聯合國氣候變化框架公約》第二十五次締約方大會主席國智利的代表參加會議。生態環境部部長黃潤秋應邀為會議錄製視頻講話。更多內容,點擊閱讀

  6.第二輪第二批中央生態環境保護督察進入下沉工作階段

  經黨中央、國務院批准,第二輪第二批7个中央生態環境保護督察組於2020年8月30日至9月1日陸續進駐北京、天津、浙江等3個省(市)和中國鋁業集團有限公司、中國建材集團有限公司等兩家中央企業開展督察,並對國家能源局、國家林業和草原局等2個部門開展督察試點。截至9月11日,各督察組均已進入下沉工作階段。更多內容,點擊閱讀

  7.生態環境部黨組巡視組集中反饋第五輪專項巡視情況

  生態環境部黨組巡視組於近日反饋專項巡視情況。這輪專項巡視是在黨中央對生態環境部黨組開展常規巡視期間,按照中央第十二巡視組的建議,生態環境部黨組對中國環境監測總站黨委、核與輻射安全中心黨委開展了專項巡視,這是黨的十九大以來生態環境部黨組開展的第五輪巡視。更多內容,點擊閱讀

  8.生態環境部召開制止餐飲浪費行為工作部署會

  9月7日,生態環境部召開制止餐飲浪費行為工作部署會,傳達學習習近平總書記對制止餐飲浪費行為的重要指示精神和孫金龍書記、黃潤秋部長的批示要求,通報生態環境部機關關於制止餐飲浪費培養節約習慣的工作方案。生態環境部黨組成員、副部長庄國泰出席會議並講話。更多內容,點擊閱讀

  9.全國危險廢物環境管理工作會議暨危險廢物專項整治三年行動推進會召開

  9月9日,生態環境部召開全國危險廢物環境管理工作會議暨危險廢物專項整治三年行動推進會,貫徹落實新修訂的《中華人民共和國固體廢物污染環境防治法》,強化危險廢物環境監管,推進危險廢物專項整治三年行動及專項執法行動。生態環境部副部長庄國泰出席並講話。更多內容,點擊閱讀

  10.生態環境部印發監管行動計劃 部署加強環評與排污許可監管工作

  為貫徹黨的十九屆四中全會精神、全國生態環境保護大會精神,落實《國務院關於加強和規範事中事後監管的指導意見》《國務院辦公廳關於印發控制污染物排放許可制實施方案的通知》要求,生態環境部持續推進環評文件質量監管和排污許可證證后監管。更多內容,點擊閱讀

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

Iris® Xe 內顯加持 2in1 電腦再進化 全新 Dell Inspiron 13 7306 二合一筆記型電腦_網頁設計

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

DELL做為世界電腦領導品牌之一,無論是在套裝電腦還是筆記型電腦都有一定的市場,這次隨著Intel發布第11代移動行處理器的同時,Dell也推出了數款全新筆記型電腦,今天我們受邀開箱的,就是家用的 Inspiron 系列變形平板電腦:Dell Inspiron 13 7306 二合一筆記型電腦。

Inspiron 13 7306 二合一筆記型電腦有兩款配置可以選擇,其一為第11代Intel® Core™ i5-1135G7搭配8GB記憶體與FHD的觸控螢幕,另外一個則是第11代Intel® Core™ i7-1165G7搭配16GB記憶體還有4K的觸控螢幕,這次由於第11代移動處理器帶有全新的Intel® Iris® Xe 顯示晶片,因此可以搭配更強大的螢幕顯示效能,而我們今天要開箱的則是i5-1135G7版本的Inspiron 13 7306 二合一筆記型電腦。

Dell Inspiron 13 7306 二合一筆記型電腦開箱

始終如一的DELLD外包裝,簡潔有力。

打開後的內容物也非常簡潔有力,筆電本體、變壓器以及專屬的觸控筆。

變壓器是採用了65W的Type C充電頭。

觸控筆則是全新的主動式觸控筆,十邊形的外型加上與機身相同的配色,非常好看。

觸控筆帶有4096感壓等級,並且有快速按鍵、藍牙連線等等,使用起來非常的流暢。

在筆電的外觀上,這次的 Dell Inspiron 13 7306 二合一筆記型電腦重返了黑色元素,相比之前的銀色或是白色,黑色更帶有些沉穩的表現。

掀開上蓋後,首先我們先來看看鍵盤區,在最上面有專屬的觸控筆儲存空間,並且同時進行充電。

在觸控筆儲存槽的旁邊,則是散熱的出風孔,搭配智慧感應器可自動偵測使用狀態進而調節散熱模式,讓你在使用的過程中可以保持最適合的狀態。

鍵盤的部分為帶有背光的磨砂材質鍵盤,使用起來非常的帶感。

在電源鍵的部分則是整合了指紋辨識,實際使用起來辨識速度非常的快。

整體鍵盤部分有特別做下凹設計,讓整體鍵盤區域可以在反過來使用時,也可以非常的平坦。

在上蓋往上掀後,會自動將鍵盤區抬起,讓鍵盤更符合人體工學,使用起來更舒服。

螢幕的部分則是採用了FHD的觸控螢幕,搭配 Dolby Vision™ 可以達到更明亮的色彩:

在螢幕的上方,則是有 HD 的 WebCam 以及紅外線攝影機,並且搭配可手動開關遮蔽的安全機制,讓使用上更無疑慮。

至於I/O的部分,在機身右邊有一個 USB 3.2 Gen 1 Type-A、一個耳麥孔以及一個mircoSD卡槽。

在機身左邊則是一個 Thunderbolt™ 4 Type-C 帶有充電以及 DisplayPort 以及一個 HDMI 2.0。

接著看到機身背面,首先看到的是左右兩側的2W立體聲喇叭。

而在正後方有一大排開孔散熱設計。

轉開背後7顆螺絲後,即可卸開背板,打開首先可以看到單管的散熱模組。

儲存空間則是512GB M.2的短卡。

內部空間都塞滿的情況下,基本上是無法進行記憶體與儲存空間的擴充,因此有興趣的朋友就是在買的當下就要決定好記憶體的大小,畢竟儲存空間可以外接,記憶體可是無法喔。而這台Dell Inspiron 13 7306 二合一筆記型電腦如果有需要更大容量的儲存空間的話,可以自行升級 (僅能安裝單顆),最高可以支援到2TB M.2 PCIe SSD。

最後則是看到電池的部分,則是採用了60Wh的配置。

 

Dell Inspiron 13 7306 二合一筆記型電腦效能測試

看完開箱我們來進行實際效能測試,最大的看點莫過於全新第11代Intel處理器以及Intel® Iris® Xe 顯示晶片。

本次測試機台是搭載了Intel® Core™ i5-1135G7處理器。

透過裝置管理員,可以很清楚地看到Intel® Core™ i5-1135G7 4C/8T的配置。

首先以CPU-Z進行核心效能測試,單核的分數為477,而在全核心的分數則是跑到了2264.2。

接著透過CineBench R15同樣進行CPU測試,Intel® Core™ i5-1135G7在CPU單核的分數為137 cb,而全核心的表現則為618 cb。

接著透過x264 FHD BENCHMARK進行轉檔測試,Intel® Core™ i5-1135G7的表現為22.1 fps。

接著透過x265 FHD BENCHMARK進行轉檔測試,Intel® Core™ i5-1135G7的表現則為15.2 fps。

重頭戲Intel® Iris® Xe顯示晶片的測試部分,透過測試顯卡運算的3DMARK,小編使用了較基本的Time Spy與Fire Strike以及測試內顯用的Sky Diver與Night Raid進行測試。首先是使用DirectX 12為核心架構的Time Spy測試,分數為1222。

而針對大部分遊戲,使用DirectX 11為核心架構的Fire Strike測試,Intel® Core™ i5-1135G7的分數為3850。

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

接著是較低階顯卡的測試,採用Direct X 11的Sky Diver測試,Intel® Core™ i5-1135G7的分數為10274。

接著則是採用了Direct X 12的Night Raid測試,Intel® Core™ i5-1135G7的分數為12853,總結3DMARK的四個測試,Inspiron 13 7306 2in1如果作為遊戲用機的話,僅僅靠Intel® Iris® Xe顯示晶片的威力,其實已經比帶有低階獨顯的筆電還要來的強悍,無論是跑分或是fps,都展現出有別於以往為人詬病內顯失能的超強效能。

在儲存的部分,首先透過了CrtstalDiskMark進行測試,Inspiron 13 7306 2in1出廠搭載使用的512G PCIe NVMe SSD,其讀寫速度為了2286.4 MB/s與1087 MB/s,還不錯的讀寫表現。

接著使用TxBENCH同樣進行讀寫測試,最高讀寫速度則是2252.04 MB/s與965.16 MB/s,同樣表現不錯。

最後則是透過PCMark 8進行電力測試,在一般家用基準測試下,可以連續使用360min,日常使用會更長效。

 

Dell Inspiron 13 7306 軟體介紹

在軟體的部分,DELL作為電腦領導品牌之一,當然有著非常多專屬的軟體,針對家用機種的部分則是除了基本檢測、進階設定外,還多了無線整合電腦與智慧型手機的Dell Mobile Connect。

無論是iPhone還是Android系統,都可以非常輕易的與Dell Inspiron 13 7306 二合一筆記型電腦連接。

接著電腦端會提供一組驗證碼,透過這組驗證碼就可以與手機對接。

這時候就在手機上,下載Dell Mobile Connect APP。

打開APP後,輸入電腦端的驗證碼,即可開始進行對接。

接著電腦與手機就會開始一連串的開啟權限等等動作。

連接完成後,即可直接在電腦上,透過Dell Mobile Connect直接看到手機上的非常多訊息。

也可以直接使用電腦打電話、接電話,超方便。

最重要的,是可以直接查看手機端的照片與影片,當然反向傳到手機上也是可以的,這樣就無須在透過繁雜的步驟,例如雲端、NAS等服務才能將檔案複製到電腦上,使用起來非常便利。

更特別的是,可以直接透過Dell Mobile Connect將手機的畫面透過電腦操控。

不過這項功能,其實是將手機的畫面進行直播,然後直接輸出到 Dell Inspiron 13 7306 二合一筆記型電腦上,基本上延遲算是還堪用,不過真的要進行槍戰之類的遊戲,就比較沒辦法透過無線操控的方式遊玩,基本上還不錯。

除了非常好用的Dell Mobile Connect,當然基本監測的SupportAssist必不可少,在初次啟動就會自動掃描所需要的檢測動作。

進到軟體內,即可直接看到近90天內的電腦狀態。

接著也可以針對各別項目進行檢測。

如果真的有甚麼問題,也可以透過歷史紀錄做查詢,更快速的找出電腦問題所在。

而針對電池的部分,則是另外有Dell Power Manager可以進行獨立設定。

進階充電部分則是可以設定排程進行充電,可以避免電池一直處於充電狀態。

而在效能部分,則是透過散熱管理進行控制。

至於在平常使用上,可以使用電池壽命延長器,讓一般使用上可以更長效。

至於電腦的各種進階設定部分,可以透過選單進行各項設定。

首先是DELL CinemaColor,類似於螢幕各種設定檔,可直接點即設定檔就可以改變螢幕設定。

接著是針對電腦音效部分的MaxxAudioPro,除了可以設定各種聲音細節的調整外,也可以設定麥克風的狀態以及音場的調整。

而CinemaStream則是可以自動的調配你的網路流量。

最後則是前面有提到的Dolby Vision™,可以透過D olly Access進行各項調整。

 

總結

Inspiron 13 7306 二合一筆記型電腦作為一般家用電腦,透過第11代Intel® Core™ i5-1135G7加上Intel® Iris® Xe顯示晶片的威力,使得輕薄筆電即使不用帶有獨顯,就能夠有著超強的顯示能力,同時也縮小了內部空間,讓筆電可以更輕薄更有便攜性,在電量的使用上也更有優勢,可以說是在悶了10代之久的獨顯之痛後,在11代的移動處理器上得到了最大的發揮,再加上了2in1筆電的優勢,觸控螢幕可以更好用的情況下,搭配全新觸控筆,無論是在一般文書處理上、影音娛樂上都可以有著更好的表現,實在是個不錯的選擇喔,如果對於效能、畫值還想更上層樓的話,也可以選擇i7-1165G7的版本,16GB記憶體加上4K螢幕的加持,可以有更強大的效能表現,推薦給大家喔。

您也許會喜歡:

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

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

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

HTTP 冷知識 | HTTP 請求中,空格應該被編碼為 %20 還是 + ?_網頁設計

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

HTTP 請求中,空格應該被編碼為什麼?今天我們走進 RFC 文檔W3C 文檔,了解一下這個「史詩級」大坑。

1.%20 還是 +

開始講解前先看個小測試,在瀏覽器里輸入 blank testblanktest 間有個空格),我們看看瀏覽器如何處理的:

從動圖可以看出瀏覽器把空格解析為一個加號「+」。

是不是感覺有些奇怪?我們再做個測試,用瀏覽器提供的幾個函數試一下:

encodeURIComponent("blank test"// "blank%20test"
encodeURI("q=blank test")        // "q=blank%20test"
new URLSearchParams("q=blank test").toString() // "q=blank+test"

image-20200524184735653

代碼是不會說謊的,其實上面的結果都是正確的,encode 結果不一樣,是因為 URI 規範和 W3C 規範衝突了,才會搞出這種讓人疑惑的烏龍事件。

2.衝突的協議

我們首先看看 URI 中的保留字,這些保留字不參与編碼。保留字符一共有兩大類:

  • gen-delims:
    :
    /
    ?
    #
    [
    ]
    @
  • sub-delims:
    !
    $
    &
    '
    (
    )
    *
    +
    ,
    ;
    =

URI 的編碼規則也很簡單,先把非限定範圍的字符轉為 16 進制,然後前面加百分號。

空格這種不安全字符轉為十六進制就是 0x20,前面再加上百分號 % 就是 %20

image-20200524184601512

所以這時候再看 encodeURIComponentencodeURI 的編碼結果,就是完全正確的。

既然空格轉為%20 是正確的,那轉為 + 是怎麼回事?這時候我們就要了解一下 HTML form 表單的歷史。

早期的網頁沒有 AJAX 的時候,提交數據都是通過 HTML 的 form 表單。form 表單的提交方法可以用 GET 也可以用 POST,大家可以在 MDN form 詞條上測試:

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

經過測試我們可以看出表單提交的內容中,空格都是轉為加號的,這種編碼類型就是 application/x-www-form-urlencoded,在 WHATWG 規範里是這樣定義的:

image-20200524185912590

到這裏基本上就破案了,URLSearchParams 做 encode 的時候,就按這個規範來的。我找到了 URLSearchParams 的 Polyfill 代碼,裏面就做了 %20+ 的映射:

replace = {
    '!''%21',
    "'"'%27',
    '(''%28',
    ')''%29',
    '~''%7E',
    '%20''+'// <= 就是這個
    '%00''\x00'
}

規範里對這個編碼類型還有解釋說明:

The application/x-www-form-urlencoded format is in many ways an aberrant monstrosity, the result of many years of implementation accidents and compromises leading to a set of requirements necessary for interoperability, but in no way representing good design practices. In particular, readers are cautioned to pay close attention to the twisted details involving repeated (and in some cases nested) conversions between character encodings and byte sequences. Unfortunately the format is in widespread use due to the prevalence of HTML forms.

這種編碼方式就不是個好的設計,不幸的是隨着 HTML form 表單的普及,這種格式已經推廣開了

其實上面一大段句話就是一個意思:這玩意兒設計的就是 ,但積重難返,大家還是忍一下吧

3.一句話總結

  • URI 規範里,空格 encode 為 %20application/x-www-form-urlencoded 格式里,空格 encode 為 +

  • 實際業務開發時,最好使用業內成熟的 HTTP 請求庫封裝請求,這些雜活兒累活兒框架都幹了;

  • 如果非要使用原生 AJAX 提交 application/x-www-form-urlencoded 格式的數據,不要手動拼接參數,要用 URLSearchParams 處理數據,這樣可以避免各種噁心的編碼衝突。

4.文章推薦

本文選自我的長文HTTP 規範中的那些暗坑,想要了解更多可點擊原文查看。

更多推薦:

  • webpack 中最易混淆的 5 個知識點,掘金快 800 贊了
  • webpack dll 是個什麼東西,看完就能
    擺脫繁瑣的 dll 配置
  • React Native 性能優化指南從渲染層的角度分析了 RN 性能優化的 6 個點,並以圖文形式講解了 FlatList 的實現原理
  • Web Scraper——輕量數據爬取利器 介紹了一個小巧的瀏覽器爬蟲插件,可以實現簡單的數據爬取功能

最後推薦一下我的個人公眾號:「滷蛋實驗室」,平時會分享一些前端技術和數據分析的內容,大家感興趣的話可以關注一波:


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

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

成功當如李誠儒,失敗要學馬保國_網頁設計

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

66歲的李誠儒有了個站,69歲的馬保國“耗子尾汁”的商標被搶注。也許,我們很難把李誠儒和馬保國放在同一層面討論,但分析兩人的“翻紅”路徑卻不難發現冥冥中的聯繫:

一個是演藝圈的評論大咖,一個是武林界的功夫專家。一個說“如鯁在喉”,一個說“耗子尾汁”。一個在《演員請就位》炮轟娛樂怪現狀,一個在B站血洗成為新晉鬼畜王。

若說沒奇緣,怎生兩個他?李誠儒是一個精英主義的批評者,他有着成功之後的淡泊逍遙,以至於說什麼大家都很信;馬保國是一個大眾語境的被嘲笑者,儘管永遠翻車但永遠叫囂武德,這導致他說什麼大家都不信。

李誠儒只要講自己的故事就足以表達,而馬保國卻不停地用編故事來將自己美化。無論是讓人“都很信”的李誠儒,還是讓人“都不信”的馬保國,他們的符號價值都有一半是受眾賦予的。

大眾需要用高屋建瓴的姿態,去沖刷演技拉垮的娛樂景觀。同時,也需要用蚍蜉撼樹的視角,來解構庸碌瑣碎的日常生活。

一邊仰望星空崇敬理想,一邊腳踏實地嘲諷鬧劇。李誠儒和馬保國是兩種情緒,更是兩種容器,或許還是老頭網紅壁壘分明的兩條路徑。

布加齊列夫曾指出,符號化發生於一物“獲得了超出它作為自在與自為之物的個別存在的意義時”。如同一恭弘=叶 恭弘知秋的“一恭弘=叶 恭弘”,窺斑知豹的“一斑”,李誠儒和馬保國的延展意義,是被網友的目光打量出來的。

我在英國教功夫

我在北京演《大腕》

《下個,路口,見》里唱“當半個地球外還有個你,當相遇還沒到對的時機”,很適合2001年的馬保國和李誠儒。

這一年,已經通過做生意完成階層躍遷的李誠儒,在《大腕》里奉獻了令人拍案叫絕的演出。

房地產怎麼搞?黃金地段請法國設計師,電梯直接入戶,戶型最小四百平起步。孩子教育怎麼抓?社區裏面建一個貴族學校,教材直接用哈佛的。

順義媽媽們20年後才意識到的問題,李誠儒當時已經用“精神病”的方式點出。“不求最好,但求最貴!”長達1分26秒的長鏡頭,除了精湛的演技更離不開他本人的商海經歷。

這位“大款”既有當初創建西單“特別特商場”日進斗金的輝煌,也有炒匯時一着不慎的慘敗。在東單擺地攤,李誠儒琢磨歐版風衣多而日式風衣少。改變進貨思路后,讓10萬件風衣銷售一空。開“特別特”又把售貨員包裝成青春靚麗的導購小姐,短短15天名噪京城,一天的純利就50萬。

當時區政府要求各個經商單位必須晚上出攤,讓東單亮起來。有一天李誠儒親自壓陣,正好遇見了1980年北電第一屆業餘演員進修班的同學趙寶剛。

此時剛拍完《渴望》的趙寶剛問李誠儒想不想演《編輯部的故事》,一拍即合,就有了劇中李誠儒飾演的“騙子”。

12年的經商生涯,成了李誠儒重要的藝術源泉。而身無長處的馬保國,在2001年陪兒子到英國留學后,做起了開館收徒補貼學費的副業。

在《我在英國教功夫》一書里,馬保國試圖將自己包裝成一位學武不輟的勤奮武者。

“在南陽師專的三年裡,我每天堅持練功三個多小時”、“到畢業之前,我一拳就能把泡桐樹樹皮打飛,外家功夫有了很大長進”。馬保國很看重類似的生活細節,但這本書更像是簡約版的文人武俠小說,而不是職業習武者的生活記錄。

由於沒有受過系統的武學訓練,馬保國的武功水準只能達到底層化、業餘化甚至玩笑化的水準。他在書中記錄的師父郭雲深,把人打得飛出幾米高,無視牛頓只剩牛逼。類似的傳奇描述,無一例外地都發生在未有視頻記錄的私密空間。

作為編劇,馬保國最精彩的故事是2001年他去總公司機關大院開會,馬保國意外喝退了八九名手持短棍的民工。當時一位中年民警問馬保國:“老同志,我看你有真功夫,為啥不還手?”馬保國回答:“敢還手嗎?打傷人誰負責?”警察深以為然,連說:“對,對!”

李誠儒有經歷,演戲不費勁。馬保國沒經歷,編劇下功夫。這一年的英倫與中國,兩个中年人都開始了二度創業。李誠儒由商界進入演藝圈,馬保國則從下崗潮流入江湖。

以商養文VS以德保身

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

《編輯部的故事》是李誠儒的第一部戲,隨後《過把癮》中的錢康,《東邊日出西邊雨》中的吳永民,《清明上河圖》中的陳德張都是李誠儒的代表作。雖說角色不多,但他獨特的冷峻幽默令人過目不忘。

但在《無雪的冬天》后,已經42歲的李誠儒面臨着無戲可拍的尷尬。有一樣東西像缺鈣一樣,阻礙他的繼續發展,這個東西就是錢。意識到娛樂圈“有奶就是娘”的規矩,李誠儒開始自己做製片人。

他為自己量身打造了《重案六組》的刑警大曾,火到什麼程度呢?不管李誠儒走到哪兒,都有人喊他大曾。該劇投資500萬,最後賣了1500萬。

嘗到甜頭的李誠儒趁熱打鐵,買斷了老舍《我這一輩子》的改編權。不但把戲最多的劉方子留給自己,還在版權轉讓協議里寫明“劉方子這個角色必須由李誠儒出演”。

現在流行狙明星“帶資進組”,而李誠儒則是更霸道的“以商養文”。2005年,李誠儒在北京開了“海雨天風”火鍋城。他的賬是這麼算的:火鍋城若盈利得好,一年能有450萬的利潤,這些錢拿來拍一部由他主演的20集電視劇不香嗎?

海歸后的馬保國,則比其他武者更通曉現代媒介社會的生存法則。那就是,不顧一切地佔領輿論高地,對武術史上的“古典完人”進行再度扮演。為了打造一種全知全能的武師形象,他先從自己的武學傳承吹起。

在馬保國督導眾多弟子練功的視頻里,他驕傲地說:“馬家功夫沒有套路,我父親參加抗日戰爭,和日本鬼子進行過白刃戰,殺他們易如反掌。”接着,他通過故事的不斷疊加來證明自己武藝超凡。對決河南省75KG的冠軍錢洪亮,他聲稱“右鞭腿打我腿上了,他自己飛出去了。”

類似的說教均無任何證據,顯然是一種孤證式的闡釋和自我吹噓。馬保國的劇本情節非常老舊,基本復刻七八十年代的邵氏彩色武打片。《我在英國教功夫》里甚至有英國人去砸場子的描寫,《恭弘=叶 恭弘問》電影不找馬老當顧問也是可惜。

馬保國還試圖模仿夜讀《春秋》的關羽,他的宣傳視頻偶爾會崩出“punch”、“follow me”、“show me”之類的英文單詞和短句。加上他身着中式對襟裝,在中式條桌上放置筆墨,抑揚頓挫地講解渾元理念,頗得武術表演之妙。

如果說李誠儒的模式是“以商養文”的話,那麼馬保國就是典型的“以德保身”。當所有專業人士批評馬保國的不專業時,他完全可以用一種羽扇綸巾的“文士形象”舌戰群儒,從而擺脫輿論危機。

為了演戲,不愛做生意的李誠儒要努力掙票子。為了票子,不會武術的馬保國要努力演戲。看似完美的斜杠青年變成“斜杠中年”后,只剩下了“為了XX而XX”的狼狽。

網紅的語境挖掘與互動賦能

在重新走到大眾視野之前,李誠儒和馬保國都“涼了”一段時間。

李誠儒“以商養文”的模式失靈,2018年自導自演的《大導歸來》豆瓣只有3.7分。群眾紛紛表示“見過捧自己的,沒見過這麼捧自己的”。

馬保國在2008年推出《我在英國教功夫》后,又在2017年出版了《尚濟形意拳練法打法實踐》,專門為尚濟武學張目,私貨比前作少了很多。如果不是因為今年5月被50歲的民間武術家王慶民30秒內KO了3次,其製造的“武學人格”還能相對完整的保存。

無獨有偶,兩人都因為對互聯網語境的“深度挖掘”而二次翻紅。李誠儒自從上了《演員請就位》,就像豌豆射手一樣掃射了整個娛樂圈,用起成語絲毫不輸TVB編劇。流量演員見了瑟瑟發抖,就連詭辯高手小四也要被批:“小小的年紀要懂得尊重人。”

馬保國用“不講武德”的視頻虐粉,他一隻眼睛被打腫,還要義正言辭的說:“年輕人不講武德,偷襲我這個69歲的老人家,傳統功夫講究的是點到為止,點到為止他就輸了,如果我這一拳發力,一拳就把他鼻子打骨折了。”

發現沒有?李誠儒的“小小的年紀”與馬保國的“年輕人不講武德”是異曲同工的。李誠儒的炮彈,精準投放在了“流量愛豆隨意獲得S卡晉級”的現象上,成為了互聯網的犀利喉舌;馬保國的不服輸,用一種低俗喜劇的橋段引逗起大眾的嘲諷欲,發酵成二次元的狂歡。

在一段《貓和老鼠》的視頻里,湯姆貓被P上了馬保國的頭像,反覆被傑克鼠捉弄,屢敗屢戰令人捧腹。作為符號型網紅,馬保國的語錄通過互動性的儀式加強了與受眾的交流與粘合,實現了自身“永不言敗”的符號價值和內容價值的雙重深化。

浸潤了濃重江湖意識的馬保國,是心理上的弱者,卻是敘事領域的強者。對於被KO,他堅稱不將人打骨折,是出於一種仁愛之心。言下之意,他與王慶民的較量中是對方失去了道德。他之所以敗,是因為道德高尚而非技能不足。

慣用精英視角的李誠儒,選擇站在大眾這邊,為“早有公論”的焦點重申自己的看法。他說郭敬明“用廉價的筆觸來引起廣泛的共鳴”,他說陳凱歌“《霸王別姬》非常有深度,對於之後的電影也不太想去觸碰”。

網紅的內核是什麼?不正是挖掘社會轉型和文化變遷帶來的新的價值訴求嗎?馬保國發現大眾已經很久沒有嘲笑“阿Q”的快樂,李誠儒發現網友苦流量久矣,於是橫空出世並以此為內容輸出的標準。

互動儀式蘊藏着巨大的能量,當你不經意地說出“如鯁在喉”和“耗子尾汁”時,已不知不覺地被牽拉在李誠儒和馬保國的身後。

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

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

為商務打造 Intel vPro 與 Intel Evo vPro 新平台,著重安全性、速度與生產力_網頁設計

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

在去年底,Intel 發表了適用於主流筆電的第 11 代 Core U 系列處理器,而後更是積極推動了旗下對輕薄筆電的全新認證 Intel Evo,隨著 CES 2021 推出 H 系列處理器後,更推行了最新的 vPro 平台,為商業用途制定高標準的安全性與可管理性,另外還有將兩者合而為一的 Intel Evo vPro 平台,為商務用戶提供更多選擇性。

為商務打造 Intel vPro 與 Intel Evo vPro 新平台,著重安全性、速度與生產力

依照過去的慣例, 對於企業來說,安全性對於保密或防犯方面至關重要,Intel vPro 本質上以商務為核心,將 Intel 的企業管理和安全技術整合在一起,諸如 Intel 的主動管理技術(AMT)以及其他安全功能皆會納入其中。現在,Intel 將這些功能結合到硬體防護中,並且涵蓋了像是 Intel 自家的 TXT 技術(Trusted Execution Technology)之類的內容。整體而言,vPro 並不是 Intel 的硬體產品,而該視之為一個平台,透過將支援的處理器等晶片整合在具備適當 BIOS 的完整系統中來實現。

在最新版本中,Intel 將 vPro 擴展涵蓋了第 11 代 Core 系列處理器,並且導入了一些全新 vPro 功能。
首先是 Intel Hardware Shield,這項技術可為企業提供全面性的硬體深度安全防護,並且搭載全球首款植基於矽晶的 AI 威脅偵測,幫助抵抗勒索病毒和加密挖礦攻擊等,它還配備有 CET 技術( Intel Control Flow Enforcement Technology),強化系統內的指令流,防止惡意軟體挾持或是利用安全漏洞攻擊,改變長此以往單從軟體來進行防護的薄弱。

藉助於第 11 代 Core 系列處理器,vPro 與競爭對手相比,在運行 Office 365 文書處理工具時速度快上 23%,進行視訊會議時的速度也可比過去快 50%。由於 AI 效能較前代速度提升 8 倍,在進行影片編輯時還能比前一世代快上 2.3 倍,較競爭對手快了 1.8 倍。

此外,Intel Evo vPro 平台亦同步推出,為商務用戶提供最佳筆電體驗。透過 Intel Evo vPro平台認證的筆電設計具備時尚、纖薄與輕巧,提供令人驚豔的身歷其境視覺體驗。它們同樣提供出色的回應能力、立即喚醒、與真實世界的電池續航力,結合 vPro 的安全性與可管理能力以及 Intel  Evo 驚人的行動體驗,在今年預計會有超過 60 款新筆電問世。

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

最後英特爾還宣布 Intel Evo 認證的 Chromebook 產品即將登場,為旗艦型 Chromebook 打開新局面。

您也許會喜歡:

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

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

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

循序漸進VUE+Element 前端應用開發(6)— 常規Element 界面組件的使用,循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理,循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理_網頁設計

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

在我們開發BS頁面的時候,往往需要了解常規界面組件的使用,小到最普通的單文本輸入框、多文本框、下拉列表,以及按鈕、圖片展示、彈出對話框、表單處理、條碼二維碼等等,本篇隨筆基於普通表格業務的展示錄入的場景介紹這些常規Element組件的使用,使得我們對如何利用Element組件有一個大概的認識。

1、列表界面和其他模塊展示處理

在前面隨筆《循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理》介紹了基於列表展示了相關數據,並在列表界面整合了增刪改查等常規的業務操作處理。

 常規的列表展示界面,一般分為幾個區域,一個是查詢區域,一個是列表展示區域,一個是底部的分頁組件區域。查詢區域主要針對常規條件進行布局,以及增加一些全局或者批量的操作,如導入、導出、添加、批量添加、批量刪除等按鈕;而其中主體的列表展示區域,是相對比較複雜一點的地方,需要對各項數據進行比較友好的展示,可以結合Tag,圖標,按鈕等界面元素來展示,其中列表一般後面會包括一些對單行記錄處理的操作,如查看、編輯、刪除的操作,如果是批量刪除,可以放到頂部的按鈕區域。

對於常規按鈕、表格、分頁組件,前面已經做了相關的介紹,這裏就不再贅述。

在介紹具體界面組件的時候,我們先來了解下,整體的界面布局,我們把常規的列表界面,新增、編輯、查看、導入等界面放在一起,除了列表頁面,其他內容以彈出層對話框的方式進行處理,如下界面示意所示。

 每個對話框的:visible的屬性值,則是確定哪個模態對話框的显示和隱藏。

在Vue的JS模塊裏面,我們除了定義對應的對話框显示的變量外,對每個對話框,我們定義一個表單信息用來進行數據的雙向綁定處理。

 常規的新增、編輯、查看、導入等內容的定義,作為一個對話框組件定義,常規的對話框組件的使用代碼如下所示。

<el-dialog
  title="提示"
  :visible.sync="dialogVisible"
  width="30%"
  :before-close="handleClose">
  <span>這是一段信息</span>
  <span slot="footer" class="dialog-footer">
    <el-button @click="dialogVisible = false">取 消</el-button>
    <el-button type="primary" @click="dialogVisible = false">確 定</el-button>
  </span>
</el-dialog>

為了控制對話框的樣式,我們這裏注意下footer的slot,這個我們一般是把處理按鈕放在這裏,如對於查看界面對話框,我們定義如下所示。

  一般來說,對於表單內容比較多的場景,我們一般分開多個選項卡進行展示或者錄入,這樣方便管理,查看界面整體效果如下所示。

 對於對話框的數據綁定,我們在打開對話框前,先通過API模塊請求獲得JSON數據,然後綁定在對應的對話框模型屬性上即可,如對於查看界面,我們的處理邏輯如下所示。

    showView(id) {
      var param = { id: id }
      GetProductDetail(param).then(data => {
        Object.assign(this.viewForm, data);
      })
      this.isView = true
    },

對於表格的雙擊,我們同樣綁定它的查看明細處理操作,如下模板代碼和JS代碼所示。

模板HTML代碼如下:

<el-table
  v-loading="listLoading"
  :data="productlist"
  border
  fit
  stripe
  highlight-current-row
  :header-cell-style="{background:'#eef1f6',color:'#606266'}"
  @selection-change="selectionChange"
  @row-dblclick="rowDbclick"
>

JS邏輯代碼如下  

    rowDbclick(row, column) {
      var id = row.ID
      this.showView(id);
    },

 

2、常規界面組件的使用

 一般情況下,我們使用界面組件的時候,參考下官網《Element組件使用》,尋找對應組件的代碼進行參考,就差不多了,這裏還是就各種常規的Element組件進行大概的介紹吧。

1)表單和表單項、單文本框

對於表單,我們一般定義一個對應的名稱,並設置它的data對應的模型名稱即可,如下所示。

<el-form ref="viewForm" :model="viewForm" label-width="80px">

而表單項,一般是定義好表單項的Label即可,然後在其中插入對應的錄入控件或者展示控件。如對於單文本組件使用,如下所示。

 <el-form-item label="產品編號">
   <el-input v-model="editForm.ProductNo" />
 </el-form-item>

其中 v-model=”editForm.ProductNo”  就是對應綁定的數據。

而表單項,可以添加對字段的驗證處理,在數據提交前,可以校驗客戶的錄入是否有效等。

  <el-form-item
    prop="email"
    label="郵箱"
    :rules="[
      { required: true, message: '請輸入郵箱地址', trigger: 'blur' },
      { type: 'email', message: '請輸入正確的郵箱地址', trigger: ['blur', 'change'] }
    ]"
  >
    <el-input v-model="dynamicValidateForm.email"></el-input>
  </el-form-item>

注意這裏表單項,必須添加一個prop的屬性設置,如 prop=”email” 所示。

一般為了控制布局,我們還結合el-row進行一個布局的處理,如下代碼所示(一行等於span為24,span=12也就是一行放兩個控件組)。

<el-row>
  <el-col :span="12">
    <el-form-item label="產品編號">
      <el-input v-model="editForm.ProductNo" />
    </el-form-item>
  </el-col>
  <el-col :span="12">
    <el-form-item label="條碼">
      <el-input v-model="editForm.BarCode" />
    </el-form-item>
  </el-col>
</el-row>

 

2)、下拉列表控件的綁定

下拉列表的綁定處理,也是通過 v-model 進行值的綁定,而選項則可以通過數據列表進行綁定。

<el-form-item label="商品類型">
  <el-select v-model="editForm.ProductType" filterable="" placeholder="請選擇">
    <el-option
      v-for="(item, key) in typeList"
      :key="key"
      :label="item.value"
      :value="item.key"
    />
  </el-select>
</el-form-item>

而選項中的 typeList,我們可以在頁面初始化的時候獲取出來即可。

  created() {
    // 獲取產品類型,用於綁定字典等用途
    GetProductType().then(data => {
      if (data) {
        data.forEach(item => {
          this.productTypes.set(item.id, item.name)
          this.typeList.push({ key: item.id, value: item.name })
        })

        // 獲取列表信息
        this.getlist()
      }
    });
  },

對於textarea常規的多行文本框,其實和普通單行文本框處理差不多,指定它的type=”textarea” 和 rows的數值即可。

  <el-tab-pane label="說明" name="second">
    <el-form-item label="說明">
      <el-input v-model="editForm.Description" type="textarea" :rows="10" />
    </el-form-item>
  </el-tab-pane>

而對於一些可能需要展示HTML內容的,我們可以使用DIV控件來展示,通過v-html標識來處理包含HTML代碼的內容。

  <el-tab-pane label="詳細說明">
    <el-form-item label="詳細說明">
      <div class="border-radius" v-html="viewForm.Note" />
    </el-form-item>
  </el-tab-pane>

 

3)、圖片展示

對於一些需要展示服務器圖片,我們請求后,根據Element圖片組件的設置處理即可,如下包括單個圖片和多個圖片的展示和預覽操作。

 圖片展示的代碼如下所示。

  <el-tab-pane label="圖片信息">
    <el-form-item label="封面圖片">
      <el-image
        style="width: 100px; height: 100px"
        :src="viewForm.Picture"
        :preview-src-list="[viewForm.Picture]"
      />
    </el-form-item>
    <el-form-item label="Banner圖片">
      <el-image
        style="width: 100px; height: 100px"
        :src="viewForm.Banner"
        :preview-src-list="[viewForm.Banner]"
      />
    </el-form-item>
    <el-form-item label="商品展示圖片">
      <el-image
        v-for="item in viewForm.pics"
        :key="item.key"
        class="border-radius"
        :src="item.pic"
        style="width: 100px; height: 100px;padding:10px"
        :preview-src-list="getPreviewPics()"
      />
    </el-form-item>
  </el-tab-pane>

上圖中,如果是單個圖片,那麼預覽我們設置一個集合為一個url即可,如 [viewForm.Banner],如果是多個圖片,需要通過一個函數來獲取圖片列表,如 getPreviewPics() 函數所示。

    getPreviewPics() {
      // 轉換ViewForm.pics裏面的pic集合
      var list = []
      if (this.viewForm.pics) {
        this.viewForm.pics.forEach(item => {
          if (item.pic) {
            list.push(item.pic)
          }
        })
      }
      return list
    }

 

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

4)、第三方擴展控件

對於一些需要使用擴展組件的,我們一般搜索下解決方案,通過npm安裝對應的組件即可解決,如對於條碼和二維碼,我使用 @chenfengyuan/vue-barcode和 @chenfengyuan/vue-qrcode,一般在Github上搜索下關鍵字,總能找到一些很受歡迎的第三方組件。

  安裝這些組件都有具體的說明,如下所示(如果卸載,直接修改install為uninstall即可)。

npm install @chenfengyuan/vue-barcode vue

以及

npm install @chenfengyuan/vue-qrcode vue

條碼和二維碼的展示效果如下所示

如果全局引入barcode和qrcode 組件,我們在main.js裏面引入即可,如下代碼所示

// 引入barcode,qrcode
import VueBarcode from '@chenfengyuan/vue-barcode';
import VueQrcode from '@chenfengyuan/vue-qrcode';
Vue.component(VueBarcode.name, VueBarcode);

  

 富文本編輯,我這裏採用了 Tinymce 第三方組件來實現編輯處理,展示效果如下所示。

  代碼如下所示

  <el-tab-pane label="詳細說明" name="third">
    <el-form-item label="詳細說明">
      <tinymce v-model="editForm.Note" :height="300" />
    </el-form-item>
  </el-tab-pane>

以上就是一些常規的界面組件的使用,後面在繼續介紹文件上傳和圖片結合的操作。

3、自定義組件的創建使用

使用Vue的比以往BS開發的好處,就是可以很容易實現組件化,這點很好,一旦我們定義好一個控件,就可以在多個界面裏面進行使用,非常方便,而且封裝性可以根據自己的需要進行處理。

查詢區域一般的界面效果如下所示,除了包含一些常用的查詢條件,一般會有一些下拉列表,這些可能是後台字典裏面綁定的內容,可以考慮作為一個通用的字典下拉列表組件來做。

其實界面錄入的時候,也往往需要這些條件下拉列表的。

  那麼我們來定義一個自定義組件,並在界面上使用看看。

在Components目錄創建一個目錄,並創建一個組件的vue文件,命名為my-dictdata.vue,如下所示。

 界面模板代碼我們就一個select組件為主即可。

<template>
  <el-select v-model="svalue" filterable clearable placeholder="請選擇">
    <el-option
      v-for="(item, index) in dictItems"
      :key="index"
      :label="item.Text"
      :value="item.Value"
    />
  </el-select>
</template>

script腳本邏輯代碼如下所示。

<script>
// 引入API模塊類方法
import { GetDictData } from '@/api/dictdata'

export default {
  name: 'MyDictdata', // 組件的名稱
  props: {
    typeName: { // 字典類型方式,從後端字典接口獲取數據
      type: String,
      default: ''
    },
    options: {// 固定列表方式,直接綁定
      type: Array,
      default: () => { return [] }
    }
  },
  data() {
    return {
      dictItems: [], // 設置的字典列表
      svalue: '' // 選中的值
    }
  },
  watch: {
    // 判斷下拉框的值是否有改變
    svalue(val, oldVal) {
      if (val !== oldVal) {
        this.$emit('input', this.svalue);
      }
    }
  },
  mounted() {
    var that = this;

    if (this.typeName && this.typeName !== '') {
      // 使用字典類型,從服務器請求數據
      GetDictData(this.typeName).then(data => {
        if (data) {
          data.forEach(item => {
            if (item && typeof (item.Value) !== 'undefined' && item.Value !== '') {
              that.dictItems.push(item)
            }
          });
        }
      })
    } else if (this.options && this.options.length > 0) {
      // 使用固定字典列表
      this.options.forEach(item => {
        if (item && typeof (item.Value) !== 'undefined' && item.Value !== '') {
          that.dictItems.push(item)
        }
      });
    }
    // 設置默認值
    this.svalue = this.value;
  },
  methods: {

  }
}
</script>

主要就是處理字典數據的獲取,並綁定到模型對象上即可。

在頁面上使用前,需要引入我們定義的組件

import myDictdata from '@/components/Common/my-dictdata'

然後包含進去components裏面即可

export default {
  components: { myDictdata },

那麼原來需要直接使用select組件的代碼

<el-select v-model="searchForm.ProductType" filterable clearable placeholder="請選擇">
  <el-option
    v-for="(item, key) in typeList"
    :key="key"
    :label="item.value"
    :value="item.key"
  />
</el-select>

則可以精簡為一行代碼

<my-dictdata v-model="searchForm.ProductType" type-name="商品類型" />

而對於固定列表的,我們也可以通用的處理代碼

<my-dictdata v-model="searchForm.Status" :options="Status" />

其中Status是定義的一個對象集合

  Status: [
    { Text: '正常', Value: 0 },
    { Text: '推薦', Value: 1 },
    { Text: '停用', Value: 2 }
  ]

是不是非常方便,而得到的效果則不變。

 

 以上就是多個頁面內容,通過對話框層模式整合在一起,並介紹如何使用,以及對界面中常見的Element組件進行介紹如何使用,以及定義一個字典列表的主定義組件,用於簡化界面代碼使用,

 

列出以下前面幾篇隨筆的連接,供參考:

循序漸進VUE+Element 前端應用開發(1)— 開發環境的準備工作

循序漸進VUE+Element 前端應用開發(2)— Vuex中的API、Store和View的使用

循序漸進VUE+Element 前端應用開發(3)— 動態菜單和路由的關聯處理

循序漸進VUE+Element 前端應用開發(4)— 獲取後端數據及產品信息頁面的處理

循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理

 

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

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

賣得便宜就代表國產比合資差?_網頁設計

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

在銷量方面,MpV市場以及SUV市場國產車型可以說是已經超越了合資車型,而對於轎車市場。總結下來就是難以撼動合資車型的地位。實際上人們在購車的時候為求安心,在最後的選擇上基本也就是那幾個賣得瘋狂的車型,因為如果車不好哪有這麼多人買嘛,跟着買肯定沒錯的。

先來問大家一個問題:你覺得國產車便宜嗎?答案也很明顯,不僅價格便宜,

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

而且配置比合資車型更高!一直以來國產車型都是以高性價比作為賣點。也可以這麼說,現在國產品牌已經崛起了,但是國產車型普遍賣這麼便宜真的厚道?是有良心了嗎?

國產車真的崛起了嗎?

在部分車型市場確實如此

我們先來看看近期的銷量…

在銷量方面,MpV市場以及SUV市場國產車型可以說是已經超越了合資車型,而對於轎車市場…總結下來就是難以撼動合資車型的地位。實際上人們在購車的時候為求安心,在最後的選擇上基本也就是那幾個賣得瘋狂的車型,因為如果車不好哪有這麼多人買嘛,跟着買肯定沒錯的。

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

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

等了9年大眾7座SUV終於來了 外形霸氣_網頁設計

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

空間:靈活多變座椅布局方面,官圖中的新車是7座的布局,不排除未來國產後將提供5座/6座的座椅布局來迎合國內消費者的需求,1989mm的寬度和2980mm的軸距提供了很寬裕的車內空間,即使是第三排座椅,也能擁有很不錯的舒適度,第二座椅可以前後移動,二三排座椅放倒后空間的擴展性非常可觀,放一些大件物品也是很輕鬆的。

外觀:霸氣穩重

新車依舊是基於大眾MQB平台打造,定位於途銳和途觀之間,其軸距達達到了2980mm,車身尺寸為5039*1989*1773mm,與奧迪Q7福特探險者等競爭對手相差無幾,是個很有來頭的大傢伙。

前臉終於不是大眾套娃式的設計了,粗壯的進氣格柵鍍鉻飾條,搭配着寬厚犀利的的前大燈,給人很霸氣的感覺,力量感十足的腰線連接着前後突出的輪眉,凸顯車身的肌肉輪廓,尾燈部分將採用全LED光源,加上一條貫穿尾部的鍍鉻飾條加以搭配,突出了硬朗與穩重的質感表現。

內飾:熟悉的大眾風

典型的大眾家族式設計風格,

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

還是那個熟悉的味道,主打簡約實用,仿木飾板的加入充滿古典豪華的氣息,12.3英寸的全液晶儀錶显示屏無疑是最大的亮點,可以多種模式可供显示,非常的炫酷,像全景影像、盲點監測、自適應巡航+車道保持等科技配置也是十分齊全的。

空間:靈活多變

座椅布局方面,官圖中的新車是7座的布局,不排除未來國產後將提供5座/6座的座椅布局來迎合國內消費者的需求,1989mm的寬度和2980mm的軸距提供了很寬裕的車內空間,即使是第三排座椅,也能擁有很不錯的舒適度,第二座椅可以前後移動,二三排座椅放倒后空間的擴展性非常可觀,放一些大件物品也是很輕鬆的。

動力:強勁的動力單元

國產版車型將搭載2.0T高、低功率發動機,最大功率為162千瓦/137千瓦,如果這還滿足不了你,還有一台更強的2.5T最大功率220千瓦的發動機,官方百公里加速只需6.9秒,與之匹配的是7速濕式雙離合變速器,而且並有4種駕駛模式和4種越野模式可供選擇,動力響應、變速箱、四驅系統等都會做出相應調整,能適應多種不同路況。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

吐血整理全網最全的單例模式_網頁設計

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

前言

之前文章已經說過了設計模式的七大原則,即接口屏蔽原則,開閉原則,依賴倒轉原則,迪米特原則,里氏替換原則,單一職責原則,合成復用原則,不明白的,可以移至萬字總結之設計模式七大原則(https://www.cnblogs.com/chenchen0618/p/12434603.html)。從今天開始我們就要學習一些常見的設計模式,方便我們以後看源碼使用,當然,也可以指導我們平常的編碼任務。

我們常見的設計模式主要有23種,分為3種類型,咱也不全說,只寫重要的幾個把。

創建型:單例模式,工廠模式,原型模式

結構型:適配器模式,裝飾模式,代理模式

行為型:模板模式,觀察者模式,狀態模式,責任鏈模式

單例模式的概念和作用

概念

系統中只需要一個全局的實例,比如一些工具類,Converter,SqlSession等。

為什麼要用單例模式?

  • 只有一個全局的實例,減少了內存開支,特別是某個對象需要頻繁的創建和銷毀的時候,而創建和銷毀的過程由jvm執行,我們無法對其進行優化,所以單例模式的優勢就顯現出來啦。
  • 單例模式可以避免對資源的多重佔用,避免出現多線程的複雜問題。

單例模式的寫法重點

構造方法私有化

我們需要將構造方法私有化,而默認不寫的話,是公有的構造方法,外部可以顯式的調用來創建對象,我們的目的是讓外部不能創建對象。

提供獲取實例的公有方法

對外只提供一個公有的的方法,用來獲取實例,而這個實例是否是唯一的,單例的,由方法決定,外部無需關心。

單例模式的常見寫法(如下,重點)

餓漢式和懶漢式的區別

餓漢式

餓漢式,從名字上也很好理解,就是“比較餓”,迫不及待的想吃飯,實例在初始化的時候就已經建好了,不管你有沒有用到,都先建好了再說。

懶漢式

餓漢式,從名字上也很好理解,就是“比較懶”,不想吃飯,等餓的時候再吃。在初始化的時候先不建好對象,如果之後用到了,再創建對象。

1.餓漢式(靜態變量)–可以使用

A類

public class A {
    //私有的構造方法
    private A(){}
    //私有的靜態變量
    private final static A a=new A();
    //對外的公有方法
    public static A getInstance(){
        return a;
    }
}

 

測試類

public class test {
    public static void main(String[] args){
        A a1=A.getInstance();
        System.out.println(a1.hashCode());

        A a2=A.getInstance();
        System.out.println(a2.hashCode());
    }
}

 

運行結果

說明

該方法採用的靜態常量的方法來生成對應的實例,其只在類加載的時候就生成了,後續並不會再生成,所以其為單例的。

優點

在類加載的時候,就完成實例化,避免線程同步問題。

缺點

沒有達到懶加載的效果,如果從始到終都沒有用到這個實例,可能會導致內存的浪費。

2.餓漢式(靜態代碼塊)–可以使用

A類

public class A { 
    //私有的構造方法
     private A(){}
    //私有的靜態變量
     private final static A a; 
    //靜態代碼塊 
    static{ a=new A(); } 
    //對外的公有方法
    public static A getInstance(){
     return a; 
    }
}

 

測試類

public class test {
    public static void main(String[] args){
        A a1=A.getInstance();
        System.out.println(a1.hashCode());

        A a2=A.getInstance();
        System.out.println(a2.hashCode());
    }
}

 

運行結果

說明

該靜態代碼塊的餓漢式單例模式與靜態變量的餓漢式模式大同小異,只是將初始化過程移到了靜態代碼塊中。

優點缺點

與靜態變量餓漢式的優缺點類似。

3.懶漢式

A類

public class A {
    //私有的構造方法
    private A(){}
    //私有的靜態變量
    private  static A a;
    //對外的公有方法
    public static A getInstance(){
        if(a==null){
            a=new A();
        }
        return a;
    }
}

 

測試類和運行結果

同上。

優點

該方法的確做到了用到即加載,也就是當調用getInstance的時候,才判斷是否有該對象,如果不為空,則直接放回,如果為空,則新建一個對象並返回,達到了懶加載的效果。

缺點

當多線程的時候,可能會產生多個實例。比如我有兩個線程,同時調用getInstance方法,並都到了if語句,他們都新建了對象,那這裏就不是單例的啦。

4.懶漢式(線程安全,同步方法)–可以使用

public class A {
    //私有的構造方法
    private A(){}
    //私有的靜態變量
    private  static A a;
    //對外的公有方法
    public synchronized static A getInstance(){
        if(a==null){
            a=new A();
        }
        return a;
    }
}

 

測試類和運行結果

同上。

優點

通過synchronize關鍵字,解決了線程不安全的問題。如果兩個線程同時調用getInstance方法時,那就先執行一個線程,另一個等待,等第一個線程運行結束了,另一個等待的開始執行。

缺點

這種方法是解決了線程不安全的問題,卻給性能帶來了很大的問題,效率太低了,getInstance經常發生,每一次都要同步這個方法。

我們想着既然是方法同步導致了性能的問題,我們核心的代碼就是新建對象的過程,也就是new A();的過程,我們能不能只對部分代碼進行同步呢?

那就是方法5啦。

5.懶漢式(線程不安全)

A類

public class A {
    //私有的構造方法
    private A(){}
    //私有的靜態變量
    private  static A a;
    public  static A getInstance(){
        if(a==null){
            synchronized (A.class){
                a=new A();
            }
        }
        return a;
    }
} 

 

測試類和運行結果

如上。

優點

懶漢式的通用優點,用到才創建,達到懶加載的效果。

缺點

這個沒有意義,並沒有解決多線程的問題。我們可以看到如果兩個線程同時調用getInstance方法,並且都已經進入了if語句,即synchronized的位置,即便同步了,第一個線程先執行,進入synchronized同步的代碼塊,創建了對象,另一個進入等待狀態,等第一個線程執行結束,第二個線程還是會進入synchronized同步的代碼塊,創建對象。這個時候我們可以發現,對這代碼塊加了synchronized沒有任何意義,還是創建了多個對象,並不符合單例。

6.雙重檢查 –強烈推薦使用

A類

public class A {
    //私有的構造方法
    private A() {
    }

    //私有的靜態變量
    private volatile static A a;

    //對外的公有方法
    public static A getInstance() {
        if (a == null) {
            synchronized (A.class) {
                if (a == null) {
                    a = new A();
                }
            }
        }
        return a;
    }
} 

 

測試類和運行結果

同上。

優點

強烈推薦使用,這種寫法既避免了在多線程中出現線程不安全的情況,也能提高性能。

咱具體來說,如果兩個線程同時調用了getInstance方法,並且都已到達了if語句之後,synchronized語句之前,此時第一個線程進入synchronized之中,先判斷是否為空,很顯然第一次肯定為空,那麼則新建了對象。等到第二個線程進入synchronized之中,先判斷是否為空,顯然第一個已經創建了,所以即不新建對象。下次,不管是一個線程或者多個線程,在第一個if語句那就判斷出有對象了,便直接返回啦,根本進不了裏面的代碼。

缺點

就是這麼完美,沒有缺點,哈哈哈。

volatile(插曲)

咱先來看一個概念,重排序,也就是語句的執行順序會被重新安排。其主要分為三種:

1.編譯器優化的重排序:可以重新安排語句的執行順序。

2.指令級并行的重排序:現代處理器採用指令級并行技術,將多條指令重疊執行。

3.內存系統的重排序:由於處理器使用緩存和讀寫緩衝區,所以看上去可能是亂序的。

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

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

上面代碼中的a = new A();可能被被JVM分解成如下代碼:

// 可以分解為以下三個步驟
1 memory=allocate();// 分配內存 相當於c的malloc
2 ctorInstanc(memory) //初始化對象
3 s=memory //設置s指向剛分配的地址
 // 上述三個步驟可能會被重排序為 1-3-2,也就是:
1 memory=allocate();// 分配內存 相當於c的malloc
3 s=memory //設置s指向剛分配的地址
2 ctorInstanc(memory) //初始化對象

 

一旦假設發生了這樣的重排序,比如線程A在執行了步驟1和步驟3,但是步驟2還沒有執行完。這個時候線程B有進入了第一個if語句,它會判斷a不為空,即直接返回了a。其實這是一個未初始化完成的a,即會出現問題。

所以我們會將入volatile關鍵字,來禁止這樣的重排序,即可正常運行。

7.靜態內部類 –強烈推薦使用

A類

public class A {
    //私有構造函數
    private A() {
    }

    //私有的靜態內部類
    private static class B {
        //私有的靜態變量
        private static A a = new A();
    }

    //對外的公有方法
    public static A getInstance() {
        return B.a;
    }
}

 

 

優點

B在A裝載的時候並不會裝載,而是會在調用getInstance的時候裝載,這利用了JVM的裝載機制。這樣一來,優點有兩點,其一就是沒有A加載的時候,就裝載了a對象,而是在調用的時候才裝載,避免了資源的浪費。其二是多線程狀態下,沒有線程安全性的問題。

缺點

沒有缺點,太完美啦。

8.枚舉 –Java粑粑強烈推薦使用

問題1:私有構造器並不安全

如果不明白反射,可以查看我之前的文章,傳送門,萬字總結之反射(框架之魂)。

如果我們的對象是通過反射方法invoke出來,這樣新建的對象與通過調用getInstance新建的對象是不一樣的,具體咱來看代碼。

 

public class test {
    public static void main(String[] args) throws Exception {
        A a=A.getInstance();
        A b=A.getInstance();
        System.out.println("a的hash:"+a.hashCode()+",b的hash:"+b.hashCode());

        Constructor<A> constructor=A.class.getDeclaredConstructor();
        constructor.setAccessible(true);
        A c=constructor.newInstance();
        System.out.println("a的hash:"+a.hashCode()+",c的hash:"+c.hashCode());

    }
}

 

我們來看下運行結果:

我們可以看到c的hashcode是和a,b不一樣,因為c是通過構造器反射出來的,由此可以證明私有構造器所組成的單例模式並不是十分安全的。

問題2:序列化問題

我們先將A類實現一個Serializable接口,具體代碼如下,跟之前的雙重if檢查一樣,只是多了個接口。

 

public class A implements Serializable {
    //私有的構造方法
    private A() {
    }

    //私有的靜態變量
    private volatile static A a;

    //對外的公有方法
    public static A getInstance() {
        if (a == null) {
            synchronized (A.class) {
                if (a == null) {
                    a = new A();
                }
            }
        }
        return a;
    }
} 

 

測試類:

public class test {
    public static void main(String[] args) throws Exception {
        A s = A.getInstance();

        //
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("學習Java的小姐姐"));
        oos.writeObject(s);
        oos.flush();
        oos.close();
        //
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("學習Java的小姐姐"));
        A s1 = (A)ois.readObject();
        ois.close();

        System.out.println(s+"\n"+s1);
        System.out.println("序列化前後兩個是否同一個:"+(s==s1));
    }
}

 

我們來看下運行結果,很顯然序列化前後兩個對象並不相等。為什麼會出現這種問題呢?這個講起來,又可以寫一篇文章了。簡單來說,任何一個readObject方法,不管是顯式的還是默認的,它都會返回一個新建的實例,這個新建的實例不同於該類初始化時創建的實例。

A類

public enum A {
  a;
  public A getInstance(){
      return a;
  }
}

 

看着代碼量很少,我們將其編譯下,代碼如下:

public final class  A extends Enum< A> {      
public static final A a;
public static A[] values();
public static AvalueOf(String s);
static {}; }

 

如何解決問題1?

public class test {
    public static void main(String[] args) throws Exception {
        A a1 = A.a;
        A a2 = A.a;
        System.out.println("正常情況下,實例化兩個實例是否相同:" + (a1 == a2));

        Constructor<A> constructor = null;
        constructor = A.class.getDeclaredConstructor();
        constructor.setAccessible(true);
        A a3 = null;
        a3 = constructor.newInstance();
        System.out.println("a1的hash:" + a1.hashCode() + ",a2的hash:" + a2.hashCode() + ",a3的hash:" + a3.hashCode());
        System.out.println("通過反射攻擊單例模式情況下,實例化兩個實例是否相同:" + (a1 == a3));
    }
}

 

運行結果:

我們看到報錯了,是在尋找構造函數的時候報錯的,即沒有無參的構造方法,那我們看下他繼承的父類ENUM有沒有構造函數,看下源碼,發現有個兩個參數String和int類型的構造方法,我們再看下是不是構造方法的問題。

我們再用父類的有參構造方法試下,代碼如下:

public class test {
    public static void main(String[] args) throws Exception {
        A a1 = A.a;
        A a2 = A.a;
        System.out.println("正常情況下,實例化兩個實例是否相同:" + (a1 == a2));
        Constructor<A> constructor = null;
        constructor = A.class.getDeclaredConstructor(String.class,int.class);//其父類的構造器
        constructor.setAccessible(true);
        A a3 = null;
        a3 = constructor.newInstance("學習Java的小姐姐",1);
        System.out.println("a1的hash:" + a1.hashCode() + ",a2的hash:" + a2.hashCode() + ",a3的hash:" + a3.hashCode());
        System.out.println("通過反射攻擊單例模式情況下,實例化兩個實例是否相同:" + (a1 == a3));
    }
}

運行結果如下:

我們發現報錯信息的位置已經換了,現在是已經有構造方法,而是在newInstance方法的時候報錯了,我們跟下源碼發現,人家已經明確寫明了如果是枚舉類型,直接拋出異常,代碼如下,所以是無法使用反射來操作枚舉類型的數據的。

如何解決問題2?

public class test {
    public static void main(String[] args) throws Exception {
        A s = A.a;

        //
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("學習Java的小姐姐"));
        oos.writeObject(s);
        oos.flush();
        oos.close();
        //
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("學習Java的小姐姐"));
        A s1 = (A)ois.readObject();
        ois.close();

        System.out.println(s+"\n"+s1);
        System.out.println("序列化前後兩個是否同一個:"+(s==s1));
    }
}

 

運行結果;

優點

避免了反射帶來的對象不一致問題和反序列問題,簡單來說,就是簡單高效沒問題。

結語

看到這裏的都是真愛的,在這裏先謝謝各位大佬啦。

單例模式是最簡單的一種設計模式,主要包括八種形式,分別是餓漢式靜態變量,餓漢式靜態代碼塊,懶漢式線程不安全,懶漢式線程安全,懶漢式線程不安全(沒啥意義),懶漢式雙重否定線程安全,內部靜態類,枚舉類型。

這幾種最優的是枚舉類型和內部靜態類,其次是懶漢式雙重否定,剩下的都差不多啦。

如果有說的不對的地方,還請各位指正,我好繼續學習去。

參考資料

一個單例模式中volatile關鍵字引發的思考

 

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

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢