模组 前后端分离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了,因为前端代码在服务端同学那里,每次前端需要更改的时候都需要去到服务 ...
 
随机推荐
- Linux内存管理 (11)page引用计数
			
专题:Linux内存管理专题 关键词:struct page._count._mapcount.PG_locked/PG_referenced/PG_active/PG_dirty等. Linux的内 ...
 - 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据)
			
首先安装网络监听软件 运行这个软件 这个软件安装到电脑上,默认是监听咱电脑上的网络通信 咱们先监听电脑的软件的网络通信数据,然后再说怎么监听Wi-Fi和APP的软件的网络通信数据 咱就监听咱基础篇的 ...
 - 六招轻松搞定你的CentOS系统安全加固
			
Redhat是目前企业中用的最多的一类Linux,而目前针对Redhat攻击的黑客也越来越多了.我们要如何为这类服务器做好安全加固工作呢? 一. 账户安全 1.1 锁定系统中多余的自建帐号 检查方 ...
 - cookie跨域共享
			
domain和path属性,domain就是当前域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net,path默认就是当 ...
 - Entity Framework Core系列之DbContext
			
前言: EF Core DbContext表示与数据库的会话,并提供与数据库通信的API,具有以下功能: 数据库连接 数据操作,如查询和持久化 更改追踪 模型构建 数据映射 对象缓存 事务管理 数据库 ...
 - Math的一些方法
			
Math.abs(数值) 把()内的值变为正数 Math.ceil(4.3) 向上取整 // 5 Math.floor(4.3) 向下取整 // 4 Math.round(4.3) 四舍五入取整 // ...
 - C Programming Style 总结
			
对材料C Programming Style for Engineering Computation的总结. 原文如下: C Programming Style for Engineering Com ...
 - nginx编译文件配置(原)
			
1.在根目录的opt下创建文件夹software并wget一个nginx包进行解压,/opt/software/,解压后需要对软件包文件进行授权 2.cd到nginx目录输入id nginx 未安装插 ...
 - bis和bic命令实现或和异或运算
			
从20世纪70年代末到80年代末,Digital Equipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,只有bis(位设置)和bic(位清除)这两种指令.两种指令的输入 ...
 - mysql数据去重并排序使用distinct 和 order by 的问题
			
比如直接使用: SELECT distinct mobileFROM table_aWHERE code = 123ORDER BY a_ime desc 在本地mysql数据库没有错,在线上的数据库 ...