OBSBOT Tiny AI 網路攝影機開箱:走到哪、拍到哪,直播主、網路授課、簡報必備神器_網頁設計

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

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

為大家介紹 OBSBOT Tiny AI 網路攝影機開箱,因為疫情的緣故,今年以來在家工作(WFH)與遠距離教學在家上課的需求大增,也連帶讓視訊類產品與相關應用大熱門,甚至發生缺貨的情況,傳統的筆電前置鏡頭與外接視訊鏡頭雖然可以應付一般線上會議的需求,但如果遇到需要進行簡報、教學或產品展示之類的情境,由於鏡頭角度不可動、解析度低的緣故,總是無法滿足進階使用者的需求,尤其是需要走動的情境更是如此,最好的解決方法是請專人協助攝影並導入視訊應用中,但實務上難度太高,一般人也很難為了簡報或上課如此大費周章與找到適合的人力,看到這樣的需求,由全球熱銷破千萬,擁有許多國際影音工作者的支持,並榮登 美國 TIME 時代雜誌 封面『2019年度最佳創新科技』的AI導演攝影機「OBSBOT Tail」設計團隊開發出了能在電腦上隨插即用的 OBSBOT Tiny ,採用企業監視器等級的PTZ(左右轉動 Pan、上下傾斜 Tile 與放大 Zoom)設計,不但體積變小,更可以在鏡頭前用手勢控制攝影機,而且隨插即用幾乎零學習人人都能上手使用。

OBSBOT Tiny AI 網路攝影機開箱

我們也拍攝了 OBSBOT Tiny 開箱,所有重點都在影片中:

 

購買 OBSBOT Tiny 請點我
請注意募資非網購,請詳閱官網說明

OBSBOT Tiny 體積相當小巧,體積僅有89.4x58x58mm,重量也只有146公克,是可以隨身攜帶的尺寸與重量:

OBSBOT Tiny 採用企業等級的PTZ多向運動設計,拍攝角度支援垂直轉動+-45度與水平轉動+-150度:

不須穿戴任何接收裝置, OBSBOT Tiny 搭載智慧 AI 機器學習運算晶片,提供先進的AI人臉辨識、自動構圖、自動追蹤功能,配合空中手勢控制、能進行Full HD 1080p 60fps 高畫質錄影、自動追蹤和對焦技術,搭配優異的人形辨識演算法擁有超強鎖定和抗干擾能力,即便多人同時入鏡也不影響AI追蹤的準確度。

在底座前方配置兩顆全向型麥克風,能收錄360度全方位的聲音,適合在室內訪談時放在桌上,不須特地調整收音位置,就能同時收錄多人聲音。而且搭配獨家的智慧偵測人聲技術,具備高靈敏度,可降低其他背景干擾噪音,僅放大接收人聲:

OBSBOT Tiny AI 網路攝影機支援 Windows 與 Mac 電腦,隨插即用不需要安裝任何驅動程式,只要把 OBSBOT Tiny 的 USB 連接線接上電腦或筆電,就能馬上開始讓AI鏡頭幫你自動拍攝視訊,呈現專業的鏡頭構圖。除了空中手勢控制,你可以下載 OBSBOT Tiny 專屬軟體到電腦上,直接用滑鼠遙控攝影機:

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

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

軟體部分支援各種視訊會議軟體 ,如 Line、Zoom、Skype、Google Handout、Teams、GoToMeeting…如果您是直播主的話,更支援FB、YouTube、Tiktok與OBS…等各種直播應用,搭配人臉辨識、 AI 自動追蹤、空中手勢控制、AI構圖等功能,讓您也能單人輕鬆完成複雜的直播內容:

這邊有阿達自己測試的臉書直播影片,大家可以看一下效果(臉書直播最高只有720P):

除了電腦可用以外,接手機也可以使用,鏡頭一樣免設定直接跟著你拍(需配合付費月租軟體 CamerFi Live),真的很猛:

而且當線上視訊會議或直播進行中,如果臨時有各種狀況需要暫停直播或直播完畢,這時候只要將鏡頭往下轉,對方看到的畫面會自動呈現黑屏,內建的麥克風會馬上靜音,讓對方看不到也聽不到,避免各種穿幫意外鏡頭外流:

購買 OBSBOT Tiny 請點我

請注意募資非網購,請詳閱官網說明

 

OBSBOT Tiny 相當適合經常需要進行圖表簡報或教學的商務人士或專業老師呈現專業感、更適合經常需要自己一個人單幹一場直播的直播主或YouTuber使用,只要有 OBSBOT Tiny 就好像請了一位專業攝影師來為自己掌鏡一般,實在太實用了!另外廠商還推出了我們之前介紹過的 ProPoint 滑鼠簡報筆加價購活動,讓你使用上更方便、更好用,也推薦給有需要的朋友參考喔!

您也許會喜歡:

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

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

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

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

中國網友秀出 ROG Strix RTX 3090 鋼彈聯名款香照,有錢也不一定買得到的鋼彈版顯卡長這樣_貨運

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

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

撇開最近某個不可說之國的小編提刀架老總,幫華碩得罪台灣消費者的事件來說,華碩在電腦相關產品涉獵甚廣,而且成績都相當優秀。不論在台灣還是世界各地均有出色的成績。就算跳出電腦本業,跑去做手機,也在經歷多年磕磕碰碰後做出了優秀的手機。今天剛好看到中國網友買到了據說極難入手的 ROG STRIX RTX 3090 鋼彈聯名款顯卡,這款顯卡難入手的地方不光是他驚為天人的定價,另一方面更是因為 RTX 3090 供貨不穩定,普通版都未必容易買到,何況是特仕版。既然買都不見得買不到,看看別人分享的開箱沾沾光也是好的:

▲ROG 從 SUNRISE 公司獲得授權製作的 RTX 3090 鋼彈聯名款顯卡真的很香。不看價錢的話(圖片來源)

兩個月前,華碩在 2020 ROG DAY 活動中公布了與 SUNRISE 公司 合作推出的聯名款電腦周邊,包含顯示卡、機殼、無線分享器、鍵盤與螢幕。這些產品主要都具備著初代鋼彈 RX-78-2 的各種元素,像是以白色為主體的配色,點綴藍、紅、黃鋼彈三原色的外觀設計,都可以看出這些產品在外觀上的確是做了不少功夫。由於今年正好趕上機動戰士鋼彈 40 週年紀念,因此這些產品也成為鋼彈 40 週年紀念企畫的一部份。

多了鋼彈,價格更貴

就拿這次中國網友開箱的 ROG STRIX RTX 3090 顯卡來說,就是華碩這系列聯名產品中最高貴的一款。除了 GPU 本身目前供貨不穩定外,本體定價就已經相當昂貴。加上鋼彈元素以後更是價格攀升到不可思議的程度。中國售價就來到人民幣 16999 元。換算新台幣約 73,000 元,以一張顯卡來說可謂是貴到突破天際:

▲這張顯卡的台灣售價約 59,990 元。重要的是它目前似乎在缺貨,許多網頁均已掛上補貨中字樣

從這裡我們已經可已知道,不論是本體的 ROG STRIX RTX 3090 顯卡,還是鋼彈版的顯卡,兩者不但都售價昂貴,而且現階段還很難買。特別是鋼彈版顯卡目前僅針對亞洲地區販售。因此從數量到販售地區的限制,都讓這張顯卡瞬間變得尊「貴」不已。接下來,就來看看這張卡的尊容吧。

▲從風扇上可以發現每個風扇的中心處各有不同的圖案設計,最右邊的自然是聯邦的徽章啦(圖片來源)

▲背面可說是多彩多姿,背版上多了些鋼彈元素的貼圖後看起來更加漂亮(圖片來源)

▲彩盒上直接來個鋼彈特寫,煞氣十足(圖片來源)

▲彩盒另一面跟原裝卡差不多設計,不過可以看到盒頂有鋼彈的字樣(圖片來源)

▲與 TITAN RTX 原廠卡比一比大小(圖片來源)

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

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

▲RX 6900 XT 原廠卡瞬間覺得苗條了些(圖片來源)

▲這大概是整台電腦中最貴的燈效了(圖片來源)

▲地球聯邦的徽章或縮寫字樣幾乎到處可以看到(圖片來源)

▲聯邦縮寫跟 RX-78-2 字體放在一起(圖片來源)

▲靠近檔板的位置還可以看到機動戰士鋼彈的 Logo(圖片來源)

消息來源:Chiphell、Videocardz、WCCFtech

您也許會喜歡:

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

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

※回頭車貨運收費標準

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

史上最強軒逸!這款軒逸竟然快到讓你連尾燈都看不到?_網頁設計公司

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

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

軒逸SR在自動擋選擇上依然是那副扼殺運動感的CVT變速箱,幸好還有着一個6MT手動變速箱稍微提供一點趣味。在標準模式下,油門反應實在有點遲鈍,依然的“日產”風格,而在ECO模式下,這種延遲就更為嚴重了,讓人不禁會想“我為什麼要買這輛1。

日產軒逸SR TUOBO

日產軒逸,相信大家對其都不會陌生,在油耗上以及舒適性上備受好評,可以說是家庭使用的最佳緊湊型車型,但是注重油耗的它,在運動性能上是一個超大的缺點,即使是動力表現更好的1.8L車型,在高速公路上想要快速超越前車還是需要預留多一點空間以及時間,而且這款軒逸實在是不適合年輕人使用,總是缺乏了一點激情。但是日產最近則推出了搭載1.6T發動機的軒逸,加速性能上已經有着一點性能車的風格。

這終於給了軒逸一支強心針,這個1.6T發動機表現上是非常討人喜歡,1.6L的排量,加上了渦輪增壓,動力表現相當優秀,有着124千瓦的最大功率以及240牛米的最大扭矩,所以讓它有着百公里加速7.3s的成績,和着大眾速騰GLI一個層次。而這款發動機除了這款軒逸 SR使用以外,英菲尼迪那輛怪異的Juke也在使用着,所以在可靠性上是值得信賴的。

這款1.6T在表現上可以給到我們不少的樂趣,在juke上就可以充分表現出來了,而在軒逸SR上我們也能找到這樣的樂趣,在中低轉速下錶現就已經滿足我們的要求,1600到5200轉這寬廣的扭矩平台足以應付絕大多數情況,足夠優秀,但是還沒有達到完美的狀態,就像是90年代的那副SR20DE發動機那種,離完美還差了一點距離。

這樣的發動機是否讓你覺得它就是一輛性能車?先等一下,

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

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

看一下操控方面又是怎樣的表現先吧。軒逸SR在自動擋選擇上依然是那副扼殺運動感的CVT變速箱,幸好還有着一個6MT手動變速箱稍微提供一點趣味。在標準模式下,油門反應實在有點遲鈍,依然的“日產”風格,而在ECO模式下,這種延遲就更為嚴重了,讓人不禁會想“我為什麼要買這輛1.6T追求動力表現的車?”。所以我們更為推薦使用的是運動模式,平時我們可以通過方向盤左側的按鈕直接進入運動模式,而在它的旁邊的就是ECO模式。一旦進入運動模式,油門反應以及動力響應都非常积極,更有樂趣。

標配的6MT手動變速箱也不用想着能給你提供太多的運動感,一腳踩下離合器,你會發現這個離合踏板並沒有性能車的那種緊繃感,而是日產慣有的輕巧,離合點卻是比較難以捉摸的感覺,在第一次駕駛的時候很有可能讓你吃點“苦頭”。對於CVT變速箱,只能說是非常流暢,以及動力充沛,但是感官體驗上就肯定沒有其他變速箱那樣來得暢快淋漓。

一旦駕駛起來,家用車的骨子就會显示出來,一如既然的以舒適為主,但還是缺乏了支撐性,讓人缺乏信心,當然這也和它達到50的扁平率的輪胎有關,雖然它搭載的是一個17英寸的輪轂。要想控制好側傾,我們認為一副車身加強件以及更粗壯的防傾是非常有必要的。但是並不是說加強了這些部分就可以達到性能車的水準,因為軒逸SR的轉向手感是和普通版的軒逸一樣,一樣缺乏路感以及輕巧。

而在價格方面,是絕對高於1.8L車型的,畢竟定位是最強的軒逸版本。與此最為類似的就是大眾速騰GLI,所以在價格方面我們猜測若是能引進中國,價格可能會在18-20萬左右,而且引入可能比較大,畢竟日產缺乏一輛定位高端的緊湊型轎車,而且在動力總成方面也是比較容易獲取。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

3萬塊首付買車?這三款體面的轎車和SUV首付3萬就可以開走_網頁設計公司

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

99萬長安逸動的外觀十分時尚,這也吸引了許多人關注逸動,逸動的車身尺寸為4620*1820*1490mm,軸距2660mm,尺寸表現在緊湊型轎車中還是很不錯的,尤其是1820mm的寬度甚至超越了許多日系中級車型。逸動的內飾設計經過改款之後也提升了不少,內飾的立體感和層次感好了不少,用料上也比較厚道,全新的儀錶盤显示效果更好,中央液晶屏的加入給車內的科技感提升了不少。

江淮汽車-瑞風S3

指導價:6.58-9.58萬

瑞風S3剛剛經歷中期改款,外觀設計煥然一新,重新設計過的前臉和大燈比老款時尚一些,只是不協調的感覺還是存在,側面來說S3仍然不算好看,感覺S3在視覺上仍然是又高又窄。S3的尺寸為4345*1765*1615mm,尺寸在小型SUV中屬於偏大的。

內飾上S3的變化可就大很多了,重新設計的中控台和儀錶盤時尚了很多,尤其是儀錶盤重新設計之後立體感和層次感更強,

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

讀數更加清晰而且显示的信息更加豐富,瑞風S3採用1.5L 1.6L兩種發動機,匹配手動/無級自動變速箱,動力表現剛好夠用。

長安汽車-逸動

指導價:7.49-24.99萬

長安逸動的外觀十分時尚,這也吸引了許多人關注逸動,逸動的車身尺寸為4620*1820*1490mm,軸距2660mm,尺寸表現在緊湊型轎車中還是很不錯的,尤其是1820mm的寬度甚至超越了許多日系中級車型。

逸動的內飾設計經過改款之後也提升了不少,內飾的立體感和層次感好了不少,用料上也比較厚道,全新的儀錶盤显示效果更好,中央液晶屏的加入給車內的科技感提升了不少。

上汽大眾-桑塔納

指導價:8.49-13.89萬

對於喜歡合資品牌的朋友大眾桑塔納就不得不看了,這款入門級合資緊湊型轎車外觀平平,但是大眾套娃的外觀使得駕駛者開着桑塔納也比較有面子,4475*1706*1469mm的尺寸還是屬於偏小的。

桑塔納的內飾也是大眾套娃設計風格,儀錶盤比較精緻這是自主車型比不上的地方,整個車內空間也比較的不錯,坐在車內感覺很寬敞,動力上桑塔納使用1.4L/1.4T/1.6L三種發動機搭配5MT/6AT/7擋雙離合三種變速箱。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

話劇《什剎海》講述超前老故事_包裝設計

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

說起京味兒,“什剎海”是繞不過的關鍵詞,這個區域的變遷也牽扯着許多人的心。話劇《什剎海》就講述了時代變遷中這裏發生的一段故事。

故事發生在什剎海邊上一座歷史悠久的老四合院“關家老宅”內。關家三代人以及什剎海周邊的住戶們經歷着時代變化給這塊古老土地帶來的巨大變化。兩種思想的差異、兩種觀念的衝突隨着時代的變化愈演愈烈,引發重重矛盾。該劇力圖透過關家三代人以及周邊居民的生活經歷、各個階層的心路歷程,深入探討傳統文化保護與經濟發展的關係,展現老北京人和新北京人的整體精神風貌。

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

話劇《什剎海》是北京文化藝術基金2019年度的資助項目。其實這並不是一部新戲,由北京人藝著名編劇藍蔭海、王志安(執筆)於多年前共同創作。從創作之初到如今搬上舞台,足足有十幾年之久,其間編劇不斷地修改打磨劇本。兩位編劇對北京的歷史、文化傳統、風俗風物都極為熟悉,具有深厚的生活基礎和文化積澱。

該劇由北京人藝著名導演顧威與韓清共同執導。談到劇中所探討的主題,顧威認為故事中的矛盾,當下依然存在,“編劇十餘年前通過劇中人物提出的問題,在當下正好得到了回答,故事的主題看似過時,實則超前。”該劇將於2020年1月17日至19日,在中國人民大學如論講堂首演。(記者 牛春梅)

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

vivo 台南體驗店 12/25 盛大登場!買一送二開幕限定優惠等您來搶_網頁設計

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

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

最近相當認真在台灣經營的手機品牌 vivo 將於本周五(12/25)在台南佔地最大購物商場「南紡購物中心」開設體驗店,開幕當天將推出買一機送兩機、指定機種送穩定器等限定優惠,下午1:30還可排隊領取市價超過千元vivo聖誕驚喜福袋(限量100個),推薦台南在地鄉親不要錯過!

vivo 台南體驗店 12/25 盛大登場!推買一送二開幕限定優惠

為歡慶 vivo 全台第四間體驗店正式進駐南紡購物中心,vivo祭出歷來最殺開幕限定優惠,凡於開幕首三日 (12/25-12/27)現場入手vivo最新X50 Pro旗艦機,就送價值6,389元vivo Y12和vivo HP2055無線藍牙耳機,等於「買一機送兩機」;買vivo X50則可將市價3,990元DJI OM4穩定器免費帶回家;凡購買X全系列加碼延長保固至24個月、螢幕意外保障12個月、2021限定桌曆和vivo原廠33W閃充組,上網登錄再送全聯禮券900元,最高現省超過萬元。

此外,因開幕當天適逢聖誕佳節,vivo 也準備了限量100個價值千元聖誕福袋,消費者只要在下午1:30至體驗店排隊並加入指定粉絲團(https://www.facebook.com/VIVOTainan )和Line@即可獲得;此外,凡於明年1/3前加入體驗店粉絲團留言並完成指定任務,還有機會獲得 Y12手機(1名)和vivo HP2055無線藍牙耳機(3名),共計抽出4名幸運得主。

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

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

您也許會喜歡:

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

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

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

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

傳明年中 Apple 將推出更便宜的 AirPods Max Sport 運動版,售價 400 美元_貨運

※回頭車貨運收費標準

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

AirPods Max 的價格將近快要 2 萬台幣,很多人都認為非常貴,但國外開賣之後一樣被搶購一空,現在都需要等到明年 2 月才能拿到,就連台灣月初開賣也只能預定。以高端耳罩耳機來說,AirPods Max 說實在沒有非常貴,就普通但不便宜而已,當然,並不是每個用戶都有這麼高的預算買耳機,如果你想入手 AirPods Max,但價格實在讓人難以下手,沒關係,可以等等看明年,稍早國外就有人爆料明年中 Apple 可能會推出一款更便宜的 AirPods Max Sport 版本。

傳明年中 Apple 將推出更便宜的 AirPods Max Sport 運動版

根據 Wccftech 的報導,稍早一位專門爆料 Apple 產品的 Apple RUMORS 用戶,於 Twitter 上透露明年中將會有一款 AirPods Max Sport 運動版亮相,重量大約是 290 公克,採矽膠材質設計,價格部分為 400 美元,約台幣 12,000 元:

Over-ear AirPods, $400, coming in the middle of next year. Sports silicone material, weighs about 290g, slightly smaller earpads.

— Apple RUMORs (@a_rumors1111) December 22, 2020

另外也提到,耳墊部分相較於現行 AirPods Max 還要小一點,對於耳朵較大的人來說,這可能需要注意。

至於硬體規格部分,文中就沒有特別說明,不過從 400 美元的售價來看,比 AirPods Max 的 549 美元還便宜 149 美元,光金屬材質改成矽膠,不太可能就降價這麼多,代表說一定還有地方降級。此外,名字叫做 Sport 運動版,續航力應該不能太差才對,甚至要比現在的 AirPods Max 還要多,才能滿足戶外使用。

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

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

不過有一個規格猜測還會延續,就是 “主動式降噪”,當然,Apple 也可能會採用更低階的技術來滿足這功能。

無論如何,離 2021 年中還有半年多的時間,如果真有這款產品,明年過年後應該有機會看到更多傳言現身。覺得 AirPods Max 貴的人也不用急著訂購,反正現在訂也必須等到明年 2 月,到時看 AirPods Max Sport  消息再做決定也不遲。

現在 AirPods Max 要等到 2021/02/23 以後才能收到:

資料來源:Wccftech

AirPods Max 各種顏色耳罩搭配看起來如何?試試這網站,自由搭配出個人專屬配色耳機

您也許會喜歡:

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

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

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

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

【Python】基礎總結_網頁設計公司

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

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

輸入

input("提示性信息")

如:
input("請輸入数字")

評估函數

因為 Python 沒有特別人為規定數據類型,數據類型是由計算機進行判定,所以我們 input() 輸入的數據均默認作為字符串處理,而如果要輸入一些数字,着需要 eval() 評估函數對字符串進行評估,化為語句(数字)。

評估函數:去掉參數最外側引號並執行餘下語句的函數,即 字符串 → 語句。

例如:eval("1") → 1
eval("1+2") → 3
eval('"1+2"') → ‘1+2’
eval('print("hello")') → hello

輸出

print(...)
默認空一行,如果想不空行,則
print(...., end = "")

数字類型

整數類型

與數學中整數的概念一致。

特性:

  • 可正可負,沒有取值範圍限制
  • pow(x, y) 函數:計算\(x^y\),想算多大算多大

進制:

  • 十進制:1010,99,-217
  • 二進制:以 0b 或 0B 開頭:0b010,-0B101
  • 八進制:以 0o 或 0O 開頭:0o123,-0O456
  • 十六進制:以 0x 或 0X 開頭:0x9a,-0X89

浮點數類型

與數學中實數的概念一致。

特性:

  • 帶有小數點及小數的数字
  • 浮點數取值範圍和小數精度都存在限制,但常規計算可忽略
  • 取值範圍數量級約為\(-10^{307}\)\(10^{308}\),精度數量級\(10^{-16}\)
  • 浮點數間運算存在不確定尾數,不是 bug

不確定尾數

浮點數間運算存在不確定尾數,不是 bug
如:0.1+0.3 → 0.4
0.1+0.2 → 0.30000000000000004

這是由於在計算機中一切數據都是化為二進制進行存儲的,而有的浮點數並不能完全化為相等的二進制數,只能無限趨近於二進制數。
如:0.1 →

  • 二進製表示:0.00011001100110011001100110011001100…等 53位二進製表示小數部分,約 \(10^{-16}\)
  • 十進製表示:0.10000000000000000555111512312578270…

    注意:二進製表示小數,可以無限接近,但不完全相同。
    例如,0.1+0.2 結果無限趨近 0.3,但是可能存在尾數。

四舍五入

解決方法:

  • 0.1+0.2 == 0.3 → False
  • round(0.1+0.2, 1) == 0.3 → True

四舍五入:

  • round(x, d):對 x 四舍五入,d 是小數截取位數。
  • 浮點數間運算與比較用 round() 函數輔助
  • 不確定尾數一般發生在 \(10^{-16}\) 左右,round() 十分有效

科學計數法

浮點數可以採用科學計數法表示

  • 使用字母 e 或 E 作為冪的符號,以 10 為基數,格式如下:
    <a>e<b> 表示 \(a*10^b\)

    例如:4.3e-3 值為 0.0043
    9.6E5 值為 960000.0

複數類型

與數學中複數的概念一致,\(j^2\) = -1

例如:z = 1.23e-4 + 5.6e+89j
z.real 獲得實部,z.imag 獲得虛部

數值運算操作符

操作符及使用 描述 備註
x // y 整數除 x 與 y之整數商 10//3 結果是 3
x % y 餘數,模運算 10%3 結果是 1
x ** y 冪運算,x的y次冪,\(x^y\) 也可以進行開方
+x x 的本身
-x x 的負值

数字類型的關係

類型間課進行混合運算,生成結果為“最寬”類型

三種類型存在一種逐漸“擴展”或“變寬”的關係:
整數 → 浮點數 → 複數

例如:123+4.0 = 127.0(整數 + 浮點數 = 浮點數)

數值運算函數

函數及使用 描述 備註
abs(x) 絕對值,x 的絕對值 abs(-10.01) 結果為 10.01
divmod(x, y) 商余,(x//y, x%y),同時輸出商和餘數 divmod(10, 3) 結果為 (3,1)
pow(x, y[,z]) 冪余,(x**y%z),[]表示參數z可省略 pow(3, pow(3,99),10000) 結果為 4587
round(x[,d]) 四舍五入,d 是保留小數位數,默認值為 0 round(-10.123,2) 結果為 -10.12
max(x1,x2,…,xn) 最大值,返回 x1,x2,…,xn 中的最大值,n 不限 max(1,9,5,4,3) 結果為 9
min(x1,x2,…,xn) 最小值,返回 x1,x2,…,xn 中的最小值,n 不限 min(1,9,5,4,3) 結果為 1
int(x) 將 x 變成整數,捨棄小數部分 int(123.45)結果為123;
int(“123”)結果為123
float(x) 將 x 變成浮點數,增加小數部分 float(12)結果為12.0;
float(“1.23”)結果為1.23
complex(x) 將 x 變成複數,增加虛數部分 complex(4)結果為4+0j

字符串類型

字符串類型的表示

字符串:由 0 個或多個字符組成的有序字符序列。

特點:

  • 字符串由一對單引號或一對雙引號表示

    例如:“請輸入帶有符號的溫度值:” 或者 ‘C’

  • 字符串是字符的有序序列,可以對其中的字符進行索引

    例如:“請”是”請輸入帶有符號的溫度值:”的第 0 個字符

字符串有 2 類共 4 種表示方法:

  • 由一對單引號或雙引號表示,僅表示單行字符串

    例如:“請輸入帶有符號的溫度值:” 或者 ‘C’

  • 由一對三單引號或三雙引號表示,課表示多行字符串

    例如:
    ”’
    python
    語言
    ”’

擴展:

  • 如果希望在字符串中包含雙引號或單引號呢?
    ‘這裡有個雙引號(“)’ 或者 “這裡有個單引號(‘)”
  • 如果希望在字符串中既包括單引號又包括雙引號呢?
    ”’這裏既有單引號(‘)又有雙引號(“)”’

字符串的序號

字符串的使用

使用[]獲取字符串中一個或多個字符

  • 索引:返回字符串中單個字符。 [M]

    例如:“請輸入帶有符號的溫度值:”[0] 或者 TempStr[-1]

  • 切片:返回字符串中一段字符子串。 [M:N]

    例如:“請輸入帶有符號的溫度值:”[1:3] 或者 TempStr[0:-1]

字符串切片高級用法

使用[M:N:K]根據步長對字符串切片

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

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

  • [M:N], M 缺失表示 至開頭N 缺失表示 至結尾

    例如:“零一二三四五六七八九十”[:3] 結果是 “零一二”

  • [M:N:K],根據步長 K 對字符串切片

    例如:“零一二三四五六七八九十”[1:8:2] 結果是 “一三五七”
    “零一二三四五六七八九十”[::-1] 結果是 “十九八七六五四三二一零”

字符串操作符

操作符及使用 描述
x + y 連接兩個字符串 x 和 y
x*n 或 n*x 複製 n 次字符串 x
x in s 如果 x 是 s 的子串,返回 True,否則返回 False

字符串處理函數

函數及使用 描述 備註
len(x) 長度,返回字符串 x 的長度 len(“一二三456”)結果為6
str(x) 任意類型 x 所對應的字符串形式 str(1.23)結果為”1.23″
str([1,2])結果為”[1,2]”
oct(x) 整數 x 的八進制小寫形式字符串 oct(425)結果為”0o651″
hex(x) 整數 x 的十六進制小寫形式字符串 hex(425)結果為”0x1a9″
chr(u) x 為 Unicode 編碼,返回其對應的單字符
ord(x) x 為字符,返回其對應的 Unicode編碼

字符串處理方法

方法及使用 描述 備註
str.lower() 返回字符串的副本,全部字符小寫 “AbCdEfGh”.lower()結果為”abcdefgh”
str.upper() 返回字符串的副本,全部字符大寫
str.split(sep=None) 返回一個列表,由 str 根據 sep 被分隔的部分組成 “A,B,C”.split(“,”)結果為[‘A’,’B’,’C’]
str.count(sub) 返回子串 sub 在 str 中出現的次數 “an apple a day”.count(“a”)結果為4
str.replace(old, new) 返回字符串 str 副本,所有 old 子串被替換為 new “python”.replace(“n”, “n123.io”)結果為”python123.io”
str.center(width[,fillchar]) 字符串 str 根據寬度 width 居中,fillchar 可選 “python”.center(20,”=”)結果為”=======python=======”
str.strip(chars) 從 str 中去掉在其左側和右側 chars中列出的字符 “= python=”.strip(” =np”)結果為”ytho”
str.join(iter) 在 iter 變量除最後元素外每個元素后增加一個 str “,”.join(“12345″)結果為”1,2,3,4,5”

字符串類型的格式化

格式化是對字符串進行格式表達的方式

  • 字符串格式化使用.format()方法,用法如下:
    .format( )

槽內部對格式化的配置方式

{ : }

: <,> <.精度>
引號符號 用於填充的單個字符 < 左對齊
> 右對齊
^ 居中對齊
槽設定的輸出寬度 数字的千位分隔符 浮點數小數精度 或 字符串最大輸出長度 整數類型
b,c,d,o,x,X
浮點數類型
e,E,f,%

填充、對齊、寬度這三個一組,例如:
"{0:=^20}".format("PYTHON")
→ ‘=======PYTHON=======’
"{0:*>20}".format("BIT")
→ ‘*****************BIT’
"{:10}".format("BIT")
‘BIT ‘

剩下的三個一組,例如:
"{0:,.2f}".format(12345.6789)
→ ‘12,345.68’
"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}x".format(425)
→ ‘110101001,Σ,425,651,1a9,1A9’
"{0:e},{0:E},{0:f},{0:%}".format(3.14)
‘3.140000e+00,3.140000E+00,3.140000,314.000000%’

異常處理

try:
    # 執行1
    <語句塊1>
except [<異常類型>]:
    # 如果出現異常執行2
    <語句塊2>
[else:]
    # 否則,不發生異常執行3
    <語句塊3>
[finally:]
    # 最後執行4,一定執行
    <語句塊4>

使用 raise 語句拋出一個指定的異常。
raise [Exception [, args [, traceback]]]

分支結構

二分支結構

緊湊形式:適用於簡單表達式的二分支結構
<表達式1> if <條件> else <表達式2>

例如:

guess = eval(input())
print("猜{}了".format("對" if guess==99 else "錯"))

多分支結構

if 
elif
else

循環結構

遍歷循環

for <循環變量> in <遍歷結構> :
    <語句塊> 
  • 從遍歷結構中逐一提取元素,放在循環變量中
  • 由保留字for和in組成,完整遍歷所有元素后結束
  • 每次循環,所獲得元素放入循環變量,並執行一次語句塊

計數循環(N次)

for i in range(N) :
    <語句塊> 
  • 遍歷由range()函數產生的数字序列,產生循環

例如:

for i in range(5):
    print("Hello:",i)

運行結果:

Hello: 0
Hello: 1
Hello: 2
Hello: 3
Hello: 4

計數循環(特定次)

for i in range(M,N,K) : 
    <語句塊> 
  • 遍歷由range()函數產生的数字序列,產生循環

例如:

for i in range(1,6,2):
    print("Hello:",i)

運行結果:

Hello: 1
Hello: 3
Hello: 5

字符串遍歷循環

for c in s : 
    <語句塊> 
  • s是字符串,遍歷字符串每個字符,產生循環

例如:

for c in "Python123":
print(c, end=",")

運行結果:

P,y,t,h,o,n,1,2,3,

列表遍歷循環

for item in ls : 
    <語句塊> 
  • ls是一個列表,遍歷其每個元素,產生循環

例如:

for item in [123, "PY", 456] :
print(item, end=",")

運行結果:

123,PY,456,

文件遍歷循環

for line in fi : 
    <語句塊> 
  • fi是一個文件標識符,遍歷其每行,產生循環

例如:

for line in fi :
print(line)

運行結果:

優美勝於醜陋
明了勝於隱晦
簡潔勝於複雜

無限循環

由條件控制的循環運行方式

while <條件> : 
    <語句塊> 
  • 反覆執行語句塊,直到條件不滿足時結束

例如:

a = 3
while a > 0 :
    a = a - 1
    print(a)

運行結果:

2
1
0

擴展

for <變量> in <遍歷結構> : 
    <語句塊1>
else :
    <語句塊2>
while <條件> : 
    <語句塊1>
else :
    <語句塊2>
  • 當循環沒有被break語句退出時,執行else語句塊
  • else語句塊作為”正常”完成循環的獎勵
  • 這裏else的用法與異常處理中else用法相似

例如:

for c in "PYTHON" :
    if c == "T" :
        continue
    print(c, end="")
else:
    print("正常退出")

運行結果:

PYHON正常退出

例如:

for c in "PYTHON" :
    if c == "T" :
        break
    print(c, end="")
else:
    print("正常退出")

運行結果:

PY

函數

  • 函數定義時可以為某些參數指定默認值,構成可選參數
  • 函數定義時可以設計可變數量參數,即 不確定參數總數量
  • 函數調用時,參數可以按照位置名稱方式傳遞,如 f(1, 2) → f(m=1, n=2)
  • 函數可以返回 0 個或多個結果(元組類型)
def <函數名>(<非可選參數> [,<可選參數>, <可變參數>]) : 
    <函數體>
    return <返回值>

可選參數例如:

def f(m, n=1)
    return m+n

print(f(1))

運行結果:

2

可變參數例如:

def f(*b):
    sum = 0
    for item in b:
        sum += item
    return sum

print(f(1,2,3,4,5))

運行結果:

15

在函數定義中,經常會碰到 *args(arguments) 和作為參數 **kwargs(keyword arguments)。
(事實上在函數中,和才是必要的,args 和 kwargs 可以用其他名稱代替)
*args 是指不定數量的非鍵值對參數。
**kwargs 是指不定數量的鍵值對參數。

*args 作為作為元組匹配沒有指定參數名的參數。而 **kwargs 作為字典,匹配指定了參數名的參數。
*args 必須位於 **kwargs 之前。

*args(*通常緊跟一個標識符,你會看到a或者args都是標識符)是python用於接收或者傳遞任意基於位置的參數的語法。當你接收到一個用這種語法描敘參數時(比如你在函數def語句中對函數簽名使用了星號語法),python會將此標識符綁定到一個元祖,該元祖包含了所有基於位置的隱士的接收到的參數。當你用這種語法傳遞參數時,標識符可以被綁定到任何可迭代對象(事實上,它也可以是人和表達式,並不必須是一個標識符),只要這個表達式的結果是一個可迭代的對象就行。

**kwds(標識符可以是任意的,通常k或者kwds表示)是python用於接收或者傳遞任意基於位置的參數的語法。(python有時候會將命名參數稱為關鍵字參數,他們其實並不是關鍵字–只是用他們來給關鍵字命名,比如pass,for或者yield,還有很多,不幸的是,這種讓人疑惑的術語目前仍是這門語言極其文化根深蒂固的一個組成部分。)當你接收到用這種語法描敘的一個參數時(比如你在函數的def語句中對函數簽名使用了雙星號語法)python會將標識符綁定到一個字典,該字典包含了所有接收到的隱士的命名參數。當你用這種語法傳遞參數時,標識符只能被綁定到字典(我ID號I它也可以是表達式,不一定是一個標識符,只要這個表達式的結果是一個字典即可)。

當你在定義或調用一個函數的時候,必須確保a和k在其他所有參數之後。如果這兩者同時出現,要將k放在a之後。

局部變量和全局變量

  • 基本數據類型,無論是否重名,局部變量與全局變量不同
  • 可以通過 global 保留字在函數內部聲明全局變量
  • 組合數據類型,如果局部變量未真實創建,則是全局變量

    解釋:組合數據類型是用指針來指明位置的,所以若局部變量未真實創建組合數據類型,它使用的變量是指針,而指針指的是外部的全局變量,所以你去修改指針對應的內容就修改了全局變量。

    類比:基本數據類型—值傳遞,組合數據類型—引用傳遞。

lambda 函數

lambda函數返回函數名作為結果

  • lambda函數是一種匿名函數,即沒有名字的函數
  • 使用lambda保留字定義,函數名是返回結果
  • lambda函數用於定義簡單的、能夠在一行內表示的函數
<函數名> = lambda <參數>: <表達式>

def <函數名>(<參數>) : 
    <函數體>
    return <返回值>

例如:

f = lambda : "lambda函數"
print(f())

運行結果:

lambda函數

謹慎使用lambda函數

  • lambda函數主要用作一些特定函數或方法的參數
  • lambda函數有一些固定使用方式,建議逐步掌握
  • 一般情況,建議使用def定義的普通函數

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

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

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

如何基於 echarts 在柱狀圖或條形圖上實現轉換率?(有想法嗎?)_網頁設計公司

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

目錄

  • 需求
  • 探索一
  • 探索二
  • 探索三
    • 轉換實踐思路1
    • 轉換實踐思路2
    • 其他思路
  • 探索四(揭曉答案)
  • 答案篇說明
    • backgroundColor 用法
    • 雙柱合一
    • 始終在軸的中間
    • 百分在變,但是距離軸的距離固定
    • 源碼
  • 最後

我是沒想法啦(一開始)。其實,好久沒接觸 echarts 了,至少有一年多了,想起以前折騰地圖的情景了。

需求

兩張圖。沒有再多了…

柱狀圖:

條形圖:

探索一

俗話說,不知道怎麼辦的時候,百度來幫忙。百度一下。

輸入關鍵字:echarts 柱狀圖 轉換率

打開第一篇的結果:echarts實現漏斗轉化率圖表效果

文章描述的就是我想要的️。用的 series 中的markpoint 來實現。

找到思路了,找到 echarts 官網相關文檔:series-bar.markPoint

看遍並動手操作了,結果是不能解決需求。原因如下:

  1. 圖形(箭頭):默認提供的沒有滿足的。[symbol]
  2. 圖形(箭頭)位置:無法設置在兩根柱子的中間,且距離軸固定距離。提供的可調整位置的參數都是針對當前柱子而言相對或絕對的距離。[symbolOffset 等位置參數]
  3. 圖形(箭頭)百分比:如何拿到參數計算兩根柱子直接的百分比。

一開始就被難倒了呢。不放棄,。

經過以上,對 markPoint 有了解了,並且也對需求要實現的點更清楚了。

百度/谷歌的結果,僅此一種思路。

探索二

那麼如何解決呢,找類似案例,尋找思路。案例在哪呢?官網案例上沒有類似的呢。

其實有個 echarts 的案例寶庫:gallery,上面有非常豐富且有創意的案例。

尋找中…

可借鑒案例(最終用到的,其實還看了更多呢):

  1. case1: 工作地top10,借鑒地方:條形圖,右側圓,更改形狀、位置等

  2. case2: 溫度計柱狀圖,借鑒地方:柱狀圖,底部圓,更改形狀、位置等

  3. case3: 立體柱狀圖,借鑒地方:柱狀圖,目標值,柱子中間問題解決了,只需改形狀

  4. case4: 柱形圖排名,借鑒地方:沒看到可借鑒地方,猜想可能有用就留着了,後面其實幫大忙了

探索三

案例收集好了,那麼開始吧,通過觀察案例,尋找思路,探索可行性,並進行實踐。

轉換實踐思路1

case1, cas2 是實現思路是一樣的,只是方向不一樣。都是基於 series,用其中一項作為圓,type: scatter,通過改變相關屬性來實現的。

由於之前看到 symbol 支持三角形,想到個思路,箭頭可以用三角形和矩形繪製而成。

看了結果,是不是很接近需求了,可以採用了。

答案是否定的。

失敗案例:

因素:增加了數據項

因為位置是相對柱子而言的,並不能準確的保證在柱子中間。可能改的位置不對

因素:更改了數據項的值

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

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

因為比例有大小,而值會根據坐標軸定位

只能放棄了。

轉換實踐思路2

case3 是用 series 的 標註線實現的。

堪稱很完美了,還有動畫呢。

至於形狀,之前看文檔 backgroundColor 屬性,可以用背景圖。

是不是很接近需求了,可以採用了。

答案依舊是否定的。

失敗案例:

因素:增加了數據項

因為每條標註線只能有一個 label 值。其實如果數據項只有兩項,這樣實現還是可以的呢。

其他思路

case 4 還沒看呢。簡單看看吧,說不定有發現。

結果真有發現呢,值是不同的,但是圖形距離軸的距離是相等的,可借鑒呢。

探索四(揭曉答案)

找不到答案的時候,不妨回到起點看看,也許會有發現。

經過以上探索,雖然沒有結果,但是探索過程,也是很有幫助的。

以上案例,都是通過 series 多選實現的,其中一項用來显示柱狀圖,其他項用來繪製其他圖形。那麼我也可以這樣做,用兩根柱子表示一個維度,一個显示柱子,另一個显示轉換率。

至於位置,case4 也有了思路,至於答案,也近了。

至於圖形,case3 也有了思路,至於答案,也近了。

那麼動手吧。

更改數據項長度或值大小,相比於前面都能正常显示,可以說 90% 了(畢竟沒有完美的)。

至於如何再完美一些呢,舉例:

  1. 如果數據項特別多,可以考慮用條形圖,動態計算根據數據項的多少調整容器的高度,內滾動,外固定,不打破頁面布局。

答案篇說明

backgroundColor 用法

通常用法:

backgroundColor: 'red' // css 顏色值

其他用法:

backgroundColor: {
  image: 'xxx/xxx.png'
  // 這裏可以是圖片的 URL,
  // 或者圖片的 dataURI,
  // 或者 HTMLImageElement 對象,
  // 或者 HTMLCanvasElement 對象。
}

怎麼用 HTMLImageElement 對象

backgroundColor: {
  image: image: document.getElementById('arrow-h') // html上的元素<img src="" id="arrow-h" />
}

我最終實現時是採用的方案:

backgroundColor: {
  image: './arrow.svg',
}

關於箭頭的 svg , 我一開始是到 iconfont 圖標庫找,結果沒找到

後來是自己實現的。(果然是自己動手,豐衣足食呢,)

雙柱合一

保證显示的柱子中間始終和軸的文字對齊。series 的另一項(非显示的那根柱子)

barGap: '-100%',

始終在軸的中間

不固定柱子寬度,而是根據百分比箭頭占的空間,固定柱子之間的間距(显示的那根柱子的 series 配置)

barCategoryGap: 40,

百分在變,但是距離軸的距離固定

外層數據固定值0(不显示柱子哦 ),內層數據显示百分比

let rateData = arrPercent(data); // arrPercent 根據显示的柱子的數據,計算百分比
let rate = rateData.map((v, i) => {
  let item = {
    value: 0, // 外層
    label: {
      formatter: '{a|' + v + '%}', // 显示的百分比呢
    }
  }
  return item
})

一切問題迎刃而解,給自己鼓個掌

源碼

實踐代碼哦

github

最後

有更好思路或想法的,請聯繫我,非常歡迎找我探討(渴望 ideal 似 渴望 )。

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

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

深入淺出Spring MVC_包裝設計

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

摘要

本文旨在詳細分析SpringMVC工作原理以及作為開發者如何基於SpringMVC做擴展。因為SpringMVC分析的文章比較多,所以本文重點講解如何利用SpringMVC的擴展點實現我們的需求。

什麼是Spring MVC

SpringMVC的作用是什麼呢?需要解決什麼問題呢?

下圖是一個客戶端與服務端的交互

在之前的詳解http報文(2)-web容器是如何解析http報文的一文中我也提到過。
這次再更細緻的分析一遍。一個請求如何中客戶端發到服務端,再從服務端返回內容。乾的這件事在web中叫請求動態內容,區別於靜態內容。在java語言中,為了解決這件事定義了一個規範就是servlet。具體的實現由各大廠商自己定義。

大體部分分為兩部分一塊是建立連接、一塊是傳輸內容。所以servlet規範包括兩大部分,,一部分是servlet接口,定義處理請求的規範。一部分是servlet容器的,去管理加載servlet實例。

輕量級的servlet容器有tomcat/jetty/undertow,servlet框架有SpringMVC/Struts/Webx這些,本篇重點講解SpringMVC

SpringMVC工作流程

Spring MVC 顧名思義就是處理Controll-Model-View的。

  1. DispatchServlet 是入口,doDispatch方法開始處理請求
  2. 首先經過controll,controll包含兩部分,一部分是url處理映射,將url與具體的處理bean映射起來。也就是HandleMapping,另一部分是具體的Handle,因為需要不同的handle,所以定義了HandleAdapter.
  3. Model比較簡單,主要就是ModelView對象,
  4. View 包含兩部分,一部分是ViewName的解析,另一部分是ViewName的對應的模板引擎,來渲染出最終的模板引擎。

常見擴展點

基於以上,Spring MVC 提供了不同層面的擴展,方便開發者實現定製化的功能,而不需要底層代碼的修改

一. Filter

Filter其實不算是SpringMVC,是servlet的,這時候請求還沒有到DispatchServlet。Filter允許對請求和響應做一些統一的定製化處理,比如你限流、日誌、trace。

實現javax.servlet.Filter接口即可

二. Controll – HandleMapping,HandlerAdapter

HandleMapping屬於Controll層面,我們可以編寫任意的HandlerMapping實現類,然後定義策略來決定一個web請求到HandlerExecutionChain對象的生成。

繼承RequestMappingHandlerMapping 類即可。
這個具體案例可以看下fredal的博客-使用基於 SpringMVC 的透明 RPC 開發微服務

簡要來說,他的rpc通信協議是基於http的。所以rpc調用就是基於服務端還是原來的restful api。寫法給普通的前端去掉無異,然後包一層rpc client。方便客戶端調用。但是這樣太麻煩了,對於不需要暴露給前端的API,單純是服務間的rpc調用。再走一遍servlet-SpringMVC沒必要。

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

所以他基於RequestMappingHandlerMapping做了一個改造。不再基於SpringMVC,而是自己定義了一套rpc的範式,然後轉換為springmvc。

三. Controll – Interceptor

Interceptor屬於Controll層面,我們可以自定義各種攔截器,在一個請求被真正處理之前、請求被處理但還沒輸出到響應中、請求已經被輸出到響應中之後這三個時間點去做任何我們想要做的事情。廣泛應用於Log,Session,鑒權等場景。

實現HandlerInterceptor接口即可

四. View – HandlerMethodArgumentResolver

解析方法參數的,可以很方便的擴展http請求參數。
實現HandlerMethodArgumentResolver接口即可

比如需要從http header中處理設備信息

@Component
public class DeviceResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(final MethodParameter methodParameter) {
        return methodParameter.getParameterType().equals(DeviceInfo.class);
    }

    @Override
    public Object resolveArgument(final MethodParameter methodParameter,
            final ModelAndViewContainer modelAndViewContainer,
            final NativeWebRequest nativeWebRequest,
            final WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request =
                (HttpServletRequest)  nativeWebRequest.getNativeRequest(HttpServletRequest.class);

        // 從head頭中獲取設備信息
        String id = request.getHeader("x-device-id");
        if (id != null) {
            DeviceInfo deviceInfo = new DeviceInfo();
            deviceInfo.setId("id");
            return deviceInfo;
        }
        return null;
    }
}

五. View – Converter

類型轉換器,主要和序列化相關,參數綁定時springmvc會對將前端傳來的參數通過某種規則轉化成方法定義的參數的類型,默認實現的有StringHttpMessageConverterByteArrayHttpMessageConverter等等,默認的不能滿足需求時我們可自己定義此接口來實現自己的類型的轉換。

繼承AbstractHttpMessageConverter 即可。

六. View- HandlerExceptionResolver

異常處理,通常需要定義的全局異常。

@ControllerAdvice 註解即可
在一次和前端的相互甩鍋的問題記錄中有總結過這種

七. 修改requestbody 內容

當我們需要對RequestBody的內容進行統一處理時,因為HandlerMethodArgumentResolver只能處理特定類型的,做不到這點要求。

實現RequestBodyAdvice 接口即可。比如我需要處理requestbody中的內容,將emoji輸入轉換掉

@RestControllerAdvice
public class EmojiReplaceAdvice implements RequestBodyAdvice {
    @Override
    public boolean supports(final MethodParameter methodParameter, final Type targetType,
            final Class<? extends HttpMessageConverter<?>> converterType) {
        return methodParameter.hasParameterAnnotation(EmojiReplace.class);
    }

    @Override
    public Object handleEmptyBody(final Object body, final HttpInputMessage inputMessage,
            final MethodParameter parameter, final Type targetType,
            final Class<? extends HttpMessageConverter<?>> converterType) {
        return body;
    }

    @Override
    public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage,
            final MethodParameter parameter,
            final Type targetType, final Class<? extends HttpMessageConverter<?>> converterType)
            throws IOException {
        return new HttpInputMessage() {
            @Override
            public InputStream getBody() throws IOException {
                final String content = IOUtils.toString(inputMessage.getBody());
                final String emojiUnicodeToAlias = StringUtil.parseEmojiUnicodeToAlias(content);
                return new ByteArrayInputStream(
                        emojiUnicodeToAlias.getBytes(StandardCharsets.UTF_8));
            }

            @Override
            public HttpHeaders getHeaders() {
                return inputMessage.getHeaders();
            }
        };
    }

    @Override
    public Object afterBodyRead(final Object body, final HttpInputMessage inputMessage,
            final MethodParameter parameter, final Type targetType,
            final Class<? extends HttpMessageConverter<?>> converterType) {
        return body;
    }
}

總結

這篇文章主要是系統的概括了SpringMVC的工作原理和各種擴展機制,屬於高度概括,細節不足。具體的每個擴展點的實現、坑、應用場景需要在之後的文章繼續闡述。

參考

https://fredal.xin/develop-with-transparent-rpc

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

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務