130 lines
3.3 KiB
Vue
130 lines
3.3 KiB
Vue
<template>
|
||
<NuxtLayout name="default" :categories="categoryTree">
|
||
<Head>
|
||
<Title>{{ category.title }}</Title>
|
||
</Head>
|
||
<div class="content-wrap">
|
||
<!-- 页面面包屑 -->
|
||
<PageBreadCrumb :data="breadcrumbs"/>
|
||
<div class="wrap-body">
|
||
<!-- 主要内容 -->
|
||
<div class="content">
|
||
<h2 class="page-title">{{ category.title }}</h2>
|
||
<ArticleList :articles="articles" />
|
||
<Pagination v-model="pagination" />
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</NuxtLayout>
|
||
</template>
|
||
|
||
<script>
|
||
import { definePageMeta } from '#imports'
|
||
import { ref } from 'vue'
|
||
import { useRoute } from 'vue-router'
|
||
import PageBreadCrumb from '@/components/common/PageBreadCrumb'
|
||
import Pagination from '@/components/common/Pagination'
|
||
import CategoryUtil from '@/utils/category'
|
||
import ArticleList from '@/components/cms/ArticleList'
|
||
import { strictPackage } from '@/utils/util'
|
||
import { fetchTemplateData } from '@/api/cms/template'
|
||
import { fetchArticlePage } from '@/api/cms/article'
|
||
|
||
export default {
|
||
components: {
|
||
ArticleList,
|
||
Pagination,
|
||
PageBreadCrumb
|
||
},
|
||
async setup () {
|
||
// 去掉默认布局
|
||
definePageMeta({
|
||
layout: false,
|
||
})
|
||
const route = useRoute()
|
||
const data = strictPackage(await fetchTemplateData({
|
||
path: '/category/[categoryUid]/articles.vue',
|
||
targetUid: route.params.categoryUid,
|
||
targetType: 'CATEGORY',
|
||
parameters: {
|
||
categoryUid: route.params.categoryUid
|
||
}
|
||
}))
|
||
// 获取分页所使用的栏目UID
|
||
const categoryUid = data.ARTICLE_PAGE_PARAMETERS.categoryUid
|
||
const categoryUtil = new CategoryUtil(data.CATEGORIES_TREE)
|
||
const category = categoryUtil.getCategory(categoryUid)
|
||
if (category == null) {
|
||
throw new Error(`栏目不存在,栏目UID:${categoryUid}`)
|
||
}
|
||
return {
|
||
category,
|
||
categoryTree: data.CATEGORIES_TREE,
|
||
// 查询文章分页数据的栏目ID
|
||
categoryUid,
|
||
// 面包屑
|
||
breadcrumbs: categoryUtil.getBreadcrumb(categoryUid),
|
||
// 文章列表数据
|
||
articles: ref(data.ARTICLE_PAGE.records),
|
||
// 分页数据
|
||
pagination: ref({
|
||
page: data.ARTICLE_PAGE.page,
|
||
capacity: data.ARTICLE_PAGE.capacity,
|
||
total: data.ARTICLE_PAGE.total
|
||
})
|
||
}
|
||
},
|
||
watch: {
|
||
// 路由参数变化时,触发数据搜索
|
||
'$route.query': function (newQuery) {
|
||
this.handlePageChange(Number(newQuery.page) || 1)
|
||
}
|
||
},
|
||
methods: {
|
||
/**
|
||
* 页码变更
|
||
*
|
||
* @param page 新页码
|
||
*/
|
||
handlePageChange (page) {
|
||
this.pagination.page = page
|
||
fetchArticlePage({
|
||
page: this.pagination.page,
|
||
capacity: this.pagination.capacity,
|
||
model: {
|
||
categoryUid: this.categoryUid
|
||
}
|
||
})
|
||
.then(data => {
|
||
this.pagination.page = page
|
||
this.pagination.total = data.total
|
||
this.articles = data.records
|
||
})
|
||
.catch(e => console.error(e))
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.content-wrap {
|
||
background-color: #fff;
|
||
padding: 20px;
|
||
}
|
||
.wrap-body {
|
||
margin-top: 10px;
|
||
display: flex;
|
||
// 栏目树
|
||
.category-wrap {
|
||
width: 275px;
|
||
flex-shrink: 0;
|
||
}
|
||
// 内容
|
||
.content {
|
||
flex-grow: 1;
|
||
padding: 10px 30px;
|
||
overflow: hidden;
|
||
}
|
||
}
|
||
</style>
|