草庐IT

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

养肥胖虎 2023-04-18 原文

好家伙,

 

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

有关我的第一个项目(五):(前后端)注册用户名查重的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  8. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  9. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  10. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

随机推荐