index.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <template>
  2. <view class="page">
  3. <!-- 带tab的导航栏 -->
  4. <NvabarTopSearch url="/pages/search" placeholder="搜索" >
  5. <!-- showSlot -->
  6. <!-- <view class="shopcart" @click="goShoppingCart">
  7. <u-badge type="error" count="1" :offset="[-10, -10]" size="mini"></u-badge>
  8. <u-icon size="48" name="chat"></u-icon>
  9. </view> -->
  10. </NvabarTopSearch>
  11. <!-- 轮播图 -->
  12. <view class="banner-swiper">
  13. <u-swiper height="300rpx" :list="bannerSwiperList" img-mode="scaleToFill" mode="round" name="pic_url" border-radius="20" @click="swiperClick"></u-swiper>
  14. </view>
  15. <!-- 金刚区 -->
  16. <view class="dial-nav"><dial-nav imgSize="88rpx" :list="dialNavList" img-name="pic_url" label-name="button_name" :mode="10"></dial-nav></view>
  17. <!-- 海报区 -->
  18. <Poster v-if="posterList[0]" :data="posterList[0].elements"></Poster>
  19. <!-- 热门推荐 -->
  20. <goodsModel type="hot" :list="hotGoodsList" v-if="hotGoodsList&&hotGoodsList.length>0"></goodsModel>
  21. <goodsModel type="recommend" :list="recommendGoodsList" v-if="recommendGoodsList&&recommendGoodsList.length>0"></goodsModel>
  22. <view class="cateTitle">
  23. <text>好物推荐</text>
  24. </view>
  25. <view class="cardGoodsBox">
  26. <!-- <CardGoods v-for="(item, index) in goodsList" :key="index" :data="item"></CardGoods> -->
  27. <cardGoodsModel :list="goodsList"></cardGoodsModel>
  28. </view>
  29. <NoData height="60vh" type="order" v-if="goodsPage.finish&&goodsList.length==0"></NoData>
  30. <!-- <view class="loadmore" v-else>
  31. <u-loadmore :status="goodsPage.finish?'nomore':goodsPage.loading?'loading':'loadmore'" :load-text="loadText" color="#aaa"/>
  32. </view> -->
  33. <LoadMore v-else :loadtype="goodsPage"></LoadMore>
  34. <button class="serviceBtn" open-type="contact" >
  35. <u-icon size="46" name="server-fill"></u-icon>
  36. <text>客服</text>
  37. </button>
  38. </view>
  39. </template>
  40. <script>
  41. // 组件
  42. import NvabarTopSearch from '@/components/navbar/navbar-top-search.vue';
  43. import DialNav from '@/components/nav/dial-nav.vue';
  44. import Poster from '@/pages/mall/components/poster.vue';
  45. import goodsModel from '@/pages/mall/components/goodsModel.vue';
  46. import cardGoodsModel from '@/pages/mall/components/cardGoodsModel.vue';
  47. import { goType } from '../../utils/pub';
  48. export default {
  49. components: {
  50. NvabarTopSearch,
  51. DialNav,
  52. Poster,
  53. goodsModel,
  54. cardGoodsModel
  55. },
  56. data() {
  57. return {
  58. // 轮播图
  59. bannerSwiperList: [],
  60. // 金刚区
  61. dialNavList: [],
  62. // 三图
  63. posterList:[],
  64. // 热门商品
  65. hotGoodsList:[],
  66. // 推荐
  67. recommendGoodsList:[],
  68. // 首页推荐列表
  69. goodsList: [],
  70. goodsPage:{
  71. page:1,
  72. loading:false,
  73. finish:false,
  74. },
  75. };
  76. },
  77. onLoad() {
  78. this.getHomeData();
  79. this.getHotGoodsList();
  80. this.getRecommendGoodsList();
  81. this.getGoodsList();
  82. },
  83. onPullDownRefresh(){
  84. this.getHomeData();
  85. this.goodsPage = {
  86. page:1,
  87. loading:false,
  88. finish:false,
  89. }
  90. // this.goodsList = [];
  91. this.getHotGoodsList();
  92. this.getRecommendGoodsList();
  93. this.getGoodsList();
  94. },
  95. onReachBottom(){
  96. console.log('滚动到底部')
  97. // this.getData();
  98. this.getGoodsList();
  99. },
  100. methods: {
  101. getHomeData() {
  102. // this.bannerSwiperList = bannerSwiperList;
  103. // this.dialNavList = dialNavList;
  104. this.getMallSwiperFun();
  105. this.getMallMenusFun();
  106. this.getSelfElementList();
  107. },
  108. // 获取轮播图
  109. getMallSwiperFun(){
  110. this.$u.api.getMallSwiperAjax().then(({code,data})=>{
  111. if(code==1){
  112. this.bannerSwiperList = data;
  113. }
  114. }).catch(()=>{
  115. })
  116. },
  117. // 获取金刚区按钮组
  118. getMallMenusFun(){
  119. this.$u.api.getMallMenuAjax().then(({code,data})=>{
  120. if(code==1){
  121. this.dialNavList = data;
  122. }
  123. }).catch(()=>{
  124. })
  125. },
  126. // 轮播图标记
  127. swiperClick(e){
  128. goType(this.bannerSwiperList[e]);
  129. },
  130. // 三图位置接口
  131. getSelfElementList(){
  132. this.$u.api.getSelfElementListAjax().then(({data})=>{
  133. console.log(data);
  134. this.posterList = data.data;
  135. })
  136. },
  137. // 去购物粗
  138. goShoppingCart() {
  139. uni.navigateTo({
  140. url: '/pages-mall/pages/shopping-cart'
  141. });
  142. },
  143. // 获取热门商品(主页默认取第一页数据)
  144. getHotGoodsList(){
  145. this.$u.api.getGoodsListAjax({
  146. page:1,
  147. tags_type:'hot',
  148. }).then(({code,data})=>{
  149. if(code==1){
  150. this.hotGoodsList = data.data;
  151. }
  152. }).catch(()=>{
  153. })
  154. },
  155. // 获取推荐商品(主页默认取第一页数据)
  156. getRecommendGoodsList(){
  157. this.$u.api.getGoodsListAjax({
  158. page:1,
  159. tags_type:'recommend',
  160. }).then(({code,data})=>{
  161. if(code==1){
  162. this.recommendGoodsList = data.data;
  163. }
  164. }).catch(()=>{
  165. })
  166. },
  167. // 获取商品列表
  168. getGoodsList(){
  169. if(this.goodsPage.finish) return false;
  170. if(this.goodsPage.loading) return false;
  171. this.goodsPage.loading = true;
  172. this.$u.api.getGoodsListAjax({
  173. page:this.goodsPage.page,
  174. }).then(({code,data})=>{
  175. uni.stopPullDownRefresh();
  176. this.goodsPage.loading = false;
  177. if(code==1){
  178. if(data.last_page<=data.current_page){
  179. this.goodsPage.finish = true;
  180. }
  181. if(data.current_page==1){
  182. this.goodsList = data.data;
  183. }else{
  184. this.goodsList=this.goodsList.concat(data.data);
  185. }
  186. }else{
  187. this.goodsPage.finish = true;
  188. }
  189. this.goodsPage.page = data.current_page+1;
  190. }).catch(()=>{
  191. uni.stopPullDownRefresh();
  192. this.goodsPage.loading = false;
  193. this.goodsPage.finish = true;
  194. })
  195. },
  196. }
  197. };
  198. </script>
  199. <style lang="scss" scoped>
  200. .cateTitle{
  201. // height: 80rpx;
  202. margin: 30rpx 30rpx;
  203. border-left: 10rpx solid $app-theme-color;
  204. padding: 0 10rpx;
  205. font-size: 36rpx;
  206. font-weight: bold;
  207. }
  208. .shopcart {
  209. position: relative;
  210. display: flex;
  211. align-items: center;
  212. }
  213. .banner-swiper {
  214. padding: 0 30rpx;
  215. background-color: $app-theme-bg-color;
  216. }
  217. .dial-nav {
  218. background-color: $app-theme-bg-color;
  219. }
  220. .recommendGoods {
  221. .list {
  222. padding: 0 30rpx;
  223. }
  224. }
  225. .serviceBtn{
  226. width: 110rpx;
  227. height: 110rpx;
  228. border-radius: 50%;
  229. display: flex;
  230. justify-content: center;
  231. align-items: center;
  232. flex-direction: column;
  233. background-color: rgba($app-theme-color,.8);
  234. color: #fff;
  235. position: fixed;
  236. right: 30rpx;
  237. bottom: 30rpx;
  238. z-index: 999;
  239. padding: 0;
  240. &::after{
  241. content: '';
  242. border:none;
  243. }
  244. text{
  245. font-size: 24rpx;
  246. line-height: 1;
  247. margin-top: 6rpx;
  248. }
  249. }
  250. </style>