MealPlannerSolo

From ICO wiki

Liikmed

  • Triin Oja

Varasem projektileht

Meeskond: MealPlanner

Veebiteenus ja klientrakendus

Lõpptoode:Veebiteenus ja klientrakendus

Analüüs

Kirjeldus

MealPlanner on rakendus, mis aitab planeerida nädala menüüd ja poeskäike. Kasutajale pakutakse valitud päevade arvuks retseptid ja genereerib nende põhjal ostunimekirja. Retseptid jagunevad toidukorra tüüpi(breakfast, snack, main course, desert) ja retseptitüübi järgi(vegan, paleo, keto, regular). Retseptitüübi järgi jagunemine aitab näiteks ka uue dieeti katsetamise lihtsamaks - saad näiteks terve nädala jagu sobivaid retsepte kätte ja ei teki kiusatust midagi ebasobivat süüa/osta. Ostunimekirja saab kasutaja ka jagada - näiteks e-maili teel.

Infosüsteemi funktsionaalsus

Kasutaja

  • Saab lisada retsepte
  • Saab muuta/kustutada enda lisatud retsepte
  • Saab salvestada ostunimekirja
  • Saab lisada ostunimekirja asju
  • Saab jagada ostunimekirja (näiteks e-mailis)

Admin

  • Saab lisada retsepte
  • Saab muuta kõiki retsepte
  • Saab kustutada kõiki retsepte
  • Haldab kasutajaid
  • Haldab piiranguid ja pöördumiste arvu piiramist

Retseptid

  • Koostisosad
  • Valmimisaeg
  • Valmistamisõpetus

Koostisosad

  • Nimi
  • Ühik(kas gramm, dl vms)
  • Kas on levinud allergeen (selle kohta oleks allergeenihoiatus)

Nice to Have

  • Random retsepti nupp - uute retseptide avastamiseks
  • Retseptide hindamine - näiteks viie palli süsteemis või lemmikuks lisamiste arv
  • Toiteväärtus

Kasutatavad tehnoloogiad

  • REST veebiteenus
    • .NET Core 2.0
  • Klientrakendus, mis suhtleb veebiteenusega
    • WPF

Andmemudel

MealPlannerSoloAndmemudel.jpeg

XML andmefail

<?xml version="1.0" encoding="utf-8"?>
<menüü id="1" date="2018-08-24">
  <toidukord id="1" name="hommikusöök">
    <recipe id="2" category="vegan">
      <recipecategory>Vegan</recipecategory>
      <recipetitle>Hommikupuder</recipetitle>
      <recipesource>https://nami-nami.ee/retsept/10129/kaerahelbepuder_maapahklivoiga</recipesource>
      <preptime unitoftime="minutit">5</preptime>
      <instructions>
        <step><![CDATA[Sega potis kaerahelbed, sool ja vesi. Kuumuta tasasel tulel aeg-ajalt segades, kuni puder on paraja konsistentsiga.]]> </step>
        <step><![CDATA[Sega juurde maapähklivõi ja serveeri.]]> </step>
        <step><![CDATA[Pane maitsejärgi soola. Maitseks võid lisada ka banaaniviile.]]></step>
      </instructions>
      <ingredients>
      <ingredient id="18" unit="dl" quantity="1">Kaerahelbed</ingredient>
      <ingredient id="21" unit="supilusikas" quantity="1">Maapähklivõid</ingredient>
      <ingredient id="3" unit="dl" quantity="2">Vett</ingredient>
      <ingredient id="41" unit="grammi" quantity="50">Banaani</ingredient>
      <ingredient id="1" unit="näpuotsatäis" quantity="1">Soola</ingredient>
      </ingredients>
    </recipe>
  </toidukord>
  <toidukord id="2" name="lõuna">
    <recipe id="4" category="normal">
      <recipecategory>Tavaline</recipecategory>
      <recipetitle>Kilupirukad fetajuustuga</recipetitle>
      <recipesource>https://nami-nami.ee/retsept/9104/kilupirukad_fetajuustuga</recipesource>
      <preptime unitoftime="minutit">35</preptime>
      <instructions>
        <step><![CDATA[Sulata pärmi-lehttainas. Rulli tainas 5 mm paksuseks ja lõika umbes 8x8 cm ruutudeks. Suru ruudud muffinipanni aukudesse.]]></step>
        <step><![CDATA[Haki keedumunad, puista tainale, aseta peale kilufilee. Lõika kirsstomatid neljaks ja jaota samuti pirukatele. Puista peale fetajuust. Pintselda pirukaid pealt munaga.]]> </step>
        <step><![CDATA[Küpseta 225-kraadises ahjus 12-15 minutit. Puista peale hakitud murulauku, serveeri soojalt.]]></step>
      </instructions>
      <ingredients>
      <ingredient id="51" unit="grammi" quantity="500">Pärmi-lehttainast</ingredient>
      <ingredient id="31" unit="tk" quantity="4">Keedetud muna</ingredient>
      <ingredient id="68" unit="grammi" quantity="130">Vürtsikilufileed</ingredient>
      <ingredient id="44" unit="tk" quantity="12">Kirsstomatit</ingredient>
      <ingredient id="76" unit="grammi" quantity="100">Fetajuustu</ingredient>
      <ingredient id="1" unit="teelusikas" quantity="0.5">Soola</ingredient>
      </ingredients>
  </recipe>
  </toidukord>
  <toidukord id="3" name="õhtusöök">
    <recipe id="6"  category="normal">
      <recipecategory>Tavaline</recipecategory>
      <recipetitle>Kõrvitsasupp suitsukanaga</recipetitle>
      <recipesource>http://www.linnuliha.ee/retseptid/korvitsasupp-suitsukanaga/</recipesource>
      <preptime unitoftime="minutit">30</preptime>
      <instructions>
        <step><![CDATA[Pane retsepti 5 esimest komponenti potti ning keeda seni kuni köögiviljad on pehmed.]]></step>
        <step><![CDATA[Püreesta supp korralikult! Lisa väiksemaks lõigatud suitsukanatükid ning toorjuust.]]></step>
        <step><![CDATA[Kuumuta suppi seni, kuni juust on sulanud. Sobiva tekstuuri saamiseks võid lisada täiendavalt vett või piima!]]></step>
        <step><![CDATA[Vajadusel maitsesta ning seejärel serveeri.]]></step>
      </instructions>
      <ingredients>
      <ingredient id="47" unit="grammi" quantity="450">Kõrvitsat</ingredient>
      <ingredient id="42" unit="grammi" quantity="150">Porgandit</ingredient>
      <ingredient id="48" unit="tk" quantity="4">Tillivart</ingredient>
      <ingredient id="3" unit="dl" quantity="6">Vett</ingredient>
      <ingredient id="33" unit="grammi" quantity="100">Suitsutatud kanakintsuliha</ingredient>
      <ingredient id="1" unit="näpuotsatäis" quantity="1">Soola</ingredient>
      <ingredient id="77" unit="grammi" quantity="100">Toorjuustu</ingredient>
      </ingredients>
  </recipe>
  </toidukord>
</menüü>

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="menüü">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="4" name="toidukord">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="recipe">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="recipecategory" type="xs:string" />
                    <xs:element name="recipetitle" type="xs:string" />
                    <xs:element name="recipesource" type="xs:string" />
                    <xs:element name="preptime">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:positiveInteger">
                            <xs:attribute name="unitoftime" type="xs:string" use="required" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="instructions">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element minOccurs="1" maxOccurs="unbounded" name="step" type="xs:string" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="ingredients">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element minOccurs="1" maxOccurs="unbounded" name="ingredient">
                            <xs:complexType>
                              <xs:simpleContent>
                                <xs:extension base="xs:string">
                                  <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
                                  <xs:attribute name="unit" type="xs:string" use="required" />
                                  <xs:attribute name="quantity" type="xs:decimal" use="required" />
                                </xs:extension>
                              </xs:simpleContent>
                            </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:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
            <xs:attribute name="name" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
      <xs:attribute name="date" type="xs:date" use="required" />
    </xs:complexType>
  </xs:element>
</xs:schema>

XSLT->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="/menüü">
    <html>
      <head>
        <title>Päevamenüü</title>
      </head>
      <body>
        <h1>Menüü</h1>
        <xsl:for-each select="toidukord">
          <table>
            <tr>
              <td>
                <h2>
                <xsl:value-of select ="recipe/recipetitle"/>
                </h2>
              </td>
              <tr>
                <td>
                  <xsl:text>Valmistamisaeg: </xsl:text>
                  <xsl:value-of select ="recipe/preptime"/>
                  <xsl:text> minutit</xsl:text>
                </td>
                <tr>
                <td>
                  <xsl:choose>
                    <xsl:when test="recipe/@category='vegan'">
                      <xsl:text>Vegan option!</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                      <xsl:text>Kõigile!</xsl:text>
                    </xsl:otherwise>
                  </xsl:choose>
                </td>
                </tr>
              </tr>
              <td>
                <xsl:text>Allikas:</xsl:text>
                <a href=" ">
                  <xsl:value-of select="recipe/recipesource"/>
                </a>
              </td>
              <tr>
                <td>
                  <ul style="list-style-type:square">
                    <xsl:for-each select="recipe/ingredients/ingredient">
                      <li>
                        <xsl:value-of select="@quantity"/>
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="@unit"/>
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="."/>
                      </li>
                    </xsl:for-each>
                  </ul>
                  <ul>
                    <xsl:for-each select="recipe/instructions/step">
                      <li>
                        
                        <xsl:value-of select="."/>
                      </li>
                    </xsl:for-each>
                  </ul>
                </td>
              </tr>
            </tr>
            

          </table>
        </xsl:for-each>
  </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

XSLT->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="/menüü">
    <retseptid>
      <xsl:for-each select ="toidukord">
        <retsept>
          <retseptinimi>
            <xsl:value-of select="recipe/recipetitle"/>
          </retseptinimi>

          <xsl:choose>
            <xsl:when test="recipe/ingredients/ingredient='Maapähklivõid'">
              <allergeen>
                <xsl:text>Sisaldab allergeeni: maapähkel</xsl:text>
              </allergeen>
          </xsl:when>
            <xsl:when test="recipe/ingredients/ingredient='Keedetud muna'">
              <allergeen>
                <xsl:text>Sisaldab allergeeni: muna</xsl:text>
              </allergeen>
            </xsl:when>
            <xsl:otherwise>
              <allergeen>
                <xsl:text>Ei sisalda allergeene </xsl:text>

              </allergeen>
            </xsl:otherwise>
          </xsl:choose>
          <xsl:for-each select="recipe/ingredients/ingredient">
          <koostisosad>
            <xsl:value-of select="."/>
          </koostisosad>
          </xsl:for-each>
        </retsept>
      </xsl:for-each>

    </retseptid>

  </xsl:template>
</xsl:stylesheet>

Retsensioonid