版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章微服務(wù)實(shí)戰(zhàn)-黑馬頭條《SpringCloud微服務(wù)架構(gòu)開發(fā)(第2版)》學(xué)習(xí)目標(biāo)/Target了解項(xiàng)目概述,能說(shuō)出黑馬頭條包含的主要功能熟悉項(xiàng)目架構(gòu)設(shè)計(jì),能夠說(shuō)出項(xiàng)目包含的模塊,以及各模塊的作用掌握項(xiàng)目開發(fā)準(zhǔn)備工作,能夠正確導(dǎo)入提供的SQL文件和初始項(xiàng)目,完成項(xiàng)目開發(fā)的準(zhǔn)備工作掌握自媒體端功能實(shí)現(xiàn),能夠?qū)崿F(xiàn)功能模塊自媒體人登錄、創(chuàng)建對(duì)象存儲(chǔ)服務(wù)、素材管理、發(fā)布文章、內(nèi)容列表掌握用戶端功能實(shí)現(xiàn),能夠?qū)崿F(xiàn)功能模塊用戶登錄、文章列表、文章詳情章節(jié)概述/Summary通過(guò)前面章節(jié)的學(xué)習(xí),相信大家對(duì)SpringCloud常用組件有了一定的認(rèn)識(shí),為了讀者能夠更好地綜合運(yùn)用SpringCloud進(jìn)行微服務(wù)開發(fā),本章將前面章節(jié)的內(nèi)容進(jìn)行整合,基于SpringBoot和SpringCloud框架的分布式微服務(wù)技術(shù),構(gòu)建一個(gè)新聞資訊系統(tǒng)-黑馬頭條,讓讀者能更深入地理解如何使用SpringCloud構(gòu)建微服務(wù)和實(shí)現(xiàn)項(xiàng)目需求。目錄/Contents11.111.2項(xiàng)目概述項(xiàng)目架構(gòu)設(shè)計(jì)11.3項(xiàng)目開發(fā)準(zhǔn)備工作11.4自媒體端功能實(shí)現(xiàn)11.5用戶端功能實(shí)現(xiàn)項(xiàng)目概述11.111.1
項(xiàng)目概述先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!了解項(xiàng)目概述,能說(shuō)出黑馬頭條包含的主要功能11.1.1
項(xiàng)目功能介紹黑馬頭條核心功能11.1.2
項(xiàng)目功能預(yù)覽為了讓讀者對(duì)本章要講解的黑馬頭條有整體、直觀的認(rèn)識(shí),下面對(duì)黑馬頭條提供的功能進(jìn)行預(yù)覽。1.自媒體人登錄11.1.2
項(xiàng)目功能預(yù)覽2.素材管理11.1.2
項(xiàng)目功能預(yù)覽3.發(fā)布文章11.1.2
項(xiàng)目功能預(yù)覽4.內(nèi)容列表11.1.2
項(xiàng)目功能預(yù)覽5.用戶登錄11.1.2
項(xiàng)目功能預(yù)覽6.文章列表11.1.2
項(xiàng)目功能預(yù)覽7.文章詳情項(xiàng)目架構(gòu)設(shè)計(jì)11.211.2
項(xiàng)目架構(gòu)設(shè)計(jì)先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!熟悉項(xiàng)目架構(gòu)設(shè)計(jì),能夠說(shuō)出項(xiàng)目包含的模塊,以及各模塊的作用11.2
項(xiàng)目架構(gòu)設(shè)計(jì)在項(xiàng)目開發(fā)之前,對(duì)項(xiàng)目的業(yè)務(wù)進(jìn)行分析,并設(shè)計(jì)一個(gè)合理的架構(gòu)是至關(guān)重要的。本黑馬頭條采用了基于SpringCloud微服務(wù)的架構(gòu),根據(jù)業(yè)務(wù)功能將系統(tǒng)劃分為八個(gè)模塊,這些模塊組成了一套完備的微服務(wù)系統(tǒng)。在這八個(gè)模塊中,包括兩個(gè)網(wǎng)關(guān)模塊、三個(gè)業(yè)務(wù)微服務(wù)模塊和三個(gè)通用功能模塊。兩個(gè)網(wǎng)關(guān)模塊包含用戶網(wǎng)關(guān)和自媒體網(wǎng)關(guān);三個(gè)業(yè)務(wù)微服務(wù)模塊包含用戶微服務(wù)、文章微服務(wù)、自媒體微服務(wù)。11.2
項(xiàng)目架構(gòu)設(shè)計(jì)11.2
項(xiàng)目架構(gòu)設(shè)計(jì)通用配置模塊中主要集中管理和共享通用的配置,例如通用常量、異常處理、常用工具類等。其他模塊引用通用配置模塊后,可以直接使用通用配置模塊中的內(nèi)容,避免重復(fù)配置,提高開發(fā)效率和系統(tǒng)的一致性。1.通用配置模塊數(shù)據(jù)模型模塊中主要存放通用的數(shù)據(jù)模型類,如實(shí)體類、DTO(數(shù)據(jù)傳輸對(duì)象)等,其他模塊使用數(shù)據(jù)模型類時(shí)可以引用該模塊,實(shí)現(xiàn)數(shù)據(jù)模型類的標(biāo)準(zhǔn)化和復(fù)用,避免不同微服務(wù)重復(fù)定義相同的數(shù)據(jù)結(jié)構(gòu),提高數(shù)據(jù)的一致性和可維護(hù)性。2.數(shù)據(jù)模型模塊11.2
項(xiàng)目架構(gòu)設(shè)計(jì)在文章微服務(wù)和自媒體微服務(wù)中都涉及到文件管理的相關(guān)功能,對(duì)此提供了一個(gè)可插拔的文件管理功能,封裝文件上傳、下載、刪除等基本的文件管理功能,其他模塊引入該模塊后,可以快速集成文件管理功能,避免不同微服務(wù)重復(fù)實(shí)現(xiàn)文件管理功能。3.文件管理模塊用戶端網(wǎng)關(guān)主要負(fù)責(zé)處理用戶端相關(guān)的路由和訪問(wèn)控制。4.用戶端網(wǎng)關(guān)11.2
項(xiàng)目架構(gòu)設(shè)計(jì)自媒體網(wǎng)關(guān)主要負(fù)責(zé)處理自媒體相關(guān)的路由和訪問(wèn)控制。5.自媒體網(wǎng)關(guān)用戶端微服務(wù)主要處理用戶端用戶登錄的業(yè)務(wù)邏輯,用戶端發(fā)起登錄或者游客方式瀏覽資訊的請(qǐng)求時(shí),用戶網(wǎng)關(guān)將該請(qǐng)求轉(zhuǎn)發(fā)給用戶微服務(wù)處理。6.用戶端微服務(wù)11.2
項(xiàng)目架構(gòu)設(shè)計(jì)文章微服務(wù)主要處理與文章相關(guān)的業(yè)務(wù)邏輯,包括加載文章列表、保存文章、修改文章等功能。7.文章微服務(wù)自媒體微服務(wù)主要處理與自媒體相關(guān)的業(yè)務(wù)邏輯,包括自媒體人登錄、素材管理、發(fā)布文章、查詢文章列表等功能。8.自媒體微服務(wù)項(xiàng)目開發(fā)準(zhǔn)備工作11.311.3
項(xiàng)目開發(fā)準(zhǔn)備工作先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握項(xiàng)目開發(fā)準(zhǔn)備工作,能夠正確導(dǎo)入提供的SQL文件和初始項(xiàng)目,完成項(xiàng)目開發(fā)的準(zhǔn)備工作11.3.1
系統(tǒng)開發(fā)及運(yùn)行環(huán)境為了避免學(xué)習(xí)過(guò)程中出現(xiàn)不必要的錯(cuò)誤,下面對(duì)黑馬頭條開發(fā)及運(yùn)行所需的環(huán)境和相關(guān)軟件進(jìn)行介紹,具體如下所示。操作系統(tǒng):Windows10Java開發(fā)包:JDK8項(xiàng)目管理工具:Maven3.6.3項(xiàng)目開發(fā)工具:IntelliJIDEA2022.2.2數(shù)據(jù)庫(kù):MySQL8.0瀏覽器:GoogleChrome11.3.2
數(shù)據(jù)庫(kù)準(zhǔn)備本項(xiàng)目涉及三個(gè)數(shù)據(jù)庫(kù),分別是用戶端數(shù)據(jù)庫(kù)、文章數(shù)據(jù)庫(kù)和自媒體數(shù)據(jù)庫(kù)。為了方便讀者使用,本書的配套資源提供了相應(yīng)的SQL文件。讀者可以使用這三個(gè)SQL文件創(chuàng)建相應(yīng)的數(shù)據(jù)庫(kù)和數(shù)據(jù)表,并插入一些基本的初始化數(shù)據(jù)。數(shù)據(jù)庫(kù)數(shù)據(jù)表數(shù)據(jù)表說(shuō)明leadnews_user,用戶端數(shù)據(jù)庫(kù)ap_user用戶端的用戶信息表leadnews_article,文章數(shù)據(jù)庫(kù)ap_article文章基本信息表ap_article_config文章配置表ap_article_content文章內(nèi)容表leadnews_wemedia,自媒體數(shù)據(jù)庫(kù)wm_channel自媒體的頻道信息表wm_material自媒體的素材信息表wm_news自媒體的文章表wm_news_material自媒體的文章素材關(guān)系表wm_user自媒體端的用戶信息表11.3.3
項(xiàng)目工程結(jié)構(gòu)為了便于后續(xù)功能模塊的開發(fā),本章提供了一個(gè)初始工程,初始工程中根據(jù)項(xiàng)目功能創(chuàng)建了對(duì)應(yīng)的模塊,并且提供了項(xiàng)目的依賴信息,以及通用模塊中的代碼。在IDEA中導(dǎo)入初始工程,可以看到初始工程的主體結(jié)構(gòu)。11.3.3
項(xiàng)目工程結(jié)構(gòu)通用配置模塊,用于存放項(xiàng)目中的通用常量、異常處理、常用工具類等通用配置。(1)heima-leadnews-commonconstants包下存放的是常量相關(guān)的類。exception包下存放的是異常相關(guān)的類。utils包下存放的是常用的工具類。11.3.3
項(xiàng)目工程結(jié)構(gòu)文件管理模塊,用于存放文件上傳、下載、刪除等文件管理功能的相關(guān)類。(2)heima-leadnews-file-starterheima-leadnews-file-starter只是創(chuàng)建了對(duì)應(yīng)的包,包中存放的接口和類會(huì)在后續(xù)的具體實(shí)現(xiàn)中進(jìn)行創(chuàng)建。11.3.3
項(xiàng)目工程結(jié)構(gòu)網(wǎng)關(guān)模塊,用于統(tǒng)一管理系統(tǒng)中的用戶端網(wǎng)關(guān)和自媒體網(wǎng)關(guān)。(3)heima-leadnews-gatewayheima-leadnews-app-gateway為用戶端網(wǎng)關(guān),為用戶端的前端提供網(wǎng)關(guān)入口,處理用戶端相關(guān)的訪問(wèn)控制;heima-leadnews-wemedia-gateway為自媒體網(wǎng)關(guān),為自媒體的前端提供網(wǎng)關(guān)入口,處理自媒體相關(guān)的訪問(wèn)控制。11.3.3
項(xiàng)目工程結(jié)構(gòu)數(shù)據(jù)模型模塊,存放用戶端、文章,自媒體相關(guān)的實(shí)體類和DTO,以及通用的DTO等類。(4)heima-leadnews-modelarticle包下用于存放文章相關(guān)的實(shí)體類和DTO。common包下用于存放通用的DTO,主要包含請(qǐng)求和響應(yīng)的數(shù)據(jù)傳輸類。user包下用于存放用戶端相關(guān)的實(shí)體類和DTO。wemedia包下用于存放自媒體相關(guān)的實(shí)體類和DTO。11.3.3
項(xiàng)目工程結(jié)構(gòu)微服務(wù)模塊,用于統(tǒng)一管理系統(tǒng)中的用戶端微服務(wù)、文章微服務(wù)、自媒體微服務(wù)。heima-leadnews-article為文章微服務(wù),heima-leadnews-user為用戶端微服務(wù),heima-leadnews-wemedia為自媒體微服務(wù),導(dǎo)入的初始項(xiàng)目中只提供了這三個(gè)微服務(wù)的包結(jié)構(gòu)和項(xiàng)目啟動(dòng)類,具體的功能實(shí)現(xiàn)會(huì)在后續(xù)進(jìn)行詳細(xì)講解。(5)heima-leadnews-service自媒體端功能實(shí)現(xiàn)11.411.4.1
自媒體人登錄先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握自媒體人登錄,能夠部署自媒體端前端項(xiàng)目,實(shí)現(xiàn)自媒體人登錄功能11.4.1
自媒體人登錄1.設(shè)置應(yīng)用程序配置在heima-leadnews-wemedia子模塊的bootstrap.yml配置文件中設(shè)置應(yīng)用程序配置,主要包括應(yīng)用的端口、名稱、注冊(cè)中心和配置中心等信息,具體如文件11-1所示。文件11-1bootstrap.yml源代碼11.4.1
自媒體人登錄1.設(shè)置應(yīng)用程序配置啟動(dòng)Nacos并登錄Nacos控制臺(tái)后,在Nacos配置列表的public命名空間下添加DataID為leadnews-wemedia,Group為DEFAULT_GROUP,配置格式為YAML的配置,配置內(nèi)容如下所示。Nacos中添加配置的內(nèi)容源代碼11.4.1
自媒體人登錄2.編寫登錄功能代碼在heima-leadnews-wemedia子模塊的com.heima.wemedia.controller包下創(chuàng)建自媒體人登錄的控制器類LoginController,用于接收媒體人登錄的用戶名和密碼,傳遞給Service層進(jìn)行登錄,具體如文件11-2所示。文件11-2LoginController.java源代碼11.4.1
自媒體人登錄2.編寫登錄功能代碼在heima-leadnews-wemedia子模塊的com.heima.wemedia.service包下創(chuàng)建自媒體人相關(guān)業(yè)務(wù)的接口WmUserService,具體如文件11-3所示。文件11-3WmUserService.java源代碼11.4.1
自媒體人登錄2.編寫登錄功能代碼在heima-leadnews-wemedia子模塊的com.heima.wemedia.service.impl包下創(chuàng)建WmUserService接口的實(shí)現(xiàn)類,具體如文件11-4所示。文件11-4WmUserServiceImpl.java源代碼11.4.1
自媒體人登錄2.編寫登錄功能代碼在heima-leadnews-wemedia子模塊的com.heima.wemedia.mapper包下創(chuàng)建WmUserMapper接口繼承BaseMapper接口,具體如文件11-5所示。文件11-5WmUserMapper.java源代碼11.4.1
自媒體人登錄3.實(shí)現(xiàn)自媒體網(wǎng)關(guān)服務(wù)在heima-leadnews-wemedia-gateway子模塊的bootstrap.yml文件中設(shè)置自媒體網(wǎng)關(guān)配置,具體如文件11-6所示。文件11-6bootstrap.yml源代碼11.4.1
自媒體人登錄3.實(shí)現(xiàn)自媒體網(wǎng)關(guān)服務(wù)啟動(dòng)Nacos并登錄Nacos控制臺(tái)后,在Nacos配置列表的public命名空間下添加DataID為leadnews-wemedia-gateway,Group為DEFAULT_GROUP,配置格式為YAML的配置,配置內(nèi)容如下所示。配置內(nèi)容源代碼11.4.1
自媒體人登錄3.實(shí)現(xiàn)自媒體網(wǎng)關(guān)服務(wù)在heima-leadnews-wemedia-gateway子模塊的com.heima.wemedia.gateway.filter包下自定義用于鑒權(quán)的全局過(guò)濾器,具體如文件11-7所示。文件11-7AuthorizeFilter.java源代碼11.4.1
自媒體人登錄4.部署自媒體端前端項(xiàng)目黑馬頭條的自媒體端采用前后端分離架構(gòu),在配套資源中提供了一個(gè)名為wemedia-web.zip的壓縮文件,其中包含了完整的自媒體端前端項(xiàng)目。在實(shí)現(xiàn)用戶登錄之前,需要先部署自媒體端前端項(xiàng)目。Nginx是一款開源的高性能Web服務(wù)器和反向代理服務(wù)器,它能夠提供反向代理和靜態(tài)服務(wù)器功能,使其成為部署前端項(xiàng)目的理想選擇。通過(guò)Nginx的反向代理功能,可以輕松訪問(wèn)后臺(tái)的網(wǎng)關(guān)資源;通過(guò)其靜態(tài)服務(wù)器功能,可以方便地訪問(wèn)前端靜態(tài)頁(yè)面。下面,基于Nginx實(shí)現(xiàn)自媒體端前端項(xiàng)目的部署。11.4.1
自媒體人登錄4.部署自媒體端前端項(xiàng)目本書對(duì)應(yīng)的配套資源中提供了Nginx的壓縮包,讀者也可以自行到Nginx官方自行下載。將Nginx的壓縮包解壓縮。11.4.1
自媒體人登錄4.部署自媒體端前端項(xiàng)目在Nginx的conf文件夾下新建一個(gè)名稱為leadnews.conf的文件夾,在leadnews.conf文件夾中新建名稱為heima-leadnews-wemedia.conf的配置文件,在該配置文件中添加與自媒體相關(guān)的代理及請(qǐng)求轉(zhuǎn)發(fā)的配置,具體如文件11-8所示。文件11-8heima-leadnews-wemedia.conf源代碼11.4.1
自媒體人登錄4.部署自媒體端前端項(xiàng)目打開conf文件夾下的nginx.conf文件,把里面注釋的內(nèi)容和靜態(tài)資源配置相關(guān)刪除,引入heima-leadnews-wemedia.conf文件,具體如文件11-9所示。文件11-9nginx.conf源代碼11.4.1
自媒體人登錄5.測(cè)試自媒體端登錄效果將wemedia-web.zip解壓到D:\workspace目錄下后,在命令行窗口中的跳轉(zhuǎn)到Nginx的路徑下后,執(zhí)行nginx命令啟動(dòng)Nginx。11.4.1
自媒體人登錄5.測(cè)試自媒體端登錄效果依次啟動(dòng)Nacos服務(wù)端、WeMediaApplication、WemediaGatewayAplication,啟動(dòng)成功后在瀏覽器中訪問(wèn)http://localhost:8801/,進(jìn)入到黑馬頭條的自媒體人登錄頁(yè)面。11.4.1
自媒體人登錄5.測(cè)試自媒體端登錄效果輸入數(shù)據(jù)庫(kù)中存在的賬號(hào)和賬號(hào)對(duì)應(yīng)的密碼后,單擊“登錄”按鈕,跳轉(zhuǎn)到自媒體端的后臺(tái)首頁(yè)。11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握創(chuàng)建對(duì)象存儲(chǔ)服務(wù),能夠基于MinIO創(chuàng)建對(duì)象存儲(chǔ)服務(wù)11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)在黑馬頭條所發(fā)布的文章中可以插入圖片,這些插入的圖片需要先上傳。然而,如果將整個(gè)圖片對(duì)象存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)或項(xiàng)目指定的磁盤中,可能會(huì)面臨存儲(chǔ)效率低下、影響數(shù)據(jù)庫(kù)性能等潛在問(wèn)題。為了解決這些問(wèn)題,可以考慮使用對(duì)象存儲(chǔ)服務(wù),對(duì)象存儲(chǔ)服務(wù)是專門為存儲(chǔ)和管理大型二進(jìn)制對(duì)象(如圖片、視頻、文檔等)而設(shè)計(jì)的存儲(chǔ)服務(wù)。常見的對(duì)象存儲(chǔ)服務(wù)的方式有公有云對(duì)象存儲(chǔ)、私有云對(duì)象存儲(chǔ)和開源的對(duì)象存儲(chǔ)軟件,其中開源的對(duì)象存儲(chǔ)軟件可以供用戶自行部署和管理,具有靈活性和可定制性,在此選擇使用這種方式完成素材管理。開源的對(duì)象存儲(chǔ)軟件中MinIO是當(dāng)前主流的軟件之一,其服務(wù)端可以工作在Windows、Linux、OSX和FreeBSD上,擁有輕量、性能高、配置簡(jiǎn)單等諸多特點(diǎn),可以做為存儲(chǔ)圖片,視頻,文檔的解決方案,在此,黑馬頭條的對(duì)象存儲(chǔ)選擇基于MinIO實(shí)現(xiàn)。11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)MinIO提供了主流與操作系統(tǒng)對(duì)應(yīng)的服務(wù)端可執(zhí)行文件,讀者可以根據(jù)部署MinIO的操作系統(tǒng),從MinIO的官方網(wǎng)站下載MinIO對(duì)應(yīng)的可執(zhí)行文件。為了便于操作,本書使用Windows版本的MinIO件。下載完成后,在命令行窗口中切換到MinIO可執(zhí)行文件所在的位置,使用以下命令格式啟動(dòng)MinIO服務(wù)端。1.下載和啟動(dòng)MinIO服務(wù)端minioserver/path/to/data/path/to/data是指將對(duì)象存儲(chǔ)數(shù)據(jù)存放的路徑,可自行定義。11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)1.下載和啟動(dòng)MinIO服務(wù)端11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)MinIO使用Bucket來(lái)組織對(duì)象,Bucket類似于目錄中的文件夾或目錄文件系統(tǒng),其中每個(gè)Bucket可以保存任意數(shù)量的對(duì)象。首先,在瀏覽器中訪問(wèn):9000,使用RootUser和RootPass登錄MinIO的管理控制臺(tái)。2.創(chuàng)建Bucket11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)單擊“CreateBucket”按鈕后在彈出界面中,創(chuàng)建一個(gè)名稱為leadnews的Bucket,用于后續(xù)存儲(chǔ)黑馬頭條中的素材等對(duì)象。創(chuàng)建好名稱為leadnews的Bucket后,單擊左側(cè)的Bucket菜單,可以看到當(dāng)前MinIO中所有的Bucket。2.創(chuàng)建Bucket11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)默認(rèn)創(chuàng)建的Bucket權(quán)限為私有,其中的資源不能直接被外界訪問(wèn),為了便于后續(xù)黑馬頭條中可以直接獲取leadnews下的資源,對(duì)此可以將leadnews的權(quán)限設(shè)置為公開。單擊“Manage”按鈕,進(jìn)入到leadnews的管理界面。2.創(chuàng)建Bucket11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)默認(rèn)創(chuàng)建的Bucket權(quán)限為私有,其中的資源不能直接被外界訪問(wèn),為了便于后續(xù)黑馬頭條中可以直接獲取leadnews下的資源,對(duì)此可以將leadnews的權(quán)限設(shè)置為公開。單擊“Manage”按鈕,進(jìn)入到leadnews的管理界面。2.創(chuàng)建Bucket將訪問(wèn)策略修改為Public11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)MinIO提供了各種主流開發(fā)語(yǔ)言的SDK,這些SDK包含了一系列的API和功能,使開發(fā)者能夠很方便地與MinIO服務(wù)進(jìn)行交互,實(shí)現(xiàn)對(duì)象的存儲(chǔ)、檢索和管理。為了其他微服務(wù)都可以方便的使用對(duì)象存儲(chǔ)服務(wù),黑馬頭條heima-leadnews-file-starter模塊中,將基于MinIO創(chuàng)建對(duì)象存儲(chǔ)服務(wù)封裝為starter,其他服務(wù)想要使用時(shí),只需設(shè)置對(duì)應(yīng)的配置后,注入對(duì)應(yīng)的服務(wù)即可使用對(duì)象存儲(chǔ)服務(wù)。3.創(chuàng)建對(duì)象存儲(chǔ)服務(wù)11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)在heima-leadnews-file-starter的com.heima.file.config包下創(chuàng)建連接MinIO信息和構(gòu)建MinIO客戶端實(shí)例的配置類,具體如文件11-10和11-11所示。3.創(chuàng)建對(duì)象存儲(chǔ)服務(wù)文件11-10MinIOConfigProperties.java文件11-11MinIOConfig.java源代碼11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)在heima-leadnews-file-starter的com.heima.file.service和com.heima.file.service.impl包下分別創(chuàng)建操作MinIO的接口和對(duì)應(yīng)的實(shí)現(xiàn)類,具體如文件11-12和11-13所示。4.創(chuàng)建操作MinIO的接口和類文件11-12FileStorageService.java文件11-13MinIOFileStorageService.java源代碼11.4.2
創(chuàng)建對(duì)象存儲(chǔ)服務(wù)在heima-leadnews-file-starter的resources/META-INF目錄下,創(chuàng)建名稱為spring.factories的文件,在文件中啟用com.heima.file.service.impl.MinIOFileStorageService自動(dòng)配置,具體如文件11-14所示。5.自動(dòng)配置對(duì)象存儲(chǔ)服務(wù)類文件11-14spring.factories源代碼11.4.3
素材管理先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握素材管理,能夠?qū)崿F(xiàn)素材上傳和素材列表查詢11.4.3
素材管理1.素材上傳在黑馬頭條中進(jìn)行素材上傳時(shí),將所有素材保存到MinIO對(duì)象存儲(chǔ)系統(tǒng),并在數(shù)據(jù)庫(kù)中存儲(chǔ)該素材在MinIO中的地址。為了快速定位上傳素材的所有者,需要同時(shí)保存當(dāng)前上傳素材的用戶信息,下面,對(duì)素材上傳的實(shí)現(xiàn)進(jìn)行講解。在heima-leadnews-wemedia模塊的erceptor包下創(chuàng)建攔截器WmTokenInterceptor,具體如文件11-15所示。文件11-15WmTokenInterceptor.java源代碼11.4.3
素材管理1.素材上傳在heima-leadnews-wemedia模塊的com.heima.wemedia.config包下創(chuàng)建配置類,具體如文件11-16所示。文件11-16WebMvcConfig.java源代碼11.4.3
素材管理1.素材上傳在heima-leadnews-wemedia模塊的com.heima.wemedia.controller包下創(chuàng)建素材管理的控制器類,在該類中定義方法處理素材上傳的請(qǐng)求,具體如文件11-17所示。文件11-17WmMaterialController.java源代碼11.4.3
素材管理1.素材上傳在heima-leadnews-wemedia模塊的com.heima.wemedia.service和com.heima.wemedia.service.impl包下分別創(chuàng)建素材管理的接口和實(shí)現(xiàn)類,在接口和實(shí)現(xiàn)類中定義處理素材上傳的方法,具體如文件11-18和文件11-19所示。文件11-18WmMaterialService.java文件11-19WmMaterialServiceImpl.java源代碼11.4.3
素材管理1.素材上傳在heima-leadnews-wemedia模塊的com.heima.wemedia.mapper包下創(chuàng)建素材管理的Mapper,具體如文件11-20。文件11-20WmMaterialMapper.java源代碼11.4.3
素材管理1.素材上傳在Nacos的配置列表的leadnews-wemedia配置中添加MinIO配置信息,讓程序進(jìn)行素材上傳時(shí),根據(jù)設(shè)置的MinIO信息進(jìn)行連接和操作,具體配置如下所示。添加的MinIO配置信息源代碼11.4.3
素材管理1.素材上傳依次啟動(dòng)MinIO、Nacos、Nginx、WeMediaApplication、WemediaGatewayAplication后,在瀏覽器中訪問(wèn)登錄自媒體端,在自媒體端的后臺(tái)首頁(yè)單擊“素材管理”菜單,進(jìn)入素材管理界面。11.4.3
素材管理1.素材上傳素材管理界面右上方有一個(gè)“上傳圖片”按鈕,單擊該按鈕,會(huì)彈出圖片上傳的對(duì)話框。11.4.3
素材管理1.素材上傳單擊“選擇圖片”可以選擇需要上傳的圖片,選擇好圖片后單擊“開始上傳”會(huì)將選擇的圖片上傳到MinoIO中。11.4.3
素材管理2.素材列表查詢?cè)谖募?1-17的WmMaterialController控制器類中定義素材列表查詢的方法,處理素材查詢的請(qǐng)求,具體如下所示。@PostMapping("/list")publicResponseResultfindList(@RequestBodyWmMaterialDtodto){returnwmMaterialService.findList(dto);}11.4.3
素材管理2.素材列表查詢?cè)谖募?1-18的WmMaterialService接口中,定義素材列表查詢的方法,具體如下所示。publicResponseResultfindList(WmMaterialDtodto);11.4.3
素材管理2.素材列表查詢?cè)谖募?1-19的WmMaterialServiceImpl類中,重寫接口中素材列表查詢的方法,具體如下所示。重寫接口中素材列表查詢的方法源代碼11.4.3
素材管理2.素材列表查詢重新啟動(dòng)WeMediaApplication,登錄自媒體端后臺(tái)后,單擊“素材管理”菜單。11.4.4
發(fā)布文章先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握發(fā)布文章,能夠?qū)崿F(xiàn)查詢所有頻道和文章發(fā)布11.4.4
發(fā)布文章單擊左側(cè)的“發(fā)布文章”菜單,會(huì)彈出發(fā)布文章的界面。11.4.4
發(fā)布文章發(fā)布的文章包括標(biāo)題、正文、標(biāo)簽、頻道和封面等內(nèi)容,其中正文輸入的文本域中可以輸入文字和插入圖片,頻道是從數(shù)據(jù)庫(kù)中獲取的數(shù)據(jù),文章發(fā)布可以選擇存入草稿或提交審核進(jìn)行發(fā)布。為了實(shí)現(xiàn)發(fā)布文章功能,我們可以將發(fā)布文章的實(shí)現(xiàn)分為查詢所有頻道和文章發(fā)布兩個(gè)部分。11.4.4
發(fā)布文章在heima-leadnews-wemedia模塊的com.heima.wemedia.controller包下創(chuàng)建頻道的控制器類,在該類中定義方法處理查詢所有頻道的請(qǐng)求,具體如文件11-21所示。1.查詢所有頻道文件11-21WmChannelController.java源代碼11.4.4
發(fā)布文章在heima-leadnews-wemedia模塊的com.heima.wemedia.service和com.heima.wemedia.service.impl包下分別創(chuàng)建頻道相關(guān)業(yè)務(wù)的接口和實(shí)現(xiàn)類,在接口和實(shí)現(xiàn)類中定義處理素材上傳的方法,具體如文件11-22和文件11-23所示。1.查詢所有頻道文件11-22WmChannelService.java文件11-23WmChannelServiceImpl.java源代碼11.4.4
發(fā)布文章在heima-leadnews-wemedia模塊的com.heima.wemedia.mapper包下創(chuàng)建頻道的Mapper,具體如文件11-24。1.查詢所有頻道文件11-24WmChannelMapper.java源代碼11.4.4
發(fā)布文章重新啟動(dòng)WeMediaApplication,登錄自媒體端后臺(tái)后,在發(fā)布文章界面中單擊頻道下拉框。1.查詢所有頻道11.4.4
發(fā)布文章文章發(fā)布的實(shí)現(xiàn)思路2.文章發(fā)布11.4.4
發(fā)布文章2.文章發(fā)布存入草稿時(shí),只保存文章中的文字內(nèi)容,而不會(huì)保存其中的圖片。新增文章時(shí)會(huì)在自媒體數(shù)據(jù)庫(kù)中新增文章的同時(shí),需要將對(duì)應(yīng)的文章信息同步保存到文章數(shù)據(jù)庫(kù)中,以供用戶端查看已發(fā)布的文章。封面可以選擇單圖、三圖、無(wú)圖和自動(dòng)四種模式,當(dāng)選擇自動(dòng)時(shí),則會(huì)根據(jù)如下規(guī)則設(shè)置封面圖片。(1)如果內(nèi)容圖片大于等于1并且小于3,則以單圖模式展示封面。(2)如果內(nèi)容圖片大于等于3,則以多圖模式展示封面。(3)如果內(nèi)容沒(méi)有圖片,則以無(wú)圖模式展示封面。11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-wemedia模塊的com.heima.wemedia.controller包下創(chuàng)建文章業(yè)務(wù)的控制器類,在該類中定義方法處理的自媒體端存入草稿和提交審核的請(qǐng)求,具體如文件11-25所示。文件11-25WmNewsController.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-wemedia模塊的com.heima.wemedia.service包下創(chuàng)建文章相關(guān)業(yè)務(wù)的接口,在接口中定義處理存入草稿和提交審核的方法,具體如文件11-26所示。文件11-26WmNewsService.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-wemedia模塊的com.heima.wemedia.service.impl包下創(chuàng)建文章相關(guān)業(yè)務(wù)接口的實(shí)現(xiàn)類,在實(shí)現(xiàn)類中重寫處理存入草稿和提交審核的方法,具體如文件11-27所示。文件11-27WmNewsServiceImpl.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-wemedia模塊的com.heima.wemedia.mapper包下創(chuàng)建文章的Mapper,具體如文件11-28。文件11-28WmNewsMapper.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-wemedia模塊的com.heima.wemedia.mapper包下創(chuàng)建關(guān)聯(lián)文章和素材的Mapper,具體如文件11-29。文件11-29WmNewsMaterialMapper.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-wemedia模塊的resources/mapper文件夾下創(chuàng)建WmNewsMaterialMapper對(duì)應(yīng)的映射文件,并在映射文件中定義插入文章和素材關(guān)聯(lián)信息的代碼,具體如文件11-30。文件11-30WmNewsMaterialMapper.xml源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-wemedia模塊的com.heima.wemedia.feign包下創(chuàng)建文章微服務(wù)的Feign客戶端接口,在該接口中定義執(zhí)行的文章保存方法,具體如文件11-31所示。文件11-31IArticleClient.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-wemedia模塊的com.heima.wemedia.feign.fallback包下實(shí)現(xiàn)IArticleClient接口,并重寫saveArticle()用于服務(wù)容錯(cuò),具體如文件11-32所示。文件11-32IArticleClientFallback.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-article模塊的com.heima.article.controller包下創(chuàng)建用戶端文章的控制器類,在該類中定義方法處理保存文章的請(qǐng)求,具體如文件11-33所示。文件11-33ArticleController.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-article模塊的com.heima.article.service包下創(chuàng)建用戶端文章相關(guān)業(yè)務(wù)的接口,在接口中定義保存文章的方法,具體如文件11-34所示。文件11-34ApArticleService.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在heima-leadnews-article模塊的com.heima.article.service.impl包下創(chuàng)建用戶端文章相關(guān)業(yè)務(wù)接口的實(shí)現(xiàn)類,在實(shí)現(xiàn)類中重寫保存文章的方法,保存文章時(shí)根據(jù)當(dāng)前文章Id判斷是保存文章還是更新文章,具體如文件11-35所示。文件11-35ApArticleServiceImpl.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布保存或更新文章時(shí),需要同步操作文章信息、文章內(nèi)容、文章配置三個(gè)表中的數(shù)據(jù),對(duì)此需要?jiǎng)?chuàng)建操作這三個(gè)表的Mapper,具體如文件11-36~文件11-38所示。文件11-36ApArticleMapper.java文件11-37ApArticleContentMapper.java文件11-38ApArticleConfigMapper.java源代碼11.4.4
發(fā)布文章2.文章發(fā)布在自媒體微服務(wù)heima-leadnews-article的bootstrap.yml配置文件中設(shè)置應(yīng)用程序配置,主要包括應(yīng)用的端口、名稱、注冊(cè)中心和配置中心等信息,具體如文件11-39所示。文件11-39bootstrap.yml源代碼11.4.4
發(fā)布文章2.文章發(fā)布在Nacos配置列表的public命名空間下添加DataID為leadnews-article,Group為DEFAULT_GROUP,配置格式為YAML的配置,配置內(nèi)容如下所示。添加的配置內(nèi)容源代碼11.4.4
發(fā)布文章2.文章發(fā)布依次啟動(dòng)ArticleApplication、WeMediaApplication、WemediaGatewayAplication,啟動(dòng)成功后登錄自媒體端后臺(tái),在發(fā)布文章界面中編寫文章內(nèi)容。11.4.4
發(fā)布文章2.文章發(fā)布此時(shí)單擊“提交審核”按鈕發(fā)布文章。11.4.5
內(nèi)容列表先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握內(nèi)容列表,能夠在內(nèi)容列表界面實(shí)現(xiàn)文章列表的查詢11.4.5
內(nèi)容列表1.控制器類中定義文章列表查詢的方法在文件11-25的WmNewsController控制器類中定義文章列表查詢的方法,處理文章列表查詢的請(qǐng)求,具體如下所示。@PostMapping("/list")publicResponseResultfindList(@RequestBodyWmNewsPageReqDtodto){returnwmNewsService.findList(dto);}11.4.5
內(nèi)容列表2.接口中定義文章列表查詢的方法在文件11-26的WmNewsService接口中,定義文章列表查詢的方法,具體如下所示。publicResponseResultfindList(WmNewsPageReqDtodto);11.4.5
內(nèi)容列表3.重寫接口中查詢文章列表的方法在文件11-27的WmNewsServiceImpl類中,重寫接口中查詢文章列表的方法,具體如下所示。重寫后的方法源代碼11.4.5
內(nèi)容列表4.測(cè)試文章列表查詢重新啟動(dòng)WeMediaApplication,登錄自媒體端后臺(tái)后,單擊“內(nèi)容列表”菜單,效果如下圖。用戶端功能實(shí)現(xiàn)11.511.5.1
用戶登錄先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握用戶登錄,能夠部署用戶端前端項(xiàng)目,并實(shí)現(xiàn)用戶端的用戶登錄11.5.1
用戶登錄1.設(shè)置應(yīng)用程序配置文件11-40bootstrap.yml源代碼在用戶端模塊heima-leadnews-user的bootstrap.yml配置文件中設(shè)置應(yīng)用程序配置,主要包括應(yīng)用的端口、名稱、注冊(cè)中心和配置中心等信息,具體如文件11-40所示。11.5.1
用戶登錄1.設(shè)置應(yīng)用程序配置配置內(nèi)容源代碼啟動(dòng)Nacos并登錄Nacos控制臺(tái)后,在Nacos配置列表的public命名空間下添加DataID為leadnews-user,Group為DEFAULT_GROUP,配置格式為YAML的配置,配置內(nèi)容如下所示。11.5.1
用戶登錄2.編寫用戶端登錄功能代碼在自媒體微服務(wù)heima-leadnews-user的com.heima.user.controller包下創(chuàng)建用戶端登錄的控制器類ApUserLoginController,用于接收用戶端登錄的用戶名和密碼,傳遞給Service層進(jìn)行登錄,具體如文件11-41所示。文件11-41ApUserLoginController.java源代碼11.5.1
用戶登錄2.編寫用戶端登錄功能代碼在heima-leadnews-user模塊的com.heima.user.service包下創(chuàng)建用戶端相關(guān)業(yè)務(wù)的接口ApUserService,具體如文件11-42所示。文件11-42ApUserService.java源代碼11.5.1
用戶登錄2.編寫用戶端登錄功能代碼在heima-leadnews-user子模塊的com.heima.user.service.impl包下創(chuàng)建ApUserService接口的實(shí)現(xiàn)類,具體如文件11-43所示。文件11-43WmUserServiceImpl.java源代碼11.5.1
用戶登錄2.編寫用戶端登錄功能代碼在heima-leadnews-user子模塊的com.heima.user.mapper包下創(chuàng)建ApUserMapper接口繼承BaseMapper接口,具體如文件11-44所示。文件11-44ApUserMapper.java源代碼11.5.1
用戶登錄3.實(shí)現(xiàn)用戶端網(wǎng)關(guān)服務(wù)在heima-leadnews-app-gateway子模塊的bootstrap.yml文件中設(shè)置用戶端網(wǎng)關(guān)配置,具體如文件11-45所示。文件11-45bootstrap.yml源代碼11.5.1
用戶登錄3.實(shí)現(xiàn)用戶端網(wǎng)關(guān)服務(wù)啟動(dòng)Nacos并登錄Nacos控制臺(tái)后,在Nacos配置列表的public命名空間下添加DataID為leadnews-app-gateway,Group為DEFAULT_GROUP,配置格式為YAML的配置,配置內(nèi)容如下所示。配置內(nèi)容源代碼11.5.1
用戶登錄3.實(shí)現(xiàn)用戶端網(wǎng)關(guān)服務(wù)在heima-leadnews-app-gateway子模塊的com.heima.app.gateway.filter包下自定義用于鑒權(quán)的全局過(guò)濾器,具體如文件11-7所示。文件11-46AuthorizeFilter.java源代碼11.5.1
用戶登錄4.部署自媒體端前端項(xiàng)目在nginx的conf\leadnews.conf的文件夾中新建名稱為heima-leadnews-app.conf的配置文件,在該配置文件中添加與自媒體相關(guān)的代理及請(qǐng)求轉(zhuǎn)發(fā)的配置,具體如文件11-47所示。文件11-47heima-leadnews-app.conf源代碼11.5.1
用戶登錄5.測(cè)試用戶端登錄效果依次啟動(dòng)nginx、Nacos服務(wù)端、ArticleApplication、UserApplication、AppGatewayApplication,啟動(dòng)成功后在瀏覽器中訪問(wèn)http://localhost:8802/,進(jìn)入到黑馬頭條的用戶端登錄頁(yè)面。11.5.1
用戶登錄5.測(cè)試用戶端登錄效果輸入數(shù)據(jù)庫(kù)中存在的手機(jī)號(hào)和對(duì)應(yīng)的密碼后,單擊“開始使用”按鈕,跳轉(zhuǎn)到用戶端的首頁(yè)。11.5.2
文章列表先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握文章列表,能夠?qū)崿F(xiàn)用戶端文章列表的展示11.5.2
文章列表1.控制器類中定義加載文章列表的方法在文件11-33的ArticleController類中定義加載文章列表的方法,具體如下所示。@PostMapping("/load")publicResponseResultload(@RequestBodyArticleHomeDtodto){ returnapArticleService.load(dto,ArticleConstants.LOADTYPE_LOAD_MORE);}11.5.2
文章列表2.接口中定義加載文章列表的方法在文件11-34的ApArticleService接口中定義加載文章列表的方法,具體如下所示。publicResponseResultload(ArticleHomeDtodto,Shorttype);11.5.2
文章列表3.重寫接口中加載文章列表的方法在文件11-35的ApArticleServiceImpl類中,重寫ApArticleService接口中加載文章列表的方法,具體如下所示。重寫加載文章列表的方法源代碼11.5.2
文章列表4.Mapper中定義加載文章列表的方法在文件11-36的ApArticleMapper接口中定義加載文章列表的方法,具體如下所示。publicList<ApArticle>loadArticleList(@Param("dto")ArticleHomeDtodto,@Param("type")Shorttype);11.5.2
文章列表5.創(chuàng)建映射文件在heima-leadnews-article模塊的resources/mapper文件夾下創(chuàng)建ApArticleMapper對(duì)應(yīng)的映射文件,并在映射文件中定義查詢文章列表的代碼,具體如文件11-48所示。文件11-48ApArticleMapper.xml源代碼11.5.2
文章列表6.測(cè)試用戶端登錄重新啟動(dòng)UserApplication、ArticleApplication、AppGatewayApplication,登錄用戶端后,跳轉(zhuǎn)到用戶端首頁(yè)。11.5.2
文章列表6.測(cè)試用戶端登錄單擊菜單欄中的其它頻道。11.5.3
文章詳情先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握文章詳情,能夠通過(guò)模板技術(shù)生成文章詳細(xì)頁(yè)面,并在客戶端展示11.5.3
文章詳情通過(guò)文章列表,用戶可以快速瀏覽多篇文章的標(biāo)題和摘要,以便找到感興趣的文章。當(dāng)用戶想要深入了解某篇文章的具體內(nèi)容時(shí),可以單擊文章列表中的文章標(biāo)題進(jìn)入文章詳情頁(yè)面,在文章詳情頁(yè)面,讀者將能夠閱讀文章的完整內(nèi)容。實(shí)現(xiàn)文章詳情通常有如下兩種方式。方式一:根據(jù)文章的ID從文章內(nèi)容表中查詢文章內(nèi)容,并將內(nèi)容返回給瀏覽器進(jìn)行渲染展示。方式二:根據(jù)文章的ID從文章內(nèi)容表中查詢內(nèi)容,并使用模板技術(shù)生成靜態(tài)的HTML文件,然后將該HTML文件保存在指定的位置,并將該文件路徑存儲(chǔ)在數(shù)據(jù)庫(kù)中。在展示文章詳情時(shí),通過(guò)獲取HTML文件的路徑,直接展示對(duì)應(yīng)的文章詳情。11.5.3
文章詳情為了提高用戶體驗(yàn),大部分企業(yè)進(jìn)行開發(fā)時(shí)會(huì)選擇使用方式二,好處在于靜態(tài)HTML文件不需要?jiǎng)討B(tài)生成,直接返回給客戶端,減少了服務(wù)器的負(fù)擔(dān)和資源消耗,提高了網(wǎng)站的性能和響應(yīng)速度,黑馬頭條的客戶端也是基于方式二實(shí)現(xiàn)文章詳情的展示。常用的模板技術(shù)包括Freemarker、Thymeleaf和Velocity等。默認(rèn)情況下,SpringMVC支持Freemarker作為視圖格式。為了使用便捷,黑馬頭條采用Freemarker作為模板引擎。下面對(duì)Freemarker進(jìn)行簡(jiǎn)單介紹,并基于Freemarker實(shí)現(xiàn)文章詳情頁(yè)面的生成11.5.3
文章詳情FreeMarker是一款用Java語(yǔ)言編寫的模板引擎,基于模板和要改變的數(shù)據(jù)生成輸出文本,例如,生成HTML頁(yè)面、配置文件、源代碼等。FreeMarker的設(shè)計(jì)目標(biāo)是使模板與應(yīng)用程序邏輯相分離,從而實(shí)現(xiàn)更清晰、可維護(hù)和可擴(kuò)展的代碼。FreeMarker廣泛應(yīng)用于Java開發(fā)領(lǐng)域,它允許開發(fā)人員將模板和數(shù)據(jù)結(jié)合,生成最終的輸出。1.Freemarker簡(jiǎn)介11.5.3
文章詳情1.Freemarker簡(jiǎn)介11.5.3
文章詳情FreeMarker使用FTL(FreeMarkerTemplateLanguage,F(xiàn)reeMarker模板語(yǔ)言)定義模板,F(xiàn)TL提供了一系列語(yǔ)法和指令,類似于HTML和XML的標(biāo)記語(yǔ)法。為了與HTML和XML標(biāo)記進(jìn)行區(qū)分,F(xiàn)reeMarker標(biāo)簽以#開頭。下面對(duì)FreeMarker中三種常用的指令進(jìn)行講解。1.Freemarker簡(jiǎn)介11.5.3
文章詳情(1)assign指令assign指令用于在頁(yè)面上定義一個(gè)變量,可以定義簡(jiǎn)單類型和對(duì)象類型,具體代碼如下。簡(jiǎn)單類型變量的定義和變
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度辦公樓窗簾節(jié)能減排承包合同4篇
- 二零二五年度農(nóng)機(jī)租賃合同與市場(chǎng)拓展合作
- 2025年度摩托車租賃企業(yè)信用評(píng)價(jià)合同4篇
- 二零二五年度新型城鎮(zhèn)化泥工施工合同范本4篇
- 2025年度個(gè)人貨車租賃與智能物流配送平臺(tái)合作合同4篇
- 二零二五年度農(nóng)產(chǎn)品代銷與農(nóng)產(chǎn)品標(biāo)準(zhǔn)化生產(chǎn)合作合同
- 2025年度棉花新品種研發(fā)與應(yīng)用推廣合同3篇
- 2025版家政服務(wù)行業(yè)農(nóng)民工勞動(dòng)合同示范3篇
- 二零二五年度農(nóng)業(yè)用地土地租賃與農(nóng)業(yè)廢棄物處理合作合同4篇
- 2025年度智慧城市建設(shè)貸款合同-@-1
- 足浴技師與店內(nèi)禁止黃賭毒協(xié)議書范文
- 中國(guó)高血壓防治指南(2024年修訂版)要點(diǎn)解讀
- 2024-2030年中國(guó)光電干擾一體設(shè)備行業(yè)發(fā)展現(xiàn)狀與前景預(yù)測(cè)分析研究報(bào)告
- 湖南省岳陽(yáng)市岳陽(yáng)樓區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期末數(shù)學(xué)試題(解析版)
- 農(nóng)村自建房安全合同協(xié)議書
- 杜仲葉藥理作用及臨床應(yīng)用研究進(jìn)展
- 4S店售后服務(wù)6S管理新規(guī)制度
- 高性能建筑鋼材的研發(fā)與應(yīng)用
- 無(wú)線廣播行業(yè)現(xiàn)狀分析
- 漢語(yǔ)言溝通發(fā)展量表(長(zhǎng)表)-詞匯及手勢(shì)(8-16月齡)
- 高速公路相關(guān)知識(shí)講座
評(píng)論
0/150
提交評(píng)論