Greasy Fork

Greasy Fork is available in English.

easyv-大屏导出失败(组件404)

可修复,大屏导出组件404,导致失败的场景

// ==UserScript==
// @name         easyv-大屏导出失败(组件404)
// @namespace    http://tampermonkey.net/
// @version      0.2.3
// @description  可修复,大屏导出组件404,导致失败的场景
// @author       nian_yi
// @match        */create/*
// @icon         https://www.google.com/s2/favicons?domain=dtstack.net
// @grant        none
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/2.1.1/jquery.min.js
// ==/UserScript==




const baseUrl = `${window.location.origin}/api/easyv`;

function load(delay = 5000){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve()
        },delay)
    })
}




async function getComponets(data,fn){
    if(data.panelConfig && data.panelConfig.length){
        data.panelConfig.forEach(d=>{
            d.stateConfig?.length && d.stateConfig.forEach(d=>{
                d && getComponets(d,fn);
            })
        })
    }
    fn(data.componentsConfig || []);
}

class Utils {
    constructor(){
        this.count=0;
        this.maxCount=0;
        this.componets = [];
    }

   getState(){
       return {
           count:this.count,
           maxCount:this.maxCount
       }
   }
   async getComponets(componets,fn){
        const data = await getComponets(componets,(list)=>{
            list && this.componets.push(...list);
        });
       fn && fn(this.componets)
    }
   filterRepeatScript(){
   // 清除重复脚本

   }
   async asyncGetScript(list,fn,map = []){
       if(this.count < this.maxCount){
           const item = list[this.count];
           if(!item){
               this.count++;
               this.asyncGetScript(list,fn,map)
               return;
           }
           const base = JSON.parse(item.base);
           const key = `${base.module_name}-${base.version}`;
          // console.log(map.has(key),base)
           if(map[key]){
               if(map[key] === 404 && !item.parent){
                   fn(item);
               }
               this.count++;
               this.asyncGetScript(list,fn,map)
               return ;
           }
           const url = `${window.appConfig.ASSETS_URL}components/${base.module_name}/${base.version}/${base.module_name}.js`;
           const result = await fetch(url);
           map[key] = result.status;
           if(result.status === 404 && item.parent){
               fn(item);
                this.count++;
               this.asyncGetScript(list,fn,map);
               return;
           }
               this.count++;
               this.asyncGetScript(list,fn,map)
       }else{
           fn('end');
       }
    }
    getScriptState(scriptList){
      // 获取脚本状态
       const list = [];
       return new Promise((resolve,reject)=>{
           this.maxCount = scriptList.length;
           this.asyncGetScript(scriptList,(item)=>{
               if(item === 'end'){
                   // over
                   resolve(list);
               }else if(item){
                   list.push(item);
               }
           })
       })
    }
    recycle(param){
        // 删除接口
         return fetch(baseUrl+'/v4/components/recycle', {
             body: JSON.stringify({
                 screenId: param.screenId,
                 layers:[
                     {
                     children: [],
                     id:param.id
                     }
                 ]
             }),
             headers: {
                 'content-type': 'application/json'
             },
             method: 'POST'
         })
           .then(response => response.json());
    }
   async removeComponent(list){
        const len = list.length;
       list.forEach(async value=>{
           const  result = await this.recycle(value);
           if(result.success){
               layui.layer.msg(`${value.name}-${value.id}删除成功`);
           }else{
               layui.layer.msg(`${value.name}-${value.id}删除失败`);
           }
       })
       /*
       layui.layer.open({
           title: '删除中...',
           content: `当前进度:${Math.round(count / len * 100)}`,
           btn:''
       });
    */
    }
}



( async function() {
   $(document.head).append(`<link href="https://www.layuicdn.com/layui/css/layui.css?t=${Date.now()}" rel="stylesheet">`);
   $(document.body).append(`<script rel="preload" src='https://www.layuicdn.com/layui/layui.js?t=${Date.now()}'></script>`);
   const utils = new Utils();
    await load();
    const lastHeader = $('#screen-header>div:last');
    if(!lastHeader){
        return false;
    }
    const sdkDownload = $("#screen-header>div:last > span:eq(2)").clone().attr('id','sdkDownload');
    $(lastHeader).prepend(sdkDownload);
    layui.use('layer', function(){
        const layer = layui.layer;
    });
    await load(1000); //延迟1s
    $('#sdkDownload').click(async function(){

        const fetchLoading = layui.layer.open({
            title: '查询数据中...'
            ,content: `<div style="text-align:center" ><i class="layui-icon layui-icon-loading-1 layui-anim layui-anim-rotate layui-anim-loop"></i></div>`,
            btn:''
        });
       const result = await getExport();

        if(!result.success){
            layui.layer.closeAll()
            layui.laer.msg(result.message||'未知错误')
        }else {
            await utils.getComponets(result.data,async (component_list)=>{
                const result = await utils.getScriptState(component_list);
                layui.layer.close(fetchLoading);
                if(!result || !result.length){
                layui.layer.msg('当前大屏不存在404组件');
                return false;
                }
                const confirm =  layui.layer.confirm('是否确认删除?', {title:'提示'}, function(index){
                    //do something
                    layui.layer.close(confirm);
                    utils.removeComponent(result); // 删除组件
                });
                //console.log(result);
            });
        }
    })


    // 获取当前大屏导出数据信息
    async function getExport(){
        const id = window.location.pathname.split('create/')[1];
        if(!id){
            return { message: "当前大屏路径不正确",success: false }
        }
        return await fetch(baseUrl+'/v3/screen/export?id='+id)
            .then(function(response) {
            return response.json();
        })
    };
})();