# Page/member_manager_page.py
from PySide6.QtWidgets import QLineEdit, QPushButton, QMessageBox
from Pages.base_page import BasePage
class MemberManagerPage(BasePage):
def __init__(self, db):
super().__init__("회원 관리 (등록 및 조회)")
self.db = db
# 1) 입력(등록) 폼
self.input_id = QLineEdit(); self.input_id.setPlaceholderText("회원 ID")
self.input_name = QLineEdit(); self.input_name.setPlaceholderText("이름")
self.input_phone = QLineEdit(); self.input_phone.setPlaceholderText("연락처")
self.input_email = QLineEdit(); self.input_email.setPlaceholderText("이메일")
btn_add = QPushButton("회원 등록")
btn_add.setStyleSheet("background-color: #8e44ad; color: white; padding: 10px;")
btn_add.clicked.connect(self.add_member)
self.form_layout.addWidget(self.input_id)
self.form_layout.addWidget(self.input_name)
self.form_layout.addWidget(self.input_phone)
self.form_layout.addWidget(self.input_email)
self.form_layout.addWidget(btn_add)
# 2) 검색 폼
self.search_id = QLineEdit(); self.search_id.setPlaceholderText("회원 ID 검색")
self.search_name = QLineEdit(); self.search_name.setPlaceholderText("이름 검색")
self.search_phone = QLineEdit(); self.search_phone.setPlaceholderText("연락처 검색")
self.search_email = QLineEdit(); self.search_email.setPlaceholderText("이메일 검색")
btn_search = QPushButton("회원 검색")
btn_search.setStyleSheet("background-color: #27ae60; color: white; padding: 10px;")
btn_search.clicked.connect(self.search_member)
self.search_layout.addWidget(self.search_id)
self.search_layout.addWidget(self.search_name)
self.search_layout.addWidget(self.search_phone)
self.search_layout.addWidget(self.search_email)
self.search_layout.addWidget(btn_search)
# 3) 테이블
self.set_table(4, ["ID", "이름", "연락처", "이메일"])
# 4) 하단 버튼(중복 해결): BasePage 공통 버튼 재사용
self.btn_refresh.setText("새로고침")
self.btn_delete.setText("선택 회원 삭제")
# BasePage에 연결된 기본 훅을 끊고, 페이지 전용 로직으로 재연결
try:
self.btn_refresh.clicked.disconnect()
except TypeError:
pass
try:
self.btn_delete.clicked.disconnect()
except TypeError:
pass
self.btn_refresh.clicked.connect(self.load_members)
self.btn_delete.clicked.connect(self.delete_member)
# 최초 로딩
self.load_members()
def add_member(self):
member_id = self.input_id.text().strip()
name = self.input_name.text().strip()
phone = self.input_phone.text().strip()
email = self.input_email.text().strip()
data = (member_id, name, phone, email)
if "" in data:
self.msg_warn("경고", "모든 정보를 입력하세요.")
self.set_status("상태: 등록 실패(입력 누락)")
return
ok = self.db.execute_query(
"INSERT INTO members (member_id, name, mobile, email) VALUES (%s, %s, %s, %s)",
data
)
if ok:
self.msg_info("성공", "등록되었습니다.")
self.set_status("상태: 등록 성공")
self.load_members()
else:
self.msg_warn("실패", "이미 있는 ID입니다.")
self.set_status("상태: 등록 실패(중복)")
def delete_member(self):
row = self.current_row()
if row < 0:
self.msg_warn("안내", "삭제할 회원을 테이블에서 선택하세요.")
self.set_status("상태: 삭제 실패(선택 없음)")
return
mid_item = self.table.item(row, 0)
if mid_item is None:
self.msg_warn("오류", "선택된 행에서 회원 ID를 읽을 수 없습니다.")
self.set_status("상태: 삭제 실패(ID 없음)")
return
mid = mid_item.text()
reply = QMessageBox.question(
self,
"삭제 확인",
f"회원 ID '{mid}'를 삭제하시겠습니까?",
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
)
if reply != QMessageBox.StandardButton.Yes:
self.set_status("상태: 삭제 취소")
return
ok = self.db.execute_query("DELETE FROM members WHERE member_id = %s", (mid,))
if ok:
self.msg_info("성공", "삭제되었습니다.")
self.set_status("상태: 삭제 성공")
self.load_members()
else:
self.msg_warn("실패", "삭제에 실패했습니다.")
self.set_status("상태: 삭제 실패(DB 오류)")
def load_members(self):
rows = self.db.fetch_data("SELECT * FROM members")
self.fill_table(rows)
self.set_status(f"상태: 조회 완료({len(rows)}건)")
def search_member(self):
conditions = []
params = []
sid = self.search_id.text().strip()
sname = self.search_name.text().strip()
sphone = self.search_phone.text().strip()
semail = self.search_email.text().strip()
if sid:
conditions.append("member_id LIKE %s")
params.append(f"%{sid}%")
if sname:
conditions.append("name LIKE %s")
params.append(f"%{sname}%")
if sphone:
conditions.append("mobile LIKE %s")
params.append(f"%{sphone}%")
if semail:
conditions.append("email LIKE %s")
params.append(f"%{semail}%")
if not conditions:
self.load_members()
return
query = "SELECT * FROM members WHERE " + " AND ".join(conditions)
rows = self.db.fetch_data(query, tuple(params))
self.fill_table(rows)
self.set_status(f"상태: 검색 완료({len(rows)}건)")
(3) LibrarySystem.py 수정
...
class MemberManagerPage(BasePage):
def __init__(self, db): # main 에서 db 객체를 넘겨 받습니다.
super().__init__("회원 관리 (등록 및 조회)")
self.db = db
..
self.pages = QStackedWidget()
self.page_member = MemberManagerPage(db) # db 객체를 MemberManagerPage 로 전달합니다.
self.page_book = BookManagerPage()
self.page_circulation = CirculationPage()
(4) main.py 수정
# main.py
...
from DB.database_manager import DatabaseManager
if __name__ == "__main__":
...
db = DatabaseManager() # db 객체를 main 에서 생성하고
window = LibrarySystem(db) # LibrarySystem 으로 전달합니다.