模组 前后端分离CURD 组件
js
(function () {
// {# -------------------------------------------------------------------------- #}
// {#全局变量:请求数据的全局变量字典#}
var chaxundata = {};
var requestURL = "/app02/db/"; // {# -------------------------------------------------------------------------- #}
// {#自定义方法#}
function isEmptyObject(obj) {
for (var key in obj){
return false;//返回false,不为空对象
}
return true;//返回true,为空对象
} // {#将以数据id去choice全局变量取对应的 中文显示信息#}
function test(gname,gid) {
// {#console.log(gname,gid);#}
var ret = null;
$.each(window[gname], function (k, item) {
if (item[0] == gid) {
ret = item[1];
return
}});
return ret;
} // {#自定义的 字符foo的方法#}
String.prototype.foo = function (kwargs) {
var v = this.replace(/\{(\w+)\}/g,function (k,m) {
return kwargs[m];
});
return v;
}; // {# -------------------------------------------------------------------------- #} // {#数据显示部分#}
function init(yema,dc,t1){
// {#通过ajax的方式去获取后端的数据#} // 请求的数据页码,默认为第一页
// yema = 1; // 请求的数据显示数量,默认显示30条
// dc = 30; // 请求数据的查询条件,默认为空
// t1 = ''; var yema = yema || 1;
var dc = dc || 30;
var t1 = t1 || '';
chaxundata['yema'] = yema;
chaxundata['dc'] = dc;
$.ajax({
url:requestURL,
type:'GET',
data:{"yema":yema,'dc':dc,'t1':t1},
dataType:"JSON",
success:function (arg) {
initchoice(arg.data_globe);
displaytitle(arg.data_config);
displaydata(arg.data_list,arg.data_config);
fenye(arg.fenye);
}
});
} // {#choice数据类型,定义全局变量#}
function initchoice(choice_dict) {
$.each(choice_dict,function (i,j) {
window[i]=j;
})
} // {#将ajax回调函数中取出表格头部 然后通过循环标签的方式展现出数据来#}
function displaytitle(title){
var $tr = $("<tr>");
$.each(title,function (x,y) {
if(y.display){
var $th = $("<th>");
$th.html(y.title);
$tr.append($th);
}}); // {#先清空再显示数据#}
$('#table_th').empty();
$("#table_th").append($tr);
} // {#将ajax回调函数中取出数据 然后通过循环标签的方式展现出数据来#}
function displaydata(db,data_config) { // {#先清空再显示数据#}
$('#table_td').empty(); $.each(db,function (x,y) {
var $tr = $("<tr>");
$.each(data_config,function (x1,y1) {
if(y1.display){
var $td = $("<td>");
var text_v_ditc = {}; $.each(y1.text.v,function (k,v) {
if(v.substring(0,2) === "@@"){
var globle_name = v.substring(2,v.length);
var data_list_v = y[y1.id];
var t = test(globle_name,data_list_v);
text_v_ditc[k] = t; } else if(v[0] === '@'){
text_v_ditc[k]=y[v.substring(1,v.length)];
}
else {
text_v_ditc[k] = v
} // {#配置td的属性值#}
$.each(y1.attrs,function (ii,jj) {
if(jj[0] === '@'){
$td.attr(ii,y[jj.substring(1,jj.length)]);
}else {
$td.attr(ii,jj)
}
})
});
var xx = y1.text.k.foo(text_v_ditc);
$td.html(xx);
$tr.append($td);
$tr.attr('id',y.id)
}
});
$("#table_td").append($tr)
})
} // {# -------------------------------------------------------------------------- #}
// {#分页#}
function fenye(fy) {
$(".pagination").empty();
for (var i=1;i<=fy.zongpage;i++)
{
var $li = $('<li>').html($('<a>').html(i));
if(i === fy.dangqianpage){
$li.addClass("active")
}
$li.on('click',function () {
chaxundata['yema'] = $(this).text(); if(chaxundata['t1']){
init(chaxundata['yema'],chaxundata['dc'],chaxundata['t1']);
}else {
init($(this).text());
} });
$('.pagination').append($li);
}
}
// {# -------------------------------------------------------------------------- #} // {#条件过滤#}
$('.tjcx_b').on('click',function () {
var t1 = $(".tjcx_i").val();
chaxundata['t1'] = t1;
init(chaxundata.yema,chaxundata.dc,t1);
}); // {# -------------------------------------------------------------------------- #} // {#保存/上传#}
function bindsave(){
$('#save').click(function () {
var postlist=[];
$('#table_td').find('tr[has-edit="true"]').each(function () {
var temp = {};
var id = $(this).attr('id');
temp['id'] = id;
$(this).children('[edit-enable="true"]').each(function () {
var name = $(this).attr('name');
var origin = $(this).attr('origin');
var newval = $(this).attr('new-val');
if(origin !== newval){
temp[name] = newval;
};
}); postlist.push(temp);
$.ajax({
url:requestURL,
type:'POST',
data:{'post_list':JSON.stringify(postlist)},
dataType:'Json',
success:function (arg) {
if(arg.status){
// {#console.log(arg);#}
var $msg = $('<span class="label label-primary">').html(arg['status']);
$('.msg_warning').empty();
$('.msg_warning').append($msg);
init();
}else {
alter(arg);
}}
})
})
})} // {#全选/反选/取消#}
function bindall() {
$('#bindall').click(function () {
$('#table_td').find(':checkbox').each(function () {
if($('#bindbj').hasClass('btn-warning')){
if($(this).prop('checked')){ }else {
$(this).prop('checked',true);
var $cur = $(this).parent().parent();
bjhang($cur)
}
}else {
$(this).prop('checked',true);
};
})
})
}
function unbindall() {
$('#unbindall').click(function () {
$('#table_td').find(':checked').each(function () {
if($('#bindbj').hasClass('btn-warning')){
$(this).prop('checked',false);
var $cur = $(this).parent().parent();
bjhangout($cur);
}else {
$(this).prop('checked',false);
}
})
})
}
function bindfx() {
$('#bindfx').click(function () {
$('#table_td').find(':checkbox').each(function () {
if($('#bindbj').hasClass('btn-warning')){
var $cur = $(this).parent().parent();
if ($(this).prop('checked')){
$(this).prop('checked',false);
bjhangout($cur);
}else {
$(this).prop('checked',true);
bjhang($cur);
}
}else {
if ($(this).prop('checked')){
$(this).prop('checked',false);
}else {
$(this).prop('checked',true);
}
}
})
})
} // {#绑定编辑控件#}
function bindM() {
$('#bindbj').click(function () {
var ed = $(this).hasClass('btn-warning');
if(ed){
$(this).removeClass('btn-warning');
$(this).text("进入编辑模式");
$('#table_td').find(':checked').each(function () {
var $cur = $(this).parent().parent();
bjhangout($cur);
})
}else {
$(this).addClass('btn-warning');
$(this).text("退出编辑模式");
$('#table_td').find(':checked').each(function () {
var $cur = $(this).parent().parent();
bjhang($cur);
})
}
})
} // {#绑定checkbox控件#}
function bindC() {
// 这种方式新增数据无法被选中#}
$('#table_td').on('click',':checkbox',function () {
if($('#bindbj').hasClass('btn-warning')){
var ck = $(this).prop('checked');
var $cur = $(this).parent().parent();
if(ck){
// {#console.log("进入编辑模式");#}
bjhang($cur)
}else{
// {#console.log("退出编辑模式");#}
bjhangout($cur)
}
}
})
} // {#点击checkbox ,进入编辑模式后,将td部分内容变为可编辑内容#}
function bjhang(cur) {
cur.attr('has-edit','true');
cur.children().each(function () {
cur.addClass('success');
var editenable = $(this).attr('edit-enable');
var editetype = $(this).attr('edit-type');
if (editenable === 'true'){
if(editetype === 'select'){
var globalname = $(this).attr("global-name");
var origin = $(this).attr("origin");
var sel = document.createElement('select');
sel.className = "form-control";
$.each(window[globalname],function (k,v) {
var op = document.createElement('option');
op.innerHTML = v[1];
op.setAttribute('value',v[0]);
$(sel).append(op)
});
$(sel).val(origin);
$(this).html(sel);
}else if(editetype === 'input'){
var intext = $(this).text();
var tag = document.createElement('input');
tag.className = "form-control";
tag.value = intext;
$(this).html(tag)
}
}})
}
function bjhangout(cur) {
cur.removeClass('success');
cur.children().each(function () {
var editenable = $(this).attr('edit-enable');
if (editenable === 'true'){
var editetype = $(this).attr('edit-type');
if(editetype === 'select'){
var $select = $(this).children().first() ;
var newid = $select.val();
var newtext = $select[0].selectedOptions[0].innerHTML;
$(this).html(newtext);
$(this).attr('new-val',newid) }else if(editetype === 'input'){
var $input2 = $(this).children().first() ;
var tag2 = $input2.val();
$(this).html(tag2);
$(this).attr('new-val',tag2) }}})} // {# -------------------------------------------------------------------------- #} // {#主体函数#}
$(document).ready(function () {
init();
shijian();
}); // {#数据 修改/全返取/保存#}
function shijian() {
// {#全选/反选/取消#}
bindall();
bindfx();
unbindall(); // {#保存/上传#}
bindsave(); // {#进入编辑/退出编辑#}
bindM();
bindC();
}
// {# -------------------------------------------------------------------------- #}
})()
HTML
<div class="table-responsive">
<div>
<input class="tjcx_i">
<button class="tjcx_b btn btn-sm btn-default">条件查询</button>
</div>
<br>
<table class="table table-bordered">
<div>
<button id="bindall" type="button" class="btn btn-sm btn-default">全选</button>
<button id="bindfx" type="button" class="btn btn-sm btn-default">反选</button>
<button id="unbindall" type="button" class="btn btn-sm btn-default">取消</button>
<button id="bindbj" type="button" class="btn btn-sm btn-default">进入编辑模式</button>
<button id="save" type="button" class="btn btn-sm btn-default">保存</button>
<span class="msg_warning"></span>
</div>
<br>
<thead id="table_th"></thead>
<tbody id="table_td"></tbody>
</table>
<nav aria-label="Page navigation">
<ul class="pagination">
</ul>
</nav>
</div>
后端数据接口定义:
def datal_interface(request):
from app01.config_datalist import data_config
from django.db.models import Q if request.method =="GET": # 获取查询参数
yema = int(request.GET.get("yema", 1))
t1 = request.GET.get('t1','')
display_count = int(request.GET.get("dc", 10)) data_value = []
for i in data_config:
if i['id']:
data_value.append(i['id']) # 获取数据
if t1:
source_data = list(eval("""models.userinfo.objects.filter(%s).values(*data_value)""" % t1))
else:
source_data = list(models.userinfo.objects.values(*data_value)) data_chose_sex = models.userinfo.sex_choose # 分页显示 ---------------------------------------------------
# 总数据条数
# 每页显示条数
# 总页码
# 当前页码 默认为 第一页 start = display_count * (yema - 1)
end = display_count * yema
data = source_data[start:end] if divmod(len(source_data),display_count)[1] != 0:
zong_paga = divmod(len(source_data),display_count)[0] + 1
else:
zong_paga = divmod(len(source_data),display_count)[0] fenye_dict = {
'zongshuju':len(source_data),
'meiyexianshi':display_count,
'zongpage':zong_paga,
'dangqianpage':yema
} # 数据打包
msg = {
"data_config": data_config,
"data_list": data,
'data_globe': {"data_chose_sex": data_chose_sex},
'fenye': fenye_dict
} return HttpResponse(json.dumps(msg)) elif request.method =="POST":
content = json.loads(request.POST['post_list'])
if content:
for i in content:
models.userinfo.objects.filter(id=i['id']).update_or_create(i) ret = {'status': '数据已经更新!'}
return HttpResponse(json.dumps(ret))
字段配置文件:
# 单个@符号后面跟的是 数据变量
# 两个@@符号后面跟的是 需要到 全局变量中的取得key # text:{} 示例:
# 必须要填,否则会报错:默认格式,'text': {'k': '{n}', 'v': {"n": "@数据字段"}},
# 生成特定的标签类型
# 'text':{'k':"<input type='checkbox' />",'v':{}},
# 生成指定格式的文本
# 'text':{'k':'{n}-{m}','v':{"n":"hello",:"m":"world"}},
# 生成指定字段
# @ 一个@ 表示获取数据中的数值,两个@@ 表示去全局变量中获取数据
# 'text':{'k':'{n}','v':{"n":"@@data_chose_sex"}}, data_config = [
{
"id":'',
'display':1,
'title':'选项',
'text':{'k':"<input type='checkbox' />",'v':{}},
'attrs':{},
},
{
"id":'id',
'display':1,
'title':'ID',
'text': {'k': '{n}', 'v': {"n": "@id"}},
'attrs': {'name': 'id', "origin": '@id', 'edit-enable': 'true', 'edit-type': 'input'},
},
{
"id":"name",
"display":1,
"title":"姓名",
'text': {'k': '{n}', 'v': {"n": "@name"}},
'attrs': {'name': 'name', "origin": '@name', 'edit-enable': 'false', 'edit-type': 'input'},
},
{
"id":"sex",
"display":1,
"title":"性别",
'text':{'k':'{n}','v':{"n":"@@data_chose_sex"}},
'attrs': {'name': 'sex', "origin": '@sex', 'edit-enable': 'true', 'edit-type': 'select', "global-name": 'data_chose_sex'},
},
{
"id":"old",
"display":1,
"title":"年龄",
'text': {'k': '{n}', 'v': {"n": "@old"}},
'attrs': {'name': 'old', "origin": '@old', 'edit-enable': 'true', 'edit-type': 'input'},
},
{
"id":"phone",
"display":1,
"title":"联系方式",
'text': {'k': '{n}', 'v': {"n":"@phone"}},
'attrs': {'name': 'phone', "origin": '@phone', 'edit-enable': 'true', 'edit-type': 'input'},
},
{
"id": "email",
"display": 1,
"title": "邮箱",
'text': {'k':'{n}','v':{"n":"@email"}},
'attrs': {'name': 'email', "origin": '@email', 'edit-enable': 'true', 'edit-type': 'input'},
},
{
"id": "",
"display": 1,
"title": "操作",
'text': {'k':'{n}','v':{"n":"<a href=http://www.baidu.com>删除</a>"}},
'attrs': {},
},
]
模组 前后端分离CURD 组件的更多相关文章
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十║Vue基础终篇:传值+组件+项目说明
缘起 新的一天又开始啦,大家也应该看到我的标题了,是滴,Vue基础基本就到这里了,咱们回头看看这一路,如果你都看了,并且都会写了,那么现在你就可以自己写一个Demo了,如果再了解一点路由,ajax请求 ...
- 前后端分离djangorestframework——分页组件
Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用 前后端分离djangorestframework——序列化与反序列化数据 文章里用到的数据,数据库用的my ...
- 前后端分离djangorestframework——路由组件
在文章前后端分离djangorestframework——视图组件 中,见识了DRF的视图组件强大,其实里面那个url也是可以自动生成的,就是这么屌 DefaultRouter urls文件作如下调整 ...
- 前后端分离djangorestframework——视图组件
CBV与FBV CBV之前说过就是在view.py里写视图类,在序列化时用过,FBV就是常用的视图函数,两者的功能都可以实现功能,但是在restful规范方面的话,CBV更方便,FBV还要用reque ...
- 深入解析当下大热的前后端分离组件django-rest_framework系列一
前言 Nodejs的逐渐成熟和日趋稳定,使得越来越多的公司开始尝试使用Nodejs来练一下手,尝一尝鲜.在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展 ...
- 前后端分离djangorestframework——认证组件
authentication 认证是干嘛的已经不需要多说.而前后端未分离的认证基本是用cookie或者session,前后端分离的一般用token 全局认证 先创建一个django项目,项目名为drf ...
- [转].NET Core前后端分离快速开发框架(Core.3.0+AntdVue)
[转].NET Core前后端分离快速开发框架(Core.3.0+AntdVue) 目录 引言 简介 环境搭建 开发环境要求 基础数据库构建 数据库设计规范 运行 使用教程 全局配置 快速开发 管理员 ...
- NET Core3前后端分离开发框架
NET Core前后端分离快速开发框架 https://www.cnblogs.com/coldairarrow/p/11870993.html 引言 时间真快,转眼今年又要过去了.回想今年,依次开源 ...
- 前后端分离之前端项目构建(grunt+require+angular)
前言 前段时间做了一个项目,前端开发页面,然后把代码给到后端同学,后端同学通过vm再来渲染页面.后来才发现,这种方式简直是太low了,因为前端代码在服务端同学那里,每次前端需要更改的时候都需要去到服务 ...
随机推荐
- 实战申请Let's Encrypt永久免费SSL证书过程教程及常见问题
最近需要https这里看到一份不错的博客,收录一下! Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla.Cisco.Akamai.IdenTrust ...
- python中的struct模块的学习
由于TCP协议中的黏包现象的发生,对于最low的办法,每次发送之前让他睡一秒,然后在发送,可是这样真的太low了,而且太占用资源了. 黏包现象只发生在tcp协议中: 1.从表面上看,黏包问题主要是因为 ...
- redis分页
模仿的https://www.cnblogs.com/dee0912/p/4612183.html 第一步连接redis后进行添加数据 require_once '../redis/redis.php ...
- 基于HTML5 的互联网+地铁行业
前言 近几年,互联网与交通运输的融合,改变了交易模式,影响着运输组织和经营方式,改变了运输主体的市场结构.模糊了运营与非营运的界限,也更好的实现了交通资源的集约共享,同时使得更多依靠外力和企业推动交通 ...
- C#中UDP数据的发送、接收
Visual C# UDP数据的发送、接收包使用的主要类及其用法: 用Visual C# UDP协议的实现,最为常用,也是最为关键的类就是UdpClient,UdpClient位于命名空间System ...
- 干货型up主
很多教学视频,我看了反射,正在看JAVAWEB 和Spring 讲得很清楚 反正就是很好!!! https://space.bilibili.com/326782142?spm_id_from=33 ...
- 基于开发者中心DevOps流水线快速上云
导读:“DevOps”这个词现在很流行,它具体指的是什么呢?本文介绍了DevOps和开发者中心DevOps流水线,图文并茂,解答您的疑惑. 那么DevOps是什么?开发者中心<DevOps流水线 ...
- 控制结构(1): 分枝/叶子(branch/leaf)
// 下一篇:卫语句(guard clause) 典型代码: function doSomething1(){ // ... } function doSomething2(){ // ... } f ...
- mybatis 使用事务处理
mybatis默认开启事务 以前使用JDBC的时候,如果要开启事务,我们需要调用conn.setAutoCommit(false)方法来关闭自动提交,之后才能进行事务操作,否则每一次对数据库的操作都会 ...
- koa-router 后台路由管理框架
koa-router是koa框架配套的路由管理模块,对后台的接口分离出来. 首先引入koa和koa-router, 然后分批设置路由: 代码中的institution.modifyInsStatus是 ...