python学生管理系统的设计_学员管理系统(简单的Django设计)

学员管理系统

项目规划阶段

项目背景

近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求。因此公司急需一套方便易用的“学员管理系统”,来提高公司在校学员信息的收集和处理能力。鉴于Python学院全栈x期的学员都聪明伶俐可爱至极,因此公司领导经过慎重考虑特决定将此项目交给大家来开发。

项目需求

本次学员管理系统设计开发,时间紧任务重,希望各位开发人员戒骄戒躁戒烟戒酒,尽快完成项目的开发。

具体需求为:

学员管理系统有三个角色:学生、老师和班级。

学生有姓名和所属班级。

班级信息有:班级名称。

老师信息有:姓名

老师可以带多个班级,每个班级不同阶段也会有不同的老师讲课。

项目周期

越快越好

项目开发阶段

表结构设计

-- 创建班级表

CREATE TABLE class(

id int auto_increment PRIMARY KEY,

name CHAR(10) not null

)engine=innodb DEFAULT charset=utf8;

-- 创建学生表

CREATE TABLE student(

id int auto_increment PRIMARY KEY,

name CHAR(10) not null,

class_id INT, FOREIGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE

)engine=innodb DEFAULT charset=utf8;

-- 创建老师表

CREATE TABLE teacher(

id int auto_increment PRIMARY KEY,

name CHAR(10) not null

)engine=innodb DEFAULT charset=utf8;

-- 创建老师和班级关系表

CREATE TABLE teacher2class(

id INT AUTO_INCREMENT PRIMARY KEY,

teacher_id INT,FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE CASCADE ON UPDATE CASCADE ,

class_id INT,FOREIGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE

)engine=innodb DEFAULT charset=utf8;

View Code

前端部分

使用Bootstrap搭建的管理后台页面

班级信息管理功能开发

视图函数:

我们把所有的处理请求相关的函数从 urls.py中拿出来,统一放在一个叫views.py的文件中,这样就把代码模块化,实现不同功能的代码放在不同的模块。

urls.py文件中只放置 URL和函数的对应关系

views.py 文件中只放置那些针对不同URL执行的函数

注意:

这个时候就需要在urls.py中导入views.py文件(views前面加.表明从当前目录下导入)

from .views import index, login, class_list, delete_class, add_class, edit_class

展示所有的班级列表

后端部分

#展示所有的班级列表

defclass_list(request):#这个函数是展示所有的班级列表

#1. 去数据库里取数据

#连接数据库

conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")#指定pymysql查询出的每条数据的类型是字典类型({"字段名": "值"}) *****

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)#写好查询的SQL语句

sql = "select id, cname from class order by id;"

#执行上面定义好的SQL语句

cursor.execute(sql)#拿到所有查询到的结果

#此处查询结果是一个大列表,里面是一个一个字典

ret =cursor.fetchall()#关闭连接

cursor.close()

conn.close()#2. 用数据去替换HTML页面中的特殊符号,特殊符号是按照Django模板语言的语法写好的

#render()的第三个参数是一个字典,字典的key是什么,HTML文件中的变量名就写什么

return render(request, "class_list.html", {"class_list": ret})

页面部分

这里用到了Django模板语言的for循环,模板语言部分内容详见页面下方的超链接

#班级ID班级名称操作

{% for class in class_list %}{{ forloop.counter }}

{{ class.id }}

{{ class.cname }}

新页面编辑

编辑

删除

{% endfor %}

删除班级

后端部分

点击班级列表 表格中 对应班级后面的 删除按钮(a标签),向后端发送get请求,并且携带当前班级的ID。

后端拿到 要删除的班级的ID值,去数据库中执行删除操作

#删除班级

defdelete_class(request):#根据班级的ID删除

#班级ID从哪儿来? --> 需要页面发起请求的时候携带

#页面如何携带要删除的班级的ID? --> 通过给a标签设置href属性时拼接

#后端拿到要删除的班级的ID

class_id = request.GET.get("class_id")#去数据库里删除

#连接数据库

conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")#指定输出的每条数据的类型是字典

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)#删除操作的SQL语句

sql = "delete from class where id=%s;"

#执行删除语句

cursor.execute(sql, class_id)#向数据库提交操作

conn.commit()

cursor.close()

conn.close()#执行完删除操作后跳转回班级列表页面

return redirect("/class_list/")

页面部分

浏览器发起的GET请求通过在URL后面添加/url/?k1=v1&k2=v2的方式添加参数。

使用Django模板语言的语法将{{ class.id }}拼接到了a标签的href属性中。

这样页面点击这个a标签就能把要删除的班级ID值传递给后端了

删除

添加班级

后端部分

#添加班级

defadd_class(request):#如果是POST请求,就表明是页面要提交数据

if request.method == "POST":#页面使用POST方法提交添加班级的数据

#后端取到新班级的名称信息

class_name = request.POST.get("cname")

conn= pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")#指定输出的结果类型是字典

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)#新增班级的SQL语句

sql = "insert into class (cname) VALUE (%s);"

#执行SQL语句,在数据库中创建一条新的班级记录

cursor.execute(sql, class_name)#向数据库提交

conn.commit()#关闭连接

cursor.close()

conn.close()#新添加一个班级之后跳转到班级列表页面

return redirect("/class_list/")#如果不是POST请求就返回添加班级页面

return render(request, "add_class.html")

页面部分

利用form表单向后端提交新班级的数据,所以add_class.html页面中form表单要填写上action="/add_class/” 和 method=“post”

编辑班级信息

后端部分

#新页面编辑班级信息

defedit_class(request):#如果是POST请求

if request.method == "POST":#从页面POST过来的数据中取到编辑的班级ID

class_id = request.POST.get("id")#从页面POST过来的数据中取到班级名称

class_cname = request.POST.get("cname")#去数据库里面更新班级名称

#连接数据库

conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")#获取光标

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)#更新班级信息的SQL语句

sql = "update class set cname=%s where id=%s;"

#执行SQL语句

cursor.execute(sql,(class_cname, class_id))#向数据库提交修改

conn.commit()#关闭连接

cursor.close()

conn.close()#更新完班级信息之后跳转回班级列表页面

return redirect("/class_list/")#如果不是POST请求,就表明是点击了新页面编辑班级信息的按钮

#取到被编辑的班级的ID

class_id = request.GET.get("class_id")#去数据库里查询当前班级的信息

conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")#指定输出的单条数据的类型是字典

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)#查询的SQL语句

sql = "select id, cname from class WHERE id=%s;"

#执行查询操作

cursor.execute(sql, class_id)#取单条数据

ret =cursor.fetchone()#关闭连接

cursor.close()

conn.close()#把要编辑的班级的信息 替换 edit_class.html 页面中的特殊符号,最后把页面返回给浏览器

return render(request, "edit_class.html", {"class_info": ret})

页面部分

编辑班级信息在页面上展示的就是一个form表单,用户更新完班级信息之后要提交,就需要向后端提交表单数据。

这个时候form表单就需要配置好 action="/edit_class/" 和 method="post"。

但是提交的数据里需要告知后端,我更改的是数据库中的哪一条班级信息,所以这里要把班级ID也放到form表单中。

班级ID不应该让用户修改,所以就把班级ID的input框给隐藏掉

学生信息管理功能开发

学生信息展示(查)

区别于班级信息管理,学生信息因为通过外键关联了班级信息,所以除了要展示学生的姓名还要展示出学生所属班级的名称。

后端部分

defstudent_list(request):

conn= pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="root1234", db="mysite", charset="utf8")

cursor= conn.cursor(cursor=pymysql.cursors.DictCursor)

cursor.execute("SELECT student.id, student.name, class.name AS class_name from student LEFT JOIN class ON student.class_id = class.id;")

student_list=cursor.fetchall()

cursor.close()

conn.close()return render(request, "student_list.html", {"students": student_list})

前端部分

#学生姓名班级操作

{% for student in students %}

{{ student.id }}

{{ student.name }}{{ student.class_name }}

编辑|

新页面编辑|

删除

{% endfor %}

删除学生信息(删)

后端部分

defdelete_student(request):#从GET请求的URL中取到要删除的学生ID

student_id = request.GET.get("student_id")#连接数据库

conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="root1234", db="mysite", charset="utf8")

cursor= conn.cursor(cursor=pymysql.cursors.DictCursor)#删除指定的学生

sql = "delete from student WHERE id=%s;"

#执行SQL语句

cursor.execute(sql, [student_id, ])

conn.commit()

conn.close()#删除成功,跳转到学生列表页

return redirect("/student_list/")

前端部分

注意在学生信息的页面删除按钮上用模板语言的方式拼接student_id

删除

添加学生信息(增)

后端部分

defadd_student(request):#如果是POST请求表示前端提交数据过来

if request.method == "POST":

student_name= request.POST.get("student_name")

class_id= request.POST.get("class_id")

conn= pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="root1234", db="mysite", charset="utf8")

cursor= conn.cursor(cursor=pymysql.cursors.DictCursor)

cursor.execute("insert into student(name, class_id) VALUES (%s, %s)", [student_name, class_id])

conn.commit()

cursor.close()

conn.close()return redirect("/student_list/")#前端不发送POST请求情况下默认返回新增学生信息页面

else:#因为我们新添加学生信息的时候需要指定所属的班级

#所以需要先查询出所有的班级信息,填充到页面上

conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="root1234", db="mysite", charset="utf8")

cursor= conn.cursor(cursor=pymysql.cursors.DictCursor)

cursor.execute("select id, name from class")

class_list=cursor.fetchall()

cursor.close()

conn.close()return render(request, "add_student.html", {"class_list": class_list})

前端部分

前端页面需要将已经有的班级信息做成可以选择的select框

学生姓名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值