Bu loyiha, siz kurs davomida qilgan oldingi barcha loyihalardan farq qiladi. Asosiy farqi shundaki, bu nisbatan katta, ishlaydigan loyiha.
Buni noldan yozish kerak emas, balki kodga o'zgartirishlar kiritish, hech narsani sindirmaslik, hali yozilmagan funksionalni qo'shish, infratuzilmani sozlash kerak. Aynan shunga o'xshash vazifalar bilan ishlashda siz asosan duch kelasiz.
Bu dasturchining butun ishining yarmi - bu boshqa odamlarning kodini o'qish va tahlil qilishdir.
Ishda siz vaqtingizning 3 narsasiga sarflaysiz:
- Boshqa odamlarning kodini tahlil qilish va o'qish - vaqtning 50%.
- Vazifangizni kod yechimi sifatida qanday tasvirlashni tasavvur qilish - vaqtning 25%.
- Kodingizni loyihaning mavjud logikasiga qo'shish - vaqtning 25%.
Yangi loyiha bilan tanishishni boshlaganimda, men quyidagi ketma-ketlikni izlashga harakat qilaman:
- Loyiha qanday muammoni hal qilayotganini (yoki kelajakda hal qiladigan) bilib oling.
- Men loyihaning qanday bog'liqliklarga ega ekanligini ko'rib chiqaman.
- Ma'lumot bazasining (DB) tuzilishini ko'rib chiqaman.
- Entity tuzilishini ko'rib chiqaman.
- API va/yoki boshqa kontrollerlarni ko'rib chiqaman.
- Har bir xizmatning vazifasini tushunaman.
Faqat ushbu ro'yxat bilan tanishgandan so'ng, "aslida men nima qilishim kerak", deb qarash mumkin. Shu reja bilan harakat qilamiz.
Asosiy vazifa
Loyihaning nomi - JiraRush.
O'ylaymanki, bu nomdan Jira yoki Trello kabi qandaydir vazifa taxtasi ekanligini taxmin qilish mumkin. Loyiha har qanday faoliyatni kuzatish uchun zarurdir. Bu loyiha yoki er-xotin orasidagi sotib olishlar ro'yxati kabi bo'lishi mumkin. Loyihani klon qiling va unda nima borligini ko'rib chiqamiz.
Agar Jira bilan tanish bo'lmasangiz, mana qisqacha tanishtiruvchi video
Texnologiyalar
- Spring Boot
- Spring JPA
- Hibernate
- PostgreSQL
- Liquibase (DB versiyalarini boshqarish tizimi, asosan uning tuzilishi)
- Spring Security
- Spring MVC
- Thymeleaf
- jQuery
- Swagger (API hujjatlash)
- Caffeine (kesh)
- Lombok
- Mapstruct (entity & DTO o'rtasida konversiya qilish uchun mapperlar)
- Spring Test
- JUnit
- Docker [1], [2]
DB tuzilishi
Dastur qanday ishga tushiriladi:
- Loyihani mashinangizga klonlang.
- DB serverini (PostgreSQL) lokal ravishda ishga tushiring. Docker orqali qilishni tavsiya qilaman.
- Dastur build qilish:
mvn clean install - Spring Boot dasturni (JiraRushApplication)
prodprofili bilan ishga tushiring
Biz DB bilan 2 konteyner qilamiz. Birinchi dastur ishga tushirish uchun (prod profil), ikkinchisi build va testlar uchun (test profil). Muvofiq buyruqlar:
docker run -p 5432:5432 --name postgres-db -e POSTGRES_USER=jira -e POSTGRES_PASSWORD=JiraRush -e POSTGRES_DB=jira -e PGDATA=/var/lib/postgresql/data/pgdata -v ./pgdata:/var/lib/postgresql/data -d postgres
docker run -p 5433:5432 --name postgres-db-test -e POSTGRES_USER=jira -e POSTGRES_PASSWORD=JiraRush -e POSTGRES_DB=jira-test -e PGDATA=/var/lib/postgresql/data/pgdata -v ./pgdata-test:/var/lib/postgresql/data -d postgres
Dastur build paytida test DB populyatsiya bo'ladi. Dastur ishga tushirilganda DB ish uchun populyatsiya qilinadi. Agar aniqroq aytganda - struktur va lug'atlar o'rnatiladi. Dastur qanday ishlashini "ko'rish" uchun resources/data4dev dan data.sql skriptini bajarish kerak.
Endi DB tuzilishini ko'rishimiz mumkin:
activity – foydalanuvchilarning boshqa entitylarga nisbatan harakatlarini saqlaydigan faoliyatlar jadvallari. Masalan, "foydalanuvchi izoh yozdi", "foydalanuvchi vazifa holatini o'zgartirdi" ...
attachment – qo’shilgan fayllar haqidagi ma'lumotlarni saqlash uchun jadval.
contact – "foydalanuvchi – aloqa turi – aloqa qiymati" lug'ati.
mail_case – agar xatni (emailni) yuborish muvaffaqiyatsiz bo'lsa, ma’lumotlarni saqlash uchun jadval.
profile – foydalanuvchi profili. Sozlamalar mail_notifications maydonida bit bayroqlar ko'rinishida saqlanadi.
project – loyihalar. Vazifa taxtasining eng katta logik birligidir. Masalan, kompaniyada mikroservislar bo'lsa, har bir mikroservis bir jamoa tomonidan boshqariladi, shunda bunday mikroservis uchun loyiha tuziladi.
reference – turli entitylar jadvali. ref_type Enum com.javarush.jira.ref.RefType ga mos keladi. aux kolonkasi – bit bayroqlarni hisoblash uchun qiymat.
task – vazifalar. JiraRush vazifa taxtasining eng asosiy logik tuzilmalari.
task_tag – "vazifa– teg" aloqalari lug'ati. Bir vazifada nol yoki undan ko'p tеglar bo'lishi mumkin.
user_belong – foydalanuvchining "vazifa", "sprint", "loyiha" turidagi entitylar bilan aloqasi.
user_role – "foydalanuvchi – rol" aloqalari lug'ati. Bir foydalanuvchida bir nechta rollar bo'lishi mumkin.
users ro'yxatga olingan foydalanuvchilar ro'yxati. endpoint va startpoint kolonkalari ushbu foydalanuvchi faol yoki bo'lganiga javob beradi. password maydonida parolning boshida "{"..."}" ko'rinishida shifrlash usuli (Spring Security, eslaysanmi?) saqlanadi.
Entity tuzilishi
Bu element sizning mustaqil tanishingiz uchun qoldiriladi
API va/yoki boshqa kontrollerlarni ko'rish
Loyihaga API hujjatlash uchun javob beradigan Swagger ulangan. Shu narsani ko'rish uchun – dasturni ishga tushirganda http://localhost:8080/swagger-ui/index.html ga kiring
Bu erda qanday kontrollerlar mavjudligini, bu kontrollerlarning qanday metodlari borligini, kiritishga kutilayotgan ma'lumotlarni, metod turlarini va hokazolarni ko'rish mumkin. Shuningdek, o'zingiz so'rovni yuborishingiz mumkin. Turli foydalanuvchilardan kirib ko'rish ham foydadan holi emas (test ma'lumotlar UI-da yozilgan) va qaysi metodni bajarish uchun qanday huquqlar kerakligini ko'rish.
Qaysi xizmat nima uchun javobgar
Ushbu element bilan sizga mustaqil tanishishingizga to'g'ri keladi. O'rniga, allaqachon amalga oshirilgan funksiyani ko'rib chiqamiz. Ko'rishni ADMIN roliga ega foydalanuvchidan boshlaymiz, chunki u eng keng ko'lamli vakolatlarga ega. Lekin siz MANAGER va DEV dan ham ko'rib chiqishingiz kerak bo'ladi.
- Loyihalar daraxti. Loyihalar roʻyxati mavjud. Admin yoki Menedjer (rolni Role dan qidiring) yangi loyihalar va loyihalar qo'shishi mumkin. Loyihada backlog (vazifalar ro'yxati, bajaring) va sprintlar mavjud. Shuningdek, loyihada loyihalar mavjud bo'lishi mumkin. Vazifa sprintga bevosita yoki epik (katta guruh vazifalar) orqali tegishli bo'lishi mumkin. http://localhost:8080/view/tree ni ko'ring
- Vazifa taxtasi (dashboard). Qaysi loyiha bo'yicha dashbordni ko'rishni tanlash mumkin. Loyiha bo'yicha aktiv (yoki oxirgi) sprint ko'rsatiladi. Sprintdan olingan vazifalar ustunlar bo'yicha taqsimlangan. Diqqat qilish kerak bo'lganlar rang bilan ajratilgan. Vazifalar holatlarini o'zgartirish o'ng tugma bosish orqali amalga oshiriladi. http://localhost:8080/ui/dashboard ni ko'ring
- Sprint bo'yicha hisobot: bajarilgan sprintlar bo'yicha minimal statistikalar to'plami loyihani va sprintni tanlash imkoniyati bilan. http://localhost:8080/ui/reports ni ko'ring
- Foydalanuvchilar ro'yxati. Barcha ro'yxatga olingan foydalanuvchilar ro'yxati qidirish, tartiblash, qo'shish, tahrirlash va o'chirish imkoniyati bilan. http://localhost:8080/view/admin/users sahifasini ko'ring
- Havolalar - JiraRush sozlash funksiyasi (qanday maydonlar qaysi turdagi entitylarga mavjud. Masalan, foydalanuvchi kontaktida qaysi ijtimoiy tarmoqlar ko'rsatilishini yoki vazifaning qaysi ustuvorliklari borligini). http://localhost:8080/ui/admin/references ni ko'ring
- Foydalanuvchi profilini tahrirlash (oʻz profilini).
- Email + password orqali yangi foydalanuvchini ro'yxatdan o'tkazish.
- Ijtimoiy tarmoqlar orqali foydalanuvchini ro'yxatga olish (Google, GitLab, GitHub).
- Parolni tiklashda xat yuborish.
- Email tasdiqlash uchun xat yuborish.
- Backlog'da yangi vazifalar yaratish (fayllarni qo'shimcha sifatida qo'shish imkoniyati bilan).
Loyiha haqida og'zaki ma'lumotlar
Loyiha strukturasi Spring Modulith loyihasiga o'xshatilib yaratilgan. Ya'ni, internal paketlar mavjud bo'lib, ularga yuqori darajadagi paketdan tashqaridan kod murojaat qila olmaydi.
Bu kelajakda serverni mikroservislarga osongina bo'lish imkonini berishi uchun qilingan. Hech bo'lmasa, arxitektorning fikri shunday edi va amalga oshirish boshqa bo'lishi mumkin (ha, real loyihalarda bu deyarli har doim shunday bo'ladi).
Frontend uchun statik fayllar nginx serveri orqali beriladi. Hech bo'lmasa, "production"da shunday bo'lishi kerak edi, lekin lokal ishlaganda barchasi oddiyroq.
PostgreSQL. Siz native so'rovlarni yozmaysiz. Querylar JPQL'da yozilishi kerak bo'ladi. Siz uchun yangi bo'lgan faqat PostgreSQL'ga ulanishni qo'shish bo'ladi, ma'lumotlar bazasi tuzilishini va ularning ma'lumotlarini ko'rish uchun. database IDEA tabidan foydalanishni tavsiya qilaman.
Liquibase — bu ma'lumotlar bazasi sxemasining o'zgarishlarini kuzatish, boshqarish va qo'llash uchun open source mustaqil kutubxonadir. Loyihada u ma'lumotlar bazasini ishga tushirish skriptini avtomatik bajarish va uni test ma'lumotlari bilan to'ldirish uchun foydalaniladi. Agar siz jadval tuzilishini o'zgartirsangiz, Liquibase ning ikkita xizmat jadvalini (databasechangelog va databasechangeloglock) o'chirishingiz kerak. Keyin dastur ishga tushirilganida Liquibase ma'lumotlar bazasini ishga tushirish skriptini qayta bajaradi. Sizga hech qanday sozlamalarni qilishingiz shart emas, hammasi qutidan tashqarida ishlaydi.
Swagger — UI orqali ilova kontrollerlaridagi qaysi metodlar mavjudligini ko'rish va ularga test so'rovlarini yuborish imkonini beradi. Swagger bilan hech qanday vazifalar bo'lmaydi. U loyihada qulay ishlash uchun qo'shilgan.
Caffeine cache — bu Java uchun yuqori samarali kesh kutubxonasidir. Uni qanday ulanishini ko'rib chiqishni tavsiya qilaman. Uni ishlatish uchun hech qanday vazifalar bo'lmaydi.
Yuzaga keladigan vazifalar
Oson vazifalarni boshlab, keyin boshqasiga o'ting. Imkon qadar ko'proq vazifalarni bajarishga harakat qiling.
- Loyiha strukturasini tushunish (onboarding).
- Ijtimoiy tarmoqlarni o'chirish: vk, yandex. Easy task
- Yashirin ma'lumotlarni alohida property faylga ajratish:
- login
- DB paroli
- OAuth roʻyxatdan oʻtish/avtorizatsiya identifikatorlari
- pochta sozlamalari
- Testlar qayta ishlanishi kerak, shunda testlar vaqtida in memory БД (H2) ishlatiladi, PostgreSQL emas. Buning uchun ikki bean belgilash kerak, va qaysi birini ishlatish tanlovi Spring'ning faol profiliga qarab aniqlanadi. H2 PostgreSQL'da mavjud bo'lgan barcha funksiyalarni qo'llab-quvvatlamaydi, shuning uchun test ma'lumotlari bilan skriptlar biroz osonlashishi kerak bo'ladi.
ProfileRestControllerkontrolleridagi barcha jamoat metodlar uchun testlar yozing. Garchi metodlar faqat 2 ta bo'lsa-da, test metodlari ko'proq bo'lishi kerak, chunki muvaffaqiyatli va muvaffaqiyatsiz yo'llarni tekshirish kerak.com.javarush.jira.bugtracking.attachment.FileUtil#uploadmetodini fayl tizimi bilan ishlash uchun zamonaviy yondashuvni qo'llash uchun refaktoring qiling. Easy task- Yangi funksiyonal qo'shing: vazifaga teglarni qo'shish (REST API + serviste ijro etish). Frontni qilish shart emas.
task_tagjadvali allaqachon yaratildi. - Vazifa ustida qancha vaqt sarflanganini va u testlanayotganini hisoblash. Servis darajasida ikkita metod yozing, ular parametr sifatida vazifani qabul qiladi va sarflangan vaqtni qaytaradi:
- Vazifa ustida qancha vaqt sarflangan (ready_for_review minus in_progress ).
- Vazifa testda qancha vaqt bo'lgan (done minus ready_for_review).
changelog.sqlma'lumotlar bazasi ishga tushirish skriptining oxiriga 3 yozuvniACTIVITYjadvaliga qo'shing
Quyidagi statuslar bilan:insert into ACTIVITY ( ID, AUTHOR_ID, TASK_ID, UPDATED, STATUS_CODE ) values ...- vazifa ustida ishlashni boshlash vaqti – in_progress
- dasturlashni yakunlash vaqti - ready_for_review
- testni tugatish vaqti - done
- Asosiy server uchun
Dockerfileyozing - Server konteynerini DB va nginx bilan birgalikda ishga tushirish uchun
docker-composefaylini yozing. Nginx uchunconfig/nginx.confkonfiguratsiya faylidan foydalaning. Kerak bo'lsa, konfiguratsiya faylini tahrirlash mumkin. Hard task - Kamida ikki tilda lokalizatsiya qo'shing, xatlar shablonlari (mails) va
index.htmlbosh sahifasi uchun. - Frontal va backend o'rtasidagi "do'st-dushman" mexanizmini
JSESSIONIDdanJWTga o'zgartiring. Qiyinchiliklar - siz formalarni yuborishni qayta yozishingiz kerak bo'ladi, shunda autentifikatsiya sarlavhasi qo'shiladi. Extra-hard task
Loyihani topshirishda README.md da qaysi vazifa punktlari bajarganingizni yozing.
GO TO FULL VERSION