繼續通過Trae向DeepSeek發問并修改程序,實現程序運行時生成數據庫,用戶在系統登錄頁面輸入用戶名和密碼后,控制器通過模型查詢用戶數據庫表來驗證用戶名和密碼,驗證通過后顯示登錄成功頁面,驗證失敗則顯示登錄失敗頁面。
目錄結果如下圖所示:
mvctest2/
│── model.py # 數據模型(SQLite數據庫操作)
│── view.py # 視圖界面
│── controller.py # 控制器
│── main.py # 程序入口
│── database.py # 數據庫初始化腳本
│── user.db # 數據庫初始化腳本首次運行后自動生成
1. 數據庫初始化腳本 (database.py)
#database.py
# 數據庫模塊 (Model) - 處理數據存儲和查詢import sqlite3
from pathlib import PathDB_PATH = Path(__file__).parent / "users.db"def init_db():"""初始化數據庫和用戶表"""conn = sqlite3.connect(DB_PATH)cursor = conn.cursor()# 創建用戶表cursor.execute("""CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT UNIQUE NOT NULL,password TEXT NOT NULL)""")# 插入測試用戶數據test_users = [('admin', '123456'),('user1', 'password1'),('user2', 'password2')]cursor.executemany("INSERT OR IGNORE INTO users (username, password) VALUES (?, ?)",test_users)conn.commit()conn.close()if __name__ == "__main__":init_db()print(f"數據庫已初始化,路徑: {DB_PATH}")
2.?模型文件 model.py
#model.py
# 模型 (Model)
import sqlite3
from pathlib import Path
from database import DB_PATH
from PyQt5.QtCore import QObject, pyqtSignalclass UserModel(QObject):#login_success = pyqtSignal(str) # 登錄成功信號,帶用戶名參數#login_failed = pyqtSignal() # 登錄失敗信號def __init__(self):super().__init__()self.conn = sqlite3.connect(DB_PATH)# 模型方法:驗證用戶憑據def query(self, username, password):"""驗證用戶憑據"""cursor = self.conn.cursor()sql = "SELECT username FROM users WHERE username=? AND password=?"cursor.execute(sql,(username, password))return cursor.fetchone() is not Nonedef __del__(self):"""關閉數據庫連接"""self.conn.close()
3.視圖文件view.py
# view.py
#
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QMessageBox)
from PyQt5.QtCore import Qtclass LoginView(QWidget):def __init__(self, controller=None):super().__init__()self.controller = controllerself.init_ui()# 初始化UI界面 def init_ui(self):self.setWindowTitle('系統登錄')self.resize(300, 200)layout = QVBoxLayout()# 用戶名輸入self.lbl_user = QLabel('用戶名:')self.txt_user = QLineEdit()layout.addWidget(self.lbl_user)layout.addWidget(self.txt_user)# 密碼輸入self.lbl_pass = QLabel('密碼:')self.txt_pass = QLineEdit()self.txt_pass.setEchoMode(QLineEdit.Password)layout.addWidget(self.lbl_pass)layout.addWidget(self.txt_pass)# 登錄按鈕self.btn_login = QPushButton('登錄')self.btn_login.clicked.connect(self.on_login)layout.addWidget(self.btn_login)# 登錄狀態顯示self.lbl_status = QLabel()self.lbl_status.setAlignment(Qt.AlignCenter)layout.addWidget(self.lbl_status)self.setLayout(layout)# 登錄按鈕點擊事件處理 def on_login(self):username = self.txt_user.text()password = self.txt_pass.text()if self.controller:self.controller.handle_login(username, password)# 顯示登錄成功或失敗消息 def show_success(self, username):self.lbl_status.setText(f"歡迎, {username}!")self.lbl_status.setStyleSheet("color: green")# 顯示登錄失敗消息 def show_failure(self):self.lbl_status.setText("用戶名或密碼錯誤!")self.lbl_status.setStyleSheet("color: red")# 顯示登錄頁面 def show(self):super().show()self.txt_user.setFocus()
4.控制器文件 controller.py
# controller.py
# 控制器 (Controller)
class LoginController:def __init__(self, model, view):self.model = modelself.view = viewself.view.controller = self # 設置view的controller引用# 處理登錄邏輯 def run(self):self.view.show() # 直接調用view的show方法# 處理登錄按鈕點擊事件 def handle_login(self, username, password):if self.model.query(username, password):self.view.show_success(username)else:self.view.show_failure()
5.程序運行入口文件mail.py
# main.py
# 主程序入口
import sys
from PyQt5.QtWidgets import QApplication
from model import UserModel
from view import LoginView
from controller import LoginController
from database import init_dbdef main():# 初始化數據庫init_db()#創建QT應用 app = QApplication(sys.argv) # 創建QApplication實例# 初始化MVC組件model = UserModel()view = LoginView()controller = LoginController(model, view)# 啟動應用controller.run()sys.exit(app.exec_())if __name__ == "__main__":main()
運行可以成功。
由于上述代碼80%是DeepSeep幫忙生成的,為便于理解和學習,我通過Trae請DeepSeek根據上述項目代碼,分析 MVC架構的類方法調用關系,系統成生了時序圖代碼如下:
sequenceDiagramparticipant Mainparticipant Controller as LoginControllerparticipant Model as UserModelparticipant View as LoginViewMain->>Controller: 創建實例(model, view)Controller->>View: 設置controller引用Main->>Controller: run()Controller->>View: show()View->>Controller: on_login()點擊事件Controller->>Model: query(username, password)alt 驗證成功Model-->>Controller: 返回TrueController->>View: show_success(username)else 驗證失敗Model-->>Controller: 返回FalseController->>View: show_failure()end
上述代碼可以在https://develop.git.mermaid.live/edit
在線生成時序圖如下:
關鍵調用流程說明:
1. **初始化階段**:
? ?- Main創建Controller實例
? ?- Controller初始化時注入Model和View
? ?- Controller設置View的controller引用
2. **運行階段**:
? ?- Controller調用View的show()方法顯示界面
? ?- 用戶點擊登錄按鈕觸發View的on_login()
? ?- View將用戶名密碼傳遞給Controller的handle_login()
3. **業務處理**:
? ?- Controller調用Model的query()驗證憑據
? ?- 根據驗證結果調用View的不同顯示方法
4. **各層職責**:
? ?- Model: 只負責數據驗證(query)
? ?- View: 只負責UI展示和事件轉發
? ?- Controller: 協調Model和View的交互
這個調用流程完全符合MVC架構的設計原則,各層職責清晰,耦合度低。
相關源代碼可以直接下載