collect_goods.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <div class="ml-[20px] min-h-[70vh] px-[20px] py-[30px] w-[1000px] bg-[#fff] rounded-[var(--rounded-big)]">
  3. <div class="full" v-loading="goodsTableData.loading">
  4. <div>
  5. <div class="mb-[27px] text-[18px] text-[#333] font-500">全部商品 ({{ goodsTableData.total }})</div>
  6. <div v-if="goodsTableData.data.length && !goodsTableData.loading">
  7. <div class="products">
  8. <template v-for="(item,index) in goodsTableData.data" :key="index">
  9. <div class="goods-item cursor-pointer border-[1px] border-solid border-[#eee] rounded-[var(--rounded-big)] relative" @click="toGoodsDetail(item.goods.goods_id)">
  10. <div class="w-[227px] h-[227px]">
  11. <el-image class="w-[227px] h-[227px] rounded-t-[var(--rounded-big)]" :src="img(item.goods_cover_thumb_mid ? item.goods_cover_thumb_mid : '')" fit="cover">
  12. <template #error>
  13. <img src="@/assets/images/goods_default.png" class="w-[227px] h-[227px] rounded-t-[var(--rounded-big)]">
  14. </template>
  15. </el-image>
  16. </div>
  17. <div class="px-[20px] pt-[15px] pb-[20px] flex flex-col justify-between h-[112px] mt-[-4px]">
  18. <div class="multi-hidden text-[14px] leading-[18px] text-[#333] h-[36px]">{{item.goods_name}}</div>
  19. <div class="text-[#333] price-font">
  20. <span class="text-[12px]">¥</span>
  21. <span class="text-[20px]">{{item.goods_sku.price}}</span>
  22. </div>
  23. </div>
  24. <div class="collect absolute top-[10px] left-[10px] z-9 bg-[#000] rounded-[4px] text-[#fff] cursor-pointer h-[26px] leading-[26px] opacity-50 w-[70px] text-center text-[12px] hidden" @click.stop="cancelCollectGoods(item.goods.goods_id)">
  25. 取消收藏
  26. </div>
  27. </div>
  28. </template>
  29. </div>
  30. <div class="mt-[16px] flex justify-center">
  31. <el-pagination v-model:current-page="goodsTableData.page" v-model:page-size="goodsTableData.limit" layout="prev, pager, next" background :total="goodsTableData.total" @size-change="loadGoodsList()" @current-change="loadGoodsList" />
  32. </div>
  33. </div>
  34. <div class="min-h-[300px]" v-if="!goodsTableData.data.length && !goodsTableData.loading">
  35. <el-empty description="暂无数据" :image-size="200" :image="img('static/resource/images/system/empty.png')"/>
  36. </div>
  37. </div>
  38. </div>
  39. </div>
  40. </template>
  41. <script lang="ts" setup>
  42. import { reactive, ref } from 'vue'
  43. import { getCollectList, cancelCollect} from '@/addon/mall/api/goods'
  44. import { useRouter } from 'vue-router'
  45. const router = useRouter()
  46. // 获取会员列表
  47. const goodsTableData = reactive({
  48. page: 1,
  49. limit: 10,
  50. total: 0,
  51. loading: true,
  52. data: []
  53. })
  54. const loadGoodsList = (page: number = 1) => {
  55. goodsTableData.loading = true
  56. goodsTableData.page = page
  57. getCollectList({
  58. page: goodsTableData.page,
  59. limit: goodsTableData.limit,
  60. }).then(res => {
  61. goodsTableData.loading = false
  62. goodsTableData.data = res.data.data
  63. goodsTableData.total = res.data.total
  64. }).catch(() => {
  65. goodsTableData.loading = false
  66. })
  67. }
  68. loadGoodsList()
  69. // 商品详情
  70. const toGoodsDetail = (goods_id:number) => {
  71. router.push(`/goods/detail?id=${goods_id}`)
  72. }
  73. // 商品取消收藏
  74. const cancelCollectGoods= (goods_id:number)=>{
  75. cancelCollect({goods_ids: [goods_id]}).then(res => {
  76. loadGoodsList()
  77. })
  78. }
  79. </script>
  80. <style lang="scss" scoped>
  81. .products{
  82. grid-row-gap: 16px;
  83. grid-column-gap: 16px;
  84. display: grid;
  85. grid-template-columns: repeat(4,1fr);
  86. grid-template-rows: auto;
  87. position: relative;
  88. }
  89. .goods-item:hover{
  90. .collect{
  91. display: block;
  92. }
  93. }
  94. </style>