发现bug,想一想为什么会出现,并尝试解决

我在测试公司项目的时候,发现了个小bug,觉得有趣,写点文字记录下来

如图中描述,我本是想修改公司名称,没有做任何更改,直接点击保存,提示“当前公司已注册”

image.png

首先这是个问题,就是优先级比较低,为什么不让我直接保存成功呢?

业务中要求:公司名称必须唯一
我想开发是基于这点做了校验,但是他忽略了用户的此操作

添加公司,修改公司,开发肯定是用了同一个规则验证,那就是先判断这个公司名称是否存在,我来假设一下代码

校验部分

class CompanyVerify(object):
   def company(self, company_str):
       """公司名称唯一性验证"""
       if len(company_str) == 0:
           raise ValueError("公司名称不能为空")
        if CompanyModel.name_exist(company_str):
               raise ValueError("{} 已注册".format(company_str))
       return company_str

   def id_exist(self,id_int):
       """ID 验证"""
       if id_int.isdigit():
           if CompanyModel.id_exist(id_int):
               return int(id_int)
           else:
               raise ValueError("{} is not exist".format(id_int))
       else:
           raise ValueError("type error must but int")

model部分


    def name_exist(company_str):
        """验证公司是否存在"""
            return CompanyModel.query.filter_by(name=company_str).first()

    def id_exist(id):
        """验证ID是否存在"""
        return CompanyModel.query.filter_by(id=id).first()

修改公司名称部分

    
    @admin_login_req
    def put(self):
        verify=CompanyVerify()
        parse = reqparse.RequestParser()
        parse.add_argument('id', type=verify.id_exist, required=True, location=['json'])
        parse.add_argument('name', type=verify.company, required=True, location=['json'])
        args = parse.parse_args()
        companyinfo=CompanyModel.query.filter_by(id=args.id).first()
        if companyinfo.user_id!=session.get("userid"):
            return jsonify({"code": 1, "msg": "无权限修改"})
        companyinfo.name=args.name
        db.session.add(companyinfo)
        db.session.commit()
        return jsonify({"code": 0, "msg": "修改成功"})

以上代码,基本上是没什么问题,但是当用户提交未做任何更改值的内容就会出现当前公司已注册的情况

解决以上问题可以有两个办法:

1 . 前端解决,发现值没有修改即使点保存,也不发网络请求,直接提示修改成功
2 . 后端解决,在做公司是否存在验证的时候,需要过滤本身

我的思路是后端解决

校验部分(修改后)

class CompanyVerify(object):
    companyid=None
    def company(self, company_str):
         """公司名称唯一性验证"""
        if len(company_str) == 0:
            raise ValueError("公司名称不能为空")
        if self.companyid is None:
            if CompanyModel.name_exist(company_str):
                raise ValueError("{} 已注册".format(company_str))
        else:
            if CompanyModel.name_exist(company_str, companyid=self.companyid):
                raise ValueError("{} 已注册".format(company_str))
        return card_str

    
    def id_exist(self,id_int):
        """ID 验证"""
        if id_int.isdigit():
            if CompanyModel.id_exist(id_int):
                return int(id_int)
            else:
                raise ValueError("{} is not exist".format(id_int))
        else:
            raise ValueError("type error must but int")

model部分(修改后)

def name_exist(company_str,companyid=None):
         """验证公司是否存在"""
    if companyid is None:
        return CompanyModel.query.filter_by(name=company_str).first()
    else:
        return CompanyModel.query.filter(CompanyModel.id!=companyid,CompanyModel.name==company_str).first()

def id_exist(id):
        """验证ID是否存在"""
        return CompanyModel.query.filter_by(id=id).first()

修改公司名称部分(修改后)

    @admin_login_req
    def put(self):
        verify=CompanyVerify()
        parse = reqparse.RequestParser()
        parse.add_argument('id', type=verify.id_exist, required=True, location=['json'])
        #增加传递companyid
        verify.companyid=parse.parse_args().id
        parse.add_argument('name', type=verify.company, required=True, location=['json'])
        args = parse.parse_args()
        companyinfo=CompanyModel.query.filter_by(id=args.id).first()
        if companyinfo.user_id!=session.get("userid"):
            return jsonify({"code": 1, "msg": "无权限修改"})
        companyinfo.name=args.name
        db.session.add(companyinfo)
        db.session.commit()
        return jsonify({"code": 0, "msg": "修改成功"})

这样就顺利了,添加公司名称,与修改公司名称可以用同一个校验规则了

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,183评论 19赞 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,481评论 25赞 708
  • 卢梭说:“人人生而自由,但又在无所不在的枷锁之中。”米兰昆德拉则提醒我们,生命中不能承受的不是“重”而是“...
    Arielth阅读 497评论 0赞 0
  • 我曾干过的兼职都是零零散散的,基本都是以发传单为主,根本不存在所谓的勾心斗角,直到高考结束的假期,在奶茶店工作,我...
    _宋坚果_阅读 670评论 0赞 1

友情链接更多精彩内容