Meeskond "näljased"
1. XML
XML-i tegime menüü kohta. XSLT faile on kaks: üks teeb XML-i HTML-i ning teine vahetab elementide ja atribuutide kohtad. XML faili kohta on olemas ka kirjeldav schema. Raskeimaks osaks oli elementidest atribuutide tegemine, asi küll toimis, kuid vormistus oli kole ning auklik. Schema vajas ka veidi harjumist, kuid kui asi käppa sai, siis läks imelihtsaks. Media:XML
2. Teenus
2.1 Teenus
Võimalused alajaotuste kaupa:
- Kasutajagrupid:Hetkel on 3 kasutajagruppi: admin (saab teha kõike), müüja (saab teha kõike peale kasutajate ja kasutajagruppide loomise) ning tavakasutajad. On olemas eraldi funktsioon ka kasutajagruppide loomiseks. Iga meetodi käivitamisel kontrollitakse kasutajaõigusi. Ühel kasutajal saab olla mitu kasutajagruppi.
- Kasutajad. Kasutajate loomiseks on 2 funktsiooni: üks tavakasutajate tegemiseks, mis ei eelda sisselogimist ning teine, mida saab teostada vaid administraator (ja lisada müüjaid või teisi administraatoreid). Kasutajate loomisel kontrollitakse seda, kas kasutajanimi on juba kasutusel. Kasutaja id ning roll sisestatakse ka tabelisse kasutajaRollis, mis näitab kasutajatel olevaid rolle. Kasutajate kustutamine käib otse andmebaasist. Kasutaja loomisel salvestatakse andmebaasi kasutaja parool hashitud kujul (algoritmiks sha1)
- Tooted. Kasutajatel (hetkel müüjal) on võimalus lisada ja kustutada tooteid toodete kategooriaid, hindu jms.
- Sessioonid. Kasutaja edukal sisselogimisel luuakse unikaalne juhuslik sessiooni võti, mille olemasolu kontrollitakse iga sisselogimist eeldava meetodi käivitamisel. Session_key salvestatakse andmebaasis vastavas väljas. Eraldi on funktsioonid sessiooni olemasolu kontrollimiseks ning uuendamiseks. Hetkel on timeoudiks 10 minutit. Sessiooni kehtivust kontrollitakse ka kasutajaõiguste kontrollimisel.
- Logimine. Võrreldakse sisestatud kasjutajanime ning sisestatud parooli hashi andmebaasis olevatega. Kui need ühtivad, siis sisselogimine on edukas ning luuakse unikaalne session key, mis salvestatakse andmebaasi. Sisselogimine ning sessiooni olemasolu on eelduseks meetodite käivitamiseks. Kui sessioon aegub, siis toimub kasutaja väljalogimine. Väljalogimisfunktsioon kirjutab üle sessiooni aegumise aja, pannes selleks hetkelise kellaaja.
Lisaks on veel hunnik abifunktsioone, näiteks parooli hashimine, väärtuste tagastamine jms.
Klient on kirjutatud WPF-is ning hetkel on võimalik kuvada tooteid, kasutajaid, gruppe ning kasutajagruppe.
2.2 Menüü teenuse klient
Et meie tore teenus oleks veidi rohkem käega katsutavam, sai külge tehtud ka klient, mis realiseeriks põhifunktsioone. Kliendiks on WPF rakendus ning funktsionaalsus on järgmine:
- Sisse logimine: rakenduse käivitamisel ahistatakse kasutajat sisselogimisaknaga, valede andmete korral saab kasutaja ilusa punase veateate. Õnnestumise korral genereeritakse sessioonivõti, ning kantakse teda pidevalt edasi.
- Toodete kuvamine,lisamine, kustutamine: kuvatakse väike popup, kus hunnik lahtreid ning kasutaja saab neid täites lisada toote. ID alusel saab kustutada ebasoovitava toote. Õnnestumisel või ebaõnnestumisel kuvatakse muidugi veateade.
- Kategooriate kuvamine, lisamine, kustutamine: iga toit tuleb paigutada kategooriasse, siin on koht kus neid luua saab. ID alusel jällegi kustutamine.
- Kasutajate kuvamine, lisamine: siin kuvatakse kõik süsteemis olevad kasutajad, ning toimub ka lisamine
- Kasutaja gruppide kuvamine (kustutamine): kuvatakse kehtivad kasutaja grupid, meetod ka kustutamiseks
- Pildid
- Klient
3. Flickr API
Võimalused alajaotuste kaupa:
- Pildiotsing: Kasutajal on võimalus otsida otsingusõna järgi pilte Flickri pildibaasist. Pilte otsitakse kasutajate galeriidest, pildikomplektidest ja niisama üles laetud piltidest, mis on publicud ehk avalikud. Kui kasutaja sisestab vähem kui 2 tähte, kuvatakse veateade. See on Flickri poolt samuti kinni keeratud, et ühetähe otsinguid ei teostataks. Üldjoontes ei oleks sellel ka mingisugust mõtet. Otsingusõna sisestamisel kuvatakse paremale aknasse 5 pildi thumbnaili, mis on kõige värskemad. Thumbnailidest vasakul all nurgas kuvatakse, mitu lehekülge pilte leiti ja mitmendal leheküljel parasjagu ollakse. Olles esimesel lehel ja/või teostades esimest otsingut, nuppu "eelmine" ei kuvata. Seejärel saab kasutaja hakata navigeerima lehekülgedel "eelmine" ja "järgmine" nuppudega. Valides thumbnaili välja ja klikkides selle peale, kuvatakse pilt suurena, laiusega 380 pikslit ja kõrgusega 380 pikslit. Kui suur pilt on kuvatud, avaneb ka võimalus vajutada nuppu "Ava kasutaja profiil". Sellega pääseb API kasutaja ligi suure pildi kasutaja profiilile. See on sobilik näiteks kui API kasutajale hakkas huvi pakkuma pildi üles laadinud kasutaja, ning soovib tema teisigi pilte sirvida.
- Inimese otsing: Kasutajal on võimalus otsida emaili järgi Flickri kasutajaid. Otsingulahtrisse mitte millegi sisestamisel või jättes sisestamata "@" sümbol, kuvatakse veateade. Vastasel korral kuvatakse kas kasutaja Flickri kasutajanimi, pärisnimi (kui see on tal määratud) ja tema profiili URL. Kui kasutaja on leitud, kuvatakse ka nuppu "Ava veebisait", millega pääseb kasutaja ligi ka tema profiilile, kirjutamata ise midagi veebibrauseri aknasse. Kui kasutajat ei leitud, antakse ka vastav veateade.
- Fotokomplektide kuvamine: Kasutaja saab vaadata oma fotokomplekte. Selleks tuleb kõigepealt vastava nupuga omandad frob, mis on Flickri API ajutine kood (kehtib ühe tunni). Kui frob on omandatud, avaneb kasutajale nupp "omanda token". Tokeniga on Flickri poolne frobi teisendus tokeniks, mida kasutatakse edaspidi kasutaja identifitseerimiseks. Kui token on omandatud, kuvatakse teade "token omandatud" või vastasel juhul "token omandamata". Seejärel ilmub nähtavale nupp "tiri fotosetid". Sellele klikkides kuvatakse thumbnailidena kasutaja fotokomplektid.
- Piltide üleslaadimine: Kõigepealt tuleb omandada frob ja token, nagu eelnevas punktis kirjeldatud. Seejärel saab kasutaja üles laadida oma pilte arvutist OpenFileDialogi abil. Seejärel saab sisestada pildile tiitli ehk nime, kirjelduse ja tagi, mida aga ei pea tegema (Flickr samuti ei nõua nende atribuutide olemasolu). Olles salvestanud atribuudid ilmneb nupp "lae üles". Sellele vajutades laetakse pilt kasutaja üldpiltide sekka üles.
Klient, installer ja lähtekood: Download
XML
<?xml version="1.0" encoding="UTF-8"?> <menyy xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="menyy_schema.xsd"> <pearoad> <pearoog> <nimi>Seapraad</nimi> <hind>23</hind> </pearoog> <pearoog> <nimi>Kotlett</nimi> <hind>42</hind> </pearoog> </pearoad> <lisandid> <lisand> <nimi>Riis</nimi> <hind>7</hind> </lisand> <lisand> <nimi>kartul</nimi> <hind>10</hind> </lisand> </lisandid> <joogid> <soojad> <soe> <nimi>Kohv</nimi> <hind>10</hind> </soe> <soe> <nimi>Tee</nimi> <hind>15</hind> </soe> </soojad> <kylmad> <kylm> <nimi>Morss</nimi> <hind>23</hind> </kylm> <kylm> <nimi>Vesi</nimi> <hind>3</hind> </kylm> </kylmad> </joogid> <magustoidud> <magustoit> <nimi>Kisell</nimi> <hind>14</hind> </magustoit> </magustoidud>
</menyy>
XSLT andmete kuvamiseks html-ina
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html> <head> </head> <body style="font-color: #D0D0D0;font-family:verdana;">
Menüü
Pearoad
<xsl:for-each select="menyy/pearoad/pearoog" > </xsl:for-each>
<xsl:value-of select="nimi" /> <xsl:element name="br" /> |
<xsl:value-of select="hind" /> <xsl:element name="br" /> |
Lisandid
<xsl:for-each select="menyy/lisandid/lisand" > </xsl:for-each>
<xsl:value-of select="nimi" /> <xsl:element name="br" /> |
<xsl:value-of select="hind" /> <xsl:element name="br" /> |
Kuumad joogid
<xsl:for-each select="menyy/joogid/soojad/soe" > </xsl:for-each>
<xsl:value-of select="nimi" /> <xsl:element name="br" /> |
<xsl:value-of select="hind" /> <xsl:element name="br" /> |
Külmad joogid
<xsl:for-each select="menyy/joogid/kylmad/kylm" > </xsl:for-each>
<xsl:value-of select="nimi" /> <xsl:element name="br" /> |
<xsl:value-of select="hind" /> <xsl:element name="br" /> |
Magustoidud
<xsl:for-each select="menyy/magustoidud/magustoit" > </xsl:for-each>
<xsl:value-of select="nimi" /> <xsl:element name="br" /> |
<xsl:value-of select="hind" /> <xsl:element name="br" /> |
</body> </html>
</xsl:template>
</xsl:stylesheet>
XSLT atribuutide tegemiseks elementidest
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8"/> <xsl:template match="*[*]"> <xsl:choose> <xsl:when test="not(@*)"> <xsl:copy> <xsl:for-each select="*"> <xsl:choose> <xsl:when test="not(*) and not(@*) "> <xsl:attribute name="{local-name(.)}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="."/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:copy> </xsl:when> <xsl:otherwise> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:otherwise> </xsl:choose> </xsl:template>
</xsl:stylesheet>
XML schema
<?xml version="1.0" encoding="iso-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="nimi" type="xs:string"/> <xs:element name="hind" type="xs:decimal"/> <xs:element name="menyy"> <xs:complexType> <xs:sequence> <xs:element ref="pearoad"/> <xs:element ref="lisandid"/> <xs:element ref="joogid"/> <xs:element ref="magustoidud"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="pearoad"> <xs:complexType> <xs:sequence> <xs:element ref="pearoog"/> <xs:element ref="pearoog"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="pearoog"> <xs:complexType> <xs:sequence> <xs:element ref="nimi"/> <xs:element ref="hind" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="lisandid"> <xs:complexType> <xs:sequence> <xs:element ref="lisand"/>
<xs:element ref="lisand"/>
</xs:sequence> </xs:complexType> </xs:element> <xs:element name="lisand"> <xs:complexType> <xs:sequence> <xs:element ref="nimi"/> <xs:element ref="hind" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="joogid"> <xs:complexType> <xs:sequence> <xs:element ref="soojad"/> <xs:element ref="kylmad"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="soojad"> <xs:complexType> <xs:sequence> <xs:element ref="soe"/>
<xs:element ref="soe"/>
</xs:sequence> </xs:complexType> </xs:element> <xs:element name="kylmad"> <xs:complexType> <xs:sequence> <xs:element ref="kylm"/>
<xs:element ref="kylm"/>
</xs:sequence> </xs:complexType> </xs:element> <xs:element name="kylm"> <xs:complexType> <xs:sequence> <xs:element ref="nimi"/> <xs:element ref="hind" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="soe"> <xs:complexType> <xs:sequence> <xs:element ref="nimi"/> <xs:element ref="hind" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="magustoidud"> <xs:complexType> <xs:sequence> <xs:element ref="magustoit"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="magustoit"> <xs:complexType> <xs:sequence> <xs:element ref="nimi"/> <xs:element ref="hind" /> </xs:sequence> </xs:complexType> </xs:element>
</xs:schema>