index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <div class="home2">
  3. <div v-if="isLogin" class="home2-top">
  4. <div class="w1100">
  5. <div class="home2-top-lf">
  6. <div>
  7. <p>我的书架</p>
  8. <p>
  9. <span>{{ collectedCount }}</span
  10. >本<img
  11. draggable="false"
  12. src="./images/icon_more-min.png"
  13. @click="$router.push({ name: 'bookshelf' })"
  14. />
  15. </p>
  16. </div>
  17. <el-button class="home2-top__pick" type="primary">去挑书 +</el-button>
  18. </div>
  19. <div class="home2-top-main">
  20. <book-card
  21. v-for="item in bookList.slice(0, 4)"
  22. :key="item.id"
  23. :item="item"
  24. type="column"
  25. :show-like="item.isCollect === 1"
  26. :show-read="item.isCollect === 0"
  27. />
  28. </div>
  29. <el-empty
  30. v-if="!bookList.length && !bookLoading"
  31. description="暂无收藏"
  32. >
  33. <template #image><div /></template>
  34. </el-empty>
  35. </div>
  36. </div>
  37. <div class="home2-main w1100">
  38. <rank-panel
  39. v-loading="recommendLoading"
  40. sub-title="用户最喜爱的文献"
  41. :list="recommendList"
  42. >
  43. <template #title-prepend>
  44. <img draggable="false" src="./images/text_recommend-min.png" />
  45. </template>
  46. </rank-panel>
  47. <rank-panel
  48. v-loading="readLoading"
  49. sub-title="阅读量最多的文献"
  50. :list="readList"
  51. >
  52. <template #title-prepend>
  53. <img draggable="false" src="./images/text_readomg-min.png" />
  54. </template>
  55. </rank-panel>
  56. </div>
  57. <news />
  58. </div>
  59. </template>
  60. <script setup>
  61. import { ref, onMounted, watch } from "vue";
  62. import { storeToRefs } from "pinia";
  63. import { useBaseStore } from "@/stores";
  64. import {
  65. getRecommendListApi,
  66. getReadListApi,
  67. getMyBookListApi,
  68. getUserCollectedBookCountApi,
  69. } from "@/api";
  70. import BookCard from "@/components/BookCard/index.vue";
  71. import RankPanel from "@/components/RankPanel/index.vue";
  72. import News from "./components/News.vue";
  73. const baseStore = useBaseStore();
  74. const { isLogin } = storeToRefs(baseStore);
  75. const recommendLoading = ref(false);
  76. const recommendList = ref([]);
  77. const readLoading = ref(false);
  78. const readList = ref([]);
  79. const bookLoading = ref(false);
  80. const bookList = ref([]);
  81. const collectedCount = ref("-");
  82. onMounted(() => {
  83. getRecommendList();
  84. getReadList();
  85. getUserCollectedBookCount();
  86. });
  87. const getUserCollectedBookCount = async () => {
  88. const data = await getUserCollectedBookCountApi();
  89. collectedCount.value = data;
  90. };
  91. const getMyBookList = async () => {
  92. try {
  93. bookLoading.value = true;
  94. const data = await getMyBookListApi();
  95. bookList.value = data;
  96. } finally {
  97. bookLoading.value = false;
  98. }
  99. };
  100. const getReadList = async () => {
  101. try {
  102. readLoading.value = true;
  103. const data = await getReadListApi();
  104. readList.value = data;
  105. } finally {
  106. readLoading.value = false;
  107. }
  108. };
  109. const getRecommendList = async () => {
  110. try {
  111. recommendLoading.value = true;
  112. const data = await getRecommendListApi({
  113. pageNum: 1,
  114. pageSize: 10,
  115. type: "rank",
  116. });
  117. recommendList.value = data;
  118. } finally {
  119. recommendLoading.value = false;
  120. }
  121. };
  122. watch(
  123. isLogin,
  124. () => {
  125. if (isLogin.value) {
  126. getMyBookList();
  127. }
  128. },
  129. {
  130. immediate: true,
  131. }
  132. );
  133. </script>
  134. <style lang="scss" scoped>
  135. @import "./index.scss";
  136. </style>