




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第springboot項(xiàng)目整合注冊(cè)功能模塊開發(fā)實(shí)戰(zhàn)目錄工程簡(jiǎn)介準(zhǔn)備工作:第一步:注冊(cè)功能的實(shí)現(xiàn)1.1持久層的設(shè)計(jì)1.2注冊(cè)功能-業(yè)務(wù)層1.3控制層1.4前端頁面的設(shè)計(jì)注冊(cè)功能實(shí)現(xiàn)完成
工程簡(jiǎn)介
準(zhǔn)備工作:
項(xiàng)目所用到的html界面以及sql文件鏈接如下:
百度網(wǎng)盤獲取地址:
鏈接:/s/1CcbQWP8RNqyy3ieib1osLgpwd=t1qu提取碼:t1qu
第一步:注冊(cè)功能的實(shí)現(xiàn)
1.1持久層的設(shè)計(jì)
1.1.1規(guī)范需要執(zhí)行的SQL語句
1.用戶的注冊(cè)工作,相當(dāng)于在做數(shù)據(jù)的插入操作
insertintot_user(username,password)values(,)
2.在用戶的注冊(cè)是首先需要查詢當(dāng)前的用戶名是否存在,如果存在則不能進(jìn)行注冊(cè),相當(dāng)于一個(gè)查詢語句
select*fromt_userwhereusername=
1.1.2設(shè)計(jì)接口和抽象方法
定義mapper接口,在項(xiàng)目的目錄結(jié)構(gòu)下首先創(chuàng)建一個(gè)mapper包,在這個(gè)包下根據(jù)不同的功能模塊來創(chuàng)建mapper接口
1.創(chuàng)建一個(gè)userMapper需要考慮上述的兩個(gè)注意點(diǎn)
packagecom.cy.store.mapper;
importcom.cy.store.pojo.User;
*用戶模塊的持久化層接口
publicinterfaceUserMapper{
*插入用戶的數(shù)據(jù)-用來實(shí)現(xiàn)注冊(cè)功能
*@paramuser
*@return受到影響的行數(shù)(增刪改查)
Integerinsert(Useruser);
*根據(jù)用戶名查詢用戶的數(shù)據(jù)
*@paramusername
*@return如果找到了則返回相對(duì)應(yīng)的用戶信息,找不到返回null
UserfindByUsername(Stringusername);
}
1.1.3編寫映射
1.定義xml映射文件,與對(duì)應(yīng)的接口進(jìn)行關(guān)聯(lián).所有餓映射文件需要放置在resource目錄下,一般為了方便管理,一般在這個(gè)目錄下創(chuàng)建一個(gè)mapper文件夾,然后在找這個(gè)文件夾存放相應(yīng)的mapper文件
2.創(chuàng)建接口的對(duì)應(yīng)的映射文件,規(guī)則:和接口的名稱保持一致即可,創(chuàng)建一個(gè)UserMapper.xml
1.1.4單元測(cè)試
1.每個(gè)獨(dú)立的層編寫完畢需要編寫單元測(cè)試方法,來測(cè)試當(dāng)前的功能,在test包下創(chuàng)建一個(gè)mapper包
包:test-com.cy.store.mapper.UserMapperTest
packagecom.cy.store.mapper;
importcom.cy.store.pojo.User;
importlombok.extern.slf4j.Slf4j;
importorg.junit.jupiter.api.Test;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
*@PROJECT_NAME:store
*@DESCRIPTION:
*@USER:28416
*@DATE:2025/11/216:43
@Slf4j
@SpringBootTest
publicclassUserMapperTest{
*在mapper方法上加上這個(gè)注解:@Repository
@Autowired
privateUserMapperuserMapper;
*@Dat2025年11月2日17:25:41
*測(cè)試成功
@Test
publicvoidinsert(){
Useruser=newUser();
user.setUsername("tom");
user.setPassword("123456");
Integerinsert=userMapper.insert(user);
("插入返回的值:{}",insert);
*@Date2025年11月2日17:27:25
*@return查詢的結(jié)果為:User(uid=1,username=tom,password=123456,salt=null,phone=null,email=null,gender=null,avatar=null,isDelete=null)
*測(cè)試成功
@Test
publicvoidtestFindByUsername(){
Usertom=userMapper.findByUsername("tom");
("查詢的結(jié)果為:{}",tom);
1.2注冊(cè)功能-業(yè)務(wù)層
1.2.1規(guī)劃異常
1.runtimeException異常,作為這個(gè)異常的子類,然后在定義具體的異常類型來繼承這個(gè)異常,業(yè)務(wù)層異常的基類
serviceException異常,這個(gè)異常繼承RuntimeException異常,以此建立異常的機(jī)制。
2.用戶在進(jìn)行注冊(cè)時(shí)候可能會(huì)產(chǎn)生用戶名被占用的錯(cuò)誤,拋出一個(gè)異常UsernameDuplicatedException
3.正在執(zhí)行數(shù)據(jù)插入操作的時(shí)候,服務(wù)器、數(shù)據(jù)庫宕機(jī)。處于正在執(zhí)行插入的過程中,所產(chǎn)生的異常InsertException
1.2.2設(shè)計(jì)接口和抽象方法
1.在service包下創(chuàng)建一個(gè)IUserService
2.設(shè)計(jì)一個(gè)實(shí)現(xiàn)類的包
3.實(shí)現(xiàn)類中重寫注冊(cè)方法實(shí)現(xiàn)完全的用戶注冊(cè)邏輯
@Override
publicvoidreg(Useruser){
//調(diào)用findByUsernam方法判斷用戶名是否被注冊(cè)過
Stringusername=user.getUsername();
UserbyUsername=userMapper.findByUsername(username);
if(byUsername!=null){
thrownewUsernameDuplicatedException("用戶名被占用");
Integerinsert=userMapper.insert(user);
if(insert!=1){
thrownewInsertException("在用戶注冊(cè)中產(chǎn)生了位置的異常");
}
1.2.3在單元測(cè)試中創(chuàng)建UserServiceTest類進(jìn)行相應(yīng)的注冊(cè)邏輯進(jìn)行測(cè)試
packagecom.cy.store.service;
importcom.cy.store.pojo.User;
importcom.cy.store.service.ex.ServiceException;
importorg.junit.jupiter.api.Test;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
*@PROJECT_NAME:store
*@DESCRIPTION:
*@USER:28416
*@DATE:2025/11/218:15
@SpringBootTest
publicclassUserServiceTest{
@Autowired
privateIUserServiceuserService;
*@Date2025年11月2日19:25:39
*@returnUsernameDuplicatedException
*@return測(cè)試用戶注冊(cè)的功能成功返回1or返回自定義的exception
**/
@Test
publicvoidreg(){
try{
Useruser=newUser();
user.setUsername("Lux");
user.setPassword("123456");
userService.reg(user);
System.out.println("ok");
}catch(ServiceExceptione){
//獲取異常的類名
System.out.println(e.getClass().getSimpleName());
//打印錯(cuò)誤信息
System.out.println(e.getMessage());
1.3控制層
1.3.1創(chuàng)建響應(yīng)
1.狀態(tài)碼、狀態(tài)描述信息、數(shù)據(jù),這部分功能封裝在一個(gè)類中,將這類方法作為方法返回值,返回給前端瀏覽器com.cy.store.StoreApplication
1.3.2.設(shè)計(jì)請(qǐng)求
依據(jù)當(dāng)前的業(yè)務(wù)功能模塊進(jìn)行請(qǐng)求的設(shè)計(jì)
請(qǐng)求的路徑:/user/reg
請(qǐng)求參數(shù):Useruser
請(qǐng)求類型:Post
響應(yīng)結(jié)果:JsonResultvoid
1.3.3處理請(qǐng)求
1.創(chuàng)建一個(gè)控制層的對(duì)應(yīng)的類UserControllercom.cy.store.controller.UserController
try{
userService.reg(user);
voidJsonResult.setState(200);
voidJsonResult.setMessage("用戶注冊(cè)成功");
}catch(UsernameDuplicatedExceptione){
voidJsonResult.setState(4000);
voidJsonResult.setMessage("用戶名被占用");
catch(InsertExceptione){
voidJsonResult.setState(5000);
voidJsonResult.setMessage("注冊(cè)時(shí)發(fā)生未知的異常");
}
業(yè)務(wù)邏輯過于復(fù)雜進(jìn)行簡(jiǎn)化
1.3.4控制層優(yōu)化設(shè)計(jì)
在控制層抽離一個(gè)父類,在這個(gè)父類中統(tǒng)一的處理關(guān)于異常的相關(guān)操作,編寫一個(gè)BaseController類,在這個(gè)類中,統(tǒng)一的處理異常
packagecom.cy.store.controller;
importcom.cy.store.service.ex.InsertException;
importcom.cy.store.service.ex.ServiceException;
importcom.cy.store.service.ex.UsernameDuplicatedException;
importcom.cy.store.util.JsonResult;
importorg.springframework.web.bind.annotation.ExceptionHandler;
*@PROJECT_NAME:store
*@DESCRIPTION:
*@USER:28416
*@DATE:2025/11/220:34
*用來表示控制層類的基類
publicclassBaseController{
publicstaticfinalintOK=200;//表示操作成功的狀態(tài)碼
//請(qǐng)求處理方法,這個(gè)方法的返回值就是需要傳遞給前端的數(shù)據(jù)
//當(dāng)項(xiàng)目中產(chǎn)生異常時(shí),會(huì)被攔截到此方法這個(gè)方法此時(shí)充當(dāng)?shù)木褪钦?qǐng)求處理方法方法的返回值直接給到前端
@ExceptionHandler(ServiceException.class)//主要用于統(tǒng)一處理拋出的異常
publicJsonResultVoidhandleException(Throwablee){
JsonResultVoidresult=newJsonResult(e);
if(einstanceofUsernameDuplicatedException){
result.setState(4000);
result.setMessage("用戶名已經(jīng)被占用");
}elseif(einstanceofInsertException){
result.setState(5000);
result.setMessage("注冊(cè)時(shí)發(fā)生未知的異常");
returnresult;
}
修改后的controller-userController的代碼如下;
@RestController
@RequestMapping("users")
publicclassUserControllerextendsBaseController{
@Autowired
privateIUserServiceuserService;
*原先的代碼
*@RequestMapping("reg")
publicJsonResultVoidreg(Useruser){
//創(chuàng)建結(jié)果響應(yīng)對(duì)象
JsonResultVoidvoidJsonResult=newJsonResult();
try{
userService.reg(user);
voidJsonResult.setState(200);
voidJsonResult.setMessage("用戶注冊(cè)成功");
}catch(UsernameDuplicatedExceptione){
voidJsonResult.setState(4000);
voidJsonResult.setMessage("用戶名被占用");
catch(InsertExceptione){
voidJsonResult.setState(5000);
voidJsonResult.setMessage("注冊(cè)時(shí)發(fā)生未知的異常");
returnvoidJsonResult;
}**/
*優(yōu)化以后的代碼
*@paramuser
*@return
@RequestMapping("reg")
publicJsonResultVoidreg(Useruser){
userService.reg(user);
returnnewJsonResult(OK);
}
妙不可言?。。。。。。。。?!
1.4前端頁面的設(shè)計(jì)
1.在register頁面中編寫發(fā)送請(qǐng)求的方法,后端接收方法為reg,當(dāng)檢測(cè)中點(diǎn)擊事件后觸發(fā)請(qǐng)求--》點(diǎn)擊事件
選擇對(duì)應(yīng)的按鍵(%(選擇器)),再去添加點(diǎn)擊的事件,$.ajax()函數(shù)發(fā)送異步請(qǐng)求額
2.JQuery封裝了一個(gè)函數(shù),稱為$.ajax()函數(shù),通過對(duì)象調(diào)用ajax函數(shù),可以異步的加載一個(gè)請(qǐng)求,依靠的是JAVAScript提供的一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 西方媒體在政治中的作用試題及答案
- 小組學(xué)習(xí)軟件設(shè)計(jì)師考試試題及答案
- 公共政策與社區(qū)參與的互動(dòng)研究試題及答案
- 深入學(xué)習(xí)的軟件設(shè)計(jì)師考試試題及答案
- 網(wǎng)絡(luò)設(shè)備的選用與配置技巧與試題及答案
- 移動(dòng)網(wǎng)絡(luò)技術(shù)試題及答案
- 公共政策評(píng)估中的數(shù)據(jù)分析挑戰(zhàn)考點(diǎn)及答案
- 環(huán)境政策的評(píng)價(jià)與公眾反饋機(jī)制試題及答案
- 網(wǎng)絡(luò)工程師考試復(fù)習(xí)資料試題及答案
- 機(jī)電工程政策法規(guī)試題及答案
- 五輸穴的臨床運(yùn)用
- 基于增強(qiáng)現(xiàn)實(shí)(AR)體驗(yàn)式學(xué)習(xí)模式在小學(xué)英語情景教學(xué)中的應(yīng)用
- 幼兒園游戲PPT中職學(xué)前教育專業(yè)完整全套教學(xué)課件
- 市場(chǎng)調(diào)查與分析考試試題
- 數(shù)據(jù)結(jié)構(gòu)期末試題與答案
- 1噸串聯(lián)中頻爐原理技術(shù)與分析
- GB/T 5563-2013橡膠和塑料軟管及軟管組合件靜液壓試驗(yàn)方法
- 產(chǎn)品質(zhì)量法-產(chǎn)品質(zhì)量法課件
- 變更工程量清單匯總表
- 門護(hù)板設(shè)計(jì)指導(dǎo)書RYSAT012課件
- 實(shí)習(xí)安全教育(39張)課件
評(píng)論
0/150
提交評(píng)論