list.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <template>
  2. <!-- #ifdef H5 -->
  3. <zj-page-layout
  4. :hasFooter="false"
  5. :isScroll="true"
  6. :refresherTriggered="refresherTriggered"
  7. @refresherrefresh="refresherrefresh"
  8. @scrolltolower="scrolltolower">
  9. <template slot="header">
  10. <view class="header-container">
  11. <u-tabs
  12. :list="categoryList"
  13. :current="categoryCurrent"
  14. @click="clickCategory"
  15. keyName="categoryName"
  16. :scrollable="categoryList.length === 4 ? false : true"
  17. lineColor="#01C30B">
  18. </u-tabs>
  19. <u-search
  20. placeholder="输入商品名称搜索"
  21. :showAction="false"
  22. clearabled
  23. v-model="keyword"
  24. @search="refreshList"
  25. @clear="refreshList">
  26. </u-search>
  27. <u-tabs
  28. :list="tabList"
  29. :current="tabCurrent"
  30. @click="clickTab"
  31. :scrollable="false"
  32. lineColor="#01C30B">
  33. </u-tabs>
  34. </view>
  35. </template>
  36. <view class="common-goods-list">
  37. <view class="item" v-for="(item, index) in dataList" :key="index" @tap="toGoodsDetail(item.id)">
  38. <view class="soldout" v-if="item.status === 4">
  39. <image src="@/static/common/soldout.png" mode="widthFix"></image>
  40. </view>
  41. <view class="top">
  42. <image src="@/static/common/logo.png"></image>
  43. <view class="user">
  44. <view class="name">{{item.userName}}</view>
  45. <view class="time">{{item.createTime}}</view>
  46. </view>
  47. <view class="price">{{item.amount | priceFilter2}}</view>
  48. </view>
  49. <view class="title">{{item.title}}</view>
  50. <view class="des">{{item.content}}</view>
  51. <view class="imgs">
  52. <image :src="imgUrl + it.imgUrl" v-for="(it, idx) in item.goodsFiles" :key="idx" mode="aspectFill"></image>
  53. </view>
  54. <view class="bottom">
  55. <view class="left-location"><text class="iconfont icon-dingwei"></text>{{item.city}} {{item.area}}</view>
  56. <view class="right-stats">
  57. <view class="it">
  58. <text class="iconfont icon-dianzan"></text>
  59. <text class="text">2</text>
  60. </view>
  61. <view class="it">
  62. <text class="iconfont icon-pinglun"></text>
  63. <text class="text">2</text>
  64. </view>
  65. <view class="it">
  66. <text class="iconfont icon-liulan"></text>
  67. <text class="text">2</text>
  68. </view>
  69. </view>
  70. </view>
  71. </view>
  72. </view>
  73. <Loading :loadStatus="loadStatus" :dataList="dataList" />
  74. </zj-page-layout>
  75. <!-- #endif -->
  76. <!-- #ifndef H5 -->
  77. <web-view :src="webViewHref('/pages/goods/list', pam)"></web-view>
  78. <!-- #endif -->
  79. </template>
  80. <script>
  81. // #ifdef H5
  82. export default {
  83. data() {
  84. return {
  85. imgUrl: this.$imageUrl,
  86. categoryList: [],
  87. categoryId: '',
  88. tabList: [
  89. {name: '默认顺序', value: 0},
  90. {name: '在售商品', value: 1},
  91. {name: '离我最近', value: 2},
  92. {name: '人气最高', value: 3},
  93. ],
  94. tabCurrent: 0,
  95. keyword: '',
  96. dataList: [],
  97. pageNum: 1,
  98. loadStatus: 0,
  99. refresherTriggered: false,
  100. }
  101. },
  102. computed:{
  103. categoryCurrent() {
  104. if(this.categoryId) {
  105. return this.categoryList.map(item => item.categoryId).indexOf(this.categoryId)
  106. }else {
  107. return 0
  108. }
  109. }
  110. },
  111. async onLoad({categoryId, keyword}) {
  112. console.log(categoryId);
  113. console.log(keyword);
  114. this.categoryId = categoryId;
  115. this.keyword = keyword;
  116. await this.getCategory();
  117. await this.getList();
  118. },
  119. methods: {
  120. async getCategory() {
  121. return new Promise((resolve, reject) => {
  122. this.$api.get('/goods/category/list')
  123. .then(res => {
  124. this.categoryList = res.data || [];
  125. }).finally(res => {
  126. resolve(1);
  127. })
  128. })
  129. },
  130. //获取列表数据
  131. async getList() {
  132. let params = {};
  133. if(this.tabCurrent === 1) {
  134. params.status = '1';
  135. }else if(this.tabCurrent === 2) {
  136. params.lng = this.lng;
  137. params.lat = this.lat;
  138. }else if(this.tabCurrent === 3) {
  139. params.visitOrderBy = 'YES';
  140. }
  141. this.$api.get('/goods/list', {
  142. pageNum: this.pageNum,
  143. pageSize: 10,
  144. categoryId: this.categoryId,
  145. title: this.keyword,
  146. ...params
  147. }).then(res => {
  148. this.loadStatus = 0;
  149. let list = res.data.records;
  150. if (list.length < 10) {
  151. this.loadStatus = 2;
  152. }
  153. this.dataList = this.dataList.concat(list);
  154. }).catch(() => {
  155. this.loadStatus = 2;
  156. })
  157. },
  158. clickCategory(item) {
  159. this.categoryId = item.categoryId;
  160. this.refreshList();
  161. },
  162. clickTab(item) {
  163. this.tabCurrent = item.value;
  164. this.refreshList();
  165. },
  166. // 滚动到底部
  167. scrolltolower(e) {
  168. if (this.loadStatus === 0) {
  169. this.pageNum++;
  170. this.getList();
  171. }
  172. },
  173. // 触发下拉刷新
  174. async refresherrefresh(e) {
  175. this.refresherTriggered = true;
  176. // await this.getCategory();
  177. this.refreshList();
  178. this.refresherTriggered = false;
  179. },
  180. refreshList() {
  181. this.dataList = [];
  182. this.pageNum = 1;
  183. this.getList();
  184. },
  185. toGoodsDetail(id) {
  186. this.$navToPage({
  187. url: `/pages/goods/detail?id=${id}`
  188. })
  189. },
  190. }
  191. }
  192. // #endif
  193. // #ifndef H5
  194. export default {
  195. data() {
  196. return {
  197. pam: {},
  198. }
  199. },
  200. onLoad(pam) {
  201. this.pam = pam;
  202. },
  203. }
  204. // #endif
  205. </script>
  206. <style lang="scss" scoped>
  207. .header-container {
  208. background: #ffffff;
  209. padding: 0 30rpx;
  210. ::v-deep .u-search {
  211. margin-top: 20rpx !important;
  212. }
  213. }
  214. .common-goods-list {
  215. padding: 0 30rpx;
  216. .item {
  217. @include zj-card;
  218. }
  219. }
  220. </style>