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.rhkb.cn/news/269868.html

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

相关文章

DNS域名解析

DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。…

物联网与智慧城市:融合创新,塑造未来城市生活新图景

一、引言 在科技飞速发展的今天,物联网与智慧城市的融合创新已成为推动城市发展的重要力量。物联网技术通过连接万物,实现信息的智能感知、传输和处理,为智慧城市的构建提供了无限可能。智慧城市则运用物联网等先进技术,实现城市…

网络编程的学习

思维导图 多路复用代码练习 select完成TCP并发服务器 #include<myhead.h> #define SER_IP "192.168.125.73" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接字int sfd -1;s…

[NSSCTF 2nd] web复现

1.php签到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

python一张大图找小图的个数

python一张大图找小图的个数 一、背景 有时候我们在浏览网站时&#xff0c;发现都是前端搞出来的一张张图&#xff0c;我们只能用盯住屏幕的小眼睛看着&#xff0c;很累的统计&#xff0c;这个是我在项目中发现没办法统计&#xff0c;网上的教程很多&#xff0c;都不成功&…

【ELK日志分析系统】ELK+Filebeat分布式日志管理平台部署

ELKFilebeat部署一、ELK简介1、ELK组件1.1 其他组件 2、为什么要使用 ELK3、完整日志系统基本特征 二、ELK的工作原理三、ELK Elasticsearch 集群部署1、环境准备2、部署 Elasticsearch 软件(node节点)2.1 安装elasticsearch—rpm包2.2 修改elasticsearch主配置文件2.3 es性能调…

华为昇腾系列——入门学习

概述 昇腾&#xff08;Ascend&#xff09;是华为推出的人工智能处理器品牌&#xff0c;其系列产品包括昇腾910和昇腾310芯片等。 生态情况 众所周知&#xff0c;华为昇腾存在的意义就是替代英伟达的GPU。从事AI开发的小伙伴&#xff0c;应该明白这个替代&#xff0c;不仅仅是…

IDEA切换JDK版本超详细步骤

&#x1f600; IDEA切换JDK版本详细教程&#xff0c;全网步骤最详细&#xff0c;实测可用。 文章目录 第一步、选择SDKs切换SDK版本&#xff1a;第二步、选择Modules切换Sources和Dependencies版本&#xff1a;第三步、选择Project切换SDK和Language Level版本&#xff1a;第四…

2195. 深海机器人问题(网络流,费用流,上下界可行流,网格图模型)

活动 - AcWing 深海资源考察探险队的潜艇将到达深海的海底进行科学考察。 潜艇内有多个深海机器人。 潜艇到达深海海底后&#xff0c;深海机器人将离开潜艇向预定目标移动。 深海机器人在移动中还必须沿途采集海底生物标本。 沿途生物标本由最先遇到它的深海机器人完成采…

CSS块元素,CSS的伪类和伪元素

学习建议 在你开始入手学习前&#xff0c;有一些小的建议。根据我自己学习的经验发现&#xff0c;这些建议在现在乃至我以后的岗位生涯里都是有很大帮助的。还有就是开始学习前&#xff0c;建议可以先花几天时间&#xff0c;查找一些如何入门的文章&#xff0c;通过对许多文章…

ArcGIS Server发布WMS影像地图服务并用Leaflet加载(附代码)

前言 滴滴滴&#xff01;&#xff01;&#xff01;&#x1f913;&#x1f913;&#x1f913;在本系列中&#xff0c;博主将详细撰写WebGIS中各大主流平台发布地图服务(WMS,WTMS等)的详细图文教程。今天&#xff0c;我们首先演示如何使用 ArcMap 和 ArcGIS Server发布一个台湾地…

Linux 学习笔记(12)

十二、 系统服务 1 、系统服务分类&#xff0c;根据其使用的方法来分&#xff0c;可以被分为三类 a、由 init 控制的服务&#xff1a;基本都是系统级别的服务&#xff0c;运行级别这一章讲的就是这一类的服务 b、由 System V 启动脚本启动的服务&#xff1a;和我们打交道最多…

如何恢复已删除的华为手机图片?5 种方式分享

不幸的现实是&#xff0c;华为的珍贵时刻有时会因为意外删除、软件故障或其他不可预见的情况而在眨眼之间消失。在这种情况下&#xff0c;寻求恢复已删除的图片成为个人迫切关心的问题。 本文旨在为用户提供如何从华为恢复已删除图片的实用解决方案。我们将探索五种可行的方法…

矩阵错题本

《1800》 1 逗号中间全是0啊 2 代入转置即可证明 3 只是凭借感觉 4 线性代数真的是细节狂魔 经过若干次初等变换&#xff0c;秩相等 5 P1的逆为啥是P1 6 越排后的矩阵变换越排前 对角线矩阵的逆矩阵&#xff0c;除了对角线元素&#xff0c;全换号 7 根据题设给出来的矩阵求…

数据结构学习(四)高级数据结构

高级数据结构 1. 概念 之所以称它们为高级的数据结构&#xff0c;是因为它们的实现要比那些常用的数据结构要复杂很多&#xff0c;能够让我们在处理复杂问题的过程中&#xff0c; 多拥有一把利器&#xff0c;同时掌握好它们的性质&#xff0c;以及所适应的场合&#xff0c;在…

JavaWeb - 2 - HTML、CSS

什么是HTML、CSS&#xff1f; HTML&#xff08;HyperText Markup Language&#xff09;&#xff1a;超文本标记语言 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容 标记语言&…

安装mysql this application requires visual studio 2019 x64报错

提示 this application requires visual studio 2019 x64 缺少依赖 安装依赖 选择对应版本 安装 依赖安装地址 成功进入安装界面

三色标记过程

可达性分析 GC过程中需要对对象图遍历做可达性分析。使用了三色标记法进行分析。 什么三色&#xff1f; 白色&#xff1a;尚未访问过。 黑色&#xff1a;本对象已访问过&#xff0c;而且本对象 引用到 的其他对象 也全部访问过了。 灰色&#xff1a;本对象已访问过&#xff0…

day11_SpringCloud(Nacos注册中心,LoadBalancer,OpenFeign)

文章目录 Spring Cloud Alibaba1 系统架构演进1.1 单体架构1.2 微服务架构1.3 分布式和集群 2 Spring Cloud Alibaba概述2.1 Spring Cloud简介2.2 Spring Cloud Alibaba简介 3 微服务环境准备3.1 工程结构说明3.2 父工程搭建3.3 用户微服务搭建3.3.1 基础环境搭建3.3.2 基础代码…

SkyWalking链路追踪上下文TraceContext的traceId生成的实现原理剖析

结论先行 【结论】 SkyWalking通过字节码增强技术实现&#xff0c;结合依赖注入和控制反转思想&#xff0c;以SkyWalking方式将追踪身份traceId编织到链路追踪上下文TraceContext中。 是不是很有趣&#xff0c;很有意思&#xff01;&#xff01;&#xff01; 【收获】 skywal…