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 connectionexcept mysql.connector.Error as err:print(f"Error: {err}")return Nonedef 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 herecursor.execute(query)result = cursor.fetchone()elif role == '老师':table_name = 'admin_teachers'# Check administrator logincursor = 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 herecursor.execute(query)result = cursor.fetchone()elif role == '学生':table_name = 'admin_students'# Check administrator logincursor = 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 herecursor.execute(query)result = cursor.fetchone()if result:# Save login record in data_8save_login_record(connection, role, account)return bool(result)except mysql.connector.Error as err:print(f"Error: {err}")return Falsefinally: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'] = roleif role == '学生':session['account'] = accountprint("===================",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 neededdef get_table_name(role):# Implement logic to determine the table name based on the roleif role == '管理员':return 'admin'elif role == '老师':return 'admin_teachers'elif role == '学生':return 'admin_students'else:return Nonedef 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 dictionariesfor row in login_records:data_8.append({'role': row[0],'account': row[1],'login_time': row[2]})return data_8except 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 databaseconnection = mysql.connector.connect(host='localhost',user='root',password='123456',database='Student')cursor = connection.cursor()# Execute a query to fetch data from the admin tablequery = "SELECT Mainid, Username, Password, Name FROM admin"cursor.execute(query)# Fetch all rows from the resultrows = cursor.fetchall()# Convert rows to a list of dictionariesfor 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 connectioncursor.close()connection.close()return data

百度云链接:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins发送邮件、定时执行、持续部署

集成Allure报告只需要配置构建后操作即可。但如果是web自动化,或是用HTMLTestRunner生成报告,构建后操作要选择Publish HTML reports,而构建中还要添加Execute system Groovy script插件,内容: System.setProperty(&q…

【数据结构】用队列实现栈

下面是一些思路分析和代码分享,有需要借鉴即可。 1.问题描述 我想用队列来实现栈的功能,具体而言是用两个队列做底层做出栈的功能来。 有人可能会疑问会不会多次一举,这里仅作练习,为了更加进一步了解栈/队列的性质 2.思路分析 …

基于Spring Boot+ Vue的房屋租赁系统

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

抉择与发展:详解程序员在前端、后端与数据科学赛道上的职业定位与成长路径

作为一个程序员,选择职业赛道就像是在一座迷宫中探索前端的美丽花园,后端的黑暗洞穴,还有数据科学的神秘密室。每一条赛道都充满了挑战和机遇,而选择哪一条赛道将直接影响到你未来的职业发展和成就。对于每一位准备投身或已经在编…

搜维尔科技:捕获、分析、优化,使用 Xsens Ergo 创建更安全的工作空间

简化人体工程学分析,优先考虑员工福祉,并利用客观数据和见解提高生产力。 捕获。分析。优化。使用 Xsens Ergo 创建更安全的工作空间 1.质量数据 使用高质量、客观且经过验证的运动数据进行详细的人体工程学分析 2.随处使用 在最具挑战性的工作环境中…

HarmonyOS Stage模型 用程序运行切换 验证UIAbility 启动模式(下) 验证:specified启动模式 Ability间切换

上文 HarmonyOS Stage模型 用程序运行切换 验证UIAbility 启动模式(上) 验证:singleton、multiton、standard启动模式 我们已经验证完了 singleton multiton standard 三种启动模式 留下了毕竟复杂的 specified 这里 首先 我们要写两个不同的界面 index 编写代码如下 import…

centos 搭建ftp服务器

项目上需要用到ftp文件服务同步,所以在测试环境进行搭建,其中遇到了一些问题,遂记录。 1、安装vsftpd软件包 打开终端并输入以下命令来安装vsftpd yum install vsftpd -y 2、运行vsftpd systemctl start vsftpd 3、测试匿名连接 我这里…

Vue组件间通信实践

Vue组件间通信实践 🌟 前言 欢迎来到我的小天地,这里是我记录技术点滴、分享学习心得的地方。📚 🛠️ 技能清单 编程语言:Java、C、C、Python、Go、前端技术:Jquery、Vue.js、React、uni-app、EchartsUI设…

蓝桥杯每日一题(二分)

//1460 我在哪 暴力方法改了40分钟,好在ac了 思路:依次枚举所有字符(外层循环); 第一个没有注意的点:没有加j的中间那层循环,直接用的while,这样会导致i后面可能有多个j的位置与i…

激光雷达点云数据邻域特征计算理论知识学习

一、数学理论 (一)SVD奇异值分解(Singular value decomposition) 奇异值分解是线性代数中一种重要的矩阵分解,在信号处理、统计学等领域有重要应用。奇异值分解在某些方面与对称矩阵或埃尔米特矩阵基于特征向量的对角…

Java学习笔记007——接口的应用

1、接口的转换(向下) 子类对向和父类对象可以进行类型转化。接口也一样可以。 package com.test;// 接口Animal public interface Animal {void bark(); //等价于public abstract void bark();void move(); //等价于public abstract void move(); }pac…

Spring总结之构造注入

构造注入&#xff1a; Spring调用类的有参构造&#xff0c;在构造方法中给属性赋值 构造注入使用的是<constructor-arg>标签&#xff0c;一个<constructor-arg>标签表示构造方法的一个参数。 <constructor-arg>标签属性&#xff1a; name&#xff1a;表示构…

C 数据类型

在 C 语言中&#xff0c;数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 C 中的类型可分为以下几种&#xff1a; 序号类型与描述1基本数据类型 它们是算术类型&#xff0c;包括整型…

pytest 教程

1. 安装pytest 目前我使用的python版本是3.10.8 pip install pytest命令会安装下面的包&#xff1a; exceptiongroup-1.2.0-py3-none-any.whl iniconfig-2.0.0-py3-none-any.whl packaging-23.2-py3-none-any.whl pluggy-1.4.0-py3-none-any.whl pytest-8.0.2-py3-none-any.…

线性代数笔记10--矩阵的四个基本子空间

0. 引入 矩阵 A m n A_{m \times n} Amn​ 1. 列空间 C ( A ) C(A) C(A)在 R m R^m Rm中 d i m ( C ( A ) ) p i v o t _ c o l u m n _ c n t r a n k ( A ) r dim(C(A))pivot\_column\_cnt rank(A)r dim(C(A))pivot_column_cntrank(A)r 2. 零空间 N ( A ) N(A) N(A)…

web自动化笔记十六:日志收集

日志的作用&#xff1a; -调试程序 -了解系统程序运行情况&#xff0c;是否正常 -系统程序运行故障分析与问题定位 -用来做用户行为分析的数据统计 日志级别&#xff1a;是指日志信息的优先级、重要性或者严重程度 DEBUG&#xff1a;调试级别&#xff0c;…

Kubernetes 外部 HTTP 请求到达 Pod 容器的全过程

文章目录 1、问题一2、HTTP 请求流转过程概述图3、详细过程分析4、容器技术底座5、问题二6、详细过程分析(补充) 1、问题一 当外部发送一个HTTP/HTTPS 请求到Kubernetes 集群时&#xff0c;它是如何达到 Pod 中的 container 的呢&#xff1f; 2、HTTP 请求流转过程概述图 3、…

Scrapy与分布式开发(2.8):布隆过滤器原理及应用

布隆过滤器原理及应用 定义 布隆过滤器&#xff08;Bloom Filter&#xff09; 是一种空间效率极高的概率型数据结构&#xff0c;用于测试一个元素是否在一个集合中。它的优点是空间效率和查询时间都远超过一般的算法&#xff0c;缺点是有一定的误识别率和删除困难。 原理 布…

【论文阅读】(DALLE-3)Improving Image Generation with Better Captions

&#xff08;DALLE-3&#xff09;Improving Image Generation with Better Captions 文章目录 &#xff08;DALLE-3&#xff09;Improving Image Generation with Better Captions简介Method实验 引用&#xff1a; Betker J, Goh G, Jing L, et al. Improving image generation…

【数据存储】大端存储||小端存储(超详细解析,小白一看就懂!!!)

目录 一、前言 二、什么是低地址、高地址 &#xff1f; 三、什么是数据的高位和低位 &#xff1f; 四、什么是大小端存储&#xff1f; &#x1f349; 小端存储详解 &#x1f352; 大端存储详解 五、为什么会有大小端存储&#xff1f; &#x1f34d;大端存储的优点 &#…