refactor(production): 重构产品页代码

- 将Production的documents类型改写为单独的interface:ProductionDocument
This commit is contained in:
2025-09-04 14:55:32 +08:00
parent d8abb0a50e
commit ea409d49b0
5 changed files with 19 additions and 14 deletions

View File

@ -36,7 +36,7 @@
<question-list :questions="production.questions" /> <question-list :questions="production.questions" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="相关文档" name="documents"> <el-tab-pane label="相关文档" name="documents">
<document-list :documents="production.documents" /> <document-list :documents="production.production_documents.map(item => item.document) || []" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
@ -95,8 +95,8 @@ onMounted(async () => {
questions: { questions: {
populate: '*', populate: '*',
}, },
documents: { production_documents: {
populate: '*', populate: 'document',
}, },
}, },
locale: strapiLocale, locale: strapiLocale,
@ -106,6 +106,7 @@ onMounted(async () => {
production.value = { production.value = {
...item, ...item,
} }
console.log('Fetched production:', production.value)
} }
} catch (error) { } catch (error) {
console.error('Failed to fetch production:', error) console.error('Failed to fetch production:', error)

View File

@ -19,8 +19,7 @@ v-for="(group, type) in groupedProductions" :key="type" :title="type || '未分
<div class="group-list"> <div class="group-list">
<production-card <production-card
v-for="production in group" :key="production.documentId || production.id" v-for="production in group" :key="production.documentId || production.id"
:slug="production.documentId" :slug="production.documentId" :image-url="useStrapiMedia(production?.cover?.url || '')"
:image-url="useStrapiMedia(production?.cover?.url || '')"
:name="production.title" :description="production.summary || ''" /> :name="production.title" :description="production.summary || ''" />
</div> </div>
</el-collapse-item> </el-collapse-item>
@ -65,12 +64,9 @@ onMounted(async () => {
cover: { cover: {
populate: '*', populate: '*',
}, },
production_images: {
populate: '*',
},
production_type: { production_type: {
populate: '*', populate: '*'
} },
}, },
filters: { filters: {
show_in_production_list: { show_in_production_list: {

View File

@ -45,3 +45,5 @@ export interface StrapiResponse<T> {
} }
} }
} }
export type StrapiRelation<T, K extends keyof T = never> = Omit<T, K | keyof StrapiEntity> & StrapiEntity;

View File

@ -1,4 +1,4 @@
import type { StrapiEntity, StrapiImage, StrapiMedia } from './common'; import type { StrapiEntity, StrapiImage, StrapiMedia, StrapiRelation } from './common';
export interface ProductionType extends StrapiEntity { export interface ProductionType extends StrapiEntity {
type: string; type: string;
@ -22,7 +22,12 @@ export interface Production extends StrapiEntity {
production_images: StrapiImage[]; production_images: StrapiImage[];
production_details: string; production_details: string;
production_specs: ProductionSpecGroup[]; production_specs: ProductionSpecGroup[];
questions: Question[]; production_documents: StrapiRelation<ProductionDocument, 'related_productions'>[];
documents: StrapiMedia[]; questions: StrapiRelation<Question, 'related_productions'>[];
show_in_production_list: boolean; show_in_production_list: boolean;
} }
export interface ProductionDocument extends StrapiEntity {
document: StrapiMedia;
related_productions: StrapiRelation<Production, 'production_documents'>[];
}

View File

@ -1,4 +1,5 @@
export interface Question extends StrapiEntity { export interface Question extends StrapiEntity {
title: string; title: string;
content: string; content: string;
related_productions: StrapiRelation<Production, 'questions'>[];
} }