From d32326bfda830617871daee93caef734ccdd59bc Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 28 Aug 2017 23:56:21 +0200 Subject: [PATCH] finalize the documentation --- doku/bib.bib | 34 ++++- doku/content.tex | 235 +++++++++++++++++++++++++-------- doku/screenshots/dashboard.png | Bin 0 -> 10570 bytes doku/screenshots/login.png | Bin 0 -> 1883 bytes 4 files changed, 206 insertions(+), 63 deletions(-) create mode 100644 doku/screenshots/dashboard.png create mode 100644 doku/screenshots/login.png diff --git a/doku/bib.bib b/doku/bib.bib index ddcaa3f..3e119b2 100644 --- a/doku/bib.bib +++ b/doku/bib.bib @@ -1,7 +1,7 @@ @misc{dbcs1, Day = {24}, Month = {05}, - Note = {https://stackoverflow.com/questions/10740293/insert-an-insertion-date-value-into-a-sql-table-automatically}, + Note = {\url{https://stackoverflow.com/questions/10740293/insert-an-insertion-date-value-into-a-sql-table-automatically}}, Urldate = {2017-07-24}, author = {Wheat Mitch}, title = {Insert an {``}insertion date{''} value into a SQL table automatically?}, @@ -12,7 +12,7 @@ @misc{dbcs2, Day = {20}, Month = {07}, - Note = {http://excel2latex.com/}, + Note = {\url{http://excel2latex.com/}}, Urldate = {2017-07-24}, author = {Wood Eric}, title = {excel => LaTeX}, @@ -23,7 +23,7 @@ @misc{dbcs3, Day = {26}, Month = {07}, - Note = {https://tex.stackexchange.com/questions/133/how-can-i-make-a-table-that-takes-up-more-than-a-single-page}, + Note = {\url{https://tex.stackexchange.com/questions/133/how-can-i-make-a-table-that-takes-up-more-than-a-single-page}}, Urldate = {2017-07-24}, author = {Vanden}, title = {How can I make a table that takes up more than a single page?}, @@ -32,7 +32,7 @@ } @misc{dbcs4, - Note = {http://www.personal.ceu.hu/tex/footnote.htm}, + Note = {\url{http://www.personal.ceu.hu/tex/footnote.htm}}, Urldate = {2017-07-24}, author = {Central European University}, title = {LaTeX Footnotes}, @@ -43,7 +43,7 @@ @misc{dbcs5, Day = {28}, Month = {02}, - Note = {https://iamtimcorey.com/csharp-sql-data-access/}, + Note = {\url{https://iamtimcorey.com/csharp-sql-data-access/}}, author = {Tim Corey}, title = {C\# Data Access: SQL Database}, year = {2017}, @@ -53,9 +53,29 @@ @misc{dbcs6, Day = {20}, Month = {07}, - Note = {https://github.com/StackExchange/Dapper}, + Note = {\url{https://github.com/StackExchange/Dapper}}, author = {StackExchange}, title = {Dapper - a simple object mapper for .Net}, year = {2017}, tags = "db_case-study" -} \ No newline at end of file +} + +@misc{dbcs7, + Day = {{27}}, + month = {{08}}, + note = {\url{{https://de.wikipedia.org/wiki/Anwendungsfalldiagramm}}}, + author = {Wikipedia}, + title = {{Anwendungsfalldiagramm {--} Wikipedia}}, + year = {2017}, + tags = "db_case-study" +} + +@misc{dbcs8, + Day = {{27}}, + month = {{08}}, + note = {\url{{https://de.wikipedia.org/wiki/Anwendungsfall}}}, + author = {Wikipedia}, + title = {{Anwendungsfall {--} Wikipedia}}, + year = {2017}, + tags = "db_case-study" +} diff --git a/doku/content.tex b/doku/content.tex index 8130c3a..97d1959 100644 --- a/doku/content.tex +++ b/doku/content.tex @@ -16,7 +16,7 @@ Folgende Stakeholder sind in diesem Projekt zu berücksichtigen: \item Marktbesucher \end{itemize} -Diagramm (\ref{fig:stakeholder}) zeigt die Beziehung der Stakeholder +Abbildung: (\ref{fig:stakeholder}) zeigt die Beziehung der Stakeholder zum Projekt noch grafisch auf. \begin{figure} @@ -67,6 +67,11 @@ werden. \newpage \section{User Stories} +User Stories sind sind eine in Alltagsprache geschriebenen +Software-Anforderungen. Sie sind bewusst kurz gehalten und +beschreiben die Wünsche und Ziele der Rollen welche die +Software verwenden. + \subsection{Verwaltung} Als Plattforminhaber möchte ich, \begin{itemize} @@ -107,14 +112,76 @@ Als Marktbesucher möchte ich, \newpage \section{Use Cases} +Ein Use Case sammelt alle möglichen Szenarien, die eintreten können, +wenn ein Akteur versucht, mit Hilfe des betrachteten Systems ein +bestimmtes Ziel zu erreichen. Dabei beschreibt er was beim Versuch der +Zielerreichung passieren kann. Je nach Ablauf kann auch ein Fehlschlag +ein Ergebnis eines Anwendungsfalls sein (e.g. falsches Passwort beim +Login). Dabei wird die technische Lösung nicht konkret beschrieben. +Die Detailstufe kann dabei sehr unterschiedlich sein. \subsection{Use Case Diagramm} +``Ein Anwendungsfalldiagramm ... ist eine der 14 Diagrammarten der +Unified Modeling Language (UML), einer Sprache für die Modellierung +der Strukturen und des Verhaltens von Software- und anderen Systemen. +Es stellt Anwendungsfälle und Akteure mit ihren jeweiligen +Abhängigkeiten und Beziehungen dar.''\cite{dbcs7} -\subsection{Use Cases} +Wir verschaften uns dabei mit einem Use Case Diagramm, zu sehen in +Abbildung: (\ref{fig:use_case}), zuerst einen groben Überblick über +die Use Cases und wie sie zusammenhängen. + +\subsection{Use Cases Detailbeschreibungen} +Für die Ausarbeitung der C\# Applikation haben wir uns für 5 Use Cases +entschieden und diese in einer Use Case Schablone von Alistair +Cockburn im Detail ausgearbeitet und beschrieben haben. Die Alistair +Cockburn Schablone gibt eine gute Vorgabe für den Inhalt der Use Case +Beschreibung. + +\subsubsection{Lösungsvarianten} + +Wir wollen hier auch noch darauf eingehen welche Varianten wir uns +überlegt haben und wieso wir uns am Ende für die nachfolgenden 5 Use +Cases entschieden haben. Dabei war es uns besonders wichtig das bei +den Use Cases, Daten aus der Datenbank ausgelesen sowie auch +geschreiben werden müssen. + +Wir haben uns dabei zu Beginn die folgenden drei möglichen Szenarien +überlegt: +\begin{itemize} +\item Login und Registrierung einer Person. +\item Lösen eines Abonnements. +\item Mieten eines Standorts. +\end{itemize} + +\paragraph{Login und Registrierung einer Person.} + +Bei dieser Lösungsvariante würde der komplette Registrierungsprozess +abgebildet werden. Dabei würden auch die Adressdaten etc. der Person +erfasst werden. +\paragraph{Lösen eines Abonnements.} + +Das Lösen eines Abonnements würde behinhalten das eine bestehende +Person eines der verschiedenen Abonnemente anschauen, auswählen und +anschliessend ``kaufen'' könnte. + +\paragraph{Mieten eines Standorts.} + +Beim Mieten eines Standortes könnte ein Mitglied die Marktstandorte +einsehen, auswählen und sich dort einen Spot reservieren. + +\paragraph{Gewählte Variante} + +Schlussendlich haben wir uns dafür entschieden einen Login und die +Registrierung umzusetzen. Allerdings haben wir beschlossen das wir uns +darauf beschränken ein Mitglied nur mit einer Email Adresse und einem +Passwort zu erfassen. Zusätzlich schien uns das Mieten eines Standorts +noch eine gute Funktion um eine Teilfunktion der Applikation +abzubilden. \begin{landscape} -\begin{figure}[H] +\begin{figure} \centering \includegraphics[height=0.9\textheight]{diagrammes/use_cases.png} \caption{Use Case Diagramm\label{fig:use_case}} @@ -393,18 +460,50 @@ Haben die Länder und Städte Listen bereits komplett zu erstellen. \\ \hline \section{Umsetzung} -\subsection{Lösungsvarianten} - \subsection{Zusammenarbeit} +Zur Zusammenarbeit am Code haben wir uns für Git entschieden. Dies +ermöglichte es uns gleichzeitig am Code zu arbeiten und zwischendurch +die Änderungen des anderen zu ``mergen''. Dies war von grossem Vorteil +da wir so unabhängig voneinander am Code weiterarbeiten konnten. So +entstanden insgesammt über 150 Commits. -\subsection{ERM} +Desweiteren haben wir uns die Arbeit so aufgeteilt damit wir möglichst +unabhängig voneinander arbeiten konnten und somit nicht aufeinander +warten mussten. -\subsection{RM/SQL} +Andreas hat sich Hauptsächlich mit den SQL Scripts beschäftigt. +Parallel dazu konnte sich Ismail in das Schreiben einer grafischen C\# +Applikation einlesen. Sobald die SQL Skripte fertig waren konnte +Ismail diese nutzen um die Applikation fertig zu stellen. + +Die Dokumentation wurde dabei fortlaufen erweitert. Da wir die +Dokumentation in \LaTeX geschrieben haben und somit auch nur aus +simplen Textdateien besteht konnten wir auch an dieser ohne Probleme +gleichzeitig arbeiten und über Git versionieren. + +\subsection{ER Modell und ER Diagramm} +Gleich zu Beginn des Projektes haben wir den Text zur Aufgabenstellung +eingehend analysiert und daraus ein Entity-Relationship-Modell(ERM), +Abbildung: (\ref{fig:rm}) erstellt. + +Wir haben dabei darauf verzichtet für jede Entität noch die jeweiligen +Attribute einzuzeichnen da wir uns mit dem ERM Hauptsächlich einen +Überblick über die Situation verschaffen wollten damit wir die +Abhängigkeiten zwischen den Entitäten besser nachvollziehen konnten. + +Im Anschluss wurden dann das Entity-Relationship-Diagramm(ERD), +Abbildung: (\ref{fig:erm}) erstellt. Dies wurde mit allen Details +erstellt. Im ERD haben wir auch Eigenschaften von Attributen erfasst +welche in der exportieren Übersicht hier in der Dokumentation nicht +ersichtlich sind, wie etwa ``Unique'', ``Not Null'', etc. Aus dem ERD +konnten dann relativ schnell die SQL Scripts abgeleitet werden. + +\subsection{SQL Datenbank} Nachfolgend werden die Entitäten der Datenbank kurz beschrieben damit -das ERM Diagramm (\ref{fig:erm}) besser verstanden werden kann. Dabei -wird zuerst der Name der Tabelle in der Datenbank aufgelistet gefolgt von der -deutschen Übersetzung. +das ERD Diagramm, Abbildung: (\ref{fig:erm}) besser verstanden werden +kann. Dabei wird zuerst der Name der Tabelle in der Datenbank +aufgelistet gefolgt von der deutschen Übersetzung. \paragraph{persons / (Personen)} Sind die Repräsentation einer realen Person in der Datenbank. Hier @@ -487,7 +586,7 @@ Interessengruppen anzupassen. \begin{figure} \centering \includegraphics[height=0.8\textheight]{diagrammes/rm.png} - \caption{ERM Diagramm\label{fig:rm}} + \caption{Entity-Relationship-Modell\label{fig:rm}} \end{figure} \end{landscape} @@ -496,7 +595,7 @@ Interessengruppen anzupassen. \begin{figure} \centering \includegraphics[scale=0.38]{diagrammes/erm.png} - \caption{RM Diagramm\label{fig:erm}} + \caption{Entity-Relationship-Diagramm\label{fig:erm}} \end{figure} \end{landscape} @@ -531,7 +630,7 @@ Hier werden alle eingesetzten Klassen der Applikation vorgestellt und definiert. Zu jeder Klasse gibt es eine passende Grafik welche ihre Methoden und -Attribute beschreibt. Nachfolgend habe wir eine Beispiel Grafik +Attribute beschreibt. Nachfolgend habe wir eine Beispiel Grafik, Abbildung: (\ref{fig:class_example}) eingefügt welche die Symbole und den Aufbau beschreibt. @@ -554,53 +653,73 @@ definiert werden und kann dann durch die Helper.cs Klasse simpel aufgerufen werden. \paragraph{LoginForm} -Diese Klasse wurde für das Registrieren und Einloggen des Benutzers -mit einem dazugehörigen GUI von uns erstellt. Dadurch können sich +Diese Klasse, Abbildung: (\ref{fig:login_class}) wurde für das +Registrieren und Einloggen des Benutzers mit einem dazugehörigen GUI, +Abbildung: (\ref{fig:login}), von uns erstellt. Dadurch können sich Benutzer durch das Eingeben der Email-Adresse und des Passwortes mit -dem ``Register-Button'' Registrieren und durch ein zweites eingeben der -Daten und betätigen des ``Login-Button'' auch gleich einloggen. Nach dem -Login wird auch gleich eine Nachricht der Applikation dem Benutzer mit -dem Text ``It worked'' aufgezeigt, um den erfolgreichen Login zu melden. -Dadurch möchten wir die Funktion des Einfüllens und Lesen der Daten aus -der Datenbank aufzeigen. +dem ``Register-Button'' Registrieren und durch ein zweites eingeben +der Daten und betätigen des ``Login-Button'' auch gleich einloggen. +Nach dem Login wird auch gleich eine Nachricht der Applikation dem +Benutzer mit dem Text ``It worked'' aufgezeigt, um den erfolgreichen +Login zu melden. Dadurch möchten wir die Funktion des Einfüllens und +Lesen der Daten aus der Datenbank aufzeigen. \begin{figure}[H] \centering \includegraphics[scale=0.7]{diagrammes/loginform.png} \caption{LoginForm Klasse} + \label{fig:login_class} +\end{figure} + +\begin{figure}[H] + \centering + \frame{\includegraphics[scale=0.7]{screenshots/login.png}} + \caption{Screenshot der LoginForm} + \label{fig:login} \end{figure} \paragraph{Dashboard} -Auf dem Dashboard haben wir den Kern was Informationen herauslesen und -wieder Eingeben belangt, erstellt. In dieser Klasse werden die aus der -Datenbank herausgelesenen Daten der ``locations'' und ``rents'' -Tabellen im GUI aufgezeigt und /oder eingefügt. Damit möchten wir -einen Teil der finalen Applikation und Datenbank abbilden mit dem, die -Benutzer Standorte heraussuchen und den Mietbeginn eingegeben können. -Um unsere Demo-Applikation simpel zu halten, kann ein Mitglied nach -dem Registrieren und Einloggen die vom Verwalter hinzugefügten -Standorte heraussuchen, sie dann in unsere Mietbox schieben und nach -dem wählen des gewünschten Zeitpunktes den Standort mieten. +Auf dem Dashboard, Abbildung: (\ref{fig:dashboard_class}), haben wir +den Kern was Informationen herauslesen und wieder Eingeben belangt, +erstellt. In dieser Klasse werden die aus der Datenbank +herausgelesenen Daten der ``locations'' und ``rents'' Tabellen im GUI, +Abbildung: (\ref{fig:dashboard}) aufgezeigt und /oder eingefügt. Damit +möchten wir einen Teil der finalen Applikation und Datenbank abbilden +mit dem, die Benutzer Standorte heraussuchen und den Mietbeginn +eingegeben können. Um unsere Demo-Applikation simpel zu halten, kann +ein Mitglied nach dem Registrieren und Einloggen die vom Verwalter +hinzugefügten Standorte heraussuchen, sie dann in unsere Mietbox +schieben und nach dem wählen des gewünschten Zeitpunktes den Standort +mieten. \begin{figure}[H] \centering \includegraphics[scale=0.7]{diagrammes/dashboard.png} \caption{Dashboard Klasse} + \label{fig:dashboard_class} +\end{figure} + +\begin{figure}[H] + \centering + \frame{\includegraphics[width=0.9\textwidth]{screenshots/dashboard.png}} + \caption{Screenshot des Dashboards} + \label{fig:dashboard} \end{figure} \paragraph{DataAccess} -Mit der DataAccess Klasse konnten wir nahezu alle Datenbank relevanten -Funktionen, die in unserem GUI ausgeführt werden, in einer einzigen -Klasse abbilden. Darin haben wir den Aufruf der Datenbanktabellen mit -den dazu benötigten SQL - Befehlen ausgeführt. Dadurch wird SQL- Code -so gut wie nur in dieser Klasse aufgerufen und diesbezüglich -verwendet. Unter anderem wird auch der Login des Benutzers darin -geprüft. +Mit der DataAccess Klasse, Abbildung: (\ref{fig:dataaccess}) konnten wir +nahezu alle Datenbank relevanten Funktionen, die in unserem GUI +ausgeführt werden, in einer einzigen Klasse abbilden. Darin haben wir +den Aufruf der Datenbanktabellen mit den dazu benötigten SQL - +Befehlen ausgeführt. Dadurch wird SQL- Code so gut wie nur in dieser +Klasse aufgerufen und diesbezüglich verwendet. Unter anderem wird auch +der Login des Benutzers darin geprüft. \begin{figure}[H] \centering \includegraphics[scale=0.7]{diagrammes/dataaccess.png} \caption{DataAccess Klasse} + \label{fig:dataaccess} \end{figure} \paragraph{Get-``Klassen''} @@ -611,33 +730,38 @@ sie abbilden. Damit nehmen die dazu benötigten Spalten der jeweiligen Tabellen entgegen. Danach werden die benötigten Datensätze mit den ``Methoden-Infos'' der derweiligen Klasse aufgerufen. -Die ``GetMembers'' Klassen wird für die Registration und den Login der -Mitglieder benötigt: +Die ``GetMembers'' Klasse, Abbildung: (\ref{fig:getmembers}), wird für +die Registration und den Login der Mitglieder benötigt: \begin{figure}[H] \centering \includegraphics[scale=0.7]{diagrammes/getmembers.png} \caption{GetMembers Klasse} + \label{fig:getmembers} \end{figure} -Die ``GetRents'' Klasse für`s Mieten und Abbilden der jeweiligen Märkte: - -\begin{figure}[H] - \centering - \includegraphics[scale=0.7]{diagrammes/getrents.png} - \caption{GetRents Klasse} -\end{figure} - -Die ``GetLocations'' Klasse für das Herauslesen der Märkte um dem Mitglied alle -im Moment hinzugefügten Mietoptionen darzubieten: +Die ``GetLocations'' Klasse, Abbildung: (\ref{fig:getlocations}), für +das Herauslesen der Märkte um dem Mitglied alle im Moment +hinzugefügten Mietoptionen darzubieten: \begin{figure}[H] \centering \includegraphics[scale=0.7]{diagrammes/getlocations.png} \caption{GetLocations Klasse} + \label{fig:getlocations} \end{figure} -\subsubsection{Problematik} +Die ``GetRents'' Klasse, Abbildung: (\ref{fig:getrents}), für`s Mieten +und Abbilden der jeweiligen Märkte: + +\begin{figure}[H] + \centering + \includegraphics[scale=0.7]{diagrammes/getrents.png} + \caption{GetRents Klasse} + \label{fig:getrents} +\end{figure} + +\subsubsection{Probleme} \begin{itemize} \item Verbindungsaufbau @@ -646,13 +770,13 @@ im Moment hinzugefügten Mietoptionen darzubieten: \item Insert Data Nach den ersten Test's wurde uns klar, dass wir ein Problem mit - den jeweiligen ID's hatten. Der Fehler kam erst ans Licht, als wir - anfingen die jeweiligen ''locations und ''members''- ID's durch das - GUI einzufügen. + der weitergabe der ID's hatten. Der Fehler kam erst ans Licht, als wir + anfingen die jeweiligen ``locations'' und ``members''- ID's durch das + GUI einzufügen. Gelöst wurde das ganze mit einer statischen Klasse. \end{itemize} -\subsubsection{Referenzen und Addons/ Packages} +\subsubsection{Addons/ Packages} Dapper \cite{dbcs6} ist ein simpler ``object mapper'' für .NET. Wir nutzen ihn anstelle von einem ADO.NET data reader da er nütziche Erweiterungen bei unserer IDbConnection bietet, indem er @@ -670,7 +794,6 @@ Dapper erweitert unsere IDbConnection verwendung mit mehreren Methoden wie : \end{itemize} Weiter Infos unter : http://dapper-tutorial.net/dapper - \newpage \begin{landscape} \section{Testfälle} diff --git a/doku/screenshots/dashboard.png b/doku/screenshots/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..3a127555d83d66b2373bd4eef312ee57ff396dde GIT binary patch literal 10570 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 literal 0 HcmV?d00001 diff --git a/doku/screenshots/login.png b/doku/screenshots/login.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7a03c1c5077caf20252049d5214fdbdd90ffd6 GIT binary patch literal 1883 zcmdT_X;c$e7!8P?L<(3$L9xV?y?fvL?)~1IxpV|? zr?PtEY7`2kVh9@=~WoM=zQ?$N=;zphWUI{$X`$DziIsk1;Wm!BY!y`5!7 zvv~V8Eo-zB+`gHUz^?p?BT-|*mR$ZSJn=C!5F;>S>@MwDxOcTg>f`B&o%Bt;ROt`) zSH*6xqsNd%L4>y3r18L2g6w%xfxHl6U{S$ z8(>Mbt3)_nZRIt^JK3n*Flh-CV-q%v#%;0qt?XN8vq6Ac8afmz-ul%YS?;wQ%an#Y znf;=MFg-?i$uMIf%Qf9ks>w7TvD!KUFcaaki4+-OR`PR+(R$7Fp?QeZY7;N+UJRT~)?McU=MDGI4#ZfRGB_=- z46$}uT}g3UYAx2NE1@xph>7|PX-IqJM1FOfo*w$IXhvyGA!cd*qsePFF99~Gz~L-? z7C&cYo|p;LUO+e%+Zelxdd}a}pzg~NDUP+Y?K{_3v$sH0X>Z1}&8^8ci}om8p=C&| z+;hC;Mf0Z0VxB^gxGS?r80w!Q=oFzkqedJ%$-f)hg^1K^0(KSg>7%8?%-q5-m58BY zQc&&0k?ZB>F69O3Mt(LH`7z05sl8Y9NjOvrEj%~r@tA_f0LIMXjn_697@9GB78lrF zH|$D^95lk5QOB90GTT3L@tj?=m>5rmu2ZQ?9nh3q~WNoLM+ns z%Dy7p0XX8oq_d{2NtwwdEh4kSVA>ivOY-9MF2a8N)2Pdk0l=^^)qYdQK3x%+bw#YP z#7JLtD0Z%iE)qvKt8?^d6cX+h4Qh6jvsp`N?2*HS2J#JiX(kvTJ5#<8dF>MTmCRdx zbY~Qpr-t!+Ux;ODmxXI!o4`1YL`+%vOQ6pN98C?Fx=o`zo36Ha7Z)t8GF_~ar=WVg z_X(DB9r80^*wCJc5dZ=7b>;?7HqFf2eod;Ux*O^)2`JN^&olj^gBbVb8PiD0?0WP- zi5*kYa$s-gw19QOp;K)qTJEfm*g){8QB!j^*lQ%aknJODjsHNH_7WIo z^240>8^g;Z`i)wv^zduYW!`SSNB9u-&_v!QKZnRRi7M) zWfm=cKK?w}|86LP9?-!(d^gmeh8;~144-TdGLrm&fh|&Ia3Stv9g7YQAX`T35OANP zVQVxTjQP;^lEIAXpmuLUv@9n=6=r708sd%t>mqbqJiIEau4*r=&O^gDXl`hDC9TXJ zWM4>h>vZR