发现bug,想一想为什么会出现,并尝试解决
2017-11-15 本文已影响0人
睡着了去做梦
我在测试公司项目的时候,发现了个小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": "修改成功"})
这样就顺利了,添加公司名称,与修改公司名称可以用同一个校验规则了