-
springboot項(xiàng)目實(shí)戰(zhàn)筆記
查看全部 -
dataobject和model的區(qū)別:dataobject僅僅是映射數(shù)據(jù)庫(kù);model是業(yè)務(wù)模型,該模型的屬性會(huì)來自于多個(gè)數(shù)據(jù)庫(kù)
查看全部 -
課堂筆記:
3.8?用戶模型管理--getotp頁(yè)面實(shí)現(xiàn)(16:00) ????1.?完成?getotp.html?頁(yè)面樣式的編寫。 ????2.?完成?button?提交業(yè)務(wù)的編寫 ????????????先實(shí)現(xiàn)頁(yè)面交互,再實(shí)現(xiàn)頁(yè)面美化。 ????????????a.?引入?jquery.js ????????????b.?編寫?js?代碼,實(shí)現(xiàn)?button?的?click?事件,用于向后端發(fā)送獲取短信驗(yàn)證碼的請(qǐng)求。 ????????????????//?綁定?otp?的?click?事件用于向后端發(fā)送獲取短信驗(yàn)證碼的請(qǐng)求 ????????????????//?使用?ajax?方式發(fā)送異步請(qǐng)求完成業(yè)務(wù)。 ????????????????//?為?Controller?中的?@RequestMapper?添加指定的?method,consumes(將其聲明到控制層基類中) ????????????????//?注意判空處理 ????????????????//?注意?button?自定義?click?方法后,該方法內(nèi)應(yīng)該返回?false,因?yàn)槭褂?ajax?發(fā)送請(qǐng)求處理業(yè)務(wù),不需要常見的事件冒泡給?form?提交?POST?方法。 ????????????????//?注意程序中已經(jīng)進(jìn)行了統(tǒng)一異常處理,因此會(huì)盡可能返回了?success?HTTPstatus?=?200 ????????????c.?因?yàn)槭菑谋镜?html?中發(fā)送請(qǐng)求到?localhost?的?url?因此會(huì)出現(xiàn)跨域安全異常,雖然請(qǐng)求能夠到達(dá)控制層,并成功被控制層方法處理業(yè)務(wù)并返回,但是?ajax?請(qǐng)求會(huì)認(rèn)為該請(qǐng)求是不安全的,因此走不到?success?塊中,并會(huì)給瀏覽器報(bào)錯(cuò)。 ????????????????在?springboot?中處理?ajax?跨域請(qǐng)求的方式:只要讓?response?時(shí)刻返回?'Access-Control-Allow-Origin'?為所有的域,即?*?即可。 ????????????????SpringBoot?提供給我們一個(gè)簡(jiǎn)單注解方式?@CrossOrigin?實(shí)現(xiàn)所有?SpringBoot?中所有請(qǐng)求返回對(duì)象帶上一個(gè)?Access-Control-Allow-Origin?標(biāo)簽,即可實(shí)現(xiàn)跨域處理。 ????????????????@CrossOrigin?可使用在?controller?上,或方法級(jí)別上,也可以同時(shí)使用,Spring將合并兩個(gè)注釋屬性以創(chuàng)建合并的CORS配置。 ????????????????該注解可以有2個(gè)參數(shù): ???????????????????origins?:允許可訪問的域列表 ???????????????????maxAge:準(zhǔn)備響應(yīng)前的緩存持續(xù)的最大時(shí)間(以秒為單位)。 ????3.??Ajax跨域請(qǐng)求問題,設(shè)置一下屬性就可以了, ????????前端?Ajax?請(qǐng)求中添加?xhrFields:?{withCredentials:?true}, ????????后端?controller?層添加?@CrossOrigin(origins?=?"*",?allowCredentials?=?"true")?就可以訪問了
查看全部 -
課堂筆記:
3.6?用戶模型管理-otp驗(yàn)證碼獲取 ????0.?基礎(chǔ)能力建設(shè) ????????????springboot?+?MVC?+?mybatis?框架搭建,外加常態(tài)的錯(cuò)誤異常定義、正確的返回值類型定義。 ???????模型能力管理 ????????????領(lǐng)域模型管理(如?user?對(duì)象就是一個(gè)用戶領(lǐng)域的一個(gè)模型),包括完整的生命周期。用戶模型、商品模型、秒殺模型等。 ????????????????用戶信息管理: ????????????????????otp?短信獲取 ????????????????????otp?注冊(cè)用戶 ????????????????????用戶手機(jī)號(hào)登錄 ????1.?用戶獲取?otp?短信驗(yàn)證碼 ????????a.?需要按照一定的規(guī)則生產(chǎn)OTP?驗(yàn)證碼 ????????b.?將?OTP?驗(yàn)證碼通對(duì)應(yīng)用戶的手機(jī)號(hào)關(guān)聯(lián)(一般使用Redis處理,此處采用?session?模仿實(shí)現(xiàn)) ????????????使用?spring?注入方式注入一個(gè)?HttpServletRequest?對(duì)象,該對(duì)象其實(shí)是通過?spring?bean?包裝的?request?對(duì)象本質(zhì)是?proxy?模式(spring?在注入?HttpServletRequest?時(shí),發(fā)現(xiàn)如果注入的是?一個(gè)?ObjectFactory?類型的對(duì)象時(shí),就會(huì)將注入的?bean?替換成一個(gè)?JDK?動(dòng)態(tài)代理對(duì)象,代理對(duì)象在執(zhí)行?HttpServletRequest?對(duì)象里的方法時(shí),就會(huì)通過?RequestObjectFactory.getObject()?獲取一個(gè)?新的?request?對(duì)象來執(zhí)行。),即多例模式?。 ????????????Spring能實(shí)現(xiàn)在多線程環(huán)境下,將各個(gè)線程的request進(jìn)行隔離,且準(zhǔn)確無(wú)誤的進(jìn)行注入,奧秘就是ThreadLocal.?它的內(nèi)部擁有?ThreadLocal?方式的?map,去讓用戶在每個(gè)線程中處理自己對(duì)應(yīng)的?request?中的數(shù)據(jù),并且有ThreadLocal清除的機(jī)制。 ????????c.?將?OTP?驗(yàn)證碼通關(guān)短信通道發(fā)送給用戶
查看全部 -
3.5?定義通用的返回對(duì)象-異常處理02 ????1.?為?handlerException()?方法繼續(xù)添加?@ResponseBody?注解即可將返回的?object?返回給前端頁(yè)面。 ????????????該方式會(huì)將異常的所有棧信息序列化后輸出到前端頁(yè)面,因此還需要繼續(xù)處理,只將前端需要的異常信息返回給前端。 ????2.?將?ex?強(qiáng)轉(zhuǎn)為?BusinessException?,然后使用其?getErrCode、getErrMsg?方法獲取前端需要的異常信息,將其封裝為?Map?后封裝到?CommonReturnType?對(duì)象中,然后再返回給前端。 ????3.?優(yōu)化:使用?CommonReturnType?的靜態(tài)方法?create?構(gòu)造對(duì)象并返回。 ????4.?繼續(xù)完善該方法。 ????????????判斷?exception?是否為?BusinessException?類型,如果不是則為?CommonReturnType?對(duì)象賦值?errCode?為?EmBusinessError?枚舉中的?UNKNOWN_ERROR?的?code?和?msg。 ????5.?繼續(xù)優(yōu)化異常處理。 ????????????因?yàn)樵撎幚矸绞绞撬?controller?都需要的方式,因此將其抽象為?BaseController?中的方法,然后讓其他?controller?組件去繼承該?controller。 ????6.?總結(jié):a.?定義一個(gè)?CommonReturnType,?能夠用對(duì)應(yīng)的?status,?object?的方式返回所有的被?JSON?序列化對(duì)象,供前端解析使用,摒棄掉了使用?httpstatuscode?+?內(nèi)線?tomcat?自帶的?error?頁(yè)面方式去處理響應(yīng)數(shù)據(jù)以及異常。 ????????????b.?并且定義了一個(gè)?BusinessException?,統(tǒng)一管理我們自定義的錯(cuò)誤碼。 ????????????c.?然后,在?BaseController?中定義一個(gè)所有?Controller?的基類,使用其中注解了?@ExceptionHandler?的方法來處理所有被?Controller?層捕獲的異常。 ????????????????按照異常的種類由2種處理方式,一種是自定義?BusinessException,?其中有自定義的?error?的?code?和?msg,一種是未知的異常,采用統(tǒng)一處理方式。 ????????????d.?異常處理方法上還可以添加日志相關(guān)組件,方便項(xiàng)目運(yùn)行記錄與錯(cuò)誤排查。
查看全部 -
Enum 中的 int 類型的狀態(tài)碼,如果以 0 開頭,則會(huì)在 controller 組件中返回到前端時(shí),如果使用了 JSON 序列化,解析時(shí)則會(huì)省略數(shù)字前的 0,因此,不應(yīng)該使用 0 開頭。
正例:10001、10002、20001
反例:00001、00002
查看全部 -
3.2?定義通用的返回對(duì)象-返回正確信息 ????1.?通用的返回對(duì)象。方便前端解析數(shù)據(jù)。 ????????首先,定義返回對(duì)象類型?class?com.miaoshaproject.response.CommonReturnType,?包含?String?status,?Object?date?2個(gè)屬性。 ????????然后,定義?二重奏創(chuàng)建對(duì)象方法,?create(Object?result)-(該方法中如果沒給?status?參數(shù)則給出默認(rèn)值"success")?調(diào)用?create(Object?result,?String?status), ????2.?返回的數(shù)據(jù)為?Object?對(duì)象。 ????????????若?status?=?success?,則返回前端需要的?JSON?數(shù)據(jù)。 ????????????若?status?=?fail?,?則返回通用的錯(cuò)誤碼格式。 ????3.?修改?controller?層中的方法,將返回值修改為?CommonReturnType?類型的對(duì)象。 ????4.?查看運(yùn)行效果。
查看全部 -
3.1?使用SpringMVC方式開發(fā)用戶信息 ????1.?搭建?MVC?層次組件 ????????創(chuàng)建?controller?層目錄,并編寫?UserController,包含一個(gè)?getUser(Integer?id)?方法,注意添加注解。 ????????創(chuàng)建?service?層目錄,并編寫?UserService?接口以及?UserSServiceImpl?實(shí)現(xiàn)類,包含?getUserById(Integer?id)?方法,其中使用了?UserDOMapper. ????2.?除了?UserDO?表示與數(shù)據(jù)庫(kù)對(duì)應(yīng)的數(shù)據(jù)對(duì)象類外,?service?層業(yè)務(wù)領(lǐng)域也應(yīng)該有與?DO?對(duì)象不同的對(duì)象?model,?即業(yè)務(wù)領(lǐng)域?qū)ο?,用來封裝?DO?對(duì)象,避免直接將?DO?對(duì)象返回給前端。 ????????創(chuàng)建?service?層領(lǐng)域模型對(duì)象:?com.miaoshaproject.service.model.UserModer,?其中封裝從?DO?到?model?封裝方法。 ????????為?userPasswordDOMapper?添加?selectByUserId(Integer?id)?方法,實(shí)現(xiàn)通過用戶?id?查找對(duì)應(yīng)的用戶加密密碼信息。 ????3.?編寫?userController?中的?getUser()?方法,返回領(lǐng)域模型?userModel,?測(cè)試是否可以通過前端成功訪問。 ????4.?創(chuàng)建一個(gè)前端模型對(duì)象?UserVO,?用來封裝可以返回給前端的對(duì)象數(shù)據(jù)信息,不包含前端非必要屬性字段。其中包含?convertFromModel(model)?方法,用來將核心領(lǐng)域模型?model?對(duì)象封裝成可供前端使用的?VO?對(duì)象。 ????5.?需要注意的是?DO、VO、Model?對(duì)象中的屬性類型必須一致,字段名同樣要一致,才可以使用?BeanUtils.copyProperties(srcObj,?tarObj)?方法,否則會(huì)丟失不一致屬性中的數(shù)據(jù)。
查看全部 -
2.4?Mybatis自動(dòng)生成器的使用方式 ????1.?mybatis-core版本要和mybatis-maven-plugin版本要一致 ????2.?mybatis-generator.xml?中的配置 ????3.?配置?maven?Command?line?:?mybatis-generator:generate?-e?-X ????????注意?:?generate?前是?: ????4.?生成后,需要給?mapper?接口添加注解 ????5.?application.properties?中添加數(shù)據(jù)源配置 ???????? ????????#?接入?mybatis?對(duì)應(yīng)的數(shù)據(jù)源 ????????spring.datasource.name=miaosha ????????spring.datasource.url=jdbc:mysql://127.0.0.1:3306/miaosha?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false ????????spring.datasource.username=root ????????spring.datasource.password=1234 ???????? ????????#?使用?druid?數(shù)據(jù)源 ????????spring.datasource.type=com.alibaba.druid.pool.DruidDataSource ????????spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
查看全部
舉報(bào)