1.项目详情 用python写一个大数据安全项目(使用tk,页面布局使用盒子模型,页面中各个按钮,主题要美观,按扭间的距离不要太进),需要连接数据库连接名是root(数据库名为bigdata_security,数据库密码是123456。查询数据库中的student表(包括id,name,sex,school,height,weight这些字段))。包括管理员和学生两个功能。 2.代码详情 import tkinter as tk from tkinter import messagebox import mysql.connector from tkinter import ttk class Database: def __init__(self): try: self.conn = mysql.connector.connect( host="localhost", user="root", password="123456", database="bigdata_security" ) self.cursor = self.conn.cursor() except mysql.connector.Error as err: messagebox.showerror("数据库错误", f"无法连接到数据库: {err}") def execute_query(self, query, params=None): if params: self.cursor.execute(query, params) else: self.cursor.execute(query) return self.cursor class LoginPage: def __init__(self, root): self.root = root self.root.geometry("600x400") self.root.title("登录页面") self.root.configure(bg='white') self.bg_image = tk.PhotoImage(file="./static/tu.png") bg_label = tk.Label(root, image=self.bg_image) bg_label.place(relwidth=1, relheight=1) self.create_buttons() def create_buttons(self): self.student_login_button = tk.Button(self.root, text="学生登录", command=self.open_student_login, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.student_login_button.pack(pady=20) self.admin_login_button = tk.Button(self.root, text="管理员登录", command=self.open_admin_login, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.admin_login_button.pack(pady=20) def open_student_login(self): self.student_login_win = tk.Toplevel(self.root) self.student_login_win.geometry("400x300") self.student_login_win.title("学生登录") self.student_login_win.configure(bg='white') bg_label = tk.Label(self.student_login_win, image=self.bg_image) bg_label.place(relwidth=1, relheight=1) self.student_id_label = tk.Label(self.student_login_win, text="ID:", bg='white') self.student_id_label.pack(pady=10) self.student_id_entry = tk.Entry(self.student_login_win) self.student_id_entry.pack(pady=10) self.student_pw_label = tk.Label(self.student_login_win, text="密码:", bg='white') self.student_pw_label.pack(pady=10) self.student_pw_entry = tk.Entry(self.student_login_win, show="*") self.student_pw_entry.pack(pady=10) self.student_login_button = tk.Button(self.student_login_win, text="登录", command=self.student_login_process, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.student_login_button.pack(pady=20) def student_login_process(self): db = Database() student_id = self.student_id_entry.get() student_pw = self.student_pw_entry.get() query = "SELECT * FROM user_login WHERE id = %s AND pw = %s" result = db.execute_query(query, (student_id, student_pw)).fetchone() if result: self.student_login_win.destroy() self.open_student_main(student_id) else: messagebox.showerror("登录错误", "学生登录失败,请检查 ID 或密码") db.conn.close() def open_student_main(self, student_id): self.student_main_win = tk.Toplevel(self.root) self.student_main_win.geometry("500x400") self.student_main_win.title("学生主页面") self.student_main_win.configure(bg='lightgreen') bg_label = tk.Label(self.student_main_win, image=self.bg_image) bg_label.place(relwidth=1, relheight=1) self.query_label = tk.Label(self.student_main_win, text="输入要查询的学生 ID:", bg='lightgreen') self.query_label.pack(pady=10) self.query_entry = tk.Entry(self.student_main_win) self.query_entry.pack(pady=10) self.query_button = tk.Button(self.student_main_win, text="查询", command=lambda: self.student_query(student_id), bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.query_button.pack(pady=20) self.exit_button = tk.Button(self.student_main_win, text="退出", command=self.student_main_win.destroy, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.exit_button.pack(pady=20) def student_query(self, student_id): db = Database() query_id = self.query_entry.get() query = "SELECT id, '******', '******', '******', '******', '******' FROM student WHERE id = %s" params = (query_id,) if student_id == query_id: query = "SELECT * FROM student WHERE id = %s" result = db.execute_query(query, params).fetchone() if result: message = f"ID: {result[0]}, 姓名: {result[1]}, 性别: {result[2]}, 学校: {result[3]}, 身高: {result[4]}, 体重: {result[5]}" messagebox.showinfo("查询结果", message) else: messagebox.showerror("查询错误", "未找到该学生的信息") db.conn.close() def open_admin_login(self): self.admin_login_win = tk.Toplevel(self.root) self.admin_login_win.geometry("400x300") self.admin_login_win.title("管理员登录") self.admin_login_win.configure(bg='white') bg_label = tk.Label(self.admin_login_win, image=self.bg_image) bg_label.place(relwidth=1, relheight=1) self.admin_id_label = tk.Label(self.admin_login_win, text="ID:", bg='white') self.admin_id_label.pack(pady=10) self.admin_id_entry = tk.Entry(self.admin_login_win) self.admin_id_entry.pack(pady=10) self.admin_pw_label = tk.Label(self.admin_login_win, text="密码:", bg='white') self.admin_pw_label.pack(pady=10) self.admin_pw_entry = tk.Entry(self.admin_login_win, show="*") self.admin_pw_entry.pack(pady=10) self.admin_login_button = tk.Button(self.admin_login_win, text="登录", command=self.admin_login_process, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.admin_login_button.pack(pady=20) def admin_login_process(self): db = Database() admin_id = self.admin_id_entry.get() admin_pw = self.admin_pw_entry.get() query = "SELECT * FROM m_login WHERE id = %s AND pw = %s" result = db.execute_query(query, (admin_id, admin_pw)).fetchone() if result: self.admin_login_win.destroy() self.open_admin_main() else: messagebox.showerror("登录错误", "管理员登录失败,请检查 ID 或密码") db.conn.close() def open_admin_main(self): self.admin_main_win = tk.Toplevel(self.root) self.admin_main_win.geometry("600x500") self.admin_main_win.title("管理员主页面") self.admin_main_win.configure(bg='white') bg_label = tk.Label(self.admin_main_win, image=self.bg_image) bg_label.place(relwidth=1, relheight=1) self.query_button = tk.Button(self.admin_main_win, text="查询学生数据", command=self.admin_query_student_data, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.query_button.pack(pady=20) self.modify_button = tk.Button(self.admin_main_win, text="修改学生数据", command=self.open_modify_page, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.modify_button.pack(pady=20) self.undo_button = tk.Button(self.admin_main_win, text="恢复修改", command=self.admin_undo_modification, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.undo_button.pack(pady=20) self.exit_button = tk.Button(self.admin_main_win, text="返回登录", command=self.admin_main_win.destroy, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.exit_button.pack(pady=20) # 管理员查询 def admin_query_student_data(self): db = Database() query = "SELECT * FROM student" results = db.execute_query(query).fetchall() data = "" for result in results: data += f"ID: {result[0]}, 姓名: {result[1]}, 性别: {result[2]}, 学校: {result[3]}, 身高: {result[4]}, 体重: {result[5]}\n" messagebox.showinfo("学生数据", data) db.conn.close() # 管理员修改页面设计 def open_modify_page(self): self.modify_win = tk.Toplevel(self.root) self.modify_win.geometry("500x700") self.modify_win.title("修改学生数据") self.modify_win.configure(bg='white') bg_label = tk.Label(self.modify_win, image=self.bg_image) bg_label.place(relwidth=1, relheight=1) self.modify_id_label = tk.Label(self.modify_win, text="ID:", bg='white') self.modify_id_label.pack(pady=10) self.modify_id_entry = tk.Entry(self.modify_win) self.modify_id_entry.pack(pady=10) self.modify_name_label = tk.Label(self.modify_win, text="姓名:", bg='white') self.modify_name_label.pack(pady=10) self.modify_name_entry = tk.Entry(self.modify_win) self.modify_name_entry.pack(pady=10) self.modify_sex_label = tk.Label(self.modify_win, text="性别:", bg='white') self.modify_sex_label.pack(pady=10) self.modify_sex_entry = tk.Entry(self.modify_win) self.modify_sex_entry.pack(pady=10) self.modify_school_label = tk.Label(self.modify_win, text="学校:", bg='white') self.modify_school_label.pack(pady=10) self.modify_school_entry = tk.Entry(self.modify_win) self.modify_school_entry.pack(pady=10) self.modify_height_label = tk.Label(self.modify_win, text="身高:", bg='white') self.modify_height_label.pack(pady=10) self.modify_height_entry = tk.Entry(self.modify_win) self.modify_height_entry.pack(pady=10) self.modify_weight_label = tk.Label(self.modify_win, text="体重:", bg='white') self.modify_weight_label.pack(pady=10) self.modify_weight_entry = tk.Entry(self.modify_win) self.modify_weight_entry.pack(pady=10) self.modify_button = tk.Button(self.modify_win, text="修改", command=self.admin_modify_data, bg='gray', fg='green', font=('Helvetica', 12, 'bold')) self.modify_button.pack(pady=20) # 管理员修改功能 def admin_modify_data(self): db = Database() id = self.modify_id_entry.get() name = self.modify_name_entry.get() sex = self.modify_sex_entry.get() school = self.modify_school_entry.get() height = self.modify_height_entry.get() weight = self.modify_weight_entry.get() query = "UPDATE student SET sex = %s, school = %s, height = %s, weight = %s WHERE id = %s AND name = %s" params = (sex, school, height, weight, id, name) db.execute_query(query, params) db.conn.commit() # 更新备份表 backup_query = "INSERT INTO student_backup SELECT * FROM student WHERE id = %s AND name = %s ON DUPLICATE KEY UPDATE sex = VALUES(sex), school = VALUES(school), height = VALUES(height), weight = VALUES(weight)" db.execute_query(backup_query, (id, name)) db.conn.commit() messagebox.showinfo("修改成功", "学生数据修改成功") db.conn.close() self.modify_win.destroy() # 数据恢复 def admin_undo_modification(self): db = Database() # 从备份表恢复数据 restore_query = "INSERT INTO student SELECT * FROM student_backup ON DUPLICATE KEY UPDATE sex = VALUES(sex), school = VALUES(school), height = VALUES(height), weight = VALUES(weight)" db.execute_query(restore_query) db.conn.commit() messagebox.showinfo("恢复修改", "数据已恢复") db.conn.close() if __name__ == "__main__": root = tk.Tk() login_page = LoginPage(root) root.mainloop()
3.结果图展示及数据库展示(部分)