好家伙,
bug終究還是來了,而且是很離譜的bug
來吧,發現問題,再解決問題
1.注冊無法檢測到用戶名重復
也就是說一個用戶名可無限注冊,
來看bug(,,,)

(看來是后端驗證邏輯出了問題)
要是這么上線估計直接寄了
2.完成注冊用戶名查重
大概率是后端出了問題
這里我們先去看看后端,從后端去改寫
SysUserController.java檔案:
來看看主要的注冊方法
@PostMapping("register")
// zxcv1234
//@RequestBody主要用來接收前端傳遞給后端的json字串中的資料的(請求體中的資料的);
public CommonResp register(@RequestBody SysUserSaveReq req){
//對密碼進行md5加密
req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));
//resp為回傳資料
CommonResp resp = new CommonResp<>();
//真正的注冊
SysUserSaveResp saveResp = sysUserService.register(req);
return resp;
SysUserServiceImpl.java中重寫register方法:
@Override
public void register(SysUserSaveReq req) {
//
SysUserEntity user = CopyUtil.copy(req, SysUserEntity.class);
//ObjectUtils.isEmpty判斷物件是否為空
if(ObjectUtils.isEmpty(req.getId())){
//查看該用戶是否已注冊
SysUserEntity userDb = selectByLoginName(req.getLoginName());
//用戶未被注冊
if(ObjectUtils.isEmpty(userDb)){
//用演算法給幫它設定一個新ID
user.setId(snowFlake.nextId());
//這步是真正的往資料庫里插資料了
sysUserMapper.insert(user);
}
}
}
//查詢loginName是否被注冊
public SysUserEntity selectByLoginName(String loginName){
//QueryWrapper<>()
QueryWrapper<SysUserEntity> wrapper = new QueryWrapper<>();
//這句可真是太高級了
//wrapper.lambda().eq()單表查詢,在"SysUserEntity::getLoginName"找一個指定的"loginName"
//此處原公式為
wrapper.lambda().eq(SysUserEntity::getLoginName,loginName);
//BaseMapper的selectList()方法,根據id批量查詢
List<SysUserEntity> userEntityList = sysUserMapper.selectList(wrapper);
// List<SysUserEntity> userEntityList = sysUserMapper.selectList(wrapper.lambda().eq(SysUserEntity::getLoginName,loginName));
//CollectionUtils.isEmpty()判斷集合是否為空
if(CollectionUtils.isEmpty(userEntityList)){
//若判斷為空,則回傳null,意思是沒被注冊過
return null;
}else {
return userEntityList.get(0);
}
}
隨后我們就發現問題了,
能看出來,
這里的業務邏輯只處理了"用戶名未被注冊"的情況,
而沒有處理"用戶名已注冊"的情況
所以我們加上就好了
SysUserServiceImpl.java中重寫register方法:
//不知道回傳什么,隨便造個物件回傳
private SysUserSaveResp useless;
@Override
public SysUserSaveResp register(SysUserSaveReq req) {
//
SysUserEntity user = CopyUtil.copy(req, SysUserEntity.class);
//ObjectUtils.isEmpty判斷物件是否為空
if(ObjectUtils.isEmpty(req.getId())){
//查看用戶名是否已注冊
SysUserEntity userDb = selectByLoginName(req.getLoginName());
//用戶名未被注冊
if(ObjectUtils.isEmpty(userDb)){
//用演算法給幫它設定一個新id
user.setId(snowFlake.nextId());
//這步是真正的往資料庫里插資料了
sysUserMapper.insert(user);
//哈哈,沒東西回傳了
}else{
//用戶名已被注冊,回傳null
return null;
}
}
return this.useless;
}
在SysUserController.java檔案中:
增加一個"注冊失敗"判定:
@PostMapping("register")
// zxcv1234
//@RequestBody主要用來接收前端傳遞給后端的json字串中的資料的(請求體中的資料的);
public CommonResp register(@RequestBody SysUserSaveReq req){
//對密碼進行md5加密
req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));
//resp為回傳資料
CommonResp resp = new CommonResp<>();
//真正的注冊
SysUserSaveResp saveResp = sysUserService.register(req);
if(saveResp ==null){
resp.setSuccess(false);
}
return resp;
}
來到我們的前端,注冊檢驗部分的代碼:
同樣,我們增加對"注冊失敗"的判定
//檢驗注冊是否成功
if (data.success) {
//清空表單資料
this.ruleForm = {};
//發送成功通知
this.$message({
message: '恭喜你,注冊成功,點擊去登陸按鈕進行登陸吧!!!',
type: 'success'
});
this.$router.push({ path: '/login' })
}
//注冊失敗
if (!data.success) {
this.$message({
message: '注冊失敗,該用戶名已被注冊',
type: 'error'
});
}
然后就,搞定了

3.資料庫表
login_name必須是唯一值,要把unique點上

4.gitee倉庫拿原始碼
(已更新,解決了注冊用戶名重復的問題)
https://gitee.com/tang-and-han-dynasties/login-entity.git
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/539030.html
標籤:其他
上一篇:【Java并發入門】03 互斥鎖(上):解決原子性問題
下一篇:每日演算法之樹的子結構
