Projekt aplikacji SaaS
8 godz. 8 min · Next.js · Full-stack i Programowanie
Daniel NoworytaFull stack DeveloperNaucz się tworzyć bezpieczne systemy uwierzytelniania i autoryzacji, korzystając z Clerk. Pokażę Ci, jak to robić krok po kroku, aby Twoje aplikacje były bezpieczne i profesjonalne.
Zrozumiesz, jak skutecznie i bezboleśnie połączyć swoją aplikację Next.js z bazą danych PostgreSQL na DigitalOcean. Pokażę Ci, jak używać Prismy, aby ułatwić ten proces.
Dowiesz się, jak zarządzać routingiem i nawigacją w swojej aplikacji, aby użytkownicy mogli łatwo i intuicyjnie poruszać się po Twojej stronie.
Pokażę Ci, jak z łatwością wdrożyć swoją aplikację na Vercel, jednym z najpopularniejszych środowisk hostingowych dla aplikacji Next.js.
Nauczysz się zarządzać stanem aplikacji i jak wykorzystać server actions w praktyce, co pozwoli Ci na tworzenie bardziej zaawansowanych i dynamicznych funkcji.
Ten kurs jest dla osób, które już mają pewne doświadczenie z JavaScript i chcą zgłębić swoje zrozumienie Next.js. Zakładamy, że znasz podstawy TypeScript, TailwindCSS, ale nie potrzebujesz doświadczenia z Next.js - wszystko wyjaśnię Ci od podstaw!
Teraz, kiedy mamy już nasz komponent ze statystykami na stronie subskrypcji za
sobą możemy zająć się komponentem, który będzie wyświetlał nam nasze dane.
Przejdźmy teraz do firmy.
Sprawdźmy, czy mamy wszystkie informacje w naszej bazie danych, które potrzebujemy.
Mamy name to na pewno mamy kategorię mamy Billing period last payment.
Tutaj musimy sobie sprawdzić czy w naszym
skrypcie znajdującym mieliśmy coś takiego jak last payment.
Zobaczmy nasze dane.
Jeżeli chodzi o subskrypcje to każda
subskrypcja ma tak naprawdę 1 payment, czyli prawdopodobnie sobie tych danych nie
będziemy wyświetlać, bo nie mamy historii odpowiedniej do tego, żeby to wyświetlić.
Natomiast na pewno możemy sobie pokazać
next payment, bo to będzie payment, który jest aktualnie w naszej subskrypcji.
Status też sobie pokażemy.
Koszt i miejsce na guzik do edycji
subskrypcji też sobie jak najbardziej w chwili obecnej możemy zrobić.
Przejdźmy teraz do edytora kodu.
Miejsce, w którym będziemy budować naszą tabelkę oczywiście znajduje się tu.
Tutaj mamy nasze statystyki.
Myślę, że też dobrym pomysłem na Factory
tego byłoby wyciągnięcie tego komponentu ze statystykami do osobnego komponentu.
Natomiast zostawimy to sobie na chwilę obecną.
Zajmiemy się tutaj naszą tabelką.
Myślę, że później, jeżeli starczy nam
jeszcze czasu w tym kursie, to zajmiemy się refaktoryzacji tego kodu.
Albo na końcu w podsumowaniu po prostu dam Ci pewne wskazówki, które możesz
zastosować do tego, żeby robić ten projekt jeszcze lepiej, żeby móc
go pokazać, nazywać jako projekt do portfolio czy jako już tak naprawdę pomysł
na jakiś tam mały SaaS biznes, na którym kiedykolwiek może uda Ci się zarabiać?
Wróćmy teraz do implementacji naszej tabeli z danymi.
Oczywiście całą implementację zaczniemy
sobie standardowo, tak jak to zaczynaliśmy w naszym poprzednim komponencie.
Otóż potrzebujemy najpierw tak naprawdę
zbudować jakąś dwójkę, która będzie mówiła nam, że to są subskrypcje, czyli H2 i
jeżeli chodzi o styl to tutaj class name i potrzebujemy text lg i font semi bold.
Zapisujemy to sobie.
No już mamy tutaj napis Subskrypcja jest jak najbardziej w porządku.
Teraz kolejna rzecz, którą musimy się
zająć to na pewno div, który będzie position relative i jeżeli chodzi o margin
top zrobię sobie dwójkę i zapiszę sobie to będzie nasz.
Jeżeli to jest inspektor
to tak naprawdę to jest ten div, w którym będzie się mieściła nasza tabelka.
To jest relatywnie kolejna rzecz, która będzie już w tym wewnętrznym drzewie.
No to będzie wrapper na naszą tabelkę.
Tutaj musimy sobie zrobić też klasę i zaczynamy od pozycji Absolut.
Dodatkowo bottom zero left 0
right też 0 i top na 0 ustawiamy żeby rozszerzyć sobie nasz diff papierze.
Dodatkowo jeżeli chodzi o ten tutaj
wrapper to na pewno potrzebujemy tak naprawdę overflow
x auto i overflow Y na auto no i minus max ustawimy sobie na minus 6 z tego względu,
że chcemy tak naprawdę, żeby nasza tabela zajmowała całą powierzchnię.
Przejdźmy teraz do samej tabelki.
I tutaj mamy tabelę.
Jeżeli chodzi o klasę to
musimy wykorzystać menu full standardowe jak to mieliśmy poprzednio.
No i tutaj header
czyli head i pod spodem nasze kolumny czyli pierwsza kolumna mamy name.
Druga kolumna to mamy category
trzeciej kolumnie będziemy mieli billing period w naszej czwartej kolumnie.
W naszym przypadku będzie No eksperyment.
Piąta kolumna w naszych danych to jest payment status.
Kolejna kolumna naszych danych to będzie
koszt, no i ostatnia kolumna, którą będziemy potrzebowali.
No to kolumna ON z guzikiem EDIT.
Natomiast musimy sobie tutaj zaznaczyć i
ominiemy to sobie tutaj już span z tego względu, że ma to być niewidoczne.
Dlatego musimy tutaj sobie skorzystać z klasy window tej klasy.
Mianowicie z klasy, która się nazywa
either only, żebyśmy dostali też kolumnę, która będzie odpowiedzialna za ten guzik.
EDIT na końcu naszej tabelki.
Zapiszemy sobie to teraz, bo już mamy tutaj naszą kolumnę nasz header.
Możemy teraz się zająć stylem tego,
żebyśmy tak naprawdę już te style mieli za sobą.
Jeżeli chodzi o rzeczy związane z kodem.
Także przejdźmy do I klasy name i zaczniemy sobie od styki,
bo też chcemy upewnić się, że jeżeli będziemy mieć
więcej subskrypcji to wszystko zostanie w swoim miejscu.
Dodatkowo top na 0 ustawimy sobie
zet, na 10 border ustawimy sobie bottom border też kolor ustawimy na.
Niech to będzie 50 albo zróbmy sobie 300.
Jeżeli chodzi o nasz border zrobimy sobie nothing 50.
Jeżeli chodzi o biegi Opacity ustawimy to na 75, padding na Y ustawimy sobie na 2.
Padding po lewej stronie.
Przypominam, że jesteśmy odsunięci dokładnie o 6 24 pixele.
Dodatkowo tekst na lewą stronę, bo to jest ta pierwsza kolumna i tekst.
Sam ustawimy sobie jeszcze font normal jest ok.
Dodatkowo zróbmy sobie może ten font light.
Jeżeli chodzi o header będzie to chyba lepiej wyglądało Tekst z ING
500 i back drop blur ustawimy sobie i back drop filter.
Tak to drop zapiszemy.
Sprawdźmy jeszcze style.
No jest to jak najbardziej w porządku.
Myślę, że możemy sobie teraz tak naprawdę
ten class nam tutaj cały skopiować i zastosujemy to w kolejnych
kolumnach, czyli kategoriach możemy sobie wkleić.
Oczywiście tutaj PPM
wyrzucimy sobie z tego i zapiszemy dodatkowo to samo tak naprawdę możemy
sobie przekleić do kolejnych naszych kolumn.
Tu wklejamy klasyczny last name.
Oczywiście przez ty.
Widzisz, jeżeli nie wiem, nie korzystałeś nigdy.
Winda to bardzo dużo zdarza się tych powtórzeń.
Natomiast jeżeli chodzi o to na pewno kolejnymi krokami tutaj wartymi
podjęcia to byłoby refaktoryzacji tego kodu, tak żebyśmy jakby.
Żeby to wszystko nie powtarzać tego kodu
na tyle, to moglibyśmy sobie stworzyć po prostu komponent, który jest table.
Cały komponent tabelki mógłby być
komponentem osobnym i dodatkowo tutaj jako header jako Column header column head
moglibyśmy sobie stworzyć komponent, który miałby tę klasę już narzucony.
No i byśmy mogli sobie tutaj
tylko jako dynamiczna wartość po prostu przerzucać może padding left czy write
i czy klasę, którą możemy sobie też wrzucić z zewnątrz, bo tutaj mamy tak
naprawdę różnice, tylko mamy w tym i tutaj w ostatniej w ostatniej kolumnie
powinien być tekst stricte, bo to jest nasz kod i też PR o wartości 6.
Chcemy to odsunąć.
No i tak naprawdę to jest jedyna różnica, reszta się w ogóle nie różni.
Dlatego prawdopodobnie moglibyśmy sobie tutaj wyeksportować
dodatkowy komponent w postaci tabelki i to sobie jakoś z refaktoryzacji.
Na chwilę obecną staramy się to zrobić na
sztywno, żeby zobaczyć czy to jest Style się zgadzają.
Mamy nasz header, teraz zajmiemy się body.
No i tutaj analogicznie
mamy naszą datę sprawdzić czy mamy naszą datę w naszym komponencie.
Możemy. Mamy Get Data for Dashboard.
Możemy zmienić już tą nazwę subskrypcji.
W kolejnych krokach czujemy tę funkcję.
Ona wygląda
analogicznie do tego, co mieliśmy w naszym kodzie, dlatego prawdopodobnie wyciągniemy
to sobie i pokażę Ci w jaki sposób możesz sobie w ogóle używać Server Actions.
Teraz wróćmy do body
i smakujemy sobie naszą daną nasze dane map i tutaj subskrypcje.
No i pojedyncza subskrypcja.
Możemy sobie tutaj zrobić return i w naszym przypadku jeżeli chodzi o
return no to pewnie 4 ki w naszym przypadku to będzie subskrypcja.
I tutaj po wejściu do środka mamy, czyli.
No i musimy sprawdzić po kolei.
I tak pierwszy test to będzie tak naprawdę
jeżeli chodzi o nasz komponent, czyli nazwa naszej subskrypcji.
Weźmy sobie to tutaj.
Tak naprawdę będziemy potrzebować jakiegoś
rapera, bo tak naprawdę na nazwę składa się awatar i nazwa.
Czyli tutaj znowu analogicznie do tego co mieliśmy w
poprzednim komponencie możemy sobie użyć komponentu Image Next.
Czy jest i tutaj jeżeli chodzi o wartości tego komponentu Image?
Myślę, że możemy tutaj się cofnąć do naszego komponentu Dashboard i
spokojnie możemy sobie skopiować dokładnie to co mamy w środku.
Zapiszemy to sobie już powinno się podawać jakieś wartości.
Tak?
Jeżeli chodzi o style tego elementu to też class name.
I tutaj mamy flex.
Items Center dodatkowy pojazd HiFi na start i lub na dwójka.
Sprawdźmy, czy są dokładnie te same style co w pierwszej tabelce.
Z tego co wygląda to jest dokładnie to samo, czyli prawdopodobnie pomyślimy o
jakiejś refaktoryzacji później i wyciągnięciu tej tabelki do osobnego
komponentu, który będziemy mogli sobie używać w naszej naszej aplikacji.
Zapiszemy to sobie i już to wygląda dużo lepiej.
Jeżeli chodzi o style na tutaj na TD to
musimy zająć się tym, żeby to odpowiednio odsunąć, czyli void space
lub po prostu ustawiamy łapkę znaną w tym przypadku padding na y ustawimy na 4
padnij na lewo, oczywiście na 6 musimy to sobie odsunąć od krawędzi.
Tekst na s, m i myślę, że to wszystko mamy tutaj już podsuwane to wartości.
Zobacz, że już mamy też scroll też działa tak jak powinien działać.
Tak, jeśli mamy za mało miejsca to jesteśmy w stanie skalować sobie po naszej
subskrypcje na header zostaje nam tutaj u góry.
Co jest tak naprawdę to tym rozwiązaniem, którego potrzebujemy?
Dobrze, przejdźmy do kolejnej.
Do kolejnego, kolejnego elementu, czyli naszej kategorii, czyli kiedy?
I tutaj będzie subskrypcja kategorii.
Kolejnym elementem w tabelce będzie
Billing period i subskrypcję Billing Period.
Tutaj jak widzisz powtarza się z tego co
mieliśmy w Burdzie, także możemy to sobie tutaj użyć jako ćwiczenie.
Jeżeli chodzi o następną rzeczą to mamy next payment.
Zerkniemy jak tutaj formatować ten
eksperyment w taki sposób, w podobny sposób.
Myślę, że możemy to tutaj sformatować też także format next payment date.
Mamy już kolejne, dane się nam pojawiają.
Kolejna rzecz to jest payment status.
Tutaj jest coś nowego, czego nie mieliśmy wcześniej.
Dlatego musimy się zastanowić, w jaki sposób będziemy sobie to teraz wyświetlać
tutaj i zastanówmy się, w jaki sposób to sobie wyświetlać.
Możemy sobie tutaj zrobić instrukcję warunkową.
Tak naprawdę mamy subskrypcję, mamy
subskrypcję Payments i my sobie bierzemy pierwszą.
Tak naprawdę ona ma status.
Jeżeli ten status jest równy payment status niech będzie na pat.
No to otwieramy nawias i będziemy mieli dwie sytuacje.
Musimy zwrócić dwa komponenty.
W pierwszym przypadku niech to będzie div.
I tutaj wykorzystamy remiks Icons. Potrzebujemy ikonek.
Jeżeli zobaczymy na nasz design firmę
to zauważ, że mamy tutaj ikonki, jakiś taki checkbox i coś z krzyżykiem.
Także będziemy mogli sobie wykorzystać
ikonki z Remix Icons, które już wcześniej sobie korzystaliśmy.
Remiks ikon i tutaj jest.
Sprawdźcie czy jest ikonka checkbox.
Sprawdźmy jakie to ikonki okrągłe, Czy mamy ten znaczek?
Tak myślę, że jest tutaj mamy checkbox i
cel, czyli możemy sobie jak najbardziej użyć tych dwóch ikonek.
Nadamy im odpowiedni kolor.
Czyli przejdźmy teraz do naszej implementacji tutaj i jako pierwsze.
W przypadku kiedy subskrypcja jest
opłacona potrzebujemy naszej i tutaj class name.
I w tym momencie musimy użyć R i checkbox Niech będzie Fill.
I text green ustawimy na 600.
Kolejnym elementem, który będzie tutaj
niech będzie napis po prostu pad, czyli Pi.
Musimy stylowo wystylizować klasę name
i tutaj będziemy Flex Items Center i Cap ustawimy na dwójkę.
Czyli pierwszy przypadek.
Kolejny przypadek, który potrzebujemy, bo tutaj będziemy mieli błąd.
To tutaj musimy wykorzystać inną ikonkę i to będzie inne determinanty.
I oczywiście tekst red.
Niech będzie to jest 600 i będzie tutaj jako status not pad.
Zapiszemy nasz komponent.
No i już mamy tutaj.
Generalnie rzecz biorąc.
Tu pokazane, natomiast zabrakło nam tutaj nazwy.
Tutaj brakuje nam kilku.
Zapiszemy to. Mamy już kółeczko i chcemy fill.
Niech będzie fill i tym mniej też potrzebuje.
No i mamy już wyświetlone dane jeżeli
chodzi o które są zapłacone, które nie są zapłacone.
Kolejna rzecz, którą potrzebujemy sobie tutaj zrobić to tak naprawdę mamy price
karencji, czyli kolejna rzecz tutaj w chwili i potrzebujemy tutaj
też div, który będzie nam latał tutaj price i karencji czyli P.
Niech będzie.
I drugie. Niech to będzie nasze konsekwencje.
Zapiszemy to sobie, to też będziemy myśleli skorzystać z naszych styli, czyli
standardowo Flex Items Center i GAP możemy ustawić na dwójkę.
Tutaj jeszcze warto, bo generalnie rzecz
biorąc chcemy, żeby to się wyświetlało po prawej stronie.
Możemy spróbować tak naprawdę czas i find zrobić.
Przesunięto nam te elementy na sam koniec.
Tak jest ok.
Myślę, że jak najbardziej jest to w porządku.
Tylko tutaj oczywiście nie możemy zapomnieć o globalnych stylach.
Czyli weight wrap padding na y.
Zrobimy sobie czwórkę padding na literę M, przejść tekst z M, to zaraz będziemy
musieli założyć na wszystkie nasze elementy, które wyświetlają nasze dane.
Tekst zostawiamy taki, jaki jest.
Już tu się wyświetla dużo.
Teraz musimy sobie skopiować tak naprawdę te style.
I skopiować też sobie na inne rzędy.
Natomiast tutaj padding write nie będziemy potrzebować.
Myślę, że pod nim y jest ok.
Wrap jest ok.
To też zmniejszy nam ten napis teraz plus.
Analogicznie możemy sobie po kopiować tutaj do kolejnych elementów.
Mamy już wszystkie te D.
Teraz zapiszemy to sobie już nasza tabelka swój wygląd też zmieniła.
Myślę, że tak naprawdę
ten podstawowy wygląd tej tabelki chyba mamy już za sobą.
Sprawdźmy jeszcze firmę.
Oczywiście jeżeli chodzi o to sortowanie,
to już wspominałem wychodzi tu poza zakres tego kursu.
Musielibyśmy tutaj totalnie przebudować
naszą tabelkę, zrobić dodatkową logikę, która wysyła zapytania.
Jeżeli chodzi o filtry, o sortowanie z za pomocą Primy.
Natomiast zalążek takiej logiki masz już w
swoim kodzie, bo generalnie dane które sobie pobieramy na chwilę
obecną w naszym komponencie subskrypcji to zobacz, że mamy tutaj order by.
I mamy eksperyment
i możemy sobie tak naprawdę sortować to po obojętnie jakim polu.
Jeżeli tutaj sobie zobaczymy zobaczy.
Możesz to sortować po obojętnie jakim
polu, po name, po ono, id, po payment, po cenie.
Możemy sobie to sortować po cenie i wtedy
dostaniemy te dane posortowane pod względem ceny.
Zróbmy sobie taki przykład, a teraz usuniemy sobie ten pierwszy
i zobacz w jaki sposób zmienią się dane tutaj wyświetlone.
Zobacz, że mamy od najtańszej subskrypcji do najdroższej.
Jeżeli sobie użyjemy cennik to mamy od najdroższej subskrypcji do
najtańszej i w taki sposób moglibyśmy tutaj budować sobie
czy to filtrowanie tych rekordów, czy to sortowanie tych rekordów.
Natomiast ja tutaj sobie wrócę, zostawmy ten eksperyment, niech to będzie.
Tak było domyślnie firmie oczywiście potem.
Jeżeli chodzi o aktywny aktywne style danej kolumny, to jak na
rzucimy sobie jakiś jakiś filter, jakiś sortowanie to możemy sobie też aktywnie
tutaj wystylizować tą kolumnę i wszystkie te elementy w tej kolumnie.
Myślę, że jeżeli chodzi o
element z tą tabelką to mamy chyba za sobą Sprawdź jeszcze tą firmę.
A jeszcze mamy ten guzik tutaj do edycji.
Czyli możemy sobie jaką jakąś zaślepkę zrobić.
To będzie nasze ostatnie CTRL czyli wtedy.
No i tutaj będzie potrzebny jakiś button.
Jeżeli chodzi o ten button to zróbmy na
razie statyczny baton czyli i zróbmy sobie.
Skorzystamy znowu z Icon Remix Icons i tu będzie.
I to akurat nazwę pamiętam pensję.
Line.
Margin Lite ustawimy sobie na jeden tekst na LG.
Jeżeli chodzi o kolejny element no to mamy edit.
Czyli możemy zrobić lepiej.
EDIT W środku tego P możemy zrobić jeszcze
jako ESL only dla osób, które korzystają z czytników, żeby wiedziały, którą
subskrypcję będą edytowałem, czyli tutaj Class name.
Chcę troszeczkę zasad
zalążek accessibility i dla tej aplikacji ESL only.
I tutaj wpisujemy np. tak.
Czyli wiadomo, że ktoś będzie wiedział jak się tutaj edytuje.
Zapisujemy to sobie, sprawdźmy.
No już nam się tutaj coś wyświetla.
Przejdźmy teraz do rysowania tego batona, czyli klasy.
I w tym momencie zrobiłem sobie Flex Items Center.
DET MD.
Leasing na 200.
I tekst.
Kolor tekstu ustawimy sobie na 600.
Już mamy nasz guzik przygotowany.
Jeszcze brakuje nam tutaj jakiś przecinków.
Tak, także możemy sobie ustawić jeszcze X na 2.
Zapiszemy to sobie. No i już.
Wygląda to de facto praktycznie tak samo jak w naszym Maku.
Sprawdźmy jeszcze na kolor tego tekstu.
Ten tekst jest jednak troszeczkę za jasny.
Mam wrażenie, że możemy sobie zrobić tekst z e-ink, spróbować na 700 ustawić.
No teraz to już wygląda lepiej.
Także mamy przygotowany widok
subskrypcji, mamy statystyki, jakąś pierwszą logikę na nasze statystyki,
mamy tabelkę związaną z widokiem naszych danych.
Teraz przejdźmy do logiki, która będzie związana z dodawaniem subskrypcji.