게시글 작성하기

Apic·3일 전
0

코딩

목록 보기
22/24
# notice/board.py
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
        
        # self.Edit(board_list[sel])
        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)
# notice/member.py
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):
        # print(self.member_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)
# notice/main.py
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)
profile
코딩 공부하는 사람

0개의 댓글