Eseményvezérelt alkalmazások fejlesztése I
3. Beadandó feladat dokumentáció
2013/2014 tavaszi félév
Készítette: Giachetta Roberto E-mail:
[email protected]
Feladat:
Készítsünk adatbázis alapú, grafikus felületű alkalmazást egy apartmanokkal foglalkozó utazási ügynökség számára, amelyben a felhasználóknak lehetősége van apartmanok foglalására. Az adatbázisban városokra csoportosítva találunk épületeket, és épületen belül apartmanokat. Az apartmanok árazása a szezontól is függ. Továbbá adatbázisban tároljuk a felhasználók és az ügyfelek adatait is. A programba a felhasználóknak be kell előbb jelentkeznie, így kapnak lehetőséget az adatok megtekintésére és szerkesztésére. A felhasználók közül megkülönböztetjük az adminisztrátorokat, akik a felhasználók adatait is szerkeszthetik. A bejelentkezett felhasználó lehetőséget kap az egyes adatok (városok, épületek, apartmanok, szezonok, árak) megtekintésére és szerkesztésére, valamint apartmanok foglalására (ügyfél, apartman, valamint kezdő és vége dátumok megadásával). A foglalásokat utólag le lehet kérdezni, és ki lehet fizetni.
Elemzés: • •
•
•
Az alkalmazáshoz felépítünk egy MySQL adatbázist, amely tárolja a felhasználó, ügyfél, város, épület, apartman, szezon, ár és foglalás adatokat. Az alkalmazás két fő képernyőből áll. Elsőként a bejelentkező ablak jelenik meg, majd sikeres bejelentkezést követően a főablak. A főablakot egy MDI ablak keretében valósítjuk meg, így a felhasználó könnyen át tudja tekinteni párhuzamosan is a funkciókat. A főablakban biztosítunk egy adminisztrációs menüpontot, ahol az egyes táblák adatait tudja a felhasználó szerkeszteni, úgymint városok, épületek, apartmanok, szezonok, árak, vásárlók és felhasználók. Ezeket szabványos táblaszerkesztőből kezelheti a felhasználó, és lehetősége van a módosításokat elvégezni, vagy visszavonni. Itt az adatbázis azonosítókat elrejtjük, és könnyű kiválasztási funkciót szolgáltatunk helyette, továbbá ellenőrzünk néhány további kritikus értéket (pl. a tengerpart távolság nem lehet negatív). Külön menüpontot kap a foglalás, és azon belül a foglalások listázása, illetve új foglalás bejegyzése. Foglalások listázásakor biztosítunk lehetőséget a lista szűrésére ügyfélre, városra, illetve városon belül épületre legördülő menük segítségével. Egy foglalást kiválasztva lehetősége van a fizetést is elkönyvelni. Ügyelni kell arra, hogy már kifizetett foglalást ne lehessen újra kifizetni. 1
Eseményvezérelt alkalmazások fejlesztése I
•
•
2013/2014 tavaszi félév
Új foglaláshoz a felhasználó szűrhet városra, épületnév(részlet)re, illetve ártartományokra, hogy könnyen lehessen a vevő elvárásainak eleget tenni. Az épületet kiválasztva tovább szűrhetjük az apartmanokat, majd dupla kattintással egy apartmanon kezdeményezhetünk foglalást az ügyfélnév, kezdő és befejező dátumok megadásával. Ügyelni kell arra, hogy a dátumok ne ütközzenek más foglalással arra az apartmanra, illetve ne adhassunk meg múltbeli, vagy rossz időpontokat. Foglalásoknál a teljes árat mindig a kezdőnapon érvényben lévő ár alapján számoljuk ki. A felhasználói esetek az 1. ábrán láthatóak.
uc TravelAgency
Bejelentkezés
Foglalások listázása
«precedes» Foglalás
«include»
«include» «include» «precedes» Fizetés
Új foglalás Felhasználó Adminisztráció «include» «include» Szezonok szerkesztése
Városok szerkesztése
«include»
«include» «include»
Épületek szerkesztése
«include» «include» Árak szerkesztése Apartmanok szerkesztése Felhasználók szerkesztése
Ügyfelek szerkesztése
1. ábra: Felhasználói esetek diagramja
2
Eseményvezérelt alkalmazások fejlesztése I
Adatbázisterv:
2013/2014 tavaszi félév
Az adatbázis (appartmentdb) felépítése az alábbi (lásd 2. ábra): • városok (city): azonosító, városnév; • épületek (building): azonosító, név, város azonosító, utca, tengerpart távolság, tengerpart-típus (számként), jellemzők (binárisan összeillesztve), megjegyzés; • apartmanok (appartment): azonosító, épület azonosító, szám, ágyak száma, pótágyak száma, felújítás alatt van-e; • ügyfelek (customer): azonosító, név; • foglalások (rent): azonosító, ügyfél azonosító, apartman azonosító, kezdődátum, befejező dátum, fizetett-e az ügyfél, összeg; • szezon (season): azonosító, név, kezdődátum, befejező dátum; • árak (price): apartman azonosító, szezon azonosító, ár; • felhasználók (user): felhasználónév, teljes név, jelszó, felhasználói szint (0 az adminisztrátor).
Rendszerterv:
A program szerkezetét a Qt modell/nézet architektúrának megfelelően építjük fel, azaz az adatbázis kezelésére táblamodell osztályokat alkalmazunk, amelyek tartalmát megfelelő táblamegjelenítőkkel és egyéb vezérlőkkel jelenítjük meg. A beépített architektúrát több ponton kiegészítjük, ahol egyedi viselkedésre/megjelenésre van szükségünk, továbbá megvalósítjuk a megjelenítő ablakokat (3. ábra). • A főprogram a bejelentő dialógusablakot jeleníti meg (LoginDialog), amely egy lekérdező modell (QSqlQueryModel) segítségével vizsgálja az egyezést a szövegdoboz értékek, valamint az adatbázis-tartalom között. Teljes egyezőség esetén betölti a főablakot. Amennyiben nincs adatbázis-kapcsolat, vagy nem megfelelőek az adatok, előugró ablakban (QMessageBox) figyelmeztet a hibára. • A főablak (MainWindow) egy MDI megjelenítőt (QMdiArea) tartalmaz, valamint egy menüsort legyártott akciókkal. Ezen felül ő példányosítja a megfelelő táblamodelleket (setupModels), illetve az épületek esetén egy egyedi megjelenítőt (BuildingTableDelegate). Az akciók végrehajtása a megfelelő beágyazott ablak megnyitását kezdeményezi. Minden ablak ekkor kapja a táblamodell mutatókat, amelyeket a szerkesztésre felhasznál, így a táblákat nem töltjük be többszörösen a memóriába. • Általános táblaszerkesztést valósít meg a TableEditorWidget osztály, amelynek setModel műveletével állíthatjuk be a szerkesztendő modellt, esetlegesen rejtett oszlopokat, illetve egyedi delegáltat. • A RentListWidget osztály biztosítja a foglaláslistát, mely három legördülő menü (QComboBox) segítségével szűrhető. Amennyiben a városok kijelölése 3
Eseményvezérelt alkalmazások fejlesztése I
2013/2014 tavaszi félév
változik, úgy az épületek listáját is újratöltjük. A vezérlők szűrését QSortFilterProxyModel példányokkal biztosítjuk, míg a táblaszűrést a modell setFilter eljárásával. A nézet csak olvasható, fizetés (payButton_Clicked) esetén a kódban adjuk meg a módosítandó értéket.
2. ábra: Adatbázis diagram
4
Eseményvezérelt alkalmazások fejlesztése I
•
•
•
2013/2014 tavaszi félév
Az AppartmentListWidget ablak jeleníti meg mind az épületek, mind az apartmanok szűrt listáját. Az árszűrést egyedi osztállyal (PriceSortFilterProxyModel), a többi szűrést a beépített szűrő osztállyal végezzük. A duplakattintás esemény (appartmentTableView_DoubleClicked) nyitja meg a foglalási ablakot. A foglalási ablak (AppartmentRentDialog) a foglalás végrehajtásakor (rentButton_Clicked) végez el minden ellenőrzést, úgymint a megfelelő dátumintervallum, valamint az időpontok ütközését, amelyhez egy további lekérdező modellt használ. A módosítást kódban történő beállításokkal hajtjuk végre. A modell oldaláról három egyedi táblamodellt definiáltunk: • Az AppartmentTableModel specialitása, hogy az apartman állapotát kijelölő mezőn keresztül tudja kezelni. • A BuildingTableModel új oszlopokat definiál az állapot, apartman szám, valamint minimum/maximum árak kezelésére, továbbá adatellenőrzéseket végez. • A RentTableModel letiltja a nézetek számára a szerkesztést, valamint a fizetési állapotot kijelölést formájában adja vissza.
class Class Model
QDialog -rentWidget -priceSortFilterModel AppartmentRentDialog
QWidget RentListWidget -rentListWidget
QSortFilterProxyModel PriceSortFilterProxyModel
QWidget AppartmentListWidget -appartmentListWidget
QSqlRelationalDelegate -buildingTableDelegate BuildingTableDelegate
QMainWindow MainWindow -mainWindow 5
QListWidget FeatureEditorListWidget
QWidget TableEditorWidget
QDialog QSqlRelationalTableModel -appartmentTableModel AppartmentTableModel
LoginDialog
QSqlRelationalTableModel BuildingTableModel -rentTableModel
-buildingTableModel
QSqlRelationalTableModel RentTableModel
3. ábra: Osztálydiagram 5