czwartek, 1 czerwca 2017

daj się poznać

Mój impuls do działania - Daj się poznać

Może nie udało mi się zrobić tak prostej rzeczy w tak długim czasie, ale udało mi się wygospodarować trochę czasu poza pracą i domem na zrobienie czegoś dla siebie. Dla mnie to sukces.

Wiem, że dokończę stronę, ponieważ będzie ona potrzebna. 
Będą tam prawdziwe dane Zakładu Kosmetycznego.
Wiem, że przerobię ją na php i wrzucę na serwer.

Wiem, że nauczyłam się paru nowych rzeczy i wiem jak wykorzystać je w praktyce.
Wiem, że mogę uwierzyć w siebie.

niedziela, 28 maja 2017

Tworzenie projektu

Jak często zdarza się Wam, że ktoś przychodzi i mówi:
"Chciałbym taką prostą aplikację, która będzie służyła do wprowadzenia paru prostych danych i wyświetlenia ich"

a za chwilę okazuje się, że oprócz wyświetlenia ma jeszcze wykonać parę "nieistotnych" obliczeń, raporty prezentować w zestawieniach rocznych, miesięcznych i dowolnych, dostęp do tego mogą mieć tylko nieliczne osoby, albo część powinna mieć dostęp do czegoś innego, a pozostali to jeszcze do czegoś innego, albo najlepiej jeszcze część danych powinno być automatycznie ściągane z jakiegoś innego programu ....

i tak mała aplikacja rozrasta się do wielkich rozmiarów.

Jak przystąpić do tworzenia projektu?
Ano tak, żeby poświęcić trochę czasu i spróbować przewidzieć, jak bardzo ta prosta aplikacja może się skomplikować.

Jak zaprojektować bazę danych, aby zmiana założeń nie wymuszała budowania projektu od początku?

Bardzo często zdarza się taka sytuacja i coraz bardziej jestem przekonana, że czas spędzony na projektowaniu i przemyśleniach nie jest czasem straconym. Dzięki temu rozbudowa aplikacji nie wymaga kompletnej zmiany i problemów z migracją danych.


sobota, 27 maja 2017

Razor

Razor to silnik renderujący, który znacząco upraszcza projektowanie widoków. Posiada on prostszą składnię, która wymaga po prostu mniejszej ilości kodu do uzyskania takich samych efektów co aspx. Ale trzeba się do niego przyzwyczaić.

Wykorzystanie go jest rzeczywiście proste, wystarczy pod wartość value podstawić nazwę odpowiedniej zmiennej wykorzystując:
<%=ViewBag.Name %>
lub po prostu
@ViewBag.Name
 
ja skorzystałam z @Model

<input class="span3" type="text" name="Imie" id="Imie" value=@Model.Imie onFocus="if 
(this.value == 'Imię') this.value = '';" onBlur="if (this.value == ''
 this.value = 'Imię';" />
<input class="span3" type="text" name="nazwisko" id="nazwisko" value=@Model.Nazwisko onFocus="if (this.value == 'Nazwisko') this.value = '';" onBlur="if (this.value == '') this.value = 'Nazwisko';" />
<input class="span3" type="text" name="telefon" id="telefon" value=@Model.Telefon onFocus="if (this.value == 'Telefon') this.value = '';" onBlur="if (this.value == '') this.value = 'Telefon';" />
<input class="span3" type="text" name="email" id="email" value=@Model.Email onFocus="if (this.value == 'Email') this.value = '';" onBlur="if (this.value == '') this.value = 'Email';" />
@Html.DropDownListFor(model => model.RodzajZabiegu, Model.Rodzaj_zabiegu(x => new SelectListItem { Text = x.Nazwa, Value = x.Id.ToString() }))
<div class="input-append date form_datetime">
      <input size="16" type="text" value=@Model.Data_od readonly>
      <span class="add-on"><i class="icon-th"></i></span>
</div>
 <script type="text/javascript">
     $(".form_datetime").datetimepicker({
             format: "dd MM yyyy - hh:ii"
     });
 </script>                     
<textarea name="message" id="message" class="span3" value=@Model.Inne_informacje onFocus="if (this.value == 'Dodatkowe informacje') this.value = '';" onBlur="if (this.value == '') this.value = 'Dodatkowe informacje';">Dodatkowe informacje</textarea>


Niestety utknęłam przy DropDownList. Mam wrażenie, że czegoś brakuje, ale... - sprawa do przegryzienia.

niedziela, 30 kwietnia 2017

wypełnienie treścią

Trochę mrówczej pracy.

Cennik i opisy gotowe


Następnym etapem będzie w końcu meritum - czyli rezerwacja wizyty :)

czwartek, 27 kwietnia 2017

telerik

Moja przygoda z .NET rozpoczęła się z WebForms i bardzo szybko zaczęłam korzystać z kontrolek Telerik. Mimo sporego kosztu zakupu kontrolki bardzo przydają się w codziennym programowaniu, szczególnie, gdy nie zwracamy bardzo dużej uwagi na sam wygląd, a najważniejszym punktem jest funkcjonalność. Dzięki temu można w dość krótkim czasie przygotować użytkowników potrzebne narzędzie do pracy.

Telerik ma sporą listę kontrolek. Najczęściej używane przeze mnie to RadGrid, RadComboBox, RadMenu, RadTexBox itp. Kontrolki te mają już z góry zdefiniowane metody i należy je tylko wykorzystać. Firma również oferuje bardzo pomocne dema pokazując możliwości kontrolek, a także w jaki sposób z nich korzystać i jakie trudności można napotkać.

niedziela, 23 kwietnia 2017

connectionstring


Connectionstring dostarcza informacji, które są potrzebne do komunikowania się z bazą danych. Za pomocą niego możemy określać parametry specyfikujące połączenie, takie jak:
  • Data Source – ten parametr określa nazwę instancji SQL Server’a
  • AttachDbFileName – parametr określający miejsce przechowywania pliku bazy danych oraz jego nazwę,
  • ID – login wykorzystywany do autoryzacji dostępu do SQL Server’a,
  • Initial Catalog – określa nazwę bazy danych,
  • Integrated Security – określa sposób logowania do instancji SQL Server:
    • True – logowanie tylko za pomocą Windows Integrated Security (systemu operacyjnego),
    • False – logowanie za pomocą IDhasła dostarczonego w connection string,
    • SSPI – ten parametr określa, że zastosujemy logowania za pomocą Windows Integrated Security, jeśli nie dostarczono ID i hasła w connection string,
  • MultipleActiveResultSets – umożliwia równoległą egzekucję zapytań do bazy danych,
  • Password – hasło wykorzystywane do autoryzacji dostępu do SQL Server’a,
  • User Instance – wykorzystywane tylko dla SQL Server Express, z parametrem True tworzy specjalną instancję SQL Server Express, w której zwykły użytkownik będzie miał prawa administratorskie.
Najlepszym rozwiązaniem jest umieszczenie connectionstring w pliku web.config. Dzięki temu, jeżeli zmienimy lokalizację bazy danych będzie można za pomocą jednego wpisu dokonać odpowiednich zmian bez kompilacji całego projektu.

W moim projekcie connectionstring w pliku web.config wygląda następująco:

piątek, 21 kwietnia 2017

strona mobilna

Zmagań z grafiką ciąg dalszy. Tym razem stronka została dostosowana do wersji mobilnych.


Powstała również grafika stronki do rezerwacji. Choć potrzebuje jeszcze kosmetycznej korekty.

sobota, 15 kwietnia 2017

autoryzacja i uwierzytelnienie w .net - podstawy

W dzisiejszych czasach bardzo istotne jest bezpieczeństwo w sieci. Nie tylko administratorzy systemu powinni o nie dbać, ale również programiści  powinni zwrócić szczególną uwagę na autoryzację użytkownika, kontrolę dostępu do określonych zasobów czy funkcji oprogramowania.

W .net mamy bezpieczeństwo oparte na rolach. Dzięki temu można sprawdzić tożsamość użytkownika i weryfikować jego prawa do zasobów. Można to zrobić na dwa sposoby:
  •  deklaratywny (declarative security), polegający na dodawaniu atrybutów do klas, metod, bloków kodu, które będą wchodzić w skład metadanych,
  •  programowy (imperative security), polegający na dynamicznym tworzeniu zestawu uprawnień, które są sprawdzane na etapie wykonywania kodu. (Źródło: dokumentacja Microsoft)

  • Dostęp do danych zalogowanego użytkownika w systemie można uzyskać poprzez wykorzystanie klasy WinsowsIdentity.
    WindowsIdentity current = WindowsIdentity.GetCurrent();
    Potrzebna jest tutaj przestrzeń nazw System.Security.Principal .

    piątek, 14 kwietnia 2017

    pierwsza strona

    W tym trudnym czasie przedświątecznym udało się wygospodarować chwilkę czasu na projekt :).

    Stworzyłam logo mojego gabinetu:


    Wstawiłam je również do projektu i dzięki temu mam gotową pierwszą stronę



    Życzę wszystkim Wesołych Świąt Wielkanocnych, dużo zdrówka, szczęścia i wytrwałości.

    niedziela, 9 kwietnia 2017

    MVC - cykl życia


    Źródło: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/lifecycle-of-an-aspnet-mvc-5-application

    1. Http Request
    Czyli żądanie z przeglądarki, w którym za pomocą adresu można przekazać, który widok interesuje odbiorcę, ewentualnie parametry

    2. Routing
    W pliku RouteConfig.cs przypisane są wzorce przebiegu trasy. Visual Studio sam zapisuje te wzorce na podstawie dodanych kontrolerów i widoków z nich wywoływanych
    Czyli jedną stronę możemy wywołać w różny sposób:
    http://mojastrona.pl
    http://mojastrona.pl/Home
    http://mojastrona.pl/Home/Index
    pod warunkiem, że dodano kontroler o nazwie HomeController oraz widok Index, a w kontrolerze zdefiniowano wywołanie widoku

    3. MvcHandler
    W tym miejscu jest wybierany odpowiedni kontroler na podstawie adresu w HTTP Request

    4. Authentication and Authorization - filtry sprawdzające czy użytkownik wysyłający żądanie przeszedł pozytywnie uwierzytelnienie (logowanie) i ma prawo do przeglądania treści tej strony

    5. Model binding
    Na podstawie adresu żądania rozwiązywane są parametry, np.
    http://mojastrona.pl/Home/edit/2
    W kontrolerze Home znajduje się metoda edit, która przyjmuje 1 parametr (np. typu int).

    6. Action Method Invocation
    MVC będzie próbować wykonać metodę z punktu powyżej za pomocą funkcji InvokeAction.

    7. Result Execution
    Na podstawie wyników poprzednich metod zwracany jest instancja klasy dziedziczącej po ActionResult. Może to być np: ViewResult, RedirectResult, ContentResult, JsonResult, JavaScriptResult, FileResult, EmptyResult

    8. Http Response
    Zwraca wyrenderowany widok, może to być np. Razor lub ASPX.




    piątek, 7 kwietnia 2017

    Baza danych - pierwsze procedury

    Odzwierciedleniem klas w aplikacji są tabele w bazie danych. No to do dzieła. Tworzymy tabele.

    Na razie jest to tabela Wizyta i tabela RodzajZabiegu. Tabele zawierają dokładnie takie same pola, jak klasa, żeby wszystko ładnie połączyło się w jedną spójną całość.

    Na początek dodałam też procedury dodawania wizyt.

    1. Pierwsza procedura rezerwuje termin. Zostanie wykonana po wprowadzeniu daty zaplanowanej przez użytkownika wizyty

    ALTER PROCEDURE [dbo].[WizytaInsert]
    (
    @Data_od datetime,
    @Data_do datetime
    )
    AS
    BEGIN
    declare
    @ile as int,
    @maxID as int
           select @ile=count(Id) from Wizyty where (Data_od between @Data_od and @Data_do)
                                                  or (Data_do between @Data_od and @Data_do)
           if (@ile>0)
           begin
                 insert into Wizyta(Data_od,Data_do)
                 values(@Data_od,@Data_do)
                 select @maxID=max(Id) from Wizyta
           end
           else
           select 0    
    END

    Jeżeli nikt jeszcze nie zarezerwował wizyty na ten czas, to wizyta zostanie zapisana, jeżeli już była wizyta, to zwraca błąd (czyli 0)

    2. Druga procedura to dokonanie formalności w zapisie pozostałych danych:

    create PROCEDURE [WizytaUpdate]
    (
    @Imie nvarchar(50),
    @Nazwisko nvarchar(50),
    @Telefon nvarchar(50),
    @Email nvarchar(50),
    @Data_od datetime,
    @Data_do datetime,
    @RodzajZabiegu int,
    @Id as int
    )     
    AS
    BEGIN
           update Wizyta set Imie=@Imie,Nazwisko=@Nazwisko,Telefon=@Telefon,Email=@Email,
           RodzajZabiegu=@RodzajZabiegu ,KodAutoryzacji=getdate()+rand(100)
           where Id=@Id
          select KodAutoryzacji from Wizyta where Id=@Id
    END
    GO

    Zwraca ona kod autoryzacji, który będzie wysłany na maila, w celu potwierdzenia wizyty.

    niedziela, 2 kwietnia 2017

    GitHub i nowa klasa

    Chciałabym napisać coś na temat GitHub a Visual Studio.
    Wszystko wydawałoby się trywialnie proste. Z nuget-a pobrać GitHub, instalacja, sklonowanie projektu do GitHub i gotowe.

    Mój problem zaczął się w momencie, gdy przeniosłam fizycznie projekt. Okazało się, że automatycznie projekt stracił połączenie z GitHub, mimo wskazania nowego lokalnego repozytorium.

    Okazało się, że w tej sytuacji należy ściągnąć repozytorium z GitHub do nowej lokalizacji i dopiero wtedy na tym projekcie pracować.

    Szczerze mówiąc myślałam, że narzędzie do kontroli wersji w postaci GitHub będzie przyjaźniejsze w obsłudze. Do tej pory wykorzystywałam go tylko w eclipse.

    Dodatkowo w projekcie dodałam jeszcze jedną klasę, ponieważ uznałam, że rodzaj zabiegu będzie zesłownikowany.

    public class RodzajZabietu
    {
    public int Id { get; set; }
    public string Nazwa { get; set; }
    }

    sobota, 1 kwietnia 2017

    Model w projekcie

    W katalogu Models utworzona został klasa wizyt w gabinecie kosmetycznym:
    public class Wizyta

    {
    public int Id { get; set; }
    public string Imie { get; set; }
    public string Nazwisko { get; set; }
    public string Telefon { get; set; }
    public string Email { get; set; }
    public DateTime Data_od { get; set; }
    public DateTime Data_do { get; set; }
    public string RodzajZabiegu { get; set; }
    public Boolean Potwierdzona { get; set; }
    }

    Pola zawierają wszystkie niezbędne elementy, które będą odzwierciedleniem bazy danych.
    Na adres e-mail będzie wysyłany link, z prośbą o potwierdzenie rezerwacji wizyty.

    Niezbędne jest dodanie drugiej klasy:
    public class WizytyDBCtxt : DbContext
    {
    public DbSet<Wizyta> Wizyty { get; set; }
    }
     
    Klasa ta będzie odpowiedzialna za obsługę (pobieranie, przechowywanie, dodawanie itd.) danych w tabeli 'Wizyta' w bazie danych. Dziedziczy po klasie DbContext z Entity Framework.