金诚优选前端代码
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.

362 lines
12 KiB

  1. <template>
  2. <view id="coupon">
  3. <view class="navbar mx-1px-top">
  4. <block v-for="(item, index) in tabList" :key="index" >
  5. <view :id="index" class="navbar-item activity" :hidden="activeIndex != index" :style="'color: ' + config.mainColor" @tap="tabClick">
  6. <view class="navbar-title">{{item.title}}</view>
  7. </view>
  8. <view :id="index" :hidden="activeIndex == index" class="navbar-item" @tap="tabClick">
  9. <view class="navbar-title">{{item.title}}</view>
  10. </view>
  11. </block>
  12. <view class="navbar-slider" :style="'width: ' + width + 'px; transform: translateX(' + sliderOffset + 'px); -webkit-transform: translateX(' + sliderOffset + 'px); background: ' + config.mainColor"></view>
  13. </view>
  14. <view class="tab-panel">
  15. <view class="tab-content" :hidden="activeIndex != 0" v-if="dataList && dataList[0] && dataList[0][0] && tabList && tabList[0]">
  16. <view class="no-list" v-if="!dataList[0][0].length && tabList[0].init">
  17. <i class="iconfont icon-youhuiquan"></i>
  18. <view>报告主人这里暂无<span v-if="is_coupon == 1">优惠券~</span><span v-else>促销活动</span></view>
  19. </view>
  20. <view v-for="(items, idx) in dataList[0]" :key="idx" >
  21. <view class="coupon" :data-id="item.id" :data-limit="item.usage_limit" @tap="jumpDetailOn" v-for="(item, index) in dataList[0][idx]" :key="index">
  22. <view class="coupon-left" :class="is_coupon != 1 ? 'discount' : ''" :style="'background: ' + config.mainColor">
  23. <view class="text-wrap">
  24. <view class="text-box">
  25. <view class="text">
  26. <text class="money" v-if="item.action_type.type == 'cash'"></text>
  27. <span>{{ item.action_type.value }}</span>
  28. <text class="money" v-if="item.action_type.type == 'discount'"></text>
  29. </view>
  30. <text class="label text">{{ item.label }}</text>
  31. </view>
  32. </view>
  33. <view class="dot-wrap">
  34. <view class="dot-item">
  35. </view>
  36. <view class="dot-item">
  37. </view>
  38. <view class="dot-item">
  39. </view>
  40. <view class="dot-item">
  41. </view>
  42. <view class="dot-item">
  43. </view>
  44. <view class="dot-item">
  45. </view>
  46. <view class="dot-item">
  47. </view>
  48. <view class="dot-item">
  49. </view>
  50. </view>
  51. </view>
  52. <view class="coupon-right">
  53. <view class="top">
  54. <span class="type">
  55. <span v-if="item.channel == 'ec'">商城</span>
  56. <span v-else>门店</span>
  57. </span>
  58. <text class="info">{{item.title}}</text>
  59. </view>
  60. <view class="bottom">
  61. <view class="bottom-use">
  62. <view class="tiem-box">
  63. <text>{{item.use_start_time}}{{item.use_end_time}}</text>
  64. </view>
  65. </view>
  66. </view>
  67. <view class="share mx-1px-top">
  68. <view class="text">
  69. <i class="iconfont icon-fenxianganniu"></i>
  70. <view>分享优惠券</view>
  71. </view>
  72. <view class="iconfont icon-jiantou">
  73. </view>
  74. </view>
  75. </view>
  76. </view>
  77. </view>
  78. </view>
  79. <view class="tab-content" :hidden="activeIndex != 1" v-if="dataList && dataList[1] && dataList[1][0] && tabList && tabList[1]">
  80. <view class="no-list" v-if="!dataList[1][0].length && tabList[1].init">
  81. <i class="iconfont icon-youhuiquan"></i>
  82. <view>报告主人这里暂无<span v-if="is_coupon == 1">优惠券~</span><span v-else>促销活动</span></view>
  83. </view>
  84. <view v-for="(items, idx) in dataList[1]" :key="idx" >
  85. <view class="coupon" :data-id="item.id" :data-limit="item.usage_limit" @tap="jumpDetail" v-for="(item, index) in dataList[1][idx]" :key="index">
  86. <view class="coupon-left" :class="is_coupon != 1 ? 'discount' : ''" :style="'background: ' + config.mainColor">
  87. <view class="text-wrap">
  88. <view class="text-box">
  89. <view class="text">
  90. <text class="money" v-if="item.action_type.type == 'cash'"></text>
  91. <span>{{ item.action_type.value }}</span>
  92. <text class="money" v-if="item.action_type.type == 'discount'"></text>
  93. </view>
  94. <text class="label text">{{ item.label }}</text>
  95. </view>
  96. </view>
  97. <view class="dot-wrap">
  98. <view class="dot-item">
  99. </view>
  100. <view class="dot-item">
  101. </view>
  102. <view class="dot-item">
  103. </view>
  104. <view class="dot-item">
  105. </view>
  106. <view class="dot-item">
  107. </view>
  108. <view class="dot-item">
  109. </view>
  110. <view class="dot-item">
  111. </view>
  112. <view class="dot-item">
  113. </view>
  114. </view>
  115. </view>
  116. <view class="coupon-right">
  117. <view class="top">
  118. <span class="type">
  119. <span v-if="item.channel == 'ec'">商城</span>
  120. <span v-else>门店</span>
  121. </span>
  122. <text class="info">{{item.title}}</text>
  123. </view>
  124. <view class="bottom">
  125. <view class="bottom-use">
  126. <view class="tiem-box">
  127. <text>{{item.use_start_time}}{{item.use_end_time}}</text>
  128. </view>
  129. </view>
  130. </view>
  131. <view class="share mx-1px-top">
  132. <view class="text">
  133. <i class="iconfont icon-fenxianganniu"></i>
  134. <view>分享优惠券</view>
  135. </view>
  136. <view class="iconfont icon-jiantou">
  137. </view>
  138. </view>
  139. </view>
  140. </view>
  141. </view>
  142. </view>
  143. </view>
  144. </view>
  145. </template>
  146. <script>
  147. import {pageLogin, getUrl,config,is} from '@/common/js/utils.js';
  148. export default {
  149. data() {
  150. return {
  151. activeIndex: 0,
  152. sliderOffset: 0,
  153. width: 0,
  154. tabList: [{
  155. title: '线上',
  156. init: false,
  157. page: 0,
  158. more: true
  159. }, {
  160. title: '线下',
  161. init: false,
  162. page: 0,
  163. more: true
  164. }],
  165. dataList: {
  166. 0: [],
  167. 1: []
  168. },
  169. is_coupon: 1,
  170. // 用于判断是否为优惠券 1:优惠券 0:促销折扣
  171. config: ''
  172. };
  173. },
  174. onReachBottom(e) {
  175. var status = this.activeIndex;
  176. var page = this.tabList[status].page + 1;
  177. var tabList = `tabList[${status}]`;
  178. if (this.tabList[status].more) {
  179. this.queryCouponList(status, page);
  180. } else {
  181. wx.showToast({
  182. image: '../../../static/error.png',
  183. title: '再拉也没有啦'
  184. });
  185. }
  186. },
  187. onShow(e) {
  188. wx.getSystemInfo({
  189. success: res => {
  190. this.setData({
  191. width: res.windowWidth / this.tabList.length,
  192. sliderOffset: res.windowWidth / this.tabList.length * this.activeIndex
  193. });
  194. }
  195. });
  196. },
  197. onLoad(e) {
  198. // 第三方平台配置颜色
  199. var gbConfig = this.$cookieStorage.get('globalConfig') || '';
  200. this.setData({
  201. config: gbConfig
  202. });
  203. if (e.type) {
  204. this.setData({
  205. activeIndex: e.type
  206. });
  207. }
  208. ;
  209. this.queryCouponList();
  210. },
  211. methods: {
  212. tabClick(e) {
  213. var status = e.currentTarget.id;
  214. this.setData({
  215. sliderOffset: e.currentTarget.offsetLeft,
  216. activeIndex: status
  217. });
  218. if (!this.tabList[status].init) {
  219. this.queryCouponList(status);
  220. }
  221. },
  222. // 跳转线上详情
  223. jumpDetailOn(e) {
  224. var id = e.currentTarget.dataset.id;
  225. wx.navigateTo({
  226. url: '/pages/distribution/onDetail/onDetail?id=' + id + '&is_coupon=' + this.is_coupon
  227. });
  228. },
  229. // 跳转线下详情
  230. jumpDetail(e) {
  231. var id = e.currentTarget.dataset.id;
  232. wx.navigateTo({
  233. url: '/pages/distribution/offDetail/offDetail?id=' + id + '&is_coupon=' + this.is_coupon
  234. });
  235. },
  236. // 请求优惠券列表
  237. queryCouponList(type = 0, page = 1) {
  238. wx.showLoading({
  239. title: "加载中",
  240. mask: true
  241. });
  242. var token = this.$cookieStorage.get('user_token') || '';
  243. this.$http.get({
  244. api: 'api/discount/list',
  245. header: {
  246. Authorization: token
  247. },
  248. data: {
  249. page,
  250. type,
  251. is_coupon: this.is_coupon,
  252. is_agent: 1
  253. }
  254. }).then(res => {
  255. if (res.statusCode == 200) {
  256. res = res.data;
  257. if (res.status) {
  258. var pages = res.meta.pagination;
  259. var current_page = pages.current_page;
  260. var total_pages = pages.total_pages;
  261. var tabList = `tabList[${type}]`;
  262. // this.setData({
  263. // [`dataList.${type}[${page - 1}]`]: res.data,
  264. // [`${tabList}.init`]: true,
  265. // [`${tabList}.page`]: current_page,
  266. // [`${tabList}.more`]: current_page < total_pages
  267. // });
  268. this.$set(this.dataList[type], page -1, res.data);
  269. this.tabList[type].init=true;
  270. this.tabList[type].page= current_page;
  271. this.tabList[type].morecurrent_page < total_pages;
  272. } else {
  273. wx.showModal({
  274. content: res.message || '请求失败',
  275. showCancel: false
  276. });
  277. }
  278. } else {
  279. wx.showModal({
  280. content: res.message || '请求失败',
  281. showCancel: false
  282. });
  283. }
  284. wx.hideLoading();
  285. }).catch(rej => {
  286. wx.hideLoading();
  287. wx.showModal({
  288. content: rej.message || '请求失败',
  289. showCancel: false
  290. });
  291. });
  292. },
  293. setData: function (obj) {
  294. let that = this;
  295. let keys = [];
  296. let val, data;
  297. Object.keys(obj).forEach(function (key) {
  298. keys = key.split('.');
  299. val = obj[key];
  300. data = that.$data;
  301. keys.forEach(function (key2, index) {
  302. if (index + 1 == keys.length) {
  303. that.$set(data, key2, val);
  304. } else {
  305. if (!data[key2]) {
  306. that.$set(data, key2, {});
  307. }
  308. }
  309. data = data[key2];
  310. });
  311. });
  312. }
  313. },
  314. computed: {},
  315. watch: {}
  316. };
  317. </script>
  318. <style rel="stylesheet/less" lang="less">
  319. @import "coupon";
  320. </style>