A full‑stack platform for managing paper submissions, peer review, registration, and admin workflows. The monorepo contains a Node/Express API, a user‑facing React app, and an admin/reviewer React app.
server– Express + MongoDB API (auth, submissions, registrations, admin, reviewer)client– User web app (React + Vite)admin– Admin/Reviewer web app (React + Vite)
- Backend: Node.js, Express 5, Mongoose, JWT, Multer, Cloudinary, Nodemailer
- Frontend: React 19, Vite, React Router, Tailwind CSS
- Database: MongoDB
- Node.js 18+ and npm
- MongoDB connection string
- Cloudinary account (for file uploads)
- SMTP credentials (for OTP and emails)
From the repository root:
cd server && npm install
cd ../client && npm install
cd ../admin && npm install
Create a .env file in each app as shown.
Server (server/.env):
PORT=4000
MONGODB_URI=<your-mongodb-uri>
JWT_SECRET=<your-jwt-secret>
# Admin login (used for /api/admin/login)
ADMIN_EMAIL=<admin-login-email>
ADMIN_PASSWORD=<admin-login-password>
# Cloudinary
CLOUDINARY_NAME=<cloudinary-cloud-name>
CLOUDINARY_API_KEY=<cloudinary-api-key>
CLOUDINARY_SECRET_KEY=<cloudinary-secret>
# SMTP for Nodemailer
EMAIL_HOST=<smtp-host> # e.g. smtp.gmail.com
EMAIL_PORT=<smtp-port> # e.g. 587
EMAIL_USER=<smtp-user>
EMAIL_PASS=<smtp-app-password>
Client (client/.env):
VITE_BACKEND_URL=http://localhost:4000
Admin (admin/.env):
VITE_BACKEND_URL=http://localhost:4000
Backend API:
cd server
npm run server # dev with nodemon
# or
npm start # node server.js
User App:
cd client
npm run dev
# visit the URL printed by Vite (e.g., http://localhost:5173)
Admin/Reviewer App:
cd admin
npm run dev
# visit the URL printed by Vite (e.g., http://localhost:5174)
Base URL: http://localhost:4000
User routes (/api/user):
POST /signup– Send OTP to emailPOST /verify-otp– Verify OTP and issue tokenPOST /loginPOST /forgot-passwordPOST /reset-passwordGET /profile– requiresAuthorization: Bearer <token>POST /update-profile– multipart (optionalimage)POST /add-submission– multipart (fileattachment)GET /my-submissionsPOST /registration– multipart (filepaymentProof)
Admin routes (/api/admin):
POST /login– returns admin token (atoken)POST /add-reviewer– multipart (image), auth requiredGET /all-reviewer,GET /reviewer/:id,POST /change-availability/:reviewerIdGET /submissions,GET /submission/:id,POST /assign-submission,POST /change-submission-status,DELETE /submission/:idGET /users,GET /user/:id,GET /user/:id/submissions,DELETE /user/:idGET /registrations,GET /registration/user/:userId,DELETE /registrations/:id,PUT /mark-feedback-seen/:idPOST /notify-author
Reviewer routes (/api/reviewer):
POST /login– returns reviewer token (rtoken)GET /profile,PUT /profileGET /submissions,GET /submissions/:idPOST /submissions/:id/reviewGET /dashboard
- User: send
Authorization: Bearer <token>header - Admin: send
atoken: <admin-token>header. Token is JWT ofADMIN_EMAIL + ADMIN_PASSWORDsigned withJWT_SECRET. - Reviewer: send
rtoken: <reviewer-token>header
- Uses Multer to parse multipart form data
- Files are uploaded to Cloudinary
- Submissions: stored as
resource_type: raw(PDF/doc/zip) - Profile images: stored as
resource_type: image
- Submissions: stored as
- Nodemailer sends OTP for signup and password reset using the SMTP settings from
server/.env.
- Server:
npm run server(dev),npm start(prod) - Client/Admin:
npm run dev,npm run build,npm run preview
- Build frontends: run
npm run buildinclientandadminand deploy the static assets - Run the API with a process manager (e.g., PM2) and configure all environment variables
- Put the API behind a reverse proxy (Nginx/Apache) and enable HTTPS
The server package declares ISC. Adjust or add a project-wide license if needed.