Python课设-学生信息管理系统

一、效果展示图

二、前端代码

1、HTML代码

<1>index.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>首页</title>
    <link rel="stylesheet" href="../static/css/style.css">
    <script src="../static/js/vue.js"></script>
</head>

<body>
<div id='app' class="container">
    <img src="../static/img/bg.jpg"/>
    <div class="panel">
        <div class="content login">
            <div class="switch">
                <span :class='{"active": active === "login"}' @click='go("login")'>登陆</span>
                <span>/</span>
                <span :class='{"active": active === "register"}' @click='go("register")'>注册</span>
            </div>
            <div class='form' id="fromLogin">
                <template v-if='active === "register"'>
                    <div class="input"><input :class='{ hasValue: registerForm.email }' v-model='registerForm.email'
                                              type="text" name="email" id='email'/><label for="email">邮箱</label></div>
                    <div class="input"><input :class='{ hasValue: registerForm.Username }'
                                              v-model='registerForm.Username' type="text" name="Username"
                                              id="username"/><label for="username">用户名</label></div>
                    <div class="input"><input :class='{ hasValue: registerForm.Password }'
                                              v-model='registerForm.Password' type="password" name="Password"
                                              id="Password"/><label for="Password">密码</label></div>
                    <div class="input"><input :class='{ hasValue: registerForm.repeat }' v-model='registerForm.repeat'
                                              type="password" name="repeat" id="Passwordrepeat"/><label
                            for="Passwordrepeat">重复密码</label></div>
                    <span>忘记?</span>
                    <button type="submit" @click='submitRegister'>注册</button>
                </template>

                <template v-if='active === "login"'>
                    <div class="input"><input :class='{ hasValue: loginForm.Username }' v-model='loginForm.Username'
                                              type="text" name="Username" id="username"/><label
                            for="username">用户名</label></div>
                    <div class="input"><input :class='{ hasValue: loginForm.Password }' v-model='loginForm.Password'
                                              type="password" name="Password" id="Password"/><label
                            for="Password">密码</label></div>
                    <span>忘记?</span>
                    <button type="submit" @click='submitLogin'>登陆</button>
                </template>
            </div>
        </div>
    </div>
</div>

<script>
    var vue = new Vue({
        el: '#app',
        data: {
            active: 'login',
            registerForm: { email: '', Username: '', Password: '', repeat: '' },
            loginForm: { Username: '', Password: '' },
        },
        methods: {
            go(type) {
                this.active = type;
            },
            <!-- 在 submitLogin 方法中 -->
async submitLogin() {
    try {
        const response = await fetch('/login', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(this.loginForm),
        });

        const data = await response.json();
        console.log('服务器响应:', data);

        if (data.success) {
            // 登录成功,重定向到 hall.html
            window.location.href = './hall';
        } else {
            // 登录失败,显示错误信息
            this.errorMessage = '用户名或密码错误';
        }
    } catch (error) {
        console.error('登录时发生错误:', error);
    }
},

            async submitRegister() {
                try {
                    const response = await fetch('/register', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                        },
                        body: JSON.stringify(this.registerForm),
                    });

                    const data = await response.json();
                    console.log('服务器响应:', data);

                    // 根据服务器响应处理逻辑
                } catch (error) {
                    console.error('注册时发生错误:', error);
                }
            },
        },
    });


</script>

</body>

</html>
<2>hall.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>功能大厅</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            text-align: center;
        }

        .button {
            display: inline-block;
            padding: 15px 30px;
            font-size: 16px;
            font-weight: bold;
            text-decoration: none;
            color: #fff;
            background-color: #3498db;
            border-radius: 5px;
            margin: 10px;
            transition: background-color 0.3s;
        }

        .button:hover {
            background-color: #2980b9;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>学生成绩管理系统</h1>
        <a href="./gradeList" class="button" id="gradeManagementBtn">成绩管理</a>
        <a href="./sa" class="button" id="subjectAnalysisBtn">学科分析</a>
    </div>
</body>
</html>
<3>sa.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>学科分析</title>
    <!-- 引入 layui -->
    <link rel="stylesheet" href="https://www.layuicdn.com/layui/css/layui.css">
    <script src="https://www.layuicdn.com/layui/layui.js"></script>
    <!-- 引入 Chart.js 库 -->
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <!-- 引入 jQuery -->
    <script src="../static/plugins/jquery-3.7.1.min.js"></script>
    <!-- 引入基本表格插件 -->
    <script type="text/javascript" src="../static/js/jquery.basictable.min.js"></script>
    <!-- 引入响应式表格插件 -->
    <script type="text/javascript" src="../static/js/reponsetable.min.js"></script>
    <!-- 引入 layer 插件 -->
    <script type="text/javascript" src="../static/plugins/layer/layer.js"></script>
    <!-- 引入 layer 默认主题样式 -->
    <link rel="stylesheet" type="text/css" href="../static/plugins/layer/theme/default/layer.css">
    <!-- 引入自定义 CSS 样式 -->
    <link rel="stylesheet" type="text/css" href="../static/css/reponse.css">
    <link rel="stylesheet" type="text/css" href="../static/css/lib/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="../static/css/custom.css">
    <style type="text/css">
        /* 新增的样式 */
        body {
            font-family: 'Arial', sans-serif;
            margin: 20px;
        }

        h1 {
            color: #333;
        }

        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
        }

        th, td {
            padding: 10px;
            border: 1px solid #ddd;
            text-align: center;
        }

        th {
            background-color: #f2f2f2;
        }

        tr:hover {
            background-color: #f5f5f5;
        }

        .layui-layer {
            background: #fff;
        }
    </style>
</head>
<body>

<h1>学科分析</h1>

<!-- 基本表格样式 -->
<table class="layui-table">
    <thead>
        <tr>
            <th></th>
            <th>成绩1</th>
            <th>成绩2</th>
            <th>成绩3</th>
            <th>成绩4</th>
            <th>成绩5</th>
            <th>成绩6</th>
        </tr>
    </thead>
    <tbody>
        {% for student in students %}
        {% endfor %}
        <tr>
            <td>最高分</td>
            <td>{{ max_grades.g1 }}</td>
            <td>{{ max_grades.g2 }}</td>
            <td>{{ max_grades.g3 }}</td>
            <td>{{ max_grades.g4 }}</td>
            <td>{{ max_grades.g5 }}</td>
            <td>{{ max_grades.g6 }}</td>
        </tr>
        <tr>
            <td>最低分</td>
            <td>{{ min_grades.g1 }}</td>
            <td>{{ min_grades.g2 }}</td>
            <td>{{ min_grades.g3 }}</td>
            <td>{{ min_grades.g4 }}</td>
            <td>{{ min_grades.g5 }}</td>
            <td>{{ min_grades.g6 }}</td>
        </tr>
        <tr>
            <td>平均分</td>
            <td>{{ avg_grades.g1 }}</td>
            <td>{{ avg_grades.g2 }}</td>
            <td>{{ avg_grades.g3 }}</td>
            <td>{{ avg_grades.g4 }}</td>
            <td>{{ avg_grades.g5 }}</td>
            <td>{{ avg_grades.g6 }}</td>
        </tr>
    </tbody>
</table>

</body>
</html>

<4>gradeList.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>学生信息管理</title>
    <link rel="stylesheet" href="https://www.layuicdn.com/layui/css/layui.css">
    <script src="https://www.layuicdn.com/layui/layui.js"></script>
    <!-- 引入 Chart.js 库 -->
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <script src="../static/plugins/jquery-3.7.1.min.js"></script>
    <script type="text/javascript" src="../static/js/jquery.basictable.min.js"></script>
    <script type="text/javascript" src="../static/js/reponsetable.min.js"></script>
    <script type="text/javascript" src="../static/plugins/layer/layer.js"></script>
    <link rel="stylesheet" type="text/css" href="../static/plugins/layer/theme/default/layer.css">
    <link rel="stylesheet" type="text/css" href="../static/css/reponse.css">
    <link rel="stylesheet" type="text/css" href="../static/css/lib/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="../static/css/custom.css">
    <style type="text/css">
        .alertceng {
            background: #FFFFFF;
            padding: 10px;
            display: none;
        }

        .alertceng span.title {
            margin-right: 10px;
        }
    </style>
</head>
<body>
<div class="layui-fluid layadmin-homepage-fluid" style="background: #fff;width:90%;margin:0 auto;">
    <div id="page">
        <h1>学生成绩信息管理</h1>
        <table id="table" class="reponsetable"></table>
        <script type="text/html" id="editer">
            <a class="layui-btn layui-btn-xs" onclick="scatterPlot(this)">散点图</a>
            <a class="layui-btn layui-btn-xs" onclick="radarChart(this)">雷达图</a>
            <a class="layui-btn layui-btn-xs" onclick="careerPlan(this)">职业规划</a>
            <a class="layui-btn layui-btn-xs" onclick="edittr(this)">修改</a>
            <a class="layui-btn layui-btn-xs" onclick="deleteRecord(this)">删除</a>
        </script>
        <div class="btn-container">
            <button class="layui-btn" onclick="addNew();">新增信息</button>
        </div>
    </div>
</div>
<div id="editcontent" class="alertceng">
    <p><span class="title">姓名:</span><input type="text" id="name"/></p>
    <p><span class="title">成绩1:</span><input type="text" id="g1"/></p>
    <p><span class="title">成绩2:</span><input type="text" id="g2"/></p>
    <p><span class="title">成绩3:</span><input type="text" id="g3"/></p>
    <p><span class="title">成绩4:</span><input type="text" id="g4"/></p>
    <p><span class="title">成绩5:</span><input type="text" id="g5"/></p>
    <p><span class="title">成绩6:</span><input type="text" id="g6"/></p>
    <button id="saveBtn">保存</button>
    <button id="cancelBtn">取消</button>
</div>

<script type="text/javascript">
    $(document).ready(function () {
        // 使用后端传递的数据
        fetch("/get_student_data")
            .then(response => response.json())
            .then(data => {
                // 获取从后端获取的学生信息数据
                var studentData = data.data;

                // 原始数据,json构建
                $('#table').basictable({
                    breakpoint: 768
                });

                // 使用后端传递的数据
                $("#table").reponsetable({
                    "id": "table",
                    "operation": "editer",
                    "type": "numbers",
                    "colum": [
                        {"field": "name", "title": "姓名"},
                        {"field": "g1", "title": "成绩1"},
                        {"field": "g2", "title": "成绩2"},
                        {"field": "g3", "title": "成绩3"},
                        {"field": "g4", "title": "成绩4"},
                        {"field": "g5", "title": "成绩5"},
                        {"field": "g6", "title": "成绩6"}
                    ],
                    "data": studentData  // 使用后端传递的数据
                });

                // 定义按钮事件
                layui.use('layer', function () {
                    layer = layui.layer;
                });
            })
            .catch(error => console.error('获取学生信息数据时发生错误:', error));

        // 显示表单
        window.addNew = function () {
            $('#editcontent').show();
        }

        // 保存按钮点击事件
        $('#saveBtn').on('click', function () {
            // 保存操作
            var newData = {
                "name": $("#name").val(),
                "g1": $("#g1").val(),
                "g2": $("#g2").val(),
                "g3": $("#g3").val(),
                "g4": $("#g4").val(),
                "g5": $("#g5").val(),
                "g6": $("#g6").val()
            };

            // 发送异步请求保存到数据库
            $.ajax({
                type: 'POST',
                url: '/saveDataToDatabase',
                data: JSON.stringify(newData),
                contentType: 'application/json',
                success: function (response) {
                    // 处理保存成功的逻辑
                    if (response.success) {
                        // 这里可以根据实际情况做一些提示或者刷新表格等操作
                        console.log('数据保存成功');
                        // 隐藏表单
                        $('#editcontent').hide();
                        // 清空输入框
                        $('#editcontent input').val('');
                        // 刷新表格数据
                        refreshTable();
                    } else {
                        console.error('数据保存失败');
                    }
                },
                error: function (error) {
                    console.error('保存数据时发生错误:', error);
                }
            });
        });

        // 取消按钮点击事件
        $('#cancelBtn').on('click', function () {
            // 隐藏表单
            $('#editcontent').hide();
            // 清空输入框
            $('#editcontent input').val('');
        });

        // 定义刷新表格数据的函数
        function refreshTable() {
            fetch("/get_student_data")
                .then(response => response.json())
                .then(data => {
                    // 获取从后端获取的学生信息数据
                    var studentData = data.data;
                    $("#table").reponsetable("setData", studentData);
                })
                .catch(error => console.error('获取学生信息数据时发生错误:', error));
        }
        // 散点图按钮点击事件
        function scatterPlot(obj) {
            // 散点图按钮点击事件处理逻辑
            // ...
        }

        // 雷达图按钮点击事件
        function radarChart(obj) {
            // 雷达图按钮点击事件处理逻辑
            // ...
        }

        // 职业规划按钮点击事件
        function careerPlan(obj) {
            // 职业规划按钮点击事件处理逻辑
            // ...
        }
        //删除
        // 删除按钮点击事件
window.deleteRecord = function (obj) {
    var currentRowData = getCurrentRowData(obj);

    // 发送删除请求
    $.ajax({
        type: 'POST',
        url: '/deleteRecord',
        data: JSON.stringify(currentRowData),
        contentType: 'application/json',
        success: function (response) {
            if (response.success) {
                console.log('数据删除成功');
                // 刷新表格数据
                refreshTable();
            } else {
                console.error('数据删除失败');
            }
        },
        error: function (error) {
            console.error('删除数据时发生错误:', error);
        }
    });
}

// 获取当前行的学生信息
function getCurrentRowData(obj) {
    var currentRow = $(obj).closest('tr');
    var rowData = {
        name: currentRow.find('td[data-field="name"]').text(),
        g1: currentRow.find('td[data-field="g1"]').text(),
        g2: currentRow.find('td[data-field="g2"]').text(),
        // 添加其他成绩项
    };
    return rowData;
}


    // 修改按钮点击事件
    window.edittr=function (obj) {
        // 获取当前行的数据
         // 获取当前行的数据
    var currentRowData = getCurrentRowData(obj);

    // 将数据填充到表单中
    $('#name').val(currentRowData.name).prop('readonly', true); // 设置为只读
    $('#g1').val(currentRowData.g1);
    $('#g2').val(currentRowData.g2);
    $('#g3').val(currentRowData.g3);
    $('#g4').val(currentRowData.g4);
    $('#g5').val(currentRowData.g5);
    $('#g6').val(currentRowData.g6);

    // 显示表单
    $('#editcontent').show();
    }
    // 保存按钮点击事件
$('#saveBtn').on('click', function () {
    // 保存操作
    var newData = {
        "name": $("#name").val(),
        "g1": $("#g1").val(),
        "g2": $("#g2").val(),
        "g3": $("#g3").val(),
        "g4": $("#g4").val(),
        "g5": $("#g5").val(),
        "g6": $("#g6").val()
    };

    // 发送异步请求保存到数据库
    $.ajax({
        type: 'POST',
        url: '/updateRecord',  // 修改为更新路由
        data: JSON.stringify(newData),
        contentType: 'application/json',
        success: function (response) {
            // 处理更新成功的逻辑
            if (response.success) {
                console.log('数据更新成功');
                // 隐藏表单
                $('#editcontent').hide();
                // 清空输入框
                $('#editcontent input').val('');
                // 刷新表格数据
                refreshTable();
            } else {
                console.error('数据更新失败');
            }
        },
        error: function (error) {
            console.error('更新数据时发生错误:', error);
        }
    });
});

//散点图

    window.scatterPlot=function (obj) {
            // 获取当前行的数据
            // 获取当前行的数据
            var currentRowData = getCurrentRowData(obj);

            // 构建散点图数据
            var scatterChartData = {
                datasets: [{
                    label: '散点图',
                    data: [{
                        x: '成绩1',
                        y: currentRowData.g1
                    }, {
                        x: '成绩2',
                        y: currentRowData.g2
                    }, {
                        x: '成绩3',
                        y: currentRowData.g3
                    }, {
                        x: '成绩4',
                        y: currentRowData.g4
                    }, {
                        x: '成绩5',
                        y: currentRowData.g5
                    }, {
                        x: '成绩6',
                        y: currentRowData.g6
                    }],
                    backgroundColor: 'rgba(255, 99, 132, 1)' // 颜色
                }]
            };

            // 创建 canvas 元素
            var canvas = document.createElement('canvas');
            canvas.width = 400; // 设置宽度
            canvas.height = 400; // 设置高度

            // 将 canvas 元素添加到页面
            document.body.appendChild(canvas);

            // 创建散点图
            var ctx = canvas.getContext('2d');
            new Chart(ctx, {
                type: 'scatter',
                data: scatterChartData,
                options: {
                    responsive: false,
                    scales: {
                        x: {
                            type: 'category', // 设置 x 轴类型为分类
                            labels: ['成绩1', '成绩2', '成绩3', '成绩4', '成绩5', '成绩6'],
                            position: 'bottom'
                        },
                        y: {
                            type: 'linear',
                            position: 'left'
                        }
                    }
                }
            });
        }

        // 获取当前行的学生信息
        function getCurrentRowData(obj) {
            var currentRow = obj.closest('tr');
            var rowData = {
                name: currentRow.querySelector('td[data-field="name"]').textContent,
                g1: parseFloat(currentRow.querySelector('td[data-field="g1"]').textContent),
                g2: parseFloat(currentRow.querySelector('td[data-field="g2"]').textContent),
                g3: parseFloat(currentRow.querySelector('td[data-field="g3"]').textContent),
                g4: parseFloat(currentRow.querySelector('td[data-field="g4"]').textContent),
                g5: parseFloat(currentRow.querySelector('td[data-field="g5"]').textContent),
                g6: parseFloat(currentRow.querySelector('td[data-field="g6"]').textContent)
            };
            return rowData;
        }

        //雷达图
          window.radarChart=function (obj) {
            // 获取当前行的数据
            var currentRowData = getCurrentRowData(obj);

            // 构建雷达图数据
            var radarChartData = {
                labels: ['成绩1', '成绩2', '成绩3', '成绩4', '成绩5', '成绩6'],
                datasets: [{
                    label: '雷达图',
                    data: [currentRowData.g1, currentRowData.g2, currentRowData.g3, currentRowData.g4, currentRowData.g5, currentRowData.g6],
                    backgroundColor: 'rgba(75, 192, 192, 0.2)', // 填充颜色
                    borderColor: 'rgba(75, 192, 192, 1)', // 边框颜色
                    borderWidth: 1 // 边框宽度
                }]
            };

            // 创建 canvas 元素
            var canvas = document.createElement('canvas');
            canvas.width = 400; // 设置宽度
            canvas.height = 400; // 设置高度

            // 将 canvas 元素添加到页面
            document.body.appendChild(canvas);

            // 创建雷达图
            var ctx = canvas.getContext('2d');
            new Chart(ctx, {
                type: 'radar',
                data: radarChartData,
                options: {
                    responsive: false,
                    scales: {
                        r: {
                            beginAtZero: true
                        }
                    }
                }
            });
        }

        // 获取当前行的学生信息
        function getCurrentRowData(obj) {
            var currentRow = obj.closest('tr');
            var rowData = {
                name: currentRow.querySelector('td[data-field="name"]').textContent,
                g1: parseFloat(currentRow.querySelector('td[data-field="g1"]').textContent),
                g2: parseFloat(currentRow.querySelector('td[data-field="g2"]').textContent),
                g3: parseFloat(currentRow.querySelector('td[data-field="g3"]').textContent),
                g4: parseFloat(currentRow.querySelector('td[data-field="g4"]').textContent),
                g5: parseFloat(currentRow.querySelector('td[data-field="g5"]').textContent),
                g6: parseFloat(currentRow.querySelector('td[data-field="g6"]').textContent)
            };
            return rowData;
        }

        //职业规划
        // 职业规划按钮点击事件
window.careerPlan=function (obj) {
    // 获取当前行的数据
    var currentRowData = getCurrentRowData(obj);

    // 向后端发送请求,获取职业规划结果
    $.ajax({
        type: 'POST',
        url: '/careerPlan',
        data: JSON.stringify({ g6: currentRowData.g6 }),
        contentType: 'application/json',
        success: function (response) {
            if (response.success) {
                // 显示职业规划结果
                showCareerPlanDialog(response.message);
            } else {
                console.error('获取职业规划结果失败');
            }
        },
        error: function (error) {
            console.error('获取职业规划结果时发生错误:', error);
        }
    });
}

// 显示职业规划结果的对话框
function showCareerPlanDialog(message) {
    layer.open({
        title: '职业规划结果',
        content: message,
        btn: ['确定'],
        yes: function (index, layero) {
            // 点击确定按钮的回调,可以根据需要添加其他操作
            layer.close(index);
        }
    });
}

    });
</script>
</body>
</html>

 2、其他前端代码略

三、后端代码

from flask import Flask, render_template, request, jsonify
import pymysql
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

# MySQL数据库连接配置
DATABASE_CONFIG = {
    'host': '127.0.0.1',
    'user': 'root',
    'password': 'Your_Password',
    'database': 'pythonweb',
    'cursorclass': pymysql.cursors.DictCursor,
}


# 创建MySQL连接
def create_connection():
    return pymysql.connect(**DATABASE_CONFIG)


# 创建users表(如果不存在)
def create_table():
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INT AUTO_INCREMENT PRIMARY KEY,
            username VARCHAR(255) NOT NULL,
            password VARCHAR(255) NOT NULL
        )
    ''')
    conn.commit()
    conn.close()


# 创建表格(如果不存在)
create_table()


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


@app.route("/login", methods=['POST'])
def login():
    data = request.json
    username = data.get('Username')
    password = data.get('Password')

    # 在这里执行与数据库的交互逻辑,检查用户名和密码是否匹配
    user = get_user(username, password)

    # 在登录成功时返回一个 success 字段
    if user:
        return jsonify({'success': True, 'message': '登录成功'})
    else:
        return jsonify({'success': False, 'message': '无效的用户名或密码'}), 401


def get_user(username, password):
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM users WHERE username = %s AND password = %s', (username, password))   #参数化查询,避免sql注入
    user = cursor.fetchone()    #将查询结果这一行数据赋值给user变量,如果未查询到则为空
    conn.close()
    return user                 #返回查询得到的数据


# 创建grades表(如果不存在)
def create_grades_table():
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute('''
        create table if not exists grade(
            name varchar(255) not null,
            g1 int not null ,
            g2 int not null ,
            g3 int not null ,
            g4 int not null ,
            g5 int not null ,
            g6 int not null
        )
    ''')
    conn.commit()
    conn.close()

# 创建表格(如果不存在)
create_grades_table()


# 路由用于保存数据到数据库
@app.route("/saveDataToDatabase", methods=['POST'])
def save_data_to_database():
    data = request.json

    name = data.get('name')
    g1 = data.get('g1')
    g2 = data.get('g2')
    g3 = data.get('g3')
    g4 = data.get('g4')
    g5 = data.get('g5')
    g6 = data.get('g6')

    # 在这里执行与数据库的交互逻辑,将数据保存到数据库
    success = save_data_to_db(name, g1, g2, g3, g4, g5, g6)

    # 响应
    if success:
        return jsonify({'success': True, 'message': '数据保存成功'})
    else:
        return jsonify({'success': False, 'message': '数据保存失败'}), 500


def save_data_to_db(name, g1, g2, g3, g4, g5, g6):
    try:
        conn = create_connection()
        cursor = conn.cursor()
        cursor.execute('INSERT INTO grade (name, g1, g2, g3, g4, g5, g6) VALUES (%s, %s, %s, %s, %s, %s, %s)',
                       (name, g1, g2, g3, g4, g5, g6))
        conn.commit()
        conn.close()
        return True
    except Exception as e:
        print(f"Error saving data to database: {e}")
        return False


# 跳转hall.html界面的路由函数
@app.route("/hall")
def hall():
    return render_template("hall.html")


# 跳转gradeList.html界面的路由函数
@app.route("/gradeList")
def gL():
    return render_template("gradeList.html")


@app.route("/get_student_data")
def get_student_data():
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute('SELECT name, g1, g2, g3, g4, g5, g6 FROM grade')
    student_data = cursor.fetchall()
    conn.close()
    return jsonify({"data": student_data})


# 删除路由
# 路由用于删除数据
@app.route("/deleteRecord", methods=['POST'])
def delete_record():
    data = request.json

    name = data.get('name')
    g1 = data.get('g1')
    g2 = data.get('g2')
    # 添加其他成绩项

    # 在这里执行与数据库的交互逻辑,将数据从数据库中删除
    success = delete_record_from_db(name, g1, g2)

    # 响应
    if success:
        return jsonify({'success': True, 'message': '数据删除成功'})
    else:
        return jsonify({'success': False, 'message': '数据删除失败'}), 500


def delete_record_from_db(name, g1, g2):
    try:
        conn = create_connection()
        cursor = conn.cursor()
        cursor.execute('DELETE FROM grade WHERE name = %s AND g1 = %s AND g2 = %s',
                       (name, g1, g2))
        conn.commit()
        conn.close()
        return True
    except Exception as e:
        print(f"Error deleting data from database: {e}")
        return False


# 路由用于更新数据
@app.route("/updateRecord", methods=['POST'])
def update_record():
    data = request.json

    name = data.get('name')
    g1 = data.get('g1')
    g2 = data.get('g2')
    g3 = data.get('g3')
    g4 = data.get('g4')
    g5 = data.get('g5')
    g6 = data.get('g6')

    # 在这里执行与数据库的交互逻辑,将数据更新到数据库
    success = update_record_in_db(name, g1, g2, g3, g4, g5, g6)

    # 响应
    if success:
        return jsonify({'success': True, 'message': '数据更新成功'})
    else:
        return jsonify({'success': False, 'message': '数据更新失败'}), 500


def update_record_in_db(name, g1, g2, g3, g4, g5, g6):
    try:
        conn = create_connection()
        cursor = conn.cursor()
        cursor.execute('UPDATE grade SET g1=%s, g2=%s, g3=%s, g4=%s, g5=%s, g6=%s WHERE name=%s',
                       (g1, g2, g3, g4, g5, g6, name))
        conn.commit()
        conn.close()
        return True
    except Exception as e:
        print(f"Error updating data in database: {e}")
        return False


# 路由用于职业规划
@app.route("/careerPlan", methods=['POST'])
def career_plan():
    data = request.json
    g6 = data.get('g6')

    # 根据成绩6进行职业规划
    career = plan_career(int(g6))

    # 响应
    return jsonify({'success': True, 'message': career})


# 根据成绩6进行职业规划
def plan_career(g6):
    if g6 > 100:
        return '黑客'
    elif 80 <= g6 <= 100:
        return '算法设计师'
    elif 60 <= g6 < 80:
        return '运维工程师'
    elif 40 <= g6 < 60:
        return '电脑维修工'
    else:
        return '板砖'


@app.route("/sa")
def sa():
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute('SELECT name, g1, g2, g3, g4, g5, g6 FROM grade')
    students = cursor.fetchall()

    # 计算最高分、最低分和平均分
    max_grades = {'g1': max(student['g1'] for student in students),
                  'g2': max(student['g2'] for student in students),
                  'g3': max(student['g3'] for student in students),
                  'g4': max(student['g4'] for student in students),
                  'g5': max(student['g5'] for student in students),
                  'g6': max(student['g6'] for student in students)}

    min_grades = {'g1': min(student['g1'] for student in students),
                  'g2': min(student['g2'] for student in students),
                  'g3': min(student['g3'] for student in students),
                  'g4': min(student['g4'] for student in students),
                  'g5': min(student['g5'] for student in students),
                  'g6': min(student['g6'] for student in students)}

    avg_grades = {'g1': sum(student['g1'] for student in students) / len(students),
                  'g2': sum(student['g2'] for student in students) / len(students),
                  'g3': sum(student['g3'] for student in students) / len(students),
                  'g4': sum(student['g4'] for student in students) / len(students),
                  'g5': sum(student['g5'] for student in students) / len(students),
                  'g6': sum(student['g6'] for student in students) / len(students)}

    conn.close()
    return render_template("sa.html", students=students, max_grades=max_grades, min_grades=min_grades,
                           avg_grades=avg_grades)


if __name__ == '__main__':
    app.run(debug=True)

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

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

相关文章

C语言(内存函数)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

Python魔法之旅-魔法方法(10)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

【Python系列】Python的多返回值

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ClickHouse 使用技巧总结

文章目录 数据导入、导出技巧外部文件导入导技巧使用集成表引擎导入、导出数据 建表技巧表引擎选择技巧分区键选择技巧数据结构选择技巧分区技巧 高级技巧物化视图投影位图变更数据捕获 常见报错及处理方法 数据导入、导出技巧 外部文件导入导技巧 ClickHouse作为OLAP即席分析…

opencv-python(二)

马赛克 img cv2.imread(./bao.jpeg)print(img.shape)img2 cv2.resize(img,(35,23))img3 cv2.resize(img2,(900,666))cv2.imshow(bao,img3)cv2.waitKey(0)cv2.destroyAllWindows()img2 cv2.resize(img, (90,66))img3 np.repeat(img2, 10, axis 0) # 重复行img4 np.repeat(…

I2C LCD1602液晶显示屏

前言 本文实现在 LCD1602显示屏的使用。 显示屏使用带I2C转接板的,如下图所示。 并且会做一些有趣的显示方式。 效果预览 材料准备 材料数量价格Arduino nuo118杜邦线411602A显示屏110 依赖库下载 本文使用都库在 arduino ide 中搜索 LiquidCrystal_I2C 即可找到。 注意作…

混合动力电动汽车介绍(一)

电动汽车发展的技术背景主要包含环境问题和能源问题两大方面。环境问题的表现形式为空气污染&#xff0c;而能源问题的表现形式为现有能源供应体系对化石燃料的过分依赖。《新能源汽车产业发展规划&#xff08;2021-2035&#xff09;》中明确我国新能源汽车技术研发的“三纵”、…

kivy.garden.matplotlib

matplotlib 是什么 # pip install matplotlib2.2.2 from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg FigureCanvasKivyAgg class FigureCanvasKivyAgg(FigureCanvasKivy, FigureCanvasAgg):FigureCanvasKivyAgg class. See module documentation f…

SickOS1.1 - Shellshock原理和利用过程精讲

SickOS1.1的另一种思路&#xff1b;用另一种方法打透这台机器 Nikto扫描 正常都是-h扫描&#xff1b;有代理就用-useproxy 指向的代理ip:端口 nikto -h 192.168.218.157 -useproxy 192.168.218.157:3128apache版本&#xff0c;有点低&#xff0c;现在都是2.4.54版本了&#x…

Cobaltstrike常用功能

一、快捷工具栏 3、需要创建监听器&#xff0c;才能让靶机上线&#xff0c;连接我们公网服务端上去开启的帧监听端口&#xff0c;做任何操作 都是通过服务器的IP地址去连接靶机&#xff0c;去和靶机进行文件stage的一个传输和交互。这里推荐把cs 放到公网上边&#xff0c;比较…

通过LabVIEW提升生产设备自动化水平

现代制造业对生产设备的自动化水平提出了越来越高的要求。使用LabVIEW这一强大的图形化编程环境&#xff0c;可以显著提升生产设备的自动化程度&#xff0c;改善生产效率和产品质量。本文将详细分析如何通过LabVIEW改善生产设备的自动化水平&#xff0c;并提供具体的实施策略与…

数论1---整除

概念与基本性质就不说了 例题1&#xff1a;已知a|n&#xff0c;b|n.且axby1,求证&#xff1a;ab|n 即&#xff1a; 所以&#xff1a;ab|n 例题2&#xff1a;设m是一个大于2的正整数&#xff0c;证明&#xff1a;对于任意正整数n&#xff0c;都有 由于我不想打公式了直接拍照…

opencv进阶 ——(九)图像处理之人脸修复祛马赛克算法CodeFormer

算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发&#xff0c;它能够接收模糊或马赛克图像作为输入&#xff0c;并生成更清晰的原始图像。算法源码地址&#xff1a;https://github.com/sczhou/CodeFormer…

SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要

上面讲了SAP里面的基础知识&#xff0c;BOM&#xff0c;作业手顺&#xff08;工艺路线&#xff09;&#xff0c;作业区&#xff08;工作中心&#xff09;&#xff0c;MRP&#xff0c;MPS等概念&#xff0c;现在该到用的时候了。 SAP PP学习笔记07 - 简单BOM&#xff0c;派生BO…

【教程】如何实现WordPress网站降级(用于解决插件和主题问题)

在最新可用版本上运行WordPress安装、插件和主题是使用该平台的关键最佳实践。还建议使用最新版本的PHP。但是,在某些情况下,这是不谨慎或不可能的。 如果您发现自己处于这种情况,您可能需要撤消更新并降级您的WordPress网站(或其中的一部分)。幸运的是,有一些方法可用于…

uniapp 怎么设置凸起的底部tabbar

1. uniapp 怎么设置凸起的底部tabbar 1.1. 方案一系统提供 1.1.1. 使用uniapp官方提供的属性midButton 使用时&#xff0c;list数组须为偶数 &#xff08;1&#xff09;pages.json "tabBar": {"custom": true,"color": "#8F8F94",&q…

推荐网站(19)anytools图片分辨率处理网站

今天&#xff0c;我要向您推荐一个非常实用的在线图片处理工具网站——AnyTools。这个网站提供了一站式的图片分辨率处理服务&#xff0c;并且具备添加各种过滤器的功能&#xff0c;非常适合需要快速调整图片大小和风格优化的场合。 多分辨率支持&#xff1a;用户可以自定义图片…

(南京观海微电子)——LVD屏介绍

LVDS&#xff08;Low Voltage Differential Signaling&#xff0c;即 低电压差分信号 &#xff09; 接口又称 RS-644 总线接口&#xff0c;是20世纪90年代才提出的一种 数据传输 和接口技术。 LVDS接口是美国NS美国国家半导体公司为克服以 TTL电平 方式传输宽带高码率数据时功…

Linux--线程的互斥

线程系列&#xff1a; 一、线程的认识&#xff1a;线程的认识&#xff1a;误进解线程的概念和线程的基本控制 二、Linux–线程的分离、线程库的地址关系的理解、线程的简单封装 线程的互斥 线程互斥&#xff08;Thread Mutual Exclusion&#xff09;是多线程编程中的一个重要概…

软件测试进阶

目录 一、自动化测试 1.概念 2.Selenium 2.1 概念 2.1.1 Selenium是什么&#xff1f; 2.1.2 Selenium特点 2.1.3 工作原理 2.2 SeleniumJava环境搭配 2.3 定位元素 2.3.1 CSS语法 2.3.2 XPath语法 2.4 应用 2.4.1 点击提交文本 2.4.2 模拟输入 2.4.3 清除文本 2…