diff --git a/static/admin/editor.js b/static/admin/editor.js index b5235ca..5078df4 100644 --- a/static/admin/editor.js +++ b/static/admin/editor.js @@ -268,7 +268,7 @@ var _stepEditor={ var self=this; var lib=_findLib(step.type)||{icon:'?',label:step.type}; var card=document.createElement('div'); - card.className='step-card'+(step.type==='loop'?' loop-block':'')+(step.type==='group'?' group-block':'')+(step.type==='if_el'?' if-block':''); + card.className='step-card'+(step.type==='loop'?' loop-block':'')+(step.type==='group'?' group-block':'')+(step.type==='if_el'?' if-block':'')+(step.type==='foreach_account'?' loop-block':''); card.draggable=true; card.dataset.idx=idx; card.dataset.stepId=step.id||''; @@ -316,8 +316,9 @@ var _stepEditor={ card.classList.remove('drag-over'); self._handleDrop(e,parentArr,idx); }); - // loop/group 子步骤 - if(step.type==='loop'||step.type==='group'){ + // loop/group/foreach_account 子步骤(**容器不列进来就看不到里面** —— 加新容器类型时 + // 记得同时改这里、card.className 和 _renderParams 三处) + if(step.type==='loop'||step.type==='group'||step.type==='foreach_account'){ if(step.params&&step.params.children){ var childWrap=document.createElement('div'); childWrap.className='step-children'; @@ -473,6 +474,16 @@ var _stepEditor={ '
'+ '
'; h+='
将下方子步骤循环执行指定轮次/时长;一直循环无限跑直到任务被外部停止——配合调度"定时启动+停止"(如 9:00 启动 / 18:00 停止)实现全天候养号,或配合任务"运行时长上限"自动停止
'; + }else if(step.type==='foreach_account'){ + // 循环本机待发的号(发布流程的最外层容器):把"跑哪些号"讲清楚,别让人以为是普通循环 + const fds=(p.date_source==='fixed')?'fixed':'today'; + h+='
'+ + '
'; + h+='
'+ + '
'; + h+='
一轮把本机待发的号跑完:逐个把名字写进"本次要发的名字",执行下方子步骤(切号 → 读名字 → 校验 → 推送 → 发布 → 标记);试过的不回头,跑完/被停/超时/到上限就收工。数据源是计划表(谁还有待发内容谁就在里面),不需要任何账号维护。
'; }else if(step.type==='group'){ h+='
动作组:按顺序执行下方子步骤一次。把多个步骤打包成一个可复用的整体。
'; h+='
把本组步骤保存到左侧自定义动作库,方便复用
'; diff --git a/static/admin/release.js b/static/admin/release.js index bc01897..9bbc156 100644 --- a/static/admin/release.js +++ b/static/admin/release.js @@ -876,8 +876,11 @@ function _rpStepRow(s, path, total, idx) { var fields = _RP_FIELDS[s.type] || []; var body = fields.map(function (f) { return _rpField(s.type, p, f, path); }).join(''); // 条件判断:命中/未命中两个分支**照样能就地编辑**(发布流程就藏在 then 里) + // foreach_account(循环本机待发的号)也是容器 —— 不列进来的话,发布流程整段会被折叠成 + // 一个"看不见里面"的步骤(实测踩过:用户打开就地编辑发现改不了) var nested = ''; - if (s.type === 'if_el' || s.type === 'loop' || s.type === 'group') { + if (s.type === 'if_el' || s.type === 'loop' || s.type === 'group' + || s.type === 'foreach_account') { [['then', '命中时(then)'], ['else', '没命中时(else)'], ['children', '里面的步骤']].forEach(function (pair) { var k = pair[0]; if (!(p[k] instanceof Array)) return;