继续通过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 Path
DB_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, pyqtSignal
class 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 None
def __del__(self):
"""关闭数据库连接"""
self.conn.close()
3.视图文件view.py
# view.py
#
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit,
QPushButton, QVBoxLayout, QMessageBox)
from PyQt5.QtCore import Qt
class LoginView(QWidget):
def __init__(self, controller=None):
super().__init__()
self.controller = controller
self.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 = model
self.view = view
self.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_db
def 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架构的类方法调用关系,系统成生了时序图代码如下:
sequenceDiagram
participant Main
participant Controller as LoginController
participant Model as UserModel
participant View as LoginView
Main->>Controller: 创建实例(model, view)
Controller->>View: 设置controller引用
Main->>Controller: run()
Controller->>View: show()
View->>Controller: on_login()点击事件
Controller->>Model: query(username, password)
alt 验证成功
Model-->>Controller: 返回True
Controller->>View: show_success(username)
else 验证失败
Model-->>Controller: 返回False
Controller->>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架构的设计原则,各层职责清晰,耦合度低。
相关源代码可以直接下载