Spring Boot中利用遞歸算法查詢到所有下級用戶,並手動進行分頁
前提:語言用的是kotlin(和Java一樣,但更簡潔),寫下這篇文章用來記錄編程過程中遇到的一些難點
1、功能需求
前端用戶A點擊“我的推薦”后,調用后台的接口,查詢到所有的下家(不僅包括直接下家)
如圖所示,當前用戶A要查詢所有下家用戶,就是以自己為樹的“根”節點,遍歷所有下家用戶,並返回所有下家:B、C、D、E···。
2、代碼實現
//我的推薦
fun queryLower(request: QueryLowerRequestModel,userToken: UserToken): PageData2<QueryLowerResponseModel> {
//創建一個list,用於存儲遞歸后的返回
var mutableList = mutableListOf<String>()
GetMyRecommend(userToken.userId!!,mutableList)
var responseList = mutableListOf<QueryLowerResponseModel>()
var userAsset = assetRepository.findAll()
for(i in mutableList) {
userAsset.forEach { e ->
if (e.username == i)
{
responseList.add(QueryLowerResponseModel(
userName = i,
baseMoney = e.base_money,
create_time = e.base_money_time,
isDirect = 0
))
}
}
}
var toIndex = (request.pageNo+1)*request.size-1
if( (request.pageNo+1)*request.size > mutableList.size)
{
toIndex = mutableList.size
}
var totalPages :Int = (mutableList.size / request.size)+1
return PageData2(
list = responseList.subList(request.pageNo*request.size,toIndex),
totalNum = mutableList.size.toLong(),
pageNo = request.pageNo,
totalPages = totalPages,
hasMore = false
)
}
其中的GetMyRecommend函數是我自定義的一個遞歸函數,函數體如下:
//遞歸獲取我的推薦
fun GetMyRecommend(id:Long ,nameList:MutableList<String> )
{
var userList = usersRepository.selectLowerUsers(id)
if(userList.isEmpty())
{
return
}
else
{
for( i in userList)
{
nameList.add(i)
var userId = usersRepository.findUserEntityByUsername(i)
GetMyRecommend(userId.id,nameList)
}
}
}
可以看到,在遞歸過程中,每次我都進行了數據庫的操作,雖然這樣的效率很低,但在敏捷開發過程中,首要的任務就是將功能實現,其次再考慮性能的問題。這個遞歸我利用了list傳地址的特性,每次對list操作都會改變list中的值,這樣就記錄下來了所有下家。其次進行分頁(分頁是基礎操作),並返還給前端。