SQLite & PDO SQLite support missing in this PHP install - plugin will not work

Wymiennik

Projekt konceptualny

1. Sformułowanie zadania projektowego

Projekt obejmuje stworzenie systemu wspierającego wymianę przedmiotów typu książki, płyty CD oraz DVD, gry komputerowe oraz gry planszowe pomiędzy zarejestrowanymi użytkownikami. Na rynku nadal istnieje deficyt serwisów oferujących tego typu usługi a wielu ludzi po pewnym czasie użytkowania przedmiotów są skłonni wymienić je na inne tego samego typu. Pozwala to zaoszczędzić pieniądze wydane na kupowanie wciąż nowych produktów. Serwis ten umożliwia odnalezienie ludzi posiadających interesujące danego użytkownika przedmioty oraz bezproblemową wymianę. Istniejące w Internecie podobne serwisy internetowe nie są w pełni funkcjonalne, dlatego motywacją jest utworzenie systemu bardziej spełniającego zadania stawiane takiemu serwisowi. Rejestracja w serwisie będzie bezpłatna, jednak konto podstawowe oferować będzie ograniczone funkcje wymiany przedmiotów. Użytkownicy będą mieli możliwość wykupienia wersji Premium, która umożliwi korzystanie ze wszystkich usług bez ograniczeń. Istniejące serwisy zajmujące się podobnym zakresem usług, działają na różnych zasadach i ich regulaminy mogą być niekorzystne dla niektórych użytkowników. Serwis Wymiennik będzie miał zasady jasno określone, odpowiadające potrzebom użytkowników oraz spełniające ich oczekiwania.

2. Analiza stanu wyjściowego

Istniejącymi na rynku rozwiązaniami tego typu to na przykład serwisy freeko.pl oraz podaj.net, jednak różnią się one zasadami wymiany od naszego serwisu. W pierwszym z nich, użytkownik, chcąc zamówić dany przedmiot, nie musi z jego właścicielem wymieniać się na produkty. Płaci on bowiem punktami freeko, które otrzymuje, oddając swoje przedmioty innym użytkownikom. Nowo zarejestrowany użytkownik nie może więc zamówić interesującego go przedmiotu, lecz najpierw musi zdobyć punkty freeko. Wystawienie przedmiotów również kosztuje, opłaca się to punktami kredytowymi. Istnieje możliwość ich dokupywania. Są one niezbędne zarówno podczas transakcji oddania przedmiotu jak i zamawiania. Serwis podaj.net działa w podobny sposób: użytkownicy ‘podający’ przedmioty innym użytkownikom zbierają punkty, które mogą następnie wykorzystać, gdy chcą wypożyczyć interesujący ich przedmiot. Istnieje tu pewne ograniczenie, ponieważ nowi użytkownicy nie posiadający punktów nie mogą pożyczać produktów. Serwis podaj.pl oferuje jednak dokupowanie punktów. Istnieje również możliwość przelewania punktów dowolnym użytkownikom. W odróżnieniu od istniejących już na rynku portali tego typu, serwis Wymiennik umożliwia wymianę przedmiotów nawet nowo zarejestrowanym użytkownikom w koncie podstawowym, co w przeciwieństwie do niektórych portali tego typu istniejących na rynku jest usługą całkowicie bezpłatną. Jedyną różnicą między kontem podstawowym a Premium jest ograniczenie wymiany dla użytkowników z tego samego województwa dla użytkowników posiadających pierwszy z nich. Oprócz tego, wystawienie przedmiotu do wymiany nie będzie wymagało żadnych dodatkowych opłat, co umożliwi użytkowników wprowadzanie bazy wszystkich swoich produktów. Wpłynie to znacznie na zwiększenie liczby dostępnych produktów i zwiększy szansę na znalezienie interesującego przedmiotu. Wymiana przedmiotów w serwisie Wymiennik jest możliwa tylko na zasadzie wzajemnej wymiany produktów, a nie jak w opisywanych wyżej serwisach na zasadzie zdobywanych punktów. Jest to duże udogodnienie dla użytkowników, których przedmioty wypożycza wiele innych osób, lecz oni sami nie znajdują interesujących ich pozycji.

3. Analiza wymagań użytkownika

W projekcie wyróżnia się trzy rodzaje użytkowników: Administrator serwisu, użytkownik zarejestrowany użytkownik oraz gość. Administrator zarządza całym serwisem oraz bazą danych, użytkownik zarejestrowany po zalogowaniu ma między innymi dostęp do swojego konta, edytowania go, pogląd i edycja przedmiotów oraz ich rezerwacja. Gość może jedynie przeglądać przedmioty znajdujące się w bazie jednak bez możliwości ich rejestracji. Funkcjonalności serwisu:

3.1. Must

  • Rejestracja i logowanie użytkowników
  • Interfejs pozwalający na łatwe wprowadzanie przedmiotów będących w posiadaniu danego użytkownika – odpowiednio skategoryzowanych - oraz na ich edycję
  • Moduł przeprowadzania transakcji wymiany
  • Wyszukiwarka przedmiotów
  • Możliwość szczegółowego podglądu interesującego przedmiotu
  • Frequently Asked Questions

3.2. Should

  • Wymiana wiadomości pomiędzy użytkownikami
  • Formularz wysyłania pytań oraz wiadomości administratorom
  • Możliwość oceny danego użytkownika
  • Wgląd do historii przeprowadzonych transakcji danego użytkownika
  • Możliwość wykupienia konta Premium
  • Wyszukiwarka przedmiotów dla użytkowników podstawowych i Premium

3.3. Could

  • Możliwość edycji profilu użytkownika
  • Wyświetlanie profilu użytkownika
  • Integracja z systemem płatności, np. PayPal, przelewy.pl
  • Integracja z serwisami społecznościowymi
  • System kary dla użytkowników słabo ocenianych przez innych

4. Określenie scenariuszy użycia

4.1. Rejestracja użytkownika

  1. Użytkownik wybiera z menu głównego zakładkę Rejestracja.
  2. Aby się zarejestrować musi wypełnić wszystkie podane pola.
  3. Wybiera przycisk Zarejestruj.
  4. Następuje weryfikacja danych: czy wszystkie pola są wypełnione oraz czy są one wypełnione poprawnymi wartościami
  5. Użytkownik przechodzi do strony Moje konto.

4.2. Logowanie do portalu

  1. Użytkownik klika w link Zaloguj znajdujący się w prawym górnym rogu.
  2. Wprowadza swoją nazwę użytkownika oraz hasło.
  3. Następuje weryfikacja wprowadzonych danych.
  4. Jeśli dane są poprawne, przechodzi na stronę Moje Konto.

4.3. Wyszukiwanie przedmiotu

  1. Po lewej stronie znajduje się sekcja Wyszukiwarka umożliwiająca na wyszukanie przedmiotu poprzez wpisanie jego nazwy lub autora
  2. Użytkownik wybiera z rozwijanego menu znajdującego się po lewej stronie kryteria wyszukiwania: kategorię oraz czy wyszukuje przedmiot po tytule lub po autorze.
  3. Użytkownik w polu Poszukiwana fraza wpisuje interesująca go pozycję.
  4. Klika na link Szukaj.
  5. W środkowej części strony znajdują się wszystkie znalezione przez wyszukiwarkę pozycje.

4.4. Wyświetlanie wszystkich przedmiotów

  1. Po lewej stronie znajduje się sekcja Kategorie.
  2. Użytkownik wybiera interesującą go kategorię oraz klika na odpowiedni przycisk z menu.
  3. W środkowej części strony wyświetlają się wszystkie przedmioty z danej kategorii.

4.5. Rezerwacja przedmiotu

  1. Użytkownik wyświetla interesujące go przedmioty używając Wyszukiwarki lub Kategorii.
  2. Klika na link Wyświetl przy interesującym go przedmiocie, pokazując jego szczegółowy opis.
  3. Następnie użytkownik klika na link Zarezerwuj, aby zarezerwować dany przedmiot.
  4. Następuje weryfikacja danych:
  • Czy przedmiot nie należy do danego użytkownika,
  • Czy użytkownik jest zalogowany,
  • Czy przedmiot ma status Wolny.
  1. Jeśli wszystkie warunki są spełnione, przedmiot zostaje zarezerwowany oraz jego status odpowiednio się zmienia.

4.6. Edycja danych

  1. Użytkownik loguje się.
  2. Wybiera przycisk Moje dane.
  3. Klika na Edytuj dane.
  4. Pojawiają się dodatkowa opcja Wybierz plik oraz Załaduj, w celu załadowania avatara.
  5. Użytkownik może edytować pola: Miasto, Ulica, Numer domu, Numer mieszkania oraz Kod pocztowy.
  6. Klika na Zapisz dane.
  7. Jeśli wprowadzone dane są poprawne, dane użytkownika zostają zapisane.

4.7. Dokonywanie wymiany

  1. Użytkownik loguje się.
  2. Wybiera przycisk Rezerwacje.
  3. Wyświetla się lista przedmiotów zarezerwowana przez innych użytkowników.
  4. Użytkownik klina na link Przedmioty na wymianę.
  5. Wyświetla się lista przedmiotów danego użytkownika, z których użytkownik może wybrać przedmiot na wymianę.
  6. Jeśli znajdzie interesujący go przedmiot klika na link Wymień i następuje wymiana przedmiotów.

4.8. Anulowanie rezerwacji na swoje przedmioty

  1. Użytkownik loguje się.
  2. Wybiera przycisk Rezerwacje.
  3. Wyświetla się lista przedmiotów zarezerwowana przez innych użytkowników.
  4. Klika na przycisk Anuluj rezerwację przy danym przedmiocie.

4.9. Anulowanie swoich rezerwacji

  1. Użytkownik loguje się.
  2. Wybiera przycisk Moje rezerwacje.
  3. Wyświetla się lista przedmiotów zarezerwowana przez danego użytkownika.
  4. Klika na przycisk Anuluj rezerwację przy danym przedmiocie.
  5. Przedmiot znika z listy Moje rezerwacje.

4.10. Edycja przedmiotów

  1. Użytkownik loguje się.
  2. Wybiera przycisk Moje przedmioty.
  3. Wyświetla się lista przedmiotów, które posiada dany użytkownik.
  4. Klika na link Pokaż przy danym przedmiocie.
  5. Wyświetla się szczegółowy opis przedmiotu.
  6. Użytkownik klika na link Edycja.
  7. Edytuje pola danego przedmiotu.
  8. Klika na link Aktualizuj.

4.11. Usuwanie przedmiotu

  1. Użytkownik loguje się.
  2. Wybiera przycisk Moje przedmioty.
  3. Wyświetla się lista przedmiotów, które posiada dany użytkownik.
  4. Klika na link Usuń przy danym przedmiocie.
  5. Przedmiot znika z listy Moje przedmioty.

4.12. Wprowadzenie nowego przedmiotu

  1. Użytkownik loguje się.
  2. Wybiera przycisk Wprowadź przedmiot.
  3. Wyświetla się menu pozwalające wybrać kategorię nowego przedmiotu.
  4. Użytkownik wybiera kategorię, klika link Dalej.
  5. Wyświetlają się pola do uzupełnienia, aby opisać nowy przedmiot.
  6. Użytkownik uzupełnia dane pola.
  7. Klika na link Zapisz.
  8. Wyświetla się komunikat informujący, że dane zostały zapisane.

4.13. Sprawdzenie historii transakcji

  1. Użytkownik loguje się.
  2. Wybiera przycisk Historia transakcji.
  3. Wyświetla się historia transakcji danego użytkownika.

4.14. Ocena innego użytkownika

  1. Użytkownik loguje się.
  2. Wybiera przycisk Historia transakcji.
  3. Wyświetla się historia transakcji danego użytkownika.
  4. Użytkownik klika na link Dane użytkownika.
  5. Wyświetlają się szczegółowe informacje o użytkowniku.
  6. Z rozwijanego menu użytkownik wybiera ocenę.
  7. Klika na przycisk Oceń użytkownika.
  8. Zostaje wyliczona średnia ocena danego użytkownika oraz wyświetlona na danej stronie.

4.15. Generowanie statystyk

  1. Po prawej stronie serwisu znajduje się sekcja Statystyki.
  2. Użytkownik klika na przycisk Pokaż.
  3. Wyświetlają się statystyki serwisu, takie jak:
  • Ilość zarejestrowanych użytkowników,
  • Ilość dokonanych wymian,
  • Ilość przedmiotów w bazie.

4.16. Wyświetlenie Frequently Asked Questions

  1. Użytkownik wybiera z głównego menu zakładkę FAQ.
  2. Wyświetla się lista pytań.
  3. Użytkownik klika na link Wybierz obok interesującego go pytania.
  4. Wyświetla się odpowiedź na to pytanie.
  5. Użytkownik klika przycisk Wróć, aby wrócić do listy pytań.

5. Identyfikacja funkcji

  1. Rejestracja użytkowników
  2. Logowanie / wylogowywanie z serwisu
  3. Wyszukiwanie przedmiotów
  4. Wyświetlanie oraz edycja danych użytkownika
  5. Wyświetlanie oraz edycja przedmiotów
  6. Dodawanie / usuwanie przedmiotów
  7. Rezerwacja przedmiotów oraz ich anulowanie
  8. Wymiana przedmiotów
  9. Wyświetlanie historii transakcji
  10. Ocenianie innych użytkowników
  11. Generowanie statystyk

6. Analiza hierarchii funkcji projektowanej aplikacji

7. Budowa i analiza diagramu przepływu danych

8. Wybór encji (obiektów) i ich atrybutów

Object

  • objectID
  • login
  • title
  • author
  • year
  • describe
  • quality
  • kind
  • status
  • login_rezerwacji
  • picture
  • img_type

LogUser

  • login
  • password
  • name
  • surname
  • street
  • city
  • postalcode
  • house_nr
  • local_nr
  • province
  • email
  • premium
  • note
  • avatar
  • grupa
  • img_content_type
  • note_count

TransactionHistory

  • transactionID
  • objectID1
  • objectID2
  • date

Faq

  • faqID
  • question
  • answer
  • views

9. Projektowanie powiązań (relacji) pomiędzy encjami

10. Projekt diagramów STD (State Transition Diagram – diagramy przejść pomiędzy stanami).

Projekt logiczny

1. Projektowanie tabel, kluczy itp.

CREATE DATABASE Wymiennik;

CREATE TABLE LogUser (
	login nvarchar(50) PRIMARY KEY,
	password nvarchar(50) NOT NULL,
	name nvarchar(30) NOT NULL,
	surname nvarchar(50) NOT NULL,
	street nvarchar(50) NOT NULL,
	city nvarchar(50) NOT NULL,
	postalcode nchar(6) NOT NULL,
	house_nr nvarchar(50) NOT NULL,
	local_nr nvarchar(50),
province nvarchar(50) NOT NULL,
	email nvarchar(50) NOT NULL,
	premium nchar(1) default ‘N’,
	avatar image,
	grupa nvarchar(50) NOT  NULL,
	img_content_type nvarchar(50),
note int default 0,
	note_count int default 0,
 );

CREATE TABLE Object (
	objectID int IDENTITY(1,1) PRIMARY KEY,
	login nvarchar(50) NOT NULL references LogUser(login),
	title nvarchar(50) NOT NULL,
	author nvarchar(50) NOT NULL,
	year int NOT NULL,
	describe nvarchar(max) NULL,
	quality nvarchar(10) NULL,
	kind nvarchar(30) NOT NULL,
	status nvarchar(20) NOT NULL,
	picture image, 
	img_type nvarchar(50),
	login_rezerwacji nvarchar(50) NULL references LogUser(login)	
);

CREATE TABLE TransactionHistory (
	transactionID int IDENTITY(1,1) PRIMARY KEY,
	objectID1 int NOT NULL references Object(objectID),
	objectID2 int NOT NULL references Object(objectID),
	date datetime NOT NULL
 );

CREATE TABLE Faq(
	FaqID int IDENTITY(1,1) PRIMARY KEY,
	question nvarchar(max) NOT NULL,
	answer nvarchar(max) NOT NULL,
	views int NOT NULL default 0
);

ALTER TABLE TransactionHistory ADD  CONSTRAINT DF_Transaction_date  DEFAULT (getdate()) FOR date;
ALTER TABLE Object ADD  CONSTRAINT DF_Object_status DEFAULT ('Wolny') FOR status;
ALTER TABLE Object  WITH CHECK ADD  CONSTRAINT CK_Object_Kind CHECK((kind='Gra_komp' OR kind='Gra_plan' OR kind='Ksiazka' OR kind='Muzyka' OR kind='Film'));
ALTER TABLE Object CHECK CONSTRAINT CK_Object_Kind;
ALTER TABLE Object  WITH CHECK ADD CONSTRAINT CK_Object_Status CHECK(status='Wolny' OR status='Zarezerwowany' OR status='Wymieniony');
ALTER TABLE Object CHECK CONSTRAINT CK_Object_Status;

2. Słowniki danych

Object – tabela przechowująca dane o przedmiotach

  • objectID - klucz główny tabeli, serial NOT NULL,
  • login – nazwa użytkownika posiadającego przedmiot, klucz obcy do tabeli LogUser, nvarchar(50) NOT NULL
  • title – tytuł przedmiotu, nvarchar(50) NOT NULL,
  • author – autor przedmiotu, nvarchar(50) NOT NULL,
  • year – rok przedmiotu, int NOT NULL,
  • describe – opis przedmiotu, nvarchar(max) NULL,
  • quality – jakość przedmiotu, nchar(10) NULL,
  • kind – kategoria przedmiotu, nvarchar(30) NOT NULL,
  • status – status przedmiotu, nchar(20) NOT NULL,
  • login_rezerwacji – użytkownik, który zarezerwował dany przedmiot, klucz obcy do tabeli LogUser, nchar(50) NULL,
  • picture – obraz danego przedmiotu, image NULL.
  • img_type – typ obrazu, nvarchar(50) NULL,

LogUser – tabela przechowująca dane o użytkownikach

  • login – nazwa użytkownika, klucz główny tabeli, nvarchar(50) NOT NULL,
  • password - zhashowane hasło użytkownika, nvarchar(50) NOT NULL,
  • name – imię użytkownika, nvarchar(50) NOT NULL,
  • surname – nazwisko użytkownika, nvarchar(30) NULL,
  • street – ulica, nvarchar(50) NOT NULL,
  • city – miasto, nvarchar(50) NOT NULL,
  • postalcode – kod pocztowy, nchar(6) NOT NULL,
  • house_nr – numer domu, nvarchar(50) NOT NULL
  • local_nr – numer lokalu, nvarchar(50) NULL,
  • province – województwo vnvarchar(50) NOT NULL,
  • email – adres email, nvarchar(50) NOT NULL,
  • premium – rodzaj konta użytkownika, nchar(1) NOT NULL,
  • note – średnia ocena użytkownika, int NULL,
  • avatar – zdjęcie użytkownika, image NULL,
  • grupa – rola, jaką posiada dany użytkownik, nvarchar(50) NULL,
  • img_content_type – typ avataru użytkownika, nvarchar(50) NULL,
  • note_count – liczba ocen danego użytkownika, int NOT NULL,

TransactionHistory – tabela przechowująca dane o wykonanych transakcjach

  • transactionID - klucz główny tabeli, serial NOT NULL,
  • objectID1 – ID pierwszego obiektu w transakcji, klucz obcy do tabeli Object, int NOT NULL,
  • objectID2 – ID drugiego obiektu w transakcji, klucz obcy do tabeli Object, int NOT NULL,
  • date – data wykonania transakcji, datetime NOT NULL,

Faq

  • faqID - klucz główny tabeli, serial NOT NULL,
  • question – pytanie, nvarchar(max) NOT NULL,
  • answer – odpowiedź, nvarchar(max) NOT NULL,
  • views – liczba wyświetleń, int NOT NULL,

3. Analiza zależności funkcyjnych i normalizacja tabel

Pierwsza postać normalna – 1NF – spełniona, ponieważ:

  • wartości znajdujące się w krotkach są atomowe,
  • każda tabela posiada klucz główny,
  • każda krotka opisuje pojedynczy obiekt,
  • kolejność krotek jest dowolna.

Druga postać normalna – 2NF – spełniona, ponieważ:

  • spełniona 1NF,
  • każda kolumna zależy funkcyjnie od całego klucza głównego.

Trzecia postać normalna – 3NF – spełniona, ponieważ:

  • spełnione: 1NF i 2NF,
  • nie występują relacje przechodnie.

4. Projektowanie operacji na danych

  • rejestracja użytkownika
INSERT INTO LogUser(login, password, email, name, surname, street, city, province, postalcode, grupa, house_nr, local_nr, premium, awatar, img_content_type) VALUES ( 'Melodi', 'haslo' , 'melodi@onet.pl', 'Ewelina' , 'Grybowicz',  'Mazowiecka', 'Poznań', 'wielkopolskie', '52-242', 'LogUser', 12, 4 ,'N', <Binary data>, 'image/jpeg');
  • edycja danych użytkownika
UPDATE LogUser SET city='Białystok', street='Sienkiewicza', house_nr='3', local_nr='2', postalcode='15-800', avatar=@img_data, img_content_type=@img_type WHERE login='login1';
  • aktualizacja ceny użytkownika
UPDATE [LogUser] SET note=@usNote, note_count=@count WHERE (login='login1')";
  • wprowadzanie przedmiotu
INSERT INTO Object (login, title, author, year, describe, quality, kind, picture, img_type ) VALUES ('Melodi', 'Rok 1984','Orwell George',1949,'Losy Georga Orwella, angielskiego pisarza urodzonego w Indiach, były bardzo burzliwe. Z przekonania socjalista, wnikliwy obserwator świata, imał się różnych słabo płatnych zajęć, które jednak inspirowały go do pisania kolejnych dzieł. Znakomicie orientował się w sytuacji politycznej na arenie międzynarodowej i rozumiał niebezpieczeństwo związane z ustrojem komunistycznym. ','dobra','Ksiazka',  <Binary data>, 'image/jpeg');
  • edycja przedmiotu
UPDATE Object SET Title= @Title, Author= @Author, Year= @Year, Describe= @Describe, Quality= @Quality, status= @status WHERE (objectID = @objectID);
  • wyświetlanie przedmiotów według kategorii
SELECT * FROM Object WHERE (((status = @status) OR (status] = @status2) AND (kind = @kind));
  • wyszukiwanie przedmiotu - konto zwykłe
SELECT title, author, year, objectID FROM Object NATURAL JOIN LogUser WHERE (kind = 'Film' AND title like 'szukany' AND (status='Zarezerwowany' OR status='Wolny') AND province='małopolskie');
  • wyszukiwanie przedmiotu - konto Premium
SELECT title, author, year, objectID FROM Object WHERE (kind = 'Film' AND title like 'szukany' AND (status='Zarezerwowany' OR status='Wolny'));
  • wyświetlanie szczegółowych informacji o wybranym przedmiocie
SELECT * FROM Object WHERE (objectID = @objectID);
  • aktualizacja informacji o przedmiocie
UPDATE Object SET Title= @Title, Author= @Author, Year= @Year, Describe= @Describe, Quality= @Quality FROM Object WHERE (objectID = @objectID);
  • usuwanie przedmiotu
DELETE FROM Object WHERE (objectID=20);
  • rezerwacja przedmiotu
UPDATE Object SET status='Zarezerwowany', login_rezerwacji='login1' FROM Object WHERE (objectID=20);                 
  • anulowanie rezerwacji przedmiotu danego użytkownika
UPDATE Object SET status='Wolny', login_rezerwacji='' FROM Object WHERE (objectID=5);
  • wyświetlanie wystawianych przedmiotów przez konkretnego użytkownika
SELECT title, author, year, kind, objectID, status, login_rezerwacji FROM Object WHERE (login = 'login1') AND (status='Zarezerwowany' OR status='Wolny');
  • wyświetlanie listy rezerwacji przedmiotów danego użytkownika
SELECT title, login_rezerwacji, objectID FROM Object WHERE (login = 'login1' AND status='Zarezerwowany');
  • wyświetlanie historii transakcji danego użytkownika
SELECT OBJ1.title AS title, OBJ2.title AS title2, OBJ2.login_rezerwacji,T.date FROM Object OBJ1 JOIN TransactionHistory T ON T.objectID1=OBJ1.objectID JOIN Object OBJ2 ON T.objectID2=OBJ2.objectID WHERE (OBJ2.login='przykladowy') UNION SELECT OBJ1.title AS title, OBJ2.title AS title2, OBJ1.login_rezerwacji,T.date FROM Object OBJ1 JOIN TransactionHistory T ON T.objectID1=OBJ1.objectID JOIN Object OBJ2 ON T.objectID2=OBJ2.objectID WHERE (OBJ1.login='przykladowy');
  • wyświetlanie listy pytań z FAQ
SELECT * FROM Faq;
  • wyświetlanie wybranego pytania z FAQ wraz z odpowiedzią
SELECT * FROM Faq WHERE (ID = @ID);
  • statystyki – wyświetlanie liczby wszystkich użytkowników
SELECT count(*) FROM LogUser;
  • statystyki – wyświetlanie liczby wszystkich dokonanych wymian
SELECT count(*) FROM Transactions
  • statystyki – wyświetlanie liczby wszystkich wystawionych do wymiany przedmiotów
SELECT count(*) FROM Object
  • wprowadzanie nowej transakcji
INSERT INTO TransactionHistory (objectID1, objectID2, date) VALUES (@object1, @object2, @dat);
  • wymiana przedmiotu
UPDATE Object SET status='Wymieniony', login_rezerwacji=@ja WHERE objectID=@object1;
  • transakcja wymiany
String us = LogUser.Identity.Name;
        obj1 = Request.QueryString["objectID1"];
        obj2 = Request.QueryString["objectID2"];
 
        String connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = connectionString;
        conn.Open();
        trans = conn.BeginTransaction(System.Data.IsolationLevel.Serializable);
 
        try
        {
            using (SqlCommand command1 = new SqlCommand())
            {
                command1.Connection = conn;
                command1.Transaction = trans;
                command1.CommandType = CommandType.Text;
                command1.CommandText =
                string.Format("INSERT INTO TransactionHistory ([objectID1], [objectID2],[date]) VALUES (@object1, @object2, @dat)");
                command1.Parameters.Add("@object1", SqlDbType.Int).Value = obj1;
                command1.Parameters.Add("@object2", SqlDbType.Int).Value = obj2;
                command1.Parameters.Add("@dat", SqlDbType.DateTime).Value = DateTime.Now;
                success = (command1.ExecuteNonQuery() == 1);
            }
 
            using (SqlCommand command2 = new SqlCommand())
            {
                command2.Connection = conn;
                command2.Transaction = trans;
                command2.CommandType = CommandType.Text;
                command2.CommandText =
                string.Format("UPDATE Object SET status='Wymieniony', login_rezerwacji=@ja WHERE objectID=" + obj1);
                command2.Parameters.Add("@ja", SqlDbType.NVarChar).Value = us;
                success = (command2.ExecuteNonQuery() == 1);
            }
            using (SqlCommand command3 = new SqlCommand())
            {
                command3.Connection = conn;
                command3.Transaction = trans;
                command3.CommandType = CommandType.Text;
                command3.CommandText =
                string.Format("UPDATE Object SET status='Wymieniony' WHERE objectID=" + obj2);
                success = (command3.ExecuteNonQuery() == 1);
            }
 
        }
        catch (SqlException ex)
        {
            success = false;
        }
        catch (Exception ex)
        {
            success = false;
        }
        finally
        {
            if (success)
            {
                trans.Commit();
                wynikLabel.Text = "Wymiana została zatwierdzona!";
            }
            else
            {
                trans.Rollback();
                wynikLabel.Text = "Wymiana się nie powiodła!";
            }
            if (conn != null)
                conn.Close();
        }

Raport końcowy

1. Implementacja bazy danych

Implementacja bazy danych została wykonana zgodnie z diagramem erd_bazy.pdf przygotowanym w poprzednich częściach. Została wykonana kopia zapasowa bazy danych. Wykorzystano przy tym polecenie:

BACKUP DATABASE [Wymiennik.mdf] TO DISK='d:\Wymiennik.bak'

Baza została utworzona za pomocą systemu Microsoft SQL Server w oparciu o kod podany poniżej.

CREATE DATABASE Wymiennik;

CREATE TABLE LogUser (
	login nvarchar(50) PRIMARY KEY,
	password nvarchar(50) NOT NULL,
	name nvarchar(30) NOT NULL,
	surname nvarchar(50) NOT NULL,
	street nvarchar(50) NOT NULL,
	city nvarchar(50) NOT NULL,
	postalcode nchar(6) NOT NULL,
	house_nr nvarchar(50) NOT NULL,
	local_nr nvarchar(50),
province nvarchar(50) NOT NULL,
	email nvarchar(50) NOT NULL,
	premium nchar(1) default ‘N’,
	avatar image,
	grupa nvarchar(50) NOT  NULL,
	img_content_type nvarchar(50),
note int default 0,
	note_count int default 0,
 );

CREATE TABLE Object (
	objectID int IDENTITY(1,1) PRIMARY KEY,
	login nvarchar(50) NOT NULL references LogUser(login),
	title nvarchar(50) NOT NULL,
	author nvarchar(50) NOT NULL,
	year int NOT NULL,
	describe nvarchar(max) NULL,
	quality nvarchar(10) NULL,
	kind nvarchar(30) NOT NULL,
	status nvarchar(20) NOT NULL,
	picture image, 
	img_type nvarchar(50),
	login_rezerwacji nvarchar(50) NULL references LogUser(login)	
);

CREATE TABLE TransactionHistory (
	transactionID int IDENTITY(1,1) PRIMARY KEY,
	objectID1 int NOT NULL references Object(objectID),
	objectID2 int NOT NULL references Object(objectID),
	date datetime NOT NULL
 );

CREATE TABLE Faq(
	FaqID int IDENTITY(1,1) PRIMARY KEY,
	question nvarchar(max) NOT NULL,
	answer nvarchar(max) NOT NULL,
	views int NOT NULL default 0
);

ALTER TABLE TransactionHistory ADD  CONSTRAINT DF_Transaction_date  DEFAULT (getdate()) FOR date;
ALTER TABLE Object ADD  CONSTRAINT DF_Object_status DEFAULT ('Wolny') FOR status;
ALTER TABLE Object  WITH CHECK ADD  CONSTRAINT CK_Object_Kind CHECK  ((kind='Gra_komp' OR kind='Gra_plan' OR kind='Ksiazka' OR kind='Muzyka' OR kind='Film'));
ALTER TABLE Object CHECK CONSTRAINT CK_Object_Kind;
ALTER TABLE Object  WITH CHECK ADD CONSTRAINT CK_Object_Status CHECK  (status='Wolny' OR status='Zarezerwowany' OR status='Wymieniony');
ALTER TABLE Object CHECK CONSTRAINT CK_Object_Status;

2. Zdefiniowanie interfejsów do prezentacji, edycji i obsługi danych

  • Rejestracja użytkowników

  • Edycja danych użytkownika

  • Moje rezerwacja

  • Rezerwacje moich przedmiotów przez innych użytkowników

  • Moje przedmioty

  • Historia transakcji

3. Zdefiniowanie dokumentów do przetwarzania i prezentacji danych

  • Wyszukiwarka

  • Wyniki wyszukiwania

4. Zdefiniowanie panelu sterowania aplikacji

Panel administracyjny użytkownika pozwala na edycję danych użytkownika, dodawanie, usuwanie oraz edycję jego przedmiotów. Umożliwia również na zarządzanie rezerwacjami danego użytkownika, jak również rezerwacją jego przedmiotów.

5. Uruchamianie i testowanie aplikacji

Aplikacja była stworzona używając narzędzia Visual Web Developer 2010 Express oraz wykorzystaniu lokalnie zainstalowanego silnika baz danych SQL Server 2008. Podczas testowania była ona uruchamiana na lokalnym serwerze przy użyciu przeglądarek Google Chrome oraz Mozilla Firefox. Testowanie polegało na sprawdzaniu każdej funkcjonalności oddzielnie, a następnie w połączeniu z innymi modułami.

6. Wprowadzanie danych

W danej aplikacji nie ma potrzeby automatycznego wprowadzania danych lub importowania ich. Każdy użytkownik za pomocą narzędzi zdefiniowanych w aplikacji może w łatwy sposób ręcznie wprowadzić jego przedmioty.

7. Wdrażanie systemu do użytkowania

Wdrożenie systemu do użytkowania będzie polegało na właściwych skonfigurowaniu aplikacji oraz bazy danych na zdalnym serwerze.

8. Przeprowadzenie szkolenia użytkowników

Aplikacja nie jest skomplikowana, dlatego żadne szkolenia nie są wymagane. W razie jakichkolwiek niejasności można przeszukać Frequently Asked Questions w poszukiwaniu odpowiedzi na niejasne pytania lub skontaktować się z administratorem portalu.

9. Zapewnienie dokumentacji technicznej i użytkowej

Dokumentacja użytkowa nie jest wymagana, jako że aplikacja jest bardzo intuicyjna oraz prosta w obsłudze.

10. Zapewnienie obsługiwania systemu po wdrożeniu

Od strony technicznej serwisem będzie zarządzał administrator.

11. Rozwijanie i modyfikowanie aplikacji

Aplikacja została tak zaprojektowana, że jej rozwój jest w zasadzie nieograniczony. Kolejnym etapem byłoby zwiększenie ilości kategorii przedmiotów, jest to proste w zaimplementowaniu, a może wzbogacić serwis o wielu nowych użytkowników, jak również przedmiotów. Po pewnym czasie może zmienić się również skala wymiany przedmiotów, na przykład na inne kraje, co wiązałoby się z translacją serwisu na inne języki. Można również łatwo dodawać wiele nowych funkcjonalności takich jak wystawianie komentarzy innym użytkownikom, wysyłanie wiadomości pomiędzy użytkownikami, integracje z systemami płatności PayPal lub portalami społecznościowymi.

12. Opracowanie doświadczeń wynikających z realizacji projektu

W projekcie najwięcej problemów przysporzyło poznanie nowej technologii, w której żaden z członków zespołu wcześniej nie pracował. Jednak po pokonaniu początkowych trudności tworzenie projektu przebiegało pomyślnie a programowanie z wykorzystaniem platformy .NET okazało się dość intuicyjne. Zapewniona dobra obsługa bazy danych MS SQL Server sprawiła, że projekt powstawał w wyznaczonym czasie bez zastojów w projektowaniu.

13. Wykaz literatury, załączniki

  • „Technologie ASP.NET i ADO.NET w Visual Web Developer” J. Matulewski
  • „C# I ASP.NET” J.Mojica
2011/09/28 11:31
pl/dydaktyka/ztb/2011/projekty/wymiennik.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0