底盤和操控這款7萬起快上市的小型SUV在同價位是最強的!_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

除了最低配車型都配置了一鍵啟動和無鑰匙進入,而一鍵啟動按鈕則“別出心裁”地放在了儀錶台左側。高配車型有着6安全氣囊的配置,在同價位車型中處於優勢地位。接近緊湊型的軸距使得DX3有着一個在同級別中相當不錯的後排空間。

前言

對於東南汽車,不少人都知道它曾經是三菱在中國的合作夥伴,在相互合作之中積累不少三菱的技術以及經驗,所以在底盤研究上在國產品牌中是處於比較優秀的地位,而且也捨得成本在研發以及底盤設計用料上,而今天介紹的東南DX3就是這樣的一個例子。

東南DX3定位在緊湊型DX7之下,是一輛面向年輕人市場為主的小型SUV,車身尺寸為4354*1840*1670mm,與比亞迪元、長安CS15這些競爭對手相比都有着一定的優勢。

東南汽車一直是一個非常實在的車企,在造型設計一直都保持了自己的原創,而且外觀上也有着日系的風格,所以這輛DX3在外觀上能夠吸引不少年輕人的目光。前臉使用交錯的線條使得它非常年輕活動,而保險杠下的銀色下護板又有着一種下唇的感覺,比較有競技氣息。

在車身側面可以看到採用了懸浮式設計,車身腰線一直延續到尾燈之上,在後輪輪拱位置更是往外拋出使得它显示出力量感。

但是在車尾部就有着一種虎頭蛇尾的感覺,和車頭形成了強烈對比,不過也算的是比較協調耐看。

輪轂方面分別有着17英寸以及18英寸的雙色鋁合金輪轂可供選擇,

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

輪胎規則為215/55R 18,規格較高,但是在品牌上選擇的是名氣較小的萬力輪胎。

內飾設計也是原創度極高,中控放着一個9英寸的多媒體显示屏,相當大氣。而純黑色的設計相當的運動,而且看上去也更具檔次。

採用了這種螺旋形空調出風口,非常時尚好看,但是想要在出風口插手機支架的用戶看來要換成磁吸的了。

簡單易讀的儀錶盤,在底色上使用了紅色作為主調,儀錶中心還有着一個小显示屏可以显示部分車輛信息。

全系標配了ESp車身穩定系統以及陡坡緩降系統,相當良心。

除了最低配車型都配置了一鍵啟動和無鑰匙進入,而一鍵啟動按鈕則“別出心裁”地放在了儀錶台左側。

高配車型有着6安全氣囊的配置,在同價位車型中處於優勢地位。

接近緊湊型的軸距使得DX3有着一個在同級別中相當不錯的後排空間。

另有還有着一個全景天窗可以帶來明亮的車廂環境,非常受年輕人喜愛。

動力有着一個最大功率為88千瓦的1.5L自然發動機以及最大功率為115千瓦的1.5T渦輪增壓發動機選擇,1.5L自然吸氣發動機版本全系搭配手動變速箱,而1.5T渦輪增壓發動機版本全系搭配CVT自動變速箱,總體處於主流水平。

底盤上使用的是前麥費遜后多連桿獨立懸架,相對於同價位中多半使用后非獨立懸架能帶來更優秀的駕駛體驗以及乘坐體驗。

總的來說這是一輛非常適合年輕人選擇的小型SUV,有着不低的顏值、夠用的空間,以及是同級別中優秀的安全配置以及駕駛性能,預售價為7.29-9.99萬,依然算的是親民。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

生態環境部部長黃潤秋赴河北、內蒙古調研生態環境保護工作_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

2020-09-22 來源:生態環境部

2020-09-22
來源:生態環境部 分享到:
[打印]
字號:[大] [中] [小]

  9月17日至20日,生態環境部部長黃潤秋先後赴河北省張家口市,內蒙古自治區烏蘭察布市、巴彥淖爾市、興安盟、呼倫貝爾市,圍繞貫徹落實習近平總書記重要指示批示精神,就察汗淖爾生態環境保護、“一湖兩海”(呼倫湖、烏梁素海、岱海)生態環境綜合治理以及阿爾山生態文明建設示範創建等進行調研。他強調,要深入貫徹習近平生態文明思想,堅決落實習近平總書記重要指示批示精神,堅定不移走生態優先、綠色發展之路,加強生態環境治理和生態保護修復監管,切實築牢祖國北疆生態安全屏障。

  察汗淖爾是華北地區現存最大的內陸鹹水湖,生態區位和生態功能十分重要。17日下午,黃潤秋一行來到位於河北省張家口市尚義縣的察汗淖爾國家濕地公園。在聽取察汗淖爾生態狀況彙報並實地察看相關情況后,黃潤秋與地方負責同志和專家仔細分析察汗淖爾水面面積變化可能造成的生態退化風險,研究探討了變化原因和應對措施。他指出,要認真貫徹落實習近平總書記關於察汗淖爾生態環境問題的重要批示精神,加強濕地生態系統保護修復監管,推動從水資源管理、地下水保護、流域內產業結構調整、退耕還草等方面綜合施策,因地制宜、系統推進,逐步扭轉察汗淖爾生態環境惡化趨勢,恢複流域生態系統功能。

  呼倫湖、烏梁素海、岱海是內蒙古重要的三大淡水湖,發揮着調節區域氣候、維持生態系統平衡、保護生物多樣性等重要作用,是北方重要的生態安全屏障。習近平總書記高度關注“一湖兩海”生態環境問題,多次作出重要指示批示,為“一湖兩海”生態環境綜合治理提供了方向指引和根本遵循。在“一湖兩海”調研時,黃潤秋每到一處都關心詢問水生態環境狀況、主要污染指標及超標原因、周邊污染源分佈、治理措施及成效等情況,與當地負責同志和專家交流討論下一步工作思路和舉措。為深入了解湖泊周邊農業面源污染治理和農村生態環境綜合整治狀況,黃潤秋在岱海附近的涼城縣榆樹坡村田間向农民詢問農作物種植、灌溉、化肥使用等情況,並隨機走訪農戶了解畜禽養殖及糞污處置、農村改廁及生活垃圾和污水處理等情況。在赴呼倫湖途中,還實地察看了該湖主要補給河流之一的烏爾遜河水質狀況。

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

  黃潤秋強調,深入貫徹落實習近平總書記重要指示批示精神,要做到減排、擴容兩手發力,水資源、水生態、水環境協同管控,進一步完善生態環境綜合治理措施,堅持對症下藥、按規律辦事,確保“一湖兩海”水生態環境質量有效改善。針對烏梁素海和岱海生態環境治理,他表示,要在控制農業面源污染上出實招、辦實事,合理推進農業種植結構調整,將農業節水退水措施落到實處;從市場端和消費端入手,在管控市場源頭、摸清每戶每畝地化肥實際使用量的基礎上,更加精準、科學減少化肥使用量,提高利用效率;做好農村畜禽糞污收集處置,加強規範化管理,避免散養散排導致超負荷污染物進入湖體。要加強農灌退水入湖流量與濃度監測,釐清污染防控責任,倒逼源頭減排。要推進好生態補水工程項目,協調解決水資源調配,合理補充水源,促進水生態修復。針對呼倫湖化學需氧量濃度較高和水華等生態環境問題,黃潤秋指出,要堅持問題導向,運用科學思維、科學方法、科技成果,從生態系統的完整性、健康性角度出發,加強污染機理成因分析和演變規律研究,探索建立適合呼倫湖水生態系統特點的科學評價體系。要關注藻類種類及密度變化情況,實施局部水域水華監測預警,提高精細化管理水平。要保護好以呼倫湖為核心的流域生態系統,嚴格管控人類活動,謀划實施好“十四五”時期治理思路和重大工程。

  黃潤秋特別叮囑當地同志要確保制定的政策措施合理可行、落實過程不走樣。要及時開展評估,分析評價污染治理與生態修復措施是否落實到位,生態環境質量是否得到改善,治理措施與改善效果是否匹配,及時發現問題並解決問題。

  調研期間,黃潤秋還走訪了呼倫湖國家級自然保護區烏蘭諾爾管護站和小河口管護站,調度視頻監控系統,實地察看保護區核心區管護情況。他強調,要加強自然保護區監管體系建設,加大生物多樣性保護力度,保持自然生態系統的原真性和完整性。要充分運用先進科技手段,加強對自然保護區邊界、通道以及保護區內人類活動的監管,提升監管能力水平,嚴厲打擊違法犯罪行為。

  2014年習近平總書記視察內蒙古興安盟阿爾山市時強調,無論什麼時候都要守住生態底線,保護好生態就是發展。當地政府認真落實習近平總書記重要指示精神,堅持走生態優先、綠色發展之路,經過努力,阿爾山先後獲得“國家生態文明建設示範市”和“綠水青山就是金山銀山實踐創新基地”榮譽稱號。在調研和聽取相關介紹后,黃潤秋對阿爾山生態文明建設示範創建取得的成績表示肯定。他說,要一以貫之落實好習近平總書記重要指示精神,保持加強生態文明建設的戰略定力,牢固樹立“綠水青山就是金山銀山”的理念,依託自身生態環境優勢,积極探索綠水青山轉化為金山銀山的路徑方法,使綠水青山持續發揮生態環境效益和經濟社會效益。要築牢生態安全屏障,守住生態環境底線,將阿爾山打造成祖國北疆亮麗風景線。

  河北省政府副省長葛海蛟,內蒙古自治區黨委常委、興安盟盟委書記張恩惠,內蒙古自治區政府副主席包鋼參加相關調研。

  生態環境部總工程師張波參加調研。

  生態環境部辦公廳、生態司,河北省、內蒙古自治區生態環境廳,相關盟、市負責同志參加調研。

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

realme V15 正式發表:176 克輕盈重量、50W 智慧閃充並標配 65W 閃充充電器,售價僅約 6,450 元起_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

日前 realme 在台灣開賣 realme X7 Pro 以及 realme 7 5G 兩款新機,最近也預告將在中國率先發表 realme V 系列的新機 realme V15 。今(7)日稍早 realme 舉辦 2021 年智慧型手機市場的首場新機發表會推出 realme V15 ,除了價格和性能持續「敢越級」,在機身設計也有許多巧思。
realme 也「響應環保」直接附贈 65W 超級閃充充電器給 50W 智慧閃充的 V15 消費者,讓全家人都能用這款充電器進行快速充電。

realme V15 正式發表:176 克輕盈重量、50W 智慧閃充並標配 65W 閃充充電器,售價僅約 6,450 元起

作為 realme 旗下以「續航越級」為核心的 realme V 系列新機, realme V15 除了在續航方面持續越級,也針對性能、快充、設計等方面相較上一代進行全面升級。首先是機身設計, realme V15  機身厚度僅有 8.1mm 、重量也只有 176 克,機身表面的工藝處理也是這次的一大亮點。

外觀配色方面,這次 realme V15 總共推出「錦鯉色」、「鏡湖藍」以及「新月銀」三款配色選擇。首先是「錦鯉色」採用非光譜漸變的色彩設計以及雙紋雙鍍工藝,營造奪目溫暖、具有流動感的錦鯉色彩。

另外,在「鏡湖藍」以及「新月銀」則擁有鏡面級高反光和細膩磨砂的兩種質感處理。

realme V15 在螢幕方面採用 6.4 吋 SuperAMOLED 挖孔全螢幕,擁有 600nit 峰值亮度和 180Hz 觸控採樣率,並採用類DC調光護眼螢幕且支持光感螢幕下指紋辨識:

相較於之前的 LCD 螢幕, realme V15 改用 OLED 螢幕除了讓機身能更輕薄、也支持螢幕指紋解鎖、AOD(Always On Display)顯示,無論對於日常使用解鎖或觀看時間、未讀訊息都更加便利:

硬體規格方面, realme V15 與之前在台灣開賣不久的 realme 7 5G 一樣搭載聯發科 800U 5G 處理器,在性能方面相較上一代提升 16% ,安兔兔跑分也超過 34 萬分的成績:

在這僅 8.1mm 厚度的機身條件下, realme V15 仍配備 4310mAh 大容量電池,同時也支持和 realme X7 Pro 一樣等級的 50W SuperDART 智慧閃充,只需要 18 分鐘即可為 realme V15 充電至 50% :

在充電速度方面, realme V15 只需 47 分鐘充滿優於在同價位機型的充電速度,相比其他品牌更高瓦數快充的旗艦手機表現也不遜色:

最近小米跟隨 Apple 響應環保開始在小米11 推出取消充電器的標準版,卻另外推出相同價格附贈充電器的套裝版的方式,也引起許多討論。而 realme 在稍早 V15 發表會則提出另一種響應環保的方法,那就是「讓全家人都可以共用一款充電器」。
畢竟家中不同成員可能使用不同快充功率規格的智慧型手機,因此 realme V15 即便是 50W 智慧閃充,仍然標配提供 65W 閃充充電器。

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

充電快,在續航方面 realme V15 透過全場景續航優化,即便剩餘電量只剩下 5% 仍可待機一天一夜。

影像方面, realme V15 配備 6400 萬像素三鏡頭主相機,分別為 6400 萬像素主鏡頭、 800 萬像素 119° 超廣角鏡頭以及 4cm 微距鏡頭的組合,前置相機則採用 1600 萬素自拍鏡頭。錄影部分, realme V15 不僅支持最高 4K@30fps 的高畫質錄影,前後鏡頭皆支持 UIS MAX 錄影超級防手震。

拍攝也支持超級夜景模式,連同自拍也支持超級夜景,在全場景皆可實現更優異的夜拍成果。之前在 realme X7 Pro 和 realme 7 5G 內建的夜景濾鏡,在 realme V15 同樣有支援。

realme V15 推出 6GB+128GB 和 8GB+128GB 兩種規格選擇, 6GB+128GB 版本建議售價人民幣 1,499 元(約合新台幣 6,450 元);8GB+128GB 版本建議售價人民幣 1,999 元(約合新台幣 8,606 元),目前在首批在中國開賣的 realme V15 入門版將以降價人民幣 100 元的方式促銷。

圖片/消息來源:realme(中國官網)|realme 真我手機(微博)

延伸閱讀:
realme 7 5G 開箱動手玩|天璣 800U 處理器、5G+5G 雙卡雙待、120Hz 更新率螢幕、5000mAh大電量與 30W Dart 閃充,萬元內 5G 超值選擇

疑似 OPPO Find X3 安兔兔跑分曝光,搭載高通 S888 旗艦處理器測出 77.1 萬分刷新最高分紀錄

您也許會喜歡:

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

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

談反應式編程在服務端中的應用,數據庫操作優化,萬條記錄從20秒到0.5秒_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

反應式編程在客戶端編程當中的應用相當廣泛,而當前在服務端中的應用相對被提及較少。本篇將介紹如何在服務端編程中應用響應時編程來改進數據庫操作的性能。

開篇就是結論

利用 System.Reactive 配合 TaskCompelteSource ,可以將分散的單次數據庫插入請求合併會一個批量插入的請求。在確保正確性的前提下,實現數據庫插入性能的優化。

如果讀者已經了解了如何操作,那麼剩下的內容就不需要再看了。

預設條件

現在,我們假設存在這樣一個 Repository 接口來表示一次數據庫的插入操作。

  csharp

namespace Newbe.RxWorld.DatabaseRepository { public interface IDatabaseRepository { /// <summary> /// Insert one item and return total count of data in database /// </summary> /// <param name="item"></param> /// <returns></returns> Task<int> InsertData(int item); } }

接下來,我們在不改變該接口簽名的前提下,體驗一下不同的實現帶來的性能區別。

基礎版本

首先是基礎版本,採用的是最為常規的單次數據庫INSERT操作來完成數據的插入。本示例採用的是SQLite作為演示數據庫,方便讀者自行實驗。

  csharp

namespace Newbe.RxWorld.DatabaseRepository.Impl { public class NormalDatabaseRepository : IDatabaseRepository { private readonly IDatabase _database; public NormalDatabaseRepository( IDatabase database) { _database = database; } public Task<int> InsertData(int item) { return _database.InsertOne(item); } } }

常規操作。其中_database.InsertOne(item)的具體實現就是調用了一次INSERT

基礎版本在同時插入小於20次時基本上可以較快的完成。但是如果數量級增加,例如需要同時插入一萬條數據庫,將會花費約20秒鐘,存在很大的優化空間。

TaskCompelteSource

TaskCompelteSource 是 TPL 庫中一個可以生成一個可操作 Task 的類型。對於 TaskCompelteSource 不太熟悉的讀者可以通過該實例代碼了解。

此處也簡單解釋一下該對象的作用,以便讀者可以繼續閱讀。

對於熟悉 javascript 的朋友,可以認為 TaskCompelteSource 相當於 Promise 對象。也可以相當於 jQuery 當中的 $.Deferred 。

如果都不了解的朋友,可以聽一下筆者吃麻辣燙時想到的生活化例子。

吃麻辣燙 技術解釋
吃麻辣燙之前,需要先用盤子夾菜。 構造參數
夾好菜之後,拿到結賬處去結賬 調用方法
收銀員結賬完畢之後,會得到一個叫餐牌,會響鈴的那種 得到一個 Task 返回值
拿着菜牌找了一個位子坐下,玩手機等餐 正在 await 這個 Task ,CPU轉而處理其他事情
餐牌響了,去取餐,吃起來 Task 完成,await 節數,繼續執行下一行代碼

那麼 TaskCompelteSource 在哪兒呢?

首先,根據上面的例子,在餐牌響的時候,我們才會去取餐。那麼餐牌什麼時候才會響呢?當然是服務員手動按了一個在櫃檯的手動開關才觸發了這個響鈴。

那麼,櫃檯的這個開關,可以被技術解釋為 TaskCompelteSource 。

餐台開關可以控制餐牌的響鈴。同樣, TaskCompelteSource 就是一種可以控制 Task 的狀態的對象。

解決思路

有了前面對 TaskCompelteSource 的了解,那麼接下來就可以解決文章開頭的問題了。思路如下:

當調用 InsertData 時,可以創建一個 TaskCompelteSource 以及 item 的元組。為了方便說明,我們將這個元組命名為BatchItem

將 BatchItem 的 TaskCompelteSource 對應的 Task 返回出去。

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

調用 InsertData 的代碼會 await 返回的 Task,因此只要不操作 TaskCompelteSource ,調用者就一會一直等待。

然後,另外啟動一個線程,定時將 BatchItem 隊列消費掉。

這樣就完成了單次插入變為批量插入的操作。

筆者可能解釋的不太清楚,不過以下所有版本的代碼均基於以上思路。讀者可以結合文字和代碼進行理解。

ConcurrentQueue 版本

基於以上的思路,我們採用 ConcurrentQueue 作為 BatchItem 隊列進行實現,代碼如下(代碼很多,不必糾結,因為下面還有更簡單的):

  csharp

namespace Newbe.RxWorld.DatabaseRepository.Impl { public class ConcurrentQueueDatabaseRepository : IDatabaseRepository { private readonly ITestOutputHelper _testOutputHelper; private readonly IDatabase _database; private readonly ConcurrentQueue<BatchItem> _queue; // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable private readonly Task _batchInsertDataTask; public ConcurrentQueueDatabaseRepository( ITestOutputHelper testOutputHelper, IDatabase database) { _testOutputHelper = testOutputHelper; _database = database; _queue = new ConcurrentQueue<BatchItem>(); // 啟動一個 Task 消費隊列中的 BatchItem _batchInsertDataTask = Task.Factory.StartNew(RunBatchInsert, TaskCreationOptions.LongRunning); _batchInsertDataTask.ConfigureAwait(false); } public Task<int> InsertData(int item) { // 生成 BatchItem ,將對象放入隊列。返回 Task 出去 var taskCompletionSource = new TaskCompletionSource<int>(); _queue.Enqueue(new BatchItem { Item = item, TaskCompletionSource = taskCompletionSource }); return taskCompletionSource.Task; } // 從隊列中不斷獲取 BatchItem ,並且一批一批插入數據庫,更新 TaskCompletionSource 的狀態 private void RunBatchInsert() { foreach (var batchItems in GetBatches()) { try { BatchInsertData(batchItems).Wait(); } catch (Exception e) { _testOutputHelper.WriteLine($"there is an error : {e}"); } } IEnumerable<IList<BatchItem>> GetBatches() { var sleepTime = TimeSpan.FromMilliseconds(50); while (true) { const int maxCount = 100; var oneBatchItems = GetWaitingItems() .Take(maxCount) .ToList(); if (oneBatchItems.Any()) { yield return oneBatchItems; } else { Thread.Sleep(sleepTime); } } IEnumerable<BatchItem> GetWaitingItems() { while (_queue.TryDequeue(out var item)) { yield return item; } } } } private async Task BatchInsertData(IEnumerable<BatchItem> items) { var batchItems = items as BatchItem[] ?? items.ToArray(); try { // 調用數據庫的批量插入操作 var totalCount = await _database.InsertMany(batchItems.Select(x => x.Item)); foreach (var batchItem in batchItems) { batchItem.TaskCompletionSource.SetResult(totalCount); } } catch (Exception e) { foreach (var batchItem in batchItems) { batchItem.TaskCompletionSource.SetException(e); } throw; } } private struct BatchItem { public TaskCompletionSource<int> TaskCompletionSource { get; set; } public int Item { get; set; } } } }

以上代碼中使用了較多的 Local Function 和 IEnumerable 的特性,不了解的讀者可以點擊此處進行了解。

正片開始!

接下來我們使用 System.Reactive 來改造上面較為複雜的 ConcurrentQueue 版本。如下:

  csharp

namespace Newbe.RxWorld.DatabaseRepository.Impl { public class AutoBatchDatabaseRepository : IDatabaseRepository { private readonly ITestOutputHelper _testOutputHelper; private readonly IDatabase _database; private readonly Subject<BatchItem> _subject; public AutoBatchDatabaseRepository( ITestOutputHelper testOutputHelper, IDatabase database) { _testOutputHelper = testOutputHelper; _database = database; _subject = new Subject<BatchItem>(); // 將請求進行分組,每50毫秒一組或者每100個一組 _subject.Buffer(TimeSpan.FromMilliseconds(50), 100) .Where(x => x.Count > 0) // 將每組數據調用批量插入,寫入數據庫 .Select(list => Observable.FromAsync(() => BatchInsertData(list))) .Concat() .Subscribe(); } // 這裏和前面對比沒有變化 public Task<int> InsertData(int item) { var taskCompletionSource = new TaskCompletionSource<int>(); _subject.OnNext(new BatchItem { Item = item, TaskCompletionSource = taskCompletionSource }); return taskCompletionSource.Task; } // 這段和前面也完全一樣,沒有變化 private async Task BatchInsertData(IEnumerable<BatchItem> items) { var batchItems = items as BatchItem[] ?? items.ToArray(); try { var totalCount = await _database.InsertMany(batchItems.Select(x => x.Item)); foreach (var batchItem in batchItems) { batchItem.TaskCompletionSource.SetResult(totalCount); } } catch (Exception e) { foreach (var batchItem in batchItems) { batchItem.TaskCompletionSource.SetException(e); } throw; } } private struct BatchItem { public TaskCompletionSource<int> TaskCompletionSource { get; set; } public int Item { get; set; } } } }

代碼減少了 50 行,主要原因就是使用 System.Reactive 中提供的很強力的 Buffer 方法實現了 ConcurrentQueue 版本中的複雜的邏輯實現。

老師,可以更給力一點嗎?

我們,可以“稍微”優化一下代碼,將 Buffer 以及相關的邏輯獨立於“數據庫插入”這個業務邏輯。那麼我們就會得到一個更加簡單的版本:

  csharp

namespace Newbe.RxWorld.DatabaseRepository.Impl { public class FinalDatabaseRepository : IDatabaseRepository { private readonly IBatchOperator<int, int> _batchOperator; public FinalDatabaseRepository( IDatabase database) { var options = new BatchOperatorOptions<int, int> { BufferTime = TimeSpan.FromMilliseconds(50), BufferCount = 100, DoManyFunc = database.InsertMany, }; _batchOperator = new BatchOperator<int, int>(options); } public Task<int> InsertData(int item) { return _batchOperator.CreateTask(item); } } }

其中 IBatchOperator 等代碼,讀者可以到代碼庫中進行查看,此處就不在陳列了。

性能測試

基本可以測定如下:

在 10 條數據併發操作時,原始版本和批量版本沒有多大區別。甚至批量版本在數量少時會更慢,畢竟其中存在一個最大 50 毫秒的等待時間。

但是,如果需要批量操作併發操作一萬條數據,那麼原始版本可能需要消耗20秒,而批量版本僅僅只需要0.5秒。

所有的示例代碼均可以在代碼庫中找到。如果 Github Clone 存在困難,也可以點擊此處從 Gitee 進行 Clone

最後但是最重要!

最近作者正在構建以反應式Actor模式事件溯源為理論基礎的一套服務端開發框架。希望為開發者提供能夠便於開發出“分佈式”、“可水平擴展”、“可測試性高”的應用系統——Newbe.Claptrap

本篇文章是該框架的一篇技術選文,屬於技術構成的一部分。如果讀者對該內容感興趣,歡迎轉發、評論、收藏文章以及項目。您的支持是促進項目成功的關鍵。

當前項目已經快要發布 0.1 alpha 版本,歡迎參与討論。

GitHub 項目地址:https://github.com/newbe36524/Newbe.Claptrap

Gitee 項目地址:https://gitee.com/yks/Newbe.Claptrap

文章作者: newbe36524
本文章著作權歸作者所有,任何形式的轉載都請註明出處。

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

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

翻拍《三體》《水滸傳》,Netflix太想講“中國故事”_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

當國內市場熱衷於開發西遊、封神IP時,大洋彼岸的Netflix突然官宣要翻拍被我們忽視了一段時間的經典IP《水滸傳》。

而就在不久前,Netflix才剛剛宣布了攜手游族和劉慈欣,接盤我們的難產科幻大IP《三體》。

Netflix一下釋放兩個“重磅炸彈”,立刻在國內外社交網絡上炸開了鍋。國內觀眾擔心它是第二個《花木蘭》,國外觀眾則純屬隔岸觀火。

兩年前,雄心勃勃征戰亞洲市場的Netflix創始人里德·哈斯廷斯(Reed Hastings)被問及入華計劃時說,Netflix當下的第一要務是講好韓國故事、印度故事、日本故事,而不是中國故事。

那現在,Netflix大張旗鼓開始講起了中國故事,看來是“時機已經成熟”?

Netflix七年入華之路折戟多次,而我們也喊了很久的“狼來了”,這一次真的會來嗎?

台灣日本成入華跳板?

2018年,哈斯廷斯(Hastings)曾說,國內“優愛騰”三個大傢伙太強大了,Netflix不着急進入中國市場。

結果話剛一撂下,轉頭就揮師台灣,斥重金挖來了HBO在台灣的班底,一口氣宣了5部自製原創華語劇。

雖說Netflix華語劇針對的是它開放服務的華語區受眾,但總讓人感覺醉翁之意不在酒,引發了隔岸看戲的我們一陣騷動,Netflix拍華語劇的一舉一動都在被國內渲染報道。

如今兩年過去,Netflix和在內地繞開的“大傢伙”——愛奇藝,在台灣市場卻較量上了。

原本在Netflix出現以前,愛奇藝在台灣流媒體市場擁有一騎絕塵的佔有率。然而現在,據台媒抽樣調查511位觀眾中,雖然Netflix的使用普及率不如愛奇藝,但付費率竟然超過愛奇藝。

可以說,Netflix在台灣首戰告捷,至少有了挑戰愛奇藝的資格。

台灣市場像是Netflix的一塊試驗田,通過台制華語劇摸清大華語區觀眾的喜好,這其中就包含內地觀眾的口味。

不在內地播不代表我們看不了,Netflix上線劇集、電影歷來是內地盜版資源泛濫的重災區。而佯裝對內地市場半放棄的Netflix,實際上時刻偵察着內地市場輿情。

Netflix首部重磅華語劇《罪夢者》邀來的主演賈靜雯、張孝全、范曉萱等,在兩岸都具有很高知名度,自然吸引了內地觀眾的目光。五部劇播下來,基本可以把兩岸觀眾的審美探出一二。令台灣觀眾失望的《罪夢者》,在內地的口碑也崩了。

接檔的驚悚劇《彼岸之嫁》與偶像劇《極道千金》劇情落入窠臼、口碑節節敗退,豆瓣評分4、5分,兩岸口碑一致崩盤。

有趣的是,Netflix第四部推出的是內地不可說的外交題材劇,口碑並沒有出圈。直到第五部懸疑劇《誰是被害者》才終於口碑逆襲,豆瓣評分8.0。

於是,我們看到了不光是台灣媒體鼓吹,內地也鋪天蓋地報道了Netflix華語翻身之作。

看得出來,Netflix也很重視《誰是被害者》在內地的公關。這部劇是唯一被續訂第二季的華語劇,也是Netflix唯一被內地買下的版權劇,合作方不是老熟人愛奇藝,而是新朋友西瓜視頻。

台制華語劇儼然成了Netflix進入內地市場的新名片。而在《水滸傳》項目中,我們看到Netflix找了日本導演佐藤信介執導。

如今中日影視交流頻繁,不知道日制華語劇是不是也將成為Netflix入華的另一張名片。Netflix似乎有意通過兩個地區作跳板,撬開內地大門。

有趣的是,上世紀70年代,西方世界兩次翻拍《水滸傳》《西遊記》都是由日本人完成的。

英國廣播公司(BBC)甚至找了既不懂日語、也不懂中文的人配成英語。一群日本演員配着英語演中國的《水滸傳》,畫面不敢想象。

為什麼不能找中國人拍?

圈內人心知肚明Netflix這些年一直在接觸中國創作者,目前看來是都沒成。

根據一位創作者說法,不接Netflix活兒的最主要原因是不敢。目前國內的監管政策越來越趨緊,勢必會受到影響。

回顧Netflix折戟的入華之路,Netflix似乎就沒弄懂過中國。

七年間,Netflix“緋聞”合作夥伴不斷,幾乎把中國巨頭傳了個遍,樂視、阿里、萬達、保利等等。

這期間,Netflix入華的態度與方式也千變萬化。一會兒自信滿滿單刀赴會,一會兒說要中國小夥伴幫助。

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

2015年是Netflix緋聞最多的一年。

年初的時候,哈斯廷斯(Hastings)放言入華不需要合作夥伴,當時連外媒都質疑Netflix不明白前輩Twitter、YouTube等前車之鑒,中國政策不允許境外公司展開視聽服務。

到5月份,Netflix又認慫說不想在沒有合作夥伴的情況下貿然進入,因為入華手續太麻煩了。

根據《好萊塢報道》,Netflix接觸了因《小時代》系列正當紅的樂視,以及華數傳媒、保利、百視通,甚至還給央視旗下的中國網絡電視台拋去了橄欖枝。

及至年末,Netflix還搭上當時正在全世界“買買買”的王健林,剛收購完傳奇的萬達,又被傳出要收購Netflix。可奔波一圈下來,沒一個有下文。

2016年初,哈斯廷斯(Hastings)再次宣稱要獨自入華,Netflix重拾入華手續、努力獲取牌照,儘管可能要花上好幾年的時間。但接着就傳出阿里收購Netflix的消息,尤其在阿里私有化優酷后,傳聞愈演愈烈。

就在這時,Netflix卻突然與愛奇藝達成內容授權合作。2017年5月,Netflix終於邁出了入華實質性的一步。

可這段備受矚目的跨國合作進行得卻異常低調,以致於如果龔宇不講,我們都不知道他們分手了。

2019年5月龔宇稱,“受到審查系統和用戶品味的影響,效果不是太好,所以我們不再繼續合作。”總有種說不明道不清的彆扭。

與愛奇藝結束合作后,一度傳出Netflix要投入優酷懷抱。外媒分析師保羅·佩斯卡托雷(Paolo Pescatore)認為,介於合作過愛奇藝的關係,中國其他巨頭可能已經關上Netflix入華的大門。

他還認為,Netflix目前的中國策略是挖掘全球華人創作者,委託其進行中國內容製作,從而解決Netflix原創內容入華的審查問題。

於是,我們看到了Netflix第一个中國內地合作項目:《飛奔去月球》。

該項目的美國牽頭方為華裔製片人楊燕子,是第五代導演陳凱歌、張藝謀片子在北美引進發行的重要推手。而她在中國的合作方是肩負中國文化走出去使命的東方夢工廠。

與斯皮爾伯格的夢工場分手后,華人文化、上海文廣集團SMG的東方夢工廠失去了大熱IP《功夫熊貓》。另起爐灶的《飛奔去月球》講述中國探月計劃成功與嫦娥故事傳說。但該項目一直延期擱置,直到Netflix接盤。

這種合作模式,或許也會成為Netflix入華的另一種方式。但前提是,得講正能量的中國故事。

Netflix進攻中國動作不斷

此前眾所周知,Netflix入華第一大難題,是辦證困難。但2019年8月19日之後,就不存在這個問題了。

北京市發布《北京市服務業開放改革三年行動計劃》,放寬互聯網遊戲、視頻和圖書等業務的外資准入條件,允許外資在滿足內容監管和數據安全的前提下,提供網絡遊戲下載和網絡視聽節目服務。這意味着,過去阻擋YouTube、Apple TV+進入的政策大門已經打開。

硬糖君注意到,近一年Netflix加大了國產電影、劇集的版權購買,2019年一年的購買量與2018-2017年兩年的量差不多。

Netflix拿下了《流浪地球》《哪吒》《紅海行動》等中國爆款電影版權;買入了涵蓋優愛騰三家的版權劇,比如熱門古裝IP《陳情令》《三生三世十里桃花》《天盛長歌》等,一個都不落下;甚至連甜寵劇、沙雕劇都不放過,買入了《致我們單純的小美好》《致我們暖暖的小時光》《從前有座靈劍山》等。

今年初,其還和於正的歡娛影視試水了首部Netflix獨播的內地劇《金枝玉恭弘=叶 恭弘》。之後還迅速買入了熱播電視劇《下一站幸福》《三十而已》,以及“豪華巨制”的網大《征途》。

從沒見過任何一個國外流媒體如此大手筆的購買國產劇。亞馬遜斷斷續續買過一些國產電影、劇集,一年最多兩部。比如去年買入《少年的你》,與Netflix聯播《初戀這件小事》;2018年和hulu聯播《如懿傳》。

HBO則是除了台劇《我們與惡的距離》,沒有買入過華語劇。

Netflix此番壕買,不單單是為了所服務的華語受眾,應該也是向中國市場示好的一種表現。嘴上說不着急進入中國市場的Netflix,實際上比誰都着急。

Netflix對國際市場的開墾已接近飽和,全球僅剩中國、克里米亞、朝鮮與敘利亞四塊土地尚未涉足。而中國是唯一真正具備巨大消費潛力的國家。

大洋彼岸的股東們時刻關注着Netflix入華的情報,中國故事似乎成了Netflix在股市唯一可講的故事。

而這一時期的優愛騰,也比此前都需要Netflix。

根據QuestMobile報告显示,截止2020年6月,在線視頻行業月活人數相比去年同期下降11%,從9.64億減少到8.57億。與之相反的是短視頻增長勢頭正猛,2018年至2020年,兩年間趕上了在線視頻3億月活的差距。

很明顯,目前國內流媒體市場不僅趨近飽和,還將進入與短視頻“搶”存量用戶的博弈階段。國內開墾飽和的優愛騰與國外開墾飽和的Netflix,正需要彼此的手中王牌,來實現打開新的市場可能。

但Netflix與愛奇藝看來並不愉快的合作、多年入華路與長視頻各家大概也都有過無果的磋商,使其最終繞開了中國同行們。

如前文所述,Netflix最新華語劇《誰是被害者》竟是與長視頻的對頭西瓜視頻合作的。正為美國上市奔波的字節,會為Netflix打開入華的通途嗎?

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

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

NEC 展出可翻轉螢幕裝上搖桿的 Lavie Mini 遊戲筆電(但可能跟你想的不太一樣)_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

到了 2021 年,市場上還是免不了也很多 XXX Killer 路線的產品,但到底能不能殺到目標產品的痛處,就是見仁見智了。NEC 最近推出了一款看起來應該是以遊戲為導向的筆電概念新品,說穿了雖然是個二合一可變筆電,但該公司為它家上了遊戲專用的搖桿保護殼與電視底座。瞬間就讓這台僅 579g 的 8 吋小筆電有了一點點的掌機味,或該說,Switch 風。繼續閱讀 NEC 展出可翻轉螢幕裝上搖桿的 Lavie Mini 遊戲筆電報導內文。

▲圖片來源:Lenovo

NEC 推出可以翻轉螢幕裝上搖桿的 Lavie Mini 遊戲筆電

認真說,NEC Lavie Mini 整個感覺「又」是個衝著 Nintendo Switch 而來的產品。不過以其 8 吋平板筆電二合一的輕巧小筆電規格,然後搭配一組擁有指紋辨識器的超可愛圓形鍵盤設計(雖然是有點妙的7 排配置) — 沒有觸控板,所以得要仰賴 1,900 x 1,200 解析度的觸控螢幕或外接滑鼠操作。

說真的,若只以小筆電的角度去看它,個人覺得已是非常有特色且吸引人的產品了,也不會太去苛求效能。

不過既然硬是掛上了具備震動功能的外接搖桿,變身成了遊戲取向的筆電,就讓人不勉去注意一下硬體規格。 Lavie Mini 搭載了 11 代的 Intel Core i7 處理器,顯卡則是 Intel iRIS Xe 整合顯卡,雖說 16GB LPDDR4 的記憶體以小筆電不算差(還有 256GB SSD),但真的要跑什麼大遊戲應該是不太能讓人期待 — 應該就是為小遊戲或線上串流遊戲而生了吧?

其實白金配色的 Lavie Mini 無論是打開或是闔上都看起來很美。雖然機身上僅有兩個 USB 3.1 Type-C 與 3.5mm 音訊孔。不過 Lenovo 也沒有忽略這方面的擴充需求,同時也發表了搭配的底座,插上就可直接擴充包括 USB 與 HDMI 的接口,快速連接至電視並支援高達 4K / 60fps 的輸出 — 這樣看來在轉軸處的應該是 USB-C 沒錯了。這配置也是妙,感覺插了線要翻轉大概會卡住?

既然是概念筆電產品,自然價位跟上市時間都還仍是未知數。但單就筆電本身,其實個人覺得是個相當值得期待,現階段相對少見的 Windows 筆電產品。

延伸閱讀:

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

1,000 公里續航、超多感測器與超強算力的 NIO ET7 發表:超越特斯拉的「蔚來」電動車

Pixel 的雷達黑科技傳將被用在新世代 Google 智慧顯示器上

您也許會喜歡:

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

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

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

Keycloak快速上手指南,只需10分鐘即可接入Spring Boot/Vue前後端分離應用實現SSO單點登錄_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

登錄及身份認證是現代web應用最基本的功能之一,對於企業內部的系統,多個系統往往希望有一套SSO服務對企業用戶的登錄及身份認證進行統一的管理,提升用戶同時使用多個系統的體驗,Keycloak正是為此種場景而生。本文將簡明的介紹Keycloak的安裝、使用,並給出目前較流行的前後端分離應用如何快速接入Keycloak的示例。

Keycloak是什麼

Keycloak是一種面向現代應用和服務的開源IAM(身份識別與訪問管理)解決方案

Keycloak提供了單點登錄(SSO)功能,支持OpenID ConnectOAuth 2.0SAML 2.0標準協議,擁有簡單易用的管理控制台,並提供對LDAP、Active Directory以及Github、Google等社交賬號登錄的支持,做到了非常簡單的開箱即用。

Keycloak常用核心概念介紹

首先通過官方的一張圖來了解下整體的核心概念

這裏先只介紹4個最常用的核心概念:

  1. Users: 用戶,使用並需要登錄系統的對象

  2. Roles: 角色,用來對用戶的權限進行管理

  3. Clients: 客戶端,需要接入Keycloak並被Keycloak保護的應用和服務

  4. Realms: 領域,領域管理着一批用戶、證書、角色、組等,一個用戶只能屬於並且能登陸到一個域,域之間是互相獨立隔離的, 一個域只能管理它下面所屬的用戶

Keycloak服務安裝及配置

安裝Keycloak

Keycloak安裝有多種方式,這裏使用Docker進行快速安裝

docker run -d --name keycloak \
    -p 8080:8080 \
    -e KEYCLOAK_USER=admin \
    -e KEYCLOAK_PASSWORD=admin \
    jboss/keycloak:10.0.0

訪問http://localhost:8080並點擊Administration Console進行登錄

創建Realm

創建一個新的realm: demo,後續所有的客戶端、用戶、角色等都在此realm中創建

創建客戶端

創建前端應用客戶端

創建一個新的客戶端:vue-demo,Access Type選擇public

創建後端應用客戶端

創建一個新的客戶端:spring-boot-demo,Access Type選擇bearer-only

保存之後,會出現Credentials的Tab,記錄下這裏的secret,後面要用到

關於客戶端的訪問類型(Access Type)

上面創建的2個客戶端的訪問類型分別是public、bearer-only,那麼為什麼分別選擇這種類型,實際不同的訪問類型有什麼區別呢?

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

事實上,Keycloak目前的訪問類型共有3種:

confidential:適用於服務端應用,且需要瀏覽器登錄以及需要通過密鑰獲取access token的場景。典型的使用場景就是服務端渲染的web系統。

public:適用於客戶端應用,且需要瀏覽器登錄的場景。典型的使用場景就是前端web系統,包括採用vue、react實現的前端項目等。

bearer-only:適用於服務端應用,不需要瀏覽器登錄,只允許使用bearer token請求的場景。典型的使用場景就是restful api。

創建用戶和角色

創建角色

創建2個角色:ROLE_ADMIN、ROLE_CUSTOMER

創建用戶

創建2個用戶:admin、customer

綁定用戶和角色

給admin用戶分配角色ROLE_ADMIN

給customer用戶分配角色ROLE_CUSTOMER

Vue應用集成Keycloak簡明指南

創建vue項目

vue create vue-demo

添加官方Keycloak js適配器

npm i keycloak-js --save
npm i axios --save

main.js

import Vue from 'vue'
import App from './App.vue'
import Keycloak from 'keycloak-js'

Vue.config.productionTip = false

// keycloak init options
const initOptions = {
  url: 'http://127.0.0.1:8080/auth',
  realm: 'demo',
  clientId: 'vue-demo',
  onLoad:'login-required'
}

const keycloak = Keycloak(initOptions)

keycloak.init({ onLoad: initOptions.onLoad, promiseType: 'native' }).then((authenticated) =>{
  if(!authenticated) {
    window.location.reload();
  } else {
    Vue.prototype.$keycloak = keycloak
    console.log('Authenticated')
  }

  new Vue({
    render: h => h(App),
  }).$mount('#app')

  setInterval(() =>{
    keycloak.updateToken(70).then((refreshed)=>{
      if (refreshed) {
        console.log('Token refreshed');
      } else {
        console.log('Token not refreshed, valid for '
            + Math.round(keycloak.tokenParsed.exp + keycloak.timeSkew - new Date().getTime() / 1000) + ' seconds');
      }
    }).catch(error => {
      console.log('Failed to refresh token', error)
    })
  }, 60000)

}).catch(error => {
  console.log('Authenticated Failed', error)
})

HelloWorld.vue

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <div>
      <p>
        current user: {{user}}
      </p>
      <p>
        roles: {{roles}}
      </p>
      <p>
        {{adminMsg}}
      </p>
      <p>
        {{customerMsg}}
      </p>
    </div>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data() {
    return {
      user: '',
      roles: [],
      adminMsg: '',
      customerMsg: ''
    }
  },
  created() {
    this.user = this.$keycloak.idTokenParsed.preferred_username
    this.roles = this.$keycloak.realmAccess.roles

    this.getAdmin()
            .then(response=>{
              this.adminMsg = response.data
            })
            .catch(error => {
              console.log(error)
            })

    this.getCustomer()
            .then(response => {
              this.customerMsg = response.data
            })
            .catch(error => {
              console.log(error)
            })
  },
  methods: {
    getAdmin() {
      return axios({
        method: 'get',
        url: 'http://127.0.0.1:8082/admin',
        headers: {'Authorization': 'Bearer ' + this.$keycloak.token}
      })
    },
    getCustomer() {
      return axios({
        method: 'get',
        url: 'http://127.0.0.1:8082/customer',
        headers: {'Authorization': 'Bearer ' + this.$keycloak.token}
      })
    }
  }
}
</script>

getAdmin()getCustomer()這2個方法內部分別請求restful api

Spring Boot應用集成Keycloak簡明指南

添加Keycloak Maven依賴

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
    <version>10.0.0</version>
</dependency>

Spring Boot配置文件

官方文檔及網上大部分示例使用的都是properties格式的配置文件,而yaml格式的配置文件相對更簡潔清晰些,此示例使用yaml格式的配置文件,內容如下

server:
  port: 8082
keycloak:
  realm: demo
  auth-server-url: http://127.0.0.1:8080/auth
  resource: spring-boot-demo
  ssl-required: external
  credentials:
    secret: 2d2ab498-7af9-48c0-89a3-5eec929e462b
  bearer-only: true
  use-resource-role-mappings: false
  cors: true
  security-constraints:
    - authRoles:
        - ROLE_CUSTOMER
      securityCollections:
        - name: customer
          patterns:
            - /customer
    - authRoles:
        - ROLE_ADMIN
      securityCollections:
        - name: admin
          patterns:
            - /admin

除了幾個必填的配置項外,另外需要注意的幾個配置項如下

credentials.secret:上文添加客戶端后Credentials Tab內對應的內容

bearer-only:設置為true,表示此應用的Keycloak訪問類型是bearer-only

cors:設置為true表示允許跨域訪問

security-constraints:主要是針對不同的路徑定義角色以達到權限管理的目的

  • /customer:只允許擁有ROLE_CUSTOMER角色的用戶才能訪問
  • /admin:只允許擁有ROLE_ADMIN角色的用戶才能訪問
  • 未配置的路徑表示公開訪問

Controller內容

@RestController
public class HomeController {
    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @RequestMapping("/customer")
    public String customer() {
        return "only customer can see";
    }

    @RequestMapping("/admin")
    public String admin() {
        return "only admin cas see";
    }
}

項目效果演示

分別啟動前後端項目后,本地8081端口對應vue前端項目,本地8082端口對應Spring Boot實現的restful api項目

首次訪問vue前端項目

第一次訪問vue項目會跳轉Keycloak登錄頁

登錄admin用戶

登錄customer用戶

總結

Keycloak部署及接入簡單,輕量的同時功能又不失強大,非常適合企業內部的SSO方案。

本文示例項目地址:keycloak-demo

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

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

買車算什麼?信不信帶它出門蘭博基尼都給我讓路_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

所以擁有日內瓦印記的腕錶也是收藏家和鑒賞家的最愛,這意味着工藝達到了瑞士手錶行業的頂級水準。羅傑杜彼年輕,但卻擁有眾多技藝精湛的工匠。在製表領域,能夠獨立製造極其複雜的擺輪遊絲的製表廠可謂屈指可數,但羅傑杜彼能做到真正的自造遊絲自造機芯。

有句話大家應該都聽過:窮玩車,富玩表。但在上個世紀七八十年代,

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

這句話中的車指的是三轉一響中的自行車,表指的是西洋表。當時自行車儘管難得,不過無論精密還是精美程度都遠遠不及機械錶,價格自然也天上地下,所以有了這句戲言。

但如今汽車與手錶同為工藝極其複雜的高精度机械,而如此精密的机械作用放在一塊手錶里,難度簡直是汽車的千倍以上。所以,當叫獸看到一塊手錶原來能賣到這個價時:

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

光便宜還不夠 這些10幾萬的家用車還能賺些買菜錢_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

如果這些政策真的落實這類打車軟件很有可能成為最新的相親軟件就像網上說過的一個梗本地戶口、價格不便宜的新車、還有本地牌照滿足這些條件估計都有車有房比普通的交友平台更牛逼。下班也要出去做網約司機了。說了這麼多,究竟什麼車才適合跑滴滴。

我們沒車一族的出行方式基本就是靠走、或者踩個自行車、乘坐公共交通工具、部分地區短途還能坐摩托車、土豪一點就去坐計程車。從Uber進入中國以及和滴滴出行一起相互大肆燒錢開始,我們終於找到了一個舒服、價格便宜的出行方式,也讓有車一族找到了一個月入破萬的工作。

還記得那時全民皆滴滴的時代

人們出行叫網約車

不僅隨傳隨到、關鍵是便宜

再也不用碰到那些讓人厭惡的出租車!

對於很多駕駛員來說

終於擁有一個月入破萬的工作

還記得網約車剛興起的時候

做幾個月新買的車就回本了

每天做幾單就有巨額獎勵

也讓不少人辭掉了原本的工作

紛紛投入了網約車的行列

作為一個開放的平台,各位車主只需要身份證、駕駛證、行駛證就能完成註冊,投入到偉大的網約車行列,也正是因為手續如此簡單,也造就了網約車行列出現一些混亂的狀況,也存在一些比較極端的負面新聞。

下面我們來扒一扒你打滴滴遇過的奇葩事情…

王小姐:我曾經叫了一輛滴滴,然後來的竟然是一檯面包車!麵包車!而且還有很大一股異味!

楊先生:叫了滴滴,看着App,盯着地圖上的小汽車離自己越來越近了,然後趕時間的我馬上就能上車了….後來司機開過了,結果司機越開越遠,最後又兜了很大一個圈子轉回來!!!我勒個去!

好日子總會到頭的

網約車車存在已經嚴重影響到計程車行業

為了保障利益

終極BOSS受不了壓力要出手了!

《網約車徵求意見稿》

已經從北上廣深這幾個一線城市出台

用最簡單的話術總結這個意見稿

車、牌、人三方面都作出明確規定!

在尺寸上

北、深、上三大城市軸距要求≥2.7米

新能源車軸距≥2.65米

廣州長寬高分別大於4.6米、1.7米、1.42米

在排量上

北、上、深≥2.0L或1.8T;上海沒要求

在年限上

廣州要求1年內准新車

深圳要求2年內車型

北京、上海並沒要求

總結下來最嚴格的還是廣州

另外網約車要求是本地牌照

北京需要搖號

上海:拍牌均價88359元(10月)

廣州:拍牌均價19614元(9月)

深圳:拍牌均價39729元(9月)

在駕駛員方面

北、上兩城需要本地戶口

深圳需要有居住證

廣州並沒要求(這是一個包容的城市)

看起來要滿足這一些條件真不容易…

如果這些政策真的落實

這類打車軟件很有可能成為

最新的相親軟件

就像網上說過的一個梗

本地戶口、價格不便宜的新車、還有本地牌照

滿足這些條件估計都有車有房

比普通的交友平台更牛逼!

下班也要出去做網約司機了!

說了這麼多,究竟什麼車才適合跑滴滴?

要跑滴滴首先要滿足以下幾個條件!

中級車以上(價格還不能太高)

動力在2.0L或1.8T以上

車子省油、保養便宜、而且耐用

最後當然要空間大

1日系选手

凱美瑞

車身尺寸:4850*1825*1480mm

軸距:2775mm

符合車型:全系

售價:18.48-32.98萬

點評:在看來,滴滴的法規上,日系車佔優!先趴一趴日系車的優點,空間大、省油、保養便宜、而且還耐操,用來做網約車還真是合適,而這一次所說的豐田凱美瑞全系車型均已滿足各項條件,這裏更推薦選擇雙擎車型,雖然是2.5L的排量但是油耗才5-7L左右的表現就已經能獨領風騷,更不用說2.0L車型本身的表現了。照這麼說雅閣也是個不錯的選擇囖?其實不然,針對網約車來說,凱美瑞的後排舒適度是在雅閣之上的,

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

自己搭車也會選擇凱美瑞。

2德系选手

帕薩特

車身尺寸:4872*1834*1484mm

軸距:2803mm

符合車型:1.8T以上車型

售價:22.29-33.29萬

點評:帕薩特可以說是在德系品牌中能夠達標而且價格是最便宜的一個車型,在空間、動力、排量、尺寸方面均已經滿足要求,雖然帕薩特有一個比較大的優惠幅度,但是1.8T以上的車型辦下來也要20多萬,專門拿來做網約車就真的比較浪費了,而且德系車保養並不便宜,另外還存在一定程度的燒機油情況,拿來做網約車,未免投入太大了。

3美系选手

邁銳寶XL

車身尺寸:4923*1854*1477mm

軸距:2829mm

符合車型:2.5L版本

售價:21.99-24.99萬

點評:外觀帥氣、空間大、配置高是邁銳寶XL主要賣點之一,只是用來做網約車就必須選擇2.5L的版本,在油耗方面會偏高,而且後期投入比較大,除了這一款車型,你也可以選擇2.0L的君威或者2.0T的蒙迪歐,但是百公里油耗隨便都能超過10L的車型來說,拿來做網約車加油加到怕啊。

4國產选手

博瑞

車身尺寸:4956*1861*1513mm

軸距:2850mm

符合車型:全系

售價:11.98-22.98萬

點評:實際上博瑞也是為數不多能夠參与到網約車序列的車型之一,首先就是國產的中型車並不多,其中就博瑞賣得不錯,雖然博瑞的油耗也是百公里油耗超過10L的貨,但關鍵是車型起售價比其他車型便宜,雖然博瑞的小毛病還是有不少,但三大件的大問題還算得上過關,拿來做網約車也是可以的。

總結:

就如所說,這一次網約車的規定就像給日系車量身定做那般,做網約車最關鍵的是什麼?認為關鍵就是要省油!另外就是要售價便宜的,所以真的要狠下心來做網約車,跟偏向於選擇凱美瑞這一類的日系中型車。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

[C#.NET 拾遺補漏]01:字符串操作_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

字符串操作在任意編程語言的日常編程中都隨處可見,今天來匯總一下 C# 中關於字符串的一些你可能遺忘或遺漏的知識點。

逐字字符串

在普通字符串中,反斜杠字符是轉義字符。而在逐字字符串(Verbatim Strings)中,字符將被編程器按照原義進行解釋。使用逐字字符串只需在字符串前面加上 @ 符號。

// 逐字字符串:轉義符
var filename = @"c:\temp\newfile.txt";
Console.WriteLine(filenaame);

// 逐字字符串:多行文本
var multiLine = @"This is a
multiline paragraph."
;
Console.WriteLine(multiLine);

// 非逐字字符串
var escapedFilename = "c:\temp\newfile.txt";
Console.WriteLine(escapedFilename);

輸出:

c:\temp\newfile.txt
This is a
multiline paragraph.
c: emp
ewfile.txt

逐字字符串中唯一不被原樣解釋的字符是雙引號。由於雙引號是定義字符串的關鍵字符,所以在逐字字符串中要表達雙引號需要用雙引號進行轉義。

varstr = @"""I don't think so"", he said.";
Console.WriteLine(str);
// 輸出:"I don't think so", he said.

在逐字字符串中也可以 $ 符號實現字符串內插值。

Console.WriteLine($@"Testing \n 1 2 {5 - 2}");
// 輸出:Testing \n 1 2 3

数字格式化轉換

典型的的格式化方法為:

string.Format("{index[:format]}", number)

可使用“0”和“#”佔位符進行補位。“0” 表示位數不夠位數就補充“0”,小數部分如果位數多了則會四舍五入;“#”表示佔位,用於輔助“0”進行補位。

標準格式化用法:

// “0”描述:佔位符,如果可能,填充位
string.Format("{0:000000}",1234); // 結果:001234

// “#”描述:佔位符,如果可能,填充位
string.Format("{0:######}",1234); // 結果:1234
string.Format("{0:#0####}",1234); // 結果:01234
string.Format("{0:0#0####}",1234); // 結果:0001234

// "."描述:小數點
string.Format("{0:000.000}", 1234); // 結果:1234.000
string.Format("{0:000.000}", 4321.12543); // 結果:4321.125

// ","描述:千分表示
string.Format("{0:0,0}", 1234567); //結果:1,234,567

// "%"描述:格式化為百分數
string.Format("{0:0%}",1234); // 結果:123400%
string.Format("{0:#%}", 1234.125); // 結果:123413%
string.Format("{0:0.00%}",1234); // 結果:123400.00%
string.Format("{0:#.00%}",1234.125); // 結果:123412.50%

內置快捷字母格式化用法:

// E-科學計數法表示
(25000).ToString("E"); // 結果:2.500000E+004

// C-貨幣表示,帶有逗號分隔符,默認小數點后保留兩位,四舍五入
(2.5).ToString("C"); // 結果:¥2.50

// D[length]-十進制數
(25).ToString("D5"); // 結果:00025

// F[precision]-浮點數,保留小數位數(四舍五入)
(25).ToString("F2"); // 結果:25.00

// G[digits]-常規,保留指定位數的有效数字,四舍五入
(2.52).ToString("G2"); // 結果:2.5

// N-帶有逗號分隔符,默認小數點后保留兩位,四舍五入
(2500000).ToString("N"); // 結果:2,500,000.00

// X-十六進制,非整型將產生格式異常
(255).ToString("X"); // 結果:FF

ToString 也可以自定義補零格式化:

(15).ToString("000");              // 結果:015
(15).ToString("value is 0"); // 結果:value is 15
(10.456).ToString("0.00"); // 結果:10.46
(10.456).ToString("00"); // 結果:10
(10.456).ToString("value is 0.0"); // 結果:value is 10.5

轉換為二進制、八進制、十六進制輸出:

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

int number = 15;
Convert.ToString(number, 2); // 結果:1111
Convert.ToString(number, 8); // 結果:17
Convert.ToString(number, 16); // 結果:f

自定義格式化器:

public class CustomFormat : IFormatProvider, ICustomFormatter
{
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (!this.Equals(formatProvider))
{
return null;
}
if (format == "Reverse")
{
return string.Join("", arg.ToString().Reverse());
}
return arg.ToString();
}

public object GetFormat(Type formatType)
{
return formatType == typeof(ICustomFormatter) ? this : null;
}
}

使用自定義格式化器:

String.Format(newCustomFormat(), "-> {0:Reverse} <-", "Hello World");
// 輸出:-> dlroW olleH <-

字符串拼接

將數組中的字符串拼接成一個字符串:

var parts = new[] { "Foo", "Bar", "Fizz", "Buzz"};
var joined = string.Join(", ", parts);
// joined = "Foo, Bar, Fizz, Buzz"

以下四種方式都可以達到相同的字符串拼接的目的:

string first = "Hello";
string second = "World";
string foo = first + " " + second;
string foo = string.Concat(first, " ", second);
string foo = string.Format("{0} {1}", firstname, lastname);
string foo = $"{firstname} {lastname}";

字符串內插法

簡單用法:

var name = "World";
var str =$"Hello, {name}!";
// str = "Hello, World!"

帶日期格式化:

var date = DateTime.Now;
var str = $"Today is {date:yyyy-MM-dd}!";

補齊格式化(Padding):

var number = 42;

// 向左補齊
var str = $"The answer to life, the universe and everything is {number, 5}.";
// str = "The answer to life, the universe and everything is ___42." ('_'表示空格)

// 向右補齊
var str = $"The answer to life, the universe and everything is ${number, -5}.";
// str = "The answer to life, the universe and everything is 42___."

結合內置快捷字母格式化:

var amount = 2.5;
var str = $"It costs {amount:C}";
// str = "¥2.50"

var number = 42;
var str = $"The answer to life, the universe and everything is {number, 5:f1}.";
// str = "The answer to life, the universe and everything is ___42.1"

參考:

1.《C# 7.0 in a Nutshell》

2. https://bit.ly/2U1eIK9

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。