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;