Tkinter制作登录界面以及登陆后页面切换--用户数据从数据库获取并进行合法性校验(二)

news/2024/9/28 23:36:01/

Tkinter制作登录界面以及登陆后页面切换(二)

  • 新增功能
    • 1. 数据库管理(SqlLite)
    • 2. 用户表创建(用户信息增删改查操作)
    • 3. 完善登录校验

续接上集,废话不多说,开搞!

新增功能

  1. 数据库管理
  2. 用户表创建(用户信息增删改查操作)
  3. 完善登录校验

1. 数据库管理(SqlLite)

下面代码中 from data import Sql, BcryptUtils 引入的是自己写的包,Sql用来记录需要初始化的信息(创建基础表,添加管理用户等), BcryptUtils 主要是对密码进行加密哈希和校验密码是否正确

python">import json
import sqlite3from data import Sql, BcryptUtilsclass SqlUtils:def __init__(self):# 不再在初始化时直接建立连接,而是在需要时建立self.database_name = 'platform.db'def init(self):""" 初始化数据库 """# 创建基础数据表和初始化表单数据时建立连接并在完成后关闭with sqlite3.connect(self.database_name) as conn:cursor = conn.cursor()for sql in Sql.create_sqls:cursor.execute(sql)for sql in Sql.insert_sqls:cursor.execute(sql)conn.commit()def query(self, sql):"""查询数据,返回格式:{'字段名':'数值'}:param sql: 需要查询的sql:return: 返回查询到的数据,没有数据时返回None"""with sqlite3.connect(self.database_name) as conn:cursor = conn.cursor()cursor.execute(sql)_rows = cursor.fetchall()columns = [description[0] for description in cursor.description]return [dict(zip(columns, _row)) for _row in _rows]def insert(self, sql: str):"""插入数据方法:param sql: 插入数据的sql:return: 成功返回True,否则False"""with sqlite3.connect(self.database_name) as conn:cursor = conn.cursor()cursor.execute(sql)conn.commit()rows_affected = cursor.rowcountreturn rows_affected > 0def insert_json(self, table_name: str, data_dict: json) -> object:# 解析 JSON 获取键值对columns = ', '.join(data_dict.keys())placeholders = ', '.join(['?'] * len(data_dict))values = tuple(data_dict.values())with sqlite3.connect(self.database_name) as conn:cursor = conn.cursor()# 拼接 SQL 语句sql = f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})"try:cursor.execute(sql, values)conn.commit()return Trueexcept Exception as e:print(f"插入失败:{e}")conn.rollback()return Falsedef delete(self, table_name: str, data_dict: json):if not data_dict or len(data_dict) == 0:return False, "条件为空,不允许删除。"conditions = []values = []for key, value in data_dict.items():conditions.append(f"{key}=?")values.append(value)sql = f"DELETE FROM {table_name} WHERE {' AND '.join(conditions)}"with sqlite3.connect(self.database_name) as conn:try:cursor = conn.cursor()cursor.execute(sql, values)conn.commit()rows_affected = cursor.rowcountreturn rows_affected > 0except Exception as e:print(f"删除失败:{e}")conn.rollback()return Falsedef login_user(self, username, password):"""用户登录判断接口,返回True代表允许登录:param username: 用户账号:param password: 用户密码:return: 成功返回True,用户数据,失败则返回False,原因"""user_data = self.query(f"SELECT * FROM sys_user WHERE username='{username}'")if user_data:row = user_data[0]if BcryptUtils.check_password(password, row['password']):return True, rowelse:return False, '账号或密码错误'else:return False, "没有当前登录的账号信息。"if __name__ == '__main__':sql_utils = SqlUtils()sql_utils.init()sql_utils.insert_json("sys_user", {"name": "测试", "username": "admin","password": BcryptUtils.hash_password('123456')})input_username = "admin"input_password = "123456"res, data = sql_utils.login_user(input_username, input_password)if res is True:extend_str = data.get('extend')extend_dict = json.loads(extend_str) if extend_str else {}print(f"欢迎您,{data.get('name')},您的账号是:{data.get('username')},头像:{extend_dict.get('img')}")else:print(f'{data}')# 删除用户sql_utils.delete("sys_user", {"username": "admin"})

2. 用户表创建(用户信息增删改查操作)

data/Sql.py

python">create_sqls = []create_drop_user = "DROP TABLE IF EXISTS sys_user;"
create_sqls.append(create_drop_user)create_user = '''CREATE TABLE IF NOT EXISTS sys_user(id        INTEGER PRIMARY KEY,name      varchar(255)       not null,username  varchar(32)        not null,password  varchar(255)       not null,is_active blob default false not null,extend    json,unique (username));'''
create_sqls.append(create_user)insert_sqls = []insert_user = """
insert into sys_user(name, username, password, extend)values ('超级管理员', 'admin', '$2b$12$v/PNEi9kMoAafg17SneZ8eiX2/CC/BGWjCI4l.ynkfLcRhXm4TPdW', '{"img":"http:127.0.0.1/statics/super/image/super.png"}');
"""
insert_sqls.append(insert_user)

3. 完善登录校验

data/BcryptUtils.py ,引入依赖命令: pip install bcrypt

python">import bcryptdef check_password(plain_password, hashed_password):"""验证密码:param plain_password: 明文密码:param hashed_password: 哈希密码:return: 匹配则返回True,否则返回False"""plain_password = plain_password.encode('utf-8')hashed_password = hashed_password.encode('utf-8')return bcrypt.checkpw(plain_password, hashed_password)def hash_password(password):"""对密码进行加密:param password: 用户密码:return: 返回加密的密文"""password = password.encode('utf-8')hashed = bcrypt.hashpw(password, bcrypt.gensalt())return hashed.decode('utf-8')

login/ui.py 不清楚这个去看一下一中的ui.py全代码,此处只展示修改的信息

python">from data.SqlLiteUtils import SqlUtilsclass Controller:# 导入UI类后,替换以下的 object 类型,将获得 IDE 属性提示功能ui: WinGUIdef __init__(self):....保持原有代码....下方是新增代码self.sql_utils = SqlUtils()def login_submit(self, evt):u, p = self.ui.login()if u is None or len(u) == 0:tkinter.messagebox.showinfo("登录提示", "请输入登录用户名!")elif p is None or len(p) == 0:tkinter.messagebox.showinfo("登录提示", "请输入登录密码!")print(f"触发了登录操作,地址:{self.url},账号:{u},密码:{p}")res, user = self.sql_utils.login_user(u, p)if res is True:print(f"欢迎您,{user.get('name')}")self.ui.destroy()from home.control import Controller as HomeUIControllerfrom home.ui import Win as MainWinapp = MainWin(HomeUIController())app.set_user(user)app.mainloop()else:tkinter.messagebox.showinfo("登录提示", user)

home/ui.py 此处一样只展示心增代码

python">class WinGUI(Tk):def __init__(self):super().__init__()self.user: json = {}def set_user(self, user: json):self.user = user

好了,到这里结束了,后续会开始做注册用户操作,需要整体源代码的可以留言或SL俺!


http://www.ppmy.cn/news/1531268.html

相关文章

使用jaxb来生成多层嵌套xml

问题 需要生成多层嵌套xml&#xff0c;类似如下内容&#xff1a; <A><B><C><!-- C类的字段 --></C><C><!-- 另一个C类的字段 --></C></B> </A>解决 C.java import jakarta.xml.bind.annotation.*; import lom…

【机器学习】决策树算法

目录 算法引入 基尼系数&#xff1a; 决策树算法概述 决策树的关键概念 决策树的构建 代码实现 1. 定义决策树节点 2. 计算信息增益 3. 选择最佳分割特征 4. 构建决策树 5. 决策树预测 决策树的评估指标&#xff1a; 决策树的优缺点 优点&#xff1a; 缺点&…

JavaScript开发网页中不常用但很重要的用法

一、Proxy对象 基本概念 Proxy是JavaScript中的一个元编程特性&#xff0c;它允许创建一个代理对象&#xff0c;该代理对象可以拦截并自定义对目标对象的基本操作&#xff08;如属性查找、赋值、函数调用等&#xff09;。例如&#xff0c;创建一个简单的Proxy对象来拦截对目标对…

Python中的数据处理与分析:从基础到高级

在数据科学和数据分析领域&#xff0c;Python凭借其丰富的库和强大的生态系统&#xff0c;成为了最受欢迎的语言之一。本文将从基础到高级&#xff0c;详细介绍如何使用Python进行数据处理和分析&#xff0c;涵盖数据清洗、数据转换、数据可视化等多个方面。 1. 数据导入与导出…

跨游戏引擎的H5渲染解决方案(腾讯)

本文是腾讯的一篇H5 跨引擎解决方案的精炼。 介绍 本文通过实现基于精简版的HTML5&#xff08;HyperText Mark Language 5&#xff09;来屏蔽不同引擎&#xff0c;平台底层的差异。 好处&#xff1a; 采用H5的开发方式&#xff0c;可以将开发和运营分离&#xff0c;运营部门自…

心理教育辅导系统的设计与Spring Boot实现

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

声波定位技术在地下管道中如何应用

随着城市化进程的加速&#xff0c;地下管道作为城市基础设施的重要组成部分&#xff0c;其安全、高效的维护与管理显得尤为重要。声波定位技术作为一种非破坏性探测手段&#xff0c;在地下管道中的应用日益广泛&#xff0c;成为提升管道维护和管理水平的重要工具。接下来给大家…

python dict函数介绍

在 Python 中,dict() 是用来创建字典对象的内置函数。字典(dictionary)是一个无序的可变容器,存储键-值对。dict() 函数有多种使用方式,能够接受不同的参数形式来创建字典。 dict() 函数的语法: dict(**kwargs) dict(mapping, **kwargs) dict(iterable, **kwargs)参数说…