最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python結合QT實現(xiàn)簡單的圖書管理系統(tǒng)

 更新時間:2026年02月25日 09:16:37   作者:忘憂記  
這篇文章主要介紹了一個基于Python和PyQt5的圖書管理系統(tǒng)開發(fā)教程,適合Python初學者學習,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下

適用對象:Python 初學者、剛接觸面向對象和 GUI 編程的同學

目標:帶你從零理解一個基于 PyQt5 的小型圖書管理系統(tǒng)架構與實現(xiàn)細節(jié)

一、項目整體結構概覽

我們這個系統(tǒng)由以下幾個核心模塊組成:

模塊功能
model/數(shù)據模型(User, Book, Role, Permission)
dao/數(shù)據訪問層(Database)
controller/控制邏輯(用戶、圖書、權限控制)
view/用戶界面(登錄、注冊、不同角色主窗口)
main.py程序入口

二、數(shù)據模型(Model)

1. 角色定義 ——role.py

class Role:
    ADMIN = "admin"
    TEACHER = "teacher"
    STUDENT = "student"
  • 這里用類變量模擬“枚舉”,避免魔法字符串。
  • 后續(xù)所有判斷角色的地方都用 Role.ADMIN 而不是 "admin",更安全、可讀性高。

2. 權限定義 ——permission.py

class Permission:
    ADD_BOOK = "add_book"
    DELETE_BOOK = "delete_book"
    IMPORT_BOOK = "import_book"
    EXPORT_BOOK = "export_book"

同樣是枚舉思想,定義系統(tǒng)支持的所有操作權限。

3. 用戶模型 ——user.py

class User:
    def __init__(self, id, username, role):
        self.id = id
        self.username = username
        self.role = role

封裝用戶基本信息,用于在程序中傳遞身份。

4. 圖書模型 ——book.py

class Book:
    def __init__(self, id, title, author, isbn, category):
        self.id = id
        self.title = title
        self.author = author
        self.isbn = isbn
        self.category = category

雖然當前代碼中沒直接用到 Book 類(因為數(shù)據庫返回的是字典),但保留它為未來擴展打基礎。

三、數(shù)據訪問層(DAO)——database.py

import sqlite3

class Database:
    def __init__(self, db_name="library.db"):
        self.conn = sqlite3.connect(db_name)
        self.conn.row_factory = sqlite3.Row  # ← 關鍵!讓結果像字典一樣訪問
        self.init_tables()

    def init_tables(self):
        # 創(chuàng)建 users 表
        self.conn.execute("""
            CREATE TABLE IF NOT EXISTS users(
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                username TEXT UNIQUE,
                password TEXT,
                role TEXT
            )
        """)
        # 創(chuàng)建 books 表
        self.conn.execute("""
            CREATE TABLE IF NOT EXISTS books(
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                title TEXT NOT NULL,
                author TEXT,
                isbn TEXT,
                category TEXT
            )
        """)
        self.conn.commit()

    def execute(self, sql, params=()):
        cursor = self.conn.cursor()
        cursor.execute(sql, params)
        self.conn.commit()
        return cursor

重點說明

  • 使用 SQLite 內嵌數(shù)據庫,無需額外安裝服務。
  • row_factory = sqlite3.Row 讓查詢結果可以通過 row["username"] 方式訪問,而不是 row[1],極大提升可讀性。
  • execute 方法統(tǒng)一處理 SQL 執(zhí)行 + 提交,避免忘記 commit。

四、用戶控制器 ——user_controller.py

import hashlib
from dao.database import Database
from model.user import User
from model.role import Role

class UserController:
    def __init__(self):
        self.db = Database()
        self.ensure_admin()  # 確保 admin 用戶存在

    def hash_password(self, password):
        return hashlib.sha256(password.encode()).hexdigest()

    def ensure_admin(self):
        cursor = self.db.execute("SELECT * FROM users WHERE username=?", ("admin",))
        if cursor.fetchone() is None:
            self.register("admin", "123456", Role.ADMIN)

    def register(self, username, password, role):
        if not username or not password:
            raise Exception("用戶名或密碼不能為空")
        self.db.execute("""
            INSERT INTO users(username, password, role)
            VALUES (?, ?, ?)
        """, (username, self.hash_password(password), role))

    def login(self, username, password):
        cursor = self.db.execute("SELECT * FROM users WHERE username=?", (username,))
        user = cursor.fetchone()
        if user and user["password"] == self.hash_password(password):
            return User(user["id"], user["username"], user["role"])
        return None

關鍵點解析

  • 密碼安全:使用 hashlib.sha256 對密碼哈希,絕不存明文密碼。
  • 自動創(chuàng)建管理員:第一次運行時自動創(chuàng)建 admin / 123456 賬號,方便測試。
  • 登錄驗證:比對哈希后的密碼,成功則返回 User 對象,失敗返回 None。
  • 異常處理:注冊時空用戶名/密碼會拋出異常(后續(xù) UI 會捕獲并提示)。

注意:123456 是弱密碼,實際項目應要求強密碼或首次登錄改密。

五、權限管理器 ——permission_manager.py

from model.role import Role
from model.permission import Permission

class PermissionManager:
    ROLE_PERMISSIONS = {
        Role.ADMIN: [
            Permission.ADD_BOOK,
            Permission.DELETE_BOOK,
            Permission.IMPORT_BOOK,
            Permission.EXPORT_BOOK
        ],
        Role.TEACHER: [Permission.ADD_BOOK],
        Role.STUDENT: []
    }

    @classmethod
    def has_permission(cls, role, permission):
        return permission in cls.ROLE_PERMISSIONS.get(role, [])

設計亮點

  • 權限配置集中在一個字典里,清晰直觀。
  • 使用 @classmethod,無需實例化即可調用:PermissionManager.has_permission(...)
  • 學生沒有任何權限,教師只能添加,管理員全有。

六、圖書控制器 ——book_controller.py

from dao.database import Database
from controller.permission_manager import PermissionManager
from model.permission import Permission

class BookController:
    def __init__(self, user):
        self.db = Database()
        self.user = user

    def add_book(self, title, author, isbn, category):
        if not PermissionManager.has_permission(self.user.role, Permission.ADD_BOOK):
            raise Exception("沒有權限")
        self.db.execute("""
            INSERT INTO books(title, author, isbn, category)
            VALUES (?, ?, ?, ?)
        """, (title, author, isbn, category))

    def delete_book(self, book_id):
        if not PermissionManager.has_permission(self.user.role, Permission.DELETE_BOOK):
            raise Exception("沒有權限")
        self.db.execute("DELETE FROM books WHERE id=?", (book_id,))

    def list_books(self):
        cursor = self.db.execute("SELECT * FROM books")
        return cursor.fetchall()

權限控制集成

  • 每個操作前先檢查權限,無權限則拋出異常。
  • 異常會被 UI 捕獲并彈窗提示(見后文)。

七、用戶界面(View)

1. 登錄窗口 ——login_window.py

from PyQt5.QtWidgets import *
from controller.user_controller import UserController
from view.register_window import RegisterWindow

class LoginWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("登錄")
        self.controller = UserController()
        # ... 布局代碼 ...
        self.user = None

    def login(self):
        user = self.controller.login(self.edit_user.text(), self.edit_pass.text())
        if user:
            self.user = user
            self.accept()  # 關閉對話框并返回 True
        else:
            QMessageBox.warning(self, "錯誤", "登錄失敗")

    def open_register(self):
        RegisterWindow().exec_()  # 模態(tài)彈出注冊窗口

要點

  • 繼承 QDialog,適合登錄/注冊這類臨時窗口。
  • accept() 表示“成功關閉”,main.py 中通過 if login.exec_(): 判斷是否登錄成功。
  • 密碼輸入框設置為密文:self.edit_pass.setEchoMode(QLineEdit.Password)

2. 注冊窗口 ——register_window.py

class RegisterWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.combo_role.addItems([Role.TEACHER, Role.STUDENT])  # 只能選教師或學生

    def register(self):
        self.controller.register(
            self.edit_user.text(),
            self.edit_pass.text(),
            self.combo_role.currentText()
        )
        QMessageBox.information(self, "成功", "注冊成功")
        self.accept()

限制:普通用戶不能注冊為管理員,防止權限提升。

3. 不同角色主窗口

學生窗口 ——student_window.py

  • 只有 刷新按鈕
  • 沒有添加/刪除按鈕(UI 層就隱藏了)
  • 即使通過其他方式調用 add_book,也會因權限不足被 BookController 攔截

教師窗口 ——teacher_window.py

  • 添加、刪除、刷新 按鈕
  • 但刪除時會觸發(fā)權限檢查 → 教師無 DELETE_BOOK 權限 → 拋出異常 → 彈窗“沒有權限”

重要:這里存在一個 UI 與權限不一致 的問題!教師界面上顯示了“刪除”按鈕,但點擊會報錯。更好的做法是:根據權限動態(tài)顯示按鈕

管理員窗口 ——admin_window.py

  • 只實現(xiàn)了“添加測試書”功能(硬編碼)
  • 實際應像教師窗口那樣彈出輸入框(當前是簡化版)

八、程序入口 ——main.py

import sys
from PyQt5.QtWidgets import QApplication
from view.login_window import LoginWindow
# ... 導入各角色窗口 ...

if __name__ == "__main__":
    app = QApplication(sys.argv)
    login = LoginWindow()
    if login.exec_():  # 如果登錄成功
        user = login.user
        if user.role == Role.ADMIN:
            window = AdminWindow(user)
        elif user.role == Role.TEACHER:
            window = TeacherWindow(user)
        else:
            window = StudentWindow(user)
        window.show()
        sys.exit(app.exec_())

流程

  • 啟動應用
  • 彈出登錄窗口
  • 登錄成功 → 根據角色打開對應主窗口
  • 進入事件循環(huán)

九、潛在問題與改進建議

1. 教師界面顯示了“刪除”按鈕但無權限

原因:UI 未根據權限動態(tài)調整

修復建議

# 在 TeacherWindow.__init__ 中
if PermissionManager.has_permission(user.role, Permission.DELETE_BOOK):
    btn_layout.addWidget(self.btn_delete)

2. 管理員窗口功能簡陋

當前 add_book 是硬編碼的,應改為彈窗輸入。

3. 密碼強度弱

admin 默認密碼 123456 不安全,應首次登錄強制修改。

4. 優(yōu)點總結

  • 分層清晰(Model / DAO / Controller / View)
  • 權限控制集中、可擴展
  • 使用 SQLite,零配置運行
  • 代碼簡潔,適合教學

十、如何運行

安裝依賴:

pip install PyQt5

將所有 .py 文件放在同一目錄

運行:

python main.py

首次運行會自動創(chuàng)建 library.dbadmin 賬號

結語

這個小項目雖然簡單,但涵蓋了:

  • 面向對象編程(OOP)
  • MVC 架構思想
  • 數(shù)據庫操作(SQLite)
  • GUI 開發(fā)(PyQt5)
  • 權限控制設計
  • 密碼安全基礎

非常適合 Python 初學者作為練手項目!你可以在此基礎上:

  • 添加“借閱/歸還”功能
  • 實現(xiàn)圖書搜索
  • 支持 Excel 導入導出(利用已有 IMPORT_BOOK / EXPORT_BOOK 權限)

記住:好的代碼 = 清晰的結構 + 明確的職責 + 安全的實踐。

以上就是python結合QT實現(xiàn)簡單的圖書管理系統(tǒng)的詳細內容,更多關于python圖書管理系統(tǒng)的資料請關注腳本之家其它相關文章!

相關文章

  • Python借助Free Spire.XLS for Python實現(xiàn)將JSON轉換為Excel

    Python借助Free Spire.XLS for Python實現(xiàn)將JSON轉換為Ex

    將 JSON 數(shù)據結構化轉換為 Excel 文件,是日常開發(fā)中高頻且基礎的需求,本文將介紹如何使用免費庫 Free Spire.XLS for Python 完成這一轉換任務,并提供處理復雜嵌套數(shù)據的實用方案,希望對大家有所幫助
    2026-02-02
  • Python數(shù)據挖掘Pandas詳解

    Python數(shù)據挖掘Pandas詳解

    這篇文章主要介紹了Python數(shù)據挖掘Pandas,pandas是基于numpy模塊構建的,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Matplotlib實戰(zhàn)之玫瑰圖繪制詳解

    Matplotlib實戰(zhàn)之玫瑰圖繪制詳解

    南丁格爾玫瑰圖是一種用極坐標下的柱狀圖或堆疊柱狀圖來展示數(shù)據的圖表,下面我們就來介紹一下如何使用Matplotlib繪制南丁格爾玫瑰圖,需要的可以參考下
    2023-08-08
  • Python基本類型的連接組合和互相轉換方式(13種)

    Python基本類型的連接組合和互相轉換方式(13種)

    這篇文章主要介紹了Python中基本類型的連接組合和互相轉換13種方式,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Python散點圖與折線圖繪制過程解析

    Python散點圖與折線圖繪制過程解析

    這篇文章主要介紹了Python散點圖與折線圖繪制過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Django與pyecharts結合的實例代碼

    Django與pyecharts結合的實例代碼

    這篇文章主要介紹了Django與pyecharts結合的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python繪制股票移動均線的實例

    Python繪制股票移動均線的實例

    今天小編就為大家分享一篇Python繪制股票移動均線的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python多進程fork()函數(shù)詳解

    Python多進程fork()函數(shù)詳解

    今天小編就為大家分享一篇關于Python多進程fork()函數(shù)詳解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Python pymysql向SQL語句中傳參的多種方法

    Python pymysql向SQL語句中傳參的多種方法

    這篇文章主要介紹了Python-pymysql如何向SQL語句中傳參,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Python結合Sprak實現(xiàn)計算曲線與X軸上方的面積

    Python結合Sprak實現(xiàn)計算曲線與X軸上方的面積

    這篇文章主要介紹了Python結合Sprak實現(xiàn)計算曲線與X軸上方的面積,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-02-02

最新評論

镇平县| 丹阳市| 手游| 屯留县| 朔州市| 德州市| 兰考县| 青川县| 修武县| 安溪县| 紫金县| 嘉善县| 牙克石市| 武陟县| 莱阳市| 鄂尔多斯市| 金山区| 英吉沙县| 鹿泉市| 蓝田县| 西安市| 临猗县| 大新县| 麻阳| 阆中市| 云霄县| 寻甸| 桂平市| 嘉黎县| 永济市| 越西县| 禄劝| 延吉市| 自贡市| 原平市| 滨海县| 襄樊市| 余庆县| 当雄县| 田林县| 沾化县|