django简单项目

1.建立简单后台管理项目(学员管理系统--基于django母版)

2.包含三个子项项目(班级管理,学生管理,老师管理)

3.子项目增删改查(基于pymysql原生sql)

4.基于cookie的认证(基于装饰器)

后台管理函数:

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.

import pymysql
import json
import time
from functools import wraps
from app01 import sqlhelper

# 定义一个登入函数
def login(request):
    if request.method == "POST":
        uname = request.POST.get("username")
        passd = request.POST.get("password")
        obj = redirect("/class_list/")
        # 给浏览器写cookie,超时时间为60秒
        obj.set_cookie("token","lph_login",max_age=60)
        return obj
    else:
        return render(request,"login.html")

# 定义一个装饰器,给每个函数添加cookie验证
def check_login(fun):
    def inner(request):
        token = request.COOKIES.get("token")
        print("mytoken",token)
        if token:
            ret = fun(request)
            return ret
        else:return redirect("/login/")
    return inner

# 班级管理函数
# class_list = check_login(class_list)
@check_login
def class_list(request):
    conn = pymysql.connect(host='192.168.1.124',port=3306,user='user1',password='123456',database='studentdb',charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = "select id,name from classes"
    cursor.execute(sql)
    ret_lst = cursor.fetchall()
    cursor.close()
    conn.close()
    print(ret_lst)
    return render(request,'class_lst.html',{'class_lst':ret_lst})
@check_login
def add_class(request):
    name = request.POST.get('name')
    if name:
        conn = pymysql.connect(host='192.168.1.124',port=3306,user='user1',password='123456',database='studentdb',charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = "insert into classes(name) value(%s)"
        cursor.execute(sql,name)
        conn.commit()
        cursor.close()
        conn.close()
        return HttpResponse('1')
    else:
        return HttpResponse("班级名不能为空")
@check_login
def del_class(request):
    ret = {"state": True,"message": ""}
    del_id = request.POST.get("id")
    if del_id:
        print("data to delete id is",del_id)
        conn = pymysql.connect(host='192.168.1.124', port=3306, user='user1', password='123456', database='studentdb',charset='utf8')
        # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor = conn.cursor()
        sql = "delete from classes where id=%s"
        cursor.execute(sql, del_id)
        # 删除数据要commit
        conn.commit()
        cursor.close()
        conn.close()
    else:
        ret["state"] = False
        ret["message"] = "no such data to delete"
    ret = json.dumps(ret)
    # print(type(ret),ret)
    return HttpResponse(ret)
@check_login
def edit_class(request):
    ret = {"state": True, "message": ""}
    id = request.POST.get("id")
    name = request.POST.get("name")
    print(id,name)
    if id and name:
        conn = pymysql.connect(host='192.168.1.124', port=3306, user='user1', password='123456', database='studentdb',charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = "update classes set name=%s where id=%s"
        cursor.execute(sql,[name,id])
        conn.commit()
        cursor.close()
        conn.close()
    else:
        ret["state"] = False
        ret["message"] = "要更新的数据不存在"
    ret = json.dumps(ret)
    return HttpResponse(ret)

# 学生管理函数
@check_login
def student_list(request):
    ret = sqlhelper.select_tb("select s.id,s.name as sname,c.id as cid,c.name as cname from students as s left join classes as c on s.class_id=c.id")
    class_list = sqlhelper.select_tb("select id,name from classes")
    return render(request,'student_lst.html',{"student_list":ret,"class_list":class_list})
# 添加学生函数
@check_login
def add_student(request):
    ret = {"state":True,"message":""}
    name = request.POST.get("add_name")
    cid = request.POST.get("choice_cid")
    if name:
        sqlhelper.add_del_update_db("insert into students(name,class_id) values(%s,%s)",[name,cid])
    else:
        ret["state"] = False
        ret["message"] = "用户名不能为空"
    return HttpResponse(json.dumps(ret))
@check_login
def del_student(request):
    ret = {"state": True, "message": ""}
    id = request.POST.get("del_id")
    if id:
        sqlhelper.add_del_update_db("delete from students where id=%s",id)
    else:
        ret["state"] = False
        ret["message"] = "删除数据不成功"
    return HttpResponse(json.dumps(ret))
@check_login
def edit_student(request):
    ret = {"state": True, "message": ""}
    id = request.POST.get("edit_id")
    name = request.POST.get("edit_name")
    cid = request.POST.get("class_id")
    print("id:",id,"name:",name,"cid",cid)
    if id and name:
        print("===========")
        sqlhelper.add_del_update_db("update students set name=%s,class_id=%s where id=%s",[name,cid,id])
    else:
        ret["state"] = False
        ret["message"] = "删除数据不成功"
    return HttpResponse(json.dumps(ret))

# 老师管理函数
from app01 import sqlhelper
sql = sqlhelper.Sqlhelper()
@check_login
def teacher_list(request):
    if request.method != "POST":
        if request.GET.get("getclasses") == "getclasses":
            classes = sql.select_all("select id,name from classes")
            return HttpResponse(json.dumps(classes))
        teachers = sql.select_all("""select ct.id,t.id as tid,t.name as tname,c.id as cid,c.name as cname 
        from class_teacher_relation as ct 
        left join teachers as t on ct.teacher_id=t.id 
        left join classes as c on ct.class_id=c.id;""")
        teachers_dic = {}
        for line in teachers:
            if line["tid"] in teachers_dic:
                teachers_dic[line["tid"]]["cnames"].append(line["cname"])
            else:
                teachers_dic[line["tid"]] = {"id": line["id"], "tid": line["tid"], "tname": line["tname"], "cid": line["cid"],"cnames": [line["cname"]]}
        return render(request,'teacher_lst.html',{"teacher_dic":teachers_dic.values()})
    else:
        pass
@check_login
def add_teacher(request):
    # 获取新增人员的名称
    name = request.POST.get("name")
    # 在老师表中新增人员,并获取其id值
    last_id = sql.insert_one("insert into teachers(name) VALUES(%s)",name)
    # 获取列表使用getlist方法
    class_lst = request.POST.getlist("class_list")
    print(name, class_lst)
    # 组装参数
    datas = [(int(cid),last_id) for cid in class_lst]
    print(datas)
    # 在老师班级关系表中插入新增人员关系数据
    sql.insert_all("insert into class_teacher_relation(class_id,teacher_id) values(%s,%s)",datas)
    # sql.closeDB()
    return HttpResponse("ok")
@check_login
def del_teacher(request):
    # 获取要删除的行的id
    delID = int(request.POST.get("delID"))
    # 先删除老师班级关系表中的记录
    sql.delete("delete from class_teacher_relation where teacher_id=%s",delID)
    # 再删除老师表中数据
    sql.delete("delete from teachers where id=%s",delID)
    return HttpResponse("ok")
@check_login
def edit_teacher(request):
    if request.POST.get("editID"):
        editID = request.POST.get("editID")
        print(editID)
        # 获取待编辑ID所对应的班级
        classID = sql.select_all("select id from classes where id in (select class_id from class_teacher_relation where teacher_id=%s)",editID)
        classID = [v["id"] for v in classID]
        print(classID)
        # 获取所有的班级
        classes = sql.select_all("select id,name from classes")
        ret = [classID,classes]
        return HttpResponse(json.dumps(ret))
    else:
        eid = request.POST.get("eID")
        name = request.POST.get("editname")
        newClsID = request.POST.getlist("class_id")
        print(eid,name,newClsID)
        # 修改老师表中的数据
        sql.update("update teachers set name=%s where id=%s",[name,eid])
        # 删除关系表中的数据
        sql.delete("delete from class_teacher_relation where teacher_id=%s",eid)
        # 重新插入新的关系数据
        datas = [(int(cid),int(eid)) for cid in newClsID]
        print(datas)
        sql.insert_all("insert into class_teacher_relation(class_id,teacher_id) values(%s,%s)",datas)
        return HttpResponse("ok")

# 定义一个后台管理函数
@check_login
def stuadmin(request):
    return render(request,"stuadmin.html")

def test(request):
    return render(request,"test.html")

后台管理母板:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>后台管理页面</title>
    {#http://fontawesome.dashgame.com/ 图标选择地址#}
    <link rel="stylesheet" href="/static/font-awesome-4.7.0/font-awesome-4.7.0/css/font-awesome.min.css"/>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css/"/>
    <style>
        body {
            margin: 0px;
        }

        .pg-header {
        {#定义导航条高度和背景颜色#} height: 48px;
            background-color: #2b669a;
        {#让logo模块上下居中#} line-height: 48px;
        }

        .left {
            float: left;
        }

        .right {
            float: right;
        }

        .manul {
            position: absolute;
            top: 48px;
            left: 0px;
            bottom: 0px;
            width: 200px;
            background-color: #28a4c9;
        }

        .content {
            position: absolute;
            top: 48px;
            right: 0px;
            left: 200px;
            bottom: 0px;
            background-color: white;
        {#內容超出一页可显示的时候出现滚动条#} overflow: auto;
        }

        .pg-header .logo {
            color: white;
            font-size: 18px;
            width: 200px;
            text-align: center;
            border-right: 1px solid white;
        }

        .pg-header .info a {
            display: inline-block;
            padding: 0 15px;
            color: white;
        }

        .pg-header .info a:hover {
            background-color: #8c8c8c;
        }

        .header {
            padding: 0 15px;
        }

        .header img {
            position: relative;
        }

        .header .userinfo {
            display: none;
            position: absolute;
            top: 48px;
            width: 200px;
            right: 20px;
            background-color: #8c8c8c;
            z-index: 100;
        }

        .header:hover .userinfo {
            display: block;
        }

        .manul a {
            display: block;
            padding: 10px 5px;
            color: white;
            border-bottom: 1px solid white;
            text-align: center;
        }
    </style>
</head>
<body>
<div class="pg-header">
    <div class="logo left">学员后台管理</div>
    <div class="header right">
        <img style="width: 48px;height: 48px;border-radius: 50%" src="/static/image/header.jpg"/>
        <div class="userinfo">
            <a style="color: white">个人资料</a>
            <a style="color: white">注销</a>
        </div>
    </div>
    <div class="info right">
        <a><i class="fa fa-commenting" aria-hidden="true"></i> 消息</a>
        <a><i class="fa fa-envelope-o" aria-hidden="true"></i> 邮件</a>
    </div>
</div>
<div class="pg-body">
    <div class="manul">
        <a class="cls" href="/class_list/"><i class="fa fa-plus-square" aria-hidden="true"></i> 班级管理</a>
        <a class="stu" href="/student_list/"><i class="fa fa-plus-square" aria-hidden="true"></i> 学生管理</a>
        <a class="tea" href="/teacher_list/"><i class="fa fa-plus-square" aria-hidden="true"></i> 老师管理</a>
    </div>
    <div class="content">
        <ol class="breadcrumb">
            <li><a href="#">首页</a></li>
            <li><a class="t1" href="#">班级管理</a></li>
            <li class="active t2">添加班级</li>
        </ol>
        {% block class %} {% endblock %}
        <nav aria-label="Page navigation">
            <ul class="pagination">
                <li>
                    <a href="#" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
                <li><a href="#">1</a></li>
                <li><a href="#">2</a></li>
                <li><a href="#">3</a></li>
                <li><a href="#">4</a></li>
                <li><a href="#">5</a></li>
                <li>
                    <a href="#" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
            </ul>
        </nav>
    </div>
</div>
</body>
</html>

班级管理页面

{% extends "stuadmin.html" %}

{% block class %}
    <title>班级展示页</title>
    <style>
        .hide {
            display: none;
        }

        .bk {
            position: fixed;
            left: 0;
            top: 0;
            right: 0;
            bottom: 0;
            background-color: black;
            opacity: 0.4;
            z-index: 998;
        }

        .model {
            position: fixed;
            left: 50%;
            top: 50%;
            width: 400px;
            height: 300px;
            margin-left: -200px;
            margin-top: -150px;
            background-color: white;
            z-index: 999;
        }
    </style>
    <!-- 添加模态框 -->
    <button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#addModal" data-whatever="@mdo">
        添加
    </button>
    <div id="addModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="gridSystemModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title" id="gridSystemModalLabel">添加班级</h4>
                </div>
                <div class="modal-body">
                    <div class="input-group input-group-lg">
                        <span class="input-group-addon" id="sizing-addon1">请输入班级名</span>
                        <input type="text" class="username form-control" name="name" placeholder="Username"
                               aria-describedby="sizing-addon1"><span class="error" style="color: red"></span>
                    </div>

                    {#    给提交按钮绑定点击事件,发生点击则执行AjaxSend函数#}
                    {#                <input type="button" value="提交" onclick="editAjax();"/>#}
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    {#    给提交按钮绑定点击事件,发生点击则执行AjaxSend函数#}
                    <button type="button" class="btn btn-primary" onclick="AjaxSend();">提交</button>
                </div>
            </div><!-- /.modal-content -->
        </div><!-- /.modal-dialog -->
    </div><!-- /.modal -->
    <!-- 添加模态框 -->

    <!-- 编辑模态框 -->
    <div id="editModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="gridSystemModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title" id="gridSystemModalLabel">编辑班级</h4>
                </div>
                <div class="modal-body">

                    <input class="edit_id" type="text" name="id" style="display: none"/>
                    <div class="input-group input-group-lg">
                        <span class="input-group-addon" id="sizing-addon1">请编辑班级名</span>
                        <input type="text" class="edit_class form-control" name="name" placeholder="Username"
                               aria-describedby="sizing-addon1"><span class="error" style="color: red"></span>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    {#    给提交按钮绑定点击事件,发生点击则执行editAjax函数#}
                    <button type="button" class="btn btn-primary" onclick="editAjax();">提交</button>
                </div>
            </div><!-- /.modal-content -->
        </div><!-- /.modal-dialog -->
    </div><!-- /.modal -->
    <!-- 编辑模态框 -->
    <table class="table table-hover table-striped table-bordered table-condensed" border="1">
        <thead>
        <tr>
            <th>ID</th>
            <th>班级名</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for row in class_lst %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td style="display: none">{{ row.id }}</td>
                <td>{{ row.name }}</td>
                <td><a class="btn btn-danger btn-sm" onclick="delAjax(this);"><i class="fa fa-trash-o"
                                                                                 aria-hidden="true"></i> 删除</a>
                    <button type="button" class="edit btn btn-info btn-sm" data-toggle="modal" data-target="#editModal"
                            data-whatever="@mdo" onclick="ShowModel(this);"><i class="fa fa-pencil-square-o"
                                                                               aria-hidden="true"></i>
                        编辑
                    </button>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
    {#<a href="http://www.baidu.com" onclick="return func()" style="display: none">我是绑定自定义事件的a标签</a>#}
    <script src="/static/jquery-3.3.1.min.js"></script>
    <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    <script>
        {#取消a标签默认事件操作#}

        function func() {
            alert("取消默认跳转/刷新页面");
            return false
        }

        function ShowModel(ths) {
            {#获取编辑同行的所有数据#}
            var row_list = $(ths).parent().prevAll();
            console.log(row_list);
            {#获取当前编辑行的数据id值#}
            var id = $(row_list[1]).text();
            {#获取当前编辑行班级名#}
            var content = $(row_list[0]).text();
            console.log("ShowModel:", id, content);
            {#将ID值填充id输入框#}
            $(".edit_id").val(id);
            $(".edit_class").val(content);
        }

        function AjaxSend() {
            $.ajax({
                {#指定数据发送的目的url#}
                url: '/add_class/',
                {#指定提交数据的方式#}
                type: 'POST',
                {#要发送的数据#}
                data: {'name': $(".username").val()},
                success: function (ret) {
                    //当服务端处理完成后自动调用此函数,ret是服务端返回的值
                    if (ret === '1') {
                        {#console.log('ok');#}
                        {#location.href 跳转到指定页面#}
                        location.href = '/class_list/';
                    } else {
                        $(".error").text(ret);
                    }

                }
            })
        }

        function delAjax(arg) {
            {#获取当前标签的父标签--$(arg)是当前标签#}
            row = $(arg).parent();
            {#console.log(row);#}
            {#获取当前标签前面的所有标签--row是DOM对象,$(row)转化为jquerry对象#}
            row_list = $(row).prevAll();
            {#console.log(row_list);#}
            {#row_list[0]是班级名,row_list[1]是id#}
            {#将ID通过Ajax发到后端#}
            $.ajax({
                url: "/del_class/",
                type: "POST",
                {#获取id值,并通过Ajax发往后端#}
                data: {"id": $(row_list[1]).text()},
                success(ret) {
                    console.log(ret);
                    ret = JSON.parse(ret);
                    if (ret.state) {
                        {#刷新当前页面#}
                        location.reload();
                    }
                    else {
                        alert(ret.message);
                    }
                }
            })
        }

        function editAjax(arg) {
            var edit_id = $('.edit_id').val();
            var edit_class = $('.edit_class').val();
            console.log(edit_id, edit_class);
            $.ajax({
                url: '/edit_class/',
                type: 'POST',
                data: {'id': edit_id, 'name': edit_class},
                success(ret) {
                    console.log(ret);
                    ret = JSON.parse(ret);
                    if (ret.state) {
                        {#如果返回成功码,则刷新页面#}
                        location.reload();
                    } else {
                        alert(ret.message);
                    }
                }
            })
        }
    </script>
{% endblock %}

学生管理页面:

{% extends "stuadmin.html" %}

    <!-- 模态框相关样式 -->
    <style>
        .hide {
            display: none;
        }

        .bk {
            position: fixed;
            top: 0px;
            left: 0px;
            bottom: 0px;
            right: 0px;
            background-color: black;
            opacity: 0.4;
            z-index: 998;
        }

        .md {
            position: fixed;
            top: 50%;
            left: 50%;
            width: 400px;
            height: 300px;
            margin-left: -200px;
            margin-top: -150px;
            background-color: white;
            z-index: 999;
        }
    </style>
    <!-- 模态框相关样式 -->
{% block class %}
<!-- 添加模态框页面 -->
<div class="add bk hide"></div>
<div class="add md hide">
    <label>请输入用户名:
        <input class="add_name" type="text"/>
    </label>
    <br/><br/><br/>
    <label>请选择班级:
        <select class="addChoiceID">
            {% for row in class_list %}
            <option value="{{ row.id }}">{{ row.name }}</option>
            {% endfor %}
        </select>
    </label>
    <br/><br/><br/>
        <input class="add_yes" type="button" value="提交"/>
        <input class="add_no" type="button" value="取消"/>
        <span class="add_err"></span>

</div>
<!-- 添加模态框页面 -->

<!-- 编辑模态框页面 -->
<div class="edit bk hide"></div>
<div class="edit md hide">
    <label>请编辑用户名:
        <input class="edit_name" type="text"/>
    </label>
    <br/><br/><br/>
    <label>请选择班级:
        <select class="editChoiceID">
            {% for row in class_list %}
                <option value="{{ row.id }}">{{ row.name }}</option>
            {% endfor %}
        </select>
    </label>
        <input class="edit_yes" type="button" value="提交"/>
        <input class="edit_no" type="button" value="取消"/>
        <span class="edit_err"></span>

</div>
<!-- 编辑模态框页面 -->

<!-- 学生信息展示 -->
    <div style="margin: 5px 5px">
<input class="add_bt btn btn-primary btn-sm" type="button" value="添加"/>
    </div>
<table class="table table-hover table-striped table-bordered table-condensed" border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>名称</th>
        <th>班级</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for row in student_list %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td Id="{{ row.id }}">{{ row.sname }}</td>
            <td Cid="{{ row.cid }}">{{ row.cname }}</td>
            <td><a class="del_a btn btn-danger btn-sm"><i class="fa fa-trash-o" aria-hidden="true"></i> 删除</a> <a class="edit_a btn btn-info btn-sm"><i class="fa fa-pencil-square-o" aria-hidden="true"></i> 编辑</a></td>
        </tr>
    {% endfor %}
    </tbody>
</table>
<p class="del_err"></p>
<!-- 学生信息展示 -->

<!-- 引入jquery -->
<script src="/static/jquery-3.3.1.min.js"></script>
<!-- 引入jquery -->

<!-- 绑定事件 -->
<script>
    $(function () {
        <!-- 给add_bt类(添加按钮)绑定点击事件 -->
        $(".add_bt").click(function () {
            <!-- 添加按钮发生点击事件后执行的操作(显示模态框) -->
            $(".add").removeClass("hide");
        });
        <!-- 给add_no类(取消按钮)绑定点击事件 -->
        $(".add_no").click(function () {
            <!-- 取消按钮发生点击事件后执行的操作(取消模态框) -->
            $(".bk,.md").addClass("hide");
        });

        <!-- 给提交按钮绑定点击事件,发生点击事件则使用Ajax向后端提交数据 -->
        $(".add_yes").click(function () {
            $.ajax({
                url:"/add_student/",
                type:"POST",
                data:{"add_name":$(".add_name").val(),"choice_cid":$(".addChoiceID").val()},
                success(ret){
                    var ret = JSON.parse(ret);
                    if(ret){
                        location.reload();
                    }else{
                        $(".add_err").val(ret.message);
                    }

                };
            })
        });

        <!-- 给del_a类(删除)绑定点击事件 -->
        $(".del_a").click(function () {
            <!-- 获取当前删除行的数据id值 -->
            var del_id = $($(this).parent().prevAll()[1]).attr("Id");
            <!-- 数据发送到后端 -->
            $.ajax({
                url: "/del_student/",
                type: "POST",
                data: {"del_id":del_id},
                success(ret){
                    var ret = JSON.parse(ret);
                    if(ret){
                        location.reload();
                    }else{
                        $(".del_err").text(ret.message);
                    }
                }
            })
        })

        <!-- 给edit_a类(编辑)绑定点击事件 -->
        $(".edit_a").click(function () {
            $(".edit").removeClass("hide");
            $Eles = $(this).parent().prevAll();
            console.log($Eles);
            var content = $($Eles[1]).text();
            var id = $($Eles[1]).attr("Id");
            var cid = $($Eles[0]).attr("Cid");
            console.log("====",id,content,cid);
            $(".edit_name").val(content);
            $(".edit_name").attr("editId",id);
            {#给select标签设置value值表示选中#}
            $(".editChoiceID").val(cid);
        });

        <!-- 给编辑的提交按钮绑定事件 -->
        $(".edit_yes").click(function () {
            {#获取名称输入框的內容#}
            var content = $(".edit_name").val();
            {#获取编辑行的ID值#}
            var edit_id = $(".edit_name").attr("editId");
            {#获取class_id#}
            var class_id = $(".editChoiceID").val();
            console.log(edit_id,content,class_id);
            $.ajax({
                url:"/edit_student/",
                type:"POST",
                data:{"edit_id":edit_id,"edit_name":content,"class_id":class_id},
                {#如果返回值是JSON格式,则指定数据类型,默认进行字符串反序列化#}
                dataType:"JSON",
                success(ret){
                    if(ret.state){
                        location.reload();
                    }else{
                        $(".edit_err").val(ret.message);
                    }
                }
            })
        });

        <!-- 给编辑框的取消按钮绑定事件 -->
        $(".edit_no").click(function () {
            location.reload();
        })


         {#$(".edit_name").val($(this).parent().prev().val());#}
         {#   var edit_id = $(this).parent().prev().attr("Id");#}
         {#   $.ajax({#}
         {#       url:"/edit_teacher/",#}
         {#       type:"POST",#}
         {#       data:{"edit_id":edit_id,"edit_name":$(".edit_name").val()},#}
         {#       success(ret){#}
         {#           console.log(ret);#}
         {#           ret = JSON.parse(ret);#}
         {#           if(ret){#}
         {#               location.reload();#}
         {#           }else{#}
         {#               $(".edit_err").text(ret.message);#}
         {#           }#}
         {#       }#}
         {#   })#}
    })
</script>
<!-- 绑定事件 -->
{% endblock %}

老师管理页面:

{% extends "stuadmin.html" %}
    <style>
        .bk {
            position: fixed;
            top: 0px;
            left: 0px;
            bottom: 0px;
            right: 0px;
            background-color: black;
            opacity: 0.4;
            z-index: 998;
        }

        .md {
            position: fixed;
            width: 400px;
            height: 300px;
            top: 50%;
            left: 50%;
            margin-top: -150px;
            margin-left: -200px;
            background-color: white;
            z-index: 999;
        }

        .hide {
            display: none;
        }
    </style>
{% block class %}
    <div style="margin: 5px 5px">
<button class="addbtn btn btn-primary btn-sm">添加</button>
    </div>
<!-- 添加模态框 -->
<div class="add bk hide"></div>
<div class="add md hide">
    <label>请输入用户名:
        <input class="addinp" name="addname"/>
    </label>
    <br/><br/>
    <label>请选择班级:
        <select class="addclasslst" name="addclasslst" multiple>

        </select>
    </label>
    <button class="addyes">提交</button>
    <button class="addno">取消</button>
</div>
<!-- 添加模态框 -->
<div class="edit bk hide"></div>
<div class="edit md hide">
    <label>请编辑用户名:
        <input class="editinp" name="editname"/>
    </label>
    <br/><br/>
    <label>请选择班级:
        <select class="editclasslst" name="editclasslst" multiple>

        </select>
    </label>
    <button class="edityes">提交</button>
    <button class="editno">取消</button>
</div>
<!-- 编辑模态框 -->

<!-- 编辑模态框 -->
<table class="table table-hover table-striped table-bordered table-condensed" border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>老师名称</th>
        <th>任课班级</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for row in teacher_dic %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td tid="{{ row.tid }}">{{ row.tname }}</td>
            <td>
                {% for i in row.cnames %}
                    <span style="display: inline-block;padding: 5px;border: 1px solid red">{{ i }}</span>
                {% endfor %}
            </td>
            <td><a class="delbtn btn btn-danger btn-sm"><i class="fa fa-trash-o" aria-hidden="true"></i> 删除</a> <a class="editbtn btn btn-info btn-sm"><i class="fa fa-trash-o" aria-hidden="true"></i> 编辑</a></td>
        </tr>
    {% endfor %}
    </tbody>
</table>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
    $(document).ready(function () {
        {#给添加按钮绑定事件,显示对话框#}
        $(".addbtn").click(function () {
            $(".add").removeClass("hide");

            {#点击添加按钮,先去获取所有班级列表#}
            $.ajax({
                url:"/teacher_list/",
                type:"GET",
                data:{"getclasses":"getclasses"},
                dataType:"JSON",
                success(ret){
                    {#动态添加标签,将班级信息填写到下拉选择框里#}
                    for(var i=0;i<ret.length;i++){
                        {#console.log(ret[i].id,ret[i].name);#}
                        var Ele = document.createElement("option");
                        Ele.innerText = ret[i].name;
                        Ele.setAttribute("value",ret[i].id);
                        $(".addclasslst").append(Ele);
                    }
                }
            })
        });
        {#给添加提交按钮绑定事件,发送数据到后端#}
        $(".addyes").click(function () {
            var name = $(".addinp").val();
            {#val函数遇到列表获取的则是列表#}
            var class_lst = $(".addclasslst").val();
            console.log(name,class_lst);
            {#将数据发送到后台#}
            $.ajax({
                url:"/add_teacher/",
                type: "POST",
                data: {"name":name,"class_list":class_lst},
                {#如果提交的数据有列表,则要添加以下属性#}
                traditional:true,
                success(ret){
                    console.log(ret);
                    if(ret === "ok"){
                        location.reload();
                    }
            }
            })
        });

        {#给添加取消按钮绑定事件,隐藏对话框#}
        $(".addno").click(function () {
            $(".add").addClass("hide");
        });

        {#给删除按钮绑定事件#}
        $(".delbtn").click(function () {
            {#获取所有当前td之前的td标签#}
            $Eles = $(this).parent().prevAll();
            console.log($Eles[1]);
            {#获取要删除的行的id#}
            delID = $Eles[1].getAttribute("tid");
            console.log(delID);
            {#将要删除的id发送给后端#}
            $.ajax({
                url:"/del_teacher/",
                type:"POSt",
                data:{"delID":delID},
                success(ret){
                    if(ret==="ok"){
                        location.reload();
                    }
                }
            })
        });

        {#给编辑按钮绑定事件#}
        $(".editbtn").click(function () {
            {#让模态框显示出来#}
            $(".edit").removeClass("hide");
            {#获取编辑行的id值#}
            $Eles = $(this).parent().prevAll();
            console.log($Eles);
            var editID = $Eles[1].getAttribute("tid");
            console.log(editID);
            {#将编辑行的老师名填充到编辑框中#}
            $(".editinp").val($($Eles[1]).text());
            {#给人员名称的input添加tid属性#}
            $(".editinp").attr("tid",editID);
            {#将编辑ID发送到后端获取到相关数据填写到模态框中#}
            $.ajax({
                url:"/edit_teacher/",
                type:"POST",
                data:{"editID":editID},
                dataType:"JSON",
                success(ret){
                    for(var i=0;i<ret[1].length;i++){
                        {#动态添加标签,将班级信息填写到下拉选择框里#}
                        {#console.log(ret[i].id,ret[i].name);#}
                        var Ele = document.createElement("option");
                        Ele.innerText = ret[1][i].name;
                        Ele.setAttribute("value",ret[1][i].id);
                        if(ret[0].indexOf(ret[1][i].id) != -1){
                            Ele.setAttribute("selected","selected");
                        }
                        $(".editclasslst").append(Ele);
                    }
                }
            })
        });

        {#给编辑取消按钮绑定事件,隐藏对话框#}
        $(".editno").click(function () {
            $(".edit").addClass("hide");
        });

        {#给编辑提交按钮绑定事件#}
        $(".edityes").click(function () {
            {#获取编辑的人员名称于id和名称#}
            var eID = $(".editinp").attr("tid");
            var editname = $(".editinp").val();
            {#获取编辑的班级id#}
            var class_id= $(".editclasslst").val();

            {#将数据发送到后端#}
            $.ajax({
                url:"/edit_teacher/",
                type:"POST",
                {#class_id 数据类型是列表,所以要加以下参数#}
                traditional:true,
                data:{"eID":eID,"editname":editname,"class_id":class_id},
                success(ret){
                    if(ret === "ok"){
                        location.reload();
                    }
                }
            })
        })
    })
</script>
{% endblock %}

原生sql函数:

import pymysql

def select_tb(sql):
    conn = pymysql.connect(host='192.168.1.124',port=3306,user='user1',password='123456',database='studentdb',charset='utf8')
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute(sql)
    ret = cursor.fetchall()
    cursor.close()
    conn.close()
    return ret

def add_del_update_db(sql,arg):
    conn = pymysql.connect(host='192.168.1.124', port=3306, user='user1', password='123456', database='studentdb',charset='utf8')
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute(sql,arg)
    conn.commit()
    cursor.close()
    conn.close()

# 面向对象方式重写sqlhelper
class Sqlhelper:
    # def __init__(self):
        # self.conn = pymysql.connect(host='192.168.1.124', port=3306, user='user1', password='123456', database='studentdb',charset='utf8')
        # self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)

    # 定义连接数据库函数
    def connect(self):
        self.conn = pymysql.connect(host='192.168.1.124', port=3306, user='user1', password='123456',database='studentdb', charset='utf8')
        self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)

    # 定义提交函数
    def commit(self):
        self.conn.commit()
    # 定义关闭数据库连接函数
    def closeDB(self):
        self.cursor.close()
        self.conn.close()
    # 定义查询一条数据函数
    def select_one(self,sql,args=None):
        self.connect()
        if args:
            self.cursor.execute(sql,args)
        else:
            self.cursor.execute(sql)
        ret = self.cursor.fetchone()
        self.closeDB()
        return ret
    # 定义查询多条数据函数
    def select_all(self,sql,args=None):
        self.connect()
        if args:
            self.cursor.execute(sql,args)
        else:
            self.cursor.execute(sql)
        ret = self.cursor.fetchall()
        self.closeDB()
        return ret

    # 定义一个插入单行数据函数
    def insert_one(self,sql,args=None):
        self.connect()
        if args:
            self.cursor.execute(sql,args)
        else:
            self.cursor.execute(sql)
        lastID = self.cursor.lastrowid
        self.commit()
        self.closeDB()
        return lastID

    # 定义一个插入多行数据函数
    def insert_all(self,sql,args=None):
        self.connect()
        # args数据格式为[(1,v1),(2,v2),....]
        self.cursor.executemany(sql,args)
        self.commit()
        self.closeDB()

    # 定义一个删除行的函数
    def delete(self,sql,args=None):
        self.connect()
        if args:
            self.cursor.execute(sql,args)
        else:
            self.cursor.execute(sql)
        self.commit()
        self.closeDB()

    # 定义一个修改数据的函数
    def update(self,sql,args=None):
        self.connect()
        if args:
            self.cursor.execute(sql,args)
        else:
            self.cursor.execute(sql)
        self.commit()
        self.closeDB()


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值