Python 学生管理系统+mysql+Flask

前言

记录国庆假期作业。
作业要求:
现需要设计一个学生管理系统,首先,需要通过键盘对学生个人信息进行录入,并将学生的个人信息存储到mysql数据库中,同时系统还需要实现查询所有入库的学生信息、根据姓名查询某个学生的信息、修改某个学生的信息(其中学号唯一创建后不得修改)以及删除某个学生的信息。其中学生的个人信息包含:学号(长度最长为20且为数字字符)、姓名(只得由中英文字符组成不得包含数字及其他字符)、性别(只能是男女)、年龄(正整数)、班级、专业。
要求:(1)要有系统菜单栏选项(2)对输入数据需要进行要有合理的提示及限定不符合逻辑的异常处理情况。(3)学生信息需要使用面向对象的编程去实现,合理设计学生对象的属性及行为(方法)。(4)管理系统中的每一个功能的操作都要与mysql数据库里的数据表同步。

在做这个作业时,我也刚好在这不久前学了些vue2,所以就用这个作业来记录一下 一个简单的前后端分离版的学生管理系统,并巩固一下vue2。
主要用到的技术有:
Python+mysql(对pymysql进行封装的)+Flask(会点)+vue2+axios+Element-ui+pyecharts(数据可视化只用了一处)。

效果展示:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


项目目录

目录很简单,就四个主文件夹,main.py程序入口。

在这里插入图片描述


config

用于配置本地mysql数据库的连接信息。
(注意:必须要配置好本地mysql数据库的连接信息后,才能使用且格式如下!!!)
在这里插入图片描述


py

这个里面就是我们后端开发的python代码了,至于里面的结构层次我是学着Java SpringBoot里面来做的。
controller:控制层(web层),用来与前端传过来的参数进行操作交互的;
entity:实体类,里面放了一个student学生类;
mapper:数据层(dao层),对数据库进行数据持久化操作,这里就是要实现对学生的信息进行一些增删查改的操作来保存到mysql数据库中;
service:至于业务层,这个作业的功能太简单了,根本都用不了,而且用python的写法也用不了写这一层(感觉),所以这里就没有写;
result:R类统一后端返回给前端的数据格式;
utils:存放工具类的地方,这里面我放了一个自定义的异常类工具,和自己封装好了的mysql工具类(就是对简单地sql增删查改语句进行封装,模仿着mybatis-plus来做的,当然我这个菜鸟封装的功能完全根本比不了mybatis-plus实现的功能,只是学着写着玩,哈哈哈!)

mapper.student_mapper.py

这里面我已经写好了创建tb_student表的语句,所以你们要运行这个项目的话,只需要配置好本地mysql数据库的连接信息即可。

from py.utils.mysql_util import ConnectMysql, MySql

table_name = "tb_student"

sql = f'''
    create table {table_name}(
    id int NOT NULL AUTO_INCREMENT unique,
    sno char(20) NOT NULL unique,
    sname varchar(50),
    ssex char(2),
    sage int ,
    sclass varchar(50),
    sdept varchar (50),
    PRIMARY KEY(id,sno))DEFAULT CHARSET=utf8;
    '''
ConnectMysql.create_table(sql)

# 操作tb_student表,返回一个studentMapper对象用来操作tb_student表
studentMapper = MySql(operate_tablename=table_name)

static

用来存放前端静态资源的地方。这个里面有很多的css、js等与这个作业无关,至于为什么会有这么多无关的文件喃,那当然是我直接对一个后端模板(H+)进行修改后得到的,并且我又看不懂前端的内容,所以就没有删除这些无用的文件。


templates

放html页面的地方。


主要代码块


student_controller.py

这里面对部分数据(学生信息)进行了规则校验。

import re
from py.mapper.student_mapper import studentMapper
from py.entity.student_entity import Student
from py.utils.my_exception_util import MyException
from py.result import R
from flask import render_template, Blueprint, request

bp = Blueprint('student_controller', __name__, url_prefix='/')

# 默认访问(首页)
@bp.route('/studentSystem')
def student_system():
    return render_template('student_management.html')

# 添加学生
@bp.route('/studentSystem/addStudent',methods=["POST"])
def add_student():
    form_data = request.get_json()
    try:
        if len(form_data) != 6:
            raise MyException("数据不能为空!")
        if not re.match("^[0-9]{1,20}$", form_data['sno']):
            raise MyException("学号长度最长为20且为数字字符!")
        if studentMapper.select_by_sql(f"select sno from tb_student where sno = '{form_data['sno']}'"):
            raise MyException("该学号已被使用!")
        if not form_data['sname'].isalpha():
            raise MyException("姓名只能包含中英文,不能包含数字和其他字符。")
        if not form_data['ssex'] in ('男', '女'):
            raise MyException("性别只能是男或女")
        try:
            int(form_data['sage'])
        except:
            raise MyException("年龄只能是正整数")
        s = Student(**form_data)
        studentMapper.insert((s.get_sno(),s.get_sname(),s.get_ssex(),s.get_sage(),s.get_sclass(),s.get_sdept()))
        return R.success(message="添加成功")
    except Exception as e:
        return R.error(message=f"添加失败\n{str(e)}")

# 查询所有学生
@bp.route('/studentSystem/getAllStudent')
def get_all_student():
    try:
        return R.success(studentMapper.MapEntity(studentMapper.select_all()))
    except Exception as e:
        return R.error(message=f"查询失败\n{str(e)}")

# 条件查询,根据学生姓名
@bp.route('/studentSystem/conditionQuery/<snameQuery>')
def get_one_student_by_sname(snameQuery):
    try:
        sql = f"select * from tb_student where sname like '{snameQuery}%'"
        return R.success(studentMapper.MapEntity(studentMapper.select_by_sql(sql)))
    except Exception as e:
        return R.error(message=f"查询失败\n{str(e)}")

@bp.route('/studentSystem/updateStudent/<id>')
def update_student_by_id(id):
    try:
        return R.success(studentMapper.MapEntity(studentMapper.select_by_id(id)))
    except Exception as e:
        return R.error(message=f"编辑失败\n{str(e)}")
# 修改学生通过id
@bp.route('/studentSystem/updateStudent',methods=["POST"])
def update_student_by_id2():
    try:
        form_data = request.get_json()
        if not form_data['sname'].isalpha():
            raise MyException("姓名只能包含中英文,不能包含数字和其他字符。")
        if not form_data['ssex'] in ('男', '女'):
            raise MyException("性别只能是男或女")
        try:
            int(form_data['sage'])
        except:
            raise MyException("年龄只能是正整数")
        studentMapper.update_by_id(form_data.pop('id'), form_data)
        return R.success(message="修改成功")
    except Exception as e:
        print(e)
        return R.error(message=f"修改失败\n{str(e)}")

# 删除学生通过id
@bp.route('/studentSystem/deleteStudent/<id>')
def delete_student_by_id(id):
    try:
        studentMapper.delete_by_id(id)
        return R.success(message="删除成功")
    except Exception as e:
        print(e)
        return R.error(message=f"删除失败\n{str(e)}")

mysql_util.py

import pymysql

# 从配置文件中读取连接mysql的信息
def connect_mysql():
    mysql_config = {}
    try:
        with open("./config/mysql_config.txt", mode="r", encoding="utf-8") as f:
            for line in f:
                if line.startswith("#"):
                    continue
                r = line.strip().split("=")
                mysql_config[r[0]] = r[1]
                if r[0].lower() == "port":
                    mysql_config[r[0].lower()] = int(r[1])
        return mysql_config
    except Exception as e:
        raise Exception(f"配置有文件异常!!!\n{e}")

# 必须先连接数据库
class ConnectMysql:
    CONNECT_MYSQL_DB_OBJ = None
    @staticmethod
    def connect_mysql(my_sqldb_config_param: dict):
        print("connect_mysql...")
        assert isinstance(my_sqldb_config_param, dict), "请以字典类型的格式传入!"
        try:
            ConnectMysql.CONNECT_MYSQL_DB_OBJ = pymysql.connect(**my_sqldb_config_param)  # 连接数据库,配置参数
            print(f"{my_sqldb_config_param['database']}————数据库连接成功")
        except Exception as e:
            raise Exception(f"数据库连接失败!!!\n请检查数据库配置参数是否正确或检查本地数据库是否已启动!\n{e}")
    @staticmethod
    def create_table(sql):
        try:
            cursor = ConnectMysql.CONNECT_MYSQL_DB_OBJ.cursor()
            cursor.execute(sql)  # 执行sql语句
            ConnectMysql.CONNECT_MYSQL_DB_OBJ.commit() # 执行sql语句后,进行提交
            cursor.close()
            print("表创建成功")
        except Exception as e:
            ConnectMysql.CONNECT_MYSQL_DB_OBJ.rollback()  # 执行sql语句失败,进行回滚
            print("表创建失败:",e)

ConnectMysql.connect_mysql(connect_mysql())

# 操作某一个表类
class MySql:
    def __init__(self, operate_tablename:str):
        self._operate_tablename = operate_tablename
        try:
            self._conn = ConnectMysql.CONNECT_MYSQL_DB_OBJ
            self._cursor = self._conn.cursor() # 创建一个游标,用来执行查询
            self._get_field() # 获取此表中的字段名
        except Exception as e:
            raise Exception(f"数据库连接失败!!!\n请检查表名、配置参数是否正确或检查本地数据库是否已启动!\n{e}")

    # 获取_conn对象
    @property
    def get_connect(self):
        return self._conn
    # 获取_cursor对象
    @property
    def get_cursor(self):
        return self._cursor
    # 获取__desc对象
    @property
    def get_description(self):
        # print(f"{self._operate_tablename}表中的字段属性:",self._desc)
        return self._desc
    # 获取正在操作的表名
    @property
    def operate_tablename(self):
        return f"正在操作 {self._operate_tablename}表!!!"
    # 修改要操作的表
    @operate_tablename.setter
    def operate_tablename(self,operate_tablename):
        assert operate_tablename !="", "请输入要操作的表名!"
        print(f"{self._operate_tablename} 表已被更换!")
        self._operate_tablename = operate_tablename
        self._get_field()
    # 获取此表中的字段名
    def _get_field(self):
        self._cursor.execute(f"select * from {self._operate_tablename}")
        self._desc = self._cursor.description
        self._field_ = []
        for field in self._desc:
            self._field_.append(field[0])
    # 执行sql语句
    def _sql(self,sql,msg=""):
        try:
            self._cursor.execute(sql)  # 执行sql语句
            self._conn.commit() # 执行sql语句后,进行提交
            if msg:print(f"数据{msg}成功!")
            return True
        except Exception as e:
            if msg:print(f"\033[31m数据{msg}失败!!!\n{e} \033[0m")
            self._conn.rollback()  # 执行sql语句失败,进行回滚
            return False
    # 插入数据
    def insert(self, *value):
        if not isinstance(value[0],tuple): raise Exception("要求传入的参数类型为tuple元组!!!")
        if len(value) == 1: value=value[0]
        else:value = str(value)[1:-1]
        sql = f"insert into {self._operate_tablename}({','.join(self._field_[1:])}) values {value}"
        if not self._sql(sql,f"{value}插入"):
            print("\n\033[31m:请检查每一条记录字段是否正确!!!\033[0m\n")
    # 插入:自定义sql语句插入数据
    def insert_by_sql(self, sql):
        self._sql(sql,"插入")
    # 删除:通过id删除该条数据
    def delete_by_id(self,id_:int):
        sql = f"delete from {self._operate_tablename} where id = {id_}"
        if self._sql(sql):print(f"id={id_}记录,删除成功!")
        else:print(f"\n\033[31m:id = {id_}记录,删除失败!!!\033[0m\n")
    # 删除:自定义sql语句删除数据
    def delete_by_sql(self, sql):
        self._sql(sql,"删除")
    # 修改:通过id修改数据
    def update_by_id(self, id_:int, set_field:dict):
        assert isinstance(set_field,dict),"请以字典类型的格式传入!"
        tempset_field = []
        for i in set_field:
            tempset_field.append(f"{i}='{set_field[i]}'")
        set_field = ",".join(tempset_field)
        sql = f"update {self._operate_tablename} set {set_field} where id = {id_}"
        if self._sql(sql):print(f"id={id_}记录,{set_field}修改成功!")
        else:print(f"\n\033[31m:id = {id_}记录,{set_field}修改失败!!!\033[0m\n")
    # 修改:自定义sql语句修改数据
    def update_by_sql(self, sql):
        self._sql(sql,"修改")
    # 查询:通过id查询一条数据
    def select_by_id(self,id_:int,field="*"):
        if field != "*": field = ','.join(field)
        sql = f"select {field} from {self._operate_tablename} where id={id_}"
        self._cursor.execute(sql)
        return self._cursor.fetchone()
    # 查询:指定查询多少条数数据,可根据简单条件查询(where 字段=”“)
    def select_many(self,num:int,query_builder=None,field="*"):
        if field != "*": field = ','.join(field)
        sql = f"select {field} from {self._operate_tablename}"
        if query_builder:
            if isinstance(query_builder,dict) and len(query_builder) == 1:
                query_builder = list(query_builder.items())[0]
                sql = f"select {field} from {self._operate_tablename} where {query_builder[0]}='{query_builder[1]}'"
            else: raise Exception("要求输入的条件为dict(字典)类型并且只能有一对键值(:len(dict)=1)!!!")
        self._cursor.execute(sql)
        return self._cursor.fetchmany(num)
    # 查询:所有数据
    def select_all(self, field="*"):
        if field != "*": field = ','.join(field)
        sql = f"select {field} from {self._operate_tablename}"
        self._cursor.execute(sql)
        return self._cursor.fetchall()
    # 查询:自定义sql语句查询数据
    def select_by_sql(self, sql):
        try:
            self._cursor.execute(sql)
            return self._cursor.fetchall()
        except Exception as e:
            print(f"\033[31m:数据查询失败!!!\n{e} \033[0m")

    # 实体类映射,返回的记录带有该表中的字段(以字典的形式)
    def MapEntity(self, db_return_result: tuple):
        assert isinstance(db_return_result, tuple), "请以tuple元组类型的格式传入!"
        try:
            if not isinstance(db_return_result[0],tuple):
                return dict(zip(self._field_, db_return_result))
            return [dict(zip(self._field_, i)) for i in db_return_result]
        except Exception as e:
            print("可将从实例化数据库对象调用的方法直接传入这里!!!")
            raise Exception(f"可将从实例化数据库对象调用的方法直接传入这里!!!\n {e}")

    # 当对象被销毁时,游标关闭
    def __del__(self):
        print(f"{self._operate_tablename} >>> _cursor close...")
        self._cursor.close()

资源下载

https://download.csdn.net/download/qq_59142194/86734315

  • 18
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
【资源说明】 基于python+flask框架+mysql学生信息管理系统源码+项目说明(含学生成绩管理).zip 之前一直没有尝试过做一个简单的网站,这次刚好学习了flask框架,mysql数据库,也算是把学的东西实现一下,此网站我也有借鉴大佬,如果有出现重复的地方,请大佬不必介意!!! ## 项目介绍 虽然是个小型的网站,还是介绍一下,改网站可分为管理员登录页面,后台数据修改页面,注册页面 登录页面展示 ![](https://img-blog.csdnimg.cn/0d70f9173e4c4538957d0e4941f3fd0d.jpeg#pic_center) --- 后台学生信息管理页面 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ded4cd04f50a4ba29a40be8e2de5a09c.jpeg#pic_center) --- > 其他的页面就不多介绍了 --- ## 配置 如果需要搭建在你的服务器,需要修改一些配置文件 本地ip修改 此网站默认是使用的ip是127.0.0.1,如果你需要搭载到公网服务器,需要修改ip mysql配置 默认是需要创建一个student库,在此库下创建student和student_sore两张表 python环境 我开发使用的python3.8,预测python3.x应该都没问题 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
### 回答1: Python是一种高级编程语言,Flask是一个轻量级的Web应用程序框架,MySQL是一种流行的关系型数据库管理系统。使用PythonFlask可以轻松地构建Web应用程序,并使用MySQL存储和管理数据。这种技术组合非常流行,因为它易于学习和使用,并且可以快速开发出高质量的Web应用程序。 ### 回答2: Python Flask是一个有名的Web框架,而MySQL则是许多开发人员最喜欢的数据库之一。将Python FlaskMySQL配合使用,可以创造出强大而高效的Web应用程序,帮助用户更好地实现他们的业务需求。 Flask是一种轻量级、灵活的Web框架,在Python Web应用程序的开发中被广泛使用。它的优点之一是代码简洁易读,同时也具有开发效率高、可扩展性好等特点。不仅如此,Flask还为用户提供了许多强大的插件,可以加强Web应用程序的功能,例如安全性、缓存、表单验证等。 MySQL是一种关系型数据库管理系统,它以其高速、稳定和灵活性而闻名。它是许多Web应用程序的首选数据库,因为它支持大量的稳定并发用户,也可以帮助开发人员轻松地进行数据的存储、查询和更新等操作。此外,MySQL还有一些高级功能,例如事务处理和复制,使得它成为一种非常可靠的数据库。 Python FlaskMySQL配合使用可以带来许多好处,例如可扩展性好、开发效率高等。在Flask中使用MySQL,可以使用MySQLPython API——MySQLdb来连接MySQL数据库并进行数据操作。在Flask中使用MySQL,还可以使用许多强大的MySQL Python库,例如sqlalchemy。它使得开发人员能够轻松地开发高性能、可靠且易维护的Web应用程序。 总之,Python FlaskMySQL配合使用可以带来许多好处,这有密切关系可能是因为FlaskMySQL都是开源且拥有广泛开发支持的技术。它们能够帮助用户开发出高性能、可靠且易于维护的Web应用程序,使得客户可以更好地实现自己的业务需求,并获得更好的体验。 ### 回答3: Python Flask是一种轻量级的Web框架,它使得开发Web应用变得简单而方便。它是一种基于MVC(Model-View-Controller)的模式实现的框架,同时也支持RESTful的API设计方式。Flask提供了丰富的扩展插件,可以方便地实现ORM(对象关系映射)功能、模板引擎、Form数据验证、文件上传等等。同时,Flask还可以集成多种数据库,其中包括最常用的MySQLMySQL是一种流行的关系型数据库系统,可以确保可靠、高效并且持久化存储数据。除了提供标准的SQL查询方式,MySQL也可以集成到Python Flask这样的Web框架中,可以通过Flask扩展插件连接MySQL数据库,实现数据的读取、修改和删除操作。在Flask中集成MySQL需要先安装PyMySQL这个Python库,然后通过Flask的配置文件配置MySQL的连接信息。之后我们就可以通过Flask提供的ORM框架来操作MySQL数据库中的数据了。 Python FlaskMySQL的集成可以简化Web应用的后端开发。通过Python Flask的MVC设计模式可以实现完整的应用程序,并且通过集成MySQL,可以有效地管理数据和查询。此外,与其他Web框架相比,Python Flask还有更为灵活的扩展插件,可以轻松的处理各种请求和响应。同时,Flask配合MySQL的使用还可以使得Web应用的性能得到提升,因为MySQL是一种高效的数据库系统,可以快速并且持久地存储数据。 总之,Python FlaskMySQL的集成,非常适用于Web应用的后端开发。Flask的高效性和灵活的扩展机制,加上MySQL的高效性和可靠性,可以使得我们的应用程序具有强大的功能和高性能。同时,FlaskMySQL都是非常流行的工具,拥有非常丰富的社区支持和文档资源。因此,对于开发者来说,学习使用Python FlaskMySQL集成开发Web应用,是一件非常值得投入时间和精力的事情。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值