def closeOrder(self, pay_order_id=0): if pay_order_id < 1: return False pay_order_info = PayOrder.query.filter_by(id=pay_order_id, status=-8).first() if not pay_order_info: return False pay_order_items = PayOrderItem.query.filter_by( pay_order_id=pay_order_id).all() if pay_order_items: # 需要归还库存 for item in pay_order_items: tmp_food_info = Food.query.filter_by(id=item.food_id).first() if tmp_food_info: tmp_food_info.stock = tmp_food_info.stock + item.quantity tmp_food_info.updated_time = geneTime() db.session.add(tmp_food_info) db.session.commit() FoodService.setStockChangeLog(item.food_id, item.quantity, "订单取消") pay_order_info.status = 0 pay_order_info.updated_time = geneTime() db.session.add(pay_order_info) db.session.commit() return True
def getAccessToken(self): token = None token_info = OauthAccessToken.query.filter(OauthAccessToken.expired_time >= geneTime()).first() if token_info: token = token_info.access_token return token config_mina = app.config['MINA_APP'] url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}" \ .format(config_mina['appid'], config_mina['appkey']) r = requests.get(url=url) if r.status_code != 200 or not r.text: return token data = json.loads(r.text) now = datetime.datetime.now() date = now + datetime.timedelta(seconds=data['expires_in'] - 200) model_token = OauthAccessToken() model_token.access_token = data['access_token'] model_token.expired_time = date.strftime("%Y-%m-%d %H:%M:%S") model_token.created_time = geneTime() db.session.add(model_token) db.session.commit() return data['access_token']
def cat_set(): if request.method == 'GET': resp_data = {} req = request.args query = FoodCat.query id = req['id'] if 'id' in req else 0 foodcat_info = None if id: foodcat_info = query.filter_by(id=id).first() resp_data['info'] = foodcat_info resp_data['current'] = 'set' return ops_render('food/cat_set.html', resp_data) resp = {'code': 200, 'msg': '成功', 'data': {}} req = request.values id = req['id'] if 'id' in req else 0 name = req['name'] if 'name' in req else '' weight = int(req['weight']) if ('weight' in req and int(req['weight']) > 0) else 1 if not weight: resp['code'] = -1 resp['msg'] = '权重错误,重新输入' return jsonify(resp) food_info = FoodCat.query.filter_by(id=id).first() if food_info: foodcat_info = food_info else: foodcat_info = FoodCat() foodcat_info.created_time = geneTime() foodcat_info.name = name foodcat_info.weight = weight foodcat_info.updated_time = geneTime() db.session.add(foodcat_info) db.session.commit() return jsonify(resp)
def myAddressOps(): resp = {'code': 200, 'msg': '操作成功~', 'data': {}} req = request.values id = int(req['id']) if 'id' in req else 0 act = req['act'] if 'act' in req else '' member_info = g.member_info if id < 1 or not member_info: resp['code'] = -1 resp['msg'] = "系统繁忙,请稍后再试~~" return jsonify(resp) address_info = MemberAddress.query.filter_by( id=id, member_id=member_info.id).first() if not address_info: resp['code'] = -1 resp['msg'] = "系统繁忙,请稍后再试~~" return jsonify(resp) if act == "del": address_info.status = 0 address_info.updated_time = geneTime() db.session.add(address_info) db.session.commit() elif act == "default": MemberAddress.query.filter_by(member_id=member_info.id) \ .update({'is_default': 0}) address_info.is_default = 1 address_info.updated_time = geneTime() db.session.add(address_info) db.session.commit() return jsonify(resp)
def uploadByFile(file): resp = {'code': 200, 'msg': '操作成功', 'data': {}} filename = secure_filename(file.filename) ext = filename.rsplit('.', 1)[1] # 取出上传文件的扩展名 if ext not in app.config['UPLOAD']['ext']: resp['code'] = -1 resp['msg'] = '不允许的扩展类型文件' return resp print('app.root_path', app.root_path) # D:\Flask\weix + '/web/static/upload/' root_path = app.root_path + app.config['UPLOAD'][ 'prefix_path'] # 获取绝对路径 file_dir = geneTime("%Y%m%d") save_dir = root_path + file_dir # 上传一个时间的 目录 if not os.path.exists(save_dir): os.mkdir(save_dir) os.chmod(save_dir, stat.S_IRWXU | stat.S_IRGRP | stat.S_IRWXO) # 赋权限 file_name = str(uuid.uuid4()).replace('-', '') + '.' + ext file.save("{0}/{1}".format(save_dir, file_name)) # 调用此方法 可直接进行保存 resp['data'] = {'file_key': file_dir + '/' + file_name} model_image = Image() model_image.file_key = file_dir + '/' + file_name model_image.created_time = geneTime() db.session.add(model_image) db.session.commit() return resp
def login(): resp = {'code': 200, 'msg': '操作成功', 'data': {}} req = request.values nickname = req['nickName'] if 'nickName' in req else '' sex = req['gender'] if 'gender' in req else 0 avatar = req['avatarUrl'] if 'avatarUrl' in req else '' code = req['code'] if 'code' in req else '' if not code or len(code) < 1: resp['code'] = -1 resp['msg'] = '需要code' return jsonify(resp) # url = 'https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code'.format( # app.config['MINA_APP']['appid'], app.config['MINA_APP']['appkey'], code) # r = requests.get(url) # content = r.text # # app.logger.info(content) # {"session_key":"VZQjfF1ebiHhyTHgm4LfFg==","openid":"omXHE5AoiI3c8AlSF2e8IGv7tdq8"} # res = json.loads(content) # <class 'dict'> # openid = res['openid'] if 'openid' in res else '' # 封装了代码 openid = MemberService.getWeChatOppenid(code) if not openid: resp['code'] = -1 resp['msg'] = '授权失败1' return jsonify(resp) bind_info = OauthMemberBind.query.filter_by(openid=openid, type=1).first() if bind_info: # 如果根据 openid 能查到信息 则 用户已经授权过 直接返回用户信息即可 member_info = Member.query.filter_by(id=bind_info.member_id).first() resp['code'] = 200 resp['msg'] = '已经存在,无需重新授权' resp['data'] = {'nickname': member_info.nickname} return jsonify(resp) # 走到这一步 说明 用户 没授权过 则 新生产一个 member_info = Member() member_info.nickname = nickname member_info.sex = sex member_info.avatar = avatar member_info.salt = MemberService.geneSalt() member_info.updated_time = member_info.created_time = geneTime() db.session.add(member_info) db.session.commit() model_bind = OauthMemberBind() model_bind.openid = openid model_bind.member_id = member_info.id model_bind.type = 1 model_bind.updated_time = model_bind.created_time = geneTime() model_bind.extra = '' db.session.add(model_bind) db.session.commit() # resp['data'] = {'nickname': model_bind.openid} token = "{0}#{1}".format(MemberService.geneAuthCode(member_info), member_info.id) resp['data'] = {"token": token} return jsonify(resp)
def ops(): resp = {'code': 200, 'msg': '用户修改成功', 'data': {}} res = request.values act = res['act'] if 'act' in res else '' id = res['id'] if 'id' in res else 0 # 取出参数值 然后 开始 对 值的各种判断 # 1 是否为空,2是否是指定内容 3给了id能否过滤出用户 是否存在 # 判断了各种可能后 才执行后面真正的内容 if not id: resp['code'] = -1 resp['msg'] = '请选择要操作的账号~~' return jsonify(resp) if act not in ['remove', 'recover']: resp['code'] = -1 resp['msg'] = '操作有误,请重试1~~' return jsonify(resp) user_info = User.query.filter_by(uid=id).first() if not user_info: resp['code'] = -1 resp['msg'] = '操作有误,请重试2~~' return jsonify(resp) if act == 'remove': user_info.status = 0 elif act == 'recover': user_info.status = 1 user_info.updated_time = geneTime() db.session.add(user_info) db.session.commit() return jsonify(resp)
def orderOps(): resp = {'code': 200, 'msg': '操作成功~', 'data': {}} req = request.values member_info = g.member_info order_sn = req['order_sn'] if 'order_sn' in req else '' act = req['act'] if 'act' in req else '' pay_order_info = PayOrder.query.filter_by( order_sn=order_sn, member_id=member_info.id).first() if not pay_order_info: resp['code'] = -1 resp['msg'] = "系统繁忙。请稍后再试~~" return jsonify(resp) if act == "cancel": target_pay = PayService() ret = target_pay.closeOrder(pay_order_id=pay_order_info.id) if not ret: resp['code'] = -1 resp['msg'] = "系统繁忙。请稍后再试~~" return jsonify(resp) elif act == "confirm": pay_order_info.express_status = 1 pay_order_info.updated_time = geneTime() db.session.add(pay_order_info) db.session.commit() return jsonify(resp)
def ops(): resp = {'code': 200, 'msg': '修改成功', 'data': {}} req = request.values act = req['act'] if 'act' in req else '' id = req['id'] if 'id' in req else 0 if int(id) < 1: resp['code'] = -1 resp['msg'] = '用户名错误,重新输入' return jsonify(resp) if act not in ['recover', 'remove']: resp['code'] = -1 resp['msg'] = '操作有误,请重新操作' return jsonify(resp) query = Member.query member_info = query.filter_by(id=id).first() if not member_info: resp['code'] = -1 resp['msg'] = '用户不存在' return jsonify(resp) if act == 'remove': member_info.status = 0 elif act == 'recover': member_info.status = 1 member_info.updated_time = geneTime() db.session.add(member_info) db.session.commit() return jsonify(resp)
def ops(): resp = {'code': 200, 'msg': '操作成功~~', 'data': {}} req = request.values id = req['id'] if 'id' in req else 0 act = req['act'] if 'act' in req else '' if not id: resp['code'] = -1 resp['msg'] = "请选择要操作的账号~~" return jsonify(resp) if act not in ['remove', 'recover']: resp['code'] = -1 resp['msg'] = "操作有误,请重试~~" return jsonify(resp) food_info = Food.query.filter_by(id=id).first() if not food_info: resp['code'] = -1 resp['msg'] = "指定美食不存在~~" return jsonify(resp) if act == "remove": food_info.status = 0 elif act == "recover": food_info.status = 1 food_info.updated_time = geneTime() db.session.add(food_info) db.session.commit() return jsonify(resp)
def setItems(member_id=0, food_id=0, number=0): if member_id < 1 or food_id < 1 or number < 1: return False cart_info = MemberCart.query.filter_by(food_id=food_id, member_id=member_id).first() if cart_info: model_cart = cart_info else: model_cart = MemberCart() model_cart.member_id = member_id model_cart.created_time = geneTime() model_cart.food_id = food_id model_cart.quantity = number model_cart.updated_time = geneTime() db.session.add(model_cart) db.session.commit() return True
def addQueue(queue_name, data=None): model_queue = QueueList() model_queue.queue_name = queue_name if data: model_queue.data = json.dumps(data) model_queue.created_time = model_queue.updated_time = geneTime() db.session.add(model_queue) db.session.commit() return True
def addErrorLog(content): target = AppErrorLog() target.referer_url = request.referrer target.target_url = request.url target.query_params = json.dumps(request.values.to_dict()) target.content = content target.created_time = geneTime() db.session.add(target) db.session.commit() return True
def addAccessLog(): target = AppAccessLog() target.referer_url = request.referrer target.target_url = request.url target.query_params = json.dumps(request.values.to_dict()) target.ua = request.headers.get('user_agent') target.ip = request.remote_addr if 'current_user' in g and g.current_user is not None: target.uid = g.current_user.uid target.created_time = geneTime() db.session.add(target) db.session.commit() return True
def memberShare(): resp = {'code': 200, 'msg': '操作成功~', 'data': {}} req = request.values url = req['url'] if 'url' in req else '' member_info = g.member_info model_share = WxShareHistory() if member_info: model_share.member_id = member_info.id model_share.share_url = url model_share.created_time = geneTime() db.session.add(model_share) db.session.commit() return jsonify(resp)
def addPayCallbackData(self, pay_order_id=0, type='pay', data=''): model_callback = PayOrderCallbackData() model_callback.pay_order_id = pay_order_id if type == "pay": model_callback.pay_data = data model_callback.refund_data = '' else: model_callback.refund_data = data model_callback.pay_data = '' model_callback.created_time = model_callback.updated_time = geneTime() db.session.add(model_callback) db.session.commit() return True
def orderSuccess(self, pay_order_id=0, params=None): try: pay_order_info = PayOrder.query.filter_by(id=pay_order_id).first() if not pay_order_info or pay_order_info.status not in [-8, -7]: return True pay_order_info.pay_sn = params[ 'pay_sn'] if params and 'pay_sn' in params else '' pay_order_info.status = 1 pay_order_info.express_status = -7 pay_order_info.updated_time = geneTime() db.session.add(pay_order_info) pay_order_items = PayOrderItem.query.filter_by( pay_order_id=pay_order_id).all() for order_item in pay_order_items: tmp_model_sale_log = FoodSaleChangeLog() tmp_model_sale_log.food_id = order_item.food_id tmp_model_sale_log.quantity = order_item.quantity tmp_model_sale_log.price = order_item.price tmp_model_sale_log.member_id = order_item.member_id tmp_model_sale_log.created_time = geneTime() db.session.add(tmp_model_sale_log) db.session.commit() except Exception as e: db.session.rollback() print(e) return False # 加入通知队列,做消息提醒和 QueueService.addQueue( "pay", { "member_id": pay_order_info.member_id, "pay_order_id": pay_order_info.id }) return True
def setStockChangeLog( food_id = 0,quantity = 0,note = '' ): if food_id < 1: return False food_info = Food.query.filter_by( id = food_id ).first() if not food_info: return False model_stock_change = FoodStockChangeLog() model_stock_change.food_id = food_id model_stock_change.unit = quantity model_stock_change.total_stock = food_info.stock model_stock_change.note = note model_stock_change.created_time = geneTime() db.session.add(model_stock_change) db.session.commit() return True
def set(): if request.method == 'GET': resp_data = {} req = request.args query = Member.query id = req['id'] if 'id' in req else 0 if int(id) < 1: return redirect(UrlManager.buildUrl('/member/index')) member_info = query.filter_by(id=id).first() if not member_info: return redirect(UrlManager.buildUrl('/member/index')) resp_data['member_info'] = member_info resp_data['current'] = 'set' return ops_render('member/set.html', resp_data) query = Member.query resp = {'code': 200, 'msg': '修改成功', 'data': {}} req = request.values nickname = req['nickname'] if 'nickname' in req else '' id = req['id'] if 'id' in req else 0 if int(id) < 1: resp['code'] = -1 resp['msg'] = '用户名错误,重新输入' return jsonify(resp) if not nickname: resp['code'] = -1 resp['msg'] = '用户名错误,重新输入' return jsonify(resp) member_info = query.filter_by(id=id).first() if not member_info: resp['code'] = -1 resp['msg'] = '用户不存在' return jsonify(resp) member_info.nickname = nickname member_info.updated_time = geneTime() db.session.add(member_info) db.session.commit() return jsonify(resp)
def createOrder(self, member_id, items=None, params=None): resp = {'code': 200, 'msg': '操作成功~', 'data': {}} pay_price = decimal.Decimal(0.00) continue_cnt = 0 food_ids = [] for item in items: if decimal.Decimal(item['price']) < 0: continue_cnt += 1 continue pay_price = pay_price + decimal.Decimal(item['price']) * int( item['number']) food_ids.append(item['id']) if continue_cnt >= len(items): resp['code'] = -1 resp['msg'] = '商品items为空~~' return resp yun_price = params[ 'yun_price'] if params and 'yun_price' in params else 0 note = params['note'] if params and 'note' in params else '' express_address_id = params[ 'express_address_id'] if params and 'express_address_id' in params else 0 express_info = params[ 'express_info'] if params and 'express_info' in params else {} print('express_info', type(express_info)) yun_price = decimal.Decimal(yun_price) total_price = pay_price + yun_price try: # 为了防止并发库存出问题了,我们坐下selectfor update, 这里可以给大家演示下 tmp_food_list = db.session.query(Food).filter(Food.id.in_(food_ids)) \ .with_for_update().all() tmp_food_stock_mapping = {} for tmp_item in tmp_food_list: tmp_food_stock_mapping[tmp_item.id] = tmp_item.stock model_pay_order = PayOrder() model_pay_order.order_sn = self.geneOrderSn() model_pay_order.member_id = member_id model_pay_order.total_price = total_price model_pay_order.yun_price = yun_price model_pay_order.pay_price = pay_price model_pay_order.note = note model_pay_order.status = -8 model_pay_order.express_status = -8 model_pay_order.express_address_id = express_address_id model_pay_order.express_info = json.dumps(express_info) model_pay_order.updated_time = model_pay_order.created_time = geneTime( ) db.session.add(model_pay_order) # db.session.flush() for item in items: tmp_left_stock = tmp_food_stock_mapping[item['id']] if decimal.Decimal(item['price']) < 0: continue if int(item['number']) > int(tmp_left_stock): raise Exception("您购买的这美食太火爆了,剩余:%s,你购买%s~~" % (tmp_left_stock, item['number'])) tmp_ret = Food.query.filter_by(id=item['id']).update( {"stock": int(tmp_left_stock) - int(item['number'])}) if not tmp_ret: raise Exception("下单失败请重新下单") tmp_pay_item = PayOrderItem() tmp_pay_item.pay_order_id = model_pay_order.id tmp_pay_item.member_id = member_id tmp_pay_item.quantity = item['number'] tmp_pay_item.price = item['price'] tmp_pay_item.food_id = item['id'] tmp_pay_item.note = note tmp_pay_item.updated_time = tmp_pay_item.created_time = geneTime( ) db.session.add(tmp_pay_item) # db.session.flush() FoodService.setStockChangeLog(item['id'], -item['number'], "在线购买") db.session.commit() resp['data'] = { 'id': model_pay_order.id, 'order_sn': model_pay_order.order_sn, 'total_price': str(total_price) } except Exception as e: db.session.rollback() print(e) resp['code'] = -1 resp['msg'] = "下单失败请重新下单" resp['msg'] = str(e) return resp return resp
def myAddressSet(): resp = {'code': 200, 'msg': '操作成功~', 'data': {}} req = request.values id = int(req['id']) if 'id' in req and req.get('id') != 'undefined' else 0 nickname = req['nickname'] if 'nickname' in req else '' address = req['address'] if 'address' in req else '' mobile = req['mobile'] if 'mobile' in req else '' province_id = int(req['province_id']) if ('province_id' in req and req['province_id']) else 0 province_str = req['province_str'] if 'province_str' in req else '' city_id = int(req['city_id']) if ('city_id' in req and req['city_id']) else 0 city_str = req['city_str'] if 'city_str' in req else '' district_id = int(req['district_id']) if ('district_id' in req and req['district_id']) else 0 district_str = req['district_str'] if 'district_str' in req else '' member_info = g.member_info if not nickname: resp['code'] = -1 resp['msg'] = "请填写联系人姓名~~" return jsonify(resp) if not mobile: resp['code'] = -1 resp['msg'] = "请填写手机号码~~" return jsonify(resp) if province_id < 1: resp['code'] = -1 resp['msg'] = "请选择地区~~" return jsonify(resp) if city_id < 1: resp['code'] = -1 resp['msg'] = "请选择地区~~" return jsonify(resp) if district_id < 1: district_str = '' if not address: resp['code'] = -1 resp['msg'] = "请填写详细地址~~" return jsonify(resp) if not member_info: resp['code'] = -1 resp['msg'] = "系统繁忙,请稍后再试~~" return jsonify(resp) address_info = MemberAddress.query.filter_by( id=id, member_id=member_info.id).first() if address_info: model_address = address_info else: MemberAddress.query.filter_by(is_default=1, member_id=member_info.id, status=1).update({'is_default': 0}) model_address = MemberAddress() model_address.member_id = member_info.id model_address.is_default = 1 model_address.created_time = geneTime() model_address.nickname = nickname model_address.mobile = mobile model_address.address = address model_address.province_id = province_id model_address.province_str = province_str model_address.city_id = city_id model_address.city_str = city_str model_address.area_id = district_id model_address.area_str = district_str model_address.updated_time = geneTime() db.session.add(model_address) db.session.commit() return jsonify(resp)
def set(): default_pwd = '******' if request.method == 'GET': resq_data = {} res = request.args uid = res.get('id', 0) user_info = None if uid: user_info = User.query.filter_by(uid=uid).first() resq_data['user_info'] = user_info return ops_render('account/set.html', resq_data) resp = {'code': 200, 'msg': '用户创建成功', 'data': {}} res = request.values nickname = res['nickname'] if 'nickname' in res else False if nickname is None or nickname: resp['code'] = -1 resp['msg'] = '用户名错误,重新输入' return jsonify(resp), 400 id = res['id'] if 'id' in res else 0 mobile = res['mobile'] if 'mobile' in res else False if mobile is None or mobile: resp['code'] = -1 resp['msg'] = 'email错误,重新输入' return jsonify(resp), 400 email = res['email'] if 'email' in res else False if email is None or email: resp['code'] = -1 resp['msg'] = 'email错误,重新输入' return jsonify(resp), 400 login_name = res['login_name'] if 'login_name' in res else False if login_name is None or login_name: resp['code'] = -1 resp['msg'] = '登录名错误,重新输入' return jsonify(resp), 400 login_pwd = res['login_pwd'] if 'login_pwd' in res else False if login_pwd is None or login_pwd: resp['code'] = -1 resp['msg'] = '登录名错误,重新输入' return jsonify(resp), 400 has_in = User.query.filter(User.login_name == login_name, User.uid != id).first() if has_in: resp['code'] = -1 resp['msg'] = '用户名已存在,重新输入' return jsonify(resp), 400 model_user = User.query.filter_by(uid=id).first() if model_user: user_info = model_user else: user_info = User() user_info.created_time = geneTime() login_salt = UserService.geneSalt() user_info.login_salt = login_salt user_info.nickname = nickname user_info.mobile = mobile user_info.email = email user_info.login_name = login_name if default_pwd != login_pwd: user_info.login_pwd = UserService.genePwd(login_pwd, user_info.login_salt) user_info.updated_time = geneTime() db.session.add(user_info) db.session.commit() return jsonify(resp)
def set(): if request.method == "GET": resp_data = {} req = request.args id = int(req.get('id', 0)) info = Food.query.filter_by(id=id).first() if info and info.status != 1: return redirect(UrlManager.buildUrl("/food/index")) cat_list = FoodCat.query.all() resp_data['info'] = info resp_data['cat_list'] = cat_list resp_data['current'] = 'index' return ops_render("food/set.html", resp_data) resp = {'code': 200, 'msg': '操作成功~~', 'data': {}} req = request.values id = int(req['id']) if 'id' in req and req['id'] else 0 cat_id = int(req['cat_id']) if 'cat_id' in req else 0 name = req['name'] if 'name' in req else '' price = req['price'] if 'price' in req else '' main_image = req['main_image'] if 'main_image' in req else '' summary = req['summary'] if 'summary' in req else '' stock = int(req['stock']) if 'stock' in req else '' tags = req['tags'] if 'tags' in req else '' if cat_id < 1: resp['code'] = -1 resp['msg'] = "请选择分类~~" return jsonify(resp) if name is None or len(name) < 1: resp['code'] = -1 resp['msg'] = "请输入符合规范的名称~~" return jsonify(resp) if not price or len(price) < 1: resp['code'] = -1 resp['msg'] = "请输入符合规范的售卖价格~~" return jsonify(resp) price = Decimal(price).quantize(Decimal('0.00')) if price <= 0: resp['code'] = -1 resp['msg'] = "请输入符合规范的售卖价格~~" return jsonify(resp) if main_image is None or len(main_image) < 3: resp['code'] = -1 resp['msg'] = "请上传封面图~~" return jsonify(resp) if summary is None or len(summary) < 3: resp['code'] = -1 resp['msg'] = "请输入图书描述,并不能少于10个字符~~" return jsonify(resp) if stock < 1: resp['code'] = -1 resp['msg'] = "请输入符合规范的库存量~~" return jsonify(resp) if tags is None or len(tags) < 1: resp['code'] = -1 resp['msg'] = "请输入标签,便于搜索~~" return jsonify(resp) food_info = Food.query.filter_by(id=id).first() before_stock = 0 if food_info: model_food = food_info before_stock = model_food.stock else: model_food = Food() model_food.status = 1 model_food.created_time = geneTime() model_food.cat_id = cat_id model_food.name = name model_food.price = price model_food.main_image = main_image model_food.summary = summary model_food.stock = stock model_food.tags = tags model_food.updated_time = geneTime() db.session.add(model_food) ret = db.session.commit() FoodService.setStockChangeLog(model_food.id, int(stock) - int(before_stock), "后台修改") return jsonify(resp)