fix: content API从实体表读取reviews/faq/gallery/stories/news/blog数据

这个提交包含在:
Deploy 2026-04-11 21:15:53 +08:00
父节点 ab49633b81
当前提交 65d2512cb9

查看文件

@ -1,22 +1,99 @@
import { eq } from 'drizzle-orm' import { eq, desc, asc } from 'drizzle-orm'
import { useDB, schema } from '../../utils/db.js' import { useDB, schema } from '../../utils/db.js'
function buildFromEntityTable(db, key, siteData) {
switch (key) {
case 'reviews': {
const rows = db.select().from(schema.reviews)
.where(eq(schema.reviews.published, true))
.orderBy(desc(schema.reviews.sortOrder)).all()
const items = rows.map(r => ({
nickname: r.author,
rating: r.rating,
productVersion: r.title,
content: r.content,
travelDate: r.date,
verified: r.verified
}))
return {
summary: siteData?.summary || {},
items
}
}
case 'faq': {
const rows = db.select().from(schema.faqs)
.where(eq(schema.faqs.published, true))
.orderBy(asc(schema.faqs.sortOrder)).all()
const items = rows.map(r => ({
question: r.question, answer: r.answer
}))
if (siteData?.categories) {
return { categories: siteData.categories, items }
}
return { categories: [{ name: '常见问题', items }] }
}
case 'gallery': {
const rows = db.select().from(schema.galleryItems)
.where(eq(schema.galleryItems.published, true))
.orderBy(asc(schema.galleryItems.sortOrder)).all()
const works = rows.map(r => ({
title: r.title, category: r.category,
location: r.location, description: r.description,
image: r.image, orientation: r.orientation
}))
return {
seo: siteData?.seo || {},
intro: siteData?.intro || {},
categories: siteData?.categories || [],
works
}
}
case 'stories': {
const rows = db.select().from(schema.stories)
.where(eq(schema.stories.published, true))
.orderBy(desc(schema.stories.sortOrder)).all()
return rows.map(r => {
const s = { ...r }
try { s.sections = JSON.parse(r.sections) } catch {}
try { s.keyMoments = JSON.parse(r.keyMoments) } catch {}
return s
})
}
case 'news':
case 'blog': {
const rows = db.select().from(schema.articles)
.where(eq(schema.articles.type, key))
.orderBy(desc(schema.articles.createdAt)).all()
return rows.map(r => {
const a = { ...r }
try { a.tags = JSON.parse(r.tags) } catch {}
return a
})
}
}
return null
}
const ENTITY_KEYS = ['reviews','faq','gallery','stories','news','blog']
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
const key = getRouterParam(event, 'key') const key = getRouterParam(event, 'key')
const db = useDB() const db = useDB()
const item = db.select().from(schema.siteContent)
.where(eq(schema.siteContent.key, key)).get()
const siteData = item ? JSON.parse(item.data) : null
const item = db if (ENTITY_KEYS.includes(key)) {
.select() const result = buildFromEntityTable(db, key, siteData)
.from(schema.siteContent) if (result) {
.where(eq(schema.siteContent.key, key)) setHeader(event, 'Cache-Control', 'public, max-age=60')
.get() return result
}
if (!item) {
throw createError({ statusCode: 404, message: `未找到配置项: ${key}` })
} }
if (!siteData) {
throw createError({ statusCode: 404, message: `未找到配置项: ${key}` })
}
setHeader(event, 'Cache-Control', 'public, max-age=60') setHeader(event, 'Cache-Control', 'public, max-age=60')
return siteData
return JSON.parse(item.data)
}) })