pink.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. <!-- +---------------------------------------------------------------------- -->
  2. <!-- | CRMEB [ CRMEB赋能开发者,助力企业发展 ] -->
  3. <!-- +---------------------------------------------------------------------- -->
  4. <!-- | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved. -->
  5. <!-- +---------------------------------------------------------------------- -->
  6. <!-- | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 -->
  7. <!-- +---------------------------------------------------------------------- -->
  8. <!-- | Author: CRMEB Team <admin@crmeb.com> -->
  9. <!-- +---------------------------------------------------------------------- -->
  10. {extend name="public/container"}
  11. {block name="title"}拼团详情{/block}
  12. {block name="head"}
  13. <style>
  14. .detail-section {
  15. padding-top: .36rem;
  16. border-top: .2rem solid #F5F5F5;
  17. }
  18. .detail-section .count-wrap {
  19. margin-bottom: .31rem;
  20. font-size: 0;
  21. text-align: center;
  22. }
  23. .detail-section .count-wrap .text-wrap {
  24. position: relative;
  25. display: inline-block;
  26. padding-right: .5rem;
  27. padding-left: .5rem;
  28. font-size: .28rem;
  29. line-height: .4rem;
  30. color: #282828;
  31. }
  32. .detail-section .count-wrap .text-wrap::before {
  33. content: "";
  34. position: absolute;
  35. top: 50%;
  36. right: 100%;
  37. width: 1.1rem;
  38. height: 1px;
  39. background-color: #DDDDDD;
  40. }
  41. .detail-section .count-wrap .text-wrap::after {
  42. content: "";
  43. position: absolute;
  44. top: 50%;
  45. left: 100%;
  46. width: 1.1rem;
  47. height: 1px;
  48. background-color: #DDDDDD;
  49. }
  50. .detail-section .count-wrap .time-wrap {
  51. display: inline-block;
  52. margin-right: .12rem;
  53. margin-left: .12rem;
  54. font-weight: bold;
  55. line-height: .42rem;
  56. color: #FF6B00;
  57. }
  58. .detail-section .count-wrap .number {
  59. display: inline-block;
  60. width: .42rem;
  61. height: .42rem;
  62. border-radius: .03rem;
  63. margin-right: .06rem;
  64. margin-left: .06rem;
  65. background-color: #FFF5E1;
  66. }
  67. .detail-section .prompt {
  68. font-weight: bold;
  69. font-size: .3rem;
  70. line-height: .42rem;
  71. text-align: center;
  72. color: #999999;
  73. }
  74. .detail-section .prompt.blue {
  75. color: #191C6E;
  76. }
  77. .detail-section .group-wrap {
  78. display: -webkit-box;
  79. display: flex;
  80. flex-wrap: wrap;
  81. -webkit-box-pack: center;
  82. justify-content: center;
  83. padding: .49rem .64rem .24rem;
  84. font-size: 0;
  85. }
  86. .detail-section .group-wrap .item {
  87. flex-shrink: 0;
  88. position: relative;
  89. padding: .15rem;
  90. border-radius: 50%;
  91. }
  92. .detail-section .group-wrap .img {
  93. display: block;
  94. width: .94rem;
  95. height: .94rem;
  96. border: .02rem solid #CCCCCC;
  97. border-radius: 50%;
  98. box-sizing: border-box;
  99. object-fit: cover;
  100. pointer-events: none;
  101. -webkit-touch-callout: none;
  102. }
  103. .detail-section .group-wrap .king {
  104. position: absolute;
  105. top: 1px;
  106. left: 1px;
  107. z-index: -1;
  108. width: .51rem;
  109. height: .37rem;
  110. -webkit-transform: rotate(-20deg);
  111. transform: rotate(-20deg);
  112. }
  113. .detail-section .handle-section {
  114. padding-right: .64rem;
  115. padding-left: .64rem;
  116. text-align: center;
  117. }
  118. .detail-section .handle-section .button {
  119. display: block;
  120. width: 100%;
  121. height: .86rem;
  122. border-radius: .43rem;
  123. background-color: #191C6E;
  124. font-size: .3rem;
  125. color: #FFFFFF;
  126. }
  127. .detail-section .handle-section .link {
  128. display: inline-block;
  129. padding-left: .35rem;
  130. margin-top: .25rem;
  131. background: url("data:image/png;base64,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") left center/.26rem .26rem no-repeat;
  132. vertical-align: middle;
  133. font-size: .24rem;
  134. line-height: .33rem;
  135. color: #282828;
  136. }
  137. .prompt-share {
  138. position: fixed;
  139. top: 0;
  140. left: 0;
  141. z-index: 99;
  142. width: 100%;
  143. height: 100%;
  144. cursor: pointer;
  145. }
  146. .initiate-group .header .iconfont {
  147. margin-left: .14rem;
  148. font-size: 1.02rem;
  149. line-height: normal;
  150. color: #999999;
  151. }
  152. </style>
  153. {/block}
  154. {block name="content"}
  155. <div v-cloak id="app">
  156. <div class="initiate-group">
  157. <div class="header acea-row row-middle">
  158. <div class="pictrue">
  159. <img :src="special.image">
  160. </div>
  161. <div class="text">
  162. <div class="line1" v-text="special.title"></div>
  163. <div style="margin-top: .13rem;font-size: 0;">
  164. <div class="money">¥<span>{{special.pink_money}}</span></div>
  165. <div class="mark">{{info.pinkT.people}}人拼</div>
  166. </div>
  167. </div>
  168. <div v-if="uid==pinkT.uid && pinkBool==0" class="iconfont iconkaituanchenggong" style="color: #191C6E;"></div>
  169. <div v-else-if="pinkBool==0" class="iconfont iconzhengzaipintuan"></div>
  170. <div v-else-if="pinkBool==1" class="iconfont iconpintuanchenggong" style="color: #191C6E;"></div>
  171. <div v-else class="iconfont iconpintuanshibai"></div>
  172. </div>
  173. <div class="detail-section">
  174. <div class="count-wrap">
  175. <div class="text-wrap">
  176. 剩余
  177. <div class="time-wrap">
  178. <span class="number">{{ hour }}</span>:
  179. <span class="number">{{ minute }}</span>:
  180. <span class="number">{{ second }}</span>
  181. </div>
  182. 结束
  183. </div>
  184. </div>
  185. <div class="prompt blue" v-if="!pinkBool">拼团中,还差{{ info.count }}人拼团成功</div>
  186. <div class="prompt blue" v-else-if="pinkBool==1">恭喜您拼团成功</div>
  187. <div class="prompt" v-else-if="pinkBool > 1 && pinkBool < 4">还差{{ info.count }}人,拼团失败</div>
  188. <div class="prompt" v-else-if="pinkBool==6">拼团人数已满</div>
  189. <div class="group-wrap">
  190. <div class="item">
  191. <img class="king" src="{__WAP_PATH}zsff/images/king.png">
  192. <img class="img" :src="pinkT.avatar">
  193. </div>
  194. <div v-for="item in pinkAll" class="item">
  195. <img class="img" :src="item.avatar">
  196. </div>
  197. <div class="item" v-for="item in info.count">
  198. <img style="border: none;" class="img" src="{__WAP_PATH}zsff/images/symbol.png">
  199. </div>
  200. </div>
  201. <div class="handle-section">
  202. <button class="button" v-if="is_help==0 && !pinkBool" @click="getPinkUrl()">邀请好友参团</button>
  203. <button class="button" v-if="is_help==1 && !pinkBool" @click="OpenPay(3,1)">我要参团</button>
  204. <button class="button" v-else-if="is_help==0 && pinkBool==1" @click="OpenPay(5,0)">去学习</button>
  205. <button class="button" v-else-if="is_help==0 && pinkBool > 1 && pinkBool < 4 && uid==pinkT.uid" @click="OpenPay(3,0)">重新开团</button>
  206. </div>
  207. </div>
  208. {if !$subscribe && !empty($userInfo) && $is_official_account_switch}
  209. <div class="publicFollow acea-row row-between-wrapper">
  210. <div>关注公众号"{$Auth_site_name}",看课更方便</div>
  211. <div class="follow acea-row row-center-wrapper" @click=" is_code = true ">关注</div>
  212. </div>
  213. <div class="mask" style="align-items:center;display: flex;" v-show="is_code" @click="is_code=false">
  214. <img :src="wechat_qrcode" alt="" style="width: 5rem;height: 5rem;margin: 0 auto;">
  215. </div>
  216. <div style="height: 1.0rem"></div>
  217. {/if}
  218. <!-- 支付弹窗 -->
  219. <pay-dialog
  220. :open.sync="payDialogOpen"
  221. :money="money"
  222. :special_id="special.id"
  223. :now_money="now_money"
  224. :link_pay_uid="link_pay_uid"
  225. :pay_type_num="pay_type_num"
  226. :pink-id="pink_id"
  227. :is-wechat="isWechat"
  228. :is-alipay="is_alipay"
  229. :is-balance="is_yue"
  230. :template-id="templateId"
  231. :wxpay-h5="wxpayH5"
  232. @change="changeVal"
  233. ></pay-dialog>
  234. <base-login :login-show="loginShow" :site-name="siteName" @login-close="loginClose"></base-login>
  235. <quick-menu></quick-menu>
  236. </div>
  237. </div>
  238. <script>
  239. var info={$info},special_id={$special_id},uid={$userInfo.uid},site_url="{$site_url}",wechat_qrcode = '{$subscribeQrcode}';
  240. var pink_id={$pink_id},is_help = {$is_help},is_light = {$is_light},isWechat={$isWechat ? 'true' : 'false'},now_money={$now_money},is_yue={$is_yue ? 'true' : 'false'},is_alipay={$is_alipay ? 'true' : 'false'};
  241. window.overallShare=false;
  242. require(['vue','helper','store', 'components/pay-dialog/index', 'components/base-login/index','quick'],function(Vue,$h,app, PayDialog, BaseLogin) {
  243. var wxpayH5={$is_h5_wechat_payment_switch ? 'true' : 'false'};
  244. var callback_url = '{$callback_url}';
  245. var siteName = '{$Auth_site_name}';
  246. new Vue({
  247. el: '#app',
  248. components: {
  249. 'pay-dialog': PayDialog,
  250. 'base-login': BaseLogin
  251. },
  252. data: {
  253. uid:uid,
  254. info:info,
  255. is_help:is_help,
  256. pink_id:pink_id,
  257. special:info.special,
  258. pinkT:info.pinkT,
  259. pinkBool:info.pinkBool || 0,
  260. pinkAll:info.pinkAll,
  261. datatime:info.pinkT.stop_time,
  262. hour:"00",
  263. minute:"00",
  264. second:"00",
  265. shares:false,
  266. wechat_qrcode:wechat_qrcode,
  267. is_code: true,
  268. payDialogOpen: false, // 是否显示支付弹窗
  269. money:0,
  270. is_alipay: is_alipay, //支付宝是否开启
  271. is_yue: is_yue, //余额是否开启
  272. now_money: now_money, //余额
  273. link_pay_uid: 0,
  274. pay_type_num: 3,
  275. templateId: '',
  276. wxpayH5: wxpayH5,
  277. loginShow: false,
  278. siteName: siteName
  279. },
  280. created:function(){
  281. this.show_time();
  282. this.subscribeTemplate();
  283. },
  284. mounted:function(){
  285. var that=this;
  286. mapleWx($jssdk(), function () {
  287. this.onMenuShareAll({
  288. title:'仅差'+info.count+'人拼课成功! ['+that.special.title+']' ,
  289. desc: that.special.abstract,
  290. imgUrl: that.special.image,
  291. link: site_url
  292. });
  293. });
  294. },
  295. methods:{
  296. subscribeTemplate: function () {
  297. app.baseGet($h.U({
  298. c: 'special',
  299. a: 'getTemplateIds',
  300. q: {
  301. pay_type_num: this.pay_type_num,
  302. special_id: this.special.id
  303. }
  304. }), function (res) {
  305. this.templateId = res.data.msg;
  306. }.bind(this));
  307. },
  308. getTashUrl:function(id,isAtn){
  309. return $h.U({c:'special',a:'details',q:{id:id}})+(isAtn ? '#tash' : '');
  310. },
  311. getPinkUrl:function(){
  312. window.location.href=$h.U({c:'special',a:'poster_show',q:{special_id:special_id,pinkId:this.pinkT.id}});
  313. },
  314. show_time:function(){
  315. var that = this;
  316. function nowTime() {
  317. var intDiff = that.datatime - Date.parse(new Date()) / 1000;
  318. var days = 0, hour = 0, minute = 0, second = 0;
  319. if (intDiff > 0) {
  320. hour = Math.floor(intDiff / (60 * 60)) - (days * 24);
  321. minute = Math.floor(intDiff / 60) - (hour * 60);
  322. second = Math.floor(intDiff) - (hour * 60 * 60) - (minute * 60);
  323. if (hour <= 9) hour = '0' + hour;
  324. if (minute <= 9) minute = '0' + minute;
  325. if (second <= 9) second = '0' + second;
  326. that.hour=hour;
  327. that.minute=minute;
  328. that.second=second;
  329. } else {
  330. that.hour="00";
  331. that.minute="00";
  332. that.second="00";
  333. clearInterval(timer);
  334. }
  335. }
  336. nowTime();
  337. var timer = setInterval(nowTime, 1000);
  338. },
  339. //所有插件回调处理事件
  340. changeVal: function (opt) {
  341. if (typeof opt != 'object') opt = {};
  342. var action = opt.action || '';
  343. var value = opt.value || '';
  344. this[action] && this[action](value);
  345. },
  346. //打开支付插件,并检测登录状态,没有登录,打开登录插件
  347. OpenPay: function (is_pink,n) {
  348. this.pay_type_num = is_pink;
  349. app.baseGet($h.U({ c: 'index', a: 'user_login' }), function (res) {
  350. switch (is_pink) {
  351. case 3:
  352. this.money = this.special.pink_money;
  353. this.payDialogOpen = true;
  354. if(!n){
  355. this.pink_id=0;
  356. }
  357. break;
  358. case 5:
  359. if(is_light){
  360. window.location.href=$h.U({c:'special',a:'single_details',q:{id:special_id}})+'#tash';
  361. }else{
  362. window.location.href=$h.U({c:'special',a:'details',q:{id:special_id}})+'#tash';
  363. }
  364. break;
  365. }
  366. }.bind(this), function (res) {
  367. this.loginShow = true;
  368. }.bind(this));
  369. },
  370. extendOrder: function (msg) {
  371. var that = this;
  372. if (typeof msg === 'object') {
  373. if (msg.errMsg === 'chooseWXPay:cancel') {
  374. msg = '微信支付取消';
  375. } else {
  376. msg = '支付失败';
  377. }
  378. } else {
  379. msg = '支付失败';
  380. }
  381. $h.pushMsg(msg, function () {
  382. that.payDialogOpen = false;
  383. if (that.orderId) app.baseGet($h.U({ c: 'special', a: 'del_order', q: { orderId: that.orderId } }));
  384. });
  385. },
  386. successOrder: function (msg) {
  387. var that = this;
  388. $h.showMsg({
  389. title: msg ? msg : '支付成功',
  390. icon: 'success',
  391. success: function () {
  392. window.location.href = $h.U({ c: 'special', a: 'pink', q: { orderId: that.orderId } });
  393. }
  394. });
  395. },
  396. pay_order: function (data) {
  397. this.orderId = data.data.result.orderId || '';
  398. switch (data.data.status) {
  399. case "PAY_ERROR": case 'ORDER_EXIST': case 'ORDER_ERROR':
  400. this.extendOrder(data.msg);
  401. break;
  402. case 'WECHAT_PAY':
  403. this.wechatPay(data.data.result.jsConfig);
  404. break;
  405. case 'WECHAT_H5_PAY':
  406. this.payDialogOpen = false;
  407. var callbackUrl = callback_url + '?type=1&id=' + this.special.id;
  408. var mwebUrl = data.data.result.jsConfig.mweb_url + '&redirect_url=' + encodeURIComponent(callbackUrl);
  409. window.location.href = mwebUrl;
  410. break;
  411. case 'SUCCESS':
  412. this.successOrder(data.msg);
  413. break;
  414. case 'ZHIFUBAO_PAY':
  415. window.location.href = $h.U({m:'wap',c:'alipay', a: 'index', q: { info: data.data.result, params: 'special' } });
  416. break;
  417. }
  418. },
  419. wechatPay: function (config) {
  420. var that = this;
  421. mapleWx($jssdk(), function () {
  422. this.chooseWXPay(config, function () {
  423. that.successOrder();
  424. }, {
  425. fail: that.extendOrder,
  426. cancel: that.extendOrder
  427. });
  428. });
  429. },
  430. loginClose: function () {
  431. this.loginShow = false;
  432. }
  433. }
  434. });
  435. })
  436. </script>
  437. {/block}