-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmainwindow.py
343 lines (292 loc) · 15.2 KB
/
mainwindow.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'main.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
#
# WARNING! All changes made in this file will be lost!
from datetime import datetime
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QDesktopWidget
from dialogutil import open_dialog
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.accountButton = QtWidgets.QPushButton(self.centralwidget)
self.accountButton.setGeometry(QtCore.QRect(50, 20, 89, 25))
self.accountButton.setObjectName("accountButton")
self.statementButton = QtWidgets.QPushButton(self.centralwidget)
self.statementButton.setGeometry(QtCore.QRect(210, 20, 131, 25))
self.statementButton.setObjectName("statementButton")
self.transactionButton = QtWidgets.QPushButton(self.centralwidget)
self.transactionButton.setGeometry(QtCore.QRect(420, 20, 141, 25))
self.transactionButton.setObjectName("transactionButton")
self.signoutButton = QtWidgets.QPushButton(self.centralwidget)
self.signoutButton.setGeometry(QtCore.QRect(640, 20, 89, 25))
self.signoutButton.setObjectName("signoutButton")
self.phoneLabel = QtWidgets.QLabel(self.centralwidget)
self.phoneLabel.setGeometry(QtCore.QRect(70, 160, 151, 20))
self.phoneLabel.setObjectName("phoneLabel")
self.moneyLabel = QtWidgets.QLabel(self.centralwidget)
self.moneyLabel.setGeometry(QtCore.QRect(350, 160, 67, 17))
self.moneyLabel.setObjectName("moneyLabel")
self.operationLabel = QtWidgets.QLabel(self.centralwidget)
self.operationLabel.setGeometry(QtCore.QRect(570, 160, 81, 17))
self.operationLabel.setObjectName("operationLabel")
self.sendPhone = QtWidgets.QLineEdit(self.centralwidget)
self.sendPhone.setGeometry(QtCore.QRect(70, 220, 151, 25))
self.sendPhone.setObjectName("sendPhone")
self.requestPhone = QtWidgets.QLineEdit(self.centralwidget)
self.requestPhone.setGeometry(QtCore.QRect(70, 290, 151, 25))
self.requestPhone.setObjectName("requestPhone")
self.sendMoney = QtWidgets.QLineEdit(self.centralwidget)
self.sendMoney.setGeometry(QtCore.QRect(320, 220, 113, 25))
self.sendMoney.setObjectName("sendMoney")
self.requestMoney = QtWidgets.QLineEdit(self.centralwidget)
self.requestMoney.setGeometry(QtCore.QRect(320, 290, 113, 25))
self.requestMoney.setObjectName("requestMoney")
self.sendButton = QtWidgets.QPushButton(self.centralwidget)
self.sendButton.setGeometry(QtCore.QRect(550, 220, 111, 25))
self.sendButton.setObjectName("sendButton")
self.requestButton = QtWidgets.QPushButton(self.centralwidget)
self.requestButton.setGeometry(QtCore.QRect(550, 290, 111, 25))
self.requestButton.setObjectName("requestButton")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(260, 80, 67, 17))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(400, 80, 67, 17))
self.label_2.setObjectName("label_2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 28))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.accountButton.setText(_translate("MainWindow", "Account"))
self.statementButton.setText(_translate("MainWindow", "Check Statements"))
self.transactionButton.setText(_translate("MainWindow", "Seach Transactions"))
self.signoutButton.setText(_translate("MainWindow", "Sign Out"))
self.phoneLabel.setText(_translate("MainWindow", "Phone number/Email"))
self.moneyLabel.setText(_translate("MainWindow", "Money"))
self.operationLabel.setText(_translate("MainWindow", "Operation"))
self.sendButton.setText(_translate("MainWindow", "Send Money"))
self.requestButton.setText(_translate("MainWindow", "Request Money"))
self.label.setText(_translate("MainWindow", "Hello!"))
self.label_2.setText(_translate("MainWindow", "User"))
class MainMenu(Ui_MainWindow):
def __init__(self, userId, db_conn):
super(MainMenu, self).__init__()
self.userId = userId
self.mainwindow=QMainWindow()
self.setupUi(self.mainwindow)
self.center_window()
self.conn = db_conn
cursor = self.conn.cursor()
login = '''
SELECT UserName from User
WHERE UserID = ?
'''
cursor.execute(login, [self.userId])
uname = cursor.fetchall()
self.label_2.setText(uname[0][0])
# 绑定按钮点击后调用的函数
self.sendButton.clicked.connect(self.sendMoneyFun)
self.requestButton.clicked.connect(self.requestMoneyFun)
def center_window(self):
desktop = QDesktopWidget()
screen_rect = desktop.screenGeometry()
x = (screen_rect.width() - self.mainwindow.width()) // 2
y = (screen_rect.height() - self.mainwindow.height()) // 2
self.mainwindow.move(x, y)
# 在下面编写按钮点击处理逻辑
def sendMoneyFun(self):
# 获取文本输入框的值 输入文本框是QLineEdit对象
phoneOrEmail = self.sendPhone.text()
money_input = self.sendMoney.text()
if not phoneOrEmail:
open_dialog("用户不能为空", 100, 50, 300, 200)
print("Phone or email cannot be empty.")
return
try:
money = int(money_input) if money_input else 0
except ValueError:
open_dialog("请输入有效金额", 100, 50, 300, 200)
print("Invalid money input. Please enter a valid number.")
return
# 读取数据, call conn.commit() if make any changes to the database
cursor = self.conn.cursor()
# Step 1: Get the sender's information. i.e., self.userId
sender_id = self.userId
sendType = 1
# Step 2: Determine the receiver's information based on phoneOrEmail
cursor.execute(
"SELECT UserID FROM User WHERE UserID IN (SELECT UserID FROM Email WHERE Address = ? OR UserID IN (SELECT UserID FROM Phone WHERE Number = ?))",
(phoneOrEmail, phoneOrEmail))
receiver_info = cursor.fetchone()
receiver_id = sender_id
if receiver_info is None:
sendType = 2
else:
receiver_id = receiver_info[0]
# Step 3: Check the sender's bank accounts in priority order
cursor.execute("""
SELECT UBRelation.UserID, UBRelation.AccountNumber, BankAccount.Balance
FROM UBRelation
JOIN BankAccount ON UBRelation.AccountNumber = BankAccount.AccountNumber
WHERE UBRelation.UserID = ?
ORDER BY BankAccount.Priority
""", (sender_id,))
user_banks = cursor.fetchall()
for user_bank in user_banks:
_, account_number, balance = user_bank
if balance >= money: # Check if the account balance is enough
# Step 4: Create a new transaction record
cursor.execute("""
INSERT INTO Transactions (InitiatorUserID, Type, TotalAmount)
VALUES (?, ?, ?)
""", (sender_id, 'Send', money))
transaction_id = cursor.lastrowid
if sendType == 2:
cursor.execute("""
INSERT INTO Payment (SenderUserID, ReceiverUserID, TransactionID, Amount, Memo, PayTime, IsSuccessful)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (sender_id, receiver_id, transaction_id, money,
f"{phoneOrEmail}", datetime.now(), 2))
cursor.execute("""
UPDATE BankAccount
SET Balance = Balance - ?
WHERE AccountNumber = ?
""", (money, account_number))
self.conn.commit()
open_dialog("转账成功", 125, 50, 300, 200)
print(f"Transaction successful! {money} sent from {sender_id} to new user using account {account_number}")
return
# Step 5: Create a new payment record
cursor.execute("""
INSERT INTO Payment (SenderUserID, ReceiverUserID, TransactionID, Amount, Memo, PayTime, IsSuccessful)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (sender_id, receiver_id, transaction_id, money,
f"Payment from {sender_id} to {receiver_id}", datetime.now(), 1))
# Step 6: Update sender's bank account balance
cursor.execute("""
UPDATE BankAccount
SET Balance = Balance - ?
WHERE AccountNumber = ?
""", (money, account_number))
# Step 7: Update receiver's bank account balance (using the bank account with the highest priority)
cursor.execute("""
UPDATE BankAccount
SET Balance = Balance + ?
WHERE AccountNumber = (
SELECT BankAccount.AccountNumber
FROM UBRelation
JOIN BankAccount ON UBRelation.AccountNumber = BankAccount.AccountNumber
WHERE UBRelation.UserID = ?
ORDER BY BankAccount.Priority DESC
LIMIT 1
)
""", (money, receiver_id))
# Commit the changes
self.conn.commit()
open_dialog("转账成功", 125, 50, 300, 200)
print(f"Transaction successful! {money} sent from {sender_id} to {receiver_id} using account {account_number}")
return
open_dialog("余额不足", 125, 50, 300, 200)
print("No suitable bank account found with enough balance.")
print("sendMoney")
def requestMoneyFun(self):
# Get values from text input boxes (QLineEdit objects)
phoneOrEmail = self.requestPhone.text()
money_input = self.requestMoney.text()
if not phoneOrEmail:
open_dialog("用户不能为空", 100, 50, 300, 200)
print("Phone or email cannot be empty.")
return
try:
money = int(money_input) if money_input else 0
except ValueError:
open_dialog("请输入有效金额", 100, 50, 300, 200)
print("Invalid money input. Please enter a valid number.")
return
# Read data, call conn.commit() if there are any changes to the database
cursor = self.conn.cursor()
# Step 1: Get the receiver's information, i.e., self.userId
receiver_id = self.userId
# Step 2: Determine the sender's information based on phoneOrEmail
cursor.execute("""
SELECT UserID
FROM User
WHERE UserID IN (SELECT UserID FROM Email WHERE Address = ? OR UserID IN (SELECT UserID FROM Phone WHERE Number = ?))
""", (phoneOrEmail, phoneOrEmail))
sender_info = cursor.fetchone()
if sender_info is None:
open_dialog("用户不存在", 125, 50, 300, 200)
print("Sender not found.")
return
sender_id = sender_info[0]
# Step 3: Check the sender's bank accounts in priority order
cursor.execute("""
SELECT UBRelation.UserID, UBRelation.AccountNumber, BankAccount.Balance, BankAccount.Priority
FROM UBRelation
JOIN BankAccount ON UBRelation.AccountNumber = BankAccount.AccountNumber
WHERE UBRelation.UserID = ? AND BankAccount.Priority = -1
""", (sender_id,))
user_banks = cursor.fetchall()
for user_bank in user_banks:
_, account_number, balance, priority = user_bank
if balance >= money: # Check if the account balance is enough
# Step 4: Update sender's bank account balance
cursor.execute("""
UPDATE BankAccount
SET Balance = Balance - ?
WHERE AccountNumber = ?
""", (money, account_number))
# Step 5: Update receiver's bank account balance (using the bank account with the highest priority)
cursor.execute("""
UPDATE BankAccount
SET Balance = Balance + ?
WHERE AccountNumber = (
SELECT BankAccount.AccountNumber
FROM UBRelation
JOIN BankAccount ON UBRelation.AccountNumber = BankAccount.AccountNumber
WHERE UBRelation.UserID = ?
ORDER BY BankAccount.Priority DESC
LIMIT 1
)
""", (money, receiver_id))
# Step 6: Create a new transaction record
cursor.execute("""
INSERT INTO Transactions (InitiatorUserID, Type, TotalAmount)
VALUES (?, ?, ?)
""", (receiver_id, 'Request', money))
transaction_id = cursor.lastrowid
# Step 7: Create a new payment record
cursor.execute("""
INSERT INTO Payment (SenderUserID, ReceiverUserID, TransactionID, Amount, Memo, PayTime, IsSuccessful)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (sender_id, receiver_id, transaction_id, money,
f"Payment from {sender_id} to {receiver_id}", datetime.now(), 1))
# Commit the changes
self.conn.commit()
open_dialog("请求成功", 125, 50, 300, 200)
print(
f"Request successful! {money} requested by {receiver_id} from {sender_id} using account {account_number}")
return
open_dialog("对方余额不足", 100, 50, 300, 200)
print("No suitable bank account found with enough balance.")
print("requestMoney")
def clear(self):
self.sendPhone.clear()
self.sendMoney.clear()
self.requestPhone.clear()
self.requestMoney.clear()