Meeskond "Sepad"

From ICO wiki
Jump to navigationJump to search

Kompanjonid

Punktid :

  • Sander Baikov 30p
  • Karl Männil 5p
  • Madis Sildaru 15p
  • Toomas Soha 30p

Teema

RSS lugeja, milles kasutaja saab endale koostada jälgitavate voogude nimekirja ja nimekirja lisada/kustutada voogusid. Feede saab lisada gruppide kaupa, on defauldis defineeritud grupid, kuid kasutaja saab ka ise enda gruppe tekitada. Lisaks saab kasutaja feede filtreerides ainult spetsiifilisi gruppe kuvada. Kasutaja või olla nii guest, kui ka registreeritud kasutaja. Vahe seisneb sellest, et guesti feedide xml säilib ainult nii kaua kui tal selle kohta cookie on olemas ning feedide kuvamisel ei uuendata neid iga kuvamise alguses vaid teatud intervalli tagant.Lisaks on olemas võimalus lehte administreerida, kust on võimalik lehe confi muuta ning kasutajate statistikat näha.


Allalaadida saab: http://vr2rss.codeplex.com/SourceControl/list/changesets (admin konto rakenduses: admin, admin)

NB! Kui masinas on installitud AVG antivirus siis xml'a tegevustel võib vahest tulla viga: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.IO.IOException: The requested operation cannot be performed on a file with a user-mapped section open. Seda sellepärast, et avg scanib kõik failid üle kui mingi tegevus nendega tehakse ja samal ajal ei saa kirjutada faili. Saab vältida seda nii, et hetkeks disableda realtime protection või siis mitte avg-d kasutada :) Teiste viirusetõrjetega pole seda probleemi täheldanud.

Veebiteenus

rssFeeder(põhiteenus, lisaks kasutab adminManager klassi)

  • checkXml() - Tagastab, kas kasutajal on olemas juba feedide kohane XML fail
  • addFeed() - Lisab kasutajale uue uudisvoo
  • getID() - Tagastab kasutaja ID, vastavalt kas tegu on guesti või registreeritud useriga ning näitab kes ta on
  • getGuestID() - Tagastab guesti id
  • getFeedsSettings() - Tagastab settings.xml
  • getFeeds() - Tagastab kasutaja uudisvood
  • updateFeeds() - Uuendab kasutaja uudisvoogusid, võrleb viimast uudist ning arvestab uuendamisel uuendamise sagedust
  • newXml() - Tekitab kasutajale uue XML, kus hakatakse tema feede hoidma
  • updateFeed() - Uuendab üksikut uudisvoogu
  • checkFeed() - Tagastab, kas kasutajal on uudisvoo lisamisel juba selline voog olemas
  • deletFeed() - Kustutab uudisvoo
  • addGroup() - Lisab uue grupi kasutajale uudisvoogude grupeerimiseks
  • disableGroup() - Teeb grupi kasutajale mitte nähtavaks
  • enableGroup() - Teeb grupi taasnähtavaks
  • deleteGroup() - Kustutab grupi
  • editItemCount() - Muudab kuvatavate uudiste hulka uudisvoos
  • logIn() - Üritab kasutajat autentida ning logib ta sisse kasutajana
  • logOut() - Logib kasutaja välja
  • userGroup() - Tagastab millisess kasutajategruppi kasutaja kuulub
  • checkBan() - Kontrollib, kas kasutajal on õigus lehele ligisaada
  • addBan() - Lisab uue bani
  • changeFeedUpdateTime() - Muudab uudiste uuendamise sageduse aega
  • removeItemsChoice() - Eemaldab kasutaja valikust defineeritud voo uudiste kuvamise hulga settings.xml'st
  • addItemsChoice() - Lisab kasutaja valikusse defineeritud voo uudiste kuvamise hulga settings.xml'i
  • modifyCounts() - Salvestab olemasolevate uudiste kuvamise hulga muutused settings.xml's
  • removeGroup() - Eemaldab grupi settings.xml'st.
  • addGrp() - Lisab uue grupi settings.xml'i
  • modifyGroups() - Salvestab muutused olemasolevatesse grupidesse settings.xml's
  • getUsers() - Tagastab kõik registreeritud kasutajad
  • removeBan() - Eemaldab ip põhise blokeeringu
  • removeUser() - Kustutab registreeritud kasutaja ning kustutab tema XMLi kui olemas
  • changeRole() - Muudab registreeritud kasutaja rolli
  • deleteXml() - Kustutab kasutaja xmli
  • removeAllXmls() - Kusutab kõikide kasutajate xmlid
  • getStat() - Tagastab kasutajastatistika


RssManager:

  • parseUrl() - Tagastab aadressi, mille kasutaja feedi lisamisel sisestas parsitud kujul
  • getFeed() - Teeb pringu kasutaja poolt sisestatud parsitud urli pihta, kui on tegu uudisvooge, siis tekitab sellest xelemendi, muidu ei tee midagi

tracker:

  • saveTracker() - Lisab uue kirje kasutaja lehe külastuse kohta

userAuth

  • getUserID() - Tagastab registreeritud kasutaja userid
  • login() - logib kasutaja registreeirtudkasutajana sisse

Klientrakendus

Front end: Rakenduseks on veebileht, mida saab näha nii arvutist kui ka läbi nutitelefoni. Rakendus võimaldab kasutajal enda lemmik uudisvooge kokku koguda ning lehele tulles nendest viimaseid uudiseid sirvida. Kasutajal on võimalus ise endale tekitada gruppe, kuhu alla ta saab grupeerida uudisvoogusid. Samuti saab ta lisatud voogusid üksikult või siis kogu gruppi kustutades eemaldada. Lisaks on võimalus kuvada ainult neid voogusid, mis hetkel kasutajale huvi pakuvad. Lisaks on võimalus määrata gruppide kaupa, palju uudiseid voos kuvatakse. RSS lugejat saavad kasutada nii külalised kui ka registreeritud kasutajad. Vahe seisneb selles, et kui külalisel pole cookid lubatud või aegub ta cookie siis ei näe ta enam enda salvestatud uudiseid. Registreeritud kasutaja feedide XML on alati talle saadaval.


Back-end, adminiliides: Kõik eelpool nimetatud võimalused on konfigureeritavad läbi adminiliidese. Rakendusel on üldine seadete xml fail, kust loetakse vastavad parameetrid välja. Sättida on võimalik vaikimis määratud gruppe ehk neid gurppe, mida pakutakse kasutajale kui ta esmakordselt tuleb lehele. Lisaks saab sealt määrata uudiste kuvamise hulkasid. Kuna meie teenust saavad kasutada nii külalised kui ka registeeritud kasutajad siis on võimalus ka sättida uudiste uuendamise aega. Külalistele ei kuvata koheselt kõige viimaseid uudiseid vaid saab sättida ajaviidet, millest alates ta neid uuendab. Sama saab ka rakendada registreeritud kasutajatele. Lisaks saab admini liidesest hallata registreeeritud kasutajaid. Saab teha tavakasutajadid adminiks ja vastupidi. Saab kustutada userite xml-e või siis kusutada kõik xml-d. Lisaks saab kasutaja üldse ära kustada. Veel on admini alt võimalik blokeerida IP'd, et kasutajad teatud IP'ga ei saaks üldse lehele ligi. Ning viimaks on võimalus vaadata lehe kasutamise statistikat päevakaupa.

XML fail

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="xmlv1.xsl"?>
<groups>
  <group orderNr="0" minimized="false">
    <groupTitle>Ajalehed</groupTitle>
    <groupColor>LemonChiffon</groupColor>
    <!-- http://en.wikipedia.org/wiki/Web_colors#X11_color_names 
    teenus pakub väiksemat arvu värve, värvid tõlgitakse rakenduse poolt-->
    <streams>
      <stream minimized="false">
        <streamTitle>Postimees.ee uudised</streamTitle>
        <streamRSSLink>http://www.postimees.ee/rss/</streamRSSLink>
        <streamSite>http://www.postimees.ee</streamSite>
        <description>Uudised, Sport, Ilm</description>
        <unreadNews>1</unreadNews>
        <items>
          <item status="unread">
            <id>a001</id>
            <title><![CDATA[Endine Tottenhami jalgpallur suri 36-aastaselt]]></title>
            <link>http://sport.postimees.ee/?id=394365</link>
            <description><![CDATA[Tottenham Hotspuri jalgpalliklubi teatas oma koduleheküljel, et nende endine 
                                  mängumees Dean Richards suri täna hommikul raske haiguse tagajärjel. Richards 
                                  oli alles 36-aastane.]]>
            </description>
            <pubDate>Sat, 26 Feb 2011 17:15:06 +0200</pubDate>
          </item>
          <item status="read">
            <id>a002</id>
            <title><![CDATA[Gorbatšov eitab jutte Leedu «müümisest»]]></title>
            <link>http://www.postimees.ee/?id=393271</link>
            <description>
              <![CDATA[Nõukogude Liidu ekspresident Mihhail Gorbatšov lükkab ümber meedias liikuva kuulujutu sellest, 
                       nagu oleks ta Leedult Nõukogude Liidust lahkumise eest küsinud 21 miljardit rubla.]]>
            </description>
            <pubDate>Thu, 24 Feb 2011 11:40:28 +0200</pubDate>
          </item>
        </items>
      </stream>
      <stream minimized="false">
        <streamTitle>Eesti Päevaleht Online</streamTitle>
        <streamRSSLink>http://www.epl.ee/rss/</streamRSSLink>
        <streamSite>http://www.epl.ee</streamSite>
        <description>Päevalehe artiklite rss voog.</description>
        <unreadNews>0</unreadNews>
        <items>
          <item status="read">
            <id>b002</id>
            <title><![CDATA[Verhofstadt ja Ojuland: Kremlile kollane kaart!]]></title>
            <link>http://www.epl.ee/artikkel/593251</link>
            <description>
              <![CDATA[Euroopa Liberaalide ja Demokraatide Liidu fraktsiooni esimees Guy Verhofstadt ja kõneisik 
                       Venemaa küsimustes Kristiina Ojuland avaldasid täna ajalehes European Voice avaliku kirja 
                       Venemaa peaminister Vladimir Putinile, kes viibib visiidil Brüsselis.]]>
            </description>
            <pubDate>Thu, 24 Feb 2011 11:21:00 +0200</pubDate>
          </item>
        </items>
      </stream>
    </streams>
  </group>
  <group orderNr="1" minimized="false">
    <groupTitle>Tech</groupTitle>
    <groupColor>LightCyan</groupColor>
    <streams>
      <stream minimized="false">
        <streamTitle>Ars Technica</streamTitle>
        <streamRSSLink>http://feeds.arstechnica.com/arstechnica/everything</streamRSSLink>
        <streamSite>http://arstechnica.com/index.php</streamSite>
        <description>The Art of Technology</description>
        <unreadNews>1</unreadNews>
        <items>
          <item status="unread">
            <id>i0001</id>
            <title><![CDATA[Colbert Report features Ars Anonymous/HBGary coverage]]></title>
            <link>http://feeds.arstechnica.com/~r/arstechnica/everything/~3/jMUOaOUlnHw/our-anonymous-hbgary-coverage-on-colbert-report.ars</link>
            <description>
                <![CDATA[Last night, comedian Stephen Colbert featured the HBGary Federal/Anonymous hacking 
                         debacle in a long segment on his show, The Colbert Report—and Ars was proud to be 
                         featured twice in the segment. Does this make us an official "friend of the show"?
                         Colbert twice showed clips from our investigative piece Spy games: Inside the convoluted 
                         plot to bring down WikiLeaks as he described the behavior of HBGary Federal CEO Aaron Barr. 
                         (The show used a copy of the piece that ran on our sister publication, Wired.com, for the image.) 
                         Barr's decision to unmask the leaders of Anonymous was described in a particularly… evocative metaphor.]]>
              </description>
            <pubDate>Fri, 25 Feb 2011 16:35:56 -0600</pubDate>
          </item>
        </items>
      </stream>
    </streams>
  </group>
</groups>

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="groups">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="group">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="groupTitle" type="xs:string" />
              <xs:element name="groupColor" type="xs:string" />
              <xs:element name="streams">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="stream">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="streamTitle" type="xs:string" />
                          <xs:element name="streamRSSLink" type="xs:string" />
                          <xs:element name="streamSite" type="xs:string" />
                          <xs:element name="description" type="xs:string" />
                          <xs:element name="unreadNews" type="xs:unsignedByte" />
                          <xs:element name="items">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element maxOccurs="unbounded" name="item">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="id" type="xs:string" />
                                      <xs:element name="title" type="xs:string" />
                                      <xs:element name="link" type="xs:string" />
                                      <xs:element name="description" type="xs:string" />
                                      <xs:element name="pubDate" type="xs:string" />
                                    </xs:sequence>
                                    <xs:attribute name="status" type="xs:string" use="required" />
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                        <xs:attribute name="minimized" type="xs:boolean" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="orderNr" type="xs:unsignedByte" use="required" />
            <xs:attribute name="minimized" type="xs:boolean" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSLT

Esialgne versioon

<?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>
      <head>
        <style>
          h1,h2,h3
          {
          font-family:Tahoma, Geneva, sans-serif;
          margin:0;
          }
          h1
          {
          text-transform:uppercase;
          font-size:1em;
          border-bottom:1px dotted black;
          }
          h2
          {
          font-size:0.95em;
          font-weight:normal;
          }
          h3
          {
          font-size:0.9em;
          font-weight:inherit;
          }
          p
          {
          padding:0 15px;
          margin:0;
          font-family:Georgia, serif;
          font-size:0.875em;
          width:600px; /*TODO: temporary*/
          }
          .unread
          {font-weight:bold;}
          .read
          {font-weight:normal;}
          .stream
          {padding-left:5px;}
          .items
          {
          padding-left:15px;
          border-left:1px dotted black;
          }
        </style>
        <script type="text/javascript">
          function minmax (elem)
          {
            elem = document.getElementById(elem);
              if(elem.style.display == 'none'){
                elem.style.display = 'block';
              }else{
                elem.style.display = 'none';
              }
          }
        </script>
      </head>
      <body>
        <xsl:for-each select="groups/group">
          <div style="background-color:{groupColor}">
            <div id="{@ordernr}"><h1><xsl:value-of select="groupTitle"/></h1>
            </div>
            <xsl:if test="@minimized = 'false'">
              <xsl:for-each select="streams/stream">
                <xsl:if test="@minimized = 'false'">
                <div class="stream">
                  <div>
                    <h2><xsl:value-of select="streamTitle"/></h2>
                  </div>
                  <xsl:for-each select="items/item">
                    <div id="{id}" class="items">
                      <div class="{@status}" onclick="minmax('{id}desc');">
                        <xsl:value-of select="title"/>
                      </div>
                      <p id="{id}desc" style="display:none;">
                        <xsl:value-of select="description"/>&#32;
                        <a href="{link}" target="_blank">(Loe edasi)</a>
                      </p>
                    </div>
                  </xsl:for-each>
                </div>
                </xsl:if>
              </xsl:for-each>
            </xsl:if>
          </div>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

XSLT tulemus

Meilid

  • sbaikov@itcollege.ee
  • kmannil@itcollege.ee
  • msildaru@itcollege.ee
  • tsoha@itcollege.ee

Meeskonna kokkuvõttev aruanne

Mis sai valmis?

Sai loodud rss voogude kogumiseks mõeldud klientrakendus, mis läbi veebiteenuse võimaldab kasutajal soovitud funktsionaalsust kasutada. Lisaks sai loodud back-end osa, millest saab admini gruppi kuuluv kasutaja rakendust konfigureerida, kasutajaid hallata ning statistikat vaadata. Andmebaasi kasutatakse ainult kasutajate ja statistika hoidmiseks, see tõttu on ka andmebaasimudel väga väikene(2 tabelit) Valdav osa infost hoitakse xml failides. Kõik kasutaja põhised salvestatud vood asetsevad serveripoolsest xml kaustas, kust kasutaja neid pärib. Rõhusime lihtsusele ja kasutajamugavusele. Kõik vajalikud tegevused saab teha samal lehel. Lisaks siis ka admini leht, mis on mõeldud teiseks otstarbeks. Kasutaja UI tegemiks kasutasime enamasti AJAXit ning .net võimalusi. Kuna asp.neti default userite süstteem tahtis tekitada lisa andmebaasi siis tegime ka päris enda userite logimsie/authnimise/registreerimise süsteemi. Süsteemi saab kasutada erinevate rollide nii registreeritud kui ka registreerimata kasutajad.


Mida oleks paremini saanud teha ?

Oleks võinud luua ka spetsiaalse mobiilirakenduse kuid ajanappuse tõttu ei jõudnud selleni.

Õpitud teadmised / omandatud kogemused

  • WCF, Ajax
  • Klient-server rakenduse loomine
  • Meeskonnatöö
  • Aja planeerimine
  • XML, Linq

Logi

26.02.2011

Valmis esialgne versioon XML, Schema ja XML Stylesheet failist. Stylesheet faili sai lisatud lihtne näidis uudiste vaatamise funktsionaalsusest: uudise pealkirja peale vajutades ilmub pealkirja alla lühikokkuvõte, kus on ühtlasi link ka täisartikli juurde, pealkirja peale uuesti vajutades peidetakse kokkuvõte. Samamoodi hakkavad funktsioneerima ka kategooriate ja feedide pealkirjad, loodetavasti saab peitmine/näitamine ka animeeritud olema. Sellega peaks olema uudiste kuvamise üldine ehitus paigas.