AJAX
前端向后端请求的工具, 跟后端服务器进行交互的
BootStrap
对CSS的封装
Vue基础
前后端进行分离 来写前端项目的
flask — Python web的框架 写后台操作的框架
pip install flask
http://127.0.0.1:5000/
404 NOT Found
不知到定位的什么位置 — 路由
不知道该定位到哪个位置去请求数据
解决方案 ---- 给他定位的位置
视图函数+路由
在视图函数上 绑定对应的路由 使用该路由访问的时候
调用的是被修饰的视图函数 在视图函数中 将数据渲染到页面上 或者 返回给请求者
# 导入Flask类
from flask import Flask, render_template, request, jsonify
# 创建一个Flask对象
fls = Flask(__name__)
print(fls.config)
# 将环境设置为开发环境
fls.config["ENV"] = "development"
# 设置当前的模式为调试模式
fls.config["DEBUG"] = True
# 体现的是这个项目的入口
if __name__ == '__main__':
#启动服务
fls.run()
客户端向服务器端进行数据请求
局部请求
MTV模式:
AJAX是异步网络请求
请求的步骤
<head>
<meta charset="utf-8">
<title>注册</title>
<style>
.exist_name{
color: red;
/* 一开始的时候是隐藏的 */
display: none;
}
</style>
</head>
<body>
<form action="http://127.0.0.1:5000/register/" method="post">
<p>用户名: <input type="text" name="uname" class="username">
<span class="exist_name">用户名已存在</span>
</p>
<p>密码:<input type="text" name="upsw"></p>
<p><input type="submit" value="注册"></p>
</form>
<script>
// 用户名输入框
var name_input = document.querySelector(".username")
// 用户名是否存在的标记
var span_node = document.querySelector(".exist_name")
// 当他失去焦点的时候就发送这个请求
name_input.onblur = function(){
// 1.创建一个请求对象
var xmlhttp;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp = new XMLHttpRequest();
}else{
// IE6, IE5 浏览器执行代码
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
// 2.与服务器之间建立连接
// 请求方式 get post
// 请求连接的地址
xmlhttp.open("GET", "http://127.0.0.1:5000/checkname/?uname=" + this.value)
// 3.发送请求并传递数据
xmlhttp.send()
// 4. 注册监听
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4){
// 请求已被处理完成 而且 响应已经就绪
if(xmlhttp.status == 200){
// 请求成功 数据返回
//console.log(xmlhttp.responseText)
if(xmlhttp.responseText == "yes"){
// 用户名已经存在了
span_node.style.display = "inline"
}else{
span_node.style.display = "none"
}
}
}
}
}
</script>
</body>
# 声明一个视图函数 接受注册的请求
# 网址请求路由 请求方式是 GET 超链接请请求也是get请求
# 怎么让一个路由既能接受GET请求 也能接受POST请求
@fls.route("/register/", methods=["GET","POST"])
def register():
if request.method == "POST":
# post请求时 数据的获取
print("post提交的数据:",request.form)
return "注册成功"
#渲染 注册页面 alt + 回车 万能键 GET请求渲染的页面
return render_template("register.html")
# 验证用户名是否已存在
@fls.route("/checkname/")
def checkname():
names = ["lucy", "jack", "tom", "韩梅梅", "李雷"]
# 现在的请求是get请求
'''
当客户端发送过来一个请求之后 都会形成一个对应的请求对象 request
通过request对象获取客户端请求发送的数据
'''
print(request.args) #get请求对应的数据 是字典格式的
name = request.args["uname"]
return "yes" if name in names else "no"
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> -->
<script src="http://cdn.static.runoob.com/libs/jquery/1.10.1/jquery.min.js"></script>
</head>
<body>
<button>请求新闻列表</button>
<ul>
<li>时间 新闻的标题</li>
</ul>
<script>
$("button").click(function(){
// ajax请求 --- JQ
$.ajax({
type: "post", // 请求方式
url: "http://127.0.0.1:5000/news/", // 服务器的地址
//data:, // 传递的数据
success: function(result, status){ // 请求成功之后返回的状态
console.log(status)
console.log(typeof result) // json数据
console.log(result)
if(status == "success"){
// 遍历新闻列表
for(var i = 0; i < result.length; i++){
console.log(result[i]) // 小字典
var li = $("<li></li>")
$("ul").append(li)
li.append($("<span>" + result[i].date + "</span>"))
li.append($("<span>" + result[i].title + "</span>"))
}
}
}
})
})
</script>
</body>
# 新闻
@fls.route("/news/", methods = ["GET", "POST"])
def news():
if request.method == "POST":
news_list = [
{"date": "2019-01-01", "title":"元旦到了"},
{"date": "2019-02-14", "title": "情人节到了"},
{"date": "2019-03-12", "title": "植树节到了"},
{"date": "2019-04-01", "title": "愚人节到了"},
{"date": "2019-05-01", "title": "劳动节到了"},
{"date": "2019-06-01", "title": "儿童到了"}
]
# 把数据转化为json格式并响应回去
return jsonify(news_list)
return render_template("ajax_jQ.html")
<button type="button" class="btn btn-default">(默认样式)Default</button>
<button type="button" class="btn btn-primary">(首选项)Primary</button>
<button type="button" class="btn btn-success">(成功)Success</button>
<button type="button" class="btn btn-info">(一般信息)Info</button>
<button type="button" class="btn btn-warning">(警告)Warning</button>
<button type="button" class="btn btn-danger">(危险)Danger</button>
<button type="button" class="btn btn-link">(链接)Link</button>
<button type="button" class="btn btn-default btn-lg">(大按钮)Large button</button>
<button type="button" class="btn btn-default">(默认尺寸)Default button</button>
<button type="button" class="btn btn-default btn-sm">(小按钮)Small button</button>
<button type="button" class="btn btn-default btn-xs">(超小尺寸)Extra small button</button>
<div class="glyphicon glyphicon-trash"></div>
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
<button type="button" class="close" aria-label="Close"><span aria-hidden="true">×</span></button>
<head>
<meta charset="utf-8">
<title></title>
<link href="../bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="../js/jquery-3.4.1.min.js"></script>
</head>
<body>
<div class="container">
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
水果和蔬菜
<span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
<li class="dropdown-header">水果</li>
<li>苹果</li>
<li>香蕉</li>
<li>草莓</li>
<li class="dropdown-header">蔬菜</li>
<li>大白菜</li>
<li>胡萝卜</li>
<li>西红柿</li>
</ul>
</div>
</div>
<script>
var btn_flag = false // 标记按钮是否被点击过展开下拉菜单
// 默认是没有展开的
$("#dropdownMenu1").click(function(){
btn_flag = !btn_flag
if (btn_flag){
$(".dropdown-menu").css("display", "block")
}else{
$(".dropdown-menu").css("display", "none")
}
})
</script>
</body>
<head>
<meta charset="utf-8">
<title></title>
<link href="../bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="../js/jquery-3.4.1.min.js"></script>
</head>
<body>
<div class="container">
<ul class="nav nav-tabs">
<li role="presentation" class="active"><a href="#">Home</a></li>
<li role="presentation"><a href="#">Profile</a></li>
<li role="presentation"><a href="#">Messages</a></li>
</ul>
<script>
// 选中导航 切换导航
$(".nav li").click(function(){
$(".nav li").removeClass("active")
// 设置被点击的哪个是选中状态
$(this).addClass("active")
})
</script>
</body>
<head>
<meta charset="utf-8">
<title></title>
<link href="../bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="../js/jquery-3.4.1.min.js"></script>
</head>
<body>
<div class="container">
<button class="add">+</button>
<a >
Messages <span class="badge">0</span>
</a>
<button class="sub">-</button>
<!--
需求: 信息量在9条以上一直显示的是9+
点击+ message数量增加 增加到9以上 就显示9+
点击- message数量减少 最少减到0
-->
</div>
<script>
// 获取当前的信息量
var message_num = parseInt($(".badge").text())
$(".add").click(function(){
message_num++
$(".badge").text(message_num + "")
if(message_num > 9){
$(".badge").text("9+")
}
})
$(".sub").click(function(){
message_num--
if(message_num > 9){
$(".badge").text("9+")
}else{
if(message_num < 0){
message_num = 0
}
$(".badge").text(message_num + "")
}
})
</script>
</body>
<head>
<meta charset="utf-8">
<title></title>
<link href="../bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="../js/jquery-3.4.1.min.js"></script>
</head>
<body>
<div class="container">
<button class="process_add">+</button>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
0%
</div>
</div>
</div>
<script>
// 1-15之间随机增加
// 获取当前的进度数量
var process_num = parseInt($(".progress-bar").text())
$(".process_add").click(function(){
// 生成一个1-15之间的随机数
// Math.random() * 15 [0, 15) 0.31 1 14.78888 15
var num = Math.ceil(Math.random() * 15) // Math.random()[0, 1)
process_num += num
if(process_num >= 100){
process_num = 100 // 满了100之后就不用在增加了
}
$(".progress-bar").text(process_num + "%")
$(".progress-bar").css("width", process_num + "%")
})
</script>
</body>
<head>
<meta charset="utf-8">
<title></title>
<link href="../bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="../js/jquery-3.4.1.min.js"></script>
</head>
<body>
<div class="container">
<table class="table table-bordered table-hover">
<tr>
<td>1-1</td>
<td>1-2</td>
<td>1-3</td>
</tr>
<tr>
<td>2-1</td>
<td>2-2</td>
<td>2-3</td>
</tr>
<tr>
<td>3-1</td>
<td>3-2</td>
<td>3-3</td>
</tr>
</table>
<a class="btn btn-danger btn-sm">百度</a>
<a class="btn btn-danger btn-lg">百度</a>
<img src="../img/pic21.jpg" class="img-circle" />
<img src="../img/pic21.jpg" class="img-thumbnail" />
<button type="button" class="close" aria-label="Close"><span aria-hidden="true">×</span></button>
<div class="glyphicon glyphicon-trash"></div>
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
水果和蔬菜
<span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
<li class="dropdown-header">水果</li>
<li>苹果</li>
<li>香蕉</li>
<li>草莓</li>
<li class="dropdown-header">蔬菜</li>
<li>大白菜</li>
<li>胡萝卜</li>
<li>西红柿</li>
</ul>
</div>
<ul class="nav nav-tabs">
<li role="presentation" class="active"><a href="#">Home</a></li>
<li role="presentation"><a href="#">Profile</a></li>
<li role="presentation"><a href="#">Messages</a></li>
</ul>
<button class="add">+</button>
<a >
Messages <span class="badge">0</span>
</a>
<button class="sub">-</button>
<!--
需求: 信息量在9条以上一直显示的是9+
点击+ message数量增加 增加到9以上 就显示9+
点击- message数量减少 最少减到0
-->
<br />
<br />
<button class="process_add">+</button>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
0%
</div>
</div>
</div>
<script>
// 1-15之间随机增加
// 获取当前的进度数量
var process_num = parseInt($(".progress-bar").text())
$(".process_add").click(function(){
// 生成一个1-15之间的随机数
// Math.random() * 15 [0, 15) 0.31 1 14.78888 15
var num = Math.ceil(Math.random() * 15) // Math.random()[0, 1)
process_num += num
if(process_num >= 100){
process_num = 100 // 满了100之后就不用在增加了
}
$(".progress-bar").text(process_num + "%")
$(".progress-bar").css("width", process_num + "%")
})
// 获取当前的信息量
var message_num = parseInt($(".badge").text())
$(".add").click(function(){
message_num++
$(".badge").text(message_num + "")
if(message_num > 9){
$(".badge").text("9+")
}
})
$(".sub").click(function(){
message_num--
if(message_num > 9){
$(".badge").text("9+")
}else{
if(message_num < 0){
message_num = 0
}
$(".badge").text(message_num + "")
}
})
var btn_flag = false // 标记按钮是否被点击过展开下拉菜单
// 默认是没有展开的
$("#dropdownMenu1").click(function(){
btn_flag = !btn_flag
if (btn_flag){
$(".dropdown-menu").css("display", "block")
}else{
$(".dropdown-menu").css("display", "none")
}
})
// 选中导航 切换导航
$(".nav li").click(function(){
$(".nav li").removeClass("active")
// 设置被点击的哪个是选中状态
$(this).addClass("active")
})
</script>
</body>
<head>
<meta charset="utf-8">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<link href="../bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<!--
把一行分成12列
不同屏幕尺寸时候 元素占12份中的几分 按照设计完成不同屏幕的
样式设计
-->
<div class="container">
<div class="row">
<img class="col-lg-3 col-md-4 col-sm-6 col-xs-12" src="../img/pic16.jpg" />
<img class="col-lg-3 col-md-4 col-sm-6 col-xs-12" src="../img/pic17.jpg" />
<img class="col-lg-3 col-md-4 col-sm-6 col-xs-12" src="../img/pic18.jpg" />
<img class="col-lg-3 col-md-4 col-sm-6 col-xs-12" src="../img/pic19.jpg" />
</div>
<div class="row">
<img class="col-lg-3 col-md-4 col-sm-6 col-xs-12" src="../img/pic20.jpg" />
<img class="col-lg-3 col-md-4 col-sm-6 col-xs-12" src="../img/pic21.jpg" />
<img class="col-lg-3 col-md-4 col-sm-6 col-xs-12" src="../img/pic22.jpg" />
<img class="col-lg-3 col-md-4 col-sm-6 col-xs-12" src="../img/pic23.jpg" />
</div>
</div>
<script>
window.onresize = function(){
var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth
console.log(w)
}
</script>
</body>
<head>
<meta charset="utf-8">
<title></title>
<script src="../js/vue.min.js"></script>
</head>
<body>
<div id="box">
<!-- {{ 字段名 }}来获取Vue的数据段中该字段对应的数据 -->
<p>{{ content }}</p>
<!-- v-text绑定数据 -->
<h3 v-text="title"></h3>
</div>
<script>
var vue = new Vue({
// 挂载 --- 跟要设置数据的容器挂钩 通过id来进行挂载的
el:"#box",
// 数据段 包含的要渲染的数据
data:{
content:"我是Vue渲染的",
title: "木兰辞"
}
})
</script>
</body>
<head>
<meta charset="utf-8">
<title></title>
<script src="../js/vue.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="box">{{ message }}</div>
<script>
var vue = new Vue({
// 挂载
el: "#box",
data:{
message:"木兰辞"
},
// beforeCreate
beforeCreate:function(){
console.log("--- 实例初始化 数据字段或者事件一些东西还没有配置好---")
},
created:function(){
console.log("--- created 实例被创建 但是挂载还没有开始----")
},
beforeMount:function(){
console.log("--- 挂载之前----")
},
mounted:function(){
console.log("--- 已经挂载----")
},
updated:function(){
console.log("数据渲染")
},
beforeDestroy:function(){
console.log("--- 实例销毁之前----")
},
destroyed:function(){
console.log("--- 实例销毁---")
}
})
</script>
</body>
Vue的指令 是带有v-前缀的特殊的属性 指令的属性值都是单一JS表达式
指令的职责 就是将JS的表达式的结果 渲染到DOM层的
<head>
<meta charset="utf-8">
<title></title>
<script src="../js/vue.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="box">
<h3 v-text="detail"></h3>
<h3 v-html="detail"></h3>
<img src="../img/pic17.jpg" v-show="flag" />
<!-- 满足条件 数据渲染 -->
<p v-if="value == 1">{{ boy }}</p>
<p v-else-if="value == 2">{{ girl }}</p>
<p v-else>{{ other }}</p>
<ul>
<li v-for="ele in enjoy"> {{ ele }} </li>
</ul>
<ul>
<li v-for="value, key in score">
{{ key }} 的成绩是 {{ value }}</li>
</ul>
<button v-on:click="btnClick()">按钮</button>
<!-- 事件绑定简写的行为 -->
<button @click="btnClick()">按钮1</button>
<input type="text" v-on:input="inputEvent()" />
<img v-bind:src="imgpath" />
<!-- 简化 -->
<img :src="imgpath" />
<input type="text" v-model="inputMessage" />
<p> {{ inputMessage }} </p>
</div>
<script type="text/javascript">
var vue = new Vue({
el:"#box",
data:{
detail: "<font color='red'>you are very beautiful</font>",
flag:true,
boy: "hello boy",
girl: "hello girl",
other: "hello ...",
value: 3,
enjoy: ["篮球","足球", "排球", "棒球"],
score:{"语文":78, "数学":88},
imgpath:"../img/pic16.jpg",
inputMessage:""
},
// 绑定事件对应的方法的位置
methods:{
btnClick:function(){
console.log("按钮被点击了")
},
inputEvent:function(){
console.log("内容输入了")
}
}
})
</script>
</body>