运营控制台
{{ user }}

{{ findMenu(activeMenu)?.icon }} {{ findMenu(activeMenu)?.name || '控制台' }}

🚨 今日告警 ({{ alerts.length }})
全部正常,无告警
{{ a.level === 'critical' ? '🔴' : '🟡' }}
{{ a.msg }}
{{ a.time }}
{{ user }} {{ userRoleCn }} {{ userTeam }} 🛡️

当日大盘

日期 | 对比
组别
产品

{{ card.title }}

当日
当日预估
{{ card.estimate.toLocaleString() }}
📅 {{ grandRangeLabel }} 累计 {{ primaryTotals.days }} 天
{{ card.isRange ? '对比区间累计' : '对比日总计' }}({{ grandCmpRangeLabel }})
{{ card.compareTotal.toLocaleString() }}
{{ grandRangeLabel }} 累计 · 对比{{ card.isRange ? '区间' : '' }}: {{ card.compareTotal.toLocaleString() }}

📊 8 家平台对比 (今日实时)

{{ i+1 }} {{ p.name }}
{{ cmpMetric === 'charge' ? '¥' : '' }}{{ p.val.toLocaleString() }}
数据加载中...
{{ diagData ? `${diagData.summary.ok}/${diagData.summary.total} 正常 · ${diagData.time}` : '加载中...' }}

充值

加载中… 真实 · 8 平台 · 近 {{ chargeTrendRows.length }} 天 ⚠ {{ chargeTrendError }}

活跃账号

新增

⚡ 正在同步最新数据... ⚠ {{ biError }} ✓ 数据更新于 {{ biLastTime }} 点 🔄 同步最新数据
组别 ⟳ 加载中 ⚠ {{ overviewError }} 实时 · {{ overviewTime }} {{ filteredProducts.length }}/{{ products.length }}
产品
{{ statusEmoji(selectedProduct.status) }} {{ selectedProduct.name }} {{ selectedProduct.team }}
最后更新: {{ selectedProduct.updated }}
🚨 {{ selectedProduct.alert }}

📊 实时今日

新增
{{ selectedProduct.daily_new }}
活跃
{{ selectedProduct.active }}
充值
¥{{ selectedProduct.charge }}
成功率
{{ selectedProduct.pay_rate || '—' }}

📈 累计

会员总数
{{ Number(selectedProduct.total_members).toLocaleString() }}

⚡ 快捷操作

加载详情中…

📊 后台详细数据 ({{ Object.keys(productDetail.fields).length }} 字段,按业务分组)

🔥 核心指标
{{ stripToday(k) }}
{{ v }}
📈 留存率 👥 注册 / 活跃 💰 充值 / 订单 📥 落地 / 下载 🎬 内容消费 💸 提现 / 奖金 📊 累计 / 周月 {{ group }}
{{ stripToday(k) }}
{{ v }}
📈 16 天趋势
{{ t.label }} {{ fmtNum(productDetail.fields._trends[t.key].slice(-1)[0]) }}

📊 后台详细数据

📈 15 天趋势
{{ t.label }} {{ fmtNum(productDetail.fields._trends[t.key].slice(-1)[0]) }}
📱 H5
{{ fmtNum(productDetail.fields._trends.device_bar[0]) }}
🤖 Android
{{ fmtNum(productDetail.fields._trends.device_bar[1]) }}
⚠️ {{ productDetail.error }}
📊 该平台详细数据待接入(留存 / 渠道 / 设备分布 / 趋势图)
{{ statusEmoji(p.status) }} {{ p.name }}
{{ p.team }}
新增{{ fmtNum(p.daily_new) }}
活跃{{ fmtNum(p.active) }}
充值¥{{ p.charge }}
成功率{{ p.pay_rate || '—' }}
🚨 {{ p.alert }}
7 天充值 {{ sparklineTrend(perPlatformHistory[p.name]) >= 0 ? '↗' : '↘' }} {{ Math.abs(sparklineTrend(perPlatformHistory[p.name])).toFixed(0) }}%
更新:{{ p.updated }}

{{ filterTeam === '全部' ? '今日合计' : filterTeam + ' 合计' }}

新增
{{ fmtNum(totalize('daily_new')) }}
活跃
{{ fmtNum(totalize('active')) }}
充值
¥{{ totalize('charge') }}
订单数
{{ totalize('orders_count') }}
成功订单
{{ totalize('orders_ok') }}

🚨 今日告警 ({{ alerts.length }})

{{ a.level === 'critical' ? '🚨' : '⚠️' }} {{ a.time }} {{ a.msg }} ✅ 已恢复

📊 数据查询

查询类型:
时间范围:
产品:
{{ queryType === 'user' ? '用户 UID:' : '订单号:' }}
天数: 产品选「全部」= 整组逐日加总 · 选具体一家 = 单产品 · 8 家全支持(d.php 4家实时/LGBT·他他GV后台/不撸帝·Boys快照T+1)
环比周期: "产品"留「全部」= 看整组; 选具体产品 = 单家。本期(昨天往前)vs 上一等长周期
本期区间:
对比区间:
订单类型: d.php 4 家专用
查询耗时 {{ queryDuration }}ms · 共 {{ queryResults.length }} 条
{{ queryError }}

📈 {{ huanbiData.scopeLabel }} · {{ huanbiData.periodLabel }}

本期 {{ huanbiData.curRange }}  vs  上期 {{ huanbiData.prevRange }}
{{ row.指标 }}
{{ row.本期 }}
上期 {{ row.上期 }} 低基数 {{ row.环比 }}
数据源: business_history 历史快照按天累加 · 充值/新增为区间累计, 活跃为日活累加(人次)
{{ col }} {{ daySortDir === 'asc' ? '↑' : '↓' }}
✅ 通过 ❌ 拒绝 ✅ 成功 ❌ 失败 {{ r[col] }} {{ r[col] }}
没有查到数据
每页: 共 {{ queryResults.length }} 条
第 {{ currentPage }} / {{ totalPages }} 页
📊
选择查询条件,点"查询"开始
支持充值/审核/活跃/用户/订单 五类查询
筛选: 操作: 命中 {{ filteredAuditProducts.length }} 产品 · {{ filteredAuditTimeline.length }} 条动作
✅ 通过
{{ filteredAuditTotals.pass.toLocaleString() }}
❌ 删除
{{ filteredAuditTotals.delete.toLocaleString() }}
🚫 禁言
{{ filteredAuditTotals.ban.toLocaleString() }}
⏸️ Hold
{{ filteredAuditTotals.hold.toLocaleString() }}

📊 各产品审核统计(最近一轮)

⟳ 加载中 {{ auditStats.time }}
产品 通过 删除 禁言 Hold 分类拆分
{{ p.product }} {{ p.pass.toLocaleString() }} {{ p.delete.toLocaleString() }} {{ p.ban.toLocaleString() }} {{ p.hold.toLocaleString() }} {{ c.name }}({{ c.pass }}/{{ c.delete }}/{{ c.ban }})
没有命中数据

📈 审核趋势

最近 {{ auditTrend.summary.days }} 天 · 累计 {{ (auditTrend.summary.total || 0).toLocaleString() }} 条 ✅ {{ (auditTrend.summary.pass || 0).toLocaleString() }} ❌ {{ (auditTrend.summary.reject || 0).toLocaleString() }} 🚫 {{ (auditTrend.summary.ban || 0).toLocaleString() }}
暂无数据

🕐 最近审核动作(按违规理由聚合)

从 review log 解析
{{ r['产品'] }} {{ r['操作'] }} {{ r['类型'] }} {{ r['理由'] }}
没有命中的审核动作
💡 Content-Studio v1.0 · 全链路发帖工作台 · 上传视频 + 多平台分发 + 任务追踪
今日发帖
{{ content.totals.today }}
含成功+失败+进行中
已完成
{{ content.totals.success }}
成功率 {{ contentSuccessRate }}%
流水线进行中
{{ content.totals.in_progress }}
{{ content.totals.in_progress }} 个待人工确认
发布失败
{{ content.totals.failed }}
点击查看详情
覆盖平台
{{ content.totals.platforms_active }}
今日活跃 {{ content.totals.platforms_active }} 个

📜 最近流水线任务

展示最近 50 条 点 + 新建视频发布 上传你的视频
ID 标题 目标平台 流水线进度 状态 时间
#{{ t.id }} {{ t.post_type === 'post' ? '📝' : '📹' }} {{ t.title }} {{ sub.platform_name }}
{{ t.progress }}
{{ t.status }} {{ t.created.split(' ')[1] || t.created }}
📭
还没有发布任务,点右上角「+ 新建视频发布」开始

📊 今日各平台发帖

{{ plat }} {{ stat.total }} 单
✅ {{ stat.success }} ❌ {{ stat.failed }}
今天还没有发布
📜 封面历史 · 全员共享 · 滚动保留最近 200 条 · 单图/批量混合按时间倒序
已加载 {{ filteredCoverHistory.length }} / {{ coverHistoryTotal }} · 搜索"{{ coverHistorySearch }}"
加载封面历史…
📭
还没有生成记录
先点头部「🎨 生成封面」做一次
🔍
没有匹配"{{ coverHistorySearch }}"的记录
🖼️
{{ h.kind === 'batch' ? '🎞️ ' + h.count + '×' + (h.styles||[]).length : '🎨 ' + h.cover_count }}
{{ h.kind === 'batch' ? ('批量 #' + h.id.substr(0, 6)) : (h.title || '—') }}
{{ h.user }} {{ (h.created || '').substring(5, 16).replace('T', ' ') }}
🔍 跨平台用户查询 · 输 UID/uuid/Boys Code/手机号/订单号 反查 · 充值/禁言/AFF 一站查 v0.1 仅查询
组: 产品:
关键词:
⚠️ {{ account.error }}
查询关键词
{{ account.profile.query }}
命中平台
{{ account.profile.platforms_seen.length }}
{{ account.profile.platforms_seen.join(' / ') || '—' }}
订单数
{{ account.profile.total_orders }}
成功 {{ account.profile.total_success }}
累计金额
{{ account.profile.total_amount }}
最近 30 天
活跃时段
首: {{ account.profile.first_seen.split(' ')[0] }}
末: {{ account.profile.last_seen.split(' ')[0] }}
{{ p['性别'] === '女' ? '👩' : '🧑' }}
{{ p['别名(昵称)'] || '(无昵称)' }} {{ p['平台'] }} 👑 {{ p['VIP卡名'] || ('等级 ' + p['VIP等级']) }} 🚫 已禁言 ✓ 已认证
uid: {{ p['uid'] }} · {{ p['用户名'] }}
📋 基本资料
用户名{{ p['用户名'] }}
手机{{ p['手机'] }}
权限{{ p['权限'] }}
性别{{ p['性别'] }}
UUID
{{ p['uuid'] }}
👑 会员金币
VIP 等级 {{ p['VIP等级'] || '0' }}
🎫 {{ p['VIP卡名'] }}
VIP 到期 {{ formatVipExpire(p['会员到期']) }}
⏰ 无限看 {{ formatVipExpire(p['无限看到期']) }}
金币余额 {{ p['金币余额'] }}
消费总额{{ p['消费总额'] }}
App 版本{{ p['应用版本'] }}
📍 活动轨迹
注册
{{ p['注册时间'] }}
📍 {{ p['注册IP'] }}
最后访问
{{ p['最后访问'] }}
📍 {{ p['最后IP'] }}
登录 {{ p['登录次数'] }} 次
📡 渠道推广
渠道{{ p['渠道'] }}
AFF{{ p['AFF'] }}
邀请人数 {{ p['邀请人数'] }}
⚡ 账号操作
ℹ️ {{ p['平台'] }} ops 接口待大哥抓 cURL
⚠️ 这个关键词在选定平台上没找到匹配的用户。可能:用户在别的产品 / uuid 错了 / 平台权限不到。

📊 各平台汇总

平台 订单数 成功 累计金额 首单 末单
{{ p['平台'] }} {{ p['订单数'] }} {{ p['成功'] }} {{ p['累计金额'] }} {{ p['首单'] }} {{ p['末单'] }}

💰 充值明细

最近 50 条
创建时间 平台 订单号 类型 订单金额 实付金额 支付渠道 产品id 订单信息 状态
{{ o['创建时间'] || o['时间'] }} {{ o['产品'] }} {{ o['订单号'] }} {{ o['类型'] || '-' }} {{ o['订单金额'] || o['金额'] }} {{ o['实付金额'] || o['金额'] }} {{ o['通道'] }} {{ o['产品id'] || '-' }} {{ o['订单信息'] || o['商品'] || '-' }} {{ o['状态'] }}

💰 充值明细

最近 30 天
📭
该用户在所选范围内(最近 30 天)没有充值记录
不是 bug — 是用户真的没充过 / 充值在 30 天之前

🚫 命中禁言/删除/拒绝记录 ({{ account.ban_records.length }})

{{ r['平台'] }} {{ r['操作'] }} {{ r['内容'] }}
🔍
输入 UID / uuid / 手机号 / 订单号开始查询
系统会跨 8 个平台聚合该用户的充值、禁言、活跃记录
示例查询:08a9731c(搜同 uuid 前 8 位)
🚫 禁言用户 · 不撸帝走 /user/save (is_disabled=1) · 5-3 实战验证
🚫 禁言用户 · d.php 系走 doBlack workflow(listAjax 拉评论 → 拿 cid → flag=ban)· 实战验证可靠

⚙️ 操作表单

⚠️ 操作不可逆 · 会禁言整个用户(不只单条评论) · 本操作会写入操作日志(谁/何时/对谁)
{{ banResult.ok ? '✅ 禁言成功' : '❌ 失败' }}
🚫 {{ banPlatform }} uid={{ banUid }}: 正常 → 已禁言
{{ banResult.msg || banResult.error }}
使用 cid: {{ banResult.cid_used }} · 评论预览: "{{ banResult.comment_preview || '—' }}"
💡 LGBT/他他GV/不撸帝/Boys/小蓝/Gili Gili 待抓后台 cURL,以后陆续接。本期先 搜同 + GTV。
✏️ 改昵称 · 走 d.php members?code=save 部分更新模式 · 仅改 nickname,其他字段不动

⚙️ 改昵称表单

⚠️ 不可逆 · 仅改 nickname 字段(其他保留)· 写操作日志
{{ renameResult.ok ? '✅ 改昵称成功' : '❌ 失败' }}
✏️ 昵称: {{ renameResult.before.nickname_before }}{{ renameNew }}
{{ renameResult.msg || renameResult.error }}
uid: {{ renameResult.before.uid }} · 之前: {{ renameResult.before.nickname_before }}
💡 当前仅 d.php 4 家(搜同/GTV/小蓝/Gili Gili)。Boys 已知接口 PUT update 17 字段(/admin/cluser/m/user/update),不撸帝/TaTa 接口未做。重置密码/改头像/改角色 后续按需加。
🎟️ 改用户会员 · 改某用户的会员等级 + 到期日(月卡/年卡/至尊卡 等)· 工单常用
ℹ️ 搜同走 productuser 卡包(11 张真卡 + 取消)
流程:dashboard 提交后,后端 list 用户当前卡 → 全部 del → save 新卡(到期日由 productuser 按卡种自动算,永久卡 ≈ 27 年,月卡 30 天)· 同时支持转移会员卡(顶部 🔄 转移会员)

⚙️ 改会员表单

后端自动算到期日(永久卡 ≈ 27 年,月卡 30 天)
⏳ 加载会员卡列表中... (没出来就刷新)
ℹ️ 后端拉当前 vipEnd → 延长 N 天(已过期则从今天起算)→ PUT update + 反查 verify。点按钮直接提交,不再点下面"改会员"
ℹ️ 搜同走 productuser:到期日由后端按卡种自动算,不需手填
⚠️ 不可逆 · 直接覆盖用户当前会员 · 写操作日志 ↑ Boys 走快捷按钮提交
{{ vipResult.ok ? '✅ 改会员成功' : '❌ 失败' }}
{{ vipResult.msg || vipResult.error }}
🔄 {{ formatVipChange(vipResult) }}
用户: {{ vipResult.before.nickName || vipResult.before.nickname || '?' }}
之前: vip_level={{ vipResult.before.vip_level_before }} 到期 {{ vipResult.before.expired_at_before }}
之前 VIP: 开始 {{ vipResult.before.vipBegin_before || '(未充)' }} 到期 {{ vipResult.before.vipEnd_before || '(未充)' }} · 累充 ¥{{ vipResult.before.rechargeTotal }}
💡 已支持 6 平台:d.php 4 家(搜同/GTV/小蓝/Gili Gili)+ Boys(page2 反查 + 全字段 PUT)+ 不撸帝(group_id + group_end_time)。LGBT/他他GV 博主分成模式无 VIP 概念,设计跳过
🔄 转移会员卡 · 把 A 用户的会员卡转给 B 用户(仅搜同 productuser 卡包,工单常用)

⚙️ 转移会员表单

📦 当前卡包: {{ c.vip_level_str || c.product_id }}(pk={{ c.id }})
⚠️ 该用户当前没卡可转
⚠️ 不可逆 · 删 From 全部卡 + 加新卡到 To · 写操作日志
{{ transferResult.ok ? '✅ 转移成功' : '❌ 失败' }}
🔄 卡: uid={{ transferFromUid }}uid={{ transferToUid }}
{{ transferResult.msg || transferResult.error }}
已删 From 卡: pk={{ d.pk }}({{ d.vip_level_str }})·{{ d.ok ? '✅' : '❌' }}
加 To 卡: {{ transferResult.added.card_name }} (pid={{ transferResult.added.product_id }}) · {{ transferResult.added.ok ? '✅' : '❌' }} {{ transferResult.added.msg }}
📜 操作日志 · 全员最近 ops.* 操作(责任到人 · 出问题可追)· 默认 admin/管理 可看,运营需到 🛡️ 角色管理 加 admin.audit.view 权限
操作人: 动作:

操作日志 · {{ myAuditItems.length }} 条

加载中…
还没操作记录
时间 操作人 动作 目标 详情
{{ (it.time || '').slice(5, 19).replace('T', ' ') }} {{ it.actor }} {{ it.action }} {{ it.target || '—' }} {{ JSON.stringify(it.after).slice(0, 80) }}{{ JSON.stringify(it.after).length > 80 ? '…' : '' }} {{ it.note }}
无限看(免费看金币视频) · GTV/小蓝/Gili Gili 后台 add_free · 累加模式 · 清零功能待业务方修(day=0 接口 bug) · 工单常用

⚙️ 加无限看天数

⚠️ 累加模式:多次点会叠加 · 清零不可逆 · 写操作日志
{{ freeViewResult.ok ? '✅ 提交成功' : '❌ 失败' }}
{{ freeViewResult.msg || freeViewResult.error }}
💡 d.php 后端无现成反查接口,提交后请去对应平台后台核对实际无限看天数 · 搜同后台没此功能(下拉无搜同选项)
💰 金币上下分 · 给用户加/扣金币(quantity 正=上分,负=下分)· 工单常用

⚙️ 上下分表单

⚠️ 不可逆 · 直接调整用户余额 · 写操作日志
{{ coinResult.ok ? '✅ 上下分成功' : '❌ 失败' }}
💰 {{ coinPlatform }} {{ coinUserCode || coinUserId }}: {{ Number(coinQuantity) >= 0 ? '上分 +' : '下分 ' }}{{ Number(coinQuantity).toLocaleString() }} 金币
{{ coinResult.msg || coinResult.error }}
💡 已支持 6 平台:Boys (balance/adjust) + d.php 4 家 (chargeadmin/save) + 不撸帝 (/user/recharge,自动带 TOTP)。LGBT/他他GV 待抓 cURL。
🤖 Agent 状态总览 · {{ agents.summary.services_active }}/{{ agents.summary.services_total }} 服务 · {{ agents.summary.crons_total }} cron · {{ agents.summary.infra_ok }}/{{ agents.summary.infra_total }} 基建 {{ agents.time }}
在线服务
{{ agents.summary.services_active }}/{{ agents.summary.services_total }}
7×24 跑的 bot 和服务
失败服务
{{ agents.summary.services_failed }}
{{ agents.summary.services_failed === 0 ? '一切正常' : '需要排查' }}
Cron 任务
{{ agents.summary.crons_total }}
定时跑的脚本
基础设施
{{ agents.summary.infra_ok }}/{{ agents.summary.infra_total }}
OpenAI / Cookie / Token / SS

🤖 业务 Bot 与服务

服务 职责 状态 已运行 内存 PID
{{ s.icon }} {{ s.display }}
{{ s.unit }}
{{ s.role }} {{ s.state === 'active' ? '🟢 运行中' : s.state === 'failed' ? '🚨 失败' : '⏸️ ' + s.state }} {{ s.uptime }} {{ s.mem_mb }} MB {{ s.pid }}

🌐 远端 Agent 节点

其他组的机器人 / 独立 VPS · 暴露 /health 后纳入实时采集
{{ r.icon }}
{{ r.name }}
{{ r.team }} · {{ r.product }}
{{ (r.probe_result && r.probe_result.state === 'active') ? '🟢 在线' : (r.probe_result && (r.probe_result.state === 'dead' || r.probe_result.state === 'failed' || r.probe_result.state === 'inactive')) ? '🔴 离线' : r.status === 'ok' ? '🟢 在线' : r.status === 'pending_endpoint' ? '⏳ 待接入' : '📦 已移交' }}
{{ r.role }}
📍 {{ r.host }}
{{ r.note }}
PID {{ r.probe_result.pid || '—' }} · {{ r.probe_result.etime || '—' }}
{{ cs.script || cs.file }} {{ cs.status }} {{ (cs.last_run_at || '').substring(5, 16).replace('T', ' ') }} · {{ (cs.message || '').substring(0, 30) }}

⏰ 关键定时任务

从 crontab 比对,{{ agents.crons.filter(c => c.configured).length }} / {{ agents.crons.length }} 已配置
任务 执行频率 配置 最近
{{ c.icon }} {{ c.display }}
{{ c.fragment }}
{{ c.schedule }} {{ c.configured ? '✅ 已配' : '⏸️ 未配' }} {{ c.last_run }}

🏗️ 基础设施

{{ i.icon }} {{ i.name }} {{ i.status === 'ok' ? '🟢 OK' : i.status === 'warn' ? '🟡 警告' : i.status === 'error' ? '🔴 错误' : '⏸️ ' + i.status }}
{{ i.note }}

📥 用户反馈(巡检评论 - 已去黄推)

{{ feedback.date }} · 原始 {{ feedback.total_raw }} 条 · 过滤 {{ feedback.blocked_blacklist }} 条黄推 · 命中分类 {{ feedback.classified }} 条
产品: 分类:
产品 分类 评论内容 位置 UID 视频/帖子
{{ r['产品'] }} {{ r['分类'] }} {{ r['评论'] }} {{ r['位置'] }} {{ r['UID'] }} {{ r['视频/帖子'] }}
没有命中的反馈
已显示 {{ feedbackPageSize }} / 共 {{ filteredFeedbackRows.length }} 条
📺 世界杯直播站配置 ▶ 预览(默认) ▶ GTV 入口 ▶ 搜同入口

⚙️ 基础

📰 跑马灯(叠播放器底部滚动)

#{{ idx+1 }}

🎯 广告位(按 ?from= 分流,各平台用户只看自家)

分组名(default/gtv/sotong/xiaolan 等)对应 URL `?from=` 参数,从 GTV 落地页跳来的 URL 加 `?from=gtv` 就只显示 gtv 那组广告。

{{ group }}{{ group==='default' ? ' (无 from 参数走这个)' : ' (?from=' + group + ')' }}
这个分组没有广告,点上面 ➕ 加一个

📊 埋点(最近 200 条)

总数: {{ zhiboEvents.length }}
页面打开: {{ zhiboEvents.filter(e=>e.event==='page_open').length }}
视频播放: {{ zhiboEvents.filter(e=>e.event==='video_play').length }}
广告点击: {{ zhiboEvents.filter(e=>e.event==='ad_click').length }}
跑马灯点击: {{ zhiboEvents.filter(e=>e.event==='marquee_click').length }}
{{ e.ts.slice(11,19) }} · {{ e.event }} · from={{ e.from }} · sid={{ e.sid.slice(0,8) }} {{ e.ad_id ? '· ad=' + e.ad_id : '' }}
还没埋点数据,等用户访问直播站后再看
⏳ 加载中... 等待加载...
📝 AV 落地页配置 ▶ 预览落地页
{{ landingConfigMsg }}
📌 顶部主信息
🔝 顶栏统计
🎯 主 Banner (页面最大那块)
🖼️ Banner 轮播大图 ({{ (landingCfg.banner_slides||[]).length }} 张)
两种方式都行:① 点 📁 直接选本地图(支持多选,自动上传)② 贴公网 URL(jpg/png/webp/gif),建议 1600×900 横图
还没图,点 + 加图 加一张试试
📊 数据指标卡 ({{ landingCfg.metrics.length }} 个数字)
🌶 双榜热推 (左右两张大卡)
⬅ 左卡
➡ 右卡
📱 APP 卡片 ({{ landingCfg.apps.length }} 个)
📱 {{ a.name || '(未命名)' }} [{{ a.key }}]
🔥 精选视频 ({{ landingCfg.videos.length }} 个)
🦶 页脚
改完点保存,落地页刷新就生效
⏳ 加载中... 等待加载...

🎬 媒体数据

⚠ 部分数据源拉失败: {{ Object.entries(mediaFails).map(([k,v])=>`${k}: ${v}`).join(' | ') }}
{{ mediaKind === 'video' ? '🎥 视频' : '📝 帖子' }} Top {{ mediaListFiltered.length }} · 按{{ {play:'播放',like:'点赞',sale:'销量'}[mediaSort] }}排 加载中... 总 {{ mediaTotal }} 条
# 平台 标题 播放 点赞 销量 售价 标签 创建时间
{{ i+1 }} {{ it.plat }} {{ it.title }} {{ (it.play||0).toLocaleString() }} {{ (it.like||0).toLocaleString() }} {{ (it.sale||0).toLocaleString() }} {{ it.coins||0 }} {{ t }} {{ (it.created||'').slice(0,16) }}
📭
{{ mediaKind === 'post' && mediaPlatFilter === 'Gili Gili' ? 'Gili Gili 无社区帖' : '无数据' }}
🏷️ 标签排行 Top 20
# 标签 条数 {{ {play:'播放',like:'点赞',sale:'销量'}[mediaSort] }}
{{ i+1 }} {{ t.tag }} {{ t.count }} {{ (t[mediaSort]||0).toLocaleString() }}
无标签数据

🎁 活动策划

{{ activities.length }} 个活动 加载中…
🤖
嘿大哥,告诉我活动思路
"我要给搜同 8 月做一个抽奖,周期 7 天,预算 5 万..."
🥚 铁蛋(活动策划)
🔧 铁蛋调了 {{ m.tool_trace.length }} 个能力 (点开看)
{{ t.name }}({{ JSON.stringify(t.args).slice(0, 80) }})
任务派发中: {{ m.task_info.action }} (~{{ m.task_info.estimated_seconds }}秒)... 完成后这里出链接
✅ 任务完成
风格: {{ m.task_result.style }}
❌ {{ m.task_result.error }}
完整结果 (点开)
{{ JSON.stringify(m.task_result, null, 2) }}
⏱️ 任务 5 分钟没出结果,可能 worker 卡了。看 /tmp/activity_ai_tasks/{{ m.task_info.task_id }}.log
✨ 铁蛋已经准备好派发任务:{{ m.pending_action.__action__ }} · {{ m.pending_action.platform }}
"{{ m.pending_action.activity }}"
🤖 思考中…

{{ act.name }}

{{ act._auto_status || act.status }}
🎨 {{ act.theme }}
📅 {{ act.start }} → {{ act.end }} ({{ activityDays(act) }} 天)
🌐 {{ (act.platforms||[]).join(' / ') || '—' }}
🏷️ {{ act.type }}
📜 {{ act.rules }}
🏆 {{ act.notes }}
进度{{ activityProgress(act).toFixed(0) }}%
🔗 H5
还没活动,点"+ 新建活动"加一个

{{ activityForm.id && activityFormIsEdit ? '✏️ 编辑活动' : '+ 新建活动' }}

人员架构

加载中… 真实 · {{ orgChartData.total }} 人 · {{ orgChartData.updated }} ⚠ {{ orgChartError }} 数据源:江瑞源头表
运营部 · {{ gName }}
{{ grp.all.length }}
{{ grp.leader ? '管理:' + grp.leader.name : '无管理' }}
{{ grp.leader?.products || '—' }}

🏢 {{ dName }}

{{ Object.values(dept).reduce((s, g) => s + g.all.length, 0) }} 人
{{ gName }}
{{ grp.all.length }} 人 👑 {{ grp.leader.name }} · 负责 {{ grp.leader.products }}
{{ p.name }}
{{ p.role }}

全员明细 ({{ orgChartData.people.length }} 人)

{{ h }}
{{ p['花名'] }} {{ p['职位'] }} {{ p['部门'] }} {{ p['小组'] }} {{ p['直属上级(花名)'] }} {{ p['负责产品'] || '—' }} {{ p['入职日期'] || '—' }} {{ p['状态'] }}

用户活跃

明细数据

{{ h }}
{{ fmtDay(r.day) }} {{ fmt(Number(r['新增']||0)) }} {{ fmt(Number(r['活跃']||0)) }} {{ Number(r['活跃']) ? (Number(r['新增']||0)/Number(r['活跃'])*100).toFixed(2) : '0' }}%

充值构成

日期明细 真实: 会员卡(VIP) vs 金币 vs 其他(d.php 4 家有拆分, 余 4 家归"其他")

{{ h }}
{{ fmtDay(r.day) }} ¥{{ fmt(Number(r['充值']||0)) }} ¥{{ fmt(Number(r['VIP充值']||0)) }} ¥{{ fmt(Number(r['金币充值']||0)) }} ¥{{ fmt(Math.max(0, Number(r['充值']||0) - Number(r['VIP充值']||0) - Number(r['金币充值']||0))) }} {{ Number(r['充值']) ? (Number(r['VIP充值']||0) / Number(r['充值']) * 100).toFixed(1) : 0 }}%

用户休眠

新增账号数
{{ fmt(dormantStats.newCount) }}
环比前一日 {{ dormantStats.newRatio >= 0 ? '+' : '' }}{{ dormantStats.newRatio.toFixed(2) }}%
新增休眠账号数
{{ fmt(dormantStats.newDormant) }}
昨日新增 × (1 - 次留率)
回流账号数
{{ fmt(dormantStats.returning) }}
今日活跃 - 昨活 - 今增 (净增)

活跃账号占累计总用户比例 活跃 / (累计总用户 - 活跃) = 休眠占比

账号流入与流出趋势 真实算: 新增 / 新增休眠 (新增 × 流失率) / 回流 (活跃净增)

漏斗分析

官网总访问
{{ fmt(chargeTrendRows.reduce((s,r) => s + Number(r['官网总访问数']||0), 0)) }}
总下载
{{ fmt(chargeTrendRows.reduce((s,r) => s + Number(r['总下载']||0), 0)) }}
访问→注册 转化率
{{ (() => { const v = chargeTrendRows.reduce((s,r)=>s+Number(r['官网总访问数']||0),0); const n = chargeTrendRows.reduce((s,r)=>s+Number(r['新增']||0),0); return v ? (n/v*100).toFixed(2)+'%' : '0%'; })() }}

漏斗图

{{ s.label }}
{{ s.rate }}
流失 {{ s.lost }} 人

日期明细

{{ h }}
{{ fmtDay(r.day) }} {{ fmt(Number(r['官网总访问数']||0)) }} {{ fmt(Number(r['总下载']||0)) }} {{ fmt(Number(r['新增']||0)) }} {{ Number(r['官网总访问数']) ? (Number(r['总下载']||0) / Number(r['官网总访问数']) * 100).toFixed(2) : 0 }}% {{ Number(r['总下载']) ? (Number(r['新增']||0) / Number(r['总下载']) * 100).toFixed(2) : 0 }}%

路径分析

🛤️
需 App 前端埋点采集页面路径,后台暂无此数据源

热力图分析

🔥
需 App 前端埋点采集点击坐标,后台暂无此数据源

热力图管理

{{ h }}
📋
需 App 前端埋点采集,后台暂无此数据源

{{ findMenu(activeMenu)?.name }}

加载真实数据… 真实 · 8 平台 · 近 {{ chargeTrendRows.length }} 天 ⚠ {{ chargeTrendError }}
指标
组别
产品

{{ card.label }}

当日
{{ card.prefix }}{{ card.isFloat ? card.value.toFixed(2) : (card.isPercent ? card.value.toFixed(2) + '%' : fmt(card.value)) }}
低基数 {{ card.ratio >= 0 ? '↗' : '↘' }} {{ Math.abs(card.ratio).toFixed(2) }}%
{{ card.sub }}

{{ currentAnalysis.chartTitle }}

{{ analysisTrendPoints.days[0] }} 真实 {{ analysisTrendPoints.field }} · 8 平台聚合 · 峰值 {{ analysisTrendPoints.isRate ? analysisTrendPoints.max.toFixed(2) + '%' : analysisTrendPoints.max.toLocaleString() }} {{ analysisTrendPoints.days[analysisTrendPoints.days.length - 1] }}
加载中…
⚠ {{ chargeTrendError }}

明细数据

共 {{ currentAnalysis.tableRows.length }} 项数据
{{ h }}
{{ findMenu(activeMenu)?.icon || '📋' }}
{{ findMenu(activeMenu)?.name || activeMenu }}
该模块建设中 · 数据接入后开放
🏛️ 南风馆后台 3,181 部漫画 · 697 动画 · 86 小说 · 4 站合一
📢 广告中心 真实 · {{ adsysProducts.merchant_name }} · {{ adsysProducts.total }} 平台 加载 adsys 数据…
↗ 新窗口
① 粘运营群消息
⚠ {{ batchParseErr }}
② 全局参数 应用到所有 {{ batchRows.length }} 行
客户
广告类型
广告模式
备注
📌 上架单指定位置: {{ batchLocationHint }} — 请在下方表格 ✋ 手动选每家对应的广告位
③ 待上架 {{ batchRows.length }}{{ batchAds.length }} 广告 × {{ batchApps.length }} 平台
# 广告标题 产品 广告位 链接 图标 状态
{{ i+1 }} {{ r.title }} {{ r.app_code }}{{ r.app_name }} {{ r.url }} 待上架 上架中 ✓ 成功 ✗ 失败
📄 第 1 条 payload 预览 (其他 {{ batchRows.length-1 }} 条同结构)
{{ batchPreviewPayload }}
运营组
应用名称
{{ getProductName(code) }} 请选择 (可多选)
{{ p.display_name }} ({{ p.app_code }})
加载中…
广告位
广告名称
广告链接
广告 ID
客户名称
广告类型
广告模式
广告宽度
广告高度
尺寸比例
状态
备注
已选 {{ selectedAdCodes.size }} 条
真实 · 万有引力 · {{ adsList.total }} 条 加载中… ⚠ {{ adsList.error }}
序号 应用名称 广告位名称 广告名称 广告链接 广告素材 排序 广告 ID 客户名称 广告类型 广告模式 操作
{{ (adsList.page-1)*adsList.pageSize + i + 1 }} {{ ad.appName || '-' }} {{ ad.advertiseLocationName || '-' }} {{ ad.advertiseName || '-' }} {{ ad.advertiseUrl }} -

素材
{{ ad.advertiseCode || ad.id || '-' }} {{ ad.customerName || '-' }} {{ materialTypeName(ad.advertiseType) }} - {{ ad.adMode }} -
📋
{{ adsList.appCode ? '该筛选条件下无结果' : '请选择应用名称后查询' }}
共 {{ adsList.total }} 条
{{ adsList.page }} / {{ Math.ceil(adsList.total / adsList.pageSize) || 1 }}
📡 万有引力 · 控制台 v2 · 真生产数据 + 30+ 自动化场景 · © 2026

{{ editingAd ? '编辑广告 #' + editingAd.advertiseCode : '新增' }}

#{{ i+1 }} {{ loc.appName }} {{ loc.advertiseLocationName }} ID {{ loc.id }} {{ loc.advertiseWidth }}*{{ loc.advertiseHeight }}
📝 编辑模式: 广告位不可改 (要换广告位 → 删除此条 + 新建)
✨ 提交时会循环 {{ newAd._locations.length }} 次 createAdvertiseInfo, 每个广告位创建一条
Exp1
Exp2
Exp3
🪄 自动规则: 按 appCode + 广告位名分平台处理. d.php 4 家自动 pro_type / 他他GV LGBT 自动 Exp2 + 福利图标社区应用中心需选模板 / Boys blued 不填 / Boys URL 自动加 out;.
📋 {{ g.loc.appName }} / {{ g.loc.advertiseLocationName }} (ID {{ g.loc.id }}) — 选 Exp1 模板:
✅ 已选 ⚠ 未选
⚠ 小蓝 web (DX-108) Exp1/Exp2 规则待确认,留空提交.
ℹ Boys / blued (不撸帝) 不配置代码 — Exp1/Exp2 留空提交. {{ newAd._locations.some(l => l.appCode === 'SF-73') ? 'Boys 的广告链接会自动加 out; 前缀.' : '' }}
{{ newAdResult.text }}

选择广告位 (支持多选 · 一次给 4 个 d.php 都上)

应用名称
{{ getProductName(code) }} 请选 (可多选 · 一次给 d.php 4 家都上)
{{ p.display_name }} ({{ p.app_code }})
广告位名
展示模式
素材类型
广告宽度
广告高度
尺寸比例
ID 应用 广告位名称 标识 预览 尺寸 比例 素材类型 备注 限制 空余 已用
{{ loc.id }} {{ loc.appName }} {{ loc.advertiseLocationName }} {{ displayModeName(loc.displayMode) }} - {{ loc.advertiseWidth }}*{{ loc.advertiseHeight }} {{ loc.materialCoverRatio || '-' }} {{ adMaterialTypeName(loc.materialType) }} {{ loc.remark || '-' }} {{ loc.adLimit }} {{ loc.remainNum }} {{ loc.usedNum }}
{{ locPicker.error || '无数据,请先选应用查询' }}
已选 {{ locPickerSelectedList.length }} 个 请勾选广告位 (可多选) 共 {{ locPicker.total || 0 }} 条
{{ locPicker.page }} / {{ Math.ceil((locPicker.total||0) / locPicker.pageSize) || 1 }}
🔍
↵ 跳转 · Esc 关闭 · ⌘K 任意页面唤起

👥 用户管理

分配角色 · 调组 · 重置 TOTP · 删除
🔑 注册邀请码 新用户注册必须填这个码
➕ 新建账号 直接发账号密码,无需 2FA
{{ newUserMsg.text }}
📖 角色权限说明
{{ r.cn }} {{ r.note }}
用户名 角色 所属组 TOTP 最后登录 操作
{{ u.username }} admin {{ (u.last_login || '').replace('T', ' ').slice(0, 19) || '—' }}
暂无用户
⚠️ {{ adminError }}
✅ {{ adminSuccess }}

🛡️ 角色与权限管理

仿 NT 后台·v0.2

📋 角色列表({{ rolesData.length }} 个)

角色 职能描述 级别 权限数 用户数 最后修改 操作
{{ r.cn }}
{{ r.key }}
系统
{{ r.desc || '—' }} {{ r.level }} 全权 * {{ r.perms.length }} {{ r.user_count }} {{ (r.updated || '').slice(5, 16).replace('T', ' ') }}
暂无角色

{{ roleEditing.isNew ? '➕ 新建角色' : '✏️ 编辑:' + roleEditing.cn }}

⚡ 通配快捷 点一下加 / 移除整组
📦 {{ group }} {{ items.filter(i => roleEditing.perms.includes(i.key)).length }} / {{ items.length }}
已选 {{ roleEditing.perms.length }} 项权限
⚠️ {{ rolesError }}
✅ {{ rolesSuccess }}

📜 操作日志

最近 5000 条 · 谁 / 做了啥 / 前后值
共 {{ auditLogTotal }} 条
时间 操作人 操作类型 目标 操作前 操作后 IP
{{ (e.time || '').slice(5, 19).replace('T', ' ') }} {{ e.actor }} {{ e.action }} {{ e.target || '—' }} {{ e.before ? JSON.stringify(e.before) : '—' }} {{ e.after ? JSON.stringify(e.after) : '—' }} {{ e.ip || '—' }}
{{ auditLogLoading ? '加载中…' : '暂无日志' }}
第 {{ auditLogPage }} 页 / 共 {{ Math.max(1, Math.ceil(auditLogTotal / 50)) }} 页

🔐 安全设置

🛡️
二步验证(TOTP)
用 Google Authenticator / Microsoft Authenticator / Authy 扫码绑定
{{ totpEnabled ? '✅ 已启用' : '⏸️ 未启用' }}
用验证器扫描下方二维码:
TOTP QR 生成中...
扫不到?手动输入 secret: {{ totpSetup.secret }}
⚠️ {{ totpError }}
✅ {{ totpSuccess }}
下次登录需要验证器 6 位码。
⚠️ 解绑二步验证
账号信息
用户名:{{ user }}
注册:{{ accountCreated || '—' }}
上次登录:{{ accountLastLogin || '—' }}
🎨
封面图生成器
一键出 6 风格候选 · 拖视频/图 → 改标题 → 选最爱
🎞️
点击或拖拽 · 视频自动抽中点帧 · 图片直接用
支持 mp4 / mov / mkv / webm / jpg / png · 最大 200 MB
{{ coverFileName }}
{{ (coverFileSize/1024/1024).toFixed(1) }} MB · 点这换一个
📁
{{ coverFileName || '已上传' }}
改标题后点"重新生成"即可,不用重传
{{ coverTitle.length }} / 30
{{ coverSubtitle.length }} / 30
⚠️ {{ coverError }}

🎉 已生成 {{ coverResults.length }} 张候选

点缩略图查看大图 · 鼠标悬停下载
{{ c.label }} ⬇ 下载
Cover Studio v2 · 8 风格 · 推荐:GV 学习库 / GV 简洁风
🎞️

批量生成封面

一次最多 20 个视频/图 · 默认出 GV 学习库 + GV 简洁风
🎬
拖入 1-20 个视频/图,或点击选择
支持 mp4 / mov / mkv / jpg / png(单文件≤200MB)
已选 {{ batchFiles.length }} 个文件 · 填好文案后批量生成
{{ idx + 1 }} 📎 {{ item.name }}
💡 文案留空的项会复用上一行的文案
批量渲染中... {{ batchFiles.length }} 个素材
视频会自动抽最佳帧 · 耗时约 5-10 秒/个
✅ 已生成 {{ batchResults.length }} 个素材 × {{ batchEffectiveStyles.length }} 风格 = {{ batchTotalCovers }} 张封面
📦 打包下载 ZIP
{{ idx + 1 }}. {{ r.title }} / {{ r.subtitle }} [{{ r.themes.join(',') }}]
❌ {{ r.error }}
{{ c.label }}
批量出图 · 默认推荐风格(GV 学习库 + GV 简洁风)
×
{{ coverPreviewOne.label }} · 点任意处关闭 · ⬇ 下载
{{ coverHistorySelected.kind === 'batch' ? '🎞️' : '🎨' }}
{{ coverHistorySelected.kind === 'batch' ? ('批量 #' + coverHistorySelected.id) : (coverHistorySelected.title || '—') }}
{{ coverHistorySelected.user }} · {{ coverHistorySelected.created }} · {{ coverHistorySelected.kind === 'batch' ? (coverHistorySelected.count + ' 视频 × ' + coverHistorySelected.styles.length + ' 风格 = ' + coverHistorySelected.cover_count + ' 张') : ((coverHistorySelected.size||[]).join('×') + ' · ' + coverHistorySelected.cover_count + ' 风格') }}
{{ c.style }}
#{{ r.idx + 1 }} {{ r.title || r.filename }} · {{ r.subtitle }}
⚠️ {{ r.error }}
{{ c.label || c.style }}
⬇ 打包下载 ZIP 点封面看大图

+ 新建发布

已选: {{ uploadFileName }} ({{ (uploadFileSize/1024/1024).toFixed(1) }} MB)
支持 mp4 / mov / avi / mkv / webm / flv / m4v · 最大 1 GB
已选封面: {{ uploadCoverName }}
已选 {{ uploadPlatforms.length }} 个
⚠️ {{ uploadError }}
上传中: {{ uploadProgress }}%