拍爱

mini_preview2.html 17KB

    {% load staticfiles %} <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="format-detection" content="telephone=no,email=no,address=no"> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"> <title>拍爱</title> <link href="//cdn.bootcss.com/photoswipe/4.1.2/photoswipe.css" rel="stylesheet"> <link href="//cdn.bootcss.com/photoswipe/4.1.2/default-skin/default-skin.css" rel="stylesheet"> <style> .float-left { float: left; } .float-right { float: right; } .clear-both { clear: both; } .halfscreen { width: 49%; box-sizing: border-box; } .halfscreen > .imgctx > img { width: 100% !important; box-sizing: border-box; outline: 0; display: block; } .photo-top { height: 40px; display: flex; flex-direction: row; align-items: center; } .group-avatar { box-shadow: 0 0 1px 0 #ccc; width: 25px !important; height: 25px; border-radius: 100%; margin-left: 3px; } .group-name { max-width: 50%; height: 25px; line-height: 25px; text-align: left; margin-left: 5px; font-size: 12px; overflow: hidden; } .photo-bottom { height: 32px; } .section-text { line-height: 25px; font-size: 12px; margin: 0 5px 0 auto; color: #999; } .section-icon { width: 16px; height: 16px; margin: 3px; } .thump-comment-num { line-height: 22px; font-size: 12px; margin-right: 5px; color: #999; } .mask-thump > img { position: absolute; right: 10px; bottom: 10px; width: 30px; z-index: 99999; } .nomark-buy, .origin-buy { position: fixed; right: 2px; bottom: 2px; left: 2px; height: 50px; line-height: 50px; text-align: center; color: whitesmoke; border: 1px solid #fff; border-radius: 5px; box-sizing: border-box; z-index: 99999; } </style> </head> <body> <div> <div id="photos"> <div id="left" class="halfscreen" style="float: left;"> {# <img src="https://placekitten.com/600/400" data-idx="0">#} {# <img src="https://placekitten.com/1200/900" data-idx="2">#} </div> <div id="right" class="halfscreen" style="float: right;"> {# <img src="https://placekitten.com/1200/900" data-idx="1">#} {# <img src="https://placekitten.com/600/400" data-idx="3">#} </div> </div> <div id="mask-thump" class="mask-thump"> <img class="" src="../../static/img/thumbup.png"/> </div> <div id="buy" style="display:none"> <div id="nomark" class="nomark-buy">去除水印</div> {# <div id="origin" class="origin-buy">购买原图</div>#} </div> </div> <!-- Root element of PhotoSwipe. Must have class pswp. --> <div class="pswp" tabindex="-1" role="dialog" aria-hidden="true"> <!-- Background of PhotoSwipe. It's a separate element as animating opacity is faster than rgba(). --> <div class="pswp__bg"></div> <!-- Slides wrapper with overflow:hidden. --> <div class="pswp__scroll-wrap"> <!-- Container that holds slides. PhotoSwipe keeps only 3 of them in the DOM to save memory. Don't modify these 3 pswp__item elements, data is added later on. --> <div class="pswp__container"> <div class="pswp__item"></div> <div class="pswp__item"></div> <div class="pswp__item"></div> </div> <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. --> <div class="pswp__ui pswp__ui--hidden"> <div class="pswp__top-bar"> <!-- Controls are self-explanatory. Order can be changed. --> <div class="pswp__counter"></div> <button class="pswp__button pswp__button--close" title="Close (Esc)"></button> <button class="pswp__button pswp__button--share" title="Share"></button> <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button> <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button> <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR --> <!-- element will get class pswp__preloader--active when preloader is running --> <div class="pswp__preloader"> <div class="pswp__preloader__icn"> <div class="pswp__preloader__cut"> <div class="pswp__preloader__donut"></div> </div> </div> </div> </div> <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"> <div class="pswp__share-tooltip"></div> </div> <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"> </button> <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"> </button> <div class="pswp__caption"> <div class="pswp__caption__center"></div> </div> </div> </div> </div> <script src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script src="//cdn.bootcss.com/photoswipe/4.1.2/photoswipe.min.js"></script> <script src="//cdn.bootcss.com/photoswipe/4.1.2/photoswipe-ui-default.min.js"></script> <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.3.2.js"></script> <script> $(function () { /** 格式化输入字符串 **/ // 用法: "hello{0}".format('world');返回'hello world' String.prototype.format = function () { var args = arguments; return this.replace(/\{(\d+)\}/g, function (s, i) { return args[i]; }); } function fromNow(UTCDateString) { var SECONDS_INTERVAL = 60; var MINUTES_INTERVAL = SECONDS_INTERVAL * 60; var HOURS_INTERVAL = MINUTES_INTERVAL * 24; var DAYS_INTERVAL = HOURS_INTERVAL * 31; var MONTHS_INTERVAL = DAYS_INTERVAL * 12; var SECONDS_SUFFIX = "秒前"; var MINUTES_SUFFIX = "分钟前"; var HOURS_SUFFIX = "小时前"; var DAYS_SUFFIX = "天前"; var MONTHS_SUFFIX = "月前"; var YEARS_SUFFIX = "年前"; var second = new Date(Date.parse(UTCDateString)).getTime() / 1000; var curSecond = new Date().getTime() / 1000; var distance = curSecond - second; var result = ""; if (distance <= 0) { result = UTCDateString; } else if (distance < SECONDS_INTERVAL) { result = Math.ceil(distance) + SECONDS_SUFFIX; } else if (distance < MINUTES_INTERVAL) { var count = distance / SECONDS_INTERVAL; result = Math.ceil(count) + MINUTES_SUFFIX; } else if (distance < HOURS_INTERVAL) { var count = distance / MINUTES_INTERVAL; count = Math.floor(count) || 1; result = count + HOURS_SUFFIX; } else if (distance < DAYS_INTERVAL) { var count = distance / HOURS_INTERVAL; count = Math.floor(count) || 1; result = count + DAYS_SUFFIX; } else if (distance < MONTHS_INTERVAL) { var count = distance / DAYS_INTERVAL; count = Math.floor(count) || 1; result = count + MONTHS_SUFFIX; } else { var count = distance / MONTHS_INTERVAL; count = Math.floor(count) || 1; result = count + YEARS_SUFFIX; } return result; } var GROUP_AVATAR_LIST = [ 'apple', 'banana', 'broccoli', 'carambola', 'carrot', 'cherry', 'corn', 'dragon', 'eggplant', 'fig', 'grape', 'lemon', 'mangosteen', 'orange', 'papaya', 'peach', 'pineapple', 'strawberry', 'watermelon' ] var width = $(document).width(); var renderData = {{ data|safe }}; var session_photos = renderData['session_photos']; {% include 'page/snippets/sessionphotos.html' %} var photoWidth = width * 49 / 100; var photoHeight = 0; var photoIdx = 0; var leftHeight = 0; var rightHeight = 0; var leftImgs = ''; var rightImgs = ''; var swipeItems = []; var swipePhotos = []; var curIdx = -1; var orderId = ''; var orderQueryTimer = null; for (var i = 0; i < session_photos.length; i++) { var photos = session_photos[i].photos; for (var j = 0; j < photos.length; j++) { photoHeight = photos[j].photo_thumbnail_h / photos[j].photo_thumbnail_w * photoWidth; var header = ( '<div class="photo-top">' + '<img class="group-avatar float-left" src="../../static/img/fruits/{0}.png" />' + '<text class="group-name float-left">{1}</text>' + '<text class="section-text float-right">{2}</text>' + '</div>' ).format(GROUP_AVATAR_LIST[photos[j].group_default_avatar], photos[j].group_name, fromNow(photos[j].created_at)); var imgctx = '<img src="{0}" data-idx="{1}" style="width:{2}px;height:{3}px">'.format(photos[j].photo_thumbnail_url, photoIdx, photoWidth, photoHeight); var footer = ( '<div class="photo-bottom">' + '<img class="section-icon float-left" src="../../static/img/thumbup.png" />' + '<text class="thump-comment-num float-left">{0}</text>' + '<img class="section-icon float-left" src="../../static/img/comment.png" />' + '<text class="thump-comment-num float-left">{1}</text>' + '</div>' ).format(photos[j].thumbup_num, photos[j].comment_num); if (leftHeight > rightHeight) { rightHeight += photoHeight + 72; rightImgs += '<div class="imgctx">{0}{1}{2}</div>'.format(header, imgctx, footer); } else { leftHeight += photoHeight + 72; leftImgs += '<div class="imgctx">{0}{1}{2}</div>'.format(header, imgctx, footer); } swipeItems.push({ src: photos[j]['porder'].m_photo_url || photos[j].photo_url, w: photos[j].photo_w, h: photos[j].photo_h, }) swipePhotos.push(photos[j]); photoIdx += 1; } } $('#left').append(leftImgs); $('#right').append(rightImgs); var pswpElement = document.querySelectorAll('.pswp')[0]; // define options (if needed) var options = { // optionName: 'option value' // for example: loop: true, index: 1, // start at first slide // Tap on sliding area should close gallery' tapToClose: true, }; function displayornot() { var photoInfo = swipePhotos[curIdx]; var display_payment_btn = photoInfo['display_payment_btn']; if (photoInfo['display_payment_btn'] && (typeof photoInfo['porder'].m_photo_url == 'undefined' || photoInfo['porder'].m_photo_url == '')) { $('#buy').show(); } else { $('#buy').hide(); } $('#mask-thump').show(); } // Initializes and opens PhotoSwipe $('#photos img').click(function () { curIdx = parseInt($(this).attr('data-idx')); options['index'] = curIdx; var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, swipeItems, options); gallery.init(); displayornot(); // After slides change // (after content changed) gallery.listen('afterChange', function () { console.log(gallery.getCurrentIndex()); curIdx = gallery.getCurrentIndex(); displayornot() }); // Gallery starts closing gallery.listen('close', function () { $('#buy').hide(); $('#mask-thump').hide(); }); }) function order_query(orderId, photoId) { $.ajax({ url: '/mini/order_query', type: 'POST', data: { order_id: orderId, }, timeout: 5000, cache: true, success: function (res) { if (res.status == 200) { window.clearTimeout(orderQueryTimer); // 支付成功,获取 porder $.ajax({ url: 'f/bought', data: { user_id: '{{ request.GET.user_id }}', photo_id: photoId, }, success: function (res) { if (res.data.status == 200) { var swipeItem = swipeItems[curIdx]; swipeItem['src'] = res.data.porder.m_photo_url || swipeItem['src']; swipeItems[curIdx] = swipeItem; $('.pswp__img')[0].src = swipeItem['src']; var photoInfo = swipePhotos[curIdx]; photoInfo['porder'] = res.data.porder; swipePhotos[curIdx] = photoInfo; } } }) } else { orderQueryTimer = window.setTimeout(function () { order_query(orderId, photoId); }, 1000) } }, error: function (res) { } }); } $('#nomark').click(function () { var photoInfo = swipePhotos[curIdx]; var photoId = photoInfo.photo_id; $.ajax({ url: '/mini/order_create', type: 'POST', data: { group_id: photoInfo.group_id, user_id: photoInfo.user_id, photo_id: photoId, photo_type: 'nomark', body: '去除水印', total_fee: 1, trade_type: 'MINIAPP', }, timeout: 5000, cache: true, success: function (res) { if (res.status == 200) { orderId = res.data.order_id; var wxpay_params = res.data.wxpay_params; //点击微信支付后,调取统一下单接口生成微信小程序支付需要的支付参数 var params = '?timeStamp=' + wxpay_params.timeStamp + '&nonceStr=' + wxpay_params.nonceStr + '&package=' + wxpay_params.package.split("=")[1] + '&signType=MD5' + '&paySign=' + wxpay_params.paySign; //定义path 与小程序的支付页面的路径相对应 var path = '/pages/wxpay/wxpay' + params; //通过JSSDK的api使小程序跳转到指定的小程序页面 wx.miniProgram.navigateTo({url: path}); order_query(orderId, photoId); } }, error: function (res) { } }); }) }) </script> </body> </html>