你沒看錯!不到10萬居然能買到這些大7座SUV!_網頁設計公司

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

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

5T才是風光580的主力銷售車型。綜合來看,風光580擁有更豐富的安全配置以及動力搭配,當然價格也要比CX70高出一截。比亞迪S6指導價:8。79 – 12。39萬比亞迪,這個充滿非議的品牌,如今在新能源領域也算是混的順風順水。S6作為比亞迪的首款SUV,至今已經5年多的光景了,上市以來的銷量還是挺不錯的。

等等,細想一下好像還真有幾款符合二狗要求的車,記得上個月去大涼山參加試駕活動,路上有一款SUV的上鏡率挺高的,趕緊上網一查,居然是款7座SUV。

長安CX70

指導價:6.89 – 8.49萬

單看這價格,相信許多人絕對不會把它和7座中型SUV聯想到一塊。直到最近在路上頻繁見到它的身影,才知道還真有這麼一款車存在。

首先說明一點,CX70屬於長安商用推出的首款SUV,它與我們熟悉的CS75屬於兩個不同的部門。這款車於2016北京車展上市,上來就是中型7座SUV,的確挺受關注的。

老實說,第一眼看到CX70並沒有發現太多的模仿痕迹,設計談不上多麼精緻漂亮,不過硬朗的造型倒也挺招人喜歡。在所有中國品牌里,長安的設計還是挺值得說道的。

既然定位中型7座SUV,CX70的尺寸當然值得關注。長寬高分別為4680/1800/1775mm,軸距為2780mm,這樣的數據放到我們常見的中型SUV里沒有太多優勢。

反倒是內飾部分讓人眼前一亮,進入CX70車內,車內的設計氛圍與長安“麵包車”沒有任何關聯。整個內飾清晰大方,沒有過多繁雜的設計,用四個字概括就是恰到好處。

值得一說的是中控那塊8英寸大屏,雖然檔次感不高,如同一個廉價的安卓平板鑲嵌其中,但其可以與安卓手機互聯,更誇張的是還支持車載WiFi功能,結合其不到9萬的售價,夫復何求?

動力方面,目前只有1.6L + 5MT的動力配置,發動機最大馬力117ps,峰值扭矩150Nm。據了解年底將推出6AT的自動擋版本。

不用擔心“小馬拉大車”的問題,CX70自然不能與漢蘭達銳界這樣的車型相提並論,但足夠滿足日常使用。

東風風光580

指導價:7.29 – 9.99萬

第一眼看上去,風光580的造型要比CX70入流,車頭的線條非常流暢。如果蒙住logo,你一定想不到這是一家做“麵包車”的廠家設計出來的,整體來看風光580的有着同級非常高的顏值。

風光580於今年6月上市,估計就是瞄準CX70來的,風光580的尺寸與CX70非常接近,長寬高分別為4680/1845/1715mm,軸距與CX70一樣均為2780mm。

內飾方面,風光580的內飾設計相比之下比較平庸,看上去沒有CX70上檔次。不過好在中控10.1寸的大屏挽回了些分數,同樣集成了市面上主流功能,不錯。

配置方面風光580有後來者的優勢,除了最低配配備的是雙氣囊外,

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

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

其餘車型均配備了四氣囊,這一點在這級別車型里很厚道;除此之外,兩款CVT版本的還標配了ESp以及上坡輔助系統,除最低配外的手動版本也支持選裝。風光580在安全配置方面考慮的很周全,點個贊。

風光580的動力配置則比CX70豐富多了,分為1.8L和1.5T兩種動力版本,其中1.8L只匹配5MT變速箱,1.5T則有6MT和CVT兩種變速箱可選。由此可見,1.5T才是風光580的主力銷售車型。

綜合來看,風光580擁有更豐富的安全配置以及動力搭配,當然價格也要比CX70高出一截。

比亞迪S6

指導價:8.79 – 12.39萬

比亞迪,這個充滿非議的品牌,如今在新能源領域也算是混的順風順水。S6作為比亞迪的首款SUV,至今已經5年多的光景了,上市以來的銷量還是挺不錯的。

外形相信大家都很熟悉了,這裏叫獸要強調的是S6的尺寸。S6的長寬高分別達到了4810/1855/1725mm,軸距為2720mm,基本是達到了一台合格的中型SUV的尺寸標準。

內飾方面,以現今的眼光去看S6的內飾有些落伍,內飾設計線條有些複雜,給人一種凌亂的感覺。好在配置一向是比亞迪的強項,以指導價10.29萬的1.5T 7座版本為例,6氣囊、無鑰匙進入/啟動、天窗、真皮方向盤、導航、自動空調等等實用配置應有盡有,這也是S6暢銷多年的一大原因。

S6有5座和7座兩個版本,其中7座分為1.5T手動、2.0L手動以及2.4L自動三個版本。叫獸在這推薦的是1.5T版本,相比而言,這款發動機的技術更新,動力與油耗也兼顧的更好;至於沒有推出7座版1.5T自動擋的原因,我想應該是考慮到S7的存在。

比亞迪S7

指導價:10.69 – 14.69萬

比亞迪S7是繼S6后又一款中型SUV,從命名方式就知道,S7的定位比S6要高,當然售價也更高。

這裏說的價格更高只是相比S6而言,作為一款中型7座SUV,頂配不到15萬的售價放在同級里依然非常有優勢,並且依然延續了比亞迪高配置的傳統。

S7的尺寸比S6略大,長寬高分別為4835/1855/1720mm,軸距比S6多出10mm達到了2730mm,依然是標準的中型SUV的尺寸。S7全系都是7座的配備,這也是其最大的賣點之一。

配置方面可謂豪華,ESp、胎壓監測、自動空調等等全部標配,中配以上車型甚至還配備了前後頭部氣簾、導航等等你能在這價位車型里看得到的配置。

動力方面,S7拋棄了自然吸氣發動機,全系均搭載自主研發的1.5T或2.0T渦輪增壓發動機,匹配6MT變速箱或DCT雙離合變速箱。

豐富的配置、充足的動力以及足夠便宜的價格一直是S7的幾大賣點,月均5000的銷量算不上高,但結合S6一起算的話,相信這兩台車的銷量還是會讓比亞迪滿意的。

總結:

在以往的認知中,7座SUV都是動輒二三十萬的價格。這回中國品牌再次抓住市場“痛點”,以及極具優勢的價格切入市場,長安CX70上市以來月均1萬以上的銷量充分說明有需求就會有市場的道理。

不要看不上這樣的車型,銷量說明一切。在汽車保有量日益飽和的大都市,未來將是這些三四線小城市的市場,而咱們中國品牌,不在此時超車更待何時?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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

9月最受歡迎SUV前五名!價格優惠 檔次高!你也喜歡他們嗎?_租車

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

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

終端優惠:普遍地區優惠5000以上,部分4S店提供低首付、低利率、長達60期的分期政策。點評:CR-V也是銷冠最有力的競爭者之一,雖然過去的輝煌已經不再,但是在人們心目中都會記得CR-V這一個名字,曾經需要加價提車、賣得火熱的車型到了今天依舊受到不少消費者支持,經過一輪改款,大氣時尚的外觀讓不少人折服。

來到10月中旬,又是一月一度的考核時間。沒錯!9月份的銷量報告已經強勢來襲。然而SUV市場的競爭是非常激烈的,無論是國產車市場還是合資市場,緊湊型SUV已經成為現今最受歡迎的車型之一,今天我們先來點評一下合資緊湊型SUV的成績如何。

9月份合資SUV前十名…

很明顯,在合資SUV榜單上,別克昂科威憑藉26448(輛)的銷量奪得9月份的合資SUV的銷量冠軍,而大眾神車大眾途觀則緊追其後,本月銷量22510(輛),然而在合資SUV銷量前十內,日系SUV佔了5個席位。

這些車到底有什麼能耐?

終端優惠:在大部分地區均有2萬左右的優惠,購買昂科威可享首付35%,18期免息貸款或至高10000元置換補貼或優惠增購禮遇。

點評:別克昂科威算得上是一個非常成功的車型,打從上市以來,憑藉自身時尚大氣的外觀設計、領先同級的配置水平、超大乘坐空間一舉將大眾途觀拉下榜首位置。人們的生活水平越來越高,尤其是在這一個“二胎時代”,車內空間的大小已經成為大部分消費者選車關注點。高實用性、高顏值、高配置成為了別克昂科威的主要賣點。

在動力方面,別克昂科威是這幾款車型中動力表現最為突出的車型,2.0T+6AT的動力表現能夠帶給你一種暢快淋漓的感覺,而且6AT變速箱的換擋邏輯清晰,能夠很好地了解駕駛者的意圖。另外在全車隔音方面,別克昂科威整體水平十分出色,搭配上寬大舒適的座椅,無論是駕駛員還是乘客,都能擁有一個非常不錯的駕乘體驗。

終端優惠:大部分地區有兩萬以上的優惠。

點評:大眾途觀,可以說是掀起我國SUV熱潮的發起者之一。然而途觀已經上市了很長一段時間了,在產品競爭力上可以說是相當低的,但為什麼賣得好?實際上大眾途觀跟哈弗H6有點相似,都存在一個先入為主的概念,還有大眾一直以來的口碑也是催使消費者選擇它的最大原因,因為它是神車呀。

作為大眾旗下的重磅產品,而且大眾玩渦輪增壓以及雙離合的技術也特別溜,屬於大眾目前最為主流的EA888發動機在動力表現方面突出,搭配上在民用車範疇內調校最為出色的7速雙離合變速箱,整體表現值得肯定,但是大眾一直一來“混合動力”的優良傳統在途觀上也是常見情況,

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

不燒機油的大眾車不是好的大眾車嘛,實際上這並不算的上是發動機故障,所以車主在日常駕駛中多關注一下機油量就好了。

終端優惠:普遍地區優惠5000以上,部分4S店提供低首付、低利率、長達60期的分期政策。

點評:CR-V也是銷冠最有力的競爭者之一,雖然過去的輝煌已經不再,但是在人們心目中都會記得CR-V這一個名字,曾經需要加價提車、賣得火熱的車型到了今天依舊受到不少消費者支持,經過一輪改款,大氣時尚的外觀讓不少人折服。前臉是改好了,只是尾部的設計卻是眾多消費者吐槽的主要點之一。

日系車一直以來的調調就是喜歡用自然吸氣發動機,而且本田嘛,I-VTEC的銷魂聲音也是讓無數人難以自拔的存在,而且本田CRV這兩套動力雖然動力平平,但已經足夠日常所需。得益於本田的MM理念(乘員空間最大化,机械空間最少化),在空間利用率方面CR-V是非常充裕的,能夠滿足各種家用需求。

終端優惠:大部分地區有5000以上的購車優惠,1.6T車型享受購置稅減半的國家政策。

點評:雖然同為緊湊型SUV,但實際上途勝在定位方面較上述三位选手低了一個等級,然而在這一個看臉的世界里,現代途勝擁有一個極其帥氣的外觀,這是相當符合年輕消費者的口味,另外一方面就是價格便宜,合資的品牌、國產車般的價格都讓它擁有一個非常不錯的競爭力!

作為韓系小生,顏值已經提過了,在動力方面現代途勝提供了2.0L+6擋手自一體變速箱以及1.6T+7速雙離合,在動力表現方面比較中規中矩,但1.6T排量的車型能享受購置稅優惠減半的政策加上一個比較大幅度的現金優惠,是值得入手的。

終端優惠:大部分地區超過2.5萬的購車優惠,除此以外各個4S店均還有不同程度的優惠政策。

點評:日產奇駿早在14年就進行了一次改款,外觀、內飾均得到了翻天覆地的變化,時尚、年輕的設計也讓它俘虜了不少消費者的內心,而且富有移動沙發之名的日產品牌在奇駿上也是發揮到了極致,大空間、超高的舒適性以及高配置配上不俗的外觀設計成為了奇駿最大的賣點。

就像上文所說,日系車還是喜歡玩自吸,在日產奇駿上提供了2.0L、2.5L兩款自吸發動機,與之搭配的是一台模擬7擋的CVT變速箱,在入門級車型還提供一款6MT的手動變速箱,只是這兩款發動機在技術方面確實比較落後,而且配上CVT的變速箱也談不了運動。但是發動機雖老但質量非常穩定,CVT專註家用,動力輸出平順而且還省油,這也是優點,對於奇駿這一台家用SUV來說,坐得舒服才是最重要的。

緊湊型合資SUV前5名

已經點評完畢

接下來還有更多的銷量報告

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

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

vivo南紡體驗店登場!推五大開幕限定優惠,再抽萬元五星級飯店雙人假期_網頁設計

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

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

vivo 繼在高雄、台北和台中開設體驗店後,今(12/25)宣布進駐台南佔地最大購物商場–南紡購物中心A2館,為歡慶全台第四間體驗店正式開幕,加上適逢聖誕佳節,vivo特地祭出歷來最殺開幕限定好禮,首三日購買全系列機種可享五大購機優惠,再抽五星級飯店吃住玩雙人假期行程。

vivo南台灣最大體驗店今登場 五大開幕限定優惠

台南南紡購物中心A2館包含地上九層、地下兩層,整體面積約2.1萬坪,商業面積約8千多坪,看準購物中心發展潛力,vivo選擇在此打造南台灣最大體驗店,店內空間寬敞明亮,展現簡潔舒適時尚科技氛圍,近30坪室內空間包含展示體驗區、產品交機區、週邊配件區,帶給消費者全系列完整服務。

今天早上的開幕我們也做了直播介紹,眾多好康購機資訊也在裡面:

 

寬廣的體驗區:

完整配件區:

為歡慶vivo正式落腳台南,vivo於開幕首三日推出超殺開幕好康回饋消費者,凡於12/25-12/27購機可享五大獨家優惠,優惠一,購買vivo X50 Pro旗艦機,送價值6,389元vivo Y12和vivo運動藍牙耳機:

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

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

優惠二,買vivo X50送市價3990元DJI OM4磁吸式手持雲台,優惠三,購買X全系列可享延長保固至24個月、螢幕意外保障12個月、2021限定桌曆和vivo原廠33W閃充組,上網登錄再送全聯禮券900元:

優惠四,買vivo V與Y系列手機送延長保固至18個月、代言人張鈞甯悠遊卡、vivo輕量雙肩電腦包、V Friends藍牙耳機:

優惠五,購買vivo運動藍牙耳機送KKBOX 30日體驗卡。

除了一系列購機禮外,12/31前只要入手全系列vivo手機並至官網登入序號,還有機會抽中市價14,220元麗寶樂園×福容大飯店五星級飯店吃住玩全包雙人麗寶假期行程,內含精緻雙人房住宿一泊一食、渡假區禮券800元和饗樂券4張。此外,vivo也將於12/26(六)邀請氣球姊姊、12/27(日)請來造型棉花糖達人舉辦快閃活動,凡於周末指定時間到店體驗產品並拍照上傳即可獲得體驗禮,當日不限金額消費還可客製特殊造型款氣球或棉花糖。

4體驗店+3客戶服務中心 六大最強售後搶攻市場

vivo表示,目前已在台北三創、高雄夢時代、台中一中和台南南紡設有四間體驗店,客戶服務中心則在新北、台中、高雄皆有據點,2021年目標將在全台六大都會區完成體驗店布局,此外,vivo也推出業界最強六大保固,凡購買任一機種可享「業界最長15日新品換貨」、「終身維修免費到府收送」、「終身免檢修費」、「保固內原廠殼和原廠保護貼免費更換各兩次」、「終身免費手機健檢」、「長期服務始終如一」等6大業界最強售後保固,希望透過更全面的銷售通路和貼心服務搶攻市場,讓消費者能深入感受 vivo 手機的魅力!

另外在 vivo 館旁也有野獸國快閃店,裡面有展出X戰機 1:1 模型,可上去搭乘拍照,旁邊也有漫威免費著色活動,相當適合帶親子來這邊逛逛,建議大家晚上來更漂亮喔:

您也許會喜歡:

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

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

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

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

線性結構隊列以及應用(上)_台中搬家公司

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

隊列Queue:什麼是隊列?

對列是一種有次序的數據集合,其特徵是新數據項的添加總發生在一端(通常稱為“尾rear”端),而現存數據項的移除總發生在另一端(通常稱為“首front”端)

當數據項加入隊列,首先出現在隊尾,隨着隊首數據項的移除,它逐漸接近隊首。新加入的數據項必須在數據集末尾等待,而等待時間最長的數據項則是隊首。這種次序安排的原則稱為:先進先出。

隊列的例子出現在我們日常生活的方方面面:水管,排隊;隊列僅有一個入口和一個出口。不允許數據項直接插入隊中,也不允許從中間移除數據項。

抽象數據類型Queue

抽象數據類型Queue是一個有次序的數據集合,數據項僅添加到“尾”端,而且僅從”首“端移除,Queue具有先進先出的操作次序。

  • 抽象數據類型Queue由如下操作定義:

    Queue():創建一個空隊列對象,返回值為Queue對象;

    enqueue(item):將數據項item添加到隊尾,無返回值;

    dequeue():從隊首移除數據項,返回值為隊首數據項,隊列被修改;

    isEmpty():測試是否空隊列,返回值為bool;

    size():返回隊列中數據項的個數。

    隊列操作 隊列內容 返回值
    q=Queue() [] Queue object
    q.isEmpty() [] True
    q.enqueue(4) [4]
    q.enqueue(“dog”) [“dog”,4]
    q.enqueue(True) [True,”dog”,4]
    q.size() [True,”dog”,4] 3
    q.isEmpty() [True,”dog”,4] False
    q.enqueue(“dog”) [8.4,True,”dog”,4]
    q.dequeue() [8.4,True,”dog”] 4
    q.dequeue() [8.4,True] “dog”
    q.size() [8.4,True] 2

Python實現Queue

採用List來容納Queue的數據項,將List首端作為隊列尾端,List的末端作為隊列的首端,enqueue()複雜度為O(n),dequeue()複雜度為O(1)

class Queue:
    def __init__(self):
        self.items = []
        
    def isEmpty(self):
        return self.items == []
    
    def enqueue(self, item):
        self.items.insert(0, item)
        
    def dequeue(self):
        return self.items.pop()
    
    def size(self):
        return len(self.items)

注意:首尾倒過來的實現,複雜度也倒過來。

隊列的應用:約瑟夫問題

傳說猶太人反叛羅馬人,落到困境,約瑟夫和39人決定殉難,坐成一圈,報數1-7,報到7的人由旁邊殺死,結果略瑟夫給自己安排了個位置,最後活了下來……

模擬程序採用隊列來存放所有參加遊戲的人名,按照報數的方向從隊首排到隊尾,模擬遊戲開始,只需要將隊首的人出隊,隨機再到對尾入隊,算是一次報數完成,反覆n次后,將隊首的人移除,不再入隊,如此反覆,知道隊列中剩下一人。

def JosephQuestion(namelist,num):
    simqueue = Queue()
    for name in namelist:
        simqueue.enqueue(name)

    while simqueue.size() > 1:
        for i in range(num):
            simqueue.enqueue(simqueue.dequeue())  # 一次傳遞

        simqueue.dequeue()   # 處死隊首
    
    return simqueue.dequeue()

隊列的應用:打印任務

有如下場景:多人共享一台打印機,採取“先到先服務”的策略來執行打印任務,在這種設定下,一個首要問題就是:這種打印作業系統的容量有多大?在能夠接受的等待時間內,系統能夠容納多少用戶以多高頻率提交到少打印任務?

一個具體的實例配置如下:

一個實驗室,在任意的一個小時內,大約有10名學生在場,這一個小時中,每個人發起2次左右的打印,每次1-20頁。打印機的性能是:以草稿模式打印的話,每分鐘10頁,以正常模式打印的話,打印質量好,但是速度下降,每分鐘只能打印五頁。

問題:怎麼設定打印機的模式,讓大家都不會等太久的前提下,盡量提高打印質量?這是一個典型的決策支持問題,但無法通過規則直接計算,我們要用一段程序來模擬這種打印任務場景,然後對程序運行結果進行分析,以支持對打印機模式設定的決策。

如何對問題建模:

首先對問題進行抽象,確定相關的對象和過程。拋棄那些對問題實質沒有關係的學生性別,年齡,打印機型號,打印內容,智障大小等等眾多細節。

對象:打印任務,打印隊列,打印機。

打印任務的屬性:提交事件,打印頁數

打印隊列的屬性:具有“先進先出”性質的打印任務隊列

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

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

打印機的屬性:打印速度,是否忙

過程:生成和提交打印任務

確定生成概率:實例為每小時會有10個學生提交的20個作業,這樣概率是每180秒會有1個作業生成並提交,概率為每秒1/180。

確定打印頁數:實例是1-20頁,那麼就是1-20頁之間概率相同。

過程:實施打印

當前的打印作業:正在打印的作業

打印結束倒計時:新作業開始打印時開始倒計時,返回0表示打印完畢,可以處理下一個作業。

模擬時間:

統一的時間框架:以最小單位(秒)均勻流逝的時間,設定結束時間

同步所有過程:在一個時間單位里,對生成打印任務和實施打印兩個過程各處理一次

打印任務問題:流程模擬

創建打印隊列對象

時間按照秒的單位流逝

按照概率生成打印作業,加入打印隊列

如果打印機空閑,且隊列不空,則取出隊首作業打印,記錄此作業等待時間

如果打印機忙,則按照打印速度進行1秒打印

如果當前作業打印完成,則打印機進入空閑

時間用盡,開始統計平均等待時間

作業的等待時間

生成作業時,記錄生成的時間戳

開始打印時,當前時間減去生成時間即可

作業的打印時間

生成作業時,記錄作業的頁數

開始打印時,頁數除以打印速度即可

import random

class Printer:
    def __init__(self, ppm):
        self.pagerate = ppm  # 打印速度
        self.currentTask = None  # 打印任務
        self.timeRemaining = 0  # 任務倒計時

    def tick(self):  # 打印1秒
        if self.currentTask != None:
            self.timeRemaining -= 1
            if self.timeRemaining <= 0:
                self.currentTask = None

    def busy(self):  # 打印機忙
        if self.currentTask != None:
            return True
        else:
            return False

    def startNext(self, newtask):  # 打印新作業
        self.currentTask = newtask
        self.timeRemaining = newtask.getPages() * 60 / self.pagerate


class Task:
    def __init__(self, time):
        self.timestamp = time  # 生成時間戳
        self.pages = random.randrange(1, 21)  # 打印頁數

    def getStamp(self):
        return self.timestamp

    def getPages(self):
        return self.pages

    def waitTime(self, currenttime):
        return currenttime - self.timestamp  # 等待時間


def newPrintTask():
    num = random.randrange(1, 181)
    if num == 180:
        return True
    else:
        return False

def simulation(numSeconds,  pagesPerMinute): # 模擬
    labprinter = Printer(pagesPerMinute)
    printQueue = Queue()
    waittingtimes = []

    for currentSecond in range(numSeconds):
        if newPrintTask():
            task = Task(currentSecond)
            printQueue.enqueue(task)

        if not labprinter.busy() and not printQueue.isEmpty():
            nexttask = printQueue.dequeue()
            waittingtimes.append(nexttask.waitTime(currentSecond))
            labprinter.startNext(nexttask)

        labprinter.tick()

    averageWait = sum(waittingtimes) / len(waittingtimes)
    print("Average Wait %6.2f secs %3d tasks remaining" %(averageWait,printQueue.size()))

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

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

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

Asp.Net Mvc基於Fleck開發的多人網頁版即時聊天室_網頁設計公司

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

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

一、項目的核心說明

1、Fleck這個是實現websocket一個比較簡單第三方組件,它不需要安裝額外的容器。本身也就幾個接口可供調用。

2、項目是基於.net framework 4.7.2 ,在vs2019上開發的,沒試過在低版本上運行。但是代碼上沒怎麼用到新特性,所以估計是可以被低版本使用的。

3、這個項目並不是真實項目,也就是玩一下,但是對熟悉Fleck或者了解及時聊天,應該有一丁點的啟發作用。

 

二、Fleck 的簡要說明(https://github.com/statianzo/Fleck)

1、最簡單、最常用的調用方法:(ws://172.10.3.4:8111改成您的服務器本地IP和端口)

//控制台代碼
var server = new WebSocketServer("ws://172.10.3.4:8111");
server.Start(socket =>
{
  socket.OnOpen = () => Console.WriteLine("產生連接處理");
  socket.OnClose = () => Console.WriteLine("連接斷開處理");
  socket.OnMessage = (message) => {
  //1、此方法用於接收客戶端發送來的消息
  //2、可以做一些自己的操作,例如存入數據庫
  //3、為了響應客戶端,一般會使用下面的send函數,返迴響應結果。
  socket.Send(message);
  }
});

2、Fleck本身只負責幫你單線聯繫。也就是客戶端A和服務器建立連接后,會產生一個IWebSocketConnection,也就是上面代碼中socket變量的類型,它包含了接收方法、發送方法,但是都僅限於單一連接內。至於客戶端A想發送消息給客戶端B、C、D亦或者想群發,不好意思Fleck本身不Care。。。當然了那並不是這個功能就不能實現了,只是要開發者自己去把每一個IWebSocketConnection存儲起來,並管理他們的生存周期,通過自己的代碼去實現客戶端A給B發信息或者群發。

3、Fleck不需要額外的容器或進程來運行,它隨着IIS網站運行,也就是在w3wp.exe。至於它是怎麼運行的,目前我還沒有去看源碼,後期有時間再瞧瞧。

 

三、聊天室源碼位置

1、GitHub:https://github.com/DisSunRestart2020/DisSunChat

2、碼雲:https://gitee.com/dissun/DisSunChat

3、微信掃碼演示(網絡時好時壞)

        

 

四、核心代碼說明。

1、IWebSocketHelper接口。因為一開始,我是想用多個插件來實現聊天室,所以想用一個接口來做行為封裝。結果完成了Fleck之後,發現其他的操作模式都不太相同,很難封裝就放棄了,但是保留這個接口,是為了體現擴展性。

    /// <summary>
    /// 所有調用WebSocket的幫助類必須遵從的協議
    /// </summary>
    public interface IWebSocketHelper
    {
        /// <summary>
        /// websocket連通后觸發事件
        /// </summary>
        event SwitchEventHandler WsOpenEventHandler;
        /// <summary>
        /// websocket連接關閉后觸發事件
        /// </summary>
        event SwitchEventHandler WsCloseEventHandler;
        /// <summary>
        /// websocket監聽到消息后觸發事件
        /// </summary>
        event ListenEventHandler WsListenEventHandler;
        /// <summary>
        /// websocket響應處理事件
        /// </summary>
        event ResponseTextEventHandler WsResponseTextEventHandler;
        /// <summary>
        /// 聊天室在線人數
        /// </summary>
        int PlayerCount
        {
            get;
            set;
        }
        /// <summary>
        /// websocket初始化
        /// </summary>
        void WebSocketInit();

        /// <summary>
        /// 向全員發送信息
        /// </summary>
        /// <param name="wsocketMsg"></param>
        void SendMessageToAll(WebSocketMessage wsocketMsg);
        /// <summary>
        /// 向自己發送信息
        /// </summary>
        /// <param name="wsocketMsg"></param>
        void SendMessageToMe(WebSocketMessage wsocketMsg);
    }

接口中用到了4個委託事件,這裏稍微簡單的複習一下委託和事件。

①委託從使用形式來說,是指我們可以把一個函數作為參數進行傳遞,例如我們在解一道數學題,條件和要求都是一樣的,但是求解的過程可以多種多樣,通過委託就可以在不改變主體程序的同時,把不同的求解過程,封裝到不同的函數中,然後把函數作為參數傳入主體程序。

②委託從模式的角度來說,是在實現觀察者模式。訂閱者\觀察者告訴發布者\主題,如果發生了某一特定事情該怎麼處理,“怎麼處理”的過程就是委託方法的內容

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

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

③事件其實就是一個委託,都說事件是一個特殊委託,特殊在哪裡,特殊在它對委託增加了約束,讓你不能毫無顧忌的使用委託,這是為了保證封裝性。

④上面的4個事件,其實我可以直接換成4個委託屬性,對程序運行不會有太大影響。但是為什麼要使用事件,還是第三點的封裝性。事件本來的用意,是達到特定條件后讓發布者自己來觸發委託方法的執行,但是如果使用委託屬性,訂閱者本身就可以進行調用,封裝性就很差。

⑤上面的4個事件,分別是訂閱者告訴Fleck中心,新長連接接通怎麼辦、長連接斷開怎麼辦、客戶端發來消息怎麼辦、要返回客戶端的消息怎麼轉換。

 

2、Fleck類的實現。Fleck實現了IWebSocketHelper接口,這是這個項目的核心代碼。

  1 public class FleckHelper:IWebSocketHelper
  2     {
  3         /// <summary>
  4         /// websocket連通后觸發事件
  5         /// </summary>
  6         public event SwitchEventHandler WsOpenEventHandler;
  7         /// <summary>
  8         /// websocket連接關閉后觸發事件
  9         /// </summary>
 10         public event SwitchEventHandler WsCloseEventHandler;
 11         /// <summary>
 12         /// websocket監聽到消息后觸發事件
 13         /// </summary>
 14         public event ListenEventHandler WsListenEventHandler;
 15         /// <summary>
 16         /// websocket反饋客戶端的文本處理事件
 17         /// </summary>
 18         public event ResponseTextEventHandler WsResponseTextEventHandler;       
 19         /// <summary>
 20         /// 聊天室在線人數 
 21         /// </summary>
 22         public int PlayerCount
 23         {
 24             get;
 25             set;
 26         }
 27         /// <summary>
 28         /// websocket已經連通的連接集合
 29         /// </summary>
 30         private Hashtable socketListHs = new Hashtable();
 31       
 32         public void WebSocketInit()
 33         {
 34        
 35             string websocketPath = Utils.GetConfig("websocketPath");
 36             WebSocketServer wsServer = new WebSocketServer(websocketPath);            
 37 
 38             wsServer.Start(socket =>
 39             {         
 40                 //以下的設置,每當一個新連接進來,都會生效。
 41                 socket.OnOpen = () => {
 42                     //自定義處理
 43                     
 44                     if (this.WsOpenEventHandler != null)
 45                     {
 46                         WebsocketEventArgs args = new WebsocketEventArgs();
 47                         this.WsOpenEventHandler(this, args);
 48                     }
 49                 };
 50 
 51                 socket.OnClose = () => {
 52                     //從連接集合中移除                    
 53                     for (int i= socketListHs.Count-1; i>=0;i--)
 54                     {
 55                         if (socketListHs[i] == null)
 56                         {                           
 57                             socketListHs.Remove(i);
 58                         }                        
 59                     }
 60                     PlayerCount = socketListHs.Count;
 61                     //自定義處理
 62                     if (this.WsCloseEventHandler != null)
 63                     {
 64                         WebsocketEventArgs args = new WebsocketEventArgs();
 65                         this.WsCloseEventHandler(this, args);
 66                     }
 67                 };
 68 
 69                 socket.OnMessage = (message) =>
 70                 {
 71                     ClientData cData = Utils.JsonToObject<ClientData>(message);
 72                     WebSocketMessage wsocketMsg = new WebSocketMessage(socket.ConnectionInfo.ClientIpAddress, socket.ConnectionInfo.ClientPort.ToString(), socket.ConnectionInfo.Id.ToString("N"), cData);
 73 
 74                     if (Convert.ToBoolean(cData.IsConnSign))
 75                     {
 76                         //收到用戶上線信息,更新socket列表
 77                         if (!socketListHs.ContainsKey(cData.IdentityMd5))
 78                         {
 79                             socketListHs.Add(cData.IdentityMd5, socket);
 80                         }
 81                         else
 82                         {
 83                             socketListHs[cData.IdentityMd5] = socket;
 84                         }
 85                         PlayerCount = socketListHs.Count;
 86                     }
 87 
 88                     if (this.WsListenEventHandler != null)
 89                     {
 90                         WebsocketEventArgs args = new WebsocketEventArgs();
 91                         args.WebSocketMessage = wsocketMsg;
 92                         this.WsListenEventHandler(this, args);
 93                     }
 94                 };
 95 
 96             });
 97         }   
 98 
 99         /// <summary>
100         /// 向全員發送信息
101         /// </summary>
102         /// <param name="wsocketMsg"></param>
103         public void SendMessageToAll(WebSocketMessage wsocketMsg)
104         {           
105             string resultData = "";
106             if (this.WsResponseTextEventHandler != null)
107             {
108                 WebsocketEventArgs args = new WebsocketEventArgs();
109                 args.WebSocketMessage = wsocketMsg;
110                 this.WsResponseTextEventHandler(this, args);
111                 resultData = args.ResultDataMsg;
112             }
113 
114             if (!string.IsNullOrWhiteSpace(resultData))
115             {
116                 foreach (DictionaryEntry dey in socketListHs)
117                 {
118                     IWebSocketConnection subConn = (IWebSocketConnection)dey.Value;
119                     subConn.Send(resultData);
120                 }          
121             }
122         }      
123         
124     }

①代碼中IdentityMd5是我自己通過各種本地信息算出來的身份標識,因為在在微信上運行cookie不穩定,不能在本地存儲任何信息,只能通過算法把環境信息合成一個唯一值。

②前面說過,Fleck只負責單線聯繫,每一個連接都是一個IWebSocketConnection,所以我需要把IdentityMd5和IWebSocketConnection存起來,方便索引調用。

③socket.OnMessage中,socketListHs是存儲IWebSocketConnection的集合,每次有消息發來,如果判斷是新的IdentityMd5就會存起來。

④socket.OnClose 中,如果有連接斷開了,IWebSocketConnection就會為null,所以遍歷集合,然後把值為null剔除就能保持socketListHs集合的有效性

⑤SendMessageToAll函數用於群發消息,遍歷集合中所有的對象,調用每個IWebSocketConnection.Send(),就可以把消息發送出去。如果想從客戶端A發到客戶端B,也得利用IdentityMd5來做文章,本項目由於是聊天室並不需要這個功能,所以就省略了。

⑥socket.OnOpen、socket.OnClose、socket.OnMessage都是Fleck自行觸發的事件,前面一開始我們介紹過了,例如OnOpen中,如果我們需要當建立新連接時記錄日誌,我們就可以對WsOpenEventHandler賦值(本項目在Global.asax的Application_Start中用lambda賦值),如下:

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);                   
            App_Start.FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            
         ChatService chatService = new ChatService();
            try
            {

                IWebSocketHelper helper = new FleckHelper();//用FleckHelper來實例化IWebSocketHelper 接口。
                helper.WebSocketInit();
                  
                helper.WsOpenEventHandler +=(sender, args)=>{
                    Utils.SaveLog("WebSocket已經開啟2");
                };

                helper.WsCloseEventHandler += (sender, args) => {
                    Utils.SaveLog("WebSocket已經關閉2");
                };

                helper.WsListenEventHandler += (sender, args) => {
                    Utils.SaveLog("WebSocket監聽到了消息2");
                    if (!Convert.ToBoolean(args.WebSocketMessage.ClientData.IsConnSign))
                    {
                        chatService.CreateChatInfo(args.WebSocketMessage);
                        args.WebSocketMessage.ClientData.SMsg = Utils.ReplaceIllegalWord(args.WebSocketMessage.ClientData.SMsg);
                    }
                    else
                    {
                        string clientName = args.WebSocketMessage.CIp + ":" + args.WebSocketMessage.CPort;
                        string traceInfo = string.Format("{0} 加入聊天室(共{1}人在線)", clientName, helper.PlayerCount);
                        args.WebSocketMessage.ClientData.SMsg = traceInfo;
                    }
                    //給所有人轉發消息
                    helper.SendMessageToAll(args.WebSocketMessage);
                };

                helper.WsResponseTextEventHandler += (sender, args) => {
                    string jsonStr = Utils.ObjectToJsonStr(args.WebSocketMessage);
                    args.ResultDataMsg = jsonStr;
                };

               
            }
            catch(Exception ex)
            {
                Utils.SaveLog("發現了錯誤:" + ex.Message);
            }
        }

 3、在html端連接Fleck,只須一個一個WebSocketJs.js文件。

var socket;
var websocketInit = function (wsPath) {
    if (typeof (WebSocket) === "undefined") {
        socket = null;
        console.log("瀏覽器不支持websocket");
    } else {
        // 實例化socket
        socket = new WebSocket(wsPath);
        // 監聽socket連接
        socket.onopen = wsOnOpen;
        //監聽socket關閉
        socket.onclose = wsOnClose;
        // 監聽socket錯誤信息
        socket.onerror = wsOnError;
        // 監聽socket消息
        socket.onmessage = wsOnMessage;
    }
}


var wsOnOpen = function () {
    console.log("已經成功連接");
    var sMsg = "";

    var sendMsg = "{\"IdentityMd5\":\"" + identityMd5 + "\",\"SMsg\":\"\",\"ImgIndex\":\"" + imgIndex + "\",\"IsConnSign\":\"true\"}";
    socket.send(sendMsg);
}

var wsOnClose = function () {
    console.log("已經關閉連接");
}


var wsOnError = function (evt) {
    console.log("異常:" + evt);
}

var wsSend = function (sMsg) {     
    if (socket == null || sMsg == "") return false;
    console.log("消息成功發出");
    socket.send(sMsg);
}
 

①WebSocket是瀏覽器內置的一個類型,現在一般的瀏覽器都支持,但是還是typeof (WebSocket)來做一下判斷。

②然後在啟動時加載即可(ws://14.215.177.1:8111改成您的服務器公網IP和端口)。

$(function () {
 
    websocketInit("ws://14.215.177.1:8111");    
  
});

 

********** End *****************

上面這些也只是部分代碼,需要可運行代碼,請去github下載源碼。

疫情當前,公司發展不順,舊項目停擺,新項目需求不明。像當前這樣的企業破產潮,我是比較緊張的,畢竟不是小年輕,技術又不是特別過硬,不上不下的焦慮的很。但是也明白,行動起來,每天讓自己靠近目標一點點,是解決焦慮的不二法門。

能寫一些博客,就寫一些博客吧,我也不確定寫這個對我自己有什麼幫助,對讀者都多大的幫助,就當備忘錄吧。

當一個會折騰的“前浪”…

 

歡迎建設性的批評和指導意見。

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

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

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

附019.Rancher搭建及使用_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

一 Rancher概述

1.1 什麼是Rancher

Rancher 是為使用容器的公司打造的容器管理平台。Rancher 簡化了使用 Kubernetes 的流程,方便開發者可以隨處運行 Kubernetes(Run Kubernetes Everywhere),以便於滿足 IT 需求規範,賦能 DevOps 團隊。

當然 Rancher 2.x 已經完全轉向了 Kubernetes。Rancher 2.x 可以部署和管理在任何地方運行的 Kubernetes 集群。

Rancher 可以創建來自 Kubernetes 託管服務提供商的集群,自動創建節點並安裝 Kubernetes 集群,或者導入任何已經存在的 Kubernetes 集群。

Rancher 通過支持集群的身份驗證和基於角色的訪問控制(RBAC),使系統管理員能夠從一個位置控制全部集群的訪問。Rancher 可以對集群及其資源進行詳細的監控和並在需要時發送告警,也可以將容器日誌發送給外部日誌系統,並通過應用商店與 Helm 集成。

若具有外部 CI/CD 流水線系統,則可以將其與 Rancher 對接,如果沒有,Rancher 也提供了簡單易用的流水線實現自動部署和升級工作負載。除此之外,Rancher 還有很多開箱即用的功能用於更好的管理集群和業務應用,例如多集群應用,全局 DNS,服務網格,安全掃描,集群模版和基於 OPA 的策略管理等功能。

綜上所述,Rancher 是一個全棧式的 Kubernetes 容器管理平台,也是一個可以在任何地方都能成功運行 Kubernetes 的工具。

參考:https://docs.rancher.cn/rancher2x/#_1-what-s-rancher?

https://rancher2.docs.rancher.cn/docs/overview/_index

1.2 Rancher Server功能

Rancher API Server 是基於嵌入式 Kubernetes API Server 和 ETCD 數據庫建立的,它提供了以下功能:

  • 授權和角色權限控制
    • 用戶管理: Rancher API server 除了管理用戶在公司內部的使用的認證信息之外,還管理用戶訪問外部服務所需的認證信息,如登錄活動目錄或 GitHub 所需的賬號密碼。
    • 授權: Rancher API server 負責管理權限控制策略 和 安全策略。
  • 基於Rancher使用 Kubernetes 的功能
    • 運行 Kubernetes 集群: Rancher API server 可以在已有節點上運行 Kubernetes 集群 ,或對 Kubernetes 進行版本升級。
    • 應用商店管理: Rancher 可以使用Helm Charts 應用商店重複部署應用。
    • 項目管理: 項目,是 Rancher 中的一個概念,Kubernetes 中並沒有這個概念。項目由一個集群內的多個命名空間和多個訪問控制策略組成,允許用戶以組為單位,一次管理多個命名空間,對其進行 Kubernetes 相關操作。Rancher 用戶界面提供了 項目管理 和 項目內應用管理 兩個功能。
    • 流水線: 流水線 可以幫助開發者快速高效地上線新軟件。Rancher 支持給每一個項目單獨配置流水線。
    • Istio: Rancher 與 Istio 集成,管理員或集群所有者可以將 Istio 交給開發者,然後開發者使用 Istio 執行安全策略,排查問題,或為快速發布、灰度發布和 A/B 測試進行流量控制。
  • 配置雲端基礎信息
    • 同步節點信息: Rancher API server 可以同步集群內所有節點的信息。
    • 配置雲端基礎信息: 當 Rancher 與雲服務提供商配置完了之後,可以在雲端動態配置新節點和持久化存儲。
  • 查看集群信息
    • 日誌: Rancher 可以跟多種主流日誌工具集成,可以設置 集群日誌 或 項目日誌。
    • 監控: 使用 Rancher,可以通過 Prometheus 監控集群節點、Kubernetes 組件、軟件部署的狀態和進度。可以設置 集群監控 或 項目監控。
    • 告警信息: 需要隨時知道集群和項目的計劃和非計劃事件,才可以提高公司的運行效率。可以設置集群告警 或 項目告警。

1.3 Rancher架構設計

Rancher Server 由認證代理(Authentication Proxy)、Rancher API Server、集群控制器(Cluster Controller)、etcd 節點和集群 Agent(Cluster Agent) 組成。除了集群 Agent 以外,其他組件都部署在 Rancher Server 中。

如上圖所示用戶通過 Rancher Server 管控 Rancher 部署的 Kubernetes 集群(RKE 集群)和託管的 Kubernetes 集群的(EKS)集群的流程。以用戶下髮指令為例,指令的流動路徑如下:

  1. 首先,用戶通過 Rancher UI(即 Rancher 控制台)、Rancher API 接口、Rancher 命令行工具(Rancher CLI)輸入指令;
  2. 用戶通過 Rancher 的代理認證后,指令會進一步下發到 Rancher Server;
  3. 與此同時,Rancher Server 也會執行容災備份,將數據備份到 etcd 節點;
  4. 然後 Rancher Server 把指令傳遞給集群控制器。集群控制器把指令傳遞到下游集群的 Agent,最終通過 Agent 把指令下發到指定的集群中。

如果 Rancher Server 出現問題,我們也提供了備用方案,可以通過授權集群端點管理集群。

提示:考慮到性能和安全因素,通常建議使用兩個 Kubernetes 集群,分開用於部署 Rancher Server 和生產環境。部署 Rancher Server 后,可以創建或導入集群,然後使用Rancher Server創建用於生產的 Kubernetes 集群。

提示:可以在單個節點或高可用的 Kubernetes 集群上安裝 Rancher。由於單節點安裝只適用於開發和測試環境,而且單節點和高可用集群之間無法進行數據遷移,所以建議從一開始就使用高可用的 Kubernetes 集群來部署 Rancher Server,而且需要分開部署運行 Rancher Server 的集群和運行業務的生產 Kubernetes 集群。

參考:https://docs.rancher.cn/rancher2x/infrastructure/

https://rancher2.docs.rancher.cn/docs/overview/architecture/_index

1.4 Rancher和下游集群交互

如下圖示例,通過兩個用戶 Bob 和 Alice,理解 Rancher 啟動和管理下游集群的具體過程,以及每個 Rancher 組件的作用。

該示例涉及集群控制器、集群 Agent 和 Node Agent等組件。

  1. 認證代理

如上視圖中 Bob 的用戶希望查看下游集群“User Cluster 1”裏面正在運行的 pod。Bob 發起的請求會首先經過認證代理,通過認證之後,Rancher 的 認證代理才會把 API 調用命令轉發到下游集群。

認證代理集成了多種認證方式,如本地認證、活動目錄認證、GitHub 認證等。在發起每一個 Kubernetes API 調用請求的時候,認證代理會去確認請求方的身份,在轉發調用命令前,請設置正確的 Kubernetes impersonation 的消息頭。

Rancher 使用 Service Account (Service Accout 提供了一種方便的認證機制)和 Kubernetes 進行交互。

默認狀態下,Rancher 生成一個包含認證信息的kubeconfig文件,為 Rancher Server 和下游集群的 Kubernetes API Server 之間的通信提供認證。該文件包含了訪問集群的所有權限。

  1. 集群控制器和集群 Agent

每一個下游集群都有一個集群 Agent 保持下游集群的集群控制器與 Rancher Server 之間的信息暢通。

集群控制器具有以下功能:

  • 檢測下游集群的資源變化,如內存使用率、CPU 使用率等;
  • 把下游集群從“當前”狀態變更到“目標”狀態;
  • 配置集群和項目的訪問控制策略;
  • 通過調用 Docker Machine 和 Kubernetes Engine,如 RKE 和 GKE,創建集群。

提示:默認狀態下,集群控制器連接 Agent,Rancher 才可以與下游集群通信。如果集群 Agent 不可用,集群控制器可以連接到Node Agent,通過Node Agent 實現用戶和集群之間的通信。

集群 Agent,也叫做“cattle-cluster-agent”,是在下游集群中運行的組件,它具有以下功能:

  • 連接使用 Rancher 部署的 Kubernetes 集群(RKE 集群)中的 Kubernetes API;
  • 管理集群內的工作負載,pod 創建和部署;
  • 根據每個集群的設置,配置 Role 和 RoleBindings;
  • 實現集群和 Rancher Server 之間的消息傳輸,包括事件,指標,健康狀況和節點信息等。
  1. 節點 Agents

如果集群 Agent 不可用,下游集群中的其中一個節點 Agent 會創建一個通信管道,由節點 Agent 連接到集群控制器,實現下游集群和 Rancher 之間的通信。

部署節點 Agent 的方式有很多,通常建議使用DaemonSet部署節點 Agent ,這種方式可以確保下游集群內每個節點都成功運行節點 Agent。執行集群操作時,可以使用這種方式將指令下發到下游集群。集群操作包括:升級 Kubernetes 版本、創建 etcd 節點備份和恢復 etcd 節點。

  1. 授權集群端點

Rancher Server 和下游集群之間有明顯的延遲,或 Rancher Server 不可用時,用戶可以通過授權集群端點連接下游集群,實現 Rancher Server 和集群之間的通信,降低網絡延遲。

需要注意的是,只有 Rancher 部署的 Kubernetes 集群(RKE 集群)可以使用授權集群端點這個功能。其他類型的集群,如導入的集群、託管的集群等,並不能夠使用此功能。

kube-api-auth 微服務向授權集群端點提供了用戶認證功能。使用 kubectl 訪問下游集群時,集群的 Kubernetes API Server 通過 kube-api-auth 對用戶進行認證。

與授權集群端點類似, kube-api-auth 認證功能只在 Rancher 部署的 Kubernetes 集群(RKE 集群)中有效。

使用場景舉例:假設 Rancher Server 位於美國,用戶“Alice”和她管理的下游集群“User Cluster 1”位於澳大利亞。雖然 Alice 可以使用 Rancher 控制台管理 User Cluster 1 中的資源,但是她發出的請求要從澳大利亞發送到美國的 Server 端,然後再由 Server 代理回澳大利亞的集群端,澳大利亞集群端處理完請求后,再返回給美國的 Server 端,最後才能返回給澳大利亞的“Alice”。因為美澳之間的距離非常遙遠,所以發送的請求和返回的請求結果都會存在顯著的延遲。Alice 可以使用授權集群端點,降低延遲,更好地掌控她的下游集群。

為下游集群開啟授權集群端點后,Rancher 會在“kubeconfig”文件中額外生成一段 Kubernetes context,來允許用戶直接連接到集群。kubeconfig 這個文件中含有 kubectl 和 helm 的認證信息。

如果 Rancher 出現問題,無法連接,需要使用 kubeconfig 中的 context 幫助訪問集群。因此,建議導出一份 kubeconfig 文件副本,保存到本地,以備不時之需。

1.5 Rancher相關文件

  • rancher-cluster.yml :RKE 集群配置文件。
  • kube_config_rancher-cluster.yml :集群的 kubeconfig 文件,它包含了訪問集群的全部權限。如果 Rancher 出現故障,無法運行,可以使用這個文件連接通過 Rancher 部署的 Kubernetes 集群(RKE 集群)。
  • rancher-cluster.rkestate :Kubernetes 集群狀態文件,該文件含有訪問集群的所有權限。只有使用 RKE 0.2.0 或以上版本時,才會創建該文件。

注意:后兩個文件名的“rancher-cluster”部分取決於如何命名 RKE 集群的配置文件。

1.6 Rancher創建的Kubernetes類型

Rancher通常可以創建如下幾種類型的下游 Kubernetes 集群:

  • Rancher自動創建節點並部署Kubernetes集群:Rancher 可以動態創建位於雲上的節點(Node),如 Amazon EC2、Azure 和 vSphere等,然後在節點上安裝 Kubernetes。Rancher 使用 RKE 和 docker-machine創建這種集群。
  • Rancher通過已有的節點並部署Kubernetes集群:配置這種集群時,Rancher 可以在已有的虛擬機、物理機或雲主機上安裝 Kubernetes。這種集群叫自定義集群。Rancher 使用RKE創建這種集群。
  • Rancher管理雲服務商託管的Kubernetes集群:配置這種集群時,Kubernetes 由雲服務供應商安裝,如 GKE、ECS 和 AKS。Rancher 使用kontainer-engine來調用雲廠商的 API 來創建集群。
  • Rancher導入已有的Kubernetes集群:這種情況下,Rancher 只需要連接到已經配置好 Kubernetes 的集群。因此,Rancher 只設置 Rancher Agent 與集群通信,不直接創建集群。

二 基礎環境配置

2.1 安裝介紹

Rancher Server:用於管理和配置 Kubernetes 集群。可以通過 Rancher Server 的 UI 與下游 Kubernetes 集群進行交互。

RKE(Rancher Kubernetes Engine):是經過認證的 Kubernetes 發行版,它擁有對應的 CLI 工具可用於創建和管理 Kubernetes 集群。在 Rancher UI 中創建集群時,它將調用 RKE 來配置 Rancher 所創建的 Kubernetes 集群。

K3s (輕量級 Kubernetes): 和 RKE 類似,也是經過認證的 Kubernetes 發行版。它比 RKE 更新,更易用且更輕量化,全部組件都在一個小於 100 MB 的二進制文件中。從 Rancher v2.4 開始,Rancher 可以安裝在 K3s 集群上。

2.2 架構選擇

高可用 Kubernetes 安裝: 建議使用 Kubernetes 程序包管理器 Helm 在專用的 Kubernetes 集群上安裝 Rancher。在 RKE 集群中,需要使用三個節點以實現高可用性。在 K3s 集群中,僅需要兩個節點即可。

單節點 Kubernetes 安裝: 另一個選擇是在 Kubernetes 集群上使用 Helm 安裝 Rancher,僅在集群中使用單個節點。雖然在這種情況下的 Rancher Server 不具有高可用性,但是這種架構既節省了資源,又保留了可擴展性。如果想在短期內通過使用單個節點來節省資源,同時又保留高可用性遷移路徑,最合適的架構就是單節點 Kubernetes 安裝。

單節點 Docker 安裝: 將 Rancher 與 Docker 一起安裝在單個節點上。這種安裝方式的優點是開箱即用,建議在測試和演示環境中使用這種架構。它的缺點也非常明顯,單節點 Docker 安裝和高可用集群安裝之間不能進行數據遷移,所以推薦從一開始就使用高可用集群安裝的方式安裝 Rancher。

提示:本實驗基於高可用集群——K3S高可用Kubernetes集群(參考附018.K3S-ETCD高可用部署),同時使用helm來部署Rancher。



節點主機名

IP

類型

master01 172.24.8.71 K3S master節點
master02 172.24.8.72 K3S master節點
master03 172.24.8.73 K3S master節點
worker01 172.24.8.74 K3S worker節點
worker02 172.24.8.75 K3S worker節點
worker03 172.24.8.76 K3S worker節點

本實驗架構:

  • Rancher 的 DNS 解析為 4 層負載均衡器
  • 負載均衡器應將端口 TCP/80 和 TCP/443 流量轉發到 Kubernetes 集群中的所有 3 個節點。
  • Ingress 控制器會將 HTTP 重定向到 HTTPS,並在端口 TCP/443 上終止 SSL/TLS。
  • Ingress 控制器會將流量轉發到 Rancher deployment 中 Pod 上的端口 TCP/80。

2.3 資源需求

本實驗 Rancher Server 安裝在高可用的 Kubernetes 集群(K3S)上。通常安裝 Rancher Server 節點的軟件,硬件和網絡有如下最低要求。

  • 操作系統要求

Rancher 應用可以兼容當前任何流行的 Linux 發行版和流行的 Docker 版本。

Rancher 官方支持並且已在如下操作系統中測試了 Rancher 和 RKE,它們包括 Ubuntu,CentOS,Oracle Linux,RancherOS 和 RedHat Enterprise Linux

本實驗的 K3S 幾乎可以在任何 Linux 版本上運行。K3S 在以下操作系統及其這些版本後續的非主要版本中進行了測試:

Ubuntu 16.04 (amd64)

Ubuntu 18.04 (amd64)

Raspbian Buster (armhf)

所有受支持的操作系統都是 64-bit x86。

同時建議安裝 ntp (Network Time Protocol),這樣可以防止在客戶端和服務器之間因為時鐘不同步而發生證書驗證錯誤。

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

  • 硬件要求

硬件要求根據 Rancher 部署規模而定,官方對於高可用集群安裝的建議如下:

部署規模

集群

節點

vCPUs

內存

最多 150 個 最多 1500 個 2 8 GB
最多 300 個 最多 3000 個 4 16 GB
最多 500 個 最多 5000 個 8 32 GB
特大 最多 1000 個 最多 10000 個 16 64 GB
超大 最多 2000 個 最多 20000 個 32 128GB

  • 網絡要求

單個節點或 Kubernetes 集群上安裝 Rancher,每個節點都應配置一個靜態 IP。

  • 端口要求(K3S高可用環境)
    • 用於與下游集群通信的端口

為了與下游集群通信,Rancher 要求開放不同的端口,通常Rancher 管理面的端口要求如下圖所示:

下錶細分了入站和出站流量的端口要求:

Rancher 節點的入站規則



協議 端口 描述
TCP 80 進行外部 SSL 終止的負載均衡器/代理 使用外部 SSL 終止時的 Rancher UI/API
TCP 443 etcd 節點 controlplane 節點 worker 節點 託管的/導入的 Kubernetes 任何需要使用 Rancher UI 或 API 的源 Rancher Agent,Rancher UI/API,kubectl

Rancher 節點的出站規則




協議

端口

目的

描述

TCP 22 使用主機驅動創建的節點中的任何節點 IP 使用主機驅動通過 SSH 進行節點配置
TCP 443 35.160.43.145/32 35.167.242.46/32 52.33.59.17/32 git.rancher.io (應用商店)
TCP 2376 使用主機驅動創建的節點中的任何節點 IP Docker Machine 使用的 Docker 守護進程的 TLS 端口
TCP 6443 託管的/導入的 Kubernetes API Kubernetes API Server

    • K3s 集群中節點的其他端口要求

為了安裝 Rancher 高可用,K3S Server 需要開放 6443 端口供節點訪問。

使用 Flannel VXLAN 時,這些節點需要能夠通過 UDP 端口 8472 訪問其他節點。

如果要使用指標服務器(Metrics Server),則需要在每個節點上打開端口 10250。

Rancher Server 節點的入站規則




協議

端口

描述

TCP 6443 K3s server 節點 Kubernetes API
UDP 8472 K3s server 和 agent 節點 Flannel VXLAN 需要
TCP 10250 K3s server 和 agent 節點 kubelet

通常情況下,可以允許全部的出站流量。

提示:本手冊基於實驗目的,直接關閉所有防火牆。

更多的環境需求參考:https://rancher2.docs.rancher.cn/docs/installation/requirements/_index。

2.4 ingress安裝

本實驗使用helm部署rancher,配套需要提前部署ingress,參考《附020.Nginx-ingress部署及使用》。

三 Rancher安裝

3.1 安裝Docker

任何運行 Rancher Server 的節點上都需要安裝 Docker。

有兩種安裝 Docker 的選擇。一種選擇是參考官方 Docker 文檔來了解如何在 Linux 上安裝 Docker。

另一種選擇是使用 Rancher 提供的 Docker 安裝腳本,該腳本可用於安裝較新的 Docker 版本。

例如,此命令可用於在 Ubuntu 上安裝 Docker 18.09:

  1 curl https://releases.rancher.com/install-docker/18.09.sh | sh

提示:https://github.com/rancher/install-docker描述所有可快速安裝Docker的腳本。本實驗基於已有的高可用K3S集群,所有Docker均已安裝完成。

3.2 K3S集群安裝

  1 [root@master01 ~]# k3s kubectl get nodes

提示:本實驗基於高可用集群——K3S高可用Kubernetes集群(參考附018.K3S-ETCD高可用部署),同時使用helm來部署Rancher。

3.3 安裝CLI

hlem安裝:參考《053.集群管理-Helm工具》。

kubectl安裝:參考https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl。

3.4 添加helm chart倉庫

  1 [root@master01 ~]# helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

提示:Rancher不同的倉庫版本參考:https://rancher2.docs.rancher.cn/docs/installation/options/server-tags/_index/。

3.5 創建命名空間

  1 [root@master01 ~]# kubectl create namespace cattle-system        #ns必須為cattle-system 

3.6 CA證書

本實驗使用免費申請的CA證書,並將證書上傳至集群節點。

  1 [root@master01 ~]# mkdir rancher
  2 [root@master01 ~]# cd rancher
  3 [root@master01 rancher]# ll *crt *key
  4 -rw-r--r-- 1 root root 3.7K May 24 14:08 rancher.linuxsb.com.crt
  5 -rw-r--r-- 1 root root 1.7K May 24 14:08 rancher.linuxsb.com.key
  6 [root@master01 rancher]# kubectl -n cattle-system create secret tls tls-rancher-ingress \
  7   --cert=rancher.linuxsb.com.crt \
  8   --key=rancher.linuxsb.com.key

3.7 安裝Rancher

  1 [root@master01 rancher]# helm show values rancher-stable/rancher	#查看可配置選項
  2 [root@master01 rancher]# vi rancher-custom.yaml		        #創建helm配置
  3 auditLog:
  4   level: 1
  5 hostname: "rancher.linuxsb.com"
  6 ingress.tls.source: "secret"
  7 ingress:
  8   tls:
  9     source: "secret"
 10   configurationSnippet: |
 11     more_set_input_headers "X-Forwarded-Host: {{ .Values.http_upgrade }}";
 12     more_set_input_headers "X-Forwarded-Host: {{ .Values.connection_upgrade }}";

提示:更多Helm部署rancher選項參考:https://rancher2.docs.rancher.cn/docs/installation/options/chart-options/_index。也可通過set命令傳入選項,示例如下:

helm install rancher rancher-stable/rancher \

–set hostname=rancher.linuxsb.com \

–set ingress.tls.source=secret

  1 [root@master01 ~]# helm install rancher rancher-stable/rancher -f rancher-custom.yaml --namespace cattle-system
  2 [root@master01 ~]# helm list -n cattle-system
  3 [root@master01 ~]# helm -n cattle-system status rancher
  4 [root@master01 rancher]# kubectl -n cattle-system get pods -o wide
  5 [root@master01 rancher]# kubectl -n cattle-system get svc -o wide
  6 [root@master01 rancher]# kubectl -n cattle-system get ingress -o wide

四 確認驗證

4.1 訪問測試

瀏覽器訪問:https://rancher.linuxsb.com/。

提示:更多Rancher安裝文檔參考:https://rancher2.docs.rancher.cn/docs/installation/k8s-install/_index。

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

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

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

艾溪湖濕地的美_網頁設計

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

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

  攝影:傅建斌(影像中國)

  “四面碧樹三面水,一城香樟半城湖”,說的是南昌的景緻。南昌東面有溪流穿稻田而過,經年累月,數頃之地漸現湖光,世人稱之為艾溪湖,是南昌的城市天然濕地。

  秋天時節,艾溪湖濕地依然青草蔥蘢,綠意盎然。深吸幾口清甜空氣,能明顯感覺到一顆心正在走向遼遠空曠。落單的天鵝低着頭,用長長的喙專心揀覓食物;一隻鶴,孤傲地眺望蒼穹;只有那一群接一群的大雁們,無所顧忌地沖湖邊的行人鳴叫,似乎在表達喜悅的心情。

  “啊——啊——”天空傳來一陣聲響,一群飛鳥在濕地上空盤旋、流連、久久不散。“是灰鶴、千歲鶴!”人群傳來一聲驚嘆。正在湖邊給錦鯉餵食的孩子們,約好似的齊刷刷將頭抬起,打着節拍使勁鼓掌,齊聲喊道:“千歲鶴!千歲鶴!”

  “小廖,候鳥通道發現千歲鶴,應該是想在咱們雁島‘打尖’,你迅速隱蔽,別打擾它們。”

  “老高,船往東靠邊,暫停巡邏。”

  “小美,架好設備,做好記錄。”

  ……

  鄒進蓮手持對講機,一邊忙着聯絡,一邊在人群中穿梭。黑衣、黑褲、黑鞋、黑髮、黑框眼鏡,顯得簡約而幹練。

  都說,窮人的孩子早當家。鄒進蓮出生於湖北荊州一個貧困家庭,從小獨立且倔強。大學四年,她沒向家裡要過一分錢,從擺地攤賣襪子算起,先後嘗試過二十多種行當:鐵通卡代銷員、書店店長、校內公司設計員……畢業前夕,當許多同學還在為找工作奔波時,鄒進蓮早早便接到武漢一家國有企業的錄用通知,成了一名都市白領。

  然而,在鄒進蓮看來,年紀輕輕就過上安逸的生活容易讓人喪失鬥志。“不闖蕩,你要青春干什麼?”鄒進蓮不停問自己。凌晨三點,鄒進蓮依然沒有睡意,她漫無目的在網上閑逛,突然,一段人鶴相伴相依的視頻闖入她的眼帘,像一束光照亮了她的心靈。

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

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

  “這才是我想要的!”鄒進蓮突然間找到了奮鬥的方向。她很快辭掉工作,踏上南下的火車,開始拜師學養鳥。

  深山老林,簡易工棚,荒無人煙,缺水少電,鄒進蓮彷彿從世界的一極直接蹦到另一極,生活極端的反差讓她措手不及。與此同時,身邊質疑、批評的聲音一陣接一陣:“心血來潮、不務正業……”鄒進蓮的倔脾氣反而上來了:“我就要干出個樣子給你們看看。撞南牆也不回頭,走出一條別人未走過的路!”

  在學藝的那段日子里,風雨雷電、鳥獸蟲魚、花草樹木是鄒進蓮最忠實的夥伴,也是鄒進蓮最特別的老師。它們的存在賦予荒野奇妙的動感和蓬勃的哲思,也讓鄒進蓮的內心世界越來越豐盈,越來越強大。

  定下心神的鄒進蓮,陸續掌握了候鳥飼養、馴化、繁育、疫病防治等許多技能,2010年12月,鄱陽湖國家濕地公園告急:園內白天鵝大面積染病,鄒進蓮臨危受命趕往江西。一個月後,病危的四十多隻白天鵝全部康復,鄒進蓮被留在鄱陽湖白沙洲島工作,一干就是四年。

  地球上的候鳥依然定時守信地遵從着體內基因的召喚,感受着地球的每一次脈動和季節里最微妙的變化,振翅而飛,迎風而起,南來北往,飛越過雄奇壯闊的高山大海,飛越過水泥鋼筋的城市森林,周而復始地完成一次次遷徙……全世界主要的候鳥遷徙路線一共有八條,其中有三條經過中國。地處華中、與鄱陽湖相近的南昌,成為許多候鳥在西伯利亞與澳大利亞之間往返時的必經之地。

  城市發展,寸土寸金。南昌放棄艾溪湖周邊多個地產及工業投資項目,圍繞湖泊投資數十億元,保護自然生態,堅持原土護坡,緩處草坡入水,陡處生態綠格網保護,建了一座兩千六百多畝的純公益性的艾溪湖濕地公園,並精心打造了一條跨越市區的空中“鳥道”。2014年,鄒進蓮被這條雄奇、詩意的空中“鳥道”打動,接受高新區的邀請,出任艾溪湖濕地公園候鳥保護中心主任。

  上任后的鄒進蓮繞着艾溪湖濕地走了一圈,發現植物多,動物少,太過靜謐了。依她的知識和經驗,哪裡生態好,鳥就往哪裡去,艾溪湖濕地生態那麼好,只要築好“巢”,就一定可以引來無數“鳳凰”。經過一個月的深思熟慮,鄒進蓮提出創建艾溪湖濕地候鳥樂園的設想,先引進一批,待這一批扎了根,便能在鳥的世界里“口耳傳播、呼朋引伴”。

  從選址、規劃、設計到施工、馴養、招聘,鄒進蓮團隊只用了短短几個月時間。2015年6月1日,候鳥樂園揭開面紗,蓑羽鶴、疣鼻天鵝、小天鵝、黑天鵝、鴻雁、灰雁、白鷺……成百上千隻美麗候鳥,或游弋湖面,或淺立沙洲,或棲息樹林,或飛行天空。“落霞與孤鶩齊飛,秋水共長天一色”,南昌享譽千載的瑰麗景色,那一刻,重新鮮活在孩子們純凈的眼眸里。

  越來越多中小學校、幼兒園帶着孩子們來濕地開展科普活動,每次來,他們都想讓鄒進蓮做一個鳥類知識講座,可鄒進蓮都婉拒了。在她看來,應留更多的時間讓孩子們近距離接觸候鳥,與候鳥一起玩、一起互動、一起成長,這才是最有效的科普教育。一個顛撲不破的道理是:親近才會喜歡,喜歡才會主動學習和保護。

  不喜歡做講座的鄒進蓮卻特別喜歡講故事,一有空,她就和來濕地的遊人們分享候鳥的故事。“一隻叫‘灰灰’的灰雁很通人性,很講感情。有一次,它的飼養員老何請假三天回家辦事,老何前腳剛走,‘灰灰’就‘失蹤’了,到處找也找不到。第四天,老何剛回來上班,‘灰灰’立即出現,飛到老何跟前,不停叫喚,其意綿綿……”這些年,來艾溪湖的候鳥越來越多,獨立湖畔的鄒進蓮覺得自己擁有了一個充滿生機的王國。

  “小吃貨,別吃了,趕緊練飛去!”去看天鵝繁育的路上,鄒進蓮像幼兒園園長一樣對一群剛出生一個多月的小天鵝喊話。她說,她最享受的事情,就是蹲下來觀察候鳥寶貝們最細微的神情。這真是一種智慧——只有走進候鳥的世界,精通它們的“道”,才能真正懂得它們,讓它們心甘情願留下來。

  “保護候鳥不該是少數人的行為,我要做的就是通過自己的努力,讓更多人喜歡候鳥,把保護變成一種習慣。”鄒進蓮說,“我想把艾溪湖濕地候鳥樂園打造成集科普教育、生態旅遊、攝影寫生、休閑養生等為一體的候鳥生態旅遊文化景區,成為‘人的樂園+鳥的家園’。當生態效益轉為經濟效益,不僅能維持濕地正常運轉,還能反哺候鳥的馴養、繁育、保護和科研。在都市裡給予鳥兒們一片最安全、最適宜的棲息地,在城市的天空能時時看到鳥類,這樣鳥與人和諧共存的畫面,就是我最大的夢想。”

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

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

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

小米路由器AX6000 正式發表:首款 Wi-Fi 6E 標準的小米高階路由器,售價僅約 2,580 元_台北網頁設計

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

之前在九月初,華碩推出了全球首款 Wi-Fi 6E 路由器「ROG Rapture GT-AXE11000」,隨後在稍早小米11 發表會同時也帶來了小米的 Wi-Fi 6E 旗艦路由器「小米路由器AX6000」,除了是小米首款以 Wi-Fi 6E 為標準的高階路由器產品,在價格方面依舊相當有競爭力。

小米路由器AX6000 正式發表:首款 Wi-Fi 6E 標準的小米高階路由器,售價僅約 2,580 元

在小米11 旗艦新機發表會期間,也提到了小米11 支持 Wi-Fi 6 增強版(也就是 Wi-Fi 6E)的連接能力,小米也分享了使用 Wi-Fi 6E 路由器「小米路由器AX6000」實測在不同距離條件下小米11 和 iPhone 12 Pro Max 的網路測速結果。

今年 1月 Wi-Fi 聯盟就正式公布了 Wi-Fi 6E 的標準,將頻段從 WiFi 6 的 2.4GHz 和 5GHz 頻段擴展至 6GHz頻段。而多出來的「E」即為「Extended」。 WiFi 6E 相比 WiFi 6 主要是加入了6GHz 頻段(5925-7125 MHz),6GHz 頻段寬度為 1.2GHz,可以容納 7 個 160MHz 的頻道或 14 個80MHz的頻道,相比 WiFi 6來說它的容量呈現倍數提升。

小米路由器AX6000 採用了 7 根天線設計,其中包含了 6 根高增益天線和 1 根 AIoT 智能天線,可覆蓋家中更大面積的範圍、支持4×4 160MHz 規格:

小米路由器AX6000 除了支持 4K QAM 調製調度技術,讓同一時間傳輸的數據量增加 20%。在速率方面 2.4G 頻寬的理論最高速率為 574Mbps,5G 頻寬的理論最高速率為 4804Mbps ,配合 Multilink 技術 2.4G + 5G 最高併發速度能達到 3456Mbps 。

接口方面,小米路由器AX6000 擁有一個WAN/LAN 可切換的 2.5G 高速接口,另外還有三個網路接口。

WiFi 6E 實際上主要功能是提升了數據容量、可以讓更多的設備同時上網,並同時進行高速下載。小米路由器AX6000 也支持 MU-MIMO + OFDMA ,可一次傳輸就完成多達 16 台設備的數據傳送。

此外,小米路由器AX6000 也支持 Mesh 組網,可實現全屋訊號無死角覆蓋:

硬體規格方面,小米路由器AX6000 搭載高通 IPQ5018 處理器,這顆處理器擁有 A53 構架的雙核CPU 搭配單核 NPU,運行內存為 512MB。

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

小米路由器AX6000 在機身頂部、側面、底部均設有散熱孔,形成一個快速循環的散熱通道,能有效讓路由器溫度和性能保持在理想狀態。

小米路由器AX6000 也支援小米暢快連功能,只需打開米家App 就能輕鬆將身邊尚未配對的小米智慧家電完成網路連接:

當路由器修改 Wi-Fi 密碼後,小米路由器AX6000 的 WiFI 改密同步功能則會將新的密碼自動同步連接給所有小米智慧家電設備:

此外,作為小米路由器的旗艦新機,小米路由器AX6000 還支持智慧識別小米手機實現遊戲加速等功能。

價格方面,小米路由器AX6000 也維持小米一貫的超高性價比特色,建議售價只要人民幣 599 元(約合新台幣 2,580 元),倘若之後有機會入手一款 Snapdragon 888 處理器的手機/平板,那麼小米路由器AX6000 將是目前最適合搭配的路由器選擇。
不過,單單升級路由器也不代表裝置可使用到 Wi-Fi 6 ,還必須購買支持 Wi-Fi 6E 標準的裝置,目前市面上支持 Wi-Fi 6E 的裝置選擇還相當稀少,這次發表小米路由器AX6000 有一大主因也是為了小米11 而誕生。

圖片/消息來源:小米(中國)|小米路由器(微博)|小米手機(微博)

延伸閱讀:
小米11 正式發表:首款搭載高通 S888 5G 旗艦手機降臨!售價約 17,217 元起

您也許會喜歡:

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

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

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

小米氮化鎵GaN充電器Type-C 55W 推出:體積更小、價格更親民_網頁設計公司

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

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

除了今年九月引進台灣市場販售的小米 GaN 充電器 Type-C 65W ,在小米11 新機發表會也同步推出新款小米氮化鎵充電器「小米氮化鎵 GaN 充電器 Type-C 55W」。小米氮化鎵 GaN 充電器 Type-C 55W 擁有更小巧的體積、輸入接口改為 USB-A  ,這款充電器不僅搭配在小米11「套裝版」附贈,同時以約新台幣 426 元的價格單獨販售(附帶 USB 轉 Type-C 傳輸線)。

小米氮化鎵GaN充電器Type-C 55W 推出:體積更小、價格更親民

因應小米11 支持 55W 超級閃充的快充能力,小米也對應推出了全新的「小米氮化鎵 GaN 充電器 Type-C 55W」,可支持最大 55W 功率輸出。外觀延續過往小米充電器一樣採用白色的 PC 材質外殼,在側邊印著 GaN 字樣代表這是款氮化鎵充電器,插頭部分與之前 65W 版本一樣不可收折。

小米氮化鎵 GaN 充電器 Type-C 55W 可為小米11 提供最高 55W 的充電功率,能在 46 分鐘為小米11 充電至 100% :

機身尺寸方面,小米氮化鎵 GaN 充電器 Type-C 55W 擁有更短小的體積,方便放入背包外出攜帶使用,而不可收折插頭也是未來有意入手這款充電器的消費者得額外留意的。
充電安全部分,支援包括短路保護、過流保護、過壓保護、過溫保護、欠壓保護等,能確保正常電流範圍內充電保持安全的充電過程。另外,採用 100-240V 國際電壓,出國旅行也能使用。

另外,內建智慧晶片也可用於手機、筆電等裝置充電使用。輸出方面,小米氮化鎵 GaN 充電器 Type-C 55W 支持 5V/3A、9V/3A、11V/5A、20V/2.5A 。雖然小米氮化鎵 GaN 充電器 Type-C 55W 名為 Type-C ,但與 65W 版本不同的還有接口採用的是 USB-A 輸出接口,並附贈 USB-A 轉 USB-C 傳輸線。

圖片/消息來源:小米(中國)

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

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

延伸閱讀:
小米路由器AX6000 正式發表:首款 Wi-Fi 6E 標準的小米高階路由器,售價僅約 2,580 元

小米11 正式發表:首款搭載高通 S888 5G 旗艦手機降臨!售價約 17,217 元起

您也許會喜歡:

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

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

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

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

abp(net core)+easyui+efcore實現倉儲管理系統——出庫管理之一(四十九)_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

abp(net core)+easyui+efcore實現倉儲管理系統目錄

abp(net core)+easyui+efcore實現倉儲管理系統——ABP總體介紹(一)
abp(net core)+easyui+efcore實現倉儲管理系統——解決方案介紹(二)
abp(net core)+easyui+efcore實現倉儲管理系統——領域層創建實體(三)
 abp(net core)+easyui+efcore實現倉儲管理系統——定義倉儲並實現 (四)
abp(net core)+easyui+efcore實現倉儲管理系統——創建應用服務(五)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之控制器(六)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之列表視圖(七)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之增刪改視圖(八)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之菜單與測試(九)
abp(net core)+easyui+efcore實現倉儲管理系統——使用 WEBAPI實現CURD (十一)

abp(net core)+easyui+efcore實現倉儲管理系統——EasyUI前端頁面框架 (十八)

abp(net core)+easyui+efcore實現倉儲管理系統——EasyUI之貨物管理一 (十九)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之一(二十七)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之三(二十九)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之八(三十四)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之十(三十六)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之一(三十七)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之二(三十八)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之三存儲過程(三十九)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之四(四十)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之五(四十一)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之六(四十二)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之七(四十三)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之八(四十四)   
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之九(四十五)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十(四十六)

abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十一(四十七)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十二(四十八)

.前言

        出庫單的功能。能學習了出庫單管理之後,WMS的 最基本的功能算是完成了。當然一個成熟的WMS還包括了盤點,報表,策略規則,移庫功能及與其他系統(ERP、TMS等)的接口,實現無縫集成,打破信息孤島,讓數據實時、準確和同步。

二、出庫單的流程

    1.一般情況下會有一個前置的OMS系統——即訂單管理系統。主要功能之一是由客戶填寫訂單。

      2.客戶把訂單下第三方物流公司時,第三方物流公司會生成出貨單推送到倉庫時,系統會自動生成揀貨單,理貨員根據揀貨單揀貨,並製作出庫單,然後打印標籤,粘貼條碼標籤,分配托盤,核驗條碼標籤,貨物裝箱,訂艙出庫,並在系統中對出庫單進行審核通過。整個流程如下圖。

 

     當然我們接下來要實現的出庫單功能,沒有這麼複雜。

 

三、創建出庫單實體

    1. 做為一個出庫單,在數據庫中一般存在兩張表,表頭OutStockOrder,表體OutStockDetail

    2.Visual Studio 2017的“解決方案資源管理器”中,右鍵單擊“ABP.TPLMS.Core”項目的“Entitys”文件夾,在彈出菜單中選擇“添加” >

 > “類”。 將類命名為 OutStockOrder,然後選擇“添加”。

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

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

    3.創建OutStockOrder類繼承自Entity<int>,通過實現審計模塊中的IHasCreationTime來實現保存創建時間。代碼如下:

using Abp.Domain.Entities; using Abp.Domain.Entities.Auditing; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; namespace ABP.TPLMS.Entitys { public class OutStockOrder: Entity<int>, IHasCreationTime { public const int MaxLength = 255; public OutStockOrder() { No = string.Empty; CustomerCode = string.Empty; CustomerName = string.Empty; WarehouseNo = string.Empty; DeliveryNo = string.Empty; TallyClerk = string.Empty; TallyTime = string.Empty; CreationTime = DateTime.Now; Oper = string.Empty; Checker = string.Empty; CheckTime = string.Empty; Gwt = 0; Nwt = 0; PackageQty = 0; OwnerCode = string.Empty; OwnerName = string.Empty; Remark = string.Empty; Status = 0; PreOutStockTime = string.Empty; } [StringLength(50)] [Required] public string No { get; set; } /// <summary>
        /// 客戶名稱 /// </summary>
 [StringLength(MaxLength)] [Required] public string CustomerName { get; set; } /// <summary>
        /// 車牌號 /// </summary>
        public string VehicleNo { get; set; } /// <summary>
        /// 客戶代碼 /// </summary>
        [StringLength(50)] [Required] public string CustomerCode { get; set; } /// <summary>
        /// 收貨人代碼 /// </summary>
        public string ConsigneeCode { get; set; } /// <summary>
        /// 收貨人 /// </summary>
        public string Consignee{get ;set;} /// <summary>
        /// 收貨人社會信用代碼 /// </summary>
        public string ConsigneeSCCD { get; set; } /// <summary>
        /// 託運人,發貨人 /// </summary>
        public string Shipper { get; set; } /// <summary>
        /// 託運人,發貨人代碼 /// </summary>
        public string ShipperCode { get; set; } /// <summary>
        /// 託運人,發貨人社會信用代碼 /// </summary>
        public string ShipperSCCD { get; set; } /// <summary>
        /// 通知人 /// </summary>
        public string Notify { get; set; } /// <summary>
        /// 通知人代碼 /// </summary>
        public string NotifyCode { get; set; } /// <summary>
        /// 通知人社會信用代碼 /// </summary>
        public string NotifySCCD { get; set; } /// <summary>
        /// 出貨單號 /// </summary>
        public string DeliveryNo { get; set; } /// <summary>
        /// 倉庫號 /// </summary>
        public string WarehouseNo { get; set; } /// <summary>
        /// 貨主 /// </summary>
 [StringLength(MaxLength)] [Required] public string OwnerName { get; set; } public decimal Gwt { get; set; } public decimal Nwt { get; set; } public int PackageQty { get; set; } /// <summary>
        /// 理貨時間 /// </summary>
        [StringLength(20)] public string TallyTime { get; set; } /// <summary>
        /// 理貨員 /// </summary>
        [StringLength(50)] public string TallyClerk { get; set; } [StringLength(50)] public string Oper { get; set; } public int Status { get; set; } [StringLength(50)] public string OwnerCode { get; set; } /// <summary>
        /// 預計出庫時間 /// </summary>
        [StringLength(20)] public string PreOutStockTime { get; set; } /// <summary>
        /// 審核人 /// </summary>
        [StringLength(50)] public string Checker { get; set; } [StringLength(20)] public string CheckTime { get; set; } [StringLength(1000)] public string Remark { get; set; } public DateTime CreationTime { get; set; } [StringLength(20)] public string LastUpdateTime { get; set; } [StringLength(50)] public string LastOper { get; set; } } } 

    4. 重得第2,3步,我們在“ABP.TPLMS.Core”項目的“Entitys”文件夾,創建OutStockOrderDetail類。代碼如下:

using Abp.Domain.Entities; using Abp.Domain.Entities.Auditing; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text; namespace ABP.TPLMS.Entitys { public class OutStockOrderDetail : Entity<int>, IHasCreationTime { public const int MaxLength = 255; public OutStockOrderDetail() { this.Qty = 0; this.CargoCode = string.Empty; this.CargoName = string.Empty; this.Brand = string.Empty; this.Country = string.Empty; this.CreationTime = DateTime.Now; this.Curr = string.Empty; this.GrossWt = 0; this.Height = 0; this.HSCode = string.Empty; this.Length = 0; this.SecdLawfQty = 0; this.LawfQty = 0; this.NetWt = 0; this.Package = string.Empty; this.Price = 0; this.Spcf = string.Empty; this.Unit = string.Empty; this.InStockNo = string.Empty; this.LawfUnit = string.Empty; this.Vol = 0; this.Width = 0; this.LawfUnit = string.Empty; this.SecdLawfUnit = string.Empty; this.Batch = string.Empty; this.InStockOrderDetailId = 0; } public int SupplierId { get; set; } [MaxLength(50)] public string CargoCode { get; set; } [MaxLength(10)] public string HSCode { get; set; } [MaxLength(MaxLength)] public string CargoName { get; set; } [MaxLength(MaxLength)] public string Spcf { get; set; } [MaxLength(20)] public string Unit { get; set; } /// <summary>
        /// 目的國 /// </summary>
        [MaxLength(20)] public string DestCountry { get; set; } /// <summary>
        /// 原產國 /// </summary>
 [MaxLength(20)] public string Country { get; set; } [MaxLength(50)] public string Brand { get; set; } [MaxLength(20)] public string Curr { get; set; } [MaxLength(20)] public string Package { get; set; } public decimal Length { get; set; } public decimal Width { get; set; } public decimal Height { get; set; } public decimal Vol { get; set; } public decimal Price { get; set; } public decimal TotalAmt { get; set; } public decimal GrossWt { get; set; } public decimal NetWt { get; set; } public DateTime CreationTime { get; set; } [MaxLength(20)] public string InStockNo { get; set; } public int InStockOrderDetailId { get; set; } public decimal Qty { get; set; } public decimal LawfQty { get; set; } public decimal SecdLawfQty { get; set; } [MaxLength(20)] public string LawfUnit { get; set; } [MaxLength(20)] public string SecdLawfUnit { get; set; } [MaxLength(20)] public string Batch { get; set; } public string  Loc { get; set; } } }

5.定義入庫單的實體之後,我們去“ABP.TPLMS.EntityFrameworkCore”項目中的“TPLMSDbContext”類中定義實體對應的DbSet,以應用Code First 數據遷移。添加以下代碼

using Microsoft.EntityFrameworkCore; using Abp.Zero.EntityFrameworkCore; using ABP.TPLMS.Authorization.Roles; using ABP.TPLMS.Authorization.Users; using ABP.TPLMS.MultiTenancy; using ABP.TPLMS.Entitys; namespace ABP.TPLMS.EntityFrameworkCore { public class TPLMSDbContext : AbpZeroDbContext<Tenant, Role, User, TPLMSDbContext> { /* Define a DbSet for each entity of the application */
      

        public TPLMSDbContext(DbContextOptions<TPLMSDbContext> options) : base(options) { } public DbSet<Module> Modules { get; set; } public DbSet<Supplier> Suppliers { get; set; } public DbSet<Cargo> Cargos { get; set; } public DbSet<Org> Orgs { get; set; } public virtual DbSet<InStockOrder> InStockOrder { get; set; } public virtual DbSet<InStockOrderDetail> InStockOrderDetail { get; set; } public virtual DbSet<InStockOrderDetailLoc> InStockOrderDetailLoc { get; set; } public virtual DbSet<OutStockOrder> OutStockOrder { get; set; } public virtual DbSet<OutStockOrderDetail> OutStockOrderDetail { get; set; } } }

     6.從菜單中選擇“工具->NuGet包管理器器—>程序包管理器控制台”菜單。

    7. 在PMC中,默認項目選擇EntityframeworkCore對應的項目后。輸入以下命令:Add-Migration AddEntityOutStock,創建遷移。如下圖。

 

    8. 在上面的命令執行完畢之後,創建成功后,會在Migrations文件夾下創建時間_AddEntityOutStock格式的類文件,這些代碼是基於DbContext指定的模型。如下圖。

 

    9.在程序包管理器控制台,輸入Update-Database,回車執行遷移。執行成功后,如下圖。

 

    10. 在SQL Server Management Studio中查看數據庫,OutStockOrder、OutStockOrderDetail兩張表創建成功。

 

 

 

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

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污