browse.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <div class="w-full min-h-[70vh] bg-page pt-6">
  3. <div class="main-container flex justify-between" >
  4. <sidebar></sidebar>
  5. <div class="ml-[20px] px-[20px] py-[30px] flex-1 bg-[#fff]" v-loading="browseData.loading">
  6. <div class="text-[18px] text-[#333] font-500 leading-[18px] ml-[10px] mb-[27px]">{{ t('title') }}({{ browseData.total }})</div>
  7. <div class="bg-[#FFF4F4] text-primary text-[12px] h-[32px] leading-[32px] pl-[10px] mb-[20px]">
  8. 共{{ browseData.total }}条记录,{{t('remark')}}
  9. </div>
  10. <div v-if="browseData.total && !browseData.loading">
  11. <div v-for="(item, index) in browseData.data" class="mb-30px" :key="index">
  12. <div class="flex items-center ml-[10px] mb-[18px]">
  13. <span class="iconfont icon-riliV6xx text-[16px] mr-[6px]"></span>
  14. <span class="text-[#333] text-[14px]">{{ index }}</span>
  15. </div>
  16. <div class="goods-list">
  17. <div class="w-[228px] h-[342px] cursor-pointer border-[1px] border-solid border-[#eee]" v-for="(goodsItem, goodsIndex) in item" :key="goodsIndex" @click="toDetail(goodsItem)">
  18. <div class="flex items-center justify-center">
  19. <el-image class="w-[227px] h-[227px]" :class="{'opacity-25':goodsItem.goods.status != 1 || goodsItem.goods.delete_time > 0}" :src="img(goodsItem.goods_cover_thumb_mid ? goodsItem.goods_cover_thumb_mid : '')" fit="cover">
  20. <template #error>
  21. <img src="@/assets/images/goods_default.png" class="w-[227px] h-[227px]">
  22. </template>
  23. </el-image>
  24. </div>
  25. <div class="pt-[15px] px-[20px] pb-[20px] h-[112px] flex flex-col justify-between">
  26. <div class="text-[14px] text-[#333] multi-hidden leading-[20px]" :class="{'text-[#999]':goodsItem.goods.status != 1 || goodsItem.goods.delete_time > 0}">{{ goodsItem.goods_name }}</div>
  27. <div class="flex justify-between">
  28. <div class="text-[#333] text-[14px] oppoSans-R" v-if="goodsItem.goods.delete_time > 0">
  29. {{t('delete')}}
  30. </div>
  31. <div class="text-[#333] text-[14px] oppoSans-R" v-else-if="goodsItem.goods.status != 1">
  32. {{t('invalid')}}
  33. </div>
  34. <div class="text-primary flex items-baseline" v-else>
  35. <span class="price-font font-600 text-[14px]">¥</span>
  36. <span class="price-font text-[20px] font-600">{{parseFloat(goodsItem.price).toFixed(2)}}</span>
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. </div>
  42. </div>
  43. </div>
  44. <div class="min-h-[300px]" v-if="!browseData.total && !browseData.loading">
  45. <el-empty :description="t('empty')" :image-size="200" :image="img('static/resource/images/system/empty.png')"/>
  46. </div>
  47. </div>
  48. </div>
  49. </div>
  50. </template>
  51. <script lang="ts" setup>
  52. import { reactive } from 'vue'
  53. import { getBrowseList } from '@/addon/mall/api/member'
  54. import { useRouter } from 'vue-router'
  55. const router = useRouter()
  56. const browseData = reactive({
  57. total: 0,
  58. loading: true,
  59. data: []
  60. })
  61. const loadBrowseList = (page: number = 1) => {
  62. browseData.loading = true
  63. getBrowseList().then(res => {
  64. browseData.loading = false
  65. browseData.data = res.data.list
  66. browseData.total = res.data.count
  67. }).catch(() => {
  68. browseData.loading = false
  69. })
  70. }
  71. loadBrowseList()
  72. const toDetail = (item:any) => {
  73. if(item.goods.delete_time > 0 || item.goods.status != 1) return
  74. router.push(`/goods/detail?id=${item.goods_id}`)
  75. }
  76. </script>
  77. <style lang="scss" scoped>
  78. .goods-list{
  79. grid-row-gap: 16px;
  80. grid-column-gap: 16px;
  81. display: grid;
  82. grid-template-columns: repeat(4,1fr);
  83. grid-template-rows: auto;
  84. position: relative;
  85. }
  86. </style>