Example #1
0
 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
Example #2
0
 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
Example #3
0
 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
Example #4
0
 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
Example #5
0
 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
Example #6
0
 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
Example #7
0
 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
Example #8
0
 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
Example #9
0
 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
Example #10
0
 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
Example #11
0
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'
Example #12
0
 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
Example #13
0
 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
Example #14
0
 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
Example #15
0
 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
Example #16
0
 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
Example #17
0
    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
Example #18
0
    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
Example #19
0
    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
Example #20
0
    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