financial—resource—user—user_resource
定义资源类,用户注册接口的实现
业务逻辑:
张三(我)——》邀请李四注册账户——》李四进行注册操作(输入用户名、密码、手机号、验证码、邀请码(非必填)),如果李四填写我的邀请码,邀请码在我的数据库user表的inviteId字段存储,需要去校验邀请码是否一致(张三数据库中的验证码==李四表单输入的验证码,通过校验)。注册成功后,张三的用户代金券加50,邀请用户+1;李四user表中增加了一条数据,并且创建了账户信息。
代码逻辑
class RegisterUser(Resource):
def post(self):
rq=reqparse.RequestParser()
rq.add_argument('phone',required=True)
rq.add_argument('username',required=True)
rq.add_argument('password',required=True)
rq.add_argument('code',required=True)
rq.add_argument('invite_code',required=False)
req=rq.parse_args()
self.phone=req.phone
self.username=req.username
self.password=req.password
self.code=req.code
self.invite_code=req.invite_code
user=User.query.filter(User.phone==self.phone).first()
if user:
current_app.logger.info('手机号已经存在')
return {'message':'手机号已经存在'}
user=User.query.filter(User.username==self.username).first()
if user:
current_app.logger.info('用户名已经存在')
return {'message': '用户名已经存在'}
real_code=fr.get('registerCode:{}'.format(self.phone))
if not real_code or real_code.decode()!=self.code:
current_app.logger.info('验证码错误')
return {'message':'验证码错误'}
user=User(username=self.username,pwd=self.password,phone=self.phone)
#验证邀请码
if self.invite_code:
self.check_invite(user,invite_code)
try:
#需要用到数据库事务处理
db.session.add(user)
db.session.flush() #todo 把数据插入的数据库的缓冲区(目的得到自增的id),并不是插入到数据库中
#todo 创建账户对象,账户id和用户id是一一对应的
account=Account(userId=user.id)
db.session.add(account)
db.session.commit()
return {'msg':'success'}
except Exception as e:
current_app.logger.info(e)
db.session.rollback() #回滚操作
return {'message': '用户注册时,插入数据库失败', 'code': 201}
def check_invite(self,user,invite_code):
code=invite_code.strip()
invite_user=User.query.filter(User.inviteId==code).first() #用户输入的邀请码和邀请用户数据库中的邀请码比对
if invite_user:
user.invite_user_id=invite_user.id #todo 2个用户关联下 invite_user.id:邀请用户的id(例:张三邀请李四,张三的id)
invite_user.sumFriends+=1 #todo 张三的数据库中邀请用户+1
invite_user.accountInfo.discount+=INVITE_MONEY #todo 邀请用户(张三)的账户增加50元的代金券
加载资源类
from financial.resource.user.user_resource import *
user_api.add_resource(RegisterUser,'/user_register',endpoint='user_register')
测试