概述在业务系统尤其是后台管理系统的开发中,列表页显示的数据来自多个数据源,列表页需要支持分页。如何解决?问题如上图所示。数据源可能来自不同的DB数据库,不同的API接口,或者DB和API的组合。我对此没有很好的解决方案。当我接到这样的需求时,我首先要和需求方沟通,看看这个分页是否合理。无外乎两种选择:定期进行数据同步,先将查询到的数据聚合到一个地方,再进行查询分页。内存分页,先将查询数据存入内存,再对查询进行分页。如果对某个数据源进行分页,其他字段从其他数据源获取,比较好办。如果多个数据源融合后分页,需要周期性同步数据或者在内存中分页。定时数据同步方案可以根据实际情况设计同步频率。至于同步到ES/MySQL/MongoDB,你可以自己决定。关于内存中的分页方案,这里有两个小方法供参考。PHP方法$data=[0=>['name'=>"Name1",'age'=>"Age1"],1=>['name'=>"Name2",'age'=>"Age2"],2=>['name'=>"姓名3",'age'=>"3岁"],3=>['name'=>"姓名4",'age'=>"4岁"],4=>['name'=>"姓名5",'age'=>"5岁"],5=>['name'=>"姓名6",'age'=>"6岁"],6=>['name'=>"姓名7",'age'=>"7岁"],7=>['name'=>"姓名8",'age'=>"8岁"],8=>['name'=>"姓名9",'age'=>"9岁"],9=>['name'=>"姓名10",'age'=>"10岁"],];/***数组分页*@paramarray$arrayData数组数据*@paramint$page页数*@paramint$pageSize每页显示的项目数*@returnarray*/functionarrayToPageData($arrayData=[],$page=1,$pageSize=10){$arrayData=array_values((array)$arrayData);$pageData['list']=array_slice($arrayData,($page-1)*$pageSize,$pageSize);$pageData['pagination']['total']=count($arrayData);$pageData['分页']['currentPage']=$页;$pageData['分页']['prePageCount']=$pageSize;返回$pageData;}echojson_encode(arrayToPageData($data,2,3));输出:{"list":[{"name":"4岁","age":"4岁"},{"name":"5岁","age":"5岁"},{"name":"Name6","age":"age6"}],"pagination":{"total":10,"currentPage":2,"prePageCount":3}}Go方法包mainimport("encoding/json""fmt")typeUser[]struct{Namestring`json:"name"`Agestring`json:"age"`}typePaginationstruct{Totalint`json:"total"`CurrentPageint`json:"currentPage"`PrePageCountint`json:"prePageCount"`}typeListPageDatastruct{ListUser`json:"list"`Pagination分页`json:"pagination"`}funcmain(){jsonStr:=`[{"name":"姓名1","age":"姓名1"},{"姓名":"姓名2","age":"姓名2"},{"姓名":"姓名3","age":"3岁"},{"name":"4岁","age":"4岁"},{"name":"5岁","age":"5岁"},{"name":"6岁","age":"6岁"},{"name":"7岁","age":"7岁"},{"name":"8岁","age":"8岁"},{"name":"9岁","age":"9岁"},{"name":"10岁","age":"10岁"}]`varuserUsererr:=json.Unmarshal([]byte(jsonStr),&user)iferr!=nil{fmt.Println(err.Error())}page:=2pageSize:=3pageData:=ArraySlice(用户,页面,pageSize)listPageData:=ListPageData{}listPageData.List=pageDatalistPageData.Pagination.Total=len(user)listPageData.Pagination.CurrentPage=页面listPageData.Pagination.PrePageCount=pageSizejsonData,_:=JsonEncode(listPageData)fmt.Println(jsonData)}funcJsonEncode(vinterface{})(string,error){bytes,err:=json.Marshal(v)iferr!=nil{return"",err}返回字符串(字节),nil}funcArraySlice(uUser,pageint,pageSizeint)User{offset:=(page-1)*pageSizeifoffset>int(len(u)){panic("offset:offset小于u的长度")}end:=offset+pageSizeifend
