V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
sunjourney
V2EX  ›  分享创造

Go 的分页器,提供响应的资源列表分页支持

  •  
  •   sunjourney · 2019-03-27 10:41:42 +08:00 · 1601 次点击
    这是一个创建于 2065 天前的主题,其中的信息可能已经有所发展或是发生改变。

    适用于你的 Go Web Server,包装你的请求,提供分页信息的解析。

    特色:

    1. 从 URI 中解析出分析信息:
      • 抽取 page 和 page_size
      • 抽取其它的查询键值对
    2. 装饰你的响应体:
      • 提供分页的导航字段:page, page_size, total
      • 提供超媒体链接:first, last, prev, next
      • 提供查询键值对
    3. 获取计算值:
      • 获取 URI 中是否有分页信息,没有将使用默认分页信息,page = 1, page_size = 30
      • 获取的查询 offset 与 length
      • 获取手动切片资源的起止 indices
      • 计算其它页或者 list 中某一个资源它对应的分页信息
    4. 编辑 / 重写一些字段:
      • 修改 page, page_size 的值
      • 修改查询键值对的值
    5. 支持自动切片长列表到分页的范围内
    6. 配置一下初始属性

    用法:

    	pg := pagination.DefaultPagination()
    
    	pgt := pg.Parse(requestURI)
    
    	paginatedData := pgt.WrapWithTruncate(TrunctableBooks(books), total)
    
    	responseBody, _ := json.MarshalIndent(paginatedData, "", "    ")
    
    	fmt.Println(string(responseBody))
    
    	offset, length := pgt.GetOffsetRange()
    
    	total, items := db.Offset(offset).Limit(length).Query()
    
    	start, end := pgt.GetRange()
    
    	total, items := db.QueryAll()
    	items = items[start:end]
    

    项目地址: https://github.com/zheeeng/pagination

    求万能的 V 友的 star ~

    第 1 条附言  ·  2019-03-27 16:45:09 +08:00

    样例输出

    {
        "pagination": {
            "page": 2,
            "page_size": 5,
            "total": 20,
            "first": "api.example.com/books?author=jk&page=1&page_size=5",
            "last": "api.example.com/books?author=jk&page=4&page_size=5",
            "prev": "api.example.com/books?author=jk&page=1&page_size=5",
            "next": "api.example.com/books?author=jk&page=3&page_size=5",
            "query": {
                "author": [
                    "jk"
                ],
                "page": [
                    "2"
                ],
                "page_size": [
                    "5"
                ]
            }
        },
        "result": [
            {
                "id": 5,
                "author": "jk",
                "name": "book"
            },
            {
                "id": 6,
                "author": "jk",
                "name": "book"
            },
            {
                "id": 7,
                "author": "jk",
                "name": "book"
            },
            {
                "id": 8,
                "author": "jk",
                "name": "book"
            },
            {
                "id": 9,
                "author": "jk",
                "name": "book"
            }
        ]
    }
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4427 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:35 · PVG 13:35 · LAX 21:35 · JFK 00:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.