diff --git a/app.vue b/app.vue index 4c050cb..e5b737a 100644 --- a/app.vue +++ b/app.vue @@ -26,9 +26,7 @@ useHead({
- - - + - - + + + +
--> - - - - + + + + + + + + \ No newline at end of file diff --git a/nuxt.config.ts b/nuxt.config.ts index 7abd133..afb9559 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -3,12 +3,12 @@ const { resolve } = createResolver(import.meta.url); // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ + devtools: { enabled: true }, + nitro: { preset: 'iis_node' }, - devtools: { enabled: true }, - app: { head: { link: [], @@ -67,10 +67,8 @@ export default defineNuxtConfig({ propsDestructure: true, }, - target: 'server', ssr: true, routeRules: { - // Tất cả các route sẽ sử dụng SSR '**': { ssr: true }, }, diff --git a/pages/[categories]/index.vue b/pages/[categories]/index.vue index f23264d..510f74d 100644 --- a/pages/[categories]/index.vue +++ b/pages/[categories]/index.vue @@ -2,18 +2,21 @@ import DynamicTemplate from "~/components/dynamic-page/page/templates/index.vue"; import DynamicSection from "~/components/dynamic-page/page-section/templates/index.vue"; import { useDynamicPageStore } from '~/stores/dynamic-page'; -const { currentPage, sectionPublished, componentPublished } = storeToRefs(useDynamicPageStore()); const route = useRoute(); const store = reactive({ dynamicPage: useDynamicPageStore(), }); -await useAsyncData('index', () => store.dynamicPage.fetchPageByCode(route.path.replace('/', ''))) +const { data } = await useAsyncData('index', () => store.dynamicPage.fetchPageByCode(route.path.replace('/', ''))) +const asycnCurrentPage = data.value.currentPage; +const asycnSectionPublished = data.value.sectionPublished; +const asycnComponentPublished = data.value.componentPublished; + useHead({ - title: () => currentPage.value.title || '', + title: () => asycnCurrentPage.title || '', description: () => 'Với công nghệ đột phá và giải pháp sáng tạo, Vpress sẽ là đối tác tin cậy của các tòa soạn báo, cùng nhau kiến tạo nên những giá trị bền vững trong kỷ nguyên chuyển đổi số báo chí.', - ogTitle: () => currentPage.value.title || '', + ogTitle: () => asycnCurrentPage.title || '', ogImage: () => '~/assets/images/thumbnail.jpg', ogDescription: () => 'Với công nghệ đột phá và giải pháp sáng tạo, Vpress sẽ là đối tác tin cậy của các tòa soạn báo, cùng nhau kiến tạo nên những giá trị bền vững trong kỷ nguyên chuyển đổi số báo chí.', twitterCard: () => 'summary_large_image', @@ -21,10 +24,10 @@ useHead({ \ No newline at end of file + diff --git a/pages/bai-viet/[slug].vue b/pages/bai-viet/[slug].vue index 156d6a0..dbf9e9f 100644 --- a/pages/bai-viet/[slug].vue +++ b/pages/bai-viet/[slug].vue @@ -10,22 +10,18 @@ import DynamicSection from "~/components/dynamic-page/page-section/templates/ind const route = useRoute(); -import { useDynamicPageStore } from '~/stores/dynamic-page'; -import { useArticleStore } from '~/stores/articles'; -const { currentPage, sectionPublished, componentPublished } = storeToRefs(useDynamicPageStore()); -const { currentArticle } = storeToRefs(useArticleStore()); - const store = reactive({ dynamicPage: useDynamicPageStore(), article: useArticleStore(), }); -const loadPage = async () => { - const promises = []; - promises.push(store.article.getArticleBySlug(route.params.slug)); +import { useDynamicPageStore } from '~/stores/dynamic-page'; +import { useArticleStore } from '~/stores/articles'; +const loadPage = async () => { + const article = await store.article.getArticleBySlug(route.params.slug); let isContentType = ''; - switch (currentArticle.value?.contentType) { + switch (article.value?.contentType) { case 1: isContentType = 'trang-chi-tiet-bai-viet-general'; break; @@ -39,11 +35,11 @@ const loadPage = async () => { isContentType = 'trang-chi-tiet-bai-viet-video'; break; case 5: - if (currentArticle.value?.layoutType === 4) { + if (article.value?.layoutType === 4) { isContentType = 'trang-chi-tiet-bai-viet-emagazine'; break; } - if (currentArticle.value?.layoutType === 3) { + if (article.value?.layoutType === 3) { isContentType = 'trang-chi-tiet-bai-viet-infographics'; break; } @@ -51,34 +47,42 @@ const loadPage = async () => { isContentType = 'trang-chi-tiet-bai-viet-general'; break; } - promises.push(store.dynamicPage.fetchPageByCode(isContentType)); - await Promise.all(promises); + const dynamicPage = await store.dynamicPage.fetchPageByCode(isContentType); + + return { + article, + dynamicPage + }; }; -await useAsyncData('detail-article', () => loadPage()); +const { data } = await useAsyncData('detail-article', () => loadPage()); +const article = data.value?.article; +const dynamicPage = data.value?.dynamicPage; + +const asycnCurrentPage = dynamicPage.currentPage; +const asycnSectionPublished = dynamicPage.sectionPublished; +const asycnComponentPublished = dynamicPage.componentPublished; useSeoMeta({ - title: () => currentArticle.value.title.replace(/<[^>]+>/g, ''), - description: () => currentArticle.value.intro.replace(/<[^>]+>/g, ''), - ogTitle: () => currentArticle.value.title.replace(/<[^>]+>/g, ''), - ogImage: () => currentArticle.value.thumbnail, - ogDescription: () => currentArticle.value.intro.replace(/<[^>]+>/g, ''), + title: () => article.title.replace(/<[^>]+>/g, ''), + description: () => article.intro.replace(/<[^>]+>/g, ''), + ogTitle: () => article.title.replace(/<[^>]+>/g, ''), + ogImage: () => article.thumbnail, + ogDescription: () => article.intro.replace(/<[^>]+>/g, ''), twitterCard: () => 'summary_large_image', }) diff --git a/pages/index.vue b/pages/index.vue index a4b8ba7..5c94b42 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -3,14 +3,17 @@ import ADSDefault from '@/assets/images/ads.jpg' import DynamicTemplate from "~/components/dynamic-page/page/templates/index.vue"; import DynamicSection from "~/components/dynamic-page/page-section/templates/index.vue"; import { useDynamicPageStore } from '~/stores/dynamic-page'; -const { currentPage, sectionPublished, componentPublished } = storeToRefs(useDynamicPageStore()); const route = useRoute(); const store = reactive({ dynamicPage: useDynamicPageStore(), }); -await useAsyncData('index', () => store.dynamicPage.fetchPageByCode(route.path === '/' ? 'trang-chu' : route.path.replace('/', ''))) +const { data } = await useAsyncData('index', () => store.dynamicPage.fetchPageByCode(route.path === '/' ? 'trang-chu' : route.path.replace('/', ''))) +const asycnCurrentPage = data.value.currentPage; +const asycnSectionPublished = data.value.sectionPublished; +const asycnComponentPublished = data.value.componentPublished; + useHead({ title: () => 'Trang chủ', description: () => 'Với công nghệ đột phá và giải pháp sáng tạo, Vpress sẽ là đối tác tin cậy của các tòa soạn báo, cùng nhau kiến tạo nên những giá trị bền vững trong kỷ nguyên chuyển đổi số báo chí.', @@ -22,10 +25,10 @@ useHead({