"use client"; import {useState, useEffect} from "react"; import {useToast} from "@/components/ui/toast"; import {Loader2} from "lucide-react"; import {Button} from "@/components/ui/button"; interface DBConfig { host: string; port: number; user: string; password: string; database: string; } const defaultDBConfig: DBConfig = { host: "127.0.0.1", port: 3306, user: "root", password: "", database: "recipe_tools", }; export default function DatabasePage() { const [config, setConfig] = useState(defaultDBConfig); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const {addToast} = useToast(); useEffect(() => { fetch("/api/config") .then((res) => res.json()) .then((result) => { if (result.success && result.data) { setConfig({ host: result.data.db?.host || defaultDBConfig.host, port: result.data.db?.port || defaultDBConfig.port, user: result.data.db?.user || defaultDBConfig.user, password: result.data.db?.password || defaultDBConfig.password, database: result.data.db?.database || defaultDBConfig.database, }); } }) .catch(console.error) .finally(() => setLoading(false)); }, []); const handleSave = async () => { setSaving(true); try { const response = await fetch("/api/config", { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({db: config}), }); const result = await response.json(); if (result.success) { addToast({type: "success", title: "数据库配置已保存"}); } else { addToast({type: "error", title: "保存失败", description: result.error}); } } catch { addToast({type: "error", title: "保存失败"}); } finally { setSaving(false); } }; if (loading) { return (

数据库配置

配置 MySQL 数据库连接信息

); } return (

数据库配置

配置 MySQL 数据库连接信息

setConfig({...config, host: e.target.value})} className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm" placeholder="127.0.0.1" />
setConfig({...config, port: parseInt(e.target.value) || 3306})} className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm" placeholder="3306" />
setConfig({...config, user: e.target.value})} className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm" placeholder="root" />
setConfig({...config, password: e.target.value})} className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm" placeholder="******" />
setConfig({...config, database: e.target.value})} className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm" placeholder="recipe_tools" />
); }