list.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <view class="d-flex flex-col bg-base" style="min-height:100vh">
  3. <view class="top-tab bg-base">
  4. <u-tabs
  5. :list="tabs.content.value || []"
  6. lineWidth="30"
  7. lineColor="#d9492e"
  8. :activeStyle="{
  9. color: '#000',
  10. fontWeight: 'bold',
  11. transform: 'scale(1.05)'
  12. }"
  13. :inactiveStyle="{
  14. color: '#606266',
  15. transform: 'scale(1)'
  16. }"
  17. :scrollable="true"
  18. class="top-tab"
  19. @click="(e: any) => tab = e.id"
  20. />
  21. </view>
  22. <view class="d-flex flex-col p-2">
  23. <uni-search-bar
  24. v-model="searchValue"
  25. radius="100"
  26. bgColor="#fff"
  27. placeholder="搜索闽南语"
  28. clearButton="auto"
  29. cancelButton="none"
  30. @clear="doSearch"
  31. @confirm="doSearch"
  32. />
  33. <view class="d-flex flex-row justify-between align-center pl-3 pr-3">
  34. <view class="d-flex flex-row align-center">
  35. 自动连播
  36. <switch
  37. class="ml-1"
  38. color="#d9492e"
  39. :checked="playAuto"
  40. @change="(e: any) => playAuto = e.detail.value"
  41. style="transform:scale(0.6)"
  42. />
  43. </view>
  44. <view>
  45. <text class="iconfont icon-play mr-1"></text>
  46. <text v-if="playMode=='list'" @click="playMode='loop'">列表播放</text>
  47. <text v-else-if="playMode=='loop'" @click="playMode='random'">单个循环</text>
  48. <text v-else-if="playMode=='random'" @click="playMode='list'">随机播放</text>
  49. <text v-else @click="playMode='list'">播放模式</text>
  50. </view>
  51. </view>
  52. </view>
  53. <view class="d-flex flex-col p-2 pt-0">
  54. <SimpleListAudioPlayer
  55. ref="player"
  56. :list="listLoader.list.value ?? []"
  57. :playMode="playMode"
  58. :playAuto="playAuto"
  59. >
  60. <template #default="{ currentPlayItemId, isPlaying }">
  61. <view
  62. v-for="item in listLoader.list.value"
  63. :key="item.id"
  64. >
  65. <Box2LinePlayRightArrow
  66. classNames="ml-2 mb-3"
  67. titleColor="title-text"
  68. :image="item.image"
  69. :title="item.title"
  70. :isCurrent="item.id == currentPlayItemId"
  71. :isPlaying="isPlaying"
  72. @click="player.playpause(item.id)"
  73. />
  74. </view>
  75. </template>
  76. </SimpleListAudioPlayer>
  77. </view>
  78. <SimplePageListLoader :loader="listLoader" />
  79. </view>
  80. </template>
  81. <script setup lang="ts">
  82. import { ref, watch } from 'vue';
  83. import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
  84. import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
  85. import { navTo } from '@/common/utils/PageAction';
  86. import CommonContent, { GetContentListParams } from '@/api/CommonContent';
  87. import SimplePageListLoader from '@/common/components/SimplePageListLoader.vue';
  88. import AppCofig from '@/common/config/AppCofig';
  89. import Box2LinePlayRightArrow from '@/pages/parts/Box2LinePlayRightArrow.vue';
  90. import SimpleListAudioPlayer from '@/common/components/SimpleListAudioPlayer.vue';
  91. const tabs = useSimpleDataLoader(async () => {
  92. const res = await CommonContent.getModelColumList(5, 1, 50);
  93. tab.value = res[0].id
  94. return res;
  95. }, true);
  96. const player = ref();
  97. const playMode = ref<'loop'|'random'|'list'>(uni.getStorageSync('LanguagePlayMode') || 'list');
  98. const playAuto = ref(Boolean(uni.getStorageSync('LanguageAutoPlay')));
  99. console.log(playAuto);
  100. const searchValue = ref('');
  101. const tab = ref(0)
  102. const listLoader = useSimplePageListLoader(8, async (page, pageSize) => {
  103. const res = await CommonContent.getContentList(new GetContentListParams()
  104. .setModelId(5)
  105. .setKeywords(searchValue.value)
  106. .setMainBodyColumnId(tab.value)
  107. , page, pageSize);
  108. return { list: res.list.map((item) => {
  109. return {
  110. id: item.id,
  111. image: item.thumbnail || item.image || AppCofig.defaultImage,
  112. title: item.title,
  113. src: item.audio as string,
  114. }
  115. }), total: res.total }
  116. });
  117. watch(playMode, () => uni.setStorageSync('LanguagePlayMode', playMode.value));
  118. watch(playAuto, () => uni.setStorageSync('LanguageAutoPlay', playAuto.value))
  119. watch(tab, () => listLoader.loadData(undefined, true));
  120. function doSearch() {
  121. listLoader.loadData(undefined, true);
  122. }
  123. </script>