• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zrobić, aby każdy użytkownik miał swoją własną listę zadań - bazy danych

Object Storage Arubacloud
0 głosów
799 wizyt
pytanie zadane 30 sierpnia 2018 w Java przez periedynek Obywatel (1,320 p.)
Zamierzam zrobić aplikację, która by przechowywała listę zadań do wykonania każdego użytkownika - coś na zasadzie ToDo. Będę korzystał z bazy danych gdzie będą te zadania zapisywane, a także konta użytkowników.

Chciałbym, aby po zalogowaniu na konto, użytkownik miał te zadania, które sam sobie dodał. Inne konto = inne zadania.

Nie wiem czy to jest dobra droga, ale wymyśliłem coś na zasadzie tego, że jeżeli jesteśmy zalogowani na konto i ktoś próbuje dodać coś do zrobienia to do bazy się dodaje zadanie a także jego nick.

Gdy chce wyświetlić listę zadań, to wczytujemy te zadania, przy których jest jego nick. W ten sposób filtruje wszystkie zadania, które są dodane w bazie.

Czy jest to dobre rozwiązanie?

3 odpowiedzi

+1 głos
odpowiedź 30 sierpnia 2018 przez Velta Maniak (52,010 p.)

wczytujemy te zadania, przy których jest jego nick

Nickname może być taki sam lub się nagle zmienić. Lepiej po ID konta.

komentarz 30 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
Moge wprowadzić coś takiego, aby był tylko jeden nick w całej bazie.

Ale skąd będę znać ID konta z zewnątrz nie patrząc do bazy danych? ID konta jest tak jakby wewnętrzną częscią porgramu, nie będę jej nigdzie wyświetlać. To skąd użytwkonik będzie wiedział jakie ma ID.
komentarz 30 sierpnia 2018 przez Velta Maniak (52,010 p.)
Posiadanie ID konta nie jest powinnością użytkownika, tylko aplikacji. To ona będzie pobierać z tabeli zadania na podstawie wskazanego ID w zapytaniu do bazy danych.
komentarz 30 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
No własnie aplikacji, a skad mam wziac w zapytaniu to ID, skoro nie wiem jakie jest?
komentarz 30 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
Bo właśnie głównie mi o to chodzi, załóżmy jest konto w bazie:

id|  nick  |hasło

1|Marek|12345

I teraz skąd mam wiedzieć, że ID to jest 1? W jaki sposób mam własnie zapisać zadanie do konta w bazie, gdzie szablon by wyglądał tak:

id|zadanie

1|umyc sie

Jeżeli posługiwał bym się samym nickiem, to miałbym w client.getName(); właśnie nazwę użytkownika i zrobiłbym: ....SELECT * FROM TASKS WHERE nick = client.getName();
komentarz 30 sierpnia 2018 przez Velta Maniak (52,010 p.)
Możesz pobrać całą krotkę przy logowaniu i wtedy automatycznie pobierasz również ID.
komentarz 30 sierpnia 2018 przez marcin99b Szeryf (82,040 p.)
nie wiem na jakim autor jest poziomie
ale można po prostu używać tokenów np JWT
i w nich zapisywać takie dane
wtedy przy każdej akcji która wymaga posiadania konta, serwer wie który użytkownik wykonał tą akcje
w tokenie zapisujemy jego id i możemy jego role (user/admin itd)

sporo to ułatwia, bo nie trzeba tak kombinować

polecam też przejście z czystego SQL na jakiś ORM
co prawda prostego SQL każdy powinien umieć wyklepać, ale w projektach komercyjnych SQL używa się głównie do niestandardowych operacji, typu jakieś nietypowe migracje wsteczne
komentarz 30 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
chodzi mi o aplikacje konsolową anizeli webową.
komentarz 30 sierpnia 2018 przez marcin99b Szeryf (82,040 p.)
ja zrobiłbym to tak, że w pamięci jako klase statyczną zapisałbym konfiguracje obecnego użytkownika

z jego id, nazwą i ustawieniami

wtedy w różnych miejscach w aplikacji możesz się do tego odwoływać

nie wiem czy to jest "dobra praktyka", ale ja bym tak zrobił i myśle, że nikt by się nie czepiał
komentarz 30 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
Zrobie podobnie. Podczas logowania zapisze sobie numer ID do zmiennej i będę się mógł nim posługiwać.
+1 głos
odpowiedź 30 sierpnia 2018 przez BT101 Stary wyjadacz (12,540 p.)
edycja 30 sierpnia 2018 przez BT101

Jak już wspomniałeś zapisujesz w oddzielnej tabeli użytkowników a w oddzielnej zadania. Tabela z użytkownikami powinna mieć kolumnę ID z unikalnymi wartościami i zaznaczoną opcją auto increment.

I teraz tak po kolei, bo pytałeś skąd znać ID usera:

  • User wpisuje swoje dane do pola login i hasło i klika zaloguj wykonuje się request na serwer
  • Po requeście serwer odpowiada i w response wysyła ID użytkownika, który się zalogował
  • ID użytkownika zapisujesz u niego na maszynie w postaci localStorage bądź w ciasteczku (preferuje 1 podejście)
  • Gdy już masz ID usera w localStorage przenosisz go do strony z jego zadaniami
  • Pobierasz ID z localStorage i robisz calla do backendu przesyłając jego ID
  • W kodzie wykonywanym na serwie podstawiasz do zapytania przesłane ID (PAMIĘTAJ o SQL injection)

Również co może pójść źle to to, że zapis do localStorage nie jest asynchroniczny i to czasem utrudnia zadanie jeśli wpadniesz w jakieś kłopoty, że zapisałeś do localStorage a nie możesz pobrać tej wartości to poczytaj o np. localForage od mozilli albo coś w ten deseń.


Jeszcze pozostaje kwestia, że zapis ID usera w localStorage może być niekoniecznie najlepszym rozwiązaniem bo łatwo sprawdzić swoje ID, lepiej jest jeszcze na serwie zapisać ID jako token np. JWT i w response po zalogowaniu wysłać właśnie owy token a potem w requeście do pobrania listy wysłać token, który najpierw będzie odszyfrowany przez backend, potem spreparowane aby uniknąć ataku SQL injection a dopiero potem podstawione do zapytania.

komentarz 30 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
Trochę zaszarżowałeś :D Ja chce jak najprostszą aplikację, raczej konsolową, bo JavyFX raczej nie ma co się już uczyć, jako ze chce się skupić tylko na backendzie a nie na froncie.

Do momentu dwóch słów auto increment wszystko zrozumiałem, później już ciężko :P
komentarz 30 sierpnia 2018 przez BT101 Stary wyjadacz (12,540 p.)
A nawet nie spojrzałem na tagi xD myślałem, że robisz apke todo webową z jakimś backendem i frontem. Tak czy inaczej mechanika pozostaje taka sama - po zalogowaniu zapisujesz ID usera gdzieś i stamtąd je pobierasz przed pobraniem listy zadań.

Sory nie zauważyłem, że to ma być Java więc zapis ID użytkownika do localStorage chyba odpada, nie znam się na Javie
komentarz 30 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
No tak, ja to wszystko rozumiem, ale chodzi mi własnie skąd poznać to ID usera.

Od razu jakoś przy logowaniu mam wyciągnąć za pomocą SELECT * i zapisać do zmienej?
komentarz 30 sierpnia 2018 przez BT101 Stary wyjadacz (12,540 p.)
Nie znam się na Javie ale zapis ID usera po zalogowaniu do zmiennej wydaje się sensowne.
0 głosów
odpowiedź 30 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
edycja 30 sierpnia 2018 przez periedynek

Zrobiłem coś takiego, co myślicie?

public boolean signIn(User user) throws SQLException {
    PreparedStatement preparedStatement = connection.prepareStatement("SELECT COUNT(username) FROM user WHERE username=? AND password=? LIMIT 0,1");
    preparedStatement.setString(1, user.getName());
    preparedStatement.setString(2, user.getPassword());
    ResultSet result = preparedStatement.executeQuery();
    int count = 0;
    if (result.next())
        count = result.getInt(1);

    if (count < 1)
        return false;
    return true;
}

public int retrieveUserID(User user) throws SQLException {
    PreparedStatement preparedStatement = connection.prepareStatement("SELECT id FROM user WHERE username=? AND password=?");
    preparedStatement.setString(1, user.getName());
    preparedStatement.setString(2, user.getPassword());
    ResultSet result = preparedStatement.executeQuery();
    if (result.next())
        user.setID(result.getInt("id"));

    return user.getID();
}

Jedynym minusem jest to, że musze wywołać 2 metody zamiast jednej podczas logowania. Wie ktoś moze jak to skorygowac?

Podobne pytania

0 głosów
1 odpowiedź 170 wizyt
pytanie zadane 22 marca 2018 w PHP przez konrad99 Gaduła (4,090 p.)
0 głosów
0 odpowiedzi 243 wizyt
+3 głosów
0 odpowiedzi 336 wizyt
pytanie zadane 21 grudnia 2020 w Nasze projekty przez gagyn Stary wyjadacz (11,050 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...