コード例 #1
0
    def POST(self):
        web.header("Content-Type", "application/json")

        param = web.input(session_id='', node_id='',
                          include_me='0')  # include_me == 1 同时返回当前节点数据

        print param

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -2, 'msg': '无效的session_id'})

        if param.node_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        ret_data = []

        child_data = find_child(ObjectId(param['node_id']), param.include_me)

        for i in child_data:
            ret_data.append({
                '_id': str(i['_id']),
                'text': i['text'],
                'position': i['position'],
                'child': i['child'],
                'node_prop': i.get('node_prop', ''),  # 节点属性 2018-08-14
                'node_weight': i.get('node_weight', '1'),  # 节点权重 2018-08-14
            })

        print ret_data

        return json.dumps({'ret': 0, 'data': ret_data})
コード例 #2
0
ファイル: get_settings.py プロジェクト: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='')

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)
        if uname:
            db_shop = db.base_shop.find_one(
                {'_id': ObjectId(setting.default_shop)}, {'name': 1})

            # 返回全局参数
            return json.dumps({
                'ret': 0,
                'data': {
                    'free_delivery': '%.2f' % app_helper.free_delivery,
                    'first_promote': '%.2f' % app_helper.first_promote,
                    'cod_enable': False,
                    'image_host': '/static/image/product',
                    'image_host2':
                    'http://%s/image/product' % setting.image_host,
                    'banner': app_helper.BANNER['c001'],
                    'default_shop': setting.default_shop,  # 返回默认站店
                    'default_name': db_shop['name'] if db_shop else '',
                    'phone_number': uname['uname'],
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
コード例 #3
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', order_id='', star='')

		if '' in (param.order_id, param.star):
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 订单打分
			db.order_app.update_one({'order_id' : param.order_id, 'user':{'$in':uname.values()}},{
				'$set'  : { 'star': int(param.star) },
				'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '订单打分')},
			})
			return json.dumps({'ret' : 0, 'msg' : '订单已打分!'})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
コード例 #4
0
ファイル: order_checkout.py プロジェクト: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          shop_id='',
                          order_id='',
                          addr_id='',
                          coupon_id='',
                          cart='')

        if '' in (param.shop_id, param.addr_id, param.cart):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        print param

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            ret_json = checkout(uname, param)

            print ret_json

            return json.dumps(ret_json)
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
コード例 #5
0
    def POST(self):
        web.header("Content-Type", "application/json")

        param = web.input(session_id='', note_code='', version='')
        print param

        if param.session_id=='':
            return json.dumps({'ret' : -1, 'msg' : 'session参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret' : -2, 'msg' : '无效的session_id'})

        if param.note_code=='':
            return json.dumps({'ret':-2, 'msg':'参数错误'})

        # 先指定版本查找,未找到则不指定版本,只按索引号找 2019-02-02
        r2 = db.notes.find_one({'note_code':param['note_code'].upper(), 'version' : param['version']}) # 索引编码大写,
        if r2 is None:
            print 'NOT FOUND NOTE with version'
            r2 = db.notes.find_one({'note_code':param['note_code'].upper()}) # 索引编码大写
            if r2 is None:
                print 'NOT FOUND NOTE'
                return json.dumps({'ret':-3, 'msg':'未找到注释内容!'})

        ret_data = {
            'note_code' : r2['note_code'],
            'content'   : r2['note_content'],
        }

        return json.dumps({'ret':0,'data':ret_data})
コード例 #6
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='', cate_id='')

        print param

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -2, 'msg': '无效的session_id'})

        if param.cate_id == '':
            # 根目录
            data = get_list()
            # 记录点击
            app_helper.click_inc()
        else:
            data = get_list2(param.cate_id)

        print data

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'data': data,
            }
        })
コード例 #7
0
ファイル: doct.py プロジェクト: jack139/cnnc
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='', page_id='', page_code='')

        print param

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -2, 'msg': '无效的session_id'})

        if param['page_id'] == '' and param['page_code'] == '':
            return json.dumps({'ret': -3, 'msg': '参数错误'})

        if len(param['page_code']) > 0:
            r1 = db.pages.find_one(
                {
                    'page_code': param['page_code'].upper(),
                    #'page_type' : 0,
                    'available': 1
                },
                {'history': 0})
            if r1 is None:
                r1 = db.pages.find_one(
                    {
                        'page_code':
                        param['page_code'].upper() + '#1',  # 加 '#1' 再试一次
                        #'page_type' : 0,
                        'available': 1
                    },
                    {'history': 0})
                if r1 is None:
                    return json.dumps({'ret': -4, 'msg': '页面不可用!'})
        else:
            r1 = db.pages.find_one({'_id': ObjectId(param['page_id'])},
                                   {'history': 0})
            if r1 is None:
                return json.dumps({'ret': -4, 'msg': '页面不可用!'})

        r1['_id'] = str(r1['_id'])

        r2 = db.nodes.find_one({'_id': ObjectId(r1['start_node'])})
        if r2 is None:
            return json.dumps({'ret': -5, 'msg': '页面数据错误!'})

        if len(r2.get('child', [])) > 0:
            r1['type'] = 'map'  # 显示规则树
        else:
            r1['type'] = 'text'  # 显示纯文本

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'data': r1,
            }
        })
コード例 #8
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='', object_id='')

        if param.object_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session_id'})

        #--------------------------------------------------

        if param.object_id[0] == '1':  # 课程
            r3 = db.obj_store.find_one({'obj_id': param.object_id})
        else:  # 专辑
            r3 = db.topic_store.find_one({'tpc_id': param.object_id})
        if r3 is None:
            return json.dumps({'ret': -5, 'msg': '错误的object_id'})

        if len(r3['image']) > 0:  # 取第1张图,
            image_url = app_helper.image_url(r3['image'][0])
        else:
            image_url = ''

        #专辑里面的视频音频分享
        #   http://wxpretty.f8cam.com/static/wx/test2/albumMedia.html?object_id=10000053&object_id_album=20000054
        #专辑分享
        #   http://wxpretty.f8cam.com/static/wx/test2/testAlbum.html?object_id=20000037
        #视频分享:
        #   http://wxpretty.f8cam.com/static/wx/test2/test.html?object_id=10000036
        #if param.object_id[0]=='1': # 课程
        #    if r3['obj_type']=='topic':  # 专辑课程
        #        share_url = 'http://%s/static/wx/test2/albumMedia.html?'\
        #            'object_id=%s&object_id_album=%s'%(setting.wx_host,r3['obj_id'],r3['tpc_id'])
        #    else:
        #        share_url = 'http://%s/static/wx/test2/test.html?object_id=%s'%(setting.wx_host,r3['obj_id'])
        #else: # 专辑
        #    share_url = 'http://%s/static/wx/test2/testAlbum.html?object_id=%s'%(setting.wx_host,r3['tpc_id'])

        ret_data = {
            "object_id": param.object_id,  # 唯一代码 
            "type": 1 if param.object_id[0] == '1' else 2,  # 类型: 1 课程, 2 专辑 
            "share_title": r3['title'],
            "share_content": r3['description'],
            "share_img": image_url,  # 分享图片 
            #"share_url"     : share_url,  # 分享的链接
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
コード例 #9
0
ファイル: addr_modify.py プロジェクト: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          addr_id='',
                          name='',
                          tel='',
                          addr='')

        if '' in (param.addr_id, param.name, param.tel, param.addr):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            # 需要判断地址是否有对应门店,否则不在送货范围内
            # app_helper.check_address()

            # 查找并修改收货地址
            r = db.app_user.find_one({'openid': uname['openid']},
                                     {'address': 1})

            new_addr = []
            for i in r['address']:
                if i[0] == param.addr_id:
                    new_addr.append(
                        (param.addr_id, param.name.strip(), param.tel.strip(),
                         param.addr.strip(), int(time.time())))
                else:
                    new_addr.append(i)

            r = db.app_user.update_one({'openid': uname['openid']},
                                       {'$set': {
                                           'address': new_addr
                                       }})

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'addr_id': param.addr_id,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
コード例 #10
0
ファイル: tnm_check.py プロジェクト: jack139/cnnc
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='', page_id='',
                          tnm='')  # tnm 只包含选择的那项分期因素

        print param

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -2, 'msg': '无效的session_id'})

        if param['page_id'] == '':
            return json.dumps({'ret': -3, 'msg': '参数错误'})

        if param['tnm'] == '':
            return json.dumps({'ret': -5, 'msg': '参数错误'})

        tnm = json.loads(param['tnm'])

        r1 = db.tnm.find_one({'_id': ObjectId(param['page_id'])},
                             {'history': 0})
        if r1 is None:
            return json.dumps({'ret': -4, 'msg': '页面不可用!'})

        # 下一个可用分期因素
        ret_list = []

        tnm_name = tnm.get('tnm_name', '')
        tnm_code = tnm.get('tnm_code', '')

        if tnm_name in TNM_NAME:
            next_tnm = TNM_NAME[TNM_NAME.index(tnm_name) + 1]

            for i in r1['stage']:
                if tnm_code in i[tnm_name]['val']:
                    ret_list.extend(i[next_tnm]['val'])

        print ret_list

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'next_tnm': next_tnm,
                'next_list': ret_list,
            }
        })
コード例 #11
0
ファイル: personal_save.py プロジェクト: jack139/pretty
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='',
                          nickname='',
                          headimage='',
                          image_type='')

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session_id'})

        #--------------------------------------------------

        update_set = {}

        if len(param['nickname']) > 0:
            update_set['nickname'] = param['nickname']

        if len(param['headimage']) > 0:
            if param['image_type'].upper() not in ('JPG', 'PNG'):
                return json.dumps({'ret': -5, 'msg': 'image_type取值错误'})

            data = urllib.unquote_plus(param['headimage'])
            #print data
            #print len(data)

            # 保存图片
            filename = app_helper.write_image(param['image_type'], data)
            update_set['img_url'] = app_helper.image_url(filename)  # 图片url

        if len(update_set) > 0:
            # 只保存在手机号码账户里 type==1
            db.app_user.update_one({
                'userid': uname['userid'],
                'type': 1
            }, {'$set': update_set})

        # 获取当前设置
        r4 = app_helper.get_user_detail(uname['userid'])

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'headimage_url': r4['img_url'],
            }
        })
コード例 #12
0
ファイル: cate.py プロジェクト: jack139/cnnc
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='', parent_id='')

        print param

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -2, 'msg': '无效的session_id'})

        data = []
        last_dir_id = ''
        last_dir_name = ''
        if param['parent_id'] != '':  # 准备显示目录页
            # 子目录
            deepin = True
            db_obj = db.pages.find_one({'_id': ObjectId(param.parent_id)})
            if db_obj:
                if db_obj.get('dir_name') == u'筛查':  # 筛查单列,文件夹作为根目录 2020-04-26
                    deepin = False
                    # 记录点击
                    app_helper.click_inc()
                else:
                    last_dir_id = str(db_obj['parent_id'])
                    last_dir_name = db_obj['dir_name']

            data = get_list(param['parent_id'], deepin)
        else:
            # 根目录
            data = get_list(param['parent_id'], False)
            # 记录点击
            app_helper.click_inc()

        for i in data:
            i['rich_text'] = ''

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'data': data,
                'parent_id': param['parent_id'],
                'last_dir_id': last_dir_id,
                'last_dir_name': last_dir_name
            }
        })
コード例 #13
0
ファイル: personal_info.py プロジェクト: jack139/pretty
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='')

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session_id'})

        #--------------------------------------------------

        r4 = app_helper.get_user_detail(uname['userid'])

        ret_data = {
            "name":
            r4['nickname'],
            "image":
            r4['img_url'],  # 用户头像 
            "tel":
            r4['mobile'],  # 用户注册手机号 
            "user_type":
            uname['type'],  # 用户类型
            # 店员信息
            "shop_name":
            r4.get('shop_name', ''),
            "real_name":
            r4.get('real_name', ''),
            "shop_nickname":
            r4.get('shop_nickname', ''),
            "contact_info":
            r4.get('contact_info', ''),
            # 店主信息
            "licence_pic":
            app_helper.image_url(r4['licence_pic'])
            if r4.get('licence_pic', '') != '' else '',
            "shop_pic":
            [app_helper.image_url(x) for x in r4.get('shop_pic', [])],
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
コード例 #14
0
ファイル: list_banner.py プロジェクト: jack139/pretty
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='')

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session_id'})

        #--------------------------------------------------
        now_tick = int(time.time())

        # 拉取符合条件的banner, 时间区间,是否可用
        r2 = db.banner_info.find(
            {
                'available':
                1,
                '$and': [{
                    'start_tick': {
                        '$lt': now_tick
                    }
                }, {
                    'expire_tick': {
                        '$gt': now_tick
                    }
                }],
            },
            sort=[('sort_weight', 1)])

        banner_data = []
        for i in r2:
            banner_data.append({
                'image': app_helper.image_url(i['image']),
                'click': i['click_url'],
            })

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'banner': banner_data,
            }
        })
コード例 #15
0
ファイル: coupon_list.py プロジェクト: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='')

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']},
                                           {'coupon': 1})
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            # 这里应该增加对有效期的检查!!!
            coupon = []
            unused = 0
            for i in db_user['coupon']:
                if app_helper.time_str(format=1) > i[1]:  # 过期抵用券不返回 2015-08-22
                    continue
                coupon.append({
                    'id': i[0],
                    'valid': i[1],
                    'cash': i[2],
                    'status': 'unused' if i[3] == 1 else 'used',
                })
                unused += (1 if i[3] == 1 else 0)

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'coupon': coupon,
                    'total': len(coupon),
                    'unused': unused,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
コード例 #16
0
ファイル: wx.py プロジェクト: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        #print web.input()
        param = web.input(openid='', session_id='', number='')

        if param.number == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            #print 'user_phone', uname
            if len(uname['uname'].strip()) > 0:
                return json.dumps({'ret': -5, 'msg': '已绑定手机号码,不能重复绑定'})

            number = param.number.strip()
            if len(number) < 11 or (not number.isdigit()):
                return json.dumps({'ret': -3, 'msg': '手机号码格式错误'})

            # 随机码
            rand = app_helper.my_rand(base=1)
            register = False

            #发送短信验证码
            sms.send_rand(number, rand, register)

            #临时保存到phone字段
            db.app_user.update({'openid': uname['openid']},
                               {'$set': {
                                   'phone': number,
                                   'rand': rand
                               }})

            # 返回
            return json.dumps({'ret': 0})
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
コード例 #17
0
ファイル: addr_remove.py プロジェクト: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', addr_id='')

        if param.addr_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:

            # 查找并删除收货地址
            r = db.app_user.find_one({'openid': uname['openid']},
                                     {'address': 1})

            new_addr = []
            for i in r['address']:
                if i[0] == param.addr_id:
                    continue
                else:
                    new_addr.append(i)

            r = db.app_user.update_one({'openid': uname['openid']},
                                       {'$set': {
                                           'address': new_addr
                                       }})

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'addr_id': param.addr_id,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
コード例 #18
0
ファイル: addr_list.py プロジェクト: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='')

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']},
                                           {'address': 1})
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            addr = []
            for i in db_user['address']:
                addr.append({
                    'id': i[0],
                    'name': i[1],
                    'tel': i[2],
                    'addr': i[3],
                    'tick': i[4] if len(i) > 4 else 0,
                })

            #print addr
            addr2 = quick(addr)
            #print addr2

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'addr': addr2,
                    'total': len(addr2),
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
コード例 #19
0
    def POST(self):
        web.header("Content-Type", "application/json")

        param = web.input(session_id='',
                          node_id='',
                          correct_note='',
                          source="cnnc")
        print param

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -2, 'msg': '无效的session_id'})

        if param.node_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        db.correct.insert_one({
            'node_id': param['node_id'],
            'note': param['correct_note'],
            'openid': uname['openid'],
            'time_t': app_helper.time_str(),  # 提交时间
            'status': 'WAIT',  # WAIT 等待处理,PASS 接受,NOGO 拒绝
            'source': param['source'],  # 2019-10-29, 区分来源
        })

        if param['source'] == 'tnm':
            r2 = db.tnm.update_one({'_id': ObjectId(param['node_id'])},
                                   {'$set': {
                                       'node_question': True
                                   }})
        else:
            r2 = db.nodes.update_one({'_id': ObjectId(param['node_id'])},
                                     {'$set': {
                                         'node_question': True
                                     }})
        print r2.matched_count, r2.modified_count

        return json.dumps({'ret': 0, 'data': {}})
コード例 #20
0
    def GET(self):
        render = create_render(plain=True)
        param = web.input(code='', state='', appid='')

        if param.code != '':
            #if param.appid!=qy_helper.corpid:
            #    return render.info('appid参数错误!')

            if param.state != 'PASS':
                return render.info('state参数错误!')

            session_id = qy_helper.init_job(param.code)
            if session_id is not None:
                raise web.seeother('/qywx/user_info?session_id=%s' %
                                   session_id)  # 初次进入跳转
            else:
                return render.info('code参数错误!')

        if param.session_id == '':
            return render.info('请用企业维修登录!')

        # session登录后进入
        uname = app_helper.wx_logged(param.session_id)

        if uname is None:
            return render.info('无效的session_id!')

        r2 = app_user_helper.get_user_info(uname['openid'], q_type='openid')
        if r2 is None:
            return render.info('未找到用户信息,请联系管理员!')

        user_info = {
            'career_code': r2['career_code'],
            'name': r2['wx_info']['name'],
            'mobile': r2['wx_info']['mobile'],
            'email': r2['wx_info']['email'],
            'user_id': r2['openid'],
        }

        return render.user_info(param.session_id, user_info)
コード例 #21
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', order_id='')

		if param.order_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 获得订单
			db_order = db.order_app.find_one(
				{'order_id' : param.order_id, 'user': {'$in':uname.values()}},
				{'status':1, 'cart':1, 'due':1, 'shop':1}
			)
			if db_order==None:
				return json.dumps({'ret' : -3, 'msg' : '未找到订单!'})
			elif db_order['status']!='DUE':
				return json.dumps({'ret' : -3, 'msg' : '不是待付款订单!'})

			# 取消订单
			db.order_app.update_one({'order_id' : param.order_id,},{
				'$set'  : { 'status':'CANCEL' },
				'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '取消账单')},
			})
			return json.dumps({'ret' : 0, 'msg' : '订单已取消!'})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
コード例 #22
0
ファイル: order_paid.py プロジェクト: jack139/pretty
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='', order_trade_id='', data='')

        if param.order_trade_id=='':
            return json.dumps({'ret' : -2, 'msg' : '参数错误'})

        if param.session_id=='':
            return json.dumps({'ret' : -1, 'msg' : 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret' : -4, 'msg' : '无效的session_id'})

        #--------------------------------------------------


        # 修改充值订单状态
        r2 = db.order_recharge.find_one_and_update(
            {'recharge_id' : param.order_trade_id},  # 实充值订单号
            {
                '$set' : {'status':'PREPAY'},
                '$push' : {'order_paid_data':param.data},
            },
        )

        ret_data = {
            "order_trade_id" : param.order_trade_id,
            "due"      : r2['due'],         # 应付金额,单位 分
            "paid"     : r2['due'],         # 实付金额 
            "status"   : "PENDING",     # 订单状态:PAID/PENDING 已支付/未支付
        }

        # 返回
        return json.dumps({
            'ret'  : 0,
            'data' : ret_data,
        })
コード例 #23
0
ファイル: cash_info.py プロジェクト: jack139/pretty
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='')

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session_id'})

        #--------------------------------------------------

        r2 = credit_helper.check_balance(uname['userid'])

        ret_data = {
            "cash": r2,  # 余额 单位 分 
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
コード例 #24
0
ファイル: api_router.py プロジェクト: jack139/fair
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='',session_id='')

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)
		if uname:
			# 返回host地址、端口
			host = setting.app_pool[random.randint(0,len(setting.app_pool)-1)]
			print 'host = ', host
			return json.dumps({'ret' : 0, 'data' : {
				'protocol' : 'http',
				#'host'     : setting.app_host, #'app.urfresh.cn',
				'host'     : host,
				'port'     : '12050',
			}})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
コード例 #25
0
ファイル: cash_log.py プロジェクト: jack139/pretty
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='')

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session_id'})

        #--------------------------------------------------

        r2 = db.order_trade.find({'userid': uname['userid']},
                                 sort=[('_id', -1)])

        orders = []
        for i in r2:
            if i['trade_type'] == 'consume':
                sign = -1
            else:
                sign = 1
            orders.append({
                "action": i['comment'],
                "cash": i['total_sum'] * sign,  # 金额,单位 分
                "date": i['pay_time'],  # 发生时间 
                "order_id": i['order_trade_id'],  # 订单号
            })

        ret_data = {"order": orders}

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
コード例 #26
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='',session_id='')

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1,'credit':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 返回
			return json.dumps({'ret' : 0, 'data' : {
				'credit'  : '%.2f' % db_user.get('credit', 0.0)
			}})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
コード例 #27
0
ファイル: list_try.py プロジェクト: jack139/pretty
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='',
                          category='',
                          page_size='',
                          page_index='')

        if '' in (param.page_size, param.page_index):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session_id'})

        #--------------------------------------------------
        cate_id = param['category'].strip(
        ) if param['category'].strip() != '' else app_helper.DEFAULT_CATEGORY

        r2 = db.online_cate_obj.find({
            'cate_id': cate_id,
            'available': 1,
        },
                                     sort=[('sort_weight', 1)])

        obj_list = [i['obj_id'] for i in r2]

        r3 = db.obj_store.find({
            'obj_id': {
                '$in': obj_list
            },
            'try_time': {
                '$gt': 0
            },
        })

        obj_data = {}
        for i in r3:
            obj_data[i['obj_id']] = i

        # 所有试听数据
        try_obj_list = []
        for i in obj_list:
            if i not in obj_data.keys():
                continue
            if obj_data[i].get('status') != 'PASSED':  # 审核未通过,应该是上架后又有修改
                continue
            if len(obj_data[i]['image']) > 0:  # 取第1张图
                image_url = app_helper.image_url(obj_data[i]['image'][0])
            else:
                image_url = ''
            try_obj_list.append({
                'object_id':
                obj_data[i]['obj_id'],
                'title':
                obj_data[i]['title'],
                'title2':
                obj_data[i]['title2'],
                'speaker':
                obj_data[i]['speaker'],
                'type':
                1
                if obj_data[i]['media'] == 'video' else 2,  # 1- 视频   2 - 音频  
                'image':
                image_url,
                'length':
                obj_data[i]['length'],  # 长度,单位:秒
                'try_time':
                obj_data[i]['try_time'],  # 试听长度,单位:秒 
            })

        # 取指定区间的
        start_pos = int(param.page_size) * int(param.page_index)
        end_pos = start_pos + int(param.page_size)
        try_obj_list_page = try_obj_list[start_pos:end_pos]

        ret_data = {
            "try": try_obj_list_page,
            "total": len(try_obj_list_page),  # 返回的课程数量,小于 page_size说明到末尾 
            "page_size": param.page_size,  # 分页尺寸,与调用参数相同 
            "page_index": param.page_index,  # 页索引 
        }

        #print ret_data

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
コード例 #28
0
ファイル: order_pay.py プロジェクト: jack139/fair
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', order_id='', pay_type='', data='')
		print param

		if '' in (param.order_id, param.pay_type):
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1, 'credit':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 支付操作:1,记录订单支付,2.改变订单状态,3.修改库存显示 !!!!!!

			# 获得订单
			db_order = db.order_app.find_one(
				{'order_id' : param.order_id},
				#{'status':1, 'cart':1, 'due':1, 'shop':1}
				{'_id':0}
			)
			if db_order==None:
				return json.dumps({'ret' : -3, 'msg' : '未找到订单!'})

			# 支付宝和微信支付订单,已PAID说明提前收到异步通知
			if db_order['status']=='PAID' and param.pay_type in ('ALIPAY','WXPAY'):
				# 记录此次调用
				db.order_app.update_one(
					{
						'order_id' : param.order_id,
					},
					{
						'$set' : { 
							'pay_type'   : param.pay_type,
							'pay'        : db_order['due'],
							'paid2_time' : app_helper.time_str(),
							'paid2_tick' : int(time.time()),
						},
						'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')},
					}
				)
				return json.dumps({'ret' : 0, 'data' : {
					'order_id' : param.order_id,
					'due'      : db_order['due'],
					'paid'     : db_order['due'],
					'status'   : '已支付'
				}})

			# 只能处理未支付订单
			if db_order['status']!='DUE':
				return json.dumps({'ret' : -3, 'msg' : '不是待付款订单!'})

			# 余额支付和支付宝/微信支付未到账处理

			if param.pay_type=='CREDIT':
				# 检查余额是否够支付
				if float(db_order['due'])>db_user.get('credit',0.0):
					return json.dumps({'ret' : -6, 'msg' : '余额不足!'})

				# 使用的优惠券失效
				#db_user = db.app_user.find_one({'uname':r['uname']})

				coupon = []
				if db_order['coupon']!=None:
					for i in db_user['coupon']:
						if i[0]==db_order['coupon'][0]: # 这次使用
							#coupon.append((i[0],i[1],i[2],0))
							i2=list(i)
							i2[3]=0
							coupon.append(i2)
						else:
							coupon.append(i)
				else:
					coupon = db_user['coupon']

				# 更新优惠券
				db.app_user.update_one({'openid':db_order['uname']}, {'$set':{'coupon':coupon}})

				# 正常减库存!
				# item = [ product_id, num, num2, price]
				# k - num 库存数量
				print "修改库存."

				b2 = [] # C端商品
				b3 = [] # B3整箱预售商品
				b3_total = 0.0
				for item in db_order['cart']:
					#r3 = db.sku_store.find_one({'product_id' : item['product_id']},
					#	{'list_in_app':1})
					#if r3['list_in_app']==3: # B3商品不需要改库存
					#	b3_total += float(item['price'])
					#	b3.append(item)
					#	item['title'] = item['title']+u'(整箱预售,次日送达)'
					#	b2.append(item)
					#	continue

					# 买一送一
					if item['product_id'] in app_helper.buy_1_give_1:
						lc_num2 = float(item['num2'])
						item['num2'] = int(lc_num2 + lc_num2)
						item['title'] = item['title'].replace(u'买一送一',u'特惠活动')

					# 过滤数量价格为零的
					if item['num2']==0 and float(item['price'])==0.0:
						continue

					r = db.inventory.find_one_and_update(  # 不检查库存,有可能负库存
						{
							'product_id' : item['product_id'],
							'shop'       : db_order['shop'],
						},
						{ 
							'$inc'  : { 
								'num'         : 0-float(item['num2']), # num2 实际购买数量
							 	'pre_pay_num' : float(item['num2']), # 记录预付数量
							}
							#'$push' : { 'history' : (helper.time_str(), 
							#	helper.get_session_uname(), '售出 %s' % str(item['num']))},
						},
						{'_id':1}
					)
					#print r
					if r==None: # 不应该发生
						return json.dumps({'ret' : -9, 'msg' : '修改库存失败,请联系管理员!'})
					else:
						b2.append(item)

					# 更新第3方库存 2015-10-10
					app_helper.elm_modify_num(db_order['shop'], item['product_id'])

				# 检查是否有b3商品, 3种情况
				# 1. b2, b3 都有,拆单
				# 2. 只有b3,站点改为B3站点,保留收货站点
				# 3. 只有b2,保持订单不变
				#print b2
				#print b3
				if len(b3)>0 and (len(b2)-len(b3))>0: # 情况1
					print "拆单"
					r4 = db_order.copy()
					r4['order_id']     = r4['order_id']+u'-b3'
					r4['shop_0']       = r['shop']
					r4['shop']         = ObjectId(setting.B3_shop)
					r4['cart']         = b3
					r4['status']       = 'PAID'
					r4['ali_trade_no'] = param.get('trade_no')
					r4['paid_time']    = param.get('gmt_payment')
					r4['paid_tick']    = int(time.time())
					r4['history']      = [(app_helper.time_str(), 'credit', '余额付款-拆单')]
					r4['total']        = '%.2f' % b3_total
					r4['cost']         = '0.00'
					r4['coupon_disc']  = '0.00'
					r4['first_disc']   = '0.00'
					r4['delivery_fee'] = '0.00'
					r4['due']          = '0.00'
					db.order_app.insert_one(r4) # 增加子订单
				elif len(b3)>0: # 情况 2
					print "订单改到B3站点"
					db.order_app.update_one({'order_id':param.order_id},{'$set' : {
						'shop_0' : r['shop'],
						'shop'   : ObjectId(setting.B3_shop),
					}})
				else: # 情况3,什么都不做
					print "订单保持不变"

				# 更新销货单信息
				db.order_app.update_one({'order_id' : param.order_id,},{
					'$set' : { 
						'status'     : 'PAID', 
						'cart'       : b2,     # 更新购物车  2015-09-11
						'pay_type'   : param.pay_type,
						'pay'        : db_order['due'],
						'paid_time'  : app_helper.time_str(),
						'paid_tick'  : int(time.time()),
					},
					'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '余额付款')},
				})
				# 消费余额
				db.app_user.update_one({'openid' : uname['openid'],},{
					'$inc' : { 
						'credit'     : 0-float(db_order['due']), 
					},
					'$push' : { 
						'history' : (app_helper.time_str(), uname['openid'], 
							'消费余额 %s' % db_order['due'].encode('utf-8'))
					},
				})
			elif param.pay_type in ('ALIPAY', 'WXPAY'):
				# 更新销货单信息,
				r = db.order_app.find_one_and_update(
					{
						'order_id' : param.order_id,
						'status'   : 'DUE'
					},
					{
						'$set' : { 
							'status'     : 'PREPAID', 
							'pay_type'   : param.pay_type,
							'pay'        : db_order['due'],
							'paid2_time' : app_helper.time_str(),
							'paid2_tick' : int(time.time()),
							'pay_data'   : param.data,
						},
						'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')},
					},
					{'status':1}
				)
				# 如果不是DUE,说明已收到异步通知
				if r==None:
					db.order_app.update_one(
						{
							'order_id' : param.order_id,
						},
						{
							'$set' : { 
								'pay_type'   : param.pay_type,
								'pay'        : db_order['due'],
								'paid2_time' : app_helper.time_str(),
								'paid2_tick' : int(time.time()),
							},
							'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')},
						}
					)

			# 返回
			return json.dumps({'ret' : 0, 'data' : {
				'order_id' : param.order_id,
				'due'      : db_order['due'],
				'paid'     : db_order['due'],
				'status'   : '已支付'
			}})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
コード例 #29
0
ファイル: locate_shop.py プロジェクト: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', type='', data='')

        if param.type == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.type not in ['GPS', 'NAME']:
            return json.dumps({'ret': -3, 'msg': 'type参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            # 准备用户坐标
            if param.type == 'NAME':
                ret, loc = lbs.addr_to_loc(param['data'].encode('utf-8'))
                print ret, loc
                if ret < 0:
                    # 重试一次,网络可能会失败
                    ret, loc = lbs.addr_to_loc(param['data'].encode('utf-8'))
                    print ret, loc
                    if ret < 0:
                        loc = {'lat': 0, 'lng': 0}

            else:
                loc0 = param.data.split(',')  # 31.20474193,121.620708272
                loc = {'lat': float(loc0[0]), 'lng': float(loc0[1])}

            # 找最近距离的店
            min_d = 999999
            min_shop = None
            poly_shop = None  # 多边形匹配
            db_shop = db.base_shop.find(
                {'type': {
                    '$in': ['chain', 'store', 'dark']
                }})
            for s in db_shop:
                if s.get('app_shop', 1) == 0:  # 忽略不支持线上销售的店
                    continue
                #d=lbs.geo_distance(s['loc']['lat'],s['loc']['lng'],loc['lat'],loc['lng'])
                #print 'd = ', d, min_d
                #if d<s.get('radius', 2) and d<min_d: # 默认半径2公里
                #	min_d=d
                #	min_shop=(s['_id'],s['name'],s['address'])

                # 多边形检查
                poly = s.get('poly_xy', [])
                if len(poly) == 0:  # 没有多边形数据
                    print "缺少多边形数据!"
                    continue
                if lbs.wn_PnPoly((loc['lat'], loc['lng']), poly) != 0:
                    print 'bingo! poly_shop'
                    poly_shop = (s['_id'], s['name'], s['address'])
                    break

            if poly_shop == None and min_shop == None:
                print '不在配送范围内'
                return json.dumps({'ret': -6, 'msg': '不在配送范围内'})

            if poly_shop == None:
                # 返回最近shop
                print 'choose:', min_shop[1].encode('utf-8')
                return json.dumps({
                    'ret': 0,
                    'data': {
                        'shop_id': str(min_shop[0]),
                        'shop_name': min_shop[1],
                        'address': min_shop[2],
                    }
                })
            else:
                # 返回多边形匹配shop
                print 'choose:', poly_shop[1].encode('utf-8')
                return json.dumps({
                    'ret': 0,
                    'data': {
                        'shop_id': str(poly_shop[0]),
                        'shop_name': poly_shop[1],
                        'address': poly_shop[2],
                    }
                })

        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
コード例 #30
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(session_id='', page_size='', page_index='')

        if '' in (param.page_size, param.page_index):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.session_id == '':
            return json.dumps({'ret': -1, 'msg': 'session_id参数错误'})

        uname = app_helper.wx_logged(param.session_id)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session_id'})

        #--------------------------------------------------

        course_list = []

        # 用户自己买的课程
        r2 = db.user_property.find(
            {
                'userid': uname['userid'],
                'status': 'paid',
                'obj_type': 'course'
            },
            sort=[('_id', 1)],  # 按时间倒序
            #skip=int(param.page_size)*int(param.page_index),
            #limit=int(param.page_size)
        )

        course_list = [x['obj_id'] for x in r2]

        # 被授权的课程
        r4 = db.employee_auth.find({'employee_userid': uname['userid']})
        for x in r4:
            for y in x['object_list']:
                if y not in course_list:
                    course_list.append(y)

        # 取指定区间的
        start_pos = int(param.page_size) * int(param.page_index)
        end_pos = start_pos + int(param.page_size)
        course_list = course_list[start_pos:end_pos]

        course_data = []

        for i in course_list:
            r3 = db.obj_store.find_one({'obj_id': i})
            if r3 is None:
                continue

            if len(r3['image']) > 0:  # 取第1张图
                image_url = app_helper.image_url(r3['image'][0])
            else:
                image_url = ''

            # 已授权店员数,只统计本店主的店员数
            auth_num = db.employee_auth.find({
                'owner_userid': uname['userid'],
                'object_list': r3['obj_id']
            }).count()

            # 测试成绩
            r5 = db.test_info.find_one({
                'userid': uname['userid'],
                'obj_id': r3['obj_id']
            })
            score = r5['score'] if r5 else -1

            # 完成进度
            r6 = db.progress_info.find_one({
                'userid': uname['userid'],
                'obj_id': r3['obj_id']
            })
            progress = r6['progress'] if r6 else 0

            # 是否有测试题
            r7 = db.exam_info.find({
                'obj_id': r3['obj_id'],
                'available': 1
            }).count()

            course_data.append({
                "object_id": r3['obj_id'],  # 内部唯一标识 
                "title": r3['title'],
                "title2": r3['title2'],
                "speaker": r3['speaker'],
                "type": 1 if r3['media'] == 'video' else 2,  # 1- 视频   2 - 音频  
                "image": image_url,  # 课程主图 
                "length": r3['length'],  # 长度,单位:分钟 
                "progress": progress,  # 课程进度百分比,0表示未上课,100表示已上课 
                "exam_score": score,  # 课后测试成绩,-1表示未测试  
                "auth_num": auth_num,  # 已授权店员数 ,
                "have_exam": 1 if r7 > 0 else 0,  # 是否有课后测试,2017-06-09
            })

        ret_data = {
            "course": course_data,
            "total": len(course_data),  # 返回的课程数量,小于 page_size说明到末尾 
            "page_size": param.page_size,  # 分页尺寸,与调用参数相同 
            "page_index": param.page_index,  # 页索引 
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })