Mari Lehne
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    [![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.stud.ntnu.no/#https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146) # Wardrobe prosjekt Prosjektet er et utviklingsprosjekt i faget IT1901. I dette prosjektet utvikler vi en app som forestiller en gardrobe hvor en bruker har mulighet til å legge til plagg etter eget ønske. Hensikten med prosjektet er at brukeren skal få oversikt over eget klesskap for å kunne planlegge antrekk på en enkel måte. ## Bygging og kjøring av prosjektet Dette prosjektet både bygges og kjøres ved bruk av maven. For å bygge prosjektet, kjør `mvn install` i terminal fra rot-prosjektet (**wardrobe**-mappen). Dette vil kjøre alle tester og kvalitetssjekker. Merk at dette må gjøres for at prosjektet skal kunne kjøres. Prosjektet må kjøres fra **ui**-modulen ved enten ``` $ mvn javafx:run -f ui/pom.xml ``` eller ``` $ cd ui $ mvn javafx:run ``` ## Arbeidsrutiner ### Milestones For hver release har vi brukt milestones i GitLab for å organisere og spore issues og merge requests. ### Issues For bedre arbeidsflyt har vi for hver release brukt issues til å planlegge arbeid. Hvert issue har en beskrivelse av hva som er tenkt skal gjøres konkret for det issuet. Videre har vi opprettet branches ut ifra hvert enkelt issue. ### Commit-meldinger For å opprettholde gode arbeidsrutiner valgte vi å sette en felles standard på formatet til commit-meldingene i relase 3. Tidligere var formatet på denne måten: **Eksempel:** #21 Endret metode i Wardrobe Vi valgte å endre dette formatet for å oppnå en mer beskrivende struktur på meldingene. Commit-meldingsformatet ble derfor endret til "type endringer i meldingen: hvilke endringer som hadde blitt gjort og (#hvilket issue)". **Eksempel:** Test: Lagde tester for LoginPageController (#35) ## Kodekvalitet For å oppnå god kodekvalitet har vi benyttet oss av følgende verkøty: - Checkstyle: for å de tekstmessige egenskapene i koden - Spotbugs: for å oppdage typiske feil i koden - Jacoco: for å samle inn informasjon og tekstdekningsgrad ## Arkitektur - wardrobe Mappen i kodelageret som utgjør kodingsprosjektet ligger inne i mappen [wardrobe](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/tree/master/wardrobe). I wardrobe ligger mappene core, restapi og ui, som inneholder henholdsvis kjernelogikk, server og brukergrensesnitt. Ved å skille kjernelogikken, REST-apiet og ui-et fra hverandre opprettholder vi en full tre-lags arkitektur. ### Klassediagram for hele applikasjonen Under vises et overordnet klassediagram for hele applikasjonen. Her mangler noen detaljer, slik som relasjon mellom WardrobeAppController og User. Mer detaljer om relasjonene kan sees i de mer spesifikke klassediagrammene som ligger i README-ene for de ulike modulene. Klassediagrammet er todelt fordi ApiCalls og REST-apiet bindes sammen av HTTP. ```plantuml class RestapiService { ~WardrobePersistence wp -ArrayList<User> users -User user -ArrayList<User> stringToUser() +ArrayList<User> getAllUsers() +User getUser(String username) +Wardrobe getWardrobe(String username) +String createUser(User user) -int getUserIndex(String username) +String addWardrobeItem(WardrobeItem wardrobeItem, String username) +String removeWardrobeItem(String wardrobeItem, String username) +void autoSaveWardrobe(User user) } class RestapiController { - RestapiService service + @GetMapping() + @PostMapping() + @PutMapping() } class User { -Wardrobe wardrobe -String username +User(String username) +User() +void setUsername(String username) +String getUsername() +void setWardrobe(Wardrobe wardrobe) +Wardrobe getWardrobe() +String toString() } class Wardrobe { -List<WardrobeItem> wardrobe +Wardrobe(WardrobeItem[] items) +List<WardrobeItem> getWardobe() +int getSize() +String getWardrobeItem(WardrobeItem item) +void addWardrobeItem(WardrobeItem item) +void removeWardrobeItem(WardrobeItem item) +List<String> getWardrobeNames() +List<String> getWardrobeNames(String type) +List<String> getWardrobeType(String type) } class WardrobeItem { -String name -String type -String color -{static}List<String> validTypes +WardrobeItem(String name, String type, String color) +boolean validType(String type) +String getName() +String getType() +String getColor() +void setColor(String color) +void setName(String name) +void setType(String type) } class LoginPageController { ~TextField username ~Text feedback ~Button logIn +void run() -boolean checkValidUsername(String name) } class WardrobeAppController { -WardrobePersistence WP -User user -ApiCalls apicalls - OutfitPageController #void onLoad(String username) -String capitalize(String text) -void createItem() -Image getIconForType(String type) -void validUser() -Wardrobe getWardrobe() +void setUsername(String name) +String getUsername() +boolean setUser(String username) +User getUser() -void addItem() -void deleteItem() +void updateView(Wardrobe wr) -void onView(String type) -void onAllView() -void onDressView() -void onPantsView() -void onSweaterView() -void onTshirtView() -void onSkirtView() -void pressedButton(Button b) -void createComboboxTypes() -void setFacts() -void runOutfitPage() } class OutfitPageController { -User user -Wardrobe wardrobe -List<WardrobeItem> tops -List<WardrobeItem> bottoms #{static}void loadOutfitPage() +void setUser(User user) +void setWardrobe(Wardrobe wardrobe) +void setTopList() +void setBottomList() -Image getIconForType(String type) +User getUser() +Wardrobe getWardrobe() +List<WardrobeItem> getBottoms() +List<WardrobeItem> getTops() +void generateOutfit() +void setCombinationText() +void runWardrobeApp() } class ApiCalls { -ObjectMapper mapper +ApiCalls() +List<User> getAllUsers() +User getSingleUser(String username) +User createUser(User user) +String addWardrobeItem(WardrobeItem item, String username) +String deleteWardrobeItem(WardrobeItem item, String username) } WardrobeAppController -- LoginPageController WardrobeAppController -- OutfitPageController RestapiService -- RestapiController RestapiService -- User ApiCalls -- WardrobeAppController User *-- "1" Wardrobe Wardrobe *-- "*" WardrobeItem ``` (trykk på bildeikonet for å åpne diagrammet) ### core core inneholder domenelogikken og datalagringen. For mer om core-modulen, se [core](wardrobe/core/README.md). ### restapi restapi-modulen består av alle klassene som håndterer REST-apiet. Mer om REST-api under og i [restapi](wardrobe/restapi/README.md). ### ui ui består av alle klassene som håndterer kommunikasjon mellom programmet og brukeren. For mer om ui-modulen, se [ui](wardrobe/ui/README.md). ## Oppsett ### Moduler Maven-moduler er en måte å organisere prosjektet i flere delprosjekter/moduler, som hver vil produsere en artefakt. Med maven kan versjonene og avhengighetene i modulene kontrolleres mellom disse modulene. Java-moduler er en måte å kapsle inn disse klassene sterkt på. ### Module-info Maven kan ikke generere module-info.java-filer automatisk, og vi har derfor lagt inn dette i hver modul. ### Avhengigheter I prosjektet har vi implementert Jackson-biblioteket for å gjennomføre fillagring med JSON. Vi har også brukt dependency-en Javafx, for å kunne bruke Java-bibliotekene for en visuell fremstilling av applikasjonen. I tillegg bruker vi JUnit-påbygget tesfx for å teste Javafx-baserte GUI, da i hovedsak WardrobeAppController. Vi benytter oss av de tre eksterne java-bibliotekene for å bruke TestFX. Vi bruker testfx-core versjon 4.0, hamcrest-all version 2.2. Det er to tilnærminger til testing av kontrollerern, isolert testing og ende-til-ende-testing. Vi har valgt å bruke ende-til-ende-testing. Her simulerers brukerinput og effekten i brukergrensesnittet sjekkes. For eksempel sjekker vi at når brukeren trykker på "Sweaters", så blir listen med "Sweaters" valgt og synlig for bruker. Vi bruker testrammeverket JUnit for enhetstesting i java-klasser. Dette er for å teste at metodene i en klasse implementerer ønsket oppførsel og øke kvaliteten på koden. ### Gitpodifisering Prosjektet utvikles i hovedsak i lokal IDE, men det skal alltid være mulig å anvende Gitpod. Dette ser vi til at er mulig ved å gjøre gitpod tilgjengelig direkte fra gitlab-repoet til prosjektet, både gjennom knapp i gitlab og en oppdatert link å følge fra denne README-filen. ### Byggetillegg Byggingen til prosjektet styres av maven og vi har derfor implementert ulike maven plugins. ### Maven Prosjektet baserer seg på Maven som byggesystem. I første omgang er en enkel maven-implementasjon så lang vi valgte å gå, da dette var nytt for alle gruppens medlemmer. Dette er satt opp gjennom å først installere Maven, og deretter sette opp prosjektet etter en enkel modul-mal gitt av prosjektinstruktør. ### Fillagring med JSON JSON er et åpent standard filformat med fordeling av data, som bruker lesbar tekst for lagring og overføring av data. JSON filer lagres med .json-forlengelse og krever mindre formatering enn for eksmpel XML. For å håndtere konvertering av string til .json og .json til string har vi brukt biblioteket Jackson. Vi har anvendt JSON for lagring av Wardrobe som fil, og har gjennom dette implementert serialisering og deserialiseringsklasser som ligger inne ved core i en egen mappe [json](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/tree/master/wardrobe/core/src/main/java/wardrobe/json). Inne i [json](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/tree/master/wardrobe/core/src/main/java/wardrobe/json) finner vi [internal](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/tree/master/wardrobe/core/src/main/java/wardrobe/json/internal) mappe som inneholder alle serialiserings og deserialiseringsklassene, og [WardrobeModule](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/internal/WardrobeModule.java). Serialiserings og deserialiseringsklassene vi har er [UserSerializer](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/internal/UserSerializer.java), [UserDeserializer](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/internal/UserDeserializer.java), [WardrobeDeserializer](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/internal/WardrobeDeserializer.java), [WardrobeSerializer](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/internal/WardrobeSerializer.java), [WardrobeItemDeserializer](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/internal/WardrobeItemDeserializer.java) og [WardrobeItemSerializer](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/internal/WardrobeItemSerializer.java). I [json](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/tree/master/wardrobe/core/src/main/java/wardrobe/json) finner vi [WardrobePresistence](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/WardrobePersistence.java) som inneholder metoder for å kunne skrive og lese fra fil. Et Wardrobe-objekt med wardrobeItems er knyttet til et brukernavn. Vi har valgt å ikke gi hvert wardrobeItem i garderoben en unik ID, da vi ikke så det hensiktsmessig å ta høyde for duplikater. Dette er fordi en bruker kan ha flere like plagg. En bruker har et klesskap, Wardrobe, som er mulig å lagre og hente. Det er mulig å lagre flere brukere, men en bruker kan kun ha en Wardrobe. Lagringen vil fungere ved at flere brukere blir lagret i en fil som blir lagret i en final filsti [getPathforSaveFile](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/blob/master/wardrobe/core/src/main/java/wardrobe/json/WardrobePersistence.java/getPathforSaveFile). ### REST-api Applikasjonen benytter et REST-api som er bygget på Spring Boot. Et REST-api er et applikasjonsprogrammeringsgrensesnitt som tillater interaksjon med en RESTful webtjener (her: Spring Boot). Spring Boot lar utviklere lage "stand-alone" applikasjoner som kjører på egen hånd, uten å måtte stole på en ekstern webserver ved å bygge inn en webserver under intialiseringsprosessen. REST-apiet er bygget rundt kjernelogikken i core gjennom å bruke metodene i klassene i denne moduelen. REST-apiet er bygget inn i prosjektet i en egen [restapi](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/tree/master/wardrobe/restapi) modul. Serveren bruker maven for oppstart og kjøres ved å skrive inn følgende kommando i terminalen: ``` $ cd restapi $ mvn spring-boot:run ``` For mer om REST-api; [release3](https://gitlab.stud.idi.ntnu.no/it1901/groups-2021/gr2146/gr2146/-/tree/master/docs/release3) ### Brukergrensesnitt I designprosessen av brukergrensesnittet har vi lagt vekt på et simpelt og brukervennlig design. I utviklingsprosessen av applikasjonen har vi for hver release forbedret designet og kommet frem til et design som vi føler er tilfredstillene for applikasjonens funksjonaliteter. Vi har flere fxml filer og kontrollere som tilsammen utgjør brukergrensesnittet. Dette er for å unngå at kontrollerklassene blir for store og komplekse. ### Testing Det er satt opp tester for alle modulene. Kjernelogikken testes med JUnit-tester, restapi med integrasjonstester og enhetstester og ui-klassene ved TestFX og JUnit. Testene kjøres med maven ved å skrive inn kommandoen (`mvn test`) i terminalen i rett mappe (wardrobe.core, wardrobe.ui eller wardrobe.restapi). Gitpod er tregere enn lokal IDE på å skrive til applikasjon under testene. Dette gjør at den iblant kan gå videre til neste test før et felt er fylt ut, og dermed vil returnere feilmeldinger og feilkjøre testene. Vi har implementert ventefunksjoner for hver av testmetodene som skriver til applikasjonen, og dette skal hindre testen i å gå videre før den har fylt ut feltene korrekt. Om det allikevel skulle skje må man bare kjøre testene om igjen. ### Konfigurasjon for shippable product med jlink og jpackage Under følger instruksjoner for å lage shippable product ``` $ cd restapi $ mvn clean package spring-boot:repackage $ cd target $java -jar restapi-0.0.1-SNAPSHOT.jar ``` Videre for å lage desktop applikasjon ``` $ cd ui $ mvn clean compile javafx:jlink jpackage:jpackage ``` ### Skjermbilde av prosjekt ![wardrobe](./docs/release2/images/mainpage.png)

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully