Meeskond "FoodWars"
Idee
Meie tiimil on plaanis teha internetipõhine söökla menüü süsteem (aluseks IT Kolledži kohvik, aga suunitlus selline, et kõik kohvikud/sööklad saaksid teha endale kasutajakonto ja hakata rakendust kasutama), kust saaks jälgida menüüd, mis sööke saab süüa, mis veel järgi on, kasutajatel on ka võimalus sööke hinnata (stiilis "meeldib", "ei meeldi" nagu Facebook-is).
Kohvikupidaja Teele soovid uue elektroonse süsteemi kohta:
- elektroonilisest menüüst asju kustutada, isegi siis kui asja peaks olema teoreetiliselt alles, aga tegelikult on asi otsas.
- elektrikatkestuse korral jääb menüü püsima. Ta peab teadma hindu mistahes olukorras.
- menüül näidatakse automaatselt ka ISIC kaardi omanike soodushinnad
- süsteem toetab ka poole portsjoni müümist.
Linnar Viigi soovid/visioonid uue elektroonse süsteemi kohta:
- kõik oleks ka internetist kättesaadav, peale LCD ekraani, mis kajastab menüüd sööklas.
- aluseks facebook, kus siis söögid oleks nagu facebook-i alateemad.
- saab sööke hinnata, kommenteerida (täna oli väga maitsev praad).
- kasutajad saaks vaadata, mis menüüs on (ka järgmisel nädalal) ja mitu portsu veel alles on.
- kasutajad saaksid välja pakkuda menüüsid.
- erinevate söögikohtade kasutajad saaksid omavahel muljeid jagada.
- kuu aja aktiivsemad saavad prii lõuna.
- mingil ajal võib olla "happy hour" (enne sulgemist saab odavamalt).
- piiranguks on see, et toitu broneerida ei saa
Vaba tarkvara kasutamise võimalus
Antud projekti puhul oleks võimalik kasutada PostgreSQL andmebaasi (vt. lisaks http://en.wikipedia.org/wiki/PostgreSQL ) Microsoft SQL Server'i asemel. See võiks anda kasutajale võimaluse valida .NET ning Mono (vt. lisaks http://en.wikipedia.org/wiki/Mono_(software) ) platvormide vahel. Sel viisil oleks kliendil võimalik Microsoft'i platvormi kõrval valida tõenäoliselt soodsam vaba tarkvara platvorm. Andmebaasi lõplik valik pole hetkel veel otsustatud.
Meeskond ja tööjaotus
- Kristjan Stolin - projektijuht, suhtlus kliendiga, XML, wiki, teenuskihtide progemine, rollide halduse lehe progemine
- Ilmar Telga - XML, kliendiga suhtlus, wiki, teenuskihtide progemine, lõpprakenduste menüüd, login
- Rauno Rüga - XML, XSLT, andmebaasi loomine, wiki, mobiilirakendus, statistika
- Lauri Kermas - teenuskihtide ehitamine, wiki, login, kommenteerimise võimaluste progemine
XML Fail
XML
<?xml version="1.0" encoding="utf-8"?>
<Toidud>
<Toit>
<ToiduNimetus>Viineri kaste</ToiduNimetus>
<ToiduLiik>Praad</ToiduLiik>
<OlemasolevatYhikut>5</OlemasolevatYhikut>
<ToiduKogus>
<Portsjon>
<PortsjoniLiik>Poolportsjon</PortsjoniLiik>
<Myygiaeg>
<Aasta>2011</Aasta>
<Kuu>1</Kuu>
<Paev>9</Paev>
<Tund>15</Tund>
<Minut>07</Minut>
<Sekund>23</Sekund>
</Myygiaeg>
<ToiduHind>
<Eurohind>2.15</Eurohind>
<Soodustus>
<SoodustuseProtsent>5%</SoodustuseProtsent>
<SoodustuseLiik>ISIC kaart</SoodustuseLiik>
</Soodustus>
</ToiduHind>
</Portsjon>
<Portsjon>
<Myygiaeg>
<Aasta>0</Aasta>
<Kuu>0</Kuu>
<Paev>0</Paev>
<Tund>00</Tund>
<Minut>00</Minut>
<Sekund>00</Sekund>
</Myygiaeg>
<PortsjoniLiik>Täisportsjon</PortsjoniLiik>
<ToiduHind>
<Eurohind>2.80</Eurohind>
<Soodustus>
<SoodustuseProtsent>5%</SoodustuseProtsent>
<SoodustuseLiik>ISIC kaart</SoodustuseLiik>
</Soodustus>
</ToiduHind>
</Portsjon>
</ToiduKogus>
<Kommentaarid>
<Kommentaar>
<Saatja>
<SaatjaNimi>Kristjan</SaatjaNimi>
<SaatjaRoll>Tudeng</SaatjaRoll>
</Saatja>
<Sisu>Minu lemmik toit ! Kui algebra tund ei hakkaks, sööks veel 5 portsjonit.</Sisu>
</Kommentaar>
</Kommentaarid>
</Toit>
</Toidud>
Kommentaariks siis niipalju, et meie näide on ilma kohviku osata, selleks et näidet mitte liiga suureks ajada.
Ka on meil moment puudu ID väljad, mis on igasugu andmebaasiga suhtlemiseks hädavajalikud, samas siin näidises palju juurde ei anna.
Asja tegemisel avastasime, et põhiliseks arusaamatuse kohaks on toitude erinevad kogused (ehk siis pool portsjonit, suur / väike ja muud võrdlevad ühikud). Esimese võimalusena kaalusime teha lihtsalt täiesti eraldi toidud kõige kohta, stiilis "väike viineripraad" ja "suur viineripraad". Kahjuks see variant ei kõlbaks eriti hästi, kuna need erinevad portsjonid kasutavad ikkagi samu materjale ja kui me peaks mingi süsteemiga näitama kui palju portsjoneid alles on. Sööklast näiteks pakuti et väike portsjon kasutab materjale kuskil 0.8 suure portsjoni ulatuses, ehk see suhtarv peaks olema kasutaja poolt (kohvikupidaja, restoraniomanik) ise sätitav.
Tänu sellele sai meie süsteemi alustalaks siiski Toit, millel on oma Portsjonid siis erinevate hindade ja soodustustega. Moment pole meil ka Portsjoni XML osas toodud ära seost kogusega. (Kui palju ühe portsjoni lisamine/müümine peaks toidu üldkogust muutma).
Kommenteerida saab meil moment toitu ennast, mitte eraldi portsjonit. Isegi kui kasutajad tahavad lisada kommentaare stiilis "See väike supp oli tõesti väga väike", ei soovi nad seda ilmselt eraldi portsjoni alla panna. Tulevikus peaks kindlasti olema ka võimalus pigem kommenteerida üldisemalt (Kohvikut ennast, söögipaiku üldse), kui spetsiifilisemalt (Väikse prae kaste lisandi kohta).
XML Schema
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Toidud">
<xs:complexType>
<xs:sequence>
<xs:element name="Toit">
<xs:complexType>
<xs:sequence>
<xs:element name="ToiduNimetus" type="xs:string" />
<xs:element name="ToiduLiik" type="xs:string" />
<xs:element name="OlemasolevatYhikut" type="xs:unsignedByte" />
<xs:element name="ToiduKogus">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Portsjon">
<xs:complexType>
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element name="PortsjoniLiik" type="xs:string" />
<xs:element name="Myygiaeg">
<xs:complexType>
<xs:sequence>
<xs:element name="Aasta" type="xs:unsignedShort" />
<xs:element name="Kuu" type="xs:unsignedByte" />
<xs:element name="Paev" type="xs:unsignedByte" />
<xs:element name="Tund" type="xs:unsignedByte" />
<xs:element name="Minut" type="xs:unsignedByte" />
<xs:element name="Sekund" type="xs:unsignedByte" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ToiduHind">
<xs:complexType>
<xs:sequence>
<xs:element name="Eurohind" type="xs:decimal" />
<xs:element name="Soodustus">
<xs:complexType>
<xs:sequence>
<xs:element name="SoodustuseProtsent" type="xs:string" />
<xs:element name="SoodustuseLiik" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Kommentaarid">
<xs:complexType>
<xs:sequence>
<xs:element name="Kommentaar">
<xs:complexType>
<xs:sequence>
<xs:element name="Saatja">
<xs:complexType>
<xs:sequence>
<xs:element name="SaatjaNimi" type="xs:string" />
<xs:element name="SaatjaRoll" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Sisu" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Kohvikus müüdavad toidud</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Toidu Nimetus</th>
<th>Toidu liik</th>
<th>Veel alles</th>
<th>Portsjon</th>
<th>Müügiaeg</th>
<th>Hind</th>
<th>Soodustus</th>
<th>Soodustuse liik</th>
<th>Kommentaar(id)</th>
</tr>
<xsl:for-each select="Toidud/Toit">
<tr>
<td><xsl:value-of select="ToiduNimetus"/></td>
<td><xsl:value-of select="ToiduLiik"/></td>
<td><xsl:value-of select="OlemasolevatYhikut"/></td>
<td>
<xsl:for-each select="ToiduKogus/Portsjon">
<table>
<tr>
<td>
<xsl:value-of select="PortsjoniLiik" />
</td>
</tr>
</table>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="ToiduKogus/Portsjon">
<table>
<tr>
<td>
<xsl:value-of select="Myygiaeg/Paev" />/<xsl:value-of select="Myygiaeg/Kuu" />/<xsl:value-of select="Myygiaeg/Aasta" />
<xsl:value-of select="Myygiaeg/Tund" />:<xsl:value-of select="Myygiaeg/Minut" />:<xsl:value-of select="Myygiaeg/Sekund" />
</td>
</tr>
</table>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="ToiduKogus/Portsjon">
<table>
<tr>
<td>
<xsl:value-of select="ToiduHind/Eurohind" />
</td>
</tr>
</table>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="ToiduKogus/Portsjon">
<table>
<tr>
<td>
<xsl:value-of select="ToiduHind/Soodustus/SoodustuseProtsent" />
</td>
</tr>
</table>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="ToiduKogus/Portsjon">
<table>
<tr>
<td>
<xsl:value-of select="ToiduHind/Soodustus/SoodustuseLiik" />
</td>
</tr>
</table>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="Kommentaarid/Kommentaar">
<table>
<tr>
<td>
<xsl:value-of select="Sisu" /> (<xsl:value-of select="Saatja/SaatjaRoll" /> <xsl:value-of select="Saatja/SaatjaNimi" />)
</td>
</tr>
</table>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLT poolt loodud tulemus on järgnev (lisasin veel kaks toitu XML faili, siin wiki lehel on ruumi kokkuhoiuks vaid 1 toit toitude listis):
Arhitektuur
Süsteem oli vahepeal plaanis ehitada kolmekihilise arhitektuuriga (Three-tier architecture). See peaks lihtsustama süsteemi haldamist ja laiendamist tulevikus. Aga kuna selle jaoks otsest vajadust polenud ja oleks vaid süsteemi keeruliseks ajanud, siis loobusime sellest.
Veebiteenus
Andmemudel
Enne veebiteenuse meetodite kirjeldamist koostasime andmemudeli. Loodud andmemudeli põhjal lõime andmebaasi vajalike tabelite ja atribuutidega. Andmemudeli peal on rohelisega tähistatud tabelid, mis on oseselt seotud kohviku valdajaga ja mida WPF rakenduse jaoks kindlasti vaja on. Ülejäänud helesinised tabelid on vajalikud kasutajate võimaluste jaoks. Lisaks on andmemudelil kaks tabelit, mis pole teisega seotud, need on süsteemi administraatori jaoks, et oleks ülevaade, mis rakendused teenust enim kasutavad ning mis meetodeid kõige rohkem välja kutsutakse.
Teenuskihis olevad meetodid
KohvikuteArv() - SaidiKasutajaLiik() - KustutaSaidiKasutaja() - AnnaKoikSaidiKasutajad() - LisaArtikkelMenuuse() - LisaKohvikuleMenuu() - KustutaMenuuJaKohvikuSeos() - LisaUusMenuu() - KohvikuteNimed() - KohvikuNimiIdJargi() - AnnaKoikOmanikuKohvikud() - AnnaKoikKohvikuKasutajad() - MuudaSaidiKasutajaLiik() - KoikLubatudSaidiKasutajaTyybid() - KoikLubatudKohvikuRollid() - KasutajaKohvikuRollid() - MuudaKohvikuKasutajaRoll() - SaidiKasutajaLiikID() - Kohvikud() - KohvikuKasutajaLiikID() - MenuuKohvikuIdJargi() - LisaMenuuArtikkelMenuuse() - KustutaMenuuArtikkel() - AnnaTagastaMenuuArtiklid() - VahetaMenuuArtiklit() - MenuuNimetus() - AnnaMuugiartiklidMidaMenuusPole() - AnnaMenuuNimed() - AnnaKaubad() - LisaKaup() -
xxx
AnnaKasutajaMeiliAadress() - Tagastab antud kasutaja nime alusel kasutaja meiliaadressi AnnaKasutajaIdJargi() - Tagastab kasutajanime kasutaja ID järgi AuthendiKasutaja() - Autendib kasutaja, õnnestumisel tagastab kasutaja ID, ebaõnnestumisel null RegistreeriKasutaja() - Registreerib kasutaja andmebaasi ja tagastab true kui kasutaja loomine õnnestus
Kommentaaridega seotud meetodid:
- KohvikuKommentaarideArv() - Kohviku kommentaaride arv
- AnnaKohvikuKommentaarid() - Tagastab kommentaarid lehtede kaupa
- AnnaKohvikuKommentaarideHinded() - Tagastab kommentaaride jaoks võimalikud hinded koos kirjeldustega
- LisaKohvikuKommentaar() - Lisab kohviku kommentaari
Statistikaga seotud meetodid:
- StatistikaRakendusteKohtaTana() - Tagastab rakenduse nimed ja nende vastu tehtud päringud tänasel päeval
- StatistikaRakendusteKohtaViimaneNadal() - Tagastab rakenduse nimed ja nende vastu tehtud päringud viimase nädala jooksul
- StatistikaRakendusteKohtaSellelKuul() - Tagastab rakenduse nimed ja nende vastu tehtud päringud selle kuu jooksul
- StatistikaRakendusteKohtaKokku() - Tagastab rakenduse nimed ja nende vastu tehtud päringud kogu aja vältel
- StatistikaMeetoditeKohtaTana() - Meetod leiab tänase päeva jooksul kasutatud meetodid ja paringute arvu
- StatistikaMeetoditeKohtaViimaneNadal() - Meetod leiab viimase nädala jooksul kasutatud meetodid ja paringute arvu
- StatistikaMeetoditeKohtaSellelKuul() - Meetod leiab kuu jooksul kasutatud meetodid ja paringute arvu
- StatistikaMeetoditeKohtaKokku() - Meetod leiab kogu aja vältel kasutatud meetodid ja paringute arvu
Klientrakendus I : CMS
Klientrakendus I : Veebirakendus
Meeskonna kokkuvõttev aruanne
Logi
9. aprill
Tegime rollide halduse, münüüde muutmise vormi. Meili saatmine registreerimisel. Toimus andmebaasi andmemudeli väike muutus.
30. märts
Tehtud on kohviku menüü ja kohviku kommenteerimise leht.
26. märts
Tehtud on esimesed veebiteenuse meetodid ja veebirakendusele kasutajate registreerimine.
10. märts
Väikese häki abil õnnestus kohviku kassa arvutis saada tööle üks Forms-i proovirakendus.
8. märts
Kuna kassa-aparaadis on operatsioonisüsteemiks Windows XP ja raud on 1.99 GHz, 256 RAM siis peaks saama prototüübiks teha sinna peale rakenduse, mille ülesandeks menüüga tegelemine.
7. märts
Linnar Viik andis meile järgmist nõu: tuleb eristada kahte asja - see, mis peab valmis saama (must) ja see, mis oleks tore (nice to have). Valmis peab saama menüüga ekraan seinal (esialgu kasutajale prototüübi näitamiseks kasvõi näiteks PowerPoint-i abil tehtud). Alles siis kui on kasutajalt positiivne tagasiside saadud, võib edasi minna reaalse tarkvaralahenduse loomisega. Kui ka see on valmis ja kasutaja sellega rahul võib juurde mõelda nice to have asju (näiteks eelinfo järgmise päeva menüü kohta, üliõpilasesinduse sõnumite riba ja muid asju).
Saime teada, et kui tahame, et meie loodav süsteem suhtleks IT Kohviku kassasüsteemiga, siis tuleb selle süsteemi tootjatega ühendust võtta ja nendega konsulteerida.
19.Veebruar
- Valmis XSLT fail.
9.Veebruar
- Esmane versioon XML ja XML Schemast olemas
- Tekkis küsimus kas XSLT faili tuleb käsitsi tekitada või automaatselt.
- Küsimus oli ka kas lahendasime portsjoni asja mõistlikult või oleks mõni teine lähenemine parem olnud.
- Küsimus, kas XML fail on liiga üle pingutatud või sobiva keerukusega
7. Veebruar
- Võtsime õppejõu poolt pakutud ideest kohe kinni, sest me eelistame teha praktilist asja, mida saab kasutada ja mille kasutamist saame ka iga päev jälgida.
- Esimese asjana otsustasime välja uurida mida meie "kliendid" (süsteemi tellijad) meilt ootavad. (Soovid idee punkti all)
- Valminud on lihtne teenusest ja klientidest koosnev süsteemi testmudel.