Documente Academic
Documente Profesional
Documente Cultură
Lucrare Licenta Aplicatie Web Cu Baze de Date Gestionare Logistica
Lucrare Licenta Aplicatie Web Cu Baze de Date Gestionare Logistica
LUCRARE DE LICENŢĂ
Soluție cu bază de date pentru
activitatea logistică a unei companii
COORDONATOR ŞTIINŢIFIC
Prof. univ. dr. MANOLE VELICANU
ABSOLVENT
GEORGE CRĂCIUN
BUCUREŞTI
2013
Cuprins
Introducere....................................................................................................................................................2
1.Prezentarea activității de “Logistică” într-o companie .............................................................................3
1.1 Logistica. Concepte generale...............................................................................................................3
1.1.1 Scurt istoric ...................................................................................................................................3
1.1.2 Definirea conceptului de logistică ................................................................................................4
1.2 Transporturile – element principal al activității logistice ....................................................................5
1.3 Eficientizarea logisticii ........................................................................................................................6
1.4Fluxuri informaţionale în activitatea de logistică .................................................................................7
2. Tehnologiile informatice utilizate la realizarea aplicației de administrare a logisticii ..............................9
2.1 Prezentare generală a unei aplicații web .............................................................................................9
2.2 HTML............................................................................................................................................... 10
2.3 CSS ................................................................................................................................................... 10
2.4 jQuery ............................................................................................................................................... 12
2.5 PHP................................................................................................................................................... 12
2.6 MySql ............................................................................................................................................... 13
2.7 Apache .............................................................................................................................................. 14
2.8 Codeigniter ....................................................................................................................................... 15
2.9 Eclipse .............................................................................................................................................. 16
3.Analiza şi proiectarea aplicaţiei pentru logistica firmei .......................................................................... 17
3.1Scopul și obiectivele aplicației .......................................................................................................... 17
3.2 Proiectarea bazei de date .................................................................................................................. 18
3.2.1 Noțiuni teoretice ........................................................................................................................ 18
3.2.2 Proiectarea practică a bazei de date ........................................................................................... 20
3.3 Proiectarea interfeţei......................................................................................................................... 24
4. Prezentarea aplicației privind logistica companiei ................................................................................. 26
4.1 Implementarea aplicației .................................................................................................................. 26
4.1.1 Implementarea bazei de date și a funcționalității acesteia ......................................................... 28
4.1.2 Implementarea interfeței și a funcționalității acesteia ............................................................... 29
4.2 Utilizarea aplicației ........................................................................................................................... 32
Concluzii ..................................................................................................................................................... 42
Referințe bibliografice................................................................................................................................ 43
Lista figurilor ............................................................................................................................................... 44
Anexe .......................................................................................................................................................... 45
1
Introducere
Lucrarea de față își propune să justifice importanța bazelor de date în orice sector și
activitate a domeniului economic. Este oferit ca exemplu dezvoltarea unei aplicații ce utilizează o
bază de date pentru a administra activitatea oricărei firme care activează în domeniul
transporturilor sau are un departament de transporturi ori logistică internă.
Datele au devenit în ultimii ani cele mai importante resurse ale unei companii deoarece ele
oferă o imagine de ansamblu a activității acesteia și reprezintă baza previziunilor pentru viitor.
Astfel că datele trebuie stocate și manipulate într-un mod cât mai eficient pentru a putea oferi
răspunsuri viabile la necesitățile firmei. Deoarece ne situăm în era tehnologiei informației, orice
firmă care dorește să fie eficientă trebuie să profite de avantajele oferite de utilizarea unei aplicații
informatice care simplifică munca angajaților și ajută la luarea celor mai bune decizii în ceea ce
privește activitatea economică a firmei.
Am ales ca și domeniu economic de interes, logistica și în special domeniul transporturilor
deoarece este un sector economic dinamic și totuși existent din cele mai vechi timpuri. Firmele
care desfășoară activități ce presupun transporturi au o mare provocare în administrarea costurilor
de transport deoarece acestea au cea mai mare pondere în totalitatea costurilor logistice, astfel că
este esențial ca această activitate să fie gestionată corect prin intermediul unei aplicații informatice.
Compania în cadrul căreia a fost realizată documentarea privind departamentul de logistică,
pe baza căreia au fost identificate elementele ce trebuie luate în considerare la dezvoltarea
aplicației este SC Realitatea Media SA. Realitatea Media este prima televiziune din România
dedicată transmisiei 24 de ore din 24 a știrilor. Filosofia postului este că evenimentul guvernează
programul, astfel că în orice moment desfășurătorul de emisie poate fi dinamizat cu informații de
ultimă oră. Grila de programe a Realitatea TV cuprinde în special jurnale de știri(din oră în oră),
dar și emisiuni de analiză politică, socială, culturală și științifică.
Am considerat că această companie este una relevantă pentru domeniul economic ales și
pentru dezvoltarea aplicației, deoarece deține un parc auto de dimensiuni mari, aproximativ 30 de
autovehicule, care efectuează un număr mare de curse pe zi, în diferite scopuri: transmisiuni live,
deplasarea corespondenților în teritoriu, transportul invitaților, aprovizionare internă, etc. Vorbim
de autovehicule de toate categoriile, inclusiv de cele echipate pentru transmisii din teren. Un alt
element relevant pentru acest domeniu este faptul că sunt înregistrate costuri foarte mari cu
logistica și transporturile ceea ce indică un grad mare de utilizare al respectivelor autovehicule.
Lucrarea este structurată în patru capitole ce realizează prezentarea domeniului economic
ales, a tehnologiilor informatice utilizate în realizarea aplicației de administrare a activității
logistice și a aplicației rezultate împreună cu modul de implementare a acesteia.
2
Astfel, capitolul 1 descrie activitatea de logistică cu tot ceea ce presupune ea, punând
accent pe componenta de transporturi. Sunt descrise fluxurile informaționale ce apar în
desfășurarea activității și care sunt utile în dezvoltarea aplicației deoarece ilustrează modul în care
circulă informațiile în cadrul departamentului logistic. Capitolul 2 prezintă tehnologiile
informatice utilizate pentru realizarea programului, accentuând punctele lor forte și justificând
astfel alegerea lor. Capitolul 3 realizează proiectarea aplicației și conține detalii tehnice referitoare
la modul în care a fost implementată aceasta. Ultimul capitol prezintă aplicația și oferă indicații de
utilizare a acesteia.
4
producţie. Acestea sunt: transportul, depozitarea, manipularea materialelor, ambalarea,
gestiunea stocurilor, selectarea locaţiilor fabricilor şi depozitelor, procesarea comenzilor,
previzionarea cererii şi serviciul către clienţi”.
În anul 1986 apare definiţia dată de către Council of Logistics Management (CLM)
care înglobează practic tendinţele logisticii acelor ani: “Logistica este procesul de planificare,
implementare şi control al fluxurilor şi depozitării eficiente şi eficace a materiilor prime,
stocurilor în curs de producţie, produselor finite, şi a informaţiilor referitoare la acestea, de la
punctul de origine la punctul de consum al acestora, cu scopul conformării cerinţelor
consumatorilor”. Se observă faptul că această definiţie pune accentul pe planificare, implementare
şi control, deci pe activităţile de management desfăşurate în cadrul logisticii.
Mai recent, în 2005 apare pentru logistică definiţia: „a livra un produs, în bună stare, la
momentul potrivit, în locul potrivit, în cantitatea corectă şi necesară, în ambalajul de prezentare
corespunzător, precedate, însoţite şi urmărite de informaţii corecte şi exacte înscrise pe
documente legale, totul în cele mai bune condiţii economice” . [AKFRDU05] .
Această definiţie pune accent pe documentele care însoţesc, confirmă şi urmăresc fluxul de
informaţii şi asigură stabilirea istoricului traseului parcurs în distribuţie.
Din definiţiile prezentate până aici, pot concluziona că logistica este activitatea care se
ocupă în primul rând cu transportul mărfurilor sau produselor, dar si cu achiziţia, depozitarea şi
livrarea acestora.
După părerea mea, principala componentă a activităţii logistice se referă la transport,
deoarece acesta generează cele mai mari costuri şi totodată este cel mai greu de gestionat.
5
Din punct de vedere economic, performanța sectorului transporturilor este sensibilă la
prețul petrolului. Deoarece operațiunile gravitează în jurul vehiculelor, prețul combustibililor
reprezintă un cost semnificativ al companiilor ce se ocupă cu transporturile. Atunci când prețul
petrolului crește, companiile se așteaptă să câștige mai puțin, în timp ce atunci când prețul
petrolului este mic, situația financiară a companiilor este bună.
6
O aplicație complexă ce are ca scop administrarea activității logistice și implicit
eficientizarea acesteia, trebuie să urmeze mai multe direcții de dezvoltare:
definirea și planificarea rutelor parcurse de vehiculele firmei;
optimizarea rutelor planificate zilnic prin aplicarea unor șabloane, pentru a ține sub control
costurile de transport;
suport pentru elaborarea unor strategii de transporturi pe termen lung, prin previzionarea
costurilor;
administrarea resurselor (a personalului, a vehiculelor și a materialelor transportate);
elaborarea de rapoarte ce ilustrează activitatea logistică a companiei.
Opinia mea este că cele mai importante elemente ale unei astfel de aplicații sunt reprezentate
de administrarea resurselor si elaborarea de rapoarte necesare observării activității companiei,
deoarece o aplicație ce conține aceste module poate fi utilizată atât ce o firmă mică, cât și de o
companie al cărei obiect de activitate este strict logistica și procesează o multitudine de comenzi
și transporturi zilnic.
7
în condiţiile existenţei comenzii, atunci firmele pot să-şi reducă stocurile şi chiar să lucreze cu un
stoc apropiat de cel critic.
În continuare voi prezenta principalele fluxuri de procese informaţionale ale unui lanţ de
aprovizionare, ilustrate în figura 1.3 . Astfel, putem identifica cel puţin următorii actori principali
ce participă la realizarea fluxurilor informaţionale:
• clientul: cumpără bunuri şi servicii
• furnizorul: vinde bunuri şi servicii
• sistemul de aprovizionare: achiziţioneazăbunuri şi servicii de la furnizori
• sistemul de desfacere: vinde bunuri şi servicii clienţilor
• sistemul de producţie: produce bunuri şi servicii
• sistemul de transport: transportă bunuri.
• depozitele: gestionează bunurile produse şi/sau achiziţionate.
8
Manager Planificare Control
parc logistic
Operator
Executare
Figura 1.3 Fluxul informațional al activității logistice din cadrul unei companii
9
pot adăuga ca și facilitate importantă, clasa Active Record care permite ca operațiile uzuale de
lucru cu baza de date să fie simplificate din punctul de vedere al codului scris.
O altă tehnologie utilizată este mediul de dezvoltare Eclipse.
2.2 HTML
HTML (HyperText Markup Language) este principalul limbaj de marcare utilizat în
crearea de pagini web şi alte informaţii ce pot fi redate într-un navigator web (web browser).
Scopul unui navigator web este acela de a citi documentele HTML şi de a le reda într-o formă
vizibilă sau/şi audibilă. Navigatorul nu afişează marcajele HTML, ci le foloseşte pentru a interpreta
conţinutul paginii.Aceste indicații furnizate de către marcajele HTML, pot varia de la cele mai
simple (fontul unui paragraf) la unele complexe(scripturi complicate, formulare, hărți).
Tot prin intermediul marcajelor HTML, pot fi specificate metadate ce conțin informații despre
document (titlul, autorul) sau informații ce specifică structurarea documentului( divizarea în
paragrafe, liste, etc). HTML permite ca fiecare document să poată fi legat de altele prin
hiperlegături (hyperlinks) care formează web-ul.
Limbajul HTML poate fi citit și editat folosind orice editor simplu de text. Cu toate acestea,
scrierea și modificarea paginilor solicită unele cunoștințe de HTML și consumă timp, astfel că de-
a lungul timpului au apărut programe utilitare cu scopul de a facilita crearea de pagini web.
Editoarele grafice (denumite generic WYSIWYG = “what you see is what you get”)
precum Macromedia Dreamweaver, Adobe GoLive sau Microsoft FrontPage permit ca paginile
web să poată fi realizate ușor de către oricine are anumite cunoștințe de operare a calculatorului.
Deși crearea site-urilor folosind acest tip de programe este mult mai ușoară, trebuie precizat că de
cele mai multe ori codul HTML generat de acestea este de o calitate slabă.[WIKI01].
HTML poate fi generat direct prin utilizarea unor tehnologii de programare din partea
serverului, precum : PHP(Hypertext Preprocessor), JSP (Java Server Pages)sau ASP(Active Server
Pages).
Aplicația de administrare a activității logistice utilizează HTML pentru afișarea
conținutului într-un browser web, în forma dorită de programator, permițând chiar modificarea
acesteia în funcție de cerințele utilizatorilor.
2.3 CSS
CSS (Cascading Style Sheets) este un limbaj folosit pentru descrierea semanticii de
prezentare (aspect și formatare) a unui document scris într-un limbaj de marcare (HTML).
10
De cele mai multe ori CSS este folosit pentru a stiliza paginile web scrise în HTML sau XHTML,
dar limbajul poate fi aplicat oricărui tip de document XML. CSS a fost gândit în primul rând pentru
a separa conținutul documentului (exprimat în HTML) de prezentarea documentului care include
elemente precum: culori, font, orientare. Această separare îmbunătățește accesibilitatea
conținutului și oferă o mai mare flexibilitate și control în specificarea și modificarea
caracteristicilor prezentării. În plus, CSS permite ca mai multe pagini să folosească aceleași
specificații de prezentare și reduce repetarea acestora. Mai mult, CSS oferă facilitatea ca aceeași
pagină să poată fi prezentată în mai multe formate în funcție de metoda de redare (ecran, printare,
dispozitive tactile, etc).
Stilurile CSS pot fi atașate documentelor HTML, atât prin includerea unor documente
externe, cât și în cadrul documentului, folosind marcajul <style> și/sau atributul “style” (pentru
specificarea stilului în cazul unui anumit element HTMl).
Principalul dezavantaj al CSS este faptul că unele navigatoare nu sunt compatibile cu CSS
și documentele HTML sunt afișate ca și cum CSS n-ar exista, dar cele mai cunoscute și utilizate
browsere, cum ar fi: Mozilla Firefox, Internet Explorer, Opera, și altele, sunt compatibile CSS.
Printre beneficiile CSS putem enumera: formatarea este introdusă într-un singur loc pentru tot
documentul, editarea rapidă a etichetelor, micșorarea codului paginii și implicit încărcarea mai
rapidă a acesteia.
Sintaxa CSS este împărțită în trei categorii/nivele:
nivelul 1 - reprezintă proprietatile etichetelor din documentul HTML, folosind atributul style
(tip inline);
nivelul 2 - reprezintă informația introdusăîn blocul HEAD, utilizând marcajul <style>
(embedded);
nivelul 3 – reprezintă comenzile aflate în pagini separate (externe).
Cea mai mare prioritate o are sintaxa de nivelul 1 (inline) iar cea mai mică o are cea de nivelul 3.
Utilizarea nivelului 3 (fișier extern care conține comenzi CSS) este practica recomandată
deoarece poate fi utilizat în mai multe situații (mai multe fișiere HTML pot folosi același fișier
extern CSS) eliminând astfel timpul necesar introducerii codului corespunzător în fiecare pagină
și facilitând editarea lor într-un singur loc pentru mai multe fișiere.
Aplicația descrisă în prezenta lucrare utilizează CSS pentru formatarea conținutului și
prezentarea atractivă a paginilor. Fișierul CSS utilizat este prezentat în Anexa 4.
11
2.4 jQuery
jQuery este o bibliotecă JavaScript concepută pentru a simplifica scripturile de pe partea
de client și anume scripturile executate prin intermediul elementelor HTML. A fost lansată în
ianuarie 2006 de către John Resig. Sintaxa jQuery face mai ușoară navigarea într-un document,
selectarea elementelor din DOM (Document Object Model), crearea animațiilor, manipularea
evenimentelor și chiar dezvoltarea de aplicații AJAX. jQuery oferă de asemenea posibilitatea
dezvoltatorilor de a crea extensii pentru bibliotecile de JavaScript. Astfel, se pot abstractiza
interacțiunile , animațiile și efectele.
jQuery permite îndeplinirea unor sarcini precum:
accesarea unor anumite părți din pagină și traversarea elementelor paginii;
modificarea aspectului unei pagini și posibilitatea schimbării dinamice a proprietăților
după încărcarea paginii;
modificarea conținutului paginilor (text, imagini);
răspuns la interacțiunea utilizatorului cu elementele HTML;
adăugarea de animații complexe;
Plugin-urile sau extensiile sunt cele mai interesante facilități oferite de jQuery. Programatorii pot
dezvolta subaplicații care să extindă funcțiile de bază jQuery cu funcții folosite de către plugin.
Astfel, biblioteca principală ocupă doar atât spațiu cât este necesar, în timp ce extensiile vor fi
încărcate doar la cerere și în acele pagini unde sunt necesare. Dezvoltatorii pot utiliza un set de
extensii predefinite, numit jQuery UI (jQuery User Interface). Principalul avantaj al jQuery este
faptul că dezvoltarea și testarea componentelor se face concomitent cu dezvoltarea bibliotecii
principale, astfel că este eliminată incompatibilitatea.
După părerea mea, cea mai atractivă caracteristică a jQuery este faptul că prin multitudinea
de extensii si utilizări poate furniza soluții cât mai diversificate, după cum spunea și creatorul
bibliotecii, John Resig: “I love seeing cases where an API that I thought I knew well is turned
around and used in new and interesting ways”. [RE09]
În cadrul aplicației de logistică, jQuery asigură în primul rând interactivitatea utilizatorului
cu mediul de lucru.
2.5 PHP
PHP (PHP Hypertext Preprocessor, inițial Personal Home Page) este un limbaj de
programare server-side destinat dezvoltării web, dar folosit de asemenea ca un limbaj de
programare de uz general. PHP a fost creat inițial de către Rasmus Lerdorf în 1995, iar acum este
produs de Grupul PHP. Limbajul PHP a apărut în 1995 deoarece Rasmus Lerdorf dorea să afle
12
câte vizitări are CV-ul lui online. PHP începe să fie remarcat din momentul în care Zeev Suraski
și Andi Gutmans au rescris motorul, care va purta numele de Zend, o combinație a prenumelor
celor doi programatori. Datorită faptului că este open-source, PHP profită de faptul că are un suport
activ din partea comunităţii online și se dezvoltă foarte rapid. Interpretorul PHP este cel mai
utilizat limbaj de programare folosit pentru realizarea site-urilor Web dinamice. Diferenţa faţă
de alte limbaje de programare (precum JavaScript) este reprezentată de faptul că PHP execută
operațiile pe server și nu pe calculatorul client. Astfel, PHP poate accesa baze de date, fișiere și
alte resurse la care JavaScript nu are acces. În plus, PHP interpretează instrucțiunile pe server și
returnează cod HTML necesar paginilor web. HTML este un limbaj static, iar codul scris în HTML
este salvat în fișiere ce pot fi vizualizate prin apelarea lor în browser. Dacă este necesară
modificarea conținutului paginilor HTML într-un mod dinamic și chiar crearea documentelor
HTML în funcție de anumite condiții, va fi folosit un limbaj de scripting pe server, precum PHP,
Perl, ASP sau altele. Respectivele pagini pot conține funcții de interogare a bazei de date, preluarea
de date de pe alte site-uri sau din alte fișiere, iar în final este construită o pagină HTML trimisă
către browser. Codul PHP nu este vizibil vizitatorilor. El nu este compilat, ci rămâne pe server și
la fiecare cerere din partea clientului este interpretat și doar rezultatul (HTML) este vizibil.
PHP a fost folosit și în cadrul acestui proiect pentru a implementa funcționalitatea aplicației
pe partea de server și de lucru cu datele.
2.6 MySql
MySQL este un sistem de gestiune a bazelor de date relațional, creat de compania
suedeza MySQL AB (în momentul de față deținută de Oracle). MySQL rulează ca un server,
facilitând conectarea mai multor utilizatori și accesul la mai multe baze de date. Este printre cele
mai populare sisteme de gestiune a bazelor de date, și chiar cel mai popular dintre sistemele cu
sursă deschisă (open-source) la ora actuală. MySQL este totodată un element important al
utilitarelor de tip LAMP (Linux, Apache, MySQL, PHP), care fac ușoară configurarea și utilizarea
unui server web. MySQL este strâns legat de PHP, împreună formând așa-numitul Duo-Dinamic,
folosit la majoritatea site-urilor existente.
Deși, de cele mai multe ori este utilizat alături de PHP, MySQL permite construirea de
aplicații în orice limbaj major de programare (C, C++, Java, Perl, Python). Administrarea bazelor
de date MySQL se poate face atât folosind modul linie de comandă, cât și prin intermediul unor
interfețe grafice precum: MySQL Administrator, MySQL Workbench sau phpMyAdmin.
Principalele caracteristici ale MySQL sunt:
faptul că este un sistem de baze de date relațional;
13
arhitectura client/server: mysql lucrează ca un server de baze de date la care se pot conecta mai
mulți clienți (programe de aplicație). Clienții pot rula pe aceeași mașină fizică sau pot fi
localizați pe un alt calculator, comunicând prin rețeaua locală sau prin Internet;
compatibilitatea SQL: după cum reiese și din denumirea sa, este folosit limbajul de baze de
date SQL, ca și limbaj standardizat pentru interogarea și actualizarea datelor;
viteza: MySQL este considerat una dintre cele mai rapide aplicații de lucru cu bazele de date;
independența de platformă: aplicațiile client pot rula pe o varietate de sisteme de operare, iar
MySQL ca și server poate de asemenea să fie executat pe platforme precum: Apple Macintosh
OS X, Linux, Microsoft Windows, dar și alte variante de Unix, cum ar fi: AIX, BSDI,
FreeBSD, HP-UX, Open BSD sau Solaris.
O altă caracteristică importantă a MySQL este faptul că poate rula pe platforme cloud cum ar fi
Amazon EC2, existând mai multe posibilități pentru realizarea acestei facilități precum: utilizarea
unei mașini virtuale cu MySQL instalat, sau oferirea de servicii MySQL de către operatorul de
găzduire.
MySQL are atât puncte forte cât și puncte slabe, “Mulți fani înrăiți ai MySQL spun că acest
SGBD este mai rapid, mai de încredere și mai ieftin, sau pur și simplu mai bun, decât orice alt
sistem de gestiune a bazelor de date (inclusiv sistemele comerciale precum Oracle sau DB2), în
timp ce multi oponenți ai MySQL spun chiar că nu este nici măcar un sistem de baze de date
relațional”. [KO05]
În ceea ce privește aplicația prezentată în această lucrare, pot spune că MySQL ocupă unul
din cele mai importante roluri pentru realizarea ei în primul rând datorită faptului că este prelucrat
un set de date de dimensiune mare, iar accesul la aceste date trebuie să fie cât se poate de rapid și
corect. MySQL, împreună cu PHP realizează operațiile de regăsire, actualizare, inserare și ștergere
a datelor.
2.7 Apache
Apache HTTP Server este un server web open source, recunoscut ca fiind cel mai
popular. Inițial a fost destinat mediilor de lucru Unix, dar apoi a fost portat în Windows și alte
sisteme de operare în rețea. Apache a avut un rol important în dezvoltarea web, cunoscând o
creștere impresionantă, iar în prezent este folosit la peste jumătate din paginile de Internet active.
Apache a apărut ca o primă alternativă de calitate pentru Netscape Communications
Corporation, iar apoi s-a dezvoltat ca un rival competitiv pentru toate serverele web bazate pe
Unix. Fiind un program cu sursă deschisă, Apache este dezvoltat de o comunitate de programatori
14
coordonați de Apache Software Foundation. Apache poate rula pe o mare varietate de sisteme de
operare, precum: Unix, FreeBSD, Mac OS X, Linux, Microsoft Windows.
Robert McCool este cel care a realizat prima versiune a serverului web Apache, în timp ce
lucra la proiectul National Center for Supercomputimg Applications (NCSA). A doua versiune a
pus accent pe Apache Portable Runtime, un nivel considerat prioritar la vremea respectivă.
Funcționalitatea Apache poate fi extinsă de o multitudine de module care variază de la
programarea pe partea de server, până la anumite scheme de autentificare dinspre client. Printre
limbajele de programare suportate de Apache putem enumera: mod_perl, mod_python, Tcl și PHP.
O calitate aparte a serverului Apache este reprezentată de găzduirea virtuală, care constă în
posibilitatea ca pe același server să fie găzduite mai multe site-uri simultan.
Competitorii serverului Apache sunt: Microsoft Internet Information Services (IIS), Zeus
Web Server, Sun Java System Web Server etc. Importanța Apache este recunoscută de faptul că
unele dintre cele mai mari site-uri din lume îl folosesc ca și server. Spre exemplu, motorul de
căutare Google, folosește un modul modificat de Apache denumit Google Web Server (GWS).
2.8 Codeigniter
Codeigniter este un cadru de lucru (framework) cu sursă deschisă folosit pentru a construi
aplicații web și site-uri cu PHP, într-o manieră rapidă și ordonată. “Scopul său este acela de a oferi
posibilitatea dezvoltatorilor de a realiza proiecte mult mai rapid față de scrierea codului de la zero,
prin oferirea unui set bogat de biblioteci pentru cele mai utilizate sarcini, precum și o interfață
simplă și o structură logică, prin care să acceseze aceste biblioteci” [CO01]. Acest lucru înseamnă
că programatorii se pot concentra mai mult asupra proiectului, minimizând timpul necesar scrierii
de cod pentru funcționalitatea de bază.
Codeigniter este de asemenea un produs software cu sursă deschisă, astfel că el poate fi
modificat și utilizat după cum dorește fiecare programator. CodeIgniter are unele caracteristici
pozitive care îl fac să fie unul dintre cele mai utilizate cadre de lucru cu PHP:
ocupă foarte puțină memorie deoarece sistemul său central conține doar câteva
biblioteci mici, iar celelalte biblioteci necesare sunt încărcate dinamic la cerere;
este printre cele mai rapide cadre de lucru, în primul rând datorită caracteristicii
prezentate la punctul anterior;
este extensibil: orice programator își poate adăuga propriile biblioteci sau le poate
adapta pe cele existente;
este puternic documentat și susținut de o comunitate relativ mare de dezvoltatori;
folosește arhitectura Model-View-Controller
15
Una dintre cele mai importante facilități oferite de Codeigniter este implementarea
arhitecturii MVC care permite separarea logicii aplicației de prezentarea acesteia.
MVC, sau Model-View-Controller (Model – Viziune – Unitate de control) este un șablon
de dezvoltare care face ca paginile web să conțină cât mai puțin cod sursă scris printre elementele
de prezentare a aplicației. Codeigniter lucrează cu PHP5, astfel că introduce programarea orientată
pe obiecte, iar fiecare element (model, viziune, unitate de control) va fi definit ca o clasă cu
proprietăți și metode specifice.
Modelul conține funcții ce realizează regăsirea, inserarea sau actualizarea informațiilor din/
în baza de date. Viziunea reprezintă informația prezentată utilizatorului. O viziune poate fi atât o
pagină web cât și doar un fragment din aceasta, precum header sau footer. Unitatea de control
servește ca și intermediar între model și viziune, dar poate face legătura cu orice altă resursă
necesară.
În figura 3.1 se observă modul în care interacționează cele 3 elemente ale arhitecturii.
Astfel, din viziune sunt trimise cereri către unitatea de control care le procesează și dacă are nevoie
de date apelează modelul iar apoi trimite răspunsul către viziune care afișează informațiile. Dacă
nu are nevoie de baza de date, unitatea de control doar răspunde viziunii.
Acest mod de utilizare poate fi extins, în sensul că modelele pot fi accesate direct din viziune, însă
această practică nu este recomandată deoarece încarcă pagina web(viziunea) cu cod sursă care în
mod normal trebuie procesat de unitatea de control.
2.9 Eclipse
Eclipse este un mediu de dezvoltare cu sursă deschisă, integrat (IDE- Integrated
Development Environment) scris în mare parte în Java. Este un mediu de lucru multi-limbaj,
16
permițând prin intermediul unor extensii, utilizarea altor limbaje de programare: C, C++, COBOL,
FORTRAN, JavaScript, Perl, PHP, Phython, etc.
Pentru dezvoltarea aplicației de logistică, am utilizat mediul Eclipse, împreună cu extensia
PDT (PHP Development Tools), care permite lucrul cu PHP.
17
3.2 Proiectarea bazei de date
Proiectarea bazei de date presupune cunoașterea problemei ce trebuie rezolvată de către
aplicație și în primul rând cunoașterea datelor ce trebuie reținute (dimensiune, tipologie, etc).
3.2.1 Noțiuni teoretice
În primul rând, trebuie precizat faptul că realizarea unei aplicații cu baze de date necesită
existența unui sistem de baze de date (DBS = Database System), ce reprezintă un set de elemente
interconectate prin intermediul cărora se realizează colectarea, stocarea și procesarea datelor.
Din figura 3.2 se observă faptul că utilizatorul interacționează cu sistemul de baze de date
prin intermediul produselor software instalate, care realizează legătura cu datele, dar și cu alte
aplicații auxiliare.
Elemente auxiliare
Din categoria produselor software, cel mai important este Sistemul de Gestiune a Bazei de
Date(SGBD), ce reprezintă un ansamblu de programe ce oferă o interfață între baza de date și
utilizatori. “Un SGBD este o componentă software a unui sistem de baze de date care
interacționează cu toate celelelte componente, asigurând conectarea și independența dintre
elementele sistemului.” [LUVEBO09]. Astfel, un SGBD are rolul de a asigura: definirea și
descrierea structurii bazei de date, încărcarea și validarea datelor, accesul la date pentru operații
de consultare, interogare sau actualizare, mentenanța bazei de date și protecția bazei de date.
Figura 3.3 prezintă funcțiile unui SGBD (descriere, manipulare, administrare și utilizare), care sunt
interconectate și asigură funcționalitatea întregului sistem. Astfel, funcția de utilizare are rolul de
a realiza interfața cu utilizatorul, funcția de descriere definește structura bazei de date prin limbajul
de descriere a datelor (LDD), funcția de manipulare realizează inserarea și prelucrarea datelor prin
limbajul de maipulare a datelor (LMD), iar funcția de administrare gestionează baza de date.
18
utilizatori
utilizare
Baza de
date
Într-un sistem de calcul, datele sunt stocate atât în memoria internă (temporară), dar mai
ales în memoria externă. Stocarea datelor în memoria externă a fost condiționată de aspecte precum
: accesul rapid și ușor la date, volumul de date tot mai mare, creșterea complexității datelor,
perfecționarea echipamentelor de stocare și nu în ultimul rând lucrul în rețelele de
calculatoare.Stocarea datelor se poate face atât în fișiere, cât și în baze de date (care au evoluat din
fișiere).
Baza de date este un ansamblu de colecții de date organizat coerent, structurat astfel încât
redundanța să fie minimă și controlată, iar accesul la date să fie permis mai multor utilizatori
simultan și în timp util. Deși există mai multe generații de baze de date (arborescente, rețea,
relaționale , orientate obiect), cele mai utilizate în practică sunt cele relaționale (aproximativ >75%
din total).
Pentru a înțelege conceputul de bază de date, voi prezenta pe scurt elementele unei baze de date:
domeniul de valori desemnează mulțimea valorilor posibile pentru o caracteristică;
caracteristica reprezintă definirea și descrierea unui anumit aspect dintr-o entitate din lumea
reală;
familia de caracteristici reprezintă ansamblul proprietăților care se referă la aceeași entitate
din lumea reală;
colecția de date reprezintă o familie de caracteristici asupra căreia se aplică un predicat care
reprezintă o legătură între colecția curentă de date și o altă colecție.
19
Putem deci spune ca baza de date este un ansamblu de colecții de date aflate în interdependență
împreună cu descrierea datelor.
Revenind la modelul relațional, proiectarea unei baze de date presupune definirea
entităților și a legăturilor dintre acestea.Astfel, entitățilevor fi definite sub forma unor tablouri
bidimensionale denumite tabele sau relații. Conceptele utilizate sunt următoarele:
domeniul desemnează ansamblul valorilor ce pot fi utilizate;
tabela sau relatia este un subansamblu al produsului cartezian dintre mai multe domenii,
caracterizat printr-o denumire;
atributul ilustrează o coloană dintr-o tabelă care are o denumire și care va lua valori dintr-un
domeniu. Unele atribute pot avea rolul de cheie;
tuplul (înregistrare/realizare/instanță) este linia dintr-o tabela;
cheia reprezintă un atribut ori un ansamblu de atribute cu rolul de a identifica un tuplu dintr-o
tabelă;
Definirea legăturii dintre entități se face la nivel logic prin construirea de asocieri cu ajutorul unor
atribute de legătură (chei externe).
Ansamblul tabelelor și al legăturilor dintre acestea constituie schema bazei de date.
Un aspect important în realizarea unei baze de date este reprezentat de înlăturarea anomaliilor. Cea
mai utilizată tehnică pentru rezolvarea acestei situații este tehnica normalizării care presupune ca
toate relațiile să respecte cele cinci forme normale.
20
Proiectul conceptual se realizează independent de Sistemul de Gestiune a Bazelor de Date ales, și
se reprezintă în general prin modelul Entitate – Asociere (Entity - Relationship) care se
concretizează într-o diagramă Entitate-Asociere.
În proiectarea conceptuală a bazei de date vor fi urmăriți următorii pași:
Determinarea scopului bazei de date. Baza de date necesară aplicației de administrare a
activității logistice păstrează informații despre mașinile, șoferii și cursele firmei de
transporturi în scopul calculării de rezultate economice necesare administrării activității.
Împărțirea informațiilor în tabele. Se realizează prin găsirea celor mai importante entități
sau subiecte din descrierea problemei reale. Observăm astfel că principalele entități sunt :
mașină, șofer, cursă, defecțiune, alimentare.
Transformarea elementelor de informații în coloane. Vom decide ce informații vor fi
stocate în fiecare tabelă. Fiecare element devine un câmp afișat sub forma unei coloane a
tabelului.
Specificarea cheilor primare. Se alege coloana sau coloanele care vor identifica în mod
unic fiecare înregistrare din tabelă.
În figurile 3.4 – 3.9 se observă faptul că atributele fiecărei entități au fost transformate în
coloane ale tabelelor respective. În plus fiecare tabelă are o cheie primară al cărei rol este acela
de a identifica fiecare tuplu.
21
Figura 3.6 Tabela Curse
Configurarea relațiilor dintre tabele. Trebuie decis modul în care se asociază datele dintr-
un tabel cu datele din alte tabele. Se observă din figurile 3.4 - 3.9 că a fost ținut cont de
acest lucru deoarece unele tabele conțin și chei externe care în alte tabele au rolul de chei
22
primare realizându-se conexiunea dintre entități. Tabela Utilizatori nu este legată de nici o
altă tabelă deoarece este utilizată pentru administrarea aplicației și nu pentru
funcționalitatea activității de transporturi.
Reprezentarea tabelelor împreună cu relațiile dintre ele ilustrează schema conceptuală a bazei de
date sau diagrama Entitate - Asociere, prezentată în figura 3.10.
În figura de mai sus observăm entitățile și legăturile dintre ele. Astfel, putem descrie baza de date:
un șofer poate executa una sau mai multe curse, un șofer poate înregistra una sau mai multe
alimentări sau un șofer poate înregistra una sau mai multe defecțiuni la mașina pe care o
conduce.
mașină poate fi folosită în una sau mai multe curse, o mașină poate fi alimentată o dată sau
de mai multe ori și o mașină se poate defecta de una sau mai multe ori.
Legarea tabelelor este realizată prin chei externe. Astfel, id_sofer este cheie primară în tabela soferi
și cheie externă în tabelele curse, defecțiuni și alimentări. Aceeași situație se observă și în cazul
atributului nr_masina, cheia primară din tabela masini. Schema conceptuală ilustrează faptul că
avem un model de bază de date relațional, deoarece sunt prezente doar legături de tipul unul-la-
23
mai mulți. În cazul în care ar fi existat legături de tipul mai mulți-la-mai mulți, atunci acestea ar fi
trebuit să fie aduse la forma unul-la-mai mulți pentru a fi o bază de date relațională.
În cazul nostru schema conceptuală coincide cu cea logică deoarece, așa cum am explicat
mai sus nu există relații “mai mulți-la-mai mulți” care să necesite transformare. Schema logică
este implementată in SGBD-ul ales (MySQL) prin preluarea schemei conceptuale și rafinarea ei
astfel încât să se utilizeze facilitățile oferite de SGBD (modul de generare a cheilor primare,
definirea constrângerilor, etc).
Relațiile dintre tabele se stabilesc la momentul descrierii datelor prin LDD (limbajul de
descriere a datelor) cu ajutorul restricțiilor de integritate. Restricțiile de integritate sunt
implementate în SQL (Structured Query Language) cu ajutorul comenzilor CREATE TABLE și
ALTER TABLE și se clasifică în restricții structurale și semantice. Primele se definesc prin
compararea unor valori din tabele și sunt reprezentate de: cheia unică (clauza UNIQUE), restricția
referențială (clauza FOREIGN KEY) și restricția entității (clauza NOT NULL). A doua categorie
de restricții de integritate se definesc prin comportamentul datelor și țin cont de valorile din baza
de date. Vorbim despre domeniul de valori al unui atribut, sau de restricțiile temporare care fac
referire la valorile temporare obținute în urma calculelor.
Proiectarea fizică a bazei de date este reprezentată de alegerea structurilor de acces și
memorare a datelor, astfel încât acestea să fie optime. Se ține cont de timpul de răspuns, utilizarea
spațiului de memorie sau capacitatea tranzacțională. Aceste decizii se pot lua după analiza
aplicației care va utiliza baza de date și mai ales după testarea funcționării acesteia în condițiile
dorite (un anumit număr de utilizatori și un anumit volum de date). În principal, analiza fizică a
bazei de date are ca scop descoperirea atributelor care sunt cel mai frecvent utilizate în interogări
sau care sunt actualizate cel mai des, pentru stabilirea indexurilor secundare ale relațiilor.
Un alt obiectiv care trebuie urmărit în proiectarea bazei de date este reprezentat de către
protecția bazei de date și ne referim la securitatea și integritatea datelor. Securitatea datelor este
realizată în primul rând prin autorizarea și controlul accesului la date. Utilizatorii vor fi identificați
și vor avea anumite drepturi în ceea ce privește accesul la baza de date în funcție de calitatea /
funcția pe care o îndeplinesc. Un alt aspect ce ține de securitate este faptul că unele date, cum ar
fi parolele vor fi transmise codificat. Integritatea bazei de date este asigurată prin restricții de
integritate și validări asupra datelor, dar și prin salvarea unor copii de siguranță (backup).
24
interfeței este acela de a face interacțiunea utilizatorului cât de simplă și eficientă posibil pentru
ca acesta sa-și atingă obiectivele. Acest tip de gândire a interfeței este de cele mai multe ori
denumit: user-centered design și anume aspect centrat pe utilizator și după cum spune denumirea
se referă la faptul că atunci când se proiectează o interfață, persoana care folosește aplicația trebuie
să fie cel mai important element luat în considerare. Procesul de dezvoltare a interfeței trebuie să
balanseze funcționalitatea tehnică și elementele vizuale pentru a crea un sistem care este nu doar
operațional ci și utilizabil și adaptabil la schimbările de care are nevoie utilizatorul.
Aspectul referitor la prezentarea informației este descris în articolul 12 al standardului ISO 9241
referitor la organizarea informației (aranjare, aliniere, grupare, etichetare, locație), prin șapte
atribute:
claritate: conținutul informației este redat rapid și exact;
discriminabilitate: informațiile redate pot fi distinse eficient;
simplitate: utilizatorii nu sunt supraîncărcați cu informații inutile;
consistență: un aspect unic, conform cu aștepțările utilizatorilor;
detectabilitate: atenția utilizatorului este direcționată către informația necesară;
lizibilitate: informația este ușor de citit;
înțelegere: informația este ușor de înțeles, neambiguă și ușor recunoscută;
Aspectul aplicației este unul clasic pentru o aplicație web, dar nu numai, și este reprezentat de
împărțirea ferestrei browserului în 3 parți cu funcționalități diferite, cum este prezentat în figura
3.11.
26
Figura 4.1 Arhitectura Model – View - Controller
Din punctul meu de vedere, utilizarea unei arhitecturi de tipul MVC, este foarte utilă
deoarece impune o anumită rigurozitate în elaborarea codului sursă, care în acest mod este mai
organizat și mai ușor de urmărit și depanat. În plus, foarte multe funcții și metode pot fi utilizate
în mai multe module ceea ce duce la o programare eficientă.
Aplicația cuprinde 2 funcționalități oarecum diferite. Prima se referă la manipularea datelor
desemnate de entitățile bazei de date, în timp ce a doua parte se referă la posibilitatea obținerii de
grafice și rapoarte. Această separare este sugerată chiar de meniul aplicației.
În figura 4.2, care prezintă meniul aplicației, se observă faptul că butoanele Șoferi, Mașini, Curse,
Alimentări și Defecțiuni reprezintă entităție studiate sau tabelele din baza de date. Astfel, fiecare
secțiune accesată prin aceste butoane va realiza operații de manipulare a datelor din tabela
respectivă în principal, dar și din tabelele adiacente în cazul în care acestea sunt legate între ele.
Ultima opțiune permite prezentarea unor grafice relevante pentru activitatea de transporturi.
27
4.1.1 Implementarea bazei de date și a funcționalității acesteia
Implementarea bazei de date este realizată prin intermediul limbajului de descriere a
datelor (LDD) pentru crearea tabelelor, iar apoi prin limbajul de manipulare a datelor (LMD)
pentru popularea, regăsirea și actualizarea datelor.
Crearea bazei de date a fost realizată utilizând aplicația MySQL Workbench care se
conectează la serverul MySQL și accesează baza de date. Crearea tabelelor poate fi făcută atât în
mod vizual folosind asistentul aplicației, cât și prin scrierea de cod SQL. Spre exemplu, crearea
tabelei Soferi se realizează executând următoarea comandă SQL:
CREATE TABLE `logistica`.`soferi` (
Se observă faptul că tabela “soferi” face parte din baza de date “logistica”, și are atributele: id,
nume, prenume, cnp, varsta, data_angajare și salariu, dintre care id este cheie primară.
Legăturile dintre tabele sunt realizate prin intermediul cheilor externe, însă în cazul mysql nu este
neapărat nevoie ca acestea să fie declarate, ci este suficient ca atributele considerate chei externe
să aibă aceeași denumire și tip de date ca și atributul din tabela părinte. Putem vorbi despre o
legătură logică între tabele.
În ceea ce privește funcționalitatea bazei de date, acesta este realizată prin limbajul de
manipulare a datelor, apelat prin intermediul modelelor. După cum a fost prezentat anterior,
modelul reprezintă o clasă a aplicației care se ocupă cu conectarea la baza de date și asigură
interfața dintre aplicație și baza de date.
Pentru implementarea modelelor am folosit o altă facilitate oferită de către Codeigniter și anume,
clasa Active Records, care permite scrierea comenzilor SQL, într-o manieră orientată pe obiecte
specifică PHP 5. Oferim ca exemplu operațiile executate pentru inserarea și actualizarea și
regăsirea datelor din tabela “soferi”:
funcție pentru inserarea unei înregistrări în tabela “soferi”:
function add_sofer($nume,$prenume,$cnp,$varsta,$data_angajare,$salariu)
{
$this->db->set('nume',$nume);
$this->db->set('prenume',$prenume);
$this->db->set('cnp',$cnp);
28
$this->db->set('varsta',$varsta);
$this->db->set('data_angajare',$data_angajare);
$this->db->set('salariu',$salariu);
$this->db->insert('soferi');
}
În limbajul SQL, codul de mai sus este echivalent cu :
INSERT INTO SOFERI (nume, prenume, cnp, varsta, data_angajare, salariu) VALUES ($nume,
$prenume, $cnp, $varsta, $data_angajare, $salariu);
funcție pentru editarea unui tuplu din tabela “soferi”:
function edit_sofer($id, $nume, $prenume, $cnp, $varsta, $data_angajare, $salariu)
{
$this->db->where('id',$id);
$this->db->set('nume',$nume);
$this->db->set('prenume',$prenume);
$this->db->set('cnp',$cnp);
$this->db->set('varsta',$varsta);
$this->db->set('data_angajare',$data_angajare);
$this->db->set('salariu',$salariu);
$this->db->update('soferi');
}
Limbaj SQL: UPDATE soferi SET nume = $nume, prenume = $prenume, cnp = $cnp, data_angajare =
$data_angajare, salariu = $salariu, telefon = $telefon WHERE id= $id
funcție pentru stergerea unei înregistrări din tabela “soferi”:
function delete_sofer($id)
{
$this->db->where('id',$id);
$this->db->delete('soferi');
}
Limbaj SQL: DELETE FROM soferi WHERE id=$id
funcție pentru listarea șoferilor. Lista de soferi este regăsită în baza de date prin apelarea
funcției “get_soferi” din modelul “Soferi”, iar apoi este trimisă către viziune sub formă
unui obiect json (javaScript object notation) fiind afișată.
Din funcțiile prezentate mai sus, se observă clar rolul unității de control, și anume acela de a dirija
fluxul aplicației, între paginile ce trebuiesc afișate și elementele de logică ce asigură
funcționalitatea aplicației. Tot la partea de funcționalitate a aplicației se adaugă accesul la aplicație
pe baza unui nume de utilizator și a unei parole, care identifică fiecare utilizator ce lucrează cu
aplicația. Pentru implementarea acestui modul, au fost create o viziune “Login” și o unitate de
control cu același nume. Acest modul, citește datele de autentificare și verifică dacă sunt găsite în
baza de date. În caz afirmativ, este permis accesul utilizatorului, în caz contrar, accesul este
30
interzis. Controlarea activității de autentificare se desfășoară după cum urmează, fiind gestionată
de clasa Login:
Respectivul tabel este construit într-o viziune, al cărei cod este scris în HTML, javaScript și jQuery
și al cărei rol este acela de a prezenta datele într-o manieră ușor de citit și de înțeles și de a realiza
cererile către server. În continuare, vom vedea cum arată o astfel de viziune:
<script>
$(function(){
jQuery("#soferi_list").jqGrid({
url:'<?php echo $this->config->item('base_url');?>/soferi/lista',
editurl:'<?php echo $this->config->item('base_url');?>/soferi/edit',
datatype: 'json',
colNames:['Nr','Nume', 'Prenume', 'CNP', 'Varsta','Data
Angajare','Salariu','Vechime'],
31
colModel:[
{name:'nr',index:'nr', width:25, editable:false},
{name:'nume',index:'nume', width:180, editable:true},
{name:'prenume',index:'prenume', width:180, editable:true},
{name:'cnp',index:'cnp', width:110, editable:true},
{name:'varsta',index:'varsta', width:70, editable:true},
{name:'data_angajare',index:'data_angajare', width:125, editable:true},
],
sortname: "Nr",
rowNum:100000,
rowTotal:-1,
pgtext: "",
pgbuttons: false,
width:880,
toppager:true,
forceFit:true,
shrinkToFit:false,
pager: '#soferi_pager',
caption:"Lista soferi"
});
jQuery("#soferi_list").jqGrid('navGrid',"#soferi_pager",
{edit: true, add:true, del: true, search:false, cloneToTop:true, refresh:true},
{closeOnEscape:true},
{closeOnEscape:true}
);
});
</script>
<table id='soferi_list'></table>
<div id = 'soferi_pager'></div>
32
Figura 4.4 Autentificare aplicației logistică
După autentificarea în aplicație, utilizatorul are acces la cele trei zone de lucru ce vor fi
prezentate în ceea ce urmează. Implementarea paginii principale este prezentată în Anexa 3.
În primul rând, zona din partea de sus a ecranului conține sigla companiei, numele aplicației, iar
în partea dreaptă, ora, numele utilizatorului conectat, un buton de administrare a utilizatorilor și
un buton de părăsire a aplicației, după cum este prezentat în figura 4.5:
33
În cazul în care se dorește adăugarea unui nou utilizator, va fi deschisă o nouă fereastră, și aceasta modală,
după cum urmează:
Revenim la partea aplicației ce ține de domeniul logisticii și anume la meniul situat în partea
stângă a ecranului care conține următoarele opțiuni: Panou Central, Șoferi, Mașini, Curse, Alimentări,
Defecțiuni și Grafice.
Prima opțiune (Panou central) reprezintă ecranul de început al aplicației și permite revenirea la
acesta mai târziu. Acest ecran principal conține un grafic dinamic ce reprezintă una dintre cele mai
relevante situații de ieșire din domeniul transporturilor și anume Evoluția costului per kilometru.
Efectuând click pe orice bară a graficului este prezentat un sumar al distanței parcurse și al costurilor din
respectiva lună, după cum se observă în figura 4.8.
Operațiile de manipulare a tablei șoferi din baza de date pot fi efectuate din această pagină,
prin intermediul butoanelor situate atât deasupra tabelului cât si sub acesta. Observăm existența a
4 butoane de adăugare, editare ștergere și actualizare a listei. Formularele de adăugare și editare a
șoferilor sunt prezentate în figurile următoare:
35
Figura 4.11 Formular editare șofer
Apăsarea butonului de ștergere a unei înregistrări va duce la apariția unei casete de mesaj care
cere utilizatorului să confirme din nou intenția de a șterge înregistrarea.
Deoarece una dintre regulile de prezentare a unei aplicații precizează ca aceasta trebuie să aibă un
aspect unitar, celelalte secțiuni vor arăta la fel ca secțiunea șoferi, diferind doar conținutul acestora.
Acest lucru se observă în figurile ce urmează:
36
Figura 4.13 lista de mașini
Listele de curse, alimentări și defecțiuni permit în plus filtrarea datelor în funcție de o dată de
început și una de sfârșit.
37
Figura 4.15 Lista de alimentări
Ultima opțiune a meniului prezintă o serie de grafice ce oferă informații relevante despre starea
activității de transporturi de-a lungul timpului și pot fi considerate suport pentru deciziile viitoare.
38
După cum se observă în figura 4.17, se poate alege o categorie de grafic, referitoare la șoferi,
defecțiuni, parcul auto sau furnizorii de combustibil.
Astfel , în figura 4.18 este prezentat numărul de curse efectuate și ore efectiv lucrate de către un
șofer, în fiecare din lunile anului curent până la cea prezentă.
Figura 4.19 prezintă evoluția numărului de defecțiuni înregistrate de către mașinile firmei de-a
lungul timpului. Efectuând click pe o bară a graficului, vor fi afișate mașinile ce au avut nevoie
de reparații în luna respectivă, împreună cu șoferul care a înregistrat defecțiunea și data intrării în
service.
39
Figura 4.19 numărul de defecțiuni înregistrate
Figura 4.20 ilustrează proporția mărcilor mașinilor din parcul auto al firmei, iar la selectarea unui
producător de pe grafic vor fi afișate mașinile corespunzătoare acelui producător.
40
În cele din urmă, figura 4.21, prezintă proporția furnizorilor de combustibil de la care au fost efectuate
alimentări.
41
Concluzii
În concluzie, pot spune că tema aleasă a fost una interesantă și atractivă din punct de vedere
economic, dar mai ales din punct de vedere informatic. În ceea ce privește domeniul economic,
tema a fost interesantă deoarece a presupus cercetarea unui domeniu dinamic ce implică costuri
foarte ridicate și trebuie să fie optimizat. Din punct de vedere informatic, atractivitatea temei s-a
manifestat prin găsirea unei soluții de adminstrare a domeniului economic studiat.
Soluția informatică realizată poate fi extinsă, iar una dintre primele idei de extindere este
implementarea unui modul care să permită localizarea autovehiculelor pe hartă atunci când acestea
sunt în deplasare și un alt modul care să calculeze drumurile minime pentru optimizarea
transporturilor. Pot fi extinse și facilitățile deja existente, prin adăugarea unui număr mai mare de
situații de ieșire (grafice, rapoarte).
42
Referințe bibliografice
43
Lista figurilor
44
Anexe
$(function(){
$("#btn_login").button()
.click(function(){
if($('#login_username').val()!="" && $("#login_password").val()!= "")
{
$.ajax({
type:'post',
url:'login/check/'+$('#login_username').val()+'/'+$("#login_password").val(),
success: function(data)
{
if(data == 1) {
window.location = "main";
}
else
{
$("#login_message").html("Numele de utilizator sau/si parola sunt
incorecte");
$("#login_username").val("");
$("#login_password").val("");
}
}
});
}
else alert("Completati numele de utilizator si parola");
});
45
$("#login_dialog").dialog({
modal:true,
width:400,
position: "center",
title: "Autentificare Administrare Logistica"
});
})
</script>
</head>
<body>
<div id='login_dialog'>
<div id='login_message'></div>
<table>
<tr><td>Nume utilizator </td>
<td><input type=text id='login_username' name="username"
style='width:200px;' /></td>
</tr>
<tr><td>Parola </td>
<td><input type=password id='login_password' name="password"
style='width:200px;' /></td>
</tr>
</table>
<button id='btn_login'>Autentificare</button>
</div>
</body>
</html>
}
// viziune
<script>
$(function(){
jQuery("#soferi_list").jqGrid({
url:'<?php echo $this->config->item('base_url');?>/soferi/lista',
editurl:'<?php echo $this->config->item('base_url');?>/soferi/edit',
datatype: 'json',
colNames:['Nr','Nume', 'Prenume', 'CNP', 'Varsta','Data
Angajare','Salariu','Vechime'],
colModel:[
{name:'nr',index:'nr', width:25, editable:false},
{name:'nume',index:'nume', width:180, editable:true},
{name:'prenume',index:'prenume', width:180, editable:true},
{name:'cnp',index:'cnp', width:120, editable:true},
{name:'varsta',index:'varsta', width:65, editable:true},
{name:'data_angajare',index:'data_angajare', width:125,
editable:true},
{name:'salariu',index:'salariu', width:65, editable:true},
{name:'vechime',index:'vechime', width:70, sortable:false,
editable:false}
],
sortname: "Nr",
rowNum:100000,
rowTotal:-1,
pgtext: "",
pgbuttons: false,
width:870,
toppager:true,
forceFit:true,
shrinkToFit:false,
pager: '#soferi_pager',
caption:"Lista soferi"
});
jQuery("#soferi_list").jqGrid('navGrid',"#soferi_pager",
{edit: true, add:true, del: true, search:false, cloneToTop:true,
refresh:true},
{closeOnEscape:true},
{closeOnEscape:true}
);
});
</script>
<table id='soferi_list'></table>
<div id = 'soferi_pager'></div>
47
// model
class Model_soferi extends CI_Model{
function __construct()
{
// Call the Model constructor
parent::__construct();
$this->load->database();
}
function get_soferi()
{
$return_array = array();
$this->db->select('*')->from('soferi');
$res = $this->db->get();
foreach($res->result_array() as $row)
{
$return_array[] = $row;
}
return $return_array;
}
function get_sofer($id)
{
$this->db->select('*')->from('soferi');
$this->db->where('id',$id);
$res = $this->db->get();
return $res->row_array();
}
function add_sofer($nume,$prenume,$cnp,$varsta,$data_angajare,$salariu)
{
$this->db->set('nume',$nume);
$this->db->set('prenume',$prenume);
$this->db->set('cnp',$cnp);
$this->db->set('varsta',$varsta);
$this->db->set('data_angajare',$data_angajare);
$this->db->set('salariu',$salariu);
$this->db->insert('soferi');
}
function delete_sofer($id)
{
$this->db->where('id',$id);
$this->db->delete('soferi');
}
function
edit_sofer($id,$nume,$prenume,$cnp,$varsta,$data_angajare,$salariu)
{
$this->db->where('id',$id);
$this->db->set('nume',$nume);
$this->db->set('prenume',$prenume);
$this->db->set('cnp',$cnp);
$this->db->set('varsta',$varsta);
$this->db->set('data_angajare',$data_angajare);
$this->db->set('salariu',$salariu);
$this->db->update('soferi');
48
ANEXA 3. Pagina principală a aplicației
<html>
<head>
<link rel="Stylesheet" type="text/css" href="htdocs/style.css" />
<link rel="Stylesheet" type="text/css" href="htdocs/jquery/css/themes/ui-
lightness/jquery-ui.css" />
<link rel="Stylesheet" type="text/css" href="htdocs/jqgrid 3/css/
ui.jqgrid.css " />
<link rel="stylesheet" type="text/css" href="htdocs/jqPlot/jquery.jqplot.css"
/>
<script src='htdocs/jquery/js/jquery-1.7.2.min.js'></script>
<script type="text/javascript" src='htdocs/jquery/js/jquery-ui-
1.8.20.custom.min.js'></script>
<script type="text/javascript" src='htdocs/jqgrid 3/src/i18n/grid.locale-
en.js'></script>
<script src='htdocs/jqgrid 3/js/jquery.jqGrid.min.js'></script>
<script src='htdocs/clock.js'></script>
<script type="text/javascript" src="htdocs/jqPlot/jquery.jqplot.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.canvasTextRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.canvasAxisLabelRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.dateAxisRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.canvasTextRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.canvasAxisTickRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.categoryAxisRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.barRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.pieRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.categoryAxisRenderer.min.js"></script>
<script type="text/javascript"
src="htdocs/jqPlot/plugins/jqplot.pointLabels.min.js"></script>
$(function(){
49
$("#username_show").html('<?php echo $username;?>');
$("#btn_logout").button({icons:{primary:'ui-icon-
power'}}).click(function(){
window.location = "login";
});
$("#admin").button({icons:{primary:'ui-icon-
person'},text:false}).click(function(){
$('#dialog_users').load('<?php $this->config-
>item('base_url');?>users/users_list');
$('#dialog_users').dialog({width:500,modal:true,title:'Lista
utilizatori'});
});
$("#print").button({icons:{primary:'ui-icon-
print'},text:false}).click(function(){
print_content("main_center");
});
$('.menu_button').button()
.click(function(){
var categorie = $(this).attr('categ');
$.ajax({
type: 'post',
url: <?php $this->config->item
('base_url');?>'main/'+categorie,
success: function(data){
$("#main_center").html(data);
}
});
});
$("#main_panel_button").trigger('click');
})
</script>
</head>
<body>
<div id='main_top' class='ui-widget-header'>
<div style='width:150px; display:inline-block; position:absolute; top:0px;
left:0px;'>
<img src='htdocs/logo.png' style='background-color:transparent;
height:90px;' />
</div>
<div style='width:700px; display:inline-block; text-align:center;'>
<h2> Administrare Logistica </h2>
</div>
<div style='width:300px; display:inline-block; text-align:right; padding-
right:50px; position:absolute; top:5px; right:5px;'>
<!--ceas -->
<div class="clock">
<div id="Date"></div>
<ul>
<li id="hours"></li>
<li id="point">:</li>
<li id="min"></li>
<li id="point">:</li>
<li id="sec"></li>
</ul>
</div>
<!-- ceas -->
<div id='username_show' style='padding-bottom:3px; padding-
top:1px;'></div>
50
<button id='admin' style='margin-right:5px; height:20px;
width:20px;'>Administrare utilizatori</button>
<button id='btn_logout' style='width:80px; height:30px; font-size:12px;
'>Logout</button>
</div>
</div>
<div id='main_left' >
<button id='main_panel_button' class='menu_button'
categ='panou_central'>Panou Central</button>
<button class='menu_button' categ='soferi'>Șoferi</button>
<button class='menu_button' categ='masini'>Mașini</button>
<button class='menu_button' categ='curse'>Curse</button>
<button class='menu_button' categ='alimentari'>Alimentări</button>
<button class='menu_button' categ='defectiuni'>Defecțiuni</button>
<button class='menu_button' categ='rapoarte'>Grafice</button>
</div>
<div id='main_center'>
</div>
<div id='dialog_users'></div>
</body>
</html>
#main_left {
position: absolute;
left:0px;
top: 100px;
width:200px;
border:1px solid silver;
min-height:500px;
color:#FEFEFE;
text-align:left;
}
#main_center {
position:absolute;
left:200px;
top:100px;
width:880px;
min-height:480px;
border:1px solid silver;
padding: 10px;
}
button {
font-size:15px;
padding:3px;
}
51
.menu_button
{
width:100%;
margin: 0px;
padding:7px;
}
#Date {
font-family:'BebasNeueRegular', Arial, Helvetica, sans-serif;
font-size:15px;
text-align:right;
text-shadow:0 0 5px #00c6ff;
}
ul {
margin:0px; padding:0px;
list-style:none;
text-align:right;
}
ul li { display:inline;
font-size:14px;
text-right;
font-family:'BebasNeueRegular', Arial, Helvetica, sans-serif;
text-shadow:0 0 0px #FEFEFE;
}
#point { position:relative;
-moz-animation:mymove 1s ease infinite;
-webkit-animation:mymove 1s ease infinite;
padding-left:1px;
padding-right:1px;
}
/* Simple Animation */
@-webkit-keyframes mymove
{
0% {opacity:1.0; text-shadow:0 0 2px #FEFEFE;}
50% {opacity:0; text-shadow:none; }
100% {opacity:1.0; text-shadow:0 0 2px #FEFEFE; }
}
@-moz-keyframes mymove
{
0% {opacity:1.0; text-shadow:0 0 2px #FEFEFE;}
50% {opacity:0; text-shadow:none; }
100% {opacity:1.0; text-shadow:0 0 2px #FEFEFE; }
}
52