@@ -182,12 +182,18 @@ class TourGuideInfo(CreateUpdateMixin):  | 
            ||
| 182 | 182 | 
                return unicode(self.pk)  | 
            
| 183 | 183 | 
                 | 
            
| 184 | 184 | 
                @property  | 
            
| 185 | 
                + def photo_url(self):  | 
            |
| 186 | 
                + return ''  | 
            |
| 187 | 
                +  | 
            |
| 188 | 
                + @property  | 
            |
| 185 | 189 | 
                def data(self):  | 
            
| 186 | 190 | 
                         return {
               | 
            
| 187 | 191 | 
                'name': self.name,  | 
            
| 188 | 192 | 
                'sex': self.sex,  | 
            
| 189 | 193 | 
                'phone': self.phone,  | 
            
| 190 | 194 | 
                'location': self.location,  | 
            
| 195 | 
                + 'no': self.no,  | 
            |
| 196 | 
                + 'photo': self.photo_url,  | 
            |
| 191 | 197 | 
                'status': self.user_status,  | 
            
| 192 | 198 | 
                'refused_reason': self.refused_reason,  | 
            
| 193 | 199 | 
                }  | 
            
                @@ -21,6 +21,10 @@ def tourguide_submit_api(request):  | 
            ||
| 21 | 21 | 
                     openid = request.POST.get('openid', '')
               | 
            
| 22 | 22 | 
                     phone = request.POST.get('phone', '')
               | 
            
| 23 | 23 | 
                 | 
            
| 24 | 
                +    serverIds = request.POST.getlist('serverIds[]', [])
               | 
            |
| 25 | 
                +  | 
            |
| 26 | 
                + # TODO: get tour guide photo from wx server  | 
            |
| 27 | 
                +  | 
            |
| 24 | 28 | 
                if TourGuideInfo.objects.filter(phone=phone).exclude(unionid=unionid).exists():  | 
            
| 25 | 29 | 
                return response(TourGuideStatusCode.TOURGUIDE_PHONE_ALREADY_EXISTS)  | 
            
| 26 | 30 | 
                 | 
            
                @@ -18,6 +18,10 @@  | 
            ||
| 18 | 18 | 
                             input:required:valid {
               | 
            
| 19 | 19 | 
                color: rgb(0, 0, 0);  | 
            
| 20 | 20 | 
                }  | 
            
| 21 | 
                +            #tour_guide_photo {
               | 
            |
| 22 | 
                + width: 60%;  | 
            |
| 23 | 
                + margin-left: 20%;  | 
            |
| 24 | 
                + }  | 
            |
| 21 | 25 | 
                </style>  | 
            
| 22 | 26 | 
                </head>  | 
            
| 23 | 27 | 
                <body>  | 
            
                @@ -57,6 +61,39 @@  | 
            ||
| 57 | 61 | 
                                         <input id="no" class="weui_input" type="text" required="required" value="{{ tourguide_info.no }}" placeholder="请输入导游证编号" {% if not modified %}disabled{% endif %}>
               | 
            
| 58 | 62 | 
                </div>  | 
            
| 59 | 63 | 
                </div>  | 
            
| 64 | 
                +  | 
            |
| 65 | 
                + <div class="weui_cell">  | 
            |
| 66 | 
                + <div class="weui_cell_bd weui_cell_primary">  | 
            |
| 67 | 
                + <div class="weui_uploader">  | 
            |
| 68 | 
                + <div class="weui_uploader_hd weui_cell">  | 
            |
| 69 | 
                + <div class="weui_cell_bd weui_cell_primary">导游证照片</div>  | 
            |
| 70 | 
                +{#                            <div class="weui_cell_ft">0/2</div>#}
               | 
            |
| 71 | 
                + </div>  | 
            |
| 72 | 
                + <div class="weui_uploader_bd">  | 
            |
| 73 | 
                +                            <img id="tour_guide_photo" src="{{ tourguide_info.photo_url }}">
               | 
            |
| 74 | 
                +{#                            <ul class="weui_uploader_files">#}
               | 
            |
| 75 | 
                +{#                                <li class="weui_uploader_file" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)"></li>#}
               | 
            |
| 76 | 
                +{#                                <li class="weui_uploader_file" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)"></li>#}
               | 
            |
| 77 | 
                +{#                                <li class="weui_uploader_file" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)"></li>#}
               | 
            |
| 78 | 
                +{#                                <li class="weui_uploader_file weui_uploader_status" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)">#}
               | 
            |
| 79 | 
                +{#                                    <div class="weui_uploader_status_content">#}
               | 
            |
| 80 | 
                +{#                                        <i class="weui_icon_warn"></i>#}
               | 
            |
| 81 | 
                +{#                                    </div>#}
               | 
            |
| 82 | 
                +{#                                </li>#}
               | 
            |
| 83 | 
                +{#                                <li class="weui_uploader_file weui_uploader_status" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)">#}
               | 
            |
| 84 | 
                +{#                                    <div class="weui_uploader_status_content">50%</div>#}
               | 
            |
| 85 | 
                +{#                                </li>#}
               | 
            |
| 86 | 
                +{#                            </ul>#}
               | 
            |
| 87 | 
                +                            {% if modified %}
               | 
            |
| 88 | 
                + <div class="weui_uploader_input_wrp">  | 
            |
| 89 | 
                +{#                                <input class="weui_uploader_input" type="file" accept="image/*" multiple="">#}
               | 
            |
| 90 | 
                + </div>  | 
            |
| 91 | 
                +                            {% endif %}
               | 
            |
| 92 | 
                + </div>  | 
            |
| 93 | 
                + </div>  | 
            |
| 94 | 
                + </div>  | 
            |
| 95 | 
                + </div>  | 
            |
| 96 | 
                +  | 
            |
| 60 | 97 | 
                </div>  | 
            
| 61 | 98 | 
                 | 
            
| 62 | 99 | 
                             {% if tourguide_info %}
               | 
            
                @@ -113,7 +150,9 @@  | 
            ||
| 113 | 150 | 
                </div>  | 
            
| 114 | 151 | 
                </div>  | 
            
| 115 | 152 | 
                 | 
            
| 116 | 
                - <script src="//cdn.bootcss.com/zepto/1.1.6/zepto.min.js"></script>  | 
            |
| 153 | 
                + <script type="text/javascript" src="http://cdn.bootcss.com/zepto/1.1.6/zepto.min.js"></script>  | 
            |
| 154 | 
                + <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>  | 
            |
| 155 | 
                +        <script type="text/javascript" src="{% static 'pai2/js/jswe.js' %}?v=15"></script>
               | 
            |
| 117 | 156 | 
                <script>  | 
            
| 118 | 157 | 
                             {% if modified %}
               | 
            
| 119 | 158 | 
                             $(function() {
               | 
            
                @@ -158,6 +197,18 @@  | 
            ||
| 158 | 197 | 
                return false;  | 
            
| 159 | 198 | 
                }  | 
            
| 160 | 199 | 
                 | 
            
| 200 | 
                + var localIds = V.images.localIds;  | 
            |
| 201 | 
                +                    if (localIds.length == 0) {
               | 
            |
| 202 | 
                +                        show_error_dialog('照片', '请上传导游证照片');
               | 
            |
| 203 | 
                + return false;  | 
            |
| 204 | 
                + }  | 
            |
| 205 | 
                +  | 
            |
| 206 | 
                + var serverIds = V.images.serverIds;  | 
            |
| 207 | 
                +                    if (serverIds.length == 0) {
               | 
            |
| 208 | 
                +                        show_error_dialog('网络异常', '请稍后重试');
               | 
            |
| 209 | 
                + return false;  | 
            |
| 210 | 
                + }  | 
            |
| 211 | 
                +  | 
            |
| 161 | 212 | 
                                     return {
               | 
            
| 162 | 213 | 
                unionid: unionid,  | 
            
| 163 | 214 | 
                                         openid: getURLParameter('openid'),
               | 
            
                @@ -166,6 +217,7 @@  | 
            ||
| 166 | 217 | 
                                         phone: $('#phone').val(),
               | 
            
| 167 | 218 | 
                 {#                        location: location,#}
               | 
            
| 168 | 219 | 
                no: no,  | 
            
| 220 | 
                + serverIds: serverIds,  | 
            |
| 169 | 221 | 
                }  | 
            
| 170 | 222 | 
                }  | 
            
| 171 | 223 | 
                 | 
            
                @@ -193,13 +245,14 @@  | 
            ||
| 193 | 245 | 
                 | 
            
| 194 | 246 | 
                                 $('#dialog .weui_btn_dialog').click(function () {
               | 
            
| 195 | 247 | 
                                     $('#dialog').hide();
               | 
            
| 196 | 
                - })  | 
            |
| 248 | 
                + });  | 
            |
| 197 | 249 | 
                });  | 
            
| 198 | 250 | 
                             {% endif %}
               | 
            
| 199 | 251 | 
                </script>  | 
            
| 200 | 
                - <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>  | 
            |
| 201 | 
                -        <script type="text/javascript" src="{% static 'pai2/js/jswe.js' %}?v=1"></script>
               | 
            |
| 202 | 252 | 
                <script>  | 
            
| 253 | 
                +            V.wxChooseImageSuccess = function (res) {
               | 
            |
| 254 | 
                +                $('#tour_guide_photo')[0].src = V.images.localIds[0];
               | 
            |
| 255 | 
                + }  | 
            |
| 203 | 256 | 
                             V.initWxData({
               | 
            
| 204 | 257 | 
                imgUrl: "http://pai.ai/static/pai2/img/paiai_96_96.png",  | 
            
| 205 | 258 | 
                link: 'http://api.pai.ai/wx_oauth2?redirect_url=http://pai.ai/page/tourguide&scope=snsapi_base',  | 
            
                @@ -208,6 +261,9 @@  | 
            ||
| 208 | 261 | 
                timeLine: ""  | 
            
| 209 | 262 | 
                }, true);  | 
            
| 210 | 263 | 
                V.hideOptionMenu();  | 
            
| 264 | 
                +            $('.weui_uploader_input_wrp').click(function () {
               | 
            |
| 265 | 
                + V.chooseImage(1, true);  | 
            |
| 266 | 
                + })  | 
            |
| 211 | 267 | 
                </script>  | 
            
| 212 | 268 | 
                </body>  | 
            
| 213 | 269 | 
                </html>  | 
            
                @@ -43,6 +43,7 @@  | 
            ||
| 43 | 43 | 
                'closeWindow',  | 
            
| 44 | 44 | 
                'scanQRCode',  | 
            
| 45 | 45 | 
                'chooseWXPay',  | 
            
| 46 | 
                + 'openEnterpriseRedPacket',  | 
            |
| 46 | 47 | 
                'openProductSpecificView',  | 
            
| 47 | 48 | 
                'addCard',  | 
            
| 48 | 49 | 
                'chooseCard',  | 
            
                @@ -100,19 +101,19 @@  | 
            ||
| 100 | 101 | 
                         var callbacks = {
               | 
            
| 101 | 102 | 
                             trigger: function (res) {
               | 
            
| 102 | 103 | 
                                 // alert('用户点击发送给朋友')
               | 
            
| 103 | 
                -                if (JSWE.wxTrigger) {JSWE.wxTrigger()}
               | 
            |
| 104 | 
                +                if (JSWE.wxTrigger) {JSWE.wxTrigger(res)}
               | 
            |
| 104 | 105 | 
                },  | 
            
| 105 | 106 | 
                             success: function (res) {
               | 
            
| 106 | 107 | 
                                 // alert('已分享')
               | 
            
| 107 | 
                -                if (JSWE.wxSuccess) {JSWE.wxSuccess()}
               | 
            |
| 108 | 
                +                if (JSWE.wxSuccess) {JSWE.wxSuccess(res)}
               | 
            |
| 108 | 109 | 
                },  | 
            
| 109 | 110 | 
                             cancel: function (res) {
               | 
            
| 110 | 111 | 
                                 // alert('已取消')
               | 
            
| 111 | 
                -                if (JSWE.wxCancel) {JSWE.wxCancel()}
               | 
            |
| 112 | 
                +                if (JSWE.wxCancel) {JSWE.wxCancel(res)}
               | 
            |
| 112 | 113 | 
                },  | 
            
| 113 | 114 | 
                             fail: function (res) {
               | 
            
| 114 | 115 | 
                // alert(JSON.stringify(res))  | 
            
| 115 | 
                -                if (JSWE.wxFail) {JSWE.wxFail()}
               | 
            |
| 116 | 
                +                if (JSWE.wxFail) {JSWE.wxFail(res)}
               | 
            |
| 116 | 117 | 
                }  | 
            
| 117 | 118 | 
                         }, shareInfo = function(flag) {
               | 
            
| 118 | 119 | 
                             var _share = {
               | 
            
                @@ -126,7 +127,7 @@  | 
            ||
| 126 | 127 | 
                }  | 
            
| 127 | 128 | 
                if (flag) _share.desc = wxData.desc  | 
            
| 128 | 129 | 
                return _share  | 
            
| 129 | 
                -        }, wxApi = function() {
               | 
            |
| 130 | 
                +        }, wxShareApi = function() {
               | 
            |
| 130 | 131 | 
                // 2. 分享接口  | 
            
| 131 | 132 | 
                // 2.1 监听“分享给朋友”,按钮点击、自定义分享内容及分享结果接口  | 
            
| 132 | 133 | 
                wx.onMenuShareAppMessage(shareInfo(1))  | 
            
                @@ -136,12 +137,16 @@  | 
            ||
| 136 | 137 | 
                wx.onMenuShareQQ(shareInfo(1))  | 
            
| 137 | 138 | 
                // 2.4 监听“分享到微博”按钮点击、自定义分享内容及分享结果接口  | 
            
| 138 | 139 | 
                wx.onMenuShareWeibo(shareInfo(1))  | 
            
| 139 | 
                - // 8 界面操作接口  | 
            |
| 140 | 
                +        }, wxMenuApi = function () {
               | 
            |
| 141 | 
                + // 8. 界面操作接口  | 
            |
| 140 | 142 | 
                // 8.1 隐藏右上角菜单  | 
            
| 141 | 143 | 
                // 8.2 显示右上角菜单  | 
            
| 142 | 144 | 
                             if (wxConfig.hide) {wx.hideOptionMenu()} else {wx.showOptionMenu()}
               | 
            
| 143 | 145 | 
                // 8.7 关闭当前窗口  | 
            
| 144 | 146 | 
                             if (wxConfig.close) {wx.closeWindow()}
               | 
            
| 147 | 
                +        }, wxApi = function () {
               | 
            |
| 148 | 
                + wxShareApi()  | 
            |
| 149 | 
                + wxMenuApi()  | 
            |
| 145 | 150 | 
                }  | 
            
| 146 | 151 | 
                 | 
            
| 147 | 152 | 
                wx.ready(wxApi)  | 
            
                @@ -177,6 +182,85 @@  | 
            ||
| 177 | 182 | 
                         if ('undefined' !== typeof wxApiFun) wxApiFun()
               | 
            
| 178 | 183 | 
                }  | 
            
| 179 | 184 | 
                 | 
            
| 185 | 
                + // 5 图片接口  | 
            |
| 186 | 
                + // 5.1 拍照、本地选图  | 
            |
| 187 | 
                +    var images = {
               | 
            |
| 188 | 
                + localIds: [],  | 
            |
| 189 | 
                + serverIds: []  | 
            |
| 190 | 
                + };  | 
            |
| 191 | 
                +    function chooseImage(count, directUpload, isShowProgressTips) {
               | 
            |
| 192 | 
                +        if ('undefined' === typeof count) {count = 9}
               | 
            |
| 193 | 
                +        if ('undefined' === typeof directUpload) {directUpload = false}
               | 
            |
| 194 | 
                +        if ('undefined' === typeof isShowProgressTips) {isShowProgressTips = 1}
               | 
            |
| 195 | 
                +        wx.chooseImage({
               | 
            |
| 196 | 
                + count: count, // 默认9  | 
            |
| 197 | 
                + sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有  | 
            |
| 198 | 
                + sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有  | 
            |
| 199 | 
                +            success: function (res) {
               | 
            |
| 200 | 
                + var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片  | 
            |
| 201 | 
                + images.localIds = localIds;  | 
            |
| 202 | 
                + // 判断是否直接上传  | 
            |
| 203 | 
                +                if (directUpload) {setTimeout(uploadImages(localIds, isShowProgressTips), 100)}
               | 
            |
| 204 | 
                + // 拍照、本地选图成功后的回调函数  | 
            |
| 205 | 
                +                if (JSWE.wxChooseImageSuccess) {JSWE.wxChooseImageSuccess(res)}
               | 
            |
| 206 | 
                + }  | 
            |
| 207 | 
                + });  | 
            |
| 208 | 
                + }  | 
            |
| 209 | 
                +  | 
            |
| 210 | 
                + // 5.3 上传图片  | 
            |
| 211 | 
                +    function uploadImage(localId, isShowProgressTips) {
               | 
            |
| 212 | 
                + // 上传图片为异步处理,重复上传同一图片,返回的serverId也是不同的  | 
            |
| 213 | 
                +        wx.uploadImage({
               | 
            |
| 214 | 
                + localId: localId, // 需要上传的图片的本地ID,由chooseImage接口获得  | 
            |
| 215 | 
                + isShowProgressTips: 1, // 默认为1,显示进度提示  | 
            |
| 216 | 
                +            success: function (res) {
               | 
            |
| 217 | 
                + var serverId = res.serverId; // 返回图片的服务器端ID  | 
            |
| 218 | 
                + images.serverIds.push(serverId);  | 
            |
| 219 | 
                + // 上传图片成功后的回调函数  | 
            |
| 220 | 
                +                if (JSWE.wxUploadImageSuccess) {JSWE.wxUploadImageSuccess(res)}
               | 
            |
| 221 | 
                + }  | 
            |
| 222 | 
                + });  | 
            |
| 223 | 
                + }  | 
            |
| 224 | 
                +  | 
            |
| 225 | 
                +    function uploadImages(localIds, isShowProgressTips) {
               | 
            |
| 226 | 
                +        if ('undefined' === typeof localIds) {localIds = images.localIds}
               | 
            |
| 227 | 
                +        if ('undefined' === typeof isShowProgressTips) {isShowProgressTips = 1}
               | 
            |
| 228 | 
                + images.serverIds = [];  | 
            |
| 229 | 
                +        for (var index in localIds) {uploadImage(localIds[index], isShowProgressTips)}
               | 
            |
| 230 | 
                + }  | 
            |
| 231 | 
                +  | 
            |
| 232 | 
                + // 10 微信支付接口  | 
            |
| 233 | 
                + // 10.1 发起一个支付请求  | 
            |
| 234 | 
                +    function chooseWXPay(wxpay_params) {
               | 
            |
| 235 | 
                +        wx.chooseWXPay({
               | 
            |
| 236 | 
                + timestamp: wxpay_params.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符  | 
            |
| 237 | 
                + nonceStr: wxpay_params.nonceStr, // 支付签名随机串,不长于 32 位  | 
            |
| 238 | 
                + package: wxpay_params.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)  | 
            |
| 239 | 
                + signType: wxpay_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'  | 
            |
| 240 | 
                + paySign: wxpay_params.paySign, // 支付签名  | 
            |
| 241 | 
                +            success: function (res) {
               | 
            |
| 242 | 
                + // 支付成功后的回调函数  | 
            |
| 243 | 
                +                if (JSWE.wxPaySuccess) {JSWE.wxPaySuccess(res)}
               | 
            |
| 244 | 
                + }  | 
            |
| 245 | 
                + })  | 
            |
| 246 | 
                + }  | 
            |
| 247 | 
                +  | 
            |
| 248 | 
                + // xx 微信原生企业红包接口  | 
            |
| 249 | 
                + // xx.1 发起一个发送原生企业红包请求  | 
            |
| 250 | 
                +    function openEnterpriseRedPacket(wxredpack_params) {
               | 
            |
| 251 | 
                +        wx.openEnterpriseRedPacket({
               | 
            |
| 252 | 
                + timeStamp: wxredpack_params.timeStamp, // 红包签名时间戳,注意原生企业红包接口timeStamp字段名需大写其中的S字符,而支付接口timeStamp字段名无需大写其中的S字符。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符  | 
            |
| 253 | 
                + nonceStr: wxredpack_params.nonceStr, // 红包签名随机串,不长于 32 位  | 
            |
| 254 | 
                + package: encodeURIComponent(wxredpack_params.package), // 发放红包接口返回的prepay_id参数值,提交格式如:prepay_id=***)  | 
            |
| 255 | 
                + signType: wxredpack_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'  | 
            |
| 256 | 
                + paySign: wxredpack_params.paySign, // 红包签名  | 
            |
| 257 | 
                +            success: function (res) {
               | 
            |
| 258 | 
                + // 发送原生企业红包成功后的回调函数  | 
            |
| 259 | 
                +                if (JSWE.wxEnterpriseRedPacketSuccess) {JSWE.wxEnterpriseRedPacketSuccess(res)}
               | 
            |
| 260 | 
                + }  | 
            |
| 261 | 
                + })  | 
            |
| 262 | 
                + }  | 
            |
| 263 | 
                +  | 
            |
| 180 | 264 | 
                     var v = {
               | 
            
| 181 | 265 | 
                version: '1.0.5',  | 
            
| 182 | 266 | 
                 | 
            
                @@ -198,7 +282,19 @@  | 
            ||
| 198 | 282 | 
                // Share Function  | 
            
| 199 | 283 | 
                initWxData: initWxData,  | 
            
| 200 | 284 | 
                changeWxData: changeWxData,  | 
            
| 201 | 
                - fixedWxData: fixedWxData  | 
            |
| 285 | 
                + fixedWxData: fixedWxData,  | 
            |
| 286 | 
                +  | 
            |
| 287 | 
                + // Image Function  | 
            |
| 288 | 
                + images: images,  | 
            |
| 289 | 
                + chooseImage: chooseImage,  | 
            |
| 290 | 
                + uploadImage: uploadImage,  | 
            |
| 291 | 
                + uploadImages: uploadImages,  | 
            |
| 292 | 
                +  | 
            |
| 293 | 
                + // Pay Function  | 
            |
| 294 | 
                + chooseWXPay: chooseWXPay,  | 
            |
| 295 | 
                +  | 
            |
| 296 | 
                + // EnterpriseRedPacket Function  | 
            |
| 297 | 
                + openEnterpriseRedPacket: openEnterpriseRedPacket  | 
            |
| 202 | 298 | 
                }  | 
            
| 203 | 299 | 
                e.JSWE = e.V = v  | 
            
| 204 | 
                -})(window)  | 
            |
| 300 | 
                +})(window)  |