学生管理系统的搭建

注:该系统搭建采用Django框架,MySQL数据库以及HTML+CSS

前期准备:搭建好Django框架,以及数据表
参考视频:Python全栈(老男孩4期)Django框架入门到应用

温馨提示:

  • 该系统搭建需使用pymysql,通过命令行(pip install pymysql)安装,并import到views.py中

  • 本博客不提供完全代码,如何实现及美化需读者阅读博客后自行完成

  • 若本博客中的部分代码未定义但使用,请读者查看上述参考视频,或凭借自己能力解决

  • 由于时间匆忙,相关知识了解不够,若在表述上出现根本性错误,请谅解


目录

  • 1 总体介绍
  • 2 班级
  • 3 学生信息
  • 4 学生成绩
  • 5 总结


1 总体介绍

学生管理系统总体设计
  • 班级管理:增删改功能
  • 学生信息管理:增删改查功能
  • 学生成绩管理:改查功能
  • 数据表:班级(class)、学生(student)、学院(college)、性别(sex)


2 班级

2.1 url配置

  • url(r'^classes/', views.classes) — 班级查看主页面
  • url(r'^add_class/', views.add_class) — 添加班级页面
  • url(r'^del_class/', views.del_class) — 删除班级(无单独页面)
  • url(r'^edit_class/', views.edit_class) — 编辑班级页面

2.2 views.py函数设计

2.2.1 classes

2.2.1.1 设计思路

以表格的形式显示所有的班级,我们需要获取数据表中所有班级的数据,并且逐条显示再网页上

2.2.1.2 完整代码

def classes(request):
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("select id, title from class")    #从名为class的数据表中获取Name为id和title的域
    class_list = cursor.fetchall()   #通过fetchall()函数将获取的所有数据保存在class_list列表中
    cursor.close()
    conn.close()

    return render(request, 'classes.html', {'class_list': class_list})   #返回到/classes.html中,并且令html中class_list赋值为刚刚赋值好的class_list (注:render需引入)

2.2.2 add_class

2.2.2.1 设计思路

在班级主界面设计一个添加班级的选项,点击后可跳转到添加班级的页面,在输入框中输入相应班级信息并提交后,后台可得到插入到数据表中,前端可跳转到班级主界面并显示新增班级

2.2.2.2 部分代码

def add_class(request):
    if request.method == "POST":
          v = request.POST.get('title')   #获得在对话框中输入的title值赋值给变量v
          conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
          cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
          cursor.execute('insert into class(title) values(%s)', v)   #将变量v的值插入到class数据表中的title域中
          conn.commit()
          cursor.close()
          conn.close()
          return redirect('/classes/')   #返回到/classes.html页面(注:redirect需引入)

2.2.3 edit_class

2.2.3.1 设计思路

在班级表格中每一行都设置一个编辑选项,点击编辑选项后可得到该行对应的id值,并通过id值在数据表中获取对应的其他信息,前端跳转到编辑界面;后台获取提交的修改完的班级信息,并在数据表对应的地方更新,并返回班级主界面

2.2.3.2 部分代码

def edit_class(request):
    if request.method == "POST":   #从编辑界面返回主界面时
          nid = request.GET.get('nid')
          title = request.POST.get('title')

          conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
          cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
          cursor.execute("update class set title=%s where id = %s", [title, nid, ])   #更新class数据表中对应id值的title值
          conn.commit()
          cursor.close()
          conn.close()

          return redirect('/classes/')

2.2.4 del_class

2.2.4.1 设计思路

在班级表格中每一行都设置一个删除选项,点击删除选项后可获得该行对应的id值,并通过id值在数据表中删除对应的所有信息

2.2.4.2 完整代码

def del_class(request):
    nid = request.GET.get('nid')

    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("delete from class where id=%s", [nid, ])   #删除class数据表中对应id值的所有信息
    conn.commit()
    cursor.close()
    conn.close()

    return redirect('/classes/')


2.3 HTML设计

2.3.1 班级信息主页面

2.3.1.1 设计思路

本页面显示班级的表格,表格信息包括班级的序号以及班级名称,表格操作包括编辑和删除,在该页面还独立设计一个添加班级选项和返回首页选项

2.3.1.2 表格代码

<table>
        <thead>
            <tr>
                <th>序号</th>
                <th>班级名称</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            {% for row in class_list%}   #由class函数中的render()函数里赋值的class_list,通过循环语句实现显示所有班级信息
                <tr>
                    <td>{{ row.id }}</td>
                    <td>{{ row.title}}</td>
                    <td>
                        <a href="/edit_class/?nid={{ row.id }}">编辑</a>
                        |
                        <a href="/del_class/?nid={{ row.id }}">删除</a>
                    </td>
                </tr>
            {% endfor %}   #结束循环的标志
        </tbody>
    </table>

2.3.1.3 页面展示(CSS美化后)

2.3.2 添加班级页面

2.3.2.1 设计思路

将输入的班级名称通过submit的方式给后台接收,并作用到该页面,还设计了一个独立的取消选项,点击后可返回到班级主页面

2.3.2.2 部分代码

<form method="POST" action="/add_class/">
        <p>班级名称:<input type="text" name="title" />
        <input type="submit" value="提交" />
</form>

2.3.2.3 页面展示

2.3.3 编辑班级页面

2.3.3.1 设计思路

在编辑页面可以先显示原班级名称,其余和2.3.2.1相同

2.3.3.2 部分代码

 <form method="POSt" action="/edit_class/?nid={{ result.id }}">
        <p>班级名称:<input type="text" name="title" value="{{ result.title }}">   #name="title"表示其值的名称为title,与edit_class对应
        <input type="submit" value="提交" />
 </form>

2.3.3.3 页面展示



2.4 小结

班级信息管理部分内容不多,只是涉及简单的增删改操作

只需要搞清楚POST和GET操作,再通过pymysql的三个操作(select,delete,update)及其特性即可实现函数功能

通过HTML中如何创建表格、<form>、<input>以及{% %}用法即可实现前端与后端相接


3 学生信息

3.1 url配置

  • url(r'^student/', views.student) — 学生信息主页面
  • url(r'^add_student/', views.add_student) — 添加学生信息页面
  • url(r'^edit_student/', views.edit_student) — 编辑学生信息页面
  • url(r'^del_student/', views.del_student) — 删除学生信息(无独立页面)
  • url(r'^detail_student/', views.detail_student) — 学生信息详情页面
  • url(r'^search/', views.search_student) — 查询学生信息页面

3.2 views.py函数设计

3.2.1 student

3.2.1.1 设计思路

点击“学生信息管理”选项后,获取所有student数据表中的信息,并将这些信息赋值给一个列表,再通过render()将这个列表中的数据传给前端,页面跳转到student.html,并显示所有学生信息

3.2.1.2 完整代码

def student(request):
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("select student.id, student.student_id, student.name, class.title from student left JOIN class on student.class_id = class.id")   #由于要获取班级信息,所以要左联class数据表
    student_list = cursor.fetchall()
    cursor.close()
    conn.close()

    return render(request, 'student.html', {'student_list': student_list})

3.2.2 add_student

3.2.2.1 设计思路

点击“添加学生信息“后,获取所有班级信息,将所有信息保存在class_list列表里,传递给前端;在添加学生信息页面输入完学生所有信息以后,得到所有信息并插入到student数据表中

3.2.2.2 部分代码

def add_student(request):
    if request.method == "GET":
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute("select id,title from class")
        class_list = cursor.fetchall()
        cursor.close()
        conn.close()

        return render(request, 'add_student.html', {'class_list': class_list})

3.2.3 edit_student

3.2.3.1 设计思路

与edit_class相同。在表格每一行点击“编辑”选项时,得到对应的id值,并通过该id值在数据表里获取所有对应该id值的信息,并返还给前端;修改完信息之后,得到所有修改后的信息并在student数据表对应的id值更新,并返回学生信息主页面

3.2.3.2 部分代码

def edit_student(request):
    if request.method == "GET":
        nid = request.GET.get('nid')
        class_list = sqlhelper.get_list("select id,title from class", [])
        current_student_info = sqlhelper.get_one(select sex, college, major, telenumber,id,name,class_id,student_id from student where id=%s", [nid, ])   #sqlhelper.py里保存了前后端的接口函数
        college_list = sqlhelper.get_list("select * from college", [])   #college数据表保存所有学院信息
        sex_list = sqlhelper.get_list("select * from sex", [])   #sex数据表中保存性别
        return render(request, 'edit_student.html',
                      {'class_list': class_list, 'current_student_info': current_student_info, 'college_list': college_list, 'sex_list': sex_list})

3.2.4 del_student

3.2.4.1 设计思路

同del_class

3.2.4.2 完整代码

def del_student(request):
    nid = request.GET.get('nid')
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("delete from student where id=%s", [nid, ])
    conn.commit()
    cursor.close()
    conn.close()

    return redirect('/student/')

3.2.5 detail_student

3.2.5.1 设计思路

原理与student差不多,由于不存在增删改查的操作,故只需在点击“详情”时,获取需要的信息,再返回给前端显示

3.2.5.2 完整代码

def detail_student(request):
    nid = request.GET.get('nid')
    current_student_info = sqlhelper.get_one("select student.sex, student.college, student.major,  "
                                             "student.telenumber,student.id,student.name,student.student_id ,"
                                             "class.title from student left JOIN class on student.class_id = class.id "
                                             "where student.id = %s", [nid, ])
    return render(request, 'detail_student.html',
                  {'current_student_info': current_student_info})

3.2.6 search_student

3.2.6.1 设计思路

在对话框里输入待查询的学号后,前端得到学号(studentID),再传递到后端获取对应其学号需要的信息

3.2.6.2 完整代码

def search_student(request):
    if request.method == "POST":
        studentID = request.POST.get('studentID')
        search_student_info = sqlhelper.get_one("select student.sex, student.college, student.major,  "
                                                "student.telenumber,student.id,student.name,student.student_id ,"
                                                "class.title from student left JOIN class on student.class_id = "
                                                "class.id where student.student_id = %s", [studentID, ])
        return render(request, 'search.html', {'search_student_info': search_student_info})


3.3 HTML设计

3.3.1 学生信息主页面

3.3.1.1 设计思路

与班级信息主页面类似,主要是对于查询功能的补充。而对于查询功能,其实现方法是利用POST操作submit学号完成的

3.3.1.2 部分代码

<div>
    <a href="/add_student/">添加学生信息</a>
    <a href="/head_page/">返回首页</a>
    <form action="/search/" method="POST">
    <p>查询学生信息:<input type="text" name="studentID" placeholder="学号..." />   #studentID与search_student()中的studentID对应
    <input type="submit" value="查询">
    </form>
</div>

3.3.1.3 页面展示

3.3.2 添加学生信息页面

3.3.2.1 设计思路

与添加班级页面差不多,不过此处学院、性别以及班级的确定是通过下拉选项框实现的,而不是自己输入

3.3.2.2 部分代码

<p>学号:<input type="text" name="student_id" /></p>
<p>姓名:<input type="text" name="name" /></p>
<p> 
   性别:
         <select name="name">
         <option value ="男">男</option>
         <option value ="女">女</option>
         </select>
</p>

3.3.2.3 页面展示

3.3.3 编辑学生信息页面

3.3.3.1 设计思路

此处设计比较麻烦。一是要实现在编辑学生时能够显示原信息,二是对于学院、性别以及班级仍是用下拉选项框的方式解决,但是需要先显示原信息

3.3.3.2 部分代码

<p>性别:
<select name="sex">
{% for row in sex_list %}
{% if row.sex == current_student_info.sex %}
      <option selected value="{{ row.sex }}">{{ row.sex }}</option>
{% else %}
      <option value="{{ row.sex }}">{{ row.sex }}</option>
{% endif %}
{% endfor %}
</select>
</p>

3.3.3.3 页面展示

3.3.4 学生信息详情页面

3.3.4.1 设计思路

与student以及classes处理方法类似,只不过是只显示一名学生的信息,而不是所有学生或班级

3.3.4.2 部分代码

<table border="1">
        <thead>
            <tr>
                <th>姓名</th>
                <th>学号</th>
                <th>性别</th>
                <th>班级</th>
                <th>学院</th>
                <th>专业</th>
                <th>电话</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>{{current_student_info.name}}</td>
                <td>{{current_student_info.student_id}}</td>
                <td>{{current_student_info.sex}}</td>
                <td>{{current_student_info.title}}</td>
                <td>{{current_student_info.college}}</td>
                <td>{{current_student_info.major}}</td>
                <td>{{current_student_info.telenumber}}</td>
            </tr>
        </tbody>
</table>

3.3.4.3 页面展示

3.3.5 查询学生信息页面

3.3.5.1 设计思路

与3.3.4.1一致

3.3.5.2 部分代码

<table border="1">
        <thead>
            <tr>
                <th>姓名</th>
                <th>学号</th>
                <th>性别</th>
                <th>班级</th>
                <th>学院</th>
                <th>专业</th>
                <th>电话</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>{{search_student_info.name}}</td>
                <td>{{search_student_info.student_id}}</td>
                <td>{{search_student_info.sex}}</td>
                <td>{{search_student_info.title}}</td>
                <td>{{search_student_info.college}}</td>
                <td>{{search_student_info.major}}</td>
                <td>{{search_student_info.telenumber}}</td>
            </tr>
        </tbody>
</table>

3.3.5.3 页面展示



3.4 小结

学生信息的编辑是本次系统搭建的重点,也是难点。

相比于班级信息管理,这里涉及到的操作更多,并且实现的功能更复杂,需要我们搞清楚class中的每一行代码,理解其含义,才能举一反三实现增删改查功能,以及更复杂的HTML+Django语句。



4 学生成绩

4.1 url配置

  • url(r'^exam/', views.exam) —学生成绩主页面
  • url(r'^edit_exam', views.edit_exam) —编辑学生成绩页面
  • url(r'^search_exam', views.search_exam) —查询学生成绩页面

4.2 设计思路

将学生成绩的数据保存在student数据表里,只不过再获取得到的时候选择科目而不是学院、性别、电话等无关信息。其余的与上述的并无差异,故不再赘述

4.3 页面展示

学生成绩主页面

编辑学生成绩页面

查询学生成绩页面



5 总结

该系统的搭建共历时3天时间(2020.1.6 - 2020.1.8),其中包括了复习部分Python内容,Django框架的搭建,MySQL及Navicat for MySQL的下载、安装及配置,HTML标记语言的使用以及利用CSS美化网页。

总的来说,这个项目让我明白了如何利用Python利用数据库制作网页,是一次很好的实战经验。因为时间比较匆忙,所以对于数据库和Django框架的使用都是现学现卖,后续还需要继续学习相关内容。

最后,这个系统实现的功能并不是都是我一手完成的,正如我在开头提到的“参考视频”,其中增删改功能的实现都是依靠视频,自己照着敲的代码,只有查看学生信息详情,学生信息查询功能,学生成绩管理以及CSS美化是我自己完成的。

做完之后感觉这个系统并不是很完备,还有许多需要改进和优化的地方,后期有时间也会进一步补充系统缺陷以及完善系统功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345