day85 学生管理系统---单表

这一生的挚爱 提交于 2019-11-26 15:49:58

回顾昨天内容

1. web应用的本质
      
      socket模块写的服务端
      
      a. 路由系统
         url和函数的对应关系
         
         flask、django、torando中存在
      
      b. 模板引擎 (渲染)
         
         将服务端处理好的数据替换到html页面(模板)中
         
         静态资源(文件) :css、js、img
         
   2. django
      
      a. django中的路由:
         
         urls.py:
            
            def f1(request):
               pass
            
            urlpatterns = [
               # url(r'^admin/', admin.site.urls),
               url(r'^index/', index),
               url(r'^f1/', f1),
            ]
      
      b. 模板:
         
         渲染: render(request, "index.html")
         
         渲染数据类型:
            简单数据:
               name = ‘zekai’
               render(request, "index.html", {'name':name})
               html:
                  {{name}}
            
            列表渲染:
               
               li = ['aaa', 'bbb', 'ccc']
               render(request, "index.html", {'li':li})
               html:
                  单个:
                     {{li.0}}
                     {{li.1}}
                  循环:
                     {% for item in li%}
                        {{item}}
                     {% endfor %}
            字典渲染:
               dict = {"name":'zekai', 'age':18}
               render(request, "index.html", {'dict':dict})
               
               html:
                  单个:
                     {{dict.name}}
                  循环:
                     keys:
                        {% for item in dict.keys %}
                           {{item}}
                        {% endfor %}
                     values:
                        {% for item in dict.values %}
                           {{item}}
                        {% endfor %}
                     
                        {% for key, val in dict.items %}
                           {{key}} -- {{val}}
                        {% endfor %}
            列表中套字典:
               {% for item in dict.keys %}
                     {{item}}
               {% endfor %}

今日内容

课程表,学生表,老师表,课程与老师的关系表:
增删改查
新URL的方式,模态框ajax方式

学员管理系统

表结构

  班级表 (单表的操作)
      classes:
      
         cid     cname
         1        脱产九期
         2        脱产99期
         
   
   学生表 (一对多关系操作)   
      students
      
         sid     sname    cid (外键关联classes表cid)
          1       雷俊     1
          2       lala     1
          3       haha     2
          
      
   
   老师表 (单表操作)
      teacher

         tid    tname
          1      zekai
          2      sean
          3      owen
          4     jerry
          5      nick
          
         
   
   老师对班级表 (多对多的关系)
         teacher2class
            
            id    tid(外键teacher表tid)    cid(外键classes表的cid) 
             1     1      1
             2     1      2
             3     2      1
      
   - 新URL的方式
   
   - 模态框ajax方式
   
   
   
今天的作业:
   
   1. 登录 (pymysql连接)
   
   2. 删除(加上确认删除的效果)
   
   3. 增加删除修改查询 (新url的方式)
   
   

main

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生管理系统</title>
    <style>
        div {
            height: 400px;
            width: 300px;
            margin: 100px auto;
            background-color: #ccc;
            text-align: center;
        }
        p {
            display: block;
            padding-top: 150px;
        }
    </style>
</head>
<body>
    <div>
        <p><a href="/login/">sign in</a></p>
        <a href="/register/">sign up</a>
    </div>
</body>
</html>

python

from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse, render, redirect
import pymysql

def main(request):
    return render(request, 'main.html')

登录:

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录界面</title>
    <style>
        div {
            height: 400px;
            width: 300px;
            margin: 0 auto;
            background-color: #ccc;
        }
        p {
            color: red;
            text-align: center;
        }
    </style>
</head>
<body>
<div>
    <h2>登录界面</h2>
    <form action="/login/" method="post">
        用户名:<input type="text" name="username"><br>
        密&nbsp;&nbsp;&nbsp;码:<input type="password" name="pwd"><br>
        <button type="submit">提交</button>
        <!-- 接受验证结果 -->
        <p>{{ res }}</p>
    </form>
</div>
</body>
</html>

python

def login(request):
    # 判断是什么模式
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':
        # 获取用户名和密码
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        # print(username)
        # print(pwd)
    # 连接数据库进行验证
        conn = pymysql.connect(
            user = 'root',
            password = '123',
            database = 't3'
        )
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        sql = 'select * from user where username = %s and pwd = %s'
        # 进行数据验证
        if cursor.execute(sql, (username, pwd)):
            return redirect('/classes/')
        else:
            return render(request, 'login.html', {'res': '登录失败'})
    

注册

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册界面</title>
    <style>
        div {
            height: 400px;
            width: 300px;
            margin: 0 auto;
            background-color: #ccc;
        }
        p {
            color: red;
            text-align: center;
        }
    </style>
</head>
<body>
<div>
    <h2>注册界面</h2>
    <form action="/register/" method="post">
        用户名:<input type="text" name="username"><br>
        密&nbsp;&nbsp;&nbsp;码:<input type="password" name="pwd"><br>
        <button type="submit">提交</button>
        <p>{{ res }}</p>
    </form>
</div>
</body>

    

</html>

python

def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')

    elif request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')

        if not (username and pwd) :
            return render(request, 'register.html', {'res': '帐号密码不能为空'})

        conn = pymysql.connect(
            user = 'root',
            password = '123',
            db = 't3'
        )
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        sql = 'select * from user where username=%s'
        if cursor.execute(sql, (username,)):
            return render(request, 'register.html', {'res': '帐号已注册'})

        sql = 'insert into user(username, pwd) values(%s, %s)'
        cursor.execute(sql, (username, pwd))
        conn.commit()
        return render(request, 'register.html', {'res': '注册成功,即将在3秒后跳转登录界面...'})
    else:
        return HttpResponse('404 not found')

显示数据

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        a {
            text-decoration: none;
        }
        td a:nth-child(1) {
            color: red;
        }
    </style>
    {# 遮盖层 #}
    <style>
        .cover {
            position: fixed;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            background-color: black;
            opacity: 0.4;
            display: none;
        }
    </style>
    {# 弹出框层 #}
    <style>
        .up {
            height: 250px;
            width: 400px;
            top: 100px;
            left: calc(50% - 200px);
            border: 1px solid;
            position: fixed;
            background-color: white;
            text-align: center;
            display: none;
        }
    </style>

</head>
<body>
<h1><a href="/classes/">学生管理系统</a></h1>
<h2>班级目录</h2>
<table border="1px">
    <thead>
        <tr>
            <th>ID</th>
            <th>班级名称</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        {% for i in classes %}
            <tr>
                <td>{{ i.cid }}</td>
                <td>{{ i.cname }}</td>
                <td>
                    <a class="aaa" href="/delete_cl?cid={{ i.cid }}" name="">删除</a>|
                    <a href="/update_cl?cid={{ i.cid }}">更新</a>|
                    <button class="ajax_up" type="button">ajax更新</button>
                </td>
            </tr>
        {% endfor %}

    </tbody>
</table>
<div>
    <button>
        <a href="/create_cl/">添加班级</a>
    </button>
    <button type="button" class="ajax_create">ajax添加</button>
</div>

{#遮盖层#}
<div class="cover">
</div>

{#添加弹出层#}
<div class="up create_up">
    <h3>添加课程</h3>
    请输入课程名:<input type="text">
    <button type="submit" class="create_btn">提交</button>
    <button type="button">取消</button>
</div>

{#更新弹出层#}
<div class="up update_up">
    <h3>更新课程</h3>
    <input class="update_cid" type="hidden">
    请输入课程名:<input class="update_classname" type="text">
    <button type="submit" class="update_btn">提交</button>
    <button type="button">取消</button>
</div>


</body>


</html>

增删改查(新url)

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>新增</title>
    <style>

    </style>
</head>
<body>
<h1><a href="/classes/">学生管理系统</a></h1>
<h2>新增班级</h2>
<form action="/create_cl/" method="post">
    <label for="cn">classname:</label>
    <input id="cn" type="text" name="classname" placeholder="请输入班级名称">
    <button type="submit">提交</button>
</form>
</body>

</html>

python

def create_class(request):
    if request.method == 'GET':
        return render(request, 'create_class.html')
    elif request.method == 'POST':
        classname = request.POST.get('classname')
        conn = pymysql.connect(
            user='root',
            password='123',
            db='t3'
        )

        cursor = conn.cursor(pymysql.cursors.DictCursor)
        sql = 'insert into classes(cname) values(%s)'
        if cursor.execute(sql, (classname,)):
            conn.commit()
            return redirect('/classes/')

        else:
            return redirect('/create_cl/')

    else:
        return HttpResponse('404 not found')

删(无html,不分url和ajax)

python

def delete_class(request):
    cid = request.GET.get('cid')
    conn = pymysql.connect(
        user='root',
        password='123',
        db='t3'
    )

    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = 'delete from classes where cid=%s'
    cursor.execute(sql, (cid,))
    conn.commit()
    return redirect('/classes/')

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>更新</title>
    <style>

    </style>
</head>
<body>
    <h1><a href="/classes/">学生管理系统</a></h1>
    <h2>更新班级信息</h2>
    <form action="" method="post">
        <input type="hidden" name="cid" value="{{ classes.cid }}">
        <input type="text" name="cname" value="{{ classes.cname }}">
        <button type="submit">确认修改</button>
    </form>
</body>

</html>

python

def update_class(request):
    if request.method == 'GET':
        cid = request.GET.get('cid')
        # print(cid)
        conn = pymysql.connect(
            user='root',
            password='123',
            db='t3'
        )

        cursor = conn.cursor(pymysql.cursors.DictCursor)
        sql = 'select * from classes where cid=%s'
        cursor.execute(sql, (cid,))
        classes = cursor.fetchone()

        return render(request, 'update_class.html', {'classes': classes})
    elif request.method == 'POST':
        cid = request.POST.get('cid')
        cname = request.POST.get('cname')
        conn = pymysql.connect(
            user='root',
            password='123',
            db='t3'
        )

        cursor = conn.cursor(pymysql.cursors.DictCursor)
        sql = 'update classes set cname=%s where cid=%s'
        cursor.execute(sql, (cname, cid))
        conn.commit()

        return redirect('/classes/')
    else:
        return HttpResponse('404 not found')

增删改查(ajax)

def ajax_create_cl(request):
    # 以防不正常的进入
    if request.method != 'POST':
        return HttpResponse('404 not found')

    classname = request.POST.get('classname')
    if not classname:
        return HttpResponse('false')

    conn = pymysql.connect(
        user='root',
        password='123',
        db='t3'
    )

    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = 'insert into classes(cname) values(%s)'
    if cursor.execute(sql, (classname,)):
        conn.commit()
        return HttpResponse('true')

    else:
        return HttpResponse('false')

def ajax_update_cl(request):
    if request.method != 'POST':
        return HttpResponse('404 not found')

    cid = request.POST.get("cid")
    classname = request.POST.get('classname')

    conn = pymysql.connect(
        user='root',
        password='123',
        db='t3'
    )

    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = 'update classes set cname=%s where cid=%s'
    cursor.execute(sql, (classname, cid))
    conn.commit()

    return HttpResponse('true')

路由系统

urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^$', main),
    url(r'^login/', login),
    url(r'^register/', register),
    url(r'^classes/', show_classes),
    url(r'^create_cl/', create_class),
    url(r'^delete_cl/', delete_class),
    url(r'^update_cl/', update_class),
    url(r'^ajax_create_cl/', ajax_create_cl),
    url(r'^ajax_update_cl/', ajax_update_cl),
]
  班级表 (单表的操作)
      classes:
      
         cid     cname
         1        脱产九期
         2        脱产99期
         
   
   学生表 (一对多关系操作)   
      students
      
         sid     sname    cid (外键关联classes表cid)
          1       雷俊     1
          2       lala     1
          3       haha     2
          
      
   
   老师表 (单表操作)
      teacher

         tid    tname
          1      zekai
          2      sean
          3      owen
          4     jerry
          5      nick
          
         
   
   老师对班级表 (多对多的关系)
         teacher2class
            
            id    tid(外键teacher表tid)    cid(外键classes表的cid) 
             1     1      1
             2     1      2
             3     2      1
      
   - 新URL的方式
   
   - 模态框ajax方式
   
   
   
今天的作业:
   
   1. 登录 (pymysql连接)
   
   2. 删除(加上确认删除的效果)
   
   3. 增加删除修改查询 (新url的方式)
   
   

总结

多print,多console.log
request.method是获取用户提交数据的类型
setTimeout(function () {
            window.location.href = '/login/';
        }, 3000);
除了查询外多使用fetchone,而不是fetchall,因为one是字典,all是列表套字典
除了判断execute返回的值之外,还可以通过cursor.lastrowid,和conn.insert_id()来获取更新的主键值,他们的区别很小

jq中jq对象.show()相当于jq对象.css('display', 'block').hide是none

对于数据内容,前端后台都要进行判断是否为0,因为js可以被禁用,所以需要双保险

总结一下return的三种方式
httpresponse('字符串') :只能返回字符串
render(request, 'html模版文件的路径', {'参数名': 参数})
redirect('url'):直接跳转
httpresponse中必须为字符串

循环中的标签,不要使用id,不然只会有一个




总结:数据前后台传输
在浏览器中输入网址回车,是一个get请求
而在form中,可以通过method设置成post请求 

get:直接将参数拼接在url后
post:不拼接,但也只是相对安全

post方式,在前端标签中,name是键,value是值,value可以指定默认值,但是如果用户输入了,就会覆盖。
后台则使用request.POST.get('键')的方式来获取值

get方式,如果是form,则正常填写就可以,如果是其他标签提交,需要在转跳的页面要加上`?参数名=参数`,模拟form提交
后台则使用request.GET.get('参数名')的方式获取值

input和button只有在form中才会提交name和value中的值,提交方式为get,则会把提交的内容添加到url后面,提交的方式为post,则不会添加



# 在登录时,达到一个虚拟的提示框的效果
在html中写一个标签,但是不写内容,只写{{res}},这样他是不会显示出来的,而当你往后台提交数据之后,可以通过后台的return render返回一个数据过来,然后前台就会显示这个标签了

当任务文件夹不是django时,运行文件怎么打开

定向符百度一下

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!