You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
3.7 KiB
156 lines
3.7 KiB
<template>
|
|
<div class="page page-article-index">
|
|
<el-row :gutter="20">
|
|
<el-col :span="18">
|
|
<el-card shadow="never">
|
|
<div slot="header">
|
|
<el-breadcrumb separator="/">
|
|
<el-breadcrumb-item>
|
|
<nuxt-link to="/"><i class="fa fa-home"></i> 首页</nuxt-link>
|
|
</el-breadcrumb-item>
|
|
<el-breadcrumb-item>文章列表</el-breadcrumb-item>
|
|
</el-breadcrumb>
|
|
</div>
|
|
<article-list :articles="articles" />
|
|
<el-pagination
|
|
v-if="total > 0"
|
|
:current-page="query.page"
|
|
:page-size="size"
|
|
:layout="
|
|
isMobile
|
|
? 'total, prev, pager, next'
|
|
: 'total, prev, pager, next, jumper'
|
|
"
|
|
:pager-count="isMobile ? 5 : 7"
|
|
:small="isMobile"
|
|
:total="total"
|
|
@current-change="pageChange"
|
|
>
|
|
</el-pagination>
|
|
</el-card>
|
|
</el-col>
|
|
<el-col :span="6">
|
|
<el-card shadow="never" class="popular">
|
|
<div slot="header">热门</div>
|
|
<div v-if="populars.length > 0">
|
|
<nuxt-link
|
|
:to="`/article/${article.identifier}`"
|
|
v-for="article in populars"
|
|
:key="'article-' + article.id"
|
|
:title="article.title"
|
|
class="el-link el-link--default"
|
|
>{{ article.title }}</nuxt-link
|
|
>
|
|
</div>
|
|
<el-empty v-else> </el-empty>
|
|
</el-card>
|
|
</el-col>
|
|
</el-row>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import { mapGetters } from 'vuex'
|
|
import { listArticle } from '~/api/article'
|
|
export default {
|
|
name: 'PageArticleIndex',
|
|
data() {
|
|
return {
|
|
total: 0,
|
|
size: 10,
|
|
query: {
|
|
page: 1,
|
|
},
|
|
populars: [],
|
|
articles: [],
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters('setting', ['settings']),
|
|
...mapGetters('device', ['isMobile']),
|
|
},
|
|
watch: {
|
|
$route: {
|
|
handler() {
|
|
let page = this.$route.query.page || 1
|
|
this.query.page = parseInt(page) || 1
|
|
this.getArticles()
|
|
},
|
|
immediate: true,
|
|
},
|
|
},
|
|
async created() {
|
|
await Promise.all([this.getPopulars()])
|
|
},
|
|
methods: {
|
|
pageChange(page) {
|
|
this.query.page = page
|
|
this.$router.push({
|
|
path: this.$route.path,
|
|
query: this.query,
|
|
})
|
|
},
|
|
async getArticles() {
|
|
const res = await listArticle({ size: this.size, page: this.query.page })
|
|
if (res.status !== 200) {
|
|
this.$message.error(res.data.message || '获取文章列表失败')
|
|
return
|
|
}
|
|
this.articles = res.data.article || []
|
|
this.total = res.data.total || 0
|
|
},
|
|
async getPopulars() {
|
|
const res = await listArticle({
|
|
page: 1,
|
|
size: 5,
|
|
order: 'view_count desc',
|
|
})
|
|
if (res.status !== 200) {
|
|
this.$message.error(res.data.message || '获取热门文章失败')
|
|
return
|
|
}
|
|
this.populars = res.data.article || []
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
<style lang="scss">
|
|
.page-article-index {
|
|
.el-card__body {
|
|
padding-top: 0;
|
|
padding-bottom: 0;
|
|
.el-pagination {
|
|
padding: 20px 0;
|
|
border-top: 1px dashed #efefef;
|
|
}
|
|
}
|
|
.popular {
|
|
.el-card__header {
|
|
padding: 14px 20px;
|
|
}
|
|
a {
|
|
display: block;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
height: 40px;
|
|
line-height: 40px;
|
|
border-bottom: 1px dashed #efefef;
|
|
&:last-of-type {
|
|
border-bottom: 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@media screen and (max-width: $mobile-width) {
|
|
.page-article-index {
|
|
.el-col {
|
|
width: 100%;
|
|
}
|
|
.popular {
|
|
margin-top: 15px;
|
|
}
|
|
}
|
|
}
|
|
</style>
|