From 90af4a20fc56e7c248144add65e52f8fedcff39a Mon Sep 17 00:00:00 2001 From: WuYongJie Date: Sat, 22 Nov 2025 18:15:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=95=B4=E5=90=88=20-=20=E4=B8=8A=E4=BC=A0=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8C=96=E3=80=81=E5=8A=A8=E6=80=81=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=B8=B2=E6=9F=93=E3=80=81=E5=88=86=E7=B1=BB=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E6=9D=BF=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/_components/CategoriesTab.tsx | 59 ++++- app/api/materials/upload/route.ts | 23 ++ app/api/template-categories/route.ts | 99 ++++++++ app/api/upload-templates/route.ts | 58 +++++ components/UploadModal.tsx | 300 ++++++++++++++++++++++-- 优化计划与优先级.md | 24 +- 优化记录.md | 18 +- 后续修改.txt | 10 +- 更新日志.md | 27 ++- 9 files changed, 577 insertions(+), 41 deletions(-) create mode 100644 app/api/template-categories/route.ts create mode 100644 app/api/upload-templates/route.ts diff --git a/app/admin/_components/CategoriesTab.tsx b/app/admin/_components/CategoriesTab.tsx index c4a6408..90a65ac 100644 --- a/app/admin/_components/CategoriesTab.tsx +++ b/app/admin/_components/CategoriesTab.tsx @@ -29,6 +29,7 @@ export default function CategoriesTab({ showToast, onDataChange }: CategoriesTab const [categories, setCategories] = useState([]) const [scenes, setScenes] = useState([]) const [platforms, setPlatforms] = useState([]) + const [templateCategories, setTemplateCategories] = useState>([]) const [editingCategory, setEditingCategory] = useState(null) const [editingScene, setEditingScene] = useState(null) const [editingPlatform, setEditingPlatform] = useState(null) @@ -52,10 +53,11 @@ export default function CategoriesTab({ showToast, onDataChange }: CategoriesTab const fetchData = useCallback(async () => { try { - const [categoriesRes, scenesRes, platformsRes] = await Promise.all([ + const [categoriesRes, scenesRes, platformsRes, templateCategoriesRes] = await Promise.all([ fetch('/api/categories'), fetch('/api/scenes'), - fetch('/api/platforms') + fetch('/api/platforms'), + fetch('/api/template-categories') ]) if (categoriesRes.ok) { const data = await categoriesRes.json() @@ -69,6 +71,10 @@ export default function CategoriesTab({ showToast, onDataChange }: CategoriesTab const data = await platformsRes.json() setPlatforms(data) } + if (templateCategoriesRes.ok) { + const data = await templateCategoriesRes.json() + setTemplateCategories(data) + } } catch (error) { console.error('Error fetching categories data:', error) } @@ -669,12 +675,57 @@ export default function CategoriesTab({ showToast, onDataChange }: CategoriesTab return (
- {/* 使用店铺分类 */} + {/* 模板分类(从模板管理中提取) */} + {templateCategories.length > 0 && ( +
+
+
+

模板分类

+

+ 以下分类来自模板管理中的下拉选项(visibleOnHomeFilter=true 的 select 字段) +

+
+
+
+
+ {templateCategories.map((templateCategory) => ( +
+

+ {templateCategory.fieldLabel} ({templateCategory.fieldKey}) +

+
+ {templateCategory.options.map((option) => ( + + {option} + + ))} +
+

+ 共 {templateCategory.options.length} 个选项 +

+
+ ))} +
+
+
+ )} + + {/* 使用店铺分类(保留用于向后兼容) */}

使用店铺分类

-

管理所有使用店铺分类名称

+

+ 管理所有使用店铺分类名称(已废弃,建议使用模板分类) +

- {/* 素材类型 - 第一栏,让用户先选择类型 */} + {/* 素材模板 - 第一栏,让用户先选择模板 */}
- + {templates.length > 0 ? ( + + ) : ( +
+ 暂无可用模板,请联系管理员 +
+ )} + {selectedTemplate?.description && ( +

+ {selectedTemplate.description} +

+ )}
+ {/* 动态渲染模板字段 */} + {selectedTemplate && selectedTemplate.fields && selectedTemplate.fields.length > 0 && ( +
+
+

+ 模板字段 +

+
+ {selectedTemplate.fields.map((field: any) => { + const fieldValue = templateFieldValues[field.key] || '' + const isHalfWidth = field.layoutWidth === 'half' + + return ( +
+ + {field.type === 'text' || field.type === 'uppercase' ? ( + { + const value = field.type === 'uppercase' + ? e.target.value.toUpperCase() + : e.target.value + setTemplateFieldValues({ + ...templateFieldValues, + [field.key]: value, + }) + }} + required={field.required} + className="w-full" + /> + ) : field.type === 'textarea' ? ( +