108 lines
2.7 KiB
Vue
108 lines
2.7 KiB
Vue
<template>
|
|
<NuxtLayout name="default" :categories="categoryTree">
|
|
<div class="content-wrap">
|
|
<h2>搜索到 <em>{{ articlePage.pagination.total }}</em> 条记录</h2>
|
|
<ArticleList :articles="articlePage.data" :keyword="keyword"/>
|
|
<Pagination
|
|
v-model="articlePage.pagination"
|
|
:get-page-url="page => {
|
|
return `/search?kwd=${keyword}&page=${page}`
|
|
}"
|
|
/>
|
|
</div>
|
|
</NuxtLayout>
|
|
</template>
|
|
|
|
<script>
|
|
import { definePageMeta } from '#imports'
|
|
import { ref } from 'vue'
|
|
import { useRoute } from 'vue-router'
|
|
import Pagination from '@/components/common/Pagination'
|
|
import ArticleList from '@/components/cms/ArticleList'
|
|
import { fetchTemplateData } from '@/api/cms/template'
|
|
import { search } from '@/api/cms/search'
|
|
import { strictPackage } from '@/utils/util'
|
|
|
|
export default {
|
|
components: { ArticleList, Pagination },
|
|
async setup () {
|
|
// 去掉默认布局
|
|
definePageMeta({
|
|
layout: false,
|
|
})
|
|
const route = useRoute()
|
|
const keyword = route.query.kwd || ''
|
|
// 获取模板数据
|
|
const data = strictPackage(await fetchTemplateData({
|
|
path: '/search.vue',
|
|
parameters: {
|
|
keyword
|
|
}
|
|
}))
|
|
return {
|
|
keyword,
|
|
// 栏目树
|
|
categoryTree: data.CATEGORIES_TREE,
|
|
// 文章数据
|
|
articlePage: ref({
|
|
// 文章列表
|
|
data: data.SEARCH_PAGE.articlePage.records,
|
|
// 分页数据
|
|
pagination: {
|
|
page: data.SEARCH_PAGE.articlePage.page,
|
|
capacity: data.SEARCH_PAGE.articlePage.capacity,
|
|
total: data.SEARCH_PAGE.articlePage.total
|
|
}
|
|
})
|
|
}
|
|
},
|
|
watch: {
|
|
// 路由参数变化时,触发数据搜索
|
|
'$route.query': function (newQuery) {
|
|
this.keyword = newQuery.kwd || ''
|
|
this.handlePageChange(Number(newQuery.page) || 1)
|
|
}
|
|
},
|
|
methods: {
|
|
/**
|
|
* 页码变更
|
|
*
|
|
* @param page 新页码
|
|
*/
|
|
handlePageChange (page) {
|
|
this.articlePage.pagination.page = page
|
|
search({
|
|
page: this.articlePage.pagination.page,
|
|
capacity: this.articlePage.pagination.capacity,
|
|
model: this.keyword
|
|
})
|
|
.then(data => {
|
|
this.articlePage.data = data.articlePage.records
|
|
this.articlePage.pagination.total = data.articlePage.total
|
|
})
|
|
.catch(e => {
|
|
this.$tip.apiFailed(e)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.content-wrap {
|
|
background-color: var(--color-white);
|
|
padding: 20px;
|
|
h2 {
|
|
margin: 0;
|
|
border-bottom: 1px solid var(--border-color);
|
|
padding-bottom: 10px;
|
|
font-weight: normal;
|
|
em {
|
|
font-weight: bold;
|
|
font-style: normal;
|
|
color: var(--primary-color);
|
|
}
|
|
}
|
|
}
|
|
</style>
|