同福

做个用户管理系统(39)——用以处理表格或列表的显示的jQuery控件【20210108】

介绍

介绍

今天福哥带着大家给TFUMS系统增加一个jQuery控件——table,使用这个控件可以完成列表功能的前端,包括AJAX方式的数据请求,还有视图模板的渲染处理。

这个控件设计相对比较简单,使用前端控件时候传入的列表数据接口载入列表数据,然后再提供三个回调方法给前端程序,这三个回调方法用来渲染数据列表的界面内容。

福哥曾经想过实现一个自动输出HTML的table标签结构的功能,不过考虑到实际使用场景的前端模板用的table标签结构不见得是福哥设想的结构,最后决定还是通过回调方法由前端程序自己去渲染比较好。

JQ的table控件

福哥封装了一个简单的jQuery控件,可以实现对列表功能的数据加载并在视图模板里渲染出来的目的。这个控件还非常简单,不要着急,我们一步一步地完善它。

JavaScript

(function ($){
    var myTable = {
        table : null,
        opts : null,
        pn : 0,

        start : function(){
            this.pn = (this.opts.pn) ? this.opts.pn : 1;
            this._doLoadEvent();
        },

        // ajax functions

        _doLoadEvent : function(){
            var ex=this;

            this._doAjax({
                success: function (d) {
                    ex._doAjaxSuccess(d, ex.opts);
                },
                error: function (d) {
                    ex._doAjaxError(d, ex.opts);
                }
            }, this.opts);
        },

        _doAjax : function(opts, defOpts){
            opts.url = defOpts.dataUrl;
            opts.url = opts.url.replace( /\{pn\}/ , this.pn);
            opts.method = defOpts.dataMethod;
            opts.contentType = false;
            opts.processData = false;
            if(opts.method == null){
                opts.method = "get";
            }
            if(opts.dataType == null){
                opts.dataType = "json";
            }
            $.ajax(opts);
        },

        _doAjaxSuccess : function(d, opts){
            if(this.opts.dataType == "classic"){
                this._doDataTypeClassic(d, opts);
                this._doAttachCommonEvents();
            }
            else if(opts.onSuccess){
                opts.onSuccess.call(this, d);
            }
        },

        _doDataTypeClassic : function(d, opts){
            if(d && d instanceof Object
                && d.page && d.page instanceof Object
                && d.data && d.data instanceof Array){
                if(opts.onSuccess){
                    opts.onSuccess.call(this, d, this.table);
                }
                if(opts.onRenderTable){
                    opts.onRenderTable.call(this, d, this.table);
                }
                if(opts.onRenderRow){
                    for(var i=0;i<d.data.length;i++){
                        opts.onRenderRow.call(this, d.data[i], this.table);
                    }
                }
                if(opts.onRenderPage){
                    opts.onRenderPage.call(this, d.page, this.table);
                }
            }
            else{
                if(opts.onError){
                    opts.onError.call(this, d, this.table);
                }
            }
        },

        _doAttachCommonEvents : function(){
            var ex=this;

            this.table.find('[page-num]').click(function(){
                ex.pn = $(this).attr('page-num');
                ex._doLoadEvent();
            });
        },

        _doAjaxError : function(d, opts){
            if(opts.onError){
                opts.onError.call(this, d);
            }
        },

        init : function(table, opts){
            if(!opts instanceof Object){
                opts = {};
            }
            this.table = $(table);
            this.opts = opts;
        }
    }
    myTable.init.prototype = myTable;

    $.fn.table=function (options) {
        var my = new myTable.init(this, options);
        my.start();
    }
})(jQuery);

文档列表

HTML

<div class="row">
    <div class="col-12 table article-list">
        <div class="row">
            <div class="col-12">
                <table class="article-list-table">
                    <thead>
                        <tr>
                            <th>ID</th>
                            <th>标题</th>
                            <th>日期</th>
                        </tr>
                    </thead>
                    <tbody>

                    </tbody>
                </table>
            </div>
        </div>
        <div class="row">
            <div class="col-12">
                <ul class="pagination article-list-page" style="margin-top: 12px;">

                </ul>
            </div>
        </div>
    </div>
</div>

JS

$('.article-list').table({
    dataUrl: "<% $TFReq->server->BASE_URI %>api/article/article/_list?pn={pn}",
    dataMethod: "post",
    dataType: "classic",
    onRenderTable: function(data, table){
        var obj = table.find(".article-list-table").find('tbody');
        obj.html("");
    },
    onRenderRow: function(row, table){
        var obj = table.find(".article-list-table").find('tbody');
        obj.append('<tr>' +
            '   <td>'+ row.mId +'</td>' +
            '   <td><a href="<% $TFReq->server->BASE_URI %>home/'+ row.authorId +'/blog/'+ row.mId +'.html" target="_blank">'+row.mTitle+'</a></td> ' +
            '   <td>'+ row.mDatetime.replace( /[ ].*$/ , "") +'</td>' +
            '</tr>');
    },
    onRenderPage: function(page, table){
        var obj = table.find(".article-list-page"), html = "";
        obj.html("");
        if(page.pageNum > 1){
            obj.append('<li><a page-num="1">第一页</a></li>');
            obj.append('<li><a page-num="'+ (page.pageNum-1) +'">前一页</a></li>');
        }
        if(page.pageTeamArgv){
            for(var p=page.pageTeamArgv.low;p<=page.pageTeamArgv.high;p++){
                obj.append('<li><a page-num="'+ p +'">'+ p +'</a></li>');
            }
            obj.find('[page-num="'+ page.pageNum + '"]').parent().addClass("active");
        }
        if(page.pageNum < page.pageTotal){
            obj.append('<li><a page-num="'+ (page.pageNum+1) +'">后一页</a></li>');
            obj.append('<li><a page-num="'+ page.pageTotal +'">最后页</a></li>');
        }
    },
    onError: function(d){

    }
});

讲解

文档列表

HTML

这是一个标准的数据列表的HTML结构,福哥留出了几个特殊的样式名称给前端程序调用使用

JS

这是调用JQ控件table的实例,本身代码没有什么,主要逻辑在三个回调方法里。包括:onRenderTable、onRenderRow和onRenderPage三个回调方法,这三个方法传入的第一个参数不一样,分别对应不同回调方法的功能而定。

使用

效果

04ad4b4352e94513.jpg

总结

今天福哥带着童鞋们实现了JQ控件table的功能,并且在TFUMS系统里面制作了一个使用这个JQ控件table的实例。不过,福哥的这个实例不是TFUMS系统的user模块的数据,而是同福网站的文档数据。没有关系,后面福哥会继续完善TFUMS系统的同时,给出用户列表的程序代码,而到时候肯定还是使用JQ控件table来完成前端程序的了。