| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- <template>
- <content-with-sidebar v-if="Object.keys(blogList).length" class="blog-wrapper">
- <!-- blogs -->
- <b-row class="blog-list-wrapper">
- <b-col md="6">
- <b-col v-for="(blog, index) in blogList.slice(0, Math.ceil(blogList.length / 2))" :key="index" md="12">
- <b-card tag="article" no-body>
- <b-link :to="{ name: 'blog-detail', params: { id: blog.id } }">
- <b-img :src="defaultsImg()" :alt="defaultsImg().slice(5)" class="card-img-top" />
- </b-link>
- <b-card-body>
- <b-card-title>
- <b-link :to="{ name: 'blog-detail', params: { id: blog.id } }"
- class="blog-title-truncate text-body-heading">
- {{ blog.title }}
- </b-link>
- </b-card-title>
- <b-media no-body>
- <b-media-aside vertical-align="center" class="mr-50">
- <b-avatar href="javascript:void(0)" size="24" :src="getUserAvatar(blog.userId)" />
- </b-media-aside>
- <b-media-body>
- <small class="text-muted mr-50">by</small>
- <small>
- <b-link class="text-body">{{ blog.userFullName }}</b-link>
- </small>
- <span class="text-muted ml-75 mr-50">|</span>
- <small class="text-muted">{{ dateFormat(blog.blogPosted) }}</small>
- </b-media-body>
- </b-media>
- <div class="my-1 py-25">
- <b-link v-for="(tag, index) in JSON.parse(blog.tags)" :key="index">
- <b-badge pill class="mr-75" :variant="tagsColor(tag)">
- {{ tag }}
- </b-badge>
- </b-link>
- </div>
- <b-card-text class="blog-content-truncate">
- {{ blog.excerpt }}
- </b-card-text>
- <hr>
- <div class="d-flex justify-content-between align-items-center">
- <b-link :to="{ path: `/pages/blog/${blog.id}#blogComment` }">
- <div class="d-flex align-items-center text-body">
- <feather-icon icon="MessageSquareIcon" class="mr-50" />
- <span class="font-weight-bold">{{ blog.comment ? kFormatter(blog.comment) : 0 }} Comments</span>
- </div>
- </b-link>
- <b-link :to="{ name: 'blog-detail', params: { id: blog.id } }" class="font-weight-bold">
- Read More
- </b-link>
- </div>
- </b-card-body>
- </b-card>
- </b-col>
- </b-col>
- <b-col md="6">
- <b-col v-for="(blog, index) in blogList.slice(Math.ceil(blogList.length / 2))" :key="index" md="12">
- <b-card tag="article" no-body>
- <b-link :to="{ name: 'blog-detail', params: { id: blog.id } }">
- <b-img :src="defaultsImg()" :alt="defaultsImg().slice(5)" class="card-img-top" />
- </b-link>
- <b-card-body>
- <b-card-title>
- <b-link :to="{ name: 'blog-detail', params: { id: blog.id } }"
- class="blog-title-truncate text-body-heading">
- {{ blog.title }}
- </b-link>
- </b-card-title>
- <b-media no-body>
- <b-media-aside vertical-align="center" class="mr-50">
- <b-avatar href="javascript:void(0)" size="24" :src="getUserAvatar(blog.userId)" />
- </b-media-aside>
- <b-media-body>
- <small class="text-muted mr-50">by</small>
- <small>
- <b-link class="text-body">{{ blog.userFullName }}</b-link>
- </small>
- <span class="text-muted ml-75 mr-50">|</span>
- <small class="text-muted">{{ dateFormat(blog.blogPosted) }}</small>
- </b-media-body>
- </b-media>
- <div class="my-1 py-25">
- <b-link v-for="(tag, index) in JSON.parse(blog.tags)" :key="index">
- <b-badge pill class="mr-75" :variant="tagsColor(tag)">
- {{ tag }}
- </b-badge>
- </b-link>
- </div>
- <b-card-text class="blog-content-truncate">
- {{ blog.excerpt }}
- </b-card-text>
- <hr>
- <div class="d-flex justify-content-between align-items-center">
- <b-link :to="{ path: `/pages/blog/${blog.id}#blogComment` }">
- <div class="d-flex align-items-center text-body">
- <feather-icon icon="MessageSquareIcon" class="mr-50" />
- <span class="font-weight-bold">{{ blog.comment ? kFormatter(blog.comment) : 0 }} Comments</span>
- </div>
- </b-link>
- <b-link :to="{ name: 'blog-detail', params: { id: blog.id } }" class="font-weight-bold">
- Read More
- </b-link>
- </div>
- </b-card-body>
- </b-card>
- </b-col>
- </b-col>
- <b-col cols="12">
- <!-- pagination -->
- <div class="my-2">
- <b-pagination v-model="currentPage" align="center" :total-rows="rows" first-number last-number
- prev-class="prev-item" next-class="next-item">
- <template #prev-text>
- <feather-icon icon="ChevronLeftIcon" size="18" />
- </template>
- <template #next-text>
- <feather-icon icon="ChevronRightIcon" size="18" />
- </template>
- </b-pagination>
- </div>
- </b-col>
- </b-row>
- <!--/ blogs -->
- <!-- sidebar -->
- <div slot="sidebar" class="blog-sidebar py-2 py-lg-0">
- <!-- input search -->
- <b-form-group class="blog-search">
- <b-input-group class="input-group-merge">
- <b-form-input id="search-input" v-model="search_query" placeholder="Search here" />
- <b-input-group-append class="cursor-pointer" is-text>
- <feather-icon icon="SearchIcon" />
- </b-input-group-append>
- </b-input-group>
- </b-form-group>
- <!--/ input search -->
- <!-- recent posts -->
- <div class="blog-recent-posts mt-3">
- <h6 class="section-label mb-75">
- Recent Posts
- </h6>
- <b-media v-for="(recentpost, index) in blogSidebar.recentPosts" :key="index" no-body
- :class="index ? 'mt-2' : ''">
- <b-media-aside class="mr-2">
- <b-link :to="{ name: 'blog-detail', params: { id: recentpost.id } }">
- <b-img :src="defaultsImg()" :alt="defaultsImg().slice(6)" width="100" rounded height="70" />
- </b-link>
- </b-media-aside>
- <b-media-body>
- <h6 class="blog-recent-post-title">
- <b-link :to="{ name: 'blog-detail', params: { id: recentpost.id } }" class="text-body-heading">
- {{ recentpost.title }}
- </b-link>
- </h6>
- <span class="text-muted mb-0">
- {{ dateFormat(recentpost.createdTime) }}
- </span>
- </b-media-body>
- </b-media>
- </div>
- <!--/ recent posts -->
- <!-- categories -->
- <div class="blog-categories mt-3">
- <h6 class="section-label mb-1">
- Categories
- </h6>
- <div v-for="category in blogSidebar.categories" :key="category.icon"
- class="d-flex justify-content-start align-items-center mb-75">
- <b-link>
- <b-avatar rounded size="32" :variant="tagsColor(category.category)" class="mr-75">
- <feather-icon :icon="category.icon" size="16" />
- </b-avatar>
- </b-link>
- <b-link>
- <div class="blog-category-title text-body">
- {{ category.category }}
- </div>
- </b-link>
- </div>
- </div>
- <!--/ categories -->
- </div>
- <!--/ sidebar -->
- </content-with-sidebar>
- </template>
- <script>
- import {
- BRow,
- BCol,
- BCard,
- BFormInput,
- BCardText,
- BCardTitle,
- BMedia,
- BAvatar,
- BMediaAside,
- BMediaBody,
- BImg,
- BCardBody,
- BLink,
- BBadge,
- BFormGroup,
- BInputGroup,
- BInputGroupAppend,
- BPagination,
- } from 'bootstrap-vue'
- import { kFormatter } from '@core/utils/filter'
- import ContentWithSidebar from '@core/layouts/components/content-with-sidebar/ContentWithSidebar.vue'
- import useJwt from '@/auth/jwt/useJwt'
- import { format } from 'date-fns'
- import { zhTW } from 'date-fns/locale'
- export default {
- components: {
- BRow,
- BCol,
- BCard,
- BFormInput,
- BCardText,
- BCardBody,
- BCardTitle,
- BMedia,
- BAvatar,
- BMediaAside,
- BMediaBody,
- BLink,
- BBadge,
- BFormGroup,
- BInputGroup,
- BInputGroupAppend,
- BImg,
- BPagination,
- ContentWithSidebar,
- },
- data() {
- return {
- search_query: '',
- blogList: [],
- blogSidebar: {},
- currentPage: 1,
- perPage: 1,
- rows: 140,
- }
- },
- created() {
- useJwt.getPost('/api/get_blog/list').then(res => {
- this.blogList = res.data
- })
- useJwt.getPost('/api/get_blog/sidebar').then(res => {
- this.blogSidebar = res.data
- })
- },
- methods: {
- kFormatter,
- tagsColor(tag) {
- if (tag === 'Quote') return 'light-info'
- if (tag === 'Gaming') return 'light-danger'
- if (tag === 'Fashion') return 'light-primary'
- if (tag === 'Video') return 'light-warning'
- if (tag === 'Food') return 'light-success'
- return 'light-primary'
- },
- dateFormat(date) {
- return format(new Date(date), 'yyyy-MM-dd hh:mm', { locale: zhTW })
- },
- getUserAvatar(userId) {
- return require('@/assets/images/avatars/' + userId + '-small.png')
- },
- defaultsImg() {
- return require('@/assets/images/banner/banner-' + (Math.floor(Math.random() * 38) + 1) + '.jpg')
- },
- },
- }
- </script>
- <style lang="scss">
- @import '~@resources/scss/vue/pages/page-blog.scss';
- </style>
|