首页 » 产品日记 » 正文

TP6+Layui实现动态进度条

在执行耗时比较长的任务时浏览器总是一个“圈”在哪转,焦急等待之后可能还给你来个超时,解决超时的问题百度一堆,现在主要解决“执行进度状态”。
项目是基于thinkadmin框架写的(Thinkphp6+LayUI),查了layui文档,有个进度条的组件progress,地址是:https://layuion.com/docs/element/progress.html

实现的思路:dataPro为主程序,getStauts为dataPro的进度查询程序,前端利用js异步获取getStatus的返回值即可实现进度条的动态更新。

在程序dataPro中加入一个session或者redis、缓存、本地文件之类的(可能是我对框架不熟,就是TP框架下的session是在程序执行完之后写入的,意味着程序在执行过程中是获取不到session的,不知道我这么理解对不对,总之实践中获取到的是所有任务执行完了的最终session,估计要等到真大神来解释了),既然session用不了,就用了写文件(自己用不要紧,如果是多用户,可能会有点问题)。
后端代码如下:

public function dataPro(){
    
$num = 1000;//任务总量
$i = 1;
//模拟数据处理
       
...主要执行的程序

            //任务进度百分比,这个值要传给前端组件
            $percent = $i / $num * 100;

            //打开文件
            $f = fopen('tmp.txt','w');
            fwrite($f,$percent);
            fclose($f);

...执行结束

        return 返回执行结果;

    }

    public function getstatus(){
//状态查询,供前端ajax异步调用
        //读取文件
        $f = fopen('tmp.txt','r');
        $percent = fgets($f);
        fclose($f);

//返回百分比
        return $percent;

    }



前端代码:

<div class="layui-progress layui-progress-big" lay-filter="progress" lay-showPercent="yes" >
    <div id = "demo" class="layui-progress-bar layui-bg-green" lay-percent="1%" ></div>
</div>

<script>
  
    $("#withExport").click(function () {
        // 执行数据处理程序
  
        $.ajax({
        //向后端程序dataPro发起请求
            url:'api/dataPro',
            success:function (data) {
                console.log('这里是数据处理结果:',data);
            }
        });


        // 执行进度条
        layui.use('element', function(){
            var element = layui.element;

            var scanTime = 1000; //定义执行周期,1秒钟
            var timer = setInterval(function (){
                //每1秒执行一次
                $.ajax({
                    url: 'api/getstatus',
                    success: function (data) {
                        //动态设置百分比,就是getstatus返回的结果
                        var percent = data;
                        element.progress('progress', percent +'%')
                        if(percent == 100){
                            clearInterval(timer); //进度到100%,关闭定时器
                        }
                    },
                    error: function (e) {
                        //关闭定时器
                        clearInterval(timer);
                    }
                });
            }, scanTime);
        });
    });

</script>

效果如下:

肯定不是最优解,但是解决眼前的问题了。

发表评论