我的第一个项目(五):(前后端)注册用户名查重

第一个,项目,前后,注册,用户名 · 浏览次数 : 203

小编点评

**问题** 1. 注册无法检测到用户名重复 2. 完成注册用户名查重大概率是后端出了问题 **解决方案** **1. 注册无法检测到用户名重复** - 修改`SysUserServiceImpl.java`中`selectByLoginName`方法的代码,添加判断用户名是否与数据库中已注册的用户名相同的功能。 ```java @Override public SysUserEntity selectByLoginName(String loginName) { // ... // 添加判断用户名是否与数据库中已注册的用户名相同 if (usernameDb.exists()) { return null; } // 继续查询数据库 return sysUserMapper.selectById(id); } ``` **2. 完成注册用户名查重大概率是后端出了问题** - 在`SysUserServiceImpl.java`中,修改`register`方法的代码,将用户名和密码进行md5加密并与数据库中已注册的用户名进行比较。 ```java @Override public SysUserSaveResp register(SysUserSaveReq req) { // ... // 对密码进行md5加密 req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes())); // 比较用户名和密码是否与数据库中已注册的用户名相同 if (userService.existsByUsername(req.getLoginName())) { return null; } // 继续注册用户 return saveResp; } ``` **3. 数据库表login_name必须是唯一值** - 在`Gitee仓库中获取代码`login-entity.git`中,修改`login_name`字段的属性注释,使其设置为`unique=true`。 ```java @Column(name = "login_name", unique = true) private String loginName; ```

正文

好家伙,

 

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

与我的第一个项目(五):(前后端)注册用户名查重相似的内容:

我的第一个项目(五):(前后端)注册用户名查重

好家伙, bug终究还是来了,而且是很离谱的bug 来吧,发现问题,再解决问题 1.注册无法检测到用户名重复 也就是说一个用户名可无限注册, 来看bug(。。。) (看来是后端验证逻辑出了问题) 要是这么上线估计直接寄了 2.完成注册用户名查重 大概率是后端出了问题 这里我们先去看看后端,从后端去改

我的第一个项目(六):(前后端)密码校验

好家伙, xdm,密码验证忘写了,哈哈 bug展示: 1.登陆没有密码验证 主要体现为,乱输也能登进去 (小问题) 要是这么上线估计直接寄了 分析一波密码校验怎么做: 前端输完用户名密码之后,将数据发送到后端处理 后端要做以下几件事 ①先确认这个用户名已注册 ②我们拿着这个用户名去数据库中找对应的数

我的第一个项目(三):注册登陆功能(后端)

好家伙,前端出了点bug 我们来搞定后端先: 后端我们用的框架是Spring boot 数据库:MySQl 代码已开源,连接在最后 新建项目: 只点Java Web 项目目录如下: 1.首先,我们在pom.xml文件中导入第三方包: web服务,mysql连接驱动等一系列包 pom.xml文件: <

python独立脚本应用Django项目的环境

一、需求说明 一直用 Django 在开发一个网站项目,其中的注册用户和登录,都是使用Django自带的认证系统。主要是对密码的加密,在注册或者登录的时候,前端传递过来的密码,我会使用Django的set_password()方法再加密一次 经过加密后的数据库中的数据样子如下: 现在我有另外一个需求

我的第一个项目(四):(前端)发送请求以及表单校验

好家伙,本篇将继续完善前端界面 效果展示: 1.注册登陆 (后端已启动) 2.注册表单验证 (前端实现的表单验证) 在此之前: 我的第一个项目(二):使用Vue做一个登录注册界面 - 养肥胖虎 - 博客园 (cnblogs.com) 后端部分: 我的第一个项目(三):注册登陆功能(后端) - 养肥胖

我的第一个项目(十五) :完成数据保存功能(后端,改update)

好家伙, 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee.com) 后端这

我的第一个项目(十四) :完成数据保存功能(前端,增查改接口)

好家伙,天天拖,终于写完了 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee

我的第一个项目(十二) :分数和生命值的更新(后端增删查改的"改")

好家伙,写后端,这多是一件美逝. 关于这个项目的代码前面的博客有写 我的第一个独立项目 - 随笔分类 - 养肥胖虎 - 博客园 (cnblogs.com) 现在,我们登陆进去了,我开始和敌人战斗,诶,打到一百分了,我现在要把这个分数保存起来 1.前端先把测试样例写好 随便写一个测试样例

SpringSecurity-前后端分离教程

1、简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSec

NetCore 开源项目

前言:工作几年了,面试的时候问一堆,实则都是增删改查。感觉做net搞上位机的比较多,然而我一直做的都是web方向。以前还会背八股文,现在工作之后只会增删改,CV了。不知道后面会不会转行,唉~ 这个既是教程也是学习,我想尝试自己去做一个开源的前后端项目,看看我现在到底能做个什么样。 这篇文章,算是个开