From f2c60029697f414a8f5e85accc63ae838023051a Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 13 Feb 2026 23:49:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=B2=BE=E9=80=89=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=88=86=E7=B1=BB=E5=B9=B6=E6=96=B0=E5=A2=9E=E6=9C=80?= =?UTF-8?q?=E8=BF=91=E9=A1=B9=E7=9B=AE=E9=A1=B5=E5=86=85=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settings/admin-settings-client.tsx | 65 ++++++++++++++++++- app/api/admin/images/route.ts | 52 +++++++++++---- app/api/featured/route.ts | 3 +- components/home/lovart-home.tsx | 32 +++++---- .../migrations/0028_add_featured_category.sql | 6 ++ lib/db/migrations/meta/_journal.json | 9 ++- lib/db/schema.ts | 1 + 7 files changed, 139 insertions(+), 29 deletions(-) create mode 100644 lib/db/migrations/0028_add_featured_category.sql diff --git a/app/(admin)/settings/admin-settings-client.tsx b/app/(admin)/settings/admin-settings-client.tsx index 16d43265f..93be80a01 100644 --- a/app/(admin)/settings/admin-settings-client.tsx +++ b/app/(admin)/settings/admin-settings-client.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useMemo } from "react"; import useSWR from "swr"; import { toast } from "sonner"; import { formatBeijingTime } from "@/lib/utils"; @@ -229,6 +229,7 @@ type GeneratedImageRecord = { prompt: string | null; modelId: string | null; isFeatured: boolean; + featuredCategory: string | null; featuredAt: string | null; createdAt: string; chatId: string | null; @@ -455,6 +456,13 @@ export function AdminSettingsClient() { } }, [siteSettingsData]); + const featuredCategoryOptions = useMemo(() => { + const values = (siteSettings.surpriseCategories || []) + .map((item) => String(item || "").trim()) + .filter((item) => item && item !== "全部"); + return Array.from(new Set(values)); + }, [siteSettings.surpriseCategories]); + // 抠图API配置状态 const [rmbgConfig, setRmbgConfig] = useState({ provider: "rmbg" as "rmbg" | "photoroom", // 抠图服务提供商 @@ -1994,6 +2002,10 @@ export function AdminSettingsClient() {

{selectedImage.modelId || "未知"}

+
+ +

{selectedImage.featuredCategory || "未设置"}

+
{selectedImage.isFeatured && selectedImage.featuredAt && (
@@ -2006,7 +2018,56 @@ export function AdminSettingsClient() {
{/* 精选操作按钮 */} -
+
+
+ + + +
+ {hasMoreProjects ? ( + + ) : null}
diff --git a/lib/db/migrations/0028_add_featured_category.sql b/lib/db/migrations/0028_add_featured_category.sql new file mode 100644 index 000000000..f3e7efed4 --- /dev/null +++ b/lib/db/migrations/0028_add_featured_category.sql @@ -0,0 +1,6 @@ +ALTER TABLE "GeneratedImage" +ADD COLUMN IF NOT EXISTS "featuredCategory" varchar(64); + +CREATE INDEX IF NOT EXISTS "generated_image_featured_category_idx" +ON "GeneratedImage" ("featuredCategory") +WHERE "isFeatured" = true; diff --git a/lib/db/migrations/meta/_journal.json b/lib/db/migrations/meta/_journal.json index 758da14be..a17e8d742 100644 --- a/lib/db/migrations/meta/_journal.json +++ b/lib/db/migrations/meta/_journal.json @@ -99,6 +99,13 @@ "when": 1769247486013, "tag": "0013_loving_ultimatum", "breakpoints": true + }, + { + "idx": 14, + "version": "7", + "when": 1769247486014, + "tag": "0028_add_featured_category", + "breakpoints": true } ] -} \ No newline at end of file +} diff --git a/lib/db/schema.ts b/lib/db/schema.ts index 0fe20219e..39e2b0020 100644 --- a/lib/db/schema.ts +++ b/lib/db/schema.ts @@ -389,6 +389,7 @@ export const generatedImage = pgTable("GeneratedImage", { prompt: text("prompt"), modelId: varchar("modelId", { length: 128 }), isFeatured: boolean("isFeatured").notNull().default(false), // 是否精选 + featuredCategory: varchar("featuredCategory", { length: 64 }), // 精选分类 featuredAt: timestamp("featuredAt"), // 精选时间 featuredBy: uuid("featuredBy").references(() => user.id), // 精选操作人 createdAt: timestamp("createdAt").notNull().defaultNow(),