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ż komponent do pojedynczych statystyk,
możemy zająć się zbudowaniem tej części Dashboard związany ze statystykami.
Jeżeli spojrzymy sobie na to, co chcielibyśmy tutaj wyświetlać, no to
mamy tutaj sumę opłat w tym miesiącu, sumę opłat w zeszłym miesiącu.
Mamy to, co już zostało zapłacone, to co jest ciągle do zapłacenia.
No i mamy miesiąc i rok.
Czyli tak naprawdę będziemy potrzebować na pewno.
Patrząc na to, że te subskrypcje tutaj, które użytkownik sobie tutaj sumuje, w tej
aplikacji są w różnych walutach, prawdopodobnie będziemy musieli sobie
tutaj policzyć sumę dla każdej z walut i potem
przerobić to po kursie danej waluty na walutę główną danego użytkownika, w której
będziemy wyświetlać sobie nasze statystyki.
Przypominam, że w naszej aplikacji
my póki co nie mamy modułu do ustawień użytkownika.
Tak naprawdę na sztywno sobie wpiszemy
walutę, którą chcemy używać i będzie to waluta polska złotówka.
Czyli będziemy musieli sobie policzyć sumę subskrypcji w euro.
Pomnożyć to razy to ile kosztuje jedno euro w złotówkach?
Tak samo będziemy musieli sobie policzyć sumę subskrypcji w dolarach.
Pomnożyć to potem razy.
To ile kosztuje dana suma w złotówkach?
Ile jest kurs wymiany dolara na złotówki?
Wtedy mając tę sumę sumujemy to wszystko.
Będziemy mieli tutaj całą sumę, jaką
użytkownik musi zapłacić w danym miesiącu za swoje subskrypcje, z których korzysta.
Jeżeli chodzi o te to które już są zapłacone i które są do
zapłacenia, to też będziemy musieli sobie je tutaj odróżnić.
Patrząc na nasze dane, które mamy.
Przejdźmy do naszej przeglądarki.
Jeżeli sobie tutaj otworzymy Prisma Studio
to zauważ, że jeżeli sobie zobaczymy Payments,
no to niektóre z tych payments są not paid, niektóre są płatne.
Dlatego też musimy sobie w zależności od
tego policzyć te, które już są zapłacone, te które jeszcze nie są zapłacone, No i
pokazać odpowiednie statystyki naszemu użytkownikowi.
Przejdźmy teraz do edytora kodu i zaczniemy sobie od funkcji, która sumuje
nam tak naprawdę wszystkie subskrypcje dla danej waluty.
Natomiast zanim to zrobimy, to widząc nasz
design i to co mamy już tutaj przygotowane.
Myślę, że rozsądnym byłoby teraz
przeniesienie tego komponentu, zbudowanie już osobnego komponentu np.
Dashboard stats albo Dashboard main.
I możemy sobie tam już wrzucić tą całą naszą logikę i wszystkie funkcje.
Bo nagle jak zaczniemy sobie tutaj dodawać
kolejne funkcje związane z liczeniem tej logiki dla statystyk,
to zacznie nam się tutaj ten widok dashboard strasznie rozrastać.
A to też nie o to chodzi.
Myślę, że możemy sobie tutaj spokojnie teraz przejść do komponentów
i stworzyć już tutaj nowy komponent, czyli Dashboard Main Stats Test X.
I tutaj możemy sobie stworzyć klasyczny
komponent, czyli Export default function i nazwa.
Będzie dashboard.
No i możemy jako tak naprawdę jako return wrzucić sobie całą naszą tutaj logikę.
Czyli jak sobie to wytniemy z tego miejsca wklejamy tutaj.
No to oczywiście musimy sobie odpowiednie rzeczy po importować, czyli funkcje z Date
News Nasz komponent Stack komponent Nasz typ subskrypcji Currency.
Myślę, że na chwilę obecną jest to ok.
Teraz tutaj w to miejsce, w której
powinniśmy mieć statystyki, możemy użyć nasz dashboard Main stats.
Nie powinno to nam nic zmienić w
wyświetlaniu naszej strony tak, że przejdziemy sobie do przeglądarki.
Jeżeli sobie odświeżamy naszą stronę.
I tu oczywiście musimy dodać Ritter Tag, musimy coś zwracać.
No i zapisujemy to sobie.
Już mamy nasz komponent statystyk na naszej stronie.
Teraz możemy zająć się tutaj opracowywaniem dalszej logiki.
Natomiast jeszcze zanim to,
to jeżeli chodzi o nasz komponent Single Stack komponent ustawmy sobie walutę
Polska złotówka jako waluta domyślna, która będzie tutaj wyświetlana.
Czyli musimy sobie zrobić ten property tutaj jako property możemy zrobić jako
opcjonalne, żeby nie musieć to ekstra podawać.
Wróćmy do naszego interfejsu.
Przeniesiemy sobie Property currency na dół tutaj.
Jako że jest to property opcjonalne czy
mamy je na końcu i w tym momencie musimy użyć znaku zapytania, czyli robimy to jako
property opcjonalne i tutaj jako wartość domyślną wpiszemy PLN.
Zapiszemy to sobie teraz jak usuniemy z tego komponentu ten property,
to i tak naprawdę polska złotówka powinna zostać użyta jako domyślna wartość.
Przypominam jeżeli chciałbyś to zrobić tak naprawdę w wersji produkcyjnej tej
aplikacji, to warto byłoby pewnie tutaj uwzględnić jakiś panel do
ustawień użytkownika, gdzie użytkownik mógłby sobie wybrać swoją główną walutę.
I prawdopodobnie też będziesz musiał musiała zaimplementować sobie jakieś
zewnętrzne API, które będzie dostarczało Ci kursu danej waluty w danym dniu.
Jeżeli użytkownik otworzy sobie aplikację,
żeby miał po prostu w danym dniu odpowiednie przeliczenie swoich opłat.
Natomiast my tutaj przyjmujemy, że
użytkownicy mają jakby główną walutą użytkownika jest złotówka.
I tak samo jeżeli chodzi o kursy wymiany
walut w naszych obliczeniach przyjmiemy sobie te kursy na stałe.
Na dzień dzisiejszy nie będziemy podłączać się do zewnętrznego API, bo generalnie
wyszli byśmy znacznie poza obszar tego kursu.
Dobrze to teraz przed przystąpieniem do
dalszej pracy możemy sobie wyczyścić tutaj ten komponent, czyli Organic import.
I tutaj tak samo Morgana.
Jest impuls, mamy te importy, które potrzebujemy tutaj mieć.
I zaczniemy sobie od pisania logiki.
Najpierw napiszemy sobie logikę, która
sumuje nam cenę wszystkich subskrypcji w danych walutach.
To będzie nam potrzebne później do obliczenia odpowiednich statystyk.
Czyli zaczynamy Function i Sunrise Prices
i tutaj będą subskrypcje i jako typ to będzie subskrypcja.
Ściągniemy sobie typ z pryzmy i jest to
tablica subskrypcji, którą będziemy podawać do tej funkcji.
I jeżeli chodzi o logikę tej funkcji to musimy sobie zacząć.
Let total euro niech będzie równe 0.
Tak samo tutaj Let total USD niech będzie równe 0.
I zróbmy sobie jeszcze Let Total PLN. Niech będzie równe zero.
Mamy trzy typy tak naprawdę walut, którymi
posługujemy się w naszej aplikacji i póki co mamy PLN, EUR, USD.
Także warto, żebyśmy sobie opracowali funkcję, która zsumuje nam dla tych trzech
typ walut sumy naszych subskrypcji, naszych opłat.
I teraz pętla for i tutaj.
W środku robimy letni.
Równa się zero.
Iteracja mniejsza niż subskrypcja.
Lęk i i + +.
Standardowa pętla for.
I tutaj potrzebujemy logikę, która będzie nam dodawała odpowiednie sumy subskrypcji
w zależności od tego, na jaką się trafimy, w jakiej ona jest walucie.
No to chcemy tą sumę wrzucić tutaj.
Do tego do tej zmiennej czyli if możemy posłużyć się instrukcją czy instytucją.
Natomiast ja sobie tutaj za pomocą instrukcji if i tutaj skryptem.
Tutaj mamy currency.
Jeżeli równe.
Subskrypcję MKS.
Zacznijmy od Euro, tak jak to mamy tutaj.
Jeżeli chodzi o nasze zmienne, to jeżeli
currency jest równe euro, to chcemy to euro powiększyć o tę wartość.
Czyli plus równa się i co?
I i tutaj będziemy mieli price.
Analogicznie robimy to dla złotówki i dla USD, czyli s f.
Zapiszemy sobie naszą funkcję.
Mamy już funkcję liczącą ceny subskrypcji.
Możemy sobie teraz zwrócić rezultat, żebyśmy mogli się już tym posługiwać.
I tu jako return zwrócimy total euro, które będzie wartością.
Chcemy utrzymać 2 miejsca po przecinku,
dlatego możemy zrobić od razu parę flot i nasze total euro.
I tu fixed.
Dwa miejsca po przecinku.
To samo zrobimy jeżeli chodzi o total uzdę.
Możemy sobie tak naprawdę skopiować tutaj tą logikę, bo tylko zmienna środku tutaj
się zamieni i też tą linię kopiujemy i chcemy też uzyskać rezultat dla złotówek.
Szkoda PLN, pln.
To dobrze, mamy logikę jeżeli chodzi o sumowanie naszych cen.
Czyli teraz bardzo łatwo będzie nam
stworzyć tą część statystyk tutaj, która mówi nam o
tym ile do zapłacenia dany użytkownik będzie miał w tym miesiącu.
Mamy tutaj subskrypcję.
Jeżeli chodzi o ten miesiąc
w bazie danych mamy tylko i wyłącznie subskrypcje związane z tym miesiącem.
Póki co użytkownik dopiero założył konto.
Nie ma jakiś starych.
Także nie musimy to jakoś tutaj ekstra sobie teraz filtrować.
Dlatego teraz w naszym
komponencie Dashboard możemy sobie zrobić zmienną Connect
subskrypcje sam i tutaj wykorzystamy naszą.
Samo Risk Prices.
No i potrzebujemy danych, czyli do tego
komponentu najlepiej jakbyśmy przekazywali subskrypcję
tablicę subskrypcji to subskrypcję możemy sobie użyć jako nasze dane.
Oczywiście teraz dostaniemy tutaj error w
naszym dashboard, bo musimy przekazać naszą naszą datę, czyli subskrypcji.
I tu mamy typ danych, który jest
subskrypcja i rekord, który jest payments, bo pobieramy tutaj od razu opłaty.
Dlatego musimy sobie zmienić.
Na pewno typ danych, który jest tutaj wykorzystywany.
Możemy sobie skopiować tutaj
to co dostajemy jako rezultat jeżeli chodzi o nasze dane.
Przeskoczyć sobie do naszych subskrypcji,
do definicji tutaj naszego typu, który przekazujemy do naszego komponentu.
I w tym miejscu możemy sobie podmienić to, co tutaj mamy.
Natomiast jeżeli chodzi o jedną rzecz, to jest tutaj pewien problem, dlatego że
prices oczekują pewnego typu danych, czy też możemy tutaj zmienić
ten typ danych właśnie na to, co tak naprawdę do nas przychodzi.
No i teraz musimy sobie sprawdzić, czy rzeczywiście tutaj może być undefined.
Czyli musimy sobie ograć tutaj ten przypadek.
Jeżeli chodzi o ten przypadek, no to myślę, że najłatwiej ogarniamy go
tak naprawdę zwracając tutaj wcześniej cokolwiek, żeby jeżeli będzie subskrypcja.
Jeżeli będą po prostu undefined, to po prostu chcemy zwrócić np.
nasz komponent Loading.
Czyli tutaj powyżej możemy sobie zrobić
instrukcję warunkową i to jest data, czyli subskrypcja.
No to zrobimy sobie return.
No i na chwilę obecną zróbmy. Zapiszemy to sobie.
No teraz już mamy naszą sumę jeżeli chodzi
o sumę subskrypcji do zapłacenia w tym miesiącu i przejdźmy do naszej firmy
I możemy sobie wykorzystać i zbudować kolejną część naszej statystyki, czyli
to co będzie pokazywało sumę w walucie naszego użytkownika w tym miesiącu.
Czyli jeżeli mamy to przez sam musimy sobie zrobić const month sam PLN.
Tak. I tutaj na pewno wykorzystamy ten obiekt.
I musimy zrobić tak total euro razy.
Załóżmy, że euro kosztuje 4 70.
Na dzień dzisiejszy plusy.
Później musimy sobie zrobić total już od razu.
Załóżmy, że kurs dolara to jest 4.50 i plus total PLN.
Będziemy mieli sumę do zapłacenia w tym miesiącu za nasze wszystkie subskrypcje.
No i tutaj jeżeli chodzi o nasz komponent,
możemy sobie to teraz zdublować, przeskoczyć tutaj
I jeżeli chodzi o sumę tutaj, którą chcemy wyświetlić, no to możemy sobie wyświetlić
właśnie to, co mamy tutaj w postaci naszego number.
Jeżeli chodzi o opis, to wróćmy jeszcze do naszej firmy Month.
Są to. Wróćmy tutaj.
Jeżeli chodzi o wartość, którą tutaj
przekazujemy, to tak naprawdę możemy sobie zrobić, gdyż jest Pan sam.
Już przejdźmy do naszej aplikacji.
Już mamy.
Dysponent sam jest równy zero.
Sprawdźmy, czy rzeczywiście jest to równe 0.
Oczywiście jeszcze tutaj musimy
zrestrukturyzować nasz nasz property i to będzie typu.
Zapisujemy to sobie już mamy sumę w tym miesiącu jeżeli chodzi o PLN.
Natomiast możemy sobie też tutaj wykorzystać tą.
Mamy tutaj tą sumę jeżeli chodzi o mamy 3 miejsca po przecinku, natomiast w
naszej aplikacji jeżeli widzimy design to tutaj designer starał się przekazać nam
informację taką, że to powinny być dwa miejsca po przecinku.
Dlatego też możemy sobie przejść tutaj do tej cyfry, którą wykorzystujemy i tu.
Fixed i dwa miejsca po przecinku.
Zapisujemy to sobie, sprawdźmy o co tutaj teraz chodzi.
String jest stały, bo number oczywiście są tutaj.
W naszym przypadku mamy tu fixed.
Oczywiście możemy sobie zamienić to znowu
na liczbę, natomiast też dużo łatwiej możemy tutaj przekazać.
Tak naprawdę nie ma znaczenia czy to będzie string czy number dla
naszego komponentu, bo jest tylko komponent do wyświetlenia tych danych.
Dlatego tutaj jak najbardziej możemy sobie zapisać.
Jeszcze przejdźmy do definicji tej funkcji i parametrów, które przekazujemy.
Oczywiście tutaj nie chcemy mieć undefined
w żadnym wypadku, dlatego też możemy sobie zapisać to w taki sposób.
Mamy już pierwszą statystykę, którą chcemy używać.
Kolejna rzecz, która będzie ważna dla nas to kolejne statystyki.
To sprawdźmy sobie na firmę Last Month sam zostawimy sobie.
Jest to nowo założone konto, dlatego też nie będziemy tutaj bawić się w
filtrowanie płatności za zeszły miesiąc z tego względu, że znajdowaliśmy naszą bazę
tylko i wyłącznie płatnościami w tym miesiącu.
Natomiast możemy teraz zrobić te dwie statystyki.
Jedna mówi to, ile użytkownik jeszcze ma do zapłacenia, czyli wszystkie
opcje, które są ze statusem NOT musimy sobie sumować.
Natomiast druga statystyka mówi to, ile użytkownik już zapłacił, czyli wszystkie
te, które są już zapłacone, możemy sobie zsumować.
I teraz zajmiemy się właśnie wyświetleniem
tych dwóch statystyk każdemu użytkownikowi.