4.4 KiB
Übungszettel 9
Pushen Sie nach der Bearbeitung jeder Aufgabe Ihre Ergebnisse.
Issue 1
a) Führen Sie in Ihrem Übungsverzeichnis die folgenden Befehle aus.
Yesod-Grundgerüst initialisieren:
$ stack new NAMEIHRESWEBPROJEKTS --bare yesod-sqlite
Kompilieren mit yesod:
$ stack build yesod-bin
Starten des Servers:
$ stack exec -- yesod devel
Öffnen Sie einen Browser mit der Domain http://localhost:3000/
. Wenn alles geklappt hat, sollten Sie hier bereits die Möglichkeit haben, sich mit einem Dummy-Account einzuloggen und eine Profilseite zu öffnen.
b) In config/models
werden alle Entitäten definiert, die Ihre Datenbank kennen soll. Diese soll nun im Hinblick auf Issue 2-4 angepasst werden. Die dafür nötigen Entitäten sind in einem Entity-relationship model festgehalten, welches Sie in der Datei ERModel.pdf finden.
-
Verschieben Sie das mitgegebene Modul
MyTypes.hs
in densrc/
-Ordner und importieren Sie es in derModel.hs
-
Pflegen Sie die Entitäten aus ERModel.pdf sinnvoll in
config/models
ein.
Hinweise:
-
Für jede Entität werden automatisch Id-Typen definiert (z.B.
UserId
für die EntitätUser
). -
Das Attribut
ident
ist der Name des Nutzers. -
Wenn Sie selber definierte Typen verwenden wollen, um die Ausprägungen eines Entity-Feldes festzulegen, definieren Sie diese in der mitgegebenen Datei
MyTypes.hs
. -
Für textuelle Felder, nutzen Sie den Typ
Text
. Falls ein Feld auch leer sein darf, fügen Sie einMaybe
hinzu.
Issue 2
Neues Feature: Timeline für alle Nutzer. Auf der Seite All Users
sollen alle jemals eingelogten Nutzer angezeigt werden. Mit einem Klick auf einen Nutzernamen wird man auf die zugehörige Timeline
weitergeleitet. Auf der Timeline muss erst einmal nichts weiter stehen außer der Titel: "USERNAME's Timeline".
config/routes
: Erstellen Sie die folgenden Routen:
/timeline/#UserId UserTimelineR GET
/userList UserListR GET
-
Foundation.hs
:- Ergänzen Sie die Funktionen, in denen auf Routen-Konstruktoren pattern-gematcht wird.
- Die Routen
UserListR
undUserTimelineR
sollen nur für autorisierte (d.h. eingeloggte) Nutzer sichtbar sein. - Sorgen Sie dafür, dass
UserListR
über den Menüpunkt "All Users" erreichbar ist (siehe MenuItem in defaultLayout).
-
src/Handler/
:- Kopieren Sie die vorgegebenen Handler-Module
UserTimeline.hs
undUserList.hs
hier hin.
- Kopieren Sie die vorgegebenen Handler-Module
-
templates/
: Man kann hamlet-Code für Widgets etc. auch in template-Files auslagern. Diese werden hier gespeichert.- Kopieren Sie die vorgegebenen Template-Dateien
UserTimeline.hamlet
undUserList.hamlet
hier hin.
- Kopieren Sie die vorgegebenen Template-Dateien
-
.cabal
: Fügen Sie die Handler alsexposed-module
hinzu. -
src/Application.hs
: Importieren Sie die neuen Handler. -
src/Handler/UserList.hs
/src/Handler/UserTimeline.hs
bzw.templates/UserTimeline.hamlet
/templates/UserList.hamlet
:- Bearbeiten Sie die TODOs zu Issue 2.
Issue 3
Neues Feature: Posten auf der eigenen Timeline. Jeder Nutzer soll nun auf seiner eigenen Timeline
-Seite Nachrichten mit anderen teilen können.
- Legen Sie hierfür in
config/routes
die neue Route an:
/timeline TimelineR GET POST
- Kopieren Sie
Timeline.hs
undtimeline.hamlet
ins Handler- bzw. Templates-Verzeichnis. - Die Route
TimelineR
soll für autorisierte Nutzer über einen extra Menüpunkt "Your Timeline" erreichbar sein. Führen Sie die nötigen Änderungen in.cabal
,Foundation.hs
undApplication.hs
durch. - Bearbeiten Sie die Aufgaben in
Timeline.hs
undtimeline.hamlet
.
Issue 4
Never gonna give U up, never gonna let ya down – Friendship :D
Die Seite All Users
soll nun auch erlauben, Freundschaftsanfragen abzuschicken, abzulehnen. Auf dieser soll man einem Nutzer eine Freundschaftsanfrage stellen können. Es soll erkenntlich sein, mit wem man bereits befreundet ist. Man soll nur die Timelines befreundeter Nutzer besuchen können.
Implementieren Sie einen postUserlistR
-Funktion, die dies erledigt. Um Information an POST zu senden, können Sie eine Form mit einem hiddenField
einsetzen. In diesem hiddenField
können Sie dann die im Falle des Aufrufs von postUserlistR
gewünschte Information hinterlegen.
Beispiel:
hiddenUIDForm :: UserId -> Form UserId
hiddenUIDForm uid = renderDivs $ areq hiddenField "" (Just uid)