Skip to content

Commit a225fef

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

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+2419
-8
lines changed
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)