尚未检测到更新。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).