Meeskond "Nämm-nämm"
Idee
Meie poolne teenus:
Meie poolt pakutud teenus lubab kohvikupidajatel oma kohvikuid ja seal pakutavaid toite süsteemi registreerida. Süsteemis on võimalik kohvikuid ja nende kaupa ilma sisse logimata kommenteerida ja võibolla ehk isegi hinnata.
Rakendus:
Tuleb üks asp.net veebileht, kus kohvikupidajatel on võimalus sisselogides oma menüüd üles panna/neid muuta/kustutada jne. Kui (tava)kasutaja tuleb lehele, on tal võimalus sisestada oma aadress, mille peale kuvatakse talle lähima kohviku asukoht (kaardi pealt näeb ka teiste kohvikute aadresse). Loomulikult on võimalik vaadata kõigi kohvikute menüüsid ning otsida menüüde seast meelepärast toitu. Mingit otsest sisselogimist pealehelt ei tule, selle jaoks teeb eraldi lehe.
Meeskond
- Kaspar Kallasmaa
- Siim Aaver
XML
Tõenäoliselt internetibrauser viskab XMLi ja XSLT vaatamisel errori. Sel põhjusel tuleb need enda arvutisse salvestada ja tekstiredaktoriga avada.
XSLT tulemus
Veebiteenus
Meie veebiteenus on valmistatud WCF baasil. See valik võimaldas teha teenusele formsi põhjal kasutajaliidese ja 'cache', mistõttu teeb teenus andmebaasi suunas vähem päringuid. Teenuse kasutajaliideses on logi, kuhu salvestatakse kõik meetodid ja nende parameetrid, mida kasutaja on väljakutsunud. Lisaks salvestatakse iga sekundi tagant logi ka faili.
Teenus/andmebaas on paindlik:
- Võimalik on koostada menüüsid erinevatele kuupäevadele. Näiteks saab terve nädala menüü juba ette ära määrata.
- Soodustused on seostatud kindla toiduga. Seega saab igale toidule (menüüs olemise korrale) määrata erinevad soodustused.
- Võimalik on ühe toiduga seostada 0 kuni piiramatu arv portse või soodustusi.
- Iga portsul eraldi on olemas 'saadavuse' väli. Seega on võimalik tekitada olukord, kus näiteks suur ports on otsa lõppenud aga väike veel saadaval.
Public meetodid:
* Boolean deleteUudis(int uudisId); * Boolean insertEntityUudis(EntityUudis uusUudis); * Boolean editEntityUudis(EntityUudis uusUudis); * Boolean isSuperAdmin(string id); * string getKohvikuKirjeldus(string id); * int newKohvikuKirjeldus(string kirjeldus, string id); * List<EntityKohvik> getEntityKohvikList(); * EntityKohvik getEntityKohvikById(int id); * List<EntityKaup> getAllItems(); * List<EntityKaup> getAllItemNames(); * List<EntityKaup> getItemData(int kohvikID, string date); * EntityKaup getItemByOlemineId(int olemineID); * Boolean insertItem(int kohvikID, String kategooria, String nimetus, String kuupaev, List<EntityPorts> portsud, List<EntitySoodustus> soodukad); * Boolean editItem(int olemineID, String kategooria, String nimetus, String kuupaev, List<EntityPorts> portsud, List<EntitySoodustus> soodukad); * Boolean deleteItem(int itemID, String kuupaev); * Boolean deleteItemByOlemineId(int olemineID); * Boolean toggleAvailability(int ports_ID); * List<EntityUudis> getEntityUudisList(); * List<EntityUudis> getEntityUudisListByAmount(int limit); * EntityUudis getEntityUudisById(int id); * List<EntityLahtiolekuAjad> getEntityLahtiolekuAjadByKohvikId(int kohvikId); * List<EntityKommentaar> getEntityKommentaarList(); * List<EntityKommentaar> getEntityKommentaarFor(KommentaarType kommentaarType, int id); * int getCommentCountFor(KommentaarType kommentaarType, int id); * bool addEntityKommentaarFor(KommentaarType kommentaarType, int rowIdToAddKommentaarFor, String sisu, String autor, DateTime postituseAeg); * List<EntityValuuta> getCurrency(); * int login(String user, String pass); * int getCafIdByUserId(int id); * int getUserRoleId(int userID); * List<String> getKaupNimed(int kasutaja_ID, string prefixText); * List<String> getKatNimed(string prefixText); * string EncodePassword(string originalPassword); * int lisaUusKohvik(EntityKohvik k);
Lähtekood: link
Klientrakendus
Disaini saime lehelt http://www.freewebtemplates.com
Esimene leht, mida külastaja näeb, on järgmine:
Nagu näha on vasakul üleval tulbas erinevate kohvikute nimekiri, millele klikates avaneb täpsem informatsioon valitud kohviku kohta - menüü, avamisajad, pildid jne. Alumises tulbas on kõige uuemad uudised/reklaam kohvikute kohta(näiteks: "Sõbrapäeva pakkumine, kõik joogid -15%" vms), mille all on veel link täpsema informatsiooni jaoks.
Esilehele tulles on võimalik külastajal enda asukoht lahtrisse kirjutada, mille peale otsitakse talle välja kohvik, mis asub talle kõige lähemal. Kaardil markeri peale vajutades viib antud kohviku lehele. Tavavaates on kaardil kõik kohvikud tähistatud.
Kuna meil on 3 erinevat kasutajatüüpi:
tavakasutaja - "tavaline" kohvikukülastaja
kohvikutöötaja - kes haldab oma kohviku andmeid
superadmin - saab kõigi kohvikute andmeid muuta
..siis, et kohviku(te) andmeid muuta, on vajalik admin lehelt sisse logida. Tavavaates(tavakasutajale) seda linki ei näidata, tegemist on eraldi lehega. Kui on oma parooliga sisse logitud, ilmub menüüribale "Admin" link(vt. all pilt nr 2), kus on võimalik näiteks kohvikutöötajal pilte juurde lisada ja ennekõike just toite sisestada, kustutada, muuta.
Paindliku andmebaasi disaini tõttu on meil võimalik lugematul hulgal erinevaid portse ja soodustusi menüüle/toitudele lisada. Sellega lahendatakse ära see olukord, kus suur ports võib otsas olla, aga väike ports on samas olemas. Alumiselt pildilt on näha ka see, et kui antud toiduga kaasneb ka mingi soodustus, siis see uus hind kuvatakse sinna alla. Kui toit/ports on otsas, siis on see mahatõmmatud. Samuti saavad külastajad toite kommenteerida, kommentaaride hulk(arv) on näidatud toidu nimetuse taga sulgudes. Nagu alumisel pildil näha, saab külastaja erinevate päevade menüüsid sirvida(klikates kalendri ikooni peale). Toidud on kategooriatesse jaotatud, et tekiks loogiline ülesehitus.
ASP.net aine raames tegime projektile mõned täiendused. Nende kohta saab täpsemalt lugeda Meeskond "Nämm-nämm asp.net" lehelt.
Lähtekood
Kogu lähtekood on saadaval Google Codes aadressil http://code.google.com/p/kohvik/source/checkout
Kellel SVN ei ole, saab kogu projekti alla laadida siit (seisuga 04.06). Projekti käivitamisel tuleb enne tööle panna teenus ja alles seejärel klientrakendus. Selle saavutamiseks üks võimalus on määrata mitu startup projekti (visual studios paremklõps solutioni peal -> properties -> common properties -> startup project -> multiple startup projects ja määrata järjekord Teenus, Kohvik, KohvikuRax. Actioni alla määrata kas start või start without debugging). EndpointNotFoundExceptioni korral tuleb vajutada F5 (continue) ja kõik asjad peaks siiski tööle minema. See error tuleb sellepärast, et vahel läheb klientrakendus kiiremini tööle kui veebiteenus. Teenuse käivitamine nõuab adminniõigusi (Visual Studiole run as administrator).
Sisselogimiseks ITK kohviku kasutaja on test/test ja superadmin 1/1
Kokkuvõte
Projektiks valisime kohvikute infosüsteemi, kust külastaja näeb kohvikute menüüsid ja muud infot kohvikute kohta ning lisaks on antud võimalus toite kommenteerida. Kohviku omanikel/töötajatel on võimalus oma kohviku menüüd muuta, uusi toite/soodustusi lisada. Projekti ehitamist alustasime XML, XML Schema ja XSLT. Selle esimese osa oleks võinud tegelikult üldse ära jätta, sest teadsmime, et me ei ehita oma süsteemi XML'i peale üles, vaid modelleerisime andmebaasi mudeli, mille järgi tabelid koostasime. Samas mingi kogemuse XMLi koostamise kohta saime aga sellegi poolest. Andmebaas sai küllaltki läbimõeldud ning paindlik, näiteks on võimalik lugematul hulgal portse ja soodustusi toiduga seostada. Paraku oli sellel ka oma hind - teenuse toitude osa läks kohati väga keeruliseks.
Kui esimene versioon andmebaasist oli valmis saanud, alustasime tööd teenusega, milleks oli tavaline asp.net veebi teenus. Peaaegu paralleelselt teenusega, alustasime ka rakenduse ehitamist, milleks oli asp.net veebileht. Peatselt läksime üle WCF teenusele, sest sellega kaasnes rohkem võimalusi. Kohene rakenduse ehitamine oli jaoks vajalik selle jaoks, et näha visuaalselt, kuidas asi tegelikult töötama hakkab ning rakendus tõi välja suure hulga meetodeid, mida algul teenusesse ei arvestanud.
Kellegi teise poolt (Subgurim) kohandatud Google mapsi kasutamise asemel oleks siiski võinud võtta ametliku versiooni. Javascriptiga mässamist oli küll vähem, aga hiljem ilmnesid mõningad probleemid, millest ilma javascripti häkkide kasutamiseta jagu ei saanud. Üks bugi jäi sellest hoolimata siiski sisse. Võib olla ei oleks ametlikus versioonis üldse sellega probleeme tekkinud.
Mõned head ideed jäid siiski rakendamata. Näiteks toitude lisamist muudaks palju mugavamaks, kui autocomplete poolt pakutava toidu valimisel täidetaks kõik väljad eelmisel korral kasutatud andmetega ära. Seejärel saaks kasutaja hõlpsasti veel mõned pisiparandused sisse viia ning ei peaks iga kord portse ja soodustusi uuesti sisse toksima. Samuti võiks olla valik, et lisamisel saaks laadida terve eelmise päeva menüü ette. Seejärel saaks kasutaja eemaldada toidud, mida see kord ei pakuta ja lisada teised asemele. Kohvikutel võib iga päev olla sama menüü või ainult mõningate väikeste erinevustega.
+ Paindlik andmebaas
+ Teenuse kasutajaliideses on logi ning tegevused kirjutatake ka logifaili
+ Cache kiiruse parandamiseks
+ Google mapsi klientrakendusse integreerimine muudab kasutajate elu mugavamaks, kui nad kohvikute asukohti veel peast ei tea
+ Google code kasutamine andis hea ülevaate koodis toimunud muutustest ja tegi projekti kergesti hallatavaks
- Teenus peaks asuma seal kus väline andmebaas või andmebaas oleks pidanud asuma enda arvutis
- Disain üksikutes kohtades
- Ajapuudusel ei jõudnud klientrakendusse teha vormide valideerimist ja veateadete näitamist
Meeskonnasisene punktide jaotus
- Kaspar Kallasmaa - 18p
- Siim Aaver - 25p
Logi
15. mai
muudatused.aspx ja WCF klientrakendus valmis.
10. mai
Toidu muutmise leht.
2. mai
Teenusele lisatud paar puuduvat meetodit.
18. aprill
Töötab toitude lisamise leht. Autocomplete.
16. aprill
Adminni lehel sisselogimine.
7. aprill
Teenus oskab kohvikuid ja nende andmeid puhverdada. Need on ühtlasi ka kõige tihedamini teenuselt küsitavad andmed.
2. aprill
Läksime ASMX teenuse pealt üle WCF teenusele et saaks ka andmete puhverdamise teha.
23. märts
Töötavad kohviku andmete, menüüde ja kommentaaride näitamise vaated.
9. märts
Andmebaas ülesseatud ja lisatud kirjed päringute testimiseks.
8. märts
Tõenäoliselt lõplik versioon andmebaasi disainist.
1. märts
Esialgne andmebaasi disain. Mõned tabelid ja kirjed andmebaasi, et oleks võimalik katsetada.
27. veebruar
XML fail, schema, xsl. Esialgne andmebaasi mudel.
24. veebruar
Google mapsi integreerimine rakendusse.
22. veebruar
SVN ülesseadmine, esialgne rakenduse disain.
21. veebruar
Meeskonna moodustamine, teema valimine.