Internetipood ettevõttele Toyrem OÜ

Seotud dokumendid
Microsoft Word - requirements.doc

Microsoft Word - ref - Romet Piho - Tutorial D.doc

Pealkiri

E-arvete juhend

Monitooring

Microsoft Word - EHR.docx

Microsoft Word - installation-guide.doc

SAF 7 demo paigaldus. 1.Eeldused SAF 7 demo vajab 32- või 64-bitist Windows 7, Window 8, Windows 10, Windows Server 2008 R2, Windows Server 2012, Wind

Microsoft Word - essee_CVE ___KASVANDIK_MARKKO.docx

I Generaatori mõiste (Java) 1. Variantide läbivaatamine Generaator (ehk generaator-klass) on klass, milles leidub (vähemalt) isendimeetod next(). Kons

Microsoft Word - Errata_Andmebaaside_projekteerimine_2013_06

Tartu Ülikool

Andmeturve

HAJUSSÜSTEEMID HAJUSSÜSTEEMID Kaugprotseduurid IDL kompileerimine ONCIDLnäide CORBAIDLnäide MIDLnäide DCERPCmuidomadusi XML-RPC JSON-RPC REST document

Microsoft Word - TallinnLV_lihtsustatud_manual_asutuse_juhataja_ doc

AG informaatika ainekava PK

Elisa Ring Elisa Ringi mobiilirakendus Versioon

Microsoft PowerPoint - loeng.ppt

GRUPI-SMS Veebirakenduse kasutamise juhend Rakendus Elisa grupi-smsi rakendus Väljaandja Elisa Eesti AS Juhendi koostamise kuupäev Versioon

Relatsiooniline andmebaaside teooria II. 6. Loeng

Skriptimiskeeli, mida ei käsitletud Perl Python Visual Basic Script Edition (VBScript) MS DOS/cmd skriptid Windows PowerShell midagi eksootilisemat: G

Microsoft PowerPoint - TÜ TVT - Kavandamine ja arhitektuur 2.ppt

Operatsioonisüsteemi ülesanded

G aiasoft Programmi VERP ja Omniva Arvekeskuse liidese häälestamine ja arvete saatmine-lugemine VERP 6.3 ja VERP 6.3E Versioon ja hilisemad K

Operatsioonisüsteemide ehitus

Microsoft PowerPoint - Lisa 5 koolituse materjalid

Microsoft Word - Toetuste veebikaardi juhend

MTAT Loeng 11 ( )

Õppekava vorm 1. Õppekava nimetus Küberturbe tehnoloogiad 2. Õppekava nimetus inglise Cyber Security Engineering keeles 3. Kõrgharidustaseme õpe Raken

KOOLITUSTE HALDAMINE E-TÖÖTUKASSA KASUTAJAJUHEND 1

RIIGIPILVE TEENUSE TOOTETINGIMUSED ÜLDINE JA MÕISTED KINNITATUD WD nr 2017/1-11.2/ Riigipilve Teenuse Tootetingimused (edaspidi Ting

Andmeturve

sotsiaalne_tarkvara

Tiia Salm 2011 Online kirjastus CALAMÉO Calameo kujutab endast on-line kirjastust, mis võimaldab oma dokumente avaldada e-raamatuna tasuta. Failid (Pd

PowerPoint Presentation

Bild 1

Pealkiri

E-õppe ajalugu

Müük (Microsoft Dynamics AX (Axapta) tarkvara) Paigaldusjuhend bifree.ee qlik.com

FRESENIUS ÕPPEKESKUS KIIRJUHEND

Pangalingi spetsifikatsioon Pocopay pangalingilt makse algatamiseks tuleb kasutada teenust Kaupmees teeb päringu Pocopayle aadressile

Loeng03

Juhend nutiterminali seadistamiseks ja kaardimaksete vastuvõtmiseks Ingenico Link/2500 ja icmp

Hoia oma arvuti turvaline ja kiire 1.Leia start nupust alustades Juhtpaneel 2.Juhtpaneeli aadressiribalt leia Kõik juhtpaneeli üksused 3.Avanenud tööa

Süsteemide modelleerimine: praktikum Klassiskeemid Oleg Mürk

(Microsoft PowerPoint - seminar_6_n\365uded-ainemudel tagasiside.ppt [Compatibility Mode])

ArcGIS Online Konto loomine Veebikaardi loomine Rakenduste tegemine - esitlus

Microsoft Word - Referaat.docx

Veeb Jaagup Kippar

X Window System tuntud kui: X11, X, X-Windows akendussüsteem/akendesüsteem rastergraafikat toetavatele ekraanidele UNIX-maailmas väga levinud mitmesug

DNS teenus teoorias ja praktikas Autor Siim Adamson ITK Autor: Siim Adamson ITK

Kom igang med Scratch

Operatsioonisüsteemi ülesanded

Microsoft PowerPoint - GIS_pilvelahendusena_final.ppt [Compatibility Mode]

Sissejuhatus Informaatikasse Margus Niitsoo

EID TARKVARA (v.1812 baasil)

Microsoft Word - EVS_ISO_IEC_27001;2014_et_esilehed.doc

MTAT Operatsioonisüsteemid - Turvalisus

IT infrastruktuuri teenused sissejuhatav loeng 00

Võrguväljaanded ja veebiarhiveerimine

TUNNUSTATUD TURVALAHENDUS Esitaja: G4S Eesti AS, Alarmtec AS Automaatse numbrituvastussüsteemi paigaldamine keelatud piirikaubanduse vastu võitlemisek

TARTU ÜLIKOOL LOODUS- JA TÄPPISTEADUSTE VALDKOND ARVUTITEADUSE INSTITUUT Lauri Kongas Turvaauk CVE Referaat aines Andmeturve MTAT Õpp

P2P süsteemid

Projekti sõltuvuste andmebaas

PowerPointi esitlus

Tartu Kutsehariduskeskus IKT osakond Merlis Karja-Kännaste ASUTUSE DOKUMENDIREGISTRI AVALIK VAADE Analüüs Juhendaja Mirjam-Merike Sõmer Tartu 2015

Ajaveeb-veebileht.pptx

Loeng12

TEENUSE OSUTAMISE LEPING /kuupäev digikonteineris/ Kooli nimi, Registrikood (edaspidi Asutus), mida esindab amet Eesnimi Perekonnanimi, ja Hariduse In

Directo ja Omniva arvekeskuse (endine EAK ehk Eesti E-arvete Keskus) liidestamine

ArcGIS rakendused välitöödeks Raido Valdmaa AlphaGIS

Privacy Policy_Estonia_

Mida me teame? Margus Niitsoo

E-õppe ajalugu

SQL

PowerPoint Presentation

Paroolide murdmine vastavate tabelitega (rainbow table). „Sool“ paroolide krüpteerimisel. Protokoll IPSec, võtmevahetus IKE protokolliga.

EUPL v 1 1-all versions _4_

EBSCO täistekstiandmebaaside kasutamine Otsingu sooritamiseks: 1. Logi sisse 2. Vali EBSCOhost Web 3. Seejärel vali andmebaas, milles soovid otsingut

AASTAARUANNE

Õppimine Anne Villems, Margus Niitsoo ja Konstantin Tretjakov

Document number:

Mascus - Jatiina esitlus 2017

Õppematerjalide esitamine Moodle is (alustajatele) seminar sarjas Lõunatund e-õppega 12. septembril 2017 õppedisainerid Ly Sõõrd (LT valdkond) ja Dian

EUROOPA KOMISJON Brüssel, C(2017) 4679 final KOMISJONI RAKENDUSOTSUS (EL) /, , milles käsitletakse EURESe portaalis vabade töökohta

MTAT Operatsioonisüsteemid - Turvalisus

PHP

Esitlusslaidide kujundusest

SQL

Linux süsteemi administreerimine

E-õppe ajalugu

Kursuseprogramm IFI6054 Agiilne tarkvaraarendus 3 EAP Kontakttundide maht: 28 Õppesemester: K Eksam Eesmärk: Aine lühikirjeldus: (sh iseseisva töö sis

Müügiarvete juhend VEP_

KIIRJUHEND Lugege kiirjuhend enne seadme kasutamist hoolikalt läbi. Kõik tärniga (*) märgitud juhised kehtivad WLAN + 3G mudelitele (Lenovo B6000-H(V)

HAJUSSÜSTEEMID HAJUSSÜSTEEMID Peer-to-peer süsteemid Peer-to-peer süsteemide liigitus Liigitus Ründed Anonüümsus Puuräsi DHT Näide: Kazaa Näide: Kadem

PÄRNU TÄISKASVANUTE GÜMNAASIUM ESITLUSE KOOSTAMISE JUHEND Pärnu 2019

KOTKAS AVE kasutajakeskne juhend Loomise Muutmise kuupäev: kuupäev: Versioon: 2.0 Klient: Keskkonnaministeeriumi Infotehno

KUULA & KORDA INGLISE KEEL 1

Andmebaasid, MTAT loeng Normaalkujud

EIK-OSadmin-Edmund

Väljavõte:

TARTU ÜLIKOOL Arvutiteaduse Instituut Informaatika õppekava Emma Kuppart Internetipood ettevõttele Toyrem OÜ Bakalaureusetöö (9 EAP) juhendaja Tõnu Tamme Tartu 2021

Internetipood ettevõttele Toyrem OÜ Lühikokkuvõte Bakalaureusetöö eesmärk on luua internetipoe rakendus ettevõttele Toyrem OÜ. Võtmesõnad Toyrem OÜ, internetipood CERCS P175 Informaatika A webshop for Toyrem OÜ Abstract The aim of the bachelor s thesis is to create a webshop for the company Toyrem OÜ. Keywords Toyrem OÜ, webshop CERCS P175 Informatics 2

Sisukord Sissejuhatus......4 1. Eelanalüüs....5 1.1. Andmehaldus.....6 1.2. Toodete otsing.....7 1.3. Ostukorv.....8 1.4. Makseviisid...8 1.5. Andmekaitse...8 1.6. Turvalisus....9 2. Tehnoloogiad, millega saab internetipoodi luua.10 2.1. Põhisüsteem...10 2.2. Eessüsteem...15 3. Kasutatud tehnoloogia....18 3.1. Django ja PostgreSQL......18 3.2. Angular ja NGRX.....20 3.3. Makseviisid....21 Kokkuvõte....23 Kasutatud kirjandus.....24 Litsents.26 3

Sissejuhatus Töö eesmärk on luua internetipood ettevõttele Toyrem OÜ. Toyrem OÜ on 2014. aastal asutatud mootorsõidukite hooldus- ja remondiettevõte, mis tegeleb lisaks erinevate teenuste osutamisele varuosade ja lisatarvikute jaemüügiga. Klientide arv on jätkuvalt tõusnud ning on tekkinud vajadus e-kaubanduse järgi. Ettevõttel on soov müüa oma tooteid internetis, et konkureerida teiste samas valdkonnas tegelevate ettevõtetega. Nende praegune kodulehekülg, mis valmis 2017. aastal, ei paku seda võimalust. Bakalaureusetöö jaotub kolmeks peatükiks, millest esimeses on loodava veebipoe nõuete analüüs, teises peatükis on veebipoe loomist võimaldavate tehnoloogiate võrdlus ja kolmandas on kasutatud tehnoloogia analüüs. 4

1 Eelanalüüs Ettevõtte jaoks on oluline pakkuda füüsilisele jaekaubandusele alternatiivi, sest kuigi elektroonilises kaubanduses domineerivad pigem igapäevased tarbeesemed, siis sellegipoolest on ettevõtte jaoks oluline oma tooteid tutvustada ja müüa võimalikult paljude kanalite kaudu. MTÜ Eesti E-kaubanduse Liidu tegevjuhi T. Vääti [5] andmetel on e-ostlemine üleüldiselt kasvavas trendis, kuid autode varustuse ostmine on pigem ebapopulaarne. Ebapopulaarsus võib tuleneda väikesest valikuvõimalusest kui ka harjumustest, aga siiski on tehnika ostmine internetist kasvavas trendis. 1. Internetipoe sisu peab olema lihtne hallata. 2. Internetipoodi ei ole võimalik Trumpauto andmehaldusteenusega integreerida. 3. Internetipood on majutatud Zone veebiserveris. 4. Internetipoes saab müüa minimaalselt 60 toodet. 5. Internetipoes peab olema toodete filtreerimisvõimalus. 6. Internetipoes peab olema ettevõtte logo ning värvid. 7. Internetipoes kasutatakse Maksekeskuse soovitusi ja programmiliidest. 8. Internetipoes peab olema kooskõlas andmekaitseseadusega. 9. Internetipood peab olema turvaline. 10. Internetipoodi saab kasutada inglise, vene ja eesti keeles. Tabel 1. Kliendiga tehtud kokkulepped Esmatähtis etapp projekti raames oli kliendiga kohtumine. Kliendiga kohtumise eesmärk oli kuulda nende ideid ning kogemusi olemasoleva tehnoloogiaga. Koosoleku põhjal valmis ülevaade tehtud kokkulepetest, mis on paigutatud tabelisse 1 ja mis on sisendiks süsteemi analüüsimisel ja arendamisel. Kokkulepped on tabelis suvalises järjekorras. 5

1.1 Andmehaldus Internetipoe süsteem peab võimaldama müüdavate toodete, kategooriate ja tellimuste haldamist. Aegunud informatsioon võib kliendi ebasoodsasse olukorda panna, kui firma kontaktandmed on vanad või halvemal juhul soetada endale tooteid, mida enam ei eksisteeri. Eelco Bruinsma rõhutab, et veebilehel on ülioluline andmete ajakohasus probleemide vältimiseks [6]. Ettevõte kasutab juba varasemalt pilveteenust Trumpauto, millel aga puudub programmiliides (application programming interface) ja seetõttu ei ole integreeritav. Selle asemel on kliendiga leitud kompromiss, et internetipoe andmehalduseks võib eksisteerida eraldi programm. Seda tuleb meeles pidada tehnoloogia valimisel, kuna mõned põhisüsteemid nagu Django tulevad kaasa sisseehitatud admin lehega. Klient peab peale rakenduse valmimist olema suuteline autonoomselt toimetada ja seetõttu peab andmehaldusprogramm olema lihtne, mis eelkõige tähendab seda, et sellel on kasutajaliides. Välja nimetud Kohustuslik Tüüp Nimi Jah Tekst (kuni 255 tähemärki) Kirjeldus Ei Tekst (kuni 5000 tähemärki) Brutohind (EUR) Jah Ujukomaarv (2 koma kohta) Kogus Jah Naturaalarv Tootekood Jah Tekst (kuni 50 tähemärki) Kaal (kg) Ei Ujukomaarv (6 koma kohta) Kategooria Jah Fikseeritud tekstiväärtused Aktiveeritud Jah Jah/Ei Pildid Ei Pildifailid Tootja Jah Välisvõti Lisaparameetrid Ei JSON Tabel 2. Toote parameetrid. 6

Andmete haldamise lehel peab olema tabel kõikidest veebipoe toodetest. Toodet sisestades või uuendades on võimalik sisestada toote parameetreid (vt tabel 2). Parameeter aktiveeritud määrab toote puhul ära, kas seda kuvatakse veebipoes. Parameeter tootekood on teoorias unikaalne iga toote puhul, kuid seda ei saa kasutada andmebaasivõtmena, sest me ei tea kindlalt, millise formaadiga tegemist on. Lisaks kindlatele parameetritele on võimalik lisada kohandatud parameetreid, nagu näiteks materjal, pikkus, jms. Lisaks toodetele võiks administraatori lehel olla võimalik uuendada veebipoe päises ja jaluses kuvatavat informatsiooni, milleks on praeguse kodulehekülje näitel telefoninumber, elektrooniline meil ja töökoja lahtiolekuajad. Selline teave, mille eest vastutab arendaja, nagu näiteks privaatsuspoliitika, ei ole administraatori portaalis muudetav. 1.2 Toodete otsing Kõige olulisem veebipoe osa on toodete otsimise funktsionaalsus. Esialgu tuleb kliendi hinnangul ligikaudu 60 toodet müüki ning nende hulgast sobiva leidmine ei peaks eriti keeruline olema ka siis, kui kõik leheküljed läbi sirvida. Kuna kategooriate järgi otsimine tuleb igal juhul realiseerida, siis teiste toote parameetrite järgi otsimine võiks ka tehtud olla. Tehnika ja mööbli ostmisel on näiteks tavapärane tootekoodi järgi filtreerimine. Veebipoes kehtib reegel, et toode peab kuuluma ühte kategooriasse. Kategooriad on seadistatavad administraatori lehel ning on võimalik tekitada kahetasandiline ülem- ja alamkategooria struktuur. Veebipoes kasutajaliideses kuvatakse kategooriaid vasakpoolsel küljel ning vaikimisi on alamkategooriad peidetud. Toodete kategooriateks võivad olla näiteks pidurisüsteem, vedrustus, jne. Kui filter ei leia ühtegi toodet, siis peab kasutajale kuvama vastava teate. Vastasel juhul tooted järjestatakse vaikimisi populaarsuse järgi, aga kasutajal on võimalus valida järjestamist ka hinna ja nime järgi. Otsing peab ostlemise kogemuse tegema meeldivamaks ja seetõttu on oluline, et otsimine toimuks kiiresti - 60 toote filtreerimiseks üle 50 ms kindlasti aega ei tohiks aega võtta. 7

1.3 Ostukorv Kui kasutaja on tooteid lisanud ostukorvi ja andnud nõusoleku küpsiste kasutamiseks, siis lehe värskendamisel peab ostukorv säilima. Selleks, et vältida veebipoe kasutaja brauseri mälu risustamist vanade andmetega, peab ostukorvil olema aegumistähtaeg, mille kättejõudmisel ostukorv kustutatakse. Kasutajal peab olema võimalus võtta tagasi nõusoleku küpsiste kasutamiseks ning kui seda tehakse, siis kõik rakenduse poolt loodud küpsised eemaldatakse koheselt. 1.4 Makseviisid Pangalingiga maksmine on hetkel kõige turvalisem ja harjumuspärasem variant maksmiseks [1]. Siiski on võimalik ettevõttel seadistada ka teisi makseviise peale internetipanga. Maksekeskuse lahendust kasutades on võimalik makseviiside seadistamine viia veebipoest välja. Sellisel juhul peavad Maksekeskuses seadistatud makseviisid olema nähtavad loodava veebipoe jaoks. 1.5 Andmekaitse Loodav internetipood peab vastama Euroopa Liidu isikuandmete kaitse üldmäärusele (General Data Protection Regulation), mis hakkas kehtima 2018. aastast alates. Määruse eesmärk on luua ühtlustatud andmekaitse kõikides Euroopa Liidu liikmesriikides ja sellega toetada liikmesriikide vahelist kaubandust [3]. Määrusest tulenevalt peab internetipoes olema alamleht, kus on kirjeldatud ära, kas ja kuidas ettevõte ostleja andmeid kasutab. Rakendus kasutab ostukorvi salvestamiseks küpsiseid ning kui kasutaja ei ole nõus küpsiste kasutamisega, siis ostukorvi andmeid salvestada ei tohi. Rakenduses salvestatakse iga tellimuse kohta ainult sellised isikuandmed, mis on vajalikud tellijale paki saatmiseks või mida Maksekeskuse programmiliides nõuab makse läbi viimiseks. Kogutud isikuandmeid on veebipoe administraatoril võimalik ära kustutada läbi administraatori portaali. Põhimõtteliselt võiks teatud aja jooksul andmebaasist kustutada isikuandmed, kuid see vajaks edasi analüüsimist. Loomulikult on võimalik isikul endal paluda oma andmete kustutamist ja see peab olema privaatsuspoliitika lehel mainitud. Näiteks, WordPress kustutab isikuandmeid ära allkirjastatud meili teel edastatud palvega [4]. 8

1.6 Turvalisus Projektis peavad olema täidetud kõik infoturbe kolm põhiaspekti - käideldavus, andmete terviklikkus ja konfidentsiaalsus. Süsteemi käideldavus ehk rakenduse töövõime on tagatud arendaja ning veebiserveri teenusepakkuja poolt. Andmete terviklikkus antud kontekstis tähendab seda, et andmeid saab hallata ainult ettevõtte töötaja ja veebipoe klient saab ainukesena oma ostukorvi hallata. Sellega peaks arvestama tehnoloogia valimisel kui ka veebiteenuste arendamisel, et kui lihtne on kasutajarollidel põhinevaid veebipäringuid luua. Turvalisuse tagamisel võiks järgida Avatud veebirakenduste turbeprojekti (Open Web Application Security Project) soovitusi. Välditud peavad olema elementaarsed turvaaugud, nagu SQL süstimine või päringuvõltsing (cross site request forgery). Tartu Ülikooli [5] infoturbe kursusel soovitatakse ühe lahendusena päringuvõltsingu vältimiseks juhuslikult genereeritud väärtuse salvestamist brauseri küpsistesse ja selle olemasolu kontrollimist veebipäringu päises. Andmete konfidentsiaalsuse tagamiseks kasutatakse rakenduses krüptograafiat. Esiteks, paroolid salvestatakse krüpteeritud kujul andmebaasi. Teiseks, eessüsteemi ning põhisüsteemi vaheliseks suhtluseks kasutatakse krüpteeritud andmesidet ehk HTTPS (Hypertext Transfer Protocol Secure) protokolli [9]. 9

2 Tehnoloogia, millega saab internetipoodi luua Internetipoe rakendus koosneb põhi- ja eessüsteemist, mille rajamiseks kasutatakse erinevaid programmeerimiskeeli ja sellest tulenevalt tuleb teha valik kummagi süsteemi raamistiku osas. Põhisüsteem on programm, mis võtab vastu päringuid veebipoe eessüsteemilt. Tegemist on suletud süsteemiga, mitte nagu eessüsteem, mis töötab kasutaja brauseris ja millele veebipoe kasutajal on otsene ligipääs. Sellest tulenevalt peab põhisüsteem kahtlema sissetulevates päringutes ning neid valideerima. Põhi- ja eesüsteemi vaheline suhtlus on kanaliseeritud põhisüsteemis loodud programmiliidese abil. 2.1 Põhisüsteem Internetipoe programmiliidese arendamisel kasutatakse REST arhitektuuri, kus kogu veebipoes kasutatav funktsionaalsus on jaotatud veebiteenusteks, millest igaühele vastab oma aadress (Uniform Resource Identifier). REST stiilis veebirakendust võimaldavad luua sellised populaarsed raamistikud nagu.net, Spring ja Django, mis on silma paistnud erinevates uuringutes. Horvaatia professor Marin Kaluža [10] on oma uurimistöös välja toonud, et Spring on tänu skaleeritavusele ja konfigueerimisvõimalustele sobilik suurte ja kompleksete rakenduste jaoks. Parimaks raamistikuks peab Kaluža Pythoni keelel baseeruvat Djangot, mis avaldab muljet oma skaleeritavuse aga ka parima arendajate tagasiside poolest [10]. from rest_framework import viewsets from.serializers import Cart from.models import CartSerializer class CartViewSet(viewsets.ViewSet): queryset = Cart.objects.all() serializer_class = CartSerializer Joonis 1. Django klassi põhised veebipäringud ostukorvide vaatamiseks, lisamiseks, muutmiseks ja kustutamiseks, mis päritakse ViewSet ülemklassist. 10

from django.http import HttpResponse from django.shortcuts import get_object_or_404 from.serializers import CartSerializer from.models import Cart def cart_view(request, pk): if request.method == 'GET': queryset = Cart.objects.all() serializer = CartSerializer(queryset, many=true) return HttpResponse(serializer.data) if request.method == 'DELETE': queryset = CartItem.objects.all() entity = get_object_or_404(queryset, pk=pk) entity.delete() return HttpResponse(CartSerializer(entity).data) Joonis 2. Django funktsiooni põhised veebipäringud ostukorvide vaatamiseks ja kustutamiseks. Üheks eriliseks Django omaduseks on joonisega 1 illustreeritud klassi põhised veebipäringud, kus kõikvõimalikud andmebaasi tabeliga seotud tegevused on koondatud Pythoni klassi sisse. Django dokumentatsiooni [11] andmetel olid algselt toetatud ainult funktsiooni põhised veebipäringud, mis on nähtav joonisel 2, kuid vajadus klassipõhisusele ilmnes suhteliselt kiiresti, kuna nähti, et veebipäringud enamjaolt moodustavad komplekti ja nende arendamisel korduvad mustrid. Funktsiooni põhised veebipäringud on kasulikud näiteks kohandatud loogika implementeerimisel, mis ei ei suhtle üldse andmebaasiga või ei ole ühe olemiga (entity) piiratud. Joonis 3. Java klass Product ei ole nähtav klassi Main jaoks juhul, kui pole defineeritud vastav luba kahe mooduli vahel. Seda nimetatakse tugevaks kapselduseks. 11

Spring arendusraamistik baseerub Java programmeerimiskeelel, mis annab rakendusele mitmeid eeliseid. Teame, et Java 9 kaasnesid Java moodulid, mis on sisuliselt aste kõrgemale Java pakettidest ning mis Paul Deiteli artiklist lugedes [12] võttis üle 10 aasta, et teostada. Moodulite abil saame rakenduse loogiliselt ümber korrastada alamrakendusteks, mis vaikimisi ei jaga üksteise vahel implementatsiooni ega ressursse. Joonisel 3 näidatakse, milline on vaikimisi seisund kahe Java mooduli vahel. import org.springframework.beans.factory.annotation.autowired; public class ToyremProductService { @Autowired private ToyremProductRepository repository; } Joonis 4. Spring kasutab objekti loomiseks Java refleksiooni, mis võib osutuda ebaefektiivseks. Refleksioon on realiseeritud java.lang.reflect paketis. public class ToyremProductService { private ToyremProductRepository repository; public ToyremProductService(ToyremProductRepository repository) { this.repository = repository; } } Joonis 5. Spring kasutab ToyremProductRepository objekti loomiseks konstruktorit. Spring i (ja.net) järgmiseks eeliseks on sõltuvuste süstimine (dependency injection), mis on mõeldud keelte jaoks nagu Java ja C#, kus tüübi kontroll toimub kompileerimisel. Sõltuvuste süstimisel antakse objektide loomise ülesanne kesksele süsteemile, mida nimetatakse IOC (Inversion of Control) konteineriks [13]. Kujutlus, kuidas Java virtuaalmasinas objekte luuakse ja kustutatakse automaatselt vastavalt rakenduse vajadusele, annab pildi, et tegemist on suurepärase viisiga mälu puhtana hoidmiseks. Spring i sõltuvuste süstimise eesmärgiliseks kasutamiseks on oluline mõista, et süstimist on kahte tüüpi: vastavalt joonisel 4 näidatud refleksiooni kaudu ja joonisel 5 konstruktori kaudu. 12

Sõltuvuste süstimine ei ole Pythoni keelel baseeruvale Djangole loomupärane, kuid on võimalik luua kohandatud lahendusi selle proovimiseks. from rest_framework import viewsets from.serializers import ProductSerializer from.models import Product class ProductViewSet(viewsets.ModelViewSet): queryset = Product.objects.all() serializer_class = ProductSerializer # SELECT * FROM product WHERE to_tsvector(name) @@ to_tsquery(:word) def get_queryset(self): queryset = self.queryset word = self.request.query_params.get('word') queryset = queryset.filter(name search=word) return queryset Joonis 6. Täistekstiotsingu tegemine Django veebipäringus, kus sõna on ette antud parameetriga word ja sõna otsitakse veerult name. Täistekstiotsingut kasutatakse veebipoodides märksõnade järgi otsimiseks. Django võimaldab täistekstiotsingut teha oma emakeeles ehk Pythoni keeles, kuid.net ja Java puhul peaks kasutama SQL keelt. Täistekstiotsing lubamine vajab Djangos pisut seadistamist, kuid see on väga lihtne: search otsimismeetod tuleb registreerida vastava andmebaasi mudeli peal, milleks joonisel 6 on toode. Java baas annab Spring ile eelise ElasticSearch i otsingumootoriga integreerimiseks, mida samuti arendatakse Java keeles [14]. Veebipoes müüdavate toodete kogus pidevalt kasvab ja seega on oluline mõelda päringute optimeerimise peale. ElasticSearch on populaarne mitterelatsioonilist andmebaasi kasutav rakendus, mis normaliseerib ja indekseerib andmeid [14]. ElasticSearch kasutades peaks mõtlema, kas ja kuidas sünkroniseerida andmeid otsingumootori andmebaasis ja rakenduse andmebaasis. ElasticSearch otsingumootorit saab integreerida ka.net ja Django rakendustega, küll aga ei pruugi Windows operatsioonisüsteemiga täielikult muganduda ja seetõttu ei saa keerulisi päringuid teha. 13

Lisaks ElasticSearch ile leidub ka teisi otsingumootoreid, mida võiks kaaluda, näiteks Sphinx, või ka liideseid ElasticSearchi kasutamiseks, nagu NEST.NET raamistiku jaoks. Kiiret arendamist, aga ka koodi jälgimist, soodustab Spring i pistikprogramm nimega Lombok. Lombok genereerib annotatsioonide abil konstruktoreid, settereid, gettereid, jpm. Rakenduses läheb vaja taustaprotsesside funktsionaalsust, näiteks makseviiside perioodiliseks küsimiseks Maksekeskuse käest..net ja Spring jaoks saab kasutada planeerimisraamistikku nagu Quartz. Quartz on üks parimaid planeerijaid tarkvaramaastikul, mis annab tohutult palju mänguruumi taustaprotsesside tegemisel. Quartziga on võimalik protsesse järjestada, panna tööle hajussüsteemis, defineerida eel- ja järeltegevusi ehk elutsükkel, jpm [15]. Django jaoks on võimalus kasutada andmebaasi protseduure, kui ei kasutata Django vaikimisi SQLite3 andmebaasi, või kasutada vabavaralist APScheduler teeki. import org.springframework.context.annotation.configuration; import org.springframework.security.config.annotation.web.configuration.enablewebsecurity; import org.springframework.security.config.annotation.web.configuration.websecurityconfigureradapter; import org.springframework.security.config.annotation.web.builders.httpsecurity; @EnableWebSecurity @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(httpsecurity http) throws Exception { http.csrf().disable(); } } Joonis 7. Päringuvõltsimise seadistamine Spring dokumentatsiooni järgi [16]. Üldiselt on.net, Spring ja Django kõik lihtsasti seadistavad. Kõik raamistikud pakuvad ammendavaid lahendusi veebiturvalisuse tagamiseks. Turvalised veebipäringud vajavad seadistamist eessüsteemis, näiteks päringuvõltsimise puhul tuleb vormile külge pookida põhisüsteemist saadud juhuslikult genereeritud väärtus. Djangos defineeritakse pistikprogrammid ja seadistamise parameetrid failis settings.py..net puhul enamasti tuleb uuendada rakenduse Startup klassi. 14

Spring konfigureerimine on natuke keerulisem, nagu joonisel 7 näeme: olenevalt sellest, mida tahetakse saavutada, tuleb luua alamklass vastava konfiguratsiooniklassi alla. Arendusraamistiku valimisel tuleks arvestada ka arendaja arenduskeskkonnast. Unix operatsioonisüsteem soosib pigem Spring ja Django raamistikke ja Windows operatsioonisüsteem.net i. 2.2 Eessüsteem Parima kasutajakogemuse saavutamiseks luuakse internetipoe jaoks dünaamiline veebileht, kus skriptimiskeele abil saavutatakse kiirus ja interaktiivsus. Professor Dave Chaffey [16] on näiteks defineerinud dünaamilist veebilehte kui süsteemi, kus: skripti jooksutatakse informatsiooni edastamiseks ja vormindamiseks vastavalt kasutaja vajadustele. Dünaamiline veebileht internetipoe kontekstis tähendab näiteks seda, et otsingutulemuste filtreerimisel värskendatakse terve veebilehe asemel ainult otsingutulemuste osa ja erinevate vaadete vahel navigeerimisel uuendatakse vajalik lehe sektsioon. JavaScript on üle 20 aasta vana skriptimiskeel ning on toetatud enamjaolt kõikide veebibrauserite poolt. Selles peatükis on vaadeldud kolme tuntud JavaScript keelel loodud raamistikku, milleks on Angular, Vue ja React. Kõik kolm raamistikku kasutavad komponentide arhitektuuri. Tehniliselt on terve veebileht jaotatud komponentideks, kus iga üksik komponent koosneb HTML dokumendist, CSS kujunduse reeglitest ja JavaScript skriptist. Iga komponendi jaoks eksisteerib oma elutsükkel, kus on defineeritud tegevused selle komponendi initsialiseerimisel, hävitamisel või parameetrite muutumisel. ReactDOM.render( <h1>hello, world!</h1>, document.getelementbyid('root') ); Joonis 8. Hello world teksti kuvamine veebilehel kasutades Reacti programmiliidest [17]. 15

React on huvitav raamistik selle poolest, et see kasutab enda sisemist virtuaalset dokumendiobjektide mudelit (document object model). See on ka põhjus, miks Reacti süntaks on niivõrd teistsugune võrreldes Angulari ja Vue ga. Joonisel 8 me näeme, kuidas React keeles toimub dokumendi manipuleerimine. Programmeerija ütleb virtuaalsele mudelile, mis olukord veebilehel valitsema peab ning virtuaalsele mudelile edastatud käsklused teisendatakse ümber reaalse dokumendi objektimudeli keelde. Vue eristub teistest raamistikest selle poolest, et tal puudub võimalus luua sama head Redux olekukonteinerit (state container) kui Reactis ja Angularis. Olekukonteineris on andmed selle kohta, mis olukord veebirakenduses parajasti on või võiks olla - millised elemendid peaksid nähtaval olema, veebipäringute saatmine, uuele veebilehele navigeerimine, sündmusele eelenevad ja järgnevad tegevused, jne. Niiviisi eemaldatakse äriloogika komponentide seest ja muudab need rumalaks, mis võimendab komponentide kapseldatust ja muudab sõltuvuste haldamise lihtsamaks. Angularil on olekukonteineri teek nimega NGRX, mis on inspireeritud Reduxist. Vue jaoks selline ametlik teek puudub, kuid leidub mitteametlik lahendus nagu vuex, mis imiteerib Redux stiili. <template> <p>{{ $t('hello') }}</p> </template> <script> export default { name: 'HelloI18n' } </script> <i18n> { "en": { "hello": "Hello i18n in SFC!" } } </i18n> Joonis 9. Vue rakenduses kuvatakse inglise keeles teksti Hello i18n in SFC!. Eesti keele toe saaks lisada nii, et <i18> elemendi sees olevas JSON objektis defineerida et võtmega tekst [18]. 16

Kõik vaadeldavad arendusraamistikud lubavad rahvusvahelistamist (i18n). Angulari enda sisseehitatud keeletugi on suhteliselt keerulise ülesehitusega, aga kasutades ngx-translate/core pistikprogrammi muutub tõlgete haldamine väga lihtsaks. Sarnaselt Reactiga tuleb tõlked defineerida JSON failides ning HTML dokumendis kasutada meetodit, mis kannab hoolt teksti tõlkimise eest. Vue on eriline selle poolest, et lisaks JSON failile on võimalik tõlked defineerida HTML elemendi kaudu komponendi sees, mida on näidatud joonisel 9. See on kasulik selles mõttes, et enamasti tõlkeid ei ole kombeks taaskasutada komponendi lõikes, kuid paraku muutub sellisel moel tõlgete haldamine keeruliseks, kuna tuleb hakata tõlkeid otsima mitmest failist. Kokkuvõttes sobivad Angular, Vue ja React kõik väga hästi veebipoe rajamiseks - siin tehnilisi eelistusi ei ole, vaid tuleb teha valik selle kasuks, mille stiil kõige rohkem meeldib. 17

3 Kasutatud tehnoloogia Veebipoe arendamiseks kasutati Django 3.2 ja Angular 11 raamistikke vastavalt põhisüsteemi ja eessüsteemi loomiseks. Ettevõttel puudus olemasolev veebirakenduse raamistik, seega tuli see nullist luua. Küll aga sai taaskasutada olemasoleva kodulehe vormingut. Loodud põhisüsteem ja eessüsteem hakkavad käitama paralleelselt Zone veebiserveril, et tagada veebipoe töö. 3.1 Django ja PostgreSQL Django on 2003. aastal loodud avatud lähtekoodiga veebiarendusraamistik, mis põhineb Pythoni programmeerimiskeelel [19]. Django kasutamiseks on kasulik objektorienteeritud programmeerimiskeele kogemus, aga tänu põhjalikule dokumentatsioonile saab rakenduse arendamisega tõenäoliselt hakkama ka algaja. Veebipood kasutab PostgreSQL 10 andmebaasi, mis luuakse Dockeri skripti abil. Arenduskeskkonnas jookseb andmebaas Docker i konteineris ja põhisüsteem operatsioonisüsteemil. Kuna Django eelistatud SQLite andmebaasi jaoks ei leidnud head haldustarkvara, siis osutus järgmiseks valikuks PostgreSQL andmebaas. Kuigi andmebaas luuakse Docker skripti abil, siis rakenduse poolt kasutatavad tabelid sisestatakse andmebaasi siiski Django objektist relatsiooniks teisendustarkvara (object relational mapper) abil. 18

from rest_framework import viewsets from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.response import Response from.serializers import * from.models import * SESSION_ID = 'toyrem-shop' class CartItemViewSet(viewsets.ModelViewSet): def create(self, request): try: if request.session[session_id]['cart']['id']!= request.data['cart']: return Response(data='Unknown cart!', status=http_400_bad_request) except KeyError: pass serializer = CartItemSerializer(data=request.data) serializer.is_valid(raise_exception=true) serializer.save() return Response(serializer.data) Joonis 10. Olukord, kui kasutaja on andnud nõusoleku küpsiste kasutamiseks - enne ostukorvi toote lisamist kontrollitakse, et kasutaja ei saaks võõrast ostukorvi muuta. Ostukorvi mäletamiseks kasutatakse aegumistähtajaga brauseri küpsiseid. Ostukorvi initsialiseerimisel krüpteerib Django ostukorvi andmed, seob andmed sessiooniga ja salvestab need andmebaasi. Loodud sessiooni võti salvestatakse kasutaja küpsistesse ja see aegub 2 tundi peale loomist. Krüpteerimiseks kasutatakse vaikimisi sha256 algoritmi [20]. Kui klient keelab küpsiste kasutamise, siis sessiooni ei looda ja seetõttu veebilehe värskendamisel lähtestatakse ostukorv. Andmehalduseks kasutatakse Django projektiga kaasnevat administraatori portaali, mis on kättesaadav /admin lõpuga aadressilt. Administraatori portaalis on ülevaade veebipoes olevatest toodetest, ostukorvidest ja süsteemsetest parameetritest. 19

3.2 Angular ja NGRX Eessüsteemi loomiseks on kasutatud Angular 11 arendusraamistikku. Komponentide tegemisel on järgitud ära korda ennast ehk DRY (don t repeat yourself) filosoofiat ja valdkonnapõhist disaini (domain driven design). import { EntityState } from "@ngrx/entity"; import { createreducer, on } from "@ngrx/store"; import * as CategoriesActions from "./categories.actions"; import { CategoriesEntity } from "./categories.models"; export interface State extends EntityState<CategoriesEntity> { selectedid?: number; loaded: boolean; } const categoriesreducer = createreducer( initialstate, on(categoriesactions.loadcategoriessuccess, (state, { categories }) => categoriesadapter.setall(categories, {...state, loaded: true }) ), on(categoriesactions.selectcategory, (state, { category }) => ({...state, selectedid: category.id })) ); Joonis 11. Näide, kuidas toimub tootekategooriate seisu muutmine peale kategooriate edukat allalaadimist serverist või peale kategooria valimist. Rakenduses kasutatakse NGRX olekukonteinerit. Konteineris olevaid tegevusi kutsutakse välja dokumendiobjekti mudeli muutuste peale. Näiteks, joonisel 11 näeme, et kui kasutaja on veebilehel klikkinud kategooria peale, siis olekukonterineris uuendatakse ära väli, kuhu salvestatakse hetkel valitud kategooria identifikaator. Silumisprotsessis (debugging) kasutatakse Google Chrome i brauseri pluginat Redux, kus on võimalik jälgida seisu 20

muudatusi. Redux plugin on ühtlasi ka hea nendele, kes ei ole olekukonteineritega kokku puutunud ja soovivad näha, milline on olekukonteineri ülesehitus. Tõlgete haldamiseks kasutatakse Angulari teeki ngx-translate/core. Selle teegiga kaasneb klass TranslatePipe, mis kannab hoolt selle eest, et teksti tõlge muutuks vastavalt rakenduses valitud keelele. Keelevalikut brauseri küpsistesse ei salvestata, kuid tulevikus võiks seda kaaluda, et ka peale lehe värskendamist oleks veebipood eelistatud keeles. Ostukorvi maksmisel saadetakse keelevalik põhisüsteemi, kust see saadetakse edasi Maksekeskuse makseväravasse. Enamik kujundusest on üle võetud ettevõtte koduleheküljelt. Koduleheküljel on stiilireegleid väga palju, kuid veebipoes enamik komponente tõenäoliselt ei leia kasutust. Kõik CSS reeglid vajavad detailset üle vaatamist ja seetõttu on tegemist kõige aeglasema protsessiga rakenduse arenduses. 3.3 Makseviisid { } "transaction":{ "amount":"12.95", "currency":"eur", "reference":"123abc", "merchant_data":"" }, "customer":{ "email":"mk.test@maksekeskus.ee", "ip":"80.235.22.114", "country":"ee", "locale":"et" } Joonis 12. Näidisandmed, mis tuleb sisendiks anda Maksekeskuse transaktsiooni loomisel [21]. Veebipood kasutab Maksekeskuse programmiliidest päringute tegemiseks. Ostukorvi eest maksma minnes tehakse esimese päringuna transaktsiooni loomise päring, mille 21

sisendandmete näidis on joonisel 12. Arendamisel on kasutatud Maksekeskuse avalikku testkeskkonna portaali ja programmiliidest [22]. Veebipoe taustaprotsess küsib perioodiliselt Maksekeskuse programmiliidese kaudu Toyrem OÜ jaoks aktiveeritud makseviisid ja salvestab need rakenduse andmebaasi. Iga makseviisi juures kuvatakse Maksekeskuse poolt määratud logo. Makseviiside seadistamine toimub täielikult Maksekeskuse lehe kaudu ning ei ole konfigureeritav veebipoe administraatori portaalis. 22

Kokkuvõte Käesoleva bakalaureusetöö raames alustati veebipoe rajamist ettevõttele Toyrem OÜ. Bakalaureusetöö koosneb loodava veebipoe eelanalüüsist, veebipoe loomist võimaldavate tehnoloogiate võrdlemisest ja kasutatud tehnoloogia analüüsist. Töö tulemusena valmis kaasaegsel tehnoloogial baseeruv veebipoe alus, mille põhisüsteem asub repositooriumis https://github.com/emmakuppart/toyrem-api ja eessüsteem https://github.com/emmakuppart/toyrem-ui. Veebipood vajab veel arendamist ja seetõttu ei ole rakendus veel veebiserverisse panekuks valmis. 23

Kasutatud kirjandus [1] Väät, Tõnu. Eesti e-kaubanduse statistika ja trendid. https://e-kaubanduseliit.ee/eesti-e-kaubanduse-statistika/ (09.01.2021) [2] Bruinsma, Eelco jt. Maintained. Quality Principles for Cultural Websites: a Handbook. Minerva Project, 2005, 28. (09.01.2021) [3] Isikuandmete kaitse üldmäärus (2016). Euroopa Liidu Teataja I, 27.04.2016, 3, 13. https://eur-lex.europa.eu/legal-content/et/txt/pdf/?uri=celex:32016r0679&&fr om=et (10.01.2021) [4] Kerner, S.M. Wordpress 4.9.6 Update Helps Websites prepare for GDPR. eweek, 2018, 1-2. (31.12.2020) [5] Javascript ründed. Päringuvõltsing. Tartu Ülikool, 2015/16. https://courses.cs.ut.ee/2015/infsec/et/ohudveebis (02.03.2021) [6] Marsic, Ivan. HTTPS - Secure HTTP. Software Engineering. New Jersey: Ivan Marsic, 2012, 441. (02.01.2021) [10] Kaluža, Marin jt. Basic criteria for FW comparison. A Comparison of back-end frameworks for web application development. (01.02.2021) [11] The relationship and history of generic views, class-based views, and class-based generic views. Introduction to class-based views. Django Software Foundation. https://docs.djangoproject.com/en/3.2/topics/class-based-views/intro/ (08.04.2021) [12] Deitel, Paul. History. Understanding Java 9 Modules. Oracle. https://www.oracle.com/corporate/features/understanding-java-9-modules.html (10.04.2021) [13] Crusoveanu, Loredana. What is Inversion of Control? Intro to Inversion of Control and Dependency Injection with Spring. Baledung, 2021. https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring (30.04.2021) [14] What is ElasticSearch? JavaTpoint, 2021. https://www.javatpoint.com/elasticsearch (02.05.2021) [15] Lahma, Marko. Job Scheduling. Features. 2021. https://www.quartz-scheduler.net/features.html 24

[16] Chaffey, Dave. Development of web-based content and services. E-Business and E-Commerce Management. Pearson Education Limited, 2000, 473. (02.01.2021) [17] Hello World. Docs. Facebook Inc, 2021. https://reactjs.org/docs/hello-world.html (05.05.2021) [18] Löw, Andreas. How to translate your Vue.js application with vue-18n. Tutorials. CodeAndWeb GmbH, 2009-2021. https://www.codeandweb.com/babeledit/tutorials/how-to-translate-your-vue-app-withvue-i18n (05.05.2021) [19] Django History. Guides. Education Ecosystem, 2019. https://www.education-ecosystem.com/guides/programming/django/history (02.01.2021) [20] Settings. Documentation. Django Software Foundation, 2005-2021. https://docs.djangoproject.com/en/3.2/ref/settings/#std:setting-secret_key (03.05.2021) [21] Create transaction. Transaction. Maksekeskus AS, 2021. https://developer.maksekeskus.ee//reference.php (07.05.2021) [22] Getting started. Environments & Endpoints. Maksekeskus AS, 2021. https://developer.maksekeskus.ee//reference.php (07.05.2021) 25

Litsents Mina, Emma Kuppart, (autori nimi) 1. annan Tartu Ülikoolile tasuta loa (lihtlitsentsi) minu loodud teose Internetipood ettevõttele Toyrem OÜ, (lõputöö nimi) mille juhendaja on Tõnu Tamme, (juhendaja nimi) reprodutseerimiseks eesmärgiga seda säilitada, sealhulgas lisada digitaalarhiivi DSpace kuni autoriõiguse kehtivuse lõppemiseni. 2. Annan Tartu Ülikoolile loa teha punktis 1 nimetatud teos üldsusele kättesaadavaks Tartu Ülikooli veebikeskkonnas, sealhulgas digitaalarhiivi DSpace kaudu Creative Commonsi litsentsiga CC BY NC ND 3.0, mis lubab autorile viidates teost reprodutseerida, levitada ja üldsusele suunata ning keelab luua tuletatud teost ja kasutada teost ärieesmärgil, kuni autoriõiguse kehtivuse lõppemiseni. 3. Olen teadlik, et punktides 1 ja 2 nimetatud õigused jäävad alles ka autorile. 4. Kinnitan, et lihtlitsentsi andmisega ei riku ma teiste isikute intellektuaalomandi ega isikuandmete kaitse õigusaktidest tulenevaid õigusi. Emma Kuppart 07.05.2021 26