Trochę mrówczej pracy.
Cennik i opisy gotowe
Następnym etapem będzie w końcu meritum - czyli rezerwacja wizyty :)
niedziela, 30 kwietnia 2017
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ć.
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ą ID i hasł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.
W moim projekcie connectionstring w pliku web.config wygląda następująco:
piątek, 21 kwietnia 2017
strona mobilna
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 .
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:
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.
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
@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:
@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.
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; }
}
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.
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.
Subskrybuj:
Posty (Atom)