奧迪才12萬?那你還會買其他普通品牌的車嗎?_網頁設計公司

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

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

要面子:奧迪是毫無疑問的,奔馳寶馬車型都尚未有如此大的現金優惠,選裝哪些配置就見仁見智了。歡迎大家在評論區說出自己的意見哦。

建議:

預算在十五萬左右

配置控:合資車的中配車型、國產車的高配車型。

空間、舒適性要求高:現金優惠給力的中型車,

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

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

選擇乞丐版,後期再自己加裝配置(導航、倒車影像、雷達等)。

要面子:奧迪是毫無疑問的,奔馳寶馬車型都尚未有如此大的現金優惠,選裝哪些配置就見仁見智了。

歡迎大家在評論區說出自己的意見哦!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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

援埃塞俄比亞衛星交付儀式在京舉辦_網頁設計公司

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

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

2020-12-02 來源:生態環境部

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

  12月2日,我國氣候變化南南合作項目——援埃塞俄比亞衛星交付儀式在北京成功舉辦,生態環境部副部長劉華和埃塞俄比亞駐華大使特碩姆·托加出席儀式並致辭。

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

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

  中方表示,中國高度重視應對氣候變化,實施积極應對氣候變化國家戰略,採取一系列有力政策措施並取得顯著成效,近年通過實施一系列南南合作項目,為其他發展中國家應對氣候變化提供支持。此次中方援助衛星及地面系統,可為埃有效應對氣候災害提供科學依據。中方秉承“授人以漁”精神,在援助衛星的同時提供航天技術援助,有力帶動埃方航天體系建設和人才培養。這是全球應對氣候變化南南合作的一次成功範例,為中埃開啟應對氣候變化合作新篇章。中埃將繼續走合作共贏之路,推動全面戰略合作夥伴關係攀上新高峰。

  埃方表示,感謝中國的無私幫助,讓埃塞俄比亞人民擁有了第一顆衛星。這是兩國友誼的象徵,也是兩國開展應對氣候變化和航天合作的良好開端。通過合作,埃塞俄比亞獲得了大量數據作為應對氣候變化的可信分析依據。同時,大批技術人員獲得培訓機會,成長為衛星運控、氣候變化分析骨幹,雙方合作還將不斷深入。

  援埃塞俄比亞衛星是落實習近平主席南南合作“十百千”項目的具體舉措,於去年12月成功發射,今年3月完成在軌驗收,成為我國第一顆援外衛星和同非洲合作的第一顆遙感衛星。埃總理阿比曾在2019年訪華期間赴現場視察衛星研製工作。

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

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

JLab 推出可直接夾在鏡框上的開放式耳機 JBuds Frames,每一副眼鏡都適用_網頁設計公司

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

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

近年來蠻多標榜內建有揚聲器的智慧眼鏡問世,但因為是新技術,價格自然是不太親民,且就僅限單一副眼鏡,對於喜歡依照服裝搭配或需求換眼鏡的人來說不太方便。一向以俗擱大碗著稱的品牌 JLab,近日推出了一款附帶有揚聲器的模組,讓用戶直接夾在自己的眼鏡上,不管今天想戴哪副眼鏡隨便你!

JLab 推出可直接夾在鏡框上的開放式耳機 JBuds Frames,每一副眼鏡都適用

JBuds Frames 是兩個內建有揚聲器的兩個模組,與整合式智慧眼鏡的解決方案不同,並不像智慧眼鏡多半刻意將揚聲器藏起來,使外觀和一般眼鏡沒兩樣,而是直接大大咧咧地秀出來。配備有多種尺寸的固定用矽膠套,使用時只要選擇適合的套子把它夾在鏡腿上,聲音以向下發射的方式傳達到你的耳朵,不影響周遭的人,屬性偏向於開放式耳機的一種。

在音訊方面,左右兩側各有一個 16mm 的驅動,機身具備 IPX4 防水能力,足以應付突如其來的雨水和運動時揮灑的汗水。在機身上配置有音量控制、接聽 / 掛斷電話,以及切換 EQ 設定值的按鈕。充電採特殊線材磁吸方式,內建的 120mAh 電池續航可支援超過 8 小時的音樂播放,以及 100 小時的待機時間。JLab 也表示,你可以兩邊一起使用,也可以單邊獨立使用,完全可視需求彈性調整。

這種開放式的設計最適合喜歡路跑或必須隨時注意周遭環境音的人,相較於貴森森的內建揚聲器智慧眼鏡, JBuds Frames 一對的售價僅 50 美元(約合新台幣 1,415 元),預計會在 2021 年春季推出,不過在此之前還是要提醒大家,畢竟開放式耳機在音質方面有較低的天花板,所以請不要指望它能為你帶來發燒級的專業音質。

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

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

您也許會喜歡:

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

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

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

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

比小日本漢蘭達要大 7萬不到大尺寸爭氣SUV必選這些_網頁設計公司

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

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

還是給這台車營造了一種很大的感覺。它的內飾和外觀一樣也是屬於比較中規中矩的感覺。內飾上的一個亮點就在於它的中央的控制區同樣使用了大屏幕的觸控設計。不同的是它真正屬於液晶显示的區域比較小。只是一些實體按鈕用觸控按鈕取代,類似於本田的處理的方式小編是不太喜歡的。

國人對於SUV車型似乎有着一種偏愛。在許多人的眼裡還是一位代表着野性生活學習以及強大的實用性和舒適性,超大的空間。這些都十分的吸引人,有人說這些特性許多的mpv車型也是能夠具備的啊,但是從外觀以及面子上看MpV確實沒有SUV來的那麼體面。

SUV裡頭中型SUV幾乎是我們日常能夠見到的最大的SUV了。中型SUV一般長度超過四米六,寬度超過一米八。 軸距也普遍超過兩米七了。這些中型SUV尺寸巨大。所以他們的車內空間也都非常的寬敞,許多還是七座設計。那麼如果你想買到一輛中型SUV的話需要多少錢呢?你其實7萬不到,就能購買到中型SUV了。今天小編就給大家介紹三款不到7萬的中型SUV車型。

濰柴英致G5

指導價:6.98-9.38萬

其實嚴格來說濰柴英致G5的長度只有一台標準緊湊型suv的長度(4530mm)。但是它的軸距卻達到了驚人的2785毫米。寬度也達到了1810毫米。所以廠家還是把他定義成為一台中型的SUV。也算是在中型SUV中尺寸偏小的一台吧。目前為止濰柴英致G5全系採用一台1.5升自然吸氣發動機,最大功率113馬力、最大扭矩141牛米。這樣一台動力偏弱的發動機放在一台中型的SUV上顯然動力是不夠的,匹配的5擋手動變速箱的濰柴英致G5還好,匹配的cvt無極變速器的濰柴英致G5就把這種動力弱的感覺進一步放大了,因此對於這台車的動力表現我實在是沒有什麼信心?

在內飾上濰柴英致G5的一個巨大的特點就在於它使用了類似於特斯拉的全觸控中控區。這樣的設計呢雖然說是十分的炫酷,但是在日常使用,尤其是在駕駛中的操作上並不是十分便利。濰柴英致G5整個內飾的配色以及氛圍營造的還是不錯,尤其是在夜晚的時候,科技感還是不錯的。

長安CX70

指導價:6.89-8.49萬

長安CX70也算是SUV中的一匹黑馬。它的長度為4680毫米、寬度1800毫米、高度1775毫米軸距也達到了2780毫米。這樣的尺寸算是一台標準的中型SUV的尺寸。和漢蘭達福特銳界這類的中型SUV相比它的尺寸還是屬於偏小,但是硬朗的外觀設計以及類似於福特探險者的側面的造型風格。還是給這台車營造了一種很大的感覺。

它的內飾和外觀一樣也是屬於比較中規中矩的感覺。內飾上的一個亮點就在於它的中央的控制區同樣使用了大屏幕的觸控設計。不同的是它真正屬於液晶显示的區域比較小。只是一些實體按鈕用觸控按鈕取代,

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

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

類似於本田的處理的方式小編是不太喜歡的。在儀錶盤上它主要注重於清晰,巨大的速度显示儀錶盤在使用上十分的便利,儀錶中心區域的信息显示屏也足夠實用。

東風風光580

指導價:7.29-9.99萬

風光580也是一台我們非常熟悉的中型SUV。它的長度為4680毫米寬度為1845毫米,高度為1715毫米。軸距同樣達到了2780毫米。和上面兩位选手奇怪的外形比例相比這颱風光580的外觀看上去就要勻稱圓滑很多。也更加像一台標準的SUV車型。不過售價也隨之水漲船高,它的起售價為7.29萬,相比上面兩個选手就要貴上一些了。動力上它使用了1.8升自然謝謝和1.5T渦輪增壓兩款發動機。1.8升自然吸氣發動機,最大馬力139馬力,扭矩尚未公布。1.5T發動機最大功率150馬力,最大扭矩220牛米。推動重量在1.5噸左右的風光580動力只能算夠用。

內飾上東風風光580同樣的採用了巨大的中控屏,但是它的整個內飾顯得更加的寬,也更加有大車感。和上面兩個选手相比車內的感覺上要好很多。儀錶盤的造型比較的質樸,但是也能夠显示非常多的信息。算是一個實用性比較強但是顏值一般的儀錶盤吧。

上面這三款中型SUV他們的最低起售價不到7萬,但是卻能夠獲得一個大尺寸大車身以及大空間。這麼一台非常實惠的SUV車型。因此這些車型也是值得去看一看的,當然如果在這三款車型中要小編排出一個推薦指數的話,我首先會推薦長安CX70,其次風光580,最後濰柴英致G5小編是不怎麼推薦,列出來供大家參考。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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

新一波蝗災蠢蠢欲動 烏干達將派遣軍隊夜襲殲滅蟲群_網頁設計公司

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

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

摘錄自2020年4月20日自由時報報導

東非日前遭到蝗災肆虐損失慘重,近日新一波蝗蟲有蠢蠢欲動,烏干達總統穆塞維尼(Yoweri Museveni)宣布將派出軍隊夜襲蝗蟲撲殺。

綜合外媒報導,在當地時間19日烏干達總統穆塞維尼發表全國談話,除了談及武漢肺炎(COVID-19)疫情外,也提到蝗蟲的潛在威脅,他表示肯亞近日孵化的沙漠蝗蟲開始入侵,國際機構雖然贈與噴灑除蟲藥的飛機,但除蟲藥尚未收到,為了即早撲滅蝗災,將派遣軍隊殲滅蝗蟲。

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

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

目前境內北部和東部地區已記錄到了九群蝗蟲族群,烏干達將派遣超過2000名士兵前往撲滅蝗蟲,由於夜晚的露水沾濕蝗蟲翅膀令其無法飛行,烏干達總統表示,將利用蝗蟲無法飛行的夜晚進行撲殺。

永續發展
土地水文
土地利用
國際新聞
烏干達
蝗災
災害
糧食
貧窮

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

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

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

Kensington StudioDock 想角逐蘋果生態系最強 iPad 螢幕立架的地位_網頁設計公司

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

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

iPad 若是想要真正成為「Pro」,一個好的外接配件組合絕對能帶你上天堂是需要考慮的選項。現在,Kensington 準備要用完整考量幾乎所有 iPad 可能外接與螢幕支架使用需求的 StudioDock,希望讓你的 iPad 成為能夠與 Mac 生產力匹敵的超強工具。繼續閱讀 Kensington StudioDock 想角逐蘋果生態系最強 iPad 螢幕立架的地位報導內文。

▲圖片來源:Kensington

Kensington StudioDock 想角逐蘋果生態系最強 iPad 螢幕立架的地位

你對於 iPad 生產力配件的需求有哪些?HDMI 外接螢幕?USB 轉接?3.5mm 耳機孔?UHS-II SD 讀卡機?有線網路孔?能為 iPad 充電的支架,同時又希望可以為 iPhone、AirPods 甚至再加一個 Apple Watch 也都要同時充電?以上這些,不再只是筆電鎖代名詞的 Kensington 所帶來的 StudioDock iPad 支架都能一 Dock 包辦(太強了吧!)。

Kensington 在今年的 CES 端出了這款讓搭載 USB-C 的 iPad Pro 與 iPad Air(具體的說是 2018 年以後的 iPad Pro 11 吋 / 12.9 吋,還有 iPad Air 4),都可以在裝上 StudioDock 的鋁金屬螢幕支架後,成為猶如 Apple Pro Display XDR 那樣滿滿 I/O 連接埠配置的裝置。

除了 StudioDock 後方與側面滿滿的轉接埠,支架的底座部分更可支援雙 Qi 無線充電的機能(最高 7.5W);可另外選購的 Apple Watch 無線充電座,則是可以在 iPad 的連接底座部分延伸提供。簡單的講,這就是一個可以讓你把全套蘋果產品都照顧得好好的強大產品。

做為支架,StudioDock 可以支援上下傾斜角度,並且能夠翻轉垂直 / 橫向擺放。所以無論你是想要外接鍵盤滑鼠使用,又或者是想要當做 Apple Pencil 繪圖的立架,應該都可以勝任。

是說,這個目前看來應該是 iPad Pro / iPad Air 夢幻配件的 StudioDock,可惜價位還尚未提供,且還要等到 2021 年中才會開賣,所以各位可能都還得要再等等了(不過這樣一來新款 iPad 不也快出了嗎…)。

本篇圖片 / 引用來源

延伸閱讀:

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

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

更「普通」的綠牌換電車 PGO Ur2 Plus 正式推出,補助+優惠後不到 4 萬甜甜價

更未來的 Sony Vision-S 電動車細節解析

您也許會喜歡:

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

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

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

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

Apple 正在阻止 M1 Mac 設備用戶從非 APP Store 安裝應用程式_網頁設計公司

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

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

自從 Apple 推出 M1 晶片與配備該晶片的 Mac 設備,優異的效能與飛快的速度讓人印象深刻,可支援 iOS 應用程式的功能也讓人們開始試著在設備上安裝各種應用。現在 Apple 開始關閉用戶在 M1 Mac 上安裝並非來自 APP Store 的應用程式,像是許多人愛用的影音串流平台 Netflix 等。

Apple 正在阻止 M1 Mac 設備用戶從非 APP Store 安裝應用程式

M1 的特性就是能夠讓用戶在 Mac 設備上安裝 iOS 應用程式,雖說部分應用的開發者可能因為怕影響使用體驗等原因,當初的設定是不允許用戶在 Mac 上運行,但用戶還是可以利用 iMazing 等工具軟體來安裝使用原本無法支援的應用程式,包含 Netflix、Facebook、Instagram 等,不過接下來,這繞過機制的招式也將行不通了。

國外媒體 9to5Mac 現在已經證實,除非應用程式本身在 Mac 的 APP Store 終究開放下載使用,否則現在 Apple 已經將伺服器上的通道關掉,以阻止用戶繼續在 M1 Mac 上安裝。此更改將適用於運行 macOS Big Sur 11.1 的 M1 Mac 、macOS Big Sur 11.2 測試版與開發者版本,唯一的區別在於後者可以看到更具體的視窗通知內容(如下圖)。

長期以來 Mac 用戶已經習慣在 Mac 系統上擁有比 iOS 更高的自由度,儘管 Apple 多年來一直在收緊管理。規則的改變是從 APP Store 系統中進行,而該系統提供 Apple 管理作業系統DRM (數位版權管理)保護 API 一部分的 IPA 檔,因此未來不太可能會有解決方案出現,除非哪天 Apple 想開,或是原本鎖定的那些應用程式自行開放相容。

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

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

◎資料來源:The Verge、9to5Mac

您也許會喜歡:

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

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

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

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

因應疫情危機 英國石油公司傳將裁員15%_網頁設計公司

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

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

摘錄自2020年6月8日中央社報導

英國石油公司(BP)消息人士今天告訴路透社,英國石油公司計畫裁員約15%,以因應武漢肺炎(COVID-19)疫情危機。

路透社報導,這些消息人士指稱,英國石油公司執行長盧尼(Bernard Looney)並計畫讓公司轉型,從以石油和天然氣業務為主改成以再生能源為主,這次裁員是計畫中的一部分。

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

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

他們透露,盧尼在全球線上會議告訴員工,英國石油公司將從現今7萬100名員工中裁減1萬人,其中多數將在年底前遭到裁員。今年4月,英國石油公司才宣布削減今年25%的預算支出,因為疫情導致石油需求出現前所未見下滑。

生活環境
國際新聞
英國
武漢肺炎
疫情
石油公司
裁員
疫情看氣候與能源

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

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

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

POCO M3 正式在台發表:6000mAh 超大電量、4800 萬像素 AI 三鏡頭主相機、立體聲揚聲器,售價只要 3,999 元起_網頁設計公司

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

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

在 2018 年小米 POCO F1 在台灣市場推出後,以極致的性價比讓許多米粉相當期待,接下來 POCO 還會帶來哪些新機。隨著 2020 年 11 月 POCO 正式成為獨立品牌後,也終於在今(21)日稍早正式在台灣推出 POCO 品牌獨立後首款在台灣市場上市的智慧型手機「POCO M3」。

POCO M3 正式在台發表:6000mAh 超大電量、4800 萬像素 AI 三鏡頭主相機、立體聲揚聲器,售價只要 3,999 元起

台灣消費者許久未見到的 POCO 終於回來啦!今(21)日 POCO 終於推出品牌獨立後第一款產品「POCO M3」,狹帶著超越同價位的搭載 Qualcomm Snapdragon 662 行動平台、 6,000mAh 超大電量電池、 4800 萬像素 AI 三鏡頭主相機和立體聲揚聲器。外觀方面, POCO M3 在台灣推出「活力黃」、「冷酷藍」以及「動力黑」共三款配色。

 

開箱也幫大家準備好了,快來看看吧!(請點我)

螢幕方面, POCO M3 採用 6.53 吋 FHD+ (2340×1080)高解析度水滴全螢幕, 19.5:9 的螢幕比例與 90.34% 的高螢幕占比,提供更好的影音娛樂體驗。螢幕也通過德國萊因TÜV低藍光認證,即便長時間觀看手機也不易感到眼睛疲勞。螢幕採用康寧第三代大猩猩玻璃保護。

除了支援 AI 臉人臉解鎖,搭配結合側邊指紋辨識讓單手解鎖更加容易。

音效方面, POCO M3 內建立體聲雙喇叭和等效 0.76cc 的大音腔,擁有媲美旗艦機的高品質立體音效。

電量方面, POCO M3 配備 6,000mAh 高充電循環電池,擁有 24 天的超長待機時間;在聆聽音樂可使用連續約 8 天;觀看影片也能連續播放長達 17 小時,對於重度手機使用者更能滿足需求。 POCO M3 即便內建 6,000mAh 的超大電量電池,機身重量也控制在 198g 。
另外, POCO M3 支持最高18W快速充電,並標配 22.5W 快速充電器,提供高效的充電速度。此外, POCO M3 採用特製的高充電循環電池也更持久、耐用,高達 1,000 次電池循環充電次數,電池壽命在高溫環境相較其他手機提高 20% 。

相機部份, POCO M3 搭載 4800 萬像素 AI 三鏡頭主相機,包含 4800 萬像素 f/1.79 光圈主鏡頭、200 萬像素微距鏡頭以及 200 萬像素景深鏡頭的搭配,前置相機則為 800 萬像素自拍鏡頭。

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

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

銷售資訊

POCO M3 在台灣推出兩種規格選擇,售價分別為 4GB+64GB 版本建議售價 NT$3,999 、4GB+128GB 版本建議售價 NT$4,699 ,將於 1 月 22 日上午 10:00 起於 PChome24h 購物 POCO 品牌館獨家開賣。
首 2,000 名於 PChome24h 購物購買 POCO M3 並成功付款的消費者,將可獲贈「Redmi 行動電源 10000 標準版(價值 NT$345)」乙個(贈品數量有限,送完為止)。

POCO M3 直播專屬 NT$200 優惠碼:「YEAHPOCO」,可提前前往 PChome 24h 購物頁面完成登錄,使用名額有限、依完成結帳順序為準,用完為止(限量 500 名):點我前往

POCO Taiwan Facebook 粉絲專頁:點我前往
PChome2h 購物 POCO 品牌館:點我前往

開箱也幫大家準備好了,快來看看吧!(請點我)

POCO M3 開箱、評測|6000mAh 大電量超乎想像,極致性價比王者重返台灣市場

您也許會喜歡:

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

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

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

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

基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(二)_網頁設計公司

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

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

系列文章

  1. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用 abp cli 搭建項目
  2. 基於 abp vNext 和 .NET Core 開發博客項目 – 給項目瘦身,讓它跑起來
  3. 基於 abp vNext 和 .NET Core 開發博客項目 – 完善與美化,Swagger登場
  4. 基於 abp vNext 和 .NET Core 開發博客項目 – 數據訪問和代碼優先
  5. 基於 abp vNext 和 .NET Core 開發博客項目 – 自定義倉儲之增刪改查
  6. 基於 abp vNext 和 .NET Core 開發博客項目 – 統一規範API,包裝返回模型
  7. 基於 abp vNext 和 .NET Core 開發博客項目 – 再說Swagger,分組、描述、小綠鎖
  8. 基於 abp vNext 和 .NET Core 開發博客項目 – 接入GitHub,用JWT保護你的API
  9. 基於 abp vNext 和 .NET Core 開發博客項目 – 異常處理和日誌記錄
  10. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用Redis緩存數據
  11. 基於 abp vNext 和 .NET Core 開發博客項目 – 集成Hangfire實現定時任務處理
  12. 基於 abp vNext 和 .NET Core 開發博客項目 – 用AutoMapper搞定對象映射
  13. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(一)
  14. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(二)
  15. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(三)
  16. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(一)

上篇文章完成了兩個接口:文章列表頁、文章詳情頁,本篇繼續。

分類列表

分析:這裏多了一個統計文章數量的字段,可以直接新建一個模型QueryCategoryDto.cs繼承CategoryDto

//QueryCategoryDto.cs
namespace Meowv.Blog.Application.Contracts.Blog
{
    public class QueryCategoryDto : CategoryDto
    {
        /// <summary>
        /// 總數
        /// </summary>
        public int Count { get; set; }
    }
}

添加查詢分類列表接口和緩存接口。

//IBlogService.Category.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Blog
{
    public partial interface IBlogService
    {
        /// <summary>
        /// 查詢分類列表
        /// </summary>
        /// <returns></returns>
        Task<ServiceResult<IEnumerable<QueryCategoryDto>>> QueryCategoriesAsync();
    }
}
//IBlogCacheService.Category.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Caching.Blog
{
    public partial interface IBlogCacheService
    {
        /// <summary>
        /// 查詢分類列表
        /// </summary>
        /// <param name="factory"></param>
        /// <returns></returns>
        Task<ServiceResult<IEnumerable<QueryCategoryDto>>> QueryCategoriesAsync(Func<Task<ServiceResult<IEnumerable<QueryCategoryDto>>>> factory);
    }
}

分別實現這兩個接口。

//BlogCacheService.Category.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Meowv.Blog.Domain.Shared.MeowvBlogConsts;

namespace Meowv.Blog.Application.Caching.Blog.Impl
{
    public partial class BlogCacheService
    {
        private const string KEY_QueryCategories = "Blog:Category:QueryCategories";

        /// <summary>
        /// 查詢分類列表
        /// </summary>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task<ServiceResult<IEnumerable<QueryCategoryDto>>> QueryCategoriesAsync(Func<Task<ServiceResult<IEnumerable<QueryCategoryDto>>>> factory)
        {
            return await Cache.GetOrAddAsync(KEY_QueryCategories, factory, CacheStrategy.ONE_DAY);
        }
    }
}
//BlogService.Category.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Blog.Impl
{
    public partial class BlogService
    {
        /// <summary>
        /// 查詢分類列表
        /// </summary>
        /// <returns></returns>
        public async Task<ServiceResult<IEnumerable<QueryCategoryDto>>> QueryCategoriesAsync()
        {
            return await _blogCacheService.QueryCategoriesAsync(async () =>
            {
                var result = new ServiceResult<IEnumerable<QueryCategoryDto>>();

                var list = from category in await _categoryRepository.GetListAsync()
                           join posts in await _postRepository.GetListAsync()
                           on category.Id equals posts.CategoryId
                           group category by new
                           {
                               category.CategoryName,
                               category.DisplayName
                           } into g
                           select new QueryCategoryDto
                           {
                               CategoryName = g.Key.CategoryName,
                               DisplayName = g.Key.DisplayName,
                               Count = g.Count()
                           };

                result.IsSuccess(list);
                return result;
            });
        }
    }
}

緩存就不說了,查詢分類列表,聯合查詢文章和分類兩張表,關聯字段為CategoryId,然後分組,計算出對應的數量,在BlogController中添加API。

/// <summary>
/// 查詢分類列表
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("categories")]
public async Task<ServiceResult<IEnumerable<QueryCategoryDto>>> QueryCategoriesAsync()
{
    return await _blogService.QueryCategoriesAsync();
}

標籤列表

分析:和分類列表差不多,新建模型QueryTagDto.cs繼承TagDto

//QueryTagDto.cs
namespace Meowv.Blog.Application.Contracts.Blog
{
    public class QueryTagDto : TagDto
    {
        /// <summary>
        /// 總數
        /// </summary>
        public int Count { get; set; }
    }
}

添加查詢標籤列表接口和緩存接口。

//IBlogCacheService.Tag.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Caching.Blog
{
    public partial interface IBlogCacheService
    {
        /// <summary>
        /// 查詢標籤列表
        /// </summary>
        /// <param name="factory"></param>
        /// <returns></returns>
        Task<ServiceResult<IEnumerable<QueryTagDto>>> QueryTagsAsync(Func<Task<ServiceResult<IEnumerable<QueryTagDto>>>> factory);
    }
}
//IBlogService.Tag.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Blog
{
    public partial interface IBlogService
    {
        /// <summary>
        /// 查詢標籤列表
        /// </summary>
        /// <returns></returns>
        Task<ServiceResult<IEnumerable<QueryTagDto>>> QueryTagsAsync();
    }
}

分別實現這兩個接口。

//BlogCacheService.Tag.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Meowv.Blog.Domain.Shared.MeowvBlogConsts;

namespace Meowv.Blog.Application.Caching.Blog.Impl
{
    public partial class BlogCacheService
    {
        private const string KEY_QueryTags = "Blog:Tag:QueryTags";

        /// <summary>
        /// 查詢標籤列表
        /// </summary>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task<ServiceResult<IEnumerable<QueryTagDto>>> QueryTagsAsync(Func<Task<ServiceResult<IEnumerable<QueryTagDto>>>> factory)
        {
            return await Cache.GetOrAddAsync(KEY_QueryTags, factory, CacheStrategy.ONE_DAY);
        }
    }
}
//BlogService.Tag.cs
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.ToolKits.Base;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Meowv.Blog.Application.Blog.Impl
{
    public partial class BlogService
    {
        /// <summary>
        /// 查詢標籤列表
        /// </summary>
        /// <returns></returns>
        public async Task<ServiceResult<IEnumerable<QueryTagDto>>> QueryTagsAsync()
        {
            return await _blogCacheService.QueryTagsAsync(async () =>
            {
                var result = new ServiceResult<IEnumerable<QueryTagDto>>();

                var list = from tags in await _tagRepository.GetListAsync()
                           join post_tags in await _postTagRepository.GetListAsync()
                           on tags.Id equals post_tags.TagId
                           group tags by new
                           {
                               tags.TagName,
                               tags.DisplayName
                           } into g
                           select new QueryTagDto
                           {
                               TagName = g.Key.TagName,
                               DisplayName = g.Key.DisplayName,
                               Count = g.Count()
                           };

                result.IsSuccess(list);
                return result;
            });
        }
    }
}

查詢標籤列表需要聯合查詢tags和post_tags,根據TagId進行關聯,然後分組從而獲取標籤下文章的總數,在BlogController中添加API。

/// <summary>
/// 查詢標籤列表
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("tags")]
public async Task<ServiceResult<IEnumerable<QueryTagDto>>> QueryTagsAsync()
{
    return await _blogService.QueryTagsAsync();
}

分類名稱&文章列表

分析:此頁面下包含兩個接口,查詢分類的名稱和當前分類下的文章列表,和文章列表不同的是,它不帶分頁。分類包含兩個字段,分類名稱和展示名稱,我們要把真正的名稱查詢出來展示在頁面上。

分類名稱

不需要給他添加返回模型,直接返回一個string類型即可,同時給一個查詢參數name,添加獲取分類名稱接口和緩存接口。

//IBlogService.Category.cs
/// <summary>
/// 獲取分類名稱
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
Task<ServiceResult<string>> GetCategoryAsync(string name);
//IBlogCacheService.Category.cs
/// <summary>
/// 獲取分類名稱
/// </summary>
/// <param name="name"></param>
/// <param name="factory"></param>
/// <returns></returns>
Task<ServiceResult<string>> GetCategoryAsync(string name, Func<Task<ServiceResult<string>>> factory);

實現這兩個接口。

//BlogCacheService.Category.cs
...
    public partial class BlogCacheService
    {
        private const string KEY_GetCategory = "Blog:Category:GetCategory-{0}";

        /// <summary>
        /// 獲取分類名稱
        /// </summary>
        /// <param name="name"></param>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task<ServiceResult<string>> GetCategoryAsync(string name, Func<Task<ServiceResult<string>>> factory)
        {
            return await Cache.GetOrAddAsync(KEY_GetCategory.FormatWith(name), factory, CacheStrategy.ONE_DAY);
        }
    }
...
//BlogService.Category.cs
/// <summary>
/// 獲取分類名稱
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public async Task<ServiceResult<string>> GetCategoryAsync(string name)
{
    return await _blogCacheService.GetCategoryAsync(name, async () =>
    {
        var result = new ServiceResult<string>();

        var category = await _categoryRepository.FindAsync(x => x.DisplayName.Equals(name));
        if (null == category)
        {
            result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith("分類", name));
            return result;
        }

        result.IsSuccess(category.CategoryName);
        return result;
    });
}

FormatWith()是擴展方法,ResponseText.WHAT_NOT_EXIST是之前說過的常量,直接查詢是否存在當前name的分類,如果不存在給出錯誤提示,存在的話,則只返回分類名稱,在BlogController中添加API。

/// <summary>
/// 獲取分類名稱
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[HttpGet]
[Route("category")]
public async Task<ServiceResult<string>> GetCategoryAsync(([Required] string name)
{
    return await _blogService.GetCategoryAsync(name);
}

[Required]Attribute 指定參數name必填。

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

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

文章列表

通過分類名稱查詢文章列表和分頁查詢文章列表返回模型是一樣的,只是不用分頁,所以直接返回一個列表就可以了,添加通過分類名稱查詢文章列表和緩存的接口。

//IBlogService.Post.cs
/// <summary>
/// 通過分類名稱查詢文章列表
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByCategoryAsync(string name);
//IBlogCacheService.Post.cs
/// <summary>
/// 通過分類名稱查詢文章列表
/// </summary>
/// <param name="name"></param>
/// <param name="factory"></param>
/// <returns></returns>
Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByCategoryAsync(string name, Func<Task<ServiceResult<IEnumerable<QueryPostDto>>>> factory);

分別實現這兩個接口。

//BlogCacheService.Post.cs
...
    public partial class BlogCacheService
    {
        private const string KEY_QueryPostsByCategory = "Blog:Post:QueryPostsByCategory-{0}";

        /// <summary>
        /// 通過分類名稱查詢文章列表
        /// </summary>
        /// <param name="name"></param>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByCategoryAsync(string name, Func<Task<ServiceResult<IEnumerable<QueryPostDto>>>> factory)
        {
            return await Cache.GetOrAddAsync(KEY_QueryPostsByCategory.FormatWith(name), factory, CacheStrategy.ONE_DAY);
        }
    }
...
//BlogService.Post.cs
/// <summary>
/// 通過分類名稱查詢文章列表
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public async Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByCategoryAsync(string name)
{
    return await _blogCacheService.QueryPostsByCategoryAsync(name, async () =>
    {
        var result = new ServiceResult<IEnumerable<QueryPostDto>>();

        var list = (from posts in await _postRepository.GetListAsync()
                    join categories in await _categoryRepository.GetListAsync()
                    on posts.CategoryId equals categories.Id
                    where categories.DisplayName.Equals(name)
                    orderby posts.CreationTime descending
                    select new PostBriefDto
                    {
                        Title = posts.Title,
                        Url = posts.Url,
                        Year = posts.CreationTime.Year,
                        CreationTime = posts.CreationTime.TryToDateTime()
                    })
                   .GroupBy(x => x.Year)
                   .Select(x => new QueryPostDto
                   {
                       Year = x.Key,
                       Posts = x.ToList()
                   });

        result.IsSuccess(list);
        return result;
    });
}

這個邏輯和分頁查詢文章列表是差不多的,聯合查詢文章表和分類表,關聯字段為CategoryId,指定查詢條件categories.DisplayName==name,以CreationTime倒序排序,年份分組,篩選出所需字段返回,在BlogController中添加API。

/// <summary>
/// 通過分類名稱查詢文章列表
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[HttpGet]
[Route("posts/category")]
public async Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByCategoryAsync([Required] string name)
{
    return await _blogService.QueryPostsByCategoryAsync(name);
}

標籤名稱&文章列表

分析:此頁面和分類頁一樣,包含兩個接口,查詢標籤的名稱和當前標籤下的文章列表。

標籤名稱

添加獲取標籤名稱接口和緩存接口,GetTagAsync()

//IBlogService.Tag.cs
/// <summary>
/// 獲取標籤名稱
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
Task<ServiceResult<string>> GetTagAsync(string name);
//IBlogCacheService.Tag.cs
/// <summary>
/// 獲取標籤名稱
/// </summary>
/// <param name="name"></param>
/// <param name="factory"></param>
/// <returns></returns>
Task<ServiceResult<string>> GetTagAsync(string name, Func<Task<ServiceResult<string>>> factory);

實現這兩個接口。

//BlogCacheService.Tag.cs
...
    public partial class BlogCacheService
    {
        private const string KEY_GetTag = "Blog:Tag:GetTag-{0}";

        /// <summary>
        /// 獲取標籤名稱
        /// </summary>
        /// <param name="name"></param>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task<ServiceResult<string>> GetTagAsync(string name, Func<Task<ServiceResult<string>>> factory)
        {
            return await Cache.GetOrAddAsync(KEY_GetTag.FormatWith(name), factory, CacheStrategy.ONE_DAY);
        }
    }
...
//BlogService.Tag.cs
/// <summary>
/// 獲取標籤名稱
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public async Task<ServiceResult<string>> GetTagAsync(string name)
{
    return await _blogCacheService.GetTagAsync(name, async () =>
    {
        var result = new ServiceResult<string>();

        var tag = await _tagRepository.FindAsync(x => x.DisplayName.Equals(name));
        if (null == tag)
        {
            result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith("標籤", name));
            return result;
        }

        result.IsSuccess(tag.TagName);
        return result;
    });
}

FormatWith()是擴展方法,ResponseText.WHAT_NOT_EXIST是之前說過的常量,直接查詢是否存在當前name的分類,如果不存在給出錯誤提示,存在的話,則只返回分類名稱,在BlogController中添加API。

/// <summary>
/// 獲取標籤名稱
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[HttpGet]
[Route("tag")]
public async Task<ServiceResult<string>> GetTagAsync(string name)
{
    return await _blogService.GetTagAsync(name);
}

[Required]Attribute 指定參數name必填。

文章列表

和上面一模一樣的,添加通過標籤名稱查詢文章列表接口和緩存接口。

//IBlogService.Post.cs
/// <summary>
/// 通過標籤名稱查詢文章列表
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByTagAsync(string name);
//IBlogCacheService.Post.cs
/// <summary>
/// 通過標籤名稱查詢文章列表
/// </summary>
/// <param name="name"></param>
/// <param name="factory"></param>
/// <returns></returns>
Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByTagAsync(string name, Func<Task<ServiceResult<IEnumerable<QueryPostDto>>>> factory);

分別實現這兩個接口。

//BlogCacheService.Post.cs
...
    public partial class BlogCacheService
    {
        private const string KEY_QueryPostsByTag = "Blog:Post:QueryPostsByTag-{0}";

        /// <summary>
        /// 通過標籤名稱查詢文章列表
        /// </summary>
        /// <param name="name"></param>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByTagAsync(string name, Func<Task<ServiceResult<IEnumerable<QueryPostDto>>>> factory)
        {
            return await Cache.GetOrAddAsync(KEY_QueryPostsByTag.FormatWith(name), factory, CacheStrategy.ONE_DAY);
        }
    }
...
//BlogService.Post.cs
/// <summary>
/// 通過標籤名稱查詢文章列表
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public async Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByTagAsync(string name)
{
    return await _blogCacheService.QueryPostsByTagAsync(name, async () =>
    {
        var result = new ServiceResult<IEnumerable<QueryPostDto>>();

        var list = (from post_tags in await _postTagRepository.GetListAsync()
                    join tags in await _tagRepository.GetListAsync()
                    on post_tags.TagId equals tags.Id
                    join posts in await _postRepository.GetListAsync()
                    on post_tags.PostId equals posts.Id
                    where tags.DisplayName.Equals(name)
                    orderby posts.CreationTime descending
                    select new PostBriefDto
                    {
                        Title = posts.Title,
                        Url = posts.Url,
                        Year = posts.CreationTime.Year,
                        CreationTime = posts.CreationTime.TryToDateTime()
                    })
                    .GroupBy(x => x.Year)
                    .Select(x => new QueryPostDto
                    {
                        Year = x.Key,
                        Posts = x.ToList()
                    });

        result.IsSuccess(list);
        return result;
    });
}

這個查詢有點特殊,聯合查詢了3張表,先查post_tags和tags,關聯字段TagId,再根據PostId查詢posts,指定查詢條件tags.DisplayName==name,以CreationTime倒序排序,年份分組,篩選出所需字段返回,在BlogController中添加API。

/// <summary>
/// 通過標籤名稱查詢文章列表
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[HttpGet]
[Route("posts/tag")]
public async Task<ServiceResult<IEnumerable<QueryPostDto>>> QueryPostsByTagAsync(string name)
{
    return await _blogService.QueryPostsByTagAsync(name);
}

至此,基本上完成了博客前端所需的所有查詢接口,就還剩下友鏈的查詢,大家可以自己完成,後面如果需要什麼新的接口再回頭來寫就好了。

開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

搭配下方課程學習更佳 ↓ ↓ ↓

http://gk.link/a/10iQ7

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

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

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