feat: add utils | page
This commit is contained in:
parent
e843aa1d7f
commit
5036d3602f
23
content/blog/first-blog-post-ehandy.md
Normal file
23
content/blog/first-blog-post-ehandy.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
title: Fisrt Blog Post eHandy
|
||||||
|
description: 'Empower your NuxtJS application with @nuxt/content module: write in a content/ directory and fetch your Markdown, JSON, YAML and CSV files through a MongoDB like API, acting as a Git-based Headless CMS.'
|
||||||
|
image: 'https://cdn.emk.dev/templates/featured-image.png'
|
||||||
|
tags: ['VueJS', 'Nuxt']
|
||||||
|
published: '2021-06-30'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
Empower your NuxtJS application with `@nuxtjs/content` module: write in a `content/` directory and fetch your Markdown, JSON, YAML and CSV files through a MongoDB like API, acting as a **Git-based Headless CMS**.
|
||||||
|
|
||||||
|
## Writing content
|
||||||
|
|
||||||
|
Learn how to write your `content/`, supporting Markdown, YAML, CSV and JSON: https://content.nuxtjs.org/writing.
|
||||||
|
|
||||||
|
## Fetching content
|
||||||
|
|
||||||
|
Learn how to fetch your content with `$content`: https://content.nuxtjs.org/fetching.
|
||||||
|
|
||||||
|
## Displaying content
|
||||||
|
|
||||||
|
Learn how to display your Markdown content with the `<nuxt-content>` component directly in your template: https://content.nuxtjs.org/displaying.
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { Vue, Component } from 'nuxt-property-decorator'
|
import { Vue, Component } from 'nuxt-property-decorator'
|
||||||
|
import getContent from '@/utils/getContent'
|
||||||
import FeaturedBlog from '@/components/organisms/FeaturedBlog'
|
import FeaturedBlog from '@/components/organisms/FeaturedBlog'
|
||||||
import ListBlog from '@/components/organisms/ListBlog.vue'
|
import ListBlog from '@/components/organisms/ListBlog.vue'
|
||||||
|
|
||||||
@ -21,7 +22,29 @@ import ListBlog from '@/components/organisms/ListBlog.vue'
|
|||||||
components: {
|
components: {
|
||||||
FeaturedBlog,
|
FeaturedBlog,
|
||||||
ListBlog
|
ListBlog
|
||||||
|
},
|
||||||
|
async asyncData ({ $content, params, error }) {
|
||||||
|
const content = await getContent($content, params, error, 'blog')
|
||||||
|
|
||||||
|
console.log(content)
|
||||||
|
return {
|
||||||
|
allArticles: content.allArticles,
|
||||||
|
paginatedArticles: content.paginatedArticles
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
head () {
|
||||||
|
return {
|
||||||
|
title: `Blog page ${this.$route.params.page} - eHanndy`,
|
||||||
|
link: [
|
||||||
|
{
|
||||||
|
hid: 'canonical',
|
||||||
|
rel: 'canonical',
|
||||||
|
href: `${this.$config.baseUrl}/blog/page/${this.$route.params.page}`
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
export default class PageBlog extends Vue {
|
export default class PageBlog extends Vue {
|
||||||
}
|
}
|
||||||
|
48
utils/getContent.js
Normal file
48
utils/getContent.js
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
export default async ($content, params, error, path) => {
|
||||||
|
const currentPage = parseInt(params.page)
|
||||||
|
/**
|
||||||
|
* Số items trên 1 page
|
||||||
|
*/
|
||||||
|
const perPage = 14
|
||||||
|
const allArticles = await $content(path).fetch()
|
||||||
|
const totalArticles = allArticles.length
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Số trang
|
||||||
|
* Tổng items / items trên 1 page
|
||||||
|
*/
|
||||||
|
const lastPage = Math.ceil(totalArticles / perPage)
|
||||||
|
const lastPageCount = totalArticles % perPage
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tính số items cần bỏ qua khi get
|
||||||
|
*/
|
||||||
|
const skipNumber = () => {
|
||||||
|
if (currentPage === 1) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if (currentPage === lastPage) {
|
||||||
|
return totalArticles - lastPageCount
|
||||||
|
}
|
||||||
|
return (currentPage - 1) * perPage
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get items skip
|
||||||
|
*/
|
||||||
|
const paginatedArticles = await $content(path)
|
||||||
|
.only(['title', 'description', 'image', 'slug', 'tags', 'published'])
|
||||||
|
.sortBy('published', 'desc')
|
||||||
|
.limit(perPage)
|
||||||
|
.skip(skipNumber())
|
||||||
|
.fetch()
|
||||||
|
|
||||||
|
if (currentPage === 0 || !paginatedArticles.length) {
|
||||||
|
return error({ statusCode: 404, message: 'No articles found!' })
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
allArticles,
|
||||||
|
paginatedArticles
|
||||||
|
}
|
||||||
|
}
|
6
utils/getRoutes.js
Normal file
6
utils/getRoutes.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
export default async () => {
|
||||||
|
const { $content } = require('@nuxt/content');
|
||||||
|
const files = await $content({ deep: true }).only(['path']).fetch();
|
||||||
|
|
||||||
|
return files.map((file) => (file.path === '/index' ? '/' : file.path));
|
||||||
|
};
|
56
utils/getSiteMeta.js
Normal file
56
utils/getSiteMeta.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import global from './global';
|
||||||
|
|
||||||
|
export default (meta) => {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
hid: 'description',
|
||||||
|
name: 'description',
|
||||||
|
content: (meta && meta.description) || global.siteDesc,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'og:type',
|
||||||
|
property: 'og:type',
|
||||||
|
content: (meta && meta.type) || global.siteType,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'og:url',
|
||||||
|
property: 'og:url',
|
||||||
|
content: (meta && meta.url) || global.siteUrl,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'og:title',
|
||||||
|
property: 'og:title',
|
||||||
|
content: (meta && meta.title) || global.siteTitle,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'og:description',
|
||||||
|
property: 'og:description',
|
||||||
|
content: (meta && meta.description) || global.siteDesc,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'og:image',
|
||||||
|
property: 'og:image',
|
||||||
|
content: (meta && meta.mainImage) || global.mainImage,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'twitter:url',
|
||||||
|
name: 'twitter:url',
|
||||||
|
content: (meta && meta.url) || global.siteUrl,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'twitter:title',
|
||||||
|
name: 'twitter:title',
|
||||||
|
content: (meta && meta.title) || global.siteTitle,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'twitter:description',
|
||||||
|
name: 'twitter:description',
|
||||||
|
content: (meta && meta.description) || global.siteDesc,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hid: 'twitter:image',
|
||||||
|
name: 'twitter:image',
|
||||||
|
content: (meta && meta.mainImage) || global.mainImage,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
};
|
18
utils/global.js
Normal file
18
utils/global.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
these are the global variables, make sure to change them for yours
|
||||||
|
you can add anything you like here, just import this file and
|
||||||
|
access any variable via object syntax global.yourVarName
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
siteUrl: 'https://example.com',
|
||||||
|
siteName: 'Starter Blog',
|
||||||
|
author: 'Joe Blogs',
|
||||||
|
twitterHandle: '@joeblogs',
|
||||||
|
twitterURL: 'https://twitter.com/garethredfern',
|
||||||
|
githubURL: 'https://github.com/garethredfern',
|
||||||
|
siteTitle: 'Add Your Main Site Title Here',
|
||||||
|
siteDesc:
|
||||||
|
'A description for your site here, this will show on the home page.',
|
||||||
|
mainImage: '',
|
||||||
|
siteType: 'website',
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user