Full-stack hospital management system covering patient records, staff assignments, automated scheduling, billing, and diagnostics. Started as a basic patient tracker, turned into a full-blown clinical workflow and billing engine. It happens.
- Backend: Java 17, Spring Boot, Spring Data JPA, Spring Security.
- DB: PostgreSQL.
- Frontend: React (Vite), Zustand (state), React Router.
- UI: Ant Design and Material UI (yes, both. Don't ask).
- Other: JWT (JJWT), Lombok, Mapstruct, CKEditor 5, HTML2PDF.js, React Player.
Patient & Clinical Core
- Admissions, appointments, and care plans.
- Vital signs tracking, assessments (with PDF export), and prescriptions.
- Medication management and administration logs.
- Product usage tracking.
Staff & Resourcing
- User accounts and role-based access control (RBAC).
- Assigning nurses to patients, units, and rooms.
- Nurse activity tracking.
Diagnostics
- Lab tests and results (utilizing dynamic table generation).
- Image report uploads and management.
- Configurable image report types and associated costs.
Billing & Finance
- Patient bill generation.
- Automated cost aggregation across procedures, product usage, lab tests, and imaging.
- HTML bills ready for viewing and printing.
Scheduling & Auth
- Automated scheduling for vital sign recordings based on unit type.
- Secure JWT-based authentication.
You can spin the whole thing up via Docker, or run it locally for development.
- Open
backend/src/main/resources/application.properties. - Manually uncomment the Docker database URL (
database:5432) and comment out the local one. - Run the build:
docker-compose up --buildBackend will be on http://localhost:8080, frontend on http://localhost:3000.
If you want hot-reloading and IDE support:
- Make sure Postgres is running locally on
:5432. - Open
backend/src/main/resources/application.propertiesand set the URL back tojdbc:postgresql://localhost:5432/mydb. - Fire up the backend via your Java IDE.
- Fire up the frontend:
cd frontend
npm install
npm run devBeing upfront:
- Manual config swapping. Having to manually comment/uncomment
application.propertiesto switch between Docker and local dev is annoying.