def get(self): # 获取当前用户iiuv m = MysqlSearch().get_one(f"SELECT iiuv FROM {MEMBERS_TABLE} WHERE ID='{g.user_id}'") # 获取风险域名 y = MysqlSearch().get_one(f"SELECT domains FROM {ET_GLOBAL_CONFIG}") if y['domains'] is not None: ym = y['domains'].split(',')[0] # 拼接url返回 res = ym + "/" + m['iiuv'] # 查询当前用户余额/点击更换链接的费用/乐观锁解决修改用户余额 version_time = time.time() m = MysqlSearch().get_one(f"SELECT balance,balance_version FROM {MEMBERS_TABLE} WHERE id='{g.user_id}'") if m['balance'] < 10: return {'error': '无法切换,切换费用不足'}, HttpStatus.OK.value try: u = MysqlWrite().write( f"UPDATE {MEMBERS_TABLE} SET balance=balance - 10,balance_version='{version_time}' WHERE balance_version='{m['balance_version']}' and id='{g.user_id}'") except Exception: return {'error': '请稍后重试'}, HttpStatus.OK.value if u == 1: # 更新出账表信息 MysqlWrite().write(f"INSERT INTO {ET_MEMBER_EARNINGS} (out_amounts,member_id) VALUE ('{10}','{g.user_id}')") rc = current_app.redis_cli rc.delete('user_center:{}'.format(g.user_id)) # 生成用户个人中心缓存信息 UserCentreCache().get() return {'data': res}, HttpStatus.OK.value else: return {'error': '请稍后尝试'}, HttpStatus.OK.value
def get(self): # 查询当前用户是否已领取开屏红包 w = MysqlSearch().get_one( f"SELECT task_id FROM {ET_MEMBER_EARNINGS} WHERE task_id=1 and member_id={g.user_id}" ) if w: return {'error_code': 4003, "msg": "当前用户已领取开屏红包"}, 200 # 乐观锁解决修改用户余额 l = MysqlSearch().get_one( f"SELECT balance,balance_version,mobile FROM {MEMBERS_TABLE} WHERE id='{g.user_id}'" ) version_time = time.time() try: u = MysqlWrite().write( f"UPDATE {MEMBERS_TABLE} SET balance=balance+100,balance_version='{version_time}' WHERE balance_version='{l['balance_version']}' and id='{g.user_id}'" ) except Exception: return {'error': '请稍后重试'}, HttpStatus.OK.value # 删除个人中心和用户信息缓存 rc = current_app.redis_cli rc.delete(f"user_info_:{l['mobile']}") rc.delete(f"user_center:{g.user_id}") rc.delete(f"user_task_earnings_:{g.user_id}") UserCache(l["mobile"]).get() # 增加实名1元收益明细 # 添加时间 add_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") smsy = MysqlWrite().write( f"INSERT INTO {ET_MEMBER_EARNINGS} (member_id,task_id,add_time,amounts) VALUE ('{g.user_id}',1,'{add_time}',1)" ) return {"code": 2001}, 200
def post(self): parser = reqparse.RequestParser() parser.add_argument('amount', type=int, required=True, location='json') args = parser.parse_args() # 判断当前用户是否已经领取该奖金 w = MysqlSearch().get_one(f"SELECT pay_status FROM {ACTIVITY_REWARDS} WHERE member_id='{g.user_id}'") if w is False or w['pay_status'] == 1: return {'error_code': 4003, 'msg': '改奖励已领取/没有奖金可领'}, HttpStatus.OK.value if not args.amount: return {'error_code': 4003, 'msg:': '参数异常'}, HttpStatus.OK.value # 乐观锁解决修改用户余额 l = MysqlSearch().get_one( f"SELECT balance,balance_version FROM {MEMBERS_TABLE} WHERE id='{g.user_id}'") ye = int(args.amount * 100) # 生成20位随机字符串 salt = ''.join(random.sample(string.ascii_letters + string.digits, 20)) version_time = str(time.time()) + salt try: u = MysqlWrite().write( f"UPDATE {MEMBERS_TABLE} SET balance='{ye}',balance_version='{version_time}' WHERE balance_version='{l['balance_version']}' and id='{g.user_id}'") if u == 1: # 删除用户余额缓存 rc = current_app.redis_cli rc.delete(f'user_center:{g.user_id}') # 修改当前用户是否已领取该奖金 x = MysqlWrite().write(f"UPDATE {ACTIVITY_REWARDS} SET pay_status=1 WHERE member_id='{g.user_id}'") if x == 1: return {'code': 2001, 'msg': '领取成功!'}, HttpStatus.OK.value else: return {'error_code': 4001, 'msg': '服务器异常,请稍后再试'}, HttpStatus.OK.value else: return {'error_code': 4001, 'msg': '服务器异常,请稍后再试'}, HttpStatus.OK.value except Exception: return {'error_code': 4001, "msg": '请稍后重试'}, HttpStatus.OK.value
def post(self): """用户接任务""" parser = reqparse.RequestParser() parser.add_argument('task_id', type=int, required=True, location='json') parser.add_argument('app_safe_info', type=dict, required=True, location='json') args = parser.parse_args() # 要json数据入库,接收的类型必须是dict然后转str,不然会一直报错.可能需要flask的json, new_data = json.dumps(args.app_safe_info).replace("'", '"') # 判断此任务是否还有剩余数量 # 判断用户是否已经提现成功 tx = MysqlSearch().get_one(f"SELECT verify FROM {ET_MEMBER_WITHDRAWAL} WHERE member_id='{g.user_id}' and verify=2") current_app.logger.error(tx) if tx is None: return {"error": "请进行新手提现成功再领取任务"} sy = MysqlSearch().get_one(f"SELECT tasks_counts,count_tasks,check_router FROM {TASKS_TABLE} WHERE id='{args.task_id}'") if sy['tasks_counts'] == sy['count_tasks']: return {'error_code': 4003, 'msg': '此任务无法领取.数量不足'} task_status = current_app.redis_cli.sismember('cancel_tasks_{}'.format(g.user_id), args.task_id) if task_status is True: return {'error': '此任务用户已取消过, 24小时内不能在领取'},HttpStatus.OK.value complete_task = current_app.redis_cli.sismember('complete_tasks_{}'.format(g.user_id), args.task_id) if complete_task is True: return {'error': '此任务用户已领取'}, HttpStatus.OK.value else: now_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") # todo 'http://' + '47.113.91.65:5007' 添加到config配置项 current_app.logger.error(sy['check_router']) safe_token = global_config.getRaw('Invite_link', 'EWM_LINK') + f'?td={args.task_id}&fromu={g.user_id}&ref={sy["check_router"]}' current_app.logger.error(safe_token) sql = f"INSERT INTO {ET_TASK_ORDERS} (task_id,member_id,status,add_time,app_safe_info,safe_token) VALUE ('{args.task_id}','{g.user_id}',1,'{now_time}','{new_data}','{safe_token}')" res = MysqlWrite().write(sql) if res == 1: # 更新任务剩余数量 r = MysqlWrite().write(f"UPDATE {TASKS_TABLE} SET count_tasks=count_tasks + 1 WHERE ID='{args.task_id}'") # redis操作 rc = current_app.redis_cli # 删除用户任务缓存 rc.delete('user_tasks_:{}'.format(g.user_id)) # 删除任务缓存 rc.delete('tasks_info') # 删除用户任务的缓存 rc.delete('user_tasks_:{}'.format(g.user_id)) rc.sadd('complete_tasks_:{}'.format(args.task_id),g.user_id) # 向已领取任务redis中添加数据 rc.sadd('fetch_tasks_:{}'.format(args.task_id), g.user_id) # 删除任务详情缓存 rc.delete("tasks_detail_:{}".format(args.task_id)) # 删除用户任务总列表数据 rc.delete(f"tasks_info_{g.user_id}") return {'data': '添加任务完成'}, HttpStatus.OK.value else: return {'error': '任务获取失败,请重试'}, HttpStatus.OK.value
def post(self): """绑定支付宝""" parser = reqparse.RequestParser() parser.add_argument('account', type=str, required=True, location='json') args = parser.parse_args() sm = current_app.redis_cli.sismember('bind_aliplay', args.account) if sm is True: return {'error': '此支付宝已绑定,无法重复绑定'}, HttpStatus.OK.value if re.match(r'^1([34589][0-9]{9}|(6[01234689]{1})[0-9]{8}|(7[2-9]{1})[0-9]{8})$', args.account) or \ re.match(r'^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$', args.account): sql = f"UPDATE {MEMBERS_TABLE} SET alipayid='{args.account}' WHERE ID='{g.user_id}'" res = MysqlWrite().write(sql) # 把支付宝添加进set rc = current_app.redis_cli rc.sadd('bind_aliplay', args.account) # 删除用户中心缓存 rc.delete(f'user_center:{g.user_id}') # 删除任务列表缓存 rc.delete('tasks_info') return {'data': '绑定成功!'}, HttpStatus.OK.value else: return {'error': '输入格式有误,请从新输入'}, HttpStatus.OK.value
def post(self): """用户提交任务""" parser = reqparse.RequestParser() parser.add_argument('task_id', type=int, required=True, location='json') parser.add_argument('json_data', type=dict, required=True, location='json') args = parser.parse_args() if args.json_data: if args.json_data['imgs'] == []: return {'code': 4002, 'msg': '请上传图片'} # todo 4月1号晚上修改格式 # 要json数据入库,接收的类型必须是dict然后转str,不然会一直报错.可能需要flask的json, new_data = json.dumps(args.json_data).replace("'", '"') # new_data = json.dumps(data) # 是否接过此任务 t = MysqlSearch().get_more( f"SELECT task_id FROM {ET_TASK_ORDERS} WHERE member_id='{g.user_id}'" ) if {'task_id': args.task_id} not in t: return {'error': '请先领取改任务'}, HttpStatus.OK.value # 查询当前接任务的时间 r = MysqlSearch().get_one( f"SELECT add_time FROM {ET_TASK_ORDERS} WHERE task_id='{args.task_id}'" ) # 获取任务最后结束时间, 查询当前任务deadline_time task_end_time = MysqlSearch().get_one( f"SELECT end_time,deadline_time FROM {TASKS_TABLE} WHERE id='{args.task_id}'" ) end_time = task_end_time['end_time'].strftime("%Y-%m-%d-%H-%M-%S") now_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") # 通过接任务的时间+任务deadline时间l # a = (r['add_time'] + datetime.timedelta(hours=int(task_end_time['deadline_time']))).strftime("%Y-%m-%d-%H-%S-%M") # todo > if now_time > (r['add_time'] + datetime.timedelta( hours=int(task_end_time['deadline_time'])) ).strftime("%Y-%m-%d-%H-%S-%M"): return {'error': '该任务已超过做单时间,无法提交'}, HttpStatus.OK.value # todo < if end_time < now_time: return {'error': '该任务已超过结束时间,无法提交'}, HttpStatus.OK.value else: # 更新order表数据 sql = f"UPDATE {ET_TASK_ORDERS} SET status=2,user_submit='{new_data}',submit_time='{now_time}' WHERE member_id={g.user_id} AND task_id='{args.task_id}'" res = MysqlWrite().write(sql) if res == 1: # 更新任务数量 # 删除用户任务详情缓存 rc = current_app.redis_cli rc.delete('user_tasks_:{}'.format(g.user_id)) return {'data': '提交成功'}, HttpStatus.OK.value else: return {"error": '提交失败,尝试再次提交'}, HttpStatus.OK.value
def get(self): """用户接任务""" parser = reqparse.RequestParser() parser.add_argument('task_id', type=int, required=True, location='args') args = parser.parse_args() task_status = current_app.redis_cli.sismember( 'cancel_tasks_:{}'.format(args.task_id), g.user_id) if task_status is True: return {'error': '此任务用户已取消过, 24小时内不能在领取'}, HttpStatus.OK.value complete_task = current_app.redis_cli.sismember( 'complete_tasks_:{}'.format(args.task_id), g.user_id) if complete_task is True: return {'error': '此任务用户已领取'}, HttpStatus.OK.value else: now_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") sql = f"INSERT INTO {ET_TASK_ORDERS} (task_id,member_id,status,add_time) VALUE ('{args.task_id}','{g.user_id}',1,'{now_time}')" res = MysqlWrite().write(sql) if res == 1: # 更新任务剩余数量 r = MysqlWrite().write( f"UPDATE {TASKS_TABLE} SET count_tasks=count_tasks + 1 WHERE ID='{args.task_id}'" ) # redis操作 rc = current_app.redis_cli # 删除用户任务缓存 rc.delete('user_tasks_:{}'.format(g.user_id)) # 删除任务缓存 rc.delete('tasks_info') # 删除用户任务的缓存 rc.delete('user_tasks_:{}'.format(g.user_id)) rc.sadd('complete_tasks_:{}'.format(args.task_id), g.user_id) # 向已领取任务redis中添加数据 rc.sadd('fetch_tasks_:{}'.format(args.task_id), g.user_id) # 删除任务详情缓存 rc.delete("tasks_detail_:{}".format(args.task_id)) # 删除用户任务总列表数据 rc.delete(f"tasks_info_{g.user_id}") return {'data': '添加任务完成'}, HttpStatus.OK.value else: return {'error': '任务获取失败,请重试'}, HttpStatus.OK.value
def post(self): """更新版本""" parser = reqparse.RequestParser() parser.add_argument('app_version', type=str, required=True, location='json') args = parser.parse_args() up = MysqlWrite().write( f"UPDATE {MEMBERS_TABLE} SET app_version='{args.app_version}' WHERE ID='{g.user_id}'" ) return HttpStatus.OK.value
def get(self): parser = reqparse.RequestParser() parser.add_argument('task_id', type=int, required=True, location='args') args = parser.parse_args() q = MysqlWrite().write( f"UPDATE {ET_TASK_ORDERS} SET status=3 WHERE task_id='{args.task_id}' and member_id='{g.user_id}'" ) if q == 1: rc = current_app.redis_cli rc.sadd('cancel_tasks_:{}'.format(args.task_id), g.user_id) rc.delete('user_tasks_:{}'.format(g.user_id)) return {'data': '取消完成.'}, HttpStatus.OK.value
def post(self): parser = reqparse.RequestParser() parser.add_argument('iiuv', type=str, required=True, location='json') parser.add_argument('open_id', type=int, required=True, location='json') args = parser.parse_args() member_id = MysqlSearch().get_one( f"SELECT id,nickname FROM {MEMBERS_TABLE} WHERE IIUV='{args.iiuv}'" ) res = MysqlWrite().write( f"UPDATE {MEMBERS_TABLE} SET open_id={args.open_id} WHERE ID={member_id['id']}" ) if res == 1: return {'data': member_id['nickname']}, HttpStatus.OK.value
def mer_short_link(): # 查询当前用户是否有旧的邀请链接 old_sql = f"SELECT short_link,IIUV FROM {MEMBERS_TABLE} WHERE id = {g.user_id}" old_data = MysqlSearch().get_one(old_sql) old_short_link = old_data['short_link'] if old_short_link != 'N': short_link = old_short_link return short_link elif old_short_link == 'N': # 生成短链接入库 res_data = get_short_link(old_data['IIUV']) w_sql = f"UPDATE {MEMBERS_TABLE} SET short_link = '{res_data}' WHERE id = {g.user_id}" res = MysqlWrite().write(w_sql) if res == 1: return res_data else: return 'N'
def post(self): """用户意见提交""" parser = reqparse.RequestParser() parser.add_argument('json_data', type=dict, required=True, location='json') args = parser.parse_args() # 要json数据入库, 接收的类型必须是dict然后转str, 不然会一直报错.可能需要flask的json, new_data = json.dumps(args.json_data).replace("'", '"') m = MysqlWrite().write( f"INSERT INTO {ET_FEEDBACKS} (member_id,feedback) VALUE ('{g.user_id}','{new_data}')" ) if m == 1: return {'data': '反馈成功'}, HttpStatus.OK.value else: return {'网络异常,请重试'}, HttpStatus.OK.value
def post(self): """用户设备信息""" parser = reqparse.RequestParser() parser.add_argument('json_data', type=dict, required=True, location='json') args = parser.parse_args() new_data = json.dumps(args.json_data).replace("'", '"') # 入库 res = MysqlWrite().write( f"UPDATE {ET_MEMBER_EXTEND} SET equipment='{new_data}' WHERE member_id='{g.user_id}'" ) if res == 1: return 200 else: return {'code': 4003, 'msg': '参数异常'}, 200
def post(self): """用户实名认证""" parser = reqparse.RequestParser() parser.add_argument('mobile', type=int, required=True, location='json') parser.add_argument('idNo', type=str, required=True, location='json') parser.add_argument('name', type=str, required=True, location='json') args = parser.parse_args() mobile = str(args.mobile) # 检验身份证格式 if not re.match(r'[\u4e00-\u9fa5]', args.name) or not re.match( r'[^\u4e00-\u9fa5]', args.idNo): return {'error': '请输入正确格式'}, HttpStatus.OK.value # 查询身份证是否已经使用过 try: sm = current_app.redis_cli.sismember('id_num', args.idNo) if sm is True: return {'error': '此身份证已实名,无法重复使用'}, HttpStatus.OK.value except TypeError as e: current_app.logger.error(f"TypeError{e}") # 再次检验身份证是否正常 try: ic_check = checkIdcard(args.idNo) except Exception as e: current_app.logger.error(f"Exception: {e}") return {'error': '请检查身份证号码是否正确'}, HttpStatus.OK.value # # 获取用户扩展缓存 #todo 缓存查询出现问题,想办法加上登录装饰器并跳过阿里屏蔽 # res = UserExtendCache(us['id']).get() # if res: # return {'error': '此身份证已实名,无法重复实名'}, HttpStatus.OK.value # 前往实名 mes = verifid_card_1(args.name, args.idNo) if mes is False: return {'error': '系统繁忙,请稍后尝试.'}, HttpStatus.OK.value # todo 判断验证信息状态 if mes['status'] != '01': return {'error': '错误身份证信息'}, HttpStatus.OK.value if mes['sex'] == '男': sex = 1 else: sex = 2 # 查询用户user_id us = MysqlSearch().get_one( f"SELECT id FROM {MEMBERS_TABLE} WHERE mobile={args.mobile}") # 入库实名信息 sql_w = f"INSERT INTO {ET_MEMBER_EXTEND} (`name`,member_id,id_num,sex,province,city,age) VALUE ('{args.name}','{us['id']}','{mes['idCard']}','{sex}','{mes['province']}','{mes['city']}','{mes['birthday'][: 4]}')" MysqlWrite().write(sql_w) user_extend = { 'member_id': us['id'], 'id_number': mes['idCard'], 'sex': sex, 'province': mes['province'], 'city': mes['city'], 'age': mes['birthday'][:4], 'name': args.name } # 写入用户扩展信息缓存 # UserExtendCache(us['id']).save(user_extend) if mes['status'] == "01": # 修改实名状态,入库用户真实姓名 sql_update = f"UPDATE {MEMBERS_TABLE} SET setreal=1,realname='{args.name}' WHERE ID='{us['id']}'" res = MysqlWrite().write(sql_update) if res == 1: rc = current_app.redis_cli rc.delete('user_info_:{}'.format(args.mobile)) rc.delete('user_center:{}'.format(us['id'])) # 添加身份证到set rc.sadd('id_num', args.idNo) UserCache(args.mobile).get() return {'data': mes['status']}, HttpStatus.OK.value else: return {'error': mes['status']}, HttpStatus.OK.value
def post(self): """用户实名认证""" parser = reqparse.RequestParser() parser.add_argument('mobile', type=int, required=True, location='json') parser.add_argument('idNo', type=str, required=True, location='json') parser.add_argument('name', type=str, required=True, location='json') args = parser.parse_args() mobile = str(args.mobile) # 检验类型格式 if not re.match(r'[\u4e00-\u9fa5]', args.name) or not re.match(r'[^\u4e00-\u9fa5]', args.idNo): return {'error': '请输入正确格式'}, HttpStatus.OK.value # 校验手机号码格式 if not re.match(r'^1([34589][0-9]{9}|(6[01234689]{1})[0-9]{8}|(7[2-9]{1})[0-9]{8})$',mobile): return {'error': '手机号码格式错误'}, HttpStatus.OK.value # 查询身份证是否已经使用过 try: sm = current_app.redis_cli.sismember('id_num',args.idNo) if sm is True: return {'error': '此身份证已实名,无法重复使用'}, HttpStatus.OK.value except TypeError as e: current_app.logger.error(f"TypeError{e}") # 再次检验身份证是否正常 try: ic_check = checkIdcard(args.idNo) except Exception as e: current_app.logger.error(f"Exception: {e}") return {'error': '请检查身份证号码是否正确'} ,HttpStatus.OK.value # # 获取用户扩展缓存 #todo 缓存查询出现问题,想办法加上登录装饰器并跳过阿里屏蔽 # res = UserExtendCache(us['id']).get() # if res: # return {'error': '此身份证已实名,无法重复实名'}, HttpStatus.OK.value # 前往实名 mes = verifid_card_1(args.name, args.idNo) if mes is False: return {'error': '系统繁忙,请稍后尝试.'}, HttpStatus.OK.value # todo 判断验证信息状态 if mes['status'] != '01': return {'error': '错误身份证信息'}, HttpStatus.OK.value if mes['sex'] == '男': sex = 1 else: sex = 2 # 查询用户user_id us = MysqlSearch().get_one(f"SELECT id FROM {MEMBERS_TABLE} WHERE mobile={args.mobile}") # 入库实名信息 sql_w = f"INSERT INTO {ET_MEMBER_EXTEND} (`name`,member_id,id_num,sex,province,city,age) VALUE ('{args.name}','{us['id']}','{mes['idCard']}','{sex}','{mes['province']}','{mes['city']}','{mes['birthday'][: 4]}')" MysqlWrite().write(sql_w) user_extend = { 'member_id': us['id'], 'id_number': mes['idCard'], 'sex': sex, 'province': mes['province'], 'city': mes['city'], 'age': mes['birthday'][: 4], 'name': args.name } # 写入用户扩展信息缓存 # UserExtendCache(us['id']).save(user_extend) if mes['status'] == "01": # 修改实名状态,入库用户真实姓名 sql_update = f"UPDATE {MEMBERS_TABLE} SET setreal=1,realname='{args.name}' WHERE ID='{us['id']}'" res = MysqlWrite().write(sql_update) if res == 1: # 乐观锁解决修改用户余额 l = MysqlSearch().get_one(f"SELECT balance,balance_version FROM {MEMBERS_TABLE} WHERE id='{us['id']}'") version_time = time.time() try: u = MysqlWrite().write( f"UPDATE {MEMBERS_TABLE} SET balance=balance+100,balance_version='{version_time}' WHERE balance_version='{l['balance_version']}' and id='{us['id']}'") except Exception: return {'error': '请稍后重试'}, HttpStatus.OK.value # 增加实名1元收益明细 # 添加时间 add_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") smsy = MysqlWrite().write(f"INSERT INTO {ET_MEMBER_EARNINGS} (member_id,task_id,add_time,amounts) VALUE ('{us['id']}',2,'{add_time}',1)") rc = current_app.redis_cli rc.delete('user_info_:{}'.format(args.mobile)) rc.delete('user_center:{}'.format(us['id'])) # 添加身份证到set rc.sadd('id_num',args.idNo) UserCache(args.mobile).get() return {'data': mes['status']}, HttpStatus.OK.value else: return {'error': mes['status']}, HttpStatus.OK.value
def tree(self, mobile, iiuv): rc = current_app.redis_cli # 获取新用户的id member_id = f"SELECT id FROM {MEMBERS_TABLE} WHERE mobile='{mobile}'" member = MysqlSearch().get_one(member_id) # 获取父级用户id parent_id = f"SELECT id FROM {MEMBERS_TABLE} WHERE IIUV='{iiuv}'" parent = MysqlSearch().get_one(parent_id) if iiuv is None: # 设置当前用户为顶级节点 parent_id = Node(member['id']) child_id = Node(None) exporter = DictExporter() data = exporter.export(parent_id) rc.hsetnx(f"drp_relation_member_{member['id']}", 0, json.dumps(data)) # todo 查询当前用户关系是否入库 fx = MysqlSearch().get_one( f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if not fx: # 新增当前用户分销关系 sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id,levels) VALUE ('{member['id']}','{member['id']}' ,1)" MysqlWrite().write(sql_iiuv) return True # TODO 查询当前用户的parent_id是否顶级节点 root_data = rc.hget(f"drp_relation_member_{parent['id']}", 0) if root_data: try: json_data = json.loads(root_data) importer = DictImporter() root = importer.import_(json_data) level_2 = Node(member['id'], parent=root) exporter = DictExporter() data = exporter.export(root) print(data) rc.hset(f"drp_relation_member_{parent['id']}", 0, json.dumps(data)) # 新增拉新redis rc.hsetnx("is_new_member", member['id'], parent['id']) # todo 查询当前用户关系是否入库 fx = MysqlSearch().get_one( f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if not fx: # 新增当前用户分销关系 sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id) VALUE ('{member['id']}','{parent['id']}')" MysqlWrite().write(sql_iiuv) # 更新数据库levels字段数据 sql = f"UPDATE {ET_MEMBER_RELATIONS} SET levels=2,parent_id='{parent['id']}',top_parent_id='{parent['id']}' WHERE member_id='{member['id']}'" MysqlWrite().write(sql) # 判断当前用户是否已经关联了父级,如关联了就删除顶级用户树 gl = MysqlSearch().get_one( f"SELECT parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if gl['parent_id'] != member['id']: # 删除树 rc.delete(f"drp_relation_member_{member['id']}") # 删除缓存 rc.delete(f"user_apprentice_:{member['id']}") rc.delete(f"user_apprentice_:{parent['id']}") return True except Exception as e: current_app.logger.error(e) else: # TODO 如果当前parent_id不是顶级节点,查询当前parent_id的上级并进入树结构查询 top_parent = MysqlSearch().get_one( f"SELECT top_parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{parent['id']}'" ) try: root_data = rc.hget( f"drp_relation_member_{top_parent['top_parent_id']}", 0) except Exception as e: json_data = { 'member_id': member['id'], 'parent_id': parent['id'] } rc.lpush('error_not_top_parent_id', json.dumps(json_data)) if root_data: json_data = json.loads(root_data) importer = DictImporter() root = importer.import_(json_data) level_1 = findall_by_attr(root, top_parent['top_parent_id'])[0] level_2 = findall_by_attr(root, parent['id'])[0] level_3 = Node(member['id'], parent=level_2) exporter = DictExporter() data = exporter.export(root) rc.hset(f"drp_relation_member_{top_parent['top_parent_id']}", 0, json.dumps(data)) # 新增拉新redis rc.hsetnx("is_new_member", member['id'], parent['id']) # 查询当前parent的等级 lv = MysqlSearch().get_one( f"SELECT levels FROM {ET_MEMBER_RELATIONS} WHERE member_id='{parent['id']}'" ) # todo 查询当前用户关系是否入库 fx = MysqlSearch().get_one( f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if not fx: # 新增当前用户分销关系 sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id) VALUE ('{member['id']}','{parent['id']}')" MysqlWrite().write(sql_iiuv) # 更新数据库levels字段数据 sql = f"UPDATE {ET_MEMBER_RELATIONS} SET levels='{lv['levels'] + 1}',parent_id='{parent['id']}',top_parent_id='{top_parent['top_parent_id']}' WHERE member_id='{member['id']}'" MysqlWrite().write(sql) # 判断当前用户是否已经关联了父级,如关联了就删除顶级用户树 gl = MysqlSearch().get_one( f"SELECT parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if gl['parent_id'] != member['id']: # 删除树 rc.delete(f"drp_relation_member_{member['id']}") # 删除缓存 rc.delete(f"user_apprentice_:{member['id']}") rc.delete(f"user_apprentice_:{parent['id']}") return True else: # 设置当前用户为顶级节点 parent_id_ = Node(parent['id']) level_2 = Node(member['id'], parent=parent_id_) exporter = DictExporter() data = exporter.export(parent_id_) # 新增树 rc.hset(f"drp_relation_member_{parent['id']}", 0, json.dumps(data)) # 新增拉新redis rc.hsetnx("is_new_member", member['id'], parent['id']) # todo 查询当前用户关系是否入库 fx = MysqlSearch().get_one( f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{parent['id']}'" ) if not fx: # 新增当前用户分销关系 sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id,levels) VALUE ('{member['id']}','{parent['id']}' ,2)" MysqlWrite().write(sql_iiuv) return True
def post(self): """用户提交任务""" parser = reqparse.RequestParser() parser.add_argument('task_id', type=int, required=True, location='json') parser.add_argument('json_data', type=dict, required=True, location='json') parser.add_argument('safe_token', type=str, required=True, location='json') # TODO res == app_safe_info == check_router parser.add_argument('res', type=dict, required=True, location='json') args = parser.parse_args() if args.json_data: if args.json_data['imgs'] == []: return {'code': 4002, 'msg': '请上传图片'} # todo 4月1号晚上修改格式 # 要json数据入库,接收的类型必须是dict然后转str,不然会一直报错.可能需要flask的json, new_data = json.dumps(args.json_data).replace("'", '"') # 是否接过此任务 t = MysqlSearch().get_more( f"SELECT task_id FROM {ET_TASK_ORDERS} WHERE member_id='{g.user_id}'" ) if {'task_id': args.task_id} not in t: return {'error': '请先领取改任务'}, HttpStatus.OK.value # 查询用户当前接任务的时间 r = MysqlSearch().get_one( f"SELECT add_time,safe_token,app_safe_info FROM {ET_TASK_ORDERS} WHERE task_id='{args.task_id}' AND member_id='{g.user_id}'" ) # # 获取任务最后结束时间, 查询当前任务deadline_time task_end_time = MysqlSearch().get_one( f"SELECT end_time,deadline_time,check_router FROM {TASKS_TABLE} WHERE id='{args.task_id}'" ) end_time = task_end_time['end_time'].strftime("%Y-%m-%d-%H-%M-%S") now_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") # todo 检验app_ip_mac地址是否一致 json_app_info = json.loads(r['app_safe_info']) # 判断此ip是否存在集合 rc = current_app.redis_cli res = rc.zscore(f'enterip_from_task_{args.task_id}', json_app_info['ip']) if res is None: data = f"{json_app_info['ip']}" score = 1 # 添加当前的member_id到redis集合中 rc.zadd(f'enterip_from_task_{args.task_id}', {data: score}) if args.res['mac'] != json_app_info['mac']: # 修改task_orders表confidence字段 res = MysqlWrite().write( f"UPDATE {ET_TASK_ORDERS} SET confidence=2 WHERE member_id={g.user_id} AND task_id='{args.task_id}'" ) # todo 检验safe_token是否一致, try: resp = urllib.urlopen(args.res['link'][0]) # bytearray将数据转换成(返回)一个新的字节数组 # asarray 复制数据,将结构化数据转换成ndarray image = np.asarray(bytearray(resp.read()), dtype="uint8") # cv2.imdecode()函数将数据解码成Opencv图像格式 image = cv2.imdecode(image, cv2.IMREAD_COLOR) img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) resImg2 = cv2.resize(img, (img.shape[1] * 10, img.shape[0] * 10), interpolation=cv2.INTER_CUBIC) barcodes = pyzbar.decode(resImg2) barcodeData = None for barcode in barcodes: barcodeData = barcode.data.decode("utf-8") safe_token = r['safe_token'] current_app.logger.error(args.safe_token) # ref_data = 'http://' + '47.113.91.65:5007' + '/share_jump' + f'?td={args.task_id}&ref={task_end_time["check_router"]}' if safe_token != barcodeData: # 修改task_orders表confidence字段 res = MysqlWrite().write( f"UPDATE {ET_TASK_ORDERS} SET confidence=1 WHERE member_id={g.user_id} AND task_id='{args.task_id}'" ) except Exception as e: current_app.logger.error(f'Exception : {e}') # 通过接任务的时间+任务deadline时间l # a = (r['add_time'] + datetime.timedelta(hours=int(task_end_time['deadline_time']))).strftime("%Y-%m-%d-%H-%S-%M") # todo > if now_time > (r['add_time'] + datetime.timedelta( hours=int(task_end_time['deadline_time'])) ).strftime("%Y-%m-%d-%H-%S-%M"): # 更新order表数据 sql = f"UPDATE {ET_TASK_ORDERS} SET status=5,user_submit='{new_data}',submit_time='{now_time}' WHERE member_id={g.user_id} AND task_id='{args.task_id}'" res = MysqlWrite().write(sql) return {'error': '该任务已超过做单时间,无法提交'}, HttpStatus.OK.value # todo < if end_time < now_time: # 更新order表数据 sql = f"UPDATE {ET_TASK_ORDERS} SET status=5,user_submit='{new_data}',submit_time='{now_time}' WHERE member_id={g.user_id} AND task_id='{args.task_id}'" res = MysqlWrite().write(sql) return {'error': '该任务已超过结束时间,无法提交'}, HttpStatus.OK.value else: # 更新order表数据 sql = f"UPDATE {ET_TASK_ORDERS} SET status=2,user_submit='{new_data}',submit_time='{now_time}' WHERE member_id={g.user_id} AND task_id='{args.task_id}'" res = MysqlWrite().write(sql) if res == 1: # 更新任务数量 # 删除用户任务详情缓存 rc = current_app.redis_cli rc.delete('user_tasks_:{}'.format(g.user_id)) return {'data': '提交成功'}, HttpStatus.OK.value else: return {"error": '提交失败,尝试再次提交'}, HttpStatus.OK.value
def post(self): """提交提现数据""" parser = reqparse.RequestParser() parser.add_argument('amount', type=str, required=True, location='json') args = parser.parse_args() args.amount = float(args.amount) # 查询当前用户余额 #todo 以后增加手续费计算出正常金额对比提现条件是否相等 y = MysqlSearch().get_one( f"SELECT balance,alipayid FROM {MEMBERS_TABLE} WHERE ID='{g.user_id}'" ) if y['balance'] is None or args.amount > (y['balance'] / 100) or y['alipayid'] == '': return { 'error': f"余额不足,剩余余额{y['balance']}/支付宝未绑定" }, HttpStatus.OK.value # 查询最小提现金额和当天最多提现次数 sql = f"SELECT daily_withdrawal,handling_fee,withdrawal_condition FROM {ET_DRP_CONFIG}" res = MysqlSearch().get_more(sql)[-1] # 查询是否已经提现过1元 if args.amount == 1: try: sm = current_app.redis_cli.sismember('carry_money_1', g.user_id) if sm is True: return {'error': '用户已提现过1元,无法再次提现1元'}, HttpStatus.OK.value except TypeError as e: current_app.logger.error(f"TypeError{e}") # 查询当前用户邀请的人数 son_member = MysqlSearch().get_more( f"SELECT member_id FROM {ET_MEMBER_RELATIONS} WHERE parent_id='{g.user_id}'" ) if son_member is not None: member_count = 0 for son in son_member: if son['member_id'] != g.user_id: member_count += 1 # 对比当前提现条件 # todo conditions要从数据库取出判断. # 从数据库取出提现条件 allow_money = [] prentice_count = [] with_data = json.loads(res['withdrawal_condition']) for q in with_data.values(): for i, e in enumerate(q): if 'allow_money' in e: allow_money.append(e['allow_money']) continue for k in with_data.values(): for c, x in enumerate(k): if 'prentice_count' in x: prentice_count.append(x['prentice_count']) continue for k, v in enumerate(zip(allow_money, prentice_count)): current_app.logger.info(f"Exception1 : { args.amount }") current_app.logger.info(f"Exception2 : { v[0] }") current_app.logger.info(f"Exception3 : { v[1] }") current_app.logger.info(f"Exception4 : { member_count }") # 输入金额== 条件金额 用户总金额 >= if args.amount == v[0] and member_count >= v[1]: # 查询当前用户当天提现次数 c_list = MysqlSearch().get_more( f"SELECT member_id,start_time FROM {ET_MEMBER_WITHDRAWAL} WHERE member_id='{g.user_id}'" ) if c_list: now_time = datetime.now().strftime("%Y-%m-%d") count = 0 for c in c_list: if c['start_time'].strftime( "%Y-%m-%d") == now_time: count += 1 # 判断当前用户当天是否超过提现次数 if count > int(res['daily_withdrawal']): return {'error': '已超过当天提现次数'}, HttpStatus.OK.value current_app.logger.info(f"res : { res }") if res: # 提现最小金额限制暂时取消使用 # new_res = res # min_money = new_res['min_money'] / 100 # if args.amount < min_money: new_res = res min_money = 0 if args.amount < min_money: return { 'error': '提现金额过小最小提现金额为:{}'.format(min_money) }, HttpStatus.BAD_REQUEST.value else: res1 = None # 查询手续费.当前提现金额减去手续费入库 try: if res['handling_fee'] != '0': handling_fee = float( res['handling_fee']) / 100 elif res['handling_fee'] != 0: handling_fee = float( res['handling_fee']) / 100 else: handling_fee = 0 user_handling = args.amount * handling_fee new_amounts = args.amount - user_handling res1 = MysqlWrite().write( f"INSERT INTO {ET_MEMBER_WITHDRAWAL} (pay_status,amounts,member_id) VALUE (1, {new_amounts}, {g.user_id})" ) except Exception as e: current_app.logger.info(f"Exception try : {e}") if res1 == 1: # 乐观锁解决修改用户余额 l = MysqlSearch().get_one( f"SELECT balance,balance_version FROM {MEMBERS_TABLE} WHERE id='{g.user_id}'" ) ye = l['balance'] - args.amount * 100 version_time = time.time() try: u = MysqlWrite().write( f"UPDATE {MEMBERS_TABLE} SET balance='{ye}',balance_version='{version_time}' WHERE balance_version='{l['balance_version']}' and id='{g.user_id}'" ) except Exception: return { 'error': '请稍后重试' }, HttpStatus.OK.value rc = current_app.redis_cli # 增加redis set 保存已提现过1元的用户 if args.amount == 1: rc.sadd('carry_money_1', g.user_id) rc.delete('user_center:{}'.format(g.user_id)) rc.delete('user_withdraw_recode:{}'.format( g.user_id)) a_data = { '手续费': user_handling, '提现金额': new_amounts } return { 'data': a_data, 1: '提现成功!' }, HttpStatus.OK.value continue return {'error': '提现金额/邀请人数不符合条件'}, HttpStatus.OK.value
def tree(self, mobile, iiuv): rc = current_app.redis_cli # 获取新用户的id member_id = f"SELECT id FROM {MEMBERS_TABLE} WHERE mobile='{mobile}'" member = MysqlSearch().get_one(member_id) # 获取父级用户id parent_id = f"SELECT id FROM {MEMBERS_TABLE} WHERE my_code='{iiuv}'" parent = MysqlSearch().get_one(parent_id) if iiuv is None: # 设置当前用户为顶级节点 parent_id = Node(member['id']) child_id = Node(None) exporter = DictExporter() data = exporter.export(parent_id) rc.hsetnx(f"drp_relation_member_{member['id']}", 0, json.dumps(data)) # todo 查询当前用户关系是否入库 fx = MysqlSearch().get_one( f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if not fx: # 新增当前用户分销关系 sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id,levels) VALUE ('{member['id']}','{member['id']}' ,1)" MysqlWrite().write(sql_iiuv) return True # TODO 查询当前用户的parent_id是否顶级节点 try: root_data = rc.hget(f"drp_relation_member_{parent['id']}", 0) except Exception as e: rc.lpush('error_not_parent_id', member['id']) return False if root_data: try: json_data = json.loads(root_data) importer = DictImporter() root = importer.import_(json_data) level_2 = Node(member['id'], parent=root) exporter = DictExporter() data = exporter.export(root) rc.hset(f"drp_relation_member_{parent['id']}", 0, json.dumps(data)) # todo 查询当前用户关系是否入库 fx = MysqlSearch().get_one( f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if not fx: # 新增当前用户分销关系 sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id) VALUE ('{member['id']}','{parent['id']}')" MysqlWrite().write(sql_iiuv) # 更新数据库levels字段数据 sql = f"UPDATE {ET_MEMBER_RELATIONS} SET levels=2,parent_id='{parent['id']}',top_parent_id='{parent['id']}' WHERE member_id='{member['id']}'" MysqlWrite().write(sql) # 判断当前用户是否已经关联了父级,如关联了就删除顶级用户树 gl = MysqlSearch().get_one( f"SELECT parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if gl['parent_id'] != member['id']: # 删除树 rc.delete(f"drp_relation_member_{member['id']}") # 删除缓存 rc.delete(f"user_apprentice_:{member['id']}") rc.delete(f"user_apprentice_:{parent['id']}") return True except Exception as e: current_app.logger.error(e) return False else: # TODO 如果当前parent_id不是顶级节点,查询当前parent_id的上级并进入树结构查询 top_parent = MysqlSearch().get_one( f"SELECT top_parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{parent['id']}'" ) try: root_data = rc.hget( f"drp_relation_member_{top_parent['top_parent_id']}", 0) except Exception as e: json_data = { 'member_id': member['id'], 'parent_id': parent['id'] } rc.lpush('error_not_top_parent_id', json.dumps(json_data)) if root_data: json_data = json.loads(root_data) importer = DictImporter() root = importer.import_(json_data) level_1 = findall_by_attr(root, top_parent['top_parent_id'])[0] level_2 = findall_by_attr(root, parent['id'])[0] level_3 = Node(member['id'], parent=level_2) exporter = DictExporter() data = exporter.export(root) rc.hset(f"drp_relation_member_{top_parent['top_parent_id']}", 0, json.dumps(data)) # 查询当前parent的等级 lv = MysqlSearch().get_one( f"SELECT levels FROM {ET_MEMBER_RELATIONS} WHERE member_id='{parent['id']}'" ) # todo 查询当前用户关系是否入库 fx = MysqlSearch().get_one( f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if not fx: # 新增当前用户分销关系 sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id) VALUE ('{member['id']}','{parent['id']}')" MysqlWrite().write(sql_iiuv) # 更新数据库levels字段数据 sql = f"UPDATE {ET_MEMBER_RELATIONS} SET levels='{lv['levels'] + 1}',parent_id='{parent['id']}',top_parent_id='{top_parent['top_parent_id']}' WHERE member_id='{member['id']}'" MysqlWrite().write(sql) # 判断当前用户是否已经关联了父级,如关联了就删除顶级用户树 gl = MysqlSearch().get_one( f"SELECT parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member['id']}'" ) if gl['parent_id'] != member['id']: # 删除树 rc.delete(f"drp_relation_member_{member['id']}") # 删除缓存 rc.delete(f"user_apprentice_:{member['id']}") rc.delete(f"user_apprentice_:{parent['id']}") return True # todo 除了第一第二步这里全跑 # class MemberRelationTreeCache(object): # def tree(self, member_id, parent_id): # rc = current_app.redis_cli # # 获取新用户的id # # TODO 查询当前用户的parent_id是否顶级节点 # try: # root_data = rc.hget(f"drp_relation_member_{parent_id}", 0) # except Exception as e: # rc.lpush('error_not_parent_id_2', member_id) # return False # if root_data: # try: # json_data = json.loads(root_data) # importer = DictImporter() # root = importer.import_(json_data) # level_2 = Node(member_id, parent=root) # exporter = DictExporter() # data = exporter.export(root) # rc.hset(f"drp_relation_member_{parent_id}", 0, json.dumps(data)) # # todo 查询当前用户关系是否入库 # fx = MysqlSearch().get_one( # f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member_id}'") # if not fx: # # 新增当前用户分销关系 # sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id) VALUE ('{member_id}','{parent_id}')" # MysqlWrite().write(sql_iiuv) # # 更新数据库levels字段数据 # sql = f"UPDATE {ET_MEMBER_RELATIONS} SET levels=2,parent_id='{parent_id}',top_parent_id='{parent_id}' WHERE member_id='{member_id}'" # MysqlWrite().write(sql) # # 判断当前用户是否已经关联了父级,如关联了就删除顶级用户树 # gl = MysqlSearch().get_one( # f"SELECT parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member_id}'") # if gl['parent_id'] != member_id: # # 删除树 # rc.delete(f"drp_relation_member_{member_id}") # # 删除缓存 # rc.delete(f"user_apprentice_:{member_id}") # rc.delete(f"user_apprentice_:{parent_id}") # return True # except Exception as e: # current_app.logger.error(e) # return False # else: # # TODO 如果当前parent_id不是顶级节点,查询当前parent_id的上级并进入树结构查询 # top_parent = MysqlSearch().get_one(f"SELECT top_parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{parent_id}'") # try: # root_data = rc.hget(f"drp_relation_member_{top_parent['top_parent_id']}", 0) # except Exception as e: # json_data = { # 'member_id': member_id, # 'parent_id': parent_id # } # rc.lpush('error_not_top_parent_id_33', json.dumps(json_data)) # return False # if root_data: # json_data = json.loads(root_data) # importer = DictImporter() # root = importer.import_(json_data) # level_1 = findall_by_attr(root, top_parent['top_parent_id'])[0] # level_2 = findall_by_attr(root, parent_id)[0] # level_3 = Node(member_id,parent=level_2) # exporter = DictExporter() # data = exporter.export(root) # rc.hset(f"drp_relation_member_{top_parent['top_parent_id']}", 0, json.dumps(data)) # # 查询当前parent的等级 # lv = MysqlSearch().get_one(f"SELECT levels FROM {ET_MEMBER_RELATIONS} WHERE member_id='{parent_id}'") # # todo 查询当前用户关系是否入库 # fx = MysqlSearch().get_one( # f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member_id}'") # if not fx: # # 新增当前用户分销关系 # sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id) VALUE ('{member_id}','{parent_id}')" # MysqlWrite().write(sql_iiuv) # # 更新数据库levels字段数据 # sql = f"UPDATE {ET_MEMBER_RELATIONS} SET levels='{lv['levels'] + 1}',parent_id='{parent_id}',top_parent_id='{top_parent['top_parent_id']}' WHERE member_id='{member_id}'" # MysqlWrite().write(sql) # # 判断当前用户是否已经关联了父级,如关联了就删除顶级用户树 # gl = MysqlSearch().get_one( # f"SELECT parent_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member_id}'") # if gl['parent_id'] != member_id: # # 删除树 # rc.delete(f"drp_relation_member_{member_id}") # # 删除缓存 # rc.delete(f"user_apprentice_:{member_id}") # rc.delete(f"user_apprentice_:{parent_id}") # return True # class MemberRelationTreeCache(object): # def tree(self, member, iiuv): # rc = current_app.redis_cli # if iiuv is None: # # 设置当前用户为顶级节点 # parent_id = Node(iiuv) # child_id = Node(member, parent=parent_id) # exporter = DictExporter() # data = exporter.export(parent_id) # rc.hsetnx(f"drp_relation_member_{iiuv}", 0, json.dumps(data)) # # todo 查询当前用户关系是否入库 # fx = MysqlSearch().get_one(f"SELECt member_id FROM {ET_MEMBER_RELATIONS} WHERE member_id='{member}'") # if not fx: # # 新增当前用户分销关系 # sql_iiuv = f"INSERT INTO {ET_MEMBER_RELATIONS} (member_id,parent_id,levels) VALUE ('{member}','{parent_id}' ,1)" # MysqlWrite().write(sql_iiuv) # return True
def post(self): parser_form = reqparse.RequestParser() parser_form.add_argument('mobile', type=str, required=True, location='json') parser_form.add_argument('code', type=str, required=True, location='json') parser_form.add_argument('iiuv', type=str, location='json') args = parser_form.parse_args() mobile = args.mobile code = args.code iiuv_data = args.iiuv if not re.match(r'^\d{6}$', code): return {'error': '验证码格式错误'}, HttpStatus.OK.value if iiuv_data: cx = MysqlSearch().get_one( f"SELECT id FROM {MEMBERS_TABLE} WHERE IIUV='{iiuv_data}'") if cx is False: iiuv_data = None # 从redis中获取验证码 key = 'app:code:{}'.format(mobile) try: real_code = current_app.redis_cli.get(key) if not real_code or real_code.decode() != code: return {'error': '验证码错误.'}, HttpStatus.OK.value except ConnectionError as e: current_app.logger.error(e) # 查询,保存用户 user_cache = current_app.redis_cli.hget('user_info_:{}'.format(mobile), 0) if user_cache: dict_user_cache = json.loads(user_cache.decode()) if dict_user_cache['mobile'] == mobile: token, refresh_token = self._generate_tokens( dict_user_cache['id'], dict_user_cache['setreal'], dict_user_cache['mobile']) token_data = [token, refresh_token] return { 'token': token_data, "手机号码": int(mobile), 'data': '欢迎登陆', }, HttpStatus.OK.value if user_cache is None: sql = f"SELECT id,setreal,mobile FROM {MEMBERS_TABLE} WHERE mobile='{args.mobile}';" user_info = MysqlSearch().get_one(sql) if user_info and user_info['mobile'] == mobile: user_info = UserCache(mobile).get() token, refresh_token = self._generate_tokens( user_info['id'], user_info['setreal'], user_info['mobile']) token_data = [token, refresh_token] return { 'token': token_data, "手机号码": int(mobile) }, HttpStatus.OK.value else: # 新用户数据入库 # 生成uuid nickname = IdWorker(1, 2, 0).get_id() user_mobile = mobile # 随机头像生成 ran_data = random.randint(1, 12) txx = f"http://static.hfj447.com/avatars/{ran_data}.jpg" sql = f"INSERT INTO {MEMBERS_TABLE} (nickname,mobile,avatar) VALUE ('{nickname}','{user_mobile}','{txx}')" res = MysqlWrite().write(sql) # 查询新用户id,生成iiuv邀请码 ii = MysqlSearch().get_one( f"SELECT id FROM {MEMBERS_TABLE} WHERE mobile='{user_mobile}'" ) member_iiuv = hashids_iivu_encode(ii['id']) # 生成邀请dwz入库 short_link = get_short_link(member_iiuv) # 生成iiuv入库 iiu = MysqlWrite().write( f"UPDATE {MEMBERS_TABLE} SET IIUV='{member_iiuv},short_link='{short_link}' WHERE id='{ii['id']}'" ) if res == 1 and iiuv_data == None: user_info = UserCache(mobile).get() MemberRelationTreeCache().tree(args.mobile, None) # 返回token token, refresh_token = self._generate_tokens( user_info['id'], user_info['setreal'], user_info['mobile']) token_data = [token, refresh_token] return { 'token': token_data, "手机号码": int(mobile) }, HttpStatus.OK.value elif res == 1 and iiuv_data: MemberRelationTreeCache().tree(args.mobile, iiuv_data) # 返回token user_info = UserCache(mobile).get() token, refresh_token = self._generate_tokens( user_info['id'], user_info['setreal'], user_info['mobile']) token_data = [token, refresh_token] return { 'token': token_data, "手机号码": int(mobile) }, HttpStatus.OK.value