尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Se ci stai cliccando sai di cosa si tratta. Altrimenti seguici su Ig
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Applicazione web per l'Annuario storico del PN — Università di Pisa. Next.js 14 (App Router + Server Actions), Tailwind CSS, Vercel Postgres (Drizzle ORM), Vercel Blob, Upstash Redis (OTP volatile), Resend (email). • Zero-retention delle email: l'indirizzo istituzionale viene scritto solo su Upstash Redis con TTL di 5 minuti (lib/otp.ts), mai nel database Postgres. Dopo la verifica, il client riceve un token firmato (HMAC, lib/token.ts) che non contiene l'email, valido 15 minuti: è la prova che serve al form per sbloccare l'upload [README 설치·사용 부분 발췌] Setup locale檢視完整 README ↗
Applicazione web per l'Annuario storico del PN — Università di Pisa. Next.js 14 (App Router + Server Actions), Tailwind CSS, Vercel Postgres (Drizzle ORM), Vercel Blob, Upstash Redis (OTP volatile), Resend (email).
annuario-del-pn/
├── drizzle/
│ └── schema.ts # Schema DB: hall_of_fame_entries, archived_editions
├── drizzle.config.ts
├── src/
│ ├── app/
│ │ ├── layout.tsx # Layout root, font, Navbar/Footer
│ │ ├── globals.css
│ │ ├── page.tsx # Home
│ │ ├── archivio/
│ │ │ └── page.tsx # Archivio (griglia edizioni + download PDF)
│ │ └── hall-of-fame/
│ │ ├── page.tsx # Hall of Fame (server component, fetch iniziale)
│ │ └── actions.ts # Server Actions: OTP, verifica, upload, polling
│ ├── components/
│ │ ├── Navbar.tsx
│ │ ├── Footer.tsx
│ │ ├── HallOfFameBoard.tsx # Client: griglia + polling + stato ottimistico
│ │ ├── PhotoCard.tsx
│ │ ├── UploadModal.tsx
│ │ └── UploadForm.tsx # Client: step Email -> OTP -> Dettagli foto
│ └── lib/
│ ├── db.ts # Connessione Drizzle + Vercel Postgres
│ ├── blob-upload.ts # Validazione e upload immagini su Vercel Blob
│ ├── otp.ts # Generazione/verifica OTP su Upstash Redis (TTL)
│ ├── token.ts # Token firmato HMAC "email verificata" (no email dentro)
│ ├── email.ts # Invio OTP via Resend
│ ├── validations.ts # Schemi Zod
│ └── utils.ts
├── tailwind.config.ts
├── next.config.mjs
└── .env.local.example
lib/otp.ts), mai nel
database Postgres. Dopo la verifica, il client riceve un token firmato
(HMAC, lib/token.ts) che non contiene l'email, valido 15 minuti:
è la prova che serve al form per sbloccare l'upload, senza lasciare
traccia persistente dell'identità del mittente.revalidatePath("/hall-of-fame") (rigenera l'SSR per i nuovi visitatori)
e aggiorna otticamente lo stato React lato client di chi ha appena
caricato la foto. Un polling leggero ogni 15s (getLatestEntriesAction)
aggiorna la griglia anche per chi ha già la pagina aperta, senza bisogno
di WebSocket/infrastruttura aggiuntiva (compatibile col piano Vercel free).npm install.env.local.example in .env.local e compila le variabili:
POSTGRES_URL e derivate.BLOB_READ_WRITE_TOKEN.UPSTASH_REDIS_REST_URL / ..._TOKEN.RESEND_API_KEY.OTP_SIGNING_SECRET con openssl rand -base64 32.npm run db:pushnpm run devNon è richiesta un'interfaccia di amministrazione nel primo step: le righe
di archived_editions (PDF + copertina, già caricati su Vercel Blob) si
possono inserire manualmente con npm run db:studio (Drizzle Studio) o via
uno script di seed, finché non verrà costruita una pagina /admin dedicata.
UPSTASH_REDIS_REST_URL/TOKEN, RESEND_API_KEY,
RESEND_FROM_EMAIL, OTP_SIGNING_SECRET, NEXT_PUBLIC_APP_URL./admin protetta per caricare nuove edizioni (PDF + copertina).