brand.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <div class="ns-brand">
  3. <el-carousel height="400px" v-loading="loadingAd">
  4. <el-carousel-item v-for="item in adList" :key="item.adv_id"><el-image :src="$img(item.adv_image)" fit="cover" @click="$util.pushToTab(item.adv_url.url)" /></el-carousel-item>
  5. </el-carousel>
  6. <!-- 品牌列表 -->
  7. <div class="ns-brand-box" v-loading="loading">
  8. <div>
  9. <div class="ns-brand-title-wrap ns-text-align">
  10. <p class="ns-brand-title">品牌专区</p>
  11. <img src="@/assets/images/goods/split.png" alt="" />
  12. <p class="ns-brand-en">Brand zone</p>
  13. </div>
  14. <div class="ns-brand-list" v-if="brandList.length > 0">
  15. <div class="ns-brand-li" v-for="(item, index) in brandList" :key="index" @click="$router.push({ path: '/goods/list', query: { brand_id: item.brand_id } })">
  16. <div class="ns-brand-wrap">
  17. <el-image fit="scale-down" :src="$img(item.image_url)" lazy @error="imageError(index)"></el-image>
  18. <p :title="item.brand_name">{{ item.brand_name }}</p>
  19. </div>
  20. </div>
  21. </div>
  22. <div class="empty-wrap" v-if="brandList.length <= 0"><div class="ns-text-align">暂无更多品牌,去首页看看吧</div></div>
  23. <div class="pager">
  24. <el-pagination
  25. background
  26. :pager-count="5"
  27. :total="total"
  28. prev-text="上一页"
  29. next-text="下一页"
  30. :current-page.sync="currentPage"
  31. :page-size.sync="pageSize"
  32. @size-change="handlePageSizeChange"
  33. @current-change="handleCurrentPageChange"
  34. hide-on-single-page
  35. ></el-pagination>
  36. </div>
  37. </div>
  38. </div>
  39. </div>
  40. </template>
  41. <script>
  42. import { brandPage } from '@/api/goods/goods';
  43. import { mapGetters } from 'vuex';
  44. import { adList } from '@/api/website';
  45. export default {
  46. name: 'brand',
  47. components: {},
  48. data: () => {
  49. return {
  50. total: 0,
  51. currentPage: 1,
  52. pageSize: 20,
  53. brandList: [],
  54. siteId: 0,
  55. loading: true,
  56. loadingAd: true,
  57. adList: []
  58. };
  59. },
  60. created() {
  61. this.getAdList();
  62. this.getBrandList();
  63. },
  64. computed: {
  65. ...mapGetters(['defaultBrandImage', 'siteInfo'])
  66. },
  67. methods: {
  68. handlePageSizeChange(size) {
  69. this.pageSize = size;
  70. this.refresh();
  71. },
  72. handleCurrentPageChange(page) {
  73. this.currentPage = page;
  74. this.refresh();
  75. },
  76. refresh() {
  77. this.loading = true;
  78. this.getBrandList();
  79. },
  80. getBrandList() {
  81. brandPage({
  82. page_size: this.pageSize,
  83. page: this.currentPage,
  84. site_id: this.siteId
  85. })
  86. .then(res => {
  87. this.brandList = res.data.list;
  88. this.total = res.data.count;
  89. this.loading = false;
  90. window.document.title = `品牌专区 - ${this.siteInfo.site_name}`;
  91. })
  92. .catch(err => {
  93. this.loading = false;
  94. this.$message.error(err.message);
  95. });
  96. },
  97. /**
  98. * 图片加载失败
  99. */
  100. imageError(index) {
  101. this.brandList[index].image_url = this.defaultBrandImage;
  102. },
  103. getAdList() {
  104. adList({ keyword: 'NS_PC_BRAND' })
  105. .then(res => {
  106. this.adList = res.data.adv_list;
  107. for (let i = 0; i < this.adList.length; i++) {
  108. if (this.adList[i].adv_url) this.adList[i].adv_url = JSON.parse(this.adList[i].adv_url);
  109. }
  110. this.loadingAd = false;
  111. })
  112. .catch(err => {
  113. this.loadingAd = false;
  114. });
  115. }
  116. }
  117. };
  118. </script>
  119. <style lang="scss" scoped>
  120. .ns-text-align {
  121. text-align: center;
  122. }
  123. .ns-brand-box {
  124. width: 100%;
  125. background: #ffffff;
  126. > div {
  127. width: $width;
  128. margin: 0 auto;
  129. }
  130. }
  131. .ns-brand-title-wrap {
  132. padding-top: 54px;
  133. .ns-brand-title {
  134. font-size: 26px;
  135. font-weight: 600;
  136. line-height: 30px;
  137. }
  138. .ns-brand-en {
  139. font-size: 24px;
  140. font-weight: 600;
  141. color: #383838;
  142. opacity: 0.2;
  143. text-transform: uppercase;
  144. letter-spacing: 5px;
  145. line-height: 30px;
  146. }
  147. }
  148. .ns-brand-list {
  149. display: flex;
  150. flex-wrap: wrap;
  151. padding-top: 30px;
  152. .ns-brand-li {
  153. width: 20%;
  154. padding: 8px 6px;
  155. box-sizing: border-box;
  156. .ns-brand-wrap {
  157. width: 100%;
  158. border: 1px solid #f1f1f1;
  159. overflow: hidden;
  160. color: #303133;
  161. padding: 15px;
  162. box-sizing: border-box;
  163. cursor: pointer;
  164. text-align: center;
  165. .el-image {
  166. width: 100%;
  167. height: 120px;
  168. line-height: 120px;
  169. }
  170. p {
  171. font-size: 22px;
  172. color: #383838;
  173. overflow: hidden;
  174. text-overflow: ellipsis;
  175. white-space: nowrap;
  176. }
  177. }
  178. }
  179. }
  180. .empty-wrap {
  181. margin-top: 30px;
  182. }
  183. </style>
  184. <style lang="scss">
  185. .ns-brand {
  186. .el-carousel {
  187. .el-image__inner {
  188. width: auto;
  189. }
  190. }
  191. .el-carousel__arrow--right {
  192. right: 60px;
  193. }
  194. }
  195. </style>