Projekt aplikacji Bankowej
Wymagania funkcjonalne
Podstawowe funkcje konta bankowego:
- Przegląd salda konta.
- Historia transakcji (wpływy i wydatki).
Transakcje:
- Wysyłanie przelewów do innych graczy.
- Odbieranie przelewów od innych graczy.
- Automatyczne dodawanie transakcji do historii.
Wypłaty i wpłaty:
- Wpłacanie i wypłacanie pieniędzy z konta bankowego.
Konta wspólne:
- Możliwość zakładania kont firmowych.
- Zarządzanie dostępem do konta wspólnego (np. dodawanie uprawnień dla wybranych graczy).
Bezpieczeństwo:
- Autoryzacja transakcji (np. PIN lub hasło).
- Powiadomienia o każdej transakcji.
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
Pole | Typ | Opis |
---|---|---|
id | INT | Klucz główny |
user_id | INT | ID właściciela konta |
account_type | VARCHAR(50) | Typ konta (osobiste/firmowe) |
balance | INT | Saldo konta |
created_at | DATETIME | Data założenia konta |
Tabela: tablet_Transactions
Pole | Typ | Opis |
---|---|---|
id | INT | Klucz główny |
account_id | INT | ID konta |
type | VARCHAR(50) | Typ transakcji (wpłata/przelew) |
amount | INT | Kwota |
description | TEXT | Opis transakcji |
created_at | DATETIME | Data transakcji |
Tabela: tablet_SharedAccounts
Pole | Typ | Opis |
---|---|---|
id | INT | Klucz główny |
account_id | INT | ID konta wspólnego |
user_id | INT | ID użytkownika |
permissions | VARCHAR(50) | Uprawnienia (np. tylko podgląd) |
Relacje:
tablet_BankAccounts.user_id
to klucz obcy odnoszący się doTabletAccounts.id
.tablet_Transactions.account_id
to klucz obcy odnoszący się dotablet_BankAccounts.id
.tablet_SharedAccounts.account_id
to klucz obcy odnoszący się dotablet_BankAccounts.id
.
Backend w Lua
Funkcje serwera:
- 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)
- 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)
- 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)
- 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:
Panel główny:
- Wyświetlanie salda.
- Historia transakcji.
Formularz przelewu:
- Pola: Odbiorca, Kwota, Opis.
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
Autoryzacja użytkowników:
- Token JWT przesyłany z każdym zapytaniem do API.
Synchronizacja salda:
- Saldo synchronizowane w czasie rzeczywistym podczas transakcji.
Powiadomienia:
- Powiadomienia o każdej transakcji wysyłane do klienta w czasie rzeczywistym.