Đăng nhập

Mini Project: Ứng dụng Quản Lý Danh Bạ

Đây là lúc bạn biến kiến thức thành ứng dụng thực tế. Mini Project hôm nay sẽ giúp bạn luyện tập tất cả kỹ năng đã học: từ class, file, try-except, cho đến modulemenu.


✅ Mục tiêu

Xây dựng một chương trình đơn giản cho phép:

  • Thêm liên hệ mới (tên + số điện thoại)
  • Xem danh sách liên hệ
  • Tìm kiếm theo tên
  • Xóa liên hệ
  • Lưu và đọc dữ liệu từ file
  • Chia nhỏ thành module rõ ràng

📁 Cấu trúc project

danhba/
├── main.py
├── contact.py        ← class LienHe
├── db.py             ← lưu, đọc file

1. Bước 1 – Tạo class LienHe (📄 contact.py)

class LienHe:
    def __init__(self, ten, sdt):
        self.ten = ten
        self.sdt = sdt

    def hien_thi(self):
        print(f"{self.ten} - {self.sdt}")

    def to_line(self):
        return f"{self.ten},{self.sdt}"

    @staticmethod
    def from_line(line):
        parts = line.strip().split(",")
        return LienHe(parts[0], parts[1])

2. Bước 2 – Xử lý file (📄 db.py)

from contact import LienHe

def doc_danh_ba(ten_file):
    danh_sach = []
    try:
        with open(ten_file, "r") as f:
            for dong in f:
                lh = LienHe.from_line(dong)
                danh_sach.append(lh)
    except FileNotFoundError:
        pass
    return danh_sach

def ghi_danh_ba(ten_file, danh_sach):
    with open(ten_file, "w") as f:
        for lh in danh_sach:
            f.write(lh.to_line() + "\n")

3. Bước 3 – Giao diện người dùng (📄 main.py)

from contact import LienHe
import db

TEN_FILE = "danhba.txt"

def menu():
    print("\n====== QUẢN LÝ DANH BẠ ======")
    print("1. Xem danh sách")
    print("2. Thêm liên hệ")
    print("3. Tìm kiếm")
    print("4. Xóa liên hệ")
    print("0. Thoát")

def tim_kiem(danh_sach, tu_khoa):
    return [lh for lh in danh_sach if tu_khoa.lower() in lh.ten.lower()]

def main():
    danh_sach = db.doc_danh_ba(TEN_FILE)

    while True:
        menu()
        chon = input("Chọn chức năng: ")
        
        if chon == "1":
            print("\n--- Danh bạ ---")
            if not danh_sach:
                print("Danh bạ trống.")
            for lh in danh_sach:
                lh.hien_thi()

        elif chon == "2":
            ten = input("Nhập tên: ")
            sdt = input("Nhập số điện thoại: ")
            lh = LienHe(ten, sdt)
            danh_sach.append(lh)
            db.ghi_danh_ba(TEN_FILE, danh_sach)
            print("✅ Đã thêm liên hệ.")

        elif chon == "3":
            kw = input("Nhập từ khóa tìm: ")
            ket_qua = tim_kiem(danh_sach, kw)
            print(f"\n🔎 Kết quả ({len(ket_qua)}):")
            for lh in ket_qua:
                lh.hien_thi()

        elif chon == "4":
            ten_xoa = input("Nhập tên liên hệ cần xóa: ")
            moi = [lh for lh in danh_sach if lh.ten != ten_xoa]
            if len(moi) < len(danh_sach):
                danh_sach = moi
                db.ghi_danh_ba(TEN_FILE, danh_sach)
                print("🗑️ Đã xóa.")
            else:
                print("❗ Không tìm thấy.")

        elif chon == "0":
            print("Tạm biệt!")
            break
        else:
            print("❌ Không hợp lệ.")

if __name__ == "__main__":
    main()

Kỹ năng bạn đã luyện tập:

  • Tạo class và object
  • Làm việc với file .txt
  • Dùng try-except để xử lý lỗi
  • Dùng import module riêng
  • Tổ chức project theo kiểu chuyên nghiệp
  • Tạo menu và lặp thao tác với người dùng

Gợi ý nâng cao

Nếu bạn muốn thử thách thêm:

  • Sắp xếp danh bạ theo tên
  • Thêm xác thực số điện thoại
  • Ghi log thao tác người dùng vào log.txt
  • Dùng tabulate để in bảng đẹp
  • Xây giao diện với Tkinter (bài sau!)

Bài tiếp theo: Mini Project – Máy tính giao diện (GUI với Tkinter)
Bạn sẽ làm ứng dụng có giao diện thật, với nút bấm, ô nhập, hiển thị kết quả – giống một app mini!

Thảo luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.