feat(发布计划): 改按名字发(文件名 名字_日期_编号)+ 账号管理整页下线 + 自动切号一轮发完
发布计划不再绑设备、不再依赖账号台账:上传文件名 `名字_日期_编号`(标题行 `标题 || 正文_名字_日期_编号`),运行时读本机当前抖音昵称取计划;靠循环块 「一轮把本机待发的号跑完」自动切号,一直发到发完。 · 解析/配对换键:右锚定认名字(不许含下划线、不许纯数字 —— 不合法直接拒收并说清原因), 删掉三处"手机号必须命中台账"的校验,加索引 ix_video_plan_name_date(启动时补建) · 新步骤三个:读本机账号名字 / 切换账号(**按名字点控件**、切完回读校验、遇登录页停本设备)/ 循环本机待发的号(试过不回头、跑一轮没进展就换号、停止·超时·上限三个干净出口) · 发布骨架改 18 步:读名字 → 校验账号(cmp_source=account_target)→ 推送(**推送前重读昵称核对**) → 抖音流程 → 标记结果;push_release 的 account 默认 name · 账号管理整页下线:删 core/ledger.py(serial_of 迁到 core/device_pool.py)、6 个 /api/ledger*、 「账号」页与 ledger.js、设备池「账号」列、设备端账号块;发布计划升为一级页签; device_account 表与 42 行历史数据保留、仍在备份清单内(**停用不等于删数据**) · 人工入口「按名字找设备」:新增 core/account_probe.py(只读探测、跳过在跑任务的设备) + POST /api/video_plan/push_by_account,没设备登着的号逐条报出来; 推送时把"实际是谁发的"写进 posted_serial / posted_device_name · 通知:新增 task.account.switch_failed / task.account.need_login · schema v12(posted_*)/ v13(device.cur_account_name / cur_name_at) · 文档同步:TASK_DEV / API / DATA_MODEL / ARCHITECTURE / NOTIFY / DEVICE_AGENT / DEPLOY / DEVELOPMENT / README / .env.example(两个抖音控件选择器抓一次填 .env) · 新增 scripts/tests/:6 套用例 + run_all.py(临时库 + 假设备,不碰真实数据、不连真机)
This commit is contained in:
@@ -117,7 +117,11 @@ function showTab(name){
|
||||
showSubTab('agent', _activeSubs.agent||'chat'); // 聊天 / AI 建任务
|
||||
if(typeof initAgentChat==='function') initAgentChat();
|
||||
}
|
||||
if(name==='account'){showSubTab('account',_activeSubs.account||'ledger');}
|
||||
// 发布计划(原「发布计划」子分栏,账号台账下线后升为一级页签)
|
||||
if(name==='plan'){
|
||||
if(typeof loadReleasePlan==='function')loadReleasePlan();
|
||||
if(typeof loadReleaseTasks==='function')loadReleaseTasks();
|
||||
}
|
||||
if(name==='users')loadUsers();
|
||||
if(name==='system'){showSubTab('system',_activeSubs.system||'backup');}
|
||||
}
|
||||
@@ -125,7 +129,7 @@ function showTab(name){
|
||||
// ================== 页内子分栏(任务/工具 通用) ==================
|
||||
// 每个带子分栏的 Tab 记住上次选中的子分栏,切走再切回来保持原位
|
||||
let _activeSubs = {tasks: 'plan', tools: 'clipboard', system: 'backup', agent: 'chat',
|
||||
logs: 'files', account: 'ledger'};
|
||||
logs: 'files'};
|
||||
let _discoveryTimer = null; // 设备自动发现 10s 轮询(仅 devpool 子分栏激活时)
|
||||
|
||||
function showSubTab(tabId, name){
|
||||
@@ -139,11 +143,6 @@ function showSubTab(tabId, name){
|
||||
if(tabId==='logs' && name==='steps' && typeof loadStepLogs==='function') loadStepLogs(true);
|
||||
if(tabId==='tasks' && name==='actioncfg' && typeof loadActionConfig==='function') loadActionConfig();
|
||||
if(tabId==='tasks' && name==='dedup' && typeof loadDedup==='function') loadDedup();
|
||||
if(tabId==='account' && name==='ledger' && typeof loadLedger==='function') loadLedger();
|
||||
if(tabId==='account' && name==='plan' && typeof loadReleasePlan==='function'){
|
||||
loadReleasePlan();
|
||||
if(typeof loadReleaseTasks==='function') loadReleaseTasks();
|
||||
}
|
||||
if(name==='groups' && typeof loadGroups==='function') loadGroups();
|
||||
if(name==='apks' && typeof loadAgentStore==='function') loadAgentStore();
|
||||
if(name==='devpool' && typeof loadDevPool==='function'){
|
||||
|
||||
Reference in New Issue
Block a user