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

yanyan

By yanyan

Đăng ngày Tháng 7 24, 2025

Đâ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.

[global_subscribe_form]

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