Ohjelmistoprojekti 1 kurssin tiimityö
99-Errors: Akseli Leskinen, Nadja Liljeström, Vilma Parikainen, Roope Salonen, Nicklas Åkerman
Projektin tavoitteena on toteuttaa TicketGuru -niminen lipunmyyntijärjestelmä. Asiakkaana on lipputoimisto, joka on tilannut lipunmyyntijärjestelmän lippujen myymiseen myyntipisteessään. Myyntiin tullaan laittamaan eri lipputyyppejä.
Järjestelmässä tulee pystyä myymään ja tulostamaan lippuja sekä hallitsemaan (eli lisäämään, poistamaan, muokkaamaan) tapahtumia, joihin lippuja on myynnissä. Järjestelmästä tulee pystyä katsomaan myyntiraportit ja yksittäiset myyntitapahtumat kunkin tapahtuman osalta. Järjestelmästä tulee pystyä tarkistamaan yksittäisen lipun tunnistenumero.
Järjestelmän kehittämisessä käytetään Spring Bootia, ohjelmointikielenä lähtökohtaisesti Javaa ja tietokantajärjestelmänä toimii MariaDB. Käyttöliittymä kehitetään desktop-käyttöön. Web-puoli kehitetään alustavasti Thymeleafia ja Bootstrapia hyödyntäen.
-
Admin-käyttäjänä haluan...
- Pystyä hallitsemaan käyttäjätilejä
- Pystyä hallitsemaan käyttäjätilien oikeuksia (permissions)
- Pystyä tarkastelemaan ja hallitsemaan tapahtumien tietoja ja kategorioita
-
Lipunmyyjänä haluan...
-
Että jokaisella lipulla on oma uniikki tunnuksensa
-
Tarjota lippuja myyntiin eri ikäryhmille
-
Asettaa lippujen ennakkomyynnille aloitus- ja lopetuspäivämäärän
-
Asettaa kullekin tapahtumalle myytävien lippujen määrän
-
Määrittää lippujen hinnoittelua ja alennuksia
-
Pystyä lisäämään myytäviä lippuja järjestelmään
-
Pystyä poistamaan myynnissä olevia lippuja
-
Pystyä muokkaamaan myynnissä olevia lippuja
-
Pystyä luomaan uuden tapahtuman
-
Pystyä asettamaan tapahtumalle päivämäärän
-
Pystyä asettamaan tapahtumalle paikan ja osoitetiedot
-
Pystyä luomaan myyntiraportteja
-
Saada (tulostettua) järjestelmästä myyntiraportin
-
Pystyä tulostamaan kerralla myymättömät liput, kun ennakkomyynti on päättynyt
-
Pystyä tulostamaan myyntihetkellä yksittäisiä lippuja
-
Pystyä tarkastelemaan myyntitapahtumia
-
Että jokainen myyty lippu merkitään (järjestelmässä) myydyksi
-
Mahdollisuuden tarkastaa lippujen myynti- ja varastotilanteen
-
-
Lipuntarkastajana haluan...
- Että jokaisella lipulla on oma uniikki tunnuksensa
- Pystyä tarkastamaan lipun yksilöllisen tunnistenumeron (ovella)
- Pystyä merkitsemään järjestelmään tarkastamani lipun käytetyksi
- Käyttöjärjestelmän ylläpitäjä (admin, tekee järjestelmään muutokset/päivitykset)
- Lipunmyyjä (käyttää järjestelmää)
- Lipuntarkastaja (käyttää järjestelmää lippujen tarkastamiseen)
Käyttöliittymään kirjautuessa on olennaista kirjautuuko järjestelmään lipunmyyjänä vai lipuntarkastajana. Admin-oikeuksia käytetään järjestelmän kehittämiseen ja muutosten tekoon.
Voit avata kuvan isommaksi klikkaamalla sitä
Järjstelmän tiedot on kuvattu alla olevassa kaaviossa. Kaavio pitää sisällään taulujen nimet, näiden väliset suhteet, pää- ja viiteavaimet, sekä taulujen tietoelementit. Alempana on esitetty myös taulujen tarkemmat selitykset ja perustelut.
AppUsers-taulu sisältää käyttäjätunnukset, joita vaaditaan järjestelmän käyttämiseen.
Kenttä | Tyyppi | Kuvaus |
---|---|---|
user_id | BIGINT PK | Käyttäjän yksilöllinen tunnite, AUTO_INCREMENT |
username | VARCHAR(25) | Tilin nimimerkki, not null |
password | VARCHAR(50) | Tilin salasana, not null |
role_id | BIGINT FK | Viittaus Roles-tauluun |
Roles-taulu sisältää käyttäjätunnuksien roolit. Yhdellä käyttäjätunnuksella on yksi rooli.
Kenttä | Tyyppi | Kuvaus |
---|---|---|
role_id | BIGINT PK | Roolin yksilöllinen tunniste, AUTO_INCREMENT |
role_name | varchar(50) | Roolin nimi, not null |
TicketTypes-taulu sisältää lipputyypit. Yhdellä lipulla on yksi lipputyyppi.
Kenttä | Tyyppi | Kuvaus |
---|---|---|
ticket_type_id | VARCHAR PK | Lipputyypin yksilöllinen tunniste,AUTO_INCREMENT |
ticket_type | VARCHAR(50) | Lipun tyyppi, not null |
event_id | BIGINT FK | Viittaus Events-tauluun |
price | DECIMAL(10,2) | Lipputyypin hinta, not null |
Tickets-taulu sisältää lipun tiedot. Yksi lippu sisältää yhden tapahtuman ja yhden lipputyypin tiedot.
Kenttä | Tyyppi | Kuvaus |
---|---|---|
ticket_id | BIGINT PK | Lipun yksilöllinen tunniste, AUTO_INCREMENT |
ticket_type_id | BIGINT FK | Viittaus TicketTypes-tauluun |
event_id | BIGINT FK | Viittaus Events-tauluun |
transaction_id | BIGINT FK | Viittaus transactions-tauluun |
is_checked | BOOLEAN | Onko lippu tarkistettu, true = tarkistettu |
Events-taulu sisältää tapahtuman tiedot.
Kenttä | Tyyppi | Kuvaus |
---|---|---|
event_id | BIGINT PK | Tapahtuman yksilöllinen tunniste, AUTO_INCREMENT |
event_name | VARCHAR(100) | Tapahtuman nimi, not null |
event_date | DATE | Tapahtuman päivämäärä, not null |
event_time | TIME | Tapahtuman kellonaika, not null |
ticket_count | INT | Tapahtuman lippujen määrä, not null |
venue_id | BIGINT FK | Tapahtuman paikan id, viittaus Venues-tauluun |
description | TEXT | Tapahtuman kuvaus |
Venues-taulu sisältää tapahtumapaikat. Yksi tapahtuma voi olla vain yhdessä tapahtumapaikassa.
Kenttä | Tyyppi | Kuvaus |
---|---|---|
venue_id | BIGINT PK | Yksilöllinen tunniste, tapahtumapaikka, AUTO_INCREMENT |
place | VARCHAR(150) | Tapahtumapaikan nimi, not null |
street_address | VARCHAR(150) | Tapahtumapaikan katuosoite, not null |
postalcode | VARCHAR(5) FK | Viittaus postinroon, postalCode PostCodes-taulussa |
Postcodes-taulu sisältää postinumerot, ja niihin linkittyvät postitoimipaikat. Yksi tapahtumapaikka sisältää vain yhden postinumeron.
Kenttä | Tyyppi | Kuvaus |
---|---|---|
postalcode | VARCHAR(5) PK | Postinumero toimii yksilöllisenä tunnisteena, not null |
post_office | VARCHAR(150) | Postitoimipaikka, not null |
Transactions-taulu sisältää maksutapahtumat.
Kenttä | Tyyppi | Kuvaus |
---|---|---|
transaction_id | BIGINT PK | transaction id toimii yksilöllisenä tunnisteena, AUTO_INCREMENT |
amount | DECIMAL | maksutapahtuman summa, not null |
transaction_ok | BOOLEAN | maksutapahtuma on mennyt läpi |
transaction_date | VARCHAR(10) | maksutapahtuman kellonaika, not null, yyyy-mm-dd |
transaction_time | VARCHAR(8) | maksutapahtuman kellonaika, not null, hh:mm:ss |
Palvelintoteutus
Julkaisussa on käytetty hyödyksi Mavenin Jkube lisäosaa, jonka avulla projekti on julkaistu Rahdin palvelimelle.
Myös MariaDB tietokanta on julkaistu Rahdin palvelimelle ja sitä varten on luotu tietokannan luontiscripti SQL kielellä. Tietokannan luontilauseet sisältävä kansio
Järjestelmän komponentit
Järjestelmän komponentit pitävät sisällään kaikkien luokkien GET ja SET metodit, salasanan cryptauksen BCryptiä hyödyntäen,CRUD toiminnot REST API:lle, QR koodin tekemisen lipun tiedoista, yksittäisen lipun tarkistuksen ID perusteella, sekä jäljellä olevien lippujen määrän laskemisen tapahtuman ID perusteella.
Keskeiset rajapinnat
Rajapintoja varten on tarkempi dokumentaatio, mikä sisältää jokaisen käytettävissä olevien endpointtien kuvauksen, esimerkkisisällön sekä muun olennaisen tiedon. Rajapintojen dokumentaatioon pääset tästä
Endpointeista saatavilla olevat tiedot mukailevat tietokantakaavion sisältöä: Tietokantakaavioon pääset tästä
Yleistä tietoa teknisestä osuudesta
- Ohjelmassa on käytössä endpointtien autentikointi sekä auktorisointi, joka mahdollistaa käyttäjätunnuksen ja salasanan perusteella tietojen näyttämisen.
- Ohjelmakoodi on käyty läpi niin, että nimeämiset ja koodaus sekä kommentointi olisi yhdenmukaista.
- Pääsääntöisesti esimerkiksi REST APIn syötteiden tarkistus tehdään kunkin osion entiteetti sekä service luokassa ja jälkimmäiseen onkin helppo lisätä uusia tarkistuksia.
Testauksesta on oma dokumentaatio: https://github.com/NicklasHH/TicketGuru/blob/master/TicketGuruDocumentation/TestiDokumentaatio.md#testausdokumentaatio-tickergurulle
Testausta toteutetaan yksikkötesteillä, integraatiotesteillä sekä päästä päähän(E2E) testeillä. Näitä testejä suoritetaan, kun kyseiseen testattavaan osioon tehdään muutoksia. Testauksen koodeihin pääset tästä
Järjestelmän tunnetut ongelmat:
- Jkuben skiptests ei toimi, joten testit on kommentoitava ulos Rahtiin julkaistaessa.
- Rahdin julkaisun yhteydessä useimmiten katoaa routen määrittelyt.
Kehitysympäristö: Eclipse
Tuotantoympäristö: Rahti
Tietokanta: MariaDB
Tietokannan luonti: https://github.com/NicklasHH/TicketGuru/tree/master/db
Käynnistysasetukset: https://github.com/NicklasHH/TicketGuru/tree/master/src/main/resources
Lisää Tietokannasta:
- Tietokantaa asennettaessa tulee huomioida, että tietokannan käyttäjällä on vaadittavat oikeudet.
- Tietokannan luontia varten on useita eri scriptejä, riippuen mitä halutaan tehdä.(Tyhjät taulut, pelkät tiedot, taulut ja tiedot)
Tuotantoympäristön luonti
- Luo projekti
- Luo tietokantapalvelu
- Julkaise Spring Boot projekti
- Tietokannan konfigurointi
Yksityiskohtaisemmat ohjeet julkaisuun löytyy opettajan kasaamasta materiaalista: https://mruonavaara.github.io/hh-csc-docs/ohje_spring_rahti/#rahti-projektin-luonti
Paikallisen kehitysympäristön käyttöönotto-ohje:
- Asenna eclipse
- Lataa tämä projekti GitHubista:
git clone
https://github.com/NicklasHH/TicketGuru - File -> Import -> Excisting maven projects -> etsi ja valitse äsken kloonattu kansio
- Varmista oikea profiili käytettävän tietokannan mukaan application.propertiesistä (H2, mariadb)
- Käynnistä projekti klikkaamalla hiiren oikealla painikkeella:
TicketGuruApplication.java
ja painaRun as java application
- Avaa selaimen osoiterivillä: http://localhost:8080/
Sisäänkirjautumistiedot
Käyttäjätunnus | Salasana |
---|---|
admin | admin |
lipunmyyjä | lipunmyyjä |
lipuntarkastaja | lipuntarkastaja |
MariaDB tietokannan ohje
Mariadb-tietokantaa käytettäessä sinun tarvitsee määritellä application.properties
tiedostossa spring.profiles.default=MariaDB
- Lataa HeidiSQL ja asenna se
- Lataa MariaDB ja asenna se: Käyttäjätunnus ja salasana on suotavaa asettaa
root
, Jos et käytäroot
niin määrittele käyttäjätunnus ja salasana tiedostoonapplication-MariaDB.properties
- Avaa HeidiSQL -> Uusi istunto juurikansiossa -> Määrittele MariaDB käyttäjätunnus ja salasana -> Avaa -> Klikkaa hiiren oikealla äsken luotua istuntoa -> Luo uusi -> Tietokanta -> Avautuneeseen tietokantaan: Luo uusi kysely -> Kopioi tähän projektin juuressa olevan db kansion sisältä
data-mariadb.sql
tiedoston sisältö. -> Suorita SQL kysely.
H2 tietokannan ohje
H2-tietokantaa käytettäessä sinun tarvitsee määritellä application.properties
tiedostossa spring.profiles.default=h2
jonka jälkeen sinulla on H2-tietokanta käytössä. Sovelluksessa on käytössä ominaisuus, jonka avulla tietokantaan rakennetaan automaattisesti tietokanta seuraavalla komennolla: spring.sql.init.schema-locations=file:db/data-h2.sql
H2-tietokantaan pääset käsiksi osoitteessa: http://localhost:8080/h2-console/
Etusivulle: https://ticketguru-ohjelmistoprojekti.rahtiapp.fi/
Endpointtien listaukseen: https://github.com/NicklasHH/TicketGuru/blob/master/RestDocumentation/README.md#ticketguru-rest-api
Sisäänkirjautumistiedot
Käyttäjätunnus | Salasana |
---|---|
admin | admin |
lipunmyyjä | lipunmyyjä |
lipuntarkastaja | lipuntarkastaja |