Meeskond "GAP": Difference between revisions
Created page with '== Liikmed == *Gaspar Karm *Andrus Reedla *Priit Siimo == Teema == .... == XML == <source lang="xml"> <?xml version="1.0" encoding="utf-8"?> <TeenusedKaubad> <TeenusKaup> …' |
No edit summary |
||
(22 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
== Liikmed == | == Liikmed == | ||
* | * Priit Siimo - projektijuht, kliendirakendus | ||
*Andrus Reedla | * Peeter Paan - veebiteenus | ||
* Andrus Reedla - veebiteenus, andmemudel | |||
.... | == Planeering == | ||
* Arenduskeskond - Visual Studio 2010 | |||
* Kliendirakendus valmib Asp.net projektina | |||
* Veebiteenus - WCF | |||
* Andmebaasina kasutame SQL2008 | |||
* Andmemudeli koostamiseks kasutasime QSEE Superlite-i | |||
* Meeskonna suhtlus vahendiks on Skype ning versioonihaldustarkvara TortoiseSVN ning MyVersionControl | |||
== Teenus == | |||
Tegemist on universaalse tarkvaraga hulgifirmadele. Näidiseks on võetud arvutikaupade hulgimüügiga tegelev firma, kellel on tosin edasimüüjat. | |||
Hulgifirmale valmistatakse tarkvara, mis võimaldab temal omakorda oma klientidele (arvutikaupade edasimüüjatele) pakkuda tootevaliku teenust. | |||
St, et hulgifirma klient, ei pea hakkama ise oma veebilehele sisestama pakutavaid tooteid, vaid kasutab selleks hulgifirma poolt pakutavat teenust. | |||
Läbi teenuse on võimalik pärida kõik tellitavad tooted, koos piltide, kirjelduse, hindade ja muu vajalikuga. | |||
'''Võit mõlemale poolele:''' | |||
1. Edasimüüjad ei pea enam tegelema andmete uuendamisega ja nende kliendid saavad tellida alati kõige uuemaid tooteid. | |||
2. Hulgimüüjal tekib suur konkurentsieelis võrreldes teiste pakkujatega. | |||
== Veebiteenused == | |||
'''Kasutajatega seotud meetodid:''' | |||
* String GetData() | |||
* ICollection<Product> GetProducts(int cat_id) - meetod tagastab listi vastava kategooria toodetega. Sisendparameetriks kategooria id. | |||
* Product GetProduct(int id) - meetod tagastab toote info. Sisendparameetriks toote id. | |||
* ICollection<Category> GetCategories() - meetod tagastab tootegruppide listi. | |||
* ICollection<Comment> GetProductComments(int prod_id) - meetod tagastab tootele lisatud kommentaarid. Sisendparameetriks toote id. | |||
* void SetProductComment(Comment c) - meetod lisab tootele kommentaari. | |||
'''Administreerimisega seotd meetodid:''' | |||
* void InsertProduct(Product p) - meetod lisab andmebaasi uue toote. Parameetriks lisatav toode. | |||
* void UpdateProduct(Product p) - meetod uuendab andmebaasis toote infot. Parameetriks vaadeldav toode. | |||
* void DeleteProduct(int prod_id) - meetod kustutab andmebaasist toote. Sisendparameetriks toote id. | |||
* void InsertProductGroup(Category cat) - meetod lisab andmebaasi uue tootegrupi. Parameetriks lisatav tootegrupp. | |||
* void DeleteProductGroup(int cat_id) - meetod kustutab tootegrupi andmebaasist. Sisendparameetriks tootegrupi id. | |||
* int GetStatistic() - meetod tagastab üldise meetodite kasutamise statistika. | |||
* Object GetStatistic(string name, string method) - meetod tagastab kliendi meetodite kasutamise statistika. | |||
== Kood == | |||
Veebiteenus [http://dl.dropbox.com/u/12879861/c%23/ServiceGap.rar] | |||
Kliendirakendus [http://dl.dropbox.com/u/12879861/c%23/ClientGAP.rar] | |||
Teenuse API [http://dl.dropbox.com/u/12879861/c%23/Service%20Page.rar] | |||
== Andmemudel == | |||
== XML == | == XML == | ||
Line 14: | Line 69: | ||
<TeenusedKaubad> | <TeenusedKaubad> | ||
<TeenusKaup> | <TeenusKaup> | ||
<Nimetused> | |||
<Nimetus keel =""></Nimetus> | |||
</Nimetused> | |||
<Kood></Kood> | <Kood></Kood> | ||
<Kirjeldused> | <Kirjeldused> | ||
Line 34: | Line 88: | ||
<Kogus></Kogus> | <Kogus></Kogus> | ||
<Grupid> | <Grupid> | ||
<Grupp> | <Grupp></Grupp> | ||
</Grupid> | </Grupid> | ||
<Parameetrid> | <Parameetrid> | ||
Line 42: | Line 94: | ||
<Nimetus></Nimetus> | <Nimetus></Nimetus> | ||
<Vaartus></Vaartus> | <Vaartus></Vaartus> | ||
<Yhik></Yhik> | |||
</Parameeter> | </Parameeter> | ||
</Parameetrid> | </Parameetrid> | ||
Line 55: | Line 108: | ||
<Pealkiri></Pealkiri> | <Pealkiri></Pealkiri> | ||
<Tekst></Tekst> | <Tekst></Tekst> | ||
<Hinnang></Hinnang> | |||
<Aeg> | <Aeg> | ||
<Aasta></Aasta> | <Aasta></Aasta> | ||
Line 66: | Line 120: | ||
</TeenusKaup> | </TeenusKaup> | ||
</TeenusedKaubad> | </TeenusedKaubad> | ||
</source> | </source> | ||
Line 78: | Line 133: | ||
<xs:complexType> | <xs:complexType> | ||
<xs:sequence> | <xs:sequence> | ||
<xs:element name="Nimetus" /> | <xs:element name="Nimetused"> | ||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element name="Nimetus"> | |||
<xs:complexType> | |||
<xs:attribute name="keel" type="xs:string" use="required" /> | |||
</xs:complexType> | |||
</xs:element> | |||
</xs:sequence> | |||
</xs:complexType> | |||
</xs:element> | |||
<xs:element name="Kood" /> | <xs:element name="Kood" /> | ||
<xs:element name="Kirjeldused"> | <xs:element name="Kirjeldused"> | ||
Line 113: | Line 178: | ||
<xs:complexType> | <xs:complexType> | ||
<xs:sequence> | <xs:sequence> | ||
<xs:element name="Grupp | <xs:element name="Grupp" /> | ||
</xs:sequence> | </xs:sequence> | ||
</xs:complexType> | </xs:complexType> | ||
Line 131: | Line 190: | ||
<xs:element name="Nimetus" /> | <xs:element name="Nimetus" /> | ||
<xs:element name="Vaartus" /> | <xs:element name="Vaartus" /> | ||
<xs:element name="Yhik" /> | |||
</xs:sequence> | </xs:sequence> | ||
</xs:complexType> | </xs:complexType> | ||
Line 160: | Line 220: | ||
<xs:element name="Pealkiri" /> | <xs:element name="Pealkiri" /> | ||
<xs:element name="Tekst" /> | <xs:element name="Tekst" /> | ||
<xs:element name="Hinnang" /> | |||
<xs:element name="Aeg"> | <xs:element name="Aeg"> | ||
<xs:complexType> | <xs:complexType> | ||
Line 199: | Line 260: | ||
<style> | <style> | ||
table{ | table{ | ||
font-family:"Verdana"; | |||
font-size:12; | |||
border-width: 1px; | border-width: 1px; | ||
border-spacing: 0px; | border-spacing: 0px; | ||
Line 207: | Line 270: | ||
th{ | th{ | ||
border-width: | border-width: 2px; | ||
padding: | padding: 4px; | ||
border-style: | border-style: hidden; | ||
border-color: green; | border-color: green; | ||
background-color: #daa520; | background-color: #daa520; | ||
-moz-border-radius: | -moz-border-radius: 4px 5px 4px 5px; | ||
} | } | ||
td{ | td{ | ||
border-width: 1px; | border-width: 1px; | ||
padding: 4px; | padding: 4px; | ||
border-style: | border-style: solid; | ||
border-color: | border-color: #f5f000; | ||
background-color: #f5f5dc; | background-color: #f5f5dc; | ||
-moz-border-radius: 3px 3px 3px 3px; | -moz-border-radius: 3px 3px 3px 3px; | ||
Line 224: | Line 287: | ||
.subTable{ | .subTable{ | ||
border-width: 0px; | border-width: 0px; | ||
} | |||
.nimetus { | |||
font-weight: bold; | |||
} | } | ||
</style> | </style> | ||
Line 245: | Line 311: | ||
<td> | <td> | ||
<xsl:for-each select="Grupid/Grupp"> | <xsl:for-each select="Grupid/Grupp"> | ||
/<xsl:value-of select="Nimetus"/> | /<xsl:value-of select="Nimetus | ||
"/> | |||
</xsl:for-each> | </xsl:for-each> | ||
</td> | </td> | ||
<td> | <td class="nimetus"> | ||
<xsl:value-of select="Nimetus"/> | <xsl:for-each select="Nimetused"> | ||
<xsl:value-of select="Nimetus"/> | |||
</xsl:for-each> | |||
</td> | </td> | ||
Line 295: | Line 364: | ||
<xsl:value-of select="Nimetus"/>: | <xsl:value-of select="Nimetus"/>: | ||
<xsl:value-of select="Vaartus"/> | <xsl:value-of select="Vaartus"/> | ||
<xsl:value-of select="Yhik"/> | |||
</dt> | </dt> | ||
</tr> | </tr> | ||
Line 310: | Line 380: | ||
<xsl:value-of select="Autor"/>: | <xsl:value-of select="Autor"/>: | ||
<xsl:value-of select="Aeg/Tund"/>: | <xsl:value-of select="Aeg/Tund"/>: | ||
<xsl:value-of select="Aeg/Minut"/> | <xsl:value-of select="Aeg/Minut"/> | ||
<xsl:value-of select="Aeg/KuuPaev"/>/ | <xsl:value-of select="Aeg/KuuPaev"/>/ | ||
<xsl:value-of select="Aeg/Kuu"/>/ | <xsl:value-of select="Aeg/Kuu"/>/ | ||
<xsl:value-of select="Aeg/Aasta"/> | <xsl:value-of select="Aeg/Aasta"/> | ||
</dt> | </dt> | ||
</tr> | </tr> | ||
Line 328: | Line 398: | ||
</xsl:stylesheet> | </xsl:stylesheet> | ||
</source> | </source> | ||
[[File: | [[File:gap_xslt.JPG]] | ||
== Esmases veebiteenuse versioonis kasutatav andmemudel == | |||
[[File:data_diagramm.png]] | |||
== Klientrakendus == | |||
[[File:computers.jpg]] | |||
== Teenuse API == | |||
[[File:appgarden.JPG]] | |||
== Aruanne == | |||
Projekti käigus sai tehtud XML fail, veebiteenus ja klientrakendus. Alguses pidime tegema andmemudeli ja siis vastavalt sellele ka andmekihi, peale seda saime hakata tegelema veebiteenuse loomisega. Veebiteenuse tegemisel oli raske aru saada, mida teha on vaja. Mitu veebiteenuse versiooni tulid täisti valesti välja, lõpuks aga saime asjale õnneks pihta ja suutsime teha tõelise veebiteenuse, millel on ka eesmärk. Rakenduse loomisel kasutasime palju uusi tehnoloogiaid, milles ennem aimugi polnud, paljusi asju sai teha kõvasti lihtsamalt tänu nendele. | |||
Ise oleme tulemustega rahul, natuke kiireks küll läks aga kõik funktsionaalsus, mida me soovisime, sai valmis. Eriti hea on see, et veebiteenus tuli meil väga praktiline, seda saaks kohe hakata kasutama ja tänu sellele on võimalik saavutada konkurentsieelis. | |||
=== Selgeks sai === | |||
* XMl failidega manageerimine | |||
* Andmekihi ehitamine | |||
* Natuke LINQut | |||
* mõningad VS2010 võimalused töö hõlbustamiseks | |||
* Veebiteenuste ehitamine ja nende debugimine | |||
* Veebiteenuste kasutamine | |||
* Rakenduste ehitamine veebiteenuse baasil | |||
* Paljud uued tehnoloogiad |
Latest revision as of 20:13, 31 January 2012
Liikmed
- Priit Siimo - projektijuht, kliendirakendus
- Peeter Paan - veebiteenus
- Andrus Reedla - veebiteenus, andmemudel
Planeering
- Arenduskeskond - Visual Studio 2010
- Kliendirakendus valmib Asp.net projektina
- Veebiteenus - WCF
- Andmebaasina kasutame SQL2008
- Andmemudeli koostamiseks kasutasime QSEE Superlite-i
- Meeskonna suhtlus vahendiks on Skype ning versioonihaldustarkvara TortoiseSVN ning MyVersionControl
Teenus
Tegemist on universaalse tarkvaraga hulgifirmadele. Näidiseks on võetud arvutikaupade hulgimüügiga tegelev firma, kellel on tosin edasimüüjat. Hulgifirmale valmistatakse tarkvara, mis võimaldab temal omakorda oma klientidele (arvutikaupade edasimüüjatele) pakkuda tootevaliku teenust.
St, et hulgifirma klient, ei pea hakkama ise oma veebilehele sisestama pakutavaid tooteid, vaid kasutab selleks hulgifirma poolt pakutavat teenust. Läbi teenuse on võimalik pärida kõik tellitavad tooted, koos piltide, kirjelduse, hindade ja muu vajalikuga.
Võit mõlemale poolele:
1. Edasimüüjad ei pea enam tegelema andmete uuendamisega ja nende kliendid saavad tellida alati kõige uuemaid tooteid.
2. Hulgimüüjal tekib suur konkurentsieelis võrreldes teiste pakkujatega.
Veebiteenused
Kasutajatega seotud meetodid:
- String GetData()
- ICollection<Product> GetProducts(int cat_id) - meetod tagastab listi vastava kategooria toodetega. Sisendparameetriks kategooria id.
- Product GetProduct(int id) - meetod tagastab toote info. Sisendparameetriks toote id.
- ICollection<Category> GetCategories() - meetod tagastab tootegruppide listi.
- ICollection<Comment> GetProductComments(int prod_id) - meetod tagastab tootele lisatud kommentaarid. Sisendparameetriks toote id.
- void SetProductComment(Comment c) - meetod lisab tootele kommentaari.
Administreerimisega seotd meetodid:
- void InsertProduct(Product p) - meetod lisab andmebaasi uue toote. Parameetriks lisatav toode.
- void UpdateProduct(Product p) - meetod uuendab andmebaasis toote infot. Parameetriks vaadeldav toode.
- void DeleteProduct(int prod_id) - meetod kustutab andmebaasist toote. Sisendparameetriks toote id.
- void InsertProductGroup(Category cat) - meetod lisab andmebaasi uue tootegrupi. Parameetriks lisatav tootegrupp.
- void DeleteProductGroup(int cat_id) - meetod kustutab tootegrupi andmebaasist. Sisendparameetriks tootegrupi id.
- int GetStatistic() - meetod tagastab üldise meetodite kasutamise statistika.
- Object GetStatistic(string name, string method) - meetod tagastab kliendi meetodite kasutamise statistika.
Kood
Veebiteenus [1]
Kliendirakendus [2]
Teenuse API [3]
Andmemudel
XML
<?xml version="1.0" encoding="utf-8"?>
<TeenusedKaubad>
<TeenusKaup>
<Nimetused>
<Nimetus keel =""></Nimetus>
</Nimetused>
<Kood></Kood>
<Kirjeldused>
<Kirjeldus>
<Keel></Keel>
<Tekst></Tekst>
</Kirjeldus>
</Kirjeldused>
<Hinnad>
<Hind>
<HinnaGrupp></HinnaGrupp>
<Valuuta></Valuuta>
<Vaartus></Vaartus>
</Hind>
</Hinnad>
<Kogus></Kogus>
<Grupid>
<Grupp></Grupp>
</Grupid>
<Parameetrid>
<Parameeter>
<Nimetus></Nimetus>
<Vaartus></Vaartus>
<Yhik></Yhik>
</Parameeter>
</Parameetrid>
<Pildid>
<Pilt>
<Nimi></Nimi>
<Aadress></Aadress>
</Pilt>
</Pildid>
<Kommentaarid>
<Kommentaar>
<Autor></Autor>
<Pealkiri></Pealkiri>
<Tekst></Tekst>
<Hinnang></Hinnang>
<Aeg>
<Aasta></Aasta>
<Kuu></Kuu>
<KuuPaev></KuuPaev>
<Tund></Tund>
<Minut></Minut>
</Aeg>
</Kommentaar>
</Kommentaarid>
</TeenusKaup>
</TeenusedKaubad>
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="TeenusedKaubad">
<xs:complexType>
<xs:sequence>
<xs:element name="TeenusKaup">
<xs:complexType>
<xs:sequence>
<xs:element name="Nimetused">
<xs:complexType>
<xs:sequence>
<xs:element name="Nimetus">
<xs:complexType>
<xs:attribute name="keel" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Kood" />
<xs:element name="Kirjeldused">
<xs:complexType>
<xs:sequence>
<xs:element name="Kirjeldus">
<xs:complexType>
<xs:sequence>
<xs:element name="Keel" />
<xs:element name="Tekst" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Hinnad">
<xs:complexType>
<xs:sequence>
<xs:element name="Hind">
<xs:complexType>
<xs:sequence>
<xs:element name="HinnaGrupp" />
<xs:element name="Valuuta" />
<xs:element name="Vaartus" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Kogus" />
<xs:element name="Grupid">
<xs:complexType>
<xs:sequence>
<xs:element name="Grupp" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Parameetrid">
<xs:complexType>
<xs:sequence>
<xs:element name="Parameeter">
<xs:complexType>
<xs:sequence>
<xs:element name="Nimetus" />
<xs:element name="Vaartus" />
<xs:element name="Yhik" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Pildid">
<xs:complexType>
<xs:sequence>
<xs:element name="Pilt">
<xs:complexType>
<xs:sequence>
<xs:element name="Nimi" />
<xs:element name="Aadress" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Kommentaarid">
<xs:complexType>
<xs:sequence>
<xs:element name="Kommentaar">
<xs:complexType>
<xs:sequence>
<xs:element name="Autor" />
<xs:element name="Pealkiri" />
<xs:element name="Tekst" />
<xs:element name="Hinnang" />
<xs:element name="Aeg">
<xs:complexType>
<xs:sequence>
<xs:element name="Aasta" />
<xs:element name="Kuu" />
<xs:element name="KuuPaev" />
<xs:element name="Tund" />
<xs:element name="Minut" />
</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: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>
<head>
<style>
table{
font-family:"Verdana";
font-size:12;
border-width: 1px;
border-spacing: 0px;
border-style: outset;
border-color: green;
border-collapse: collapse;
}
th{
border-width: 2px;
padding: 4px;
border-style: hidden;
border-color: green;
background-color: #daa520;
-moz-border-radius: 4px 5px 4px 5px;
}
td{
border-width: 1px;
padding: 4px;
border-style: solid;
border-color: #f5f000;
background-color: #f5f5dc;
-moz-border-radius: 3px 3px 3px 3px;
}
.subTable{
border-width: 0px;
}
.nimetus {
font-weight: bold;
}
</style>
</head>
<h2>Kaubad poes</h2>
<table>
<tr>
<th>Tootegrupp</th>
<th>Toode</th>
<th>Toote kood</th>
<th>Kirjeldus</th>
<th>Hind</th>
<th>Kogus</th>
<th>Parameetrid</th>
<th>Kommentaarid</th>
</tr>
<xsl:for-each select="TeenusedKaubad/TeenusKaup">
<tr>
<td>
<xsl:for-each select="Grupid/Grupp">
/<xsl:value-of select="Nimetus
"/>
</xsl:for-each>
</td>
<td class="nimetus">
<xsl:for-each select="Nimetused">
<xsl:value-of select="Nimetus"/>
</xsl:for-each>
</td>
<td>
<xsl:value-of select="Kood"/>
</td>
<td>
<xsl:for-each select="Kirjeldused/Kirjeldus">
<table class ="subTable">
<tr>
<dt>
<xsl:value-of select="Tekst"/>
<!--(<xsl:value-of select="Keel"/>)-->
</dt>
</tr>
</table>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="Hinnad/Hind">
<table class ="subTable">
<tr>
<dt>
*<xsl:value-of select="HinnaGrupp"/>
<xsl:value-of select="Vaartus"/>
(<xsl:value-of select="Valuuta"/>)
</dt>
</tr>
</table>
</xsl:for-each>
</td>
<td align="center">
<xsl:value-of select="Kogus"/>
</td>
<td>
<xsl:for-each select="Parameetrid/Parameeter">
<table class ="subTable">
<tr>
<dt>
<xsl:value-of select="Nimetus"/>:
<xsl:value-of select="Vaartus"/>
<xsl:value-of select="Yhik"/>
</dt>
</tr>
</table>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="Kommentaarid/Kommentaar">
<table class ="subTable">
<tr>
<dt>
<xsl:value-of select="Pealkiri"/><br />
<xsl:value-of select="Tekst"/><br />
<xsl:value-of select="Autor"/>:
<xsl:value-of select="Aeg/Tund"/>:
<xsl:value-of select="Aeg/Minut"/>
<xsl:value-of select="Aeg/KuuPaev"/>/
<xsl:value-of select="Aeg/Kuu"/>/
<xsl:value-of select="Aeg/Aasta"/>
</dt>
</tr>
</table>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Esmases veebiteenuse versioonis kasutatav andmemudel
Klientrakendus
Teenuse API
Aruanne
Projekti käigus sai tehtud XML fail, veebiteenus ja klientrakendus. Alguses pidime tegema andmemudeli ja siis vastavalt sellele ka andmekihi, peale seda saime hakata tegelema veebiteenuse loomisega. Veebiteenuse tegemisel oli raske aru saada, mida teha on vaja. Mitu veebiteenuse versiooni tulid täisti valesti välja, lõpuks aga saime asjale õnneks pihta ja suutsime teha tõelise veebiteenuse, millel on ka eesmärk. Rakenduse loomisel kasutasime palju uusi tehnoloogiaid, milles ennem aimugi polnud, paljusi asju sai teha kõvasti lihtsamalt tänu nendele. Ise oleme tulemustega rahul, natuke kiireks küll läks aga kõik funktsionaalsus, mida me soovisime, sai valmis. Eriti hea on see, et veebiteenus tuli meil väga praktiline, seda saaks kohe hakata kasutama ja tänu sellele on võimalik saavutada konkurentsieelis.
Selgeks sai
- XMl failidega manageerimine
- Andmekihi ehitamine
- Natuke LINQut
- mõningad VS2010 võimalused töö hõlbustamiseks
- Veebiteenuste ehitamine ja nende debugimine
- Veebiteenuste kasutamine
- Rakenduste ehitamine veebiteenuse baasil
- Paljud uued tehnoloogiad