Rapport Intranet til Ballonparken Svendeprøve Andreas Stjerneklar Kristensen
Indledning...3 Ballonparken...3 Problemet...3 Idé...4 Målgruppe...4 Produktionsplan...5 Design...6 Teknologivalg...7 Multi-tier kode arkitektur...7 Indhold...8 Login...8 Forside...8 Reservation...9 Information...9 Forum...10 Kategori Oversigt...10 Tråd oversigt...10 Oprettelse af ny tråd:...10 Post Oversigt...11 Klasser...12 SiteLogic...12 DataBLL...12 Data Access Layer:...13 Udviklingsmuligheder...14 Glemt brugernavn/adgangskode?...14 Original side...14 PDF upload...14 Konklusion:...14
Indledning Mit projekt fokuserer på at udvikle et Intranet til mit bosted og barndomshjem, Ballonparken. Et intranet er en teknologi, hvormed man internt i en organisation får adgang til dokumenter og tjenester via internetprotokoller. -Wikipedia Ballonparken Ballonparken har sine rødder i et militærområde der blev anlagt i 1872. Ti år efter kom de første af de røde barakker der stadig bruges i dag. Navnet kommer af, at der blev opsendt balloner for at observere artilleriets præcision. Da tyskerne besatte Danmark under anden verdenskrig var Ballonparken en af de militærbaser der led de hårdeste tab, med tre dræbte og fem sårede, i kamp mod en tysk kampvogn (denne blev også uskadeliggjort). Efter krigen blev Ballonparken gjort til et nødkollegium for boligløse mandlige provinsstuderende, men gradvis overgik den til at være et hjemsted for hippier. I 1971 blev Ballonparken en selvejende institution og også kvinder fik adgang. Ballonparken er i dag et kollektivt selvejende boligområde administreret af Fonden Ballonparken, med en bred vifte af beboere der består af alt fra jordemødre til advokater, læger og pædagoger. I alt er der cirka 100 voksne beboere. Problemet Der er sket en del ting siden 1971, men beslutningstagningsprocessen giver ikke det indtryk. Beboerdemokratiet lader til at sidde fast i hippie tiderne og debatten på de jævnlige beboermøder mangler ofte "vægt" i form at input fra et bredere segment af beboerne. Problemet er efter min mening, at beslutningstagningsprocessen i Ballonparken er eksklusiv til en sådan grad, at der sjældent er mere end 10 beboere til stede under diskussionen af beslutningerne Dette til trods for at der bor mere end 100 individer i Ballonparken. Årsagen til dette mener jeg er at finde i en række omstændigheder relateret til at holde faste, fysiske møder på frivillig basis i et åbent og ubureaukratiskt beboerdemokrati.
Idé Mit primære fokus med dette projekt er at forbedre kommunikationen i Ballonparken. Derfor vil jeg, som alternativ/supplement til beboermødet, lave et forum hvor beboerne frit, nemt og direkte hjemmefra kan debattere med hinanden om alt der har med Ballonparken at gøre. Sekundært ser jeg mange steder, hvor et intranet ville være til hjælp, så som en central informationsbank og event-management/reservation af diverse fællesrum. Grunden til at jeg specifikt har valgt at lave et Intranet og ikke et Internet, er delvist at den funktionalitet jeg vil tilbyde kun er relevant for beboere, og delvist at Ballonparken ikke har brug for at markedsføre sig selv. Der er allerede en alt for lang venteliste til boligerne. Målgruppe Målgruppen er, meget logisk for et intranet, organisationen der skal serviceres. I Ballonparkens tilfælde er denne gruppe ret lille og statisk. Ballonparken vokser ikke - der er ingen udvidelsesmuligheder og beboerne flytter ikke ofte derfra. En fuldkommen succes ville være at alle beboere bruger intranettet, men her snakker vi stadig om maksimum ca. 100 personer, der bor i samme område. Da et stort segment af målgruppen ikke har stor IT erfaring skal sitets design være enkelt og overskueligt, for ikke at gøre teknikken til en afskrækkende faktor i forsøget på at udbrede beboerdemokratiet.
Produktionsplan: 8. 12. november: Planlægning Problemformulering, tidsplan, research. 15.-18. november: Produktion Site opsætning, Design, Forum, Reservation og Artikler 22. 26. november: Rapportskrivning 29. november 3. december: Test, fremlæggelse for AABs IT afdeling, færdiggørelse, aflevering.
Design: Layoutmæssigt har jeg forsøgt at holde alting så simpelt som muligt og brugt ret store fonte for at fremme tilgængelighed. Farverne på sitet tager udgangspunkt i grønne nuancer, noget der går igen i Ballonparkens miljø i døre, buske og træer. Baggrunden er hvid, for overskuelighedens skyld. Det virker som en behagelig farvesammensætning for mig personligt og jeg har fået positiv feedback fra testpersoner. Banneret er inspireret af et billede fundet på Wikipedias artikel om Ballonparken. (se bilag 1 for original og udvikling)
Teknologivalg: Sitet er kodet i ASP.net og C#(C-Sharp) Grunde til dette valg kan findes blandt andet i det helstøbte udviklingsmiljø der leveres af eksempelvis Visual Web Developer, med intellisense, query analyser, database diagram, XSD datasets, debugging ect. Jeg har desuden i min research stødt på mange udsagn om, at.net er mere populært i erhvervssektoren og i størrere firmaer. Mange danske CMS systemer bruger ligeledes.net, eg Sitecore, Umbraco og Tangora Multi-tier kode arkitektur N-tier er en måde at opdele en web applikation i lineært forbundne lag. En af de centrale temaer I N-tier er, at et lag udelukkende kommunikerer med forbundne lag, og ikke udenom. Hvis jeg for eksempel vil hente alle brugere ud, må jeg ikke kalde direkte til databasens tabeller fra den side, hvor jeg har brug for dataene. I stedet får jeg dataene igennem logic lagets klasser. Dette strømliner databehandling og gør genbrug af funktionalitet nemmere. Diagram over N-tier modellen (fra Wikipedia). For mere om N-Tier: http://en.wikipedia.org/wiki/multitier_architecture
Indhold: Login: Da sitet er struktureret som et intranet, er det første der sker når en bruger går til adressen, at vedkommende bliver præsenteret for en Login skærm. Der er med vilje ikke lavet nogen mulighed for at selv-oprette en bruger, fordi brugerbasen er relativt konstant og tilmed geografisk baseret; derfor mener jeg at husomdeling af brugernavne og adgangskoder er mere passende. Forside: På denne side vises de seneste site nyheder, hvornår næste beboermøde afholdes, og en introduktionstekst til sitet der oplyser om features.
Reservation På denne side kan brugeren reservere udvalgte Ressourcer indenfor et givent tidsrum. Brugeren vælger en startdato og en slutdato igennem en ASP:Calendar kontrol. Hvis den valgte ressource er ledig oprettes en reservation, ellers vises de reservationer der blokerer de valgte datoer. Checket af datoerne som brugeren har valgt sker igennem et hjernevridende SQL kald. SELECT FROM WHERE id, fk_user_id, fk_resource_id, startdate, enddate Event (fk_resource_id = @resid) AND (startdate <= @startdate) AND (enddate >= @startdate) OR (fk_resource_id = @resid) AND (startdate <= @enddate) AND (enddate > @enddate) OR (fk_resource_id = @resid) AND (startdate > @startdate) AND (enddate < @enddate) OR (fk_resource_id = @resid) AND (startdate = @startdate) AND (enddate = @enddate) Hvis SQL kaldet finder noget så vises det til brugeren som de blokerende events der forhindrer brugerens reservation. På grund af kompleksiteten af dette kald tegnede jeg et diagram over de cases der skal testes: 1: begge datoer bruger vælger er før startdato: intet findes, reservation oprettes. 2: valgt slutdato er startdato på et eksisterende event, dette event findes. 3: valgt startdato er startdato på event, dette event findes. 4: begge datoer er mellem eksisterende events start og slut datoer, dette event findes. 5: valgt slutdato er slutdato på eksisterende event, dette findes. 6: valgt startdato er slutdato på event, dette event findes. 7: begge datoer bruger vælger er efter slutdato: intet findes, reservation oprettes. 8: valgt slutdato er efter eksisterende startdato og før eksisterende slutdato, dette event findes. 9: valgt startdato er før eksisterende slutdato og efter eksisterende startdato, dette event findes. 10: begge datoer er identiske med et eksisterende events datoer, dette event findes. 11: valgt startdato er før eksisterende startdato og valgt slutdato er efter eksisterende slutdato, dette event findes. Yderligere validering sker før SQL kald, eksempelvis check på om bruger har valgt en slutdato der ligger tidligere end startdato. Information Her kan brugere finde information om Ballonparken så som regelsæt, kontakt info, ect. Dette segment af sitet genbruger forum strukturen bag scenen : Information er en forum kategori, og hver artikel er en tråd. Andre brugere kan kommentere artiklerne, ligesom de kan svare på en tråd
Forum: Kategori Oversigt Bruger vises de kategorier han kan tilgå. Dette sker vha en SQL-select på kategorier med weight mindre eller lig med brugers session weight (taget fra brugers user role weight ved login). Tråd oversigt Bruger vises de aktive (ikke slettede) tråde i den valgte kategori. Oprettelse af ny tråd: Muligheden for at oprette en tråd er tilgængelig på Tråd-oversigts nivauet. protected void createthread(object sender, EventArgs e) { //insert tråd og sæt dennes værdi til retur værdien på insertreturnid methoden, hvilket giver os ID'et på den nye tråd threadbll tbll = new threadbll(); int newthread; newthread = tbll.insertreturnid(textboxtitle.text, Convert.ToInt32(Request.QueryString["cat"])); //insert post PostBLL pbll = new PostBLL(); pbll.insert(convert.toint32(session["user_id"]), newthread, TextBoxContents.Text.ToString(), DateTime.Now); //reload data & reset fields Repeater_Threads.DataSource = tbll.selectbycategoryid(convert.toint32(request.querystring["cat"])); Repeater_Threads.DataBind(); TextBoxContents.Text = ""; TextBoxTitle.Text = ""; FS_createthread.Visible = false; } Når en tråd oprettes gøres det med en speciel insert metode, der returnerer værdien af den nye tråds ID felt. Dette ID bliver brugt til at inserte den tilhørende post i tråden.
Dato-Sortering af tråde skete tidligt i projektet udfra trådens creationdate vha et specialiseret SQL kald, men jeg valgte at fjerne creationdate fra tråde da det gik op for mig at mange informationer gik igen imellem mine tråd og post objekter. Da den første post i en tråd altid oprettes i samme omgang som tråden, tilføjede jeg et Firstpost Post objekt til mit Tråd objekt. Dette betyder at i stedet for at alle tråde har creationdate og en user author, henter jeg disse værdier ud fra trådens firstpost post objekt, og firstposts user author objekt. Post Oversigt Her vises ikke-slettede posts i den valgte tråd. Hvis brugeren har ejerskab over en post, eller er administrator, vises mulighed for at slette posts eller tråd.
Klasser Klasserne i mit Logic Layer er opdelt i to Namespaces: SiteLogic Håndterer site funktionalitet og er yderligere opdelt i klasserne Navigation (menu indhold og logik), Security (login og rollestyring, se bilag) og Statistics (Statistikker). DataBLL Håndterer og definerer data-objekter i én-til-én forhold med database tabeller. Er inddelt efter objekt Visse objekter indeholder andre objekter, mit yndlings eksempel er min User constructor, der kun behøver et user id for at hente et user objekt, der også indeholder instanser af brugerens rolle og room klasser, ligeledes hentede som objekter udfra ID'er fra user objektet. //opret bruger udfra user id public User(int userid) { UserBLL ubll = new UserBLL(); User userobj = ubll.objectbyid(userid); _id = userobj.id; _name = userobj.name; _password = userobj.password; _email = userobj.email; _fk_role_id = userobj.roleid; _fk_room_id = userobj.roomid; _imagename = userobj.imagename; RoomBLL rbll = new RoomBLL(); _room = rbll.objectbyid(userobj.roomid); RoleBLL robll = new RoleBLL(); } _role = robll.objectbyid(userobj.roleid); Resultatet af dette er at jeg kan kalde en brugers rolle navn frem bare ved at instansiere userklassen, lave en user/samling af users udfra en af userklassens metoder og sætte denne til hvad det skal være... eg: UserBLL ubll = new UserBLL(); User userobj = new User(qs); Label_UserRoleName.Text = userobj.role.name; I dette eksempel med en string value fra objektet der bruges som text behøver jeg heller ikke konvertere værdien. Alternativet jeg plejede at bruge, var at at håndkode flere SQL kald efter hinanden og hive ud fra datatable rows, hvilket kræver en masser arbejde mange steder. Med objekt klasser bygger man et kompliceret system til at levere data, der leverer dataene på en nem måde alle andre steder.
Data Access Layer: DAL er laget der håndterer hentning og behandling af data. Dette sker via et strongly typed dataset der indeholder standardiserede sql kald for alle tabeller I løsningen. Udfra dette bliver en TableAdapter klasse skabt for hver tabel. Wizarden laver per default den simple fill/get metode, men det står én frit for at tilføje flere metoder til datahåndtering. Disse TableAdapters er den eneste måde jeg interagerer med mine databaser. Mit Data Access Layer
Udviklingsmuligheder: Glemt brugernavn/adgangskode? Giv mulighed for at brugeren kan indtaste en email adresse, og hvis denne findes i databasen, modtage en mail på denne adresse med login detaljer. Status: Jeg har email på brugere, men da mit site endnu ikke er online har jeg ikke mulighed for at teste funktionaliteten. Original side Hvis bruger bliver redirected fra en adgangsbeskyttet side pga. manglende session data, bliver den side brugeren var på opbevaret i en querystring. Når brugeren logger på igen bliver han redirectet til siden han prøvede at komme ind på, i stedet for at ryge til forsiden. Status: Mine masterpages gør deres del ved at sende brugeren til login siden med den side der redirectes fra I querystring, men login funktionen giver en fejl mht. at redirecte til siden. Tidsbegrænsninger samt at funktionaliteten ikke er essentiel har dog tvunget mig til at droppe dette for nu. PDF upload Upload af pdf vil også være en oplagt udviklingsmulighed. Det ville gøre distribution af referater og andre dokumenter langt enklere. Konklusion: Jeg har efter planen udviklet et intranet site med forum og event management. Der mangler stadig nogle detaljer før sitet er fuldstændig funktionsdygtigt til brug af Ballonparkens beboere, men den overordnede site struktur er velopbygget. De testpersoner jeg har brugt finder sitet overskueligt og let tilgængeligt. Jeg tror derfor på at mit ønske om at styrke beboerdemokratiet gennem dette intranet kan lykkes. ase