springboot項(xiàng)目整合注冊(cè)功能模塊開發(fā)實(shí)戰(zhàn)_第1頁
springboot項(xiàng)目整合注冊(cè)功能模塊開發(fā)實(shí)戰(zhàn)_第2頁
springboot項(xiàng)目整合注冊(cè)功能模塊開發(fā)實(shí)戰(zhàn)_第3頁
springboot項(xiàng)目整合注冊(cè)功能模塊開發(fā)實(shí)戰(zhàn)_第4頁
springboot項(xiàng)目整合注冊(cè)功能模塊開發(fā)實(shí)戰(zhàn)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論