学位dissertation
Praca dyplomowa
酒店市场情况如何?每年下降数家青年旅馆数量,露营,旅游,wczasowych中心和其他设施。这一方面是由于日益激烈的市场竞争(包括酒店的竞争)。然而,另一方面,从预期的改变,是寻找合适的客户服务标准和休闲住宿的可能性,以及选择合适的价格在合适的标准。在2000年的所有住宿设施的酒店占11.8%(旅馆:在波兰式公寓:1.5 %,5 %),而分析图如图1.1中明显表示,在2007年的基础设施已经占20%以上的酒店(旅馆:在波兰noclegowej床:超过6 %,10 %)。在十二月中旬2008年在波兰的工作已近7 1,000。酒店在过去的一年半,有近180新设施。统计表明,每三天在波兰新开酒店。从上表可以清楚地推断酒店市场发展的新需求,当然有利于专用软件。
在当前的互联网服务中,为客户提供几乎所有的电子,但也预订酒店房间,酒店也不只是pensjonatów和第二家园。大多数应用程序使用昂贵的重大酒店的可能性,甚至经常不使用一半的小公寓或度假屋。然而,这样的软件的主要原因是缺乏财务方面的考虑。大四或五星级酒店都能从信息技术公司购买软件,但仍然是一个较小的市场吗?
为什么不创造一个小酒店的免费软件,pensjonatów wczasowych,房屋,posiada?oby不必要的复杂的会计系统,但它的基本元素:E -前台预订网络,通过互联网进行统计oblicza?o的居住成本。
我的工作是设计一个应用目标管理的酒店或宾馆的接待区,以及在一个给定的酒店在线预订系统。
1. Wstęp——简介
1.1. Wprowadzanie——介绍
Jak wygl?da sytuacja na rynku hotelarskim? Z roku na rok maleje liczba domów wycieczkowych, schronisk m?odzie?owych, kempingów, o?rodków wczasowych i innych obiektów. To z jednej strony skutek narastaj?cej konkurencji na rynku (w tym konkurencji ze strony hoteli). Patrz?c jednak z drugiej strony zmieniaj? si? oczekiwania klientów, którzy poszukuj? odpowiedniego standardu us?ug noclegowych jak i wypoczynkowych, a tak?e mo?liwo?ci doboru odpowiednich standardów w odpowiedniej cenie. W 2000 roku hotele stanowi?y 11,8% wszystkich obiektów noclegowych w Polsce (motele: 1,5%, pensjonaty: 5,2%), natomiast analizuj?c wykres zawarty na rysunku 1.1 wida?, i? w 2007 roku hotele stanowi?y ju? ponad 20% infrastruktury noclegowej w Polsce (motele: 1,6%, pensjonaty: ponad 10%). W po?owie grudnia 2008 roku w Polsce funkcjonowa?o ju? niemal 1, 7 tys. hoteli. W ci?gu pó?tora roku przyby?o niemal 180 nowych obiektów. Statystyka wskazuje, ?e co trzy dni otwiera si? w Polsce nowy hotel. Patrz?c na powy?sze zestawienie mo?emy jasno wywnioskowa?, i? rynek hotelarski rozwija si? pr??nie, co sprzyja oczywi?cie zapotrzebowaniu na dedykowane oprogramowanie.#
W dobie dzisiejszego Internetu prawie wszystkie us?ugi udost?pniane s? dla klienta drog? elektroniczn? równie? rezerwacje pokoi hotelowych, ale nie tylko hotelowych równie? pensjonatów i domów letniskowych. Wi?kszo?? du?ych hoteli u?ywa drogich rozbudowanych aplikacji, których mo?liwo?ci cz?sto nie wykorzystuje nawet w po?owie ma?y pensjonat czy te? dom letniskowy. Jednak g?ówn? przyczyn? braku takiego oprogramowania s? wzgl?dy finansowe. Du?e cztero lub pi?ciogwiazdkowe hotele s? wstanie zakupi? oprogramowanie od firm informatycznych, co jednak pozostaje nieco mniejszym na rynku?
Dlaczego wi?c nie stworzy? darmowego oprogramowania dla ma?ych hoteli, pensjonatów, domów wczasowych, które nie posiada?oby zb?dnych rozbudowanych systemów ksi?gowych, lecz spe?nia?o podstawowe elementy: e-recepcji, rezerwacji miejsc poprzez sie? Internet, prowadzi?o statystki, oblicza?o koszt pobytu?
1.2. Cel i zakres pracy——工作的目的和范围
Celem mojej pracy jest zaprojektowanie aplikacji pomocnej w zarz?dzaniu recepcj? hotelu lub pensjonatu, a tak?e internetowego systemu rezerwacji miejsc w danym hotelu. Aplikacje pomog? w doborze najlepszych pokoi dla klientów usprawni? dzia?anie hotelu, przyspiesz? rezerwacje oraz obs?ug? go?ci
1.3. Struktura pracy——工作结构
Struktura pracy jest nast?puj?ca. W rozdziale 1 przedstawiono cel i zakres programowy pracy podkre?laj?c zarazem istot? podj?tego tematu. Rozdzia? 2 obejmuje zagadnienia teoretyczne zwi?zane z tematem baz danych, obiektowych j?zyków programowania a tak?e ?rodowiska programistycznego Microsoft Visual Studio 2008. Rozdzia? 3 zawiera opis idei orz sposobu wykonania aplikacji desktopowej jak i internetowego systemu rezerwacji miejsc w danym hotelu. Sposób instalacji oraz podstawow? obs?ug? ca?ego systemu zaprezentowano w rozdziale 4. Ostatni rozdzia? pracy zawiera podsumowanie oraz wnioski nasuwaj?ce si? po zrealizowaniu podj?tego tematu.
2. Analiza zagadnienia——问题分析
Rozdzia? ten po?wi?cony jest opisowi technologii zastosowanej przy projektowaniu systemu dedykowanego dla ma?ego hotelu. Zawiera informacje dotycz?ce charakterystyki oraz podzia?u baz danych ze wzgl?du na typ i system zrz?dzania, przedstawia ?rodowisko programistyczne oraz j?zyk, w którym wykonana zosta?a aplikacja. W rozdziale tym przedstawiono równie? podstawowe wiadomo?ci o projektowaniu obiektowym oraz us?ugach internetowych.
2.1. ?rodowisko programistyczne——开发环境
Projekt systemu rezerwacji wykonano w ?rodowisku firmy Microsoft o nazwie Visual Studio 2008. Pozwala ono na tworzenie aplikacji metod? WYSIWG (ang. What You See Is What You Get), co znacznie przyspiesza prace programisty, który tworzy funkcje systemu wraz z jego interfejsem graficznym. Poni?ej scharakteryzowano ?rodowisko Visual Studio 2008 omawiaj?c jego g?ówne zalety.#p#分页标题#e#
Visual Studio 2008
Microsoft Visual Studio to zestaw narz?dzi programistycznych, w którego sk?ad wchodz?:
* Microsoft Visual C#;
* Microsoft Visual C++;
* Microsoft Visual Basic;
* Microsoft Visual J#;
* Microsoft Visual Web Developer (ASP.NET);
U?ywanie ?rodowiska Microsoft Visual Studio pozwala na tworzenie samodzielnych aplikacji, a tak?e aplikacji sieciowych, jak równie? serwisów internetowych (ASP.NET)
Visual Studio 2008 zawiera narz?dzia wykorzystywane do tworzenia aplikacji i ich debugowania, a tak?e kreatory graficzne umo?liwiaj?ce tworzenia aplikacji wykorzystuj?cych .NET Framework 3.5 (W najnowszej wersji). ?rodowisko to wyposa?one jest równie? w komponenty bazodanowe i innowacyjne funkcje pozwalaj?ce na szybkie tworzenie aplikacji dzia?aj?cych na wielu ró?nych platformach. Dzi?ki Visual Web Developer programista posiada wszelkie narz?dzia do tworzenia internetowych serwisów i aplikacji opartych na technologii ASP.NET wykorzystuj?cych system AJAX.
Do najwa?niejszych cech ?rodowiska nale??:
* Natychmiastowe opracowywanie aplikacji
* Efektywna praca grupowa
* Zastosowanie Microsoft.NET Framework 3.5
Rysunek 2.1 Okno ?rodowiska Visual Studio 2008
2.2. NET Framework——网框架
.NET Framework (.NET) - jest platform? programistyczn? obejmuj?ca ?rodowisko uruchomieniowe (Common Language Runtime - CLR) oraz biblioteki klas dla aplikacji. Technologia ta nie jest zwi?zana z ?adnym konkretnym j?zykiem programowania, a programy mog? by? pisane w jednym z wielu j?zyków: C++, C#, J#, Visual Basic .NET. Ten fakt daje olbrzymi? swobod? programi?cie, który mo?e wybra? dowolny z dost?pnych w ?rodowisku j?zyków a .NET Framework zapewni zarz?dzanie ró?nymi elementami systemu: kodem aplikacji, pami?ci? i zabezpieczeniami. W ?rodowisku tym mo?na tworzy? oprogramowanie dzia?aj?ce po stronie serwera oraz pracuj?ce na systemach, na które istnieje dzia?aj?ca implementacja tej platformy. Z racji jej pochodzenia najpe?niej obs?ugiwane s? systemy z rodziny Microsoft Windows, jednak powstaj? tak?e jego niezale?ne wdro?enia, np. Mono i dotGNU.
Bloki sk?adowe platformy.NET:
CLR (ang. Common Language Runtime) - jest to tak naprawd? maszyna wirtualna, która wykonuje kod wyra?ony w Common Intermediate Language. Do zadań CLR nale?y kompilacja i wykonanie kodu, który zapisany jest w j?zyku po?rednim CIL kod.
CTS (ang. Common Type System) jest to bazowy zbiór typów danych dla ka?dego j?zyka zgodnego ze specyfikacj? CLI. System CTS definiuje równie? zachowania typów gwarantuj?c pe?n? zgodno?? ze ?rodowiskiem CLR. CTS okre?la sposób deklarowania i tworzenia typów niestandardowych oraz mechanizm zarz?dzania cyklem ?ycia instancji tych typów.
CLS (ang. Common Language Specification) okre?la, który podzbiór CLR powinny obs?ugiwa? kompilatory, aby zapewni? kompatybilno?? z j?zykami.NET.#p#分页标题#e#
Na rysunku 2.2 zaprezentowano szerzej architektur? platformy .NET
Rysunek 2.2 Architektura platformy.NET
2.3. Programowanie obiektowe——obiektowe规划
Jeden z paradygmatów programowania, który mówi o definiowaniu programów za pomoc? obiektów. Obecnie jest to jedna z najpopularniejszych metod tworzenia oprogramowania sta?o si? tak dlatego, i? metoda ta jest bardzo zbli?ona do naszego sposobu postrzegania rzeczywisto?ci. Aplikacja napisana obiektowo jest tak naprawd? grup? obiektów posiadaj?cych swoje metody - funkcje. Dzia?anie programu oparte jest o wywo?ywanie poszczególnych metod z odpowiednich klas. Obiektowe podej?cie do tworzenia oprogramowania niesie ze sob? podstawowe za?o?enia do których zaliczy? nale?y: dziedziczenie, enkapsulacj?, polimorfizm oraz abstrakcj?.
* Dziedziczenie - jest to proces polegaj?cy na stworzeniu nowej klasy opartej na klasie ju? istniej?cej. Mówi?c o dziedziczeniu trzeba zaznaczy?, i? w programowaniu obiektowym wyst?puje równie? typ dziedziczenia, który wykorzystuje wi?cej ni? jedn? klas? istniej?c? do stworzenia nowej dziedziczenie takie nazywamy dziedziczeniem wielobazowym i stosuje si? je np. w j?zyku C++.
* Enkapsulacja - inaczej mówi?c hermetyzacja polega na ukrywaniu danych lub metod pewnych obiektów w ten sposób aby modyfikacji na tych danych mog?y dokonywa? tylko metody zaprzyja?nione. Hermetyzacja ma za zadanie ochron? tworzonego modelu od b??dów oraz podzielenia go na mniejsze elementy. Ochrona wykonywana jest poprze zastosowanie odpowiedniej sekcji zale?nej od tego co chcemy zabezpieczy?. Wyró?niamy trzy sekcje: prywatn?, publiczn? i chronion? ustanawiane przez ?private”, ?public”' i ?protected”.
* Polimorfizm - G?ównym za?o?eniem polimorfizmu jest mo?liwo?? przypisywania konkretnych obiektów klas pochodnych do wska?ników na klas? bazow?, nie w momencie kompilacji, lecz w trakcie dzia?ania programu.. Je?li przypisanie odbywa si? w czasie dzia?ania programu, to nazywa si? to pó?nym wi?zaniem lub wi?zaniem dynamicznym. W niektórych j?zykach programowania spotka? mo?emy bardziej statyczne rozwi?zania polimorfizmu np. szablony i przeci??anie operatorów w C++.[1]
* Abstrakcja - o spe?nieniu tego paradygmatu mówimy wtedy, kiedy napisana aplikacja posiada pewne klasy, które s? jedynie wzorem dla innych klas. Klasy takie nazywamy klasami abstrakcyjnymi. S? to klasy, które posiadaj? co najmniej jedn? metod? wirtualn? reprezentantów pod postaci? obiektów. S?u?y jedynie temu by dziedziczy? od niej pewien interfejs. Ka?da klasa dziedzicz?ca po klasie abstrakcyjnej, która sama nie chce sta? si? abstrakcyjn?, musi posiada? implementacj? ka?dej z odziedziczonych metod czysto wirtualnych. Je?eli nie posiada cho?by jednej implementacji metody czysto wirtualnej, klasa taka sama staje si? abstrakcyjn?. Klasa, której wszystkie metody s? czysto wirtualne nosi nazw? klasy czysto abstrakcyjnej.[2]#p#分页标题#e#
2.4. Język C#——C语言#
C# jest obiektowym j?zykiem programowania zaprojektowanym przez zespó? pod kierunkiem Andersa Hejlsberga. Jest jednym z podstawowych j?zyków wykorzystywanych przez platform? .NET
Do g?ównych cech j?zyka mo?emy zaliczy?:
* obiektowo?? - kod programu jest zbiorem klas a hierarchia ich dziedziczenia opiera si? na istnieniu jednej klasy nadrz?dnej object (System.Object).
* automatyczne zwalnianie nie wykorzystywanej pami?ci - j?zyk C# u?atwia zarz?dzanie pami?ci? aplikacji dzi?ki garbage collector. To on zajmuje si? oczyszczaniem pami?ci zwalniaj?c za tym programist? z konieczno?ci pisania odpowiednich destruktorów.
* typy ogólne - mechanizm zbli?ony swoj? ogólno?ci? do szablonów w C++, jednak tu typ ogólny jest przenoszony do modu?u binarnego i mo?liwy jest do wykorzystania bez konieczno?ci posiadania kodu ?ród?owego[3]
* ?dynamiczne tworzenie kodu - biblioteki .NET umo?liwiaj? dynamiczne tworzenie kodu w trakcie dzia?ania programu i w??czanie go do kodu aktualnie wykonywanego. [4]
* bogata biblioteka klas BCL - umo?liwiaj?ca rozwijanie aplikacji konsolowych, okienkowych, bazodanowych, sieciowych, w architekturze rozproszonej oraz dynamicznych aplikacji internetowych (ASP.NET)”[5]
2.5. ASP.NET
ASP.NET jest technologi? tworzenia dynamicznych stron internetowych, wykorzystuj?c? ?rodowisko uruchomieniowe CLR oraz platform? .NET Framework. Wywodzi si? z technologii ASP która nie wykorzystywa?a olbrzymiego potencja?u platformy .NET. Ró?nic? obu technologii zaprezentowano na rysunku 2.4.
ASP.NET pozwala na oddzielenie kodu aplikacji pisanego w oferowanych przez ?rodowisko Visual Studio 2008 j?zykach takich jak J#, C++ czy C#, od warstwy prezentacji, w której najcz??ciej wykorzystujemy j?zyk HTML, XHTML oraz kaskadowe arkusze stylów - CSS. Oddzielenie warstwy prezentacji od warstwy aplikacji zaprezentowano na rysunku 2.5. W najnowszej wersji oznaczonej numerem 2.0 twórcy wprowadzili wiele nowych elementów wspomagaj?cych tworzenie stron internetowych metod? WYSIWG. Technologia wyposa?ona jest w szereg gotowych obiektów z których najwa?niejsze to :
* Application - przechowuj?ca wszelkie informacje o stanie aplikacji.
* Sessions - przechowuje informacje dotycz?ce jednego u?ytkownika, dostarcza informacji na temat ka?dego u?ytkownika odwiedzaj?cego stron?. Poprzez jej wykorzystanie mo?emy stworzy? liczniki odwiedzin, aktualnie zalogowanych i niezalogowanych go?ciach oraz wiele, wiele innych przydatnych funkcji.
* Request - wykorzystywana do komunikacji przegl?darki z serwerem. Zawiera dane, które zosta?y wys?ane np. przy u?yciu formularza, pozwala na pobieranie danych z paska adresu metod? GET.
* Response - wysy?a informacje tj. cookies i nag?ówki, z powrotem do przegl?darkiPot?ga tworzenia stron internetowych z wykorzystaniem technologii ASP.NET opiera si? g?ównie na mnogo?ci gotowych kontrolek dostarczonych w postaci prostego kodu HTML do przegl?darki odwiedzaj?cego co nie wp?ywa na jej rodzaj. Podzieli? mo?na je na 4 g?ówne grupy:
* Intrinsic controls - kontrolki tworz? elementy HTML tj. bloki, tabele, nag?ówki czy paragrafy oferuj?c przy tym mo?liwo?? utrzymania stanu.
* List controls - udost?pniaj? mo?liwo?? tworzenia list. Przyk?adem mog? by? kontrolki DataList i DataGrid.
* Rich controls - s?u?? do tworzenia bardziej z?o?onych i rozbudowanych elementów HTML jak np. obiekt kalendarza.
* Validation controls - Niewidoczne kontrolki umo?liwiaj?ce poprawne funkcjonowanie strony po stronie klienckiej oraz serwera. Zapewniaj? poprawno?? wprowadzanych przez odwiedzaj?cego danych np. kontrolka RequiredFieldValidator która zabezpiecza aby pole nie pozosta?o puste.
Rysunek 2.3 Ró?nice mi?dzy technologi? ASP.NET i ASP.
Rysunek 2.4 Prezentacja oddzielenia warstwy prezentacji od warstwy aplikacji
?ród?o
2.6. Bazy danych——数据库
Baz? danych nazywamy zbiór danych zapisanych w okre?lony sposób w strukturach daj?cych si? ?atwo przeszukiwa?. Baza danych obejmuje zbiór informacji jak i komputerowy, który przeznaczony jest do gromadzenia i przetwarzania tych danych. Aplikacj? wspomagaj?c? baz? danych cz?sto nazywa si? Systemem Zarz?dzania Baz? Danych (ang. DataBase Management System, DBMS).
Obecnie bazy danych znajduj? swoje zastosowanie prawie w ka?dej dziedzinie ?ycia. Niemal?e wszystkie firmy i instytucje zobligowane s? gromadzi? informacje na temat przeprowadzanych transakcji, pracowników czy te? towaru. Wykorzystuj? do tego systemy bazodanowe tj. Oracle, MySQL, PostgreSQL, które w ?atwy sposób umo?liwiaj? sprawne i szybkie ich gromadzenie. Bazy danych znajduj? równie? zastosowanie przy tworzeniu stron internetowych, (np: do gromadzenia danych o u?ytkownikach takich jak imi?, nazwisko, email).
Bazy danych mo?na podzieli? wed?ug typu na:
1. Bazy proste:
* kartotekowe;
* hierarchiczne;
* sieciowe;
2. Bazy z?o?one:
* relacyjne;
* obiektowe;
* relacyjno-obiektowe;
* strumieniowe;
2.6.1 Bazy kartotekowe
Jest to najprostsza organizacja bazy danych z?o?ona z jednej lub kilku tablic zawieraj?cych rekordy. Rekordy te musz? posiada? jednak identyczn? struktur? pól. Bazy kartotekowe charakteryzuj? si? tym, i? ka?da tabela jest osobnym dokumentem niemog?cym wspó?pracowa? z innymi tablicami. Ten typ bazy danych nieekonomicznie jednak nadaj? si? do zarz?dzania zasobami ze wzgl?du na pó?niejsze próby reorganizacji. Przyk?adem takiej bazy mo?e by? np.: zwyk?y spis danych osobowych, ksi??ek lub p?yt.#p#分页标题#e#
2.6.2 Bazy hierarchiczne
Jest typem bazy danych, w której relacje mi?dzy rekordami maj? form? struktury drzewiastej. W modelu hierarchicznym wyró?nia si? tylko jeden typ rekordu, który nazywa si? rekordem g?ównym lub nadrz?dnym stanowi on tzw. korzeń drzewa. S?abym punktem tego typu bazy danych jest niestety brak bezpo?redniego dost?pu do wszystkich danych. Zapewniony jest on tylko do rekordów g?ównych, pozosta?e pola mo?emy przegl?da? wy??cznie poprzez podanie nazw wszystkich rekordów b?d?cych poprzednikami szukanego rekordu.
Rysunek 2.5 Hierarchiczny model bazy danych
2.6.3 Bazy sieciowe
Sieciowe bazy danych (ang Network Database) rozwijaj? za?o?enia modelu hierarchicznego pozwalaj?c na to, aby ka?dy rekord móg? posiada? wi?cej ni? jednego rodzica tworz?c w ten sposób struktur? uogólnionego wykresu. Rysunek 2.4 na którym zaprezentowano sieciowy model bazy danych wykorzystuje zarówno rekordy jak i zbiory, których za?o?eniem jest ?okre?lanie relacji jeden do wielu mi?dzy rekordami, gdzie jeden rekord jest ?w?a?cicielem” zbioru zawieraj?cego ?cz?onków” zbioru.”[6]. Wady modelu sieciowego przyczyni?y si? do rozwoju modelu relacyjnego jednak model ten uwa?any jest za jednego z przodków obiektowo?ci w dziedzinie baz danych.
Rysunek 2.6 Schemat sieciowego modelu baz danych
2.6.4 Bazy relacyjne
Relacyjna baza danych (RDBMS ang. Relational Database Management Systems) jest to baza danych z?o?ona z dwóch lub wi?cej tabel powi?zanych ze sob? za pomoc? relacji. Relacj? nazywamy powi?zania, mi?dzy tabelami bazy danych odzwierciedlaj?ce ró?ne zale?no?ci mi?dzy danymi. Model relacyjny wykorzystuje zazwyczaj j?zyk SQL do operowania na danych, zak?ada, i? wszystkie warto?ci danych powinny oparte by? na prostych typach danych przedstawionych w formie dwuwymiarowych tabel, z których ka?da zawiera? powinna zero lub wi?cej wierszy.
Relacyjny system bazodanowy pozwala na wyszukiwanie, wy?wietlanie, sortowanie i porównywanie warto?ci z ró?nych kolumn jak i z ró?nych tabel umo?liwiaj?c przez to wi?zanie danych i wykonywanie stosunkowo z?o?onych operacji opartych o algebr? relacji.
Rysunek 2.7 Relacyjny model bazy danych
Wyró?nia si? 3 podstawowe typy relacji: jeden do jednego, jeden do wielu oraz wiele do wielu.
* Relacja jeden do jednego przedstawiona na rysunku 2.5 zak?ada, ?e ka?dy rekord w tabeli A mo?e mie? tylko jeden dopasowany rekord z tabeli B, i tak samo ka?dy rekord w tabeli B mo?e mie? tylko jeden dopasowany rekord z tabeli A. Najcz??ciej stosowana jest ona do podzia?u tabeli z wieloma polami, oraz do przechowania informacji odnosz?cej si? tylko do podzbioru tabeli g?ównej.
Rysunek 2.8 Relacja jeden do jednego
* Relacja jeden do wielu jest najcz??ciej spotykanym typem relacji. Zak?ada, i? rekord w tabeli A mo?e mie? wiele dopasowanych do niego rekordów z tabeli B, ale rekord w tabeli B ma tylko jeden dopasowany rekord w tabeli A. Relacj? t? zaprezentowano na rysunku 2.8.#p#分页标题#e#
Rysunek 2.9 Relacja jeden do wielu
* Przedstawiona na rysunku 2.9 relacja wiele do wielu to relacja, w której rekord tabeli A mo?e mie? wiele dopasowanych do niego rekordów z tabeli B i tak samo rekord w tabeli B mo?e mie? wiele dopasowanych do niego rekordów z tabeli A. Realizuje si? to dzi?ki utworzeniu trzeciej tabeli, tzw. tabeli ??cza Relacja wiele do wielu jest definiowana, jako dwie relacje jeden do wielu z trzeci? tabel?.
Analizuj?c dog??bnie ten typ bazy danych mo?na wy?oni? problem braku identyfikacji wiersza poprzez jego pozycj?. Sprawia to, i? model relacyjny wymaga obecno?ci kolumny niepowtarzalnej w granicach ca?ej tabeli. Kolumn? t? okre?la si?, jako klucz podstawowy (ang. primary key).
Rysunek 2.10 Relacja wiele do wielu
2.6.5 Bazy obiektowe
W bazach obiektowych dane przechowywane s?, jako klasy, co pozwala programi?cie operowa? na jej obiektach tak jak na obiektach/zmiennych programu. Typ ten nie wymaga od niego znajomo?ci z zakresu j?zyka SQL oraz znajomo?ci w dziedzinie baz danych. Warto jednak zaznaczy?, i? nie istnieje ?adna ogólnie przyj?ta metoda projektowania baz obiektowych oraz nie ma te? jednolitej terminologii w tej dziedzinie.
Na rysunku 2.10 przedstawiono schemat dzia?ania obiektowych bazy danych. Zapewniaj? one programistom dziedziczenie zarówno strukturalne: potomek dziedziczy struktur? danych jak i behawioralne: potomek dziedziczy metody i operatory. Nie s? jednak pozbawione wad, z których najwa?niejsze to: powi?zanie z jednym j?zykiem programowania, s?aba obs?uga przeszukiwania danych, brak powszechnie zaakceptowanego j?zyka zapytań trudny dost?p do fizycznych danych oraz ma?e mo?liwo?ci optymalizacji pracy serwera.
Rysunek 2.11 Schemat dzia?ania obiektowego modelu bazy danych
?ród?o :
2.6.6 Bazy relacyjno-obiektowe
Bazy relacyjno-obiektowe (ang. Object-relational Database Management System ORDBMS) s? najnowszym osi?gni?ciem w rozwoju architektur baz danych. Systemy te ??cz? w sobie rozwi?zania sprawdzone z systemów relacyjnych (takie jak architektura klient/serwer, mechanizmy buforowania i indeksowania, przetwarzanie transakcji, czy optymalizacja zapytań) wraz z rozwi?zaniami najnowszymi zaczerpni?tymi z modelu obiektowego. Podobnie jak w bazach relacyjnych reprezentacja danych opiera si? o relacje zawiera jednak mo?liwo?? definiowania nowych typów, dziedziczenie typów, referencyjny typ danych, hierarchie zbiorów, sk?adowanie kodu procedur. Do najwa?niejszych rozwi?zań tego typu baz danych zaliczy? mo?na m.in. Oracle i DB2.
Wybór odpowiedniego modelu bzy danych jest jednym z pierwszych kroków projektowania aplikacji bazodanowej. Obecnie na rynku rozwijane s? g?ównie dwa modele: relacyjny i obiektowy. Do przedstawionej aplikacji zdecydowano si? zastosowa? relacyjny typ bazy danych przemawia, bowiem za nim: stabilna pozycja na rynku, optymalizacja zapytań, ?dojrza?o??” systemów realizuj?cych a tak?e wiedza o niedopracowaniu i niestabilno?ci standardów w zakresie modelu obiektowego,#p#分页标题#e#
G?ówne niekomercyjne systemy zarz?dzania relacyjnymi bazami danych:
* MySQL;
* PostgreSQL;
* SQLite
MySQL
System zarz?dzania relacyjnymi bazami danych, który na pocz?tku 2008 roku wykupiony zosta? przez Sun Microsystems. Cechuj? go wieloplatformowo?? oraz mnogo?? obs?ugiwanych mechanizmów bazodanowych w których znale?? mo?emy m.in.: MyISAM, MEMORY, InnoDB BerkeleyDB, MERGE, FEDERATED, CSV, ARCHIVE. Wa?n? zalet? tego systemu jest równie? licencja GPL, na której jest on udost?pniany, co pozwala nam na wykorzystanie bazy danych wsz?dzie poza celami komercyjnymi. DO zalet MySQL nale?y równie? do??czy? jego niezawodno?? bardzo du?? wydajno?? i szybko?? obs?ugi. W najnowszej wersji tego systemu zarz?dzania baz? danych wprowadzono m.in. W wersji 5 dodano m.in.: procedury sk?adowane, wyzwalacze, perspektywy, kursory, partycjonowanie tabel, harmonogram zadań.
PostgreSQL
Pocz?tek rozwijania tego systemu okre?lany jest na rok 1973. W roku tym na Uniwersytecie Kalifornijskim prace nad relacyjnymi bazami danych rozpocz?li dr Michael Stonebraker wraz z Eugene Wong. Pocz?tkowo nazywany by? jako Ingres aby po 12 latach ewoluowa? poprzez wyposa?enie w j?zyk zapytań POSTQUEL i zmieni? nazwe na Postgres. Po latach dodano do systemu interpreter j?zyka SQL i zmieniono jego nazw? na PostgreSQL. System ten oddaje u?ytkownikowi mo?liwo?ci pisania procedur sk?adniowych w j?zykach takich ja PL/pgSQL, obs?ug? indeksów, wyzwalaczy, transakcji - wykorzystuj?c mechanizm MVCC. Ponadto PostgreSQL pozwala tworzy? obiekty bazodanowe takie jak indeksy, operatory, agregaty, konwersje rzutowania. System bazodanowy wyposa?ono równie? w mechanizm pozwalaj?cy na definiowanie nowych typów danych.
SQLite
SQLite nale?y wraz z MySQL i PostgreSQL do grupy najlepszych wolno dost?pnych systemów zarz?dzania relacyjnymi bazami danych. Stworzony w roku 2000 przez Richarda Hippa zawiera w sobie system zarz?dzania relacyjnymi bazami danych jak i bibliotek? implementuj?c? wykonan? w j?zyku C. Takie rozwi?zanie implementacyjne oceniane jest za bardzo korzystne ze wzgl?du na brak konieczno?ci uruchamiania osobnego procesu RDBMS jak to jest np. w systemie MySQL. Do innowacji tego systemu nale?y przede wszystkim sposób przechowywania bazy danych. SQLite realizuje to za pomoc? B-drzew przechowywanych na dysku twardym w postaci jednego pliku, ale mo?liwe jest równie? ?przechowywanie baz danych w pami?ci RAM komputera, co znacznie przyspiesza dzia?anie.” [7] Do najwa?niejszych cech systemu nale?y obs?uga zapytań zagnie?d?one, widoków, kluczy obcych, transakcji wyzwalaczy (nie w pe?ni) oraz definiowanie w?asnych funkcji.
Do realizacji przedstawionego w pracy systemu zarz?dzania ma?y hotelem wykorzystano baz? danych MySQL ze wzgl?du na jej wysok? wydajno??, szybko?? niezawodno?? oraz zgodno?? ze standardem SQL2003.
3. Realizacja systemu rezerwacji hotelowej——酒店预订系统的实现#p#分页标题#e#
Rozdzia? ten po?wi?cony zosta? okre?leniu wymagań sprz?towych i systemowych oraz wyszczególnieniu za?o?eń projektowych dotycz?cych projektowanej aplikacji. Zawiera opis i struktur? wykorzystanej w niniejszym projekcie bazie danych jak równie? przebieg i sposób implementacji systemu. Ze wzgl?du na ró?nice w projektowaniu w rozdziale wyszczególniono etapy projektowania aplikacji dedykowanej dla recepcji jak równie? cz??? po?wi?con? modu?owi internetowemu.
3.1. Okre?lenie wymagań programowych i sprz?towych——硬件和软件需求的定义
3.1.1 Modu? recepcji
Wymagania systemowe dla aplikacji desktopowej to zainstalowana platforma Windows XP, Vista lub Windows 7 oraz dodatkowo biblioteka .NET Framework w wersji 3.5. Je?li aplikacja ma korzysta? z zewn?trznej bazy danych wymagane jest po??czenie z serwerem, na którym b?dzie si? ona znajdowa?, w przeciwnym razie niezb?dne jest zainstalowanie MySQL Server w wersji 5.0 lub wy?szej.
Wymagania sprz?towe to komputer klasy Pentium III lub wy?szej z procesorem 433MHz, 128 MB pami?ci operacyjnej RAM i przestrzeni dyskowej przestrzeni dyskowej 100MB.
3.1.1 Modu? internetowy
Wymagania stawiane stronie internetowej uwarunkowane s? równie? od sposobu udost?pniania jej klientowi. Je?li strona ma znajdowa? si? na lokalnym serwerze musi mie? on zainstalowane oprogramowanie IIS (ang. Internet Information Services). Innym sposobem publikacji strony jest wykupienie serwera u dowolnego us?ugodawcy, który oferuje hosting stron wykonanych w technologii ASP.NET 3.5. Aby przegl?da? zasoby zawarte w aplikacji internetowej wymagana jest przegl?darka internetowa oraz zainstalowany .NET Framework w wersji 3.5.
3.2. Za?o?enia projektowe——设计目标
Aplikacja powinna udost?pnia? ka?demu odbiorcy korzystaj?cemu z oprogramowania mo?liwo?? utworzenia odpowiedniej struktury bazy danych, która przechowywa? b?dzie informacj? o w?a?ciwo?ciach jego hotelu. System powinien by? intuicyjny jak równie? posiada? przejrzysty interfejs, w którym b?dzie mo?na odczyta? stan aktualnego zakwaterowania. Ponadto powinien umo?liwia? u?ytkownikom wgl?d w terminarz i histori? rezerwacji poszczególnych pokoi.
Kolejnym za?o?eniem systemu jest jego bezpieczeństwo i niezawodno??. Aplikacja musi posiada? modu? umo?liwiaj?cy wykonywanie, a tak?e przywracanie kopii zapasowych, poniewa? odbiorca takiego oprogramowania musi mie? pewno??, i? w razie niepo??danych awarii mo?e w ?atwy sposób przywróci? ostatni stan meldunków oraz wszelkie niezb?dne informacje dotycz?ce swojego hotelu. Pod poj?ciem bezpieczeństwa systemu rozumie si? równie? jego ochron? przed dost?pem osób niepo??danych, a tak?e bezpieczeństwo informacji przechowywanej w bazie danych, dlatego system powinien wykorzystywa? modu? bezpiecznego logowania z wykorzystaniem szyfrowania has?a. Ma to zapewni? zniwelowanie mo?liwo?ci podszywania si? pod innego recepcjonist?. Ponadto, system musi by? odporny na b??dy ludzkie, a ewentualne pomy?ki dokonane przez personel hotelu musz? by? mo?liwe do zlokalizowania i poprawy. Dlatego ka?de dzia?anie pracownika powinno by? monitorowane. Aplikacja musi posiada? system pozwalaj?cy na dokonywanie rezerwacji bezpo?rednio z witryny internetowej, a rezerwacje te s? automatycznie rejestrowane i widziane w aplikacji przeznaczonej dla recepcji hotelowej. Konieczne jest, aby system ten dzia?a? na ka?dej sprecyzowanej przez u?ytkownika rozdzielczo?ci oraz na ka?dej przegl?darce internetowej.#p#分页标题#e#
Kolejnym za?o?eniem projektowym jest udost?pnienie odpowiednich praw w systemie dla poszczególnych u?ytkowników. Chodzi o mo?liwo?? personalizowania praw dla osób mniej lub wi?cej do?wiadczonych w obs?udze. System musi posiada? równie? mo?liwo?? wyboru ?wiadczonych us?ug w zale?no?ci od potrzeb, jak równie? negocjacji cen, sezonowych obni?ek oraz pakietów rodzinnych. Klient w zale?no?ci od kondycji finansowej ma wtedy mo?liwo?? wyboru pokoju o okre?lonym standardzie spe?niaj?cym jednocze?nie jego oczekiwania. Wzbogacenie systemu o statystyki rezerwacji pokoi, z podzia?em na ich typ, staj? si? aspektem niezb?dnym, je?li aplikacja ma by? pomocna w zarz?dzaniu strategi? inwestycyjn? us?ug hotelowych nastawion? na rozwój w przysz?o?ci.
3.3. Schemat i opis struktury bazy danych——数据库的结构和原理的描述
Do projektu aplikacji u?yto jednej relacyjnej bazy danych MySQL, która zawiera 5 tabel. Po instalacji systemu przeznaczonego dla recepcji administrator zobligowany jest do stworzenia bazy danych. Umo?liwia to oprogramowanie MySQL Query Browser, w którym nale?y utworzy? now? baz? o nazwie testowa. Tabele u?yte w projekcie, które przedstawiono na rysunku 2.1 utworzone zosta?y automatycznie poprzez aplikacj? w module ?Stwórz Baz? Hotelu”. Po poprawnym wype?nieniu wszystkich wymaganych pól tworzone s? poszczególne tabele takie jak: Hotel, Kopia Zapasowa, Recepcjoni?ci, Pokoje, Rezerwacje.
Tabela Hotel zawiera nast?puj?ce rekordy:
Id, które jest kluczem g?ównym tabeli przechowuje dane typu int oraz posiada warto?? auto increment;
Nazwa_Hotelu pos?u?y mi?dzy innymi do informowania klienta, w którym hotelu próbuje zarezerwowa? pokój poprzez sie? Internet;
Tabela Backup powsta?a z my?l? o bezpieczeństwie systemu i wykonywaniu kopii zapasowych. Utworzono w niej nast?puj?ce pola:
Id_Backup, które jest kluczem g?ównym typu int;
Co_Ile - pole typu int przechowuj?ce liczb? dni, po których ma by? wykonywania kopia bezpieczeństwa;
Data_Ostatniej rekord typu varchar gdy? przechowuje tylko dane dotycz?ce daty w przeciwieństwie do typu datetime, który poszerza t? informacj? równie? o godzin?;
Godzina - pole typu varchar ograniczone do 5 znaków przystosowane do przechowywania warto?ci godziny, o której planowane jest wykonanie kopii zapasowej;
Sciezka - pole typu text utworzone do okre?lenia docelowej lokalizacji przechowywania wykonanej kopii bezpieczeństwa;
schemat bazy danych
Rysunek 3.1 Schemat struktury bazy danych
Tabela Pokoje pozwala na scharakteryzowanie standardów wyposa?enia pokoi oraz ich ilo?ci na przestrzeni ca?ego hotelu. U?ytkownik aplikacji mo?e samodzielnie okre?li? zasobno?? danego pokoju ( np. Internet, kablówka itp.).
* Id_Pokoju - pole typu int b?d?ce kluczem g?ównym tabeli Pokoje. Posiada w?a?ciwo?? auto increment, która zwi?ksza index zawsze, kiedy dodawany jest kolejny pokój;#p#分页标题#e#
* Numer_Pokoju - rekord przechowuj?cy numer danego pokoju w postaci zmiennej typu INT;
* Iluosobowy - pole okre?laj?ce czy pokój dedykowany jest dla jednej czy wi?kszej ilo?ci lokatorów.
* Cena - rekord typu double, powsta? w celu przechowywania ceny za pobyt go?cia liczonej na podstawie iloczynu ceny dobowej pokoju i liczby dni pobytu.
Pozosta?e pola w tabeli Pokoje s? polami typu boolean, który przyjmuje tylko dwie warto?ci prawda i fa?sz. Pola s?u?? do okre?lenia w?a?ciwo?ci wyposa?enia pokoju, czyli mi?dzy innymi czy pokój posiada ?azienk?, kablówk?, dost?p do sieci Internet itp.;
System zak?ada podzia? na u?ytkowników, którzy po zalogowaniu b?d? posiadali nadane przez administratora prawa do wykonywania okre?lonych dzia?ań. Aby zrealizowa? taki modu? wykorzystano kolejn? tabel? Recepcjoni?ci, która przechowuje nast?puj?ce pola:
* Id - pole b?d?ce kluczem g?ównym tabeli Recepcjoni?ci przechowuj?cym warto?ci typu int,
* Imie - przechowuje imi? recepcjonisty w postaci zmiennej typu varchar ograniczone do 45 znaków,
* Nazwisko - przechowuje nazwisko recepcjonisty w postaci zmiennej typu varchar ograniczone do 45 znaków,
* Login - przechowuje login recepcjonisty w postaci zmiennej typu varchar ograniczone do 45 znaków,
* Haslo - przechowuje has?o recepcjonisty w postaci zmiennej typu varchar ograniczone do 45 znaków,
* Pozosta?e pola utworzone w bazie danych s? typu boolean. Okre?laj? prawo lub odmow? na wykonywanie np. kopii bezpieczeństwa czy te? wgl?d w statystyki hotelu.
Najwa?niejsz? tabel? w bazie danych jest tabela Rezerwacje, której zadaniem jest przechowywanie informacji teleadresowych klienta a tak?e wszystkich pozosta?ych niezb?dnych do rezerwacji danych. Tabela przechowuje ni?ej wymienione pola:
* Id_Rezerwacji - Klucz g?ówny tabeli przechowuje dane typu, int posiada w?a?ciwo?? auto increment,
* Data_Rozpocz?cia - rekord typu datetime przechowuj?cy dat? zameldowania klienta,
* Data_Zakończenia - rekord typu datetime przechowuj?cy dat? wymeldowania klienta,
* Forma_P?atno?ci - pole typu varchar ograniczone do 45 znaków okre?laj?ce form? zap?aty za pokój, jak? wybra? klient,
* Koszt_Pobytu - rekord przechowuj?cy koszt ca?kowity pobytu go?cia wyra?ony za pomoc? zmiennej typu double,
* Id_Recepcjonisty - rekord typu int, który przechowuje okre?la, który recepcjonista przeprowadzi? proces rezerwacji pokoju. Rekord ten mo?e przyjmowa? warto?? null je?li rezerwacja zosta?a wykonana przez Internet;
* Id_Pokoju - pole typu int przechowuje numer porz?dkowy pokoju, który wybra? klient;
W bazie danych zdefiniowane zosta?y dwie relacje typu jeden do wielu. Relacje te maj? na celu okre?lenie sposobu poprawnego ??czenia powi?zanych danych w logiczn? ca?o??.
* Relacja okre?laj?ca Id_Recepcjonisty w tabeli Rezerwacje;#p#分页标题#e#
* Relacja okre?laj?ca Id_Pokoju w tabeli Rezerwacje;
3.4. Opis implementacji systemu przeznaczonego dla recepcji——用于接收系统的实现的描述
3.4.1 Modu? Logowania
Pierwszym etapem implementacji aplikacji by?o stworzenie modu?u logowania do systemu. Zosta?y one wdro?one przy pomocy komponentów Textbox i MaskedTextbox, w których u?ytkownik okre?la swój login i has?o. Po wci?ni?ciu przycisku zaloguj aplikacja szyfruje wprowadzone has?o i ??czy si? do bazy danych w celu porównania wprowadzonych informacji z tymi zapisanymi w bazie. ??czenie do bazy danych z aplikacji realizowane jest poprzez do??czon? do projektu bibliotek? MySQL Connector NET w wersji 6.1.2. Aby aplikacja mog?a nawi?zywa? po??czenia z baz? danych MySQL niezb?dne jest równie? dodanie referencji do projektu oraz dopisanie linijki using MySql.Data.MySqlClient w przestrzeni nazw w klasie po??czeniowej zaprezentowanej w przyk?adzie pierwszym.
Przyk?ad 1. Implementacja klasy wykonuj?cej po??czenie i operacje Query, NonQuery na bazie danych:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public class Operacja_na_Bazie
{
MySqlConnection polaczenie = new MySqlConnection("SERVER=localhost;" + "DATABASE=testowa;" + "UID=root;" + "PASSWORD=proba;");
public void Non_Query(string polecenie_bazy)
{
MySqlCommand command = new MySqlCommand(polecenie_bazy,polaczenie);
try
{
polaczenie.Open();
command.ExecuteNonQuery();
}
catch (MySqlException e)
{
MessageBox.Show(e.ToString());
}
finally
{
polaczenie.Close();
}
}
public ArrayList Query(string polecenie)
{
ArrayList wiersze = new ArrayList();
MySqlConnection connection = polaczenie;
MySqlCommand command = connection.CreateCommand();
MySqlDataReader Reader;
command.CommandText = polecenie;
connection.Open();
Reader = command.ExecuteReader();
int j = -1;
while (Reader.Read())
{
ArrayList pola = new ArrayList();
j++;
for (int i = 0; i < Reader.FieldCount; i++)
{
pola.Add(Reader.GetValue(i).ToString());
}
wiersze.Add(pola);
}
connection.Close();
return wiersze;
}
}
}
Po poprawnym po??czeniu do bazy aplikacja porównuje zaszyfrowane has?a, je?li s? identycznej postaci u?ytkownik zostaje zalogowany do systemu a informacje o jego prawach s? pobierane z bazy. Zmienne dotycz?ce praw u?ytkownika s?u?? do przyznawania i odbierania dost?pu do poszczególnych pozycji w komponencie MenuStrip. Komponent ten przetwarza wszystkie warto?ci zmiennych i blokuje dost?p do pozycji, których warto?? ustawiona jest na false#p#分页标题#e#
Pierwsze logowanie do systemu przeprowadzane jest jednak w inny sposób. Z za?o?eń wynika, i? u?ytkownik tworzy wszelkie tabele w bazie danych poprzez aplikacj?. Przy pierwszym uruchomieniu nie ma jeszcze stworzonych tabel, wi?c logowanie musi odbywa? si? za pomoc?, tzw. danych domy?lnych. W momencie uruchomienia aplikacji sprawdzane jest czy baza danych zawiera tabele Recepcjoni?ci poprzez zapytanie do bazy: ?show tables like, `Recepcjonisci`”, je?eli polecenie to nie zwróci ?adnych danych aplikacja wykonuje inny blok poleceń, w którym daje mo?liwo?? zalogowania si? do systemu dzi?ki u?yciu standardowego loginu: admin i has?a: 1234, a zaraz po zalogowaniu informuje u?ytkownika o potrzebie przeprowadzenia pierwszej konfiguracji.
3.4.2 Modu? tworz?cy model struktury hotelowej
Jednym z najwa?niejszych modu?ów systemu recepcji jest modu? tworz?cy tabele w bazie danych. Musi on by? intuicyjny i czytelny. Dlatego formularz oddaj?cy u?ytkownikowi te funkcje w pierwszym kroku zosta? ograniczony do podania tylko dwóch informacji. Pocz?tkowo zawiera on tylko trzy elementy s? nimi dwa pola zaimplementowane dzi?ki komponentom Textbox oraz jeden przycisk. Pola maj? za zadanie odczyt informacji o nazwie hotelu oraz liczbie pokoi. Wiedz?c, i? nazwa hotelu nie powinna zawiera? cyfr a liczba pokoi innych znaków poza cyframi postanowiono zabezpieczy? mo?liwo?? wprowadzania niepo??danych ci?gów. Zabezpieczenie te opiera si? na przypisaniu funkcji KeyPress dla okre?lonych pól Textbox. Przedstawiona funkcja zatrzymuje wprowadzanie znaku, po czym dokonuje sprawdzenia czy wpisany symbol nie jest liter? lub znakiem interpunkcyjnym. Je?li operacja iloczynu logicznego jest prawd? aplikacja odblokowuje mo?liwo?? wprowadzenia kolejnego znaku poprzez zmian? warto?ci Handled dla komponentu Textbox na false. W przeciwnym razie system pokazuje u?ytkownikowi komunikat informuj?cy go o b??dzie, jaki pope?ni?. Funkcja KeyPress wykonywana jest za ka?dym razem, kiedy u?ytkownik wprowadzi pojedynczy symbol w polu Textbox.
Przyk?ad 2. Implementacja funkcji KeyPress blokuj?cej litery i znaki interpunkcyjne:
private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
if ((!char.IsLetter(e.KeyChar)) && (!char.IsPunctuation(e.KeyChar)))
{
e.Handled = false;
}
else
{
MessageBox.Show("Mo?liwo?? wprowadzania tylko cyfr");
}
Po wprowadzeniu danych dotycz?cych hotelu aplikacja generuje pola, które grupowane s? w listy. Pola te daj? mo?liwo?? wprowadzenia u?ytkownikowi danych dotycz?cych cen oraz w?a?ciwo?ci pokojów. Po uzupe?nieniu wszystkich informacji system tworzy odpowiednie tabele w bazie i uzupe?nia dwie z nich: hotel i pokoje o dane wprowadzone przez u?ytkownika.
3.4.3 Modu? zrz?dzania recepcjonistami
Kolejnym etapem implementacji systemu by?o umo?liwienie dodawania, usuwania, modyfikacji jak i nadawania praw dla recepcjonistów. Tylko u?ytkownik maj?cy prawo dost?pu do tego modu?u mo?e zarz?dza? u?ytkownikami aplikacji. Oparto go na komponencie ListBox, który ma za zadanie wy?wietlanie wszelkich informacji na temat utworzonych ju? wcze?niej kont. Do okre?lenia danych u?ytkownika wykorzystano komponent Textbox, natomiast do przyznania praw recepcjoni?cie u?yto wbudowanego obiektu typu ComboBox. Pozwala on na proste zdefiniowanie uprawnień lub ich braku do korzystania z okre?lonych modu?ów. Po sprawdzeniu czy wszystkie pola tekstowe zosta?y uzupe?nione aplikacja szyfruje has?o i umieszcza dane w bazie.#p#分页标题#e#
Formularz umo?liwiaj?cy modyfikacj? recepcjonisty wymaga od u?ytkownika podania stosownego numeru identyfikacyjnego, które celowo uwidocznione jest w komponencie Listbox. Je?eli wprowadzony numer recepcjonisty znajduje si? w bazie system pobierze wszystkie informacje i umie?ci w odpowiednich polach tekstowych typu Textbox, dzi?ki czemu u?ytkownik mo?e bezzw?ocznie rozpocz?? edycj?. Po dokonaniu wszystkich przewidzianych zmian informacje modyfikowane s? w bazie poprzez instrukcje Update b?d?c? poleceniem j?zyka SQL. W przypadku kiedy podane id recepcjonisty jest b??dne aplikacja przy u?yciu metody MessageBox informuje u?ytkownika o b??dzie.
Funkcja usuwaj?ca recepcjonist? dzia?a w sposób analogiczny jedyn? ró?nic? jest zmiana wykorzystywanej instrukcji na delete from `recepcjoni?ci` where id =`zmienna`
3.4.4 Bezpieczeństwo systemu - metoda szyfruj?ca
Odpowiedzialna za szyfrowanie hase? jest metoda Rijndael zwana równie? metod? AES (ang. Advanced Encryption Standard). Do wykorzystania algorytmu potrzebne s? dwa 32 bitowe ci?gi znaków i cyfr oraz jeden 16 bitowy. Ponadto nale?y okre?li? algorytm haszuj?cy, iteracj?, po której has?o zostanie utworzone, oraz rozmiar klucza, który chcemy uzyska?.
Algorytm pobiera dwa 32 bitowe ci?gi znaków (w naszym przypadku mog? one zawiera? tylko znaki ASCII) i konwertuje je na tablice bajtów. W kolejnym kroku na tablic? bajtów zamieniany jest wprowadzony ci?g znaków oraz tworzone jest has?o, które pos?u?y do wyprowadzenia klucza. Has?o te generowane jest w dwóch iteracjach wykorzystuj?c dwa 32bitowe ci?gi i metod? haszuj?c? SHA-1. Po uzyskaniu klucza definiowany jest strumień pami?ci, która zostanie u?yta do przechowywania zaszyfrowanych danych. Po zakończeniu szyfrowania pami?? zostaje zwolniona, a zaszyfrowan? tablic? bajtów konwertuj? si? do postaci zmiennej string, zwracan? przez funkcj?.
Przyk?ad 3. Implementacja metody szyfruj?cej Rijndael wraz z przyk?adem wykorzystania
public static string EncryptText(
string plainText,string passPhrase,string saltValue,string hashAlgorithm,int passwordIterations,string initVector,int keySize)
{
//Tworzenie dwóch tablic bajtów z 32bitowych ci?gów cyfr i liter
byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
//Utworzenie tablicy bajtów z podanego ci?gu znaków.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
//Wygenerowanie has?a
PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase,saltValueBytes,hashAlgorithm,passwordIterations);
//U?ycie has?a do wygenerowania pseudolosowej tablicy bajtów
byte[] keyBytes = password.GetBytes(keySize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged(); symmetricKey.Mode = CipherMode.CBC;#p#分页标题#e#
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
keyBytes,initVectorBytes);
//Definicja strumienia pami?ci
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream,encryptor,CryptoStreamMode.Write);
// Start szyfrowania
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
// Zakończenie szyfrowania
cryptoStream.FlushFinalBlock();
//Konwersja strumienia pamieci na tablice bajtów
byte[] cipherTextBytes = memoryStream.ToArray();
// Zamkni?cie strumieni
memoryStream.Close();
cryptoStream.Close();
// Konwersja z tablicy bajtów na zmienna string
string cipherText = Convert.ToBase64String(cipherTextBytes); return cipherText;
}
Przyk?ad 4. U?ycie metody szyfruj?cej:
string haslo = EncryptText(textBox4.Text,
","SHA1",2,"poiuytrewqlkjhgf,256);
3.4.5 Modu? obs?ugi i zarz?dzania pokojami
Podstawowym elementem aplikacji jest modu? pokazuj?cy stan zameldowania ??cz?cy po?rednio modu? aplikacji desktopowej i internetowej. System po zalogowaniu u?ytkownika pobiera informacje o ilo?ci pokoi oraz ich numery z bazy danych a nast?pnie tworzy i umieszcza przyciski na komponencie Panel. Dbaj?c o czytelno?? aplikacji zdecydowano si? na kolorowanie odpowiednich stanów pokoi. Wykorzystuj?c podstawowy sk?adnik Visual Studio, jakim jest Timer aplikacja ??czy si? z baz? danych, co 1s dokonuj?c pobrania informacji dotycz?cych rezerwacji dla wszystkich pokoi. Je?eli u?ytkownik dokona? rezerwacji internetowej recepcjonista zostanie o tym poinformowany przez system poprzez zmian? koloru guzika odzwierciedlaj?cego numer wybranego pokoju.
Mo?liwo?ci dokonania, zmiany, usuni?cia i przegl?du rezerwacji dost?pne s? dla ka?dego recepcjonisty po klikni?ciu w przycisk odpowiadaj?cy okre?lonemu pokojowi. Wszystkie przyciski posiadaj? swoj? nazw? w postaci "Pokój" + numer oraz sparametryzowan? funkcj? maj?c? za zadanie wywo?anie nowego formularza. Parametrem metody jest zmienna okre?laj?ca numer pokoju, którego dane chcemy uzyska?. Przekazanie tej informacji do nowo otwartego okna aplikacji jest niezb?dne do pobrania wszelkich danych i wykonania dalszych instrukcji, gdy? nowy formularz dotyczy tylko operacji na wybranym pokoju. Po poprawnym przes?aniu zmiennej nowo otwarta klasa dodaje komponent TabControl z zak?adkami: ?Informacje o pokoju”, ?Zarezerwuj”, ”Modyfikuj Rezerwacje”, ?Usuń Rezerwacje”, ?Terminarz”. Kolejny krok aplikacji to wywo?anie metody, która pobiera z bazy danych wszystkie informacje na temat wybranego pokoju jak równie? dokonanych dla niego rezerwacji. Aby przyspieszy? dzia?anie systemu przewidziano sparametryzowanie generowania wyników dodawanych do komponentów ListView. Metoda ta zapewnia obs?ug? trzech zak?adek:#p#分页标题#e#
* Rezerwacje oraz Usuń Rezerwacje - gdzie pobierane s? wszystkie informacje na temat rezerwacji wykonanych dla tego pokoju.
* Modyfikuj Rezerwacje - gdzie pobierane s? tylko rezerwacje, które jeszcze trwaj?. Chodzi tutaj o mo?liwo?? ewentualnego skrócenia lub wyd?u?enia pobytu, je?li terminarz pokoju na to pozwala.
Parametrem funkcji jest komponent ListView, do którego pobierane s? po??dane informacje. Dzia?anie metody polega na wybraniu okre?lonego polecenia SQL zale?nie od parametru wej?ciowego funkcji.
Zak?adka Zarezerwuj oddaje recepcjoni?cie mo?liwo?? zameldowania potencjalnego klienta w wybranym przez niego pokoju. Formularz wykorzystuje komponenty TextBox, ComboBox, DateTimePicker oraz Label. Kontrolki Textbox wykorzystywane s? w celu podania danych teleadresowych klienta, a komponent ComboBox idealnie sprawdza si?, kiedy umo?liwiamy u?ytkownikowi wybór odpowiedzi spo?ród tych przewidzianych przez aplikacj?. Dlatego wykorzystano go do opisania kraju, z którego pochodzi klient oraz wybranej przez niego formy p?atno?ci. Dzi?ki w?a?ciwo?ciom ComboBox.AutoCompleteMode = SuggestAppend i ComboBox.AutoCompleteSource = ListItems aplikacja wprowadza propozycje końcowe państw znajduj?cych si? na li?cie ListItems. Mo?liwy jest jednocze?nie bezpo?redni wybór kraju z rozwijanej listy tego komponentu. Kontrolki DateTimePicker wprowadzono, aby daty wybrane przez klienta zapisywane by?y do bazy danych w odpowiednim formacie. Realizowane jest to poprzez ustawienie w?a?ciwo?ci data.CustomFormat = "yyyy-MM-dd 12:00:00”. DateTimePicker przyspiesza jednocze?nie wybór dat z rozwijanej tabeli bez konieczno?ci ich wpisywania. Modu? rezerwuj?cy przewiduje równie? szybk? metod? wyszukania klienta w archiwum i wstawienie jego danych do rezerwacji umo?liwiaj?c jednocze?nie ich ewentualn? edycj?. Metoda ta wykorzystuje funkcje IndexOf, dzi?ki której mo?liwe jest przeszukiwanie archiwum po wielu kryteriach zaprezentowano to w przyk?adzie nr 5.
Po uzupe?nieniu lub wstawieniu informacji z archiwum aplikacja sprawdza czy wszystkie pola zosta?y wype?nione i ??czy si? z baz? danych w celu sprawdzenia dost?pno?ci wybranego pokoju. Wykonywanie sprawdzenia realizowane jest poprzez odpowiednie zapytanie do bazy danych zaprezentowane w przyk?adzie 6.
Przyk?ad 5. Implementacja wyszukiwania klienta przy u?yciu metody IndexOf
private void filtruj_rezerwacje(object sender, System.EventArgs e)
{
ArrayList lista_wszystkich_zamowien = new ArrayList();
for (int i = 0; i < lista.Count; i++)
{
ArrayList wiersz = (ArrayList)lista[i];
ArrayList lista_zamowien = new ArrayList();
lista_zamowien.Add((string)wiersz[1]);
lista_zamowien.Add((string)wiersz[2]);
lista_zamowien.Add((string)wiersz[3]);
lista_zamowien.Add((string)wiersz[4]);
lista_wszystkich_zamowien.Add(lista_zamowien);
#p#分页标题#e#}
dataGridView1.Rows.Clear();
for (int i = 0; i < lista_wszystkich_zamowien.Count; i++)
{
ArrayList wiersz = (ArrayList)lista_wszystkich_zamowien[i];
bool prawidlowy = true;
for (int j = 0; j < wiersz.Count; j++)
{
string komorka = (string)wiersz[j];
TextBox pole = (TextBox)lista_pol[j];
if ((pole.Text != "" && komorka.IndexOf(pole.Text) != 0))
{
prawidlowy = false;
break;
}
}
if (prawidlowy == true)
{
ArrayList list = (ArrayList)lista[i];
dataGridView1.Rows.Add(list.ToArray());
}
}
}
Przyk?ad 6. Polecenie SQL wykonuj?ce sprawdzenie dost?pno?ci pokoju w wybranym terminie.
polecenie = "SELECT * FROM rezerwacje where (nr_pokoju='" + (numerpobierania) + "') and ((('"+ dateTimePicker1.Text.Trim() + "'>=data1) and ('" + dateTimePicker1.Text.Trim() + "'<data2)) or (('" + dateTimePicker2.Text.Trim() + "'>data1) and ('" + dateTimePicker2.Text.Trim() + "'<=data2)))";
Je?li zapytanie nie zwróci ?adnych danych, ?wiadczy to o mo?liwo?ci rezerwacji danego pokoju. W tym przypadku kolejnym krokiem jest obliczenie nale?no?ci za pobyt klienta. System pobiera z bazy danych cen? pokoju za dob?, oblicza czas pobytu na podstawie ró?nicy wybranych dat i mno?y je otrzymuj?c w ten sposób nale?no??. Ostatnim krokiem jest umieszczenie wszystkich danych w bazie za pomoc? instrukcji Insert.
Aby mo?liwe by?o zaplanowanie wizyty potencjalnego klienta oddano u?ytkownikowi równie? mo?liwo?? sprawdzenia przysz?ych jak i przesz?ych rezerwacji za pomoc? terminarza. Oparty zosta? on na dodatkowym komponencie MPK_Calendar ze wzgl?du na ubogo?? konfiguracji wbudowanego elementu, jakim jest MonthCalendar. Wykorzystanie kontrolki MPK_Calendar umo?liwi?o zaznaczanie kolorem czerwonym dat, w którym pokój jest lub by? zaj?ty, a kolorem zielonym okres, w który pokój pozostawa? wolny. Po wybraniu zak?adki terminarza system pobiera z bazy danych daty rozpocz?cia i zakończenia rezerwacji dla danego pokoju przekszta?ca je do odpowiedniego formatu grupuj?c w listy, które umieszcza w zbiorze BoldedDates.
Przyk?ad 7. Implementacja terminarza
ArrayList listadat;
Operacja_na_Bazie operacja = new Operacja_na_Bazie();
listadat = operacja.Query("Select data1,data2 from rezerwacje where nr_pokoju='" + numerpobierania + "'");
List<DateTime> listazawierajacadatetime = new List<DateTime>();
List<DateTime> listazawierajacawszystkiedatetime = new List<DateTime>();
for (int i = 0; i < listadat.Count; i++)
{
ArrayList wiersz_dat = (ArrayList)listadat[i];#p#分页标题#e#
for (int j = 0; j < wiersz_dat.Count; j++)
{
string datka = wiersz_dat[j].ToString();
string[] wytnij = datka.Split('-');
int rok, miesiac, dzien;
rok = Convert.ToInt32(wytnij[0]);
miesiac = Convert.ToInt32(wytnij[1]);
string[] wytnijdzien = wytnij[2].Split(' ');
dzien = Convert.ToInt32(wytnijdzien[0]);
DateTime dat = new System.DateTime(rok, miesiac, dzien, 0, 0, 0, 0);
listazawierajacadatetime.Add(dat);
listazawierajacawszystkiedatetime.Add(dat);
}
TimeSpan roznica = listazawierajacadatetime[1].Subtract(listazawierajacadatetime[0]);
double rozniczka = roznica.TotalDays;
int iledat = Convert.ToInt32(rozniczka);
for (int k = 1; k < iledat; k++)
{
DateTime data_pomiedzy = (listazawierajacadatetime[0].AddDays(k));
listazawierajacawszystkiedatetime.Add(data_pomiedzy);
}
listazawierajacadatetime.Clear();
}
mpK_Calendar1.BoldedDates = listazawierajacawszystkiedatetime.ToArray();
}
3.4.6 Modu? kopii bezpieczeństwa
System uwzgl?dnia mechanizmy wykonywania i przywracania kopii bezpieczeństwa. Funkcja wykonywania kopii mo?e zosta? zautomatyzowana poprzez opcj? Zaplanuj Kopi? Zapasow?. Formularz realizuj?cy t? metod? wymaga podania przez u?ytkownika podstawowych danych dotycz?cych: lokalizacji przechowywania kopii zapasowej, okresu realizacji jak i jej godziny. Wybór ?cie?ki systemowej zrealizowany zosta? dzi?ki kontrolce FolderBrowserDialog, która pozwala u?ytkownikowi na proste przegl?danie, wybieranie oraz tworzenie folderów. Po wybraniu lokalizacji przez u?ytkownika ?cie?ka kopiowana jest do komponentu TextBox, co pozwala na jej proste zredagowanie. Kontrolka ComboBox s?u?y do wyboru okresu czasu, po którym wykonywana b?dzie kopia. System przewiduje codzienn?, co tygodniow? oraz co miesi?czn? kopi? zapasow?. Po wprowadzeniu przez u?ytkownika godziny realizacji system umieszcza dane w bazie. Pobieraj?c, co sekund? stan zameldowania aplikacja sprawdza równie? czy umieszczony w bazie okres realizacji kopii nie jest zgodny z bie??c? dat?. Je?li porównanie to jest prawdziwe system wykonuje kopi? bezpieczeństwa poprzez zapytanie do bazy danych zwracaj?ce informacje, które zapisywane do plików tekstowych. Po zapisie plików system pobiera i umieszcza w bazie aktualn? dat?, co umo?liwia powtórne obliczenie terminu realizacji kopii bezpieczeństwa. Metod? zaprezentowano w przyk?adzie 8.
Odzyskanie zapisanej kopii bezpieczeństwa oparte o przyk?ad nr 9 wymaga wybrania przez u?ytkownika plików testowych z kopi? zapasow?. W ten sposób system przywraca tylko te dane, które zosta?y utracone nie zmieniaj?c przy tym informacji w pozosta?ych tabelach bazy. Do wyboru plików pos?u?ono si? komponentem OpenFileDialog, którego w?a?ciwo?? Filter zdefiniowano, jako ?Pliki tekstowe (*.txt)|*.txt|Wszytskie pliki (*.*)|*.*”. Wymusza to na kontrolce domy?lne pokazanie plików z rozszerzeniem *.txt. Po wyborze odpowiednich plików aplikacja sprawdza ich poprawno?? i przywraca wskazane tabele z kopii zapasowej poprzez polecenie SQL#p#分页标题#e#
Przyk?ad 8. Implementacja wykonania automatycznej kopii zapasowej
//Obliczanie czy pobrane daty si? zgadzaj?
DateTime data = new DateTime(Convert.ToInt16(rok), Convert.ToInt16(miesiac), Convert.ToInt16(dzien), 0, 0, 0);
data = data.AddHours(godziny);
data = data.AddMinutes(minuty);
data = data.AddDays(co_ile);
DateTime data2 = data;
data2 = data2.AddDays(-co_ile);
if ((DateTime.Now.ToString() == data.ToString()) || (DateTime.Now.ToString() == data2.ToString()))
{
string nowasciezka = sciezka.Replace("/", "\\\\");
DateTime datawykonania = data;
datawykonania = datawykonania.AddDays(-co_ile);
string poprzednia = datawykonania.ToString();
string[] odetnijgodzine = poprzednia.Split(' ');
DateTime nastepna = DateTime.Today;
//Przeprowadzenie backupu
Operacja_na_Bazie operacja = new Operacja_na_Bazie();
operacja.Non_Query("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "hotel" + odetnijgodzine[0] + ".txt" + "' FROM hotel");
operacja.Non_Query("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "backup" + odetnijgodzine[0] + ".txt" + "' FROM backup");
operacja.Non_Query ("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "recepcjonisci" + odetnijgodzine[0] + ".txt" + "' FROM recepcjonisci");
operacja.Non_Query ("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "rezerwacje" + odetnijgodzine[0] + ".txt" + "' FROM rezerwacje");
operacja.Non_Query ("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "pokoje" + odetnijgodzine[0] + ".txt" + "' FROM pokoje");
//Zapis nowej daty
operacja.Non_Query ("Update backup set data_ostatniej='" + nastepna.ToString() + "';");
MessageBox.Show("Wykonano zaplanowany backup bazy danych");
}
Przyk?ad 9. Implementacja przywracania kopii bezpieczeństwa
private void przywroc()
{
if ((textBox1.Text == "") && (textBox2.Text == "") && (textBox3.Text == "") && (textBox4.Text == "") && (textBox5.Text == ""))
{
MessageBox.Show("Prosz? wybra? chocia? jeden plik do przywrócenia");
}
else
{
if (textBox1.Text != "")
{
string sciezka = textBox1.Text.Replace("\\", "\\\\");
Operacja_na_Bazie operacja = new Operacja_na_Bazie();
operacja.Non_Query("delete from hotel");#p#分页标题#e#
operacja.Non_Query("LOAD DATA INFILE '" + sciezka + "' INTO TABLE hotel;");
MessageBox.Show("Przywrócono tabele hotel");
}
//Przywracanie kolejnych plików je?li zosta?y wybrane
}
3.4.7 Modu? generuj?cy statystyki
Organizowanie przez w?a?ciciela hotelu okresowych obni?ek cenowych oraz promocji wymaga analizy rezerwacji w okre?lonych terminach, jak równie? danych statystycznych dotycz?cych kosztów rezerwacyjnych, najch?tniej wybieranych form p?atno?ci czy te? typu najcz??ciej rezerwowanych pokoi. Do implementacji statystyk wykorzystano bibliotek? ZedGraph umo?liwiaj?c? generowanie s?upkowych, ko?owych oraz liniowych wykresów. Modu? opiera si? na dziedziczonym formularzu, który ujednolica oddany u?ytkownikowi interfejs, przyspieszaj?c jednocze?nie dzia?anie i tworzenie aplikacji. Formularz wykorzystuje dwa komponenty DateTimePicker przewidziane do ustalenia okresu, w którym znajduj? si? najpotrzebniejsze u?ytkownikowi informacje. Po wyborze dat aplikacja ??czy si? z baz? pobieraj?c dane zale?ne od typu generowanych statystyk dodaj?c je do list. Metoda generuj?ca wykres wymaga podania parametru. którym jest komponent ZedGraphControl. Kontrolka ta odpowiada za rozmiar i po?o?enie generowanego wykresu na formularzu. Kolejnym krokiem implementacji metody by?o stworzenie par punktów nanoszonych na wykres. W zaprezentowanej implementacji o? x reprezentuje daty rezerwacji a o? y ilo?? ich wyst?pień. Za?o?ono, i? najlepszym typem wykresu jest typ s?upkowy z dodatkowo naniesion? lini? trendu. Do stworzenia tego rodzaju wykresu pos?u?y?y obiekty BarItem oraz LineItem wraz ze sprecyzowanymi w?a?ciwo?ciami takimi jak kolor czy lista par punktów. Ostatnim krokiem implementacyjnym by?o stworzenie komponentu Label, którego zadaniem sta?o si? obliczenie ca?kowitej ilo?ci wyst?pień rezerwacji w wybranym przez u?ytkownika okresie.
Przyk?ad 10. Implementacja statystyk okre?laj?cych ilo?? rezerwacji w czasie:
protected virtual void CreateGraph1(ZedGraphControl zgc)
{
GraphPane myPane = zgc.GraphPane;
// Ustalenie tytu?ów
myPane.Title.Text = "Wykres ilo?ci rezerwacji w czasie";
myPane.XAxis.Title.Text = "Dni";
myPane.YAxis.Title.Text = "Ilo?? Rezerwacji";
double x,y;
PointPairList list1 = new PointPairList();
for (int i = 0; i <=liczba_dni ; i++)
{
//x to daty y to ilosc rezerwacji w danym terminie pobrany z
bazy danych
x = (double)new XDate(daty[i]);
y = pobrane_informacje[i];
list1.Add(x, y);
}
BarItem myBar = myPane.AddBar("Rezerwacje",list1, Color.Red);
myPane.YAxis.Scale.MinorStep = 1.0;
myPane.XAxis.Scale.MinorStep = 1.0;
myPane.XAxis.Type = AxisType.Date;
//Linia trendu kolor czerwony punkty jako gwiazdy#p#分页标题#e#
LineItem myCurve2 = myPane.AddCurve("",
list1, Color.Red, SymbolType.Star);
zgc.AxisChange();
calkowita = new System.Windows.Forms.Label();
calkowita.Size = new Size(ClientRectangle.Width + 200, ClientRectangle.Height + 20);
calkowita.Text = "Ca?kowita ilosc rezerwacji w wybranym czasie = " + calkowita_ilosc_rezerwacji.ToString();
calkowita.Location = new Point(ClientRectangle.Width - 515, ClientRectangle.Height - 40);
Font czcionka = new Font("Tahoma", 12);
calkowita.Font = czcionka;
this.Controls.Add(calkowita);
}
3.5. Opis implementacji aplikacji internetowej——Web应用的实现的描述
Aplikacj? internetow? zaimplementowano z my?l? o dokonywaniu rezerwacji hotelowej poprzez sie? Internet. Dzieli si? ona na 4 g?ówne modu?y, w których u?ytkownik okre?la dat?, wybiera pokój oraz uzupe?nia swoje dane teleadresowe. Aplikacja wykorzystuje kaskadowe arkusze stylów pozwalaj?ce na bardziej elastyczne zarz?dzanie wygl?dem strony internetowej, jak równie? komponenty oparte o technologi? Ajax.
3.5.1 Modu? informacyjny
G?ównym zadaniem modu?u jest przybli?enie sylwetki hotelu, w którym potencjalny klient dokonywa? b?dzie rezerwacji pokoju. Oparty zosta? on o formularz, na którym dodano bloki div zaczerpni?te z biblioteki Web.UI.HtmlControls.HtmlGenericControl. Wygl?d, rozmiar jak i formatowanie bloków div sprezyowane zosta?o w arkuszu stylów do??czonym do aplikacji poprzez polecenie:
<link href="StyleSheet1.css" rel="stylesheet" type="text/css"/>
Modu? ten wykorzystuje specjalnie zaimplementowan? klas? po??czeniow? do wymiany informacji z baz? danych zaprezentowan? w przyk?adzie 11. Do formularza do??czono metod? Page_Load, która po wczytaniu strony w przegl?darce wywo?uje po??czenie z baz? w celu pobrania informacji o nazwie hotelu. Pobrane informacje przekazywane s? do komponentu, Label który odpowiada za wy?wietlanie pobranych informacji na stronie internetowej.
Przyk?ad 11. Implementacja po??czenia z baz? danych w ASP.NET
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string thisrow = "";
Polacznie_z_Baza polacznie_z_baza = new Polacznie_z_Baza();
thisrow = polacznie_z_baza.Query("SELECT nazwa_hotelu FROM hotel where id_hotelu='1'");
Label1.Text ="Hotel " + thisrow;
}
}
3.5.2 Modu? wyboru daty
Zadaniem tego mudu?u jest udost?pnienie u?ytkownikowi jak naj?atwiejszej metody sprecyzowania czasu trwania pobytu w hotelu. Wykorzystuje on dodatkowe komponenty oparte o technologi? Ajax. Aby do??czone biblioteki wspierane by?y przez serwer IIS nieb?dne jest do?aczenie ich do projektu orz umiejscowienie w katalogu bin aplikacji. Wszystkie kontrolki oparte o technologi? Ajax wymagaj? umieszczenia na stronie internetowej komponentu, ScriptManager, którego zadaniem jest zarz?dzanie bibliotekami ASP.NET AJAX jak równie? cz??ciowe renderowanie stron. Do??czenie do modu?u kontrolki BasicDatePicker pozwala na szybkie oraz dok?adne sprecyzowanie daty przyjazdu i wyjazdu klienta dzi?ki wykorzystaniu rozwijanej tabeli zawieraj?cej kalendarz. Zabepiecznie maj?ce na celu wyeliminowanie b??du jakim jest podanie pó?niejszej daty przyjazdu ni? odjazdu, czy te? wybór tych samych dat zaimplementowane zosta?o dzi?ki ustawieniu dwóch komponentów DateRangeValidator i przypisaniu im w?a?ciwo?ci ControlToValidate na odpowiednie kontrolki BasicDatePicker. Dodatkowo okre?lono minimalne daty mo?liwe do wyboru#p#分页标题#e#
DateRangeValidator1.MinimumDate = DateTime.Now;
DateRangeValidator2.MinimumDat= BDPLite1.SelectedDate.AddDays(1);
Po zatwierdzeniu wybranych przez u?ytkownika dat aplikacja sprawdza ich poprawno??, przekszta?ca do odpowiedniego formatu i przekazuje do kolejnego modu?u poprzez metod? Page.Response.Redirect()
Implementacja modu?u wyboru daty:
protected void Page_Load(object sender, EventArgs e)
{
string thisrow = "";
Polacznie_z_Baza polacznie_z_baza1 = new Polacznie_z_Baza();
thisrow = polacznie_z_baza1.Query("SELECT nazwa_hotelu FROM hotel where id_hotelu='1'");
Label2.Text = "Rezerwacja - Hotel " + thisrow;
DateRangeValidator1.MinimumDate = DateTime.Now;
DateRangeValidator2.MinimumDate = BDPLite1.SelectedDate.AddDays(1);
}
protected void Button1_Click1(object sender, EventArgs e)
{
//Sprawdza czy daty nie s? puste
if (BDPLite1.IsNull || BDPLite2.IsNull)
{}
else
{
DateRangeValidator1.Validate();
DateRangeValidator2.Validate();
//JE?eli wybrane daty s? prawid?owe
if ((DateRangeValidator1.IsValid == true) && (DateRangeValidator2.IsValid == true))
{
string[] wytnij = BDPLite1.SelectedDate.ToString().Split(' ');
string[] wytnij1 = BDPLite2.SelectedDate.ToString().Split(' ');
Page.Response.Redirect("Pokoje.aspx?data1=" + wytnij[0] + "&data2=" + wytnij1[0]);
}
}
}
3.5.3 Modu? wyboru pokoju
Zadaniem strony Pokoje jest pobranie dat wybranych przez klienta w poprzednim module oraz umo?liwienie woboru wolnego pokoju. Realizowane jest to dzi?ki metodzie Request, która pobiera metod? POST warto?ci zmiennych data1 i data2. Kolejnym zadaniem aplikacji jest pobranie listy wolnych pokoi w obr?bie zdefiniowanych dat. Wykonywane jest to poprzez odpowiednie zapytanie do bazy danych: SELECT * FROM rezerwacje where (id_pokoju='"+i+"') and ((('" + data1a + "'>=data1) and ('" + data1a + "'<data2)) or (('" + data2a + "'>data1) and ('" + data2a + "'<=data2))) "
Je?li licznik pobranych rekordów równy jest 0 ozncza to ?e w hotelu nie ma wolnych pokoi w terminie okre?lonym przez klienta. W przeciwnym razie generowane s? guziki których ilo?c odpowiada warto?ci licznika. Implementacj? dodawania przycisków przeprowadzono dzi?ki metodzie Atributte.Add, która pozwala na dynamiczn? zmian? parametrów graficznych ustawionych w kaskadowym arkuszu stylów. Ka?dy z przycisków posiada metod? PostBackURL dzi?ki której przekierowuje u?ytkownika do nowego modu?u pobieraj?c informacje o wybranym pokoju w postaci jego ID.
Implementacja wyboru pokoju :#p#分页标题#e#
protected void Page_Load(object sender, EventArgs e)
{
string thisrow = "";
Polacznie_z_Baza polacznie_z_baza1 = new Polacznie_z_Baza();
thisrow = polacznie_z_baza1.Query("SELECT nazwa_hotelu FROM hotel where id_hotelu='1'");
Label2.Text = "Rezerwacja - Hotel " + thisrow;
string data1a = Request["data1"] +" 12:00:00";
string data2a = Request["data2"] +" 12:00:00";
System.Web.UI.HtmlControls.HtmlGenericControl content_kartka = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");
content_kartka.ID = "content_kartka2";
Panel1.Controls.Add(content_kartka);
string wynik;
Polacznie_z_Baza polaczenie = new Polacznie_z_Baza();
wynik = polaczenie.Query("Select ilosc_pokoi from hotel");
int ile_pokoi = Convert.ToInt32(wynik);
int licznik=0;
for (int i = 0; i < ile_pokoi; i++)
{
string wynik1="";;
Polacznie_z_Baza polaczenie1 = new Polacznie_z_Baza();
wynik1 = polaczenie1.Query("SELECT * FROM rezerwacje where (id_pokoju='"+i+"') and ((('" + data1a + "'>=data1) and ('" + data1a + "'<data2)) or (('" + data2a + "'>data1) and ('" + data2a + "'<=data2))) ");
if (wynik1 == "")
{
Button proba = new Button();
proba.Attributes.Add("style", "position:relative; top:40px; left:0px; width:40px; height:50px; background-image:url('room.png');background-repeat:no-repeat;");
proba.ID = "proba" + i.ToString();
proba.PostBackUrl = "Dane.aspx?id=" + i.ToString()+"&data1="+data1a+"&data2="+data2a;
content_kartka.Controls.Add(proba);
licznik++;
}
}
if (licznik == 0)
{
Label niema_wolnych = new Label();
niema_wolnych.Text = "Przepraszamy w wybranym terminie nie ma wolnych pokoi";
niema_wolnych.ID = "niemawolnych";
content_kartka.Controls.Add(niema_wolnych);
}
3.5.4 Modu? okre?laj?cy dane teleadresowe klienta
Modu? ten ma zadanie okre?lenie danych teleadresowych klienta, które po zweryfikowaniu zapisane zostan? do bazy wraz z parametrami rezerwacji okreslonymi podczas ca?ego procesu rezerwacji. Po odczytaniu warto?ci zmiennych poprzez metod? Request na formularz g?ówny dodane zostaj? dwa bloki div. W pierwszym bloku u?ytkownik mo?e zweryfikowa? wszystkie w?a?ciwo?ci pokoju który wybra? natomiast drugi blok s?u?y do wype?nienia danych klienta bez których rezerwacja by?aby niemo?liwa. Blok dostarczaj?cy wszelkich informcji o pokoju oparty zosta? o komponent Label, którego w?a?ciwo?? Text przyjmuje warto?? danych pobranych z bazy. Drugi blok zbudowany jest z komponentów Label i Textbox w które nale?y wpisa? swoje dane teleadresowe. Uzgl?dniono tutaj równie? zabezpieczenie przed wpisem b??dnych danych jak i pozostawienia którego? z pól niewype?nionego.#p#分页标题#e#
Aby zabezpieczy? pola Textbox przed wpisywaniem b?ednych danych pos?u?ono si? komponentem RegularExpressionValidator, którego zadaniem jest porównanie wprowadzonego tekstu z wyra?eniem regularnym ustawionym w w?a?ciwo?ci ValidationExpression kontrolki. Je?eli wiemy, ?e email rezerwuj?cego musi sk?ada? si? z nazwy u?ytkownika znaku @ i domeny, w której posiada on konto ustawiono odpowiednie wyra?enie regularne: ValidationExpression = ?\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+) *”, które powstrzyma aplikacj? przed zapisem b??dnych danych do bazy. Kontrola wype?nienia wszystkich pól zrealizowana zosta?a dzi?ki kontrolce, RequiredFieldValidator, który wy?wietli odpowiedni komunikat, je?li u?ytkownik pominie jedno z wymaganych pól. Po naci?ni?ciu przycisku aplikacja pobiera wszystkie informacje dotycz?ce rezerwacji i zapisuje je w odpowiednich rekordach baz danych informuj?c przy tym u?ytkownika o poprawnym procesie rezerwacji.
4. Aplikacja——应用
W rozdziale tym omówiono sposób pos?ugiwania si? systemem obs?ugi ma?ego hotelu. Opisano przewodnik po aplikacji przeznaczonej do recepcji jak równie? pokazano poprawny przebieg rezerwacji dokonywanej z sieci Internet. Rodzia? ten porusza równie? zagadnienia zwi?zane z dalsz? mo?liwo?ci? rozwoju aplikcaji, instalacji systemu oraz pierwszym jego uruchomieniem.
4.1. Instalacja oraz pierwsze uruchomienie aplikacji——第一个应用程序的安装和启动
Opis procesu instalcji dostosowany zosta? do systemu wykorzystuj?cego lokaln? baz? danych. Dlatego najpierw nale?y zainstalowa? Aplikacj? MySQL Server 5.0 i aplikacj? pomocn? w konfigurowaniu bazy danych MySQL Query Browser, któr? znajdziemy w pakiecie MySQL GUI Tools. Pola u?ytkownik i has?o powinny zosta? wype?nione jako ?root” i ?proba”. Kolejnym krokiem jest stworzenie bazy danych naszego hotelu. Dzi?ki MySQL Query Browser logujemy si? do MySQL Server i klikaj?c w prawe menu prawym przyciskiem myszki wybieramy opcj? ?Utwórz now? baz? danych”. W pole ?Nazwa Bazy” nale?y wpisa? ?testowa”. Nast?pnie nale?y uruchomi? instalator systemu zarz?dzania recepcj?, po pomy?lnie zakończonym procesie instalacji system jest gotowy do pracy.
Pierwsze uruchomienie wymaga od u?ytkownika znajomo?ci loginu: ?admin” i i has?a: ?1234”. Po zalogowaniu do systemu nale?y niezw?ocznie utworzy? konto recepcjonisty poprzez opcj? ?Zarz?dzanie => Recepcjoni?ci”, a nast?pnie utworzy? tabele w bazie danych poprzez opcj? ?Zarz?dzanie => Stwórz baz? hotelu”. Po wykonaniu tych czynno?ci wylogowa? tymczasowego u?ytkownika.
4.2. Przewodnik po aplikacji desktopowej——desktopowej应用指南
Na rysunku 4.1 przedstawiono pierwszy krok po instalacji systemu którym jest logowanie si? do aplikacji. Pierwsze logowanie odbywa si? poprzez tymczasowy login i haslo.#p#分页标题#e#
Login: admin Haslo: 1234.
Rysunek 4.1 Modu? odpowiedzialny za pierwsze logowanie do systemu
Rysunek 4.2 Modu? tworzenia modelu struktury hotelowej
Na rysunku 4.2 przedstawiono modu? odpowiedzialny za odwzorowanie struktury pokojów w hotelu i opis ich w?asno?ci. Po poprwnym uzupe?nieniu informacji aplikacja informuje u?ytkownika o stworzeniu w bazie danych wszystkich wymaganych tabel.
Rysunek 4.3 Modu? zarz?dzania recepcjonistami.
Rysunek 4.3 przedstawia proces dodawania recepcjonisty i nadawania mu praw dost?pu. Wymagane jest utworzenie chocia? jednego recepcjonisty który posiada? b?dzie wszytskie prawa.
Rysunek 4.4 Modu? zarz?dzania hotelem.
Na rysunku 4.4 zaprezentowano modu? pozwalaj?cy na wy?wietlenie wszystkich informacji o pokojach. Jego g?ównym zadaniem jest pokazywanie aktualnego stan zameldowania, dost?p do menu aplikacji jak równie? wgl?d w szczegó?y poszczególnych pokoi.
Rysunek 4.5 Modu? zarz?dzania hotelem - rezerwacja nowego klienta
Rysunek 4.5 pokazuje proces rezerwacji wybranego pokoju dla klienta, który nie korzysta? wcze?niej z us?ug hetelu.
Rysunek 4.6 Modu? zarz?dzania hotelem - terminarz pokoju
Rysunek 4.6 obrazuje wykorzystanie terminarza. Umo?liwia on wgl?d w przysz?e, aktualne i przesz?e obci??enie danego pokoju.
Na rysunku 4.7 przedstawiono wgl?d w archiwum jak i mo?liwo?? jego przeszukiwania ze wzgl?du na ró?ne kryteria.
Rysunek 4.7 Modu? przegl?du rezerwacji - Archiwum
Rysunek 4.8 Modu? planowania automatycznej kopii zapasowej.
Na rysunku 4.8 zaprezentowano klas? odpowiadaj?c? z planowanie wykonania automatycznej kopii zapasowej. Po uzupe?nieniu danych i zapisaniu ich do bazy system poszerza swoje dzia?anie o sprawdzanie daty w celu wykonania zaplanowej kopii.
Modu? zaprezenotwany na rysunku 4.9 obrazuje mo?liwo?? generowania przez system wykresów statystycznych dotycz?cych m.in. wybieranej formy p?atno?ci w czasie.
Rysunek 4.9 Modu? statystyki - wykres wybieranych form p?atno?ci.
4.3. Przewodnik po aplikacji webowej——webowej应用指南
Na rysunku 4.10 przedstawiono modu? informacyjny aplikacji webowej, który obrazuje sylwetk? hotelu oraz udost?pnia mo?liwo?? przekierowania do modu?u rezerwacji
Rysunek 4.10 Modu? informacyjny aplikacji webowej.
Rysunek 4.11 Modu? wyboru daty przyjazdu i wyjazdu go?cia.
Rysunek 4.11 przedstawia sposób reazlizaji wyboru okresu rezerwcji przez klienta. Po wprowadzeniu dat u?ytkownik przekierowywywny jest do modu?u wyboru dostepnych w hotelu pokoi który przedstwiono na rysnunku 4.12
Rysunek 4.12 Modu? wyboru pokoju.
Rysunek 4.13 ukazuje finalizacj? procesu rezerwcji w którym klient zobligowany jest do podania swoich danych teleadresowych. Po zaakceptowaniu wszystkich informacji system informuje rezerwuj?cego o pomy?lnym zakończeniu procesu lub wy?wietla stosowny komunikat o b??dzie rysunek 4.14#p#分页标题#e#
Rysunek 4.13 Modu? pobieraj?cy dane klienta
Rysunek 4.14 Modu? informuj?cy o pozytywnym lub negatywnym wyniku procesu rezerwacji
4.4. Mo?liwo?ci dalszego rozwoju aplikacji——进一步的应用开发
Przedstawiony powy?ej system zarz?dzania ma?ym hotelem nie jest oczywi?cie systemem zamkni?tym. Planowane jest jego wzbogacenie o modu?y:
* Wspó?pracy z drukarkami fiskalnymi co pozwoli?oby na komputeryzacj? obiektów hotelowych. Umo?liwi?oby to realizacj? wydruku paragonów fiskalnych, tworzenie raportów dobowych i okresowych.
* Wgl?du w obecno?? go?ci w pokojach, pozostawionych wiadomo?ci, konieczno?ci budzenia itp.
* Zawansowanej wyszukiwarki pokoi przeznaczonej dla aplikacji webowej, dzi?ki której klient b?dzie móg? sprezycowa? w?a?ciwo?ci pokoju który chce zarezerwowa?.
* Klasy parametryzuj?cej po??czenie do bazy dzi?ki której odbiorca systemu móg?by sam okre?li? czy baza ma by? przechowywana lokalnie czy na zewn?trznym serwerze.
相关文章
UKthesis provides an online writing service for all types of academic writing. Check out some of them and don't hesitate to place your order.