diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7cd6fe2..eff599c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -786,6 +786,7 @@ model AppConfig { reminderDispatchIntervalMinutes Int @default(60) trafficSyncEnabled Boolean @default(true) trafficSyncIntervalSeconds Int @default(60) + networkInsightsEnabled Boolean @default(false) subscriptionRiskEnabled Boolean @default(true) subscriptionRiskAutoSuspend Boolean @default(true) subscriptionRiskWindowHours Int @default(24) diff --git a/src/actions/admin/settings.ts b/src/actions/admin/settings.ts index c971f0f..6459b42 100644 --- a/src/actions/admin/settings.ts +++ b/src/actions/admin/settings.ts @@ -27,6 +27,7 @@ const settingsSchema = z.object({ reminderDispatchIntervalMinutes: z.coerce.number().int().positive().optional(), trafficSyncEnabled: z.string().optional(), trafficSyncIntervalSeconds: z.coerce.number().int().min(10).optional(), + networkInsightsEnabled: z.string().optional(), subscriptionRiskEnabled: z.string().optional(), subscriptionRiskAutoSuspend: z.string().optional(), subscriptionRiskWindowHours: z.coerce.number().int().min(1).max(168).optional(), @@ -137,6 +138,10 @@ function buildSettingsUpdate(parsed: z.infer, current: Aw trafficSyncEnabled: optionalBoolean(parsed.trafficSyncEnabled, current.trafficSyncEnabled), trafficSyncIntervalSeconds: parsed.trafficSyncIntervalSeconds ?? current.trafficSyncIntervalSeconds, + networkInsightsEnabled: optionalBoolean( + parsed.networkInsightsEnabled, + current.networkInsightsEnabled, + ), subscriptionRiskEnabled: optionalBoolean( parsed.subscriptionRiskEnabled, current.subscriptionRiskEnabled, @@ -223,6 +228,7 @@ function revalidateSettingsViews() { revalidatePath("/login"); revalidatePath("/register"); revalidatePath("/dashboard"); + revalidatePath("/store"); revalidatePath("/subscriptions"); revalidatePath("/admin/nodes"); revalidatePath("/account"); diff --git a/src/app/(admin)/admin/settings/page.tsx b/src/app/(admin)/admin/settings/page.tsx index fecfd01..0232bc3 100644 --- a/src/app/(admin)/admin/settings/page.tsx +++ b/src/app/(admin)/admin/settings/page.tsx @@ -37,6 +37,7 @@ export default async function AdminSettingsPage() { reminderDispatchIntervalMinutes: config.reminderDispatchIntervalMinutes, trafficSyncEnabled: config.trafficSyncEnabled, trafficSyncIntervalSeconds: config.trafficSyncIntervalSeconds, + networkInsightsEnabled: config.networkInsightsEnabled, subscriptionRiskEnabled: config.subscriptionRiskEnabled, subscriptionRiskAutoSuspend: config.subscriptionRiskAutoSuspend, subscriptionRiskWindowHours: config.subscriptionRiskWindowHours, diff --git a/src/app/(admin)/admin/settings/settings-form.tsx b/src/app/(admin)/admin/settings/settings-form.tsx index c9397f6..c38bf61 100644 --- a/src/app/(admin)/admin/settings/settings-form.tsx +++ b/src/app/(admin)/admin/settings/settings-form.tsx @@ -2,7 +2,7 @@ import { useState, type FormEvent } from "react"; import { useRouter } from "next/navigation"; -import { Bell, ChevronDown, Clock3, Gift, LifeBuoy, Mail, Send, Settings2, ShieldAlert, ShieldCheck } from "lucide-react"; +import { Bell, ChevronDown, Clock3, Gift, LifeBuoy, Mail, RadioTower, Send, Settings2, ShieldAlert, ShieldCheck } from "lucide-react"; import { Button, buttonVariants } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; @@ -26,6 +26,7 @@ interface AppConfig { reminderDispatchIntervalMinutes: number; trafficSyncEnabled: boolean; trafficSyncIntervalSeconds: number; + networkInsightsEnabled: boolean; subscriptionRiskEnabled: boolean; subscriptionRiskAutoSuspend: boolean; subscriptionRiskWindowHours: number; @@ -245,6 +246,29 @@ export function SettingsForm({ config, coupons }: { config: AppConfig; coupons: +
+
+ 商城线路展示 +
+
+
+ + +

+ 开启后,用户侧商城展示三网推荐、节点延迟、趋势和访问路径;关闭后只保留购买所需的线路入口选择。 +

+
+
+
+