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 组件的更多相关文章

  1. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十║Vue基础终篇:传值+组件+项目说明

    缘起 新的一天又开始啦,大家也应该看到我的标题了,是滴,Vue基础基本就到这里了,咱们回头看看这一路,如果你都看了,并且都会写了,那么现在你就可以自己写一个Demo了,如果再了解一点路由,ajax请求 ...

  2. 前后端分离djangorestframework——分页组件

    Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用  前后端分离djangorestframework——序列化与反序列化数据  文章里用到的数据,数据库用的my ...

  3. 前后端分离djangorestframework——路由组件

    在文章前后端分离djangorestframework——视图组件 中,见识了DRF的视图组件强大,其实里面那个url也是可以自动生成的,就是这么屌 DefaultRouter urls文件作如下调整 ...

  4. 前后端分离djangorestframework——视图组件

    CBV与FBV CBV之前说过就是在view.py里写视图类,在序列化时用过,FBV就是常用的视图函数,两者的功能都可以实现功能,但是在restful规范方面的话,CBV更方便,FBV还要用reque ...

  5. 深入解析当下大热的前后端分离组件django-rest_framework系列一

    前言 Nodejs的逐渐成熟和日趋稳定,使得越来越多的公司开始尝试使用Nodejs来练一下手,尝一尝鲜.在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展 ...

  6. 前后端分离djangorestframework——认证组件

    authentication 认证是干嘛的已经不需要多说.而前后端未分离的认证基本是用cookie或者session,前后端分离的一般用token 全局认证 先创建一个django项目,项目名为drf ...

  7. [转].NET Core前后端分离快速开发框架(Core.3.0+AntdVue)

    [转].NET Core前后端分离快速开发框架(Core.3.0+AntdVue) 目录 引言 简介 环境搭建 开发环境要求 基础数据库构建 数据库设计规范 运行 使用教程 全局配置 快速开发 管理员 ...

  8. NET Core3前后端分离开发框架

    NET Core前后端分离快速开发框架 https://www.cnblogs.com/coldairarrow/p/11870993.html 引言 时间真快,转眼今年又要过去了.回想今年,依次开源 ...

  9. 前后端分离之前端项目构建(grunt+require+angular)

    前言 前段时间做了一个项目,前端开发页面,然后把代码给到后端同学,后端同学通过vm再来渲染页面.后来才发现,这种方式简直是太low了,因为前端代码在服务端同学那里,每次前端需要更改的时候都需要去到服务 ...

随机推荐

  1. Linux内存管理 (11)page引用计数

    专题:Linux内存管理专题 关键词:struct page._count._mapcount.PG_locked/PG_referenced/PG_active/PG_dirty等. Linux的内 ...

  2. 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据)

    首先安装网络监听软件 运行这个软件 这个软件安装到电脑上,默认是监听咱电脑上的网络通信 咱们先监听电脑的软件的网络通信数据,然后再说怎么监听Wi-Fi和APP的软件的网络通信数据 咱就监听咱基础篇的 ...

  3. 六招轻松搞定你的CentOS系统安全加固

    Redhat是目前企业中用的最多的一类Linux,而目前针对Redhat攻击的黑客也越来越多了.我们要如何为这类服务器做好安全加固工作呢?  一.  账户安全 1.1 锁定系统中多余的自建帐号 检查方 ...

  4. cookie跨域共享

    domain和path属性,domain就是当前域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net,path默认就是当 ...

  5. Entity Framework Core系列之DbContext

    前言: EF Core DbContext表示与数据库的会话,并提供与数据库通信的API,具有以下功能: 数据库连接 数据操作,如查询和持久化 更改追踪 模型构建 数据映射 对象缓存 事务管理 数据库 ...

  6. Math的一些方法

    Math.abs(数值) 把()内的值变为正数 Math.ceil(4.3) 向上取整 // 5 Math.floor(4.3) 向下取整 // 4 Math.round(4.3) 四舍五入取整 // ...

  7. C Programming Style 总结

    对材料C Programming Style for Engineering Computation的总结. 原文如下: C Programming Style for Engineering Com ...

  8. nginx编译文件配置(原)

    1.在根目录的opt下创建文件夹software并wget一个nginx包进行解压,/opt/software/,解压后需要对软件包文件进行授权 2.cd到nginx目录输入id nginx 未安装插 ...

  9. bis和bic命令实现或和异或运算

    从20世纪70年代末到80年代末,Digital Equipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,只有bis(位设置)和bic(位清除)这两种指令.两种指令的输入 ...

  10. mysql数据去重并排序使用distinct 和 order by 的问题

    比如直接使用: SELECT distinct mobileFROM table_aWHERE code = 123ORDER BY a_ime desc 在本地mysql数据库没有错,在线上的数据库 ...