当前位置: 首页
前端开发
前后端结合实现amazeUI分页效果

前后端结合实现amazeUI分页效果

热心网友 时间:2026-04-28
转载

前后端结合实现AmazeUI分页

在Web开发中,数据分页是一个绕不开的经典问题。今天,我们就来详细拆解一套基于AmazeUI风格,实现前后端分离的分页方案。具体代码实现如下。

先说个前提,这篇文章的实现思路,很大程度上参考了CSDN博主“bra ve_coder”分享的技术文章(原文链接:https://blog.csdn.net/bra ve_coder/article/details/52367124)。站在前人的肩膀上,我们才能看得更远,这里首先要对原作者的分享精神表示感谢。

前端实现

前端的核心任务,是动态渲染分页器按钮,并通过Ajax与后端进行数据交互。关键在于如何让分页逻辑清晰,且在不同数据量下都能保持良好的用户体验。

1、引入paginator.js

首先,我们需要封装一个专用的分页插件。这个插件需要处理按钮的生成、点击事件以及数据请求。其核心逻辑在于,根据总页数动态计算当前应该显示哪些页码按钮,并处理好“上一页”、“下一页”以及省略号的显示。直接看封装好的代码:

(function ($) {
    $.fn.paginator = function (options) {
        //this指向当前的选择器
        var config = {
            url: "",
            pageParent: "",
            totalBars: -1,
            limit: -1,
            offset: 1,
            callback: null
        }
        //合并参数
        var opts = $.extend(config, options);
         opts.totalBars = Math.ceil(opts.totalBars / opts.limit);
        //计算按钮的总个数
         //获取offset参数
        var queryString = function (url) {
            var offset = (url.split("?")[1]).split("=")[1];
            return parseInt(offset);
        }
         //ajax核心方法,用于分页的数据操作
        var ajaxCore = function (offset, fn) {
            $.ajax({
                "url": opts.url,
                "data": {
                    "offset": offset,
                    "limit": opts.limit
                },
                "dataType": "JSON",
                "method": "POST",
                "success": fn
            });
        }
         //重新装配分页按钮
        var pageCore = function (offset) {
            if (opts.offset == offset) {
                return;
            } //如果是当前页面,那么就什么事都不用干了!
            else {
                ajaxCore(offset, opts.callback);
                $(opts.pageParent).empty();
                //否则,清空所有的节点,重新向DOM插入新的分页按钮
                var output = "";
                var nextBar = offset == opts.totalBars ? "
  • »
  • " : "
  • »
  • "; var preBar = offset == 1 ? "
  • «
  • " : "
  • «
  • "; //组装向上一个节点和下一页节点 if (opts.totalBars > 7) { if (offset < 5) { output += preBar; for (var i = 1; i <= 5; i++) { if (i == offset) { output += "
  • " + offset + "
  • "; } else { output += "
  • " + i + "
  • "; } } output += "
  • ...

  • "; output += "
  • " + (opts.totalBars) + "
  • " + nextBar; } else if (offset >= 5 && offset <= opts.totalBars - 4) { //当页面大于7个的时候,那么在第五个和倒数第五个时,执行 output += preBar; output += "
  • " + 1 + "
  • "; //第一个 output += "
  • ...

  • "; //省略号 output += "
  • " + (offset - 1) + "
  • "; output += "
  • " + offset + "
  • "; output += "
  • " + (offset + 1) + "
  • "; output += "
  • ...

  • "; //省略号; output += "
  • " + (opts.totalBars) + "
  • "; //尾页 output += nextBar; } else if (offset > opts.totalBars - 4 && offset <= opts.totalBars) { //当页面位于倒数第四个时候 output += preBar; output += "
  • " + 1 + "
  • " + "
  • ...

  • "; for (var j = 4; j >= 0; j--) { if (opts.totalBars - j == offset) { output += "
  • " + (opts.totalBars - j) + "
  • "; } else { output += "
  • " + (opts.totalBars - j) + "
  • "; } } output += nextBar; } else { console.log("分页数据出错!"); return; } } else { output += preBar; for (var i = 1; i <= opts.totalBars; i++) { if (i == offset) { output += "
  • " + offset+ "
  • "; } else { output += "
  • " + i+ "
  • "; } } output += nextBar; } $(opts.pageParent).append(output); opts.offset = offset; //将偏移量赋值给config里面的offset } } //清理函数,防止多绑定事件和重新计算分页 var clear = function () { $(opts.pageParent).empty().undelegate(); } //初始化装配分页按钮 var init = function (fn) { if (typeof (fn) != "function") { console.log("将不能正确的执行回调函数"); } else { opts.callback = fn; } clear(); ajaxCore(1, opts.callback);//执行初始化ajax方法 var preBar = "
  • «
  • "; //上一页,(禁用的效果) //如果只有一页,那么禁用下一页 var nextBar = opts.totalBars > 1 ? "
  • »
  • " : "
  • »
  • "; //最后一页 var output = "
  • 1
  • "; if (opts.totalBars <= 7) { for (var i = 1; i < opts.totalBars; i++) { output += "
  • " + (i + 1) + "
  • "; } } else { for (var j = 1; j < 5; j++) { output += "
  • " + (j + 1) + "
  • "; } output += "
  • ...

  • "; output += "
  • " + (opts.totalBars) + "
  • "; } $(opts.pageParent).delegate("a","click", function () { var offset = queryString($(this).attr("yxhref")); console.log("ok"); pageCore(offset); }); $(opts.pageParent).append(preBar + output + nextBar); }; init(opts.callback);//初始化分页引擎 } }(window.jQuery))

    2、获取总页数,再初始化分页器

    有了插件,接下来就是在具体页面中调用了。这里通常分两步:先请求接口获取数据总条数,然后用总条数去初始化我们刚刚写好的分页插件。

    $.ajax({
            type: "GET",
            url: selectSendNumberNumsByContURL,//获取总数
            data: {},
            dataType: "json",
            success: function(data){
                if (data[0].code == 200) {
                    $("#paginator").paginator({
                        url: selectSendNumberByContURL + "?offsets=",
                        pageParent: "#paginator",
                        totalBars: data[0].allNums,
                        limit: 10,
                        offset: 1,
                        callback: function (data1) {
                            //清空DOM节点
                            //动态加dom节点
                        }
                    });
                }else{
                }
            },
            error: function (err) {
            }
        });

    后端实现(分页)

    前端把页码和每页大小传过来了,后端要做的就是“按需取货”。这部分的逻辑相对直接,关键在于编写正确的SQL语句。

    在后端Controller层,我们接收前端传来的offset(页码)和limit(每页数量)参数,然后将它们传递给Service层进行数据库查询。这里给出一个Controller的示例:

    @RequestMapping(value = "/selectNumberCheckByCont", method = RequestMethod.POST)
        @ResponseBody
        public List selectNumberCheckByCont(HttpServletRequest request,
                                                         HttpServletResponse response) throws Exception {
            //统一设置返回数据格式
            response.setContentType("application/json");
            response.setHeader("Pragma", "no-cache");
            response.setCharacterEncoding("UTF-8");
            String offset = request.getParameter("offset");
            String limit = request.getParameter("limit");
            List list = iNumberCheckService.selectNumberCheckByCont(offset, limit);
            return list;
        }

    至于Service层和Mapper层,核心就是利用MySQL的LIMIT语法(例如:LIMIT #{start}, #{limit})来实现分页查询,这里不再赘述。

    总结

    这套前后端结合的分页方案,其优势在于前后端职责清晰。前端插件封装了复杂的按钮逻辑和交互,后端则专注于高效的数据查询。虽然初始的插件代码稍长,但一旦封装完成,在项目各处复用起来会非常方便,能显著提升开发效率和数据浏览体验。

    来源:https://www.jb51.net/html5/741754.html

    游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

    同类文章
    更多
    HTML文档版权声明结构与基础脚手架代码质量解析

    HTML文档版权声明结构与基础脚手架代码质量解析

    版权声明需用语义化``标签,©符号使用`©`实体;年份通过服务端、构建或JS分层兜底;`rel= "license "`仅指向真实许可证文件才有效。

    时间:2026-07-07 07:02
    基于HTML模板的组件化全栈交互方案

    基于HTML模板的组件化全栈交互方案

    纯HTML模板仅作静态结构,全栈交互需后端注入数据、前端JS激活模板及用户事件触发双向链路。``标签惰性,不执行脚本或加载资源,需通过克隆填充数据并手动绑定事件实现交互,父子传值依赖JS对象与自定义事件。

    时间:2026-07-07 07:02
    Bootstrap修改Badge徽章边框为圆点样式的方法

    Bootstrap修改Badge徽章边框为圆点样式的方法

    将BootstrapBadge改为圆点:自定义类设置等宽高、border-radius:50%、padding:0、font-size:0;Bootstrap5 2+需加display:inline-block;注意垂直对齐,避免min-width干扰,背景色用background-color更可控。

    时间:2026-07-07 07:02
    Bootstrap响应式多栏Footer社交图标排版实现

    Bootstrap响应式多栏Footer社交图标排版实现

    使用Bootstrap5的grid系统实现响应式多栏Footer,按断点设置列宽;以FontAwesome处理社交图标,避免使用img;利用list-unstyled组织链接列表;借助flex-column容器配合mt-auto使版权行自动贴底,避免fixed-bottom固定定位的弊端。

    时间:2026-07-07 07:02
    如何用Shadow DOM隔离组件内外事件分发

    如何用Shadow DOM隔离组件内外事件分发

    ShadowDOM内部事件默认不穿透影子边界,需显式设置composed:true才能被外部监听。此时event target指向宿主元素,真实触发源需通过event composedPath()[0]获取。原生事件手动派发时也必须声明composed:true。应避免在宿主上依赖event target做逻辑分支,建议在shadowroot内绑定事件或使用

    时间:2026-07-07 07:02
    热门专题
    更多
    刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
    洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
    思美人手游下载专区 思美人手游下载专区
    好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
    不思议迷宫手游下载合集 不思议迷宫手游下载合集
    百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
    jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
    宾果消消消原版下载大全 宾果消消消原版下载大全
    • 日榜
    • 周榜
    • 月榜