Files
fad-trade-next/lib/getProducts.ts
砂糖 f25989b88f feat: 更新产品类型和内容,优化产品展示功能
- 重构产品类型定义,新增desc、models、content字段
- 更新所有语言的产品内容,包括详细规格和化学/机械性能
- 修改产品展示组件,支持MDX内容渲染和模型列表展示
- 调整产品详情页布局,优化信息展示方式
- 更新i18n翻译文件,同步产品名称变更
- 修改默认主题配置为light模式
- 修复公司简介中的格式问题
2026-01-27 12:57:27 +08:00

58 lines
1.6 KiB
TypeScript

import { DEFAULT_LOCALE } from '@/i18n/routing';
import { Product } from '@/types/product';
import fs from 'fs';
import matter from 'gray-matter';
import path from 'path';
const POSTS_BATCH_SIZE = 10;
export async function getProducts(locale: string = DEFAULT_LOCALE): Promise<{ products: Product[] }> {
const postsDirectory = path.join(process.cwd(), 'content', 'product', locale);
// is directory exist
if (!fs.existsSync(postsDirectory)) {
return { products: [] };
}
let filenames = await fs.promises.readdir(postsDirectory);
filenames = filenames.reverse();
let allPosts: Product[] = [];
// read file by batch
for (let i = 0; i < filenames.length; i += POSTS_BATCH_SIZE) {
const batchFilenames = filenames.slice(i, i + POSTS_BATCH_SIZE);
const batchPosts: Product[] = await Promise.all(
batchFilenames.map(async (filename) => {
const fullPath = path.join(postsDirectory, filename);
const fileContents = await fs.promises.readFile(fullPath, 'utf8');
const { data, content } = matter(fileContents);
// console.log(data);
return {
locale, // use locale parameter
title: data.title,
model: data.model,
place: data.place,
publishedTime: data.publishedTime,
images: data.images || [],
models: data.models || [],
desc: data.desc || '',
spec: data.spec || [],
packaging: data.packaging || '',
slug: data.slug || '',
content,
metadata: data,
};
})
);
allPosts.push(...batchPosts);
}
return {
products: allPosts,
};
}