大数据安全项目

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.结果图展示及数据库展示(部分)

大数据安全项目_第1张图片

大数据安全项目_第2张图片

你可能感兴趣的:(大数据,python,pycharm,sql,mysql)