Meeskond Tool

From EIK wiki

Idee

Luuakse süsteem lumelaudadega. Lumelauad erinevate parameetritega on XML failis. Ühelt poolt on võimalus neid veebirakendusega XML faili lisada ning teiselt poolt on klientidel võimalus otsida endale kaalu ja pikkuse jms järgi uus lumelaud.

Antud rakendus lihtsustab inimestel endale lumalaua valimist ning säästab hulga aega - ühekaupa kõiki andmebaasis olevaid lumelaudu läbi vaadata oleks väga ajakulukas ning tüütu, arvestades seda, et niikuinii sobivad sõitmiseks vaid lumelauad, mis on vastavad sõitja pikkusele, kaalule, sõidustiilile.

Esialgne plaan on XML faili lumelaudu lisada järgmiste omaduste järgi: pikkus, keskkoha laius, paine, soovitatav sõidustiil, soovitatav kaal. Esialgse plaani järgi peab klient sisestama enda pikkuse, kaalu, jalanumbri ja sõidustiili, pärast mida kuvatakse talle sobivad lumelauad.


Analoogne süsteem Eesti poodides jne puudub. Kõvasti lihtsam oleks endale sobivat toodet leida, kui kõik Eesti lumelaudade edasimüüjad sisestaks enda kaubad andmebaasi - hoiaks kõvasti aega kokku.

Meeskond

  • Erik Kaju - programm
  • Reigo Männiste - programm
  • Miina Sikk - Wikileht, programm, projekti koordinaator
  • Indrek Tamm - Idee, programm

Miina - Wikileht, XML, Veebirakenduse kasutajate pool(statistika, haldamine, sessioonid) + esialgne struktuur, klientrakendus

Indrek - XML, Veebirakenduse lumelaua päringud, kommentaaride meetodid, debugimine, andmebaas, klientrakendus

Reigo - esialgne andmebaas + kommentaaride klass

Erik Kaju - lumelaua sisestamise meetodid

XML

XML fail

 <?xml version="1.0" encoding="utf-8"?>
 <Lumelauad>
  <Lumelaud>
    <Tootja>Forum</Tootja>
      <Nimetus>Destroyer</Nimetus>
        <Edasimyyjad>
          <Edasimyyja>
           <Nimi>SurfHouse</Nimi>
           <Aadress>Pronksi 7/9</Aadress>
           <HindEUR>200</HindEUR>
          </Edasimyyja>
         </Edasimyyjad>
         <Pikkused>
           <PikkusCM>158</PikkusCM>
           <PikkusCM>153</PikkusCM>
         </Pikkused>
         <Laiused>
           <LaiusCM>25</LaiusCM>
         </Laiused>
         <PainduvusTase>6</PainduvusTase>
         <Kommentaarid>
           <Kommentaar>
             <Saatja>
               <Eesnimi>Mati</Eesnimi>
               <Perekonnanimi>Tati</Perekonnanimi>
            </Saatja>
            <Tekst>Hehe, kukkusin sellega hamba suust.</Tekst>
           </Kommentaar>
        </Kommentaarid>
     </Lumelaud>
   </Lumelauad>

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="Lumelauad">
   <xs:complexType>
     <xs:sequence>
       <xs:element name="Lumelaud">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="Tootja" type="xs:string"/>
             <xs:element name="Nimetus" type="xs:string"/>
             <xs:element name="Edasimyyjad">
               <xs:complexType>
                 <xs:sequence>
                   <xs:element name="Edasimyyja">
                     <xs:complexType>
                       <xs:sequence>
                         <xs:element name="Nimi" type="xs:string" />
                         <xs:element name="Aadress" type="xs:string"/>
                         <xs:element name="HindEUR" type="xs:decimal"/>
                       </xs:sequence>
                     </xs:complexType>
                   </xs:element>
                 </xs:sequence>
               </xs:complexType>
             </xs:element>
             <xs:element name="Pikkused">
               <xs:complexType>
                 <xs:sequence>
                   <xs:element name="PikkusCM" type="xs:int"/>
                 </xs:sequence>
               </xs:complexType>
             </xs:element>
             <xs:element name="Laiused">
               <xs:complexType>
                 <xs:sequence>
                   <xs:element name="LaiusCM" type="xs:int" />
                 </xs:sequence>
               </xs:complexType>
             </xs:element>
             <xs:element name="PainduvusTase" type="xs:int"/>
             <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="Eesnimi" type="xs:string"/>
                               <xs:element name="Perekonnanimi" type="xs:string" />
                             </xs:sequence>
                           </xs:complexType>
                         </xs:element>
                         <xs:element name="Tekst" 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>Pakkumisel lumelauad</h2>
    <table border="1">
      <tr>
        <th>Nimi</th>
        <th>Edasimüüjad</th>
        <th>Pikkused</th>
        <th>Laiused</th>
        <th>Painduvus</th>
        <th>Kommentaar(id)</th>
      </tr>
      <xsl:for-each select="Lumelauad/Lumelaud">
      <tr>
        <td><xsl:value-of select="Tootja"/><br/><xsl:value-of select="Nimetus"/></td>
        <td>
        	<xsl:for-each select="Edasimyyjad/Edasimyyja">
        	<table>
        		<tr>
        			<td>
            	<xsl:value-of select="Nimi"/><br/><xsl:value-of select="Aadress"/><br/><xsl:value-of select="HindEUR"/>EUR<br/>
        			</td>
        		</tr>
        		</table>
       	 </xsl:for-each>
        </td>
 
        <td>
          <xsl:for-each select="Pikkused">            
                  <xsl:value-of select="PikkusCM"/>
            <br/>
          </xsl:for-each>
        </td>

        <td>
          <xsl:for-each select="Laiused">
            <table>
              <tr>
                <td>
                  <xsl:value-of select="LaiusCM"/>
                </td>
              </tr>
            </table>
          </xsl:for-each>
        </td>

        <td>
          <xsl:value-of select="PainduvusTase"/>
        </td>
 
        <td>
        <xsl:for-each select="Kommentaarid/Kommentaar">
        <table>
        <tr>
        <td>
            <xsl:value-of select="Tekst" /><br/><xsl:value-of select="Saatja/Eesnimi" /> <xsl:value-of select="Saatja/Perekonnanimi" />
        </td>
        </tr>
        </table>
        </xsl:for-each>
        </td>
 
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>
 


Pilt.png

Veebiteenus

Töödeldavad andmed:

  • Sisse võetakse: Inimese pikkus, kaal, sõidustiil.
  • Mille alusel valitakse: Laua pikkus, laua painduvus, laua laius, twin tip/mitte
  • Tagastatakse: Nimi, Edasimüüjad, Pikkused, Laiused, Painduvus, Kommentaarid

Inimese kõrgusele vastab teatud lauapikkuste vahemik, mis sõiduks sobivad. Samuti mõjutavad sõidustiil ja kaal laua pikkust.

Klassijaotus

  • Kasutaja.cs - kirjeldab kasutajat ja tema parameetreid. Sisaldab järgmiseid kasutajaga seotud meetodeid:
    • lisaKasutaja(string kasutajanimi, string eesnimi, string perenimi, string parool) - lisab kasutaja andmebaasi, kontrollides enne kasutajanime kordumist
    • validKasutajanimi(string kasutajanimi) - kontrollib kasutajanime kordumist
    • rollKasutajale(string kasutajanimi, Roll roll) - annab kasutajale rolli
    • validKasutaja(int kasutajaID) - kontrollib, kas kasutaja on aktiivne
    • kntrlParool(string kasutajanimi, string parool) - kontrollib, kas parool läheb kokku andmebaasis olevaga.
    • kontrolliParool(string parool, string salt, string hash) - kontrollib parooli koos eelmise meetodiga
    • IDkasutajanimest(string kasutajanimi) - returnib kasutaja ID kasutajanime järgi
    • kasutajaSessist(string ID, string path) - returnib kasutajanime sessiooni ID järgi
    • teeGuid(string kasutajanimi, string path) - genereerib kasutajale sisselogimisel unikaalse sessiooni ID
    • salvestaSess(string kasutajanimi, Guid ID, string path) - salvestab sessiooni XML faili sess.xml
    • muudaSessiooni(string ID, DateTime aeg, string path) - muudab sessiooni aegumisaega
    • sessKestab(string ID, string path) - tagastab true, kui kasutaja sessioon ei ole läbi


  • Kommentaar.cs - kirjeldab kommentaari ja tema parameetreid. Sisaldab meetodit:
    • lisaKommentaar(string kommentaar, string sessiID,string kasutajanimi,int lumelauaID) - lisab kommentaari vastava kasutaja poolt vastava lumelaua kohta AB-sse


  • Lumelaud.cs - kirjeldab lumelauda ja tema parameetreid. Sisaldab meetodeid:
    • annaKeskminePikkus(int kaal, int pikkus, Lumelaud.s6iduStiilid s6iduStiil) - tagastab lumelaua pikkuse vastavalt kaalule ja pikkusele ja sõidustiilile
    • kehamassiindeks(int kaal, int pikkus) - arvutab kehamassiindeksi, arvutamaks pikkuse nihet
    • kesknihe(double avg, double i) - arvutab nihke lumelaua pikkusele, vastavalt kehamassiindeksile
    • pikkusekontroll(int keskminePikkus, int isikuPikkus) - kui inimese pikkus on nii suur, et arvutuste järgi sobivat lumelauda ei ole, annab kõige pikemad lauad. Sama väga lühikestega - annab lühimad lauad.
    • CheckBoardParams(string painduvus, string nimi, string tootja, string isTwin, string isMens)- andmete valideerimine enne uue lumelaua AB-sse sisestamist


  • Passwd.cs - siin hashitakse ja soolatakse parool ning tehakse ka vastupidine protsess. Sisaldab meetodeid:
    • GenerateSalt() - genereerib salt'i
    • HashString(string tekst) - hashib parooli
    • HashPassword(string password, string salt) - salted hashib parooli


  • Statistika.cs - statistika klass ja parameetrid, meetodid logimiseks. Sisaldab meetodeid:
    • logiStatistika(string kasutaja, string toimingu_tyyp) - logib kasutaja toimingu xml faili (logi.xml)
    • kysiStatistika(string toimingu_tyyp) - tagastab statistika tegevuse kohta


  • StatistikaK.cs - statistika küsimine kasutaja järgi. Sisaldab meetodit:
    • kysiKasutajaStatistika(string kasutajanimi) - küsib statistika kasutaja kohta kasutajanime järgi


  • WebService.cs - meetod, kus kutsutakse välja teistes klassides olevad meetodid. Siin on veebimeetodid.

Infot kasutatud süsteemide kohta

Kood

Teenuse source [1]

Klientrakendus

Üldist

Klientrakenduse tegime eraldi projektina. Testimiseks on vajalikud nii veebiteenus kui ka klientrakendus alla laadida. Veebiteenuse ühendamiseks klientrakendusega on vajalik veebiteenus tööle panna ja jätta /brauseris/. Seejärel klientrakendus avada Visual Studios. Klientrakenduse Solution menüüs Service Reference'ide all on reference Lumelauad. Paremklikk selle peal ning Configuration -> aadress muuta selleks, mis brauseris aadress on veebiteenusel, juhul, kui see erineb (pordi nr aadressis muuta samaks, mis on brauseris avanenud lehel näide: localhost:3274 <- pordinumber).

Nimekirjade kuvamisel kasutasime DataGride. See võimaldab kasutajatel veerge enda mugavuse järgi ümber tõsta ning samuti sorteerida iga veeru järgi vastavalt. Kasutajaid andmebaasist klientrakenduse kaudu kustutada ei ole võimalik (siis on näha olnud kasutajad + saab vajadusel aktiveerida) - kasutajaid saab aktiveerida ja deaktiveerida. Samuti on võimalik muuta kasutajate rolle - kui kasutajal on üks roll, siis "muuda rolli" vajutades muutub see teiseks.


Lumelauadadel võib andmebaasis olla mitu pikkust ja laiust - seetõttu on võimalik lisada lumelaud koos nime ja tootja ja muude parameetritega kui ka lihtsalt lisada lumelauale pikkus ja laius. Kaks korda sama tootja ja nimega lumelauda lisada pole võimalik - sel juhul tuleb lisada uus pikkus ja laius.

Kuidas kasutada

Klientrakendust on võimalik kasutada külalisena, tavakasutajana või administraatorina.

  1. Külaline - võimalik otsida lumelaudu, võimalik uus kasutaja teha (tavakasutaja) ning võimalik sisse logida.
  2. Tavakasutaja - lisaks eelnevale saab tavakasutaja lisada kommentaare otsitud lumelaudade kohta.
  3. Administraator - lisaks eelnevale saab vaadata kasutajate/toimingute statistikat, lisada/kustutada lumelaudu, lisada/deaktiveerda/aktiveerida kasutajaid, muuta rolle. Administraatoritele tekib sisselogides aknasse ka "Administreeri" nupp.


Statistikat logitakse kasutajate puhul. Võimalikes kohtades antakse kasutajale ka infot, kuidas kasutaja käituma peab (nt sõne sisestamisel pikkuseks jne). Kui viga on milleski muus ning programmis seda kirjeldatud ei ole, väljastatakse kinnipüütud error.


Klassijaotus

  • MainWindow.xaml.cs - kõik, mis on seotud põhiaknaga - saab sisse/välja logida + teistesse akendesse. Sisaldab meetodeid kõikide nuppude kohta, mis mainwindow.xaml's on ja Algväärtustamise meetodit juhuks, kui sessioon lõppeb.
  • UusKasutaja.xaml.cs - uue kasutaja loomise aken külalisele. Sisaldab meetodit tavakasutaja loomiseks.
  • Admin.xaml.cs - administraatori aken, kust saab hallata lumelaudu, kasutajaid, vaadata statistikat.


Kood

Kood asub siin: [2]

Administraatori testimiseks saab kasutada kasutajanime tester, parool test. Veebiteenuse ja klientrakenduse sidumise juhend on teema "Üldist" all.

Meeskonna aruanne

Tegemised ja mittetegemised

Neljaliikmelise meeskonnana võtsime eesmärgiks luua rakendus, mis võimaldab klientidel otsida andmebaasist enda pikkusele, kaalule ja sõidustiilile vastavaid lumelaudu. 3 meeskonnaliiget 4st sõidavad lumelauaga ning kõigil on tulnud ette probleem sellega, et peab poed läbi käima, ei ole võimalik kiirelt vajalikku infot saada.

Nagu eesmärgiks võtsime, saime ka ülesandega valmis. Ühe mööndusega siiski. Algselt oli plaan teha üks rakendus administraatoritele ning teine kasutajatele ja mittekasutajatele. Kuna tundus mõttekam kõik ühendada, tegime seda ning kokkuvõttes valmis üks rakendus. Seejärel mõtlesime Windows 7 Phone'le rakenduse kirjutada, kuid kahjuks jäime ajapuudusesse ning tähtajaks sai valmis üks rakendus.

Lähtudes arvustustest treppisime XML'i, korrastasime wikilehte, lihtsustasime funktsioone ja dokumenteerisime koodi. Samuti lisasime kujunduse.

Liikmete panustamine ja punktidejaotus

Liikmete panustamine projekti kujunes väga ebavõrdselt. Järgnevalt on panustamine lahtikirjutatud projekti osade kaupa:

  • Wikileht ja projekti koordinaator - Miina
  • XML - töö sai tehtud umbkaudu võrdselt Miina, Reigo ja Indreku poolt.
  • Teenusekiht - Reigo alustas projekti andmebaasi loomisega ning aitas debugida. Erik tegi lumelaudade salvestamise andmebaasi (esialgse - hilisem sai ümbertehtud). Ülejäänud tegemised jagunesid Miina ja Indreku vahel.
  • Klientrakendus - ülesanded said täidetud Miina ja Indreku poolt.
  • Muudatused - Indrek (enamus) ja Miina


Kokkuvõttes arvestasime tööhulga järgi, et XML'i punkte jagatakse 7, veebiteenuse punkte 37 ja klientrakenduse punkte 36.

Vastavalt panusele jagunesid punktid järgnevalt: Erik - 5.5 punkti, Indrek - 30 punkti, Miina - 36 punkti, Reigo - 8.5 punkti.

Mida paremini oleks saanud teha?

Projekti alguses peaks kõik tööülesanded kohe paika panema. Antud projekti puhul oli probleemiks teadmatus - kuna keegi ei teadnud alguses täpselt, kuidas ja mida teha tuleb ning kui suureks töö hulk kujuneb, oli tööjaotus suhteliselt keeruline. Tekkis olukord, kus alguses ei osatud ülesandeid paika panna ning tekkis ka väga ebavõrdne tööjaotus - meeskonnaliikmed, kes konkreetseid ülesandeid kätte ei saanud ja ka ise huvi ei tundnud, panustasin projekti kokkuvõttes väga vähe. Ajahädas võttis liikmete 'utsitamine' rohkem aega, kui ülesannete ise ära tegemine.

Captain's Log

06.05.2011

  • debugimine, meetodite lisamine, täiendamine (Indrek, Miina)
  • Jäänud on veel testimine ning koodi silumine

1.05-5.05

(Miina, Indrek)

  • MainWindow, Adminni aken, UusKasutaja aken
  • Sessioonide sidumine vajalike meetoditega
  • Täiendused veebiteenusesse vastavalt klientrakendusele
  • Veebiteenuse meetodite sidumine klientrakenduse meetoditega
  • Enamus meetodeid on valmis.

25.04.2011

  • Ettekandmine, vaja teha järgmised asjad:
    • Wikileht täiendada (korras!)
    • Statistika logisse rakenduse ID ka juurde
    • Sessiooni aega lühemaks (korras!)
    • Projekti kommentaaridest lähtuvalt vaja dokumentatsiooni täiendada (korras!)

18.04.2011

  • lumelaua lisamise debugimine - OK (Indrek)
  • statistika küsimine kasutajanime ja toimingu järgi (Miina)
  • kasutajate sessioonid (Miina)

17.04.2011

  • Kommentaaride lisamine (Reigo)
  • Statistika (Miina)

16.04.2011

  • Lumelaua lisamine - OK(Erik)

15.04.2011

  • kasutajad - autentimine, regamine, deaktiveerimine, rollid - OK!(Miina)

14.04.2011

  • lumelaua lisamine (Erik)
  • lumelaua päringud AB-st: OK! (Indrek)
  • debugimine (Reigo)

13.04.2011

  • lumelaua lisamine - valideerimine (Erik)
  • lumelaua päringud andmebaasist (Indrek)

12.04.2011

  • lumelaudade päringud (Miina)
  • kasutaja lisamine andmebaasi (Indrek)
  • kasutajate pool veebiteenuses (Miina)

11.04.2011

  • päringud (Indrek)

10.04.2011

  • Web Service'i sidumine AB-ga + klassid (Miina)
  • rollidejaotus:
    • Veebiteenuse kasutaja pool: Miina
    • Veebiteenuse toote pool: Indrek
    • Toodete sisestamine AB-sse: Erik

06.04.2011

  • Andmebaasi ümbermuutmine ja kirjed (Indrek, Reigo)

28.03.2011

  • Reigo ja Erik tutvusid iseseisvalt web service loomisega selle kasutamisega, said kokku ja tegid miitingu. Toimus ülesannete konkreetsem jaotus.

28.02.2011

  • XSLT ja XML ühildamine + täiendus(Reigo)
  • Wiki, XML täiendus (Miina)
  • XSLT (Indrek)

27.02.2011

  • XML Schema (Reigo)
  • XSLT (Miina)
  • XML täiendus

21.02.2011

  • Sündis Wikileht koos meeskonnanimega
  • Esialgne XML kondikava (Miina)

18.02.2011

  • Idee kooskõlastamine õppejõuga

14.02.2011

  • Indrek pakkus, et võiks teha midagi lumelaudadest
  • Indrek-Miina-Reigo arutasid idee täpsemaks