A modern web-based system for managing laboratory measurements, device reservations, and research data — built as a Master's thesis project.
LIM (Laboratory Information Management) is a full-featured web administration frontend developed as part of a Master's thesis at Mendel University in Brno. It provides researchers and lab staff with a unified platform to:
- 📊 Record & visualize measurements with advanced charting and statistical analysis
- 📅 Reserve laboratory devices via a rich calendar system with conflict detection
- 🔬 Manage research projects with Kanban boards and team collaboration
- 📤 Publish datasets to Zenodo for open-access research data sharing
- 📥 Import data from CSV/Excel with smart template-based column mapping
🎓 Thesis context: This application serves the agricultural research center CeNAgriVeT at Mendel University, streamlining how researchers handle experimental data and shared lab equipment.
- Create structured measurements from customizable templates (text, number, boolean, date, select, rating fields)
- Interactive Chart.js visualizations with logarithmic/linear scale switching
- Linear & logarithmic regression analysis with R² statistics
- Side-by-side measurement comparison
- CSV/Excel import with intelligent header mapping wizard
- Full-text search, filtering, and sorting
- Week / Day / Month calendar views
- Recurring events (daily, weekly, monthly, yearly with custom rules)
- Real-time conflict detection across overlapping reservations
- Color-coded event cards per device
- Reservation editing with series scope handling (single / this & future / all)
- Machine-grouped daily view for lab managers
- Multi-project workspace with role-based access
- Kanban board with drag-and-drop task management and filtering
- Project summary dashboard
- Team member assignment
- Publish measurement datasets directly to Zenodo open-access repository
- DOI generation for citable research data
- Metadata editing (creators, keywords, license, communities)
- Sandbox mode for testing before real publication
- Full CRUD for laboratory devices with detailed specs
- Device-measurement linking
- Device selection in reservations with capacity tracking
- Template-based import wizard with visual column mapping
- CSV and Excel file support via PapaParse and SheetJS
- Block selection for partial imports
- Repeat-set controls for batch data entry
src/
├── components/ # Reusable Vue components
│ ├── board/ # Kanban board (lists, cards, filters)
│ ├── chart/ # Chart visualization & regression
│ ├── device/ # Device CRUD dialogs
│ ├── editor/ # Rich text editor (Markdown)
│ ├── import/ # Data import wizard
│ ├── measurement/ # Measurement CRUD, compare, export
│ ├── reservations/ # Calendar views & reservation editor
│ └── ui/ # Shared UI primitives
├── composables/ # Vue composables (reusable logic)
├── layouts/ # Page layout templates
├── models/ # TypeScript data models
├── pages/ # Route-level page components
├── plugins/ # Vuetify & app plugins
├── router/ # Vue Router config with auth guards
├── services/ # API layer & Zenodo integration
├── stores/ # Pinia state management
├── types/ # TypeScript type definitions
├── utils/ # Helper utilities
├── views/ # View-specific logic
└── workers/ # Web Workers for heavy parsing
| Layer | Technology |
|---|---|
| Framework | Vue 3 (Composition API) |
| Language | TypeScript 5.6 |
| UI Library | Vuetify 3 + Material Design Icons |
| State | Pinia |
| Routing | Vue Router 4 (auto-generated routes) |
| Build | Vite 5 |
| Charts | Chart.js 4 |
| Drag & Drop | vue-draggable-next |
| Statistics | simple-statistics |
| PDF Export | jsPDF + jspdf-autotable |
| Data Import | PapaParse (CSV) + SheetJS (Excel) |
| Rich Text | md-editor-v3 |
| Auth | Keycloak JS (SSO / OAuth 2.0) |
| Testing | Vitest + Vue Test Utils |
| Deploy | Docker + Docker Compose + Traefik |
- Node.js ≥ 18
- npm (comes with Node.js)
- A running backend API (Java-based)
- A Keycloak instance for authentication
# Clone the repository
git clone https://github.com/krisssix/lim.git
cd lim
# Install dependencies
npm install
# Configure environment
cp .env-example .env.development.localEdit .env.development.local with your backend and auth server URLs:
VITE_SERVER_URL=http://localhost:8080/api
VITE_AUTH_SERVER_URL=https://your-keycloak-server.com
VITE_AUTH_REALM=your-realm# Start dev server on http://localhost:3000
npm run devnpm run builddocker-compose up --build# Run tests
npm run test
# Watch mode
npm run test:watch- Measurement Templates — Dynamic form generation from JSON schema (text, number, boolean, date, select, rating fields)
- Reservation Conflict Engine — Real-time detection of overlapping reservations with conflict resolution dialog
- Recurring Events — Full RFC-5545 inspired recurrence rule support (daily, weekly, monthly, yearly with intervals, end dates, and exception handling)
- Web Workers — File parsing offloaded to background threads for smooth UI during large CSV/Excel imports
- Auto-imports — Components and APIs are auto-imported via
unplugin-vue-componentsandunplugin-auto-import
📑 A full interactive presentation with live demonstrations of the system is available online:
The presentation covers system architecture, feature walk-throughs, and real-time demos of measurements, reservations, and data import workflows.
Kristina Nazarjanová
- 🎓 Master's Student — Mendel University in Brno
- 🐙 GitHub: @krisssix
This project was developed as part of a university thesis. Please contact the author for usage permissions.
Built with ❤️ using Vue 3 + Vuetify + TypeScript
