Skip to content

Projekt aplikacji Bankowej

Wymagania funkcjonalne

  1. Podstawowe funkcje konta bankowego:

    • Przegląd salda konta.
    • Historia transakcji (wpływy i wydatki).
  2. Transakcje:

    • Wysyłanie przelewów do innych graczy.
    • Odbieranie przelewów od innych graczy.
    • Automatyczne dodawanie transakcji do historii.
  3. Wypłaty i wpłaty:

    • Wpłacanie i wypłacanie pieniędzy z konta bankowego.
  4. Konta wspólne:

    • Możliwość zakładania kont firmowych.
    • Zarządzanie dostępem do konta wspólnego (np. dodawanie uprawnień dla wybranych graczy).
  5. Bezpieczeństwo:

    • Autoryzacja transakcji (np. PIN lub hasło).
    • Powiadomienia o każdej transakcji.
  6. Integracja z innymi aplikacjami:

    • Automatyczne rozliczanie pensji w aplikacji Zarządzanie JOBEM.
    • Współpraca z systemem faktur.

Architektura aplikacji

Struktura bazy danych

Tabela: tablet_BankAccounts

PoleTypOpis
idINTKlucz główny
user_idINTID właściciela konta
account_typeVARCHAR(50)Typ konta (osobiste/firmowe)
balanceINTSaldo konta
created_atDATETIMEData założenia konta

Tabela: tablet_Transactions

PoleTypOpis
idINTKlucz główny
account_idINTID konta
typeVARCHAR(50)Typ transakcji (wpłata/przelew)
amountINTKwota
descriptionTEXTOpis transakcji
created_atDATETIMEData transakcji

Tabela: tablet_SharedAccounts

PoleTypOpis
idINTKlucz główny
account_idINTID konta wspólnego
user_idINTID użytkownika
permissionsVARCHAR(50)Uprawnienia (np. tylko podgląd)

Relacje:

  • tablet_BankAccounts.user_id to klucz obcy odnoszący się do TabletAccounts.id.
  • tablet_Transactions.account_id to klucz obcy odnoszący się do tablet_BankAccounts.id.
  • tablet_SharedAccounts.account_id to klucz obcy odnoszący się do tablet_BankAccounts.id.

Backend w Lua

Funkcje serwera:

  1. Sprawdzanie salda:
lua
RegisterServerEvent('bank:checkBalance')
AddEventHandler('bank:checkBalance', function()
    local user_id = source
    local query = [[SELECT balance FROM tablet_BankAccounts WHERE user_id = ?]]
    local result = MySQL.query.await(query, {user_id})
    TriggerClientEvent('bank:showBalance', user_id, result[1].balance)
end)
  1. Wykonywanie przelewu:
lua
RegisterServerEvent('bank:transfer')
AddEventHandler('bank:transfer', function(receiver_id, amount, description)
    local sender_id = source

    -- Pobranie kont nadawcy
    local sender_query = [[SELECT id, balance FROM tablet_BankAccounts WHERE user_id = ?]]
    local sender_account = MySQL.query.await(sender_query, {sender_id})

    if sender_account[1].balance >= amount then
        -- Zmniejszenie salda nadawcy
        local update_sender = [[UPDATE tablet_BankAccounts SET balance = balance - ? WHERE id = ?]]
        MySQL.update.await(update_sender, {amount, sender_account[1].id})

        -- Pobranie konta odbiorcy
        local receiver_query = [[SELECT id FROM tablet_BankAccounts WHERE user_id = ?]]
        local receiver_account = MySQL.query.await(receiver_query, {receiver_id})

        -- Zwiększenie salda odbiorcy
        local update_receiver = [[UPDATE tablet_BankAccounts SET balance = balance + ? WHERE id = ?]]
        MySQL.update.await(update_receiver, {amount, receiver_account[1].id})

        -- Dodanie transakcji do historii
        local insert_transaction = [[INSERT INTO tablet_Transactions (account_id, type, amount, description, created_at) VALUES (?, 'transfer', ?, ?, NOW())]]
        MySQL.insert.await(insert_transaction, {sender_account[1].id, -amount, description})
        MySQL.insert.await(insert_transaction, {receiver_account[1].id, amount, description})

        TriggerClientEvent('bank:transferSuccess', sender_id)
    else
        TriggerClientEvent('bank:transferFailed', sender_id, "Niewystarczające środki!")
    end
end)
  1. Wpłata pieniędzy:
lua
RegisterServerEvent('bank:deposit')
AddEventHandler('bank:deposit', function(amount)
    local user_id = source
    local query = [[UPDATE tablet_BankAccounts SET balance = balance + ? WHERE user_id = ?]]
    MySQL.update.await(query, {amount, user_id})
end)
  1. Wypłata pieniędzy:
lua
RegisterServerEvent('bank:withdraw')
AddEventHandler('bank:withdraw', function(amount)
    local user_id = source
    local query = [[UPDATE tablet_BankAccounts SET balance = balance - ? WHERE user_id = ? AND balance >= ?]]
    local result = MySQL.update.await(query, {amount, user_id, amount})

    if result > 0 then
        TriggerClientEvent('bank:withdrawSuccess', user_id)
    else
        TriggerClientEvent('bank:withdrawFailed', user_id, "Niewystarczające środki!")
    end
end)

Frontend (Vue.js)

Widoki:

  1. Panel główny:

    • Wyświetlanie salda.
    • Historia transakcji.
  2. Formularz przelewu:

    • Pola: Odbiorca, Kwota, Opis.
  3. Wpłata/Wypłata:

    • Przyciski do szybkiego dodania lub wypłacenia pieniędzy.

Komponenty wspólne:

  • Pasek powiadomień o transakcjach.
  • Modal potwierdzenia przelewu.

Mechanizmy wymiany danych

  1. Autoryzacja użytkowników:

    • Token JWT przesyłany z każdym zapytaniem do API.
  2. Synchronizacja salda:

    • Saldo synchronizowane w czasie rzeczywistym podczas transakcji.
  3. Powiadomienia:

    • Powiadomienia o każdej transakcji wysyłane do klienta w czasie rzeczywistym.