Xodimlarning ishga kelish va ketish vaqtini QR kod orqali qayd etadigan tizim. Xodim telefonida vaqtinchalik QR kod hosil qiladi, tashkilot rahbari uni kamera (yoki rasm) orqali skanerlaydi. Tizim kelish/ketishni avtomatik aniqlaydi, ishlangan vaqtni hisoblaydi va statistikani yuritadi.
| Qism | Texnologiya |
|---|---|
| Backend | NestJS 11, TypeORM, PostgreSQL, JWT (access + refresh), Swagger |
| Frontend | Vue 3, Vite, Vue Router, Pinia, Axios, qr-scanner |
| Infratuzilma | Docker, Docker Compose, Nginx |
Administrator (ADMIN)
- Tizim bo‘yicha umumiy statistika (tashkilotlar, xodimlar, bugungi davomat)
- Tashkilot (owner) qo‘shish, tahrirlash, bloklash, parolini tiklash
- Istalgan tashkilotga xodim qo‘shish, boshqa tashkilotga o‘tkazish, bloklash
Tashkilot rahbari (OWNER)
- Bugungi davomat — har bir xodimning holati (ishda / ketgan / kelmagan / belgilanmagan), avtomatik yangilanadi
- QR skaner — kamera, rasm yuklash yoki matn (tashqi skaner) orqali; kelish/ketish avtomatik aniqlanadi
- Xodimni sababli / sababsiz / ta’tilda deb belgilash va buni bekor qilish
- Xodimlarni qo‘shish, tahrirlash, bloklash, parolini tiklash
- Davomat tarixi: sana oralig‘i, xodim, holat bo‘yicha filtr; jami ishlangan vaqt; CSV (Excel) eksport
Xodim (USER)
- Ishga kelish / ketish uchun QR kod hosil qilish (amal qilish muddati taymer bilan)
- Bugungi holat va joriy oy xulosasi
- Shaxsiy davomat tarixi
Umumiy
- Access token muddati tugaganda refresh token orqali avtomatik yangilanadi
- Bloklangan foydalanuvchi tokeni darhol ishlamay qoladi
- Parolni o‘zgartirish, profil sahifasi
- Login uchun so‘rovlar cheklovi (rate limit), Helmet, CORS sozlamasi
GET /api/health— server va baza holati
Talablar: Docker 24+ va Docker Compose v2.
git clone <repo-url> DavomatQrCode
cd DavomatQrCode
docker compose up -d --buildBirinchi ishga tushirishda image’lar yig‘iladi (bir necha daqiqa). Backend ishga tushganda migratsiyalar avtomatik bajariladi va standart admin yaratiladi.
| Xizmat | Manzil |
|---|---|
| Frontend | http://localhost:8080 |
| Backend API | http://localhost:3001/api |
| Swagger (API hujjati) | http://localhost:3001/api-docs (yoki http://localhost:8080/api-docs) |
| PostgreSQL | localhost:5433 (konteyner ichida 5432) |
Standart administrator: login admin01, parol admin01
Birinchi kirishdan so‘ng parolni Profil sahifasida albatta o‘zgartiring.
Foydali buyruqlar:
docker compose ps # konteynerlar holati
docker compose logs -f backend # backend loglari
docker compose restart backend # backendni qayta ishga tushirish
docker compose down # to‘xtatish (ma’lumotlar saqlanadi)
docker compose down -v # to‘xtatish va bazani butunlay o‘chirish
docker compose up -d --build # kod o‘zgargandan so‘ng qayta yig‘ishdocker compose loyiha ildizidagi .env faylidan quyidagi o‘zgaruvchilarni oladi
(berilmasa standart qiymat ishlatiladi):
| O‘zgaruvchi | Standart | Izoh |
|---|---|---|
FRONTEND_PORT |
8080 |
Frontend tashqi porti |
BACKEND_PORT |
3001 |
Backend tashqi porti |
DB_PUBLIC_PORT |
5433 |
PostgreSQL tashqi porti |
DB_USERNAME / DB_PASSWORD / DB_NAME |
postgres / 123456 / Attendence |
Baza |
ACCESS_TOKEN_SECRET, REFRESH_TOKEN_SECRET, QR_CODE_SECRET |
— | JWT sirlari (production’da albatta o‘zgartiring) |
ACCESS_TOKEN_EXPIRY |
15m |
Access token muddati |
REFRESH_TOKEN_EXPIRY |
7d |
Refresh token muddati |
QR_CODE_TTL |
300 |
QR kod amal qilish muddati (soniya) |
CORS_ORIGINS |
http://localhost:8080 |
Ruxsat etilgan frontend manzillari |
Masalan, frontendni 80-portda ochish: FRONTEND_PORT=80 docker compose up -d.
Eslatma: sirlarda
$belgisini ishlatmang — Docker Compose uni o‘zgaruvchi deb tushunadi.
Talablar: Node.js 20+ (22 tavsiya), PostgreSQL 14+.
# loyiha ildizida
cp .env.example .env # kerak bo‘lsa DB_* qiymatlarini o‘zgartiring
npm install
# bazani yaratish (bir marta)
createdb -U postgres Attendence
npm run dev # http://localhost:3001/api, Swagger: /api-docsDB_MIGRATIONS_RUN=true bo‘lsa migratsiyalar ilova ishga tushganda o‘zi bajariladi.
Qo‘lda boshqarish uchun:
npm run migration:run # migratsiyalarni bajarish
npm run migration:revert # oxirgi migratsiyani bekor qilish
npm run migration:generate # entity o‘zgarganda yangi migratsiya yaratishcd frontend
npm install
npm run dev # http://localhost:5173Vite dev server /api so‘rovlarini http://localhost:3001 ga yo‘naltiradi.
Boshqa manzil kerak bo‘lsa frontend/.env faylida VITE_PROXY_TARGET ni o‘zgartiring.
Production build: npm run build → frontend/dist.
npm test # backend unit testlari
npm run build # TypeScript kompilyatsiyasi- Admin tizimga kiradi va Tashkilotlar bo‘limida tashkilot (owner) yaratadi.
- Owner o‘z login-paroli bilan kiradi, Xodimlar bo‘limida xodimlarni qo‘shadi (yoki admin qo‘shadi).
- Xodim ishga kelganda telefonidan kiradi va “Ishga keldim” tugmasini bosadi — ekranda QR kod chiqadi (standart: 5 daqiqa amal qiladi).
- Owner QR skaner sahifasida kodni skanerlaydi — kelish vaqti qayd etiladi. Xodim ekranidagi QR avtomatik yopiladi va holat “Ishda”ga o‘zgaradi.
- Ish tugagach xodim “Ishdan ketyapman” QR kodini ko‘rsatadi — ketish vaqti va ishlangan soat hisoblanadi.
- Kelmagan xodimlarni owner Bugungi davomat sahifasida sababli / sababsiz / ta’tilda deb belgilaydi. Hisobotlar Davomat tarixi bo‘limida, CSV eksport bilan.
Brauzerlar kameraga faqat xavfsiz kontekstda ruxsat beradi: https://... yoki
http://localhost. Tizim lokal tarmoqda IP orqali (http://192.168.x.x:8080) ochilsa,
kamera ishlamaydi — bunday holda Rasm yoki Matn rejimidan foydalaning yoki
serverni HTTPS (masalan, Nginx + Let’s Encrypt, Caddy) orqali ishga tushiring.
.
├── config/ # Swagger, ENV, QR dekoder
├── src/
│ ├── auth/ # login, refresh, profil, guardlar
│ ├── User/ # admin va owner uchun foydalanuvchi boshqaruvi
│ ├── Attendance/
│ │ ├── Owner/ # skanerlash, bugungi holat, statistika, eksport
│ │ └── User/ # QR yaratish, shaxsiy statistika
│ ├── QR/ # QR rasm generatsiyasi
│ ├── common/ # dekoratorlar, yordamchi funksiyalar
│ └── migrations/ # TypeORM migratsiyalari (admin seed bilan)
├── types/ # umumiy enum va tiplar
├── frontend/ # Vue 3 ilova
│ ├── src/views/admin # admin sahifalari
│ ├── src/views/owner # owner sahifalari
│ ├── src/views/user # xodim sahifalari
│ ├── Dockerfile
│ └── nginx.conf
├── docs/API.md # API qisqacha qo‘llanma
├── Dockerfile # backend image
└── docker-compose.yml
API endpointlari ro‘yxati: docs/API.md yoki Swagger (/api-docs).
| Muammo | Yechim |
|---|---|
port is already allocated |
Portni o‘zgartiring: FRONTEND_PORT=8081 BACKEND_PORT=3002 docker compose up -d |
Backend unhealthy |
docker compose logs backend — odatda baza ulanishi yoki .env xatosi |
| Kamera ochilmaydi | localhost yoki HTTPS orqali oching; brauzerda kamera ruxsatini tekshiring |
| “QR kod yaroqsiz yoki muddati o‘tgan” | Xodim QR kodni yangilashi kerak (QR_CODE_TTL ni oshirish mumkin) |
| Vaqtlar noto‘g‘ri | TZ (standart Asia/Tashkent) backend va bazada bir xil bo‘lishi kerak |
| Bazani noldan boshlash | docker compose down -v && docker compose up -d --build |