index-guide.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <template>
  2. <view class="mt-32 mx-30">
  3. <ie-card title="通关指南">
  4. <view class="wrap mt-20 bg-white rounded-15">
  5. <uv-tabs :current="current" :list="tabs" :scrollable="false" @change="handleChange"></uv-tabs>
  6. <view class="p-30 grid grid-cols-2 gap-x-20 gap-y-20 justify-items-center">
  7. <view class="w-full justify-items-center relative h-150" v-for="(item, index) in contentList" :key="item.id"
  8. @click="handleClick(item)">
  9. <ie-image :is-oss="true" :src="item.image" class="w-full h-full" :round="10" bg-color="transparent" />
  10. <view class="absolute inset-0 h-full z-1 flex flex-col items-start justify-center box-border pl-16">
  11. <view v-if="item.subType" class="text-28 text-fore-title font-bold">{{ item.subType }}</view>
  12. <view v-if="item.description" class="mt-6 text-20 text-fore-light">{{ item.description }}</view>
  13. </view>
  14. </view>
  15. </view>
  16. </view>
  17. </ie-card>
  18. </view>
  19. </template>
  20. <script lang="ts" setup>
  21. import { getNewsMainList } from '@/api/modules/news';
  22. import { Guide } from '@/types/news';
  23. import config from '@/config';
  24. import { useUserStore } from '@/store/userStore';
  25. import { useTransferPage } from '@/hooks/useTransferPage';
  26. const userStore = useUserStore();
  27. const { transferTo } = useTransferPage();
  28. const current = ref(0);
  29. const newsList = ref<Guide[]>([]);
  30. const bgPool = [
  31. ['ie-guide-5.png', 'ie-guide-6.png', 'ie-guide-7.png'],
  32. ['ie-guide-1.png', 'ie-guide-2.png', 'ie-guide-3.png', 'ie-guide-4.png'],
  33. ['ie-guide-8.png']
  34. ]
  35. const tabs = computed(() => {
  36. const set = new Set();
  37. if (!newsList.value.length) {
  38. return [];
  39. }
  40. newsList.value.forEach(item => {
  41. set.add(item.type);
  42. });
  43. return Array.from(set).map(type => ({ name: type }));
  44. });
  45. const contentList = computed(() => {
  46. return newsList.value.filter(news => news.type === tabs.value[current.value].name).map((item, index) => {
  47. const bgPoolIndex = current.value % bgPool.length;
  48. return {
  49. ...item,
  50. image: '/guide/' + bgPool[bgPoolIndex][index % bgPool[bgPoolIndex].length]
  51. }
  52. });
  53. });
  54. const handleChange = (e: any) => {
  55. current.value = e.index;
  56. }
  57. const emit = defineEmits<{
  58. detail: [id: number | string, title: string, url: string|undefined]
  59. }>();
  60. const handleClick = async (data: Guide) => {
  61. emit('detail', data.refIds, data.subType, data.url);
  62. }
  63. const loadData = () => {
  64. getNewsMainList().then(res => {
  65. newsList.value = res.rows;
  66. });
  67. }
  68. onLoad(() => {
  69. loadData();
  70. });
  71. </script>
  72. <style lang="scss" scoped>
  73. .wrap {
  74. box-shadow: 0px 2px 20px 0px rgba(0, 0, 0, 0.05);
  75. }
  76. </style>