first commit
This commit is contained in:
113
README.md
Normal file
113
README.md
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
# Drug Inventory System
|
||||||
|
|
||||||
|
A simple, lightweight drug inventory management system for small charity veterinary clinics.
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
- **Backend**: Python + FastAPI + Uvicorn + SQLite
|
||||||
|
- **Frontend**: Plain HTML, CSS, JavaScript (no frameworks)
|
||||||
|
- **Database**: SQLite (file-based, zero setup)
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
✅ Add, edit, delete drugs
|
||||||
|
✅ Track quantities and units
|
||||||
|
✅ Low stock alerts
|
||||||
|
✅ Filter by inventory status
|
||||||
|
✅ Responsive design (works on desktop and mobile)
|
||||||
|
✅ Fast and lightweight
|
||||||
|
|
||||||
|
## Quick Start (Docker - Recommended)
|
||||||
|
|
||||||
|
Everything runs in containers. Just make sure you have Docker and Docker Compose installed.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
That's it! Everything will start automatically:
|
||||||
|
|
||||||
|
- **Frontend**: `http://localhost` (Nginx serving the UI)
|
||||||
|
- **Backend API**: `http://localhost:8000` (FastAPI)
|
||||||
|
- **API Docs**: `http://localhost:8000/docs` (Interactive Swagger UI)
|
||||||
|
- **Database**: SQLite file at `./drugs.db` (auto-created)
|
||||||
|
|
||||||
|
To stop:
|
||||||
|
```bash
|
||||||
|
docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
To rebuild after code changes:
|
||||||
|
```bash
|
||||||
|
docker-compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
/drugs
|
||||||
|
/backend
|
||||||
|
/app
|
||||||
|
__init__.py # Database config
|
||||||
|
database.py # Database connection setup
|
||||||
|
models.py # SQLAlchemy models
|
||||||
|
main.py # FastAPI app and routes
|
||||||
|
requirements.txt # Python dependencies
|
||||||
|
Dockerfile # Container image
|
||||||
|
|
||||||
|
/frontend
|
||||||
|
index.html # Main page
|
||||||
|
styles.css # All styling
|
||||||
|
app.js # All JavaScript logic
|
||||||
|
|
||||||
|
docker-compose.yml # Run everything with Docker Compose
|
||||||
|
nginx.conf # Nginx config for frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
## API Endpoints
|
||||||
|
|
||||||
|
| Method | Endpoint | Description |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| GET | `/drugs` | List all drugs |
|
||||||
|
| GET | `/drugs/{id}` | Get specific drug |
|
||||||
|
| POST | `/drugs` | Create new drug |
|
||||||
|
| PUT | `/drugs/{id}` | Update drug |
|
||||||
|
| DELETE | `/drugs/{id}` | Delete drug |
|
||||||
|
| GET | `/drugs/low-stock` | Get low stock drugs |
|
||||||
|
|
||||||
|
## Database
|
||||||
|
|
||||||
|
SQLite database is stored as `drugs.db` in the project root. It's a single file that persists between container restarts. You can:
|
||||||
|
- Backup by copying the file
|
||||||
|
- Share with team members
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Edit environment variables in `docker-compose.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
environment:
|
||||||
|
- DATABASE_URL=sqlite:///./drugs.db
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
When you run `docker-compose up`, the backend automatically reloads when code changes (`--reload` flag). Just refresh your browser to see updates.
|
||||||
|
|
||||||
|
## Production Deployment
|
||||||
|
|
||||||
|
For production:
|
||||||
|
1. Disable `--reload` in docker-compose.yml command
|
||||||
|
2. Use a production WSGI server (e.g., Gunicorn)
|
||||||
|
3. Add environment variables for security
|
||||||
|
4. Use a managed database instead of SQLite if scaling
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
|
||||||
|
- User authentication & roles
|
||||||
|
- Audit log (who changed what and when)
|
||||||
|
- Export to CSV
|
||||||
|
- Barcode/QR code scanning
|
||||||
|
- Email alerts for low stock
|
||||||
|
- Multi-location support
|
||||||
|
- Mobile app
|
||||||
Reference in New Issue
Block a user