版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
模塊八用戶端-體檢預(yù)約《JavaEE企業(yè)級應(yīng)用開發(fā)項(xiàng)目教程(SSM)》知識目標(biāo)/Target了解FreeMarker,能夠簡述FreeMarker的作用和生成文件的原理熟悉FreeMarker的常用指令,能夠在FTL標(biāo)簽中正確使用assign指令、include指令、if指令和list指令技能目標(biāo)/Target掌握顯示套餐詳情功能的實(shí)現(xiàn)掌握體檢預(yù)約功能的實(shí)現(xiàn)掌握靜態(tài)頁面的實(shí)現(xiàn)方式,能夠使用FreeMarker技術(shù)實(shí)現(xiàn)套餐列表與套餐詳情頁面的靜態(tài)化掌握顯示套餐列表功能的實(shí)現(xiàn)章節(jié)概述/
Summary體檢是了解自身健康狀況、及時(shí)發(fā)現(xiàn)身體異常,以及預(yù)防疾病的重要手段之一。為了給廣大體檢用戶提供便利,傳智健康用戶端設(shè)立了線上體檢預(yù)約服務(wù),用戶可以隨時(shí)隨地進(jìn)行體檢預(yù)約。傳智健康的用戶端可以展示套餐列表、套餐詳情和進(jìn)行體檢預(yù)約。接下來,本模塊將對用戶端的體檢預(yù)約進(jìn)行詳細(xì)講解。目錄/Contents01020304套餐列表套餐詳情體檢預(yù)約頁面靜態(tài)化套餐列表8-1任務(wù)描述在瀏覽器中訪問用戶端首頁index.html。體檢套餐是傳智健康面向體檢用戶銷售的產(chǎn)品,為了讓用戶全方位地了解體檢套餐的種類,傳智健康用戶端提供套餐列表頁面供用戶瀏覽。任務(wù)描述在用戶端首頁單擊“體檢預(yù)約”超鏈接后會跳轉(zhuǎn)到套餐列表頁面setmeal.html,該頁面以列表的形式展示所有的體檢套餐。任務(wù)分析訪問套餐列表頁面setmeal.html時(shí),提交查詢所有套餐的請求。(3)查詢套餐SetmealServiceImpl類中重寫SetmealService接口的findAll()方法查詢所有的套餐。(2)接收和處理查詢所有套餐的請求控制器類SetmealController的getSetmeal()方法接收頁面提交的請求。(4)查詢結(jié)果展示setmeal.html頁面根據(jù)返回結(jié)果展示查詢到的所有的套餐。(1)提交查詢所有套餐的請求任務(wù)分析套餐列表的實(shí)現(xiàn)過程任務(wù)實(shí)現(xiàn)要實(shí)現(xiàn)在訪問setmeal.html頁面時(shí)展示所有的套餐,可以將查詢的操作定義在鉤子函數(shù)created()中,在created()函數(shù)中使用Axios發(fā)送異步請求的方式獲取所有的套餐數(shù)據(jù)。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>varvue=newVue({
created(){
axios.post("/setmeal/getSetmeal.do").then((response)=>{if(response.data.flag){this.setmealList=response.data.data;}});}});</script>引入js文件數(shù)據(jù)雙向綁定(1)提交查詢所有套餐的請求任務(wù)實(shí)現(xiàn)在health_mobile模塊的com.itheima.controller包下創(chuàng)建控制器類SetmealController,在類中定義getSetmeal()方法,用于接收和處理查詢所有套餐的請求。@RestController@RequestMapping("/setmeal")publicclassSetmealController{@ReferenceprivateSetmealServicesetmealService;@RequestMapping("/getSetmeal")publicResultgetSetmeal(){try{List<Setmeal>list=setmealService.findAll();returnnewResult(true,MessageConstant.QUERY_SETMEAL_SUCCESS,list);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.QUERY_SETMEAL_FAIL);}}}(2)實(shí)現(xiàn)查詢套餐控制器任務(wù)實(shí)現(xiàn)在health_interface子模塊的SetmealService接口中定義findAll()方法,用于查詢套餐列表。//查詢套餐列表publicList<Setmeal>findAll();(3)創(chuàng)建查詢套餐服務(wù)任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的SetmealServiceImpl類中重寫接口的findAll()方法,用于查詢套餐列表。@OverridepublicList<Setmeal>findAll(){
returnsetmealDao.findAll();//調(diào)用持久層接口查詢套餐}(4)實(shí)現(xiàn)查詢套餐服務(wù)任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的SetmealDao接口中定義findAll()方法,用于查詢所有套餐。//查詢所有套餐publicList<Setmeal>findAll();(5)實(shí)現(xiàn)持久層查詢套餐在health_service_provider子模塊的SetmealDao.xml映射文件中使用<select>元素映射查詢語句,查詢所有的套餐數(shù)據(jù)。<!--獲取所有套餐信息--><selectid="findAll"resultType="com.itheima.pojo.Setmeal">SELECT*FROMt_setmeal</select>任務(wù)實(shí)現(xiàn)啟動Zookeeper服務(wù),在IDEA依次啟動health_service_provider和health_mobile,在瀏覽器中訪http://localhost/pages/setmeal.html。(6)測試套餐列表功能套餐詳情8-2任務(wù)描述用戶想要了解套餐的所有檢查組和檢查項(xiàng),可以訪問套餐詳情頁面setmeal_detail.html,在頁面上查看套餐的詳細(xì)信息。任務(wù)分析訪問setmeal_detail.html頁面,提交查詢套餐詳細(xì)信息的請求。(3)查詢套餐詳細(xì)信息SetmealServiceImpl類中重寫SetmealService接口的findSetmealById()方法查詢套餐詳細(xì)信息。(2)接收和處理查詢套餐詳細(xì)信息的請求SetmealController類的findById()方法接收頁面提交的請求。(4)查詢結(jié)果展示setmeal_detail.html頁面根據(jù)返回結(jié)果展示查詢的套餐詳細(xì)信息。(1)提交查詢套餐詳細(xì)信息的請求任務(wù)分析套餐詳情的實(shí)現(xiàn)過程任務(wù)實(shí)現(xiàn)將查詢的操作定義在鉤子函數(shù)created()中,在created()函數(shù)中通過使用Axios發(fā)送異步請求的方式查詢套餐詳細(xì)信息。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>varvue=newVue({
created(){
axios.post("/setmeal/findById.do?id="+id).then((response)=>{if(response.data.flag){this.setmeal=response.data.data;this.imgUrl='/'+this.setmeal.img;}});}});</script>數(shù)據(jù)雙向綁定(1)提交查詢套餐詳細(xì)信息的請求任務(wù)實(shí)現(xiàn)在health_mobile模塊的SetmealController類中定義findById()方法,用于接收和處理查詢套餐詳細(xì)信息的請求。//根據(jù)套餐id查詢套餐詳情,包含(套餐基本信息、套餐關(guān)聯(lián)的檢查組、檢查組關(guān)聯(lián)的檢查項(xiàng))@RequestMapping("/findById")publicResultfindById(Integerid){try{
Setmealsetmeal=setmealService.findById(id);returnnewResult(true,MessageConstant.QUERY_SETMEAL_SUCCESS,setmeal);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.QUERY_SETMEAL_FAIL);}}(2)實(shí)現(xiàn)查詢套餐詳細(xì)信息控制器任務(wù)實(shí)現(xiàn)在health_interface子模塊的SetmealService接口中定義findSetmealById()方法,用于根據(jù)套餐id查詢套餐詳細(xì)信息。//查詢套餐詳情publicSetmealfindSetmealById(Integerid);(3)創(chuàng)建查詢套餐詳細(xì)信息服務(wù)任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的SetmealServiceImpl類中重寫SetmealService接口的findSetmealById()方法,用于根據(jù)套餐id查詢套餐詳細(xì)信息。@OverridepublicSetmealfindSetmealById(Integerid){
returnsetmealDao.findById4Detail();//調(diào)用持久層查詢套餐詳情}(4)實(shí)現(xiàn)查詢套餐詳細(xì)信息服務(wù)任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的SetmealDao接口中定義findById4Detail()方法,用于根據(jù)套餐id查詢套餐詳細(xì)信息。//查詢套餐列表publicSetmealfindById4Detail(Integerid);(5)實(shí)現(xiàn)持久層查詢套餐詳細(xì)信息任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的SetmealDao.xml映射文件中使用<select>元素映射查詢語句,根據(jù)套餐id查詢套餐詳細(xì)信息。<resultMapid="baseResultMap"type="com.itheima.pojo.Setmeal"><idcolumn="id"property="id"/><resultcolumn="name"property="name"/>
</resultMap><!--配置多對多映射關(guān)系--><resultMapid="findByIdResultMap"extends="baseResultMap"type="com.itheima.pojo.Setmeal"><!--column用于指定將哪個(gè)字段的值傳遞給第二條sql--><collectionproperty="checkGroups"ofType="com.itheima.pojo.CheckGroup"column="id"select="com.itheima.dao.CheckGroupDao.selectCheckGroupsBySetmealId"></collection></resultMap><!--根據(jù)套餐id查詢套餐詳情(包含基本信息、關(guān)聯(lián)的檢查組、檢查項(xiàng)信息)--><selectid="findById4Detail"parameterType="int"resultMap="findByIdResultMap">SELECT*FROMt_setmealWHEREid=#{id}</select>(5)實(shí)現(xiàn)持久層查詢套餐詳細(xì)信息任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的CheckGroupDao.xml映射文件中使用<select>元素映射查詢語句,根據(jù)套餐id查詢套餐對檢查組的引用。<resultMapid="baseResultMap"type="com.itheima.pojo.CheckGroup"><idcolumn="id"property="id"/><resultcolumn="name"property="name"/>
</resultMap><!--配置多對多映射關(guān)系--><resultMapid="findByIdResultMap"extends="baseResultMap"type="com.itheima.pojo.CheckGroup"><collectionproperty="checkItems"ofType="com.itheima.pojo.CheckItem"column="id"select="com.itheima.dao.CheckItemDao.findCheckItemsByCheckGroupId"></collection></resultMap><!--根據(jù)套餐id查詢關(guān)聯(lián)的檢查組集合--><selectid="selectCheckGroupsBySetmealId"parameterType="int"resultMap="findByIdResultMap">SELECT*FROMt_checkgroupWHEREidIN
(SELECTcheckgroup_idFROMt_setmeal_checkgroupWHEREsetmeal_id=#{setmealId})</select>(5)實(shí)現(xiàn)持久層查詢套餐詳細(xì)信息任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的CheckItemDao.xml映射文件中使用<select>元素映射查詢語句,根據(jù)檢查組id查詢檢查組對檢查項(xiàng)的引用。<!--根據(jù)檢查組id查詢關(guān)聯(lián)的檢查項(xiàng)--><selectid="findCheckItemsByCheckGroupId"parameterType="int"
resultType="com.itheima.pojo.CheckItem">SELECT*FROMt_checkitemWHEREidIN
(SELECTcheckitem_idFROMt_checkgroup_checkitem
WHEREcheckgroup_id=#{checkgroup_id})</select>(5)實(shí)現(xiàn)持久層查詢套餐詳細(xì)信息任務(wù)實(shí)現(xiàn)啟動Zookeeper服務(wù),在IDEA依次啟動health_service_provider和health_mobile。在瀏覽器中訪問http://localhost/pages/setmeal.html。單擊名稱為肝腎檢查的套餐,跳轉(zhuǎn)到套餐詳情頁面。(6)測試套餐詳情功能體檢預(yù)約8-3任務(wù)描述用戶選擇好體檢套餐后,單擊套餐詳情頁面的“立即預(yù)約”進(jìn)入對應(yīng)的體檢預(yù)約頁面orderInfo.html。任務(wù)描述在體檢預(yù)約頁面中,輸入體檢人信息后,單擊“提交預(yù)約”按鈕,如果預(yù)約失敗,在orderInfo.html頁面會提示失敗原因;如果預(yù)約成功,跳轉(zhuǎn)到預(yù)約成功頁面orderSuccess.html。體檢預(yù)約可以分解成4個(gè)功能,分別是跳轉(zhuǎn)到體檢預(yù)約頁面后顯示套餐、發(fā)送短信驗(yàn)證碼、預(yù)約體檢、跳轉(zhuǎn)到預(yù)約成功頁面。任務(wù)分析任務(wù)分析(1)跳轉(zhuǎn)到體檢預(yù)約頁面為setmeal_detail.html頁面的“立即預(yù)約”綁定單擊事件,在單擊事件觸發(fā)后提交跳轉(zhuǎn)到體檢預(yù)約頁面的請求。(2)提交查詢套餐的請求跳轉(zhuǎn)到orderInfo.html頁面的同時(shí),提交查詢套餐的請求。(3)接收和處理查詢套餐的請求SetmealController類的findById()方法接收頁面提交的請求。(5)查詢結(jié)果展示orderInfo.html頁面根據(jù)返回結(jié)果展示查詢的套餐信息。(4)查詢套餐信息SetmealServiceImpl類中重寫SetmealService接口的findSetmealById()方法。1.跳轉(zhuǎn)體檢預(yù)約頁面后顯示套餐任務(wù)分析跳轉(zhuǎn)體檢預(yù)約頁面后顯示套餐的實(shí)現(xiàn)過程任務(wù)分析2.發(fā)送短信驗(yàn)證碼為orderInfo.html頁面的“發(fā)送驗(yàn)證碼”綁定單擊事件,在單擊事件觸發(fā)后提交填寫的手機(jī)號。由ValidateCodeController類的send4Order()方法接收頁面提交的手機(jī)號,并調(diào)用短信服務(wù)SMSUtils發(fā)送短信驗(yàn)證碼。發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)過程任務(wù)分析為orderInfo.html頁面的“提交預(yù)約”按鈕綁定單擊事件,在單擊事件觸發(fā)后提交預(yù)約體檢的請求。(3)保存新增預(yù)約數(shù)據(jù)首先判斷當(dāng)前預(yù)約日期是否允許預(yù)約,如果允許,判斷用戶是不是會員,如果是會員,判斷是否重復(fù)預(yù)約;如果不是會員,則將該用戶自動注冊為會員,然后提交預(yù)約并更新已預(yù)約人數(shù)。(2)接收和處理預(yù)約體檢的請求由控制器類OrderController中的submitOrder()方法接收頁面提交的請求。(4)展示預(yù)約體檢結(jié)果orderInfo.html頁面根據(jù)返回結(jié)果展示預(yù)約體檢結(jié)果。(1)提交預(yù)約體檢的請求3.預(yù)約體檢任務(wù)分析預(yù)約體檢的實(shí)現(xiàn)過程任務(wù)分析訪問orderSuccess.html頁面時(shí),提交查詢預(yù)約信息的請求。(3)查詢預(yù)約信息在OrderServiceImpl類中重寫OrderService接口的findById()方法。(2)接收和處理查詢預(yù)約信息的請求由控制器類OrderController的findById()方法接收頁面提交的請求。(4)展示查詢結(jié)果orderSuccess.html頁面根據(jù)返回結(jié)果展示查詢到的預(yù)約信息。(1)提交查詢預(yù)約信息的請求4.跳轉(zhuǎn)到預(yù)約成功頁面任務(wù)分析跳轉(zhuǎn)預(yù)約成功頁面的實(shí)現(xiàn)過程任務(wù)實(shí)現(xiàn)為“立即預(yù)約”綁定單擊事件,并設(shè)置單擊時(shí)要調(diào)用的方法,在方法中提交跳轉(zhuǎn)頁面的請求。<divclass="box-button"><aclass="order-btn"@click="toOrderInfo()">立即預(yù)約</a></div>1.跳轉(zhuǎn)到體檢預(yù)約頁面后顯示套餐(1)提交跳轉(zhuǎn)到體檢預(yù)約頁面的請求任務(wù)實(shí)現(xiàn)在setmeal_detail.html頁面中定義toOrderInfo()方法,用于提交跳轉(zhuǎn)頁面的請求。<script>varvue=newVue({
methods:{toOrderInfo(){window.location.href="orderInfo.html?id="+id;}}});</script>1.跳轉(zhuǎn)到體檢預(yù)約頁面后顯示套餐(1)提交跳轉(zhuǎn)到體檢預(yù)約頁面的請求任務(wù)實(shí)現(xiàn)要實(shí)現(xiàn)訪問orderInfo.html頁面時(shí)展示套餐信息,可以將查詢套餐的操作定義在鉤子函數(shù)created()中。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>created(){//發(fā)送axios請求,根據(jù)套餐id查詢套餐信息,用于頁面展示
axios.post("/setmeal/findById.do?id="+id).then((response)=>{if(response.data.flag){
this.setmeal=response.data.data;}});},</script>1.跳轉(zhuǎn)體檢預(yù)約頁面后顯示套餐(2)提交查詢套餐的請求1.跳轉(zhuǎn)到體檢預(yù)約頁面后顯示套餐任務(wù)實(shí)現(xiàn)接下來應(yīng)該實(shí)現(xiàn)查詢套餐信息的后臺邏輯代碼,但由于查詢套餐信息的findById()方法在套餐詳情中已經(jīng)實(shí)現(xiàn),所以這里不再重復(fù)展示,稍后直接進(jìn)行功能測試即可。1.跳轉(zhuǎn)體檢預(yù)約頁面后顯示套餐(3)實(shí)現(xiàn)查詢套餐信息1.跳轉(zhuǎn)到體檢預(yù)約頁面后顯示套餐任務(wù)實(shí)現(xiàn)啟動ZooKeeper服務(wù)、Redis服務(wù),在IDEA中依次啟動health_service_provider和health_mobile。在瀏覽器中訪問http://localhost/pages/setmeal_detail.html?id=6進(jìn)入肝腎檢查的套餐詳情頁面,單擊“立即預(yù)約”跳轉(zhuǎn)到對應(yīng)的體檢預(yù)約頁面。1.跳轉(zhuǎn)體檢預(yù)約頁面后顯示套餐(4)測試跳轉(zhuǎn)到體檢預(yù)約頁面后顯示套餐1.跳轉(zhuǎn)到體檢預(yù)約頁面后顯示套餐任務(wù)實(shí)現(xiàn)要實(shí)現(xiàn)單擊“發(fā)送驗(yàn)證碼”按鈕后接收短信驗(yàn)證碼,可以為“發(fā)送驗(yàn)證碼”按鈕綁定單擊事件,并設(shè)置單擊時(shí)要調(diào)用的方法,在該方法中提交發(fā)送驗(yàn)證碼的請求。<inputstyle="font-size:x-small;"id="validateCodeButton"
@click="sendValidateCode()"type="button"value="發(fā)送驗(yàn)證碼">2.發(fā)送短信驗(yàn)證碼(1)提交發(fā)送短信驗(yàn)證碼的請求任務(wù)實(shí)現(xiàn)orderInfo.html頁面中定義sendValidateCode()方法,用于發(fā)送短信驗(yàn)證碼sendValidateCode(){vartelephone=this.orderInfo.telephone;//獲取用戶輸入的手機(jī)號if(!checkTelephone(telephone)){this.$message.error("手機(jī)號輸入錯(cuò)誤,請檢查后重新輸入!");returnfalse;}validateCodeButton=$("#validateCodeButton")[0];//鎖定按鈕clock=window.setInterval(doLoop,1000);//使用定時(shí)器方法每隔1秒執(zhí)行一次
axios.post("/validatecode/send4Order.do?telephone="+telephone).then((res)=>{if(!res.data.flag){this.$message.error(res.data.message);}});}2.發(fā)送短信驗(yàn)證碼(1)提交發(fā)送短信驗(yàn)證碼的請求任務(wù)實(shí)現(xiàn)在health_mobile模塊的ValidateCodeController類中定義send4Order()方法,用于接收和處理發(fā)送短信驗(yàn)證碼的請求。@RequestMapping("/send4Order")publicResultsend4Order(Stringtelephone){Stringcode=ValidateCodeUtils.generateValidateCode(4).toString();try{
SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,code);//將驗(yàn)證碼保存到redis,只保存5分鐘
jedisPool.getResource().setex(telephone+RedisMessageConstant.SENDTYPE_ORDER,300,code);returnnewResult(true,MessageConstant.SEND_VALIDATECODE_SUCCESS);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.SEND_VALIDATECODE_FAIL);}}獲取4位數(shù)驗(yàn)證碼發(fā)送短信2.發(fā)送短信驗(yàn)證碼(2)實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼控制器任務(wù)實(shí)現(xiàn)依次啟動ZooKeeper服務(wù)、Redis服務(wù)、health_service_provider和health_mobile。在瀏覽器中訪問http://localhost/pages/orderInfo.html?id=8。填寫手機(jī)號后,單擊“發(fā)送驗(yàn)證碼”,通過手機(jī)接收短信驗(yàn)證碼后將驗(yàn)證碼填寫到輸入框中。2.發(fā)送短信驗(yàn)證碼(3)測試發(fā)送短信驗(yàn)證碼任務(wù)實(shí)現(xiàn)要實(shí)現(xiàn)單擊“提交預(yù)約”按鈕時(shí)提交預(yù)約請求,可以為該按鈕綁定單擊事件,并設(shè)置單擊時(shí)要調(diào)用的方法,在該方法中提交預(yù)約請求。<buttontype="button"class="btnorder-btn"
@click="submitOrder()">提交預(yù)約</button>3.預(yù)約體檢(1)提交預(yù)約請求任務(wù)實(shí)現(xiàn)在orderInfo.html頁面定義submitOrder()方法,用于提交預(yù)約請求。submitOrder(){varidCard=this.orderInfo.idCard;//身份證進(jìn)行校驗(yàn)if(!checkIdCard(idCard)){this.$message.error("身份證號輸入錯(cuò)誤,請檢查后重新輸入!");returnfalse;}
axios.post("/order/submitOrder.do",this.orderInfo).then((res)=>{if(res.data.flag){window.location.href="orderSuccess.html?orderId="+res.data.data;}else{this.$message.error(res.data.message);//預(yù)約失敗,彈出提示}});}3.預(yù)約體檢(1)提交預(yù)約請求任務(wù)實(shí)現(xiàn)在health_common子模塊的com.itheima.pojo包下創(chuàng)建Order類,在類中聲明預(yù)約的屬性,定義各屬性的getter/setter方法,并定義構(gòu)造方法。3.預(yù)約體檢(2)創(chuàng)建預(yù)約類3.預(yù)約體檢(3)導(dǎo)入公共資源在health_common子模塊的com.itheima.utils包中導(dǎo)入DateUtils類,用于日期格式化操作。由于代碼過長,此處不進(jìn)行展示,讀者可以從本書提供的資源中獲取。任務(wù)實(shí)現(xiàn)在health_mobile模塊的com.itheima.controller包下創(chuàng)建控制器類OrderController,在類中定義submitOrder()方法,用于接收和處理預(yù)約體檢的請求。(1)獲取用戶輸入的驗(yàn)證碼與存儲在Redis中的驗(yàn)證碼進(jìn)行比對,判斷是否正確;(2)驗(yàn)證碼比對通過后,調(diào)用OrderService接口的order()方法實(shí)現(xiàn)預(yù)約體檢。3.預(yù)約體檢(4)實(shí)現(xiàn)預(yù)約體檢控制器任務(wù)實(shí)現(xiàn)在health_interface子模塊的com.itheima.service包下創(chuàng)建接口OrderService,在接口中定義order()方法,用于預(yù)約體檢。publicinterfaceOrderService{publicResultorder(Mapmap)throwsException;//體檢預(yù)約}3.預(yù)約體檢(5)創(chuàng)建預(yù)約體檢服務(wù)任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的com.itheima.service.impl包下創(chuàng)建OrderService接口的實(shí)現(xiàn)類OrderServiceImpl,在類中重寫order()方法,用于預(yù)約體檢。(1)查詢用戶是否在某日期進(jìn)行過體驗(yàn)預(yù)約并判斷該日期是否已經(jīng)約滿。(2)查詢當(dāng)前用戶是否為會員,如果是會員,查詢該會員是否重復(fù)預(yù)約,若是重復(fù)預(yù)約則無法繼續(xù)預(yù)約;如果不是會員,則將該用戶自動注冊為會員。(3)新增預(yù)約,更新已預(yù)約人數(shù)。3.預(yù)約體檢(6)實(shí)現(xiàn)預(yù)約體檢服務(wù)任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的com.itheima.dao包下創(chuàng)建持久層接口OrderDao,用于處理與體檢預(yù)約相關(guān)的操作。publicinterfaceOrderDao{publicList<Order>findByCondition(Orderorder);//查詢預(yù)約信息publicvoidadd(Orderorder);//新增預(yù)約}3.預(yù)約體檢(7)實(shí)現(xiàn)持久層預(yù)約體檢任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的resources文件夾的com.itheima.dao目錄下創(chuàng)建與OrderDao接口同名的映射文件OrderDao.xml。在文件中使用<insert>元素映射新增語句,使用<select>元素映射查詢語句。<insertid="add"parameterType="com.itheima.pojo.Order"><selectKeyresultType="java.lang.Integer"order="AFTER"keyProperty="id">SELECTLAST_INSERT_ID()</selectKey>INSERTINTOt_order(member_id,orderDate,orderType,orderStatus,setmeal_id)
VALUES(#{memberId},#{orderDate},#{orderType},#{orderStatus},#{setmealId})</insert>新增預(yù)約信息3.預(yù)約體檢(7)實(shí)現(xiàn)持久層預(yù)約體檢任務(wù)實(shí)現(xiàn)<resultMapid="baseResultMap"type="com.itheima.pojo.Order"><idcolumn="id"property="id"/>
</resultMap><selectid="findByCondition"parameterType="com.itheima.pojo.Order"
resultMap="baseResultMap">select*fromt_order<where><iftest="id!=null">ANDid=#{id}</if>
</where></select>查詢預(yù)約信息3.預(yù)約體檢(7)實(shí)現(xiàn)持久層預(yù)約體檢任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的OrderSettingDao接口中定義findByOrderDate()方法和editReservationsByOrderDate()方法。//根據(jù)日期查詢預(yù)約設(shè)置信息publicOrderSettingfindByOrderDate(Datedate);//更新已預(yù)約人數(shù)publicvoideditReservationsByOrderDate(OrderSettingorderSetting);3.預(yù)約體檢(7)實(shí)現(xiàn)持久層預(yù)約體檢任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的OrderSettingDao.xml映射文件中使用<select>元素映射查詢語句,使用<update>元素映射更新語句。<!--根據(jù)日期查詢預(yù)約設(shè)置信息--><selectid="findByOrderDate"parameterType="date"resultType="com.itheima.pojo.OrderSetting">select*fromt_ordersettingwhereorderDate=#{orderDate}</select><!--更新已預(yù)約人數(shù)--><updateid="editReservationsByOrderDate"
parameterType="com.itheima.pojo.OrderSetting">UPDATEt_ordersettingSETreservations=#{reservations}WHEREorderDate=#{orderDate}</update>3.預(yù)約體檢(7)實(shí)現(xiàn)持久層預(yù)約體檢任務(wù)實(shí)現(xiàn)通過查詢體檢預(yù)約信息表t_order中的數(shù)據(jù)驗(yàn)證新增預(yù)約的結(jié)果。3.預(yù)約體檢(8)查詢體檢預(yù)約信息表t_order任務(wù)實(shí)現(xiàn)要實(shí)現(xiàn)跳轉(zhuǎn)到orderSuccess.html頁面之后展示預(yù)約信息,可以將查詢預(yù)約信息的操作定義在Vue提供的鉤子函數(shù)created()中,created()函數(shù)在Vue對象初始化完成后自動執(zhí)行。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>varvue=newVue({
created(){
axios.post("/order/findById.do?id="+id).then((response)=>{this.orderInfo=response.data.data;});}});</script>4.跳轉(zhuǎn)到預(yù)約成功頁面(1)提交跳轉(zhuǎn)到預(yù)約成功頁面的請求任務(wù)實(shí)現(xiàn)在health_mobile模塊的OrderController類中定義findById()方法,用于接收和處理根據(jù)預(yù)約id查詢預(yù)約信息的請求。//根據(jù)預(yù)約id查詢預(yù)約信息@RequestMapping("/findById")publicResultfindById(Integerid){try{Mapmap=orderService.findById(id);returnnewResult(true,MessageConstant.QUERY_ORDER_SUCCESS,map);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.QUERY_ORDER_FAIL);}}(2)實(shí)現(xiàn)查詢預(yù)約控制器4.跳轉(zhuǎn)到預(yù)約成功頁面任務(wù)實(shí)現(xiàn)在health_interface子模塊的OrderService接口中定義findById()方法,用于根據(jù)預(yù)約id查詢預(yù)約信息。//根據(jù)預(yù)約id查詢預(yù)約信息publicMapfindById(Integerid);(3)創(chuàng)建查詢預(yù)約服務(wù)4.跳轉(zhuǎn)到預(yù)約成功頁面任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的OrderServiceImpl類中重寫OrderService接口的findById()方法,用于根據(jù)預(yù)約id查詢預(yù)約信息。@OverridepublicMapfindById(Integerid){Mapmap=orderDao.findById4Detail(id);if(map!=null){//處理日期格式DateorderDate=(Date)map.get("orderDate");try{map.put("orderDate",DateUtils.parseDate2String(orderDate));}catch(Exceptione){e.printStackTrace();}}returnmap;}(4)實(shí)現(xiàn)查詢預(yù)約服務(wù)4.跳轉(zhuǎn)到預(yù)約成功頁面任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的OrderDao接口中定義findById4Detail()方法,用于根據(jù)預(yù)約id查詢預(yù)約信息。//根據(jù)預(yù)約id查詢預(yù)約信息publicMapfindById4Detail(Integerid);4.跳轉(zhuǎn)預(yù)約成功頁面(5)實(shí)現(xiàn)持久層查詢預(yù)約信息4.跳轉(zhuǎn)到預(yù)約成功頁面任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的OrderDao.xml映射文件中使用<select>元素映射查詢語句,查詢預(yù)約信息,包括體檢人信息和套餐信息。<!--根據(jù)預(yù)約id查詢預(yù)約信息,包括體檢人信息、套餐信息--><selectid="findById4Detail"parameterType="int"resultType="map">SELECTASmember,ASsetmeal,o.orderDateASorderDate,o.orderTypeASorderTypeFROMt_ordero,t_memberm,t_setmealsWHEREo.member_id=m.idANDo.setmeal_id=s.idANDo.id=#{id}</select>(5)實(shí)現(xiàn)持久層查詢預(yù)約信息4.跳轉(zhuǎn)到預(yù)約成功頁面任務(wù)實(shí)現(xiàn)依次啟動ZooKeeper服務(wù)、health_service_provider和health_mobile,在瀏覽器中訪問http://localhost/pages/orderSuccess.html?orderId=22。(6)測試跳轉(zhuǎn)到預(yù)約成功頁面4.跳轉(zhuǎn)到預(yù)約成功頁面頁面靜態(tài)化8-4任務(wù)描述用戶登錄用戶端進(jìn)行體檢預(yù)約時(shí),需要訪問套餐列表頁面和套餐詳情頁面,此時(shí)訪問這兩個(gè)頁面,頁面展示的所有信息都需要從數(shù)據(jù)庫中查詢,如果訪問量大,會造成數(shù)據(jù)庫的訪問壓力大、頁面刷新緩慢等問題。從套餐包含的信息可以看出,套餐包含基本信息、對檢查組的引用信息。一般情況下套餐內(nèi)容變化頻率不高,所以我們可以將套餐列表頁面和套餐詳情頁面動態(tài)查詢的結(jié)果分別轉(zhuǎn)化成固定的靜態(tài)頁面進(jìn)行展示,從而為數(shù)據(jù)庫減壓并提高系統(tǒng)運(yùn)行性能。頁面靜態(tài)化就是將原來的動態(tài)網(wǎng)頁使用靜態(tài)化技術(shù)生成靜態(tài)網(wǎng)頁,這樣用戶在訪問網(wǎng)頁時(shí),服務(wù)器直接響應(yīng)靜態(tài)頁面,不需要反復(fù)查詢數(shù)據(jù)庫,從而有效降低數(shù)據(jù)庫的訪問壓力。與數(shù)據(jù)庫中數(shù)據(jù)保持一致的靜態(tài)頁面才是有效可用的。當(dāng)管理端執(zhí)行套餐新增、編輯或刪除的操作后,會改變套餐的信息,這時(shí)需要重新生成靜態(tài)頁面。任務(wù)分析任務(wù)分析(1)生成靜態(tài)頁面頁面靜態(tài)化generateMobileStaticHtml()方法生成最新的套餐列表、套餐詳情靜態(tài)頁面。套餐的add()方法、edit()方法和delete()方法改變套餐的內(nèi)容后調(diào)用generateMobileStaticHtml()方法。(2)展示靜態(tài)頁面生成套餐列表、套餐詳情靜態(tài)頁面后,訪問用戶端的體檢預(yù)約模塊,通過靜態(tài)頁面展示套餐列表和套餐詳情。知識進(jìn)階FreeMarker是一款用Java語言編寫的模板引擎,是一種基于模板和要改變的數(shù)據(jù)生成輸出文本的通用工具。例如,生成HTML頁面、配置文件、源代碼等。它不是面向最終用戶的,而是一個(gè)Java類庫,是一款可以嵌入其他產(chǎn)品的組件。1.FreeMarker概述知識進(jìn)階Template指的是模板;Javaobjects指的是準(zhǔn)備數(shù)據(jù);Output指的是最終的文件。通過FreeMarker將數(shù)據(jù)填充到模板中,然后通過Output進(jìn)行輸出,最終生成靜態(tài)文件。1.FreeMarker概述知識進(jìn)階FreeMarker模板的開發(fā)語言是FreeMarkerTemplateLanguage(FreeMarker模板語言,下文簡稱FTL),F(xiàn)TL的基本語法由文本、插值、FTL標(biāo)簽和注釋組成,具體如下。文本:文本會按原樣輸出。插值:這部分的輸出會被計(jì)算的值替換。插值由${and}(或者#{and})分隔。FTL標(biāo)簽:FTL標(biāo)簽與HTML標(biāo)簽相似,用于給FreeMarker指示,不會在輸出內(nèi)容中顯示。注釋:其注釋與HTML的注釋也很相似,是由<#--和-->來分隔的。其注釋會被FreeMarker直接忽略,不會在輸出內(nèi)容中顯示。1.FreeMarker概述知識進(jìn)階FreeMarker指令通過FTL標(biāo)簽調(diào)用,F(xiàn)reeMarker標(biāo)簽的語法與HTML、XML標(biāo)簽的語法類似,為了對FreeMarker標(biāo)簽和HTML、XML標(biāo)簽予以區(qū)分,F(xiàn)reeMarker標(biāo)簽以#開頭。接下來講解FreeMarker中4種常用的指令。2.FreeMarker指令知識進(jìn)階assign指令用于在頁面上定義一個(gè)變量,可以定義簡單類型和對象類型。定義簡單類型<#assignlinkman="周先生">聯(lián)系人:${linkman}上述代碼中,指令都是以“<#”開始,以“>”結(jié)束的。其中,assign是指令名稱,linkman是定義的變量名,不是固定寫法,可以任意指定。通過${變量名}的方式獲取變量值。定義對象類型<#assigninfo={"mobile":,'address':'北京市昌平區(qū)'}>電話:${info.mobile}地址:${info.address}上述代碼中,定義對象info,對象中包含兩個(gè)變量mobile和address。2.FreeMarker指令(1)assign指令知識進(jìn)階include指令用于文件的嵌套。例如創(chuàng)建文件head.ftl,文件內(nèi)容如下所示。
<h1>黑馬程序員</h1>創(chuàng)建文件test.ftl,在test.ftl文件中使用include指令引入文件head.ftl。<html><#include"head.ftl"/><body>
<#assigninfo={"mobile":,'address':'北京市昌平區(qū)'}>
電話:${info.mobile}地址:${info.address}</body></html>上述代碼中,使用include指令引入文件head.ftl。head.ftl文件的內(nèi)容會在include指令出現(xiàn)的位置插入。2.FreeMarker指令(2)include指令知識進(jìn)階if指令用于判斷,與Java中的if用法類似。<#ifx==1> xis1<#elseifx==2> xis2<#elseifx=3> xis4<#else> xisone
</#if>在FreeMarker的判斷中,可以使用“=”,也可以使用“==”,二者含義相同。2.FreeMarker指令(3)if指令知識進(jìn)階list指令用于遍歷。<#listgoodsListasgoods>商品名稱:${}價(jià)格:${goods.price}<br></#list>上述代碼中,goodsList表示想要被迭代的項(xiàng),可以是集合或序列;goods表示循環(huán)變量的名稱,每次迭代時(shí),循環(huán)變量會存儲當(dāng)前項(xiàng)的值。2.FreeMarker指令(4)list指令任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的WEB-INF目錄下創(chuàng)建ftl目錄,在ftl目錄中創(chuàng)建模板文件mobile_setmeal.ftl和mobile_setmeal_detail.ftl,使用FreeMarker技術(shù)生成套餐列表靜態(tài)頁面和套餐詳情靜態(tài)頁面。(1)提供靜態(tài)頁面模板任務(wù)實(shí)現(xiàn)要想在Java程序中使用FreeMarker服務(wù),需要引入FreeMarker的依賴。在health_common子模塊的pom.xml文件中引入FreeMarker的依賴。<dependencies>
<!--靜態(tài)化頁面-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency></dependencies>(2)引入FreeMarker的依賴任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的src/main/resources目錄下創(chuàng)建屬性文件perties,指定了生成的靜態(tài)頁面的存放位置。out_put_path=D:/a-czjk/\ health_parent/health_mobile/src/main/webapp/pages在配置文件中如果文件內(nèi)容需要換行顯示,需要在換行的位置添加“\”,否則會報(bào)錯(cuò);在指定靜態(tài)頁面存放的目錄位置時(shí),目錄中不能有中文字符,否則會報(bào)錯(cuò)。(3)創(chuàng)建FreeMarker配置文件任務(wù)實(shí)現(xiàn)在health_service_provider子模塊的spring-service.xml配置文件中,添加FreeMarker相關(guān)配置對Spring與FreeMarker進(jìn)行整合。<beanid="freemarkerConfig"class=
"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><!--指定模板文件所在目錄--><propertyname="templateLoaderPath"value="/WEB-INF/ftl/"/><!--指定字符集--><propertyname="defaultEncoding"value="UTF-8"/></bean><!--加載屬性文件,后期在java代碼中會使用到屬性文件中定義的key和value--><context:property-placeholderlocation="classpath:perties"/>(4)Spring與FreeMarker整合任務(wù)實(shí)現(xiàn)由于套餐新增、編輯和刪除的執(zhí)行過程是在SetmealServiceImpl類中完成的,為了方便代碼調(diào)用,我們可以在health_service_provider子模塊的SetmealServiceImpl類中增加生成靜態(tài)頁面的代碼。@AutowiredprivateFreeMarkerConfigurerfreeMarkerConfigurer;@Value("${out_put_path}")privateStringoutPutPath;//從屬性文件中讀取要生成的html對應(yīng)的目錄//生成當(dāng)前方法所需的靜態(tài)頁面publicvoidgenerateMobileStaticHtml(){//在生成靜態(tài)頁面之前需要查詢數(shù)據(jù)List<Setmeal>list=setmealDao.findAll();//查詢套餐列表數(shù)據(jù)
generateMobileSetmealListHtml(list);//生成套餐列表靜態(tài)頁面
generateMobileSetmealDetailHtml(list);
//生成套餐詳情靜態(tài)頁面}(5)生成靜態(tài)頁面任務(wù)實(shí)現(xiàn)//生成套餐列表靜態(tài)頁面publicvoidgenerateMobileSetmealListHtml(List<Setmeal>list){Mapmap=newHashMap();map.put("setmealList",list);//為模板提供數(shù)據(jù),用于生成靜態(tài)頁面
generteHtml("mobile_setmeal.ftl","m_setmeal.html",map);}套餐列表靜態(tài)頁面模板列表數(shù)據(jù)生成的套餐列表靜態(tài)頁面名稱調(diào)用生成靜態(tài)頁面的方法(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西省南昌2024-2025學(xué)年八年級上學(xué)期期末考試英語試卷(含解析無聽力原文及音頻)
- 2024年高端裝備制造居間合同
- 2024新車購車簡單的協(xié)議書范本
- 2024收養(yǎng)孤殘兒童協(xié)議書范本參考3篇
- 中國青年政治學(xué)院《審計(jì)學(xué)原理及實(shí)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江中醫(yī)藥大學(xué)濱江學(xué)院《酒店規(guī)劃與管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 昭通衛(wèi)生職業(yè)學(xué)院《三筆字訓(xùn)練》2023-2024學(xué)年第一學(xué)期期末試卷
- 《畜禽中毒病防制》課件
- 旅游行業(yè)人力資源總結(jié)
- 2024連鎖店保密合同
- 顱腦損傷的高壓氧治療
- 公司章程模板五篇
- 汽車行走的藝術(shù)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2025屆山東省菏澤市部分重點(diǎn)學(xué)校高一上數(shù)學(xué)期末統(tǒng)考模擬試題含解析
- 2025屆云南省昆明市祿勸縣第一中學(xué)數(shù)學(xué)高二上期末復(fù)習(xí)檢測試題含解析
- 機(jī)械工程師招聘筆試題及解答
- 2023年基礎(chǔ)會計(jì)學(xué)課后習(xí)題及參考答案
- 2024年時(shí)事新聞及點(diǎn)評【六篇】
- (部編版)統(tǒng)編版小學(xué)語文教材目錄(一至六年級上冊下冊齊全)
- 2024年中國防偽行業(yè)發(fā)展概況、市場全景分析及投資策略研究報(bào)告
- 高中英語-名詞性從句教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
評論
0/150
提交評論