Skip to content

Projekt aplikacji EMAIL

Wymagania funkcjonalne

  1. Wysyłanie wiadomości:

    • Użytkownicy mogą wysyłać e-maile do innych użytkowników systemu.
    • Możliwość dodawania załączników.
  2. Odbieranie wiadomości:

    • System dostarcza wiadomości do odpowiednich skrzynek odbiorczych.
  3. Zarządzanie wiadomościami:

    • Oznaczanie jako przeczytane/nieprzeczytane.
    • Usuwanie wiadomości.
    • Sortowanie i filtrowanie (np. po dacie, nadawcy).
  4. Powiadomienia:

    • Powiadamianie użytkownika o nowej wiadomości w czasie rzeczywistym.
  5. Bezpieczeństwo:

    • Uwierzytelnianie użytkowników.
    • Walidacja treści i załączników.

Architektura aplikacji

Struktura bazy danych

Tabela: tablet_Accounts

PoleTypOpis
idINTKlucz główny
usernameVARCHAR(50)Unikalna nazwa użytkownika
emailVARCHAR(100)Adres e-mail
password_hashTEXTHasło użytkownika (zahashowane)
created_atDATETIMEData utworzenia konta

Tabela: tablet_Emails

PoleTypOpis
idINTKlucz główny
sender_idINTID nadawcy
receiver_idINTID odbiorcy
subjectVARCHAR(100)Temat wiadomości
bodyTEXTTreść wiadomości
created_atDATETIMEData wysłania
is_readBOOLEANCzy wiadomość została przeczytana

Tabela: tablet_Attachments

PoleTypOpis
idINTKlucz główny
email_idINTID wiadomości
file_pathVARCHAR(255)Ścieżka do pliku
file_nameVARCHAR(100)Nazwa pliku

Relacje:

  • tablet_Emails.sender_id i tablet_Emails.receiver_id to klucze obce odnoszące się do tablet_Accounts.id.
  • tablet_Attachments.email_id to klucz obcy odnoszący się do tablet_Emails.id.

Backend w Lua

Funkcje serwera:

  1. Wysyłanie wiadomości:
lua
RegisterServerEvent('email:sendEmail')
AddEventHandler('email:sendEmail', function(receiver_id, subject, body, attachments)
    local sender_id = source
    local query = [[INSERT INTO tablet_Emails (sender_id, receiver_id, subject, body, created_at, is_read) VALUES (?, ?, ?, ?, NOW(), false)]]
    local email_id = MySQL.insert.await(query, {sender_id, receiver_id, subject, body})

    if attachments then
        for _, attachment in ipairs(attachments) do
            local attachmentQuery = [[INSERT INTO tablet_Attachments (email_id, file_path, file_name) VALUES (?, ?, ?)]]
            MySQL.insert.await(attachmentQuery, {email_id, attachment.file_path, attachment.file_name})
        end
    end

    TriggerClientEvent('email:newEmail', receiver_id, email_id)
end)
  1. Odbieranie wiadomości:
lua
RegisterServerEvent('email:getEmails')
AddEventHandler('email:getEmails', function(user_id, status)
    local query = "SELECT * FROM tablet_Emails WHERE receiver_id = ?"
    if status == 'unread' then
        query = query .. " AND is_read = false"
    end

    local emails = MySQL.query.await(query, {user_id})
    TriggerClientEvent('email:loadEmails', source, emails)
end)
  1. Oznaczanie jako przeczytane:
lua
RegisterServerEvent('email:markAsRead')
AddEventHandler('email:markAsRead', function(email_id)
    local query = [[UPDATE tablet_Emails SET is_read = true WHERE id = ?]]
    MySQL.update.await(query, {email_id})
end)
  1. Usuwanie wiadomości:
lua
RegisterServerEvent('email:deleteEmail')
AddEventHandler('email:deleteEmail', function(email_id)
    local query = [[DELETE FROM tablet_Emails WHERE id = ?]]
    MySQL.update.await(query, {email_id})
end)
  1. Powiadomienia:
lua
RegisterServerEvent('email:notifyNewEmail')
AddEventHandler('email:notifyNewEmail', function(receiver_id)
    TriggerClientEvent('email:newNotification', receiver_id, "Masz nową wiadomość!")
end)

Frontend (Vue.js)

Widoki:

  1. Skrzynka odbiorcza:

    • Lista wiadomości z podziałem na foldery (Odebrane, Wysłane, Kosz).
    • Filtrowanie i wyszukiwanie.
  2. Podgląd wiadomości:

    • Szczegóły wiadomości (temat, nadawca, treść, załączniki).
  3. Tworzenie wiadomości:

    • Formularz z polami: Odbiorca, Temat, Treść, Załączniki.

Komponenty wspólne:

  • Pasek powiadomień.
  • Modal do potwierdzenia usunięcia.

Mechanizmy wymiany danych

  1. Autoryzacja użytkowników:

    • Token JWT przesyłany z każdym zapytaniem do API.
  2. Ładowanie wiadomości:

    • Wiadomości użytkownika są ładowane podczas logowania do tabletu, co pozwala rozłożyć obciążenie serwera w czasie i uniknąć nadmiernego pobierania nieużywanych danych. Przy pierwszym otwarciu skrzynki odbiorczej pobierane są najnowsze wiadomości (np. z ostatnich 7 dni). Starsze wiadomości są ładowane przy przewijaniu listy (lazy loading).
  3. Powiadomienia w czasie rzeczywistym:

    • Użycie WebSocketów do powiadamiania o nowych wiadomościach.
  4. Załączniki:

    • Przechowywane na serwerze w dedykowanym katalogu.
    • Pobierane po kliknięciu w nazwę pliku w wiadomości.