• Spring Boot中利用递归算法查询到所有下级用户,并手动进行分页


    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中的值,这样就记录下来了所有下家。其次进行分页(分页是基础操作),并返还给前端。

  • 相关阅读:
    Dart语言概览
    Flutter开发环境配置(MAC版)
    Jetpack系列:Paging组件帮你解决分页加载实现的痛苦
    Jetpack系列:应用内导航的正确使用方法
    Jetpack系列:LiveData入门级使用方法
    在Android平台使用SNPE应链接libc++库
    Android binder流程简图
    使用Visual Studio Code进行远程开发
    用clock()函数计时的坑
    OpenCV Mat格式存储YUV图像
  • 原文地址:https://www.cnblogs.com/tian874540961/p/10213499.html
Copyright © 2020-2023  润新知