vue+ajax+bootstrap+python实现增删改
http://www.cnblogs.com/xwwin/p/5816527.html
script src= " http://code.jquery.com/jquery.min.js " ></script>
<link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="/static/images/favicon.ico" rel="shortcut icon">
<script src="/static/bootstrap/js/bootstrap.min.js" ></script>
<script src="/static/bootstrap/bootbox.min.js "></script>
<script src="https://vuejs.org/js/vue.min.js "></script>
<style>
.top { margin-bottom: 30px; }
</style>
vue的大体结构是
vm=new Vue({
el:'vue作用元素的css定位表达式', //一般来说可以定位为整个body元素
data:{ 用于定义变量,为json形式},
methods:{用于定义操纵改变上述data中定义的变量的值的方法,
形式为 func_name:function(i){this.变量名=i;}
},
computed:{
用于定义一个实时变量,该变量的值实时等于调用对应方法 返回的结果。与methods中的方法不同的是,methods中的方法只有在html中被触发的了才会执
行,儿computed中的方法,实时都在运行,返回一个实时变量。 可在methods中通过this.var_name来获取这个实时的值,也可在htlm中绑定这个实时的值。
形式为 var_name:function(){ var del=this.var_1+2 ;return del }
})
<script>//vue与ajax结合
//python 模板safe,让传递内容不转义
var all_site={{all_site|safe}}; var vm=new Vue({
el:'#sitepage',
data:{
"manage":all_site,
addArr:{'id':'0','name':'','url':'','comment':'','class':1},
addErr:{'name':false},
nowEditCol:-1,
editStatus:false,
delId:-1 },
methods:{
editModel:function(){ this.editStatus=true ;},
editModelExit:function(){ this.editStatus=false; },
startDel:function(id){ this.delId=id; },
cancelDel:function(){ this.delId=-1; },
//启动索引index数据 ,编辑单个条目
startEdit:function(id){
this.nowEditCol=id;
this.addArr=this.editArr;
},
//取消单个条目的编辑状态
cancelEdit:function(){
this.nowEditCol=-1;
this.resetStu();
},
//启动索引index数据修改确认,update
sureEdit:function(id){
var index=this.editArr.index
//更新后台数据
var datas={
'method':'update',
'id':this.addArr.id,
'name':this.addArr.name,
'url':this.addArr.url,
'comment':this.addArr.comment,
'class':this.addArr.class
};
var result=this.VueAjax(datas);
if(result){
//更新前台页面数据显示
this.manage.splice(index,1,this.addArr);//3个入参时1表示插入,这个列表中的索引位置起插入元素this.editArr
}
this.nowEditCol=-1;
this.resetStu();//重置弹窗数值
},
//删除索引index数据
deleteStu:function(id){
//删除后台数据
var datas={
'method':'delete',
'id':this.delArr.id
};
var result=this.VueAjax(datas); if(result){
//删除前台显示数据
this.manage.splice(this.delArr.index,1); }
this.cancelDel();
},
//新增成绩
submitStu:function(){
if(this.addArr.name==''){
this.addErr.name=true;
}
else{
this.addErr.name=''
//ajax新增后台数据,返回id
var datas={
'method':'add',
'name':this.addArr.name,
'url':this.addArr.url,
'comment':this.addArr.comment,
'class':this.addArr.class
}; var return_id=this.VueAjax(datas);
if(return_id!=false){
//新增前台数据显示
var addArr={
'id':return_id,
'name':this.addArr.name,
'url':this.addArr.url,
'comment':this.addArr.comment,
'class':this.addArr.class
};
this.manage.push(addArr);
}
this.resetStu();
};
},
//复位新增表单
resetStu:function(){
this.addArr={
'id':'',
'name':'',
'url':'',
'comment':'',
'class':1
};
this.addErr={'name':false};
},
//ajax方法
VueAjax:function(datas){
result=false
$.ajax({
url: '/indexs/', //请求的url地址
type: 'POST', //请求方式
data: {"datas":JSON.stringify(datas), 'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()},//传递给服务器的数据
dataType:'json', //这里添加了dataType ,设置返回值类型
async : false,
success: function (arg) {
var jsonObj=arg;
var status=jsonObj.status;
if(status){
// alert("success!");
if(jsonObj.id){
result= jsonObj.id;
}
else{
result= true ;
}
}
else{
alert("some wrong,please try again!");
result= false;
}
}
});
return result ;
}
},
computed:{
//存储当前编辑的对象,相当于一个实时检测,当前此刻处于编辑状态的对象是哪个
editArr:function(){
var editO={};
var index=0;
for(var i=0,len=this.manage.length;i<len;i++){
if(this.nowEditCol === this.manage[i]['id'] ){
editO= this.manage[i];
index=i;
break;
}
}
return {
'index':index,
'id':editO.id,
'name':editO.name,
'url':editO.url,
'comment':editO.comment,
'class':editO.class
}
},
delArr:function(){//实时检测delId的值
var delO={};
var index=0;
for(var i=0,len=this.manage.length;i<len;i++){
if(this.delId === this.manage[i]['id'] ){
delO= this.manage[i];
index=i;
break;
}
}
return {
'index':index,
'id':delO.id,
'name':delO.name,
'url':delO.url,
'comment':delO.comment,
'class':delO.class
}
}
}
})
</script>
vue部分
<div class="col-md-6" id="manage">
<h3>管理后台</h3>
<table class="table table-hover ">
<thead><tr><th>
<div class=row><div class="col-md-5">网站 </div><div class=col-md-7>备注</div></div>
</th></tr></thead>
<tbody>
<tr v-for="item in manage"><td v-if="item.class==1">
{% verbatim %}<!--编辑,做成弹窗或 就地编辑,就地编辑需要隐藏原文本,并显示编辑窗,先做就地编辑,还需要解决超链接在编辑时被点击的问题,暂时用jquery手动实现吧-->
<div class="row " v-bind:id="item.id" >
<a class="col-md-5 control-lable" v-bind:href="item.url" target="_blank">
<div class=content>{{item.name}}</div></a><div class="content col-md-5">{{item.comment}}</div>
<div class=" col-md-2" v-show="editStatus" >
<button class=" btn btn-info btn-sm " v-on:click="startEdit(item.id)" data-toggle="modal" data-target="#addModal">编辑</button>
<button class=" btn btn-danger btn-sm" v-on:click="startDel(item.id)" data-toggle="modal" data-target="#deleModal" >删除</button>
</div>
</div>
{% endverbatim %}
</td></tr>
</tbody>
</table>
</div>
<div class="col-md-6" id="stat">
<h3>统计后台</h3>
<table class="table table-hover ">
<thead><tr><th>
<div class=row><div class="col-md-5">网站 </div><div class=col-md-7>备注</div></div>
</th></tr></thead>
<tbody>
<tr v-for="item in manage"><td v-if="item.class==2">
{% verbatim %}<!--编辑,做成弹窗或 就地编辑,就地编辑需要隐藏原文本,并显示编辑窗,先做就地编辑,还需要解决超链接在编辑时被点击的问题,暂时用jquery手动实现吧-->
<div class="row " v-bind:id="item.id" >
<a class="col-md-5 control-lable" v-bind:href="item.url" target="_blank">
<div class=content>{{item.name}}</div></a><div class="content col-md-5">{{item.comment}}</div>
<div class=" col-md-2" v-show="editStatus" >
<button class=" btn btn-info btn-sm " v-on:click="startEdit(item.id)" data-toggle="modal" data-target="#addModal">编辑</button>
<button class=" btn btn-danger btn-sm" v-on:click="startDel(item.id)" data-toggle="modal" data-target="#deleModal" >删除</button>
</div>
</div>
{% endverbatim %}
</td></tr>
</tbody>
</table>
</div>
vue+html渲染展示数据部分
vue中的变量格式与python的django模板类似 ,使用 {{var_name}}表示; v-for 表示for循环。 v-if的值为一个bool表达式,为true时则渲染出该元素,否则html中不会出现该元素
<tr v-for="item in manage"><td v-if="item.class==1"> </td></tr>
v-bind用于绑定元素的属性值,为单向绑定
<div class="row " v-bind:id="item.id" >
<a class="col-md-5 control-lable" v-bind:href="item.url" target="_blank">
v-on用于绑定元素的动作与方法,当发生该动作时,就会触发绑定的方法
<button class=" btn btn-info btn-sm " v-on:click="startEdit(item.id)" data-toggle="modal" data-target="#addModal">编辑</button>
data-toggle="modal" data-target="#addModal"是bootstrap的弹窗语法,当该元素被点击时则会弹出"#addModal"对应的弹窗,vue与bootstrap的触发方法各自执行。
verbatim是python的模板语法,用于标明它包含的html不需要渲染,本例中是右vue渲染
{% verbatim %}
<div class="modal-body"><div class="content" bind:id="delArr.id" >{{delArr.name}}</div></div>
{% endverbatim %}
<!--bootstrap的新增项目的弹窗 ,.modal用于识别该块为弹窗,.fade切换弹窗时有淡出效果,aria-hidden="true"用于隐藏弹窗-->
<div class="modal fade" id="addModal" aria-hidden="true">
<div class="modal-dialog" style="width:450px;">
<div class="modal-content">
<div class="modal-header">
<h6 class="modal-title" id="myModalLabel">新增项目</h6>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" v-on:click="cancelEdit">×</button>
</div>
<div class="modal-body">
<form class="form-horizontal">
{% csrf_token %}
<div class="row form-group">
<label class="col-md-2 control-label" for="inputName">名称:</label>
<div class=" col-md-8">
<textarea class="form-control" type="text" id="inputName" v-model="addArr.name"></textarea>
<div style="color:red;" v-if="addErr.name">请填写网站名称</div>
</div>
</div>
<div class="row form-group">
<label class="col-md-2 control-label" for="inputUrl">网址:</label>
<div class=" col-md-8">
<textarea name=siteurl class="form-control" type="text" id="inputUrl" v-model="addArr.url"></textarea>
</div>
</div>
<div class="row form-group">
<label class="col-md-2 control-label" for="inputPassword">备注:</label>
<div class=" col-md-8">
<textarea name=comment class="form-control" type="text" id="inputPassword" v-model="addArr.comment"></textarea>
</div>
</div>
<div class="form-group">
<label class="radio " col-md-4>
<input type="radio" name="optionsRadios" id="optionsRadios1" value=1 checked v-model="addArr.class">
管理后台
</label>
<label class="radio inline" col-md-4>
<input type="radio" name="optionsRadios" id="optionsRadios2" value=2 v-model="addArr.class">
统计后台
</label>
</div>
<div class="form-group" >
<div class="modal-footer ">
<button type="button" class="btn btn-info" data-dismiss="modal" v-on:click="resetStu" v-if="nowEditCol==-1">取消</button>
<button type="button" class="btn btn-success" v-bind:data-dismiss="addArr.name?'modal':null" id=addsubmit v-on:click="submitStu" v-if="nowEditCol==-1">新增</button>
<button type="button" class="btn btn-info" data-dismiss="modal" v-on:click="cancelEdit" v-if="editArr.id==nowEditCol">取消修改</button>
<button type="button" class="btn btn-success" data-dismiss="modal" v-on:click="sureEdit(editArr.id)" v-if="editArr.id==nowEditCol">提交修改</button>
<button type="button" class="btn btn-warning" v-on:click="resetStu">清空</button>
</div>
</div> </form>
</div>
</div>
</div>
</div>
<!--弹窗结束-->
bootstrap的编辑/新增 弹窗
v-model用于输入框,表单 的双向绑定,绑定的变量值变化会让显示的值变化。 同时,显示的用户的输入改变也会让绑定的变量值改变
<label class="col-md-2 control-label" for="inputName">名称:</label>
<div class=" col-md-8">
<textarea class="form-control" type="text" id="inputName" v-model="addArr.name"></textarea>
<div style="color:red;" v-if="addErr.name">请填写网站名称</div>
v-if表达式的值如果为空值,‘’,未定义,也会当作False来处理
这样绑定 ,后就可以通过addArr.name获取用户的输入值。
<button type="button" class="btn btn-success" v-bind:data-dismiss="addArr.name?'modal':null" id=addsubmit v-on:click="submitStu" v-if="nowEditCol==-1">新增</button>
点击新增,就会触发vue中定义的submitStu方法。
v-bind:data-dismiss="addArr.name?'modal':null" 这个表示如果addArr.name为true则属性data-dismiss='modal',否则不显示该属性值。
data-dismiss='modal'是bootstrap的弹窗中对弹窗操作的属性,添加该属性值,则点击该元素时,弹窗就会关闭。
<button type="button" class="btn btn-success" data-dismiss="modal" v-on:click="sureEdit(editArr.id)" v-if="editArr.id==nowEditCol">提交修改</button>
提交修改与新增类似,只是点击编辑时,会通过方法startEdit(item.id)将启动编辑的变量赋值给与弹窗绑定的值addArr而显示在弹窗中。
startEdit:function(id){
this.nowEditCol=id;
this.addArr=this.editArr;
}
vue只是用于前端页面展示的交互控制,在vue根据用户的操作而改变页面展示时,在ajax也在对应方法中被调用,来在数据库中对数据进行处理。
这里把ajax定义到vue中的一个methods里面了,async : false,用于设置关闭ajax的异步操作,使在执行ajax的时候阻塞,执行完了ajax,再执行后面的return result;
VueAjax:function(datas){
result=false
$.ajax({
url: '/indexs/', //请求的url地址
type: 'POST', //请求方式
data: {"datas":JSON.stringify(datas), 'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()},//传递给服务器的数据
dataType:'json', //这里添加了dataType ,设置返回值类型
async : false,
success: function (arg) {
var jsonObj=arg;
var status=jsonObj.status;
if(status){
// alert("success!");
if(jsonObj.id){
result= jsonObj.id;
}
else{
result= true ;
}
}
else{
alert("some wrong,please try again!");
result= false;
}
}
});
return result ;
}
vue+ajax+bootstrap+python实现增删改的更多相关文章
- MVC3.0+knockout.js+Ajax 实现简单的增删改查
MVC3.0+knockout.js+Ajax 实现简单的增删改查 自从到北京入职以来就再也没有接触MVC,很多都已经淡忘了,最近一直在看knockout.js 和webAPI,本来打算采用MVC+k ...
- MVC3+EF5.0 code first+Flexigrid+ajax请求+jquery dialog 增删改查
MVC3+EF5.0 code first+Flexigrid+ajax请求+jquery dialog 增删改查 本文的目的: 1.MVC3项目简单配置EF code first生成并初始化数据 ...
- vue实现对数据的增删改查(CURD)
vue实现对数据的增删改查(CURD) 导语: 网上看到一个写的比较好的学习文章,转载分享一下 在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的 ...
- 【BootStrap】--具有增删改查功能的表格Demo
[BootStrap]--具有增删改查功能的表格Demo 目录(?)[+] 前言 版本一 样式 代码 版本二 样式 代码 版本三 样式 代码 总结 前言 bootstrap的表格样式,有类似EasyU ...
- Python pymysql 增删改查封装
关于pymysql 的增删改查,简单做个封装,方便后面使用直接拿来调用即可. 其中 增删改 的处理其实是一致的,本可以使用统一的方法,但是为了明显区分,这里分开来写了. 直接看代码就即可,如下: # ...
- AJAX简单的数据增删改与分页应用
运行截图: PageBar.js: /* * 说明: * 整体思想,1.第一页时不显示:首页,上一页, * 2.最后一页时不显示:下一页,尾页 * 3.中间有 5 页导航, * 若:3.1.(总页数& ...
- 页面中关于bootstrap框架的增删改查使用
bootstrap是一个简单又好用的前端框架 1.bootstrap 初始化 表格显示 2.自带的查询表单(需要配置要查询的条件 对应实体类) 3.工具(增加和查询) 4.查询方法 5.增加方法 ...
- Vue+MySQL实现购物车的增删改查
1,创建简单数据库数据表 2,创建Mapper文件 <!--查询商品--> <select id="selectcommodity" resultType=&qu ...
- vue学习(3)-增删改查
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- firefox、chrome的DNS缓存清除方法
通过设置hosts文件可以强制指定域名对应的IP,当修改hosts文件,想要浏览器生效,最直接的方法关闭浏览器后重新开启:如果不想重启浏览器,只需要清空浏览器的DNS缓存即可. 清空DNS缓存在chr ...
- 【核心API开发】Spark入门教程[3]
本教程源于2016年3月出版书籍<Spark原理.机制及应用> ,在此以知识共享为初衷公开部分内容,如有兴趣,请支持正版书籍. Spark综合了前人分布式数据处理架构和语言的优缺点,使用简 ...
- hdu 6406 Taotao Picks Apples 线段树 单点更新
Taotao Picks Apples Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- Ubuntu 登陆界面无限循环问题 以及 root用户无法使用命令问题
在Ubuntu下配置好了eclipse之后,马上着手用eclipse试运行ns3.在./waf编译的时候出现了"Permission denied"问题. 在网络上查阅了相关资料之 ...
- git连接华为开发云devcloud
华为开发运在代码托管方面的个github很类似,引入了代码仓库的概念,同时需要本地安装git客户端,且只能与git进行连接,从这个角度上讲,华为开发云的代码管理部分就是github的功能,下面对git ...
- AtCoder square869120 Contest #3 F sushi
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 查看 rospkg 变量
echo $ROS_PACKAGE_PATH
- MongoDB(课时10 数组)
3.4.2.5 数组查询 MongoDB里面支持数组保存,一旦支持数组保存,就需要对于数组的数据进行匹配. 范例:插入一部分数组内容 课程是数组的形式(截图时少截一条信息) 此时数据包含数组内容,而后 ...
- Codeforces 834C - The Meaningless Game
834C - The Meaningless Game 数学. 思路1:判断a•b能不能化成v3且a%v==0且b%v==0.v可以直接用pow求(或者用cbrt),也可以二分求:还可以用map映射预 ...
- webpack4试水总结
看了官方的升级通告,据说webpack4的打包效率提升近一倍,于是最近在项目分支上升级了下webpack4,过程中的一些报错及问题简单整理下,以供交流. 在之前的旧项目上单纯的升级webpack版本后 ...