金诚优选前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

728 lines
22 KiB

  1. <template>
  2. <view id="collage">
  3. <view class="white"></view>
  4. <view class="collage-progress">
  5. <progress :percent="percent" stroke-width="4" activeColor="#EA4448" backgroundColor="#DBDBDB"></progress>
  6. <view class="launch active-emj" style="left: 10%">
  7. <view class="iconfont icon-faqipintuan"></view>
  8. <view class="text">发起拼团</view>
  9. </view>
  10. <view class="invite active-emj" style="left:40%">
  11. <view class="iconfont icon-yaoqinghaoyou"></view>
  12. <view class="text">邀请好友参团</view>
  13. </view>
  14. <view class="success" :class="showItemDate.status != 0 ? 'active-emj' :''" style="left: 80%">
  15. <view class="iconfont icon-pintuanchenggong"></view>
  16. <view class="text">拼团<block v-if="showItemDate.status != 2">成功</block><block v-if="showItemDate.status == 2">失败</block></view>
  17. </view>
  18. </view>
  19. <view class="white b"></view>
  20. <view class="collage-goods" @tap="jumpDetail" v-if="showItemDate && showItemDate.groupon && showItemDate.groupon.goods">
  21. <view class="goods-img">
  22. <image mode="widthFix" :src="showItemDate.groupon.goods.img"></image>
  23. </view>
  24. <view class="goods-infomation">
  25. <view class="info-name">{{showItemDate.groupon.goods.name}}</view>
  26. <view class="original-cost marg-t">
  27. <view class="price">¥ {{showItemDate.groupon.goods.sell_price}}
  28. </view>
  29. <view class="o-text">单买价</view>
  30. </view>
  31. <view class="purchase-cost mar-t bor-c">
  32. <view class="price bor-c">¥ {{showItemDate.groupon.price}}
  33. </view>
  34. <view class="o-text p-text">{{showItemDate.groupon.number}}人团</view>
  35. </view>
  36. </view>
  37. </view>
  38. <view class="collage-open">
  39. <view class="open-title">
  40. <view class="text">开团详情</view>
  41. <view class="shar">. . .</view>
  42. </view>
  43. <view class="open-content" v-if="showItemDate.overdue_status == 0 && showItemDate.status == 0">
  44. <view class="time-text">
  45. <view class="iconfont icon-weikaishi"></view>
  46. <view class="text" v-if="showItemDate.status">已成团待发货</view>
  47. <view class="text" v-else>已开团离成团还差 <view>{{showItemDate.gap_number}}</view></view>
  48. </view>
  49. <view class="count-down" v-if="endtype == 1">
  50. <view class="timedown">
  51. <span>{{endTime.hour}}</span>
  52. <span>{{endTime.minute}}</span>
  53. <span>{{endTime.second}}</span>
  54. </view>
  55. <!-- <group class="my-class" end="{{showItemDate.groupon.ends_at}}" starts="{{showItemDate.groupon.starts_at}}" server="{{showItemMeta.server_time}}" mold="list">
  56. </group>-->
  57. 自动结束
  58. </view>
  59. <view class="count-down" v-if="endtype == 0">
  60. {{endmessage}}
  61. </view>
  62. </view>
  63. <view class="open-content" v-if="showItemDate.overdue_status == 1 && showItemDate.status == 0">活动已过期</view>
  64. <view class="open-content" v-if="showItemDate.status == 1">拼团成功</view>
  65. <view class="open-content" v-if="showItemDate.status == 2">拼团失败</view>
  66. </view>
  67. <view class="collage-records">
  68. <view class="record-title">参团记录</view>
  69. <view class="record-content">
  70. <view class="item" v-for="(item, index) in showItemDate.users" :key="index">
  71. <view class="avatar">
  72. <image :src="item.meta.avatar"></image>
  73. </view>
  74. <view class="info">
  75. <view class="info-top">
  76. <span class="name">{{item.meta.nick_name}}</span>
  77. <span class="colonel" v-if="item.is_leader">团长</span>
  78. </view>
  79. <view class="info-bottom">
  80. <span>{{item.created_at}} </span>
  81. <span v-if="item.is_leader">开团</span>
  82. <span v-else>参团</span>
  83. </view>
  84. </view>
  85. </view>
  86. </view>
  87. </view>
  88. <div class="order-share" v-if="showItemDate.overdue_status == 0">
  89. <div class="item" @tap="jumpOrder" :style="'background: ' + config.mainColor" v-if="showItemDate.order_no && !showItemDate.is_virtual">
  90. 查看订单详情
  91. </div>
  92. <div class="item" @tap="jumpDetail" :style="'background: ' + config.mainColor" v-if="!showItemDate.order_no">
  93. 立即参团
  94. </div>
  95. <!-- #ifdef APP-PLUS || MP-WEIXIN -->
  96. <div class="item look" :style="'color: ' + config.mainColor" @tap="changeShare">
  97. 分享给好友
  98. </div>
  99. <!-- #endif -->
  100. <!-- #ifdef H5 -->
  101. <div class="item look" :style="'color: ' + config.mainColor" @tap="togglePopup('middle-img')">
  102. 分享给好友
  103. </div>
  104. <!-- #endif -->
  105. </div>
  106. <div class="order-share" v-else>
  107. <div class="item" :style="'background: ' + config.mainColor" @tap="jumpMore">
  108. 查看更多活动商品
  109. </div>
  110. <div class="item look" :style="'color: ' + config.mainColor" @tap="jumpOrder" v-if="showItemDate.order_no">
  111. 查看订单详情
  112. </div>
  113. </div>
  114. <!--弹出分享部分-->
  115. <view class="maks" :class="show_share ? 'cur' : ''" @tap="changeShare">
  116. </view>
  117. <view class="share-box" :class="show_share ? 'cur' : ''">
  118. <!-- #ifdef MP-WEIXIN -->
  119. <button class="shaer-item" open-type="share">
  120. 分享给好友
  121. </button>
  122. <!-- #endif -->
  123. <!-- #ifdef APP-PLUS -->
  124. <button class="shaer-item" @click="shareapp">
  125. 分享给好友
  126. </button>
  127. <!-- #endif -->
  128. <view class="shaer-item mx-1px-top" @tap="createShareImg">
  129. 生成海报
  130. </view>
  131. <view class="shaer-item clear" @tap="changeShare">
  132. 取消
  133. </view>
  134. </view>
  135. <!--弹出分享到朋友圈-->
  136. <view class="circle-friends" :class="show_friend ? 'cur':''">
  137. <view class="imgboxs">
  138. <view class="circle-img">
  139. <image :src="createImgUrl" mode="widthFix"></image>
  140. </view>
  141. <view class="save-img" :style="'background: ' + config.mainColor" @tap="downImg">
  142. 保存图片
  143. </view>
  144. <i class="iconfont icon-delete" @tap="getShearImg"></i>
  145. </view>
  146. </view>
  147. <view class="ibrand-author" v-if="author" @tap="jumpAuthor">
  148. <i class="iconfont icon-dibu"></i>
  149. </view>
  150. <!--用户拒绝下载图片授权弹出-->
  151. <alert :is_refused="is_refused" bind:close="closeAlert"></alert>
  152. <!-- #ifdef H5 -->
  153. <view >
  154. <uni-popup :show="type === 'middle-img'" position="top" mode="fixed" @hidePopup="togglePopup('')">
  155. <view class="uni-center center-box">
  156. <image style="position: absolute; top: 0;right:0" @tap="togglePopup('')" class="image" src="/static/ico-share-wechat.png" />
  157. </view>
  158. </uni-popup>
  159. </view>
  160. <!-- #endif -->
  161. </view>
  162. </template>
  163. <script>
  164. import {pageLogin, getUrl,config,is} from '@/common/js/utils.js';
  165. import Animation from '@/common/js/animation.js';
  166. import seckill from "@/components/seckill/seckill";
  167. import group from "@/components/group/group";
  168. import alert from "@/components/alert/alert";
  169. import permision from "@/common/js/permission.js"
  170. export default {
  171. data() {
  172. return {
  173. show_share: false,
  174. show_friend: false,
  175. showItemDate: {},
  176. percent: 50,
  177. showItemMeta: {},
  178. endTime: {
  179. interval: '',
  180. day: 0,
  181. hour: 0,
  182. minute: 0,
  183. second: 0,
  184. count: 0
  185. },
  186. timer: '',
  187. endmessage: '',
  188. endtype: 0,
  189. createImgUrl: '',
  190. config: '',
  191. author: '',
  192. is_refused: false,
  193. type:0
  194. };
  195. },
  196. //发送给好友
  197. onShareAppMessage(res) {
  198. this.changeShare();
  199. var groupon_item_id = this.showItemDate.id;
  200. return {
  201. title: this.showItemDate.groupon.goods.name,
  202. path: '/pages/store/collage/collage?multi_groupon_item_id=' + groupon_item_id,
  203. imageUrl: this.showItemDate.groupon.goods.img
  204. };
  205. },
  206. onLoad(e) {
  207. // 第三方平台配置颜色
  208. var gbConfig = this.$cookieStorage.get('globalConfig') || '';
  209. var init = this.$cookieStorage.get('init');
  210. this.setData({
  211. config: gbConfig,
  212. author: init ? init.other_technical_support : ''
  213. });
  214. console.log('multi_groupon_item_id',e.multi_groupon_item_id)
  215. var multi_groupon_item_id = e.multi_groupon_item_id;
  216. if (e.scene) {
  217. var scene = decodeURIComponent(e.scene);
  218. var sceneArr = scene.split(',');
  219. if (sceneArr.length > 0) {
  220. multi_groupon_item_id = sceneArr[0];
  221. }
  222. }
  223. if (multi_groupon_item_id) {
  224. this.showItem(multi_groupon_item_id);
  225. } else {
  226. wx.showModal({
  227. content: '非法进入',
  228. showCancel: false
  229. });
  230. }
  231. // #ifdef H5
  232. var token = this.$cookieStorage.get('user_token');
  233. if(!token){
  234. var env = {
  235. isIPad: /ipad/i.test(window.navigator.userAgent),
  236. isIphone: /iphone|ipad|ipod/i.test(window.navigator.userAgent),
  237. isWechat: /MicroMessenger/i.test(window.navigator.userAgent)
  238. }
  239. if(env.isWechat){
  240. if(e.openid){
  241. this.$cookieStorage.set('openid',e.openid)
  242. }
  243. var openid = this.$cookieStorage.get('openid') || e.openid;
  244. if(openid){
  245. this.postNewQuickLogin(openid);
  246. } else{
  247. let origin = window.location.origin;
  248. var url = origin+'/pages/store/collage/collage?multi_groupon_item_id='+e.multi_groupon_item_id;
  249. window.location.href = this.$config.GLOBAL.baseUrl+'oauth/wxOauth?redirect_url='+encodeURIComponent(url);
  250. }
  251. } else{
  252. wx.navigateTo({
  253. url:'/pages/store/collage/collage?multi_groupon_item_id='+e.multi_groupon_item_id
  254. })
  255. }
  256. }
  257. // #endif
  258. },
  259. components: {
  260. seckill,
  261. group,
  262. alert
  263. },
  264. methods: {
  265. postNewQuickLogin(open_id){
  266. wx.showLoading({
  267. title: '正在登录',
  268. mask: true
  269. });
  270. this.$http.post({
  271. api:'api/oauth/newQuickLogin',
  272. data:{
  273. open_id:open_id
  274. }
  275. }).then(res=>{
  276. res = res.data;
  277. if(res.status){
  278. if(res.data.access_token){
  279. var access_token = res.data.token_type + ' ' + res.data.access_token;
  280. var expires_in = res.data.expires_in || 315360000;
  281. this.$cookieStorage.set("user_token", access_token, expires_in);
  282. //如果用户没有绑定手机号
  283. if(res.data.has_bind_mobile == 0){
  284. wx.reLaunch({
  285. url:'/pages/user/bindingphone/bindingphone'
  286. })
  287. }
  288. } else{
  289. wx.showModal({
  290. content: res.message || '请求失败,请重试',
  291. showCancel: false
  292. });
  293. }
  294. } else{
  295. wx.showModal({
  296. content: res.message || '请求失败,请重试',
  297. showCancel: false
  298. });
  299. }
  300. wx.hideLoading()
  301. }).catch(rej=>{
  302. wx.showModal({
  303. content: rej.message || '请求失败,请重试',
  304. showCancel: false
  305. });
  306. wx.hideLoading()
  307. })
  308. },
  309. togglePopup(type) {
  310. this.type = type;
  311. },
  312. shareapp(){
  313. this.changeShare();
  314. var groupon_item_id = this.showItemDate.id;
  315. var title = this.showItemDate.groupon.goods.name;
  316. var imageUrl = this.showItemDate.groupon.goods.img;
  317. uni.getProvider({
  318. service:'share',
  319. success:function(res){
  320. uni.share({
  321. provider: "weixin",
  322. scene: "WXSceneSession",
  323. type: 5,
  324. title:title,
  325. imageUrl:imageUrl,
  326. miniProgram:{
  327. id:'gh_72e65196278a',
  328. path:'pages/store/collage/collage?multi_groupon_item_id=' + groupon_item_id,
  329. type:0,
  330. webUrl: 'https://guojiang.club'
  331. },
  332. success: function (res) {
  333. console.log("success:" + JSON.stringify(res));
  334. },
  335. fail: function (err) {
  336. console.log("fail:" + JSON.stringify(err));
  337. }
  338. });
  339. }
  340. })
  341. },
  342. //弹出分享
  343. changeShare() {
  344. this.setData({
  345. show_share: !this.show_share
  346. });
  347. },
  348. //弹出朋友圈
  349. getShearImg() {
  350. this.setData({
  351. show_friend: !this.show_friend,
  352. show_share: false
  353. });
  354. },
  355. jumpAuthor() {
  356. wx.navigateTo({
  357. url: '/pages/index/author/author'
  358. });
  359. },
  360. //获取拼团详情页数据
  361. showItem(multi_groupon_item_id) {
  362. wx.showLoading({
  363. title: '加载中',
  364. mask: true
  365. });
  366. var token = this.$cookieStorage.get('user_token') || '';
  367. this.$http.get({
  368. api: 'api/multiGroupon/showItem',
  369. header: {
  370. Authorization: token
  371. },
  372. data: {
  373. multi_groupon_item_id: multi_groupon_item_id
  374. }
  375. }).then(res => {
  376. if (res.statusCode == 200) {
  377. res = res.data;
  378. if (res.status) {
  379. this.setData({
  380. showItemDate: res.data,
  381. showItemMeta: res.meta
  382. });
  383. this.controlProgress();
  384. if (this.showItemDate.overdue_status == 0 && this.showItemDate.status == 0) {
  385. this.setData({
  386. timer: setInterval(this.countTime, 1000)
  387. });
  388. }
  389. // #ifdef H5
  390. if (this.$wechat && this.$wechat.isWechat()) {
  391. var title = this.showItemDate.groupon.goods.name;
  392. var imageUrl = this.showItemDate.groupon.goods.img;
  393. this.$wechat.share({
  394. title: title,
  395. img:imageUrl,
  396. desc:'果酱小店'
  397. });
  398. }
  399. // #endif
  400. /* timer = setInterval(this.countTime, 1000);*/
  401. } else {
  402. wx.showModal({
  403. content: res.message || '请求数据失败',
  404. showCancel: false
  405. });
  406. }
  407. } else {
  408. wx.showModal({
  409. content: res.message || '请求数据失败',
  410. showCancel: false
  411. });
  412. }
  413. wx.hideLoading();
  414. }).catch(rej => {
  415. wx.hideLoading();
  416. wx.showModal({
  417. content: res.message || '请求失败',
  418. showCancel: false
  419. });
  420. });
  421. },
  422. //控制进度条颜色
  423. controlProgress() {
  424. if (this.showItemDate.status != 0) {
  425. this.setData({
  426. percent: 100
  427. });
  428. }
  429. },
  430. // 发送到朋友圈
  431. createShareImg() {
  432. wx.showLoading({
  433. title: "生成中",
  434. mask: true
  435. });
  436. var token = this.$cookieStorage.get('user_token') || '';
  437. this.$http.get({
  438. api: 'api/multiGroupon/createShareImage',
  439. header: {
  440. Authorization: token
  441. },
  442. data: {
  443. goods_id: this.showItemDate.multi_groupon_goods_id,
  444. multi_groupon_item_id: this.showItemDate.id
  445. }
  446. }).then(res => {
  447. if (res.statusCode == 200) {
  448. res = res.data;
  449. if (res.status) {
  450. this.setData({
  451. createImgUrl: res.data.image
  452. });
  453. this.getShearImg();
  454. } else {
  455. wx.showModal({
  456. content: res.message || '请求失败',
  457. showCancel: false
  458. });
  459. }
  460. } else {
  461. wx.showModal({
  462. content: '请求失败',
  463. showCancel: false
  464. });
  465. }
  466. wx.hideLoading();
  467. this.changeShare();
  468. }).catch(rej => {
  469. wx.showModal({
  470. content: '内部错误',
  471. showCancel: false
  472. });
  473. wx.hideLoading();
  474. this.changeShare();
  475. });
  476. },
  477. closeAlert() {
  478. this.setData({
  479. is_refused: false
  480. });
  481. },
  482. //下载图片
  483. downImg() {
  484. if (this.createImgUrl) {
  485. wx.showLoading({
  486. title: '正在下载',
  487. mask: true
  488. });
  489. this.$http.dowloadFile({
  490. api: this.createImgUrl
  491. }).then(res => {
  492. if (res.statusCode == 200) {
  493. // #ifdef MP-WEIXIN
  494. wx.getSetting({
  495. success: ret => {
  496. //如果之前没有授权
  497. if (!ret.authSetting['scope.writePhotosAlbum']) {
  498. wx.authorize({
  499. scope: 'scope.writePhotosAlbum',
  500. success: rej => {
  501. this.saveImg(res.tempFilePath);
  502. },
  503. //用户拒绝授权
  504. fail: ret => {
  505. this.setData({
  506. is_refused: true
  507. });
  508. wx.hideLoading();
  509. }
  510. });
  511. } else {
  512. this.saveImg(res.tempFilePath);
  513. }
  514. }
  515. });
  516. // #endif
  517. // #ifdef APP-PLUS
  518. var that = this;
  519. uni.getSystemInfo({
  520. success(result) {
  521. if(result.platform == 'android'){
  522. that.requestAndroidPermission(res.tempFilePath);
  523. } else if(result.platform == 'ios'){
  524. that.requestIosPermission(res.tempFilePath)
  525. }
  526. }
  527. })
  528. // #endif
  529. } else {
  530. wx.hideLoading();
  531. wx.showToast({
  532. title: '下载图片失败',
  533. icon: 'none'
  534. });
  535. }
  536. }, err => {});
  537. }
  538. },
  539. //ios app权限授权
  540. requestIosPermission(url){
  541. var result = permision.judgeIosPermission('photoLibrary');
  542. if(result){
  543. this.saveImg(url);
  544. }else{
  545. //打开授权,iOS上如果没有调用过的权限,不会出现在权限设置界面。
  546. permision.gotoAppPermissionSetting()
  547. }
  548. },
  549. //安卓app权限授权
  550. async requestAndroidPermission(url) {
  551. var result = await permision.requestAndroidPermission("android.permission.WRITE_EXTERNAL_STORAGE")
  552. var strStatus
  553. if (result == 1) {
  554. strStatus = "已获得授权";
  555. this.saveImg(url);
  556. } else if (result == 0) {
  557. strStatus = "未获得授权";
  558. void permision.gotoAppPermissionSetting()
  559. } else {
  560. strStatus = "被永久拒绝权限"
  561. void permision.gotoAppPermissionSetting()
  562. }
  563. },
  564. //保存图片
  565. saveImg(path) {
  566. wx.saveImageToPhotosAlbum({
  567. filePath: path,
  568. success: res => {
  569. wx.hideLoading();
  570. },
  571. fail: rej => {
  572. wx.hideLoading();
  573. wx.showToast({
  574. title: '保存图片失败',
  575. icon: 'none'
  576. });
  577. }
  578. });
  579. },
  580. // 倒计时
  581. countTime() {
  582. var d = 86400000,
  583. h = 3600000,
  584. n = 60000,
  585. end = this.showItemDate.ends_at,
  586. server = this.showItemMeta.server_time,
  587. arr = String(end).split(/\D/),
  588. newArr = String(server).split(/\D/);
  589. newArr = newArr.map(Number);
  590. arr = arr.map(Number);
  591. var serverTime = new Date(newArr[0], newArr[1] - 1, newArr[2], newArr[3], newArr[4], newArr[5]).getTime();
  592. var endTime = new Date(arr[0], arr[1] - 1, arr[2], arr[3], arr[4], arr[5]).getTime(); //计算开始时间跟结束时间的差值
  593. var timeDiff = endTime - serverTime; // 在本地计算倒计时
  594. var allTime = this.endTime.count + 1000;
  595. this.setData({
  596. 'endTime.count': allTime
  597. }); // this.endTime.count += 1000;
  598. var interval = timeDiff - this.endTime.count;
  599. if (interval < d) {
  600. this.setData({
  601. endtype: 1
  602. });
  603. if (interval < 0) {
  604. // 活动结束
  605. this.showItem(this.showItemDate.id);
  606. clearInterval(this.timer); // this.$emit('end',this.index)
  607. } else {
  608. var day = Math.floor(interval / d);
  609. Math.floor(interval -= day * d);
  610. var hour = Math.floor(interval / h);
  611. Math.floor(interval -= hour * h);
  612. var minute = Math.floor(interval / n);
  613. var second = Math.floor(interval % n / 1000);
  614. this.setData({
  615. 'endTime.day': day,
  616. 'endTime.hour': hour,
  617. 'endTime.minute': minute,
  618. 'endTime.second': second
  619. });
  620. }
  621. } else {
  622. this.setData({
  623. endmessage: `${arr[1]}${arr[2]} 日,${arr[3]} : ${arr[4]} 结束`
  624. });
  625. }
  626. },
  627. jumpDetail() {
  628. var id = this.showItemDate.groupon.goods.id;
  629. var item_id = this.showItemDate.id;
  630. if (this.showItemDate.overdue_status == 0) {
  631. wx.navigateTo({
  632. url: '/pages/store/detail/detail?id=' + id + '&groupon_item_id=' + item_id
  633. });
  634. } else {
  635. wx.navigateTo({
  636. url: '/pages/store/detail/detail?id=' + id
  637. });
  638. }
  639. },
  640. jumpMore() {
  641. wx.navigateTo({
  642. url: '/pages/store/list/list'
  643. });
  644. },
  645. jumpOrder() {
  646. var order_no = this.showItemDate.order_no;
  647. wx.navigateTo({
  648. url: '/pages/order/detail/detail?no=' + order_no
  649. });
  650. },
  651. setData: function (obj) {
  652. let that = this;
  653. let keys = [];
  654. let val, data;
  655. Object.keys(obj).forEach(function (key) {
  656. keys = key.split('.');
  657. val = obj[key];
  658. data = that.$data;
  659. keys.forEach(function (key2, index) {
  660. if (index + 1 == keys.length) {
  661. that.$set(data, key2, val);
  662. } else {
  663. if (!data[key2]) {
  664. that.$set(data, key2, {});
  665. }
  666. }
  667. data = data[key2];
  668. });
  669. });
  670. }
  671. },
  672. computed: {},
  673. watch: {}
  674. };
  675. </script>
  676. <style rel="stylesheet/less" lang="less">
  677. @import "collage";
  678. </style>