




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第10章SpringBoot綜合項目實戰(zhàn)
——瑞吉外賣《SpringBoot企業(yè)級開發(fā)教程(第2版)》學(xué)習(xí)目標(biāo)/Target了解系統(tǒng)概述,能說出系統(tǒng)包含的主要功能和技術(shù)掌握開發(fā)環(huán)境搭建,能夠基于系統(tǒng)開發(fā)及運行環(huán)境搭建數(shù)據(jù)庫環(huán)境和項目環(huán)境掌握管理端功能模塊,能夠?qū)崿F(xiàn)管理端的登錄管理、分類管理、菜品管理、套餐管理、訂單明細(xì)功能模塊掌握用戶端功能模塊,能夠根據(jù)提供的用戶端代碼實現(xiàn)用戶登錄、地址管理、菜品展示、購物車、下單功能模塊章節(jié)概述/Summary通過前面的學(xué)習(xí),讀者應(yīng)該已掌握了SpringBoot框架,以及其他常用技術(shù)的基本知識和整合使用,通過這些已學(xué)的相關(guān)知識,已經(jīng)可以在實際工作中進(jìn)行基本的項目開發(fā)。接下來,使用前面已學(xué)的SpringBoot相關(guān)知識,以及其他常用的技術(shù)實現(xiàn)一個外賣管理系統(tǒng)的開發(fā),使大家課更熟練地掌握SpringBoot框架及相關(guān)技術(shù)的使用。目錄/Contents10.110.2系統(tǒng)概述開發(fā)環(huán)境搭建10.3管理端功能模塊10.4用戶端功能模塊系統(tǒng)概述10.110.1.1系統(tǒng)功能介紹和技術(shù)選型先定一個小目標(biāo)!
先定一個小目標(biāo)!了解系統(tǒng)功能介紹和技術(shù)選型,能夠說出項目中的功能和技術(shù)選型10.1.1系統(tǒng)功能介紹和技術(shù)選型1.系統(tǒng)功能10.1.1系統(tǒng)功能介紹和技術(shù)選型2.技術(shù)選型10.1.2項目效果預(yù)覽先定一個小目標(biāo)!
先定一個小目標(biāo)!了解項目效果預(yù)覽,能夠說出項目中每個模塊中的功能10.1.2項目效果預(yù)覽1.登錄管理10.1.2項目效果預(yù)覽2.分類管理10.1.2項目效果預(yù)覽3.菜品管理10.1.2項目效果預(yù)覽4.套餐管理10.1.2項目效果預(yù)覽5.訂單明細(xì)10.1.2項目效果預(yù)覽6.用戶登錄10.1.2項目效果預(yù)覽7.地址管理10.1.2項目效果預(yù)覽8.菜品展示10.1.2項目效果預(yù)覽9.購物車10.1.2項目效果預(yù)覽10.下單開發(fā)環(huán)境搭建10.210.2.1系統(tǒng)開發(fā)及運行環(huán)境先定一個小目標(biāo)!
先定一個小目標(biāo)!了解系統(tǒng)開發(fā)及運行環(huán)境,能夠說出項目中的系統(tǒng)開發(fā)及運行環(huán)境10.2.1系統(tǒng)開發(fā)及運行環(huán)境本系統(tǒng)開發(fā)及運行所需的環(huán)境和軟件進(jìn)行介紹,具體如下。操作系統(tǒng):Windows10Java開發(fā)包:JDK11項目管理工具:Maven3.6.3項目開發(fā)工具:IntelliJIDEA2022.2.2數(shù)據(jù)庫:MySQL8.0緩存管理工具:Redis瀏覽器:GoogleChrome10.2.2數(shù)據(jù)庫環(huán)境搭建先定一個小目標(biāo)!
先定一個小目標(biāo)!了解數(shù)據(jù)庫環(huán)境搭建,能夠根據(jù)提供的配套資源搭建好系統(tǒng)數(shù)據(jù)庫環(huán)境10.2.2數(shù)據(jù)庫環(huán)境搭建序號表名說明1employee員工表2category菜品和套餐分類表3dish菜品表4setmeal套餐表5setmeal_dish套餐菜品關(guān)系表6dish_flavor菜品口味關(guān)系表7user用戶表8address_book地址簿表9shopping_cart購物車表10orders訂單表11order_detail訂單明細(xì)表創(chuàng)建一個名稱為reggie的數(shù)據(jù)庫,將所提供的db_reggie.sql文件導(dǎo)入到reggie數(shù)據(jù)庫中。創(chuàng)建的數(shù)據(jù)表10.2.3項目環(huán)境搭建先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握項目環(huán)境搭建,能夠根據(jù)配套資源完成項目環(huán)境的搭建10.2.3項目環(huán)境搭建1.創(chuàng)建項目和配置依賴本項目以Maven為項目的構(gòu)建工具,下面依次執(zhí)行創(chuàng)建項目和配置依賴、編寫配置文件、導(dǎo)入前端資源、導(dǎo)入后端基礎(chǔ)文件等操作,完成項目環(huán)境的搭建。在IDEA中創(chuàng)建一個名稱為reggie的Maven項目,項目創(chuàng)建完成后,在項目的pom.xml文件中配置項目所需的依賴,具體如文件10-1所示。文件10-1pom.xml源代碼10.2.3項目環(huán)境搭建2.編寫配置文件在項目的resources文件夾下創(chuàng)建配置文件application.yml,并在該配置文件中配置服務(wù)端口號、MySQL數(shù)據(jù)庫連接信息、MyBatis-Plus配置、常量配置等信息,具體如文件10-2所示。文件10-2application.yml源代碼10.2.3項目環(huán)境搭建3.導(dǎo)入前端資源本項目主要根據(jù)項目的業(yè)務(wù)要求實現(xiàn)后臺功能代碼,前端頁面直接從本書提供的配套資源導(dǎo)入項目,在功能實現(xiàn)時會對頁面中已經(jīng)實現(xiàn)的邏輯進(jìn)行講解。10.2.3項目環(huán)境搭建3.導(dǎo)入前端資源在正式開發(fā)后端業(yè)務(wù)之前,為了簡化后續(xù)業(yè)務(wù)開發(fā),本書配套資源中提供了一些非核心功能的基礎(chǔ)文件,這些文件包括通用類,配置類、實體類和工具類等,將這些基礎(chǔ)文件導(dǎo)入項目的src/main/目錄的java文件夾下。自定義業(yè)務(wù)異常類全局異常處理類JSON對象映射器通用返回結(jié)果類SpringMVC的配置類生成隨機(jī)驗證碼的工具類10.2.3項目環(huán)境搭建3.導(dǎo)入前端資源entity包下的實體類使用Lombok的注解省去了手動編寫類對應(yīng)的setter/getter方法、構(gòu)造方法、toString()方法等。想要使用Lombok,除了需要在pom.xml文件中配置對應(yīng)的依賴之外,還需要在IDEA中安裝一個Lombok插件,否則IDEA會無法識別Lombok的注解。依次單擊IDEA菜單中的“File”→“Settings”進(jìn)入到“Settings”對話框,在“Settings”對話框中選中直接在工具中搜索Lombok插件,然后安裝它。安裝完成后重啟IDEA。管理端功能模塊10.310.3.1登錄管理先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握登錄管理,能夠?qū)崿F(xiàn)員工登錄和員工退出10.3.1登錄管理登錄管理包括員工登錄和員工退出,員工在登錄頁面成功登錄后,會進(jìn)入到后臺管理系統(tǒng),擁有后臺系統(tǒng)中的所有操作權(quán)限。當(dāng)員工退出后清除登錄狀態(tài),返回到登錄頁面。下面分別對員工登錄和員工退出進(jìn)行講解。10.3.1登錄管理(1)頁面分析員工登錄頁面login.html存放在/resources/backend/page/login目錄下。啟動項目,在瀏覽器中通過地址“http://localhost:8080/backend/page/login/login.html”訪問員工登錄頁面。1.員工登錄10.3.1登錄管理此時按下快捷鍵F12打開瀏覽器調(diào)試工具后,單擊“登錄”按鈕,瀏覽器抓取到登錄的請求信息。1.員工登錄10.3.1登錄管理1.員工登錄“登錄”按鈕綁定了單擊事件,觸發(fā)單擊事件時會觸發(fā)Vue中定義的handleLogin()方法。handleLogin()方法先對登錄表單中填寫的內(nèi)容進(jìn)行校驗,校驗通過后發(fā)送登錄的異步請求,請求對應(yīng)的響應(yīng)結(jié)果中至少包含三個屬性:code、data、msg,其中code表示響應(yīng)編碼,data為響應(yīng)數(shù)據(jù),msg為響應(yīng)信息。員工登錄成功后,客戶端將服務(wù)端返回的信息存儲在localStorage中。查看login.html執(zhí)行登錄的核心代碼10.3.1登錄管理1.員工登錄(2)功能實現(xiàn)為了提高用戶信息的機(jī)密性,通常會將用戶的密碼進(jìn)行加密后再存儲在數(shù)據(jù)庫。對此實現(xiàn)用戶登錄時,需要將用戶的密碼進(jìn)行加密,然后將加密后的密碼和數(shù)據(jù)庫中的密碼進(jìn)行匹配,匹配成功后認(rèn)為輸入的密碼無誤。為了記錄用戶的登錄狀態(tài),本系統(tǒng)中在用戶登錄成功后將用戶信息存入Session中。10.3.1登錄管理1.員工登錄①定義Mapper接口。本項目使用MyBatis-Plus和數(shù)據(jù)庫進(jìn)行交互,自定義的Mapper接口可以繼承BaseMapper獲得通用的增刪改查功能。在項目的src/main/java目錄下創(chuàng)建com.itheima.reggie.mapper包,在該包下創(chuàng)建員工Mapper接口EmployeeMapper,具體如文件10-3所示。文件10-3EmployeeMapper.java源代碼10.3.1登錄管理1.員工登錄②定義Service接口。本項目的Service接口在定義時繼承自MyBatisPlus提供的Service層接口IService,這樣可以直接調(diào)用父接口提供的通用的增刪改查方法直接執(zhí)行業(yè)務(wù)操作,簡化業(yè)務(wù)層代碼實現(xiàn)。在項目的src/main/java目錄下創(chuàng)建com.itheima.reggie.service包,在該包下創(chuàng)建員工Service接口EmployeeService,具體如文件10-4所示。文件10-4EmployeeService.java源代碼10.3.1登錄管理1.員工登錄③定義Service實現(xiàn)類。在項目的src/main/java目錄下創(chuàng)建com.itheima.reggie.service.impl包,在該包下創(chuàng)建EmployeeService接口的實現(xiàn)類,具體如文件10-5所示文件10-5EmployeeServiceImpl.java源代碼10.3.1登錄管理1.員工登錄④定義Controller類。在項目的src/main/java目錄下創(chuàng)建com.itheima.reggie.controller包,在該包下創(chuàng)建Controller層處理員工相關(guān)業(yè)務(wù)的類,具體如文件10-6所示。文件10-6EmployeeController.java源代碼10.3.1登錄管理1.員工登錄(3)功能測試啟動項目,在瀏覽器中通過地址“http://localhost:8080/backend/page/login/login.html”訪問員工登錄頁面,在登錄頁面使用錯誤的賬號或密碼進(jìn)行登錄。10.3.1登錄管理1.員工登錄使用正確的賬號和密碼進(jìn)行登錄。10.3.1登錄管理1.員工登錄(4)完善登錄功能管理端的員工登錄已經(jīng)實現(xiàn)完成,但是此時員工如果不登錄,也可以直接訪問管理端的其他頁面。對此,可以使用過濾器對請求進(jìn)行攔截判斷,判斷用戶是否已經(jīng)完成登錄,如果沒有登錄則返回提示信息,跳轉(zhuǎn)到登錄頁面。10.3.1登錄管理1.員工登錄根據(jù)過濾器的處理邏輯定義登錄檢查的過濾器,具體如文件10-7所示。文件10-7LoginCheckFilter.java源代碼10.3.1登錄管理1.員工登錄在SpringBoot項目的啟動類上標(biāo)注@ServletComponentScan注解,之后每次項目啟動時會自動掃描到項目中@WebFilter注解標(biāo)注的LoginCheckFilter類,并進(jìn)行自動注冊。至此,員工沒有成功登錄的話,除指定不需要登錄就可以訪問的路徑之外,訪問其他路徑都會自動跳轉(zhuǎn)到登錄頁面。10.3.1登錄管理2.員工退出管理員或者員工登錄成功進(jìn)入系統(tǒng)之后,頁面跳轉(zhuǎn)到后臺系統(tǒng)首頁面(backend/index.html),此時會在系統(tǒng)的右上角顯示當(dāng)前登錄用戶的名稱。如果員工需要退出系統(tǒng),直接單擊右側(cè)的退出按鈕即可退出系統(tǒng),退出系統(tǒng)后頁面應(yīng)跳轉(zhuǎn)回登錄頁面。10.3.1登錄管理2.員工退出“退出”按鈕上綁定了單擊事件,觸發(fā)單擊事件時會觸發(fā)Vue中定義的logout()方法,logout()方法會先執(zhí)行l(wèi)ogoutApi()方法,logoutApi()方法執(zhí)行后的返回的code如果為1,則刪除客戶端localStorage中存儲的用戶登錄信息,并跳轉(zhuǎn)至登錄頁面。查看index.html頁面中和退出按鈕相關(guān)的代碼(1)頁面分析10.3.1登錄管理2.員工退出員工登錄成功后,會將對應(yīng)的員工信息存入到Session中,以記錄員工的登錄狀態(tài)。相反,如果想要實現(xiàn)員工退出,則可以在收到退出請求后,將當(dāng)前員工存放在Session中的信息清除即可。在EmployeeController類中新增處理員工退出的方法logout()。(2)功能實現(xiàn)@PostMapping("/logout")publicR<String>logout(HttpServletRequestrequest){ //清除Session中保存的當(dāng)前登錄員工的id request.getSession().removeAttribute("employee"); returnR.success("退出成功");}10.3.1登錄管理2.員工退出實現(xiàn)完員工退出功能,下面對員工退出功能進(jìn)行測試。單擊管理端首頁的退出按鈕。(3)功能測試10.3.2分類管理先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握分類管理,能夠?qū)崿F(xiàn)分類信息的增刪改查操作10.3.2分類管理管理端中的分類管理是對菜品和套餐的分類信息進(jìn)行管理,每個菜品對應(yīng)一個菜品分類,每個套餐對應(yīng)一個套餐分類,用戶端中會按照菜品和套餐的分類信息展示不同分類的菜品信息和套餐信息。下面分別對新增分類、查詢分類、修改分類、刪除分類進(jìn)行講解。10.3.2分類管理(1)頁面分析分類管理頁面上方提供了“+新增菜品分類”和“+新增套餐分類”2個按鈕,單擊這兩個按鈕時,會彈出對應(yīng)的新增分類對話框。1.新增分類10.3.2分類管理1.新增分類10.3.2分類管理1.新增分類(2)功能實現(xiàn)根據(jù)新增分類時請求的信息可以知道,服務(wù)端只需要提供一個方法對新增菜品分類和新增套餐分類統(tǒng)一處理,新增分類的具體實現(xiàn)如下。①定義Mapper接口。在com.itheima.reggie.mapper包下創(chuàng)建分類Mapper接口CategoryMapper,具體如文件10-8所示。文件10-8CategoryMapper.java源代碼10.3.2分類管理1.新增分類②定義Service接口。在com.itheima.reggie.service包下創(chuàng)建分類Service接口CategoryService,具體如文件10-9所示。文件10-9CategoryService.java源代碼10.3.2分類管理1.新增分類③定義Service實現(xiàn)類。在com.itheima.reggie.service.impl包下創(chuàng)建CategoryService接口的實現(xiàn)類,具體如文件10-10所示。文件10-10CategoryServiceImpl.java源代碼10.3.2分類管理1.新增分類④定義Controller類。在com.itheima.reggie.controller包下創(chuàng)建Controller層處理分類相關(guān)業(yè)務(wù)的類,并在類中定義添加分類的方法,具體如文件10-11所示。文件10-11CategoryController.java源代碼10.3.2分類管理1.新增分類(3)功能測試實現(xiàn)新增分類功能后,下面對新增分類進(jìn)行測試,在新增菜品分類對話框中新增菜品分類。10.3.2分類管理1.新增分類由于此時還沒有實現(xiàn)分類信息的查詢,新增的分類信息不會自動顯示在頁面中。在數(shù)據(jù)庫中查詢新增的菜品分類信息。10.3.2分類管理2.自動填充公共字段分類表中包含創(chuàng)建時間、創(chuàng)建人、更新時間、更新人字段,需要新增時設(shè)置這些字段的值,在更新時設(shè)置更新時間、更新人字段的值。在系統(tǒng)很多表中都會有這些字段,可以將這些字段稱為公共字段。如果在項目中處理這些字段,都是在對應(yīng)的業(yè)務(wù)方法中進(jìn)行賦值操作,編碼相對冗余、繁瑣。對此,可以使用MyBatis-Plus提供的公共字段自動填充功能完成公共字段值的自動填充。10.3.2分類管理2.自動填充公共字段MyBatis-Plus公共字段自動填充,也就是在插入或者更新的時候為指定字段賦予指定的值,使用它的好處就是可以統(tǒng)一對這些字段進(jìn)行處理,降低了冗余代碼的數(shù)量。本系統(tǒng)中有四個公共字段,需要在新增或更新時進(jìn)行自動賦值操作。公共字段賦值規(guī)則字段賦值時機(jī)賦予的值createTime插入(INSERT)當(dāng)前時間updateTime插入(INSERT),更新(UPDATE)當(dāng)前時間createUser插入(INSERT)當(dāng)前登錄用戶idupdateUser插入(INSERT),更新(UPDATE)當(dāng)前登錄用戶id10.3.2分類管理2.自動填充公共字段使用MyBatis-Plus為公共字段自動填充時,需要在實體類的屬性上加入@TableField注解,指定自動填充的策略,并編寫元數(shù)據(jù)對象處理器,在類中統(tǒng)一為公共字段賦值。(1)指定自動填充的策略@TableField(fill=FieldFill.INSERT)privateLocalDateTimecreateTime;@TableField(fill=FieldFill.INSERT_UPDATE)privateLocalDateTimeupdateTime;@TableField(fill=FieldFill.INSERT)privateLongcreateUser;@TableField(fill=FieldFill.INSERT_UPDATE)privateLongupdateUser;插入時填充該屬性值插入或更新時填充該屬性值10.3.2分類管理2.自動填充公共字段(2)自定義元數(shù)據(jù)對象處理器MyBatis-Plus自定義的元數(shù)據(jù)對象處理器需要實現(xiàn)MetaObjectHandler接口。在自定義的元數(shù)據(jù)對象處理器中,可以獲取當(dāng)前時間設(shè)置創(chuàng)建時間和更新時間的屬性值,但不能直接獲得HttpSession對象中的信息,所以需要通過其他方式來獲取登錄用戶id??蛻舳嗣看伟l(fā)送的HTTP請求,對應(yīng)的在服務(wù)端都會分配一個新的線程對請求進(jìn)行處理,其中LoginCheckFilter的doFilter()方法、Controller層的新增和更新方法、Service層的新增和更新方法、元數(shù)據(jù)對象處理器的插入和更新操作時自動填充的方法在同一個線程中,對此,可以在LoginCheckFilter的doFilter()方法中獲取當(dāng)前登錄用戶id,并調(diào)用ThreadLocal的set()方法將當(dāng)前用戶的id設(shè)置為當(dāng)前線程的線程局部變量的值,然后在元數(shù)據(jù)對象處理器的自動填充的方法中調(diào)用ThreadLocal的get()方法獲取當(dāng)前用戶的id。10.3.2分類管理2.自動填充公共字段①創(chuàng)建工具類。在mon包下,創(chuàng)建基于ThreadLocal設(shè)置和獲取線程局部變量值的工具類,具體如文件10-12所示。文件10-12BaseContext.java源代碼10.3.2分類管理2.自動填充公共字段②修改過濾器的方法。修改文件10-7中LoginCheckFilter的doFilter()方法,在該方法中如果判斷當(dāng)前用戶已登錄,則獲取用戶的id,調(diào)用BaseContext的setCurrentId()方法將當(dāng)前登錄用戶的id設(shè)置在當(dāng)前線程的局部屬性中。LoginCheckFilter.java源代碼10.3.2分類管理2.自動填充公共字段③自定義元數(shù)據(jù)對象處理器。在mon包下自定義元數(shù)據(jù)對象處理器,在該元數(shù)據(jù)對象處理器中創(chuàng)建插入和更新操作時公共字段自動填充的方法,具體代碼如文件10-13所示。文件10-13MyMetaObjectHandler.java源代碼10.3.2分類管理2.自動填充公共字段(3)測試公共字段自動填充完成公共字段的自動填充后,插入或更新信息時,無需對公共字段進(jìn)行手動賦值,這些字段會動態(tài)的被自動填充值。將文件10-11的CategoryController類中手動設(shè)置公共字段值的代碼進(jìn)行注釋后,重新啟動項目,新增套餐分類。10.3.2分類管理2.自動填充公共字段在數(shù)據(jù)庫中查詢新增的套餐分類信息。10.3.2分類管理3.查詢分類查詢某個類別的數(shù)據(jù)時,如果在一個頁面中以列表的方式全部進(jìn)行展示,查詢的效率相對較低,并且不便于查看有效的數(shù)據(jù),所以通常會將數(shù)據(jù)以分頁的方式查詢對應(yīng)的數(shù)據(jù),并將對應(yīng)頁碼的數(shù)據(jù)在列表中展示。(1)頁面分析分類管理頁面中提供了一個列表,列表的下端有頁碼組件。通常為了提高用戶體驗,訪問對應(yīng)類別的頁面時,會自動查詢信息在頁面中展示。頁面加載時自動以get請求方式向“/category/page”發(fā)送請求,并攜帶當(dāng)前頁碼和每頁顯示數(shù)量的數(shù)據(jù)參數(shù)。查看分類管理頁面數(shù)據(jù)初始化相關(guān)的代碼10.3.2分類管理3.查詢分類(2)功能實現(xiàn)MyBatis-Plus提供了分頁插件,使用該分頁插件可以很便捷的實現(xiàn)分頁查詢。使用MyBatis-Plus分頁插件之前需要在配置類中聲明分頁插件的Bean對象,以將該分頁插件對象注冊到容器中。在com.itheima.reggie.config包下創(chuàng)建配置類,并在配置類中創(chuàng)建MyBatis-Plus分頁插件對象,并交由Spring管理,具體如文件10-14所示。文件10-14
MybatisPlusConfig.java源代碼10.3.2分類管理3.查詢分類配置完MyBatis-Plus的分頁插件之后,在文件10-11的CategoryController類中新增分頁查詢的方法page()。CategoryController.java源代碼10.3.2分類管理3.查詢分類(3)功能測試重新啟動項目,成功登錄管理端之后,分類管理頁面將自動分頁查詢出分類信息,并展示在頁面的表格中。10.3.2分類管理4.修改分類新增分類信息后,如果需要對分類信息進(jìn)行修改,則可以通過修改分類實現(xiàn)。,分類管理列表右側(cè)有一個“修改”按鈕,修改分類時,通過單擊“修改”按鈕,彈出修改分類的對話框,在修改分類的對話框中回顯對應(yīng)的分類信息,最后完成分類信息的修改。10.3.2分類管理4.修改分類(1)頁面分析以修改超值周末套餐為例,單擊超值周末套餐右側(cè)的“修改”按鈕,彈出的修改分類對話框。10.3.2分類管理4.修改分類單擊“修改”按鈕時,會將分類列表中當(dāng)前行的分類信息作為參數(shù)執(zhí)行editHandle()方法。editHandle()方法將傳入的分類名稱和分類排序賦值給對話框中的文本框中,并彈出對話框。查看列表中“修改”按鈕,以及修改分類對話框相關(guān)的代碼10.3.2分類管理4.修改分類在修改分類對話框中,將“周末超值套餐”修改為“省錢超值套餐”后,單擊“確定”按鈕,通過瀏覽器抓取到修改分類的請求信息。10.3.2分類管理4.修改分類(2)功能實現(xiàn)在文件10-11的CategoryController類中新增修改分類的方法update()。CategoryController.java源代碼10.3.2分類管理4.修改分類(3)功能測試重新啟動項目,成功登錄管理端之后,在圖10-30中將“周末超值套餐”修改為“省錢超值套餐”,單擊“確定”按鈕提交修改分類的請求。10.3.2分類管理5.刪除分類分類列表中每條分類信息右側(cè)提供了一個“刪除”按鈕,當(dāng)需要將已經(jīng)存在的分類信息刪除時,可以通過單擊“刪除”按鈕實現(xiàn),具體實現(xiàn)如下。(1)頁面分析單擊“刪除”按鈕時,攜帶傳入的分類id以delete的請求方式向“/category”路徑發(fā)起請求。查看列表中“刪除”按鈕相關(guān)的代碼10.3.2分類管理5.刪除分類(2)功能實現(xiàn)每個菜品和套餐都需要有與之對應(yīng)的分類,所以在刪除分類時,需要先檢查刪除的分類是否關(guān)聯(lián)了菜品或者套餐,如果關(guān)聯(lián)了,此分類不允許刪除,刪除分類的具體實現(xiàn)如下。①定義Mapper接口。由于需要查詢菜品和套餐是否關(guān)聯(lián)了對應(yīng)的分類,所以需要創(chuàng)建菜品和套餐的Mapper接口,在com.itheima.reggie.mapper包下分別創(chuàng)建菜品Mapper接口DishMapper,以及套餐Mapper接口SetmealMapper,具體如文件10-15和文件10-16所示。文件10-15
DishMapper.java文件10-16
SetmealMapper.java源代碼10.3.2分類管理5.刪除分類②定義Service接口。在com.itheima.reggie.service包下分別創(chuàng)建菜品Service接口DishService,以及套餐Service接口SetmealService,具體如文件10-17和文件10-18所示。文件10-17
DishService.java文件10-18
SetmealService.java源代碼10.3.2分類管理5.刪除分類在文件10-9的CategoryService接口中自定義根據(jù)分類id刪除分類的方法。CategoryService.java源代碼10.3.2分類管理5.刪除分類③定義Service實現(xiàn)類。在com.itheima.reggie.service.impl包下創(chuàng)建DishService接口和SetmealService接口的實現(xiàn)類,具體如文件10-19和文件10-20所示文件10-19
DishServiceImpl.java文件10-20
SetmealServiceImpl.java源代碼10.3.2分類管理5.刪除分類在文件10-10的CategoryServiceImpl類中實現(xiàn)CategoryService接口的remove()方法。具體如文件10-21所示。文件10-21CategoryServiceImpl.java源代碼10.3.2分類管理5.刪除分類④定義刪除分類方法。在文件10-11的CategoryController類中定義刪除分類的方法。CategoryController.java源代碼10.3.2分類管理5.刪除分類(4)功能測試實現(xiàn)新增分類功能后,下面對新增分類進(jìn)行測試。數(shù)據(jù)庫導(dǎo)入的初始化數(shù)據(jù)中,名稱為湘菜的分類信息被菜品關(guān)聯(lián)了,重啟項目后,在分類列表中刪除名稱為湘菜的分類信息。10.3.2分類管理5.刪除分類(4)功能測試省錢超值套餐為新增的分類信息,并沒有被菜品和套餐關(guān)聯(lián),在分類列表中刪除名稱為省錢超值套餐的分類信息。10.3.3菜品管理先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握菜品管理,能夠?qū)崿F(xiàn)菜品的新增、查詢、修改、啟售、停售、刪除功能10.3.3菜品管理菜品是餐廳的核心內(nèi)容,消費者在用戶端下單之前主要通過瀏覽菜品信息后落實購買。菜品管理主要維護(hù)各個分類下的菜品信息,包括新增、查詢、修改、啟售、停售、刪除等功能,下面對這些功能的實現(xiàn)逐個進(jìn)行講解。10.3.3菜品管理1.新增菜品(1)頁面分析在系統(tǒng)管理端首頁,單擊左側(cè)菜單欄中的“菜品管理”,會在右側(cè)打開菜品管理頁面。10.3.3菜品管理1.新增菜品菜品管理頁面提供了一個“+新增菜品”按鈕,單擊該按鈕時,會打開新增菜品頁面。10.3.3菜品管理1.新增菜品在新增菜品頁面單擊“+添加口味”按鈕,會添加配置口味的輸入框。10.3.3菜品管理1.新增菜品頁面渲染之前調(diào)用getCategoryList()方法獲取菜品分類列表。調(diào)用getFlavorListHand()方法獲取口味列表,口味列表中設(shè)置了四種初始口味。②
定義了handleAvatarSuccess()方法,該方法以實現(xiàn)上傳圖片成功后,在上傳組件中顯示所上傳的圖片。查看新增菜品頁面的代碼10.3.3菜品管理1.新增菜品(2)功能實現(xiàn)通過對頁面的分析,可以將新增菜品拆分為查詢菜品分類、上傳圖片、展示上傳圖片、新增菜品信息四部分實現(xiàn),下面依次完成這四部分功能。①查詢菜品分類。在文件10-11的CategoryController類中增加查詢分類列表的方法,根據(jù)頁面請求傳遞過來的分類類型查詢分類信息。為了讓顯示分類列表的體驗感更好,對查詢的結(jié)果按照sort排序字段進(jìn)行升序排序,如果sort排序字段的值相同,則按照修改時間倒序排序。CategoryController.java源代碼10.3.3菜品管理1.新增菜品重啟項目后,再次進(jìn)入新增菜品頁面,此時單擊菜品分類下拉框。10.3.3菜品管理1.新增菜品②上傳圖片。本系統(tǒng)上傳圖片時上傳的是本地的圖片,在上傳圖片時,上傳圖片請求中攜帶的文件是一個臨時文件,需要轉(zhuǎn)存到指定位置,否則本次請求完成后臨時文件會刪除。本系統(tǒng)將上傳的圖片保存在本地,為了不將存放圖片的目錄硬編碼在代碼中,在此選擇將存放圖片的目錄在application.yml文件中用常量進(jìn)行配置。reggie:path:D:\img\10.3.3菜品管理1.新增菜品SpringBoot整合的SpringWeb依賴中對文件上傳進(jìn)行了封裝,開發(fā)者只需要在Controller的方法中聲明一個MultipartFile類型的參數(shù)即可接收上傳的文件,但方法形參的名稱需要與頁面的file域的name屬性一致。在com.itheima.reggie.controller包下創(chuàng)建CommonController類,并在該類中定義處理圖片上傳的方法,具體代碼如文件10-22所示。文件10-22CommonController.java源代碼10.3.3菜品管理1.新增菜品重啟項目并登錄管理端后,在新增菜品頁面單擊“上傳圖片”,選中需要上傳的本地圖片后,打開D盤下的img文件夾。10.3.3菜品管理1.新增菜品③展示上傳圖片。在文件上傳成功后,在新增菜品頁面會執(zhí)行handleAvatarSuccess()方法,在該方法中獲取圖片上傳成功之后返回的文件名,然后在以“/common/download?name=xxx”格式下載對應(yīng)的圖片,將圖片設(shè)置在頁面中展示。想讓下載圖片后的表現(xiàn)形式為在瀏覽器中直接打開,需要在服務(wù)端將文件以流的形式寫回瀏覽器。在文件10-22的CommonController類中定義下載圖片的方法download(),該方法中接收頁面?zhèn)鬟f的圖片名稱,然后讀取對應(yīng)圖片并以流的形式寫回瀏覽器。CommonController.java源代碼10.3.3菜品管理1.新增菜品重啟項目并登錄管理端后,在新增菜品頁面中單擊“上傳圖片”,選中需要上傳的本地圖片后,上傳組件中展示當(dāng)前所上傳的圖片。10.3.3菜品管理1.新增菜品④新增菜品信息。從圖10-36可以知道,保存的菜品信息中,不僅有菜品實體中的信息,還包含菜品口味,此時,在新增菜品頁面填寫菜品信息后單擊“保存”按鈕,從瀏覽器中抓取新增菜品信息的請求信息。10.3.3菜品管理1.新增菜品新增菜品信息的請求中攜帶的數(shù)據(jù)如果在Controller使用菜品類Dish來封裝,只能封裝菜品的基本屬性,flavors屬性無法封裝。對此,在com.itheima.reggie.dto包下自定義一個類,將該類繼承Dish類,并對Dish類的屬性進(jìn)行拓展,增加flavors集合屬性,通過該屬性封裝菜品口味,具體如文件10-23所示。文件10-23DishDto.java源代碼10.3.3菜品管理1.新增菜品新增菜品信息時,不僅需要新增菜品的基本信息,還需要新增菜品的口味信息,所以也需要操作菜品口味表。在com.itheima.reggie.mapper包下創(chuàng)建菜品口味的Mapper接口DishFlavorMapper,具體如文件10-24所示。文件10-24
DishFlavorMapper.java源代碼10.3.3菜品管理1.新增菜品在com.itheima.reggie.service包下創(chuàng)建菜品口味的Service接口DishFlavorService,具體如文件10-25所示。文件10-25
DishFlavorService.java源代碼10.3.3菜品管理1.新增菜品在文件10-17的DishService接口中添加新增菜品的方法。DishService.java源代碼10.3.3菜品管理1.新增菜品在com.itheima.reggie.service.impl包下創(chuàng)建DishFlavorService接口的實現(xiàn)類,具體如文件10-26所示。文件10-26DishFlavorServiceImpl.java源代碼10.3.3菜品管理1.新增菜品在文件10-19的DishServiceImpl類中實現(xiàn)DishService接口中的新增菜品方法,在該方法中將菜品信息分別向菜品表和菜品口味表保存,但頁面?zhèn)鬟f過來的菜品口味信息只包含name和value屬性的值,缺少dishId屬性的值,所以需要在保存完菜品的基本信息后,再獲取菜品id,然后為菜品口味對象的dishId屬性賦值,具體如文件10-27所示。文件10-27DishServiceImpl.java源代碼10.3.3菜品管理1.新增菜品在com.itheima.reggie.controller包下創(chuàng)建菜品管理的Controller類,并在該類中定義新增菜品的方法,具體如文件10-28所示。文件10-28DishController.java源代碼10.3.3菜品管理1.新增菜品重啟項目并登陸管理端后,在圖10-36中輸入新增菜品的信息,例如新增菜品開水白菜。10.3.3菜品管理1.新增菜品單擊新增菜品頁面中的“保存”按鈕,會跳轉(zhuǎn)到菜品管理頁面,此時由于還沒有實現(xiàn)查詢菜品的功能,菜品管理頁面不會顯示菜品信息,查詢數(shù)據(jù)庫中開水白菜的信息。10.3.3菜品管理2.查詢菜品查詢某個類別的數(shù)據(jù)時,如果在一個頁面中以列表的方式全部進(jìn)行展示,查詢的效率相對較低,并且不便于查看有效的數(shù)據(jù),所以通常會將數(shù)據(jù)以分頁的方式查詢對應(yīng)的數(shù)據(jù),并將對應(yīng)頁碼的數(shù)據(jù)在列表中展示。10.3.3菜品管理2.查詢菜品(1)頁面分析菜品管理頁面展示的菜品信息包括名稱、售價、售賣狀態(tài)、更新時間等菜品基本信息之外,還有圖片和菜品分類,其中菜品信息的圖片字段從數(shù)據(jù)庫查詢出來的僅僅是圖片的名字,圖片要想在表格中回顯展示,就需要下載對應(yīng)的圖片;菜品分類如果展示的是菜品id則不太合理,對此需要根據(jù)菜品的分類id,去菜品分類表中查詢對應(yīng)的菜品分類名稱,然后在頁面展示。10.3.3菜品管理2.查詢菜品頁面加載時,調(diào)用getDishPage()方法用于查詢菜品信息,執(zhí)行g(shù)etDishPage()方法時會以get請求方式向“/dish/page”發(fā)送請求,并攜帶查詢參數(shù),查詢參數(shù)包含當(dāng)前頁碼、每頁展示的數(shù)據(jù)量、搜索框中的值。查看菜品管理頁面數(shù)據(jù)初始化相關(guān)的代碼src屬性值為getImage()方法的返回值,getImage()方法根據(jù)圖片名稱在URL“/common/download”下載對應(yīng)的圖片。查看菜品圖片的相關(guān)代碼10.3.3菜品管理2.查詢菜品(2)功能實現(xiàn)從頁面以及對應(yīng)的代碼可以得出,訪問菜品管理頁面時,頁面加載時會自動攜帶參數(shù)向“/dish/page”發(fā)送分頁查詢菜品信息的請求,并在菜品信息返回到頁面時,會根據(jù)返回結(jié)果在頁面表格中渲染菜品信息,其中菜品的圖片會自動根據(jù)圖片名稱下載對應(yīng)的圖片進(jìn)行展示。圖片下載的功能之前已經(jīng)實現(xiàn)了,在此,只需要完成分頁查詢的功能即可。10.3.3菜品管理2.查詢菜品在分頁查詢時還需要給頁面返回分類的名稱,而分類的名稱前端在接收的時候是通過categoryName屬性獲取的,那么對應(yīng)的服務(wù)端也應(yīng)該封裝到categoryName屬性中。實體類Dish中只包含categoryId而不包含categoryName,對此可以對DishDto類中拓展一個categoryName屬性,編輯文件10-23,具體如文件10-29所示。文件10-29DishDto.java源代碼10.3.3菜品管理2.查詢菜品分頁查詢菜品信息時,默認(rèn)分頁查詢菜品信息的結(jié)果封裝在Dish對象中,而最終需要給前端頁面返回的信息需要包含菜品名稱,對此返回的信息中需要進(jìn)行特殊處理。在文件10-28的DishController類中添加分頁查詢菜品的方法page()。DishController.java源代碼10.3.3菜品管理2.查詢菜品(3)功能測試重新啟動項目,成功登錄管理端之后,訪問菜品管理頁面,此時頁面會自動分頁查詢菜品信息,并展示在頁面的表格中。10.3.3菜品管理2.查詢菜品在菜品管理頁面的搜索框中輸入菜品名稱進(jìn)行指定菜品的查詢,例如在搜索框中輸入“開水”后按下“Enter”鍵或者單擊左側(cè)的搜索圖標(biāo),搜索菜品名稱中包含“開水”的菜品。10.3.3菜品管理3.修改菜品修改菜品是在原有的菜品信息的上對菜品信息進(jìn)行更新,對此修改菜品信息之前需要將原有的菜品信息在修改界面進(jìn)行展示,然后再對菜品信息進(jìn)行修改,確認(rèn)修改信息后,再提交新的菜品信息到數(shù)據(jù)庫進(jìn)行更新。接下來將修改菜品分為回顯菜品信息和更新菜品信息2部分進(jìn)行講解10.3.3菜品管理3.修改菜品(1)回顯菜品信息①頁面分析“修改”按鈕綁定單擊事件,單擊“修改”按鈕時,會將當(dāng)前行的菜品的id屬性值作為參數(shù)執(zhí)行addFoodtype()方法。addFoodtype()方法根據(jù)入?yún)⑴袛鄨?zhí)行新增菜品還是修改菜品,如果入?yún)⑹遣似返膇d,則為修改菜品,攜帶該菜品id跳轉(zhuǎn)到“/backend/page/food/add.html”頁面。查看菜品管理頁面中“修改”按鈕的相關(guān)代碼10.3.3菜品管理3.修改菜品新增菜品頁面加載時執(zhí)行的created()方法,如果頁面攜帶了菜品id,說明是修改菜品,最終會攜帶菜品id以get請求方式向“/dish”發(fā)送請求。查看新增菜品頁面的代碼10.3.3菜品管理3.修改菜品②功能實現(xiàn)從頁面分析可以知道,單擊菜品管理頁面的“修改”按鈕后,頁面會發(fā)送異步請求,根據(jù)菜品id請求查詢當(dāng)前菜品信息和對應(yīng)的口味信息,頁面再根據(jù)查詢結(jié)果回顯菜品信息。在文件10-17的DishService接口中添加getByIdWithFlavor()方法。DishService.java源代碼10.3.3菜品管理3.修改菜品在文件10-27的DishServiceImpl類中實現(xiàn)DishService接口中的getByIdWithFlavor()方法,在該方法中根據(jù)菜品id查詢菜品信息和對應(yīng)的口味信息。DishServiceImpl.java源代碼10.3.3菜品管理3.修改菜品在文件10-28的DishController類中添加查詢菜品信息的方法。DishController.java源代碼10.3.3菜品管理3.修改菜品③功能測試重新啟動項目,成功登錄管理端之后,在菜品管理頁面單擊開水白菜的“修改”按鈕,請求修改開水白菜的信息。10.3.3菜品管理3.修改菜品(2)更新菜品信息①頁面分析“保存”按鈕綁定單擊事件,單擊“保存”按鈕時,會校驗表單中的數(shù)據(jù)是否符合指定的規(guī)則,如果符合規(guī)則并且是修改菜品信息,則攜帶表單中的菜品信息以put請求方式向“/dish”發(fā)送請求。查看頁面中和更新菜品信息的相關(guān)代碼10.3.3菜品管理3.修改菜品②功能實現(xiàn)從頁面分析可以知道,單擊修改菜品頁面的“保存”按鈕后,頁面會發(fā)送異步請求更新菜品信息。在文件10-17的DishService接口中添加updateWithFlavor()方法。DishService.java源代碼10.3.3菜品管理3.修改菜品在文件10-27的DishServiceImpl類中實現(xiàn)DishService接口中的updateWithFlavor()方法,在該方法中根據(jù)提交過來的菜品信息進(jìn)行信息更新,在更新菜品信息時除了要更新菜品基本信息,還需要更新菜品口味。由于頁面在更新菜品口味時,有可能是修改、新增或刪除,對此,無論菜品口味信息如何變化,更新菜品口味時,只需要保持一個原則:先刪除,后添加。DishServiceImpl.java源代碼10.3.3菜品管理3.修改菜品在文件10-28的DishController類中添加修改菜品信息的方法。DishController.java源代碼10.3.3菜品管理3.修改菜品③功能測試重新啟動項目,成功登錄管理端之后,在修改菜品頁面中將開水白菜的價格修改為48后,單擊“保存”按鈕。10.3.3菜品管理4.啟售和停售菜品菜品的售賣狀態(tài)包含啟售和停售,分別表示菜品在用戶端中是否顯示售賣。菜品管理頁面中,菜品列表中上方包含“批量啟售”和“批量停售”,菜品列表中每條菜品信息的操作列中,也提供對菜品的售賣狀態(tài)進(jìn)行修改的鏈接。用戶可以根據(jù)需求,通過這幾個鏈接管理菜品的售賣狀態(tài)。10.3.3菜品管理4.啟售和停售菜品(1)頁面分析“批量啟售”、“批量停售”、操作列的售賣狀態(tài)綁定單擊事件,觸發(fā)單擊事件時,最終攜帶需要修改售賣狀態(tài)的菜品id以post請求方式向“/dish/status/${params.status}”發(fā)送請求,其中${params.status}為菜品修改后的售賣狀態(tài)。查看頁面中與啟售以及停售菜品的相關(guān)代碼10.3.3菜品管理4.啟售和停售菜品(2)功能實現(xiàn)從頁面分析可以知道,不管是批量修改菜品的售賣狀態(tài),還是單獨修改指定菜品的售賣狀態(tài),請求的地址都一樣。在文件10-28的DishController類中添加修改菜品售賣狀態(tài)的方法DishController.java源代碼10.3.3菜品管理4.啟售和停售菜品(3)功能測試重新啟動項目,成功登錄管理端之后,在菜品管理頁面中勾選開水白菜、上湯焗龍蝦、老火靚湯、清蒸河鮮海鮮左側(cè)的多選框后,單擊“批量停售”。10.3.3菜品管理4.啟售和停售菜品(3)功能測試在菜品管理頁面中單擊老火靚湯操作列中的“啟售”。10.3.3菜品管理5.刪除菜品當(dāng)餐廳想要減少當(dāng)前菜品的供應(yīng),可以選擇對菜品進(jìn)行刪除。菜品管理頁面中提供了批量刪除和單個刪除,用戶可以根據(jù)需求,選擇通過不同的方式對菜品進(jìn)行刪除。(1))頁面分析單擊“批量刪除”和“刪除”時,會攜帶需要刪除的菜品的id以delete請求方式向“/dish”發(fā)送請求。查看頁面中與刪除菜品的相關(guān)代碼10.3.3菜品管理5.刪除菜品(2)功能實現(xiàn)刪除菜品時,同時需要刪除菜品口味關(guān)聯(lián)表中菜品對應(yīng)的菜品口味。在文件10-17的DishService接口中添加delByIdWithFlavor()方法。DishService.java源代碼10.3.3菜品管理5.刪除菜品在文件10-27的DishServiceImpl類中實現(xiàn)DishService接口中的delByIdWithFlavor()方法,在該方法中根據(jù)提交過來的菜品id刪除菜品信息和對應(yīng)的菜品口味信息。如果菜品售賣狀態(tài)為啟售狀態(tài)的話,為確保不影響用戶體驗,則不允許刪除。DishServiceImpl.java源代碼10.3.3菜品管理5.刪除菜品從頁面分析可以知道,不管是批量刪除菜品,還是單獨刪除指定的菜品,請求的地址都一樣。在文件10-28的DishController類中添加刪除菜品的方法。DishController.java源代碼10.3.3菜品管理5.刪除菜品(3)功能測試重新啟動項目,成功登錄管理端之后,在菜品管理頁面中勾選開水白菜、上湯焗龍蝦、老火靚湯左側(cè)的多選框后,單擊“批量刪除”。10.3.3菜品管理5.刪除菜品取消老火靚湯左側(cè)的勾選狀態(tài)后,再單擊“批量刪除”。10.3.3菜品管理5.刪除菜品單擊清蒸河鮮海鮮操作列中的“刪除”按鈕10.3.4套餐管理先定一個小目標(biāo)!
先定一個小目標(biāo)!掌握套餐管理,能夠?qū)崿F(xiàn)套餐的新增、查詢、修改、啟售、停售、刪除功能10.3.4套餐管理套餐是多個菜品的集合,通過合理的套餐設(shè)置,能夠一次性滿足消費者的點餐需求,幫助消費者快速下單。套餐管理主要維護(hù)所有套餐分類的套餐信息,包括新增、查詢、修改、啟售、停售、刪除等功能,下面對這些功能的實現(xiàn)逐個進(jìn)行講解。10.3.4套餐管理1.新增套餐(1)頁面分析在系統(tǒng)管理端首頁,單擊左側(cè)菜單欄中的“套餐管理”,會在右側(cè)打開套餐管理頁面。10.3.4套餐管理1.新增套餐套餐管理頁面提供了一個“+新增套餐”按鈕,單擊該按鈕時,會打開新增套餐頁面。10.3.4套餐管理1.新增套餐新增套餐頁面的表單內(nèi)容和新增菜品頁面的表單內(nèi)容很相似,需要查詢分類信息、上傳圖片、回顯上傳的圖片。新增套餐需要選擇套餐所包含的菜品,填寫完所有的套餐信息后單擊“保存”按鈕提交新增套餐。接下來對新增套餐中的這幾部分逐個分析。10.3.4套餐管理1.新增套餐①套餐分類。套餐分類需要在頁面加載時異步請求所有套餐的分類信息。頁面渲染之前執(zhí)行created()方法,created()方法執(zhí)行時最終會根據(jù)分類的類型查詢分類信息。根據(jù)分類類型查詢分類信息的功能在菜品管理中已經(jīng)實現(xiàn),對此頁面加載完之后,可以在套餐分類下拉框中查看并選擇套餐分類。查看新增套餐頁面中,頁面加載時執(zhí)行的核心代碼10.3.4套餐管理1.新增套餐②套餐圖片。套餐圖片也是通過上傳組件上傳本地圖片,然后將上傳成功的圖片回顯在頁面中。上傳圖片和回顯上傳圖片的功能在新增菜品時已經(jīng)實現(xiàn)和講解,在此就不再重復(fù)講解。③添加菜品。一個套餐可以包含多個菜品,單擊“+添加菜品”按鈕,會彈出”添加菜品”對話框。10.3.4套餐管理1.新增套餐單擊“+添加菜品”按鈕,最終會查詢所有的菜品分類,并攜帶菜品分類列表中第一個菜品分類的id,以get請求方式向“/dish/list”發(fā)送請求。查看頁面中添加菜品對話框的核心代碼10.3.4套餐管理1.新增套餐單擊“保存”按鈕,會先校驗頁面中的套餐信息是否填寫的符合填寫規(guī)則,如果符合,并且是新增套餐,則會攜帶套餐信息以post請求方式向“/setmeal”發(fā)送請求。查看頁面中和提交新增套餐相關(guān)的核心代碼③提交新增套餐。單擊頁面的“保存”按鈕時,會將頁面中的套餐信息提交到服務(wù)端進(jìn)行新增。10.3.4套餐管理1.新增套餐(2)功能實現(xiàn)通過對頁面的分析可以指定,完成新增套餐需要向服務(wù)端發(fā)送6個請求,分別如下。根據(jù)傳遞的參數(shù),查詢套餐分類列表。根據(jù)傳遞的參數(shù),查詢菜品分類列表。圖片上傳。回顯上傳成功的圖片。根據(jù)菜品分類id,查詢菜品列表。保存套餐信息。對于上述請求,在實現(xiàn)分類管理和菜品管理時已經(jīng)完成了前4個請求的處理,接下來只需要開發(fā)最后兩項的的功能。10.3.4套餐管理1.新增套餐①根據(jù)菜品分類id,查詢菜品列表。在文件10-28的DishController類中增加根據(jù)菜品分類id查詢菜品列表的方法。DishController.java源代碼10.3.4套餐管理1.新增套餐重啟項目后,再次進(jìn)入新增套餐頁面,單擊菜品分類下拉框。10.3.4套餐管理1.新增套餐②保存套餐信息。在進(jìn)行套餐信息保存時,前端提交的數(shù)據(jù),不僅包含套餐的基本信息,還包含套餐關(guān)聯(lián)的菜品列表數(shù)據(jù)。對此可以再創(chuàng)建一個類,在Setmeal的屬性基礎(chǔ)上,再擴(kuò)充屬性來接收頁面?zhèn)鬟f的套餐關(guān)聯(lián)的菜品列表和分類名稱。在com.itheima.reggie.dto包下自定義一個類,該類繼承Setmeal類,具體如文件10-30所示。文件10-30SetmealDto.java源代碼10.3.4套餐管理1.新增套餐新增套餐時,不僅需要新增套餐的基本信息,還需要新增套餐關(guān)聯(lián)的菜品,所以也需要操作菜品口味表。在com.itheima.reggie.mapper包下創(chuàng)建套餐菜品的Service接口SetmealDishMapper,具體如文件10-31所示。文件10-31SetmealDishMapper.java源代碼10.3.4套餐管理1.新增套餐在com.itheima.reggie.service包下創(chuàng)建套餐菜品的Service接口SetmealDishService,具體如文件10-32所示。文件10-32SetmealDishService.java源代碼10.3.4套餐管理1.新增套餐在文件10-18的SetmealService接口中添加新增套餐的方法。SetmealService.java源代碼10.3.4套餐管理1.新增套餐在com.itheima.reggie.service.impl包下創(chuàng)建SetmealDishService接口的實現(xiàn)類,具體如文件10-33所示。文件10-33SetmealDishServiceImpl.java源代碼10.3.4套餐管理1.新增套餐在文件10-20的SetmealServiceImpl類中實現(xiàn)SetmealService接口中的新增套餐方法,在該方法中保存套餐基本信息和套餐關(guān)聯(lián)的菜品集合。SetmealServiceImpl.java源代碼10.3.4套餐管理1.新增套餐在com.itheima.reggie.controller包下創(chuàng)建套餐管理的Controller類,并在該類中定義新增套餐的方法,具體如文件10-34所示。文件10-34SetmealController.java源代碼10.3.4套餐管理1.新增套餐重啟項目并登陸管理端后,在新增套餐頁面中輸入新增套餐的信息,例如新增工作日超值A(chǔ)餐。10.3.4套餐管理1.新增套餐單擊新增套餐頁面的“保存”按鈕,會跳轉(zhuǎn)到套餐管理頁面,此時由于還沒有實現(xiàn)查詢套餐的功能,套餐管理頁面不會顯示套餐信息。查詢數(shù)據(jù)庫中工作日超值A(chǔ)餐的信息。10.3.4套餐管理從套餐管理頁面可以看到,頁面中提供了一個搜索框和一個展示數(shù)據(jù)的表格,并且展示數(shù)據(jù)的表格的下方提供了分頁組件,對此可以知道,查詢套餐時分為查詢所有套餐信息和查詢指定條件的套餐信息,并為查詢結(jié)果分頁進(jìn)行展示。2.查詢套餐10.3.4套餐管理(1)頁面分析從展示數(shù)據(jù)表格的表頭可以看出,需要在數(shù)據(jù)表格中展示套餐的圖片,以及套餐對應(yīng)的套餐分類名稱等信息。2.查詢套餐頁面加載時最終會以get請求方式向“/setmeal/page”發(fā)送請求,并攜帶查詢參數(shù),查詢參數(shù)包含當(dāng)前頁碼、每頁展示的數(shù)據(jù)量、搜索框中的值。查看套餐管理頁面數(shù)據(jù)初始化相關(guān)的代碼10.3.4套餐管理2.查詢套餐圖片的src屬性值為getImage()方法的返回值,getImage()方法根據(jù)圖片名稱在URL“/common/download”下載對應(yīng)的圖片。套餐管理頁面的數(shù)據(jù)表格中,菜品圖片的相關(guān)代碼10.3.4套餐管理(2)功能實現(xiàn)從套餐管理頁面中的代碼可以得出,訪問套餐管理頁面時,頁面加載時會自動攜帶參數(shù)向“/setmeal/page”發(fā)送分頁查詢套餐信息的請求,并根據(jù)獲取到的套餐圖片名稱下載對應(yīng)的圖片進(jìn)行展示。圖片下載的功能之前已經(jīng)實現(xiàn),在此,只需要完成分頁查詢的功能即可。2.查詢套餐10.3.4套餐管理在查詢套餐信息時,包含的是套餐的分類id,而頁面需要展示的是套餐的分類名稱,并且分類的名稱前端在接收的時候是通過categoryName屬性獲取的,所以返回給頁面的數(shù)據(jù)中應(yīng)該包含categoryName屬性的信息。對此可以可以將返回的信息封裝在SetmealDto對象中。在文件10-34的SetmealController類中添加分頁查詢套餐的方法page()方法。2.查詢套餐SetmealController.java源代碼10.3.4套餐管理(3)功能測試重新啟動項目,成功登錄管理端之后,訪問套餐管理頁面,此時頁面會自動分頁查詢套餐信息,并展示在頁面的表格中。2.查詢套餐10.3.4套餐管理在套餐管理頁面的搜索框中輸入套餐名稱進(jìn)行指定套餐的查詢,例如在搜索框中輸入“兒童”后按下“Enter”鍵或者單擊左側(cè)的搜索圖標(biāo),搜索套餐名稱中包含“兒童”的套餐。2.查詢套餐10.3.4套餐管理修改套餐是在原有的套餐信息的基礎(chǔ)上對套餐信息進(jìn)行更新,對此修改套餐信息之前需要將原有的套餐信息在修改界面進(jìn)行展示,然后再對套餐信息進(jìn)行修改,確認(rèn)修改信息后,再提交新的套餐信息到數(shù)據(jù)庫進(jìn)行更新。接下來將修改套餐分為回顯套餐信息和更新套餐信息2部分進(jìn)行講解。(1)回顯套餐信息①頁面分析3.修改套餐單擊“修改”按鈕時,會攜帶當(dāng)前套餐id跳轉(zhuǎn)到“/backend/page/combo/add.html”頁面。查看套餐管理頁面中“修改”按鈕的相關(guān)代碼10.3.4套餐管理3.修改套餐修改套餐信息時,add.html頁面會攜帶套餐id以get請求方式向“/setmeal”發(fā)送請求。查看add.html頁面初始化相關(guān)代碼10.3.4套餐管理3.修改套餐②功能實現(xiàn)從頁面分析可以知道,單擊套餐管理頁面的“修改”按鈕后,頁面會發(fā)送查詢請求,根據(jù)套餐id請求查詢當(dāng)前套餐信息和對應(yīng)的菜品信息,頁面再根據(jù)查詢結(jié)果回顯套餐信息。在文件10-18的SetmealService接口中添加getByIdWithDish()方法。SetmealService.java源代碼10.3.4套餐管理3.修改套餐在文件10-20的SetmealServiceImpl類中實現(xiàn)SetmealService接口中的getByIdWithDish()方法,在該方法中根據(jù)套餐id查詢套餐信息和對應(yīng)的菜品信息。SetmealServiceImpl.java源代碼10.3.4套餐管理3.修改套餐在文件10-34的SetmealController類中添加根據(jù)套餐id查詢套餐信息的方法。SetmealController.java源代碼10.3.4套餐管理3.修改套餐③功能測試重新啟動項目,成功登錄管理端之后,在套餐管理頁面單擊工作日超值A(chǔ)餐的“修改”按鈕,請求修改工作日超值A(chǔ)餐的信息。10.3.4套餐管理3.修改套餐(2)更新套餐信息①頁面分析從修改套餐頁面可以看到,頁面提供了“保存”按鈕,更新菜品信息后,單擊該按鈕提交更新套餐信息請求。單擊“保存”按鈕后,頁面會攜帶表單中的套餐信息以put請求方式向“/setmeal”發(fā)送請求。查看add.html頁面初始化相關(guān)代碼10.3.4套餐管理3.修改套餐②功能實現(xiàn)從頁面分析可以知道,單擊修改套餐頁面的“保存”后,頁面會發(fā)送異步請求更新套餐信息,具體實現(xiàn)如下。在文件10-18的SetMealService接口中添加updateWithDish()方法。SetmealService.java源代碼10.3.4套餐管理3.修改套餐在文件10-20的SetMealServiceImpl類中實現(xiàn)SetMealService接口中的updateWithDish()方法,在該方法中根據(jù)提交過來的套餐信息進(jìn)行更新。在更新套餐信息時除了要更新套餐基本信息,還需要更新套餐包含的菜品。由于頁面在更新套餐包含的菜品時,有可能是修改、新增或刪除,對此,更新套餐包含的菜品時,可以對原有包含的菜品先刪除,后添加。SetmealServiceImpl.java源代碼10.3.4套餐管理3.修改套餐在10-34的SetmealController類中添加修改菜品信息的方法。SetmealController.java源代碼10.3.4套餐管理3.修改套餐③功能測試重新啟動項目,成功登錄管理端之后,在圖10-61中將工作日超值A(chǔ)餐的套餐名稱修改為工作日超值A(chǔ)套餐,價格修改為108后,單擊“保存”按鈕。10.3.4套餐管理4.啟售和停售套餐套餐和菜品的售賣狀態(tài)一樣,包含啟售和停售,分別表示套餐在用戶端中是否顯示售賣。啟售和停售可以通過批量操作的方式進(jìn)行修改,也可以只操作單個套餐的售賣狀態(tài),下面對套餐的啟售和停售進(jìn)行講解。(1)頁面分析單擊“批量啟售”、“批量停售”、操作列的售賣狀態(tài)最終都會攜帶需要修改售賣狀態(tài)的套餐id以post請求方式向“/setmeal/status/${params.status}”發(fā)送請求,其中${params.status}為套餐修改后的售賣狀態(tài)。查看菜品管理頁面中與啟售以及停售菜品的相關(guān)代碼10.3.4套餐管理4.啟售和停售套餐(2)功能實現(xiàn)從頁面分析可以知道,不管是批量修改填充的售賣狀態(tài),還是單獨修改指定套餐的售賣狀態(tài),請求的地址都一樣。在10-34的SetmealController類中添加修改套餐售賣狀態(tài)的方法。SetmealController.java源代碼10.3.4套餐管理4.啟售和停售套餐(3)功能測試重新啟動項目,成功登錄管理端之后,在套餐管理頁面中勾選工作日超值A(chǔ)套餐和兒童套餐A計劃左側(cè)的多選框后,單擊“批量停售”。10.3.4套餐管理4.啟售和停售套餐在套餐管理頁面中單擊“兒童套餐A計劃”操作列中的“啟售”。10.3.4套餐管理5.刪除套餐套餐管理頁面中提供了批量刪除和單個刪除套餐的鏈接,用戶可以根據(jù)需求,選擇通過不同的方式對套餐進(jìn)行刪除。(1)頁面分析單擊“批量刪除”和“刪除”時會攜帶需要刪除的套餐的id以delete請求方式向“/setmeal”發(fā)送·。查看套餐管理頁面中與刪除套餐的相關(guān)代碼10.3.4套餐管理5.刪除套餐(2)功能實現(xiàn)刪除套餐時,同時需要刪除套餐菜品關(guān)聯(lián)表中套餐菜品的關(guān)聯(lián)信息。在文件10-18的SetmealService接口中添加removeWithDish()方法。SetmealService.java源代碼10.3.4套餐管理5.刪除套餐在文件10-20的SetmealServiceImpl類中實現(xiàn)SetmealService接口中的removeWithDish()方法,在該方法中根據(jù)提交過來的套餐id刪除套餐信息和套餐菜品關(guān)聯(lián)表中套餐和菜品的關(guān)聯(lián)數(shù)據(jù)。如果套餐的售賣狀態(tài)為啟售的話,為確保不影響用戶體驗,則不允許刪除。SetmealServiceImpl.java源代碼10.3.4套餐管理5.刪除套餐從頁面分析可以知道,不管是批量刪除套餐,還是單獨刪除指定的套餐,請求的地址都一樣。在文件10-34的SetmealController類中添加刪除套餐的方法。SetmealController.java源代碼10.3.4套餐管理5.刪除套餐(3)功能測試重新啟動項目,成功登錄管理端之后,在套餐管理頁面中勾選“工作日超值A(chǔ)套餐”和“兒童套餐A計劃”的多選框后,單擊“批量刪除”。10.3.4套餐管理5.
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考語文-中等生百日沖刺+專題5:文言實詞與虛詞
- 航天知識培訓(xùn)課件下載
- 經(jīng)理銷售工作計劃
- 保安年度工作總結(jié)范文(33篇)
- 大學(xué)生軍訓(xùn)感想(33篇)
- 六氟化硫知識培訓(xùn)課件
- 2025年專用票清分機(jī)合作協(xié)議書
- 梨園醫(yī)院整合推廣方案1
- 培訓(xùn)資料-胸腔鏡肺葉切除手術(shù)配合及護(hù)理
- 商場企業(yè)安全標(biāo)準(zhǔn)化
- 2024環(huán)氧磨石地坪施工技術(shù)規(guī)程
- 五年級下冊小學(xué)數(shù)學(xué)《分?jǐn)?shù)的加法和減法》單元作業(yè)設(shè)計
- 醫(yī)學(xué)文獻(xiàn)管理制度
- 旅游政策法規(guī)教案
- 白塞氏病學(xué)習(xí)課件
- 高頻電子線路課后習(xí)題
- 川教版六年級《生命.生態(tài).安全》下冊第1課《我們的閑暇時光》課件
- 2022年版初中物理課程標(biāo)準(zhǔn)解讀-課件
- 重大風(fēng)險管控方案及措施客運站
- 新編大學(xué)英語跨文化交際教程 課件 Unit 1-A Chinese Character
- 中醫(yī)護(hù)理望聞問切
評論
0/150
提交評論