GoFood

From ICO wiki

Liikmed

  • Rando Kurel
  • Henrik Prangel
  • Markus Mänd
  • Edgar Tereping
  • Jane Kaldma

Idee

Ideaalselt sooviksime luua toiduhaldusrakenduse, mis lubab:

Poodidel -

  • Lisada oma tooted meie rakendusse haldamisele, (hallatavatel toodetel on tooteinfo: näiteks hind ja antud toote toitumisalane teave).
  • Lisaks võib tootel olla märgis poe kohta, kus antud toodet müüakse.
  • Loomulikult saab ka tooteid uuendada, eemaldada jne...

Tavaklientidel -

  • Sirvida rakenduses müüdavaid tooteid (Näha kus, mis hinnaga ja missuguse toiteväärtusega tooteid müüakse)
  • Moodustada ostenimekiri/kirjad (lisada kõik soovitud tooted ühte nimekirja, et neid seal jälgida ja "maha tõmmata/checkida" [rakendusest ise ei saa tooteid osta, vaid saab poeskäigu jaoks nimekirja luua]
  • Luua oma toitumiskava (toitumisplaan), spetsiifiliste toodetega, kindlateks päevadeks (toitumiskavasi saab luua mitu).
  • Rakendus oskaks seeläbi automaatselt kuvada kasutajale asukohti (poode) kus toitumiskavas sisalduvaid tooteid müüakse.
  • Toitumisplaanist lähtuvalt kuvaks rakendus kasutajale ka antud toitumiskava toitumisalase teave [kcal, süsivesikud, rasvad jne.]

Funktsionaalsus

Must have

  • Tootehaldus koos tooteinfoga
  • Rakendus suudab hallata müüdavate toodete asukohti (igal tootel märgitud pood/asukoht, kus toodet müüakse)
  • Tavaklient saab valmistada oma toidukava


Nice to have

  • Moodustada ostenimekiri/kirjad
  • Rakendus oskab toidukavast lähtuvalt soovitada toidukavas sisalduva toidu müügiasukohti
  • Toidukavasi on võimalik luua erinevatele päevadele


Retsensioon rühmale Maagikud

Link antud rühma wiki lehele: https://wiki.itcollege.ee/index.php/Maagikud


Veebiteenus

Valisime oma retsentseeritavaks tööks rühma Maagikud rakenduse. Nende idee oli luua lennujaama ja lennuliini integreeritud süsteemi. Idee on hea ja orginaalne. Antud ideed pole varem näinud.

Positiivsed küljed:

Rakendusel on olemas AppDataInitalizator, mis genereerib automaatselt andmeid, ning ei pea hakkama ise andmebaase sisestama. Andmeid on AppDataInitalizatorid piisavalt, et testida rakendust, kui mugavuse pärast lisasin läbi kliendirakenduse neid juurde. Andmebaas on lihtne ning kõik vajalikud nende projekti jaoks on olemas. Vajalikud domeenid on sisustatud Data Annotatsioonidega. Väljadele on määratud korrektsed pikkused Domeenimudelite vahel on selgelt näha sidemed. Sisulisi vigu mudelites ei ole näha. Business logic sisaldab data tranfer objectis, factorites ja servicites on kirjeldatud ainult vajalikud meetodid ja klassid. BL on kategoriseeitud kateloogidesse. Korrastab koodi ja on kergem vajalikke faile otsida. DAL osa on jaotatud neljaks erinevaks osaks. See teeb koodist õigete asjade leidmise kergemaks ning selleläbi on koodist õigete asjade otsimine kiirem. DAL kasutab repositooriume ja unit of worki. Api controllerid on ilusti kommenteeritud. Tegi arusaamise lihtsaks, et mis koodiosa mis eesmärki täidab. Kogu projekt on lihtsasti skaleeruv. Vajadusel saab juurde lisada lennufirmasid, rohkemaid sihtpunke, lennukeid ja lennuliine. Ning vajadusel ka lisada näiteks lennujaama kohta lisainfot. Kasutatud on õppejõu poolt näidatud lahenduse stiili. Koodi stiil läbi projekti on sama ning on kergesti mõistetav. Veebiteenuses ettenähud tingimused on täidetud. Veebiteenus pakub teenust, saab hallata kasutajaid, kasutaja ja kasutusstatistika üle saab arvet pidada. Minimaalne olemite arv andmebaasis(9olemit miinimum) on täidetud. Rühmal on 10 olemit. Teenus toetab mitme kasutaja võimalust. On olemas admini- ja tavakasutaja.


Negatiivsed küljed:

Rakendust avades ei näinud ma ReadMe faili, ning ei osanud kohe midagi rakendusega teha. Kood on kommenteerimata. Mõnele võõrale inimesele võib koodi mõistmine olla selletõttu raskendatud. Selle negatiivse külje positiivseks küljeks on see, et kood on loogiliselt üles ehitatud ning loogiliselt sorteeritud.

Soovitused/lõppsõna:

Nõudedmis on täidetud maksimum tulemuse saamiseks: Rakendus on kasutatav majanduslikel eesmärkidel. Kasutatud on Angluari rakenduse loomiseks. Kogukondade kaasamine. Rakendust saab laiendada võimalusel igasse lennujaama, lennufirmasse. Sellest võiks saada tahmise korral ülemaailmne rakendus. Kasutajamugavus. Rakendust on kerge kasutada. Lisavõimaluste realiseerimine. Rakendusele saab vajadusel teha juurde vaateid näiteks iga lennujaama kohta koos lennujaama info ja võimalustega Korraliku arhitektuuriga kood. Kood on ehitatud üles korrektselt ning kirjutatud ainult vajalikud osad.

Veebiteenus on tehtud väga korrektselt ja on lähtutud hea programeerimsie tavadest.

Klientrakendus

Valisime oma retsentseeritavaks tööks rühma Maagikud rakenduse. Nende idee oli luua lennujaama ja lennuliini integreeritud süsteemi. Idee on hea ja orginaalne. Antud ideed pole varem näinud. Rühmapoolt ettemääratud Must-have nõuded: Lendude broneerimine Väljuvate ja saabuvate lendude graafikud Kasutaja loomine/autentimine Administraatorid saavad lisada/muuta/kustutada lennukeid/lennujaamu/lende/lennu liine


Positiivsed küljed:

Visuaalne pool on ilus ja minimalistlik. Esialgsel peale vaatamisel ei jää ükski asi silma riivama. Värvid on tagasihoidlikud ja sobivad kokku. Admini haldamislehel saab lisada lennujaamu, Lennuliine, lennukeid ja lende. Kõik töötavad hästi ning on kerge ja mugav lisada vastavaid andmeid. Registreerides ja logides sisse tavakasutajaga on võimalus broneerida ja vaadata oma broneeritud lende. Mõlemad funktsionaalsused töötavad ja on kergesti mõistetavad. Lendu borneerides ei saa ise andmeid sisse kirjutada, vaid kuvab listina, et ei oleks võimalust registreerida ennast lennule, mida tegelikult olemas pole. Samuti saab tühistada broneeringute alt oma lende. Broneerides lende peab valima alguspunkti ja lõpppunkti. Kui valin mõlemale sama lennujaama, tuleb ette ohuteade “”sihtkoht ja lähtekoht ei saa olla samad”. Teade on hea ning korrektne. Kui tahan lennata ühest lennujaamast teise ning nende vahele ei ole lendu, tuleb ette teade “Antud sihtkoha ja lähtekohaga lende hetkel ei leidu”. Mõlemad teavitused on asjakohased ja õiged. Aitab kergemini endale sobivat lendu leida. Admini ja tavakasutaja vaated on erinevad ning tavakasutaja ei saa teha muudatusi, mida tohib teha ainult admin. Must-have nõuetest on täidetud lendude broneerimine, kasutaja loomine/autentimine, Adminid saavad muuta/lisada/kustutada lennukeid/lennujaamu/lende/lennuliine. Meeskond suutis täita endale määratud eesmärgid ning tegid neid korrektselt ja lihtsalt. Nice-to-have nõuetest on neil ka täidetud ilus kasutajaliides. Registreerimata kasutajaga saab teha broneeringuid ning selle kohta tuleb kinnitus. Ühele lennule, samale istmele ei saa mitu inimest kohta broneerida. Valides teist korda sama lennu, kaob kinni olev koht loetelust ära. Kaob ära konflikt, et mitu inimest saavad samal lennul sama koha. Admini vaates saab kustutada lennujaamu, lennuliine, lennukeid ja lende ainult siis, kui lennujaamast ei toimub lendu, liinile pole ostetud piletit, lennuk pole kasutuses ja lend on tühi. Kaotab ära võimaluse, et inimene ostab pileti ja pärast selgub, et tema lendu ei toimu. Admin näeb statistikat lennujaama kohta. Näeb ära mis lennukid peatuvad lennujaamas, kuhu lennata saab ja mitu broneeringut on nende lennujaamast tehtud on.

Negatiivsed küljed: Lisades lendu, unustasin alguses märkida kasti kellaaja. Vajutades lisa nuppu ei juhtunud midagi. Lendu ei lisatud ja ma ei teadnud miks. Hoiatussõnumit ette ei visatud. Hiljem proovides teisi asju lisada, tingimusel, et üks kast on tühi, tekkis sama viga. Rakendus ei teavita mind sellest, et mõni kast on tühi. Lennukeid lisades jäi segaseks mulle andmete lahtrid. Seal on kolm lahtrit Mark, tüüp ja istekohtade arv. Margi all sain esmalt aru, et on mõeldud firmat.(airbust) Tüübi all mõtlesin alguses mudelit (A380). Pärast selgus, et margi ja mudeli oleks pidanud kirjutama mõlemad Marki kasti ja tüübi alla missorti lennuk on(suur, väike). Tavakasutaja broneeringute vaates on koht “kehtetud broneeringud”. Ei suutnud sinna läbi rakenduse kuidagi tekitada infot. Ei saa täpselt aru mile jaoks see vaade seal on. Must-have nimekirjas jäi meie rühma arust täitamata Väljuvate ja saabuvate lendude graafikud. Tavakasutaja jaoks ei ole kohta, kust saab vaadata lennugraafikuid. Seega piletit broneerides ei tea, kust kuhu lend toimub, peab sihtkohta ja lõppkohta proovima, et näha, kas antud liinil toimub lende. Registreerimata kasutajaga saab teha broneeringuid ning selle kohta tuleb kinnitus, aga broneeringut tehes ei küsita meili /telefoninumbrit/sarnast asja, kuhu saaks saata broneeringu ning lehelt lahkudes on see kadunud. Üks klient ei saa borneerida korraga rohkem kui ühe pileti. Kui vajadus broneerida mitu piletit, peab iga kord uue broneeringu tegema.

Soovitused/lõppsõna:

Väga korrektselt tehtud projekt ning hea lahendus. Projekti edasi arendades on sellel kindlasti suur potentsiaal. Neljaliikmelise rühma kohta on töö maht piisav. Jõudu ja jaksu edaspidiseks programmeerimiseks.

XML

Valisime oma retsentseeritavaks tööks rühma Maagikud rakenduse. Nende idee oli luua lennujaama ja lennuliini integreeritud süsteemi


Täidetud on nõue, et peab olema vähemalt 4 tasandit. Tasandid on asjakohased ja seotud üksteisega. Attribuute on lisatud igale tasemele ja need käivad kokku objektiga, mida kirjeldatakse. Kood on kommenteeritud lihtsamaks arusaamiseks. Kommentaarid on lühikesed ja konkreetsed ning setõttu ka kergesti arusaadavad. XSD fail on vastavused xml failiga Takeof ja landing attribuutide juures peaks olema märgitud ka kellajad, kuna leenud on üldjuhul lühikesed ja ainult päevast jääb infost puudu.(kui on nt 3tunnine lend, mis tõuseb 2 mai ja maandub 2 mai, siis see aken, kus lennuk lendab on päris suur. Peaks olema mainitud näiteks 2mai 15.00 kuni 2mai 18.00) Flight id asemel võiks kasutada nt lennuteed(nt tallinn airport-tartu airport). Oleks asi natukene selgem aga ka Id ei ole halb valik. Tehtud on ka kaks XSLT faili. Mõlemad failid tunduvad olevat korrektselt tehtud ning vigu silma ei paista. Mõlemad XSLT failid on XML failiga kooskõlas.


soovituse/lõppsõna:

XML failid on tehtud õigesti ja korrektselt. Väga hea töö

XML

<users>
  <user id="1">
    <email isverified="false">d@d.ee</email>
    <firstname>Rando</firstname>
    <lastname>Kurel</lastname>
    <nutritionplans>
      <nutritionplan hidden="false" category="tervislik">
        <nutritionplanname>Valgurikas</nutritionplanname>
        <description><![CDATA[Tervislik ja kasulik, eriti kui meeldib palju trenni teha.]]></description>
        <dailynutritionplan maxoccurs="1" >
          <dailynutritionplanname>esmasp2ev</dailynutritionplanname>
          <productinnutritionplan isbought="true" ProductWeight="50" unit="g">kapsas</productinnutritionplan>
          <productinnutritionplan isbought="true" ProductWeight="50" unit="g">porgand</productinnutritionplan>
          <productinnutritionplan isbought="false" ProductWeight="22" unit="g">kartul</productinnutritionplan>
          <productinnutritionplan isbought="true" ProductWeight="250" unit="g">sealiha</productinnutritionplan>
        </dailynutritionplan>
        <dailinutritionplan maxoccurs="1">
          <dailynutritionplanname>Teisip2ev</dailynutritionplanname>
          <productinnutritionplan isbought="true" ProductWeight="111" unit="g">kanaliha</productinnutritionplan>
          <productinnutritionplan isbought="false" ProductWeight="400" unit="g">seenesupp</productinnutritionplan>
          <productinnutritionplan isbought="true" ProductWeight="323" unit="g">lillkapsas</productinnutritionplan>
        </dailinutritionplan>
      </nutritionplan>
      <nutritionplan hidden="true" category="tervistrikkuv">
        <nutritionplanname>patun2dal</nutritionplanname>
        <description><![CDATA[Sobolik siis, kui sa tahad vaheldust oma tavalisest toitumiskavast,
        ning meeldib süüa ükskõik mida hing ihaldab.]]></description>
        <dailynutritionplan maxoccurs="1">
          <dailynutritionplanname>reedene</dailynutritionplanname>
          <productinnutritionplan isbought="true" ProductWeight="1" unit="pack">kr6psud</productinnutritionplan>
          <productinnutritionplan isbought="true" ProductWeight="1" unit="pack">popcorn</productinnutritionplan>
          <productinnutritionplan isbought="true" ProductWeight="1" unit="box">pizza</productinnutritionplan>
        </dailynutritionplan>
        <dailynutritionplan maxoccurs="1">
          <dailynutritionplanname>laup2evane</dailynutritionplanname>
          <productinnutritionplan isbought="false" ProductWeight="250" unit="g">burger</productinnutritionplan>
          <productinnutritionplan isbought="false" ProductWeight="300" unit="g">valiise</productinnutritionplan>
          <productinnutritionplan isbought="true" ProductWeight="345" unit="g">friikad</productinnutritionplan>
        </dailynutritionplan>
      </nutritionplan>
    </nutritionplans>
  </user>
  <user id="2">
    <email isverified="true">peeter.pakiraam@gmail.com</email>
    <firstname>Peeter</firstname>
    <lastname>Pakiraam</lastname>
    <nutritionplans>
      <nutritionplan hidden="false" category="maitsev">
        <nutritionplanname>Kiiren2dal</nutritionplanname>
        <description><![CDATA[Hea valik, kui sul on väga vähe aega söögitegemisega.]]></description>
        <dailynutrtionplan maxoccurs="1">
          <dailynutritionplanname>neljap2ev</dailynutritionplanname>
          <productinnutritionplan isbought="true" ProductWeight="50" unit="g" >kapsas</productinnutritionplan>
          <productinnutritionplan isbought="true" ProductWeight="50" unit="g">porgand</productinnutritionplan>
        </dailynutrtionplan>
        <dailinutritionplan maxoccurs="1">
          <dailynutritionplanname>pyhap2ev</dailynutritionplanname>
          <productinnutritionplan isbought="false" ProductWeight="111" unit="g">kanaliha</productinnutritionplan>
          <productinnutritionplan isbought="true" ProductWeight="400" unit="g">seenesupp</productinnutritionplan>
        </dailinutritionplan>
      </nutritionplan>
    </nutritionplans>
  </user>
<users>

XSD

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="users">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="user">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="email">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute name="isverified" type="xs:boolean" use="required" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="firstname" type="xs:string" />
              <xs:element name="lastname" type="xs:string" />
              <xs:element name="nutritionplans">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="nutritionplan">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="nutritionplanname" type="xs:string" />
                          <xs:element name="description" type="xs:string" />
                          <xs:element minOccurs="0" name="dailynutrtionplan">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="dailynutritionplanname" type="xs:string" />
                                <xs:element maxOccurs="unbounded" name="productinnutritionplan">
                                  <xs:complexType>
                                    <xs:simpleContent>
                                      <xs:extension base="xs:string">
                                        <xs:attribute name="isbought" type="xs:boolean" use="required" />
                                        <xs:attribute name="ProductWeight" type="xs:unsignedByte" use="required" />
                                        <xs:attribute name="unit" type="xs:string" use="required" />
                                      </xs:extension>
                                    </xs:simpleContent>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                              <xs:attribute name="maxoccurs" type="xs:unsignedByte" use="required" />
                            </xs:complexType>
                          </xs:element>
                          <xs:element minOccurs="0" maxOccurs="unbounded" name="dailynutritionplan">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="dailynutritionplanname" type="xs:string" />
                                <xs:element maxOccurs="unbounded" name="productinnutritionplan">
                                  <xs:complexType>
                                    <xs:simpleContent>
                                      <xs:extension base="xs:string">
                                        <xs:attribute name="isbought" type="xs:boolean" use="required" />
                                        <xs:attribute name="ProductWeight" type="xs:unsignedShort" use="required" />
                                        <xs:attribute name="unit" type="xs:string" use="required" />
                                      </xs:extension>
                                    </xs:simpleContent>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                              <xs:attribute name="maxoccurs" type="xs:unsignedByte" use="required" />
                            </xs:complexType>
                          </xs:element>
                          <xs:element minOccurs="0" name="dailinutritionplan">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="dailynutritionplanname" type="xs:string" />
                                <xs:element maxOccurs="unbounded" name="productinnutritionplan">
                                  <xs:complexType>
                                    <xs:simpleContent>
                                      <xs:extension base="xs:string">
                                        <xs:attribute name="isbought" type="xs:boolean" use="required" />
                                        <xs:attribute name="ProductWeight" type="xs:unsignedShort" use="required" />
                                        <xs:attribute name="unit" type="xs:string" use="required" />
                                      </xs:extension>
                                    </xs:simpleContent>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                              <xs:attribute name="maxoccurs" type="xs:unsignedByte" use="required" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                        <xs:attribute name="hidden" type="xs:boolean" use="required" />
                        <xs:attribute name="category" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:unsignedByte" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSLT to HTML

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>
  <xsl:template match="/users">
    <html>
      <head>
        <title>Toitumine</title>
      </head>
      <body>
          <xsl:for-each select="user/nutritionplans/nutritionplan">
            <h2><xsl:value-of select="firstname"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="lastname"/>
          </h2>
          <table border="1">
            <tr>
              <th>NutritionPlan</th>
            </tr>
            <tr>
              <td><xsl:value-of select="nutritionplanname"/></td>
            </tr>
            </table>
          </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Versioonihaldus

https://njetproject.visualstudio.com/GoFood2

Projektikood

Blogi

  • 28 märts - Idee genereerimine
  • 2 aprill - Wiki lehe loomine
  • 11 aprill - Esialgse andmebaasdiagrammi loomine
  • 6 mai - Andmebaasi tegemine
  • 8 mai - Business logic tegemine
  • 8 mai - Algse security tegemine
  • 10 mai -business logic'uga jätkamine
  • 13 mai - Tokenite korda saamine
  • 14 mai - Controllerite tegemine
  • 14 mai - kliendirakendusega alustamine
  • 1 juuni - retsentsioonide kirjutamine
  • 3 juuni - XML failide tegemine