Projekt aplikacji EMAIL
Wymagania funkcjonalne
Wysyłanie wiadomości:
- Użytkownicy mogą wysyłać e-maile do innych użytkowników systemu.
- Możliwość dodawania załączników.
Odbieranie wiadomości:
- System dostarcza wiadomości do odpowiednich skrzynek odbiorczych.
Zarządzanie wiadomościami:
- Oznaczanie jako przeczytane/nieprzeczytane.
- Usuwanie wiadomości.
- Sortowanie i filtrowanie (np. po dacie, nadawcy).
Powiadomienia:
- Powiadamianie użytkownika o nowej wiadomości w czasie rzeczywistym.
Bezpieczeństwo:
- Uwierzytelnianie użytkowników.
- Walidacja treści i załączników.
Architektura aplikacji
Struktura bazy danych
Tabela: tablet_Accounts
Pole | Typ | Opis |
---|---|---|
id | INT | Klucz główny |
username | VARCHAR(50) | Unikalna nazwa użytkownika |
VARCHAR(100) | Adres e-mail | |
password_hash | TEXT | Hasło użytkownika (zahashowane) |
created_at | DATETIME | Data utworzenia konta |
Tabela: tablet_Emails
Pole | Typ | Opis |
---|---|---|
id | INT | Klucz główny |
sender_id | INT | ID nadawcy |
receiver_id | INT | ID odbiorcy |
subject | VARCHAR(100) | Temat wiadomości |
body | TEXT | Treść wiadomości |
created_at | DATETIME | Data wysłania |
is_read | BOOLEAN | Czy wiadomość została przeczytana |
Tabela: tablet_Attachments
Pole | Typ | Opis |
---|---|---|
id | INT | Klucz główny |
email_id | INT | ID wiadomości |
file_path | VARCHAR(255) | Ścieżka do pliku |
file_name | VARCHAR(100) | Nazwa pliku |
Relacje:
tablet_Emails.sender_id
itablet_Emails.receiver_id
to klucze obce odnoszące się dotablet_Accounts.id
.tablet_Attachments.email_id
to klucz obcy odnoszący się dotablet_Emails.id
.
Backend w Lua
Funkcje serwera:
- 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)
- 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)
- 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)
- 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)
- Powiadomienia:
lua
RegisterServerEvent('email:notifyNewEmail')
AddEventHandler('email:notifyNewEmail', function(receiver_id)
TriggerClientEvent('email:newNotification', receiver_id, "Masz nową wiadomość!")
end)
Frontend (Vue.js)
Widoki:
Skrzynka odbiorcza:
- Lista wiadomości z podziałem na foldery (Odebrane, Wysłane, Kosz).
- Filtrowanie i wyszukiwanie.
Podgląd wiadomości:
- Szczegóły wiadomości (temat, nadawca, treść, załączniki).
Tworzenie wiadomości:
- Formularz z polami: Odbiorca, Temat, Treść, Załączniki.
Komponenty wspólne:
- Pasek powiadomień.
- Modal do potwierdzenia usunięcia.
Mechanizmy wymiany danych
Autoryzacja użytkowników:
- Token JWT przesyłany z każdym zapytaniem do API.
Ł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).
Powiadomienia w czasie rzeczywistym:
- Użycie WebSocketów do powiadamiania o nowych wiadomościach.
Załączniki:
- Przechowywane na serwerze w dedykowanym katalogu.
- Pobierane po kliknięciu w nazwę pliku w wiadomości.