import gradio as gr import os import pandas as pd import resend from supabase import create_client, Client # --- 設定 --- SUPABASE_URL = os.getenv("SUPABASE_URL") SUPABASE_KEY = os.getenv("SUPABASE_KEY") RESEND_API_KEY = os.getenv("RESEND_API_KEY") PUBLIC_SPACE_URL = "https://deeplearning101-ciecietaipei.hf.space" # ⚠️ 請換成您 Space A 的網址 supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY) resend.api_key = RESEND_API_KEY def get_bookings(): # 加入 email 和 remarks 欄位 response = supabase.table("bookings").select("*").order("created_at", desc=True).execute() if not response.data: return pd.DataFrame() df = pd.DataFrame(response.data) # 確保欄位存在,避免報錯 cols = ['id', 'date', 'time', 'name', 'tel', 'email', 'pax', 'remarks', 'status'] for c in cols: if c not in df.columns: df[c] = "" return df[cols] def send_confirmation_email(booking_id): """發送確認信邏輯""" try: # 1. 抓取訂位資料 res = supabase.table("bookings").select("*").eq("id", booking_id).execute() if not res.data: return "❌ 找不到該訂單" booking = res.data[0] email = booking.get('email') if not email or "@" not in email: return "❌ 客人未填寫有效 Email" # 2. 產生確認連結 (指向 Space A) confirm_link = f"{PUBLIC_SPACE_URL}/?id={booking_id}&action=confirm" # 3. 寄信 (HTML) params = { "from": "Cié Cié Taipei ", # 若沒買網域,先用 Resend 預設的 "to": [email], "subject": f"[{booking['date']}] Cié Cié Taipei 訂位確認", "html": f"""

訂位保留確認

{booking['name']} 您好,我們已為您保留座位:

請點擊下方按鈕確認出席:

✅ 我會出席 (Confirm)

若需取消,請直接回覆此信或致電。

""" } resend.Emails.send(params) # 4. 更新狀態為「已發信」 supabase.table("bookings").update({"status": "已發確認信"}).eq("id", booking_id).execute() return f"✅ 已發送確認信給 {booking['name']} ({email})" except Exception as e: return f"❌ 發信失敗: {str(e)}" # --- 介面 --- with gr.Blocks(title="Admin") as demo: gr.Markdown("# 🍷 訂位管理後台") refresh_btn = gr.Button("🔄 重新整理") booking_table = gr.Dataframe(interactive=False) with gr.Row(): id_input = gr.Number(label="訂單 ID", precision=0) action_btn = gr.Button("📧 發送確認信 (Send Email)", variant="primary") log_output = gr.Textbox(label="執行結果") refresh_btn.click(get_bookings, outputs=booking_table) action_btn.click(send_confirmation_email, inputs=id_input, outputs=log_output) if __name__ == "__main__": demo.launch()