Panel administratora dla strony internetowej

0

Cześć. Do tej pory używałem tylko czystego JS'a. Pouczyłem się podstaw Reacta, Node'a z Expressem i MongoDB. Moją praktykę rozpocząłem rzucając się na głęboką wodę - robiąc projekt z użyciem całego MERN stacka. Padło na panel administratora - boilerplate użyteczny przy tworzeniu w przyszłości stron z systemem CMS. Administrator loguję się wchodząc na adresstrony**/admin**, gdzie wpisuje login i hasło, następuje weryfikacja poprzez zapytanie bo bazy danych Mongo, gdzie zapisane są dane logowania administratora. Czyli React każe Node'owi zapytać Mongo, czy to co wpisał użytkownik zgadza się z tym co jest w bazie danych. Jeśli tak, następuje przekierowanie do adresstrony**/admin_dashboard**, gdzie administrator może dodać newsa, który ma tytuł, treść i datę dodania. Przez ten sam panel może również usuwać newsy, które poprzez połączenie z bazą danych wyświetlają się na stronie panelu. W stylowaniu postawiłem na minimalizm, chciałem żeby było to po prostu proste w obsłudze. Homepage wyświetla newsy z bazy danych, tak jak panel, ale w projekcie docelowym zostanie zastąpiony właściwą stroną, dlatego stylowanie jest tam minimalne. Zablokowałem możliwość dostania się "podstępem" do panelu bez logowania, poprzez wpisanie w przeglądarce od razu adresstrony**/admin_dashboard**. To mój pierwszy praktyczny kontakt z backendem i pierwsze kroki w Reakcie. Proszę o ocenę mojego projektu, jakąkolwiek, oceniajcie co chcecie - będę wdzięczny. Napisałem szczegółowo i łopatologicznie co robi mój program, żeby początkujący programiści czytający ten temat mogli coś stąd wynieść. Nie znam jeszcze Reduxa, ani najnowszych bajerów Reacta, takich jak hooks, ale niebawem się za to zabiorę. Wszelka krytyka bardzo mile widziana, im dokładniejsza, tym lepiej. Dane logowania to nazwa: "admin", hasło: "567"

link do repozytorium na githubie

Na gałęzi add_news_pl_heroku znajduje się kod działający na localhoscie, a w folderze "heroku" jest kod działający na heroku, różni się strukturą plików.

link do aplikacji działającej na heroku (nazwa wygenerowana losowo przez heroku, gdyby się ktoś zastanawiał)

Dziękuję, że tu jesteście i poświęcacie dla mnie swój cenny czas. Miłego dnia. :)

3
  1. Dlaczego wykorzystałeś Mongo? Wszytko tutaj brzmi na dane relacyjne.
  2. Dlaczego w pętli co 100ms wykonujesz zapytanie na /api/admin_dashboard/auth? Gdybyś miał na stronie kilkuset użytkowników jednocześnie, mógłbyś powiedzieć pa, pa, serwer.
  3. Rozmiar fontów w panelu administracyjnym jest IMO znacznie, znacznie za duży.
  4. https://damp-badlands-92873.herokuapp.com/admin_dashboard - komunikat no access brzmi jak gdyby został sklecony na kolanie.
  5. Po wpisaniu nieprawidłowych danych w formularzu logowania do panelu administracyjnego nie jest pokazywany żaden komunikat.
  6. Dla czytelności, trzymaj się jednego ficzera per strona - zamiast /admin_dashboard służącego do zarządzaniu wszystkim, zrób /admin/messages z tabelą pozwalającą na wyszukiwanie oraz usuwanie wiadomości, i osobno /admin/messages/create służącego do tworzenia wiadomości.
  7. Spróbuj usunąć jakiś plik na Twoim komputerze - o ile nie zmieniłeś domyślnej konfiguracji, powinien Ci się pokazać komunikat czy na pewno chcesz usunąć ten plik?; dodaj ten sam komunikat do przycisku Usuń wiadomość. Generalnie: każda destruktywna akcja powinna być za potwierdzeniem.
  8. Po naciśnięciu przycisku Dodaj wiadomość nic się nie dzieje - nie otrzymuję żadnej informacji czy coś zostało dodane, czy może wystąpił błąd.
  9. Będąc w panelu administracyjnym nie jestem w stanie myszką wrócić na stronę główną, muszę ręcznie zmieniać URL.
  10. Brakuje podstrony 404 - pokazuje się w tytule strony heh.
  11. Spójrz na stronę główną i zastanów się, w jaki sposób mógłbyś zaprezentować te dane tak, abyś nie musiał pisać tytuł ogłoszenia:, tekst ogłoszenia: etc. Zauważ, że np. tutaj na forum nie masz etykietek autor posta:, treść posta:, data utworzenia posta:, a mimo to hierarchia i odpowiednie ułożenie elementów strony sprawia, że potrafisz odpowiednio zinterpretować to, co widzisz.

Btw, zdaje się, że nie zacommitowałeś zmian do GitHuba, ponieważ tam znajduje się sam domyślny szkielet aplikacji.

0
Patryk27 napisał(a):
  1. Dlaczego wykorzystałeś Mongo? Wszytko tutaj brzmi na dane relacyjne.
  2. Dlaczego w pętli co 100ms wykonujesz zapytanie na /api/admin_dashboard/auth? Gdybyś miał na stronie kilkuset użytkowników jednocześnie, mógłbyś powiedzieć pa, pa, serwer.
  3. Rozmiar fontów w panelu administracyjnym jest IMO znacznie, znacznie za duży.
  4. https://damp-badlands-92873.herokuapp.com/admin_dashboard - komunikat no access brzmi jak gdyby został sklecony na kolanie.
  5. Po wpisaniu nieprawidłowych danych w formularzu logowania do panelu administracyjnego nie jest pokazywany żaden komunikat.
  6. Dla czytelności, trzymaj się jednego ficzera per strona - zamiast /admin_dashboard służącego do zarządzaniu wszystkim, zrób /admin/messages z tabelą pozwalającą na wyszukiwanie oraz usuwanie wiadomości, i osobno /admin/messages/create służącego do tworzenia wiadomości.
  7. Spróbuj usunąć jakiś plik na Twoim komputerze - o ile nie zmieniłeś domyślnej konfiguracji, powinien Ci się pokazać komunikat czy na pewno chcesz usunąć ten plik?; dodaj ten sam komunikat do przycisku Usuń wiadomość. Generalnie: każda destruktywna akcja powinna być za potwierdzeniem.
  8. Po naciśnięciu przycisku Dodaj wiadomość nic się nie dzieje - nie otrzymuję żadnej informacji czy coś zostało dodane, czy może wystąpił błąd.
  9. Będąc w panelu administracyjnym nie jestem w stanie myszką wrócić na stronę główną, muszę ręcznie zmieniać URL.
  10. Brakuje podstrony 404 - pokazuje się w tytule strony heh.
  11. Spójrz na stronę główną i zastanów się, w jaki sposób mógłbyś zaprezentować te dane tak, abyś nie musiał pisać tytuł ogłoszenia:, tekst ogłoszenia: etc. Zauważ, że np. tutaj na forum nie masz etykietek autor posta:, treść posta:, data utworzenia posta:, a mimo to hierarchia i odpowiednie ułożenie elementów strony sprawia, że potrafisz odpowiednio zinterpretować to, co widzisz.

Btw, zdaje się, że nie zacommitowałeś zmian do GitHuba, ponieważ tam znajduje się sam domyślny szkielet aplikacji.

Wprowadziłem kilka zmian w moim projekcie. Miałem ostatnio mało czasu, długo to trwało. Dziękuję, że zechciałeś zapoznać się z moją pracą. Odpowiadam na Twoje uwagi:

  1. Z kilku powodów. Przeglądając oferty pracy dla junior front-end developerów, spośród wymagań dotyczących baz danych najczęściej pojawiała się właśnie Mongo. Przeglądając kanały kilku YouTuberów, często widziałem projekty robione w MERN stacku. Przez oba te fakty pomyślałem, że Mongo to z jakiegoś powodu najlepszy lub najmodniejszy obecnie wybór. To również pierwsza i jedyna do tej pory baza danych, jakiej używałem, od czegoś musiałem zacząć. Twoje pytanie skłoniło mnie do googlowania i znalazłem ten artykuł. W podsumowaniu natrafiłem na takie zdanie "MongoDB stores key names for each value pairs. Also, due to no functionality of joins, there is data redundancy. This results in increasing unnecessary usage of memory." Czy dlatego powinienem był użyć bazy SQL'owej?
  2. Prawdopodobnie dlatego, że umieściłem to zapytanie w render(). Przerzuciłem je do componentWillMount().
  3. Zmieniłem na mniejsze.
  4. Zmieniłem na "Nie masz uprawnień do przeglądania tej strony". Nie wiem, czy chodziło Ci o samą treść komunikatu, czy o to, że powinien być on ładniej ostylowany.
  5. Dodałem komunikat.
  6. Zrobiłem tak jak mówiłeś, faktycznie lepiej się to prezentuje i użytkowanie wydaje mi się "milsze".
  7. Dodałem potwierdzanie usuwania.
  8. Dodałem komunikat dodania wiadomości. Zablokowałem możliwość dodawania słów dłuższych niż 32 znaki w tytule i dodania pustego newsa.
  9. Zrobiłem przycisk.
  10. Dodałem komunikat błędu z przyciskiem przekierowującym na stronę główną.
  11. Zrobiłem homepage z wyświetlaniem newsów nie myśląc kompletnie o tym jak to będzie wyglądało, bo założyłem, że korzystając z tego panelu w jakimś rzeczywistym projekcie i tak ostyluję wyświetlane newsy zgodnie ze stylem tworzonej strony. Chciałem, żeby działała tylko logika. Myślę jednak, że masz rację i nie powinienem w żadnym projekcie zostawiać takich brzydkich elementów, dlatego ostylowałem homepage, żeby "jakoś" wyglądała.

Co do ostatniej Twojej uwagi - zacommitowałem wszystko do Githuba, ale na brancha add_news_pl_heroku. Czy powinienem wrzucić wszystko również na "mastera"? Nie wiem jakie panują w tej kwestii konwencje. Sądząc po tym, że widziałeś sam domyślny szkielet, mniemam, że widziałeś kod z "mastera".

Po drodze zauważyłem, że mój kod powoduje pewien błąd. Sprawiał on, że po usunięciu danego newsa, **nie zawsze ** znikał on z panelu usuwania bez ponownego przerenderowania strony. Poradziłem sobie z tym tworząc ifa sprawdzającego czy długość tablicy listy newsów znajdującej się w state jest równa długości listy newsów otrzymanej z bazy danych poprzez backend. Jeśli tak, to znaczy, że news się nie usunął i w takim przypadku ustawiłem ponowne wykonanie "geta". Nie wiem co jest przyczyną tego błędu, być może połączenie na linii frontend - backend - baza danych - backend - frontend "nie nadąża" przed przerenderowaniem strony powodowanym przez wciśnięcie przycisku "usuń".

Wspomnę jeszcze o weryfikacji wpisywanego hasła przy logowaniu. Zrobiłem to tak, że Axios w Reakcie wysyła żądanie "post" do backendu, który sprawdza zgodność wpisanego hasła z prawidłowym hasłem zapisanym w bazie danych. Następnie backend odpowiada frontendowi, czy hasło jest w porządku. Jeśli tak, to frontend wysyła kolejne żądanie "post", tym razem do route "admin_dashboard". W pliku tego route odbiór rządania "post" ustawia zmienną "auth" na true. Zmienna ta jest umieszczona również w rządaniu "get" w tym samym pliku route, które odbierane jest przez komponent "Page", w którym zagnieżdżony jest komponent panelu administratora. "Page" przesyła w propsie odebranego geta do panelu. Jeśli get = true, to strona panelu się renderuje. Próbowałem zrobić ten system tak, żeby nie trzeba było wysyłać drugiego rządania do backendu. Zamiast tego chciałem zrobić weryfikację poprzez state w komponencie matce - "Page". Niestety nie dałem rady sprostać temu wyzwaniu. Zrobiłem funkcję w komponencie matce, przekazałem ją w propsie do dziecka i w dziecku wywołełem, tak żeby przez dziecko zmienić state w matce, ale to nie działało.

Zmieniłem adres heroku: LINK

Będę bardzo wdzięczny za każde kolejne komentarze i uwagi. Przypominam, że to moja pierwsza styczność zarówno z Reaktem, Nodem, Mongo jak i Heroku. Jestem również całkowitym samoukiem, bez kontaktu z żadnym programistą. Proszę o wyrozumiałość i cierpliwość. :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1