diff --git a/app.vue b/app.vue
index 4c050cb..e5b737a 100644
--- a/app.vue
+++ b/app.vue
@@ -26,9 +26,7 @@ useHead({
-
-
-
+
404
@@ -38,14 +36,28 @@ useHead({
trang chủ
-
-
+
+
+
+
-->
-
-
-
-
+
+
+
+
+
404
+
Trang không tồn tại.
+
{{ error }}
+
+
+
+
+
+
+
+
\ 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({
-
-
+
+
{
const article = await $fetch(`/api/articles/get-by-slug/${slug}`)
currentArticle.value = {}
currentArticle.value = article?.item
+
+ return currentArticle;
} catch (error: any) { }
}
diff --git a/stores/dynamic-page.ts b/stores/dynamic-page.ts
index 4b494e5..8c8f5c5 100644
--- a/stores/dynamic-page.ts
+++ b/stores/dynamic-page.ts
@@ -4,27 +4,6 @@ export const useDynamicPageStore = defineStore("dynamicPageStore", () => {
const currentPage = ref({});
const sectionPublished = ref([]);
const componentPublished = ref([]);
- const step = ref(0)
-
-
- async function fetchPageByCode(slug: any) {
- try {
- const page = await $fetch(`/api/dynamic-page/get-by-code/${slug}`)
- currentPage.value = {}
- currentPage.value = page
-
- setSectionPublished();
- setComponentPublished();
- } catch (error: any) {}
- }
-
- async function fetchPageById(id: string | number) {
- try {
- const { data } = await useFetch(`/api/dynamic-page/get-by-id/${id}`)
- currentPage.value = {}
- currentPage.value = data.value
- } catch (error: any) {}
- }
const setSectionPublished = () => {
const exsitsTemplate = ['None']
@@ -64,13 +43,29 @@ export const useDynamicPageStore = defineStore("dynamicPageStore", () => {
setComponentPublished();
};
+ async function fetchPageByCode(slug: any) {
+ try {
+ const page = await $fetch(`/api/dynamic-page/get-by-code/${slug}`)
+ currentPage.value = {}
+ currentPage.value = page
+
+ setSectionPublished();
+ setComponentPublished();
+
+ return {
+ currentPage,
+ sectionPublished,
+ componentPublished
+ }
+ } catch (error: any) {}
+ }
+
return {
currentPage,
sectionPublished,
componentPublished,
fetchPageByCode,
- fetchPageById,
setSectionPublished,
setComponentPublished,
setDataQuery,