尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證PAU Network bridges the gap between Pan-Atlantic University students and alumni. Filter mentors by course, view profiles, and seamlessly book career guidance sessions. Built during a 6-hour hackathon.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗PAU Network connects Pan-Atlantic University students with alumni from their own course. Students filter alumni by department, view LinkedIn-style profiles, book 30-minute mentorship sessions, send message requests, and join live Q&A spaces. Alumni publish availability, post to the timeline, host spaces, and earn badges, tiers and awards for helping.
Built in 6 hours for the Technology Innovation Club Mini Hackathon (Challenge 06: Alumni networking).
All people in the seed data are fictional. Employers are real Nigerian companies, used only for realism.
PAU-Network/
├── backend/ Express 5 + TypeScript REST API and Socket.IO server
│ ├── prisma/
│ │ ├── schema.prisma Data model (single source of truth)
│ │ ├── migrations/ SQL migrations (includes partial unique index + check constraints)
│ │ ├── seed.ts Demo users, work history, 20 months of activity, spaces, posts, messages
│ │ └── seed-awards.ts Computes historical monthly/yearly awards from the points ledger
│ ├── prisma.config.ts Prisma 7 config (CLI uses DIRECT_URL)
│ └── src/
│ ├── app.ts Express app, routes mounted under /api/v1
│ ├── server.ts HTTP + Socket.IO entry point
│ ├── config/env.ts Validated environment variables
│ ├── lib/ prisma client (driver adapter), JWT, errors, validation, shared selects
│ ├── middleware/ authenticate, requireRole, error handler
│ ├── realtime/ Socket.IO rooms: user:<id>, space:<id>
│ └── modules/ One folder per feature: <feature>.routes.ts (+ .service.ts / .config.ts)
│ ├── auth users profile departments
│ ├── availability bookings
│ ├── conversations posts spaces
│ ├── gamification awards notifications
└── frontend/ Next.js 15 (App Router) + Tailwind CSS v4
└── src/
├── theme.ts ALL colours live here (see "Theming")
├── app/ Pages: feed, alumni, profile/[userId], settings, spaces, spaces/[spaceId],
│ messages, messages/[conversationId], bookings, availability, achievements, awards
├── components/ AppShell, ui kit, PostCard, BookingModal, EmojiPicker, Toast
└── lib/ api client, session + socket context, types, formatters, image resizing
Request flow: browser → REST /api/v1/* (JWT bearer token) → Prisma 7 (@prisma/adapter-pg) → PostgreSQL (Neon). State changes emit Socket.IO events (resource:action-past-tense, e.g. space:hand-raised) so open tabs update live.
Audio/video in sessions and spaces uses Jitsi Meet rooms (no API key). Raised hands, speakers, questions, upvotes and emoji reactions run on our own Socket.IO server.
| Thing | Convention | Example |
|---|---|---|
| Prisma models | PascalCase, singular | SpaceQuestion |
| Database tables | snake_case, plural | space_questions |
| Fields / JSON keys | camelCase | graduationYear |
| Database columns | snake_case | graduation_year |
| Enums | PascalCase type, SCREAMING_SNAKE values | BookingStatus.PENDING |
| Primary / foreign keys | id (UUID) / <relation>Id | authorId |
| Booleans | is / has prefix | isVerified, hasOpenSlots |
| Timestamps | <event>At, UTC ISO 8601 | createdAt, startsAt |
| Counters | <thing>Count | commentCount |
| REST paths | plural kebab-case nouns, actions as sub-resources | POST /bookings/:bookingId/accept |
| Socket events | resource:action-past-tense | space:question-created |
| Responses | { data, meta? } / { error: { code, message, details? } } |
Every colour is defined once in frontend/src/theme.ts. The root layout turns it into CSS variables, and globals.css maps them to Tailwind classes (bg-primary, text-muted, border-line, bg-tier-gold, …). Change a hex value in theme.ts and the whole app updates. To add a new colour, add it to theme.ts and add one --color-<name>: var(--<name>); line to @theme inline in globals.css.
Requirements: Node 20+.
# 1. Backend
cd backend
cp .env.example .env # paste your Neon DATABASE_URL and DIRECT_URL
npm install
npx prisma migrate deploy
npm run db:seed # demo data; every account's password is demo1234
npm run dev # http://localhost:4000/api/v1
# 2. Frontend (new terminal)
cd frontend
cp .env.example .env.local
npm install
npm run dev # http://localhost:3000
No Neon yet? npx prisma dev starts a local Postgres; put its URL in both DATABASE_URL and DIRECT_URL and set DATABASE_POOL_MAX=1.
Demo logins (password demo1234): [email protected] (CS student), [email protected] (alumni, Paystack), [email protected] (admin). The login page has one-click demo buttons.
Create an app in the LinkedIn Developer Portal and enable Sign In with LinkedIn using OpenID Connect. Add this exact authorized redirect URL to the app:
http://localhost:4000/api/v1/auth/linkedin/callback
Set LINKEDIN_CLIENT_ID and LINKEDIN_CLIENT_SECRET in backend/.env. The default callback URL and frontend URL are for local development; set LINKEDIN_REDIRECT_URI, FRONTEND_URL, and CORS_ORIGINS for your deployment. The app requests only the openid, profile, and email scopes. Existing accounts are signed in by their verified LinkedIn email; new users confirm their PAU role, department, and study or employment details during registration.
Apply the new LinkedIn identity column before running the updated backend with cd backend && npm run db:deploy.
Spaces use LiveKit Cloud for real-time audio. Create a LiveKit Cloud project and set LIVEKIT_URL, LIVEKIT_API_KEY and LIVEKIT_API_SECRET in backend/.env (the URL starts with wss://). Restart the backend after configuration. The backend issues short-lived room tokens only to participants who have joined a live space; hosts and promoted speakers may publish microphone audio, while listeners may only subscribe. Tokens do not permit video or data publishing. No Jitsi account or moderator login is required.
Users who click Remind me are emailed once 1 hour before and again 15 minutes before a scheduled space starts. Configure RESEND_API_KEY and EMAIL_FROM in backend/.env; the sender address must be verified in Resend. Apply pending migrations with cd backend && npm run db:deploy and restart the backend. Reminder emails link to the space in the frontend. If the backend is unavailable during a reminder window, pending emails are sent when it resumes, while the space is still scheduled to start.
DATABASE_URL and the direct URL for DIRECT_URL.render.yaml. Set DATABASE_URL, DIRECT_URL and CORS_ORIGINS (your Vercel URL).frontend and NEXT_PUBLIC_API_URL=https://<your-render-app>.onrender.com/api/v1.POST /api/v1/awards/compute as an admin on the 1st of each month (and on 1 January for yearly awards), e.g. from a cron job.