Academia de Studii Economice din București [303405]
[anonimizat]-Nemedi Iulian
Absolvent: [anonimizat] 2017
Declarație privind originalitatea conținutului și asumarea răspunderii
Prin prezenta declar că rezultatele prezentate în această lucrare sunt în întregime rezultatul propriei mele creații cu excepția cazului în care se fac referiri la rezultatele altor autori. Confirm faptul că orice material folosit din alte surse (reviste, cărți, [anonimizat]) este în mod clar referit în lucrare și este indicat în lista de referințe bibliografice.
Cuprins
1. Introducere
Transportul de pasageri interurban reprezintă o necesitate a populației de bază cât și o sursă însemnată de venit pentru cei ce prestează serviciile de transport de pasageri. [anonimizat], maritimă și aeriană. [anonimizat] 2016, a înregistrat o creștere de 8% comparativ cu anul 2015. În anul 2016 [anonimizat] (78,9%) o [anonimizat]-se transportul feroviar (16,8%) [anonimizat] 4,3%, transportul maritim reprezentând o valoare sub 0,05%. Cu certitudine putem spune că principalul mod de asigurare a mobilității persoanelor este transportul rutier de persoane.
În urma unei analize a [anonimizat], [anonimizat] a rezerva online o [anonimizat], dată, durată și preț. Una din problemele identificate de mine ca client, e necesitatea verificării diferitor companii de transport pentru a face o [anonimizat]. Simțeam nevoia centralizării tuturor companiilor pentru a avea o imagine clară și a efectua o comparație în timp util. Altă problemă identificată este imposibilitatea de a-[anonimizat].
Aplicația dezvoltată în cadrul lucrării de licențe oferă facilitatea de rezervare a locurilor in transport pentru o [anonimizat], pentru cei ce doresc efectuarea unei rezervări și pentru firme care prestează servicii de transport de pasageri. [anonimizat] a adăuga o rută și a specifica detaliile aferente acestei rute și la fel pot să î-[anonimizat]: autocar, microbuz și tren. [anonimizat] a rutelor postate de firme și rezervarea locului dorit în transport. Toate datele aferente aplicației sunt stocate într-o [anonimizat]. Aplicația avută în vedere are ca obiectiv facilitarea și simplificarea procesului de rezervare a unui bilet de rută interurban cu ajutorul noilor tehnologii informatice.
Lucrarea dată este structurată în patru capitole care descriu din diferite puncte de vedere aplicația dată, introducerea în domeniul selectat, prezentarea analiza și proiectarea sistemului informatic, detaliile privind implementarea aplicației și concluziile finale.
Primul capitol reprezintă introducerea, ce face o mică prezentarea a problemei existente, precum și eventuale soluții pentru problema identificată. La fel prezintă și o scurtă descriere a aplicației.
Al doilea capitol descrie pașii de proiectare a sistemului informatic, precum prezentarea, analiza și proiectarea sistemului. Acest capitol conține diferite tipuri de diagrame UML pentru a avea o viziune mai simplificată asupra sistemului.
Al treilea capitol prezintă partea de implementare a aplicației și demonstrează funcționalităție sistemului. La fel capitolul dat conține date despre tehnologiile folosite și detaliile privind algoritmii folosiți cu scurte exemple de cod.
Ultimul capitol reprezintă concluzia finală în urma analizei acestui domeniu și implementarea unei astfel de aplicații. Totodată conține și detalii privind direcțiile de dezvoltare viitoare a alicației.
2. Proiectarea aplicației
Prezentarea sistemului informatic
Descrierea generală a sistemului informatic
Scopul aplicației date este realizarea aplicației mobile pentru gestiunea rezervărilor biletelor unei rute de transport interurban. În vederea realizării unei rezervări, utilizatorul are nevoie de un cont în sistem, după care are la alegere rutele disponibile pe ecran la care poate face o rezervare, selectând ruta și apoi locul, după care va fi primi o notificare de confirmare. Confirmarea are loc prin email sau prin telefon de către administratorul rutei, rezervare este validă doar pentru maxim 4 persoane de pe un cont, la fel utilizatorul poate anula rezervarea doar cu maxim 24 de ore înaintea timpului de plecare a transportului. Pentru publicarea unei rute este nevoie de un cont de tip administrator, oferit doar de proprietarul aplicației și de minim un transport disponibil în parc. Aplicația avută în vedere are ca obiectiv facilitarea și simplificarea procesului de rezervare a unui bilet interurban cu ajutorul noilor tehnologii informatice.
Specificarea cerințelor
Aplicația dată urmărește scopul de a reduce timpul destinat procesului de rezervare a unui bilet de transport interurban și oferă confortul clientului de a selecta desinestătător locul în transport.
Capitolul dat are rolul de a specifica detaliile funcționale a cerințelor ce trebuie să le rezolve aplicația software pentru soluționarea obiectivelor menționate mai sus, cât și prezentarea metodologiei de proiectare.
Prin intermediul diagramelor a cazurilor de utilizare sunt identificate și realizate cerințele funcționale aferente aplicației în timpul dezvoltării. Diagramele date ne prezintă modul în care sistemul informatic va fi utilizat prin prezentarea actorilor și a acțiunilor întreprinse de ei, numite cazuri de utilizare.
Diagrama cazurilor de utilizare aferente clientului
Figura 2.1. Diagrama cazurilor de utilizare pentru client
Cum vedem în diagrama de mai sus, clientului îi sunt oferite facilități precum vizualizarea rutelor prin intermediul unei căutări în funcție de oraș, vizualizarea rezervărilor efectuate de el precum și oportunitatea de anulare a rezervării efectuate respectând condițiile impuse de aplicație, adăugarea rutelor preferate la favorite și accesarea lor în timp util, vizualizarea profilului și posibilitatea de editarea a informaților personale. În momentul în care clientul înaintează o cerere de rezervare de loc la ruta dorită, i se afișează harta locurilor a transportului, scaunele indicate cu roșu fiind deja rezervate și celelalte colorate gri sunt disponibile. Clientul poate rezerva de pe un cont maxim 4 locuri la o rută. Toate facilitățile descrise mai sus sunt disponibile doar pentru clienții ce s-au înregistrat în sistem și s-au autentificat.
Tabel 2.1. Descrierea elementelor cazurilor de utilizare pentru utilizator
Diagrama cazurilor de utilizare aferente administratorului
Figura 2.2. Diagrama cazurilor de utilizare pentru administrator
După cum vedem în diagrama prezentă mai sus, administratorul are în mare parte alte cazuri de utilizare față de client dar totodată sunt dependenți unu de altul. Administratorul are oportunitatea de a adăuga o rută în sistem cu condiția că are transport disponibil, ulterior ca să poată fi găsit în activitatea de căutare a clientului. Administratorul poate să își vizualizeze parcul de transport și ulterior la necesitate să modifice datele transporturilor. Totodată administratorul poate să î-și lărgească parcul de transporturi adăugând în sistem alte transporturi deținute. La fel ca și clientul are posibilitatea de a-și vizualiza profilul și la dorință să î-și modifice datele personale. Toate facilitățile de mai sus sunt exclusiv destinate persoanelor sau firmelor cu drepturi aferente transportului de persoane. Aceste tipuri de conturi (administrator) sunt obținute doar în urma validării datelor de către administratorul sistemului.
Tabel 2.2. Descrierea elementelor cazurilor de utilizare pentru administrator
Analiza sistemului informatic
Diagrama de activitate
Diagrama de activitate este folosită pentru a descrie fluxul de lucru dintr-un punct de start până la un punct de sfârșit, amănunțind drumurile de decizie care apar într-o activitate.
Figura 2.3. Diagrama de activitate pentru rezervarea unui loc
Diagrama de mai sus prezintă fluxul de activitate în cazul rezervării unui loc. Clientul selectează ruta interesată, după care trebuie să aleagă locul dorit în transport. Sistemul primește datele de la utilizator, verifică dacă acest utilizator a mai efectuat o rezervare la această rută, dacă da primește o notificare că nu mai poate efectua rezervări la această rută, dacă nu i se oferă informații detaliate despre rută, după care clientul trebuie să î-și confirme rezervarea. În caz de acceptare, rezervarea este adăugată în baza de date a aplicației și primește confirmare a rezervării, la fel poate refuza rezervarea în acest moment.
Diagrama claselor
Diagrama claselor reprezintă sistemul din punct de vedere structural remarcând clasele acestuia și relațiile dintre ele. Diagrama claselor e compusă din câteva elemente principale: clasă, interfață și relație. Diagrama de clase este folosită în diferite etape ale procesului de dezvoltare a sistemului pentru definirea modelului conceptual și reprezentarea entităților de bază ale sistemului.
Figura 2.4. Diagrama claselor
Cum vedem în figura de mai sus avem clasa Administrator și Client derivate din clasa User. Administratorul are relația de agregare partajată cu clasa Ruta și Transport. Administratorul poate avea mai multe instanțe de Ruta și Transport, multiplicitatea fiind 1..*, la rândul său o instanță de Transport sau Ruta poate fi asociată doar de un singur Administrator. Relația între Transport și Ruta este de agregare compusă, deoarece o rută nu poate exista fără un transport asociat. O instanță de rută poate avea un singur transport asociat, pe când un transport poate fi asociat mai multor rute, respectând condiția că nu va fi asociat la două rute ale căror dată și oră se suprapun. Clientul are relația de asociere cu clasa Transport și Rezervare, un Client având posibilitatea să fie asociat mai multor transporturi și mai multor rezervări, la rândul său o Rezervare fiind asociată doar unui Client iar Transport având multiplicitatea cu Client 1..*, totodată unei Rezervări se asociază doar un Transport.
Diagramele de interacțiune
Diagramele de interacțiune conțin actorii, obiectele sau componentele ce formează o interacțiune și redau mesajele interschimbate în timpul interacțiunii.
Diagramele de secvență
Diagrama de secvență este o diagramă de interacțiune formată din obiectele, mesajele care sunt transmise între actori și evidențiază ordinea mesajelor în dependență de timp.
Figura 2.5. Diagrama de secvență pentru crearea unei rute
Pentru crearea unei rute administratorul are nevoie de cel puțin un transport. Crearea unui transport presupune completarea unui formular aferent după care aceste date sunt trimise către server de către sistem pentru validare, în caz că transportul nu este prezent în baza de date, este adăugat, altfel este trimisă o eroare. În caz de succes administratorul primește un mesaj de succes și transportul este adăugat în parcul său. Pentru crearea unei rute la fel se completează un formular valid, după completare administratorul primește un review la ce a completat și confirmă datele. După care datele sunt transmise către server pentru adăugare în baza de date și administratorul este avizat în caz de succes sau eroare.
Figura 2.6. Diagrama de secvență pentru rezervarea unui loc
Pentru a-și rezerva un loc, clientul pentru început trebuie să caute ruta dorită, în momentul căutării, sistemul transmite datele de căutare către server pentru a primi cursele disponibile în baza de date. Serverul răspunde cererii cu datele căutate de user și ulterior le are afișate pe ecran. Clientul selectează ruta dorită, obține detalii aferente rutei, după care poate să înainteze o cerere de rezervare. După asta clientului i se afișează harta locurilor unde sunt afișate locurile libere și rezervate, ulterior clientul poate să aleagă locul dorit. După confirmarea locului, de către client, sistemul trimite datele către server și baza de date se actualizează, după care transmite un mesaj de succes clientului. Clientul poate și să refuze confirmarea.
Diagrama de stare
Diagrama de stare are rolul de modelare a stării dinamice a unui obiect în parte.
Figura 2.7. Diagrama de stare pentru clasa Ruta
Conform diagramei de mai sus vedem ce stări poate avea clasa Ruta, după inițializare se verifică dacă au fost introduse date valide dacă nu se întoarce la etapa precedentă, dacă da ruta este validată și publicată după care i se adaugă un transport. În caz că se depistează ca ruta nu are transport ruta se desființează automat.
Diagramele BPMN
Business Process Modeling Notation (BPMN) este o notație ce definește procesele de afacerii dintr-un workflow. BPMN este un limbaj înțeles atât utilizatorilor tehnici cât și de utilizatorii de business.
Figura 2.8. Diagrama BPMN pentru obținerea contului de tip Administrator
Mai sus vedem o diagramă BPMN ce descrie procesul de obținere a contului de tip utilizator, astfel pentru a deveni administrator e nevoie de furnizarea documentelor ce confirmă faptul că aveți dreptul să transportați persoane și dispuneți de transport.
Proiectarea sistemului informatic
Proiectarea bazei de date
La acest stadiu, în urma analizei cerințelor sistemului, se realizează modelarea cerințelor de date utilizând un model de nivel înalt. Proiectarea conceptuală a bazei de date admite crearea unui model al informațiilor care urmează să fie utilizate de către sistem în așa fel ca modelul dat să nu țină cont de resursele fizice.
O schemă a bazei de date este scheletul care reprezintă imaginea logică a întregii baze de date. Aceasta definește modul în care sunt organizate datele și relațiile dintre ele. Schema formulează toate constrângerile care trebuie aplicate datelor.
Deoarece modelul de date a aplicației este unul rațional, sistemul de gestiune a bazelor de date utilizat în cazul dat este MySql dezvoltat de Oracle, de asemenea, un SGBD relațional. Schema logică a bazei de date este prezentată mai jos și a fost generată utilizând un serviciu web.
Figura 2.9. Schema bazei de date. Sursa: www.genmymodel.com
Aplicația prezentă activează cu un număr de 4 tabele care au între ele mai multe relații. Pentru funcționarea aplicației, baza de date are nevoie de următoarele tabele: users, transports, reservations și routes.
Tabela users gestionează datele aferente profilului unui utilizator. Cheia primară a tabelei este id-ul. Aceasta și email-ul identifică în mod unic un utilizator. Toate câmpurile sunt obligatorii.
Tabela transports gestionează datele aferente unui transport. Cheia primară este id-ul. Aceasta și regNr identifică un transport în mod unic. Toate câmpurile nu pot fi nule.
Tabela routes lucrează cu datele ce compun o rută. Cheia primară este id-ul. Tabela are și o cheie externă care identifică un transport unic în funcție de numărul de înmatriculare. Cheia primară identifică o rută în mod unic. Toate câmpurile sunt obligatorii.
Tabela reservations administrează datele aferente unei rezervări. Tabela are două chei externe care identifică ruta și clientul care a efectuat rezervarea. Cheia primară este id-ul. La fel toate câmpurile sunt obligatorii.
Diagrama de componente
Componentele sunt module compuse din diferite tipuri de cod. Diagrama de componente are rolul de a descrie componentele principale implementate de sistem și dependențele acestora. Este folosit preponderent de dezvoltatorii aplicațiilor.
Diagrama componentelor prezintă fișierele sistemului informatic în care vor folosi clasele aplicației. Sistemul prezent are următoarele componente: program sursă (.java, .js), program executabil (.apk).
Figura 2.10. Diagrama de componente. Sursa: www.creately.com
Diagrama de desfășurare
Diagrama de desfășurare descrie structura aplicației în momentul executării. Astfel aplicația pentru rezervarea biletelor conține componentele ce interacționează pentru executarea programului implementat:
Dispozitive mobile(Android)
Serverul ce conține baza de date
Rețeaua de internet
Figura 2.10. Diagrama de desfășurare a aplicației.
Securizarea aplicației
Sistemul de operare Android are o mulțime de caracteristici de securitate integrate, ca de exemplu sandbox-ul aplicației, protecția împotriva buffer-ului și a atacurilor de supraîncărcare asupra datelor de tipul Integer. Ca urmare aplicațiile Android simple care nu prelucrează nici un fișier din sistem sau operații în rețea pot fi considerate aplicații securizate implicit.
Dacă dezvoltăm o aplicație mai complexă, este responsabilitatea dezvoltatorului să asigure și să protejeze confidențialitatea utilizatorului. În urmare voi enumera măsurile implementate în aplicație pentru securizarea ei.
Validarea intrărilor. Toate datele introduse în aplicație conțin validatori și nu permit introducerea informațiilor eronate, un prim pas pentru securizarea aplicației.
Pagină de autentificare. Aplicația dispune de o pagină de autentificare, pentru a permite unui utilizator să folosească aplicația. În caz că nu are cont, va fi nevoit să se înregistreze în sistem.
Stocarea datelor criptate pe dispozitivele externe. Aplicația în cauză dispune de un algoritm de criptare a parolelor. Parolele sunt criptate pe dispozitiv, mai apoi transmise și stocate pe server în format criptat. Modalitatea de criptare folosită este una standard de a obține o cheie criptată simetrică definită în PKCS #5 (Public Key Cryptography Standard) publicată de RCS. Standardul se bazează pe două idei principale: folosirea unei chei salt pentru a proteja atacurile asupra dicționarului de tabele asistate și folosirea unui număr mare de iterații pentru a face derivarea cheii costisitoare din punct de vedere computațional(key-streching).
Testarea aplicației continue. Aplicația dată a fost supusă testelor de fiecare dată ce s-au adăugat caracteristici noi.
Utilizare Intent-ului pentru transfer de date între aplicații. Activitatea expeditoare a intent-ului poate verifica dacă activitatea destinatară are permisiune, specificând o permisiune nenulă, odată cu apelul metodei. Numai activitățile cu această permisiune au acces la acest Intent.
Evitarea obținerii datelor personale de la utilizatori. Securitatea datelor personale în zilele de astăzi este foarte importantă. De fapt există legi, cum ar fi European Union's Data Protection Directive, ce obligă securizarea datelor personale a utilizatorilor.
Îmbunătățirea continuă a securității. Cât de securizată ne-ar părea o aplicație, totuși există câteodată puncte vulnerabile. Sporirea securității continue va seta noi standarde de securitate și va îngreuna lucrul celor care încearcă să penetreze aplicația. Pe viitor se presupune criptarea tuturor datelor ce se stochează în baza de date.
3. Implementarea aplicației
Tehnologii utilizate
Tehnologia principală în jurul căreia a fost dezvoltată aplicația este Android. Android-ul este un sistem de operare, bazat pe linux, destinat dispozitivelor mobile și dezvoltat de Google. Sistemul de operare în mare parte este manipulat de gesturi pe un ecran tactil. Am ales această tehnologie pentru că oferă facilități de dezvoltare, dat fiind faptul, că este un proiect open-source. Android-ul oferă instrumente pentru crearea de aplicații mobile care să arate foarte bine și să profite la maxim de capacitățile hardware pe orice dispozitiv compatibil. Interfața se adaptează automat, pentru a oferi o experiență maximă utilizatorului și control, pe fiecare dispozitiv.
Android-ul este instalat pe sute de milioane de dispozitive global, în mai mult de 190 de țări. Este cel mai instalat sistem de operare pe platformele mobile, inclusiv în România, și continuă să crească de la o zi la alta. La fel Android oferă o piață deschisă pentru a distribui imediat aplicațiile create de dezvoltator, serviciul numindu-se Google Play.
Pentru a dezvolta aplicații compatibile cu sistemul de operare Android, Google ne oferă un mediu de dezvoltare integrat numit Android Studio. Acesta oferă dezvoltatorilor, toate instrumentele necesare pentru a construi o aplicație compatibilă. Android Studio este un IDE bazat pe IntelliJ IDEA și este distribuit gratuit. Aplicația este destinată echipelor de dezvoltare de o persoană sau echipelor mari și multinaționale. Android studio oferă următoarele facilități:
Un sistem flexibil de Build bazat pe Gradle.
Un emulator rapid cu o mulțime de facilități
Un mediu unificat unde puteți dezvolta aplicații pentru toate tipurile de dispozitive.
Posibilitatea de rulare a aplicației cu ultimele modificări efectuate fără a crea un nou APK.
Șabloane de coduri disponibile și integrare GitHub pentru ajutorul construirii de caracteristici comune și pentru importarea exemplelor de coduri existente.
Instrumente pentru a detecta performanța, gradul de utilizare, compatibilitatea versiunilor și alte probleme.
Pentru a permite unui programator să dezvolte aplicații Android este nevoie de un kit de dezvoltare software numit Android SDK. SDK-ul Android include exemple de proiecte cu cod sursă, instrumente de dezvoltare, emulator și biblioteci necesare pentru a construi aplicații Android. Aplicațiile sunt scrise în limbajul de programare Java și rulează pe Dalvik, o mașină virtuală personalizată concepută pentru utilizare încorporată care rulează pe un kernel Linux.
Tehnologia Java este utilizată pentru a dezvolta aplicații pentru o gamă largă de medii, de la dispozitive destinate consumatorilor la sisteme de întreprinderi eterogene. Limbajul Java, ca orice alt limbaj de programare, are propria structură, reguli de sintaxă și paradigmă de programare. Paradigma de programare a limbajului este bazată pe principiile de POO, care este sprijinit de funcțiile limbajului. Limbajul Java este un derivat al limbajului C, de aceea se pot observa reguli de sintaxă comune. De exemplu, blocurile de cod sunt modularizate în metode și delimitate de acolade, și variabilele sunt declarate la început, înainte de a fi utilizate. Din punct de vedere structural Java e compus din pachete. Pachetul este mecanismul de namespace a limbajului Java. În pachete sunt definite clase, iar in clase sunt definite metode, variabile, constante etc.
Codul sursă, scris de programator, se află în fișiere cu extensia .java și apoi sunt compilate. Compilatorul verifică codul pentru a detecta erorile de sintaxă ale limbajului, apoi scrie byte code-ul în fișiere de tip .class. Bytecode-ul este un set de instrucțiuni pentru executare pe mașina virtuală Java (engleză Java Virtual Machine, prescurtat JVM). La runtime, mașina virtuală citește și interpretează fișierele .class și execută instrucțiunile programului pe platforma hardware pentru care a fost scris JVM-ul. Mașina virtuală Java interpretează byte code-ul la fel cum procesorul interpretează instrucțiunile unui limbaj de asamblare, doar că diferența este că JVM este o parte de software scrisă pentru o anumită platformă. JVM este disponibil pe platforme precum Windows, Linux, iar subseturile limbajului Java au fost implementate în JVM-uri pentru dispozitive mobile și microcip-uri.
Figura 3.3. Procesul de executare a unei aplicații Java.
Sursa: http://www.media-art-online.org/java/help/how-it-works.html
Odată ce o aplicație Java creează o instanță de obiect, JVM alocă automat spațiul de memorie necesar, pentru obiectul dat, din Heap – memoria dinamică rezervată pentru program. Garbage Collector rulează în fundal, urmărind obiectele pe care aplicația nu le mai referențiază și recuperează memoria de la aceasta. Această abordare a gestiunii memoriei este numită gestiunea implicită a memoriei, pentru că nu necesită scrierea unui cod pentru manipularea memoriei.
Pentru dezvoltarea interfețelor cu utilizatorul (engleză UI), arhitectura Android oferă niște scheme de amplasare numite în engleză layouts. Aceste layout-uri definesc structura vizuală pentru UI, cum ar fi pentru activități, widget etc. Layout-urile se definesc în două moduri:
Declararea elementelor UI în fișiere XML.
Instanțierea elementelor layout-ului la runtime.
XML (din engleză Extensible Markup Language) reprezintă un set de reguli pentru codificarea documentelor în forma înțeleasă de mașini. XML este un format popular pentru partajarea datelor pe internet. Site-urile web care permanent î-și modifică conținutul, cum ar fi bloguri și site-urile de știri, sunt bazate pe fișierele XML pentru ca programele externe să fie la curent cu schimbările efectuate, în timp util.
Avantajul declarării elementelor UI în XML este că permite separarea mai bună a prezentării aplicației de codul care controlează comportamentul acesteia. Descrierea UI-ului este în afara codului de bază a aplicației, ceea ce înseamnă că putem face modificări, în aceste fișiere XML, și vizualiza rezultatul fără recompilarea codului de bază. În plus, declararea layout-urilor în XML facilitează vizualizarea structurii UI-ului, deci este mai ușor de depanat problemele intervenite.
Conectivitatea și transferul datelor, în rețea, între aplicație și server-ul ce conține baza de date, este garantată de către protocolul HTTP (din engleză Hypertext Transfer Protocol). HTTP este protocolul de bază utilizat de rețeaua globală de internet (din engleză World Wide Web, WWW) și acesta definește modul în care mesajele sunt formatate și transmise și ce acțiuni ar trebui să întreprindă serverele Web și browser-ele ca răspuns la diferite comenzi. HTTP este proiectat pentru a permite elementelor intermediare din rețea să permită comunicarea sau îmbunătățirea acesteia între clienți și server.
Figura 3.4. Arhitectura HTTP. Sursa: www.tutorialspoint.com
Datele necesare comunicării în rețea aplicației și serverul sunt încapsulate în JSON. Din engleză JavaScript Object Notation (JSON) este un format ușor de schimb de date. Este ușor de interpretat și de scris pentru oameni. Este ușor pentru mașini de calcul să le genereze și să le parseze. JSON este compus din 2 structuri: o colecție de perechi cheie-valoare reprezentate ca un obiect sau o listă ordonată de valori reprezentată ca un vector de obiecte.
Tehnologia de bază în realizarea server-ului cu baza de date este Node.js. Node.js este o platformă construită pe runtime-ul JavaScript de pe Chrome, pentru a dezvolta ușor aplicații de rețea rapide și scalabile. Node.js este bazat pe evenimente și utilizează un model de Input/Output (I/O) non-blocabil care îl face să nu ocupe mult spațiu pe disc și eficient, perfect pentru aplicațiile ce folosesc multe date de I/O în timp real care rulează pe dispozitive distribuite. Node.js este un mediu open-source de rulare pe mai multe platforme pentru dezvoltarea aplicațiilor de tip server sau rețea. Aplicațiile Node.js sunt scrise în limbajul JavaScript și pot fi executate în runtime-ul Node.js pe OS X, Microsoft Windows și Linux. De asemenea, Node.js oferă o bibliotecă bogată ce conține diverse module JavaScript care simplifică mult dezvoltarea aplicațiilor Web folosind Node.js.
Caracteristicile principale ce determină dezvoltatorii să utilizeze această tehnologie sunt:
Asincron și bazat pe evenimente. Toate API-urile din biblioteca Node.js sunt asincrone, adică, non-blocabile. Asta înseamnă că un server bazat pe Node.js nu așteaptă niciodată API-ul pentru a returna date.
Foarte rapid. Fiind dezvoltat pe motorul JavaScript V8 al browser-ului Google Chrome, biblioteca Node.js este foarte rapidă ce ține de executarea codului.
Un singur fir de execuție, dar foarte scalabil. Node.js utilizează un model cu un singur fir de execuție cu o buclă de evenimente. Mecanismul de evenimente determină serverul să răspundă într-o manieră non-blocabilă și face serverul extrem de scalabil, spre deosebire de serverele tradiționale care creează fire de execuție limitate care să manipuleze cererile.
Nu există memorie tampon. Aplicațiile Node.js niciodată nu salvează date în memoria tampon, acestea doar transmit datele la ieșire în bucăți.
JavaScript este un limbaj cross-platform de scripting orientat obiect. Este un limbaj mic și nu ocupă mult spațiu pe disc. În interiorul unui mediu gazdă (browser), JavaScript poate fi conectat la obiectele din acest mediu pentru a asigura un control programatic asupra lor.
Pentru simplificarea interacțiunii serverului cu baza de date am utilizat librăria Sequelize. Când începem a construi aplicații Web simțim nevoia pentru ceva care va interacționa cu baza de date pentru noi. Menținerea relațiilor dintre tabele, prelucrarea înregistrărilor conexe și gestionarea tranzacțiilor devine foarte repetitivă în timp atunci când utilizăm interogări scrise direct în SQL. Sequelize abstractizează toate aceste sarcini pentru dezvoltator și oferă instrumentele necesare pentru manipularea bazei de date. Sequelize este un ORM (din engleză, Object Relational Mapping) proiectat să lucreze cu Node.js, este scris în JavaScript și suportă o mulțime de motoare de baze de date majore cum ar fi MySQL, Postgres, SQLite, etc.
Figura 3.6. Arhitectura ORM. Sursa: www.agile-code.com
Sistemul de gestiune a bazei de date (SGBD) ales pentru aplicație este MySQL. MySQL este un SGBD relațional open-source, este bazat pe limbajul SQL, care este utilizat pentru adăugarea, ștergerea și modificarea informațiilor din baza de date și este dezvoltat în limbajul C și C++.
Prezentarea funcționalității aplicației
Aplicația dată este destinată dispozitivelor mobile ce suportă sistemul de operare Android cu o versiune minimă de Android 4.0.3 (sdk 15). Numele aplicației este BookYourTrip, ce caracterizează funcționalitatea de bază a aplicației. Aplicația poate fi utilizată doar cu server-ul pornit, altfel utilizatorii nu v-or putea trece peste pagina de autentificare.
La pornirea aplicației i se va cere utilizatorului datele de autentificare, în caz că nu are cont, are posibilitatea să se înregistreze. Pagina este compusă din două EditText-uri pentru introducerea email-ului și a parolei și două butoane pentru logare să respectiv înregistrare. Pentru a se înregistra este nevoie ca utilizatorul să apese butonul Înregistrează-te. După care utilizatorul primește un formular de înregistrare. Toate câmpurile fiind obligatorii.
La fel toate câmpurile din activitatea de înregistrare conțin validatori, respectiv numele nu poate fi fără nici un caracter, validarea câmpului email este efectuată prin verificarea prezenței caracterului @, câmpul parola are tipul de input de password și trebuie să conțină minim 6 caractere, astfel caracterele introduse sunt ascunse din motive de securitate, numărul de telefon la fel este verificat și poate să conțină minim patru cifre. Parola este criptată în aplicație și trimisă către server în format criptat. Codul sursă referitor la criptare este prezent în anexe. După o validare a tuturor câmpurilor are loc trimiterea datelor către server printr-un JSON și ulterior introducerea în bază de date pe server, după server-ul trimite un răspuns în format text dacă operațiunea a fost efectuată cu succes sau nu. În orice caz după înregistrare utilizatorul este trimis către pagina de login pentru autentificare cu login-ul deja setat. În caz de introducere de date eronate la înregistrare, sistemul detectează aceste erori și le marchează ca în figura 3.9.
Validarea email-ului are loc pe server, se verifică existența unui astfel de email în baza de date, în caz ca nu există, are loc înregistrarea, în caz că există, se trimite către aplicație un mesaj de eroare. Mesajul de eroare este în engleză pentru că este trimis de către server.
După înregistrare cu succes utilizatorul introduce datele în pagina de autentificare, aplicația primește parola de pe server după care o decriptează și verifică dacă parola decriptată corespunde cu parola introdusă de utilizator. La fel aici are loc redirecționarea utilizatorului către tipul de aplicație aferent acestuia, în caz că este client este trimis către modul client, dacă dispune de cont de tip administrator primește acces către modul administrator. Fiecare utilizator, în baza de date, dispune de un câmp în care este indicat tipul acestuia, 1 pentru client și 0 pentru administrator. Aplicația detectează tipul utilizatorului în funcție de acest câmp. În continuare vom discuta despre tipul de utilizator client, ca mai apoi să trecem la modul administrator.
Meniul principal al utilizatorului de tip client este compus din opt secțiuni, un TextView în partea de sus a activității în care este indicat numele utilizatorului și alte șapte ImageButton-uri. Primul buton este destinat căutării rutelor dorite de către utilizator și la fel în cadrul acestei activități poate să î-și rezerve locul dorit, al doilea arată rezervările efectuate ca o listă și totodată locurile rezervate la fiecare rută, al treilea reprezintă profilul, unde utilizatorul poate să î-și editeze datele personale și parola. Butonul favorite reprezintă o listă creată de utilizator cu orașele favorite care la un click pe oraș este redirecționat în activitatea caută rută, butonul de setări reprezintă setările aplicației. Despre este butonul ce conține datele de contact al dezvoltatorului. Și ultimul buton este Ieșire pentru delogarea utilizatorului din aplicație.
La această etapă în spatele interfeței grafice are loc descărcarea datelor despre utilizatorul logat și salvarea acestora în fișiere de preferință locale (SharedPreferences) pentru a folosi ulterior datele utilizatorului logat fără a se conecta la server.
Meniul principal ca și restul activităților sunt setate, din punct de vedere al design-ului, în așa fel ca să arate la fel pe toate tipurile de rezoluții de ecrane. Asta a fost posibil prin evitarea utilizării datelor fixe pentru dimensiunea conținutului și utilizarea așa numitului layout_weight, pentru a seta proporțiile pe care le ocupă un obiect anumit în activitate. Putem observa în figura 3.11, unde este pornită aplicația pe o tabletă Android cu o rezoluție 2048 x 1536 pixeli și putem observa așezarea componentelor proporțional ca și în dispozitiv-ul din figura 3.10 cu rezoluția 720 x 1280 pixeli (smartphone). Imaginile folosite pentru reprezentarea butoanelor în meniu sunt imagini oferite de Google, disponibile în apk-ul Android.
Activitatea de căutare a unei rute se accesează tastând butonul Caută Rută. Activitatea în sine reprezintă un motor de căutare. În partea de sus avem un câmp de căutare unde utilizatorul poate introduce un oraș și motorul de căutare va afișa toate rutele ce pornesc și pleacă în acest oraș. Aplicația doar trimite datele de căutare serverului după care serverul se ocupă de interogarea bazei de date și trimiterea rezultatelor aferente. După ce aplicația primește datele, imediat după, sunt afișate într-un ListView cu un adaptor personalizat în activitate.
Pentru a vedea detaliile aferente unei rute dorite, utilizatorul poate tasta pe ruta dorită din listă. După selectarea unei rute are loc afișarea detaliilor rutei aferente precum punctele intermediare, transportul, ora sosirii și locurile totale. Detaliile sunt transmise, din activitatea de căutare, printr-un Intent. Dacă utilizatorul se decide să facă o rezervare, trebuie să testeze butonul din josul activității “Rezervă loc”, în caz că nu, la fel poate să se întoarcă înapoi la activitatea de căutare.
La tastarea butonului rezervă loc se pornește o activitate ce reprezintă harta locurilor din transport. Este o activitate dinamică care se adaptează fiecărui caz în parte, sunt desenate un număr de butoane egal cu numărul total de locuri a transportului aferent rutei, algoritmul dat este prezent în anexe. Algoritmul funcționează în felul următor, verifică tipul rutei, în caz că e microbuz sunt desenate pe partea stângă două coloane de rănduri, pe mijloc un spațiu ce indică numărul rândului și pe dreapta o coloană. Dacă tipul este autocar atunci sunt desenate două coloane pe stânga și două coloane pe dreapta, la fel cu un spațiu între ele. Pentru tipul de microbuz și autobus de fiecare dată ultimul rând nu conține spațiu și în caz că rămân locuri sunt afișate în spatele acestui rând. Pentru tipul tren sunt afișate două coloane pe stânga, două pe dreapta și cu un spațiu între, dar la sfârșit nu are rândul plin, ci este cu spațiu. La fel la acest tip sunt delimitate vagoanele, în funcție de numărul rândului. La fiecare al treizecilea rând apare un delimitator.
Activitatea totodată trimite o cerere spre server de a primi locurile rezervate rutei aferente, în caz că sunt locuri rezervate, pictogramele locurilor sunt colorate în roșu și cele libere cu gri. Pentru a selecta un loc este nevoie de doar tastarea unui loc disponibil, adică gri. La tastarea locului în bara de sus este afișat locul sau locurile selectate și totodată pictograma este colorată în verde pentru a evidenția locurile selectate.
După ce am selectat locurile, pentru a finaliza rezervarea tastăm butonul “Finalizează rezervarea”. La tastarea acestui buton are loc trimiterea datelor, despre rezervare, către server. Ulterior, utilizatorul este trimis către activitatea principală cu răspunsul de la server afișat. Acum dacă încercăm să accesăm aceiași rută putem observa, ca în figura 3.14, că locurile rezervate mai devreme au fost colorate cu roșu.
La această etapă sunt câteva validări foarte importante, clientul nu mai poate efectua o rezervare la o rută dacă a rezervat deja locuri la această rută, această validare se face prin verificarea existenței mail-ului clientului logat, în baza de date la ruta aferentă. La fel clientul nu poate selecta un loc deja rezervat, adică colorat în roșu. Altă validare foarte importantă este limitarea clientului la efectuare rezervărilor, adică maxim 4 locuri per client. Aceste validări au fost concepute pentru a evita rezervarea unui singur client a tuturor locurilor în transport. Mesajele de eroare intervenite în urma acestor tipuri de validări sunt afișate în figura 3.15.
Pentru a vedea propriile rezervări, utilizatorul accesează butonul “Călătoriile mele” din meniul principal. Aici este afișat istoricul rezervărilor, și sunt prezente atât rezervările active cât și cele deja expirate. Rezultatul este afișat în urma cereri înaintate către server cu email-ul clientului, serverul caută în tabela Reservations toate rezervările în funcție de email-ul primit. În final sunt transmise datele despre rută și locurile rezervate într-un array de tip JSON. În funcție de răspunsul primit, se afișează într-un ListView cu un adaptor personalizat rezervările efectuate și locurile rezervate la ruta dată.
Figura 3.16. Activitatea Rezervările mele.
O altă funcționalitate oferită din meniul principal al clientului, este posibilitatea de a-și modifica datele personale, pentru aceasta se accesează buton-ul Profil din meniul principal. Utilizatorul este redirecționat într-o activitate cu EditText-uri care au fost completate cu datele curente de profil. Pentru a modifica una din date, este nevoie doar de a modifica sau schimba textul din EditText și la apăsarea buton-ului Salvează, datele sunt salvate în baza de date, în caz că se modifică și email-ul se modifică toate tabelele în baza de date pentru a nu pierde datele aferente rezervărilor a clientului din cauza referirii la email-ul vechi. Astfel în caz că clientul dorește să î-și modifice email-ul nu î-și va pierde datele asociate email-ului vechi.
Pentru a-și schimba parola, utilizatorului este propus buton-ul Schimba Parola. Pentru a efectua această cerere cu succes, se afișează un dialog și utilizatorul va fi rugat să introducă și parola veche, din motive de securitate, după care va introduce parola nouă. Parola se va schimba doar în cazul că parola veche este echivalentă cu parola asociată profilului din baza de date, primită în format criptat de pe server și decriptată în aplicație și ulterior comparată cu cea introdusă de utilizator. Apoi parola nouă este criptată și trimisă către server pentru a realiza modificarea în baza de date.
Butonul Favorite din meniul principal este pentru a salva orașele preferate a clientului pentru a facilita căutarea de rute. Activitatea conține o listă în care pot fi adăugate orașele dorite de către client. Pentru a salva din timpul dedicat căutării, utilizatorul poate doar da click pe orașul dorit din această listă și automat este redirecționat în activitatea de căutare unde deja este introdus orașul de căutare dorit. În orice moment utilizatorul are posibilitatea de a-și șterge orașul preferat apăsând îndelungat pe orașul respectiv, pentru a preveni ștergerea din întâmplare, se afișează un dialog în care utilizatorul este întrebat dacă sigur dorește să șteargă acest element.
Datele aferente acestei activități sunt salvate local cu ajutorul fișierelor de preferințe conform algoritmului de mai jos.
Butonul de Setări din meniul principal al aplicației este destinat setărilor de sistem. Momentan este disponibil doar un tip de setare, acesta este schimbarea limbii. Aplicația dispune de două limbi, română și engleză, se poate trece de la una la alta foarte simplu din setări. În setări avem afișate două iconițe cu drapelul țării respective. Pentru a selecta o limbă, e nevoie doar să dăm click pe una din iconițe și aplicația î-și va schimba limba.
Alte două butoane disponibile în meniul principal mai puțin funcționale. Butonul Despre care redirecționează clientul într-o activitate cu datele de contact al dezvoltatorului aplicației. Butonul de ieșire este destinat ieșirii din meniul principal și redirectarea către pagina de autentificare.
Pentru a putea utiliza aplicația în modul administrator aveți nevoie de un cont de tip administrator care poate fi setat doar prin server. Pentru a crea un utilizator de tip administrator e nevoie ca mai întâi utilizatorul să se înregistreze, după care să înainteze o cerere către dezvoltatorul aplicației pentru ai modifica în baza de date tipul de utilizator. După o modificare cu succes, utilizatorul se poate autentifica cu datele înregistrate mai devreme și va avea acces la toate instrumentele destinate administratorului.
Meniul principal, ca și cel al client-ului, este compus din opt secțiuni. Secțiunea de sus, la fel, este destinată salutării utilizatorului. În schimb celelalte secțiuni sunt un pic schimbate fată de cele ale clientului. Primul buton, Rutele mele, afișează rutele postate de acest cont și datele aferente. Butonul Adaugă Ruta permite administratorului să adauge o rută în sistem. Butonul Transporturile mele reprezintă parcul de transporturi al administratorului dat. Celelalte butoane sunt echivalente sau au scopuri echivalente ca cele de la client.
Pictogramele ce reprezintă butoanele din meniul principal, o parte sunt oferite de Android, câteva au fost editate de mine personal. Imaginea de la butonul Rutele mele este din pachetul Android dar i-am modificat transparența pentru a se combina cu celelalte butoane. La fel imaginea de la butonul Transporturile mele este imaginea folosită de aplicație pentru a indica tipurile de transport, inițial fiind neagră, am modificat-o în alb, la fel am modificat transparență și i-am adăugat un chenar pentru a se încadra în design-ul meniului.
În continuare vom vorbi doar despre 3 butoane: Rutele mele, Adaugă Ruta și Transporturile mele, fiindcă celelalte butoane au funcționalități echivalente celor de la client.
Pentru început pentru a adăuga o rută, administratorul are nevoie de minim un transport, altfel nu va putea crea ruta. Deci pentru început vom analiza activitatea Rutele mele. Această activitate conține o listă cu transporturile adăugate și un buton de adăugare.
Activitatea de adăugare a unui transport este compusă dintr-un formular ce trebuie completat cu date reale. Numărul de înmatriculare este verificat dacă există deja în baza de date, în caz că există un astfel de număr de înmatriculare, utilizatorul este notificat printr-un mesaj de eroare. În cazul că nu există un astfel de număr de înmatriculare, transportul este adăugat cu succes în baza de date și după este afișat în lista, cu adaptor personalizat ce afișează modelul, numărul de înmatriculare și tipul, din activitatea Transporturile mele.
Tot în această activitate, administratorul are posibilitatea de a modifica un transport sau sa-l șteargă. Pentru editare se face un simplu click pe transport, după care, se deschide activitatea de adăugare de transport cu formularul completat cu datele aferente transportului și în caz că sunt modificate datele, după tastarea butonului salvează, sunt editate datele în baza de date. Pentru ștergere, administratorul trebuie sa apese îndelungat transportul dorit și primește un dialog de confirmare a ștergerii. Editarea și ștergerea unui transport este efectuată doar dacă transportul nu este asociat la o rută activă, adică o rută care încă nu a început. La o încercare de ștergere sau modificare a unui astfel de transport, administratorul primește un mesaj de eroare.
Acum că dispunem de transport, putem posta o rută. Pentru a posta o rută accesăm butonul Adaugă Rută din meniul principal, după care se cere completarea datelor aferente rutei.
Toate câmpurile formularului sunt obligatorii și conțin validatoare. La transport avem un ComboBox care conține rutele proprii și libere pentru atașarea unei rute. Pentru a selecta data sunt afișate dialoguri de tip calendar și oră, pentru a selecta mai ușor data și ora. Odată ce tastăm salvează, ruta este împachetată în JSON și transmisă către server ca mai apoi să fie adăugată în baza de date. Din acest moment, ruta este vizibilă în motorul de căutare și oricine poate rezerva loc la această rută.
Ultima activitate exclusivă pentru administrator este activitate Rutele Mele, unde administratorul î-și poate vizualiza rutele proprii, în plus poate vedea și nr de locuri ocupate. Activitatea este simplă și prezintă informații foarte utile pentru administratorul rutei.
Figura 3.24. Activitatea rutele mele
Activitatea este compusă doar dintr-un ListView cu un adaptor personalizat ce permite vizualizarea rutei, locurilor ocupate, datei și a tipului. Celelalte butoane din meniul administratorului au funcționalități echivalente ca la client.
Prezentarea funcționalității serverului
Serverul este dezvoltat cu ajutorul aplicației WebStorm produs de JetBrains și reprezintă o aplicație Express scrisă în JavaScript. Express conține o multitudine de metode utilitare HTTP și middleware pentru crearea unui API simplu și rapid. Serverul rulează doar local, deci au acces doar cei care sunt în aceiași rețea locală, ca de exemplu în aceeași rețea de Wi-Fi. La fel pentru a comunica cu succes aplicația mobilă cu serverul, trebuie scoase setările proxy sau adăugarea Ip-ului serverului în excepții, în caz că există setări proxy. Serverul se rulează din linie de comandă și odată pornit putem folosi aplicația. Serverul dat nu dispune de interfață, el doar oferă răspuns cererilor HTTP de tip GET și POST prin mesaje de tip string sau JSON.
În figura 3.25 vedem adresa locală și portul serverului, dat fiind faptul că aplicația folosește în mai multe locuri acest Ip pentru a se conecta la server, aplicația dispune de o variabilă care conține adresa serverului, astfel pentru a seta adresa e nevoie doar să modificăm variabila dată.
În figura 3.26 putem vedea toate datele referitoare la cererile adresate de către aplicație și rezultatul acestora. Putem observa că serviciul web poate manipula cererile HTTP de tip GET și POST.
Serverul în sine este compus din funcții care sunt apelate în funcție de tipul cererii și URL-ul corespunzător. Un exemplu de funcție, de tip GET, care primește ca parametru un oraș și în caz că sunt rute cu astfel de destinație sau punct de start, în baza de date, sunt transmise ca răspuns într-un vector ce conține alți trei vectori cu obiecte JSON. Primul vector reprezintă datele din tabela routes pentru ai afișa datele despre rută în motorul de căutare al clientului, al doilea vector conține datele din tabela transports pentru ai afișa detalii de transport și ultimul date din tabela de users pentru ai afișa numele administratorului. Codul sursă este disponibil în anexă.
Mai jos sunt prezente două funcții mai simple a serviciului web pentru a manipula cererile HTTP de tip GET și POST.
app.post('/transport', function (req, res) {
var a = req.body;
Transport.findOne({where : { regNr: req.body.regNr}})
.then(function(transport){
if(transport != null){
res.send("Transport with this registry number is already registered");
} else {
Transport.create(req.body);
res.send("Succesfully added!");
}
})
})
app.get('/transport/registryNr/:nr', function (req, res){
Transport.findOne({where : { regNr: req.params.nr}})
.then(function(transport){
if(transport != null){
res.send(transport);
} else {
res.send("No such registry number!");
}
})
})
Prima funcție este una de tip POST ce introduce un transport în baza de date, înainte de asta verifică existența unui transport cu același număr de înmatriculare, în caz ca există deja unul, se transmite ca răspuns un mesaj de eroare.
A doua funcție este una de tip GET și întoarce ca răspuns transportul găsit în baza de date în funcție de numărul de înmatriculare.
4. Concluzii
Pe final, în urma elaborării acestei lucrări, am realizat cât de mult putem simplifica procesul de rezervare a unui bilet și cât de comodă poate fi o astfel de aplicație. Având toate rutele și firmele într-un loc putem realiza foarte simplu o comparație între acestea. Și pot spune cu certitudine că aplicația va fi foarte de folos celor care utilizează un astfel de serviciu destul de des. Conform statisticilor realizate de INS, precum că în anul 2016 au fost transportați 384 de milioane de pasageri, putem afirma că aplicația dată va avea un public potențial foarte mare. Aplicația dispune de un meniu clar definit și foarte simplu de utilizat, pentru a fi dedicat tuturor categoriilor de vârstă și la fel pentru străini, datorită posibilității de schimbare de limbă. Mai mult decât atât va încuraja turismul în România, pentru străini, oferind acestora o aplicație cu toate rutele centralizate și cu o ofertă de preț mai avantajoasă. Aplicația dată este destintă nu doar celor ce intenționează să rezerveze un bilet, ci și firmelor din domeniu oferindule acestora instrumentele necesare. Totodată aceasta oferă facilități de intrare pe piață a noilor concurenți și astfel duce la o reducere a prețurilor biletelor pentru o călătorie, cât și oferirea de bonusuri și servicii mai plăcute. Acum toate firmele au servicii proprii de rezervare, cheltuind astfel bani pentru a întreține acest serviciu, datorită distribuirii gratuite a aplicației date, firmele nu vor mai avea nevoie de investiții ulterioare.
Aplicația dată poate fi imbunătățită în viitor în diferite direcții. Prima derecție ar fi clientul, un motor de căutare mai îmbunătățit, acum acesta poate căuta doar în funcție de orașul de plecare și orașul destinație. Pe viitor se presupune realizarea unui motor de căutare ce va căuta și prin punctele intermediare pentru a oferi clientului o rută mai efectivă. Alt aspect al motorului de căutare ce trebuie realizat, este interconectarea rutelor automat de către aplicație, de exemplu nu există rută București – Satu Mare, dar există rutele București – Cluj și Cluj – Satu Mare și astfel clientul poate ajunge la destinație prin intermediul mai multor rute. O altă imbunătățire necesară este iarăși motorul de căutare. Se urmărește adăugarea filtrelor de căutare pentru a oferi clientului instrumentele necesare pentru a găsi ruta dorită în cel mai scurt timp. Am intenția de a elabora și un sistem de chat în aplicație pentru ca clienții să poată comunica cu șoferii. O altă direcție de îmbunătățire este oferirea administratorului următoarele facilități. Posibilitatea de editare a rutei cu notificarea ulterioară a tuturor clienților ce au rezervat loc. Oferirea administratorului date statistice lunare despre călătorii. La fel se urmărește introducerea unui sistem de profile a firmelor, unde clienții vor putea lăsa note și comentarii, pentru a oferi celorlalți clienți o scurtă experiență cu această firmă. În viitor se prevede a stoca toate datele în baza de date în format criptat pentru o securitate mai avansată. Pentru a mări numărul de utilizatori în viitor se mai presupune portarea acestei aplicații și pe alte sisteme de operare, precum iOS. Se mai urmărește și obiectivul de centralizare a tuturor serviciilor de transport într-o aplicație, ca de exemplu aplicații precum BlaBlaCar care urmărește ideea de împărtățire a unei rute cu mașina personală sau aplicații de rezervarea biletelor pentru avion. Ar fi foarte util dacă toate tipurile de transport ar fi centralizate într-o aplicație și s-ar putea alege o variantă de călătorie cât mai practică și pe placul clientului, fără căutari îndelungate pe internet. Aplicația dată poate fi adaptată și în multe alte țări unde transportul în comun este foarte popular.
În ultimii ani piața dispozitivelor mobile a avansat foarte mult, atât global cât și în Romania. Astfel conform datelor statistici fiecare al doilea român are un smartphone (53%) adică circa 10 milioane, și numărul e în continuare creștere. Astfel se simte necesitatea de lansarea a unui serviciu de rezervare de bilete, care până în prezent este oferit doar la un calculator sau la ghișeu, pe piața dispositivelor mobile. Oferind posibilitatea clientului de a rezerva un loc de oriunde, foarte comod și în timp util.
Bibliografie
Anexe
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Academia de Studii Economice din București [303405] (ID: 303405)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
