-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathATM.py
667 lines (584 loc) · 30.7 KB
/
ATM.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
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
###############################################
# import required module
import sys
from PyQt5.QtWidgets import *
from PyQt5.Qt import *
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
import time
from module.LRUCache import *
from module.astro_secret import *
import module.linear_regression as lin
###############################################
loginCache = LRUCache(1)
countCache = LRUCache(2)
prev_user = ""
userTable = pd.read_csv('DB/userTable.csv')
full_reg_Table = pd.read_csv('DB/full_reg_table.csv')
loginCount = 0
loginAction = False # 로그인을 했는지 안했는지 알려주는 변수, 값이 False이면 로그인을 안했다는 뜻
loginedLine = -1 # 로그인한 계정이 몇번째 줄에 있는지 알려주는 변수, 값이 -1이면 로그인 안함
userID = [PWEncoding(Decoding(userTable['keyID'].iloc[i], userTable['Name'].iloc[i]))
for i in range(len(userTable.index))]
# 로그인 폼
class LoginForm(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Astro - Login")
self.resize(500, 600)
pixmap = QPixmap('img/logo.png')
lbl_img = QLabel()
lbl_img.setPixmap(pixmap)
# lbl_img = pixmap.scaled(300,300)
lbl_img.setMaximumWidth(300)
lbl_img.setMaximumHeight(300)
layout = QGridLayout()
layout2 = QHBoxLayout()
self.lbl_ID = QLabel('ID')
self.lbl_ID.setStyleSheet("color: #000000;"
"border-style: solid;"
"border-width: 2px;"
"border-color: #AADBDD;"
"background-color: #AADBDD;")
self.lbl_PW = QLabel('Password')
self.lbl_PW.setStyleSheet("color: #000000;"
"border-style: solid;"
"border-width: 2px;"
"border-color: #AADBDD;"
"background-color: #AADBDD;")
layout2.addWidget(lbl_img)
# label_name = QLabel("")
self.lineEdit_ID = QLineEdit()
self.lineEdit_ID.setPlaceholderText("아이디를 입력하세요.")
self.lineEdit_ID.setMaximumWidth(120)
layout.addWidget(self.lbl_ID, 1, 0)
# layout.addWidget(label_name, 0, 0)
layout.addWidget(self.lineEdit_ID, 1, 1)
# label_password = QLabel("")
self.lineEdit_password = QLineEdit()
self.lineEdit_password.setPlaceholderText("패스워드를 입력하세요.")
self.lineEdit_password.setMaximumWidth(120)
layout.addWidget(self.lbl_PW, 1, 2)
self.lineEdit_password.setEchoMode(QLineEdit.Password)
# layout.addWidget(label_password, 0, 2)
layout.addWidget(self.lineEdit_password, 1, 3)
layout3 = QHBoxLayout()
button_signup = QPushButton("로그인")
button_signup.setMaximumWidth(120)
button_signup.setMaximumHeight(80)
button_signup.clicked.connect(self.login)
layout3.addWidget(button_signup)
# layout3.setRowMinimumHeight(2, 1)
button_register = QPushButton("회원가입")
button_register.setMaximumWidth(120)
button_register.setMaximumHeight(80)
button_register.clicked.connect(self.register)
layout3.addWidget(button_register)
# layout3.setRowMinimumHeight(2, 2)
layout4 = QVBoxLayout()
layout4.addLayout(layout2)
layout4.addLayout(layout)
layout4.addLayout(layout3)
self.setLayout(layout4)
"""
# LRU Cache를 이용한 로그인 시스템
로직:
만약 잘못된 로그인 횟수가 5회 이상일 때
1초 딜레이
만약 ID 또는 Password를 입력하지 않고 로그인 버튼을 눌렀을 때
"ID 또는 PW를 입력해주세요."(이)라고 출력
만약 ID 또는 Password를 입력하고 로그인 버튼을 눌렀을 때
만약 loginCache.nodeMap에 입력한 ID값이라는 캐시에 카운트가 3 이상이라면
만약 userName과 입력한 ID값이 같다면
만약 loginCache.nodeMap에 userName이라는 key에 value값이 입력한 PW값을 해싱한 값과 같다면
loginAction을 True로 설정, loginCout를 0으로 설정
loginCache에 key는 입력한 ID값, value는 입력한 PW값을 해싱한 값 저장
'로그인에 성공했습니다.'(이)라고 출력
만약 loginCache.nodeMap에 userName이라는 key에 value값이 입력한 PW값을 해싱한 값과 다르면
'로그인에 실패했습니다.'(이)라고 출력
만약 loginCache.nodeMap에 입력한 ID값이라는 캐시에 카운트가 3 미만이라면
userTable에 index만큼 반복
enc_ID(이)라는 변수에 입력한 ID값을 암호화
enc_PW(이)라는 변수에 입력한 PW값을 해싱
만약 enc_ID[0](keyID) enc_ID[1](valueID)로 디코딩한 값이 userTable에 'keyID'(이)라는 열, i번째 행 데이터와 'Name'(이)라는 열, i번째 행 데이터로 디코딩한 값과 같다면
만약 enc_PW값이 입력한 PW값을 해싱한 값과 같다면
loginAction을 True로 설정, loginLine을 i로 설정과 함께 "로그인에 성공했습니다"(이)라고 출력
만약 enc_PW값이 입력한 PW값을 해싱한 값과 다르다면
'로그인에 실패했습니다.'(이)라고 출력
"""
def login(self):
msg = QMessageBox()
start = time.time()
global prev_user, loginCount, loginAction, loginedLine
if loginCount >= 5:
time.sleep(1)
if not self.lineEdit_ID.text() or not self.lineEdit_password.text():
loginCount += 1
msg.setText('ID 또는 PW를 입력해주세요.')
msg.exec_()
else:
# Cache Login
if loginCache.nodeMap.get(self.lineEdit_ID.text(), [-1, 0])[1] >= 3:
if prev_user == self.lineEdit_ID.text():
if loginCache.nodeMap.get(prev_user, [-1, 0])[0] == PWEncoding(self.lineEdit_password.text()):
loginAction = True
loginCount = 0
loginCache.put(self.lineEdit_ID.text(),
PWEncoding(self.lineEdit_password.text()))
print("Cache Login time :", time.time() - start)
msg.setText('로그인에 성공했습니다.')
msg.exec_()
self.gomain()
self.close() # 로그인 폼 끄기
else:
loginCount += 1
msg.setText('로그인에 실패했습니다.')
msg.exec_()
# Default Login
else:
for i in range(len(userTable.index)):
enc_ID = Encoding(self.lineEdit_ID.text())
enc_PW = PWEncoding(self.lineEdit_password.text())
if Decoding(enc_ID[0], enc_ID[1]) == Decoding(userTable['keyID'].iloc[i],
userTable['Name'].iloc[i]):
if enc_PW == userTable['Pw'].iloc[i]:
loginAction = True
loginedLine = i
prev_user = Decoding(
userTable['keyID'].iloc[i], userTable['Name'].iloc[i])
loginCache.put(prev_user, userTable['Pw'].iloc[i])
loginCount = 0
print("Login time :", time.time() - start)
msg.setText('로그인에 성공했습니다.')
msg.exec_()
self.gomain()
self.suggest()
self.close() # 로그인 폼 끄기
else:
loginCount += 1
msg.setText('로그인에 실패했습니다.')
msg.exec_()
break
# 메인폼으로 가기 위한 시스템
def gomain(self):
msg = QMessageBox()
self.main = MainForm() # 팝업 회원가입 폼
self.main.setGeometry(QRect(100, 100, 180, 500)) # 팝업
self.main.show()
def suggest(self):
msg = QMessageBox()
if loginAction == False:
msg.setText("로그인이 필요합니다.")
msg.exec_()
else:
usersum = lin.linear_regression_suggest(full_reg_Table, 'Age', 'Money', 'Credit_level', 'Grade',
userTable['Age'].iloc[loginedLine],
int(Decoding(
userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])),
userTable['Rate'].iloc[loginedLine])
if round(usersum) <= 1:
res = "햇살론"
elif 1 < round(usersum) <= 2:
res = "금리 4% 인생핀다론"
elif 2 < round(usersum) <= 3:
res = "우리자유적금"
elif 3 < round(usersum) <= 4:
res = "우리적금"
elif 4 < round(usersum) <= 5:
res = "우리큐브"
elif 5 < round(usersum):
res = "두루두루정기예금"
msg.setText(self.lineEdit_ID.text() + "님, " + res + " 상품은 어떠신가요?")
msg.exec_()
def register(self):
msg = QMessageBox()
self.signup = SignUpForm() # 팝업 회원가입 폼
self.signup.setGeometry(QRect(100, 100, 400, 200)) # 팝업
self.signup.show() # 회원가입 폼 표시
# 회원가입 폼
class SignUpForm(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Astro - SignUp")
self.resize(300, 500)
layout = QGridLayout()
label_name = QLabel("ID")
self.lineEdit_ID = QLineEdit()
self.lineEdit_ID.setPlaceholderText("아이디를 입력하세요.")
layout.addWidget(label_name, 0, 0)
layout.addWidget(self.lineEdit_ID, 0, 1)
label_password = QLabel("Password")
self.lineEdit_password = QLineEdit()
self.lineEdit_password.setPlaceholderText("패스워드를 입력하세요.")
layout.addWidget(label_password, 1, 0)
layout.addWidget(self.lineEdit_password, 1, 1)
label_password_check = QLabel("Password 확인")
self.lineEdit_password_check = QLineEdit()
self.lineEdit_password_check.setPlaceholderText("패스워드를 다시 입력하세요.")
layout.addWidget(label_password_check, 2, 0)
layout.addWidget(self.lineEdit_password_check, 2, 1)
label_age = QLabel("나이")
self.lineEdit_age = QLineEdit()
self.lineEdit_age.setPlaceholderText("나이를 입력하세요.")
layout.addWidget(label_age, 3, 0)
layout.addWidget(self.lineEdit_age, 3, 1)
button_signup = QPushButton("회원가입")
button_signup.clicked.connect(self.signup)
layout.addWidget(button_signup, 4, 1)
layout.setRowMinimumHeight(4, 40)
self.setLayout(layout)
"""
# 회원가입 시스템
로직:
만약 ID 또는 Password를 입력하지 않고 회원가입 버튼을 눌렀다면
"정보를 모두 입력해주세요"(이)라고 출력
만약 ID 또는 Password를 입력하고 회원가입 버튼을 눌렀다면
만약 입력한 ID값이 userTable에 'Name'(이)라는 열에 있다면
"이미 있는 아이디입니다"(이)라고 출력
만약 입력한 PW값과 입력한 re_PW값이 같지 않다면
"두 비밀번호가 일치하지 않습니다."(이)라고 출력
만약 입력한 ID값이 userTable에 'Name'(이)라는 열에 없다면
입력한 나이값을 int형으로 형변환 하는 과정에서 문제가 발생하지 않았을 때
새로운 계좌번호를 저장할 newAccli를 선언
무한 반복
0부터 18까지 반복
만약 i가 4 또는 9 또는 14일 경우
newAccli에 "-" 추가
만약 i가 4 또는 9 또는 14가 아닐 경우
newAccli에 1부터 9까지의 랜덤 숫자 저장
입력한 나이값을 int형으로 형변환 하는 과정에서 문제가 발생했을 때
"나이를 잘못 입력하셨습니다"(이)라고 출력
만약 newAccli가 userTable에 'accNum'(이)라는 열에 없다면
ID라는 변수에 입력한 ID값을 인코딩
이때 발생한 key값과 value값을 각각 keyID, valueID로 저장
PW라는 변수에 입력한 PW값을 인코딩
이때 발생한 key값과 value값을 각각 keyPW, valuePW로 저장
userinformation이라는 변수 판다스 데이터프레임 함수를 이용하여 'Name' 열에는 valueID를, 'PW' 열에는 valuePW를, 'Money' 열에는 0을, 'Age' 열에는 입력한 나이값을, 'accNum' 열에는 newAccli를, 'keyID' 열에는 keyID를, 'keyPW' 열에는 keyPW을 저장
무한 반복문 종료
"회원가입에 성공했습니다."(이)라고 출력
"""
def signup(self):
msg = QMessageBox()
global userTable
if not self.lineEdit_ID.text() or not self.lineEdit_password.text() or not self.lineEdit_password_check.text() or not self.lineEdit_age.text():
msg.setText('정보를 모두 입력해주세요')
msg.exec_()
else:
for i in range(len(userID)):
if PWEncoding(self.lineEdit_ID.text()) in userID:
msg.setText('이미 있는 아이디입니다.')
msg.exec_()
return
if self.lineEdit_password.text() != self.lineEdit_password_check.text():
msg.setText('두 비밀번호가 일치하지 않습니다.')
msg.exec_()
return
elif self.lineEdit_ID.text() not in Decoding(userID[i][1], userID[i][0]):
try:
lineEdit_age = int(self.lineEdit_age.text())
except:
msg.setText('나이를 잘못 입력하셨습니다')
msg.exec_()
return
newAccli = ""
for i in range(3):
newAccli += str(random.randint(1000, 9999)) + "-"
newAccli += str(random.randint(1000, 9999))
if newAccli not in str(userTable['accNum']):
ID = Encoding(self.lineEdit_ID.text())
PW = PWEncoding(self.lineEdit_password.text())
money = Encoding("0")
userinformation = pd.DataFrame(
[{'Name': ID[1], 'Pw': PW, 'Money': money[1], 'Age': lineEdit_age, 'Rate': 6, 'accNum': newAccli, 'keyID': ID[0], 'keyMoney': money[0]}])
userTable = pd.concat(
[userTable, userinformation], ignore_index=True)
msg.setText('회원가입에 성공했습니다.')
msg.exec_()
self.close()
# 로그인 폼
class MainForm(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Astro - ATM")
self.resize(180, 500)
layout = QGridLayout()
toplayout = QHBoxLayout()
# 조우식 잡다한버튼
button_login = QPushButton("로그아웃")
button_login.clicked.connect(self.logout)
layout.addWidget(button_login, 3, 1)
layout.setRowMinimumHeight(2, 40)
button_in = QPushButton("입금")
button_in.setMaximumWidth(80)
button_in.clicked.connect(self.inMoney)
layout.addWidget(button_in, 1, 0)
layout.setRowMinimumHeight(2, 40)
button_out = QPushButton("출금")
button_out.setMaximumWidth(80)
button_out.clicked.connect(self.outMoney)
layout.addWidget(button_out, 1, 1)
layout.setRowMinimumHeight(2, 40)
button_borrow = QPushButton("대출")
button_borrow.setMaximumWidth(80)
button_borrow.clicked.connect(self.loanMoney)
layout.addWidget(button_borrow, 3, 0)
layout.setRowMinimumHeight(2, 40)
button_trans = QPushButton("이체")
button_trans.setMaximumWidth(100)
button_trans.setMaximumHeight(100)
button_trans.setStyleSheet("background-color : #AADBDD;"
"border-radius: 50%;"
"width: 100px;"
"height: 100px;")
button_trans.clicked.connect(self.trans)
toplayout.addWidget(button_trans)
# layout.setRowMinimumHeight(2, 40)
button_count = QPushButton("잔액조회")
button_count.setMaximumWidth(80)
button_count.clicked.connect(self.count)
layout.addWidget(button_count, 2, 0)
layout.setRowMinimumHeight(2, 40)
button_creditrating = QPushButton("신용 조회")
button_creditrating.setMaximumWidth(80)
button_creditrating.clicked.connect(self.creditrating)
layout.addWidget(button_creditrating, 2, 1)
layout.setRowMinimumHeight(2, 40)
mainlayout = QVBoxLayout()
mainlayout.addLayout(toplayout)
mainlayout.addLayout(layout)
self.setLayout(mainlayout)
# 로그아웃 시스템
def logout(self):
global loginedLine, loginAction
msg = QMessageBox()
msg.setText("로그아웃되었습니다.")
loginAction = False # 로그인 액션 초기화
loginedLine = -1 # 로그인라인 초기화
self.loginform = LoginForm() # 로그인 폼
self.loginform.setGeometry(QRect(100, 100, 500, 600))
self.loginform.show() # 로그인 폼 표시
self.close() # 메인폼 끄기
msg.exec_()
"""
# 이체 시스템
로직:
만약 로그인이 안되어 있으면
로그인이 필요하다고 출력
만약 로그인이 되어 있으면
user는 inputAccNum에 상대방 계좌번호 입력
만약 inputAccNum이 userTable에 'accNum'(이)라는 열에 있다면
보낼 금액을 transMoney에 저장
transMoney가 int형으로 형변환 하는 과정에서 아무 문제도 발생하지 않았을 때
만약 transMoney가 user가 가진 금액보다 크다면
잔액이 부족하다고 출력
만약 transMoney가 이체 가능한 최소 비용보다 작다면
보내지 못한다고 출력
아무 문제가 없다면
userTable에 index만큼 반복
만약 inputAccNum이 userTable에 'accNum'(이)라는 열에 i번째 행 데이터와 같다면
반복문 탈출
userTable에 'Money'라는 열에 loginedLine번째 행 데이터를 userTable에 'Money'라는 열에 loginedLine번째 행 데이터 - transMoney로 저장
userTable에 'Money'라는 열에 i번째 행 데이터를 userTable에 'Money'라는 열에 i번째 행 데이터 + transMoney로 저장
DB폴더에 trans.log 파일을 만들고 이 파일을 file(이)라는 변수로 저장
이체할 때마다 돈을 보낸 사람 -> 돈을 받은 사람 : 금액 형식으로 저장
ex) 6852-2588-5453-1555->9532-6723-8939-7668:1233
"inputAccNum번호로 transMoney원 이체 완료했습니다."라고 출력
transMoney가 int형으로 형변환 하는 과정에서 valueError가 발생했을 때
"정확한 금액을 입력해주세요"(이)라고 출력
만약 inputAccNum이 userTable에 'accNum'(이)라는 열에 없다면
"해당 계좌는 존재하지 않습니다."(이)라고 출력
"""
def trans(self):
msg = QMessageBox()
if loginAction == False:
msg.setText("로그인이 필요합니다.")
msg.exec_()
else:
inputAccNum, dialog = QInputDialog.getText(
self, 'Input Dialog', '보낼 사람의 계좌를 입력해주세요. :')
if not inputAccNum:
msg.setText("계좌번호를 정확히 입력해 주세요")
msg.exec_()
else:
if inputAccNum in str(userTable['accNum']):
transMoney, dialog1 = QInputDialog.getText(
self, 'Input Dialog', '얼마를 보내시겠습니까? :')
try:
transMoney = int(transMoney)
except:
msg.setText("이체할 금액을 정확히 입력해 주세요")
msg.exec_()
return
if transMoney > int(Decoding(userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])):
msg.setText("잔액이 부족합니다.")
msg.exec_()
elif transMoney < 100:
msg.setText("이체 가능한 최소 비용은 100원입니다.")
msg.exec_()
else:
for i in range(len(userTable.index)):
if inputAccNum == userTable['accNum'].iloc[i]:
break
userTable['Money'].iloc[loginedLine] = Encoding(str(int(Decoding(
userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])) - transMoney))[1]
userTable['keyMoney'].iloc[loginedLine] = Encoding(str(int(Decoding(
userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])) - transMoney))[0]
userTable['Money'].iloc[i] = Encoding(str(int(Decoding(
userTable['keyMoney'].iloc[i], userTable['Money'].iloc[i])) + transMoney))[1]
userTable['keyMoney'].iloc[i] = Encoding(str(int(Decoding(
userTable['keyMoney'].iloc[i], userTable['Money'].iloc[i])) + transMoney))[0]
with open("DB/trans.log", "a", encoding="UTF8") as file:
tmp = Encoding(str(transMoney))
res = uniqueEncode(
userTable['accNum'].iloc[loginedLine], inputAccNum, tmp[0], tmp[1])
file.write(f"{res}\n")
msg.setText(
f"{inputAccNum}번호로 {transMoney}원 이체 완료했습니다.")
msg.exec_()
else:
msg.setText("해당 계좌는 존재하지 않습니다.")
msg.exec_()
"""
# LRU Cache를 이용한 잔액조회 시스템
로직:
만약 로그인이 안되어 있으면
로그인이 필요하다고 출력
만약 로그인이 되어 있으면
userName을 userTable에 'Name'(이)라는 열, loginedLine번째 행 데이터를 저장
userMoney를 userTable에 'Money'(이)라는 열, loginedLine번째 행 데이터를 저장
만약 countCache.nodeMap에 userName이라는 key에 카운트가 3 이상이라면
countCache에 저장되어 있던 userName이라는 key에 value값을 출력
만약 countCache.nodeMap에 userName이라는 key에 카운트가 3 이상이 아니라면
userMoney 출력
countCache에 key가 userName이고, value가 userMoney인 값을 저장
"""
def count(self):
msg = QMessageBox()
start = time.time()
if loginAction == False:
msg.setText("로그인이 필요합니다.")
msg.exec_()
else:
userName = userTable['Name'].iloc[loginedLine]
countCache.put(userName, Decoding(
userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine]))
if countCache.nodeMap.get(userName, [-1, 0])[1] >= 3:
msg.setText(
f"{str(countCache.get(userName))}원 있습니다.")
print("Cache Count time :", time.time() - start)
msg.exec_()
else:
time.sleep(1)
msg.setText(
f"{Decoding(userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])}원 있습니다.")
print("Count time :", time.time() - start)
msg.exec_()
"""
# 출금 시스템
# 주석 추가 부탁
"""
def outMoney(self):
global userTable, loginedLine
msg = QMessageBox()
if loginAction == False:
msg.setText("로그인이 필요합니다.")
msg.exec_()
else:
try:
outMoney, dialog = QInputDialog.getText(
self, 'Input Dialog', '출금할 금액 :')
if int(outMoney) > int(Decoding(userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])):
msg.setText("잔액이 부족합니다.")
msg.exec_()
else:
enco = Encoding(str(int(Decoding(
userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])) - int(outMoney)))
userTable['Money'].iloc[loginedLine] = enco[1]
userTable['keyMoney'].iloc[loginedLine] = enco[0]
msg.setText(f"{outMoney}원을 출금 완료했습니다.")
msg.exec_()
except ValueError:
msg.setText("정확한 금액을 입력해주세요")
msg.exec_()
"""
# 입금 시스템
로직:
만약 로그인이 안되어 있으면
로그인이 필요하다고 출력
만약 로그인이 되어 있으면
inMoney에 입금할 금액 저장
inMoney를 int형으로 형변환 하는 과정에서 아무 문제도 발생하지 않았을 때
userTable에 'Money'열, loginedLine번째 행 데이터에서 inMoney값을 더함
"입금 완료"(이)라고 출력
inMoney를 int형으로 형변환 하는 과정에서 valueError가 발생했을 때
"정확한 금액을 입력해주세요"(이)라고 출력
"""
def inMoney(self):
global userTable, loginedLine
msg = QMessageBox()
if loginAction == False:
msg.setText("로그인이 필요합니다.")
msg.exec_()
else:
try:
inMoney, dialog = QInputDialog.getText(
self, 'Input Dialog', '입금할 금액 :')
enco = Encoding(str(int(Decoding(
userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])) + int(inMoney)))
userTable['Money'].iloc[loginedLine] = enco[1]
userTable['keyMoney'].iloc[loginedLine] = enco[0]
msg.setText(inMoney + "원을 입금 완료했습니다.")
msg.exec_()
except ValueError:
msg.setText("정확한 금액을 입력해주세요")
msg.exec_()
"""
# 대출 시스템
# 주석 추가 부탁
"""
def loanMoney(self):
msg = QMessageBox()
if loginAction == False:
msg.setText("로그인이 필요합니다.")
msg.exec_()
else:
try:
loan, dialog = QInputDialog.getText(
self, 'Input Dialog', '대출 금액 :')
# userTable['Money'].iloc[loginedLine] += int(loan)
userTable['Money'].iloc[loginedLine] = Encoding(str(int(Decoding(
userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])) + int(loan)))[1]
userTable['keyMoney'].iloc[loginedLine] = Encoding(str(int(Decoding(
userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine])) + int(loan)))[0]
msg.setText(loan+"원 대출완료")
msg.exec_()
msg.setText("당신의 금리: %f" % userTable['Rate'].iloc[loginedLine])
msg.exec_()
except ValueError:
msg.setText("정확한 금액을 입력해주세요")
msg.exec_()
"""
# 선형 회귀를 이용한 신용 등급 조회 시스템
# 주석 추가 부탁
"""
def creditrating(self):
msg = QMessageBox()
if loginAction == False:
msg.setText("로그인이 필요합니다.")
msg.exec_()
else:
if lin.linear_regression(userTable, 'Age', 'keyMoney', 'Money', userTable['Age'].iloc[loginedLine], int(Decoding(userTable['keyMoney'].iloc[loginedLine], userTable['Money'].iloc[loginedLine]))) == 1:
userTable['Rate'].iloc[loginedLine] = 2.8
msg.setText("당신의 신용등급은 높습니다.")
msg.exec_()
else:
userTable['Rate'].iloc[loginedLine] = 4.8
msg.setText("당신의 신용등급은 낮습니다.")
msg.exec_()
if __name__ == '__main__':
app = QApplication(sys.argv)
form = LoginForm()
form.show()
sys.exit(app.exec_())