Python Flask Web + PyQt 前后端分离的项目—学习成绩可视化分析系统

简介

使用工具:

Python,PyQt ,Flask ,MySQL

注:制作重点在网页端,因此网页端的功能更全

WEB界面展示:

系统登录分为管理员,老师,学生3部分

管理员统一管理所有的账号信息以及登录信息

老师管理,添加,修改班级,学生的成绩信息

学生只能查看成绩信息,不能做出修改

 

 

PYQT界面展示:

 

数据库创建:

项目目录

Project-

       - PYQT                                      # 存放软件端的代码文件(运行login.py启动程序)

                   

       - static                                          # 存放静态资源(图片等)

       - templates                                   # 存放网页端的代码

                   

       - app.py                                        # 启动网页端系统

       - student.sql                                 # 数据库文件

代码

简单放一个登录的代码

from flask import Flask, jsonify, render_template, request, redirect, url_for, session
import mysql.connector
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib
matplotlib.use('agg')
from matplotlib.font_manager import FontProperties
from io import BytesIO
import base64
from flask import render_template_string
import os
from datetime import datetime
from collections import defaultdict



# 预设字体格式,并传给rc方法
font = {'family': 'SimHei', "size": 12}
matplotlib.rc('font', **font)  # 一次定义终身使用
# Set font properties for Chinese characters
font_prop = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf', size=12)



app = Flask(__name__)
app.secret_key = 'your_secret_key'  # Change this to a secure secret key

# Replace these placeholders with your database connection details
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASSWORD = '123456'
DB_DATABASE = 'Student'

def connect_to_database():
    try:
        connection = mysql.connector.connect(
            host=DB_HOST,
            user=DB_USER,
            password=DB_PASSWORD,
            database=DB_DATABASE
        )
        return connection
    except mysql.connector.Error as err:
        print(f"Error: {err}")
        return None

def save_login_record(connection, role, account):
    try:
        cursor = connection.cursor()
        login_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        query = f"INSERT INTO login_record (role, account, login_time) VALUES ('{role}', '{account}', '{login_time}')"
        cursor.execute(query)
        connection.commit()
    except mysql.connector.Error as err:
        print(f"Error: {err}")
    finally:
        cursor.close()


def check_admin_login(connection, table_name, account, password, role):

    try:

        if role == '管理员':
            table_name = 'admin'
            cursor = connection.cursor()
            print(table_name,account,password,role)
            query = f"SELECT * FROM {table_name} WHERE Mainid='{account}' AND password='{password}'"

            # Implement your database query logic here
            cursor.execute(query)
            result = cursor.fetchone()

        elif role == '老师':
            table_name = 'admin_teachers'
            # Check administrator login
            cursor = connection.cursor()
            print(table_name,account,password,role)
            query = f"SELECT * FROM {table_name} WHERE Teacherid='{account}' AND password='{password}'"

            # Implement your database query logic here
            cursor.execute(query)
            result = cursor.fetchone()


        elif role == '学生':
            table_name = 'admin_students'
            # Check administrator login
            cursor = connection.cursor()
            print(table_name,account,password,role)
            query = f"SELECT * FROM {table_name} WHERE Studentid='{account}' AND password='{password}'"

            # Implement your database query logic here
            cursor.execute(query)
            result = cursor.fetchone()

        if result:
            # Save login record in data_8
            save_login_record(connection, role, account)

        return bool(result)
    except mysql.connector.Error as err:
        print(f"Error: {err}")
        return False
    finally:
        cursor.close()

@app.route('/')
def index():
    return render_template('login.html')

@app.route('/login', methods=['POST'])
def login():
    account = request.form['account']
    password = request.form['password']
    role = request.form['role']

    connection = connect_to_database()
    if connection is None:
        return render_template('login_failed.html', message='Failed to connect to the database.')

    table_name = get_table_name(role)

    if check_admin_login(connection, table_name, account, password, role):
        session['role'] = role
        if role == '学生':
            session['account'] = account
            print("===================",session['account'])
        return redirect(url_for('admin_dashboard'))
    else:
        return render_template('login_failed.html', message='Invalid username or password.')

@app.route('/admin/dashboard')
def admin_dashboard():
    role = session.get('role')

    if role == '管理员':
        data = fetch_admin_data()
        data_1 = fetch_admin_teacher_data()
        data_2 = fetch_admin_student_data()
        data_8 = fetch_login_records()
        data_10 = populate_tree_model_10()
        return render_template('admin_dashboard.html', role=role, data=data, data_1=data_1, data_2=data_2, data_8 = data_8, data_10 = data_10)
    
    elif role == '老师':
        
        data_2 = fetch_admin_student_data()
        data_3 = populate_tree_model_2()
        data_4 = populate_tree_model_6()
        data_5 = populate_tree_model_4()
        data_6 = populate_tree_model_7()
        data_7 = populate_tree_model_5()
        data_9 = populate_tree_model_9()
        scatter_plot_files = show_images()
        data_10 = populate_tree_model_10()
        return render_template('teacher_dashboard.html',scatter_plot_files = scatter_plot_files, role=role, data_2=data_2, data_3=data_3, data_4=data_4, data_5=data_5, data_6=data_6, data_7=data_7, data_9=data_9, data_10 = data_10)
    
    elif role == '学生':
        account = session.get('account')
        data_3 = populate_tree_model_2()
        data_4 = populate_tree_model_6()
        data_5 = populate_tree_model_4()
        data_6 = populate_tree_model_7()
        data_7 = populate_tree_model_5()
        data_8 = show_info()
        print("===================----------------",session['account'])
        return render_template('student_dashboard.html', studentID=account, data_3=data_3, data_4=data_4, data_5=data_5, data_6=data_6, data_7=data_7, data_8=data_8)
    else:
        return redirect(url_for('index'))

# Add routes for other pages as needed

def get_table_name(role):
    # Implement logic to determine the table name based on the role
    if role == '管理员':
        return 'admin'
    elif role == '老师':
        return 'admin_teachers'
    elif role == '学生':
        return 'admin_students'
    else:
        return None

def fetch_login_records():
    data_8 = []
    try:
        connection = connect_to_database()
        if connection is None:
            return []

        cursor = connection.cursor()
        query = "SELECT * FROM login_record"
        cursor.execute(query)

        login_records = cursor.fetchall()

        # Convert rows to a list of dictionaries
        for row in login_records:
            data_8.append({
                'role': row[0],
                'account': row[1],
                'login_time': row[2]
            })

        return data_8
    except mysql.connector.Error as err:
        print(f"Error: {err}")
        return []
    finally:
        cursor.close()
        if connection:
            connection.close()

def fetch_admin_data():
    data = []
    try:
        # Connect to the MySQL database
        connection = mysql.connector.connect(
            host='localhost',
            user='root',
            password='123456',
            database='Student'
        )

        cursor = connection.cursor()

        # Execute a query to fetch data from the admin table
        query = "SELECT Mainid, Username, Password, Name FROM admin"
        cursor.execute(query)

        # Fetch all rows from the result
        rows = cursor.fetchall()

        # Convert rows to a list of dictionaries
        for row in rows:
            data.append({
                'Mainid': row[0],
                'Username': row[1],
                'Password': row[2],
                'Name': row[3]
            })

    except mysql.connector.Error as err:
        print(f"Error: {err}")

    finally:
        # Close the cursor and connection
        cursor.close()
        connection.close()

    return data


百度云链接:

链接:https://pan.baidu.com/s/13HtbUm0Wwd0RT_cY61M57A?pwd=o102 
提取码:o102 
--来自百度网盘超级会员V5的分享

系统可能还存在某些不完善的地方,欢迎讨论

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java实现一个栈

目录 概念与结构 实现一个栈 创建一个栈类 实现栈的基本操作 测试栈类 概念与结构 概念与结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元…

算法练习-分割等和子集(思路+流程图+代码)

难度参考 难度:困难 分类:动态规划 难度与分类由我所参与的培训课程提供,但需 要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记&#xff0…

[AIGC] 深入理解 Java 虚拟机(JVM)的垃圾回收

深入理解 Java 虚拟机(JVM)的垃圾回收 一、是什么 Java 虚拟机(JVM)的垃圾回收(Garbage Collection)是一种自动内存管理机制,用于释放不再使用的对象所占用的内存空间。垃圾回收的目标是回收那…

【HTML】SVG实现炫酷的描边动画

前沿 今天闲来无事,看到Antfu大佬的个性签名,觉得还是非常炫酷的,于是也想要搞一个自己的个性签名用来装饰自己的门面,不过由于手写的签名太丑了,遂放弃。于是尝试理解原理,深入研究此等密法,终…

如何录制视频?让你的录制过程更加顺畅!

录制视频是现代社会不可或缺的技能之一,无论是工作还是生活,我们都需要学会如何录制和编辑视频,可是您知道如何录制视频吗?本文将介绍两种录制视频的方法,这两种方法各有特点,可以满足不同用户的需求。 如何…

Windows制作Ubuntu的U盘启动盘

概要: 本篇演示在Windows10中制作Ubuntu22.04的U盘启动盘 一、下载Ubuntu22.04的iso文件 在浏览器中输入https://ubuntu.com去Ubuntu官网下载Ubuntu22.04的iso文件 二、下载Ultraiso 在浏览器中输入https://www.ultraiso.com进入ultraiso官网 点击FREE TRIAL&a…

腾讯云4核8G12M服务器支持多少人在线?

4核8G服务器支持多少人同时在线访问?阿腾云的4核8G服务器可以支持20个访客同时访问,关于4核8G服务器承载量并发数qps计算测评,云服务器上运行程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素&…

最高频率的图形工作站应用配置推荐

如果你的计算机速度太慢,想买一台最快的图形工作站,大幅提高你的工作效率,从专业角度,这种图形工作站不是唯一的,原因是,不同的应用、不同的算法、不同计算规模,硬件配置有很大差异,…

书生开源大模型-第2讲-笔记

1.环境准备 1.1环境 先克隆我们的环境 bash /root/share/install_conda_env_internlm_base.sh internlm-demo1.2 模型参数 下载或者复制下来,开发机中已经有一份参数了 mkdir -p /root/model/Shanghai_AI_Laboratory cp -r /root/share/temp/model_repos/inter…

大数据信用风险检测,多久查一次比较好?

自从大数据技术的出现,就被广泛的运用到金融风控行业,逐渐成为不少银行和机构进行贷前风险排查的重要工具,大数据信用的重要性也日益的显现出来,那大数据信用风险检测,多久查一次比较好呢?本文为你详细讲讲。 大数据信…

[AudioRecorder]iPhone苹果通话录音汉化破解版-使用巨魔安装-ios17绕道目前还不支持

首先你必须有巨魔才能使用!! 不会安装的,还没安装的移步这里,ios17 以上目前装不了,别看了:永久签名 | 网址分类目录 | 路灯iOS导航-苹果签名实用知识网址导航-各种iOS技巧-后厂村路灯 视频教程 【Audio…

森林消防利器:智能高压森林应急消防泵

在森林火灾防控工作中,智能高压森林应急消防泵发挥着至关重要的作用。它是一种由高强度耐腐蚀材料加工制造而成的消防泵,具有体积小、重量轻、压力大、扬程高、流量大、输水距离远等优点,运行可靠,能够迅速扑灭森林火灾&#xff0…

SG-9101CB(可编程+105℃晶体振荡器)

SG-9101CB 系列是一款高精度可编程性的晶体振荡器,能够在0.67 MHz至170 MHz的频率范围内以1ppm的步长精确调整频率。这款振荡器支持宽范围的电源电压(1.62 V至3.63V),并提供使能(OE)或待机(ST&a…

Java学习第十七节之封装

封装 package oop.demo04;//类 private:私有 public class Student {//属性私有private String name;//名字private int id;//学号private char sex;//性别private int age;//年龄//提供一些可以操作这个属性的方法!//提供一些 public 的 get,set 方法…

如何使用Net2FTP部署本地Web网站并实现远程文件共享

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人…

做temu跨境电商,必读这五大秘诀!

随着互联网的飞速发展,电商行业呈现出前所未有的繁荣景象。新兴电商平台Temu成为了众多创业者的关注焦点。本文将为您解析如何在Temu电商蓝海项目中,从自身能力建设、了解市场环境到做好定位等方面,找到属于您的成功之路。 一、自身能力建设 …

【QCA6174】SDX12+QCA6174驱动屏蔽120/124/128信道修改方案

SDX12基线版本 SDX12.LE.1.0-00215-NBOOT.NEFS.PROD-1.39743.1 问题描述 对于欧洲国家来说,默认支持DFS信道,但是有三个信道比较特殊,是天气雷达信道,如下图所示120、124、128,天气雷达信道有个特点就是在信号可以发射之前需要检测静默15min,如果信道自动选择到了天气雷达…

原创!顶级SCI优化!一键实现ICEEMDAN-NRBO-BiLSTM-Attention多变量时间序列预测!以光伏数据集为例

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 数据介绍 模型流程 创新点 结果展示 完整…

C++ STL详解:set

目录 一、简介 1.1键值对 1.2树形结构的关联式容器 二、set 2.1set简介 2.2set内部常用接口 2.1set的构造函数 2.2set迭代器 2.3判空及增删查改 三、使用例子 一、简介 在前几篇文章中&#xff0c;已经学习了二叉搜索树&#xff0c;二map和set的底层就是<key, va…

数据采集三防平板丨三防平板电脑丨停车场应用

随着现代科技的不断发展&#xff0c;三防平板已经成为许多人工作和生活的必备工具。在停车场这个场景中&#xff0c;三防平板的应用可以大大提高停车场管理的效率和安全性。 停车场是现代城市交通管理的重要组成部分&#xff0c;它直接关系到城市交通的流畅和公共安全。停车场…