Skip to content

Commit a225fef

Browse files
committed
Some Extra proects
1 parent 1c03f56 commit a225fef

59 files changed

Lines changed: 2419 additions & 8 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
49.2 KB
Loading
101 KB
Loading
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import json
2+
import os
3+
4+
USER_FILE = "users.json"
5+
6+
7+
def load_users():
8+
"""Loads user data from JSON."""
9+
if not os.path.exists(USER_FILE):
10+
return {"users": {}}
11+
12+
with open(USER_FILE, "r") as file:
13+
return json.load(file)
14+
15+
16+
def save_users(data):
17+
"""Writes user data to JSON."""
18+
with open(USER_FILE, "w") as file:
19+
json.dump(data, file, indent=4)
20+
21+
22+
class BankAccount:
23+
def __init__(self, user_data):
24+
self.user_id = user_data["user_id"]
25+
self.username = user_data["username"]
26+
self.account_name = user_data["account_name"]
27+
self.account_number = user_data["account_number"]
28+
self.account_type = user_data["account_type"]
29+
self.balance = user_data["balance"]
30+
31+
def deposit(self, amount):
32+
if amount <= 0:
33+
raise ValueError("Deposit amount must be positive")
34+
35+
self.balance += amount
36+
self.update_balance()
37+
return self.balance
38+
39+
def withdraw(self, amount):
40+
if amount <= 0:
41+
raise ValueError("Withdrawal amount must be positive")
42+
if amount > self.balance:
43+
raise ValueError("Insufficient balance")
44+
45+
self.balance -= amount
46+
self.update_balance()
47+
return self.balance
48+
49+
def update_balance(self):
50+
"""Updates balance in JSON."""
51+
data = load_users()
52+
if self.user_id in data["users"]:
53+
data["users"][self.user_id]["balance"] = self.balance
54+
save_users(data)
55+
56+
def get_balance(self):
57+
return self.balance
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import tkinter as tk
2+
from tkinter import ttk, messagebox
3+
from PIL import Image, ImageTk
4+
from user_auth import authenticate, signup
5+
from banking import BankAccount, load_users
6+
7+
class BankingApp:
8+
def __init__(self, root):
9+
self.root = root
10+
self.root.title("banking_app")
11+
self.root.geometry("600x500")
12+
self.root.resizable(False, False)
13+
14+
self.current_user = None
15+
self.bank_account = None
16+
17+
self.load_background()
18+
self.login_screen()
19+
20+
def load_background(self):
21+
self.bg_image = Image.open("1.jpg")
22+
self.bg_image = self.bg_image.resize((600, 500), Image.LANCZOS)
23+
self.bg_photo = ImageTk.PhotoImage(self.bg_image)
24+
25+
self.canvas = tk.Canvas(self.root, width=600, height=500)
26+
self.canvas.pack(fill="both", expand=True)
27+
self.canvas.create_image(0, 0, image=self.bg_photo, anchor="nw")
28+
29+
def clear_screen(self):
30+
for widget in self.root.winfo_children():
31+
widget.destroy()
32+
self.load_background()
33+
34+
def login_screen(self):
35+
self.clear_screen()
36+
37+
login_frame = tk.Frame(self.root, bg="white", padx=20, pady=20)
38+
login_frame.place(relx=0.5, rely=0.5, anchor="center")
39+
40+
ttk.Label(login_frame, text="User ID:", background="white").grid(row=1, column=0, pady=5, sticky="e")
41+
self.user_id_entry = ttk.Entry(login_frame)
42+
self.user_id_entry.grid(row=1, column=1, pady=5)
43+
44+
ttk.Label(login_frame, text="Password:", background="white").grid(row=2, column=0, pady=5, sticky="e")
45+
self.password_entry = ttk.Entry(login_frame, show="*")
46+
self.password_entry.grid(row=2, column=1, pady=5)
47+
48+
ttk.Button(login_frame, text="Login", command=self.authenticate_user).grid(row=3, column=1, pady=5)
49+
ttk.Button(login_frame, text="Sign Up", command=self.signup_screen).grid(row=4, column=1, pady=5)
50+
51+
def authenticate_user(self):
52+
user_id = self.user_id_entry.get()
53+
password = self.password_entry.get()
54+
55+
user_data = authenticate(user_id, password)
56+
if user_data:
57+
self.current_user = user_data["username"]
58+
self.bank_account = BankAccount({"user_id": user_id, **user_data})
59+
messagebox.showinfo("Login Successful", f"Welcome, {self.current_user}!")
60+
else:
61+
messagebox.showerror("Login Failed", "Invalid User ID or Password")
62+
63+
def signup_screen(self):
64+
self.clear_screen()
65+
66+
signup_frame = tk.Frame(self.root, bg="white", padx=20, pady=20)
67+
signup_frame.place(relx=0.5, rely=0.5, anchor="center")
68+
69+
ttk.Label(signup_frame, text="Username:", background="white").grid(row=1, column=0, pady=5, sticky="e")
70+
self.signup_username = ttk.Entry(signup_frame)
71+
self.signup_username.grid(row=1, column=1, pady=5)
72+
73+
ttk.Label(signup_frame, text="Password:", background="white").grid(row=2, column=0, pady=5, sticky="e")
74+
self.signup_password = ttk.Entry(signup_frame, show="*")
75+
self.signup_password.grid(row=2, column=1, pady=5)
76+
77+
ttk.Label(signup_frame, text="Account Type:", background="white").grid(row=3, column=0, pady=5, sticky="e")
78+
self.account_type = ttk.Combobox(signup_frame, values=["Savings", "Checking"])
79+
self.account_type.grid(row=3, column=1, pady=5)
80+
self.account_type.current(0)
81+
82+
ttk.Button(signup_frame, text="Register", command=self.register_user).grid(row=4, column=1, pady=10)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import tkinter as tk
2+
from gui import BankingApp
3+
4+
if __name__ == "__main__":
5+
root = tk.Tk()
6+
app = BankingApp(root)
7+
root.mainloop()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import pytest
2+
from user_auth import signup, authenticate
3+
4+
def test_signup():
5+
user_id = signup("testuser", "testpass", "Savings")
6+
assert isinstance(user_id, str) and len(user_id) == 4
7+
8+
def test_login_success():
9+
user_id = signup("validuser", "validpass", "Checking")
10+
user_data = authenticate(user_id, "validpass")
11+
assert user_data is not None
12+
13+
def test_login_failure():
14+
assert authenticate("9999", "wrongpass") is None
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
import os
2+
import json
3+
import random
4+
import tkinter as tk
5+
from tkinter import ttk, messagebox
6+
from PIL import Image, ImageTk
7+
import pytest
8+
9+
USER_FILE = "users.json"
10+
11+
# ---------------- USER MANAGEMENT ----------------
12+
def load_users():
13+
if not os.path.exists(USER_FILE):
14+
with open(USER_FILE, "w") as file:
15+
json.dump({"users": {}}, file, indent=4)
16+
with open(USER_FILE, "r") as file:
17+
return json.load(file)
18+
19+
def save_users(data):
20+
with open(USER_FILE, "w") as file:
21+
json.dump(data, file, indent=4)
22+
23+
def authenticate(user_id, password):
24+
users = load_users().get("users", {})
25+
return users.get(user_id) if user_id in users and users[user_id]["password"] == password else None
26+
27+
def signup(username, password, account_type):
28+
users_data = load_users()
29+
while True:
30+
user_id = str(random.randint(1000, 9999))
31+
if user_id not in users_data["users"]:
32+
break
33+
account_number = str(random.randint(1000000000, 9999999999))
34+
users_data["users"][user_id] = {
35+
"username": username,
36+
"password": password,
37+
"account_name": f"{username}'s Account",
38+
"account_number": account_number,
39+
"account_type": account_type,
40+
"balance": 0.0
41+
}
42+
save_users(users_data)
43+
return user_id
44+
45+
# ---------------- BANK ACCOUNT CLASS ----------------
46+
class BankAccount:
47+
def __init__(self, user_id, user_data):
48+
self.user_id = user_id
49+
self.username = user_data["username"]
50+
self.account_name = user_data["account_name"]
51+
self.account_number = user_data["account_number"]
52+
self.account_type = user_data["account_type"]
53+
self.balance = user_data["balance"]
54+
55+
def deposit(self, amount):
56+
if amount <= 0:
57+
raise ValueError("Deposit amount must be positive")
58+
self.balance += amount
59+
self.update_balance()
60+
return self.balance
61+
62+
def withdraw(self, amount):
63+
if amount <= 0:
64+
raise ValueError("Withdrawal amount must be positive")
65+
if amount > self.balance:
66+
raise ValueError("Insufficient balance")
67+
self.balance -= amount
68+
self.update_balance()
69+
return self.balance
70+
71+
def update_balance(self):
72+
data = load_users()
73+
if self.user_id in data["users"]:
74+
data["users"][self.user_id]["balance"] = self.balance
75+
save_users(data)
76+
77+
def get_balance(self):
78+
return self.balance
79+
80+
# ---------------- GUI APPLICATION ----------------
81+
class BankingApp:
82+
def __init__(self, root):
83+
self.root = root
84+
self.root.title("banking_app")
85+
self.root.geometry("600x500")
86+
self.current_user = None
87+
self.bank_account = None
88+
self.load_background()
89+
self.login_screen()
90+
91+
def load_background(self):
92+
self.bg_image = Image.open("1.jpg").resize((600, 500))
93+
self.bg_photo = ImageTk.PhotoImage(self.bg_image)
94+
self.canvas = tk.Canvas(self.root, width=600, height=500)
95+
self.canvas.pack(fill="both", expand=True)
96+
self.canvas.create_image(0, 0, image=self.bg_photo, anchor="nw")
97+
98+
def clear_screen(self):
99+
for widget in self.root.winfo_children():
100+
widget.destroy()
101+
self.load_background()
102+
103+
def login_screen(self):
104+
self.clear_screen()
105+
frame = tk.Frame(self.root)
106+
frame.place(relx=0.5, rely=0.5, anchor="center")
107+
ttk.Label(frame, text="User ID:").grid(row=0, column=0)
108+
self.user_id_entry = ttk.Entry(frame)
109+
self.user_id_entry.grid(row=0, column=1)
110+
ttk.Label(frame, text="Password:").grid(row=1, column=0)
111+
self.password_entry = ttk.Entry(frame, show="*")
112+
self.password_entry.grid(row=1, column=1)
113+
ttk.Button(frame, text="Login", command=self.authenticate_user).grid(row=2, column=1)
114+
ttk.Button(frame, text="Sign Up", command=self.signup_screen).grid(row=3, column=1)
115+
116+
def authenticate_user(self):
117+
user_id = self.user_id_entry.get()
118+
password = self.password_entry.get()
119+
user_data = authenticate(user_id, password)
120+
if user_data:
121+
self.current_user = user_data["username"]
122+
self.bank_account = BankAccount(user_id, user_data)
123+
messagebox.showinfo("Login Successful", f"Welcome, {self.current_user}!")
124+
else:
125+
messagebox.showerror("Login Failed", "Invalid User ID or Password")
126+
127+
def signup_screen(self):
128+
self.clear_screen()
129+
frame = tk.Frame(self.root)
130+
frame.place(relx=0.5, rely=0.5, anchor="center")
131+
ttk.Label(frame, text="Username:").grid(row=0, column=0)
132+
self.signup_username = ttk.Entry(frame)
133+
self.signup_username.grid(row=0, column=1)
134+
ttk.Label(frame, text="Password:").grid(row=1, column=0)
135+
self.signup_password = ttk.Entry(frame, show="*")
136+
self.signup_password.grid(row=1, column=1)
137+
ttk.Label(frame, text="Account Type:").grid(row=2, column=0)
138+
self.account_type = ttk.Combobox(frame, values=["Savings", "Checking"])
139+
self.account_type.grid(row=2, column=1)
140+
self.account_type.current(0)
141+
ttk.Button(frame, text="Register", command=self.register_user).grid(row=3, column=1)
142+
143+
def register_user(self):
144+
username = self.signup_username.get()
145+
password = self.signup_password.get()
146+
account_type = self.account_type.get()
147+
if username and password:
148+
user_id = signup(username, password, account_type)
149+
messagebox.showinfo("Success", f"Account created! Your User ID is: {user_id}")
150+
self.login_screen()
151+
else:
152+
messagebox.showerror("Error", "Please fill all fields")
153+
154+
# ---------------- MAIN ----------------
155+
if __name__ == "__main__":
156+
root = tk.Tk()
157+
app = BankingApp(root)
158+
root.mainloop()
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"users": {
3+
"1": {
4+
"username": "admin",
5+
"password": "123",
6+
"account_name": "Admin Account",
7+
"account_number": "1234567890",
8+
"account_type": "Savings",
9+
"balance": 5000.0
10+
}
11+
}
12+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import json
2+
import os
3+
import random
4+
5+
USER_FILE = "users.json"
6+
7+
8+
def load_users():
9+
"""Loads user data from JSON or creates an empty file if missing."""
10+
if not os.path.exists(USER_FILE):
11+
with open(USER_FILE, "w") as file:
12+
json.dump({"users": {}}, file, indent=4)
13+
14+
with open(USER_FILE, "r") as file:
15+
return json.load(file)
16+
17+
18+
def save_users(data):
19+
"""Writes user data to JSON safely."""
20+
with open(USER_FILE, "w") as file:
21+
json.dump(data, file, indent=4)
22+
23+
24+
def authenticate(user_id, password):
25+
"""Authenticates user using ID and password."""
26+
users = load_users().get("users", {})
27+
return users.get(user_id) if user_id in users and users[user_id]["password"] == password else None
28+
29+
30+
def signup(username, password, account_type):
31+
"""Registers a new user and stores data in JSON."""
32+
users_data = load_users()
33+
34+
# Generate unique user ID
35+
while True:
36+
user_id = str(random.randint(1000, 9999))
37+
if user_id not in users_data["users"]:
38+
break
39+
40+
account_number = str(random.randint(1000000000, 9999999999))
41+
42+
users_data["users"][user_id] = {
43+
"username": username,
44+
"password": password,
45+
"account_name": f"{username}'s Account",
46+
"account_number": account_number,
47+
"account_type": account_type,
48+
"balance": 0.0
49+
}
50+
51+
save_users(users_data)
52+
return user_id

0 commit comments

Comments
 (0)