RaamatuRiiul

From EIK wiki


Rühmatöö aines Võrgurakendused II: hajussüsteemide ehitamine

Versioonihaldus:

Klient rakendus ja veebiteenud

Meeskond

  • Alo Avi - projektijuht
  • Arnika Rästa
  • Marite Rammo

Veebiteenus

Idee

Tegu on online raamatupoega, kus müüakse kasutatud, kui ka uusi raamatuid. Admin lisab raamatud müüki ja klient saab neid osta.

Funktsionaalsus

Admin:

  • Haldab tooteid
  • Haldab tellimusi
  • Haldab kategooriaid

Klient:

  • Raamatute vaatamine
    • Sorteerimissüsteem
    • Lehitsemissüsteem
  • Raamatute otsimine
    • Nime järgi
    • Kategooria järgi
    • Autori järgi
    • Kirjastuse järgi
  • Raamatute tellimine
  • Ostukorvi haldamine?

Raamatu Riiul DB model.png

XML

XML osa tegime raamatute ja nendega seotud info kohta (hind, autorid, kategooria, lehtede arv jne).

XML andmefail

<?xml version="1.0" encoding="utf-8"?>
<Books>
  <Book id="5" category="Ilukirjandus EestiKirjandus Ilukirjandus" language="Eesti">
    <BookPublisher>
      <PublisherName><![CDATA[Varrak]]></PublisherName>
    </BookPublisher>
    <BookName><![CDATA[Mürgiliblikas]]></BookName>
    <BookOverview>
      <![CDATA[Arvatavasti on paljud naised oma elus teda kohanud – kena, abivalmis, armastusväärset noorepoolset meest. Meest, kes oskab südantvõitvalt naeratada, kes üritab igapäevamuredes lohutust pakkuda ja sellega ükskõik kelle hallivõitu argielus kogunisti uue, särava lehekülje pöörata. 
    Meest, kes oma päikeselise olemusega nii mõnegi abielus eevatütre võrdlema ja südant valutama, võibolla isegi kahetsema paneb, et tema abikaasa selline ei ole… 
    Aga – kas ta on ikka niisugune, omakasupüüdmatult abivalmis? Võibolla on tegemist hoopis liblikapüüdjaga? Või on ta ise kirevalt kaunis liblikas? Äkki koguni salakaval mürgiliblikas?]]>
    </BookOverview>
    <Quality>5 - uus, heas korras</Quality>
    <Pages>240</Pages>
    <BookFormatEnum>
      <Id>1</Id>
      <Value>Standard</Value>
    </BookFormatEnum>
    <CoverEnum>
      <Id>1</Id>
      <Value>Hardcover</Value>
    </CoverEnum>
    <BookFullPrice currency="EUR">10.00</BookFullPrice>
    <BookDiscountedPrice currency="EUR">7.50</BookDiscountedPrice>
    <PlacePublished><![CDATA[Tallinn]]></PlacePublished>
    <YearPublished>2007</YearPublished>
    <BookQuantityInStock>2</BookQuantityInStock>
    <BookAuthors>
      <Author>
        <AuthorId>1</AuthorId>
        <AuthorName><![CDATA[Erik Tohvri]]></AuthorName>
        <OtherBooksByAuthor>
          <Book id="2" category="Ilukirjandus EestiKirjandus Romaan Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kaldaliiva]]></BookName>
            <BookPrice currency="EUR">8.50</BookPrice>
            <BookPages>245</BookPages>
            <BookYear>2005</BookYear>
            <BookQuantity>5</BookQuantity>
          </Book>
          <Book id="7" category="Ilukirjandus EestiKirjandus Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kodutute küla II: Sulasest sai peremees]]></BookName>
            <BookPrice currency="EUR">9.25</BookPrice>
            <BookPages>360</BookPages>
            <BookYear>2008</BookYear>
            <BookQuantity>1</BookQuantity>
          </Book>
        </OtherBooksByAuthor>
      </Author>
    </BookAuthors>
    <BookDiscount>
      <BookDiscountId>1</BookDiscountId>
      <BookDiscountName><![CDATA[Lõpumüük]]></BookDiscountName>
      <BookDiscountPrice currency="EUR">7.50</BookDiscountPrice>
      <BookDiscountStart>2018-05-23</BookDiscountStart>
      <BookDiscountEnd>2018-06-23</BookDiscountEnd>
    </BookDiscount>
    <CategoryDiscounts>
      <CategoryDiscount>
        <CategoryDiscountId>1</CategoryDiscountId>
        <CategoryDiscountName><![CDATA[Enne suve Eesti kirjanduse hinnad saledaks]]></CategoryDiscountName>
        <CategoryDiscountPercent>15.00</CategoryDiscountPercent>
        <CategoryDiscountStart>2018-05-01</CategoryDiscountStart>
        <CategoryDiscountEnd>2018-06-01</CategoryDiscountEnd>
      </CategoryDiscount>
    </CategoryDiscounts>
  </Book>
  <Book id="4" category="Romaan Mirabilia Väliskirjandus" language="Eesti">
    <BookPublisher>
      <PublisherName><![CDATA[Eesti Raamat]]></PublisherName>
    </BookPublisher>
    <BookName><![CDATA[Diraci meri]]></BookName>
    <BookOverview>
      <![CDATA[Plahvatuslaine viis laeva orbiidilt välja, kuid maandamisautomaat oli korras. Urmantsev sirutas käe välja ja kompis komandöri sidemes rinda. Too ei liigutanud end. Silmad lahti, vaatas ta koidutaevasse. Urmantsev kummardus tema kohale ja nägi, et pilkumatud silmad olid juba kaetud liivakorraga... 
    Ta kaevas madala haua ja mattis nad siinsamas maha. Augu põhjas oli liiv niiske ja raske ning Urmantsev mõtles, et kuskil läheduses peab olema vesi. 
    Hommik oli käes ja kohe hakkas idast puhuma kuiv kuum tuul. Laeva ümber laotus liivakõrb. See sarnanes vähe kõrbetega, mis olid Urmantsevile tuttavaid vaid raamatute kaudu. Tasane lausik väli, ei ühtegi barhaani ega küngast, ei mingit jälge mistahes taimestikust. Kõrvetavate päikesekiirte valguses äratas see maastik vaid nukrust ja igatsust. 
    Ta torkas kepi lauatükikesega liivahunnikusse ja läks väsimusest tuikudes tagasi laeva. Paar lonksu puljongit tegid oma töö, ta oli täiesti rammestunud. Ta vajus istmele ja uinus. Ärkas alles õhtu eel. 
    Jemtsevi ja Parnovi ulmeromaan «Diraci meri» on mitmeplaaniline teos, milles leidub kriminaalromaani elemente. Raamat pajatab täiesti fantastilisest avastusest -- isetäiustuvast ja iseprogrammeeruvast elektronmasinast, «mustast kastist» -- , nõukogude õpetlaste teaduslikest otsingutest, teadusliku uurimisinstituudi töötajatest, teadusliku avastuse kasutamise erinevatest võimalustest. 
    Romaani autorid on otseselt seotud nüüdisaja teadusega, neid huvitavad teaduse progressi ja teadusliku otsingu suured perspektiivid. Nad tunnevad hästi kaasaegse teadusliku uurimisasutuse elu ja selles valdkonnas tegutsevaid inimesi. Kõigest sellest räägibki nende romaan «Diraci meri».]]>
    </BookOverview>
    <Quality>4 - kasutatud, kaaned ja nurgad kulunud</Quality>
    <Pages>288</Pages>
    <BookFormatEnum>
      <Id>1</Id>
      <Value>Standard</Value>
    </BookFormatEnum>
    <CoverEnum>
      <Id>2</Id>
      <Value>Paperback</Value>
    </CoverEnum>
    <BookFullPrice currency="EUR">4.25</BookFullPrice>
    <PlacePublished><![CDATA[Tallinn]]></PlacePublished>
    <YearPublished>1974</YearPublished>
    <BookQuantityInStock>3</BookQuantityInStock>
    <BookAuthors>
      <Author>
        <AuthorId>3</AuthorId>
        <AuthorName><![CDATA[Mihhail Jemtsev]]></AuthorName>
        <OtherBooksByAuthor>
          <Book id="9" category="Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Päikeseaas]]></BookName>
            <BookPrice currency="EUR">3.55</BookPrice>
            <BookPages>85</BookPages>
            <BookYear>2005</BookYear>
            <BookQuantity>1</BookQuantity>
          </Book>
          <Book id="9" category="Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kuukera]]></BookName>
            <BookPrice currency="EUR">3.20</BookPrice>
            <BookPages>78</BookPages>
            <BookYear>2006</BookYear>
            <BookQuantity>0</BookQuantity>
          </Book>
        </OtherBooksByAuthor>
      </Author>
      <Author>
        <AuthorId>9</AuthorId>
        <AuthorName><![CDATA[Jermei Parnov]]></AuthorName>
      </Author>
    </BookAuthors>
  </Book>
</Books>

XML skeemifail

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Books">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Book">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="BookPublisher">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="PublisherName" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="BookName" type="xs:string" />
              <xs:element name="BookOverview" type="xs:string" />
              <xs:element name="Quality" type="xs:string" />
              <xs:element name="Pages" type="xs:nonNegativeInteger" />
              <xs:element name="BookFormatEnum">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Id" type="xs:nonNegativeInteger" />
                    <xs:element name="Value" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="CoverEnum">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Id" type="xs:nonNegativeInteger" />
                    <xs:element name="Value" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="BookFullPrice">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="currency" type="xs:string" use="required" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="BookDiscountedPrice">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="currency" type="xs:string" use="required" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="PlacePublished" type="xs:string" />
              <xs:element name="YearPublished" type="xs:nonNegativeInteger" />
              <xs:element name="BookQuantityInStock" type="xs:nonNegativeInteger" />
              <xs:element name="BookAuthors">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="Author">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="AuthorId" type="xs:nonNegativeInteger" />
                          <xs:element name="AuthorName" type="xs:string" />
                          <xs:element minOccurs="0" name="OtherBooksByAuthor">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element maxOccurs="unbounded" name="Book">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="BookName" type="xs:string" />
                                      <xs:element name="BookPrice">
                                        <xs:complexType>
                                          <xs:simpleContent>
                                            <xs:extension base="xs:decimal">
                                              <xs:attribute name="currency" type="xs:string" use="required" />
                                            </xs:extension>
                                          </xs:simpleContent>
                                        </xs:complexType>
                                      </xs:element>
                                      <xs:element name="BookPages" type="xs:nonNegativeInteger" />
                                      <xs:element name="BookYear" type="xs:nonNegativeInteger" />
                                      <xs:element name="BookQuantity" type="xs:nonNegativeInteger" />
                                    </xs:sequence>
                                    <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
                                    <xs:attribute name="category" type="xs:string" use="required" />
                                    <xs:attribute name="language" type="xs:string" use="required" />
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="BookDiscount">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="BookDiscountId" type="xs:nonNegativeInteger" />
                    <xs:element name="BookDiscountName" type="xs:string" />
                    <xs:element name="BookDiscountPrice">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:decimal">
                            <xs:attribute name="currency" type="xs:string" use="required" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="BookDiscountStart" type="xs:date" />
                    <xs:element name="BookDiscountEnd" type="xs:date" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="CategoryDiscounts">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="CategoryDiscount">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="CategoryDiscountId" type="xs:nonNegativeInteger" />
                          <xs:element name="CategoryDiscountName" type="xs:string" />
                          <xs:element name="CategoryDiscountPercent" type="xs:decimal" />
                          <xs:element name="CategoryDiscountStart" type="xs:date" />
                          <xs:element name="CategoryDiscountEnd" type="xs:date" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
            <xs:attribute name="category" type="xs:string" use="required" />
            <xs:attribute name="language" type="xs:string" 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="/Books">
    <html>
      <head>
        <title>Raamatud</title>
      </head>
      <body>
        <xsl:for-each select="Book" >
          <h1>
            "<xsl:value-of select="BookName"/>"
            <xsl:for-each select="BookAuthors/Author">
              <xsl:value-of select="AuthorName"/>
              <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
              </xsl:if>
            </xsl:for-each>
          </h1>
          <xsl:if test="BookDiscountedPrice">
            <strike>
              <xsl:value-of select="concat('Tavahind: ', BookFullPrice)"/>
            </strike>
            <xsl:value-of select="concat(' Soodushind: ', BookDiscountedPrice)"/>
          </xsl:if>
          <xsl:if test="not(BookDiscountedPrice)">
            <xsl:value-of select="concat('Hind: ', BookFullPrice)"/>
          </xsl:if>
          <br/>
          <xsl:value-of select="concat('Kirjastus: ', BookPublisher, ' ', YearPublished)"/>
          <br/>
          <xsl:value-of select="concat(Pages, ' lk')"/>
          <br/>
          <xsl:value-of select="concat('Kogus: ', BookQuantityInStock, ' tk')"/>
          <br/>
          <xsl:value-of select="concat('Seisukord: ', Quality)"/>
          <p>
            <xsl:value-of select="BookOverview"/>
          </p>
          <xsl:if test="count(BookAuthors/Author) > 1">
            <h3>Autorite teised raamatud: </h3>
          </xsl:if>
          <xsl:if test="count(BookAuthors/Author) = 1">
            <h3>Autori teised raamatud: </h3>
          </xsl:if>
          <ul>
            <xsl:for-each select="BookAuthors/Author">

              <xsl:if test="count(OtherBooksByAuthor/Book) > 0">
                <li>
                  <h3>
                    <xsl:value-of select="AuthorName"/>
                  </h3>
                  <ul>
                    <xsl:for-each select="OtherBooksByAuthor/Book">
                      <xsl:if test="BookQuantity > 0">
                        <p>
                          <li>
                            <b>
                              "<xsl:value-of select="BookName"/>"
                            </b>
                            <xsl:value-of select="concat(' ', BookYear)"/>
                            <br/>
                            <xsl:value-of select="concat('Kategooriad: ', @category)"/>
                            <br/>
                            <xsl:value-of select="concat(BookPages, ' lk ')"/>
                            <br/>
                            <xsl:value-of select="concat('Kogus: ', BookQuantity, ' tk')"/>
                            <br/>
                            <xsl:value-of select="concat(BookPrice, ' ', BookPrice/@currency)"/>
                          </li>
                        </p>
                      </xsl:if>
                    </xsl:for-each>
                  </ul>
                </li>
              </xsl:if>
            </xsl:for-each>
          </ul>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>


XSLT to XML

<?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="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:element name="Books">
      <xsl:for-each select="/Books/Book">
        <xsl:variable name="book" select="."/>
        <xsl:element name="Book">
          <xsl:attribute name="id">
            <xsl:value-of select="@id"/>
          </xsl:attribute>
          <xsl:element name="BookName">
            <xsl:value-of select="BookName" />
          </xsl:element>
          <xsl:element name="Category">
            <xsl:value-of select="@category"/>
          </xsl:element>
          <xsl:element name="Language">
            <xsl:value-of select="@language"/>
          </xsl:element>
          <xsl:copy-of select="BookFullPrice"/>
          <xsl:copy-of select="BookDiscountedPrice"/>
          <xsl:copy-of select="BookPublisher"/>
          <xsl:element name="BookOverview">
            <xsl:value-of select="BookOverview"/>
          </xsl:element>
          <xsl:element name="Quality">
            <xsl:value-of select="Quality"/>
          </xsl:element>
          <xsl:element name="Pages">
            <xsl:value-of select="Pages"/>
          </xsl:element>
          <xsl:element name="BookFormat">
            <xsl:value-of select="BookFormatEnum/Value"/>
          </xsl:element>
          <xsl:element name="Cover">
            <xsl:value-of select="CoverEnum/Value"/>
          </xsl:element>
          <xsl:element name="Published">
            <xsl:value-of select="PlacePublished"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="YearPublished"/>
          </xsl:element>
          <xsl:if test="BookQuantityInStock &lt; 3">
            <xsl:element name="BookQuantityInStock">
              <xsl:value-of select="BookQuantityInStock"/>
            </xsl:element>
          </xsl:if>
          <xsl:element name="BookAuthors">
            <xsl:for-each select="$book/BookAuthors/Author">
              <xsl:variable name="author" select="."/>
              <xsl:element name="Author">
                <xsl:attribute name="id">
                  <xsl:value-of select="AuthorId"/>
                </xsl:attribute>
                <xsl:element name="AuthorName">
                  <xsl:value-of select="AuthorName"/>
                </xsl:element>
                <xsl:element name="OtherBooksByAuthor">
                  <xsl:for-each select="$author/OtherBooksByAuthor/Book">
                    <xsl:element name="Book">
                      <xsl:attribute name="id">
                        <xsl:value-of select="@id"/>
                      </xsl:attribute>
                      <xsl:element name="BookName">
                        <xsl:value-of select="BookName" />
                      </xsl:element>
                      <xsl:element name="Category">
                        <xsl:value-of select="@category"/>
                      </xsl:element>
                      <xsl:element name="Language">
                        <xsl:value-of select="@language"/>
                      </xsl:element>
                      <xsl:copy-of select="BookPrice"/>
                    </xsl:element>
                  </xsl:for-each>
                </xsl:element>
              </xsl:element>
            </xsl:for-each>
          </xsl:element>
        </xsl:element>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Retsensioonid

Meie veebiteenuse, klientrakenduse ja XML retsensioon meeskonnale Miisiiks: retsensioon

Ajalogi

  • 28.03.2018 - esimene kohtumine ja idee paika panemine, Wiki lehe tegemine, projekti analüüsi koostamine
  • 06.05.2018 - pühapäevasel hackatonil projekti arendamine
  • 01.06.2018 - XML failide üles panemine Wiki lehele
  • 03.06.2018 - retsensioonide üles panemine Wiki lehele