Tkinter制作登录界面以及登陆后页面切换--用户数据从数据库获取并进行正当 ...

打印 上一主题 下一主题

主题 1793|帖子 1793|积分 5379

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
续接上集,废话不多说,开搞!
新增功能


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

   下面代码中 from data import Sql, BcryptUtils 引入的是本身写的包,Sql用来记载需要初始化的信息(创建基础表,添加管理用户等), BcryptUtils 重要是对密码进行加密哈希和校验密码是否正确
  1. import json
  2. import sqlite3
  3. from data import Sql, BcryptUtils
  4. class SqlUtils:
  5.     def __init__(self):
  6.         # 不再在初始化时直接建立连接,而是在需要时建立
  7.         self.database_name = 'platform.db'
  8.     def init(self):
  9.         """ 初始化数据库 """
  10.         # 创建基础数据表和初始化表单数据时建立连接并在完成后关闭
  11.         with sqlite3.connect(self.database_name) as conn:
  12.             cursor = conn.cursor()
  13.             for sql in Sql.create_sqls:
  14.                 cursor.execute(sql)
  15.             for sql in Sql.insert_sqls:
  16.                 cursor.execute(sql)
  17.             conn.commit()
  18.     def query(self, sql):
  19.         """
  20.         查询数据,返回格式:{'字段名':'数值'}
  21.         :param sql: 需要查询的sql
  22.         :return: 返回查询到的数据,没有数据时返回None
  23.         """
  24.         with sqlite3.connect(self.database_name) as conn:
  25.             cursor = conn.cursor()
  26.             cursor.execute(sql)
  27.             _rows = cursor.fetchall()
  28.             columns = [description[0] for description in cursor.description]
  29.             return [dict(zip(columns, _row)) for _row in _rows]
  30.     def insert(self, sql: str):
  31.         """
  32.         插入数据方法
  33.         :param sql: 插入数据的sql
  34.         :return: 成功返回True,否则False
  35.         """
  36.         with sqlite3.connect(self.database_name) as conn:
  37.             cursor = conn.cursor()
  38.             cursor.execute(sql)
  39.             conn.commit()
  40.             rows_affected = cursor.rowcount
  41.             return rows_affected > 0
  42.     def insert_json(self, table_name: str, data_dict: json) -> object:
  43.         # 解析 JSON 获取键值对
  44.         columns = ', '.join(data_dict.keys())
  45.         placeholders = ', '.join(['?'] * len(data_dict))
  46.         values = tuple(data_dict.values())
  47.         with sqlite3.connect(self.database_name) as conn:
  48.             cursor = conn.cursor()
  49.             # 拼接 SQL 语句
  50.             sql = f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})"
  51.             try:
  52.                 cursor.execute(sql, values)
  53.                 conn.commit()
  54.                 return True
  55.             except Exception as e:
  56.                 print(f"插入失败:{e}")
  57.                 conn.rollback()
  58.                 return False
  59.     def delete(self, table_name: str, data_dict: json):
  60.         if not data_dict or len(data_dict) == 0:
  61.             return False, "条件为空,不允许删除。"
  62.         conditions = []
  63.         values = []
  64.         for key, value in data_dict.items():
  65.             conditions.append(f"{key}=?")
  66.             values.append(value)
  67.         sql = f"DELETE FROM {table_name} WHERE {' AND '.join(conditions)}"
  68.         with sqlite3.connect(self.database_name) as conn:
  69.             try:
  70.                 cursor = conn.cursor()
  71.                 cursor.execute(sql, values)
  72.                 conn.commit()
  73.                 rows_affected = cursor.rowcount
  74.                 return rows_affected > 0
  75.             except Exception as e:
  76.                 print(f"删除失败:{e}")
  77.                 conn.rollback()
  78.                 return False
  79.     def login_user(self, username, password):
  80.         """
  81.         用户登录判断接口,返回True代表允许登录
  82.         :param username: 用户账号
  83.         :param password: 用户密码
  84.         :return: 成功返回True,用户数据,失败则返回False,原因
  85.         """
  86.         user_data = self.query(f"SELECT * FROM sys_user WHERE username='{username}'")
  87.         if user_data:
  88.             row = user_data[0]
  89.             if BcryptUtils.check_password(password, row['password']):
  90.                 return True, row
  91.             else:
  92.                 return False, '账号或密码错误'
  93.         else:
  94.             return False, "没有当前登录的账号信息。"
  95. if __name__ == '__main__':
  96.     sql_utils = SqlUtils()
  97.     sql_utils.init()
  98.     sql_utils.insert_json("sys_user", {
  99.         "name": "测试", "username": "admin",
  100.         "password": BcryptUtils.hash_password('123456')
  101.     })
  102.     input_username = "admin"
  103.     input_password = "123456"
  104.     res, data = sql_utils.login_user(input_username, input_password)
  105.     if res is True:
  106.         extend_str = data.get('extend')
  107.         extend_dict = json.loads(extend_str) if extend_str else {}
  108.         print(f"欢迎您,{data.get('name')},您的账号是:{data.get('username')},头像:{extend_dict.get('img')}")
  109.     else:
  110.         print(f'{data}')
  111.     # 删除用户
  112.     sql_utils.delete("sys_user", {
  113.         "username": "admin"
  114.     })
复制代码
2. 用户表创建(用户信息增删改查操作)

   data/Sql.py
  1. create_sqls = []
  2. create_drop_user = "DROP TABLE IF EXISTS sys_user;"
  3. create_sqls.append(create_drop_user)
  4. create_user = '''
  5.         CREATE TABLE IF NOT EXISTS sys_user
  6.         (
  7.             id        INTEGER PRIMARY KEY,
  8.             name      varchar(255)       not null,
  9.             username  varchar(32)        not null,
  10.             password  varchar(255)       not null,
  11.             is_active blob default false not null,
  12.             extend    json,
  13.             unique (username)
  14.         );
  15.         '''
  16. create_sqls.append(create_user)
  17. insert_sqls = []
  18. insert_user = """
  19. insert into sys_user(name, username, password, extend)
  20.         values ('超级管理员', 'admin',
  21.         '$2b$12$v/PNEi9kMoAafg17SneZ8eiX2/CC/BGWjCI4l.ynkfLcRhXm4TPdW',
  22.         '{"img":"http:127.0.0.1/statics/super/image/super.png"}');
  23. """
  24. insert_sqls.append(insert_user)
复制代码
3. 完善登录校验

   data/BcryptUtils.py ,引入依靠下令: pip install bcrypt
  1. import bcrypt
  2. def check_password(plain_password, hashed_password):
  3.     """
  4.     验证密码
  5.     :param plain_password: 明文密码
  6.     :param hashed_password: 哈希密码
  7.     :return: 匹配则返回True,否则返回False
  8.     """
  9.     plain_password = plain_password.encode('utf-8')
  10.     hashed_password = hashed_password.encode('utf-8')
  11.     return bcrypt.checkpw(plain_password, hashed_password)
  12. def hash_password(password):
  13.     """
  14.     对密码进行加密
  15.     :param password: 用户密码
  16.     :return: 返回加密的密文
  17.     """
  18.     password = password.encode('utf-8')
  19.     hashed = bcrypt.hashpw(password, bcrypt.gensalt())
  20.     return hashed.decode('utf-8')
复制代码
  login/ui.py 不清晰这个去看一下一中的ui.py全代码,此处只展示修改的信息
  1. from data.SqlLiteUtils import SqlUtils
  2. class Controller:
  3.     # 导入UI类后,替换以下的 object 类型,将获得 IDE 属性提示功能
  4.     ui: WinGUI
  5.     def __init__(self):
  6.         ....保持原有代码....下方是新增代码
  7.         self.sql_utils = SqlUtils()
  8.    
  9.     def login_submit(self, evt):
  10.         u, p = self.ui.login()
  11.         if u is None or len(u) == 0:
  12.             tkinter.messagebox.showinfo("登录提示", "请输入登录用户名!")
  13.         elif p is None or len(p) == 0:
  14.             tkinter.messagebox.showinfo("登录提示", "请输入登录密码!")
  15.         print(
  16.             f"触发了登录操作,地址:{self.url},账号:{u},密码:{p}")
  17.         res, user = self.sql_utils.login_user(u, p)
  18.         if res is True:
  19.             print(f"欢迎您,{user.get('name')}")
  20.             self.ui.destroy()
  21.             from home.control import Controller as HomeUIController
  22.             from home.ui import Win as MainWin
  23.             app = MainWin(HomeUIController())
  24.             app.set_user(user)
  25.             app.mainloop()
  26.         else:
  27.             tkinter.messagebox.showinfo("登录提示", user)
复制代码
  home/ui.py 此处一样只展示心增代码
  1. class WinGUI(Tk):
  2.     def __init__(self):
  3.         super().__init__()
  4.                 self.user: json = {}
  5.                
  6.         def set_user(self, user: json):
  7.         self.user = user
复制代码
好了,到这里结束了,后续会开始做注册用户操作,需要团体源代码的可以留言或SL俺!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表