from datetime import datetime
import os
import pickle
from tabulate import tabulate
import pandas as pd
class Board:
def __init__(self, id, index, name):
self.board_id = None
self.board_title = None
self.board_content = None
self.board_date = None
self.board_views = None
self.board_writter = None
self.data_path = './notice_board/saves/board_data.bin'
self.board_data = None
self.board_write_id = id
self.board_write_index = index
self.baord_write_name = name
self.now_board = None
self.InitData()
def Write(self):
self.board_title = input('제목: ')
self.board_content = input('내용: ')
now = datetime.now()
self.board_date = f"{now.year}-{now.month:02d}-{now.day:02d} {now.hour:02d}:{now.minute:02d}:{now.second:02d}"
self.board_views = 1
self.UpdateBoard()
def EditDisplay(self):
board_key = '_'.join([str(self.board_write_index), str(self.board_write_id), self.baord_write_name])
if any(board_key in key for key in self.board_data.keys()):
board_list = [value for key, value in self.board_data.items() if board_key in key]
return board_list
else:
print('게시글이 없습니다.')
def DeleteBoard(self):
board = self.FindEdit()
print('삭제하시겠습니까?')
while True:
sel = input("1. yes 2. no")
if not sel in ["1", "2"]:
print('잘못 입력하셨습니다.')
else:
break
board_key = '_'.join([str(board['writter_index']), board['writter_id'], board['writter_name']])+str(board['board_id'])
del self.board_data[board_key]
self.sync_board()
def sync_board(self):
with open(self.data_path, 'wb') as f:
pickle.dump(self.board_data, f)
def FindEdit(self):
board_list = self.EditDisplay()
print('='*30)
board_df = []
for idx, board in enumerate(board_list):
board_datas = {
'No': idx+1,
'게시글 번호': board['board_id'],
'제목': board['title'],
'내용':board['content'],
'작성일자': board['date'],
'작성자': board['writter_name']
}
board_df.append(board_datas)
board_df = pd.DataFrame(board_df)
print(tabulate(board_df, tablefmt='plain', showindex=False, headers=board_df.columns), '\n')
while True:
sel = input('게시글 번호를 선택해 주세요')
sel = int(sel)
if not sel in list(board_df['게시글 번호']):
print('잘못 입력하셨습니다.')
else:
break
return board_list[sel-1]
def Edit(self):
board = self.FindEdit()
print('='*30)
print('1. 제목 수정')
print('2. 내용 수정')
print('='*30)
while True:
sel = input()
if not sel in ["1", "2"]:
print('잘못 입력하셨습니다.')
else:
break
board_key = '_'.join([str(board['writter_index']), board['writter_id'], board['writter_name']])+str(board['board_id'])
if sel == "1":
title = input('새로운 제목을 입력하세요: ')
self.board_data[board_key]['title'] = title
elif sel == "2":
title = input('새로운 내용을 입력하세요: ')
self.board_data[board_key]['content'] = title
self.sync_board()
def UpdateBoard(self):
self.board_id = len(self.board_data) + 1
board_key = '_'.join([str(self.board_write_index), str(self.board_write_id), self.baord_write_name])
if any(board_key in key for key in self.board_data.keys()):
key_num = sum(1 for key in self.board_data.keys() if board_key in key) + 1
board_key += str(key_num)
else:
board_key += '0'
self.board_data[board_key] = {
'title': self.board_title,
'content': self.board_content,
'date': self.board_date,
'view': self.board_views,
'writter_name': self.baord_write_name,
'writter_id': self.board_write_id,
'writter_index': self.board_write_index,
'board_id': self.board_id
}
with open(self.data_path, 'wb') as f:
pickle.dump(self.board_data, f)
def ViewBoard(self):
board_df = []
for idx, board in enumerate(self.board_data.values()):
board_datas = {
'No': idx+1,
'게시글 번호': board['board_id'],
'제목': board['title'],
'내용줄임':board['content'][:10]+'...',
'작성일자': board['date'] ,
'작성자': board['writter_name'],
'내용':board['content'],
'조회수': board['view']
}
board_df.append(board_datas)
board_df = pd.DataFrame(board_df)
print(tabulate(board_df.iloc[:,:-2], tablefmt='plain', showindex=False, headers=board_df.columns), '\n')
while True:
sel = input('게시글 번호를 선택해 주세요')
sel = int(sel)
if not sel in list(board_df['게시글 번호']):
print('잘못 입력하셨습니다.')
else:
break
print(f"제목: {board_df.iloc[sel-1]['제목']}\t 작성 일자: {board_df.iloc[sel-1]['작성일자']}")
print(f"작성자: {board_df.iloc[sel-1]['작성자']}")
print(f"내용: {board_df.iloc[sel-1]['내용']}\t 조회수: {board_df.iloc[sel-1]['조회수']}")
for key, value in self.board_data.items():
if value['board_id'] == board_df.iloc[sel-1]['게시글 번호']:
self.board_data[key]['view'] += 1
self.sync_board()
def InitData(self):
if not os.path.exists(self.data_path) or os.path.getsize(self.data_path) <= 0:
with open (self.data_path, 'wb') as f:
pickle.dump({}, f)
self.board_data = {}
else:
with open(self.data_path, 'rb') as f:
self.board_data = pickle.load(f)
import pickle
import os
import re
from board import Board
class Member:
def __init__(self, type):
self.member_number = None
self.member_id = None
self.member_pw = None
self.member_name = None
self.member_phone = None
self.member_email = None
self.member_index = None
self.member_data = None
self.data_path = './notice_board/saves/member_data.bin'
self.now_member = None
self.InitData()
if type == '1':
self.SignIn()
print('로그인')
self.Login()
elif type == '2':
self.Login()
def Login(self):
AGAIN = 1
while AGAIN:
self.member_id = input('아이디 입력: ')
if not self.member_id in self.member_data.keys():
print('잘못된 아이디 입니다.')
else:
AGAIN = 0
AGAIN = 1
while AGAIN:
self.member_pw = input('비밀번호 입력: ')
if not self.member_pw == self.member_data[self.member_id]['password']:
print('잘못된 비밀번호 입니다.')
else:
AGAIN = 0
self.member_id = self.member_data[self.member_id]['id']
self.member_pw = self.member_data[self.member_id]['password']
self.member_name = self.member_data[self.member_id]['name']
self.member_phone = self.member_data[self.member_id]['phone']
self.member_email = self.member_data[self.member_id]['email']
self.member_index = self.member_data[self.member_id]['index']
print('로그인 되었습니다.')
print('='*30)
print('1. 회원 정보 관리')
print('2. 게시글 작성')
print('3. 게시글 수정')
print('4. 게시글 삭제')
print('5. 게시글 조회')
print('='*30)
while True:
sel = input()
if not sel in ["1", "2", "3", "4", "5"]:
print('잘못된 형식입니다.')
else:
temp_func = {"1": self.AfterLoginDisplay, "2": self.WriteBoard, "3": self.EditBoard, "4": self.DeleteBoard, "5": self.ViewBoard}
break
temp_func[sel]()
def WriteBoard(self):
board = Board(id=self.member_id, index=self.member_index, name=self.member_name)
board.Write()
def EditBoard(self):
board = Board(id=self.member_id, index=self.member_index, name=self.member_name)
board.Edit()
def DeleteBoard(self):
board = Board(id=self.member_id, index=self.member_index, name=self.member_name)
board.DeleteBoard()
def ViewBoard(self):
board = Board(id=self.member_id, index=self.member_index, name=self.member_name)
board.ViewBoard()
def SignIn(self):
AGAIN = 1
while AGAIN:
self.member_id = input('아이디 입력')
AGAIN = self.CheckDuplication(self.member_id) or self.CheckId(self.member_id)
AGAIN = 1
while AGAIN:
self.member_pw = input('비밀번호 입력(문자, 숫자 포함 6자 이상)')
AGAIN = self.CheckDuplication(self.member_pw) or self.CheckPW(self.member_pw)
AGAIN = 1
while AGAIN:
self.member_name = input('이름 입력')
AGAIN = self.CheckDuplication(self.member_name)
AGAIN = 1
while AGAIN:
self.member_phone = input('전화번호 입력')
AGAIN = self.CheckDuplication(self.member_phone) or self.CheckPhone(self.member_phone)
AGAIN = 1
while AGAIN:
self.member_email = input('이메일 입력')
AGAIN = self.CheckDuplication(self.member_email) or self.CheckEmail(self.member_email)
self.UpdateData(self.member_id, self.member_pw, self.member_name, self.member_phone, self.member_email)
def AfterLoginDisplay(self):
print('='*30)
print('1. 회원정보 수정')
print('2. 회원정보 탈퇴')
print('='*30)
while True:
sel = input()
if not sel in ["1", "2"]:
print('잘못된 형식입니다.')
else:
temp_func = {"1": self.EditMember, "2": self.DeleteMember}
break
temp_func[sel]()
def DeleteMember(self):
print('탈퇴 하시겠습니까?')
while True:
sel = input('1. yes 2. no')
if not sel in ["1", "2"]:
print('잘못된 형식입니다.')
else:
del self.member_data[self.member_id]
break
self.UpdateData(None, None, None, None, None)
def EditMember(self):
print('='*30)
print(f"1. 닉네임: {self.member_name}")
print(f" 아이디: {self.member_id}")
print(f"2. 비밀번호: {self.member_pw}")
print(f"3. 전화번호: {self.member_phone}")
print(f"4. 이메일: {self.member_email}")
print('='*30, '\n\n')
n = input('변경하고 싶은 정보')
self.EditData(n)
def EditData(self, num):
AGAIN = 1
while AGAIN:
if num == "1":
self.member_name = input('닉네임 입력')
AGAIN = self.CheckDuplication(self.member_name)
self.member_data[self.member_id]['name'] = self.member_name
elif num == "2":
self.member_pw = input('비밀번호 입력')
AGAIN = self.CheckDuplication(self.member_pw) or self.CheckPW(self.member_pw)
self.member_data[self.member_id]['password'] = self.member_pw
elif num == "3":
self.member_pw = input('전화번호 입력')
AGAIN = self.CheckDuplication(self.member_phone) or self.CheckPhone(self.member_phone)
self.member_data[self.member_id]['phone'] = self.member_phone
elif num == "4":
AGAIN = self.CheckDuplication(self.member_email) or self.CheckEmail(self.member_email)
self.member_data[self.member_id]['email'] = self.member_email
self.UpdateData(self.member_id, self.member_pw, self.member_name, self.member_phone, self.member_email)
def CheckId(self, id):
if len(id) < 5:
print('잘못된 형식입니다.')
return 1
def CheckPhone(self, phone):
if not self.member_data:
return 0
phone_regex = r'^(\+?\d{1,3})?[-\s]?(\d{2,4})[-\s]?(\d{3,4})[-\s]?(\d{4})$'
if re.match(phone_regex, phone):
formatted_phone = f"{phone[:3]}-{phone[3:7]}-{phone[7:]}"
self.member_phone = formatted_phone
return 0
print('잘못된 형식입니다.')
return 1
def CheckEmail(self, email):
if not self.member_data:
return 0
email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
if re.match(email_regex, email) is not None:
return 0
print('잘못된 이메일 형식입니다.')
return 1
def CheckPW(self, password):
if not self.member_data:
return 0
password_regex = r'^(?=.*[a-zA-Z])(?=.*\d).{6,}$'
if re.match(password_regex, password) is not None:
return 0
print('잘못된 비밀번호 형식입니다.')
return 1
def LoginInDisplay(self):
pass
def CheckDuplication(self, data):
if not self.member_data:
return 0
for member in self.member_data.values():
if data in member.values():
print('중복됨')
return 1
return 0
def InitData(self):
if not os.path.exists(self.data_path) or os.path.getsize(self.data_path) <= 0:
with open(self.data_path, 'wb') as f:
pickle.dump({}, f)
self.member_data = {}
else:
with open(self.data_path, 'rb') as f:
self.member_data = pickle.load(f)
def UpdateData(self, *args):
id, pw, name, phone, email = args
if not id is None:
if not self.member_data:
self.member_index = 1
else:
self.member_index = len(self.member_data) + 1
self.member_data[id] = {
'index': self.member_index,
'id': id,
'password': pw,
'name': name,
'phone': phone,
'email': email
}
with open(self.data_path, 'wb') as f:
pickle.dump(self.member_data, f)
def output_data(self):
with open(self.data_path, 'rb') as f:
data = pickle.load(f)
print(data)
from board import Board
from member import Member
if __name__ == '__main__':
print('='*30)
print('1. 회원가입')
print('2. 로그인')
print('3. 종료하기')
while True:
sel = input()
if not sel in ["1", "2", "3"]:
print('잘못된 형식입니다.')
else:
break
member = Member(sel)