酒店市场学论文
时间:2016-03-14 22:15:18 来源:www.ukthesis.org 作者:英国论文网 点击:117次
学位论文 酒店市场情况如何?每年下降数家青年旅馆数量,露营,旅游,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的居住成本。
我的工作是设计一个应用目标管理的酒店或宾馆的接待区,以及在一个给定的酒店在线预订系统。
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?
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
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.
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
.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: 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
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#
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]
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
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
2.6.2 Bazy hierarchiczne Rysunek 2.5 Hierarchiczny model bazy danych
2.6.3 Bazy sieciowe Rysunek 2.6 Schemat sieciowego modelu baz danych
2.6.4 Bazy relacyjne 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 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 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
PostgreSQL
SQLite 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.1.1 Modu? recepcji 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
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.
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 * 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.1 Modu? Logowania 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 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 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 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, 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. 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 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 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
Przyk?ad 10. Implementacja statystyk okre?laj?cych ilo?? rezerwacji w czasie: { 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); }
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 <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 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 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 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.
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.
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.
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
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. (责任编辑:www.ukthesis.org) |