版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目2
服務(wù)接口應(yīng)用開(kāi)發(fā)與測(cè)試
學(xué)習(xí)目標(biāo)本項(xiàng)目主要學(xué)習(xí)使用JavaEE開(kāi)源框架編寫(xiě)API接口提供數(shù)據(jù)存儲(chǔ)、通訊、各類服務(wù)等功能。掌握使用SpringBoot框架構(gòu)建后端項(xiàng)目,以及用項(xiàng)目管理工具M(jìn)aven對(duì)Java項(xiàng)目進(jìn)行構(gòu)建、依賴管理。為保證API接口的授權(quán)訪問(wèn),掌握使用通過(guò)SpringSecurity框架和JWT完成接口的權(quán)限控制功能。同時(shí)通過(guò)標(biāo)準(zhǔn)軟件開(kāi)發(fā)過(guò)程實(shí)踐,熟悉接口設(shè)計(jì)、編碼和測(cè)試標(biāo)準(zhǔn)流程以及編寫(xiě)相關(guān)的文檔。
項(xiàng)目介紹將項(xiàng)目二的餐廳點(diǎn)餐系統(tǒng)使用服務(wù)接口的設(shè)計(jì)思路進(jìn)行改造升級(jí),為前后端分離架構(gòu)開(kāi)發(fā)提供后端服務(wù)支撐,使用主流的開(kāi)發(fā)框架SpringBoot,結(jié)合常用的SpringMVC、Mybatis、SpringSecurity等技術(shù)框架實(shí)現(xiàn)登錄認(rèn)證、用戶管理、菜品管理等接口功能。
知識(shí)結(jié)構(gòu)
任務(wù)一
編寫(xiě)接口設(shè)計(jì)文檔01
任務(wù)描述本任務(wù)主要是編寫(xiě)項(xiàng)目的接口設(shè)計(jì)文檔,作為后續(xù)開(kāi)發(fā)接口的標(biāo)準(zhǔn)。
知識(shí)準(zhǔn)備1)接口設(shè)計(jì)文檔在項(xiàng)目開(kāi)發(fā)中,采用前后端分離架構(gòu)開(kāi)發(fā),就需要由前后端開(kāi)發(fā)工程師共同定義接口,編寫(xiě)接口文檔,之后開(kāi)發(fā)人員需根據(jù)這個(gè)接口文檔進(jìn)行開(kāi)發(fā),到項(xiàng)目結(jié)束前都要一直維護(hù)還項(xiàng)目文檔。2)接口文檔作用●約束:在前后端合作開(kāi)發(fā)的項(xiàng)目中,可能會(huì)出現(xiàn)前后端開(kāi)發(fā)人員對(duì)接口理解不一致的情況,在這個(gè)時(shí)候,接口設(shè)計(jì)文檔就起到了約束的作用?!褚?guī)范:在項(xiàng)目中通常會(huì)由多個(gè)開(kāi)發(fā)人員協(xié)同完成,如果沒(méi)有接口設(shè)計(jì)文檔,代碼的實(shí)現(xiàn)邏輯就可能差別很大,從而降低開(kāi)發(fā)效率,增加維護(hù)成本。通過(guò)接口設(shè)計(jì)文檔,就可以規(guī)范項(xiàng)目中接口的實(shí)現(xiàn)思路,方便后期人員查看、維護(hù)。
任務(wù)實(shí)施步驟1:編寫(xiě)接口文檔的項(xiàng)目介紹前言項(xiàng)目概述本系統(tǒng)是應(yīng)用于餐廳的點(diǎn)餐系統(tǒng),共實(shí)現(xiàn)了3種角色及其他功能,分別是餐廳服務(wù)員的點(diǎn)餐、提效結(jié)賬功能;后廚的配菜功能;管理員的結(jié)賬、用戶管理等功能。從而實(shí)現(xiàn)餐廳管理信息化的作用,同時(shí)也有效提升了點(diǎn)餐、配菜、結(jié)賬等工作的效率。用戶故事根據(jù)用戶故事識(shí)別系統(tǒng)必須處理的各種請(qǐng)求,識(shí)別出應(yīng)用程序的核心系統(tǒng)操作,見(jiàn)用戶故事接口表3-1。t
任務(wù)實(shí)施步驟1:編寫(xiě)接口文檔的項(xiàng)目介紹t表3-1用戶故事接口表
任務(wù)實(shí)施步驟1:編寫(xiě)接口文檔的項(xiàng)目介紹t功能模塊根據(jù)用戶故事,將接口大致劃分為幾個(gè)模塊,詳情表3-2:表3-2功能模塊表
任務(wù)實(shí)施步驟2:編寫(xiě)登錄模塊的接口設(shè)計(jì)t1)用戶登錄模塊接口描述
用戶登錄模塊接口描述見(jiàn)表3-3表3-3登錄功能接口表
任務(wù)實(shí)施步驟2:編寫(xiě)登錄模塊的接口設(shè)計(jì)t2)用戶登錄接口設(shè)計(jì)(1)接口說(shuō)明:請(qǐng)求方式為“POST”,請(qǐng)求地址為“/login”。(2)功能說(shuō)明:用戶通過(guò)提交用戶名和密碼,獲取授權(quán)的token標(biāo)志,并獲取用戶信息。(3)請(qǐng)求參數(shù)(輸入值)見(jiàn)表3-4。表3-4登錄接口參數(shù)表
任務(wù)實(shí)施步驟2:編寫(xiě)登錄模塊的接口設(shè)計(jì)t(4)響應(yīng)參數(shù)(輸出值)見(jiàn)表3-5。表3-5登錄接口響應(yīng)表
任務(wù)實(shí)施步驟2:編寫(xiě)登錄模塊的接口設(shè)計(jì)t(5)輸出值JSON格式示例
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t用戶管理用戶管理接口見(jiàn)表3-6
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t1)用戶列表接口設(shè)計(jì)(1)接口說(shuō)明:請(qǐng)求方式為“GET”,請(qǐng)求地址為“/admin/user/getuserbypage”。(2)功能說(shuō)明:通過(guò)分頁(yè)頁(yè)碼,查詢列表數(shù)據(jù)。(3)請(qǐng)求參數(shù)(輸入值)見(jiàn)表3-7。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(4)響應(yīng)參數(shù)(輸出值)見(jiàn)表3-5。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(5)輸出值JSON格式示例
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t2)新增用戶接口設(shè)計(jì)(1)接口說(shuō)明:請(qǐng)求方式為“POST”,請(qǐng)求地址為“/admin/user/adduser”。(2)功能說(shuō)明:新增一條用戶記錄。(3)請(qǐng)求參數(shù)(輸入值):UserInfo見(jiàn)表3-9。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(4)響應(yīng)參數(shù)(輸出值)見(jiàn)表3-10。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(5)輸出值JSON格式示例
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t3)刪除用戶接口設(shè)計(jì)(1)接口說(shuō)明:請(qǐng)求方式為“POST”,請(qǐng)求地址為“/admin/user/deleteuser”。(2)功能說(shuō)明:刪除一條用戶記錄。(3)請(qǐng)求參數(shù)(輸入值)見(jiàn)表3-11。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(4)響應(yīng)參數(shù)(輸出值)見(jiàn)表3-12。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(5)輸出值JSON格式示例
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t4)更新用戶接口設(shè)計(jì)(1)接口說(shuō)明:請(qǐng)求方式為“POST”,請(qǐng)求地“/admin/user/adminmodifyuser”。(2)功能說(shuō)明:更新用戶記錄。(3)請(qǐng)求參數(shù)(輸入值)見(jiàn)表3-13。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(4)響應(yīng)參數(shù)(輸出值)見(jiàn)表3-14。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(5)輸出值JSON格式示例
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t5)查詢用戶接口設(shè)計(jì)(1)接口說(shuō)明:請(qǐng)求方式為“GET”,請(qǐng)求地址為“/admin/user/get”。(2)功能說(shuō)明:通過(guò)用戶ID查詢數(shù)據(jù)。(3)請(qǐng)求參數(shù)(輸入值)見(jiàn)表3-15。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(4)響應(yīng)參數(shù)(輸出值)見(jiàn)表3-16。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(5)輸出值JSON格式示例
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t6)驗(yàn)證用戶名是否可用的接口設(shè)計(jì)(1)接口說(shuō)明:請(qǐng)求方式為“POST”,請(qǐng)求地址為“/admin/user/checkuser”。(2)功能說(shuō)明:檢查用戶名是否可用。(3)請(qǐng)求參數(shù)(輸入值)見(jiàn)表3-17
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(4)響應(yīng)參數(shù)(輸出值)見(jiàn)表3-18。
任務(wù)實(shí)施步驟3:編寫(xiě)用戶管理模塊的接口設(shè)計(jì)t(5)輸出值JSON格式示例
拓展練習(xí)按照該任務(wù)的步驟2、3設(shè)計(jì)菜品管理、訂單流程的接口設(shè)計(jì)。
知識(shí)小結(jié)本任務(wù)主要是編寫(xiě)項(xiàng)目的接口設(shè)計(jì)文檔,在編寫(xiě)文檔過(guò)程中了解項(xiàng)目接口設(shè)計(jì)的基本內(nèi)容,掌握接口文檔的基本結(jié)構(gòu)和接口規(guī)范。編寫(xiě)接口設(shè)計(jì)文檔包含下面核心內(nèi)容:1.定義接口的請(qǐng)求方式和請(qǐng)求地址;2.描述接口功能邏輯;3.定義輸入值,請(qǐng)求參數(shù);4.定義輸出值,響應(yīng)參數(shù);5.定義輸出值JSON格式。本任務(wù)知識(shí)技能點(diǎn)與等級(jí)證書(shū)對(duì)應(yīng)關(guān)系見(jiàn)表3-19:
知識(shí)小結(jié)謝謝您的觀看!
任務(wù)二
搭建SpringBoot項(xiàng)目基礎(chǔ)02
任務(wù)描述本任務(wù)將通過(guò)STS搭建基本的SpringBoot項(xiàng)目,并通過(guò)配置Maven依賴,引入常用的項(xiàng)目基礎(chǔ)框架;另外,還會(huì)引入項(xiàng)目中需要用到的基礎(chǔ)工具類,通過(guò)以上的工作,搭建一個(gè)基本可用的SpringBoot項(xiàng)目。
知識(shí)準(zhǔn)備1.SpringBoot框架SpringBoot是一個(gè)框架、一種全新的編程規(guī)范,簡(jiǎn)化了Spring眾多框架中所需的大量且繁瑣的配置文件,讓文件配置變的相當(dāng)簡(jiǎn)單,讓?xiě)?yīng)用部署變的簡(jiǎn)單,可以快速開(kāi)啟一個(gè)Web容器進(jìn)行開(kāi)發(fā),所以SpringBoot是一個(gè)服務(wù)于框架的框架,服務(wù)范圍是簡(jiǎn)化配置文件。
知識(shí)準(zhǔn)備2.SpringBoot的核心功能010203可獨(dú)立運(yùn)行的Spring項(xiàng)目:SpringBoot可以以jar包的形式獨(dú)立運(yùn)行。內(nèi)嵌的Servlet容器:SpringBoot可以選擇內(nèi)嵌Tomcat、Jetty或者Undertow,無(wú)須以war包形式部署項(xiàng)目。簡(jiǎn)化的Maven配置:Spring提供推薦的基礎(chǔ)POM文件來(lái)簡(jiǎn)化Maven配置。
知識(shí)準(zhǔn)備040506自動(dòng)配置Spring:SpringBoot會(huì)根據(jù)項(xiàng)目依賴來(lái)自動(dòng)配置Spring框架,極大地減少項(xiàng)目要使用的配置。提供生產(chǎn)就緒型功能:提供可以直接在生產(chǎn)環(huán)境中使用的功能,如性能指標(biāo)、應(yīng)用信息和應(yīng)用健康檢查。無(wú)代碼生成和xml配置:SpringBoot不生成代碼。完全不需要任何xml配置即可實(shí)現(xiàn)Spring的所有配置
知識(shí)準(zhǔn)備3Maven項(xiàng)目管理工具M(jìn)aven是項(xiàng)目管理工具,主要有兩大作用:項(xiàng)目構(gòu)建和依賴管理。項(xiàng)目構(gòu)建就是項(xiàng)目編譯、測(cè)試、集成發(fā)布實(shí)現(xiàn)自動(dòng)化,依賴管理是很方便的功能,只要把當(dāng)前項(xiàng)目所依賴的構(gòu)件(jar、war等)寫(xiě)到pom配置文件中,就可以從倉(cāng)庫(kù)中自動(dòng)導(dǎo)入對(duì)應(yīng)的構(gòu)件及構(gòu)件依賴的其他構(gòu)件,不同的maven項(xiàng)目共享一個(gè)構(gòu)件倉(cāng)庫(kù),項(xiàng)目引用倉(cāng)庫(kù)中的構(gòu)建,避免重復(fù)下載。
任務(wù)實(shí)施步驟1:創(chuàng)建項(xiàng)目t1在STS中單擊“File”菜單,選擇“New”->“SpringStarterProject”創(chuàng)建SpringBoot項(xiàng)目,如圖3-1所示:
任務(wù)實(shí)施步驟1:創(chuàng)建項(xiàng)目t2添加項(xiàng)目信息,填寫(xiě)包名和唯一標(biāo)志等項(xiàng)目信息,填寫(xiě)完畢后點(diǎn)擊“Next”進(jìn)入下一步,過(guò)程如圖3-2所示:
任務(wù)實(shí)施步驟1:創(chuàng)建項(xiàng)目t3“NewSpringStarterProjectDependencies”窗口,單擊選擇“Web->SpringWeb”,單擊“Finish”按鈕,過(guò)程如圖3-3所示:
任務(wù)實(shí)施步驟2:創(chuàng)建項(xiàng)目結(jié)構(gòu)t1在項(xiàng)目目錄下,分別新建下列的包,把功能相關(guān)的類或接口組織在同一個(gè)包中,方便類的查找和使用。包名描述見(jiàn)表3-20。
任務(wù)實(shí)施步驟2:創(chuàng)建項(xiàng)目結(jié)構(gòu)t2創(chuàng)建后結(jié)果如圖3-4所示
任務(wù)實(shí)施步驟3:編寫(xiě)maven依賴文件t在pom.xml文件中,添加如下代碼引入commons-lang3包:
任務(wù)實(shí)施步驟4:引入工具類t1獲取教材提供的代碼包,解壓到本地目錄,如圖3-5所示
任務(wù)實(shí)施步驟4:引入工具類t2引入公共代碼,將代碼包中common的代碼,復(fù)制到項(xiàng)目目錄common包下,結(jié)果如圖3-6所示:
任務(wù)實(shí)施步驟4:引入工具類t3引入的common包下的公共類功能如下:“common.constant”包下的常量類見(jiàn)表3-21。
任務(wù)實(shí)施步驟4:引入工具類t
任務(wù)實(shí)施步驟4:引入工具類t
任務(wù)實(shí)施步驟4:引入工具類t4引入工具類,將代碼包中util的代碼,復(fù)制到項(xiàng)目目錄util包下,結(jié)果如圖3-7所示:
任務(wù)實(shí)施步驟4:引入工具類t5引入的util包下的工具類功能如下:“util”包下的工具類見(jiàn)表3-25。
任務(wù)實(shí)施步驟4:測(cè)試運(yùn)行t4
在api包下新建TestController類,結(jié)果如圖3-8所示:
任務(wù)實(shí)施步驟4:測(cè)試運(yùn)行t2在TestController中編寫(xiě)下面的代碼用于驗(yàn)證:@RestController@RequestMapping("/test")publicclassTestController{@GetMapping("first")publicStringtest(){return"Helloworld!";}@GetMapping("res")publicResultsresult(){returnResults.success("Helloworld!");}}
任務(wù)實(shí)施步驟4:測(cè)試運(yùn)行t3在項(xiàng)目名處右鍵,單擊選擇“RunAs->SpringBootApp”運(yùn)行項(xiàng)目,過(guò)程如圖3-9所示:
任務(wù)實(shí)施步驟4:測(cè)試運(yùn)行t4驗(yàn)證項(xiàng)目,訪問(wèn)接口:8080/test/res,出現(xiàn)下面的返回?cái)?shù)據(jù),說(shuō)明項(xiàng)目基礎(chǔ)創(chuàng)建成功,結(jié)果如圖3-10所示:
知識(shí)小結(jié)【對(duì)應(yīng)證書(shū)技能】
SpringBoot框架用來(lái)簡(jiǎn)化項(xiàng)目的初始搭建以及開(kāi)發(fā)過(guò)程,該框架中有兩個(gè)非常重要的策略:開(kāi)箱即用和約定優(yōu)于配置。開(kāi)箱即用,是指通過(guò)在MAVEN項(xiàng)目的pom文件中添加相關(guān)依賴包,使用注解來(lái)代替繁瑣的XML配置文件來(lái)管理對(duì)象的生命周期;約定優(yōu)于配置,是由SpringBoot本身來(lái)配置目標(biāo)結(jié)構(gòu),由開(kāi)發(fā)者在結(jié)構(gòu)中添加信息的軟件設(shè)計(jì)范式。這2個(gè)特點(diǎn)使得開(kāi)發(fā)人員擺脫了復(fù)雜的配置工作以及依賴的管理工作,更加專注于業(yè)務(wù)邏輯,并且可以將代碼編譯、測(cè)試和打包等工作自動(dòng)化。通過(guò)本任務(wù)需要理解SpringBoot是一些庫(kù)的集合,它能夠被任意項(xiàng)目的構(gòu)建系統(tǒng)所使用,掌握使用SpringBoot框架搭建后端項(xiàng)目,掌握使用Maven工具管理項(xiàng)目的依賴版本。
知識(shí)小結(jié)本任務(wù)知識(shí)技能點(diǎn)與等級(jí)證書(shū)對(duì)應(yīng)關(guān)系見(jiàn)表3-26:謝謝您的觀看!
任務(wù)三
實(shí)現(xiàn)API的Token認(rèn)證03
任務(wù)描述本任務(wù)將通過(guò)SpringSecurity和JsonWebToken(JWT)完成接口的權(quán)限控制,即在未登錄前無(wú)法訪問(wèn)受保護(hù)的接口,成功登錄獲取到token后,能夠通過(guò)token訪問(wèn)受保護(hù)的接口。
知識(shí)準(zhǔn)備1SpringSecurity框架SpringSecurity框架是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問(wèn)控制框架。它是用于保護(hù)基于Spring的應(yīng)用程序的實(shí)際標(biāo)準(zhǔn)。SpringSecurity致力于為Java應(yīng)用程序提供身份驗(yàn)證和授權(quán)。SpringBoot對(duì)于SpringSecurity提供了自動(dòng)化配置方案,可以零配置使用SpringSecurity。
知識(shí)準(zhǔn)備2數(shù)據(jù)庫(kù)連接池?cái)?shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是再重新建立一個(gè);在項(xiàng)目中,一般情況下訪問(wèn)數(shù)據(jù)庫(kù),會(huì)創(chuàng)建一個(gè)連接,用完后就關(guān)閉它,對(duì)于簡(jiǎn)單的系統(tǒng)這樣不會(huì)帶來(lái)什么明顯的性能上的開(kāi)銷(xiāo)。但是對(duì)于一個(gè)復(fù)雜的系統(tǒng),頻繁的建立、關(guān)閉連接,會(huì)極大的減低系統(tǒng)的性能,因?yàn)閷?duì)于數(shù)據(jù)庫(kù)連接的使用可能會(huì)成為系統(tǒng)性能的瓶頸。數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是再重新建立一個(gè);釋放空閑時(shí)間超過(guò)最大空閑時(shí)間的數(shù)據(jù)庫(kù)連接來(lái)避免因?yàn)闆](méi)有釋放數(shù)據(jù)庫(kù)連接而引起的數(shù)據(jù)庫(kù)連接遺漏。
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t1在pom.xml文件中,引入MySQL驅(qū)動(dòng)包、Mybatis框架、SpringSecurity框架以及JWT包,添加下面的代碼:<!--mybatis--><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version></dependency><!--數(shù)據(jù)庫(kù)驅(qū)動(dòng)--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>8.0.15</version></dependency><!--springsecurity安全認(rèn)證--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><!--Token生成與解析--><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version></dependency>
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t2選中perties文件,右鍵單擊,依次選擇“Refactor->Rename”打開(kāi)重命名窗口,將perties文件重命名為application.yml文件,結(jié)果如圖3-11所示:
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t3)在application.yml文件中,添加下面的代碼server:port:8080#指定打印日志配置logging:level:#定義項(xiàng)目mapper包下的日志打印機(jī)別為debugcom.chinasofti.ordersys.mapper:DEBUGspring:profiles:active:dev#熱編譯devtools:restart:#需要實(shí)時(shí)更新的目錄additional-paths:resources/**,static/**,templates/**datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://:3306/ordersys?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTCusername:rootpassword:rootplatform:mysql
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t#連接池配置type:com.zaxxer.hikari.HikariDataSourcehikari:#連接池中允許的最小連接數(shù)。缺省值:10minimum-idle:10#連接池中允許的最大連接數(shù)。缺省值:10maximum-pool-size:100#自動(dòng)提交auto-commit:true#一個(gè)連接idle狀態(tài)的最大時(shí)長(zhǎng)(毫秒),超時(shí)則被釋放(retired),缺省:10分鐘idle-timeout:30000#連接池名字pool-name:HikariCP#一個(gè)連接的生命時(shí)長(zhǎng)(毫秒),超時(shí)而且沒(méi)被使用則被釋放(retired),缺省:30分鐘,建議設(shè)置比數(shù)據(jù)庫(kù)超時(shí)時(shí)長(zhǎng)少30秒max-lifetime:1800000#等待連接池分配連接的最大時(shí)長(zhǎng)(毫秒),超過(guò)這個(gè)時(shí)長(zhǎng)還沒(méi)可用的連接則發(fā)生SQLException,缺省:30秒connection-timeout:30000#數(shù)據(jù)庫(kù)連接測(cè)試語(yǔ)句connection-test-query:SELECT1mybatis:#指定實(shí)體類存放的包路徑type-aliases-package:com.chinasofti.ordersys.model#指定mapper.xml文件的位置為/mybatis-mappers/下的所有xml文件mapper-locations:classpath:/mybatis-mappers/*#轉(zhuǎn)換到駝峰命名configuration:mapUnderscoreToCamelCase:true#token配置token:#令牌自定義標(biāo)識(shí)header:Authorization#令牌秘鑰#secret:abcdefghijklmnopqrstuvwxyzsecret:(OREDERSYS:)_$^11244^%$_(IS:)_@@++--(BAD:)_++++_.sds_(GUY:)#令牌有效期(默認(rèn)30分鐘)expireTime:60
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t4在common包下引入認(rèn)證工具類,下載教材提供的代碼包并解壓到本地目錄,結(jié)果如圖3-12所示:
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t5將代碼包中common文件夾下的代碼,復(fù)制到項(xiàng)目目錄common包下,結(jié)果如圖3-13所示:
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t6在util包下引入認(rèn)證工具類,將代碼包中util的代碼,復(fù)制到項(xiàng)目目錄util包下,結(jié)果如圖3-14所示::
任務(wù)實(shí)施步驟1:引入認(rèn)證工具類t
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t1在項(xiàng)目目錄config包下,右鍵config包,依次選擇“New->Class”,創(chuàng)建SecuityConfig類文件,結(jié)果如圖3-15所示:
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t2SecurityConfig類需要繼承WebSecurityConfigurerAdapter抽象類,重寫(xiě)configure(HttpSecurityhttp)方法,用來(lái)配置資源訪問(wèn)權(quán)限和驗(yàn)證用戶權(quán)限信息,在SecurityConfig.java文件中添加下面的代碼:/**springsecurity配置*/@EnableGlobalMethodSecurity(prePostEnabled=true,securedEnabled=true)publicclassSecurityConfigextendsWebSecurityConfigurerAdapter{/**自定義用戶認(rèn)證邏輯*/@AutowiredprivateUserDetailsServiceuserDetailsService;/**認(rèn)證失敗處理類*/@AutowiredprivateAuthenticationEntryPointImplunauthorizedHandler;/**token認(rèn)證過(guò)濾器*/@AutowiredprivateJwtAuthenticationTokenFilterauthenticationTokenFilter;/**解決
無(wú)法直接注入AuthenticationManager*@return*@throwsException*/@Bean@OverridepublicAuthenticationManagerauthenticationManagerBean()throwsException{returnsuper.authenticationManagerBean();}
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t/**強(qiáng)散列哈希加密實(shí)現(xiàn)*/@BeanpublicBCryptPasswordEncoderbCryptPasswordEncoder(){returnnewBCryptPasswordEncoder();}/**身份認(rèn)證接口*/@Overrideprotectedvoidconfigure(AuthenticationManagerBuilderauth)throwsException{auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());}}
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t3編寫(xiě)SecurityConfig類,根據(jù)接口服務(wù)的項(xiàng)目特點(diǎn),我們需要在認(rèn)證服務(wù)中解決下面的問(wèn)題:①默認(rèn)情況下,接口的權(quán)限控制②允許登錄接口,靜態(tài)資源的匿名訪問(wèn)③JWT接入到Security框架為了解決上述的問(wèn)題,下面重寫(xiě)configure(HttpSecurityhttp)方法,我們?cè)赟ecurityConfig.java文件中添加下面的代碼:
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t@Overrideprotectedvoidconfigure(HttpSecurityhttpSecurity)throwsException{httpSecurity.csrf().disable()//CRSF禁用,因?yàn)椴皇褂胹ession//認(rèn)證失敗處理類.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()//基于token,所以不需要session.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()//過(guò)濾請(qǐng)求//對(duì)于登錄login接口允許匿名訪問(wèn),.antMatchers("/login","/api","/t").anonymous()//除上面外的所有請(qǐng)求全部需要鑒權(quán)認(rèn)證.anyRequest().authenticated().and().headers().frameOptions().disable();//添加JWTfilterhttpSecurity.addFilterBefore(authenticationTokenFilter,UsernamePasswordAuthenticationFilter.class);}
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t在上面的代碼中,重點(diǎn)關(guān)注幾個(gè)部分:
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t4編寫(xiě)ConfigurerAdapter類,由于現(xiàn)代瀏覽器的請(qǐng)求策略,前后端服務(wù)使用的域名不一致的情況下,會(huì)導(dǎo)致接口訪問(wèn)異常;在本項(xiàng)目中,通過(guò)后臺(tái)的跨域配置,解決此問(wèn)題。在項(xiàng)目目錄config包下,右鍵config包,依次選擇“New”->“Class”,創(chuàng)建ConfigurerAdapter類文件,結(jié)果如圖3-16所示:
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t5在ConfigurerAdapter類文件中,編寫(xiě)下面的代碼,啟用服務(wù)器的跨域配置。@Configuration@EnableWebMvcpublicclassConfigurerAdapterimplementsWebMvcConfigurer{//令牌自定義標(biāo)識(shí)@Value("${token.header}")privateStringheader;@BeanpublicCorsFiltercorsFilter(){UrlBasedCorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource();CorsConfigurationconfig=newCorsConfiguration();config.setAllowCredentials(true);config.addAllowedOrigin("*");config.addAllowedHeader("*");config.addAllowedMethod("*");config.setExposedHeaders(Arrays.asList(header));source.registerCorsConfiguration("/**",config);returnnewCorsFilter(source);}}
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t6編寫(xiě)GlobalExceptionHandler類用于全局錯(cuò)誤處理,在項(xiàng)目目錄config包下,右鍵config包,依次選擇“New”->“Class”,創(chuàng)建GlobalExceptionHandler類文件,結(jié)果如圖3-17所示:
任務(wù)實(shí)施步驟2:編寫(xiě)權(quán)限認(rèn)證配置類t7GlobalExceptionHandler中編寫(xiě)下面的代碼,通過(guò)下面的配置,將應(yīng)用運(yùn)行時(shí)異常全部攔截,并統(tǒng)一進(jìn)行處理,返回自定義的業(yè)務(wù)返回碼。@RestControllerAdvicepublicclassGlobalExceptionHandler{/***攔截所有運(yùn)行時(shí)的全局異常
*/@ExceptionHandler(RuntimeException.class)@ResponseBodypublicResultsruntimeException(RuntimeExceptione){returnResults.failure(ResponseCode.FAIL.getCode(),e.getMessage());}}
任務(wù)實(shí)施步驟3:新建用戶登錄接口t1.新建用戶實(shí)體類(1)在model包下,右鍵model包,依次選擇“New->Class”,新建UserInfo類,結(jié)果如圖3-18所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t(2)在UserInfo類中添加下面的代碼publicclassUserInfo{ privateintuserId;//用戶ID privateStringuserAccount;//用戶賬戶 privateStringuserPass;//用戶密碼 privateintroleId;//用戶角色I(xiàn)D privateStringroleName;//用戶角色名 privateintlocked;//用戶是否被鎖定的標(biāo)識(shí) privateStringfaceimg="default.jpg";//用戶頭像路徑 publicStringgetFaceimg(){ returnfaceimg; } publicvoidsetFaceimg(Stringfaceimg){ this.faceimg=faceimg; } publicintgetLocked(){ returnlocked; } publicvoidsetLocked(intlocked){ this.locked=locked; } publicintgetUserId(){ returnuserId; } publicvoidsetUserId(intuserId){ this.userId=userId; }
任務(wù)實(shí)施步驟3:新建用戶登錄接口t publicStringgetUserAccount(){ returnuserAccount; } publicvoidsetUserAccount(StringuserAccount){ this.userAccount=userAccount; } publicStringgetUserPass(){ returnuserPass; } publicvoidsetUserPass(StringuserPass){ this.userPass=userPass; } publicintgetRoleId(){ returnroleId; } publicvoidsetRoleId(introleId){ this.roleId=roleId; } publicStringgetRoleName(){ returnroleName; } publicvoidsetRoleName(StringroleName){ this.roleName=roleName; }}
任務(wù)實(shí)施步驟3:新建用戶登錄接口t2.新建登錄Mapper接口(1)在mapper包下新建LoginMapper類,結(jié)果如圖3-19所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t(2)在LoginMapper類中添加下面的代碼。@MapperpublicinterfaceLoginMapper{ @Select("selectuserId,userAccount,userPass,locked,roleId,roleName,faceimgfromuserinfo,roleinfowhereuserinfo.role=roleinfo.roleIdanduserinfo.userAccount=#{userAccount}") publicList<UserInfo>findUsersByName(@Param("userAccount")StringuserAccount);}
任務(wù)實(shí)施步驟3:新建用戶登錄接口t3.新建登錄Service類(1)在service包下,右鍵service包,依次選擇“New”->“Package”,新建login包結(jié)果如圖3-20所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t(2)在service.login包下新建LoginService類,結(jié)果如圖3-21所示::
任務(wù)實(shí)施步驟3:新建用戶登錄接口t(3)在LoginService類中添加下面的代碼@ServicepublicclassLoginService{ @AutowiredLoginMappermapper; publicLoginMappergetMapper(){ returnmapper; } publicvoidsetMapper(LoginMappermapper){ this.mapper=mapper; } /**
*根據(jù)用戶名查詢用戶數(shù)據(jù) *@paramuserAccount *@return */ publicUserInfofindUserByName(StringuserAccount){ List<UserInfo>list=mapper.findUsersByName(userAccount); UserInfouserInfo=null; if(null!=list&&list.size()==1){ userInfo=list.get(0); } returnuserInfo; }}
任務(wù)實(shí)施步驟3:新建用戶登錄接口t4.新建登錄Api接口(1)在api包下新建login包,結(jié)果如圖3-22所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t
(2)在api.login包下新建LoginController類,結(jié)果如圖3-23所示
任務(wù)實(shí)施步驟3:新建用戶登錄接口t
(3)在LoginController類中,新增登錄邏輯,添加下面的代碼:@RestControllerpublicclassLoginController{ @AutowiredLoginServiceloginService; @AutowiredSysLoginServicesysLoginService; /**
*登錄方法
*@paramusername用戶名
*@parampassword密碼
*@return結(jié)果 */ @PostMapping("/login") publicResultslogin(Stringusername,Stringpassword){ System.out.println("/login:username["+username+"]"+"password:["+password+"]");
//生成令牌 Stringtoken=sysLoginService.login(username,password); LoginUseruser=UserHandleUtils.getUser(token); UserInfouserInfo=user.getUser(); userInfo.setUserPass(""); Map<String,Object>res=newHashMap<>(3); res.put("token",token); res.put("user",userInfo); returnResults.success(res); }}
任務(wù)實(shí)施步驟3:新建用戶登錄接口t5.添加兩個(gè)用于測(cè)試登陸結(jié)果的接口,添加下面的代碼:@GetMapping({"/auth"}) publicResultsauth(Stringusername){ System.out.println("/auth:username["+username+"]"); //生成令牌 Map<String,Object>res=newHashMap<>(); res.put("api","auth"); res.put("username",username); res.put("msg","登錄后可見(jiàn)"); returnResults.success(res); }
@PreAuthorize("hasRole('3')") @GetMapping({"/waiter"}) publicResultstestRoleWaiter(Stringusername){ System.out.println("/test:username["+username+"]"); //生成令牌 Map<String,Object>res=newHashMap<>(); res.put("api","testRoleWaiter"); res.put("username",username); res.put("msg","服務(wù)員角色可見(jiàn)");_x0005__x0005_ returnResults.success(res); }
任務(wù)實(shí)施步驟3:新建用戶登錄接口t6.運(yùn)行測(cè)試(1)運(yùn)行項(xiàng)目,結(jié)果如圖3-24所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t(2)打開(kāi)PostMan,新建一個(gè)測(cè)試tab,分別填寫(xiě)請(qǐng)求鏈接,然后添加兩個(gè)請(qǐng)求參數(shù),分別是“username”,值為“aa”;“password”,值為“1”,結(jié)果如圖3-25所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t(3)填寫(xiě)完畢點(diǎn)擊“send”按鈕發(fā)送請(qǐng)求,看到返回的用戶信息,說(shuō)明登錄成功。結(jié)果如圖3-26所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t(4)測(cè)試登錄限制接口“/auth”點(diǎn)擊“+”號(hào)新建請(qǐng)求tab,并按照下面的圖設(shè)置請(qǐng)求參數(shù);點(diǎn)擊“Send”按鈕發(fā)送請(qǐng)求。會(huì)看到返回401認(rèn)證失敗的信息;說(shuō)明當(dāng)前接口是被攔截的,結(jié)果如圖3-27所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t(5)設(shè)置Httpheaders
1)首先切換到剛才登錄接口的測(cè)試頁(yè)面,復(fù)制數(shù)據(jù)中的token內(nèi)容,結(jié)果如圖3-28所示:
任務(wù)實(shí)施步驟3:新建用戶登錄接口t
2)回到登錄限制接口“/auth”的測(cè)試界面,打開(kāi)PostMan請(qǐng)求地址欄下方的“Headers”欄,在Key欄下面添加“Authorization”一項(xiàng),并在對(duì)應(yīng)的Value位置,填入剛才復(fù)制的token字符串。點(diǎn)擊“Send”按鈕,發(fā)現(xiàn)請(qǐng)求返回值內(nèi)容變成了200請(qǐng)求成功,說(shuō)明token認(rèn)證功能實(shí)現(xiàn)完畢,結(jié)果如圖3-29所示::
知識(shí)小結(jié)【對(duì)應(yīng)證書(shū)技能】
SpringSecurity致力于為Java應(yīng)用程序提供身份驗(yàn)證和授權(quán),在本任務(wù)中,通過(guò)SpringSecurity實(shí)現(xiàn)接口的權(quán)限配置,實(shí)現(xiàn)自定義的登錄邏輯控制。與之前的WEB項(xiàng)目不同的是,在本項(xiàng)目中使用的是基于JWT的認(rèn)證方式,基于Spring的過(guò)濾器,還有JWT框架,將認(rèn)證信息保存在token中,在請(qǐng)求時(shí)通過(guò)過(guò)濾器將token轉(zhuǎn)換成對(duì)應(yīng)的認(rèn)證信息。通過(guò)本任務(wù)的學(xué)習(xí),理解SpringSecurity加上JWT實(shí)現(xiàn)API的token認(rèn)證思路;掌握使用過(guò)濾器處理請(qǐng)求;掌握在SpringBoot項(xiàng)目中配置數(shù)據(jù)庫(kù)連接池。本任務(wù)知識(shí)技能點(diǎn)與等級(jí)證書(shū)對(duì)應(yīng)關(guān)系見(jiàn)表3-29:
知識(shí)小結(jié)謝謝您的觀看!
任務(wù)四
實(shí)現(xiàn)用戶管理模塊HTTPAPI04
任務(wù)描述本任務(wù)將完成用戶管理模塊,包含用戶的添加、刪除、修改、查詢功能;管理員通過(guò)賬號(hào)密碼生成具有管理員權(quán)限的token后,能夠根據(jù)用戶信息中的用戶ID對(duì)用戶信息進(jìn)行新增、刪除和修改,并通過(guò)接口分頁(yè)獲取用戶信息。在本任務(wù)中,將學(xué)習(xí)如何設(shè)計(jì)API接口。
知識(shí)準(zhǔn)備1.MyBatis框架:見(jiàn)項(xiàng)目22.Mybatis常用注解(1)@Mapper注解添加了@Mapper注解之后,這個(gè)接口在編譯時(shí)會(huì)生成相應(yīng)的實(shí)現(xiàn)類。需要注意的是:這個(gè)接口中不可以定義同名的方法,因?yàn)闀?huì)生成相同的id;也就是說(shuō)這個(gè)接口是不支持重載的。(2)@Insert注解插入sql,和xml<insert>sql語(yǔ)法完全一樣。每個(gè)注解分別代表將會(huì)被執(zhí)行的SQL語(yǔ)句。它們用字符串?dāng)?shù)組(或單個(gè)字符串)作為參數(shù)。如果傳遞的是字符串?dāng)?shù)組,字符串?dāng)?shù)組會(huì)被連接成單個(gè)完整的字符串,每個(gè)字符串之間加入一個(gè)空格。這有效地避免了用Java代碼構(gòu)建SQL語(yǔ)句時(shí)產(chǎn)生的“丟失空格”問(wèn)題。當(dāng)然,你也可以提前手動(dòng)連接好字符串。屬性:value,指定用來(lái)組成單個(gè)SQL語(yǔ)句的字符串?dāng)?shù)組。
知識(shí)準(zhǔn)備(3)@Delete注解刪除sql,和xml<delete>sql語(yǔ)法完全一樣(4)@Update注解更新sql,和xml<update>sql語(yǔ)法完全一樣(5)@Select注解查詢sql,和xml<select>sql語(yǔ)法完全一樣
知識(shí)準(zhǔn)備(6)@Param注解如果你的映射器的方法需要多個(gè)參數(shù),這個(gè)注解可以被應(yīng)用于映射器的方法參數(shù)來(lái)給每個(gè)參數(shù)一個(gè)名字。否則,多參數(shù)將會(huì)以它們的順序位置來(lái)被命名(不包括任何RowBounds參數(shù))比如。#{param1},#{param2}等,這是默認(rèn)的。使用@Param(“person”),參數(shù)應(yīng)該被命名為#{person}。(7)@Options注解這個(gè)注解提供訪問(wèn)交換和配置選項(xiàng)的寬廣范圍,它們通常在映射語(yǔ)句上作為屬性出現(xiàn)。而不是將每條語(yǔ)句注解變復(fù)雜,Options注解提供連貫清晰的方式來(lái)訪問(wèn)它們。
知識(shí)準(zhǔn)備
任務(wù)實(shí)施步驟1:新建用戶Mapper接口t在項(xiàng)目目錄mapper包下,新建UserInfoMapper類,結(jié)果如圖3-30所示:
任務(wù)實(shí)施步驟1:新建用戶Mapper接口t1.在UserInfoMapper類中添加下面的代碼:@MapperpublicinterfaceUserInfoMapper{
@Select("selectuserId,userAccount,userPass,locked,roleId,roleName,faceimgfromuserinfo,roleinfowhereuserinfo.role=roleinfo.roleIdorderbyuserId") publicList<UserInfo>getAllUser();
@Insert("insertintouserinfo(userAccount,userPass,role,faceImg)values(#{info.userAccount},#{info.userPass},#{info.roleId},#{info.faceimg})") @Options(useGeneratedKeys=true,keyProperty="info.userId") publicIntegeraddUser(@Param("info")UserInfouser);
@Select("selectuserId,userAccount,userPass,locked,roleId,roleName,faceimgfromuserinfo,roleinfowhereuserinfo.role=roleinfo.roleIdorderbyuserIdlimit#{first},#{max}") publicList<UserInfo>getUserByPage(@Param("first")intfirst,@Param("max")intmax); @Select("selectcount(*)fromuserinfo") publicLonggetMaxPage();
@Delete("deletefromuserinfowhereuserId=#{userId}") publicvoiddeleteUser(@Param("userId")IntegeruserId);
任務(wù)實(shí)施步驟1:新建用戶Mapper接口t@Update("updateuserinfosetuserPass=#{info.userPass},faceimg=#{info.faceimg}whereuserId=#{info.userId}") publicvoidmodify(@Param("info")UserInfoinfo); @Update("updateuserinfosetuserPass=#{info.userPass},faceimg=#{info.faceimg},role=#{info.roleId}whereuserId=#{info.userId}") publicvoidadminModify(@Param("info")UserInfoinfo); @Select("selectuserId,userAccount,userPass,locked,roleId,roleName,faceimgfromuserinfo,roleinfowhereuserinfo.role=roleinfo.roleIdanduserId=#{userId}") publicUserInfogetUserById(@Param("userId")IntegeruserId); @Select("selectuserId,userAccount,userPass,locked,roleId,roleNamefromuserinfo,roleinfowhereuserinfo.role=roleinfo.roleIdanduserinfo.userId=#{info.userId}") publicList<UserInfo>checkPass(@Param("info")UserInfoinfo);
@Select("selectuserId,userAccount,userPass,locked,roleId,roleName,faceimgfromuserinfo,roleinfowhereuserinfo.role=roleinfo.roleIdanduserinfo.userAccount=#{userAccount}") publicList<UserInfo>findUsersByName(@Param("userAccount")StringuserAccount);}
任務(wù)實(shí)施步驟2:新建用戶Service類t1.在項(xiàng)目目錄service包下,新建admin包,結(jié)果如圖3-31所示:
任務(wù)實(shí)施步驟2:新建用戶Service類t2.在項(xiàng)目目錄service.admin包下,新建UserService類,結(jié)果如圖3-32所示:
任務(wù)實(shí)施步驟2:新建用戶Service類t3.在UserService類中添加下面的代碼@ServicepublicclassUserService{ @AutowiredUserInfoMappermapper; publicUserInfoMappergetMapper(){ returnmapper; } publicvoidsetMapper(UserInfoMappermapper){ this.mapper=mapper; }
}
任務(wù)實(shí)施步驟2:新建用戶Service類t4.在UserService類中添加用于增刪改的方法(1)添加用戶的方法/** *添加用戶的方法 *@paraminfo需要添加的用戶信息 **/ publicvoidaddUser(UserInfoinfo){ //創(chuàng)建加密工具 info.setUserPass(newBCryptPasswordEncoder().encode(info.getUserPass())); //執(zhí)行用戶信息插入操作 mapper.addUser(info); }
任務(wù)實(shí)施步驟2:新建用戶Service類t(2)刪除用戶的方法 /** *刪除用戶的方法 *@paramuserId待刪除用戶的Id **/ publicvoiddeleteUser(IntegeruserId){ //獲取帶有連接池的數(shù)據(jù)庫(kù)模版操作工具對(duì)象 mapper.deleteUser(userId); }
任務(wù)實(shí)施步驟2:新建用戶Service類t(3)修改用戶的方法 /** *修改用戶自身信息的方法 *@paraminfo需要修改的用戶信息,其中userId屬性指明需要修改的用戶ID,其他信息為目標(biāo)值,本人修改信息只能修改密碼和頭像 **/ publicvoidmodify(UserInfoinfo){ //獲取帶有連接池的數(shù)據(jù)庫(kù)模版操作工具對(duì)象 info.setUserPass(newBCryptPasswordEncoder().encode(info.getUserPass())); //修改本人信息 mapper.modify(info); } /** *管理員修改用戶信息的方法 *@paraminfo需要修改的用戶信息,其中userId屬性指明需要修改的用戶ID,其他信息為目標(biāo)值 **/ publicvoidadminModify(UserInfoinfo){ info.setUserPass(newBCryptPasswordEncoder().encode(info.getUserPass())); //修改本人信息 mapper.adminModify(info); }
任務(wù)實(shí)施步驟2:新建用戶Service類t5.在UserService類中添加用于查詢的方法(1)分頁(yè)獲取用戶數(shù)據(jù)的方法/** *分頁(yè)獲取用戶數(shù)據(jù)的方法 *@parampage要獲取數(shù)據(jù)的頁(yè)號(hào) *@parampageSize每頁(yè)顯示的條目數(shù) *@return當(dāng)前頁(yè)的用戶數(shù)據(jù)列表 **/ publicList<UserInfo>getByPage(intpage,intpageSize){ //獲取帶有連接池的數(shù)據(jù)庫(kù)模版操作工具對(duì)象 intfirst=(1)*pageSize; //返回結(jié)果 returnmapper.getUserByPage(first,pageSize); } /** *獲取用戶信息的最大頁(yè)數(shù) *@parampageSize每頁(yè)顯示的條目數(shù) *@return當(dāng)前數(shù)據(jù)庫(kù)中數(shù)據(jù)的最大頁(yè)數(shù) **/ publicintgetMaxPage(intpageSize){ //獲取最大頁(yè)數(shù)信息 Longrows=mapper.getMaxPage(); //返回最大頁(yè)數(shù) return(int)((rows.longValue()-1)/pageSize+1); }
任務(wù)實(shí)施步驟2:新建用戶Service類t(2)根據(jù)ID獲取用戶詳細(xì)信息的方法 /** *根據(jù)ID獲取用戶詳細(xì)信息的方法 *@paramuserId需要獲取詳細(xì)信息的用戶ID *@return返回查詢到的用戶詳細(xì)信息 **/ publicUserInfogetUserById(IntegeruserId){ returnmapper.getUserById(userId); } publicList<UserInfo>findUserByName(StringuserAccount){ returnmapper.findUsersByName(userAccount); }
任務(wù)實(shí)施步驟2:新建用戶Service類t6.在UserService類中添加用于檢查用戶名是否可用的方法/**
*驗(yàn)證用戶用戶名密碼是否正確的方法 *@paraminfo用于判定用戶名、密碼的用戶對(duì)象
*@return用戶名、密碼是否驗(yàn)證通過(guò),true表示用戶名密碼正確、false表示用戶名或密碼錯(cuò)誤 **/ publicbooleancheckPass(UserInfoinfo){
//根據(jù)給定的用戶名查詢用戶信息 List<UserInfo>userList=mapper.checkPass(info);
//判定查詢結(jié)果集合 switch(userList.size()){
//如果沒(méi)有查詢到任何數(shù)據(jù) case0:
//返回驗(yàn)證失敗 returnfalse;
//如果查詢到一條記錄則判定密碼是否一致 case1:
//構(gòu)建加密對(duì)象 BCryptPasswordEncoderencoder=newBCryptPasswordEncoder();
//判定用戶給定的密碼和數(shù)據(jù)庫(kù)中的密碼是否一致 if(encoder.matches(info.getUserPass(),userList.get(0).getUserPass())){
//如果一致,則返回true returntrue;
//如果不一致 }else{
//返回用戶名、密碼不匹配 returnfalse; } }
//其他情況下返回驗(yàn)證失敗 returnfalse; }
任務(wù)實(shí)施步驟3:新建用戶Controller類t1.在項(xiàng)目目錄api包下,新建admin包,結(jié)果如圖3-33所示
任務(wù)實(shí)施步驟3:新建用戶Controller類t2.在項(xiàng)目目錄api.admin包下,新建AdminUserController類,結(jié)果如圖3-34所示:
任務(wù)實(shí)施步驟3:新建用戶Controller類t3.在AdminUserController類中添加下面的代碼@PreAuthorize("hasRole('1')")@RestController@RequestMapping("/admin/user")publicclassAdminUserController{ @AutowiredUserServiceservice; publicUserServicegetService(){ returnservice; } publicvoidsetService(UserServiceservice){ this.service=service; } @RequestMapping("/adminmodifyuser") publicResultsadminModify(UserInfoinfo){if(info.getUserPass().isEmpty()){ info.setUserPass("1"); }
//執(zhí)行修改操作 service.adminModify(info); returnResults.success(info); }
任務(wù)實(shí)施步驟3:新建用戶Controller類t@RequestMapping("/deleteuser") publicResultsdeleteUser(IntegeruserId){ service.deleteUser(userId); returnResults.ok(); } @GetMapping("/get") publicResults<UserInfo>getUser(IntegeruserId){ UserInfouser=service.getUserById(userId); user.setUserPass(""); returnResults.success(user); } @RequestMapping("/getuserbypage") publicPageResultsgetUserByPage(intpage){
//獲取最大頁(yè)碼數(shù) intmaxPage=service.getMaxPage(10);
//對(duì)當(dāng)前的頁(yè)碼數(shù)進(jìn)行糾錯(cuò),如果小于1,則直接顯示第一頁(yè)的內(nèi)容 page=page<1?1:page;
//對(duì)當(dāng)前的頁(yè)碼數(shù)進(jìn)行糾錯(cuò),如果大于最大頁(yè)碼,則直接顯示最后一頁(yè)的內(nèi)容 page=page>maxPage?maxPage:page;
//進(jìn)行分頁(yè)數(shù)據(jù)查詢 List<UserInfo>list=service.getByPage(page,10);
//過(guò)濾掉密碼信息 list=list.stream().map(item->{item.setUserPass("");returnitem;}).collect(Collectors.toList());
//嘗試將結(jié)果結(jié)構(gòu)化 returnPageResults.success(list,page,maxPage); }
任務(wù)實(shí)施步驟3:新建用戶Controller類t@RequestMapping("/modifyuser") publicResultsmodifyMyInfo(UserInfoinfo){ service.modify(info); //修改信息后需要自動(dòng)注銷(xiāo) returnResults.success(info); } @RequestMapping("/adduser") publicResultsaddUser(UserInfoinfo){ //添加用戶 service.addUser(info); //跳轉(zhuǎn)到用戶管理界面 returnResults.success(info); } @RequestMapping("/checkuser") //獲取請(qǐng)求參數(shù)中的用戶名信息 publicResultscheckAddUser(@RequestParam("name")StringuserAccount){ //查詢對(duì)應(yīng)用戶名的用戶信息 List<UserInfo>list=service.findUserByName(userAccount); //如果數(shù)據(jù)庫(kù)中無(wú)數(shù)據(jù) if(list.size()==0){ //輸出可以添加標(biāo)識(shí) returnResults.ok(); //如果數(shù)據(jù)庫(kù)中有數(shù)據(jù) }else{ //輸出不能添加標(biāo)識(shí) returnResults.failure(); } }}
拓展練習(xí)按照該任務(wù)完成菜品管理、訂單流程的接口功能
知識(shí)小結(jié)
MyBatis是優(yōu)秀的優(yōu)秀的持久層框架,它允許開(kāi)發(fā)人員通過(guò)XML文件配置SQL語(yǔ)句的動(dòng)態(tài)拼接,實(shí)現(xiàn)復(fù)雜的查詢功能。而在一些業(yè)務(wù)邏輯相對(duì)直接的查詢中,可以直接通過(guò)注解實(shí)現(xiàn)查詢功能,從而減少維護(hù)XML文件的工作。MyBatis提供了@Insert、@Delete、@Update、@Select等常用的注解,分別對(duì)應(yīng)了增刪改查功能。本任務(wù)通過(guò)實(shí)現(xiàn)用戶管理接口,了解RestfulAPI接口的作用和規(guī)范,掌握RestfulAPI接口實(shí)現(xià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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版企業(yè)人力資源總監(jiān)職責(zé)與權(quán)益合同3篇
- 武漢體育學(xué)院《地下水?dāng)?shù)值模擬基礎(chǔ)與應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 武漢傳媒學(xué)院《現(xiàn)代分析檢驗(yàn)技術(shù)應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度建筑工地安全文明施工評(píng)估合同3篇
- 二零二五版兒童樂(lè)園開(kāi)業(yè)慶典承包合同范本3篇
- 2024陶瓷廠勞務(wù)外派工作合同模板3篇
- 2025版大型工程船舶租賃合同6篇
- 威海職業(yè)學(xué)院《數(shù)值計(jì)算與仿真》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度酒店會(huì)議場(chǎng)地預(yù)訂與策劃服務(wù)合同3篇
- 天津城市職業(yè)學(xué)院《工程光學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 南充化工碼頭管網(wǎng)施工方案(初稿)
- 2023年消防接警員崗位理論知識(shí)考試參考題庫(kù)(濃縮500題)
- GB/T 30285-2013信息安全技術(shù)災(zāi)難恢復(fù)中心建設(shè)與運(yùn)維管理規(guī)范
- 魯濱遜漂流記閱讀任務(wù)單
- 第一章 運(yùn)營(yíng)管理概論1
- 《創(chuàng)意繪畫(huà)在小學(xué)美術(shù)教育中的應(yīng)用(論文)6000字》
- 主體結(jié)構(gòu)驗(yàn)收匯報(bào)材料T圖文并茂
- 管理學(xué)原理(南大馬工程)
- 過(guò)一個(gè)有意義的寒假課件
- 施工現(xiàn)場(chǎng)裝配式集裝箱活動(dòng)板房驗(yàn)收表
- 電力業(yè)擴(kuò)工程竣工驗(yàn)收單
評(píng)論
0/150
提交評(píng)論