index.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <template>
  2. <div>
  3. <!-- HERO -->
  4. <hero
  5. :title="courseHero.title"
  6. :subtitle="courseHero.subtitle"
  7. :image="courseHero.image"
  8. :promoLink="courseHero.product && courseHero.product.productLink"
  9. />
  10. <!-- HERO -->
  11. <section class="section">
  12. <div class="container">
  13. <h1 class="title">Featured Courses</h1>
  14. <div class="columns is-multiline">
  15. <div
  16. v-for="course in courses"
  17. :key="course._id"
  18. class="column is-one-quarter">
  19. <!-- CARD-ITEM -->
  20. <v-popover
  21. offset="16"
  22. trigger="hover"
  23. placement="right-start">
  24. <course-card :course="course"/>
  25. <template slot="popover">
  26. <course-card-tooltip
  27. :title="course.title"
  28. :subtitle="course.category.name"
  29. :description="course.subtitle"
  30. :wsl="course.wsl"
  31. />
  32. </template>
  33. </v-popover>
  34. <!-- CARD-ITEM-END -->
  35. </div>
  36. </div>
  37. </div>
  38. </section>
  39. <section class="section">
  40. <div class="container">
  41. <h1 class="title">Featured Articles</h1>
  42. <div class="columns is-multiline">
  43. <div v-for="blog in featuredBlogs" :key="blog._id" class="column is-one-quarter">
  44. <blog-card
  45. :key="blog._id"
  46. :blog="blog"
  47. />
  48. <!-- CARD-ITEM-END -->
  49. </div>
  50. </div>
  51. </div>
  52. </section>
  53. </div>
  54. </template>
  55. <script>
  56. import Hero from "~/components/shared/Hero";
  57. import CourseCard from "~/components/CourseCard";
  58. import CourseCardTooltip from '~/components/CourseCardTooltip'
  59. import BlogCard from "~/components/BlogCard";
  60. import {mapState} from "vuex"
  61. export default {
  62. head: {
  63. title: 'Online Courses and Blogs | Nuxtjs'
  64. },
  65. components: {
  66. Hero, CourseCard, BlogCard,CourseCardTooltip
  67. },
  68. computed : {
  69. ...mapState({
  70. // courses: state => {
  71. // console.log('index.vue mapState')
  72. // return state.course.items
  73. // }
  74. courses : state => state.course.items,
  75. featuredBlogs: state => state.blog.items.featured,
  76. courseHero: state => state.hero.item
  77. })
  78. },
  79. async fetch({store}) {
  80. const result = await store.dispatch('course/fetchCourses')
  81. console.log('index.vue fetch')
  82. await store.dispatch('blog/fetchFeaturedBlogs', {'filter[featured]': true})
  83. }
  84. }
  85. </script>
  86. <style scoped lang="scss">
  87. // card item
  88. .card-image:hover {
  89. cursor: pointer;
  90. opacity: 0.9;
  91. }
  92. .price-box {
  93. text-align: right;
  94. .price {
  95. color: gray;
  96. font-size: 16px;
  97. text-decoration: line-through;
  98. }
  99. .disc-price {
  100. font-size: 21px;
  101. font-weight: bold;
  102. }
  103. }
  104. // card item end
  105. // hero
  106. .hero-body {
  107. position: relative;
  108. }
  109. .hero-img {
  110. opacity: 0.8;
  111. position: absolute;
  112. height: 100%;
  113. width: 100%;
  114. top: 0;
  115. left: 0;
  116. -webkit-background-size: cover;
  117. -moz-background-size: cover;
  118. -o-background-size: cover;
  119. background-size: cover;
  120. }
  121. .user-avatar {
  122. display: inline-block;
  123. }
  124. .is-black {
  125. background-color: black;
  126. }
  127. .title {
  128. font-weight: bold;
  129. font-size: 45px;
  130. }
  131. .subtitle {
  132. /*font-weight: bold;*/
  133. font-size: 25px;
  134. }
  135. .author-name {
  136. font-size: 20px;
  137. font-weight: bold;
  138. }
  139. // hero
  140. // Home page
  141. .links {
  142. padding-top: 15px;
  143. }
  144. </style>