Trae+DeepSeek学习Python开发MVC框架程序笔记(四):使用sqlite存储查询并验证用户名和密码

news2025/4/25 21:28:19

继续通过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架构的设计原则,各层职责清晰,耦合度低。

相关源代码可以直接下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超详细mac上用nvm安装node环境,配置npm

一、安装NVM 打开终端,运行以下命令来安装NVM: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash 然后就会出现如下代码: > Profile not found. Tried ~/.bashrc, ~/.bash_profile, ~/.zprofile, ~/.…

hi3516cv610构建音频sample工程代码步骤

hi3516cv610构建音频sample工程代码步骤 sdk版本:Hi3516CV610_SDK_V1.0.1.0 硬件:非es8388 工程代码: 通过网盘分享的文件:audio_easy.zip 链接: https://pan.baidu.com/s/1gx61S_F3-pf6hPyfbGaRXg 提取码: 4gbg --来自百度网盘…

12.QT-Combo Box|Spin Box|模拟点餐|从文件中加载选项|调整点餐份数(C++)

Combo Box QComboBox 表⽰下拉框 核⼼属性 属性说明currentText当前选中的⽂本currentIndex当前选中的条⽬下标.从0开始计算.如果当前没有条⽬被选中,值为-1editable是否允许修改设为true时, QComboBox 的⾏为就⾮常接近 QLineEdit ,也可以 设置 validatoriconSize下拉框图标…

UML 顺序图:电子图书馆管理系统的交互之道

目录 一、初识 UML 顺序图 二、电子图书馆管理系统顺序图解析 (一)借阅流程 (二)归还流程 三、顺序图绘画 四、顺序图的优势与价值 五、总结 UML 顺序图是描绘系统组件交互的有力工具。顺序图直观展示消息传递顺序与对象协…

访问者模式:分离数据结构与操作的设计模式

访问者模式:分离数据结构与操作的设计模式 一、模式核心:将操作从数据结构中分离,支持动态添加新操作 在软件开发中,当数据结构(如树、集合)中的元素类型固定,但需要频繁添加新的操作&#xf…

【AI训练环境搭建】在IDE(Pycharm或VSCode)上使用WSL2+Ubuntu22.04+Conda+Tensorflow+GPU进行机器学习训练

本次实践将在IDE(Pycharm或VSCode)上使用WSL2Ubuntu22.04TensorflowGPU进行机器学习训练。基本原理是在IDE中拉起WSL2中的Python解释器,并运行Python程序。要运行CondaTensorflowGPU你可能需要进行以下准备工作。 1. 此示例中将使用一个mnis…

Leetcode19(亚马逊真题):删除链表的倒是第N个节点

题目分析 删除节点关键:找到被删节点的前一个节点,指针指向 虚拟头节点,方便删除头结点,形成统一操作 为啥要让快指针先行? 我认为更好懂的一种解释:快指针先行n步,这样快慢指针之间形成了一…

Hadoop+Spark 笔记 2025/4/21

读书笔记 定义 1. 大数据(Big Data) - 指传统数据处理工具难以处理的海量、高速、多样的数据集合,通常具备3V特性(Volume体量大、Velocity速度快、Variety多样性)。扩展后还包括Veracity(真实性&#x…

Redis从入门到实战基础篇

前言:Redis的安装包含在Redis从入门到实战先导篇中,需要的可移步至此节 目录 1.Redis简单介绍 2.初始Redis 2.1.认识NoSQL 2.2.认识Redis 2.3.安装Redis 3.Redis常见命令 3.1 Redis数据结构 3.2 通用命令 3.3 String命令 3.4 Key的层级结构 3…

Java虚拟机(JVM)家族发展史及版本对比

Java虚拟机(JVM)家族发展史及版本对比 一、JVM家族发展史 1. 早期阶段(1996-2000) Classic VM(Java 1.0-1.1): 厂商:Sun Microsystems(Oracle前身)。特点&…

【学习笔记】Cadence电子设计全流程(三)Capture CIS 原理图绘制(下)

【学习笔记】Cadence电子设计全流程(三)Capture CIS 原理图绘制(下) 3.16 原理图中元件的编辑与更新3.17 原理图元件跳转与查找3.18 原理图常见错误设置于编译检查3.19 低版本原理图文件输出3.20 原理图文件的锁定与解锁3.21 Orca…

OpenCV 图形API(54)颜色空间转换-----将图像从 RGB 色彩空间转换到 HSV色彩空间RGB2HSV()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 HSV。该函数将输入图像从 RGB 色彩空间转换到 HSV。R、G 和 B 通道值的常规范围是 0 到 255。 输出图像必须是 8 位…

JavaWeb学习打卡-Day1-分层解耦、Spring IOC、DI

三层架构 Controller(控制层):接收前端发送的请求,对请求进行处理,并响应数据。Service(业务逻辑层):处理具体的业务逻辑。DAO(数据访问层/持久层)&#xff…

基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现

基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现 引言 在数字内容创作领域,高效的辅助工具是连接创意与实现的关键桥梁。创作者需要一款集可视化画布、节点关系管理、数据持久化于一体的专业工具&…

[Java · 铢积寸累] 数据结构 — 数组类型 - 增 删 改 查

🌟 想系统化学习 Java 编程?看看这个:[编程基础] Java 学习手册 在上一章中我们介绍了如何声明与创建数组,还介绍了数组的基本使用方式。本章我们将在上一章的基础上,拓展数组的使用方式(可能会涉及一些思…

前端笔记-Axios

Axios学习目标 Axios与API交互1、Axios配置与使用2、请求/响应拦截器3、API设计模式(了解RESTful风格即可) 学习参考:起步 | Axios中文文档 | Axios中文网 什么是Axios Axios 是一个基于 Promise 的现代化 HTTP 客户端库,专…

C# 类型、存储和变量(值类型引用类型)

本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 值类型引用类型 数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象…

智慧校园从配电开始:AISD300为校园安全加上智能防护罩

安科瑞刘鸿鹏 摘要 随着校园用电需求不断上升及其安全保障要求的提高,传统低压配电系统已逐渐难以满足现代校园的安全与智能化管理需求。本文基于安科瑞电气推出的AISD300系列三相智能安全配电装置,探讨其在校园电力系统中的应用优势及关键技术特性。…

一 、环境的安装 Anaconda + Pycharm + PaddlePaddle

《从零到一实践:系统性学习生成式 AI(NLP)》 一 、环境的安装 Anaconda Pycharm PaddlePaddle 1. Anaconda 软件安装 Anaconda 软件安装有大量的教程,此处不在说明,安装完成之后界面如下: 2. 创建 Anaconda 虚拟环境 Paddl…

十倍开发效率 - IDEA插件之 Maven Helper

0X00 先看效果 第一个选项表示存在冲突的依赖,可以看到图片中 mysql 的连接依赖发生了冲突,在低版本的上面直接右键选择 Exclude,冲突的依赖就被解决掉了。 0X01 安装 在 Plugins 中直接搜索 Maven Helper,选择第一个进行安装&am…