Spring Boot 2.0 - Loyihaning tuzilishi va eng yaxshi amaliyotlar (2-qism)

Spring Boot v2.0-dagi birinchi qismning davomiga kelsak, bu ikkinchi va yakuniy qism bo'lib, unda biz dastur loyihasi tuzilishini ko'rib chiqamiz va ba'zi bir muhim parchalar va eng yaxshi amaliyotlar bilan birgalikda bahorga asoslangan dasturni ishlab chiqishda ko'rib chiqilishi kerak. .

Faqat kichik bir javobgarlik, ushbu boshlang'ich to'plamni o'rnatganingizdan va sinchkovlik bilan o'rganib chiqqandan so'ng, siz bu aslida Spring Boot-dan foydalangan holda mikro xizmatni amalga oshirish emas deb o'ylashingiz mumkin, aytishim kerak, men siz bilan to'liq rozi emasman, aksincha bu monolit Spring Boot-da rivojlangan. Ushbu maqola Spring Boot-ning eng yaxshi amaliyotlari bilan kodlashni o'rganish haqida ko'proq ma'lumotga ega va zaxiralash tizimi shunchaki bitta xizmat yoki kod bazasidan iborat bo'lishi kerak, men yaqinda Spring Boot-ning taqsimlangan dastur yaratishda foydalanishi haqida yangi seriyani nashr etishni va'da qilaman. Netflix OSS stack yordamida. Iltimos, bunga boshlang'ich nuqta sifatida qarang va loyiha tuzilishini va tegishli vositalarni moslang.

Manba kodi

Ushbu boshlang'ich to'plamning dastlabki kodini quyidagi GitHub omboridan klonlashtirish mumkin:

Qo'llash tarkibi

Spring Boot - bu hayotimizni juda osonlashtiradigan mulohaza qilingan ramka, chunki Spring Boot-ning barcha g'amxo'rlik qiladigan versiyasi asosida turli xil qaramlik versiyalarini tanlashimiz shart emas.

Men loyiha tuzilishini yaratishda xuddi shu mafkuraga amal qilishga harakat qildim, avvaliga bu juda katta tuyulishi mumkin, lekin ishoning, o'zingizning asaringizni yozishni boshlaganingizdan so'ng, sizga vaqtingizni tejash va allaqachon berilgan savollarni o'ylab, juda katta yordam beradi. . Tuzilma quyidagicha ko'rinadi:

Modellar va DTOlar

Ilovaning turli xil modellari namunaviy paket ostida tashkil etilgan, ularning DTOlari (ma'lumotlar uzatish ob'ektlari) dto to'plami ostida mavjud. Biz DTO-larni ishlatishimiz kerakmi yoki yo'qmi, degan fikrda turli xil fikrlar mavjud, men DTO-larni ishlatmasligimiz kerak deb o'ylaydigan fikrlar guruhiga mansubman, sizning D qatlamingizni UI qatlami bilan juda zich bog'laydi va bu hech bir korxona loyihasi hech qachon qilmasligi kerak bo'lgan narsa. ichiga olish.

DTOlar bizga bir nechta sub-ob'ektlardan foydalangan holda to'plangan va ma'lumotlar bazasida saqlanib qolgan model modelini emas, balki foydalanuvchi interfeysi bilan bo'lishishimiz kerak bo'lgan ma'lumotlarni uzatishga imkon beradi. DTO-larda modellarning xaritalashini ModelMapper yordam dasturi yordamida amalga oshirish mumkin, ammo bu sizning DTO tegishli modellarga deyarli (so'zma-so'z) o'xshash bo'lgan holatlardagina foydalidir, ammo bu har doim ham shunday emas, shuning uchun men maxsus xaritalash sinflaridan foydalanishni ma'qul ko'raman. Siz ba'zi misollarni "dto / mapper" to'plamidan topishingiz mumkin.

Masalan, Trip.java modelimiz qanday tashkil qilinganligini ko'rib chiqaylik:

Trip.java

Ko'rib turganimizdek, modelda Stop, Bus va Agency to'plamlariga havolalar mavjud. Bu Trip bilan ushbu turli xil kollektsiyalar o'rtasidagi aloqani saqlab qolish uchun talab qilinadi. Bu MySQL-da tashqi kalit tushunchasi bilan bir xil emas va bu erda qo'llaniladigan standart kaskad mavjud emas, ammo bu bizga MongoDB-da ham xuddi shunday taqlid qilish uchun yo'l beradi. Tegishli ma'lumotlar uzatish ob'ekti quyidagicha ko'rinadi:

TripDto.java

Men ilgari aytib o'tganimdek, DTOlar model hamkasblarining ko'zgudagi tasviri bo'lishi kerak emas, aksincha ular foydalanuvchi interfeysi yoki api-reaktsiyalar talablarining aksi bo'lishi kerak. Bu holda, safar va uning avtobus yoki agentligi yoki to'xtash joylari o'rtasida kompozitsion aloqani o'rnatishning ma'nosi yo'q edi, aksincha ularning asosiy kalitlari hiyla ishlatishi mumkin. Bu nafaqat ushbu DTO-larni ajratibgina qolmay, balki HTTP orqali serverdan mijozga o'tadigan javob paketining umumiy hajmini kamaytiradi.

Keyingi savol bu POJO modelini ushbu DTOga qanday o'zgartirish mumkinligi bo'lishi mumkin, lekin buni amalga oshirishning bir nechta usullari mavjud, ammo mening xohishim aniq va DIY quyidagicha bo'lishi kerak:

Xizmatlar va DAO

Ma'lumotlarga kirish ob'ektlari (DAO) omborxonada mavjud. Ularning barchasi MongoRepository interfeysining kengaytmalari bo'lib, xizmat ko'rsatish qatlamiga MongoDB-dan ma'lumotlarni saqlashga yordam beradi.

Xizmat ko'rsatish sathi xizmat paketi ostida belgilanadi, hozirgi vaziyatni hisobga olgan holda ikkita asosiy xizmatni yaratish mantiqiy:

  1. UserService va
  2. BusReservationService

Ushbu xizmatlarda har bir usulni tushuntirish ushbu blogning doirasiga kirmaydi, ammo men ushbu xizmatlar tomonidan qo'llab-quvvatlanadigan operatsiyalarni ko'rsatadigan interfeyslarni sanab o'taman.

UserService.java

BusReservationService.java

Konventsiyalarni nomlash usuliga e'tibor berishdan tashqari, aminmanki, siz xizmat ko'rsatish sathi hech qachon model sifatida kirishni qabul qilmaydi va uni hech qachon qaytarib bermaydi. Bu bahor ishlab chiquvchilari qatlamli arxitekturada amal qilishlari kerak bo'lgan yana bir eng yaxshi amaliyotdir. Nazoratchi sathi xizmat yoki uning api qatlamidan so'rov olganda, ishni bajarish uchun xizmat sathi bilan o'zaro ishlaydi, bunda u model ob'ektlariga kirish huquqiga ega bo'lmasligi kerak va har doim neytral DTOlar nuqtai nazaridan gaplashishi kerak.

Agar xizmat DTO ob'ektini olganda, u ma'lumot bazasidan tegishli model ob'ektini so'rab, mantiqiy ma'noga ega bo'lishga harakat qilishi kerak, so'ngra zarur operatsiyani bajarishi va qo'ng'iroq xizmatiga qaytarilishi uchun DTO javobini yaratishi kerak. Ushbu yondashuv sizga boshqasini buzishi mumkinligi haqida tashvishlanmasdan, ko'rinishni va modellarni mustaqil ravishda o'zgartirishga imkon beradi.

Yuqorida aytib o'tilgan yondashuvni tasvirlash uchun foydalanuvchining ma'lumotlarini yangilash uchun ishlatiladigan "updateProfile" xizmatini misolini olaylik. Usulning ta'rifi quyidagicha ko'rinadi:

Xavfsizlik

Xavfsizlik sozlamalari konfiguratsiya paketida mavjud va haqiqiy konfiguratsiyalar xavfsizlik paketida mavjud sinf ostida amalga oshiriladi. Ilova ma'mur portali va REST API uchun turli xil xavfsizlik kontseptsiyalariga ega, men portal uchun sessiya IDsi va cookie fayllariga asoslangan standart bahor sessiyasi mexanizmini qo'lladim. REST API uchun men JWT tokeniga asoslangan autentifikatsiya mexanizmidan foydalanganman.

Veb va apislar uchun xavfsizlik ikkala klassda ham sozlangan MultiHttpSecurityConfig.java. U WebSecurityConfigurerAdapter-dan ikkita statik sinfga ega bo'lib, bizga kirish so'rovlari uchun http xavfsizligini sozlash imkonini beradi.

@Order izohi so'rovlarni belgilangan tartibda turli xil konfiguratsiyalar orqali ko'rib chiqishga imkon beradi. Shunday qilib, API so'rovi ApiWebSecurityConfigurationAdapter orqali o'tadi va u erda so'riladi, ammo administrator so'rovi avvaliga o'tadi, lekin u Bahor Xavfsizlik mezonlariga mos kelmagani uchun uni keyingi yuqori darajadagi buyurtma bilan keyingi konfiguratsiyaga o'tishga harakat qiladi. bu FormLoginWebSecurityConfigurerAdapter.

API so'rovlari kirish paytida chiqarilgan JWT tokenini yaratish va tasdiqlash uchun javobgar bo'lgan ApiJWTAuthenticationFilter va ApiJWTA AuthorizationFilter orqali o'tishi kerak. Agar siz API haqiqiyligini tekshirish (login) uchun qaysi URL-dan foydalanish kerakligini bilmoqchi bo'lsangiz, u erda:

http: // localhost: 8080 / api / tasdiq

Agar siz qanday qilib bu qanday tuzilganligi haqida savol tug'ilsa, javob ApiJWTAuthenticationFilter sinfida bo'ladi, uning konstruktori quyidagi ma'lumotlarni kodlaydi:

this.setRequiresAuthenticationRequestMatcher (yangi AntPathRequestMatcher ("/ api / auth", "POST"));

Bu AbstractAuthenticationProcessingFilter-ga API so'rovlari uchun "/ api / auth" yo'li bilan AuthenticationRequestMatcher-ni biriktirishni aytadi.

Administrator ilovasi faqat "ADMIN" vazifasini bajaradigan foydalanuvchilar uchun ruxsat beriladi. Barcha parollar BCryptPasswordEncoder yordamida shifrlangan va biz ma'lumotlar bazasida saqlanganidan keyin ularning asl qiymatini hech qachon ko'ra olmaymiz.

Nazoratchilar

Va nihoyat, lekin eng muhim qism - bu nazorat qiluvchi qatlam. U so'rovni qabul qilishdan boshlab javobni tayyorlash va qaytarib berishgacha hamma narsani birlashtiradi. Kontroller qatlami kontrolör paketida mavjud, eng yaxshi tajribalar shuni ko'rsatadiki, biz ushbu qavatni dasturning bir nechta versiyasini qo'llab-quvvatlash uchun versiyasini saqlab qolishimiz kerak va xuddi shu amaliyot shu erda qo'llaniladi.

Hozirda kod faqat v1 ostida taqdim etiladi, ammo vaqt o'tishi bilan men turli xil xususiyatlarga ega bo'lgan turli xil versiyalarga ega bo'lishni kutaman. Ui paketida ma'mur portaliga tegishli kontrollerlar mavjud va uning buyruqlar ob'ektlari buyruqlar paketida joylashgan. REST API boshqaruvchilari api paketi ostida va tegishli so'rov sinflari so'rov to'plami ostida joylashgan.

Administrator panelidagi kontrollerlar bahor WebMVC kontseptsiyasi ustida ishlaydi. Ular kelib tushgan veb-so'rovlarga Bahorning ModelAndView ob'yektlari bilan javob beradi, ularda tegishli ko'rinishlar / shakllar va namoyish etiladigan ko'rinish nomi ko'rsatilishi kerak bo'lgan ma'lumotlar mavjud, DashboardController sinfidagi misol quyidagicha:

So'rov va shakl buyruqlari

Shunga qaramay, ishlab chiqaruvchilar hamjamiyatida kiruvchi so'rovlarni va DTO-larni to'g'ridan-to'g'ri modellardan foydalangan holda xaritalarni tuzish uchun alohida sinflardan foydalanish to'g'risida turli xil fikrlar mavjud, men shaxsan UI va bo'shashgan aloqalarni targ'ib qilish uchun ularni imkon qadar ajratib qo'yishni yaxshi ko'raman. boshqaruvchi qatlam.

So'rov ob'ektlari va forma buyruqlari kiruvchi so'rovlar bo'yicha DTOga aylantirilishidan oldin, qo'shimcha ma'lumotni xizmat ko'rsatish sathiga doimiy va ma'lumot olish uchun uzatadigan qo'shimcha tasdiqlash darajasini qo'llashga imkon beradi. Biz bu erda DTO-lardan foydalanishimiz mumkin va ba'zi ishlab chiquvchilar ushbu yondashuvni afzal ko'rishadi, chunki bu ba'zi bir qo'shimcha sinflarni kamaytiradi, ammo men odatda tekshirish mantig'ini uzatish ob'ektlaridan ajratib turishni afzal ko'raman va shuning uchun oldinroq so'rov / buyruq ob'ektlarini ishlatishga moyilman.

BusFormCommand sinfiga asoslangan buyruq namunasi quyidagicha ko'rinadi:

Va API orqali yuborilgan so'rovning misoli, BookTicketRequest quyidagicha:

Statik manbalar manbalar katalogida guruhlangan. UI-ning barcha ob'ektlari va ularning uslub jihatlari bu erda joylashgan.

Lombok

Java-ga qarshi eng katta shikoyatlardan biri bitta sinfda qancha shovqin bo'lishi mumkinligi. Lombok loyihasi buni muammo deb bildi va eng yomon huquqbuzarlarning shovqinini oddiy izohlar to'plami bilan almashtirish orqali kamaytirishni maqsad qildi. Siz Lombok-ni ushbu boshlang'ich to'plamda hamma joyda ishlayotganini topasiz, u aslida kod satrlarini qisqartirishga, ko'p vaqtni sarflashga va kuch sarflashga yordam beradi va kodni o'qilishini osonlashtiradi. Men foydalanishni afzal ko'rgan ba'zi muhim izohlar:

@ Getter / @ Setter

Hech qachon public int getFoo () {return foo;} ni qayta yozmang.

@ ToString

O'z maydonlaringizni ko'rish uchun tuzatuvchini ishga tushirishning hojati yo'q: lombok siz uchun toString yaratishiga ruxsat bering!

@EqualsAndHashCode

Tenglik osonlashtirildi: hashCode-ni yaratadi va ob'ektingiz maydonlaridan bajariladigan amallarni tenglashtiradi ..

@ Ma'lumotlar

Hammasi birgalikda: @ ToString, @EqualsAndHashCode, barcha maydonlarda @ Getter va barcha tugallanmagan maydonlarda @ Setter uchun yorliq va

@RequiredArgsConstructor!

Aslida, og'zaki kabi bir narsa:

Shunchaki yozilishi mumkin:

Farqni juda yaxshi ko'rishingiz mumkin, nafaqat keyingisi yanada toza ko'rinishga ega, biz 59 ta zerikarli POJO satridan 8 satrga asoslangan java sinf fayliga tushdik.

API javob va istisnolar bilan ishlash

Men RuntimeExceptions bilan ozgina tajriba o'tkazishga harakat qildim va bir nechta sinflar va xususiyatlar faylidan foydalanib, dasturning barcha istisnolarini qayta ishlash uchun mini ramka yaratdim. Agar siz istisno paketini diqqat bilan kuzatsangiz, u ikkita enumsdan iborat:

  1. EntityType va
  2. Istisno turi

EntityType enum tizimida biz qat'iyatlilik uchun foydalanadigan va ish vaqti istisnosiga olib keladigan ob'ektlarning barcha nomlarini o'z ichiga oladi. ExpressionType enum turli xil darajadagi istisnolardan iboratdir, masalan, EntityNotFound va DuplicateEntity istisnolari.

BRSException klassi ikkita statik sinfga ega EntityNotFoundException va DuplicateEntityException, bu xizmat sathidan eng ko'p tashlanadigan ikkita istisno. U shuningdek ,EndexType, ExpressionType va argumentlarni custom.properties faylida shablonlari mavjud bo'lgan formatlangan xabarni olish uchun tortib oladigan ortiqchaEException usullari to'plamini o'z ichiga oladi.

Ushbu klassdan foydalanib, men xizmatlarning butun sathiga turli xil subyekt istisnolarini yagona asosda, kodlar bazasini NOT_FOUND va DUPLICATE ob'ektlar istisnolarining barcha turlari bilan aralashtirib yubormaslik imkoniyatini berdim.

Masalan, tizimga kirishda siz ro'yxatdan o'tmagan elektron pochta manzilidan foydalanmoqchi bo'lsangiz, istisno tariqasida quyidagi yagona bitta satr chizig'i yordamida ko'tariladi va tashlanadi -

otish istisnolari (USER, ENTITY_NOT_FOUND, userDto.getEmail ());

Natijada, ushbu ikki elementlarning nomlarini birlashtiramiz: USER ("foydalanuvchi") va ENTITY_NOT_FOUND ("not.found") va custom.properties fayllarida mavjud user.not.found kaliti quyidagicha bo'ladi:

user.not.found = So'ralgan elektron pochta manzili - {0} mavjud emas.

{0} parametrni shunchaki tashlangan istisnolarga qo'shilgan elektron pochta manziliga almashtirish orqali siz foydalanuvchiga ko'rsatilishi yoki REST API chaqiruviga javob sifatida yaxshi formatlangan xabarni olishingiz mumkin. BRSException sinfining ta'rifi quyidagicha:

Ushbu mini ramkaning yana bir muhim qismi bu CustomizedResponseEntityExceptionHandler sinfidir va quyidagicha ko'rinadi:

Ushbu sinf API so'rovlariga javob yuborishdan oldin ushbu RuntimeExceptions-ga g'amxo'rlik qiladi. Xizmat ko'rsatish sathining chaqirilishi EntityNotFoundException yoki DuplicateEntityException natijasida yuzaga kelganmi yoki yo'qligini tekshiradigan va qo'ng'iroq qiluvchiga tegishli javobni yuboradigan boshqaruvchi maslahati.

Nihoyat, API javoblari dto / javob to'plamida mavjud Response sinfidan foydalanib, hamma bir xilda yuboriladi. Bu sinf bizga yagona ob'ektlarni yaratishga imkon beradi, natijada quyida ko'rsatilgandek javob keladi (bu "api / v1 / rezervasyon / to'xtatish" api uchun javob):

{
 "Holat": "OK",
 "Yuk": [
   {
    "Kod": "STPA",
    "Ism": "A Stop",
    "Batafsil": "tepaliklar yaqinida"
   },
   {
    "Kod": "STPB",
    "Ism": "B to'xtating",
    "Tafsilot": "Daryo yaqinida"
   }
 ]
}

Istisno bo'lsa (masalan, biron-bir avtobus bilan bog'lanmagan ikkita bekatlar orasidagi sayohatni qidirishda) quyidagi javoblar qaytariladi ("api / v1 / rezervasyon / tripsbystops" so'rov natijasi):

{
  "Holat": "NOT_FOUND",
  "Xatolar": "Hozirda" STPD "va" to'xtash joyi "-" STPC "o'rtasida hech qanday qatnov mavjud emas."
}
{
  "Holat": "NOT_FOUND",
  "Xatolar":
  {
    "Vaqt belgisi": "2019–03–13T07: 47: 10.990 + 0000",
    "Xabar": "so'ralgan to'xtash kodi - STPF mavjud emas."
  }
}

Ko'rib turganingizdek, ikkala javob turi ham, biri HTTP-200 bilan, ikkinchisi HTTP-404 bilan, javob yuklamasi uning tuzilishini o'zgartirmaydi va qo'ng'iroq doirasi vaziyat va xato yoki xato borligini bilgan holda javobni ko'r-ko'rona qabul qilishi mumkin. JSON ob'ektidagi yuk ko'tarish maydoni.

API hujjatlari

Sizning ishingizni hujjatlashtirish juda muhimdir (uni ishlab chiqish kabi) va Spring Boot API-laringiz oldingi guruhlar (ichki) yoki tashqi iste'molchilar uchun o'qiladigan shaklda mavjudligiga ishonch hosil qiling. Ushbu boshlang'ich to'plamda ishlatiladigan API hujjatlar uchun vosita - Swagger2, uni quyidagi urlda brauzer ichida ochishingiz mumkin -

http: // localhost: 8080 / swagger-ui.html

U sizga ikkita o'ziga xos tuzilgan foydalanuvchi interfeysini taqdim etadi:

1. Foydalanuvchi
2. BRS

Bearer tokenini yaratish uchun login api-ni bajarish uchun User spec-dan foydalanishingiz mumkin. Belgilangan belgini "Avtorizatsiya" qalqib chiqadigan oynada qo'llash kerak, u standart tarzda barcha himoyalangan mayizchalarga qo'llaniladi (ikkalasini oling va joylashtiring). Shuni yodda tutingki, "Bearer" so'zini avtorizatsiya qilish oynasida ishlatishdan oldin belgini oldida bo'sh joy qoldirishingiz kerak.

Swagger-ning konfiguratsiyasiga BrsConfiguration sinfi e'tibor beradi. Men "swaggerBRSApi" va "swaggerUserApi" usullari yordamida ikkita xususiyatni aniqladim. Kirish qismi odatda Bahor Xavfsizlik xizmati tomonidan parvarish qilinganligi sababli, biz apisni ochib berolmaymiz, chunki qolgan apis tizimda aniqlangan va shu sababli men konfiguratsiya paketida o'z nomim bilan boshqaruvchini aniqlaganman. "FakeControler":

Uning maqsadi apis-ga kirish va chiqish uchun soxta hujjatlarni yaratishni osonlashtirish, u dastur hayoti davomida hech qachon paydo bo'lmaydi, chunki "/ api / auth" api kod bazasida belgilangan xavfsizlik filtrlari bilan ishlov berilmoqda. Bir oz yaxshiroq narsalarni vizualizatsiya qilishga yordam beradigan ba'zi skrinshotlar:

Swagger UI/ api / avtoulovga kirish, iltifot FakeControllerBearer tokenlarini ro'yxatdan o'tkazish uchun dialogga avtorizatsiyaBRS APIRo‘yxatda keltirilgan BRS API

Swagger UI-dan foydalanish va himoyalangan API-larni bajarish uchun avval User spec-dan "/ api / auth" -ni ishlatishingiz va Bearer tokenini yaratishingiz kerak. Token berilgandan so'ng, uni Authorize popup-da ro'yxatdan o'tkazishingiz va so'ngra himoyalangan API-larni bajarish uchun BRS spec-ga o'tishingiz mumkin. Agar siz tokenni ro'yxatdan o'tkazmasangiz, unda HTTP 401 xatosini olishda davom etaverasiz.

Parametrlari bo'lgan tanasi bo'lgan HTTP-GET so'rovlari uchun Swagger-Ui-ni sinab ko'rish paytida siz muammolarga duch kelishingiz mumkin, bu kodning aybi emasligidan xavotirlanmang, chunki GET va DELETE so'rovlari uchun tanaviy paradlarni qo'llab-quvvatlashni to'xtatishga qaror qilgan Swagger. . Muammoni hal qilish uchun siz jingalak so'rovini nusxasini ko'chirib, terminal oynasida bajarishingiz mumkin va u yaxshi ishlashi kerak yoki siz Postman yoki shunga o'xshash vositaga murojaat qilishingiz mumkin, chunki ular hali ham bunday cheklovni qo'llamaydilar. Mening fikrimcha, agar ochiq API talablari GET so'rovlaridagi tanadagi parchalarni cheklamasa, Swagger kabi vositalar ham kerak bo'lmasligi kerak, ammo biz ularni ishlab chiquvchi emas, balki chaqirishi kerak.

UI arxitekturasi

Administrator portalining interfeysi Bootstrap va javob beradigan veb-dastur tushunchasi yordamida material dizayni yordamida yaratilgan. UI server tomoni Thymeleaf shablonlari yordamida taqdim etiladi (bahorda tanlangan shablonlarni ishlab chiqarish vositasi).

Thymeleaf bilan ishlashning standart usuli quyidagilarni o'z ichiga oladi. Bu ko'pincha takrorlanadigan kodga olib keladi, ayniqsa veb-sayt ko'p sahifalarga ega bo'lsa va har bir sahifada bir necha bor qayta ishlatiladigan komponentlar mavjud bo'lsa (masalan, sarlavha, navigatsiya, yon panel va pastki satr). Bu takrorlanadi, chunki har bir tarkib sahifasida bir xil bo'laklarni bir joyda joylashtirish kerak. Bu, shuningdek, sahifa tuzilishi o'zgarganda salbiy ta'sir qiladi, masalan. yon panelni chapdan o'ngga qo'yganda.

Thymeleaf Layout lahjasida ishlatiladigan dekorativ naqsh bu masalalarni hal qiladi. Andoza dvigatellari kontekstida dekorativ naqsh endi tarkib sahifalarida ishlamaydi, lekin bu umumiy shablon fayliga tegishli. Har bir sahifa asosan faqat asosiy tarkibni taqdim etadi va shablon dvigatelidan qaysi asosiy shablon yordamida oxirgi sahifani qurishi mumkinligini tasvirlaydi. Tarkib shablon fayl bilan bezatilmoqda. Ushbu usul parchalarni qo'shishning standart usuliga nisbatan afzalliklarga ega:

  • Sahifaning o'zi faqat tarkibni taqdim qilishi kerak.
  • So'nggi sahifani yaratishda shablon fayli ishlatilayotganda global o'zgarishlarni osongina qo'llash mumkin.
  • Kod qisqaradi va toza bo'ladi.
  • Har bir tarkib sahifasi qaysi shablon faylidan foydalanishni ko'rsatganligi sababli, dasturning turli sohalari uchun (masalan, jamoat va ma'muriy hudud) turli xil shablonlarni ishlatish oson.

Administrator portalining tartibi quyidagicha yaratilgan:

Blog kabi tartib

Ushbu jadvalning alohida sohalari quyidagi maqsadlarga xizmat qiladi:

  • Sarlavha: ushbu parcha statik import uchun (CSS va JavaScript), sarlavha va meta-teglar uchun ishlatiladi.
  • Navigatsiya: o'ng tomonda foydalanuvchi profili bo'lgan navigatsiya paneli.
  • Tarkib: so'ralgan sahifa bilan almashtiriladigan tarkib to'ldiruvchisi.
  • Yon panel: qo'shimcha ma'lumot uchun yon panel.
  • Footer: mualliflik huquqi haqidagi ma'lumotni ta'minlaydigan pastki qism.

Ushbu tarkibiy qismlar manbalarda / shablonlar katalogida, shuningdek pastki kataloglarning bo'laklari va tartibida joylashgan bo'lishi mumkin. Ushbu tartibdagi tarkibiy qism quyidagi sahifalarni joylashtiradi:

  • Asboblar paneli
  • Agentlik
  • Avtobus
  • Safar
  • Profil

Shuningdek, istalgan istisnolar uchun xato sahifasi "error.html" nomi bilan yaratilgan. Kirish va ro'yxatdan o'tish sahifalari tizimga kirgan foydalanuvchiga kirish mumkin bo'lgan portaldan alohida ishlab chiqilgan.

Serverni mahalliy ravishda ishga tushirish

Ushbu bahorni yuklash dasturini ishga tushirish uchun avval uni tuzishingiz kerak. Spring Boot dasturini Maven yordamida bitta bajariladigan Jar fayliga o'rnatish va paketlash uchun quyidagi buyruqdan foydalaning. Siz uni pom.xml faylini o'z ichiga olgan loyiha papkasidan ishga tushirishingiz kerak.

mato to'plami

yoki siz ham foydalanishingiz mumkin

mvn toza o'rnatish

Ilovani terminal oynasida ishlatish uchun siz java -jar buyrug'ini olishingiz mumkin. Bu sizning Spring Boot ilovangiz ijro etiladigan jar fayli sifatida paketlangan bo'lishi kerak.

java -jar target / springboot-starterkit-0.0.1-SNAPSHOT.jar

Ilovani ishga tushirish uchun Maven plaginidan ham foydalanishingiz mumkin. Maven plaginlari yordamida Spring Boot dasturini ishga tushirish uchun quyidagi misoldan foydalaning:

mvn bahorgi yuklash: yugurish

Siz yuqoridagi / barcha buyruqlarni bajarishingiz yoki oddiygina sevimli IDE tomonidan taqdim etilgan ishga tushirish konfiguratsiyasidan foydalanishingiz va dasturni ishlab chiqish uchun shu erdan ishga tushirish / diskka chiqarishingiz mumkin. Server sozlangach, quyidagi interfeysda administrator interfeysiga kirishingiz kerak:

http: // localhost: 8080

Va REST API-lariga quyidagi tayanch yo'l orqali kirish mumkin:

http: // localhost: 8080 / api /

Ba'zi muhim api tugatish nuqtalari quyidagilar:

  • http: // localhost: 8080 / api / v1 / foydalanuvchi / ro'yxatdan o'tish (HTTP: POST)
  • http: // localhost: 8080 / api / autent (HTTP: POST)
  • http: // localhost: 8080 / api / v1 / rezervasyon / to'xtaydi (HTTP: GET)
  • http: // localhost: 8080 / api / v1 / rezervasyon / tripsbystops (HTTP: GET)
  • http: // localhost: 8080 / api / v1 / rezervasyon / tripschedules (HTTP: GET)
  • http: // localhost: 8080 / api / v1 / rezervasyon / buklet (HTTP: POST)

Docker konteyneri

Iltimos, konteyner rasmini yaratish uchun quyidagi buyruqdan foydalaning:

docker build -t bahor / starterkit.

Va konteynerni ishga tushirish uchun quyidagi buyruq:

docker run -p 8080: 8080 bahor / starterkit

Iltimos, konteyner tasvirini yaratganingizda va mongodb sizning tizimingizda lokal ravishda ishlayotgan bo'lsa, ulanishi uchun tizimning IP manzilini (yoki bulutga joylashtirilgan ma'lumotlar bazasining IP-manzilini) application.properties faylida (yoki env vars) taqdim etishingiz kerak. ma'lumotlar bazasiga konteyner ichidan.

Xulosa

Ko'rib turganingizdek, starter to'plami sizga o'zingizning rivojlanishingizga asoslanib, soddalashtirilgan, samarali va toza kodlangan interfeys va arxitekturani berib, sizni kodlash vaqtini tejashga mo'ljallangan. Buni sinab ko'ring va fikrlaringizni menga bildirishingizga ishonch hosil qiling.

Ushbu ikki maqola ketma-ketligi sizning "Boot" dasturini takomillashtirishda sizga yordam berdi va keyingi bahorgi yuklash dasturini yozishni boshlash uchun mustahkam platforma berdi.

Barchani baxtli kodlash!

Agar u sizga qiziqarli yoki foydali bo'lsa, iltimos ap clap tugmasini bosing va boshqalarga ushbu voqeani topishda yordam bering.

Siz 50 ta xafagarchilikni berishingiz mumkinligini bilarmidingiz?