Initial commit: Activiteiten Inventaris applicatie
This commit is contained in:
142
README.md
Normal file
142
README.md
Normal file
@@ -0,0 +1,142 @@
|
||||
# Activity Inventory - Questionnaire Voting App
|
||||
|
||||
A web application that allows admins to create shareable questionnaires where users can add activities and vote on them using upvotes and downvotes.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- **Frontend**: React 18, TypeScript, Vite, Tailwind CSS
|
||||
- **Backend**: Express.js, TypeScript
|
||||
- **Database**: SQLite with `better-sqlite3`
|
||||
- **Containerization**: Docker with multi-stage build
|
||||
|
||||
## Features
|
||||
|
||||
- **Admin Dashboard**: Create and manage questionnaires with unique shareable URLs
|
||||
- **User Management**: Add/remove admin users and change passwords
|
||||
- **Public Voting**: Share questionnaire URLs for users to add activities and vote
|
||||
- **Upvote/Downvote System**: Users can upvote or downvote activities
|
||||
- **Comments**: Users can comment on activities and reply to comments
|
||||
- **Name Persistence**: Visitor names are stored in cookies for 30 days
|
||||
- **Docker Support**: Easy deployment with Docker and docker-compose
|
||||
|
||||
## Quick Start with Docker
|
||||
|
||||
1. Clone the repository and navigate to the project directory
|
||||
|
||||
2. Start the application:
|
||||
```bash
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
3. Access the app at `http://localhost:4000`
|
||||
|
||||
4. Login with default credentials:
|
||||
- Username: `admin`
|
||||
- Password: `admin123`
|
||||
|
||||
5. Create a questionnaire and share the unique URL with participants
|
||||
|
||||
## Development Setup
|
||||
|
||||
1. Install dependencies:
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Start the development servers (frontend + backend):
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
3. Access the app at `http://localhost:5177` (Vite dev server)
|
||||
- API requests are proxied to `http://localhost:4000`
|
||||
|
||||
## Configuration
|
||||
|
||||
Environment variables can be set in `docker-compose.yml` or via a `.env` file:
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `PORT` | Server port | `4000` |
|
||||
| `SESSION_SECRET` | Secret for session encryption | `super-secret-session-key-change-me` |
|
||||
| `DB_PATH` | SQLite database path | `/app/data/questionnaire.db` |
|
||||
| `DEFAULT_ADMIN_USER` | Default admin username | `admin` |
|
||||
| `DEFAULT_ADMIN_PASS` | Default admin password | `admin123` |
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
questionnaire/
|
||||
├── docker-compose.yml # Docker Compose configuration
|
||||
├── Dockerfile # Multi-stage Docker build
|
||||
├── package.json # Node.js dependencies
|
||||
├── vite.config.ts # Vite configuration
|
||||
├── tailwind.config.js # Tailwind CSS configuration
|
||||
├── tsconfig.json # TypeScript configuration
|
||||
├── index.html # HTML entry point
|
||||
├── server/ # Express backend (TypeScript)
|
||||
│ ├── index.ts # Server entry point
|
||||
│ ├── database.ts # SQLite database operations
|
||||
│ ├── middleware/
|
||||
│ │ └── auth.ts
|
||||
│ └── routes/
|
||||
│ ├── admin.ts
|
||||
│ ├── auth.ts
|
||||
│ └── questionnaire.ts
|
||||
└── src/ # React frontend (TypeScript)
|
||||
├── main.tsx # React entry point
|
||||
├── App.tsx # App router
|
||||
├── index.css # Tailwind imports
|
||||
├── context/
|
||||
│ └── AuthContext.tsx
|
||||
├── components/
|
||||
│ ├── AdminLayout.tsx
|
||||
│ └── ProtectedRoute.tsx
|
||||
└── pages/
|
||||
├── Login.tsx
|
||||
├── Dashboard.tsx
|
||||
├── QuestionnaireForm.tsx
|
||||
├── QuestionnaireDetail.tsx
|
||||
├── Users.tsx
|
||||
├── ChangePassword.tsx
|
||||
├── PublicQuestionnaire.tsx
|
||||
└── NotFound.tsx
|
||||
```
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### Public Routes
|
||||
- `GET /api/q/:uuid` - Get questionnaire data
|
||||
- `POST /api/q/:uuid/set-name` - Set visitor name
|
||||
- `POST /api/q/:uuid/activities` - Add an activity
|
||||
- `POST /api/q/:uuid/activities/:id/vote` - Vote on an activity
|
||||
- `GET /api/q/:uuid/activities/:id/comments` - Get comments
|
||||
- `POST /api/q/:uuid/activities/:id/comments` - Add a comment
|
||||
|
||||
### Auth Routes
|
||||
- `GET /api/auth/status` - Check authentication status
|
||||
- `POST /api/auth/login` - Login
|
||||
- `POST /api/auth/logout` - Logout
|
||||
|
||||
### Admin Routes (requires authentication)
|
||||
- `GET /api/admin/questionnaires` - List all questionnaires
|
||||
- `POST /api/admin/questionnaires` - Create questionnaire
|
||||
- `GET /api/admin/questionnaires/:id` - Get questionnaire details
|
||||
- `PUT /api/admin/questionnaires/:id` - Update questionnaire
|
||||
- `DELETE /api/admin/questionnaires/:id` - Delete questionnaire
|
||||
- `DELETE /api/admin/activities/:id` - Delete activity
|
||||
- `GET /api/admin/users` - List all users
|
||||
- `POST /api/admin/users` - Create user
|
||||
- `DELETE /api/admin/users/:id` - Delete user
|
||||
- `POST /api/admin/change-password` - Change password
|
||||
|
||||
## Security Notes
|
||||
|
||||
- Change the default admin password immediately after first login
|
||||
- Set a strong `SESSION_SECRET` in production
|
||||
- The application uses bcrypt for password hashing
|
||||
- Session cookies are HTTP-only
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
Reference in New Issue
Block a user