Meeskond: Travo 2.0
From ICO wiki
Kodutöö aines "Võrgurakendused II: hajussüsteemide ehitamine"
Lähtekood on kättesaadav GitHubis privaatses repositooriumis: Travo.
Tiim
- Tarvo R. - Projektijuht, kokk-disainer-arendaja-keevitaja
Kirjeldus
Travo on veebirakendus, mis liidab kokku Toggli, Trello ja Todoisti võimekused. Täpsemalt pakub Travo läbi lihtsa kasutajaliidese võimalust luua to-do ülesandeid ning jälgida ülesannete tegemisele kulunud aega.
Üldine spetsifikatsioon
- Kasutaja saab luua to-do ülesandeid
- To-do ülesandeid saab liigendada märksõnadega (tagide) abil
- Kasutaja saab jälgida ülesannete tegemisele kulunud aega
- Kasutaja ajajälgimised kajastuvad logis ning kasutaja näeb logi põhjal loodud statistikat
Arendus
Tehnoloogiad
- ASP.NET 4.5.2
- ASP.NET Web API 2
- Entity Framework 6
- Aurelia (TypeScript)
- UIkit
- Gulp (ja vastavad pluginad)
- BrowserSync
Tööriistad
- Microsoft Visual Studio 2015 CE (Back-end arenduseks)
- Microsoft SQL Server Management Studio 2014
- Atom (Front-end arenduseks)
XML/XSD/XSLT
XML
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="XML.xslt" ?>
<!-- Kooli andmebaas -->
<School>
<!-- Klassid -->
<Groups>
<Group id="1">
<Name><![CDATA[1]]></Name>
<Group id="2">
<Name><![CDATA[1A]]></Name>
</Group>
<Group id="3">
<Name><![CDATA[1B]]></Name>
</Group>
</Group>
<Group id="4">
<Name><![CDATA[2]]></Name>
<Group id="5">
<Name><![CDATA[2A]]></Name>
</Group>
<Group id="6">
<Name><![CDATA[2B]]></Name>
</Group>
</Group>
</Groups>
<!-- Õpilased -->
<Students>
<Student id="1" birthDate="2008-03-09 16:05:07.123">
<Name><![CDATA[Mait Käver]]></Name>
<GroupId>2</GroupId>
</Student>
<Student id="2" birthDate="2008-03-09 16:05:07.123">
<Name><![CDATA[Poska-Käver Maitandres]]></Name>
<GroupId>2</GroupId>
</Student>
<Student id="3" birthDate="2008-03-09 16:05:07.123">
<Name><![CDATA[Andres Poska]]></Name>
<GroupId>5</GroupId>
</Student>
</Students>
<!-- Kursused -->
<Courses>
<Course id="1">
<Name><![CDATA[Võrgurakendused 2: XML-i algkursus C# baasil]]></Name>
<Students>
<Student id="1"></Student>
<Student id="2"></Student>
</Students>
</Course>
<Course id="2">
<Name><![CDATA[XML 3: C# baaskursus Java baasil]]></Name>
<Students>
<Student id="1"></Student>
<Student id="2"></Student>
<Student id="3"></Student>
</Students>
</Course>
</Courses>
</School>
XSD
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="School">
<xs:complexType>
<xs:sequence>
<xs:element name="Groups">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Group">
<xs:complexType>
<xs:sequence>
<xs:element name="Name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element maxOccurs="unbounded" name="Group">
<xs:complexType>
<xs:sequence>
<xs:element name="Name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Students">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Student">
<xs:complexType>
<xs:sequence>
<xs:element name="Name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="GroupId" type="xs:unsignedByte" />
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
<xs:attribute name="birthDate" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Courses">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Course">
<xs:complexType>
<xs:sequence>
<xs:element name="Name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Students">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Student">
<xs:complexType>
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</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:output method="html" indent="yes"/>
<!-- Key definitions -->
<xsl:key name="group" match="Group" use="@id" />
<xsl:key name="student" match="School/Students/Student" use="@id" />
<xsl:template match="/">
<html>
<body>
<h1>Kool</h1>
<!-- Klassid -->
<h2>Klassid</h2>
<xsl:for-each select="School/Groups/Group">
<h4>
Klassi grupp: <xsl:value-of select="Name"/>
</h4>
<table border="1">
<tr bgcolor="#9acd32">
<th>Id</th>
<th>Nimi</th>
</tr>
<xsl:for-each select="Group">
<tr>
<td>
<xsl:value-of select="@id"/>
</td>
<td>
<xsl:value-of select="Name"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
<!-- Õpilased -->
<h2>Õpilased</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Id</th>
<th>Nimi</th>
<th>Klass</th>
</tr>
<xsl:for-each select="School/Students/Student">
<tr>
<td>
<xsl:value-of select="@id"/>
</td>
<td>
<xsl:value-of select="Name"/>
</td>
<td>
<xsl:for-each select="key('group', GroupId)">
<xsl:value-of select="Name"/>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
<!-- Kursused -->
<h2>Kursused</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Id</th>
<th>Nimi</th>
<th>Tudengid</th>
</tr>
<xsl:for-each select="School/Courses/Course">
<tr>
<td>
<xsl:value-of select="@id"/>
</td>
<td>
<xsl:value-of select="Name"/>
</td>
<td>
<xsl:for-each select="key('student', Students/Student/@id)">
<xsl:value-of select="Name"/>
<br/>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Arenduse logi
Arendusprotsess
- 21.09.2015 - Travo idee
- 30.01.2016 - Travo 1.0 arenduse lõpp
- 21.02.2016 - Travo 2.0 esimene commit
- 28.02.2016 - API dokumentatsioon valmis
- 19.03.2016 - Töötav tokenitel põhinev autentimine nii back kui ka front-endis