zoukankan      html  css  js  c++  java
  • 12 django_ajax

    django_ajax

    AJAXAsynchronous Javascript And XML异步JavascriptXML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML现在更多使用json数据)。

    • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
    • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

    AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

    优点:

    • AJAX使用Javascript技术向服务器发送异步请求
    • AJAX无须刷新整个页面

    ajax项目:

    1.用户进入首页,可以点击注册和登录

    2.注册页,当输入框失去焦点的时候校验输入的用户名或者手机号存在,存在的话,给出相应提示

    3.注册,失败给出相应提示,成功后台将用户数据写入数据库,前端跳转至首页

    4.登录,登录失败给出相应提示,成功后跳转至首页

    5.实现文件的上传

     

    HTML代码

     1 <div class="action">
     2     <div class="panel panel-danger">
     3         <div class="panel-heading">2019进击的菜鸟</div>
     4         <div class="panel-body">
     5             web框架开发
     6         </div>
     7         <div class="panel-body">
     8             crm&爬虫
     9         </div>
    10         <div class="panel-body">
    11             算法&设计模式&企业应用
    12         </div>
    13         <div class="panel-body">
    14             vue项目
    15         </div>
    16         <div class="panel-body">
    17             复习python&自动化&性能
    18         </div>
    19     </div>
    20     <div class="panel panel-warning">
    21         <div class="panel-heading">2020进击的小鸟</div>
    22         <div class="panel-body">
    23             fighting!
    24         </div>
    25     </div>
    26     <div class="panel panel-success">
    27         <div class="panel-heading">2021进击的大鸟</div>
    28         <div class="panel-body">
    29             go on !
    30         </div>
    31     </div>
    32 </div>
    module6/07 django与ajax/ajax/templates/advertise.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        {% block title %}
            <title>base——title</title>
        {% endblock title %}
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
              integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
        {% block style %}
            <style type="text/css">
            *{
                padding: 0;
                margin:0;
            }
            .header{
                width:100%;
                height: 50px;
                background-color: #369;
            }
            body{
                background:#FFF url('/static/base.jpg') repeat-x 0;
                background-attachment: fixed;
            }
        </style>
        {% endblock style %}
    
    </head>
    <body>
    
    <div class="header"></div>
    
    <div class="container">
        <div class="row">
            <div class="col-md-3">
                {% include 'advertise.html' %}
            </div>
            <div class="col-md-6">
                {% block content%}
                <h3>base_content</h3>
                {% endblock %}
            </div>
        </div>
    </div>
    
    </body>
    {% block js %}
    <script type="text/javascript" src="/static/jquery-3.3.1.js"></script>
    {% endblock js %}
    </html>
    module6/07 django与ajax/ajax/templates/base.html
     1 {% extends 'base.html' %}
     2 
     3 
     4 {% block title %}
     5     <title>index</title>
     6 {% endblock title %}
     7 
     8 {% block style %}
     9     {{ block.super }}
    10     <style>
    11         img{
    12             margin: 20px auto;
    13         }
    14         .btn{
    15             margin-right: 20px;
    16         }
    17     </style>
    18 {% endblock style %}
    19 
    20 {% block content %}
    21     <h3>欢迎进入首页  {{ word }}</h3>
    22 <a href="/app01/regist" class="btn btn-info">注册</a>
    23 <a href="/app01/login" class="btn btn-info">登陆</a>
    24 <form action="">
    25     <img src="/static/index.jpg">
    26 </form>
    27 {% endblock content %}
    module6/07 django与ajax/ajax/templates/index.html

    module6/07 django与ajax/ajax/templates/login.html

     1 {% extends 'base.html' %}
     2 
     3 
     4 {% block title %}
     5     <title>index</title>
     6 {% endblock title %}
     7 
     8 {% block style %}
     9     {{ block.super }}
    10     <style>
    11         .regist {
    12             margin: 20px auto;
    13         }
    14         .res {
    15             margin: 20px auto;
    16             font-size: 18px;
    17             color: red;
    18         }
    19     </style>
    20 {% endblock style %}
    21 
    22 {% block content %}
    23     <h3>登陆页面</h3>
    24     <hr>
    25     <div class="regist">
    26         <form>
    27             <div class="form-group">
    28                 <label for="">用户名</label>
    29                 <input type="text" class="form-control" id="name" placeholder="Name">
    30             </div>
    31             <div class="form-group">
    32                 <label for="">密码</label>
    33                 <input type="password" class="form-control" id="pwd" placeholder="Password">
    34             </div>
    35             <button type="submit" class="btn btn-success" id="btn">登陆</button>
    36             <p class="res"></p>
    37         </form>
    38     </div>
    39 {% endblock content %}
    40 
    41 {% block js %}
    42     {{ block.super }}
    43     <script type="text/javascript" src="/static/login.js"></script>
    44 {% endblock js %}

    module6/07 django与ajax/ajax/templates/regist.html

     1 {% extends 'base.html' %}
     2 
     3 
     4 {% block title %}
     5     <title>index</title>
     6 {% endblock title %}
     7 
     8 {% block style %}
     9     {{ block.super }}
    10     <style>
    11         .regist {
    12             margin: 20px auto;
    13         }
    14     .res{
    15         margin: 20px auto;
    16         font-size: 18px;
    17     }
    18     .success{
    19         color:green;
    20     }
    21     .error{
    22         color: red;
    23     }
    24     .check{
    25         color: red;
    26         float: right;
    27     }
    28     </style>
    29 {% endblock style %}
    30 
    31 {% block content %}
    32     <h3>注册页面</h3>
    33     <hr>
    34     <div class="regist">
    35         <form>
    36             <div class="form-group">
    37                 <label for="">用户名</label>
    38                 <input type="text" class="form-control" id="name" placeholder="Name">
    39                 <span class="check"></span>
    40             </div>
    41             <div class="form-group">
    42                 <label for="">昵称</label>
    43                 <input type="text" class="form-control" id="nickname" placeholder="Nickname">
    44                 <span class="check"></span>
    45             </div>
    46             <div class="form-group">
    47                 <label for="">手机号</label>
    48                 <input type="text" class="form-control" id="phone" placeholder="Phone_no">
    49                 <span class="check"></span>
    50             </div>
    51             <div class="form-group">
    52                 <label for="">密码</label>
    53                 <input type="password" class="form-control" id="pwd" placeholder="Password">
    54             </div>
    55             <div class="form-group">
    56                 <label for="">确认密码</label>
    57                 <input type="password" class="form-control" id="confirm_pwd" placeholder="ConfirmPassword">
    58             </div>
    59             <button type="submit" class="btn btn-success" id="btn">注册</button>
    60             <p class="res"></p>
    61         </form>
    62     </div>
    63 {% endblock content %}
    64 
    65 {% block js %}
    66     {{ block.super }}
    67     <script type="text/javascript" src="/static/regist.js"></script>
    68 {% endblock js %}

    module6/07 django与ajax/ajax/templates/file.html

     1 {% extends 'base.html' %}
     2 
     3 
     4 {% block title %}
     5     <title>文件</title>
     6 {% endblock title %}
     7 
     8 {% block style %}
     9     {{ block.super }}
    10     <style>
    11         .file{
    12             margin:20px auto;
    13         }
    14     </style>
    15 {% endblock style %}
    16 
    17 
    18 {% block content %}
    19     <div class="file">
    20         {#    默认是form表单类型  enctype="application/x-www-form-urlencoded"  传参为 a=1&b=2&c=3 #}
    21         {#    上传文件必须要指定类型  enctype="multipart/form-data"  否则不会上传文件,ajax没有这个限制  #}
    22         <form action="" method="post" enctype="multipart/form-data">
    23             <div class="form-group">
    24                 <label for="">用户名</label>
    25                 <input type="text" class="form-control" id="fileform" placeholder="Name" name="name">
    26             </div>
    27             <div class="form-group">
    28                 <label for="">form表单传头像</label>
    29                 <input type="file" id="form_file" name="imgfile">
    30             </div>
    31             <button type="submit" class="btn btn-success" id="form_btn">提交</button>
    32         </form>
    33     </div>
    34     <hr>
    35     <div class="file">
    36         <form action="" >
    37             <div class="form-group">
    38                 <label for="">用户名</label>
    39                 <input type="text" class="form-control" id="fileajax" placeholder="Name">
    40             </div>
    41             <div class="form-group">
    42                 <label for="">ajax传头像</label>
    43                 <input type="file" id="ajax_file">
    44             </div>
    45             <button type="submit" class="btn btn-success" id="ajax_btn">提交</button>
    46         </form>
    47     </div>
    48 {% endblock content %}
    49 
    50 {% block js %}
    51     {{ block.super }}
    52     <script src="/static/file.js"></script>
    53 {% endblock js %}

     JS代码

    jquery自行下载

    module6/07 django与ajax/ajax/statics/login.js

     1 $(function () {
     2     $('#btn').click(function (e) {
     3         e.preventDefault();
     4         // var formdata = new FormData();  表单数据不可以用 FormData  文件才可以
     5         var data = {};
     6         data.name = $('#name').val().trim();
     7         data.pwd = $('#pwd').val().trim();
     8         if (data.name && data.pwd) {
     9             $.ajax({
    10                 url: '',
    11                 type: 'post',
    12                 data: data,  // ajax默认application/x-www-form-urlencoded格式
    13                 success: function (data) {
    14                     data = JSON.parse(data);
    15                     if (data.user) {
    16                         location.href = '/app01/index'
    17                     } else {
    18                         $('.res').html(data.msg)
    19                     }
    20                 }
    21             })
    22         } else {
    23             alert("用户名或密码不能为空!")
    24         }
    25     })
    26 
    27 });

     module6/07 django与ajax/ajax/statics/regist.js

     1 $(function () {
     2     // 鼠标失去焦点校验字符是否已存在
     3     check_obj = $('input[type="text"]');
     4     for (var i = 0; i < check_obj.length; i++) {
     5         $(check_obj[i]).focus(function () {
     6             $(this).next().text('');
     7         });
     8         $(check_obj[i]).blur(function () {
     9             data_dic = {};
    10             data_dic.type = this.id;
    11             data_dic.value = this.value;
    12             $.ajax({
    13                 url: '/app01/check/',
    14                 type: 'post',
    15                 contentType:"application/json",
    16                 data: JSON.stringify(data_dic),
    17                 success: function (data) {
    18                     var data_json = JSON.parse(data);
    19                     console.log(data_json);
    20                     if (data_json['code'] !== '000000') {
    21                         type_id = '#' + data_dic.type;
    22                         $(type_id).next().html(data_json['msg']);
    23                         console.log(data_json);
    24                     }
    25                 },
    26                 error: function (err) {
    27                     console.log(err)
    28                 }
    29             })
    30         });
    31     }
    32 
    33     // 注册逻辑
    34     $('#btn').click(function (e) {
    35         e.preventDefault();
    36         name = $('#name').val().trim();
    37         nickname = $('#nickname').val().trim();
    38         phone = $('#phone').val().trim();
    39         pwd = $('#pwd').val().trim();
    40         confirm_pwd = $('#confirm_pwd').val().trim();
    41         if (name && pwd && confirm_pwd && pwd === confirm_pwd) {
    42             var mydata = {};
    43             mydata.name = name;
    44             mydata.nickname = nickname;
    45             mydata.phone = phone;
    46             mydata.pwd = pwd;
    47             mydata.confirm_pwd = confirm_pwd;
    48             $.ajax({
    49                 url: '',
    50                 type: 'post',
    51                 data: mydata,
    52                 success: function (data) {
    53                     var data_json = JSON.parse(data);
    54                     if (data_json['code'] === '000000') {
    55                         $('.res').addClass('success').html(data_json['msg']);
    56                         location.href = '/app01/index'
    57                     } else {
    58                         $('.res').addClass('error').html(data_json['msg'])
    59                     }
    60                 },
    61                 error: function (err) {
    62                     console.log(err)
    63                 }
    64             })
    65         } else {
    66             alert('用户名和密码不能为空,且密码与确认密码一致!')
    67         }
    68     });
    69 });

    module6/07 django与ajax/ajax/statics/file.js

     1 $('#ajax_btn').click(function (e) {
     2     e.preventDefault();
     3     // 同form表单文件请求一样,原默认的 application/x-www-form-urlencoded 类型不支持文件上传,需要转换请求参数类型
     4     // 文件必须要以 FormData 数据类型传递
     5     var formdata = new FormData();
     6     formdata.append('name', $('#fileajax').val());
     7     formdata.append('imgfile', $('#ajax_file')[0].files[0]);
     8     $.ajax({
     9         url: '',
    10         type: 'post',
    11         data: formdata,
    12         // 传FormData时 必须设置下面两个参数,不给参数,会报错(js非法输入)
    13         processData: false,    // 不处理数据,让FormData自己去处理数据
    14         contentType: false,    // 不设置内容类型,让FormData自己设置内容类型
    15         success: function (data) {
    16             console.log(data)
    17         }
    18     })
    19 });

    应用app代码

    from django.urls import path, re_path
    from ajax_app01 import views
    
    
    urlpatterns = [
        path('index/', views.index),
        path('login/', views.login),
        path('regist/', views.regist),
        path('check/', views.check),
        path('file/', views.file),
    ]
    module6/07 django与ajax/ajax/ajax_app01/urls.py
     1 from django.db import models
     2 
     3 # Create your models here.
     4 
     5 
     6 class UserDetail(models.Model):
     7     id = models.AutoField(primary_key=True)
     8     nickname = models.CharField(max_length=32)
     9     phone = models.BigIntegerField(null=True)
    10     age = models.BigIntegerField(null=True)
    11     address = models.CharField(max_length=32,null=True)
    12     dep = models.CharField(max_length=32,null=True)
    13 
    14 
    15 class UserInfo(models.Model):
    16     id = models.AutoField(primary_key=True)
    17     name = models.CharField(max_length=16)
    18     password = models.CharField(max_length=16)
    19     user_detail = models.OneToOneField(to=UserDetail, on_delete=models.CASCADE)
    module6/07 django与ajax/ajax/ajax_app01/models.py

    module6/07 django与ajax/ajax/ajax_app01/views.py

     1 from django.shortcuts import render, HttpResponse
     2 from ajax_app01.models import *
     3 from django.db.models import Q
     4 import json
     5 
     6 # Create your views here.
     7 
     8 
     9 def regist(request):
    10     method = request.method
    11     if method == 'POST':
    12         name = request.POST.get('name')
    13         pwd = request.POST.get('pwd')
    14         nickname = request.POST.get('nickname')
    15         phone = request.POST.get('phone')
    16         select_res = UserInfo.objects.filter(Q(name=name)|Q(user_detail__nickname=nickname)).exists()
    17         res = {"code":None,"msg":None}
    18         if select_res:
    19             res["code"]="100000"
    20             res["msg"]="用户已存在!"
    21         else:
    22             detail = UserDetail.objects.create(nickname=nickname, phone=phone)
    23             UserInfo.objects.create(name=name, password=pwd, user_detail=detail)
    24             res["code"] = "000000"
    25             res["msg"] = "注册成功!"
    26         return HttpResponse(json.dumps(res))
    27     else:
    28         return render(request, 'regist.html')
    29 
    30 
    31 def index(request):
    32     return render(request, 'index.html')
    33 
    34 
    35 def login(request):
    36     if request.method == 'POST':
    37         name = request.POST.get('name')
    38         pwd = request.POST.get('pwd')
    39         select_res = UserInfo.objects.filter(name=name,password=pwd).exists()
    40         res = {"user":None,"msg":None}
    41         if select_res:
    42             res["user"] = name
    43         else:
    44             res["msg"] = "用户名或密码错误!"
    45         return HttpResponse(json.dumps(res))
    46     return render(request, 'login.html')
    47 
    48 
    49 def check(request):
    50     method = request.method
    51     if method == 'POST':
    52         dic = {'name':'用户名','nickname':'用户昵称','phone':'手机号'}
    53         print(request.body)  # 原始的请求体数据  不管啥类型的请求数据都取的到
    54         print(request.POST)  # POST请求数据  if contentType==urlencoded ,request.POST才有数据
    55         req_data = json.loads(request.body.decode('utf8'))
    56         type = req_data['type']
    57         value = req_data['value']
    58         if type == 'name':
    59             res = UserInfo.objects.filter(name=value).exists()
    60         elif type == 'nickname':
    61             res = UserInfo.objects.filter(user_detail__nickname=value).exists()
    62         else:
    63             res = UserInfo.objects.filter(user_detail__phone=value).exists()
    64         if res:
    65             return HttpResponse('{"code":"100000","msg":"%s已存在!"}'%dic[type])
    66         else:
    67             return HttpResponse('{"code":"000000","msg":"校验成功!"}')
    68     else:
    69         return render(request, 'index.html')
    70 
    71 
    72 def file(request):
    73     import os
    74     from ajax.settings import STATICFILES_DIRS
    75     if request.method == 'POST':
    76         if request.is_ajax():
    77             print('--------------------------ajax--------------------------')
    78             print(request.body)  # 原始的请求体数据
    79             print(request.GET)  # GET请求数据
    80             print(request.POST)  # POST请求数据  if contentType==urlencoded ,request.POST才有数据
    81             print(request.FILES)  # 上传的文件数据
    82             file_obj = request.FILES.get('imgfile')
    83             with open(os.path.join(STATICFILES_DIRS[0],file_obj.name), 'wb') as f:
    84                 for line in file_obj:
    85                     f.write(line)
    86         else:
    87             print('--------------------------form--------------------------')
    88             print(request.body)  # 原始的请求体数据
    89             print(request.GET)  # GET请求数据
    90             print(request.POST)  # POST请求数据  if contentType==urlencoded ,request.POST才有数据
    91             print(request.FILES)  # 上传的文件数据
    92             file_obj = request.FILES.get('imgfile')
    93             with open(os.path.join(STATICFILES_DIRS[0],file_obj.name), 'wb') as f:
    94                 for line in file_obj:
    95                     f.write(line)
    96         return HttpResponse('OJBK!')
    97     return render(request, 'file.html')

    项目代码

    """
    Django settings for ajax project.
    
    Generated by 'django-admin startproject' using Django 2.2.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.2/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.2/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '#2jnwyw8s+e-va299kxg7iv#+7weu#d(@i610-f5cxrvqmx%&e'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'ajax_app01',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = 'ajax.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'ajax.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.2/ref/settings/#databases
    
    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.2/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.2/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'statics')
    ]
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'ajax',# 要连接的数据库,连接前需要创建好
            'USER':'root',# 连接数据库的用户名
            'PASSWORD':'root',# 连接数据库的密码
            'HOST':'127.0.0.1',# 连接主机,默认本级
            'PORT':3306 #  端口 默认3306
        }
    }
    
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    module6/07 django与ajax/ajax/ajax/settings.py
     1 """ajax URL Configuration
     2 
     3 The `urlpatterns` list routes URLs to views. For more information please see:
     4     https://docs.djangoproject.com/en/2.2/topics/http/urls/
     5 Examples:
     6 Function views
     7     1. Add an import:  from my_app import views
     8     2. Add a URL to urlpatterns:  path('', views.home, name='home')
     9 Class-based views
    10     1. Add an import:  from other_app.views import Home
    11     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    12 Including another URLconf
    13     1. Import the include() function: from django.urls import include, path
    14     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    15 """
    16 from django.contrib import admin
    17 from django.urls import path, re_path, include
    18 
    19 urlpatterns = [
    20     path('admin/', admin.site.urls),
    21     re_path(r'^app01/', include(('ajax_app01.urls','ajax_app01'))),
    22 ]
    module6/07 django与ajax/ajax/ajax/urls.py
    import pymysql
    pymysql.install_as_MySQLdb()
    module6/07 django与ajax/ajax/ajax/__init__.py
  • 相关阅读:
    【JAVA反射】自定义类加载器
    工厂模式+反射+泛型
    wsdl文件生成webservice代理类及使用生成的代理类
    WebApi 做接口遇到的问题总结
    region URL请求数据
    LinQ 创建连接、简单增删改查
    JS整理
    WebForm 全局对象、commend
    WebForm 内置对象、数据增删改、状态保持
    WebForm 控件(二)
  • 原文地址:https://www.cnblogs.com/znyyy/p/11345219.html
Copyright © 2011-2022 走看看