




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于HDFS的數(shù)據(jù)集存儲系統(tǒng)的分布式信息資源共享平臺的設(shè)計(jì)與實(shí)現(xiàn)摘要信息技術(shù)的發(fā)展經(jīng)歷過3次浪潮——第一次浪潮以計(jì)算技術(shù)為中心,以處理器發(fā)展為核心動力,推動了計(jì)算機(jī)的迅速普及和應(yīng)用。第二次浪潮以傳輸技術(shù)為中心,促進(jìn)了計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展和普及。這兩次浪潮加速了信息進(jìn)程,導(dǎo)致數(shù)字化信息爆炸性增長,進(jìn)而引發(fā)了以存儲技術(shù)為核心的第三次浪潮。互聯(lián)網(wǎng)的核心精神即為共享,現(xiàn)今越來越多的人類信息活動轉(zhuǎn)變成數(shù)據(jù)形式,生活辦公與信息共享密不可分。本文圍繞基于HDFS的數(shù)據(jù)集存儲系統(tǒng),闡述一個(gè)高效安全的分布式信息資源共享平臺的設(shè)計(jì)與實(shí)現(xiàn)。平臺分為資源發(fā)布、資源管理、用戶交流、資源共享、運(yùn)維監(jiān)控、資源容災(zāi)六大模塊,結(jié)合六大模塊,打造一個(gè)高容災(zāi)、高吞吐、可監(jiān)控的資源共享平臺。結(jié)合所學(xué),決定使用IDEA為集成開發(fā)環(huán)境,利用SpringBoot+Mybatis框架實(shí)現(xiàn)資源展示節(jié)點(diǎn)的Web站點(diǎn)搭建,使用MySQL為該Web站點(diǎn)的數(shù)據(jù)庫,Redis作為緩存,圖床服務(wù)器使用的是ImgUrl。緩存數(shù)據(jù)節(jié)點(diǎn)的資源管理及傳輸系統(tǒng)則采用Docker容器的部署模式,便于后期資源較多時(shí)進(jìn)行擴(kuò)展。資源持容災(zāi)和持久化采用是HadoopHA(高可用)集群。最后,項(xiàng)目的監(jiān)控運(yùn)維采用的是主流的Zabbix+Grafana。項(xiàng)目采用分布式部署,且分別搭建了生產(chǎn)環(huán)境和測試環(huán)境,提高了整個(gè)項(xiàng)目的質(zhì)量水平。關(guān)鍵詞:資源共享;SpringBoot;Mybatis;HDFS目錄TOC\o"1-3"\h\u23749摘要 V第1章緒論1.1開發(fā)背景與現(xiàn)狀當(dāng)今數(shù)據(jù)量級的指數(shù)增長,大數(shù)據(jù)時(shí)代就此到來,傳統(tǒng)的存儲方式——如“RAID陣列”、“多路徑”,已經(jīng)無法滿足當(dāng)代信息發(fā)展需求。HadoopHDFS就是針對該需求的相對最優(yōu)解,國內(nèi)主流的存儲平臺無一不是Hadoop技術(shù)棧的奉獻(xiàn)者,用行動證明了HDFS的優(yōu)秀。在這個(gè)信息高速發(fā)展的時(shí)期,常見的爬蟲工程,一次爬取的數(shù)據(jù)很容易達(dá)到數(shù)個(gè)TB,各個(gè)單位和公司的數(shù)據(jù)也在高速增長,且數(shù)據(jù)的共享也成為了一大難題。目前主流的公有云平臺,例如百度網(wǎng)盤等,其傳輸效率一直受到公眾的詬病,部分銀行等涉密單位或企業(yè)的數(shù)據(jù),更不可能通過公有云進(jìn)行傳輸共享,這就引出了私有云的必要性。絕大多數(shù)的組織單位內(nèi)的數(shù)據(jù)共享,還在通過Windows的網(wǎng)絡(luò)共享進(jìn)行,這種方式的共享,不僅需要數(shù)據(jù)擁有者保持在線狀態(tài),傳輸速率也受到單用戶的物理線路的限制,在并發(fā)狀況下,速率還達(dá)不到百度網(wǎng)盤的速率,且對數(shù)據(jù)擁有者的個(gè)人電腦的整機(jī)運(yùn)行速率造成很大影響。如果能在組織單位的內(nèi)部署上HDFS為核心的數(shù)據(jù)共享平臺,以上的速率問題、并發(fā)訪問問題、數(shù)據(jù)安全性等,都可以迎刃而解,所以該共享平臺還擁有者較大的發(fā)展?jié)撃堋?.2開發(fā)設(shè)計(jì)的意義與傳統(tǒng)的存儲技術(shù)相比,HDFS擁有成本低廉的特點(diǎn),例如傳統(tǒng)的“RAID”技術(shù),如果要達(dá)到多硬盤的池化,其最大空間必將受到服務(wù)器硬盤接口數(shù)量的限制,若要提高容量,不得不購置價(jià)格昂貴的多接口服務(wù)器,而HDFS可以將多臺服務(wù)的硬盤資源進(jìn)行池化,打破了單機(jī)硬盤接口的限制。除了成本低廉,HDFS還擁有傳統(tǒng)存儲技術(shù)難以達(dá)到的容災(zāi)性,它將文件分布式的存儲在多臺服務(wù)器上,即使部分服務(wù)器(具體數(shù)量可由開發(fā)者配置)出現(xiàn)宕機(jī),數(shù)據(jù)完整性也不會受到影響。第2章系統(tǒng)開發(fā)環(huán)境2.1開發(fā)工具IntelliJIDEAIntelliJIDEA是目前主流的Java集成開發(fā)環(huán)境。且在業(yè)界廣受好評,它支持多項(xiàng)如代碼提示、Rebuild、版本工具、JUnit、代碼分析等實(shí)用功能。友好的GUI設(shè)計(jì)等讓它廣受開發(fā)者的喜愛[1]。其中可整合Maven、Git等工具,讓開發(fā)效率大大提高。2.2數(shù)據(jù)庫MySQL2.2.1MySQL概述MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),是一個(gè)廣受歡迎的開源項(xiàng)目,現(xiàn)被甲骨文公司收購,但甲骨文公司向開發(fā)者保證仍會繼續(xù)開源。MySQL的輕量級以及它部署簡單等特點(diǎn),已經(jīng)使其成為Web應(yīng)用開發(fā)者們的首選數(shù)據(jù)庫。綜上,本系統(tǒng)將采用MySQL作為數(shù)據(jù)庫[2]。2.2.2MySQL的應(yīng)用與其他的大型數(shù)據(jù)庫相比,MySQL自有它的不足之處,如規(guī)模小、功能有限等,但對于本項(xiàng)目來說,MySQL的性能已經(jīng)完全能夠滿足,且因?yàn)镸ySQL是開源項(xiàng)目,可以節(jié)省相關(guān)成本[3]。2.3Redis2.3.1Redis概述Redis是一種Key-Value類型的內(nèi)存數(shù)據(jù)庫產(chǎn)品,全名為遠(yuǎn)程字典服務(wù)(REmoteDIctionaryServer),與Memcache相似,Redis支持更多的數(shù)據(jù)類型,所以使用Redis的開發(fā)者和項(xiàng)目數(shù)量逐漸增多[4]。Redis數(shù)據(jù)都是緩存在內(nèi)存中,但與Memcache相比,Redis適用的場景更多,可以直接與本項(xiàng)目中的MySQL數(shù)據(jù)庫銜接,減少其壓力。2.3.1Redis特性Redis與Memcaehed有許多相似指出,可以替代Memcaehed,但同時(shí),它又具有Memcaehed不具備的功能——如支持多種數(shù)據(jù)結(jié)構(gòu)、支持簡單事務(wù)控制、支持持久化、支持主從復(fù)制、VirtualMemory功能等。2.4圖床2.4.1圖床概述圖床是針對海量圖片給網(wǎng)站帶來的訪問速度下降、性能壓力增大和I/O瓶頸等問題,提出一種海量圖片的分布式存儲及負(fù)載均衡技術(shù)。通過分布式技術(shù),將圖片放置與Web服務(wù)器不同的服務(wù)器節(jié)點(diǎn),甚至多個(gè)節(jié)點(diǎn),讓W(xué)eb服務(wù)器的功能更單一,整個(gè)體系耦合性更低。近年來,圖床在各個(gè)知名站點(diǎn)的大規(guī)模普及證明了它的存在意義與價(jià)值[5]。2.4.2ImgUrl圖床ImgURL誕生于2017年12月,是一款開源的圖片管理系統(tǒng)(簡稱圖床),使用PHP+SQLite3開發(fā),可以自行部署,也可使用/提供的在線服務(wù),本項(xiàng)目采取了自行部署的方式。ImgUrl的主要功能有:圖片上傳與預(yù)覽URL上傳/Ctrl+V粘貼上傳圖片查看器、圖片管理圖片自動裁剪圖片壓縮圖片智能鑒黃外部存儲API支持2.5Docker容器技術(shù)是一種輕量級的虛擬化技術(shù),Docker技術(shù)是基于容器技術(shù)的一種實(shí)現(xiàn)。容器的思想就是把單獨(dú)的進(jìn)程進(jìn)行封裝,在不影響系統(tǒng)內(nèi)的程序的情況下運(yùn)行。這樣就能使同一操作系統(tǒng)內(nèi)的多個(gè)進(jìn)程之間不會出現(xiàn)“資源鎖”、“臟數(shù)據(jù)”、“死鎖”等常見的問題[6]。且Docker為開源產(chǎn)品,使得利用Docker部署項(xiàng)目的各類組織、企業(yè)與個(gè)人開發(fā)者等不斷增加。2.6HadoopHDFS2.6.1HDFS概述HDFS是Apache基金會Hadoop項(xiàng)目中的一個(gè)子項(xiàng)目,HDFS最早是根據(jù)GFS(GoogleFileSystem)的論文概念模型來設(shè)計(jì)實(shí)現(xiàn)的。Hadoop已經(jīng)被Yahoo!和IBM等公司用于各自云存儲和云計(jì)算的體系架構(gòu)當(dāng)中。IBM也使用了HDFS的易擴(kuò)展性和MapReduce的并行性推出了藍(lán)云計(jì)劃,架構(gòu)一個(gè)分布式的、可全球訪問的系統(tǒng)——在提供高可靠性和高性能的服務(wù)的同時(shí),頁極大的減少了中小企業(yè)的成本,進(jìn)而讓更多的開發(fā)者和企業(yè)提高整體技術(shù)水平[7]。2.6.2HDFS特性HDFS是指被設(shè)計(jì)成適合運(yùn)行在通用硬件(commodityhardware)上的分布式文件系統(tǒng)(DistributedFileSystem)。它和現(xiàn)有的分布式文件系統(tǒng)有很多共同點(diǎn)。但同時(shí),它和其他的分布式文件系統(tǒng)的區(qū)別也是很明顯的:HDFS是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在廉價(jià)的機(jī)器上。HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。HDFS文件系統(tǒng)的搭建可以使用許多成本較低的廉價(jià)設(shè)備,因?yàn)镠DFS的設(shè)計(jì)之初,就將組件失效認(rèn)為是一種常態(tài)。所以它必須時(shí)刻檢查整個(gè)集群的狀態(tài),以達(dá)到能夠不間斷檢測、冗余并恢復(fù)失效的組件[8]。2.7Zabbix&Grafana隨著云計(jì)算技術(shù)的發(fā)展應(yīng)用,軟硬件系統(tǒng)高度集中與各類數(shù)據(jù)中心,系統(tǒng)運(yùn)維壓力大。若僅僅依靠運(yùn)維人員傳統(tǒng)方式進(jìn)行運(yùn)營維護(hù),極為不現(xiàn)實(shí),所以各類資源監(jiān)控系統(tǒng)逐漸走進(jìn)了各個(gè)互聯(lián)網(wǎng)企業(yè),輔助運(yùn)維。而開源的Zabbix監(jiān)控系統(tǒng)因功能強(qiáng)、易用得到了廣泛應(yīng)用[9]。Zabbix是一個(gè)基于web界面的企業(yè)級開源監(jiān)控系統(tǒng),可以對主機(jī)設(shè)備性能進(jìn)行監(jiān)控,網(wǎng)絡(luò)設(shè)備性能監(jiān)控,數(shù)據(jù)庫性能監(jiān)控,不僅支持Web站點(diǎn)內(nèi)進(jìn)行告警,還支持微信通知的接入,使運(yùn)維人員不必實(shí)時(shí)緊盯屏幕。Zabbix的監(jiān)測對象很廣泛,可以不同操作系統(tǒng)的服務(wù)器,也可以是路由器、交換機(jī)等網(wǎng)絡(luò)設(shè)備,通過SNMP、ZabbixAgent、PING、端口監(jiān)視等方法提供對遠(yuǎn)程網(wǎng)絡(luò)服務(wù)器等監(jiān)控、數(shù)據(jù)收集等功能[9]。Zabbix是一款優(yōu)秀的監(jiān)控工具,但它的美觀性和功能性還是比較欠缺,且僅支持單機(jī)指標(biāo)的監(jiān)控視圖,缺少統(tǒng)計(jì)視圖的支持?;诖?,本項(xiàng)目還引入了視圖更友好、美觀性更高、功能性更強(qiáng)的Grafana[10]。系統(tǒng)需求分析3.1功能需求人們在信息活動中不斷地產(chǎn)生數(shù)字化信息,各種新型應(yīng)用也層出不窮,據(jù)UCBerkley2001年公布的數(shù)據(jù)顯示,未來3年內(nèi)所產(chǎn)生的數(shù)據(jù)將超過過去4萬年中產(chǎn)生數(shù)據(jù)的總和,而且93%的新生成的信息以數(shù)字形式存在[11]。各類活動的開展——學(xué)習(xí)、辦公等活動的開展,越來越依賴于數(shù)字資源,但現(xiàn)今的數(shù)字資源的存儲以及共享方式還尚不完善。例如在校學(xué)習(xí)期間,老師需要共享一個(gè)較大的軟件安裝包,在以往,總是通過QQ群文件、百度網(wǎng)盤等傳輸方式,但QQ群文件的大小具有限制,且還會過期,而百度網(wǎng)盤的傳輸速度實(shí)在難以讓人滿意,以至于讓一個(gè)班五十多人使用U盤進(jìn)行復(fù)制。在各類教程的共享上,依靠大家的“口口相傳”,老師的言傳身教,效率實(shí)在不敬人意。該系統(tǒng)直擊以上缺點(diǎn),在校內(nèi)局域網(wǎng)環(huán)境下進(jìn)行搭建。穩(wěn)定的內(nèi)網(wǎng)環(huán)境使得可以高速的進(jìn)行數(shù)據(jù)共享,平臺不僅提供文件資源共享功能,還提供視頻資源的在線播放和相關(guān)圖文教程的共享,并且管理員可以選擇開放或者關(guān)閉用戶的評論交流。3.1.1基本功能需求系統(tǒng)主要面向校內(nèi)師生和管理員,圍繞這兩個(gè)角色進(jìn)行權(quán)限設(shè)計(jì),結(jié)合角色需求,提供實(shí)用可靠的操作。系統(tǒng)需要實(shí)現(xiàn)以下內(nèi)容:1.管理員需要輸入賬號、密碼才能登入系統(tǒng);2.管理員可以管理共享內(nèi)容相關(guān)信息;3.管理人員可以管理個(gè)人信息、內(nèi)容推薦、用戶評論留言信息、對共享資源進(jìn)行增刪改、系統(tǒng)狀態(tài)查看、系統(tǒng)管理等;4.用戶可以瀏覽管理員發(fā)布的內(nèi)容,下載平臺上共享的資源,以及提交對相關(guān)共享資源的留言與評價(jià)等操作。3.1.2功能模塊該資源共享系統(tǒng)主要包括資源發(fā)布、資源管理、用戶交流、資源共享、運(yùn)維監(jiān)控、資源容災(zāi)六大模塊,如圖1所示。圖SEQ圖\*ARABIC1資源共享平臺系統(tǒng)功能架構(gòu)3.2可行性分析3.2.1技術(shù)可行性資源共享平臺采用B/S結(jié)構(gòu),Web站點(diǎn)使用SpringBoot+Mybatis框架搭建,該搭建方式為目前主流且成熟的Web站點(diǎn)搭建方式。SpringBoot作為Spring項(xiàng)目組的微服務(wù)產(chǎn)品,正在大規(guī)模的占領(lǐng)軟件市場,其簡化的應(yīng)用開發(fā)搭建過程,使得開發(fā)人員從繁瑣的配置文件中解脫出來,大量的精力投入到項(xiàng)目邏輯研發(fā)當(dāng)中,故此選擇該技術(shù)框架進(jìn)行Web站點(diǎn)搭建[12]。而數(shù)據(jù)庫采用主流的MySQL開源數(shù)據(jù)庫,安裝便捷,使用方便。而數(shù)據(jù)庫緩存則采用Redis,為后期平臺用戶量劇增帶來的大量數(shù)據(jù)庫請求作鋪墊。共享資源的存儲和容災(zāi)則采用HadoopHA高可用集群,Hadoop為Apache基金會的開源項(xiàng)目,HDFS為其子項(xiàng)目之一,該數(shù)據(jù)存儲方案已經(jīng)被各大知名互聯(lián)網(wǎng)企業(yè)采用,本項(xiàng)目順勢而為。平臺的文件資源緩存則額外開發(fā)了一套精簡的文件管理系統(tǒng),采用Docker部署,從而提高用戶的下載速度,以及在降低平臺搭建成本同時(shí)保留其拓展性。運(yùn)維模塊采用了主流的Zabbix+Grafana,可實(shí)時(shí)監(jiān)控整個(gè)平臺的軟硬件狀態(tài)信息,并在達(dá)到自定義觸發(fā)器閾值時(shí)進(jìn)行告警。3.2.2經(jīng)濟(jì)可行性資源共享平臺在硬件搭建上采用了戴爾R720(CPU:E52670*2,RAM:4GB*8,磁盤:256GBSSD*5,網(wǎng)卡:10G光口全雙工)服務(wù)器共計(jì)4臺,交換機(jī)HPQuantaLB6M24口SFP(10G)一臺,萬兆光模塊與條線若干。在2021年該套硬件系統(tǒng)的成本不到其它新款同等性能硬件系統(tǒng)的十分之一。平臺軟件搭建,從設(shè)計(jì)到編碼實(shí)現(xiàn)均由本人完成,后期的升級與運(yùn)維工作可能需要在校的學(xué)弟學(xué)妹們共同參與。使用的集成開發(fā)環(huán)境以及技術(shù)框架均為教育版或社區(qū)版,不存在昂貴的各類授權(quán)費(fèi)用。3.2.3操作可行性校內(nèi)局域網(wǎng)環(huán)境較與公網(wǎng)環(huán)境,不僅穩(wěn)定,且聯(lián)通了校內(nèi)的每一間教室、宿舍、辦公室。本平臺將部署在校內(nèi)環(huán)境中,可無死角覆蓋整個(gè)校園,且現(xiàn)在的測試環(huán)境已經(jīng)開發(fā)部署完成,所以本平臺在操作上是可行的。3.2.4法律可行性資源平臺的集成開發(fā)環(huán)境為IDEA,已經(jīng)獲取其教育授權(quán),其它涉及技術(shù)如Hadoop、Redis等均為開源項(xiàng)目,所以在工具和引用的項(xiàng)目上,不存在侵權(quán)行為。而整個(gè)項(xiàng)目本身,從命題到實(shí)現(xiàn),再帶測試,都是本人在指導(dǎo)老師的指導(dǎo)下完成,沒有剽竊他人想法,所以整個(gè)項(xiàng)目不存在版權(quán)和其它相關(guān)問題。系統(tǒng)設(shè)計(jì)4.1數(shù)據(jù)庫設(shè)計(jì)資源平臺內(nèi)容發(fā)布與展示W(wǎng)eb站點(diǎn)的數(shù)據(jù)庫設(shè)計(jì)遵循數(shù)據(jù)庫設(shè)計(jì)的第一、二、三范式,還將結(jié)合需求分析,設(shè)計(jì)表的字段屬性。為便于項(xiàng)目的后期拓展和維護(hù),必須留足相應(yīng)的升級拓展空間。為滿足資源展示W(wǎng)eb站點(diǎn)的需要,共設(shè)計(jì)了用戶信息表(t_user)、評論表(t_comment)等九個(gè)表。而共享資源緩存管理系統(tǒng)則精簡的設(shè)計(jì)了文件信息表(file)、文件存儲信息表(resource)、文件切片信息表(resource_chunk)共三個(gè)表。4.1.1管理員信息表表SEQ表\*ARABIC1t_user表屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idbigint(20)TRUEFALSENOTnull登錄賬戶avatarvarchar(255)FALSEFALSEnull用戶頭像create_timedatetime(0)FALSEFALSEnull創(chuàng)建時(shí)間emailvarchar(255)FALSEFALSEnull電子郵件nicknamevarchar(255)FALSEFALSEnull用戶昵稱passwordvarchar(255)FALSEFALSEnull登錄密碼typeint(11)FALSEFALSEnull用戶角色update_timedatetime(0)FALSEFALSEnull修改時(shí)間usernamevarchar(255)FALSEFALSEnull用戶名稱4.1.2資源分類信息表表SEQ表\*ARABIC2t_type表屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idbigint(20)TRUEFALSENOTnull資源分類namevarchar(255)FALSEFALSENOTnull分類名稱4.1.3資源展示頁信息表表SEQ表\*ARABIC3t_blog表屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idbigint(20)TRUEFALSENOTnull頁面序號appreciationbit(1)FALSEFALSENOTnull開啟打賞commentabledbit(1)FALSEFALSENOTnull開啟評論contentlongtext(0)FALSEFALSEnull主要內(nèi)容create_timedatetime(0)FALSEFALSEnull創(chuàng)建時(shí)間descriptionvarchar(255)FALSEFALSEnull內(nèi)容描述first_picturevarchar(255)FALSEFALSEnull頁面首圖flagvarchar(255)FALSEFALSEnull資源標(biāo)簽publishedbit(1)FALSEFALSENOTnull是否發(fā)布recommendbit(1)FALSEFALSENOTnull是否推薦share_statementbit(1)FALSEFALSENOTnull分享說明titlevarchar(255)FALSEFALSEnull內(nèi)容標(biāo)題update_timedatetime(0)FALSEFALSEnull更新時(shí)間viewsint(11)FALSEFALSEnull瀏覽次數(shù)type_idbigint(20)FALSETRUEnull歸屬分類user_idbigint(20)FALSETRUEnull發(fā)表用戶4.1.4資源標(biāo)簽信息表表SEQ表\*ARABIC4t_tag屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idbigint(20)TRUEFALSENOTnull資源標(biāo)簽namevarchar(255)FALSEFALSENOTnull標(biāo)簽名稱4.1.5站點(diǎn)留言信息表表SEQ表\*ARABIC5t_message屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idbigint(20)TRUETRUENOTnull留言序號admin_messageint(11)FALSEFALSEnull管理員留言avatarvarchar(255)FALSEFALSEnull留言頭像contentlongtext(0)FALSEFALSEnull留言內(nèi)容create_timedatetime(0)FALSEFALSEnull留言時(shí)間emailvarchar(255)FALSEFALSEnull提醒郵箱nicknamevarchar(255)FALSEFALSEnull留言昵稱openidvarchar(255)FALSEFALSEnull顯示IDreply_informbit(1)FALSEFALSEnull是否回復(fù)parent_message_idbigint(20)FALSETRUEnull父消息項(xiàng)4.1.6資源展示頁評論信息表表SEQ表\*ARABIC6t_comment屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idbigint(20)TRUEFALSENOTnull評論序號admin_commentint(11)FALSEFALSEnull管理員評論avatarvarchar(255)FALSEFALSEnull評論頭像contentlongtext(0)FALSEFALSEnull評論內(nèi)容create_timedatetime(0)FALSEFALSEnull評論時(shí)間emailvarchar(j255)FALSEFALSEnull提醒郵箱nicknamevarchar(255)FALSEFALSEnull評論昵稱blog_idbigint(20)FALSETRUEnull評論歸屬parent_comment_idbigint(20)FALSETRUEnull父消息項(xiàng)4.1.7資源展示站點(diǎn)用戶GitHub登錄信息表表SEQ表\*ARABIC7t_githubuser屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idbigint(20)TRUEFALSENOTnull用戶序號avatarvarchar(255)FALSEFALSEnull用戶頭像cidvarchar(255)FALSEFALSEnull游客序號cipvarchar(255)FALSEFALSEnull注冊IPcnamevarchar(255)FALSEFALSEnull獲取GitHub昵稱created_timevarchar(255)FALSEFALSEnull創(chuàng)建時(shí)間github_idvarchar(255)FALSEFALSEnullGitHub賬號index_urlvarchar(255)FALSEFALSEnullGitHub個(gè)人頁login_timevarchar(255)FALSEFALSEnull登錄時(shí)間nicknamevarchar(255)FALSEFALSEnull用戶昵稱node_idvarchar(255)FALSEFALSEnull用戶標(biāo)識public_reposvarchar(255)FALSEFALSEnullGitHub返回值received_events_urlvarchar(255)FALSEFALSEnullGitHub返回地址subscriptionsvarchar(255)FALSEFALSEnullGitHub訂閱數(shù)updated_timevarchar(255)FALSEFALSEnull更新時(shí)間4.1.8資源所屬標(biāo)簽信息表表SEQ表\*ARABIC8t_blog_tags屬性名類型長度是否主鍵是否外鍵可否為空屬性說明blogs_idbigint(20)FALSETRUENOTnull資源展示頁IDtags_idbigint(20)FALSETRUENOTnull標(biāo)簽ID4.1.9資源展示站點(diǎn)用戶QQ登錄信息表表SEQ表\*ARABIC9t_qquser屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idBigint(20)TRUEFALSENOTnull用戶IDavatarvarchar(255)FALSEFALSEnull用戶頭像cipvarchar(255)FALSEFALSEnull注冊IPcnamevarchar(255)FALSEFALSEnull獲取QQ昵稱gendervarchar(255)FALSEFALSEnull性別logintimevarchar(255)FALSEFALSEnull登錄時(shí)間nicknamevarchar(255)FALSEFALSEnull用戶昵稱openidvarchar(255)FALSEFALSEnull展示IDyearvarchar(255)FALSEFALSEnullQ齡4.1.10緩存系統(tǒng)文件信息表表SEQ表\*ARABIC10file屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idin(11)TRUEFALSENOTnull文件序號file_namevarchar(100)FALSEFALSENOTnull文件名稱parent_idint(11)FALSEFALSENOTnull文件來源typevarchar(45)FALSEFALSENOTnull文件類型resource_idint(11)FALSEFALSEnull存儲序號create_timedatetime(0)FALSEFALSENOTnull上傳時(shí)間update_timedatetime(0)FALSEFALSENOTnull更新時(shí)間4.1.11緩存系統(tǒng)文件存儲信息表表SEQ表\*ARABIC11resource屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idint(11)TRUEFALSENOTnull存儲序號sizebigint(11)FALSEFALSENOTnull文件大小linkint(11)FALSEFALSENOTnull下載鏈接create_timedatetime(0)FALSEFALSENOTnull上傳時(shí)間update_timedatetime(0)FALSEFALSENOTnull更新時(shí)間pathvarchar(100)FALSEFALSENOTnull文件路徑4.1.12緩存系統(tǒng)文件切片信息表表SEQ表\*ARABIC12resource_chunk屬性名類型長度是否主鍵是否外鍵可否為空屬性說明idbigint(20)TRUEFLASENOTnull切片序號chunk_numberint(11)FLASEFLASENOTnull切片數(shù)量chunk_sizeint(11)FLASEFLASENOTnull切片大小current_chunk_sizeint(11)FLASEFLASENOTnull目前切片大小total_sizebigint(11)FLASEFLASENOTnull總空間大小identifiervarchar(100)FLASEFLASENOTnull切片標(biāo)識符filenamevarchar(100)FLASEFLASENOTnull文件名稱relative_pathvarchar(100)FLASEFLASENOTnull相對路徑total_chunksint(11)FLASEFLASENOTnull全部切片大小create_timedatetime(0)FLASEFLASENOTnull創(chuàng)建時(shí)間update_timedatetime(0)FLASEFLASENOTnull更新時(shí)間4.2系統(tǒng)架構(gòu)設(shè)計(jì)本系統(tǒng)采用分布式部署,將數(shù)據(jù)庫、Web站點(diǎn)、圖床、緩存服務(wù)器、HDFS集群、Redis等組件分別部署在不同的服務(wù)器節(jié)點(diǎn)上。分布式部署將極大的提高整個(gè)項(xiàng)目的可用性、拓展性,同時(shí)本系統(tǒng)還擁有測試環(huán)境和生產(chǎn)環(huán)境,提高了項(xiàng)目的容災(zāi)性。4.2.1Web站點(diǎn)前端頁面架構(gòu)站點(diǎn)采用前后端分離開發(fā)模式。將前端頁面所有文件存放在resources文件夾,子文件夾有static、css、fonts、img、js五個(gè)文件夾,存放CSS樣式、JS腳本、圖片等前端所需要的文件。前端文件分類如圖2所示。圖SEQ圖\*ARABIC2前端頁面架構(gòu)圖4.2.2Web站點(diǎn)后端代碼架構(gòu)站點(diǎn)的后端代碼分為Control層、Data層、Persistence層;分別放置在不同的目錄下。層次明了,方便在測試環(huán)節(jié)進(jìn)行各類測試。具體的后端代碼目錄如圖3所示。圖SEQ圖\*ARABIC3后端代碼目錄4.3功能模塊設(shè)計(jì)4.3.1資源展示站點(diǎn)管理員登錄用例基本流程:后臺管理登錄頁面輸入管理員的賬號信息登錄,并跳轉(zhuǎn)到管理后臺。分支流程:1.當(dāng)輸入的賬號信息不正確,密碼正確時(shí),會在頁面上報(bào)出賬號錯(cuò)誤;2.當(dāng)輸入的賬號信息正確,密碼不正確時(shí),會在頁面上報(bào)出密碼錯(cuò)誤;3.當(dāng)輸入賬號信息正確,密碼也正確,會進(jìn)入后臺管理員頁面。4.3.2資源展示站點(diǎn)資源展示用例基本流程:管理員可以對已發(fā)布的資源信息頁進(jìn)行管理,用戶可以查看和下載等操作。分支流程:1.管理員可以在管理頁面看到已發(fā)布的資源信息頁面;2.管理員可以對已發(fā)布的資源信息頁面進(jìn)行刪除;3.管理員可以編輯已發(fā)布的資源信息頁面。4.管理員可以對已發(fā)布的資源信息頁面進(jìn)行撤銷發(fā)布存為草稿操作;5.管理員可以對資源信息頁進(jìn)行分類操作;6.管理員可以對資源信息頁進(jìn)行添加標(biāo)簽操作;7.管理員可以新增資源信息頁;8.用戶可以查看資源信息頁面;9.用戶可以下載資源信息頁中的共享資源。4.3.3資源展示站點(diǎn)資源分類用例基本流程:管理員可以在后臺新建、刪除、修改分類。分支流程:1.管理員可以在后臺管理頁面中對已存在分類信息進(jìn)行修改;2.管理員可以在后臺管理頁面中對已存在分類信息進(jìn)行刪除;3.管理員可以在后臺管理頁面中對添加新的分類;4.管理員可以在后臺管理頁面中為文章修改分類。4.3.4資源展示站點(diǎn)用戶留言用例基本流程:用戶可以在站點(diǎn)的留言頁進(jìn)行留言操作。分支流程:1.用戶可以在留言頁發(fā)表自己的留言;2.用戶可以在留言時(shí)留下自己的郵箱用于回復(fù)提醒;3.用戶可以在留言時(shí)選擇是否需要留言被回復(fù)時(shí)的提醒;4.用戶可以在留言時(shí)可以自定義自己留言展示時(shí)的昵稱;5.管理員和其他用戶可以回復(fù)他人的留言。4.3.5資源展示站點(diǎn)資源評論用例基本流程:用戶可以在資源展示頁進(jìn)行評論。分支流程:1.用戶可以在資源展示頁發(fā)表自己的評論;2.用戶可以在評論時(shí)留下自己的郵箱用于回復(fù)提醒;3.用戶可以在評論時(shí)選擇是否需要留言被回復(fù)時(shí)的提醒;4.用戶可以在評論時(shí)可以自定義自己評論展示時(shí)的昵稱;5.管理員和其他用戶可以回復(fù)他人的評論;6.管理員可以選擇打開和關(guān)閉評論功能。4.3.6資源展示站點(diǎn)標(biāo)簽用例基本流程:管理員可以在后臺新建、刪除、修改標(biāo)簽。分支流程:1.管理員可以在后臺管理頁面中對已存在標(biāo)簽信息進(jìn)行修改;2.管理員可以在后臺管理頁面中對已存在標(biāo)簽信息進(jìn)行刪除;3.管理員可以在后臺管理頁面中對添加新的標(biāo)簽;4.管理員可以在后臺管理頁面中為文章添加多個(gè)標(biāo)簽和刪除標(biāo)簽。4.3.7資源展示站點(diǎn)內(nèi)容推薦用例基本流程:管理員可以對資源展示頁進(jìn)行首頁推薦。分支流程:管理員可以對已存在的資源新增推薦狀態(tài);管理員可以對已經(jīng)首頁推薦的資源進(jìn)行撤銷。4.3.8資源緩存站點(diǎn)資源傳輸用例基本流程:管理員可以上傳和下載資源,用戶只能通過資源展示平臺下載資源。分支流程:1.管理員可以在資源緩存站點(diǎn)上傳資源;2.管理員在上傳資源時(shí)可以暫停和恢復(fù);3.管理員和用戶在下載資源時(shí)可以暫停和恢復(fù)。4.3.9資源緩存站點(diǎn)資源管理用例基本流程:管理員可以刪除、更新資源。分支流程:1.管理員可以在系統(tǒng)中新建文件夾;2.管理員可以刪除資源和文件夾,且支持批量刪除;3.管理員可以移動資源和已創(chuàng)建的文件夾。系統(tǒng)實(shí)現(xiàn)5.1系統(tǒng)實(shí)現(xiàn)平臺5.1.1系統(tǒng)運(yùn)行環(huán)境1.系統(tǒng)硬件環(huán)境服務(wù)器:戴爾R720(CPU:E52670*2,RAM:4GB*8,磁盤:256GBSSD*5, 網(wǎng)卡:10G光口全雙工)共計(jì)4臺。交換機(jī)HPQuantaLB6M24口SFP(10G)一臺。萬兆光模塊與跳線:若干。2.系統(tǒng)軟件環(huán)境操作系統(tǒng):Ubuntu18.0464位操作系統(tǒng)。數(shù)據(jù)庫版本:MySQLserver5.7。Redis版本:Redis-4.0。Docker版本:Docker-CE。Zabbix版本:Zabbix-4.0。Grafana版本:Grafana-5.1.3。Hadoop版本:Hadoop-3.1.3。ESXI版本:ESXI-6.7開發(fā)工具:IntelliJIDEA,NavicatPremium12,RedisPlus,Xshell7,Vmware WorkStationsPro。開發(fā)語言:Java。5.1.2數(shù)據(jù)庫選擇及連接MySQL作為一款輕量級關(guān)系型數(shù)據(jù)庫,不僅體量小,安裝部署簡單,對硬件系統(tǒng)的要求也不高,且因?yàn)槠渥鳛殚_源項(xiàng)目,讓它成為了各類中小型站點(diǎn)數(shù)據(jù)庫的不二之選。兩個(gè)站點(diǎn)均采用mybatis對數(shù)據(jù)庫進(jìn)行管理,配置信息如下:圖SEQ圖\*ARABIC4資源緩存平臺數(shù)據(jù)庫配置圖SEQ圖\*ARABIC5資源展示平臺數(shù)據(jù)庫配置5.1.3Redis配置信息配置項(xiàng)數(shù)據(jù)值配置項(xiàng)數(shù)據(jù)值RedbchecksumyesProtected-modenoDaemonizeyesRdbcompressionyesIo-threads-do-readsnoRdb-del-sync-filenoLua-replicate-commandsyesActiverehashingyesAlways-show-logoyesStop-writes-no-bgsave-erroryesSet-proc-titleyesDynamic-hzyesLazyfree-lazy-expirenoLazyfree-lazy-server-delnoLazyfree-lazy-user-delnoLazyfree-lazy-user-flushnoRepl-disable-tcp-nodelaynoRepl-diskless-syncnoGopher-enablednoRdbchecksumyesAof-rewrite-incremental-fsyncyesNo-appendfsync-on-rewritenoCluster-require0full-coverageyesRdb-save-incremental0fsyncyesAof-load-truncatedyesAof-use-rdb-preambleyesCluster-replica-no-failovernoCluster-slave-no-failovernoReplica-lazy-flushnoSlave-lazy-flushnoReplica-serve-stale-datayesSlave-serve-stale-datanoReplica-read-onlyyesSlave-read-onlyyesReplica-ignore-maxmemoryyesSlave-ignore-maxmemoryyesJemalloc-bg-threadyesSyslog-enablednoActivedefragnoCluster-enablednoAppendonlynoCluster-allow-reads-when-downnoCrash-log-enbledyesCrash-memcheck-enabledyesUse-exit-on-panicnoDisable-thpyesAclfile\Unixsocket\Pidfile/pathRequirepassrootSupervisednoSyslog-facilitylocal0LoglevelnoticeRepl-diskless-loaddisabledMaxmemory-policynoevictionAppendfsynceverysecOom-score-adjnoAcl-pubsub-defaultallchannels5.1.4HadoopHA配置信息系統(tǒng)Hosts文件配置,將幾個(gè)主從節(jié)點(diǎn)名稱與內(nèi)網(wǎng)IP地址對應(yīng)好,具體如下圖:圖SEQ圖\*ARABIC6系統(tǒng)Host文件配置配置SSH,實(shí)現(xiàn)節(jié)點(diǎn)間的無密碼登錄:生成ssh密鑰,切換至root用戶執(zhí)行(所有的節(jié)點(diǎn)):ssh-keygen-trsa,連按三下回車。然后cd進(jìn)入~/.ssh目錄,使用ls查看是否有id_rsa和id_rsa.pub兩個(gè)文件。如果有,即成功創(chuàng)建密鑰。在~/.ssh目錄下創(chuàng)建authorized_keys文件,將每個(gè)節(jié)點(diǎn)的id_rsa.pub文件 的內(nèi)容復(fù)制到authorized_keys中,用換行符隔開。保存好再分發(fā)到每個(gè)節(jié)點(diǎn) 的~/.ssh文件夾下。測試ssh免密鑰登陸,任意一臺節(jié)點(diǎn)下,使用命令:ssh節(jié)點(diǎn)別名(上 面在hostname中改的名字)。如果出現(xiàn)提示,輸入yes加回車即可。如果可以成功切換,即成功部署免密登陸。高可用架構(gòu)如下圖:圖SEQ圖\*ARABIC7HadoopHA架構(gòu)圖高可用各個(gè)組件說明:ZK:zookeeper,用于載負(fù)均衡的組建,部署在所有的datanode之上。ZKFC:ZooKeeperFailoverController,ZKFC是一個(gè)ZK客戶端,也監(jiān) 控和管理NameNode的狀態(tài)。NameNode運(yùn)行的所在的每個(gè)機(jī)器也要運(yùn)行一 個(gè)ZKFC。它會對Namenode進(jìn)行健康檢測、zookeeper會話管理、選舉 namenode(在主namenode出現(xiàn)問題時(shí)無縫切換到備nomenode)。部署在主 namenode與備namenode之上。JNN:JournalNode(日志服務(wù)器集群),JournalNode集群用于同步幾 個(gè)namenode之間的數(shù)據(jù),是實(shí)現(xiàn)namenode切換的基礎(chǔ)。JournalNode是 集群線程,主namenode向其中寫入運(yùn)行信息,備namenode向其中讀取 信 息,實(shí)現(xiàn)數(shù)據(jù)同步。hadoop-env.sh文件配置如下: exportJAVA_HOME=/usr/jdk1.8.0_144 #指定系統(tǒng)Java路徑 exportHDFS_NAMENODE_USER=root #指定NameNode運(yùn)行用戶 exportHDFS_DATANODE_USER=root #指定DataNode運(yùn)行用戶 exportHDFS_ZKFC_USER=root #指定ZKFC運(yùn)行用戶 exportHDFS_JOURNALNODE_USER=root#指定JournalNode運(yùn)行用戶core-site.xml文件配置如下: <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value><!--將主備節(jié)點(diǎn)設(shè)置為myluster集群--> </property> <property> <name>hadoop.tmp.dir</name><!--設(shè)置臨時(shí)文件的存儲位置--> <value>/home/hadoop1/hadoopHA</value><!--生成新的集群元數(shù)據(jù)--> </property><property> <name>hadoop.http.staticuser.user</name><!--設(shè)置web管理頁面權(quán)限--> <value>root</value> </property> <property> <name>ha.zookeeper.quorum</name><!--設(shè)置zookeeper--> <value>datanode1:2181,datanode2:2181,datanode3:2181</value><!--2181是zookeeper和客戶端通信端口--> </property></configuration>hdfs-site.xml文件配置如下:<configuration><property> <name>dfs.replication</name><!--指定副本數(shù)量--><value>3</value><!--這里指定副本數(shù)量為3個(gè)--></property><property> <name>services</name><!--創(chuàng)建一個(gè)叫mycluster的namenode容災(zāi)集群--> <value>mycluster</value></property><property> <name>nodes.mycluster</name><!--申明mycluster的集群各個(gè)節(jié)點(diǎn)的邏輯名(代號)--> <value>nn1,nn2</value></property><!--給每個(gè)邏輯節(jié)點(diǎn)制定物理節(jié)點(diǎn)--><property> <name>node.rpc-address.mycluster.nn1</name><value>namenode:8020</value></property><property> <name>node.rpc-address.mycluster.nn2</name><value>datanode1:8020</value></property> <!--給邏輯節(jié)點(diǎn)制定物理節(jié)點(diǎn),以及其web管理地址--><property> <name>node.http-address.mycluster.nn1</name> <value>namenode:9870</value></property><property><name>node.http-address.mycluster.nn2</name> <value>datanode1:9870</value></property><!--配置journalnode集群--><property> <name>node.shared.edits.dir</name> <value>qjournal://namenode:8485;datanode1:8485;datanode2:8485/mycluster</value><!--mycluster是journalnode集群的別名--></property><!--配置namenode故障轉(zhuǎn)移代理類--><property><name>vider.mycluster</name><value>node.ha.ConfiguredFailoverProxyProvider</value></property><!--配置fencing隔離--><property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value></property><property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value><!--這里要使用私鑰--></property><!--journalnode集群的日志目錄文件存放位置--><property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop1/journaldata</value><!--可以自定義--></property><!--打開namenode自動故障轉(zhuǎn)移--><property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value></property></configuration>zoo.cfg文件配置如下:#Thenumberofmillisecondsofeachtick即CS通信心跳時(shí)間,每個(gè)tickTime時(shí)間 就會發(fā)送一個(gè)心跳。tickTime以毫秒為單位tickTime=2000#Thenumberofticksthattheinitial主從節(jié)點(diǎn)初始連接時(shí)能容忍的最多心跳數(shù),以 ticktime為單位#synchronizationphasecantakeinitLimit=10#Thenumberofticksthatcanpassbetween主從節(jié)點(diǎn)啟動之后能容忍的最多心跳數(shù), 以ticktime為單位#sendingarequestandgettinganacknowledgementsyncLimit=5#thedirectorywherethesnapshotisstored.數(shù)據(jù)文件目錄Zookeeper保存數(shù)據(jù)的目錄#donotuse/tmpforstorage,/tmphereisjust#examplesakes.dataDir=/home/hadoop1/zookeeperdata#theportatwhichtheclientswillconnect客戶端連接端口客戶端連接Zookeeper 服務(wù)器的端口,Zookeeper會監(jiān)聽這個(gè)端口,接受客戶端的訪問請求clientPort=2181#themaximumnumberofclientconnections.#increasethisifyouneedtohandlemoreclients#maxClientCnxns=60#Besuretoreadthemaintenancesectionofthe#administratorguidebeforeturningonautopurge.##/doc/current/zookeeperAdmin.html#sc_maintenance##ThenumberofsnapshotstoretainindataDir#autopurge.snapRetainCount=3#Purgetaskintervalinhours#Setto"0"todisableautopurgefeature#autopurge.purgeInterval=1#添加zookeeper集群的節(jié)點(diǎn)信息后面的端口分別是主從節(jié)點(diǎn)通信端口和主節(jié)點(diǎn)故 障之后選舉新主節(jié)點(diǎn)時(shí)的通信端口server.1=datanode1:2888:3888server.2=datanode2:2888:3888server.3=datanode3:2888:38885.2系統(tǒng)功能模塊的實(shí)現(xiàn)5.2.1資源展示站點(diǎn)用戶登錄管理員在輸入賬號、密碼后可以登錄,任意一項(xiàng)為空會提示該項(xiàng)不能為空,賬號或者驗(yàn)證碼錯(cuò)誤會提示錯(cuò)誤。登錄頁面如圖:圖SEQ圖\*ARABIC8管理員登陸頁面登錄功能后臺驗(yàn)證代碼如下:AllUsersuse_r=userService.checkUser(username,password);if(use_r!=null){//如果use_r不為空,則說明在數(shù)據(jù)庫查詢到了該用戶名和密碼Use_r.setPassword(null);//清空查詢到的密碼Session.setAttribute("use_r",use_r);//將Use_r對象加到session里面,表示用戶已登錄return"admin/index";}else{attributes.addFlashAttribute("message","請輸入正確的信息");}}5.2.2管理員注銷管理員在登錄系統(tǒng)后如果需要退出系統(tǒng),點(diǎn)擊注銷即可。管理員注銷實(shí)現(xiàn)代碼如下:@GetMapping("/logout")publicStringlogout(HttpSessionsession){session.removeAttribute("use_r");//清空session里的用戶信息return"redirect:/admin";}}5.2.3管理員發(fā)布資源展示信息頁管理員在登錄系統(tǒng)后,可以編輯發(fā)布資源展示信息頁。發(fā)布頁面如圖:圖SEQ圖\*ARABIC9資源信息頁編輯部分圖SEQ圖\*ARABIC10資源信息頁相關(guān)選項(xiàng)后臺提交實(shí)現(xiàn)代碼如下:publicstaticStringmarkdownChangeToHtml(Stringmd){HtmldataHd=Htmldata.builder().build();Nodedocument=Hd.parse(md);returnHd.render(document);}5.2.4資源展示信息頁管理管理員在登錄后臺之后可以管理所有已發(fā)布和已保存的資源展示信息頁。管理頁面如下圖所示:圖SEQ圖\*ARABIC11資源展示信息頁管理頁面該模塊實(shí)現(xiàn)代碼如下:if(blog.getId()==null){p=blogService.saveBlog(blog);//如果沒有查詢到同樣的ID就執(zhí)行新建}else{p=blogService.updateBlog(blog.getId(),blog);/如果查詢到同樣的ID,就執(zhí)行更新該記錄}if(p==null){//判斷操作是否成功attributes.addFlashAttribute("message","操作失敗");}else{attributes.addFlashAttribute("message","操作成功");}returnREDIRECT_LIST;}5.2.5資源分類信息管理管理員在管理后臺可以對資源的分類進(jìn)行增刪改操作,分類信息管理頁面如下圖:圖SEQ圖\*ARABIC12資源分類管理頁圖SEQ圖\*ARABIC13資源分類新增頁面該模塊的實(shí)現(xiàn)代碼如下:if(result.hasErrors()){/校驗(yàn)時(shí)檢查到錯(cuò)誤return"admin/types-input";}Typet=typeService.updateType(id,type);if(t==null){attributes.addFlashAttribute("message","更新失敗");}else{attributes.addFlashAttribute("message","更新成功");}return"redirect:/admin/types";}@GetMapping("/types/{id}/delete")publicStringdelete(@PathVariableLongid,RedirectAttributesattributes){typeService.deleteType(id);attributes.addFlashAttribute("message","刪除成功");return"redirect:/admin/types";}}5.2.6資源標(biāo)簽信息管理管理員在管理后臺可以對資源的分類進(jìn)行增刪改操作,分類信息管理頁面如下圖:圖SEQ圖\*ARABIC14資源標(biāo)簽信息管理頁圖SEQ圖\*ARABIC15資源標(biāo)簽新增頁面新增標(biāo)簽實(shí)現(xiàn)代碼如下:AllTagtag=tagService.getagName(tag.getName());/*檢查新插入的標(biāo)簽名是否與數(shù)據(jù)庫中的標(biāo)簽名重復(fù)*/if(tag1!=null){//判斷在數(shù)據(jù)庫中是否查詢到result.rejectValue("name","nameError","不能添加重復(fù)的標(biāo)簽");}if(result.hasErrors()){return"admin/tags-input";}Tagt=tagService.saveTag(tag);/*檢查過新增標(biāo)簽內(nèi)容未發(fā)生重復(fù),則進(jìn)行數(shù)據(jù)庫寫入*/if(t==null){attributes.addFlashAttribute("message","新增失敗");}else{attributes.addFlashAttribute("message","新增成功");}return"redirect:/admin/tags";}5.2.7用戶留言模塊普通用戶可以在資源展示平臺進(jìn)行留言操作,通過留言模塊參與相關(guān)討論,留言頁面如下圖:圖SEQ圖\*ARABIC16用戶留言模塊圖SEQ圖\*ARABIC17用戶留言展示區(qū)該模塊實(shí)現(xiàn)代碼如下:@ControllerpublicclassMessageController{@AutowiredprivateMessageServicemessageService;privatestaticfinalStringPAGE_SIZE="10";@Value("${comment.avatar}")privateStringavatar;@Value("${admin.openid}")privateStringadminOpenid;@GetMapping("/messageBoard")publicStringmessageBoard(){return"message_board";}@PostMapping("/POSTMessages")@CheckRepeatRequestpublicStringpost(Messagemessage,HttpSessionsession){StringloginStatus=(String)session.getAttribute("loginStatus");if(loginStatus!=null){Stringavatar=(String)session.getAttribute("avatar");Stringopenid=(String)session.getAttribute("openid");//QQ標(biāo)識Stringnode_id=(String)session.getAttribute("node_id");//github標(biāo)識message.setAvatar(avatar);message.setAdminMessage(1);if(StringUtils.isNotBlank(node_id)){message.setAdminMessage(3);}/*判斷是否為管理員評論*/if(adminOpenid.equals(openid)){message.setAdminMessage(2);}System.out.println(openid);}else{message.setAdminMessage(0);message.setAvatar(avatar);}messageService.saveMessage(message);messageService.findParentMessage(message);return"redirect:/Message";}@RequestMapping(value="/Messages",method=RequestMethod.GET)publicStringMessage_board(@RequestParam(value="key",required=false)Stringkey,@RequestParam(value="page",defaultValue="1")Integerpage,@RequestParam(value="rows",defaultValue="8")Integerrows,@RequestParam(value="sortBy",defaultValue="createTime")StringsortBy,@RequestParam(value="desc",required=false)Booleandesc,Modelmodel){Pageablepageable=newPageRequest(1,rows,Sort.Direction.DESC,sortBy);Page<Message>messages=messageService.listMessage(pageable);booleana=messages.hasPrevious();//判斷是否為首頁booleanb=messages.hasNext();//判斷是否為尾頁model.addAttribute("a",a);model.addAttribute("b",b);model.addAttribute("messages",messageService.listMessage(pageable));return"message_board";}@RequestMapping(value="/Message",method=RequestMethod.GET)@CheckRepeatRequestpublicStringmessage(@RequestParam(value="key",required=false)Stringkey,@RequestParam(value="page",defaultValue="1")Integerpage,@RequestParam(value="rows",defaultValue="10")Integerrows,@RequestParam(value="sortBy",defaultValue="createTime")StringsortBy,@RequestParam(value="desc",required=false)Booleandesc,Modelmodel){Pageablepageable=newPageRequest(1,rows,Sort.Direction.DESC,sortBy);Page<Message>messages=messageService.listMessage(pageable);booleana=messages.hasPrevious();//判斷是否為首頁booleanb=messages.hasNext();//判斷是否為尾頁model.addAttribute("a",a);model.addAttribute("b",b);model.addAttribute("messages",messageService.listMessage(pageable));return"message_board::messageList";//將數(shù)據(jù)返回message_board頁面的th:fragment="messageList"片段,實(shí)現(xiàn)局部刷新}}5.2.8資源展示頁用戶評論每個(gè)資源展示頁在發(fā)布時(shí),管理員可以選擇是否開放用戶評論,便于發(fā)現(xiàn)資源信息的不足之處和用戶與用戶、用戶與管理員之間的交流。用戶評論區(qū)如下圖:圖SEQ圖\*ARABIC18用戶評論區(qū)該模塊實(shí)現(xiàn)代碼如下:if(loginStatus!=null){Stringavatar=(String)session.getAttribute("avatar");Stringopenid=(String)session.getAttribute("openid");comment.setAvatar(avatar);comment.setAdminComment(1);/*判斷是否為管理員評論*/if(adminOpenid.equals(openid)){comment.setAdminComment(2);}System.out.println(openid);}else{comment.setAdminComment(0);comment.setAvatar(avatar);}5.2.9資源緩存系統(tǒng)文件上傳管理員要在資源展示平臺中發(fā)布資源,就必須要到資源緩存系統(tǒng)中上傳相關(guān)資源,并獲取下載鏈接,用戶方能通過下載鏈接進(jìn)行下載,同時(shí),資源會定時(shí)傳入Hadoop集群中進(jìn)行容災(zāi)存儲。上傳功能展示如下圖:圖SEQ圖\*ARABIC19資源緩存系統(tǒng)資源上傳該模塊實(shí)現(xiàn)代碼如下:/***文件信息獲取*@date2021-01-27*/@AutowiredpublicFileController(FileServicefileService){this.fileService=fileService;}@GetMapping("/file/parent/{parentId}")publicResponseEntity<ResponseDto>getFiles(@PathVariableLongparentId){returnResponseEntity.ok(fileService.findByParentId(parentId));}@GetMapping("/file/{fileId}")publicResponseEntity<ResponseDto>getFile(@PathVariableLongfileId){returnResponseEntity.ok(fileService.findByFileId(fileId));}@PostMapping("/file")publicResponseEntity<ResponseDto>createFile(@Valid@RequestBodyFilefile,BindingResultresult){if(result.hasErrors()){StringBuildererrors=newStringBuilder();for(FieldErrorfe:result.getFieldErrors()){errors.append(fe.getDefaultMessage()).append(";");}thrownewDataFormatException(errors.toString());}fileService.createFile(file);returnResponseEntity.status(HttpStatus.CREATED).body(ResponseDto.success());}@PutMapping("/file/{fileId}/rename")publicResponseEntity<ResponseDto>renameFile(@PathVariableLongfileId,@RequestBodyFilefi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 運(yùn)動飲料企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報(bào)告
- 醬油專門零售企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略研究報(bào)告
- 床專門零售企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報(bào)告
- 管線預(yù)埋施工方案
- 食品用天門冬酰苯丙氨酸甲酯企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報(bào)告
- 航空企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報(bào)告
- 番茄沙司罐頭企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報(bào)告
- 船舶疏浚施工方案
- 保時(shí)捷頂棚改裝施工方案
- 2025年度物流公司物流園區(qū)運(yùn)營管理承包協(xié)議
- 科普版小學(xué)英語六年級下冊全冊教案
- 腦梗合并心衰護(hù)理查房
- 婦聯(lián)普法知識競賽參考試題庫300題(含答案)
- T-NAHIEM 101-2023 急診科建設(shè)與設(shè)備配置標(biāo)準(zhǔn)
- 【綠色家園你我共建】約會春天擁抱綠色-2024年3月12日植樹節(jié)主題班會(小學(xué)通用版)
- 解分式方程50題八年級數(shù)學(xué)上冊
- 溶液鍍膜法完整版本
- 消化道出血應(yīng)急預(yù)案
- 【溫州眼鏡出口遭遇技術(shù)貿(mào)易壁壘的現(xiàn)狀及對策(定量論文)15000字】
- AI技術(shù)在保險(xiǎn)行業(yè)的應(yīng)用
- 文華財(cái)經(jīng)“麥語言”函數(shù)手冊
評論
0/150
提交評論